diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index d9c75de7def2e..ccc42ebaa1ee0 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,3 +1,4 @@ # Require review from domain experts when the PR modified significant config files. /sessionctx/variable @pingcap/tidb-configuration-reviewer /config/config.toml.example @pingcap/tidb-configuration-reviewer +/session/bootstrap.go @pingcap/tidb-configuration-reviewer diff --git a/.github/licenserc.yml b/.github/licenserc.yml index 1396906f5df5f..52976b36f8686 100644 --- a/.github/licenserc.yml +++ b/.github/licenserc.yml @@ -8,6 +8,7 @@ header: - '.gitignore' - '.gitattributes' - '.golangci.yml' + - '.golangci_br.yml' - 'LICENSES/' - '**/*.md' - '**/*.json' @@ -26,4 +27,5 @@ header: - 'LICENSE' - '.github/' - 'parser/' + - 'dumpling/' comment: on-failure diff --git a/.github/workflows/br_compatible_test.yml b/.github/workflows/br_compatible_test.yml index e72581856abbd..aeccfb0a2eff0 100644 --- a/.github/workflows/br_compatible_test.yml +++ b/.github/workflows/br_compatible_test.yml @@ -2,6 +2,7 @@ name: BR / Compatibility Test on: push: + # merged git action branches: - master - 'release-[0-9].[0-9]*' @@ -14,19 +15,25 @@ on: - '!br/docs/**' - '!br/tests/**' - '!br/docker/**' - pull_request: - branches: - - master - - 'release-[0-9].[0-9]*' - paths: - - 'br/**' - - '!**.html' - - '!**.md' - - '!CNAME' - - '!LICENSE' - - '!br/docs/**' - - '!br/tests/**' - - '!br/docker/**' + # disable pull request only keep the merge action since it is very costly to run those tests + # pull_request: + # branches: + # - master + # - 'release-[0-9].[0-9]*' + # paths: + # - 'br/**' + # - '!**.html' + # - '!**.md' + # - '!CNAME' + # - '!LICENSE' + # - '!br/docs/**' + # - '!br/tests/**' + # - '!br/docker/**' + +# See: https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#concurrency. +concurrency: + group: ${{ github.ref }}-${{ github.workflow }} + cancel-in-progress: true jobs: check: diff --git a/.github/workflows/compile_br.yaml b/.github/workflows/compile_br.yaml index fed0d2a7af279..acfbc2d27bad5 100644 --- a/.github/workflows/compile_br.yaml +++ b/.github/workflows/compile_br.yaml @@ -13,7 +13,10 @@ on: - '!br/docs/**' - '!br/tests/**' - '!br/docker/**' +#change trigger policy pull_request: + types: + - labeled # <-- branches: - master - 'release-[0-9].[0-9]*' @@ -29,9 +32,31 @@ on: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} +# See: https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#concurrency. +concurrency: + group: ${{ github.ref }}-${{ github.workflow }} + cancel-in-progress: true + jobs: + compile-windows: + if: github.event_name == 'push' || github.event_name == 'pull_request' && github.event.label.name == 'action/run-br-cross-platform-build' + name: Compile for Windows job + runs-on: windows-latest + steps: + - uses: actions/checkout@v2.1.0 + + - name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: 1.16 + + - name: Run build + run: make build_tools + compile: + if: github.event_name == 'pull_request' && github.event.label.name == 'action/run-br-cross-platform-build' name: Compile for ${{ matrix.os }} / ${{ matrix.target}} + runs-on: ${{ matrix.os }} strategy: matrix: @@ -42,8 +67,6 @@ jobs: - os: ubuntu-latest target: aarch64-unknown-linux-gnu - - os: windows-latest - target: x86_64-pc-windows-msvc steps: - uses: actions/checkout@v2.1.0 @@ -56,6 +79,7 @@ jobs: run: make build_tools compile-freebsd: + if: github.event_name == 'pull_request' && github.event.label.name == 'action/run-br-cross-platform-build' name: Compile for FreeBSD job runs-on: ubuntu-latest steps: diff --git a/.github/workflows/dumpling_integration_test.yml b/.github/workflows/dumpling_integration_test.yml new file mode 100644 index 0000000000000..8390ef961f44d --- /dev/null +++ b/.github/workflows/dumpling_integration_test.yml @@ -0,0 +1,145 @@ +name: Dumpling +on: + push: + branches: + - master + - release-* + paths: + - 'dumpling/**' + - 'br/pkg/storage/**' + - 'br/pkg/utils/**' + - 'br/pkg/summary/**' + - 'store/helper/**' + - 'tablecodec/**' + - 'util/codec/**' + - 'parser/model/**' + pull_request: + branches: + - master + - release-* + paths: + - 'dumpling/**' + - 'br/pkg/storage/**' + - 'br/pkg/utils/**' + - 'br/pkg/summary/**' + - 'store/helper/**' + - 'tablecodec/**' + - 'util/codec/**' + - 'parser/model/**' + +# See: https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#concurrency. +concurrency: + group: ${{ github.ref }}-${{ github.workflow }} + cancel-in-progress: true + +jobs: + integration-test-mysql-5735: + runs-on: ubuntu-latest + timeout-minutes: 15 + strategy: + fail-fast: true + services: + mysql: + image: mysql:5.7.35 + env: + MYSQL_ALLOW_EMPTY_PASSWORD: yes + ports: + - 3306:3306 + options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 + steps: + - uses: actions/checkout@v2 + - name: Shutdown Ubuntu MySQL (SUDO) + run: sudo service mysql stop # Shutdown the Default MySQL, "sudo" is necessary, please not remove it + - name: Set up Go 1.16 + uses: actions/setup-go@v2 + with: + go-version: 1.16 + - uses: actions/cache@v2 + with: + path: ~/go/pkg/mod + key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} + restore-keys: | + ${{ runner.os }}-go- + - name: Get dependencies + run: go mod download + - name: Download dependencies + run: sh dumpling/install.sh + - name: Integration test + run: make dumpling_integration_test VERBOSE="true" + - name: Set up tmate session + if: ${{ failure() }} + uses: mxschmitt/action-tmate@v3 + + integration-test-mysql-8026: + runs-on: ubuntu-latest + timeout-minutes: 15 + strategy: + fail-fast: true + services: + mysql: + image: mysql:8.0.26 + env: + MYSQL_ALLOW_EMPTY_PASSWORD: yes + ports: + - 3306:3306 + options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 + steps: + - uses: actions/checkout@v2 + - name: Shutdown Ubuntu MySQL (SUDO) + run: sudo service mysql stop # Shutdown the Default MySQL, "sudo" is necessary, please not remove it + - name: Set up Go 1.16 + uses: actions/setup-go@v2 + with: + go-version: 1.16 + - uses: actions/cache@v2 + with: + path: ~/go/pkg/mod + key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} + restore-keys: | + ${{ runner.os }}-go- + - name: Get dependencies + run: go mod download + - name: Download dependencies + run: sh dumpling/install.sh + - name: Integration test + run: make dumpling_integration_test VERBOSE="true" + - name: Set up tmate session + if: ${{ failure() }} + uses: mxschmitt/action-tmate@v3 + + integration-test-mysql-8022: + runs-on: ubuntu-latest + timeout-minutes: 15 + strategy: + fail-fast: true + services: + mysql: + image: mysql:8.0.22 + env: + MYSQL_ALLOW_EMPTY_PASSWORD: yes + ports: + - 3306:3306 + options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 + steps: + - uses: actions/checkout@v2 + - name: Shutdown Ubuntu MySQL (SUDO) + run: sudo service mysql stop # Shutdown the Default MySQL, "sudo" is necessary, please not remove it + - name: Set up Go 1.16 + uses: actions/setup-go@v2 + with: + go-version: 1.16 + - uses: actions/cache@v2 + with: + path: ~/go/pkg/mod + key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} + restore-keys: | + ${{ runner.os }}-go- + - name: Get dependencies + run: go mod download + - name: Download dependencies + run: sh dumpling/install.sh + - name: Integration test + run: make dumpling_integration_test VERBOSE="true" + - name: Set up tmate session + if: ${{ failure() }} + uses: mxschmitt/action-tmate@v3 diff --git a/.gitignore b/.gitignore index ef4a4e7052c04..c71bd34b114bd 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,9 @@ vendor .DS_Store .vscode bench_daily.json +coverage.txt +var +fix.sql +export-20*/ +*-coverage.xml +*-junit-report.xml diff --git a/.golangci.yml b/.golangci.yml index f054e7ee4c024..60670adf3c311 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,5 +1,5 @@ run: - timeout: 7m + timeout: 10m linters: disable-all: true enable: @@ -18,15 +18,17 @@ linters: - gosec - asciicheck - bodyclose + - exportloopref - rowserrcheck + - unconvert + - makezero + - durationcheck + linters-settings: staticcheck: checks: ["S1002","S1004","S1007","S1009","S1010","S1012","S1019","S1020","S1021","S1024","S1030","SA2*","SA3*","SA4009","SA5*","SA6000","SA6001","SA6005", "-SA2002"] stylecheck: checks: ["-ST1003"] - gosec: - excludes: - - G601 issues: exclude-rules: - path: _test\.go @@ -34,3 +36,4 @@ issues: - errcheck - gosec - rowserrcheck + - makezero diff --git a/.golangci_br.yml b/.golangci_br.yml new file mode 100644 index 0000000000000..28bbba74f749f --- /dev/null +++ b/.golangci_br.yml @@ -0,0 +1,83 @@ +run: + concurrency: 4 + timeout: 7m + +output: + format: colored-line-number + print-issued-lines: true + print-linter-name: true + +linters: + enable-all: true + disable: + - gochecknoglobals + - gci + - wsl + - funlen + - gocognit + - godox + - gomnd + - testpackage + - nestif + - goerr113 + - lll + - paralleltest + - nlreturn + - exhaustivestruct + - exhaustive + - godot + - gosec + - errorlint + - wrapcheck + - gomoddirectives + - bodyclose + - unused + - unparam + - wastedassign + - tagliatelle + - thelper + - nolintlint + - ineffassign + - nilerr + - noctx + - rowserrcheck + - predeclared + - ifshort + - cyclop + - whitespace + - unconvert + - forcetypeassert + - sqlclosecheck + - errcheck + - gocritic + - golint + - gocyclo + - promlinter + - forbidigo + - gochecknoinits + - scopelint + - revive + - misspell + - maligned + - makezero + - interfacer + - gofumpt + - goconst + - prealloc + - govet + - dupl + - deadcode + - varcheck + - nakedret + +linters-settings: + staticcheck: + checks: ["S1002","S1004","S1007","S1009","S1010","S1012","S1019","S1020","S1021","S1024","S1030","SA2*","SA3*","SA4009","SA5*","SA6000","SA6001","SA6005", "-SA2002"] + stylecheck: + checks: ["-ST1003"] + gosec: + excludes: + - G601 + +issues: + exclude-rules: diff --git a/Makefile b/Makefile index 1c24f38afd5cf..3e7fb1f5be216 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,7 @@ include Makefile.common -.PHONY: all clean test gotest server dev benchkv benchraw check checklist parser tidy ddltest build_br build_lightning build_lightning-ctl +.PHONY: all clean test gotest server dev benchkv benchraw check checklist parser tidy ddltest build_br build_lightning build_lightning-ctl build_dumpling default: server buildsucc @@ -44,7 +44,8 @@ goword:tools/bin/goword tools/bin/goword $(FILES) 2>&1 | $(FAIL_ON_STDOUT) check-static: tools/bin/golangci-lint - tools/bin/golangci-lint run -v $$($(PACKAGE_DIRECTORIES_TIDB_TESTS)) + GO111MODULE=on CGO_ENABLED=0 tools/bin/golangci-lint run -v $$($(PACKAGE_DIRECTORIES_TIDB_TESTS)) --config .golangci.yml + GO111MODULE=on CGO_ENABLED=0 tools/bin/golangci-lint run -v $$($(BR_PACKAGE_DIRECTORIES)) --config .golangci_br.yml unconvert:tools/bin/unconvert @echo "unconvert check(skip check the genenrated or copied code in lightning)" @@ -83,7 +84,7 @@ test: test_part_1 test_part_2 test_part_1: checklist explaintest -test_part_2: test_part_parser gotest gogenerate br_unit_test +test_part_2: test_part_parser gotest gogenerate br_unit_test dumpling_unit_test test_part_parser: parser_yacc test_part_parser_dev @@ -100,19 +101,14 @@ parser_unit_test: test_part_br: br_unit_test br_integration_test +test_part_dumpling: dumpling_unit_test dumpling_integration_test + explaintest: server_check @cd cmd/explaintest && ./run-tests.sh -s ../../bin/tidb-server ddltest: @cd cmd/ddltest && $(GO) test -o ../../bin/ddltest -c -upload-coverage: SHELL:=/bin/bash -upload-coverage: -ifeq ("$(TRAVIS_COVERAGE)", "1") - mv overalls.coverprofile coverage.txt - bash <(curl -s https://codecov.io/bash) -endif - devgotest: failpoint-enable # grep regex: Filter out all tidb logs starting with: # - '[20' (like [2021/09/15 ...] [INFO]..) @@ -123,16 +119,35 @@ devgotest: failpoint-enable $(GOTEST) -ldflags '$(TEST_LDFLAGS)' $(EXTRA_TEST_ARGS) -cover $(PACKAGES_TIDB_TESTS) -check.p true > gotest.log || { $(FAILPOINT_DISABLE); grep -v '^\([[]20\|PASS:\|ok \)' 'gotest.log'; exit 1; } @$(FAILPOINT_DISABLE) - gotest: failpoint-enable @echo "Running in native mode." @export log_level=info; export TZ='Asia/Shanghai'; \ - $(GOTEST) -ldflags '$(TEST_LDFLAGS)' $(EXTRA_TEST_ARGS) -cover $(PACKAGES_TIDB_TESTS) -check.p true > gotest.log || { $(FAILPOINT_DISABLE); cat 'gotest.log'; exit 1; } + $(GOTEST) -ldflags '$(TEST_LDFLAGS)' $(EXTRA_TEST_ARGS) -timeout 20m -cover $(PACKAGES_TIDB_TESTS) -coverprofile=coverage.txt -check.p true > gotest.log || { $(FAILPOINT_DISABLE); cat 'gotest.log'; exit 1; } + @$(FAILPOINT_DISABLE) + +gotest_in_verify_ci_part_1: failpoint-enable tools/bin/gotestsum tools/bin/gocov tools/bin/gocov-xml + @echo "Running gotest_in_verify_ci_part_1." + @mkdir -p $(TEST_COVERAGE_DIR) + @export log_level=info; export TZ='Asia/Shanghai'; \ + CGO_ENABLED=1 tools/bin/gotestsum --junitfile "$(TEST_COVERAGE_DIR)/tidb-junit-report.xml" -- -v -p $(P) --race \ + -ldflags '$(TEST_LDFLAGS)' $(EXTRA_TEST_ARGS) -coverprofile="$(TEST_COVERAGE_DIR)/tidb_cov.unit_test.out" \ + $(PACKAGES_TIDB_TESTS_EXPENSIVE) -check.p true || { $(FAILPOINT_DISABLE); exit 1; } + tools/bin/gocov convert "$(TEST_COVERAGE_DIR)/tidb_cov.unit_test.out" | tools/bin/gocov-xml > "$(TEST_COVERAGE_DIR)/tidb-coverage.xml" + @$(FAILPOINT_DISABLE) + +gotest_in_verify_ci_part_2: failpoint-enable tools/bin/gotestsum tools/bin/gocov tools/bin/gocov-xml + @echo "Running gotest_in_verify_ci_part_2." + @mkdir -p $(TEST_COVERAGE_DIR) + @export log_level=info; export TZ='Asia/Shanghai'; \ + CGO_ENABLED=1 tools/bin/gotestsum --junitfile "$(TEST_COVERAGE_DIR)/tidb-junit-report.xml" -- -v -p $(P) --race \ + -ldflags '$(TEST_LDFLAGS)' $(EXTRA_TEST_ARGS) -coverprofile="$(TEST_COVERAGE_DIR)/tidb_cov.unit_test.out" \ + $(PACKAGES_TIDB_TESTS_OTHERS) -check.p true || { $(FAILPOINT_DISABLE); exit 1; } + tools/bin/gocov convert "$(TEST_COVERAGE_DIR)/tidb_cov.unit_test.out" | tools/bin/gocov-xml > "$(TEST_COVERAGE_DIR)/tidb-coverage.xml" @$(FAILPOINT_DISABLE) race: failpoint-enable @export log_level=debug; \ - $(GOTEST) -timeout 20m -race $(PACKAGES) || { $(FAILPOINT_DISABLE); exit 1; } + $(GOTEST) -timeout 25m -race $(PACKAGES) || { $(FAILPOINT_DISABLE); exit 1; } @$(FAILPOINT_DISABLE) leak: failpoint-enable @@ -308,7 +323,16 @@ br_unit_test: export ARGS=$$($(BR_PACKAGES)) br_unit_test: @make failpoint-enable @export TZ='Asia/Shanghai'; - $(GOTEST) $(RACE_FLAG) -ldflags '$(LDFLAGS)' -tags leak $(ARGS) || ( make failpoint-disable && exit 1 ) + $(GOTEST) $(RACE_FLAG) -ldflags '$(LDFLAGS)' -tags leak $(ARGS) -coverprofile=coverage.txt || ( make failpoint-disable && exit 1 ) + @make failpoint-disable +br_unit_test_in_verify_ci: export ARGS=$$($(BR_PACKAGES)) +br_unit_test_in_verify_ci: tools/bin/gotestsum tools/bin/gocov tools/bin/gocov-xml + @make failpoint-enable + @export TZ='Asia/Shanghai'; + @mkdir -p $(TEST_COVERAGE_DIR) + CGO_ENABLED=1 tools/bin/gotestsum --junitfile "$(TEST_COVERAGE_DIR)/br-junit-report.xml" -- $(RACE_FLAG) -ldflags '$(LDFLAGS)' \ + -tags leak $(ARGS) -coverprofile="$(TEST_COVERAGE_DIR)/br_cov.unit_test.out" || ( make failpoint-disable && exit 1 ) + tools/bin/gocov convert "$(TEST_COVERAGE_DIR)/br_cov.unit_test.out" | tools/bin/gocov-xml > "$(TEST_COVERAGE_DIR)/br-coverage.xml" @make failpoint-disable br_integration_test: br_bins build_br build_for_br_integration_test @@ -359,3 +383,46 @@ br_bins: data_parsers: tools/bin/vfsgendev br/pkg/lightning/mydump/parser_generated.go br_web PATH="$(GOPATH)/bin":"$(PATH)":"$(TOOLS)" protoc -I. -I"$(GOPATH)/src" br/pkg/lightning/checkpoints/checkpointspb/file_checkpoints.proto --gogofaster_out=. tools/bin/vfsgendev -source='"github.com/pingcap/tidb/br/pkg/lightning/web".Res' && mv res_vfsdata.go br/pkg/lightning/web/ + +build_dumpling: + $(DUMPLING_GOBUILD) $(RACE_FLAG) -tags codes -o $(DUMPLING_BIN) dumpling/cmd/dumpling/main.go + +dumpling_unit_test: export DUMPLING_ARGS=$$($(DUMPLING_PACKAGES)) +dumpling_unit_test: failpoint-enable + $(DUMPLING_GOTEST) $(RACE_FLAG) -coverprofile=coverage.txt -covermode=atomic -tags leak $(DUMPLING_ARGS) || ( make failpoint-disable && exit 1 ) + @make failpoint-disable +dumpling_unit_test_in_verify_ci: export DUMPLING_ARGS=$$($(DUMPLING_PACKAGES)) +dumpling_unit_test_in_verify_ci: failpoint-enable tools/bin/gotestsum tools/bin/gocov tools/bin/gocov-xml + @mkdir -p $(TEST_COVERAGE_DIR) + CGO_ENABLED=1 tools/bin/gotestsum --junitfile "$(TEST_COVERAGE_DIR)/dumpling-junit-report.xml" -- -tags leak $(DUMPLING_ARGS) \ + $(RACE_FLAG) -coverprofile="$(TEST_COVERAGE_DIR)/dumpling_cov.unit_test.out" || ( make failpoint-disable && exit 1 ) + tools/bin/gocov convert "$(TEST_COVERAGE_DIR)/dumpling_cov.unit_test.out" | tools/bin/gocov-xml > "$(TEST_COVERAGE_DIR)/dumpling-coverage.xml" + @make failpoint-disable + +dumpling_integration_test: dumpling_bins failpoint-enable build_dumpling + @make failpoint-disable + ./dumpling/tests/run.sh $(CASE) + +dumpling_tools: + @echo "install dumpling tools..." + @cd dumpling/tools && make + +dumpling_tidy: + @echo "go mod tidy" + GO111MODULE=on go mod tidy + git diff --exit-code go.mod go.sum dumpling/tools/go.mod dumpling/tools/go.sum + +dumpling_bins: + @which bin/tidb-server + @which bin/minio + @which bin/tidb-lightning + @which bin/sync_diff_inspector + +tools/bin/gotestsum: tools/check/go.mod + cd tools/check && $(GO) build -o ../bin/gotestsum gotest.tools/gotestsum + +tools/bin/gocov: tools/check/go.mod + cd tools/check && $(GO) build -o ../bin/gocov github.com/axw/gocov/gocov + +tools/bin/gocov-xml: tools/check/go.mod + cd tools/check && $(GO) build -o ../bin/gocov-xml github.com/AlekSi/gocov-xml diff --git a/Makefile.common b/Makefile.common index 2d9685f263d50..2a8ea369521b1 100644 --- a/Makefile.common +++ b/Makefile.common @@ -44,14 +44,19 @@ endif ARCH := "`uname -s`" LINUX := "Linux" MAC := "Darwin" + PACKAGE_LIST := go list ./... -PACKAGE_LIST_TIDB_TESTS := go list ./... | grep -vE "github.com\/pingcap\/tidb\/br|github.com\/pingcap\/tidb\/cmd" +PACKAGE_LIST_TIDB_TESTS := go list ./... | grep -vE "github.com\/pingcap\/tidb\/br|github.com\/pingcap\/tidb\/cmd|github.com\/pingcap\/tidb\/dumpling" +PACKAGE_LIST_TEST_OTHERS := go list ./... | grep -vE "github.com\/pingcap\/tidb\/br|github.com\/pingcap\/tidb\/cmd|github.com\/pingcap\/tidb\/dumpling|github.com\/pingcap\/tidb\/executor|github.com\/pingcap\/tidb\/cmd|github.com\/pingcap\/tidb\/ddl" PACKAGES ?= $$($(PACKAGE_LIST)) PACKAGES_TIDB_TESTS ?= $$($(PACKAGE_LIST_TIDB_TESTS)) +PACKAGES_TIDB_TESTS_EXPENSIVE ?= "github.com/pingcap/tidb/executor" "github.com/pingcap/tidb/ddl" +PACKAGES_TIDB_TESTS_OTHERS ?= $$($(PACKAGE_LIST_TEST_OTHERS)) PACKAGE_DIRECTORIES := $(PACKAGE_LIST) | sed 's|github.com/pingcap/$(PROJECT)/||' PACKAGE_DIRECTORIES_TIDB_TESTS := $(PACKAGE_LIST_TIDB_TESTS) | sed 's|github.com/pingcap/$(PROJECT)/||' FILES := $$(find $$($(PACKAGE_DIRECTORIES)) -name "*.go") FILES_TIDB_TESTS := $$(find $$($(PACKAGE_DIRECTORIES_TIDB_TESTS)) -name "*.go") + UNCONVERT_PACKAGES_LIST := go list ./...| grep -vE "lightning\/checkpoints|lightning\/manual|lightning\/common" UNCONVERT_PACKAGES := $$($(UNCONVERT_PACKAGES_LIST)) @@ -88,7 +93,26 @@ endif BR_PKG := github.com/pingcap/tidb/br BR_PACKAGES := go list ./...| grep "github.com\/pingcap\/tidb\/br" +BR_PACKAGE_DIRECTORIES := $(BR_PACKAGES) | sed 's|github.com/pingcap/$(PROJECT)/||' LIGHTNING_BIN := bin/tidb-lightning LIGHTNING_CTL_BIN := bin/tidb-lightning-ctl BR_BIN := bin/br TEST_DIR := /tmp/backup_restore_test + + +DUMPLING_PKG := github.com/pingcap/tidb/dumpling +DUMPLING_PACKAGES := go list ./... | grep 'github.com\/pingcap\/tidb\/dumpling' +DUMPLING_PACKAGE_DIRECTORIES := $(DUMPLING_PACKAGES) | sed 's|github.com/pingcap/$(PROJECT)/||' +DUMPLING_BIN := bin/dumpling +DUMPLING_CHECKER := awk '{ print } END { if (NR > 0) { exit 1 } }' + +DUMPLING_LDFLAGS += -X "github.com/pingcap/tidb/dumpling/cli.ReleaseVersion=$(shell git describe --tags --dirty='-dev')" +DUMPLING_LDFLAGS += -X "github.com/pingcap/tidb/dumpling/cli.BuildTimestamp=$(shell date -u '+%Y-%m-%d %I:%M:%S')" +DUMPLING_LDFLAGS += -X "github.com/pingcap/tidb/dumpling/cli.GitHash=$(shell git rev-parse HEAD)" +DUMPLING_LDFLAGS += -X "github.com/pingcap/tidb/dumpling/cli.GitBranch=$(shell git rev-parse --abbrev-ref HEAD)" +DUMPLING_LDFLAGS += -X "github.com/pingcap/tidb/dumpling/cli.GoVersion=$(shell go version)" + +DUMPLING_GOBUILD := CGO_ENABLED=0 GO111MODULE=on go build -trimpath -ldflags '$(DUMPLING_LDFLAGS)' +DUMPLING_GOTEST := CGO_ENABLED=1 GO111MODULE=on go test -ldflags '$(DUMPLING_LDFLAGS)' + +TEST_COVERAGE_DIR := "test_coverage" diff --git a/bindinfo/bind_serial_test.go b/bindinfo/bind_serial_test.go index c913a4fef31a2..53b674a8ec715 100644 --- a/bindinfo/bind_serial_test.go +++ b/bindinfo/bind_serial_test.go @@ -16,7 +16,9 @@ package bindinfo_test import ( "context" + "crypto/tls" "fmt" + "strconv" "testing" "github.com/pingcap/tidb/bindinfo" @@ -26,10 +28,320 @@ import ( "github.com/pingcap/tidb/parser/auth" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/terror" + plannercore "github.com/pingcap/tidb/planner/core" + "github.com/pingcap/tidb/session/txninfo" "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/util" "github.com/stretchr/testify/require" ) +// mockSessionManager is a mocked session manager which is used for test. +type mockSessionManager1 struct { + PS []*util.ProcessInfo +} + +func (msm *mockSessionManager1) ShowTxnList() []*txninfo.TxnInfo { + return nil +} + +// ShowProcessList implements the SessionManager.ShowProcessList interface. +func (msm *mockSessionManager1) ShowProcessList() map[uint64]*util.ProcessInfo { + ret := make(map[uint64]*util.ProcessInfo) + for _, item := range msm.PS { + ret[item.ID] = item + } + return ret +} + +func (msm *mockSessionManager1) GetProcessInfo(id uint64) (*util.ProcessInfo, bool) { + for _, item := range msm.PS { + if item.ID == id { + return item, true + } + } + return &util.ProcessInfo{}, false +} + +// Kill implements the SessionManager.Kill interface. +func (msm *mockSessionManager1) Kill(cid uint64, query bool) { +} + +func (msm *mockSessionManager1) KillAllConnections() { +} + +func (msm *mockSessionManager1) UpdateTLSConfig(cfg *tls.Config) { +} + +func (msm *mockSessionManager1) ServerID() uint64 { + return 1 +} + +func TestPrepareCacheWithBinding(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + orgEnable := plannercore.PreparedPlanCacheEnabled() + defer func() { + plannercore.SetPreparedPlanCache(orgEnable) + }() + plannercore.SetPreparedPlanCache(true) + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("create table t1(a int, b int, c int, key idx_b(b), key idx_c(c))") + tk.MustExec("create table t2(a int, b int, c int, key idx_b(b), key idx_c(c))") + + // TestDMLSQLBind + tk.MustExec("prepare stmt1 from 'delete from t1 where b = 1 and c > 1';") + tk.MustExec("execute stmt1;") + require.Equal(t, "t1:idx_b", tk.Session().GetSessionVars().StmtCtx.IndexNames[0]) + tkProcess := tk.Session().ShowProcess() + ps := []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + res := tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) + require.True(t, tk.MustUseIndex4ExplainFor(res, "idx_b(b)"), res.Rows()) + tk.MustExec("execute stmt1;") + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + + tk.MustExec("create global binding for delete from t1 where b = 1 and c > 1 using delete /*+ use_index(t1,idx_c) */ from t1 where b = 1 and c > 1") + + tk.MustExec("execute stmt1;") + require.Equal(t, "t1:idx_c", tk.Session().GetSessionVars().StmtCtx.IndexNames[0]) + tkProcess = tk.Session().ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + res = tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) + require.True(t, tk.MustUseIndex4ExplainFor(res, "idx_c(c)"), res.Rows()) + + tk.MustExec("prepare stmt2 from 'delete t1, t2 from t1 inner join t2 on t1.b = t2.b';") + tk.MustExec("execute stmt2;") + tkProcess = tk.Session().ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + res = tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) + require.True(t, tk.HasPlan4ExplainFor(res, "HashJoin"), res.Rows()) + tk.MustExec("execute stmt2;") + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + + tk.MustExec("create global binding for delete t1, t2 from t1 inner join t2 on t1.b = t2.b using delete /*+ inl_join(t1) */ t1, t2 from t1 inner join t2 on t1.b = t2.b") + + tk.MustExec("execute stmt2;") + tkProcess = tk.Session().ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + res = tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) + require.True(t, tk.HasPlan4ExplainFor(res, "IndexJoin"), res.Rows()) + + tk.MustExec("prepare stmt3 from 'update t1 set a = 1 where b = 1 and c > 1';") + tk.MustExec("execute stmt3;") + require.Equal(t, "t1:idx_b", tk.Session().GetSessionVars().StmtCtx.IndexNames[0]) + tkProcess = tk.Session().ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + res = tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) + require.True(t, tk.MustUseIndex4ExplainFor(res, "idx_b(b)"), res.Rows()) + tk.MustExec("execute stmt3;") + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + + tk.MustExec("create global binding for update t1 set a = 1 where b = 1 and c > 1 using update /*+ use_index(t1,idx_c) */ t1 set a = 1 where b = 1 and c > 1") + + tk.MustExec("execute stmt3;") + require.Equal(t, "t1:idx_c", tk.Session().GetSessionVars().StmtCtx.IndexNames[0]) + tkProcess = tk.Session().ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + res = tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) + require.True(t, tk.MustUseIndex4ExplainFor(res, "idx_c(c)"), res.Rows()) + + tk.MustExec("prepare stmt4 from 'update t1, t2 set t1.a = 1 where t1.b = t2.b';") + tk.MustExec("execute stmt4;") + tkProcess = tk.Session().ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + res = tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) + require.True(t, tk.HasPlan4ExplainFor(res, "HashJoin"), res.Rows()) + tk.MustExec("execute stmt4;") + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + + tk.MustExec("create global binding for update t1, t2 set t1.a = 1 where t1.b = t2.b using update /*+ inl_join(t1) */ t1, t2 set t1.a = 1 where t1.b = t2.b") + + tk.MustExec("execute stmt4;") + tkProcess = tk.Session().ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + res = tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) + require.True(t, tk.HasPlan4ExplainFor(res, "IndexJoin"), res.Rows()) + + tk.MustExec("prepare stmt5 from 'insert into t1 select * from t2 where t2.b = 2 and t2.c > 2';") + tk.MustExec("execute stmt5;") + require.Equal(t, "t2:idx_b", tk.Session().GetSessionVars().StmtCtx.IndexNames[0]) + tkProcess = tk.Session().ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + res = tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) + require.True(t, tk.MustUseIndex4ExplainFor(res, "idx_b(b)"), res.Rows()) + tk.MustExec("execute stmt5;") + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + + tk.MustExec("create global binding for insert into t1 select * from t2 where t2.b = 1 and t2.c > 1 using insert /*+ use_index(t2,idx_c) */ into t1 select * from t2 where t2.b = 1 and t2.c > 1") + + tk.MustExec("execute stmt5;") + require.Equal(t, "t2:idx_b", tk.Session().GetSessionVars().StmtCtx.IndexNames[0]) + tkProcess = tk.Session().ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + res = tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) + require.True(t, tk.MustUseIndex4ExplainFor(res, "idx_b(b)"), res.Rows()) + + tk.MustExec("drop global binding for insert into t1 select * from t2 where t2.b = 1 and t2.c > 1") + tk.MustExec("create global binding for insert into t1 select * from t2 where t2.b = 1 and t2.c > 1 using insert into t1 select /*+ use_index(t2,idx_c) */ * from t2 where t2.b = 1 and t2.c > 1") + + tk.MustExec("execute stmt5;") + require.Equal(t, "t2:idx_c", tk.Session().GetSessionVars().StmtCtx.IndexNames[0]) + tkProcess = tk.Session().ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + res = tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) + require.True(t, tk.MustUseIndex4ExplainFor(res, "idx_c(c)"), res.Rows()) + + tk.MustExec("prepare stmt6 from 'replace into t1 select * from t2 where t2.b = 2 and t2.c > 2';") + tk.MustExec("execute stmt6;") + require.Equal(t, "t2:idx_b", tk.Session().GetSessionVars().StmtCtx.IndexNames[0]) + tkProcess = tk.Session().ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + res = tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) + require.True(t, tk.MustUseIndex4ExplainFor(res, "idx_b(b)"), res.Rows()) + tk.MustExec("execute stmt6;") + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + + tk.MustExec("create global binding for replace into t1 select * from t2 where t2.b = 1 and t2.c > 1 using replace into t1 select /*+ use_index(t2,idx_c) */ * from t2 where t2.b = 1 and t2.c > 1") + + tk.MustExec("execute stmt6;") + require.Equal(t, "t2:idx_c", tk.Session().GetSessionVars().StmtCtx.IndexNames[0]) + tkProcess = tk.Session().ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + res = tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) + require.True(t, tk.MustUseIndex4ExplainFor(res, "idx_c(c)"), res.Rows()) + + // TestExplain + tk.MustExec("drop table if exists t1") + tk.MustExec("drop table if exists t2") + tk.MustExec("create table t1(id int)") + tk.MustExec("create table t2(id int)") + + tk.MustExec("prepare stmt1 from 'SELECT * from t1,t2 where t1.id = t2.id';") + tk.MustExec("execute stmt1;") + tkProcess = tk.Session().ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + res = tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) + require.True(t, tk.HasPlan4ExplainFor(res, "HashJoin")) + tk.MustExec("execute stmt1;") + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + + tk.MustExec("prepare stmt2 from 'SELECT /*+ TIDB_SMJ(t1, t2) */ * from t1,t2 where t1.id = t2.id';") + tk.MustExec("execute stmt2;") + tkProcess = tk.Session().ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + res = tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) + require.True(t, tk.HasPlan4ExplainFor(res, "MergeJoin")) + tk.MustExec("execute stmt2;") + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + + tk.MustExec("create global binding for SELECT * from t1,t2 where t1.id = t2.id using SELECT /*+ TIDB_SMJ(t1, t2) */ * from t1,t2 where t1.id = t2.id") + + tk.MustExec("execute stmt1;") + tkProcess = tk.Session().ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + res = tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) + require.True(t, tk.HasPlan4ExplainFor(res, "MergeJoin")) + + tk.MustExec("drop global binding for SELECT * from t1,t2 where t1.id = t2.id") + + tk.MustExec("create index index_id on t1(id)") + tk.MustExec("prepare stmt1 from 'SELECT * from t1 use index(index_id)';") + tk.MustExec("execute stmt1;") + tkProcess = tk.Session().ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + res = tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) + require.True(t, tk.HasPlan4ExplainFor(res, "IndexReader")) + tk.MustExec("execute stmt1;") + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + + tk.MustExec("create global binding for SELECT * from t1 using SELECT * from t1 ignore index(index_id)") + tk.MustExec("execute stmt1;") + tkProcess = tk.Session().ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + res = tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) + require.False(t, tk.HasPlan4ExplainFor(res, "IndexReader")) + tk.MustExec("execute stmt1;") + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + + // Add test for SetOprStmt + tk.MustExec("prepare stmt1 from 'SELECT * from t1 union SELECT * from t1';") + tk.MustExec("execute stmt1;") + tkProcess = tk.Session().ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + res = tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) + require.False(t, tk.HasPlan4ExplainFor(res, "IndexReader")) + tk.MustExec("execute stmt1;") + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + + tk.MustExec("prepare stmt2 from 'SELECT * from t1 use index(index_id) union SELECT * from t1';") + tk.MustExec("execute stmt2;") + tkProcess = tk.Session().ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + res = tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) + require.True(t, tk.HasPlan4ExplainFor(res, "IndexReader")) + tk.MustExec("execute stmt2;") + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + + tk.MustExec("create global binding for SELECT * from t1 union SELECT * from t1 using SELECT * from t1 use index(index_id) union SELECT * from t1") + + tk.MustExec("execute stmt1;") + tkProcess = tk.Session().ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + res = tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) + require.True(t, tk.HasPlan4ExplainFor(res, "IndexReader")) + + tk.MustExec("drop global binding for SELECT * from t1 union SELECT * from t1") + + // TestBindingSymbolList + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int, INDEX ia (a), INDEX ib (b));") + tk.MustExec("insert into t value(1, 1);") + tk.MustExec("prepare stmt1 from 'select a, b from t where a = 3 limit 1, 100';") + tk.MustExec("execute stmt1;") + require.Equal(t, "t:ia", tk.Session().GetSessionVars().StmtCtx.IndexNames[0]) + tkProcess = tk.Session().ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + res = tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) + require.True(t, tk.MustUseIndex4ExplainFor(res, "ia(a)"), res.Rows()) + tk.MustExec("execute stmt1;") + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + + tk.MustExec(`create global binding for select a, b from t where a = 1 limit 0, 1 using select a, b from t use index (ib) where a = 1 limit 0, 1`) + + // after binding + tk.MustExec("execute stmt1;") + require.Equal(t, "t:ib", tk.Session().GetSessionVars().StmtCtx.IndexNames[0]) + tkProcess = tk.Session().ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + res = tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) + require.True(t, tk.MustUseIndex4ExplainFor(res, "ib(b)"), res.Rows()) +} + func TestExplain(t *testing.T) { store, clean := testkit.CreateMockStore(t) defer clean() @@ -234,7 +546,7 @@ func TestErrorBind(t *testing.T) { rs, err := tk.Exec("show global bindings") require.NoError(t, err) - chk := rs.NewChunk() + chk := rs.NewChunk(nil) err = rs.Next(context.TODO(), chk) require.NoError(t, err) require.Equal(t, 0, chk.NumRows()) @@ -555,7 +867,7 @@ func TestHintsSetID(t *testing.T) { utilCleanBindingEnv(tk, dom) err := tk.ExecToErr("create global binding for select * from t using select /*+ non_exist_hint() */ * from t") - require.True(t, terror.ErrorEqual(err, parser.ErrWarnOptimizerHintParseError)) + require.True(t, terror.ErrorEqual(err, parser.ErrParse)) tk.MustExec("create global binding for select * from t where a > 10 using select * from t where a > 10") bindData = bindHandle.GetBindRecord(hash, sql, "test") require.NotNil(t, bindData) @@ -826,11 +1138,11 @@ func TestForbidEvolvePlanBaseLinesBeforeGA(t *testing.T) { err := tk.ExecToErr("set @@tidb_evolve_plan_baselines=0") require.Equal(t, nil, err) err = tk.ExecToErr("set @@TiDB_Evolve_pLan_baselines=1") - require.Regexp(t, "Cannot enable baseline evolution feature, it is not generally available now", err) + require.EqualError(t, err, "Cannot enable baseline evolution feature, it is not generally available now") err = tk.ExecToErr("set @@TiDB_Evolve_pLan_baselines=oN") - require.Regexp(t, "Cannot enable baseline evolution feature, it is not generally available now", err) + require.EqualError(t, err, "Cannot enable baseline evolution feature, it is not generally available now") err = tk.ExecToErr("admin evolve bindings") - require.Regexp(t, "Cannot enable baseline evolution feature, it is not generally available now", err) + require.EqualError(t, err, "Cannot enable baseline evolution feature, it is not generally available now") } func TestExplainTableStmts(t *testing.T) { @@ -861,7 +1173,8 @@ func TestSPMWithoutUseDatabase(t *testing.T) { tk.MustExec("create global binding for select * from t using select * from t force index(a)") err := tk1.ExecToErr("select * from t") - require.Regexp(t, ".*No database selected", err) + require.Error(t, err) + require.Regexp(t, "No database selected$", err) tk1.MustQuery(`select @@last_plan_from_binding;`).Check(testkit.Rows("0")) require.True(t, tk1.MustUseIndex("select * from test.t", "a")) tk1.MustExec("select * from test.t") @@ -883,18 +1196,33 @@ func TestBindingWithoutCharset(t *testing.T) { require.Equal(t, "SELECT * FROM `test`.`t` WHERE `a` = 'aa'", rows[0][1]) } -func TestGCBindRecord(t *testing.T) { - store, dom, clean := testkit.CreateMockStoreAndDomain(t) +func TestBindingWithMultiParenthesis(t *testing.T) { + store, clean := testkit.CreateMockStore(t) defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int)") + tk.MustExec("create global binding for select * from (select * from t where a = 1) tt using select * from (select * from t where a = 1) tt") + tk.MustExec("create global binding for select * from ((select * from t where a = 1)) tt using select * from (select * from t where a = 1) tt") + rows := tk.MustQuery("show global bindings").Rows() + require.Len(t, rows, 1) + require.Equal(t, "select * from ( select * from `test` . `t` where `a` = ? ) as `tt`", rows[0][0]) + require.Equal(t, "SELECT * FROM (SELECT * FROM `test`.`t` WHERE `a` = 1) AS `tt`", rows[0][1]) +} + +func TestGCBindRecord(t *testing.T) { // set lease for gc tests originLease := bindinfo.Lease bindinfo.Lease = 0 - defer func() { bindinfo.Lease = originLease }() + store, dom, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") diff --git a/bindinfo/cache.go b/bindinfo/cache.go index 26a7830b4fe0e..9cdff845c9e6b 100644 --- a/bindinfo/cache.go +++ b/bindinfo/cache.go @@ -105,7 +105,8 @@ func (br *BindRecord) HasUsingBinding() bool { // FindBinding find bindings in BindRecord. func (br *BindRecord) FindBinding(hint string) *Binding { - for _, binding := range br.Bindings { + for i := range br.Bindings { + binding := br.Bindings[i] if binding.ID == hint { return &binding } @@ -160,7 +161,8 @@ func merge(lBindRecord, rBindRecord *BindRecord) *BindRecord { return lBindRecord } result := lBindRecord.shallowCopy() - for _, rbind := range rBindRecord.Bindings { + for i := range rBindRecord.Bindings { + rbind := rBindRecord.Bindings[i] found := false for j, lbind := range lBindRecord.Bindings { if lbind.isSame(&rbind) { @@ -184,7 +186,8 @@ func (br *BindRecord) remove(deleted *BindRecord) *BindRecord { return &BindRecord{OriginalSQL: br.OriginalSQL, Db: br.Db} } result := br.shallowCopy() - for _, deletedBind := range deleted.Bindings { + for j := range deleted.Bindings { + deletedBind := deleted.Bindings[j] for i, bind := range result.Bindings { if bind.isSame(&deletedBind) { result.Bindings = append(result.Bindings[:i], result.Bindings[i+1:]...) diff --git a/bindinfo/capture_serial_test.go b/bindinfo/capture_serial_test.go index bb73a3777a09d..e65697c3f2a21 100644 --- a/bindinfo/capture_serial_test.go +++ b/bindinfo/capture_serial_test.go @@ -332,9 +332,8 @@ func TestCapturedBindingCharset(t *testing.T) { require.Len(t, rows, 1) require.Equal(t, "update `test` . `t` set `name` = ? where `name` <= ?", rows[0][0]) require.Equal(t, "UPDATE /*+ use_index(@`upd_1` `test`.`t` `idx`)*/ `test`.`t` SET `name`='hello' WHERE `name` <= 'abc'", rows[0][1]) - // Charset and Collation are empty now, they are not used currently. - require.Equal(t, "", rows[0][6]) - require.Equal(t, "", rows[0][7]) + require.Equal(t, "utf8mb4", rows[0][6]) + require.Equal(t, "utf8mb4_bin", rows[0][7]) } func TestConcurrentCapture(t *testing.T) { diff --git a/bindinfo/handle.go b/bindinfo/handle.go index 8d22b85156f06..b1920047a20b6 100644 --- a/bindinfo/handle.go +++ b/bindinfo/handle.go @@ -815,7 +815,7 @@ func getHintsForSQL(sctx sessionctx.Context, sql string) (string, error) { if err != nil { return "", err } - chk := rs.NewChunk() + chk := rs.NewChunk(nil) err = rs.Next(context.TODO(), chk) if err != nil { return "", err @@ -1046,7 +1046,7 @@ func runSQL(ctx context.Context, sctx sessionctx.Context, sql string, resultChan resultChan <- err return } - chk := rs.NewChunk() + chk := rs.NewChunk(nil) for { err = rs.Next(ctx, chk) if err != nil || chk.NumRows() == 0 { @@ -1058,7 +1058,7 @@ func runSQL(ctx context.Context, sctx sessionctx.Context, sql string, resultChan } // HandleEvolvePlanTask tries to evolve one plan task. -// It only handle one tasks once because we want each task could use the latest parameters. +// It only processes one task at a time because we want each task to use the latest parameters. func (h *BindHandle) HandleEvolvePlanTask(sctx sessionctx.Context, adminEvolve bool) error { originalSQL, db, binding := h.getOnePendingVerifyJob() if originalSQL == "" { diff --git a/bindinfo/handle_serial_test.go b/bindinfo/handle_serial_test.go index 7db93f42a3012..398b0641579ca 100644 --- a/bindinfo/handle_serial_test.go +++ b/bindinfo/handle_serial_test.go @@ -393,7 +393,7 @@ func TestGlobalBinding(t *testing.T) { rs, err := tk.Exec("show global bindings") require.Nil(t, err) - chk := rs.NewChunk() + chk := rs.NewChunk(nil) err = rs.Next(context.TODO(), chk) require.Nil(t, err) require.Equal(t, 1, chk.NumRows()) @@ -447,7 +447,7 @@ func TestGlobalBinding(t *testing.T) { rs, err = tk.Exec("show global bindings") require.Nil(t, err) - chk = rs.NewChunk() + chk = rs.NewChunk(nil) err = rs.Next(context.TODO(), chk) require.Nil(t, err) require.Equal(t, 0, chk.NumRows()) diff --git a/bindinfo/session_handle_serial_test.go b/bindinfo/session_handle_serial_test.go index ab211fd0ee434..86fa4d4542fe6 100644 --- a/bindinfo/session_handle_serial_test.go +++ b/bindinfo/session_handle_serial_test.go @@ -135,14 +135,14 @@ func TestSessionBinding(t *testing.T) { rs, err := tk.Exec("show global bindings") require.NoError(t, err) - chk := rs.NewChunk() + chk := rs.NewChunk(nil) err = rs.Next(context.TODO(), chk) require.NoError(t, err) require.Equal(t, 0, chk.NumRows()) rs, err = tk.Exec("show session bindings") require.NoError(t, err) - chk = rs.NewChunk() + chk = rs.NewChunk(nil) err = rs.Next(context.TODO(), chk) require.NoError(t, err) require.Equal(t, 1, chk.NumRows()) diff --git a/br/cmd/br/debug.go b/br/cmd/br/debug.go index be02dbf28a4f7..8525c6bd61993 100644 --- a/br/cmd/br/debug.go +++ b/br/cmd/br/debug.go @@ -77,7 +77,7 @@ func newCheckSumCommand() *cobra.Command { return errors.Trace(err) } - reader := metautil.NewMetaReader(backupMeta, s) + reader := metautil.NewMetaReader(backupMeta, s, &cfg.CipherInfo) dbs, err := utils.LoadBackupTables(ctx, reader) if err != nil { return errors.Trace(err) @@ -176,7 +176,7 @@ func newBackupMetaValidateCommand() *cobra.Command { log.Error("read backupmeta failed", zap.Error(err)) return errors.Trace(err) } - reader := metautil.NewMetaReader(backupMeta, s) + reader := metautil.NewMetaReader(backupMeta, s, &cfg.CipherInfo) dbs, err := utils.LoadBackupTables(ctx, reader) if err != nil { log.Error("load tables failed", zap.Error(err)) @@ -346,7 +346,13 @@ func encodeBackupMetaCommand() *cobra.Command { // Do not overwrite origin meta file fileName += "_from_json" } - err = s.WriteFile(ctx, fileName, backupMeta) + + encryptedContent, iv, err := metautil.Encrypt(backupMeta, &cfg.CipherInfo) + if err != nil { + return errors.Trace(err) + } + + err = s.WriteFile(ctx, fileName, append(iv, encryptedContent...)) if err != nil { return errors.Trace(err) } diff --git a/br/cmd/br/restore.go b/br/cmd/br/restore.go index 753ac2846e81d..c57712ba8bddc 100644 --- a/br/cmd/br/restore.go +++ b/br/cmd/br/restore.go @@ -37,26 +37,6 @@ func runRestoreCommand(command *cobra.Command, cmdName string) error { return nil } -func runLogRestoreCommand(command *cobra.Command) error { - cfg := task.LogRestoreConfig{Config: task.Config{LogProgress: HasLogFile()}} - if err := cfg.ParseFromFlags(command.Flags()); err != nil { - command.SilenceUsage = false - return errors.Trace(err) - } - - ctx := GetDefaultContext() - if cfg.EnableOpenTracing { - var store *appdash.MemoryStore - ctx, store = trace.TracerStartSpan(ctx) - defer trace.TracerFinishSpan(ctx, store) - } - if err := task.RunLogRestore(GetDefaultContext(), tidbGlue, &cfg); err != nil { - log.Error("failed to restore", zap.Error(err)) - return errors.Trace(err) - } - return nil -} - func runRestoreRawCommand(command *cobra.Command, cmdName string) error { cfg := task.RestoreRawConfig{ RawKvConfig: task.RawKvConfig{Config: task.Config{LogProgress: HasLogFile()}}, @@ -102,7 +82,6 @@ func NewRestoreCommand() *cobra.Command { newFullRestoreCommand(), newDBRestoreCommand(), newTableRestoreCommand(), - newLogRestoreCommand(), newRawRestoreCommand(), ) task.DefineRestoreFlags(command.PersistentFlags()) @@ -149,20 +128,6 @@ func newTableRestoreCommand() *cobra.Command { return command } -func newLogRestoreCommand() *cobra.Command { - command := &cobra.Command{ - Use: "cdclog", - Short: "(experimental) restore data from cdc log backup", - Args: cobra.NoArgs, - RunE: func(cmd *cobra.Command, _ []string) error { - return runLogRestoreCommand(cmd) - }, - } - task.DefineFilterFlags(command, filterOutSysAndMemTables) - task.DefineLogRestoreFlags(command) - return command -} - func newRawRestoreCommand() *cobra.Command { command := &cobra.Command{ Use: "raw", diff --git a/br/cmd/tidb-lightning-ctl/main.go b/br/cmd/tidb-lightning-ctl/main.go index b80da9dc7a212..43891c8fb0fb3 100644 --- a/br/cmd/tidb-lightning-ctl/main.go +++ b/br/cmd/tidb-lightning-ctl/main.go @@ -229,8 +229,8 @@ func checkpointErrorDestroy(ctx context.Context, cfg *config.Config, tls *common for engineID := table.MinEngineID; engineID <= table.MaxEngineID; engineID++ { fmt.Fprintln(os.Stderr, "Closing and cleaning up engine:", table.TableName, engineID) _, eID := backend.MakeUUID(table.TableName, engineID) - file := local.File{UUID: eID} - err := file.Cleanup(cfg.TikvImporter.SortedKVDir) + engine := local.Engine{UUID: eID} + err := engine.Cleanup(cfg.TikvImporter.SortedKVDir) if err != nil { fmt.Fprintln(os.Stderr, "* Encountered error while cleanup engine:", err) lastErr = err diff --git a/br/cmd/tidb-lightning/main.go b/br/cmd/tidb-lightning/main.go index 0d44ab8cfe7d2..84362433f222c 100644 --- a/br/cmd/tidb-lightning/main.go +++ b/br/cmd/tidb-lightning/main.go @@ -30,7 +30,10 @@ import ( func main() { globalCfg := config.Must(config.LoadGlobalConfig(os.Args[1:], nil)) - fmt.Fprintf(os.Stdout, "Verbose debug logs will be written to %s\n\n", globalCfg.App.Config.File) + logToFile := globalCfg.App.File != "" && globalCfg.App.File != "-" + if logToFile { + fmt.Fprintf(os.Stdout, "Verbose debug logs will be written to %s\n\n", globalCfg.App.Config.File) + } app := lightning.New(globalCfg) @@ -88,7 +91,6 @@ func main() { if err != nil { logger.Error("tidb lightning encountered error stack info", zap.Error(err)) - logger.Error("tidb lightning encountered error", log.ShortError(err)) fmt.Fprintln(os.Stderr, "tidb lightning encountered error: ", err) } else { logger.Info("tidb lightning exit") @@ -96,7 +98,7 @@ func main() { } // call Sync() with log to stdout may return error in some case, so just skip it - if globalCfg.App.File != "" { + if logToFile { syncErr := logger.Sync() if syncErr != nil { fmt.Fprintln(os.Stderr, "sync log failed", syncErr) diff --git a/br/pkg/backup/client.go b/br/pkg/backup/client.go index 225680526cd31..12a4344a432fe 100644 --- a/br/pkg/backup/client.go +++ b/br/pkg/backup/client.go @@ -9,6 +9,7 @@ import ( "fmt" "io" "os" + "strings" "sync" "time" @@ -179,14 +180,9 @@ func (bc *Client) SetStorage(ctx context.Context, backend *backuppb.StorageBacke "there may be some backup files in the path already, "+ "please specify a correct backup directory!", bc.storage.URI()+"/"+metautil.MetaFile) } - exist, err = bc.storage.FileExists(ctx, metautil.LockFile) + err = CheckBackupStorageIsLocked(ctx, bc.storage) if err != nil { - return errors.Annotatef(err, "error occurred when checking %s file", metautil.LockFile) - } - if exist { - return errors.Annotatef(berrors.ErrInvalidArgument, "backup lock file exists in %v, "+ - "there may be some backup files in the path already, "+ - "please specify a correct backup directory!", bc.storage.URI()+"/"+metautil.LockFile) + return err } bc.backend = backend return nil @@ -197,6 +193,29 @@ func (bc *Client) GetClusterID() uint64 { return bc.clusterID } +// CheckBackupStorageIsLocked checks whether backups is locked. +// which means we found other backup progress already write +// some data files into the same backup directory or cloud prefix. +func CheckBackupStorageIsLocked(ctx context.Context, s storage.ExternalStorage) error { + exist, err := s.FileExists(ctx, metautil.LockFile) + if err != nil { + return errors.Annotatef(err, "error occurred when checking %s file", metautil.LockFile) + } + if exist { + err = s.WalkDir(ctx, &storage.WalkOption{}, func(path string, size int64) error { + // should return error to break the walkDir when found lock file and other .sst files. + if strings.HasSuffix(path, ".sst") { + return errors.Annotatef(berrors.ErrInvalidArgument, "backup lock file and sst file exist in %v, "+ + "there are some backup files in the path already, "+ + "please specify a correct backup directory!", s.URI()+"/"+metautil.LockFile) + } + return nil + }) + return err + } + return nil +} + // BuildTableRanges returns the key ranges encompassing the entire table, // and its partitions if exists. func BuildTableRanges(tbl *model.TableInfo) ([]kv.KeyRange, error) { @@ -355,6 +374,24 @@ func BuildBackupRangeAndSchema( return ranges, backupSchemas, nil } +func skipUnsupportedDDLJob(job *model.Job) bool { + switch job.Type { + // TiDB V5.3.0 supports TableAttributes and TablePartitionAttributes. + // Backup guarantees data integrity but region placement, which is out of scope of backup + case model.ActionCreatePlacementPolicy, + model.ActionAlterPlacementPolicy, + model.ActionDropPlacementPolicy, + model.ActionAlterTablePartitionPlacement, + model.ActionModifySchemaDefaultPlacement, + model.ActionAlterTablePlacement, + model.ActionAlterTableAttributes, + model.ActionAlterTablePartitionAttributes: + return true + default: + return false + } +} + // WriteBackupDDLJobs sends the ddl jobs are done in (lastBackupTS, backupTS] to metaWriter. func WriteBackupDDLJobs(metaWriter *metautil.MetaWriter, store kv.Storage, lastBackupTS, backupTS uint64) error { snapshot := store.GetSnapshot(kv.NewVersion(backupTS)) @@ -387,6 +424,10 @@ func WriteBackupDDLJobs(metaWriter *metautil.MetaWriter, store kv.Storage, lastB count := 0 for _, job := range allJobs { + if skipUnsupportedDDLJob(job) { + continue + } + if (job.State == model.JobStateDone || job.State == model.JobStateSynced) && (job.BinlogInfo != nil && job.BinlogInfo.SchemaVersion > lastSchemaVersion) { jobBytes, err := json.Marshal(job) @@ -696,7 +737,7 @@ func OnBackupResponse( if lockErr := v.KvError.Locked; lockErr != nil { // Try to resolve lock. log.Warn("backup occur kv error", zap.Reflect("error", v)) - msBeforeExpired, _, err1 := lockResolver.ResolveLocks( + msBeforeExpired, err1 := lockResolver.ResolveLocks( bo, backupTS, []*txnlock.Lock{txnlock.NewLock(lockErr)}) if err1 != nil { return nil, 0, errors.Trace(err1) @@ -940,7 +981,26 @@ backupLoop: return nil } +// gRPC communication cancelled with connection closing +const ( + gRPC_Cancel = "the client connection is closing" +) + // isRetryableError represents whether we should retry reset grpc connection. func isRetryableError(err error) bool { - return status.Code(err) == codes.Unavailable + + if status.Code(err) == codes.Unavailable { + return true + } + + // At least, there are two possible cancel() call, + // one from backup range, another from gRPC, here we retry when gRPC cancel with connection closing + if status.Code(err) == codes.Canceled { + if s, ok := status.FromError(err); ok { + if strings.Contains(s.Message(), gRPC_Cancel) { + return true + } + } + } + return false } diff --git a/br/pkg/backup/client_test.go b/br/pkg/backup/client_test.go index 5e19349aaa0a3..e341f15417f55 100644 --- a/br/pkg/backup/client_test.go +++ b/br/pkg/backup/client_test.go @@ -4,15 +4,20 @@ package backup_test import ( "context" + "encoding/json" "math" "testing" "time" + "github.com/golang/protobuf/proto" . "github.com/pingcap/check" backuppb "github.com/pingcap/kvproto/pkg/brpb" + "github.com/pingcap/kvproto/pkg/encryptionpb" "github.com/pingcap/kvproto/pkg/errorpb" "github.com/pingcap/tidb/br/pkg/backup" "github.com/pingcap/tidb/br/pkg/conn" + "github.com/pingcap/tidb/br/pkg/metautil" + "github.com/pingcap/tidb/br/pkg/mock" "github.com/pingcap/tidb/br/pkg/pdutil" "github.com/pingcap/tidb/br/pkg/storage" "github.com/pingcap/tidb/kv" @@ -20,6 +25,7 @@ import ( "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/util/testkit" "github.com/tikv/client-go/v2/oracle" "github.com/tikv/client-go/v2/testutils" "github.com/tikv/client-go/v2/tikv" @@ -33,6 +39,9 @@ type testBackup struct { mockPDClient pd.Client backupClient *backup.Client + + cluster *mock.Cluster + storage storage.ExternalStorage } var _ = Suite(&testBackup{}) @@ -51,6 +60,21 @@ func (r *testBackup) SetUpSuite(c *C) { mockMgr.SetHTTP([]string{"test"}, nil) r.backupClient, err = backup.NewBackupClient(r.ctx, mockMgr) c.Assert(err, IsNil) + + r.cluster, err = mock.NewCluster() + c.Assert(err, IsNil) + base := c.MkDir() + r.storage, err = storage.NewLocalStorage(base) + c.Assert(err, IsNil) + //c.Assert(r.cluster.Start(), IsNil) + +} + +func (r *testBackup) resetStorage(c *C) { + var err error + base := c.MkDir() + r.storage, err = storage.NewLocalStorage(base) + c.Assert(err, IsNil) } func (r *testBackup) TestGetTS(c *C) { @@ -241,7 +265,6 @@ func (r *testBackup) TestSendCreds(c *C) { c.Assert(err, IsNil) opts := &storage.ExternalStorageOptions{ SendCredentials: true, - SkipCheckPath: true, } _, err = storage.New(r.ctx, backend, opts) c.Assert(err, IsNil) @@ -260,7 +283,6 @@ func (r *testBackup) TestSendCreds(c *C) { c.Assert(err, IsNil) opts = &storage.ExternalStorageOptions{ SendCredentials: false, - SkipCheckPath: true, } _, err = storage.New(r.ctx, backend, opts) c.Assert(err, IsNil) @@ -269,3 +291,79 @@ func (r *testBackup) TestSendCreds(c *C) { secret_access_key = backend.GetS3().SecretAccessKey c.Assert(secret_access_key, Equals, "") } + +func (r *testBackup) TestskipUnsupportedDDLJob(c *C) { + tk := testkit.NewTestKit(c, r.cluster.Storage) + tk.MustExec("CREATE DATABASE IF NOT EXISTS test_db;") + tk.MustExec("CREATE TABLE IF NOT EXISTS test_db.test_table (c1 INT);") + lastTS, err := r.cluster.GetOracle().GetTimestamp(context.Background(), &oracle.Option{TxnScope: oracle.GlobalTxnScope}) + c.Assert(err, IsNil, Commentf("Error get last ts: %s", err)) + tk.MustExec("RENAME TABLE test_db.test_table to test_db.test_table1;") + tk.MustExec("DROP TABLE test_db.test_table1;") + tk.MustExec("DROP DATABASE test_db;") + tk.MustExec("CREATE DATABASE test_db;") + tk.MustExec("USE test_db;") + tk.MustExec("CREATE TABLE test_table1 (c2 CHAR(255));") + tk.MustExec("RENAME TABLE test_table1 to test_table;") + tk.MustExec("TRUNCATE TABLE test_table;") + + tk.MustExec("CREATE TABLE tb(id INT NOT NULL, stu_id INT NOT NULL) " + + "PARTITION BY RANGE (stu_id) (PARTITION p0 VALUES LESS THAN (6),PARTITION p1 VALUES LESS THAN (11))") + tk.MustExec("ALTER TABLE tb attributes \"merge_option=allow\"") + tk.MustExec("ALTER TABLE tb PARTITION p0 attributes \"merge_option=deny\"") + + ts, err := r.cluster.GetOracle().GetTimestamp(context.Background(), &oracle.Option{TxnScope: oracle.GlobalTxnScope}) + c.Assert(err, IsNil, Commentf("Error get ts: %s", err)) + + cipher := backuppb.CipherInfo{CipherType: encryptionpb.EncryptionMethod_PLAINTEXT} + metaWriter := metautil.NewMetaWriter(r.storage, metautil.MetaFileSize, false, &cipher) + ctx := context.Background() + metaWriter.StartWriteMetasAsync(ctx, metautil.AppendDDL) + err = backup.WriteBackupDDLJobs(metaWriter, r.cluster.Storage, lastTS, ts) + c.Assert(err, IsNil, Commentf("Error get ddl jobs: %s", err)) + err = metaWriter.FinishWriteMetas(ctx, metautil.AppendDDL) + c.Assert(err, IsNil, Commentf("Flush failed", err)) + err = metaWriter.FlushBackupMeta(ctx) + c.Assert(err, IsNil, Commentf("Finially flush backupmeta failed", err)) + + metaBytes, err := r.storage.ReadFile(ctx, metautil.MetaFile) + c.Assert(err, IsNil) + mockMeta := &backuppb.BackupMeta{} + err = proto.Unmarshal(metaBytes, mockMeta) + c.Assert(err, IsNil) + // check the schema version + metaReader := metautil.NewMetaReader(mockMeta, r.storage, &cipher) + allDDLJobsBytes, err := metaReader.ReadDDLs(ctx) + c.Assert(err, IsNil) + var allDDLJobs []*model.Job + err = json.Unmarshal(allDDLJobsBytes, &allDDLJobs) + c.Assert(err, IsNil) + c.Assert(len(allDDLJobs), Equals, 8) +} + +func (r *testBackup) TestCheckBackupIsLocked(c *C) { + ctx := context.Background() + + r.resetStorage(c) + // check passed with an empty storage + err := backup.CheckBackupStorageIsLocked(ctx, r.storage) + c.Assert(err, IsNil) + + // check passed with only a lock file + err = r.storage.WriteFile(ctx, metautil.LockFile, nil) + c.Assert(err, IsNil) + err = backup.CheckBackupStorageIsLocked(ctx, r.storage) + c.Assert(err, IsNil) + + // check passed with a lock file and other non-sst files. + err = r.storage.WriteFile(ctx, "1.txt", nil) + c.Assert(err, IsNil) + err = backup.CheckBackupStorageIsLocked(ctx, r.storage) + c.Assert(err, IsNil) + + // check failed + err = r.storage.WriteFile(ctx, "1.sst", nil) + c.Assert(err, IsNil) + err = backup.CheckBackupStorageIsLocked(ctx, r.storage) + c.Assert(err, ErrorMatches, "backup lock file and sst file exist in(.+)") +} diff --git a/br/pkg/backup/schema.go b/br/pkg/backup/schema.go index 34ab023d5245d..4e653253cafcd 100644 --- a/br/pkg/backup/schema.go +++ b/br/pkg/backup/schema.go @@ -21,7 +21,6 @@ import ( "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/statistics/handle" - "github.com/pingcap/tipb/go-tipb" "go.uber.org/zap" "golang.org/x/sync/errgroup" ) @@ -32,7 +31,7 @@ const ( DefaultSchemaConcurrency = 64 ) -type scheamInfo struct { +type schemaInfo struct { tableInfo *model.TableInfo dbInfo *model.DBInfo crc64xor uint64 @@ -44,12 +43,12 @@ type scheamInfo struct { // Schemas is task for backuping schemas. type Schemas struct { // name -> schema - schemas map[string]*scheamInfo + schemas map[string]*schemaInfo } func newBackupSchemas() *Schemas { return &Schemas{ - schemas: make(map[string]*scheamInfo), + schemas: make(map[string]*schemaInfo), } } @@ -58,7 +57,7 @@ func (ss *Schemas) addSchema( ) { name := fmt.Sprintf("%s.%s", utils.EncloseName(dbInfo.Name.L), utils.EncloseName(tableInfo.Name.L)) - ss.schemas[name] = &scheamInfo{ + ss.schemas[name] = &schemaInfo{ tableInfo: tableInfo, dbInfo: dbInfo, } @@ -89,10 +88,13 @@ func (ss *Schemas) BackupSchemas( metaWriter.StartWriteMetasAsync(ctx, op) for _, s := range ss.schemas { schema := s + // Because schema.dbInfo is a pointer that many tables point to. + // Remove "add Temporary-prefix into dbName" from closure to prevent concurrent operations. + if utils.IsSysDB(schema.dbInfo.Name.L) { + schema.dbInfo.Name = utils.TemporaryDBName(schema.dbInfo.Name.O) + } + workerPool.ApplyOnErrorGroup(errg, func() error { - if utils.IsSysDB(schema.dbInfo.Name.L) { - schema.dbInfo.Name = utils.TemporaryDBName(schema.dbInfo.Name.O) - } logger := log.With( zap.String("db", schema.dbInfo.Name.O), zap.String("table", schema.tableInfo.Name.O), @@ -101,53 +103,27 @@ func (ss *Schemas) BackupSchemas( if !skipChecksum { logger.Info("table checksum start") start := time.Now() - checksumResp, err := calculateChecksum( - ectx, schema.tableInfo, store.GetClient(), backupTS, copConcurrency) + err := schema.calculateChecksum(ectx, store.GetClient(), backupTS, copConcurrency) if err != nil { return errors.Trace(err) } - schema.crc64xor = checksumResp.Checksum - schema.totalKvs = checksumResp.TotalKvs - schema.totalBytes = checksumResp.TotalBytes logger.Info("table checksum finished", - zap.Uint64("Crc64Xor", checksumResp.Checksum), - zap.Uint64("TotalKvs", checksumResp.TotalKvs), - zap.Uint64("TotalBytes", checksumResp.TotalBytes), + zap.Uint64("Crc64Xor", schema.crc64xor), + zap.Uint64("TotalKvs", schema.totalKvs), + zap.Uint64("TotalBytes", schema.totalBytes), zap.Duration("take", time.Since(start))) } if statsHandle != nil { - jsonTable, err := statsHandle.DumpStatsToJSON( - schema.dbInfo.Name.String(), schema.tableInfo, nil) - if err != nil { + if err := schema.dumpStatsToJSON(statsHandle); err != nil { logger.Error("dump table stats failed", logutil.ShortError(err)) } - schema.stats = jsonTable } + // Send schema to metawriter - dbBytes, err := json.Marshal(schema.dbInfo) + s, err := schema.encodeToSchema() if err != nil { return errors.Trace(err) } - tableBytes, err := json.Marshal(schema.tableInfo) - if err != nil { - return errors.Trace(err) - } - var statsBytes []byte - if schema.stats != nil { - statsBytes, err = json.Marshal(schema.stats) - if err != nil { - return errors.Trace(err) - } - } - s := &backuppb.Schema{ - Db: dbBytes, - Table: tableBytes, - Crc64Xor: schema.crc64xor, - TotalKvs: schema.totalKvs, - TotalBytes: schema.totalBytes, - Stats: statsBytes, - } - if err := metaWriter.Send(s, op); err != nil { return errors.Trace(err) } @@ -168,24 +144,68 @@ func (ss *Schemas) Len() int { return len(ss.schemas) } -func calculateChecksum( +func (s *schemaInfo) calculateChecksum( ctx context.Context, - table *model.TableInfo, client kv.Client, backupTS uint64, concurrency uint, -) (*tipb.ChecksumResponse, error) { - exe, err := checksum.NewExecutorBuilder(table, backupTS). +) error { + exe, err := checksum.NewExecutorBuilder(s.tableInfo, backupTS). SetConcurrency(concurrency). Build() if err != nil { - return nil, errors.Trace(err) + return errors.Trace(err) } + checksumResp, err := exe.Execute(ctx, client, func() { // TODO: update progress here. }) + if err != nil { + return errors.Trace(err) + } + + s.crc64xor = checksumResp.Checksum + s.totalKvs = checksumResp.TotalKvs + s.totalBytes = checksumResp.TotalBytes + return nil +} + +func (s *schemaInfo) dumpStatsToJSON(statsHandle *handle.Handle) error { + jsonTable, err := statsHandle.DumpStatsToJSON( + s.dbInfo.Name.String(), s.tableInfo, nil) + if err != nil { + return errors.Trace(err) + } + + s.stats = jsonTable + return nil +} + +func (s *schemaInfo) encodeToSchema() (*backuppb.Schema, error) { + dbBytes, err := json.Marshal(s.dbInfo) if err != nil { return nil, errors.Trace(err) } - return checksumResp, nil + + tableBytes, err := json.Marshal(s.tableInfo) + if err != nil { + return nil, errors.Trace(err) + } + + var statsBytes []byte + if s.stats != nil { + statsBytes, err = json.Marshal(s.stats) + if err != nil { + return nil, errors.Trace(err) + } + } + + return &backuppb.Schema{ + Db: dbBytes, + Table: tableBytes, + Crc64Xor: s.crc64xor, + TotalKvs: s.totalKvs, + TotalBytes: s.totalBytes, + Stats: statsBytes, + }, nil } diff --git a/br/pkg/backup/schema_test.go b/br/pkg/backup/schema_test.go index 62555cb343f9a..c858d556f98d0 100644 --- a/br/pkg/backup/schema_test.go +++ b/br/pkg/backup/schema_test.go @@ -4,17 +4,21 @@ package backup_test import ( "context" + "fmt" "math" + "strings" "sync/atomic" "github.com/golang/protobuf/proto" . "github.com/pingcap/check" backuppb "github.com/pingcap/kvproto/pkg/brpb" + "github.com/pingcap/kvproto/pkg/encryptionpb" filter "github.com/pingcap/tidb-tools/pkg/table-filter" "github.com/pingcap/tidb/br/pkg/backup" "github.com/pingcap/tidb/br/pkg/metautil" "github.com/pingcap/tidb/br/pkg/mock" "github.com/pingcap/tidb/br/pkg/storage" + "github.com/pingcap/tidb/br/pkg/utils" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/util/testkit" "github.com/pingcap/tidb/util/testleak" @@ -52,7 +56,12 @@ func (s *testBackupSchemaSuite) GetSchemasFromMeta(c *C, es storage.ExternalStor mockMeta := &backuppb.BackupMeta{} err = proto.Unmarshal(metaBytes, mockMeta) c.Assert(err, IsNil) - metaReader := metautil.NewMetaReader(mockMeta, es) + metaReader := metautil.NewMetaReader(mockMeta, + es, + &backuppb.CipherInfo{ + CipherType: encryptionpb.EncryptionMethod_PLAINTEXT, + }, + ) output := make(chan *metautil.Table, 4) go func() { @@ -126,7 +135,10 @@ func (s *testBackupSchemaSuite) TestBuildBackupRangeAndSchema(c *C) { updateCh := new(simpleProgress) skipChecksum := false es := s.GetRandomStorage(c) - metaWriter := metautil.NewMetaWriter(es, metautil.MetaFileSize, false) + cipher := backuppb.CipherInfo{ + CipherType: encryptionpb.EncryptionMethod_PLAINTEXT, + } + metaWriter := metautil.NewMetaWriter(es, metautil.MetaFileSize, false, &cipher) ctx := context.Background() err = backupSchemas.BackupSchemas( ctx, metaWriter, s.mock.Storage, nil, math.MaxUint64, 1, variable.DefChecksumTableConcurrency, skipChecksum, updateCh) @@ -154,7 +166,7 @@ func (s *testBackupSchemaSuite) TestBuildBackupRangeAndSchema(c *C) { updateCh.reset() es2 := s.GetRandomStorage(c) - metaWriter2 := metautil.NewMetaWriter(es2, metautil.MetaFileSize, false) + metaWriter2 := metautil.NewMetaWriter(es2, metautil.MetaFileSize, false, &cipher) err = backupSchemas.BackupSchemas( ctx, metaWriter2, s.mock.Storage, nil, math.MaxUint64, 2, variable.DefChecksumTableConcurrency, skipChecksum, updateCh) c.Assert(updateCh.get(), Equals, int64(2)) @@ -200,8 +212,12 @@ func (s *testBackupSchemaSuite) TestBuildBackupRangeAndSchemaWithBrokenStats(c * skipChecksum := false updateCh := new(simpleProgress) + cipher := backuppb.CipherInfo{ + CipherType: encryptionpb.EncryptionMethod_PLAINTEXT, + } + es := s.GetRandomStorage(c) - metaWriter := metautil.NewMetaWriter(es, metautil.MetaFileSize, false) + metaWriter := metautil.NewMetaWriter(es, metautil.MetaFileSize, false, &cipher) ctx := context.Background() err = backupSchemas.BackupSchemas( ctx, metaWriter, s.mock.Storage, nil, math.MaxUint64, 1, variable.DefChecksumTableConcurrency, skipChecksum, updateCh) @@ -230,7 +246,7 @@ func (s *testBackupSchemaSuite) TestBuildBackupRangeAndSchemaWithBrokenStats(c * updateCh.reset() statsHandle := s.mock.Domain.StatsHandle() es2 := s.GetRandomStorage(c) - metaWriter2 := metautil.NewMetaWriter(es2, metautil.MetaFileSize, false) + metaWriter2 := metautil.NewMetaWriter(es2, metautil.MetaFileSize, false, &cipher) err = backupSchemas.BackupSchemas( ctx, metaWriter2, s.mock.Storage, statsHandle, math.MaxUint64, 1, variable.DefChecksumTableConcurrency, skipChecksum, updateCh) c.Assert(err, IsNil) @@ -247,3 +263,42 @@ func (s *testBackupSchemaSuite) TestBuildBackupRangeAndSchemaWithBrokenStats(c * c.Assert(schemas2[0].Info, DeepEquals, schemas[0].Info) c.Assert(schemas2[0].DB, DeepEquals, schemas[0].DB) } + +func (s *testBackupSchemaSuite) TestBackupSchemasForSystemTable(c *C) { + tk := testkit.NewTestKit(c, s.mock.Storage) + es2 := s.GetRandomStorage(c) + + systemTablesCount := 32 + tablePrefix := "systable" + tk.MustExec("use mysql") + for i := 1; i <= systemTablesCount; i++ { + query := fmt.Sprintf("create table %s%d (a char(1));", tablePrefix, i) + tk.MustExec(query) + } + + f, err := filter.Parse([]string{"mysql.systable*"}) + c.Assert(err, IsNil) + _, backupSchemas, err := backup.BuildBackupRangeAndSchema(s.mock.Storage, f, math.MaxUint64) + c.Assert(err, IsNil) + c.Assert(backupSchemas.Len(), Equals, systemTablesCount) + + ctx := context.Background() + cipher := backuppb.CipherInfo{ + CipherType: encryptionpb.EncryptionMethod_PLAINTEXT, + } + updateCh := new(simpleProgress) + + metaWriter2 := metautil.NewMetaWriter(es2, metautil.MetaFileSize, false, &cipher) + err = backupSchemas.BackupSchemas(ctx, metaWriter2, s.mock.Storage, nil, + math.MaxUint64, 1, variable.DefChecksumTableConcurrency, true, updateCh) + c.Assert(err, IsNil) + err = metaWriter2.FlushBackupMeta(ctx) + c.Assert(err, IsNil) + + schemas2 := s.GetSchemasFromMeta(c, es2) + c.Assert(schemas2, HasLen, systemTablesCount) + for _, schema := range schemas2 { + c.Assert(schema.DB.Name, Equals, utils.TemporaryDBName("mysql")) + c.Assert(strings.HasPrefix(schema.Info.Name.O, tablePrefix), Equals, true) + } +} diff --git a/br/pkg/cdclog/buffer.go b/br/pkg/cdclog/buffer.go deleted file mode 100644 index 7cfe2ea638d94..0000000000000 --- a/br/pkg/cdclog/buffer.go +++ /dev/null @@ -1,217 +0,0 @@ -// Copyright 2020 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, -// 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. - -package cdclog - -import ( - "time" - - "github.com/pingcap/errors" - "github.com/pingcap/log" - "github.com/pingcap/tidb/br/pkg/kv" - "github.com/pingcap/tidb/meta/autoid" - "github.com/pingcap/tidb/table" - "github.com/pingcap/tidb/types" - "go.uber.org/zap" -) - -// TableBuffer represents the kv buffer of this table. -// we restore one tableBuffer in one goroutine. -// this is the concurrent unit of log restore. -type TableBuffer struct { - KvPairs []kv.Row - count int - size int64 - - KvEncoder kv.Encoder - tableInfo table.Table - allocator autoid.Allocators - - flushKVSize int64 - flushKVPairs int - - colNames []string - colPerm []int -} - -func newKVEncoder(allocators autoid.Allocators, tbl table.Table) (kv.Encoder, error) { - encTable, err := table.TableFromMeta(allocators, tbl.Meta()) - if err != nil { - return nil, errors.Trace(err) - } - return kv.NewTableKVEncoder(encTable, &kv.SessionOptions{ - Timestamp: time.Now().Unix(), - // TODO get the version from TiDB cluster - // currently TiDB only support v1 and v2, and since 4.0 - // the default RowFormatVersion is 2, so I think - // we can implement the row version retrieve from cluster in the future - // when TiDB decide to support v3 RowFormatVersion. - RowFormatVersion: "2", - }), nil -} - -// NewTableBuffer creates TableBuffer. -func NewTableBuffer(tbl table.Table, allocators autoid.Allocators, flushKVPairs int, flushKVSize int64) *TableBuffer { - tb := &TableBuffer{ - KvPairs: make([]kv.Row, 0, flushKVPairs), - flushKVPairs: flushKVPairs, - flushKVSize: flushKVSize, - } - if tbl != nil { - tb.ReloadMeta(tbl, allocators) - } - return tb -} - -// ResetTableInfo set tableInfo to nil for next reload. -func (t *TableBuffer) ResetTableInfo() { - t.tableInfo = nil -} - -// TableInfo returns the table info of this buffer. -func (t *TableBuffer) TableInfo() table.Table { - return t.tableInfo -} - -// TableID returns the table id of this buffer. -func (t *TableBuffer) TableID() int64 { - if t.tableInfo != nil { - return t.tableInfo.Meta().ID - } - return 0 -} - -// ReloadMeta reload columns after -// 1. table buffer created. -// 2. every ddl executed. -func (t *TableBuffer) ReloadMeta(tbl table.Table, allocator autoid.Allocators) { - columns := tbl.Meta().Cols() - colNames := make([]string, 0, len(columns)) - colPerm := make([]int, 0, len(columns)+1) - - for i, col := range columns { - colNames = append(colNames, col.Name.String()) - colPerm = append(colPerm, i) - } - if kv.TableHasAutoRowID(tbl.Meta()) { - colPerm = append(colPerm, -1) - } - if t.allocator == nil { - t.allocator = allocator - } - t.tableInfo = tbl - t.colNames = colNames - t.colPerm = colPerm - // reset kv encoder after meta changed - t.KvEncoder = nil -} - -func (t *TableBuffer) translateToDatum(row map[string]Column) ([]types.Datum, error) { - cols := make([]types.Datum, 0, len(row)) - for _, col := range t.colNames { - val, err := row[col].ToDatum() - if err != nil { - return nil, errors.Trace(err) - } - cols = append(cols, val) - } - return cols, nil -} - -func (t *TableBuffer) appendRow( - row map[string]Column, - item *SortItem, - encodeFn func(row []types.Datum, - rowID int64, - columnPermutation []int) (kv.Row, int, error), -) error { - cols, err := t.translateToDatum(row) - if err != nil { - return errors.Trace(err) - } - pair, size, err := encodeFn(cols, item.RowID, t.colPerm) - if err != nil { - return errors.Trace(err) - } - t.KvPairs = append(t.KvPairs, pair) - t.size += int64(size) - t.count++ - return nil -} - -// Append appends the item to this buffer. -func (t *TableBuffer) Append(item *SortItem) error { - var err error - log.Debug("Append item to buffer", - zap.Stringer("table", t.tableInfo.Meta().Name), - zap.Any("item", item), - ) - row := item.Data.(*MessageRow) - - if t.KvEncoder == nil { - // lazy create kv encoder - log.Debug("create kv encoder lazily", - zap.Any("alloc", t.allocator), zap.Any("tbl", t.tableInfo)) - t.KvEncoder, err = newKVEncoder(t.allocator, t.tableInfo) - if err != nil { - return errors.Trace(err) - } - } - - if row.PreColumns != nil { - // remove old keys - log.Debug("process update event", zap.Any("row", row)) - err := t.appendRow(row.PreColumns, item, t.KvEncoder.RemoveRecord) - if err != nil { - return errors.Trace(err) - } - } - if row.Update != nil { - // Add new columns - if row.PreColumns == nil { - log.Debug("process insert event", zap.Any("row", row)) - } - err := t.appendRow(row.Update, item, t.KvEncoder.AddRecord) - if err != nil { - return errors.Trace(err) - } - } - if row.Delete != nil { - // Remove current columns - log.Debug("process delete event", zap.Any("row", row)) - err := t.appendRow(row.Delete, item, t.KvEncoder.RemoveRecord) - if err != nil { - return errors.Trace(err) - } - } - return nil -} - -// ShouldApply tells whether we should flush memory kv buffer to storage. -func (t *TableBuffer) ShouldApply() bool { - // flush when reached flush kv len or flush size - return t.size >= t.flushKVSize || t.count >= t.flushKVPairs -} - -// IsEmpty tells buffer is empty. -func (t *TableBuffer) IsEmpty() bool { - return t.size == 0 -} - -// Clear reset the buffer. -func (t *TableBuffer) Clear() { - t.KvPairs = t.KvPairs[:0] - t.count = 0 - t.size = 0 -} diff --git a/br/pkg/cdclog/decoder.go b/br/pkg/cdclog/decoder.go deleted file mode 100644 index 0334d3ff76f57..0000000000000 --- a/br/pkg/cdclog/decoder.go +++ /dev/null @@ -1,299 +0,0 @@ -// Copyright 2020 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, -// 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. - -package cdclog - -import ( - "bytes" - "encoding/base64" - "encoding/binary" - "encoding/json" - "strconv" - - "github.com/pingcap/errors" - "github.com/pingcap/log" - berrors "github.com/pingcap/tidb/br/pkg/errors" - timodel "github.com/pingcap/tidb/parser/model" - "github.com/pingcap/tidb/parser/mysql" - "github.com/pingcap/tidb/types" - "go.uber.org/zap" -) - -// ColumnFlagType represents the type of Column. -type ColumnFlagType uint64 - -// ItemType represents the type of SortItem. -type ItemType uint - -const ( - // RowChanged represents dml type. - RowChanged ItemType = 1 << ItemType(iota) - // DDL represents ddl type. - DDL -) - -// TODO let cdc import these flags. -const ( - // BatchVersion1 represents the version of batch format. - BatchVersion1 uint64 = 1 -) - -const ( - // BinaryFlag means the Column charset is binary. - BinaryFlag ColumnFlagType = 1 << ColumnFlagType(iota) - // HandleKeyFlag means the Column is selected as the handle key. - HandleKeyFlag - // GeneratedColumnFlag means the Column is a generated Column. - GeneratedColumnFlag - // PrimaryKeyFlag means the Column is primary key. - PrimaryKeyFlag - // UniqueKeyFlag means the Column is unique key. - UniqueKeyFlag - // MultipleKeyFlag means the Column is multiple key. - MultipleKeyFlag - // NullableFlag means the Column is nullable. - NullableFlag -) - -// Column represents the column data define by cdc. -type Column struct { - Type byte `json:"t"` - - // WhereHandle is deprecated - // WhereHandle is replaced by HandleKey in Flag. - WhereHandle *bool `json:"h,omitempty"` - Flag ColumnFlagType `json:"f"` - Value interface{} `json:"v"` -} - -// ToDatum encode Column to Datum. -func (c Column) ToDatum() (types.Datum, error) { - var ( - val interface{} - err error - ) - - switch c.Type { - case mysql.TypeTiny, mysql.TypeShort, mysql.TypeInt24, mysql.TypeLong, mysql.TypeLonglong, mysql.TypeYear: - val, err = c.Value.(json.Number).Int64() - if err != nil { - return types.Datum{}, errors.Trace(err) - } - case mysql.TypeFloat, mysql.TypeDouble: - val, err = c.Value.(json.Number).Float64() - if err != nil { - return types.Datum{}, errors.Trace(err) - } - default: - val = c.Value - } - return types.NewDatum(val), nil -} - -func formatColumnVal(c Column) Column { - switch c.Type { - case mysql.TypeVarchar, mysql.TypeString: - if s, ok := c.Value.(string); ok { - // according to open protocol https://docs.pingcap.com/tidb/dev/ticdc-open-protocol - // CHAR/BINARY have the same type: 254 - // VARCHAR/VARBINARY have the same type: 15 - // we need to process it by its flag. - if c.Flag&BinaryFlag != 0 { - val, err := strconv.Unquote("\"" + s + "\"") - if err != nil { - log.Panic("invalid Column value, please report a bug", zap.Any("col", c), zap.Error(err)) - } - c.Value = val - } - } - case mysql.TypeTinyBlob, mysql.TypeMediumBlob, - mysql.TypeLongBlob, mysql.TypeBlob: - if s, ok := c.Value.(string); ok { - var err error - c.Value, err = base64.StdEncoding.DecodeString(s) - if err != nil { - log.Panic("invalid Column value, please report a bug", zap.Any("col", c), zap.Error(err)) - } - } - case mysql.TypeBit: - if s, ok := c.Value.(json.Number); ok { - intNum, err := s.Int64() - if err != nil { - log.Panic("invalid Column value, please report a bug", zap.Any("col", c), zap.Error(err)) - } - c.Value = uint64(intNum) - } - } - return c -} - -type messageKey struct { - TS uint64 `json:"ts"` - Schema string `json:"scm,omitempty"` - Table string `json:"tbl,omitempty"` - RowID int64 `json:"rid,omitempty"` - Partition *int64 `json:"ptn,omitempty"` -} - -// Encode the messageKey. -func (m *messageKey) Encode() ([]byte, error) { - return json.Marshal(m) -} - -// Decode the messageKey. -func (m *messageKey) Decode(data []byte) error { - return json.Unmarshal(data, m) -} - -// MessageDDL represents the ddl changes. -type MessageDDL struct { - Query string `json:"q"` - Type timodel.ActionType `json:"t"` -} - -// Encode the DDL message. -func (m *MessageDDL) Encode() ([]byte, error) { - return json.Marshal(m) -} - -// Decode the DDL message. -func (m *MessageDDL) Decode(data []byte) error { - return json.Unmarshal(data, m) -} - -// MessageRow represents the row changes in same commit ts. -type MessageRow struct { - Update map[string]Column `json:"u,omitempty"` - PreColumns map[string]Column `json:"p,omitempty"` - Delete map[string]Column `json:"d,omitempty"` -} - -// Encode the Row message. -func (m *MessageRow) Encode() ([]byte, error) { - return json.Marshal(m) -} - -// Decode the Row message. -func (m *MessageRow) Decode(data []byte) error { - decoder := json.NewDecoder(bytes.NewReader(data)) - decoder.UseNumber() - err := decoder.Decode(m) - if err != nil { - return errors.Trace(err) - } - for colName, column := range m.Update { - m.Update[colName] = formatColumnVal(column) - } - for colName, column := range m.Delete { - m.Delete[colName] = formatColumnVal(column) - } - for colName, column := range m.PreColumns { - m.PreColumns[colName] = formatColumnVal(column) - } - return nil -} - -// SortItem represents a DDL item or Row changed item. -type SortItem struct { - ItemType ItemType - Data interface{} - Schema string - Table string - RowID int64 - TS uint64 -} - -// LessThan return whether it has smaller commit ts than other item. -func (s *SortItem) LessThan(other *SortItem) bool { - if other != nil { - return s.TS < other.TS - } - return true -} - -// JSONEventBatchMixedDecoder decodes the byte of a batch into the original messages. -type JSONEventBatchMixedDecoder struct { - mixedBytes []byte -} - -func (b *JSONEventBatchMixedDecoder) decodeNextKey() (*messageKey, error) { - keyLen := binary.BigEndian.Uint64(b.mixedBytes[:8]) - key := b.mixedBytes[8 : keyLen+8] - // drop value bytes - msgKey := new(messageKey) - err := msgKey.Decode(key) - if err != nil { - return nil, errors.Trace(err) - } - b.mixedBytes = b.mixedBytes[keyLen+8:] - return msgKey, nil -} - -// NextEvent return next item depends on type. -func (b *JSONEventBatchMixedDecoder) NextEvent(itemType ItemType) (*SortItem, error) { - if !b.HasNext() { - return nil, nil - } - nextKey, err := b.decodeNextKey() - if err != nil { - return nil, errors.Trace(err) - } - - valueLen := binary.BigEndian.Uint64(b.mixedBytes[:8]) - value := b.mixedBytes[8 : valueLen+8] - b.mixedBytes = b.mixedBytes[valueLen+8:] - - var m interface{} - if itemType == DDL { - m = new(MessageDDL) - if err := m.(*MessageDDL).Decode(value); err != nil { - return nil, errors.Trace(err) - } - } else if itemType == RowChanged { - m = new(MessageRow) - if err := m.(*MessageRow).Decode(value); err != nil { - return nil, errors.Trace(err) - } - } - - item := &SortItem{ - ItemType: itemType, - Data: m, - Schema: nextKey.Schema, - Table: nextKey.Table, - TS: nextKey.TS, - RowID: nextKey.RowID, - } - return item, nil -} - -// HasNext represents whether it has next kv to decode. -func (b *JSONEventBatchMixedDecoder) HasNext() bool { - return len(b.mixedBytes) > 0 -} - -// NewJSONEventBatchDecoder creates a new JSONEventBatchDecoder. -func NewJSONEventBatchDecoder(data []byte) (*JSONEventBatchMixedDecoder, error) { - if len(data) == 0 { - return nil, nil - } - version := binary.BigEndian.Uint64(data[:8]) - data = data[8:] - if version != BatchVersion1 { - return nil, errors.Annotate(berrors.ErrPiTRInvalidCDCLogFormat, "unexpected key format version") - } - return &JSONEventBatchMixedDecoder{ - mixedBytes: data, - }, nil -} diff --git a/br/pkg/cdclog/decoder_test.go b/br/pkg/cdclog/decoder_test.go deleted file mode 100644 index 5af40fd6f0f4a..0000000000000 --- a/br/pkg/cdclog/decoder_test.go +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright 2020 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, -// 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. - -package cdclog - -import ( - "encoding/binary" - "encoding/json" - "testing" - - "github.com/pingcap/check" - "github.com/pingcap/tidb/parser/mysql" -) - -func Test(t *testing.T) { check.TestingT(t) } - -type batchSuite struct { - ddlEvents []*MessageDDL - ddlDecodeItem []*SortItem - - rowEvents []*MessageRow - rowDecodeItem []*SortItem -} - -var updateCols = map[string]Column{ - // json.Number - "id": {Type: 1, Value: "1"}, - "name": {Type: 2, Value: "test"}, -} - -var _ = check.Suite(&batchSuite{ - ddlEvents: []*MessageDDL{ - {"drop table event", 4}, - {"create table event", 3}, - {"drop table event", 5}, - }, - ddlDecodeItem: []*SortItem{ - {ItemType: DDL, Schema: "test", Table: "event", TS: 1, Data: MessageDDL{"drop table event", 4}}, - {ItemType: DDL, Schema: "test", Table: "event", TS: 1, Data: MessageDDL{"create table event", 3}}, - {ItemType: DDL, Schema: "test", Table: "event", TS: 1, Data: MessageDDL{"drop table event", 5}}, - }, - - rowEvents: []*MessageRow{ - {Update: updateCols}, - {PreColumns: updateCols}, - {Delete: updateCols}, - }, - rowDecodeItem: []*SortItem{ - {ItemType: RowChanged, Schema: "test", Table: "event", TS: 1, RowID: 0, Data: MessageRow{Update: updateCols}}, - {ItemType: RowChanged, Schema: "test", Table: "event", TS: 1, RowID: 1, Data: MessageRow{PreColumns: updateCols}}, - {ItemType: RowChanged, Schema: "test", Table: "event", TS: 1, RowID: 2, Data: MessageRow{Delete: updateCols}}, - }, -}) - -func buildEncodeRowData(events []*MessageRow) []byte { - var versionByte [8]byte - binary.BigEndian.PutUint64(versionByte[:], BatchVersion1) - data := append(make([]byte, 0), versionByte[:]...) - key := messageKey{ - TS: 1, - Schema: "test", - Table: "event", - } - var LenByte [8]byte - for i := 0; i < len(events); i++ { - key.RowID = int64(i) - keyBytes, _ := key.Encode() - binary.BigEndian.PutUint64(LenByte[:], uint64(len(keyBytes))) - data = append(data, LenByte[:]...) - data = append(data, keyBytes...) - eventBytes, _ := events[i].Encode() - binary.BigEndian.PutUint64(LenByte[:], uint64(len(eventBytes))) - data = append(data, LenByte[:]...) - data = append(data, eventBytes...) - } - return data -} - -func buildEncodeDDLData(events []*MessageDDL) []byte { - var versionByte [8]byte - binary.BigEndian.PutUint64(versionByte[:], BatchVersion1) - data := append(make([]byte, 0), versionByte[:]...) - key := messageKey{ - TS: 1, - Schema: "test", - Table: "event", - } - var LenByte [8]byte - for i := 0; i < len(events); i++ { - keyBytes, _ := key.Encode() - binary.BigEndian.PutUint64(LenByte[:], uint64(len(keyBytes))) - data = append(data, LenByte[:]...) - data = append(data, keyBytes...) - eventBytes, _ := events[i].Encode() - binary.BigEndian.PutUint64(LenByte[:], uint64(len(eventBytes))) - data = append(data, LenByte[:]...) - data = append(data, eventBytes...) - } - return data -} - -func (s *batchSuite) TestDecoder(c *check.C) { - var item *SortItem - - data := buildEncodeDDLData(s.ddlEvents) - decoder, err := NewJSONEventBatchDecoder(data) - c.Assert(err, check.IsNil) - index := 0 - for { - hasNext := decoder.HasNext() - if !hasNext { - break - } - item, err = decoder.NextEvent(DDL) - c.Assert(err, check.IsNil) - c.Assert(item.Data.(*MessageDDL), check.DeepEquals, s.ddlEvents[index]) - index++ - } - - data = buildEncodeRowData(s.rowEvents) - decoder, err = NewJSONEventBatchDecoder(data) - c.Assert(err, check.IsNil) - index = 0 - for { - hasNext := decoder.HasNext() - if !hasNext { - break - } - item, err = decoder.NextEvent(RowChanged) - c.Assert(err, check.IsNil) - c.Assert(item.Data.(*MessageRow), check.DeepEquals, s.rowEvents[index]) - c.Assert(item.RowID, check.Equals, int64(index)) - index++ - } -} - -func (s *batchSuite) TestColumn(c *check.C) { - // test varbinary columns (same type with varchar 15) - col1 := Column{Type: mysql.TypeVarchar, Flag: BinaryFlag, Value: "\\x00\\x01"} - col1 = formatColumnVal(col1) - dat, err := col1.ToDatum() - c.Assert(err, check.IsNil) - c.Assert(dat.GetString(), check.Equals, "\x00\x01") - - // test binary columns (same type with varchar 254) - col2 := Column{Type: mysql.TypeString, Flag: BinaryFlag, Value: "test\\ttest"} - col2 = formatColumnVal(col2) - dat, err = col2.ToDatum() - c.Assert(err, check.IsNil) - c.Assert(dat.GetString(), check.Equals, "test\ttest") - - // test year columns - val := json.Number("2020") - colYear := Column{Type: mysql.TypeYear, Value: val} - dat, err = colYear.ToDatum() - c.Assert(err, check.IsNil) - c.Assert(dat.GetInt64(), check.Equals, int64(2020)) -} diff --git a/br/pkg/cdclog/puller.go b/br/pkg/cdclog/puller.go deleted file mode 100644 index 1c823c8de6c44..0000000000000 --- a/br/pkg/cdclog/puller.go +++ /dev/null @@ -1,184 +0,0 @@ -// Copyright 2020 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, -// 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. - -package cdclog - -import ( - "context" - - "github.com/pingcap/errors" - "github.com/pingcap/log" - "github.com/pingcap/tidb/br/pkg/storage" -) - -// EventPuller pulls next event in ts order. -type EventPuller struct { - ddlDecoder *JSONEventBatchMixedDecoder - rowChangedDecoder *JSONEventBatchMixedDecoder - currentDDLItem *SortItem - currentRowChangedItem *SortItem - - schema string - table string - - storage storage.ExternalStorage - ddlFiles []string - rowChangedFiles []string - - ddlFileIndex int - rowChangedFileIndex int -} - -// NewEventPuller create eventPuller by given log files, we assume files come in ts order. -func NewEventPuller( - ctx context.Context, - schema string, - table string, - ddlFiles []string, - rowChangedFiles []string, - storage storage.ExternalStorage) (*EventPuller, error) { - var ( - ddlDecoder *JSONEventBatchMixedDecoder - ddlFileIndex int - rowChangedDecoder *JSONEventBatchMixedDecoder - rowFileIndex int - ) - if len(ddlFiles) == 0 { - log.Info("There is no ddl file to restore") - } else { - data, err := storage.ReadFile(ctx, ddlFiles[0]) - if err != nil { - return nil, errors.Trace(err) - } - if len(data) != 0 { - ddlFileIndex++ - ddlDecoder, err = NewJSONEventBatchDecoder(data) - if err != nil { - return nil, errors.Trace(err) - } - } - } - - if len(rowChangedFiles) == 0 { - log.Info("There is no row changed file to restore") - } else { - data, err := storage.ReadFile(ctx, rowChangedFiles[0]) - if err != nil { - return nil, errors.Trace(err) - } - if len(data) != 0 { - rowFileIndex++ - rowChangedDecoder, err = NewJSONEventBatchDecoder(data) - if err != nil { - return nil, errors.Trace(err) - } - } - } - - return &EventPuller{ - schema: schema, - table: table, - - ddlDecoder: ddlDecoder, - rowChangedDecoder: rowChangedDecoder, - - ddlFiles: ddlFiles, - rowChangedFiles: rowChangedFiles, - ddlFileIndex: ddlFileIndex, - rowChangedFileIndex: rowFileIndex, - - storage: storage, - }, nil -} - -// PullOneEvent pulls one event in ts order. -// The Next event which can be DDL item or Row changed Item depends on next commit ts. -func (e *EventPuller) PullOneEvent(ctx context.Context) (*SortItem, error) { - var ( - err error - data []byte - ) - // ddl exists - if e.ddlDecoder != nil { - // current file end, read next file if next file exists - if !e.ddlDecoder.HasNext() && e.ddlFileIndex < len(e.ddlFiles) { - path := e.ddlFiles[e.ddlFileIndex] - data, err = e.storage.ReadFile(ctx, path) - if err != nil { - return nil, errors.Trace(err) - } - if len(data) > 0 { - e.ddlFileIndex++ - e.ddlDecoder, err = NewJSONEventBatchDecoder(data) - if err != nil { - return nil, errors.Trace(err) - } - } - } - // set current DDL item first - if e.currentDDLItem == nil { - e.currentDDLItem, err = e.ddlDecoder.NextEvent(DDL) - if err != nil { - return nil, errors.Trace(err) - } - } - } - // dml exists - if e.rowChangedDecoder != nil { - // current file end, read next file if next file exists - if !e.rowChangedDecoder.HasNext() && e.rowChangedFileIndex < len(e.rowChangedFiles) { - path := e.rowChangedFiles[e.rowChangedFileIndex] - data, err = e.storage.ReadFile(ctx, path) - if err != nil { - return nil, errors.Trace(err) - } - if len(data) != 0 { - e.rowChangedFileIndex++ - e.rowChangedDecoder, err = NewJSONEventBatchDecoder(data) - if err != nil { - return nil, errors.Trace(err) - } - } - } - if e.currentRowChangedItem == nil { - e.currentRowChangedItem, err = e.rowChangedDecoder.NextEvent(RowChanged) - if err != nil { - return nil, errors.Trace(err) - } - } - } - - var returnItem *SortItem - switch { - case e.currentDDLItem != nil: - if e.currentDDLItem.LessThan(e.currentRowChangedItem) { - returnItem = e.currentDDLItem - e.currentDDLItem, err = e.ddlDecoder.NextEvent(DDL) - if err != nil { - return nil, errors.Trace(err) - } - break - } - fallthrough - case e.currentRowChangedItem != nil: - returnItem = e.currentRowChangedItem - e.currentRowChangedItem, err = e.rowChangedDecoder.NextEvent(RowChanged) - if err != nil { - return nil, errors.Trace(err) - } - default: - log.Info("puller finished") - } - return returnItem, nil -} diff --git a/br/pkg/checksum/validate.go b/br/pkg/checksum/validate.go index 7b1fdac250a96..a24c1f1f775a6 100644 --- a/br/pkg/checksum/validate.go +++ b/br/pkg/checksum/validate.go @@ -18,7 +18,10 @@ import ( // FastChecksum checks whether the "local" checksum matches the checksum from TiKV. func FastChecksum( - ctx context.Context, backupMeta *backuppb.BackupMeta, storage storage.ExternalStorage, + ctx context.Context, + backupMeta *backuppb.BackupMeta, + storage storage.ExternalStorage, + cipher *backuppb.CipherInfo, ) error { start := time.Now() defer func() { @@ -29,7 +32,7 @@ func FastChecksum( ch := make(chan *metautil.Table) errCh := make(chan error) go func() { - reader := metautil.NewMetaReader(backupMeta, storage) + reader := metautil.NewMetaReader(backupMeta, storage, cipher) if err := reader.ReadSchemasFiles(ctx, ch); err != nil { errCh <- errors.Trace(err) } diff --git a/br/pkg/conn/conn_test.go b/br/pkg/conn/conn_test.go index 2f77803fc3f78..256b653898c0d 100644 --- a/br/pkg/conn/conn_test.go +++ b/br/pkg/conn/conn_test.go @@ -165,8 +165,6 @@ func TestCheckStoresAlive(t *testing.T) { } func TestGetAllTiKVStores(t *testing.T) { - t.Parallel() - testCases := []struct { stores []*metapb.Store storeBehavior StoreBehavior @@ -201,7 +199,7 @@ func TestGetAllTiKVStores(t *testing.T) { {Id: 2, Labels: []*metapb.StoreLabel{{Key: "engine", Value: "tiflash"}}}, }, storeBehavior: ErrorOnTiFlash, - expectedError: "cannot restore to a cluster with active TiFlash stores.*", + expectedError: "^cannot restore to a cluster with active TiFlash stores", }, { stores: []*metapb.Store{ @@ -225,7 +223,7 @@ func TestGetAllTiKVStores(t *testing.T) { {Id: 6, Labels: []*metapb.StoreLabel{{Key: "else", Value: "tiflash"}, {Key: "engine", Value: "tikv"}}}, }, storeBehavior: ErrorOnTiFlash, - expectedError: "cannot restore to a cluster with active TiFlash stores.*", + expectedError: "^cannot restore to a cluster with active TiFlash stores", }, { stores: []*metapb.Store{ @@ -258,8 +256,6 @@ func TestGetAllTiKVStores(t *testing.T) { } func TestGetConnOnCanceledContext(t *testing.T) { - t.Parallel() - ctx, cancel := context.WithCancel(context.Background()) cancel() @@ -267,9 +263,9 @@ func TestGetConnOnCanceledContext(t *testing.T) { _, err := mgr.GetBackupClient(ctx, 42) require.Error(t, err) - require.Regexp(t, ".*context canceled.*", err.Error()) + require.Contains(t, err.Error(), "context canceled") _, err = mgr.ResetBackupClient(ctx, 42) require.Error(t, err) - require.Regexp(t, ".*context canceled.*", err.Error()) + require.Contains(t, err.Error(), "context canceled") } diff --git a/br/pkg/errors/errors.go b/br/pkg/errors/errors.go index a7a53f8042261..350e19b5e2613 100644 --- a/br/pkg/errors/errors.go +++ b/br/pkg/errors/errors.go @@ -23,6 +23,8 @@ var ( ErrVersionMismatch = errors.Normalize("version mismatch", errors.RFCCodeText("BR:Common:ErrVersionMismatch")) ErrFailedToConnect = errors.Normalize("failed to make gRPC channels", errors.RFCCodeText("BR:Common:ErrFailedToConnect")) ErrInvalidMetaFile = errors.Normalize("invalid metafile", errors.RFCCodeText("BR:Common:ErrInvalidMetaFile")) + ErrEnvNotSpecified = errors.Normalize("environment variable not found", errors.RFCCodeText("BR:Common:ErrEnvNotSpecified")) + ErrUnsupportedOperation = errors.Normalize("the operation is not supported", errors.RFCCodeText("BR:Common:ErrUnsupportedOperation")) ErrPDUpdateFailed = errors.Normalize("failed to update PD", errors.RFCCodeText("BR:PD:ErrPDUpdateFailed")) ErrPDLeaderNotFound = errors.Normalize("PD leader not found", errors.RFCCodeText("BR:PD:ErrPDLeaderNotFound")) diff --git a/br/pkg/glue/glue.go b/br/pkg/glue/glue.go index 29dec1a87937e..2b27b40704767 100644 --- a/br/pkg/glue/glue.go +++ b/br/pkg/glue/glue.go @@ -38,6 +38,7 @@ type Glue interface { // Session is an abstraction of the session.Session interface. type Session interface { Execute(ctx context.Context, sql string) error + ExecuteInternal(ctx context.Context, sql string, args ...interface{}) error CreateDatabase(ctx context.Context, schema *model.DBInfo) error CreateTable(ctx context.Context, dbName model.CIStr, table *model.TableInfo) error Close() diff --git a/br/pkg/gluetidb/glue.go b/br/pkg/gluetidb/glue.go index 82bd904370a58..b2dd9c1fa711b 100644 --- a/br/pkg/gluetidb/glue.go +++ b/br/pkg/gluetidb/glue.go @@ -110,6 +110,11 @@ func (gs *tidbSession) Execute(ctx context.Context, sql string) error { return errors.Trace(err) } +func (gs *tidbSession) ExecuteInternal(ctx context.Context, sql string, args ...interface{}) error { + _, err := gs.se.ExecuteInternal(ctx, sql, args...) + return errors.Trace(err) +} + // CreateDatabase implements glue.Session. func (gs *tidbSession) CreateDatabase(ctx context.Context, schema *model.DBInfo) error { d := domain.GetDomain(gs.se).DDL() @@ -129,14 +134,13 @@ func (gs *tidbSession) CreateDatabase(ctx context.Context, schema *model.DBInfo) func (gs *tidbSession) CreateTables(ctx context.Context, tables map[string][]*model.TableInfo, batchDdlSize uint) error { d := domain.GetDomain(gs.se).DDL() log.Info("tidb start create tables", zap.Uint("batchDdlSize", batchDdlSize)) + var dbName model.CIStr + cloneTables := make([]*model.TableInfo, 0, len(tables)) for db, tablesInDB := range tables { - NewTables := make([]*model.TableInfo, 0, len(tablesInDB)) - dbName := model.NewCIStr(db) + dbName = model.NewCIStr(db) queryBuilder := strings.Builder{} - lastSend := 0 for _, table := range tablesInDB { - query, err := gs.showCreateTable(table) if err != nil { log.Error("Tidbsession to show create tables failure.") @@ -152,55 +156,17 @@ func (gs *tidbSession) CreateTables(ctx context.Context, tables map[string][]*mo newPartition.Definitions = append([]model.PartitionDefinition{}, table.Partition.Definitions...) table.Partition = &newPartition } - NewTables = append(NewTables, table) - var batchSize int = int(batchDdlSize) - if batchDdlSize <= 1 { - batchSize = 500 - } - // 500 tables once, limitation from raft entry size - LengthOfTables := len(NewTables) - if LengthOfTables == 0 { - log.Error("size of tables equals to 0.") - return errors.New("empty tables to restore.") - } - if LengthOfTables%batchSize == 0 { - ThePatchTables := NewTables[lastSend : LengthOfTables-1] - gs.se.SetValue(sessionctx.QueryString, queryBuilder.String()) - err := d.BatchCreateTableWithInfo(gs.se, dbName, ThePatchTables, ddl.OnExistIgnore, true) - if err != nil { - log.Info("Bulk create table from tidb failure, it possible caused by version mismatch with BR.", zap.String("Error", err.Error())) - return err - } - log.Info("BatchCreateTableWithInfo DONE", - zap.Stringer("DB", dbName), - zap.Int("start", lastSend), - zap.Int("end", LengthOfTables-1), - zap.Int("query total size", len(queryBuilder.String()))) - lastSend = LengthOfTables - 1 - queryBuilder.Reset() - } - + cloneTables = append(cloneTables, table) } - // handle leftover tables from NewTables, e.g. - // 1. if DB has 550 tables, batch size is 500, 500 will be send by internal loop, 50 leftover, here we handle 50 - // 2. if DB has 50 tables < 500 - LengthOfTables := len(NewTables) - if lastSend < LengthOfTables { - ThePatchTables := NewTables[lastSend:LengthOfTables] - gs.se.SetValue(sessionctx.QueryString, queryBuilder.String()) - err := d.BatchCreateTableWithInfo(gs.se, dbName, ThePatchTables, ddl.OnExistIgnore, true) - if err != nil { - log.Info("Bulk create table from tidb failure, it possible caused by version mismatch with BR.", zap.String("Error", err.Error())) - return err - } - log.Info("BatchCreateTableWithInfo DONE", - zap.Stringer("DB", dbName), - zap.Int("start", lastSend), - zap.Int("end", LengthOfTables), - zap.Int("query total size", len(queryBuilder.String()))) - lastSend = LengthOfTables - 1 - queryBuilder.Reset() + gs.se.SetValue(sessionctx.QueryString, queryBuilder.String()) + err := d.BatchCreateTableWithInfo(gs.se, dbName, cloneTables, ddl.OnExistIgnore, true) + if err != nil { + log.Info("Bulk create table from tidb failure, it possible caused by version mismatch with BR.", zap.String("Error", err.Error())) + return err } + log.Info("BatchCreateTableWithInfo DONE", + zap.Stringer("DB", dbName), + zap.Int("table num", len(cloneTables))) } return nil diff --git a/br/pkg/gluetikv/glue_test.go b/br/pkg/gluetikv/glue_test.go index 71b445e70e5f9..ab08d5f99f673 100644 --- a/br/pkg/gluetikv/glue_test.go +++ b/br/pkg/gluetikv/glue_test.go @@ -1,20 +1,26 @@ +// Copyright 2021 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, +// 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. + package gluetikv import ( "testing" - . "github.com/pingcap/check" + "github.com/stretchr/testify/require" ) -type testGlue struct{} - -var _ = Suite(&testGlue{}) - -func TestT(t *testing.T) { - TestingT(t) -} - -func (r *testGlue) TestGetVersion(c *C) { +func TestGetVersion(t *testing.T) { g := Glue{} - c.Assert(g.GetVersion(), Matches, "BR(.|\n)*Release Version(.|\n)*Git Commit Hash(.|\n)*") + require.Regexp(t, "^BR(.|\n)*Release Version(.|\n)*Git Commit Hash(.|\n)*$", g.GetVersion()) } diff --git a/br/pkg/kv/checksum_test.go b/br/pkg/kv/checksum_test.go index 56ef6cfa24f58..8b594f23f698c 100644 --- a/br/pkg/kv/checksum_test.go +++ b/br/pkg/kv/checksum_test.go @@ -25,8 +25,6 @@ import ( func uint64NotEqual(a uint64, b uint64) bool { return a != b } func TestChecksum(t *testing.T) { - t.Parallel() - checksum := kv.NewKVChecksum(0) require.Equal(t, uint64(0), checksum.Sum()) @@ -69,8 +67,6 @@ func TestChecksum(t *testing.T) { } func TestChecksumJSON(t *testing.T) { - t.Parallel() - testStruct := &struct { Checksum kv.Checksum }{ diff --git a/br/pkg/kv/kv_test.go b/br/pkg/kv/kv_test.go index ab264dd23e9d7..ddf32247e03b2 100644 --- a/br/pkg/kv/kv_test.go +++ b/br/pkg/kv/kv_test.go @@ -26,8 +26,6 @@ import ( ) func TestMarshal(t *testing.T) { - t.Parallel() - dats := make([]types.Datum, 4) dats[0].SetInt64(1) dats[1].SetNull() @@ -43,8 +41,6 @@ func TestMarshal(t *testing.T) { } func TestSimplePairIter(t *testing.T) { - t.Parallel() - pairs := []Pair{ {Key: []byte("1"), Val: []byte("a")}, {Key: []byte("2"), Val: []byte("b")}, diff --git a/br/pkg/kv/session_test.go b/br/pkg/kv/session_test.go index ecb99da864a86..4c3ddf4015f28 100644 --- a/br/pkg/kv/session_test.go +++ b/br/pkg/kv/session_test.go @@ -22,8 +22,6 @@ import ( ) func TestSession(t *testing.T) { - t.Parallel() - session := newSession(&SessionOptions{SQLMode: mysql.ModeNone, Timestamp: 1234567890, RowFormatVersion: "1"}) _, err := session.Txn(true) require.NoError(t, err) diff --git a/br/pkg/lightning/backend/backend.go b/br/pkg/lightning/backend/backend.go index d2d9e64de6c18..a28e80b30215a 100644 --- a/br/pkg/lightning/backend/backend.go +++ b/br/pkg/lightning/backend/backend.go @@ -25,6 +25,7 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/tidb/br/pkg/lightning/backend/kv" "github.com/pingcap/tidb/br/pkg/lightning/checkpoints" + "github.com/pingcap/tidb/br/pkg/lightning/config" "github.com/pingcap/tidb/br/pkg/lightning/log" "github.com/pingcap/tidb/br/pkg/lightning/metric" "github.com/pingcap/tidb/br/pkg/lightning/mydump" @@ -199,11 +200,15 @@ type AbstractBackend interface { // CollectLocalDuplicateRows collect duplicate keys from local db. We will store the duplicate keys which // may be repeated with other keys in local data source. - CollectLocalDuplicateRows(ctx context.Context, tbl table.Table) (hasDupe bool, err error) + CollectLocalDuplicateRows(ctx context.Context, tbl table.Table, tableName string, opts *kv.SessionOptions) (hasDupe bool, err error) // CollectRemoteDuplicateRows collect duplicate keys from remote TiKV storage. This keys may be duplicate with // the data import by other lightning. - CollectRemoteDuplicateRows(ctx context.Context, tbl table.Table) (hasDupe bool, err error) + CollectRemoteDuplicateRows(ctx context.Context, tbl table.Table, tableName string, opts *kv.SessionOptions) (hasDupe bool, err error) + + // ResolveDuplicateRows resolves duplicated rows by deleting/inserting data + // according to the required algorithm. + ResolveDuplicateRows(ctx context.Context, tbl table.Table, tableName string, algorithm config.DuplicateResolutionAlgorithm) error } // Backend is the delivery target for Lightning @@ -359,12 +364,16 @@ func (be Backend) OpenEngine(ctx context.Context, config *EngineConfig, tableNam }, nil } -func (be Backend) CollectLocalDuplicateRows(ctx context.Context, tbl table.Table) (bool, error) { - return be.abstract.CollectLocalDuplicateRows(ctx, tbl) +func (be Backend) CollectLocalDuplicateRows(ctx context.Context, tbl table.Table, tableName string, opts *kv.SessionOptions) (bool, error) { + return be.abstract.CollectLocalDuplicateRows(ctx, tbl, tableName, opts) +} + +func (be Backend) CollectRemoteDuplicateRows(ctx context.Context, tbl table.Table, tableName string, opts *kv.SessionOptions) (bool, error) { + return be.abstract.CollectRemoteDuplicateRows(ctx, tbl, tableName, opts) } -func (be Backend) CollectRemoteDuplicateRows(ctx context.Context, tbl table.Table) (bool, error) { - return be.abstract.CollectRemoteDuplicateRows(ctx, tbl) +func (be Backend) ResolveDuplicateRows(ctx context.Context, tbl table.Table, tableName string, algorithm config.DuplicateResolutionAlgorithm) error { + return be.abstract.ResolveDuplicateRows(ctx, tbl, tableName, algorithm) } // Close the opened engine to prepare it for importing. diff --git a/br/pkg/lightning/backend/backend_test.go b/br/pkg/lightning/backend/backend_test.go index e2ca9703a8a16..d1a6f4e41a58d 100644 --- a/br/pkg/lightning/backend/backend_test.go +++ b/br/pkg/lightning/backend/backend_test.go @@ -7,12 +7,12 @@ import ( "github.com/golang/mock/gomock" "github.com/google/uuid" - . "github.com/pingcap/check" "github.com/pingcap/errors" "github.com/pingcap/tidb/br/pkg/lightning/backend" "github.com/pingcap/tidb/br/pkg/lightning/backend/kv" "github.com/pingcap/tidb/br/pkg/mock" "github.com/pingcap/tidb/parser/mysql" + "github.com/stretchr/testify/require" "github.com/tikv/client-go/v2/oracle" ) @@ -23,30 +23,24 @@ type backendSuite struct { ts uint64 } -var _ = Suite(&backendSuite{}) - -func Test(t *testing.T) { - TestingT(t) -} - -// FIXME: Cannot use the real SetUpTest/TearDownTest to set up the mock -// otherwise the mock error will be ignored. - -func (s *backendSuite) setUpTest(c gomock.TestReporter) { - s.controller = gomock.NewController(c) - s.mockBackend = mock.NewMockBackend(s.controller) - s.backend = backend.MakeBackend(s.mockBackend) - s.ts = oracle.ComposeTS(time.Now().Unix()*1000, 0) +func createBackendSuite(c gomock.TestReporter) *backendSuite { + controller := gomock.NewController(c) + mockBackend := mock.NewMockBackend(controller) + return &backendSuite{ + controller: controller, + mockBackend: mockBackend, + backend: backend.MakeBackend(mockBackend), + ts: oracle.ComposeTS(time.Now().Unix()*1000, 0), + } } func (s *backendSuite) tearDownTest() { s.controller.Finish() } -func (s *backendSuite) TestOpenCloseImportCleanUpEngine(c *C) { - s.setUpTest(c) +func TestOpenCloseImportCleanUpEngine(t *testing.T) { + s := createBackendSuite(t) defer s.tearDownTest() - ctx := context.Background() engineUUID := uuid.MustParse("902efee3-a3f9-53d4-8c82-f12fb1900cd1") @@ -67,17 +61,17 @@ func (s *backendSuite) TestOpenCloseImportCleanUpEngine(c *C) { After(importCall) engine, err := s.backend.OpenEngine(ctx, &backend.EngineConfig{}, "`db`.`table`", 1) - c.Assert(err, IsNil) + require.NoError(t, err) closedEngine, err := engine.Close(ctx, nil) - c.Assert(err, IsNil) + require.NoError(t, err) err = closedEngine.Import(ctx, 1) - c.Assert(err, IsNil) + require.NoError(t, err) err = closedEngine.Cleanup(ctx) - c.Assert(err, IsNil) + require.NoError(t, err) } -func (s *backendSuite) TestUnsafeCloseEngine(c *C) { - s.setUpTest(c) +func TestUnsafeCloseEngine(t *testing.T) { + s := createBackendSuite(t) defer s.tearDownTest() ctx := context.Background() @@ -92,13 +86,13 @@ func (s *backendSuite) TestUnsafeCloseEngine(c *C) { After(closeCall) closedEngine, err := s.backend.UnsafeCloseEngine(ctx, nil, "`db`.`table`", -1) - c.Assert(err, IsNil) + require.NoError(t, err) err = closedEngine.Cleanup(ctx) - c.Assert(err, IsNil) + require.NoError(t, err) } -func (s *backendSuite) TestUnsafeCloseEngineWithUUID(c *C) { - s.setUpTest(c) +func TestUnsafeCloseEngineWithUUID(t *testing.T) { + s := createBackendSuite(t) defer s.tearDownTest() ctx := context.Background() @@ -113,13 +107,13 @@ func (s *backendSuite) TestUnsafeCloseEngineWithUUID(c *C) { After(closeCall) closedEngine, err := s.backend.UnsafeCloseEngineWithUUID(ctx, nil, "some_tag", engineUUID) - c.Assert(err, IsNil) + require.NoError(t, err) err = closedEngine.Cleanup(ctx) - c.Assert(err, IsNil) + require.NoError(t, err) } -func (s *backendSuite) TestWriteEngine(c *C) { - s.setUpTest(c) +func TestWriteEngine(t *testing.T) { + s := createBackendSuite(t) defer s.tearDownTest() ctx := context.Background() @@ -145,19 +139,19 @@ func (s *backendSuite) TestWriteEngine(c *C) { Return(nil) engine, err := s.backend.OpenEngine(ctx, &backend.EngineConfig{}, "`db`.`table`", 1) - c.Assert(err, IsNil) + require.NoError(t, err) writer, err := engine.LocalWriter(ctx, &backend.LocalWriterConfig{}) - c.Assert(err, IsNil) + require.NoError(t, err) err = writer.WriteRows(ctx, []string{"c1", "c2"}, rows1) - c.Assert(err, IsNil) + require.NoError(t, err) err = writer.WriteRows(ctx, []string{"c1", "c2"}, rows2) - c.Assert(err, IsNil) + require.NoError(t, err) _, err = writer.Close(ctx) - c.Assert(err, IsNil) + require.NoError(t, err) } -func (s *backendSuite) TestWriteToEngineWithNothing(c *C) { - s.setUpTest(c) +func TestWriteToEngineWithNothing(t *testing.T) { + s := createBackendSuite(t) defer s.tearDownTest() ctx := context.Background() @@ -170,17 +164,17 @@ func (s *backendSuite) TestWriteToEngineWithNothing(c *C) { s.mockBackend.EXPECT().LocalWriter(ctx, &backend.LocalWriterConfig{}, gomock.Any()).Return(mockWriter, nil) engine, err := s.backend.OpenEngine(ctx, &backend.EngineConfig{}, "`db`.`table`", 1) - c.Assert(err, IsNil) + require.NoError(t, err) writer, err := engine.LocalWriter(ctx, &backend.LocalWriterConfig{}) - c.Assert(err, IsNil) + require.NoError(t, err) err = writer.WriteRows(ctx, nil, emptyRows) - c.Assert(err, IsNil) + require.NoError(t, err) _, err = writer.Close(ctx) - c.Assert(err, IsNil) + require.NoError(t, err) } -func (s *backendSuite) TestOpenEngineFailed(c *C) { - s.setUpTest(c) +func TestOpenEngineFailed(t *testing.T) { + s := createBackendSuite(t) defer s.tearDownTest() ctx := context.Background() @@ -189,11 +183,11 @@ func (s *backendSuite) TestOpenEngineFailed(c *C) { Return(errors.New("fake unrecoverable open error")) _, err := s.backend.OpenEngine(ctx, &backend.EngineConfig{}, "`db`.`table`", 1) - c.Assert(err, ErrorMatches, "fake unrecoverable open error") + require.EqualError(t, err, "fake unrecoverable open error") } -func (s *backendSuite) TestWriteEngineFailed(c *C) { - s.setUpTest(c) +func TestWriteEngineFailed(t *testing.T) { + s := createBackendSuite(t) defer s.tearDownTest() ctx := context.Background() @@ -209,17 +203,18 @@ func (s *backendSuite) TestWriteEngineFailed(c *C) { mockWriter.EXPECT().Close(ctx).Return(nil, nil) engine, err := s.backend.OpenEngine(ctx, &backend.EngineConfig{}, "`db`.`table`", 1) - c.Assert(err, IsNil) + require.NoError(t, err) writer, err := engine.LocalWriter(ctx, &backend.LocalWriterConfig{}) - c.Assert(err, IsNil) + require.NoError(t, err) err = writer.WriteRows(ctx, nil, rows) - c.Assert(err, ErrorMatches, "fake unrecoverable write error.*") + require.Error(t, err) + require.Regexp(t, "^fake unrecoverable write error", err.Error()) _, err = writer.Close(ctx) - c.Assert(err, IsNil) + require.NoError(t, err) } -func (s *backendSuite) TestWriteBatchSendFailedWithRetry(c *C) { - s.setUpTest(c) +func TestWriteBatchSendFailedWithRetry(t *testing.T) { + s := createBackendSuite(t) defer s.tearDownTest() ctx := context.Background() @@ -235,17 +230,18 @@ func (s *backendSuite) TestWriteBatchSendFailedWithRetry(c *C) { mockWriter.EXPECT().Close(ctx).Return(nil, nil).MinTimes(1) engine, err := s.backend.OpenEngine(ctx, &backend.EngineConfig{}, "`db`.`table`", 1) - c.Assert(err, IsNil) + require.NoError(t, err) writer, err := engine.LocalWriter(ctx, &backend.LocalWriterConfig{}) - c.Assert(err, IsNil) + require.NoError(t, err) err = writer.WriteRows(ctx, nil, rows) - c.Assert(err, ErrorMatches, ".*fake recoverable write batch error") + require.Error(t, err) + require.Regexp(t, "fake recoverable write batch error$", err.Error()) _, err = writer.Close(ctx) - c.Assert(err, IsNil) + require.NoError(t, err) } -func (s *backendSuite) TestImportFailedNoRetry(c *C) { - s.setUpTest(c) +func TestImportFailedNoRetry(t *testing.T) { + s := createBackendSuite(t) defer s.tearDownTest() ctx := context.Background() @@ -256,13 +252,14 @@ func (s *backendSuite) TestImportFailedNoRetry(c *C) { Return(errors.Annotate(context.Canceled, "fake unrecoverable import error")) closedEngine, err := s.backend.UnsafeCloseEngine(ctx, nil, "`db`.`table`", 1) - c.Assert(err, IsNil) + require.NoError(t, err) err = closedEngine.Import(ctx, 1) - c.Assert(err, ErrorMatches, "fake unrecoverable import error.*") + require.Error(t, err) + require.Regexp(t, "^fake unrecoverable import error", err.Error()) } -func (s *backendSuite) TestImportFailedWithRetry(c *C) { - s.setUpTest(c) +func TestImportFailedWithRetry(t *testing.T) { + s := createBackendSuite(t) defer s.tearDownTest() ctx := context.Background() @@ -275,13 +272,14 @@ func (s *backendSuite) TestImportFailedWithRetry(c *C) { s.mockBackend.EXPECT().RetryImportDelay().Return(time.Duration(0)).AnyTimes() closedEngine, err := s.backend.UnsafeCloseEngine(ctx, nil, "`db`.`table`", 1) - c.Assert(err, IsNil) + require.NoError(t, err) err = closedEngine.Import(ctx, 1) - c.Assert(err, ErrorMatches, ".*fake recoverable import error") + require.Error(t, err) + require.Regexp(t, "fake recoverable import error$", err.Error()) } -func (s *backendSuite) TestImportFailedRecovered(c *C) { - s.setUpTest(c) +func TestImportFailedRecovered(t *testing.T) { + s := createBackendSuite(t) defer s.tearDownTest() ctx := context.Background() @@ -296,14 +294,14 @@ func (s *backendSuite) TestImportFailedRecovered(c *C) { s.mockBackend.EXPECT().RetryImportDelay().Return(time.Duration(0)).AnyTimes() closedEngine, err := s.backend.UnsafeCloseEngine(ctx, nil, "`db`.`table`", 1) - c.Assert(err, IsNil) + require.NoError(t, err) err = closedEngine.Import(ctx, 1) - c.Assert(err, IsNil) + require.NoError(t, err) } //nolint:interfacer // change test case signature causes check panicking. -func (s *backendSuite) TestClose(c *C) { - s.setUpTest(c) +func TestClose(t *testing.T) { + s := createBackendSuite(t) defer s.tearDownTest() s.mockBackend.EXPECT().Close().Return() @@ -311,18 +309,17 @@ func (s *backendSuite) TestClose(c *C) { s.backend.Close() } -func (s *backendSuite) TestMakeEmptyRows(c *C) { - s.setUpTest(c) +func TestMakeEmptyRows(t *testing.T) { + s := createBackendSuite(t) defer s.tearDownTest() rows := mock.NewMockRows(s.controller) s.mockBackend.EXPECT().MakeEmptyRows().Return(rows) - - c.Assert(s.mockBackend.MakeEmptyRows(), Equals, rows) + require.Equal(t, rows, s.mockBackend.MakeEmptyRows()) } -func (s *backendSuite) TestNewEncoder(c *C) { - s.setUpTest(c) +func TestNewEncoder(t *testing.T) { + s := createBackendSuite(t) defer s.tearDownTest() encoder := mock.NewMockEncoder(s.controller) @@ -330,12 +327,12 @@ func (s *backendSuite) TestNewEncoder(c *C) { s.mockBackend.EXPECT().NewEncoder(nil, options).Return(encoder, nil) realEncoder, err := s.mockBackend.NewEncoder(nil, options) - c.Assert(realEncoder, Equals, encoder) - c.Assert(err, IsNil) + require.Equal(t, realEncoder, encoder) + require.NoError(t, err) } -func (s *backendSuite) TestCheckDiskQuota(c *C) { - s.setUpTest(c) +func TestCheckDiskQuota(t *testing.T) { + s := createBackendSuite(t) defer s.tearDownTest() uuid1 := uuid.MustParse("11111111-1111-1111-1111-111111111111") @@ -381,29 +378,29 @@ func (s *backendSuite) TestCheckDiskQuota(c *C) { // No quota exceeded le, iple, ds, ms := s.backend.CheckDiskQuota(30000) - c.Assert(le, HasLen, 0) - c.Assert(iple, Equals, 0) - c.Assert(ds, Equals, int64(9000)) - c.Assert(ms, Equals, int64(16000)) + require.Len(t, le, 0) + require.Equal(t, 0, iple) + require.Equal(t, int64(9000), ds) + require.Equal(t, int64(16000), ms) // Quota exceeded, the largest one is out le, iple, ds, ms = s.backend.CheckDiskQuota(20000) - c.Assert(le, DeepEquals, []uuid.UUID{uuid9}) - c.Assert(iple, Equals, 0) - c.Assert(ds, Equals, int64(9000)) - c.Assert(ms, Equals, int64(16000)) + require.Equal(t, []uuid.UUID{uuid9}, le) + require.Equal(t, 0, iple) + require.Equal(t, int64(9000), ds) + require.Equal(t, int64(16000), ms) // Quota exceeded, the importing one should be ranked least priority le, iple, ds, ms = s.backend.CheckDiskQuota(12000) - c.Assert(le, DeepEquals, []uuid.UUID{uuid5, uuid9}) - c.Assert(iple, Equals, 0) - c.Assert(ds, Equals, int64(9000)) - c.Assert(ms, Equals, int64(16000)) + require.Equal(t, []uuid.UUID{uuid5, uuid9}, le) + require.Equal(t, 0, iple) + require.Equal(t, int64(9000), ds) + require.Equal(t, int64(16000), ms) // Quota exceeded, the importing ones should not be visible le, iple, ds, ms = s.backend.CheckDiskQuota(5000) - c.Assert(le, DeepEquals, []uuid.UUID{uuid1, uuid5, uuid9}) - c.Assert(iple, Equals, 1) - c.Assert(ds, Equals, int64(9000)) - c.Assert(ms, Equals, int64(16000)) + require.Equal(t, []uuid.UUID{uuid1, uuid5, uuid9}, le) + require.Equal(t, 1, iple) + require.Equal(t, int64(9000), ds) + require.Equal(t, int64(16000), ms) } diff --git a/br/pkg/lightning/backend/importer/importer.go b/br/pkg/lightning/backend/importer/importer.go index 2df6c99231dda..4b2c3dd5b9128 100644 --- a/br/pkg/lightning/backend/importer/importer.go +++ b/br/pkg/lightning/backend/importer/importer.go @@ -27,6 +27,7 @@ import ( "github.com/pingcap/tidb/br/pkg/lightning/backend" "github.com/pingcap/tidb/br/pkg/lightning/backend/kv" "github.com/pingcap/tidb/br/pkg/lightning/common" + "github.com/pingcap/tidb/br/pkg/lightning/config" "github.com/pingcap/tidb/br/pkg/lightning/log" "github.com/pingcap/tidb/br/pkg/lightning/tikv" "github.com/pingcap/tidb/br/pkg/utils" @@ -226,14 +227,18 @@ func (importer *importer) CleanupEngine(ctx context.Context, engineUUID uuid.UUI return errors.Trace(err) } -func (importer *importer) CollectLocalDuplicateRows(ctx context.Context, tbl table.Table) (bool, error) { +func (importer *importer) CollectLocalDuplicateRows(ctx context.Context, tbl table.Table, tableName string, opts *kv.SessionOptions) (bool, error) { panic("Unsupported Operation") } -func (importer *importer) CollectRemoteDuplicateRows(ctx context.Context, tbl table.Table) (bool, error) { +func (importer *importer) CollectRemoteDuplicateRows(ctx context.Context, tbl table.Table, tableName string, opts *kv.SessionOptions) (bool, error) { panic("Unsupported Operation") } +func (importer *importer) ResolveDuplicateRows(ctx context.Context, tbl table.Table, tableName string, algorithm config.DuplicateResolutionAlgorithm) error { + return nil +} + func (importer *importer) WriteRows( ctx context.Context, engineUUID uuid.UUID, diff --git a/br/pkg/lightning/backend/importer/importer_test.go b/br/pkg/lightning/backend/importer/importer_test.go index 5d75d1badc245..dd65db3ee4d5a 100644 --- a/br/pkg/lightning/backend/importer/importer_test.go +++ b/br/pkg/lightning/backend/importer/importer_test.go @@ -24,13 +24,13 @@ import ( "github.com/golang/mock/gomock" "github.com/google/uuid" - . "github.com/pingcap/check" "github.com/pingcap/errors" kvpb "github.com/pingcap/kvproto/pkg/import_kvpb" "github.com/pingcap/tidb/br/pkg/lightning/backend" "github.com/pingcap/tidb/br/pkg/lightning/backend/kv" "github.com/pingcap/tidb/br/pkg/lightning/common" "github.com/pingcap/tidb/br/pkg/mock" + "github.com/stretchr/testify/require" ) type importerSuite struct { @@ -43,20 +43,14 @@ type importerSuite struct { kvPairs kv.Rows } -var _ = Suite(&importerSuite{}) - const testPDAddr = "pd-addr:2379" -// FIXME: Cannot use the real SetUpTest/TearDownTest to set up the mock -// otherwise the mock error will be ignored. - -func (s *importerSuite) setUpTest(c *C) { - s.controller = gomock.NewController(c) - s.mockClient = mock.NewMockImportKVClient(s.controller) - s.mockWriter = mock.NewMockImportKV_WriteEngineClient(s.controller) - importer := NewMockImporter(s.mockClient, testPDAddr) - - s.ctx = context.Background() +func createImportSuite(t *testing.T) *importerSuite { + controller := gomock.NewController(t) + mockClient := mock.NewMockImportKVClient(controller) + mockWriter := mock.NewMockImportKV_WriteEngineClient(controller) + importer := NewMockImporter(mockClient, testPDAddr) + s := &importerSuite{controller: controller, mockClient: mockClient, mockWriter: mockWriter, ctx: context.Background()} engineUUID := uuid.MustParse("7e3f3a3c-67ce-506d-af34-417ec138fbcb") s.engineUUID = engineUUID[:] s.kvPairs = kv.MakeRowsFromKvPairs([]common.KvPair{ @@ -76,15 +70,16 @@ func (s *importerSuite) setUpTest(c *C) { var err error s.engine, err = importer.OpenEngine(s.ctx, &backend.EngineConfig{}, "`db`.`table`", -1) - c.Assert(err, IsNil) + require.NoError(t, err) + return s } func (s *importerSuite) tearDownTest() { s.controller.Finish() } -func (s *importerSuite) TestWriteRows(c *C) { - s.setUpTest(c) +func TestWriteRows(t *testing.T) { + s := createImportSuite(t) defer s.tearDownTest() s.mockClient.EXPECT().WriteEngine(s.ctx).Return(s.mockWriter, nil) @@ -99,10 +94,10 @@ func (s *importerSuite) TestWriteRows(c *C) { batchSendCall := s.mockWriter.EXPECT(). Send(gomock.Any()). DoAndReturn(func(x *kvpb.WriteEngineRequest) error { - c.Assert(x.GetBatch().GetMutations(), DeepEquals, []*kvpb.Mutation{ + require.Equal(t, []*kvpb.Mutation{ {Op: kvpb.Mutation_Put, Key: []byte("k1"), Value: []byte("v1")}, {Op: kvpb.Mutation_Put, Key: []byte("k2"), Value: []byte("v2")}, - }) + }, x.GetBatch().GetMutations()) return nil }). After(headSendCall) @@ -112,16 +107,16 @@ func (s *importerSuite) TestWriteRows(c *C) { After(batchSendCall) writer, err := s.engine.LocalWriter(s.ctx, nil) - c.Assert(err, IsNil) + require.NoError(t, err) err = writer.WriteRows(s.ctx, nil, s.kvPairs) - c.Assert(err, IsNil) + require.NoError(t, err) st, err := writer.Close(s.ctx) - c.Assert(err, IsNil) - c.Assert(st, IsNil) + require.NoError(t, err) + require.Nil(t, st) } -func (s *importerSuite) TestWriteHeadSendFailed(c *C) { - s.setUpTest(c) +func TestWriteHeadSendFailed(t *testing.T) { + s := createImportSuite(t) defer s.tearDownTest() s.mockClient.EXPECT().WriteEngine(s.ctx).Return(s.mockWriter, nil) @@ -129,7 +124,7 @@ func (s *importerSuite) TestWriteHeadSendFailed(c *C) { headSendCall := s.mockWriter.EXPECT(). Send(gomock.Any()). DoAndReturn(func(x *kvpb.WriteEngineRequest) error { - c.Assert(x.GetHead(), NotNil) + require.NotNil(t, x.GetHead()) return errors.Annotate(context.Canceled, "fake unrecoverable write head error") }) s.mockWriter.EXPECT(). @@ -138,13 +133,14 @@ func (s *importerSuite) TestWriteHeadSendFailed(c *C) { After(headSendCall) writer, err := s.engine.LocalWriter(s.ctx, nil) - c.Assert(err, IsNil) + require.NoError(t, err) err = writer.WriteRows(s.ctx, nil, s.kvPairs) - c.Assert(err, ErrorMatches, "fake unrecoverable write head error.*") + require.Error(t, err) + require.Regexp(t, "^fake unrecoverable write head error", err.Error()) } -func (s *importerSuite) TestWriteBatchSendFailed(c *C) { - s.setUpTest(c) +func TestWriteBatchSendFailed(t *testing.T) { + s := createImportSuite(t) defer s.tearDownTest() s.mockClient.EXPECT().WriteEngine(s.ctx).Return(s.mockWriter, nil) @@ -152,13 +148,13 @@ func (s *importerSuite) TestWriteBatchSendFailed(c *C) { headSendCall := s.mockWriter.EXPECT(). Send(gomock.Any()). DoAndReturn(func(x *kvpb.WriteEngineRequest) error { - c.Assert(x.GetHead(), NotNil) + require.NotNil(t, x.GetHead()) return nil }) batchSendCall := s.mockWriter.EXPECT(). Send(gomock.Any()). DoAndReturn(func(x *kvpb.WriteEngineRequest) error { - c.Assert(x.GetBatch(), NotNil) + require.NotNil(t, x.GetBatch()) return errors.Annotate(context.Canceled, "fake unrecoverable write batch error") }). After(headSendCall) @@ -168,13 +164,14 @@ func (s *importerSuite) TestWriteBatchSendFailed(c *C) { After(batchSendCall) writer, err := s.engine.LocalWriter(s.ctx, nil) - c.Assert(err, IsNil) + require.NoError(t, err) err = writer.WriteRows(s.ctx, nil, s.kvPairs) - c.Assert(err, ErrorMatches, "fake unrecoverable write batch error.*") + require.Error(t, err) + require.Regexp(t, "^fake unrecoverable write batch error", err.Error()) } -func (s *importerSuite) TestWriteCloseFailed(c *C) { - s.setUpTest(c) +func TestWriteCloseFailed(t *testing.T) { + s := createImportSuite(t) defer s.tearDownTest() s.mockClient.EXPECT().WriteEngine(s.ctx).Return(s.mockWriter, nil) @@ -182,13 +179,13 @@ func (s *importerSuite) TestWriteCloseFailed(c *C) { headSendCall := s.mockWriter.EXPECT(). Send(gomock.Any()). DoAndReturn(func(x *kvpb.WriteEngineRequest) error { - c.Assert(x.GetHead(), NotNil) + require.NotNil(t, x.GetHead()) return nil }) batchSendCall := s.mockWriter.EXPECT(). Send(gomock.Any()). DoAndReturn(func(x *kvpb.WriteEngineRequest) error { - c.Assert(x.GetBatch(), NotNil) + require.NotNil(t, x.GetBatch()) return nil }). After(headSendCall) @@ -198,13 +195,14 @@ func (s *importerSuite) TestWriteCloseFailed(c *C) { After(batchSendCall) writer, err := s.engine.LocalWriter(s.ctx, nil) - c.Assert(err, IsNil) + require.NoError(t, err) err = writer.WriteRows(s.ctx, nil, s.kvPairs) - c.Assert(err, ErrorMatches, "fake unrecoverable close stream error.*") + require.Error(t, err) + require.Regexp(t, "^fake unrecoverable close stream error", err.Error()) } -func (s *importerSuite) TestCloseImportCleanupEngine(c *C) { - s.setUpTest(c) +func TestCloseImportCleanupEngine(t *testing.T) { + s := createImportSuite(t) defer s.tearDownTest() s.mockClient.EXPECT(). @@ -218,11 +216,11 @@ func (s *importerSuite) TestCloseImportCleanupEngine(c *C) { Return(nil, nil) engine, err := s.engine.Close(s.ctx, nil) - c.Assert(err, IsNil) + require.NoError(t, err) err = engine.Import(s.ctx, 1) - c.Assert(err, IsNil) + require.NoError(t, err) err = engine.Cleanup(s.ctx) - c.Assert(err, IsNil) + require.NoError(t, err) } func BenchmarkMutationAlloc(b *testing.B) { @@ -261,33 +259,41 @@ func BenchmarkMutationPool(b *testing.B) { _ = g } -func (s *importerSuite) TestCheckTiDBVersion(c *C) { +func TestCheckTiDBVersion(t *testing.T) { var version string ctx := context.Background() mockServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - c.Assert(req.URL.Path, Equals, "/status") + require.Equal(t, "/status", req.URL.Path) w.WriteHeader(http.StatusOK) err := json.NewEncoder(w).Encode(map[string]interface{}{ "version": version, }) - c.Assert(err, IsNil) + require.NoError(t, err) })) tls := common.NewTLSFromMockServer(mockServer) version = "5.7.25-TiDB-v4.0.0" - c.Assert(checkTiDBVersionByTLS(ctx, tls, requiredMinTiDBVersion, requiredMaxTiDBVersion), IsNil) + require.Nil(t, checkTiDBVersionByTLS(ctx, tls, requiredMinTiDBVersion, requiredMaxTiDBVersion)) version = "5.7.25-TiDB-v9999.0.0" - c.Assert(checkTiDBVersionByTLS(ctx, tls, requiredMinTiDBVersion, requiredMaxTiDBVersion), ErrorMatches, "TiDB version too new.*") + err := checkTiDBVersionByTLS(ctx, tls, requiredMinTiDBVersion, requiredMaxTiDBVersion) + require.Error(t, err) + require.Regexp(t, "^TiDB version too new", err.Error()) version = "5.7.25-TiDB-v6.0.0" - c.Assert(checkTiDBVersionByTLS(ctx, tls, requiredMinTiDBVersion, requiredMaxTiDBVersion), ErrorMatches, "TiDB version too new.*") + err = checkTiDBVersionByTLS(ctx, tls, requiredMinTiDBVersion, requiredMaxTiDBVersion) + require.Error(t, err) + require.Regexp(t, "^TiDB version too new", err.Error()) version = "5.7.25-TiDB-v6.0.0-beta" - c.Assert(checkTiDBVersionByTLS(ctx, tls, requiredMinTiDBVersion, requiredMaxTiDBVersion), ErrorMatches, "TiDB version too new.*") + err = checkTiDBVersionByTLS(ctx, tls, requiredMinTiDBVersion, requiredMaxTiDBVersion) + require.Error(t, err) + require.Regexp(t, "^TiDB version too new", err.Error()) version = "5.7.25-TiDB-v1.0.0" - c.Assert(checkTiDBVersionByTLS(ctx, tls, requiredMinTiDBVersion, requiredMaxTiDBVersion), ErrorMatches, "TiDB version too old.*") + err = checkTiDBVersionByTLS(ctx, tls, requiredMinTiDBVersion, requiredMaxTiDBVersion) + require.Error(t, err) + require.Regexp(t, "^TiDB version too old", err.Error()) } diff --git a/br/pkg/lightning/backend/kv/kv2sql.go b/br/pkg/lightning/backend/kv/kv2sql.go index 19dc12766b7f0..a3c188a81eea7 100644 --- a/br/pkg/lightning/backend/kv/kv2sql.go +++ b/br/pkg/lightning/backend/kv/kv2sql.go @@ -29,18 +29,22 @@ import ( type TableKVDecoder struct { tbl table.Table se *session + // tableName is the unique table name in the form "`db`.`tbl`". + tableName string + genCols []genCol } func (t *TableKVDecoder) Name() string { - return t.tbl.Meta().Name.O + return t.tableName } func (t *TableKVDecoder) DecodeHandleFromTable(key []byte) (kv.Handle, error) { return tablecodec.DecodeRowKey(key) } -func (t *TableKVDecoder) EncodeHandleKey(h kv.Handle) kv.Key { - return tablecodec.EncodeRowKeyWithHandle(t.tbl.Meta().ID, h) +func (t *TableKVDecoder) EncodeHandleKey(tableID int64, h kv.Handle) kv.Key { + // do not ever ever use tbl.Meta().ID, we need to deal with partitioned tables! + return tablecodec.EncodeRowKeyWithHandle(tableID, h) } func (t *TableKVDecoder) DecodeHandleFromIndex(indexInfo *model.IndexInfo, key []byte, value []byte) (kv.Handle, error) { @@ -64,7 +68,49 @@ func (t *TableKVDecoder) DecodeRawRowDataAsStr(h kv.Handle, value []byte) (res s return fmt.Sprintf("/* ERROR: %s */", err) } -func NewTableKVDecoder(tbl table.Table, options *SessionOptions) (*TableKVDecoder, error) { +// IterRawIndexKeys generates the raw index keys corresponding to the raw row, +// and then iterate them using `fn`. The input buffer will be reused. +func (t *TableKVDecoder) IterRawIndexKeys(h kv.Handle, rawRow []byte, fn func([]byte) error) error { + row, _, err := t.DecodeRawRowData(h, rawRow) + if err != nil { + return err + } + if len(t.genCols) > 0 { + for i, col := range t.tbl.Cols() { + if col.IsGenerated() { + row[i] = types.GetMinValue(&col.FieldType) + } + } + if err, _ := evaluateGeneratedColumns(t.se, row, t.tbl.Cols(), t.genCols); err != nil { + return err + } + } + + indices := t.tbl.Indices() + + var buffer []types.Datum + var indexBuffer []byte + for _, index := range indices { + indexValues, err := index.FetchValues(row, buffer) + if err != nil { + return err + } + indexKey, _, err := index.GenIndexKey(t.se.vars.StmtCtx, indexValues, h, indexBuffer) + if err != nil { + return err + } + if err := fn(indexKey); err != nil { + return err + } + if len(indexKey) > len(indexBuffer) { + indexBuffer = indexKey + } + } + + return nil +} + +func NewTableKVDecoder(tbl table.Table, tableName string, options *SessionOptions) (*TableKVDecoder, error) { metric.KvEncoderCounter.WithLabelValues("open").Inc() se := newSession(options) cols := tbl.Cols() @@ -72,8 +118,15 @@ func NewTableKVDecoder(tbl table.Table, options *SessionOptions) (*TableKVDecode recordCtx := tables.NewCommonAddRecordCtx(len(cols)) tables.SetAddRecordCtx(se, recordCtx) + genCols, err := collectGeneratedColumns(se, tbl.Meta(), cols) + if err != nil { + return nil, err + } + return &TableKVDecoder{ - tbl: tbl, - se: se, + tbl: tbl, + se: se, + tableName: tableName, + genCols: genCols, }, nil } diff --git a/br/pkg/lightning/backend/kv/sql2kv.go b/br/pkg/lightning/backend/kv/sql2kv.go index b64c7435c5a1b..45fd0ab664f50 100644 --- a/br/pkg/lightning/backend/kv/sql2kv.go +++ b/br/pkg/lightning/backend/kv/sql2kv.go @@ -312,6 +312,24 @@ func KvPairsFromRows(rows Rows) []common.KvPair { return rows.(*KvPairs).pairs } +func evaluateGeneratedColumns(se *session, record []types.Datum, cols []*table.Column, genCols []genCol) (err error, errCol *model.ColumnInfo) { + mutRow := chunk.MutRowFromDatums(record) + for _, gc := range genCols { + col := cols[gc.index].ToInfo() + evaluated, err := gc.expr.Eval(mutRow.ToRow()) + if err != nil { + return err, col + } + value, err := table.CastValue(se, evaluated, col, false, false) + if err != nil { + return err, col + } + mutRow.SetDatum(gc.index, value) + record[gc.index] = value + } + return nil, nil +} + // Encode a row of data into KV pairs. // // See comments in `(*TableRestore).initializeColumns` for the meaning of the @@ -410,19 +428,8 @@ func (kvcodec *tableKVEncoder) Encode( } if len(kvcodec.genCols) > 0 { - mutRow := chunk.MutRowFromDatums(record) - for _, gc := range kvcodec.genCols { - col := cols[gc.index].ToInfo() - evaluated, err := gc.expr.Eval(mutRow.ToRow()) - if err != nil { - return nil, logEvalGenExprFailed(logger, row, col, err) - } - value, err := table.CastValue(kvcodec.se, evaluated, col, false, false) - if err != nil { - return nil, logEvalGenExprFailed(logger, row, col, err) - } - mutRow.SetDatum(gc.index, value) - record[gc.index] = value + if err, errCol := evaluateGeneratedColumns(kvcodec.se, record, cols, kvcodec.genCols); err != nil { + return nil, logEvalGenExprFailed(logger, row, errCol, err) } } diff --git a/br/pkg/lightning/backend/kv/sql2kv_test.go b/br/pkg/lightning/backend/kv/sql2kv_test.go index 0ec4f0ea23a3e..cc835a964714d 100644 --- a/br/pkg/lightning/backend/kv/sql2kv_test.go +++ b/br/pkg/lightning/backend/kv/sql2kv_test.go @@ -150,11 +150,12 @@ func (s *kvSuite) TestDecode(c *C) { tblInfo := &model.TableInfo{ID: 1, Columns: cols, PKIsHandle: false, State: model.StatePublic} tbl, err := tables.TableFromMeta(NewPanickingAllocators(0), tblInfo) c.Assert(err, IsNil) - decoder, err := NewTableKVDecoder(tbl, &SessionOptions{ + decoder, err := NewTableKVDecoder(tbl, "`test`.`c1`", &SessionOptions{ SQLMode: mysql.ModeStrictAllTables, Timestamp: 1234567890, }) c.Assert(decoder, NotNil) + c.Assert(decoder.Name(), Equals, "`test`.`c1`") p := common.KvPair{ Key: []byte{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1}, Val: []byte{0x8, 0x2, 0x8, 0x2}, @@ -211,7 +212,7 @@ func (s *kvSuite) TestDecodeIndex(c *C) { data := pairs.(*KvPairs) c.Assert(len(data.pairs), DeepEquals, 2) - decoder, err := NewTableKVDecoder(tbl, &SessionOptions{ + decoder, err := NewTableKVDecoder(tbl, "`test`.``", &SessionOptions{ SQLMode: mysql.ModeStrictAllTables, Timestamp: 1234567890, }) diff --git a/br/pkg/lightning/backend/local/duplicate.go b/br/pkg/lightning/backend/local/duplicate.go index 69bde98284d32..fc88055c40c61 100644 --- a/br/pkg/lightning/backend/local/duplicate.go +++ b/br/pkg/lightning/backend/local/duplicate.go @@ -18,6 +18,7 @@ import ( "bytes" "context" "io" + "math" "sort" "time" @@ -26,7 +27,6 @@ import ( "github.com/pingcap/kvproto/pkg/import_sstpb" "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/kvproto/pkg/metapb" - "github.com/pingcap/kvproto/pkg/tikvpb" "github.com/pingcap/tidb/br/pkg/lightning/backend/kv" "github.com/pingcap/tidb/br/pkg/lightning/common" "github.com/pingcap/tidb/br/pkg/lightning/errormanager" @@ -37,10 +37,11 @@ import ( "github.com/pingcap/tidb/distsql" tidbkv "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/model" - "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/table" + "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/util/codec" "github.com/pingcap/tidb/util/ranger" + tikvclient "github.com/tikv/client-go/v2/tikv" "go.uber.org/atomic" "go.uber.org/zap" "go.uber.org/zap/zapcore" @@ -65,12 +66,14 @@ type DuplicateRequest struct { type DuplicateManager struct { errorMgr *errormanager.ErrorManager splitCli restore.SplitClient + tikvCli *tikvclient.KVStore regionConcurrency int connPool common.GRPCConns tls *common.TLS ts uint64 keyAdapter KeyAdapter remoteWorkerPool *utils.WorkerPool + opts *kv.SessionOptions } type pendingIndexHandles struct { @@ -181,30 +184,31 @@ func physicalTableIDs(tableInfo *model.TableInfo) []int64 { // // This object provides methods to collect and decode duplicated KV pairs into row data. The results // are stored into the errorMgr. -func NewDuplicateManager( - errorMgr *errormanager.ErrorManager, - splitCli restore.SplitClient, - ts uint64, - tls *common.TLS, - regionConcurrency int) (*DuplicateManager, error) { +func NewDuplicateManager(local *local, ts uint64, opts *kv.SessionOptions) (*DuplicateManager, error) { return &DuplicateManager{ - errorMgr: errorMgr, - tls: tls, - regionConcurrency: regionConcurrency, - splitCli: splitCli, + errorMgr: local.errorMgr, + tls: local.tls, + regionConcurrency: local.tcpConcurrency, + splitCli: local.splitCli, + tikvCli: local.tikvCli, keyAdapter: duplicateKeyAdapter{}, ts: ts, connPool: common.NewGRPCConns(), // TODO: not sure what is the correct concurrency value. - remoteWorkerPool: utils.NewWorkerPool(uint(regionConcurrency), "duplicates"), + remoteWorkerPool: utils.NewWorkerPool(uint(local.tcpConcurrency), "duplicates"), + opts: opts, }, nil } // CollectDuplicateRowsFromTiKV collects duplicated rows already imported into TiKV. // // Collection result are saved into the ErrorManager. -func (manager *DuplicateManager) CollectDuplicateRowsFromTiKV(ctx context.Context, tbl table.Table) (hasDupe bool, err error) { - logTask := log.L().Begin(zapcore.InfoLevel, "collect duplicate data from remote TiKV") +func (manager *DuplicateManager) CollectDuplicateRowsFromTiKV( + ctx context.Context, + tbl table.Table, + tableName string, +) (hasDupe bool, err error) { + logTask := log.With(zap.String("table", tableName)).Begin(zapcore.InfoLevel, "collect duplicate data from remote TiKV") defer func() { logTask.End(zapcore.InfoLevel, err) }() @@ -215,9 +219,7 @@ func (manager *DuplicateManager) CollectDuplicateRowsFromTiKV(ctx context.Contex } // TODO: reuse the *kv.SessionOptions from NewEncoder for picking the correct time zone. - decoder, err := kv.NewTableKVDecoder(tbl, &kv.SessionOptions{ - SQLMode: mysql.ModeStrictAllTables, - }) + decoder, err := kv.NewTableKVDecoder(tbl, tableName, manager.opts) if err != nil { return false, err } @@ -242,6 +244,12 @@ func (manager *DuplicateManager) sendRequestToTiKV(ctx context.Context, req *DuplicateRequest, hasDupe *atomic.Bool, ) error { + logger := log.With( + zap.String("table", decoder.Name()), + zap.Int64("tableID", req.tableID), + logutil.Key("startKey", req.start), + logutil.Key("endKey", req.end)) + startKey := codec.EncodeBytes([]byte{}, req.start) endKey := codec.EncodeBytes([]byte{}, req.end) @@ -273,6 +281,12 @@ func (manager *DuplicateManager) sendRequestToTiKV(ctx context.Context, end = req.end } + logger.Debug("[detect-dupe] get duplicate stream", + zap.Int("localStreamID", idx), + logutil.Region(region.Region), + logutil.Leader(region.Leader), + logutil.Key("regionStartKey", start), + logutil.Key("regionEndKey", end)) cli, err := manager.getDuplicateStream(ctx, region, start, end) if err != nil { r, err := manager.splitCli.GetRegionByID(ctx, region.Region.GetId()) @@ -298,11 +312,16 @@ func (manager *DuplicateManager) sendRequestToTiKV(ctx context.Context, for idx, cli := range waitingClients { region := watingRegions[idx] + cliLogger := logger.With( + zap.Int("localStreamID", idx), + logutil.Region(region.Region), + logutil.Leader(region.Leader)) for { resp, reqErr := cli.Recv() hasErr := false if reqErr != nil { if errors.Cause(reqErr) == io.EOF { + cliLogger.Debug("[detect-dupe] exhausted duplication stream") break } hasErr = true @@ -317,20 +336,18 @@ func (manager *DuplicateManager) sendRequestToTiKV(ctx context.Context, } } if hasErr { - log.L().Warn("meet error when recving duplicate detect response from TiKV, retry again", - logutil.Region(region.Region), logutil.Leader(region.Leader), zap.Error(reqErr)) + cliLogger.Warn("[detect-dupe] meet error when recving duplicate detect response from TiKV, retry again", + zap.Error(reqErr)) break } if resp.GetKeyError() != nil { - log.L().Warn("meet key error in duplicate detect response from TiKV, retry again ", - logutil.Region(region.Region), logutil.Leader(region.Leader), + cliLogger.Warn("[detect-dupe] meet key error in duplicate detect response from TiKV, retry again ", zap.String("KeyError", resp.GetKeyError().GetMessage())) break } if resp.GetRegionError() != nil { - log.L().Warn("meet key error in duplicate detect response from TiKV, retry again ", - logutil.Region(region.Region), logutil.Leader(region.Leader), + cliLogger.Warn("[detect-dupe] meet key error in duplicate detect response from TiKV, retry again ", zap.String("RegionError", resp.GetRegionError().GetMessage())) r, err := restore.PaginateScanRegion(ctx, manager.splitCli, watingRegions[idx].Region.GetStartKey(), watingRegions[idx].Region.GetEndKey(), scanRegionLimit) @@ -375,8 +392,18 @@ func (manager *DuplicateManager) storeDuplicateData( var err error var dataConflictInfos []errormanager.DataConflictInfo indexHandles := makePendingIndexHandlesWithCapacity(len(resp.Pairs)) + + loggerIndexName := "PRIMARY" + if req.indexInfo != nil { + loggerIndexName = req.indexInfo.Name.O + } + superLogger := log.With( + zap.String("table", decoder.Name()), + zap.Int64("tableID", req.tableID), + zap.String("index", loggerIndexName)) + for _, kv := range resp.Pairs { - logger := log.With( + logger := superLogger.With( logutil.Key("key", kv.Key), logutil.Key("value", kv.Value), zap.Uint64("commit-ts", kv.CommitTs)) @@ -390,6 +417,8 @@ func (manager *DuplicateManager) storeDuplicateData( logger.Error("decode handle error", log.ShortError(err)) continue } + logger.Debug("[detect-dupe] remote dupe response", + logutil.Redact(zap.Stringer("handle", h))) conflictInfo := errormanager.DataConflictInfo{ RawKey: kv.Key, @@ -401,7 +430,7 @@ func (manager *DuplicateManager) storeDuplicateData( indexHandles.append( conflictInfo, req.indexInfo.Name.O, - h, decoder.EncodeHandleKey(h)) + h, decoder.EncodeHandleKey(req.tableID, h)) } else { conflictInfo.Row = decoder.DecodeRawRowDataAsStr(h, kv.Value) dataConflictInfos = append(dataConflictInfos, conflictInfo) @@ -423,16 +452,17 @@ func (manager *DuplicateManager) storeDuplicateData( func (manager *DuplicateManager) CollectDuplicateRowsFromLocalIndex( ctx context.Context, tbl table.Table, + tableName string, db *pebble.DB, ) (bool, error) { // TODO: reuse the *kv.SessionOptions from NewEncoder for picking the correct time zone. - decoder, err := kv.NewTableKVDecoder(tbl, &kv.SessionOptions{ - SQLMode: mysql.ModeStrictAllTables, - }) + decoder, err := kv.NewTableKVDecoder(tbl, tableName, manager.opts) if err != nil { return false, errors.Trace(err) } + logger := log.With(zap.String("table", tableName)) + allRanges := make([]tidbkv.KeyRange, 0) tableIDs := physicalTableIDs(tbl.Meta()) // Collect row handle duplicates. @@ -449,6 +479,9 @@ func (manager *DuplicateManager) CollectDuplicateRowsFromLocalIndex( } allRanges = append(allRanges, keyRanges...) for _, r := range keyRanges { + logger.Debug("[detect-dupe] collect local range", + logutil.Key("startKey", r.StartKey), + logutil.Key("endKey", r.EndKey)) startKey := codec.EncodeBytes([]byte{}, r.StartKey) endKey := codec.EncodeBytes([]byte{}, r.EndKey) opts := &pebble.IterOptions{ @@ -461,6 +494,7 @@ func (manager *DuplicateManager) CollectDuplicateRowsFromLocalIndex( defer iter.Close() for iter.First(); iter.Valid(); iter.Next() { + hasDataConflict = true rawKey, _, _, err := manager.keyAdapter.Decode(nil, iter.Key()) if err != nil { return err @@ -472,6 +506,11 @@ func (manager *DuplicateManager) CollectDuplicateRowsFromLocalIndex( if err != nil { return err } + logger.Debug("[detect-dupe] found local data conflict", + logutil.Key("key", rawKey), + logutil.Key("value", rawValue), + logutil.Redact(zap.Stringer("handle", h))) + conflictInfo := errormanager.DataConflictInfo{ RawKey: rawKey, RawValue: rawValue, @@ -487,7 +526,6 @@ func (manager *DuplicateManager) CollectDuplicateRowsFromLocalIndex( return err } dataConflictInfos = dataConflictInfos[:0] - hasDataConflict = true return nil }(); err != nil { return false, errors.Trace(err) @@ -511,26 +549,31 @@ func (manager *DuplicateManager) CollectDuplicateRowsFromLocalIndex( } allRanges = append(allRanges, keysRanges...) for _, r := range keysRanges { + tableID := tablecodec.DecodeTableID(r.StartKey) startKey := codec.EncodeBytes([]byte{}, r.StartKey) endKey := codec.EncodeBytes([]byte{}, r.EndKey) opts := &pebble.IterOptions{ LowerBound: startKey, UpperBound: endKey, } - log.L().Info("collect index from db", - logutil.Key("start", startKey), - logutil.Key("end", endKey), - ) + indexLogger := logger.With( + zap.Int64("tableID", tableID), + zap.String("index", indexInfo.Name.O), + zap.Int64("indexID", indexInfo.ID), + logutil.Key("startKey", startKey), + logutil.Key("endKey", endKey)) + indexLogger.Info("[detect-dupe] collect index from db") if err := func() error { iter := db.NewIter(opts) defer iter.Close() for iter.First(); iter.Valid(); iter.Next() { + hasDataConflict = true rawKey, _, _, err := manager.keyAdapter.Decode(nil, iter.Key()) if err != nil { - log.L().Error( - "decode key error when query handle for duplicate index", + indexLogger.Error( + "[detect-dupe] decode key error when query handle for duplicate index", zap.Binary("key", iter.Key()), ) return err @@ -539,11 +582,15 @@ func (manager *DuplicateManager) CollectDuplicateRowsFromLocalIndex( copy(rawValue, iter.Value()) h, err := decoder.DecodeHandleFromIndex(indexInfo, rawKey, rawValue) if err != nil { - log.L().Error("decode handle error from index for duplicatedb", + indexLogger.Error("[detect-dupe] decode handle error from index for duplicatedb", zap.Error(err), logutil.Key("rawKey", rawKey), logutil.Key("value", rawValue)) return err } + indexLogger.Debug("[detect-dupe] found local index conflict, stashing", + logutil.Key("key", rawKey), + logutil.Key("value", rawValue), + logutil.Redact(zap.Stringer("handle", h))) handles.append( errormanager.DataConflictInfo{ RawKey: rawKey, @@ -552,7 +599,7 @@ func (manager *DuplicateManager) CollectDuplicateRowsFromLocalIndex( }, indexInfo.Name.O, h, - decoder.EncodeHandleKey(h)) + decoder.EncodeHandleKey(tableID, h)) if handles.Len() > maxGetRequestKeyCount { handles = manager.getValues(ctx, decoder, handles) } @@ -589,103 +636,54 @@ func (manager *DuplicateManager) getValues( decoder *kv.TableKVDecoder, handles pendingIndexHandles, ) pendingIndexHandles { - sort.Sort(&handles) + var finalErr error + logger := log.With( + zap.String("table", decoder.Name()), + zap.Int("handlesCount", handles.Len()), + ).Begin(zap.DebugLevel, "[detect-dupe] collect values from TiKV") + defer func() { + logger.End(zap.ErrorLevel, finalErr) + }() - l := handles.Len() - startKey := codec.EncodeBytes([]byte{}, handles.rawHandles[0]) - endKey := codec.EncodeBytes([]byte{}, nextKey(handles.rawHandles[l-1])) - regions, err := restore.PaginateScanRegion(ctx, manager.splitCli, startKey, endKey, scanRegionLimit) + // TODO: paginate the handles. + snapshot := manager.tikvCli.GetSnapshot(math.MaxUint64) + batchGetMap, err := snapshot.BatchGet(ctx, handles.rawHandles) if err != nil { - log.L().Error("scan regions errors", zap.Error(err)) + finalErr = err return handles } - startIdx := 0 - endIdx := 0 - retryHandles := makePendingIndexHandlesWithCapacity(0) - batch := makePendingIndexHandlesWithCapacity(0) - for _, region := range regions { - if startIdx >= l { - break - } - handleKey := codec.EncodeBytes([]byte{}, handles.rawHandles[startIdx]) - if bytes.Compare(handleKey, region.Region.EndKey) >= 0 { - // TODO shouldn't we use `sort.Search` for these 🤔 - continue - } - batch.truncate() - endIdx = startIdx - for endIdx < l { - handleKey := codec.EncodeBytes([]byte{}, handles.rawHandles[endIdx]) - if bytes.Compare(handleKey, region.Region.EndKey) < 0 { - batch.appendAt(&handles, endIdx) - endIdx++ - } else { - break - } - } - // because `endIdx` is strictly increasing, and `handles` is sorted, - // and `batch` is constructed by repeatedly appending `handles[endIdx]`, - // we are sure that `batch` is sorted too. - if err := manager.getValuesFromRegion(ctx, region, decoder, batch); err != nil { - log.L().Error("failed to collect values from TiKV by handle, we will retry it again", zap.Error(err)) - retryHandles.extend(&batch) - } - startIdx = endIdx - } - return retryHandles -} -func (manager *DuplicateManager) getValuesFromRegion( - ctx context.Context, - region *restore.RegionInfo, - decoder *kv.TableKVDecoder, - handles pendingIndexHandles, // caller should ensure that handles is sorted. -) error { - kvclient, err := manager.getKvClient(ctx, region.Leader) - if err != nil { - return err - } - reqCtx := &kvrpcpb.Context{ - RegionId: region.Region.GetId(), - RegionEpoch: region.Region.GetRegionEpoch(), - Peer: region.Leader, - } - - req := &kvrpcpb.BatchGetRequest{ - Context: reqCtx, - Keys: handles.rawHandles, - Version: manager.ts, - } - resp, err := kvclient.KvBatchGet(ctx, req) - if err != nil { - return err - } - if resp.GetRegionError() != nil { - return errors.Errorf("region error because of %v", resp.GetRegionError().GetMessage()) - } - if resp.Error != nil { - return errors.Errorf("key error") - } - - rawRows := make([][]byte, 0, len(resp.Pairs)) - for i, kv := range resp.Pairs { - if !bytes.Equal(kv.Key, handles.rawHandles[i]) { - // if TiKV returns the result in random order (should be impossible?), - // we need to search for the real index. - i = handles.searchSortedRawHandle(kv.Key) + retryHandles := makePendingIndexHandlesWithCapacity(0) + batch := makePendingIndexHandlesWithCapacity(handles.Len()) + rawRows := make([][]byte, 0, handles.Len()) + for i, rawHandle := range handles.rawHandles { + rawValue, ok := batchGetMap[string(rawHandle)] + if ok { + logger.Debug("[detect-dupe] retrieved value from TiKV", + logutil.Key("rawHandle", rawHandle), + logutil.Key("row", rawValue)) + rawRows = append(rawRows, rawValue) + handles.dataConflictInfos[i].Row = decoder.DecodeRawRowDataAsStr(handles.handles[i], rawValue) + batch.appendAt(&handles, i) + } else { + logger.Warn("[detect-dupe] missing value from TiKV, will retry", + logutil.Key("rawHandle", rawHandle)) + retryHandles.appendAt(&handles, i) } - rawRows = append(rawRows, kv.Value) - handles.dataConflictInfos[i].Row = decoder.DecodeRawRowDataAsStr(handles.handles[i], kv.Value) } - return manager.errorMgr.RecordIndexConflictError( + finalErr = manager.errorMgr.RecordIndexConflictError( ctx, log.L(), decoder.Name(), - handles.indexNames, - handles.dataConflictInfos, - handles.rawHandles, - rawRows, - ) + batch.indexNames, + batch.dataConflictInfos, + batch.rawHandles, + rawRows) + if finalErr != nil { + return handles + } + + return retryHandles } func (manager *DuplicateManager) getDuplicateStream(ctx context.Context, @@ -716,16 +714,6 @@ func (manager *DuplicateManager) getDuplicateStream(ctx context.Context, return stream, err } -func (manager *DuplicateManager) getKvClient(ctx context.Context, peer *metapb.Peer) (tikvpb.TikvClient, error) { - conn, err := manager.connPool.GetGrpcConn(ctx, peer.GetStoreId(), 1, func(ctx context.Context) (*grpc.ClientConn, error) { - return manager.makeConn(ctx, peer.GetStoreId()) - }) - if err != nil { - return nil, err - } - return tikvpb.NewTikvClient(conn), nil -} - func (manager *DuplicateManager) getImportClient(ctx context.Context, peer *metapb.Peer) (import_sstpb.ImportSSTClient, error) { conn, err := manager.connPool.GetGrpcConn(ctx, peer.GetStoreId(), 1, func(ctx context.Context) (*grpc.ClientConn, error) { return manager.makeConn(ctx, peer.GetStoreId()) diff --git a/br/pkg/lightning/backend/local/engine.go b/br/pkg/lightning/backend/local/engine.go new file mode 100644 index 0000000000000..a4ba47ac42a43 --- /dev/null +++ b/br/pkg/lightning/backend/local/engine.go @@ -0,0 +1,1474 @@ +// Copyright 2021 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, +// 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. + +package local + +import ( + "bytes" + "container/heap" + "context" + "encoding/binary" + "encoding/json" + "fmt" + "io" + "os" + "path/filepath" + "sort" + "sync" + "time" + + "github.com/cockroachdb/pebble" + "github.com/cockroachdb/pebble/sstable" + "github.com/google/btree" + "github.com/google/uuid" + "github.com/pingcap/errors" + "github.com/pingcap/tidb/br/pkg/lightning/backend" + "github.com/pingcap/tidb/br/pkg/lightning/backend/kv" + "github.com/pingcap/tidb/br/pkg/lightning/checkpoints" + "github.com/pingcap/tidb/br/pkg/lightning/common" + "github.com/pingcap/tidb/br/pkg/lightning/errormanager" + "github.com/pingcap/tidb/br/pkg/lightning/log" + "github.com/pingcap/tidb/br/pkg/logutil" + "github.com/pingcap/tidb/br/pkg/membuf" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/util/hack" + "go.uber.org/atomic" + "go.uber.org/zap" + "golang.org/x/sync/errgroup" +) + +var ( + engineMetaKey = []byte{0, 'm', 'e', 't', 'a'} + normalIterStartKey = []byte{1} +) + +type importMutexState uint32 + +const ( + importMutexStateImport importMutexState = 1 << iota + importMutexStateClose + // importMutexStateReadLock is a special state because in this state we lock engine with read lock + // and add isImportingAtomic with this value. In other state, we directly store with the state value. + // so this must always the last value of this enum. + importMutexStateReadLock +) + +// engineMeta contains some field that is necessary to continue the engine restore/import process. +// These field should be written to disk when we update chunk checkpoint +type engineMeta struct { + TS uint64 `json:"ts"` + // Length is the number of KV pairs stored by the engine. + Length atomic.Int64 `json:"length"` + // TotalSize is the total pre-compressed KV byte size stored by engine. + TotalSize atomic.Int64 `json:"total_size"` + // Duplicates is the number of duplicates kv pairs detected when importing. Note that the value is + // probably larger than real value, because we may import same range more than once. For accurate + // information, you should iterate the duplicate db after import is finished. + Duplicates atomic.Int64 `json:"duplicates"` +} + +type syncedRanges struct { + sync.Mutex + ranges []Range +} + +func (r *syncedRanges) add(g Range) { + r.Lock() + r.ranges = append(r.ranges, g) + r.Unlock() +} + +func (r *syncedRanges) reset() { + r.Lock() + r.ranges = r.ranges[:0] + r.Unlock() +} + +type Engine struct { + engineMeta + closed atomic.Bool + db *pebble.DB + UUID uuid.UUID + localWriters sync.Map + + // isImportingAtomic is an atomic variable indicating whether this engine is importing. + // This should not be used as a "spin lock" indicator. + isImportingAtomic atomic.Uint32 + // flush and ingest sst hold the rlock, other operation hold the wlock. + mutex sync.RWMutex + + ctx context.Context + cancel context.CancelFunc + sstDir string + sstMetasChan chan metaOrFlush + ingestErr common.OnceError + wg sync.WaitGroup + sstIngester sstIngester + finishedRanges syncedRanges + + // sst seq lock + seqLock sync.Mutex + // seq number for incoming sst meta + nextSeq int32 + // max seq of sst metas ingested into pebble + finishedMetaSeq atomic.Int32 + + config backend.LocalEngineConfig + tableInfo *checkpoints.TidbTableInfo + + // total size of SST files waiting to be ingested + pendingFileSize atomic.Int64 + + // statistics for pebble kv iter. + importedKVSize atomic.Int64 + importedKVCount atomic.Int64 + + keyAdapter KeyAdapter + duplicateDetection bool + duplicateDB *pebble.DB + errorMgr *errormanager.ErrorManager +} + +func (e *Engine) setError(err error) { + if err != nil { + e.ingestErr.Set(err) + e.cancel() + } +} + +func (e *Engine) Close() error { + log.L().Debug("closing local engine", zap.Stringer("engine", e.UUID), zap.Stack("stack")) + if e.db == nil { + return nil + } + err := errors.Trace(e.db.Close()) + e.db = nil + return err +} + +// Cleanup remove meta and db files +func (e *Engine) Cleanup(dataDir string) error { + if err := os.RemoveAll(e.sstDir); err != nil { + return errors.Trace(err) + } + + dbPath := filepath.Join(dataDir, e.UUID.String()) + return os.RemoveAll(dbPath) +} + +// Exist checks if db folder existing (meta sometimes won't flush before lightning exit) +func (e *Engine) Exist(dataDir string) error { + dbPath := filepath.Join(dataDir, e.UUID.String()) + if _, err := os.Stat(dbPath); err != nil { + return err + } + return nil +} + +func isStateLocked(state importMutexState) bool { + return state&(importMutexStateClose|importMutexStateImport) != 0 +} + +func (e *Engine) isLocked() bool { + // the engine is locked only in import or close state. + return isStateLocked(importMutexState(e.isImportingAtomic.Load())) +} + +// rLock locks the local file with shard read state. Only used for flush and ingest SST files. +func (e *Engine) rLock() { + e.mutex.RLock() + e.isImportingAtomic.Add(uint32(importMutexStateReadLock)) +} + +func (e *Engine) rUnlock() { + if e == nil { + return + } + + e.isImportingAtomic.Sub(uint32(importMutexStateReadLock)) + e.mutex.RUnlock() +} + +// lock locks the local file for importing. +func (e *Engine) lock(state importMutexState) { + e.mutex.Lock() + e.isImportingAtomic.Store(uint32(state)) +} + +// lockUnless tries to lock the local file unless it is already locked into the state given by +// ignoreStateMask. Returns whether the lock is successful. +func (e *Engine) lockUnless(newState, ignoreStateMask importMutexState) bool { + curState := e.isImportingAtomic.Load() + if curState&uint32(ignoreStateMask) != 0 { + return false + } + e.lock(newState) + return true +} + +// tryRLock tries to read-lock the local file unless it is already write locked. +// Returns whether the lock is successful. +func (e *Engine) tryRLock() bool { + curState := e.isImportingAtomic.Load() + // engine is in import/close state. + if isStateLocked(importMutexState(curState)) { + return false + } + e.rLock() + return true +} + +func (e *Engine) unlock() { + if e == nil { + return + } + e.isImportingAtomic.Store(0) + e.mutex.Unlock() +} + +type rangeOffsets struct { + Size uint64 + Keys uint64 +} + +type rangeProperty struct { + Key []byte + rangeOffsets +} + +func (r *rangeProperty) Less(than btree.Item) bool { + ta := than.(*rangeProperty) + return bytes.Compare(r.Key, ta.Key) < 0 +} + +var _ btree.Item = &rangeProperty{} + +type rangeProperties []rangeProperty + +func decodeRangeProperties(data []byte) (rangeProperties, error) { + r := make(rangeProperties, 0, 16) + for len(data) > 0 { + if len(data) < 4 { + return nil, io.ErrUnexpectedEOF + } + keyLen := int(binary.BigEndian.Uint32(data[:4])) + data = data[4:] + if len(data) < keyLen+8*2 { + return nil, io.ErrUnexpectedEOF + } + key := data[:keyLen] + data = data[keyLen:] + size := binary.BigEndian.Uint64(data[:8]) + keys := binary.BigEndian.Uint64(data[8:]) + data = data[16:] + r = append(r, rangeProperty{Key: key, rangeOffsets: rangeOffsets{Size: size, Keys: keys}}) + } + + return r, nil +} + +func (r rangeProperties) Encode() []byte { + b := make([]byte, 0, 1024) + idx := 0 + for _, p := range r { + b = append(b, 0, 0, 0, 0) + binary.BigEndian.PutUint32(b[idx:], uint32(len(p.Key))) + idx += 4 + b = append(b, p.Key...) + idx += len(p.Key) + + b = append(b, 0, 0, 0, 0, 0, 0, 0, 0) + binary.BigEndian.PutUint64(b[idx:], p.Size) + idx += 8 + + b = append(b, 0, 0, 0, 0, 0, 0, 0, 0) + binary.BigEndian.PutUint64(b[idx:], p.Keys) + idx += 8 + } + return b +} + +func (r rangeProperties) get(key []byte) rangeOffsets { + idx := sort.Search(len(r), func(i int) bool { + return bytes.Compare(r[i].Key, key) >= 0 + }) + return r[idx].rangeOffsets +} + +type RangePropertiesCollector struct { + props rangeProperties + lastOffsets rangeOffsets + lastKey []byte + currentOffsets rangeOffsets + propSizeIdxDistance uint64 + propKeysIdxDistance uint64 +} + +func newRangePropertiesCollector() pebble.TablePropertyCollector { + return &RangePropertiesCollector{ + props: make([]rangeProperty, 0, 1024), + propSizeIdxDistance: defaultPropSizeIndexDistance, + propKeysIdxDistance: defaultPropKeysIndexDistance, + } +} + +func (c *RangePropertiesCollector) sizeInLastRange() uint64 { + return c.currentOffsets.Size - c.lastOffsets.Size +} + +func (c *RangePropertiesCollector) keysInLastRange() uint64 { + return c.currentOffsets.Keys - c.lastOffsets.Keys +} + +func (c *RangePropertiesCollector) insertNewPoint(key []byte) { + c.lastOffsets = c.currentOffsets + c.props = append(c.props, rangeProperty{Key: append([]byte{}, key...), rangeOffsets: c.currentOffsets}) +} + +// Add implements `pebble.TablePropertyCollector`. +// Add implements `TablePropertyCollector.Add`. +func (c *RangePropertiesCollector) Add(key pebble.InternalKey, value []byte) error { + c.currentOffsets.Size += uint64(len(value)) + uint64(len(key.UserKey)) + c.currentOffsets.Keys++ + if len(c.lastKey) == 0 || c.sizeInLastRange() >= c.propSizeIdxDistance || + c.keysInLastRange() >= c.propKeysIdxDistance { + c.insertNewPoint(key.UserKey) + } + c.lastKey = append(c.lastKey[:0], key.UserKey...) + return nil +} + +func (c *RangePropertiesCollector) Finish(userProps map[string]string) error { + if c.sizeInLastRange() > 0 || c.keysInLastRange() > 0 { + c.insertNewPoint(c.lastKey) + } + + userProps[propRangeIndex] = string(c.props.Encode()) + return nil +} + +func (c *RangePropertiesCollector) Name() string { + return propRangeIndex +} + +type sizeProperties struct { + totalSize uint64 + indexHandles *btree.BTree +} + +func newSizeProperties() *sizeProperties { + return &sizeProperties{indexHandles: btree.New(32)} +} + +func (s *sizeProperties) add(item *rangeProperty) { + if old := s.indexHandles.ReplaceOrInsert(item); old != nil { + o := old.(*rangeProperty) + item.Keys += o.Keys + item.Size += o.Size + } +} + +func (s *sizeProperties) addAll(props rangeProperties) { + prevRange := rangeOffsets{} + for _, r := range props { + s.add(&rangeProperty{ + Key: r.Key, + rangeOffsets: rangeOffsets{Keys: r.Keys - prevRange.Keys, Size: r.Size - prevRange.Size}, + }) + prevRange = r.rangeOffsets + } + if len(props) > 0 { + s.totalSize = props[len(props)-1].Size + } +} + +// iter the tree until f return false +func (s *sizeProperties) iter(f func(p *rangeProperty) bool) { + s.indexHandles.Ascend(func(i btree.Item) bool { + prop := i.(*rangeProperty) + return f(prop) + }) +} + +func (e *Engine) getSizeProperties() (*sizeProperties, error) { + sstables, err := e.db.SSTables(pebble.WithProperties()) + if err != nil { + log.L().Warn("get table properties failed", zap.Stringer("engine", e.UUID), log.ShortError(err)) + return nil, errors.Trace(err) + } + + sizeProps := newSizeProperties() + for _, level := range sstables { + for _, info := range level { + if prop, ok := info.Properties.UserProperties[propRangeIndex]; ok { + data := hack.Slice(prop) + rangeProps, err := decodeRangeProperties(data) + if err != nil { + log.L().Warn("decodeRangeProperties failed", zap.Stringer("engine", e.UUID), + zap.Stringer("fileNum", info.FileNum), log.ShortError(err)) + return nil, errors.Trace(err) + } + if e.duplicateDetection { + newRangeProps := make(rangeProperties, 0, len(rangeProps)) + for _, p := range rangeProps { + if !bytes.Equal(p.Key, engineMetaKey) { + p.Key, _, _, err = e.keyAdapter.Decode(nil, p.Key) + if err != nil { + log.L().Warn( + "decodeRangeProperties failed because the props key is invalid", + zap.Stringer("engine", e.UUID), + zap.Stringer("fileNum", info.FileNum), + zap.Binary("key", p.Key), + ) + return nil, errors.Trace(err) + } + newRangeProps = append(newRangeProps, p) + } + } + rangeProps = newRangeProps + } + sizeProps.addAll(rangeProps) + } + } + } + + return sizeProps, nil +} + +func (e *Engine) getEngineFileSize() backend.EngineFileSize { + metrics := e.db.Metrics() + total := metrics.Total() + var memSize int64 + e.localWriters.Range(func(k, v interface{}) bool { + w := k.(*Writer) + if w.writer != nil { + memSize += int64(w.writer.writer.EstimatedSize()) + } else { + // if kvs are still in memory, only calculate half of the total size + // in our tests, SST file size is about 50% of the raw kv size + memSize += w.batchSize / 2 + } + + return true + }) + + pendingSize := e.pendingFileSize.Load() + // TODO: should also add the in-processing compaction sst writer size into MemSize + return backend.EngineFileSize{ + UUID: e.UUID, + DiskSize: total.Size + pendingSize, + MemSize: memSize, + IsImporting: e.isLocked(), + } +} + +// either a sstMeta or a flush message +type metaOrFlush struct { + meta *sstMeta + flushCh chan struct{} +} + +type metaSeq struct { + // the sequence for this flush message, a flush call can return only if + // all the other flush will lower `flushSeq` are done + flushSeq int32 + // the max sstMeta sequence number in this flush, after the flush is done (all SSTs are ingested), + // we can save chunks will a lower meta sequence number safely. + metaSeq int32 +} + +type metaSeqHeap struct { + arr []metaSeq +} + +func (h *metaSeqHeap) Len() int { + return len(h.arr) +} + +func (h *metaSeqHeap) Less(i, j int) bool { + return h.arr[i].flushSeq < h.arr[j].flushSeq +} + +func (h *metaSeqHeap) Swap(i, j int) { + h.arr[i], h.arr[j] = h.arr[j], h.arr[i] +} + +func (h *metaSeqHeap) Push(x interface{}) { + h.arr = append(h.arr, x.(metaSeq)) +} + +func (h *metaSeqHeap) Pop() interface{} { + item := h.arr[len(h.arr)-1] + h.arr = h.arr[:len(h.arr)-1] + return item +} + +func (e *Engine) ingestSSTLoop() { + defer e.wg.Done() + + type flushSeq struct { + seq int32 + ch chan struct{} + } + + seq := atomic.NewInt32(0) + finishedSeq := atomic.NewInt32(0) + var seqLock sync.Mutex + // a flush is finished iff all the compaction&ingest tasks with a lower seq number are finished. + flushQueue := make([]flushSeq, 0) + // inSyncSeqs is a heap that stores all the finished compaction tasks whose seq is bigger than `finishedSeq + 1` + // this mean there are still at lease one compaction task with a lower seq unfinished. + inSyncSeqs := &metaSeqHeap{arr: make([]metaSeq, 0)} + + type metaAndSeq struct { + metas []*sstMeta + seq int32 + } + + concurrency := e.config.CompactConcurrency + // when compaction is disabled, ingest is an serial action, so 1 routine is enough + if !e.config.Compact { + concurrency = 1 + } + metaChan := make(chan metaAndSeq, concurrency) + for i := 0; i < concurrency; i++ { + e.wg.Add(1) + go func() { + defer e.wg.Done() + defer func() { + if e.ingestErr.Get() != nil { + seqLock.Lock() + for _, f := range flushQueue { + f.ch <- struct{}{} + } + flushQueue = flushQueue[:0] + seqLock.Unlock() + } + }() + for { + select { + case <-e.ctx.Done(): + return + case metas, ok := <-metaChan: + if !ok { + return + } + ingestMetas := metas.metas + if e.config.Compact { + newMeta, err := e.sstIngester.mergeSSTs(metas.metas, e.sstDir) + if err != nil { + e.setError(err) + return + } + ingestMetas = []*sstMeta{newMeta} + } + // batchIngestSSTs will change ingestMetas' order, so we record the max seq here + metasMaxSeq := ingestMetas[len(ingestMetas)-1].seq + + if err := e.batchIngestSSTs(ingestMetas); err != nil { + e.setError(err) + return + } + seqLock.Lock() + finSeq := finishedSeq.Load() + if metas.seq == finSeq+1 { + finSeq = metas.seq + finMetaSeq := metasMaxSeq + for len(inSyncSeqs.arr) > 0 { + if inSyncSeqs.arr[0].flushSeq == finSeq+1 { + finSeq++ + finMetaSeq = inSyncSeqs.arr[0].metaSeq + heap.Remove(inSyncSeqs, 0) + } else { + break + } + } + + var flushChans []chan struct{} + for _, seq := range flushQueue { + if seq.seq <= finSeq { + flushChans = append(flushChans, seq.ch) + } else { + break + } + } + flushQueue = flushQueue[len(flushChans):] + finishedSeq.Store(finSeq) + e.finishedMetaSeq.Store(finMetaSeq) + seqLock.Unlock() + for _, c := range flushChans { + c <- struct{}{} + } + } else { + heap.Push(inSyncSeqs, metaSeq{flushSeq: metas.seq, metaSeq: metasMaxSeq}) + seqLock.Unlock() + } + } + } + }() + } + + compactAndIngestSSTs := func(metas []*sstMeta) { + if len(metas) > 0 { + seqLock.Lock() + metaSeq := seq.Add(1) + seqLock.Unlock() + select { + case <-e.ctx.Done(): + case metaChan <- metaAndSeq{metas: metas, seq: metaSeq}: + } + } + } + + pendingMetas := make([]*sstMeta, 0, 16) + totalSize := int64(0) + metasTmp := make([]*sstMeta, 0) + addMetas := func() { + if len(metasTmp) == 0 { + return + } + metas := metasTmp + metasTmp = make([]*sstMeta, 0, len(metas)) + if !e.config.Compact { + compactAndIngestSSTs(metas) + return + } + for _, m := range metas { + if m.totalCount > 0 { + pendingMetas = append(pendingMetas, m) + totalSize += m.totalSize + if totalSize >= e.config.CompactThreshold { + compactMetas := pendingMetas + pendingMetas = make([]*sstMeta, 0, len(pendingMetas)) + totalSize = 0 + compactAndIngestSSTs(compactMetas) + } + } + } + } +readMetaLoop: + for { + closed := false + select { + case <-e.ctx.Done(): + close(metaChan) + return + case m, ok := <-e.sstMetasChan: + if !ok { + closed = true + break + } + if m.flushCh != nil { + // meet a flush event, we should trigger a ingest task if there are pending metas, + // and then waiting for all the running flush tasks to be done. + if len(metasTmp) > 0 { + addMetas() + } + if len(pendingMetas) > 0 { + seqLock.Lock() + metaSeq := seq.Add(1) + flushQueue = append(flushQueue, flushSeq{ch: m.flushCh, seq: metaSeq}) + seqLock.Unlock() + select { + case metaChan <- metaAndSeq{metas: pendingMetas, seq: metaSeq}: + case <-e.ctx.Done(): + close(metaChan) + return + } + + pendingMetas = make([]*sstMeta, 0, len(pendingMetas)) + totalSize = 0 + } else { + // none remaining metas needed to be ingested + seqLock.Lock() + curSeq := seq.Load() + finSeq := finishedSeq.Load() + // if all pending SST files are written, directly do a db.Flush + if curSeq == finSeq { + seqLock.Unlock() + m.flushCh <- struct{}{} + } else { + // waiting for pending compaction tasks + flushQueue = append(flushQueue, flushSeq{ch: m.flushCh, seq: curSeq}) + seqLock.Unlock() + } + } + continue readMetaLoop + } + metasTmp = append(metasTmp, m.meta) + // try to drain all the sst meta from the chan to make sure all the SSTs are processed before handle a flush msg. + if len(e.sstMetasChan) > 0 { + continue readMetaLoop + } + + addMetas() + } + if closed { + compactAndIngestSSTs(pendingMetas) + close(metaChan) + return + } + } +} + +func (e *Engine) addSST(ctx context.Context, m *sstMeta) (int32, error) { + // set pending size after SST file is generated + e.pendingFileSize.Add(m.fileSize) + // make sure sstMeta is sent into the chan in order + e.seqLock.Lock() + defer e.seqLock.Unlock() + e.nextSeq++ + seq := e.nextSeq + m.seq = seq + select { + case e.sstMetasChan <- metaOrFlush{meta: m}: + case <-ctx.Done(): + return 0, ctx.Err() + case <-e.ctx.Done(): + } + return seq, e.ingestErr.Get() +} + +func (e *Engine) batchIngestSSTs(metas []*sstMeta) error { + if len(metas) == 0 { + return nil + } + sort.Slice(metas, func(i, j int) bool { + return bytes.Compare(metas[i].minKey, metas[j].minKey) < 0 + }) + + metaLevels := make([][]*sstMeta, 0) + for _, meta := range metas { + inserted := false + for i, l := range metaLevels { + if bytes.Compare(l[len(l)-1].maxKey, meta.minKey) >= 0 { + continue + } + metaLevels[i] = append(l, meta) + inserted = true + break + } + if !inserted { + metaLevels = append(metaLevels, []*sstMeta{meta}) + } + } + + for _, l := range metaLevels { + if err := e.ingestSSTs(l); err != nil { + return err + } + } + return nil +} + +func (e *Engine) ingestSSTs(metas []*sstMeta) error { + // use raw RLock to avoid change the lock state during flushing. + e.mutex.RLock() + defer e.mutex.RUnlock() + if e.closed.Load() { + return errorEngineClosed + } + totalSize := int64(0) + totalCount := int64(0) + fileSize := int64(0) + for _, m := range metas { + totalSize += m.totalSize + totalCount += m.totalCount + fileSize += m.fileSize + } + log.L().Info("write data to local DB", + zap.Int64("size", totalSize), + zap.Int64("kvs", totalCount), + zap.Int("files", len(metas)), + zap.Int64("sstFileSize", fileSize), + zap.String("file", metas[0].path), + logutil.Key("firstKey", metas[0].minKey), + logutil.Key("lastKey", metas[len(metas)-1].maxKey)) + if err := e.sstIngester.ingest(metas); err != nil { + return errors.Trace(err) + } + count := int64(0) + size := int64(0) + for _, m := range metas { + count += m.totalCount + size += m.totalSize + } + e.Length.Add(count) + e.TotalSize.Add(size) + return nil +} + +func (e *Engine) flushLocalWriters(parentCtx context.Context) error { + eg, ctx := errgroup.WithContext(parentCtx) + e.localWriters.Range(func(k, v interface{}) bool { + eg.Go(func() error { + w := k.(*Writer) + return w.flush(ctx) + }) + return true + }) + return eg.Wait() +} + +func (e *Engine) flushEngineWithoutLock(ctx context.Context) error { + if err := e.flushLocalWriters(ctx); err != nil { + return err + } + flushChan := make(chan struct{}, 1) + select { + case e.sstMetasChan <- metaOrFlush{flushCh: flushChan}: + case <-ctx.Done(): + return ctx.Err() + case <-e.ctx.Done(): + return e.ctx.Err() + } + + select { + case <-flushChan: + case <-ctx.Done(): + return ctx.Err() + case <-e.ctx.Done(): + return e.ctx.Err() + } + if err := e.ingestErr.Get(); err != nil { + return errors.Trace(err) + } + if err := e.saveEngineMeta(); err != nil { + return err + } + + flushFinishedCh, err := e.db.AsyncFlush() + if err != nil { + return errors.Trace(err) + } + select { + case <-flushFinishedCh: + return nil + case <-ctx.Done(): + return ctx.Err() + case <-e.ctx.Done(): + return e.ctx.Err() + } +} + +func saveEngineMetaToDB(meta *engineMeta, db *pebble.DB) error { + jsonBytes, err := json.Marshal(meta) + if err != nil { + return errors.Trace(err) + } + // note: we can't set Sync to true since we disabled WAL. + return db.Set(engineMetaKey, jsonBytes, &pebble.WriteOptions{Sync: false}) +} + +// saveEngineMeta saves the metadata about the DB into the DB itself. +// This method should be followed by a Flush to ensure the data is actually synchronized +func (e *Engine) saveEngineMeta() error { + log.L().Debug("save engine meta", zap.Stringer("uuid", e.UUID), zap.Int64("count", e.Length.Load()), + zap.Int64("size", e.TotalSize.Load())) + return errors.Trace(saveEngineMetaToDB(&e.engineMeta, e.db)) +} + +func (e *Engine) loadEngineMeta() error { + jsonBytes, closer, err := e.db.Get(engineMetaKey) + if err != nil { + if err == pebble.ErrNotFound { + log.L().Debug("local db missing engine meta", zap.Stringer("uuid", e.UUID), zap.Error(err)) + return nil + } + return err + } + defer closer.Close() + + if err = json.Unmarshal(jsonBytes, &e.engineMeta); err != nil { + log.L().Warn("local db failed to deserialize meta", zap.Stringer("uuid", e.UUID), zap.ByteString("content", jsonBytes), zap.Error(err)) + return err + } + log.L().Debug("load engine meta", zap.Stringer("uuid", e.UUID), zap.Int64("count", e.Length.Load()), + zap.Int64("size", e.TotalSize.Load())) + return nil +} + +// sortAndMergeRanges sort the ranges and merge range that overlaps with each other into a single range. +func sortAndMergeRanges(ranges []Range) []Range { + if len(ranges) == 0 { + return ranges + } + + sort.Slice(ranges, func(i, j int) bool { + return bytes.Compare(ranges[i].start, ranges[j].start) < 0 + }) + + curEnd := ranges[0].end + i := 0 + for j := 1; j < len(ranges); j++ { + if bytes.Compare(curEnd, ranges[j].start) >= 0 { + if bytes.Compare(curEnd, ranges[j].end) < 0 { + curEnd = ranges[j].end + } + } else { + ranges[i].end = curEnd + i++ + ranges[i].start = ranges[j].start + curEnd = ranges[j].end + } + } + ranges[i].end = curEnd + return ranges[:i+1] +} + +func filterOverlapRange(ranges []Range, finishedRanges []Range) []Range { + if len(ranges) == 0 || len(finishedRanges) == 0 { + return ranges + } + + result := make([]Range, 0) + for _, r := range ranges { + start := r.start + end := r.end + for len(finishedRanges) > 0 && bytes.Compare(finishedRanges[0].start, end) < 0 { + fr := finishedRanges[0] + if bytes.Compare(fr.start, start) > 0 { + result = append(result, Range{start: start, end: fr.start}) + } + if bytes.Compare(fr.end, start) > 0 { + start = fr.end + } + if bytes.Compare(fr.end, end) > 0 { + break + } + finishedRanges = finishedRanges[1:] + } + if bytes.Compare(start, end) < 0 { + result = append(result, Range{start: start, end: end}) + } + } + return result +} + +func (e *Engine) unfinishedRanges(ranges []Range) []Range { + e.finishedRanges.Lock() + defer e.finishedRanges.Unlock() + + e.finishedRanges.ranges = sortAndMergeRanges(e.finishedRanges.ranges) + + return filterOverlapRange(ranges, e.finishedRanges.ranges) +} + +type sstMeta struct { + path string + minKey []byte + maxKey []byte + totalSize int64 + totalCount int64 + // used for calculate disk-quota + fileSize int64 + seq int32 +} + +type Writer struct { + sync.Mutex + engine *Engine + memtableSizeLimit int64 + + // if the KVs are append in order, we can directly write the into SST file, + // else we must first store them in writeBatch and then batch flush into SST file. + isKVSorted bool + writer *sstWriter + + // bytes buffer for writeBatch + kvBuffer *membuf.Buffer + writeBatch []common.KvPair + // if the kvs in writeBatch are in order, we can avoid doing a `sort.Slice` which + // is quite slow. in our bench, the sort operation eats about 5% of total CPU + isWriteBatchSorted bool + + batchCount int + batchSize int64 + totalSize int64 + totalCount int64 + + lastMetaSeq int32 +} + +func (w *Writer) appendRowsSorted(kvs []common.KvPair) error { + if w.writer == nil { + writer, err := w.createSSTWriter() + if err != nil { + return errors.Trace(err) + } + w.writer = writer + w.writer.minKey = append([]byte{}, kvs[0].Key...) + } + + totalKeyLen := 0 + for i := 0; i < len(kvs); i++ { + totalKeyLen += w.engine.keyAdapter.EncodedLen(kvs[i].Key) + } + buf := make([]byte, totalKeyLen) + encodedKvs := make([]common.KvPair, len(kvs)) + for i := 0; i < len(kvs); i++ { + encodedKey := w.engine.keyAdapter.Encode(buf, kvs[i].Key, kvs[i].RowID, kvs[i].Offset) + buf = buf[len(encodedKey):] + encodedKvs[i] = common.KvPair{Key: encodedKey, Val: kvs[i].Val} + w.batchSize += int64(len(encodedKvs[i].Key) + len(encodedKvs[i].Val)) + } + + w.batchCount += len(encodedKvs) + w.totalCount += int64(len(encodedKvs)) + return w.writer.writeKVs(encodedKvs) +} + +func (w *Writer) appendRowsUnsorted(ctx context.Context, kvs []common.KvPair) error { + l := len(w.writeBatch) + cnt := w.batchCount + var lastKey []byte + if cnt > 0 { + lastKey = w.writeBatch[cnt-1].Key + } + for _, pair := range kvs { + if w.isWriteBatchSorted && bytes.Compare(lastKey, pair.Key) > 0 { + w.isWriteBatchSorted = false + } + lastKey = pair.Key + w.batchSize += int64(len(pair.Key) + len(pair.Val)) + buf := w.kvBuffer.AllocBytes(w.engine.keyAdapter.EncodedLen(pair.Key)) + key := w.engine.keyAdapter.Encode(buf, pair.Key, pair.RowID, pair.Offset) + val := w.kvBuffer.AddBytes(pair.Val) + if cnt < l { + w.writeBatch[cnt].Key = key + w.writeBatch[cnt].Val = val + } else { + w.writeBatch = append(w.writeBatch, common.KvPair{Key: key, Val: val}) + } + cnt++ + } + w.batchCount = cnt + + if w.batchSize > w.memtableSizeLimit { + if err := w.flushKVs(ctx); err != nil { + return err + } + } + w.totalCount += int64(len(kvs)) + return nil +} + +func (w *Writer) AppendRows(ctx context.Context, tableName string, columnNames []string, rows kv.Rows) error { + kvs := kv.KvPairsFromRows(rows) + if len(kvs) == 0 { + return nil + } + + if w.engine.closed.Load() { + return errorEngineClosed + } + + w.Lock() + defer w.Unlock() + + // if chunk has _tidb_rowid field, we can't ensure that the rows are sorted. + if w.isKVSorted && w.writer == nil { + for _, c := range columnNames { + if c == model.ExtraHandleName.L { + w.isKVSorted = false + } + } + } + + if w.isKVSorted { + return w.appendRowsSorted(kvs) + } + return w.appendRowsUnsorted(ctx, kvs) +} + +func (w *Writer) flush(ctx context.Context) error { + w.Lock() + defer w.Unlock() + if w.batchCount == 0 { + return nil + } + + w.totalSize += w.batchSize + if len(w.writeBatch) > 0 { + if err := w.flushKVs(ctx); err != nil { + return errors.Trace(err) + } + } + + if w.writer != nil { + meta, err := w.writer.close() + if err != nil { + return errors.Trace(err) + } + w.writer = nil + w.batchCount = 0 + if meta != nil && meta.totalSize > 0 { + return w.addSST(ctx, meta) + } + } + + return nil +} + +type flushStatus struct { + local *Engine + seq int32 +} + +func (f flushStatus) Flushed() bool { + return f.seq <= f.local.finishedMetaSeq.Load() +} + +func (w *Writer) Close(ctx context.Context) (backend.ChunkFlushStatus, error) { + defer w.kvBuffer.Destroy() + defer w.engine.localWriters.Delete(w) + err := w.flush(ctx) + // FIXME: in theory this line is useless, but In our benchmark with go1.15 + // this can resolve the memory consistently increasing issue. + // maybe this is a bug related to go GC mechanism. + w.writeBatch = nil + return flushStatus{local: w.engine, seq: w.lastMetaSeq}, err +} + +func (w *Writer) IsSynced() bool { + return w.batchCount == 0 && w.lastMetaSeq <= w.engine.finishedMetaSeq.Load() +} + +func (w *Writer) flushKVs(ctx context.Context) error { + writer, err := w.createSSTWriter() + if err != nil { + return errors.Trace(err) + } + if !w.isWriteBatchSorted { + sort.Slice(w.writeBatch[:w.batchCount], func(i, j int) bool { + return bytes.Compare(w.writeBatch[i].Key, w.writeBatch[j].Key) < 0 + }) + w.isWriteBatchSorted = true + } + + writer.minKey = append(writer.minKey[:0], w.writeBatch[0].Key...) + err = writer.writeKVs(w.writeBatch[:w.batchCount]) + if err != nil { + return errors.Trace(err) + } + meta, err := writer.close() + if err != nil { + return errors.Trace(err) + } + err = w.addSST(ctx, meta) + if err != nil { + return errors.Trace(err) + } + + w.totalSize += w.batchSize + w.batchSize = 0 + w.batchCount = 0 + w.kvBuffer.Reset() + return nil +} + +func (w *Writer) addSST(ctx context.Context, meta *sstMeta) error { + seq, err := w.engine.addSST(ctx, meta) + if err != nil { + return err + } + w.lastMetaSeq = seq + return nil +} + +func (w *Writer) createSSTWriter() (*sstWriter, error) { + path := filepath.Join(w.engine.sstDir, uuid.New().String()+".sst") + writer, err := newSSTWriter(path) + if err != nil { + return nil, err + } + sw := &sstWriter{sstMeta: &sstMeta{path: path}, writer: writer} + return sw, nil +} + +var errorUnorderedSSTInsertion = errors.New("inserting KVs into SST without order") + +type sstWriter struct { + *sstMeta + writer *sstable.Writer +} + +func newSSTWriter(path string) (*sstable.Writer, error) { + f, err := os.Create(path) + if err != nil { + return nil, errors.Trace(err) + } + writer := sstable.NewWriter(f, sstable.WriterOptions{ + TablePropertyCollectors: []func() pebble.TablePropertyCollector{ + newRangePropertiesCollector, + }, + BlockSize: 16 * 1024, + }) + return writer, nil +} + +func (sw *sstWriter) writeKVs(kvs []common.KvPair) error { + if len(kvs) == 0 { + return nil + } + + if bytes.Compare(kvs[0].Key, sw.maxKey) <= 0 { + return errorUnorderedSSTInsertion + } + + internalKey := sstable.InternalKey{ + Trailer: uint64(sstable.InternalKeyKindSet), + } + var lastKey []byte + for _, p := range kvs { + if bytes.Equal(p.Key, lastKey) { + log.L().Warn("duplicated key found, skip write", logutil.Key("key", p.Key)) + continue + } + internalKey.UserKey = p.Key + if err := sw.writer.Add(internalKey, p.Val); err != nil { + return errors.Trace(err) + } + sw.totalSize += int64(len(p.Key)) + int64(len(p.Val)) + } + sw.totalCount += int64(len(kvs)) + sw.maxKey = append(sw.maxKey[:0], kvs[len(kvs)-1].Key...) + return nil +} + +func (sw *sstWriter) close() (*sstMeta, error) { + if err := sw.writer.Close(); err != nil { + return nil, errors.Trace(err) + } + meta, err := sw.writer.Metadata() + if err != nil { + return nil, errors.Trace(err) + } + sw.fileSize = int64(meta.Size) + return sw.sstMeta, nil +} + +type sstIter struct { + name string + key []byte + val []byte + iter sstable.Iterator + reader *sstable.Reader + valid bool +} + +func (i *sstIter) Close() error { + if err := i.iter.Close(); err != nil { + return errors.Trace(err) + } + err := i.reader.Close() + return errors.Trace(err) +} + +type sstIterHeap struct { + iters []*sstIter +} + +func (h *sstIterHeap) Len() int { + return len(h.iters) +} + +func (h *sstIterHeap) Less(i, j int) bool { + return bytes.Compare(h.iters[i].key, h.iters[j].key) < 0 +} + +func (h *sstIterHeap) Swap(i, j int) { + h.iters[i], h.iters[j] = h.iters[j], h.iters[i] +} + +func (h *sstIterHeap) Push(x interface{}) { + h.iters = append(h.iters, x.(*sstIter)) +} + +func (h *sstIterHeap) Pop() interface{} { + item := h.iters[len(h.iters)-1] + h.iters = h.iters[:len(h.iters)-1] + return item +} + +func (h *sstIterHeap) Next() ([]byte, []byte, error) { + for { + if len(h.iters) == 0 { + return nil, nil, nil + } + + iter := h.iters[0] + if iter.valid { + iter.valid = false + return iter.key, iter.val, iter.iter.Error() + } + + var k *pebble.InternalKey + k, iter.val = iter.iter.Next() + if k != nil { + iter.key = k.UserKey + iter.valid = true + heap.Fix(h, 0) + } else { + err := iter.Close() + heap.Remove(h, 0) + if err != nil { + return nil, nil, errors.Trace(err) + } + } + } +} + +// sstIngester is a interface used to merge and ingest SST files. +// it's a interface mainly used for test convenience +type sstIngester interface { + mergeSSTs(metas []*sstMeta, dir string) (*sstMeta, error) + ingest([]*sstMeta) error +} + +type dbSSTIngester struct { + e *Engine +} + +func (i dbSSTIngester) mergeSSTs(metas []*sstMeta, dir string) (*sstMeta, error) { + if len(metas) == 0 { + return nil, errors.New("sst metas is empty") + } else if len(metas) == 1 { + return metas[0], nil + } + + start := time.Now() + newMeta := &sstMeta{ + seq: metas[len(metas)-1].seq, + } + mergeIter := &sstIterHeap{ + iters: make([]*sstIter, 0, len(metas)), + } + + for _, p := range metas { + f, err := os.Open(p.path) + if err != nil { + return nil, errors.Trace(err) + } + reader, err := sstable.NewReader(f, sstable.ReaderOptions{}) + if err != nil { + return nil, errors.Trace(err) + } + iter, err := reader.NewIter(nil, nil) + if err != nil { + return nil, errors.Trace(err) + } + key, val := iter.Next() + if key == nil { + continue + } + if iter.Error() != nil { + return nil, errors.Trace(iter.Error()) + } + mergeIter.iters = append(mergeIter.iters, &sstIter{ + name: p.path, + iter: iter, + key: key.UserKey, + val: val, + reader: reader, + valid: true, + }) + newMeta.totalSize += p.totalSize + newMeta.totalCount += p.totalCount + } + heap.Init(mergeIter) + + name := filepath.Join(dir, fmt.Sprintf("%s.sst", uuid.New())) + writer, err := newSSTWriter(name) + if err != nil { + return nil, errors.Trace(err) + } + newMeta.path = name + + internalKey := sstable.InternalKey{ + Trailer: uint64(sstable.InternalKeyKindSet), + } + key, val, err := mergeIter.Next() + if err != nil { + return nil, err + } + if key == nil { + return nil, errors.New("all ssts are empty!") + } + newMeta.minKey = append(newMeta.minKey[:0], key...) + lastKey := make([]byte, 0) + for { + if bytes.Equal(lastKey, key) { + log.L().Warn("duplicated key found, skipped", zap.Binary("key", lastKey)) + newMeta.totalCount-- + newMeta.totalSize -= int64(len(key) + len(val)) + + goto nextKey + } + internalKey.UserKey = key + err = writer.Add(internalKey, val) + if err != nil { + return nil, err + } + lastKey = append(lastKey[:0], key...) + nextKey: + key, val, err = mergeIter.Next() + if err != nil { + return nil, err + } + if key == nil { + break + } + } + err = writer.Close() + if err != nil { + return nil, errors.Trace(err) + } + meta, err := writer.Metadata() + if err != nil { + return nil, errors.Trace(err) + } + newMeta.maxKey = lastKey + newMeta.fileSize = int64(meta.Size) + + dur := time.Since(start) + log.L().Info("compact sst", zap.Int("fileCount", len(metas)), zap.Int64("size", newMeta.totalSize), + zap.Int64("count", newMeta.totalCount), zap.Duration("cost", dur), zap.String("file", name)) + + // async clean raw SSTs. + go func() { + totalSize := int64(0) + for _, m := range metas { + totalSize += m.fileSize + if err := os.Remove(m.path); err != nil { + log.L().Warn("async cleanup sst file failed", zap.Error(err)) + } + } + // decrease the pending size after clean up + i.e.pendingFileSize.Sub(totalSize) + }() + + return newMeta, err +} + +func (i dbSSTIngester) ingest(metas []*sstMeta) error { + if len(metas) == 0 { + return nil + } + paths := make([]string, 0, len(metas)) + for _, m := range metas { + paths = append(paths, m.path) + } + return i.e.db.Ingest(paths) +} diff --git a/br/pkg/lightning/backend/local/iterator.go b/br/pkg/lightning/backend/local/iterator.go index 8cd8bc243ca8a..0495c6f4075a7 100644 --- a/br/pkg/lightning/backend/local/iterator.go +++ b/br/pkg/lightning/backend/local/iterator.go @@ -20,11 +20,14 @@ import ( "github.com/cockroachdb/pebble" sst "github.com/pingcap/kvproto/pkg/import_sstpb" + "go.uber.org/multierr" + "go.uber.org/zap" + "github.com/pingcap/tidb/br/pkg/kv" + "github.com/pingcap/tidb/br/pkg/lightning/common" "github.com/pingcap/tidb/br/pkg/lightning/log" "github.com/pingcap/tidb/br/pkg/logutil" "github.com/pingcap/tidb/util/codec" - "go.uber.org/multierr" ) type pebbleIter struct { @@ -52,10 +55,11 @@ type duplicateIter struct { nextKey []byte err error - engineFile *File + engine *Engine keyAdapter KeyAdapter writeBatch *pebble.Batch writeBatchSize int64 + logger log.Logger } func (d *duplicateIter) Seek(key []byte) bool { @@ -96,7 +100,7 @@ func (d *duplicateIter) flush() { } func (d *duplicateIter) record(key []byte, val []byte) { - d.engineFile.Duplicates.Inc() + d.engine.Duplicates.Inc() d.err = d.writeBatch.Set(key, val, nil) if d.err != nil { return @@ -120,7 +124,10 @@ func (d *duplicateIter) Next() bool { d.curVal = append(d.curVal[:0], d.iter.Value()...) return true } - log.L().Debug("duplicate key detected", logutil.Key("key", d.curKey)) + d.logger.Debug("[detect-dupe] local duplicate key detected", + logutil.Key("key", d.curKey), + logutil.Key("prevValue", d.curVal), + logutil.Key("value", d.iter.Value())) if !recordFirst { d.record(d.curRawKey, d.curVal) recordFirst = true @@ -163,7 +170,7 @@ func (d *duplicateIter) OpType() sst.Pair_OP { var _ kv.Iter = &duplicateIter{} -func newDuplicateIter(ctx context.Context, engineFile *File, opts *pebble.IterOptions) kv.Iter { +func newDuplicateIter(ctx context.Context, engine *Engine, opts *pebble.IterOptions) kv.Iter { newOpts := &pebble.IterOptions{TableFilter: opts.TableFilter} if len(opts.LowerBound) > 0 { newOpts.LowerBound = codec.EncodeBytes(nil, opts.LowerBound) @@ -171,23 +178,28 @@ func newDuplicateIter(ctx context.Context, engineFile *File, opts *pebble.IterOp if len(opts.UpperBound) > 0 { newOpts.UpperBound = codec.EncodeBytes(nil, opts.UpperBound) } + logger := log.With( + zap.String("table", common.UniqueTable(engine.tableInfo.DB, engine.tableInfo.Name)), + zap.Int64("tableID", engine.tableInfo.ID), + zap.Stringer("engineUUID", engine.UUID)) return &duplicateIter{ ctx: ctx, - iter: engineFile.db.NewIter(newOpts), - engineFile: engineFile, - keyAdapter: engineFile.keyAdapter, - writeBatch: engineFile.duplicateDB.NewBatch(), + iter: engine.db.NewIter(newOpts), + engine: engine, + keyAdapter: engine.keyAdapter, + writeBatch: engine.duplicateDB.NewBatch(), + logger: logger, } } -func newKeyIter(ctx context.Context, engineFile *File, opts *pebble.IterOptions) kv.Iter { +func newKVIter(ctx context.Context, engine *Engine, opts *pebble.IterOptions) kv.Iter { if bytes.Compare(opts.LowerBound, normalIterStartKey) < 0 { newOpts := *opts newOpts.LowerBound = normalIterStartKey opts = &newOpts } - if !engineFile.duplicateDetection { - return pebbleIter{Iterator: engineFile.db.NewIter(opts)} + if !engine.duplicateDetection { + return pebbleIter{Iterator: engine.db.NewIter(opts)} } - return newDuplicateIter(ctx, engineFile, opts) + return newDuplicateIter(ctx, engine, opts) } diff --git a/br/pkg/lightning/backend/local/iterator_test.go b/br/pkg/lightning/backend/local/iterator_test.go index 3c0077247971b..864d504844da1 100644 --- a/br/pkg/lightning/backend/local/iterator_test.go +++ b/br/pkg/lightning/backend/local/iterator_test.go @@ -24,6 +24,7 @@ import ( "github.com/cockroachdb/pebble" . "github.com/pingcap/check" + "github.com/pingcap/tidb/br/pkg/lightning/checkpoints" "github.com/pingcap/tidb/br/pkg/lightning/common" ) @@ -129,13 +130,17 @@ func (s *iteratorSuite) TestDuplicateIterator(c *C) { duplicateDB, err := pebble.Open(filepath.Join(storeDir, "duplicates"), &pebble.Options{}) c.Assert(err, IsNil) - engineFile := &File{ + engine := &Engine{ ctx: context.Background(), db: db, keyAdapter: keyAdapter, duplicateDB: duplicateDB, + tableInfo: &checkpoints.TidbTableInfo{ + DB: "db", + Name: "name", + }, } - iter := newDuplicateIter(context.Background(), engineFile, &pebble.IterOptions{}) + iter := newDuplicateIter(context.Background(), engine, &pebble.IterOptions{}) sort.Slice(pairs, func(i, j int) bool { key1 := keyAdapter.Encode(nil, pairs[i].Key, pairs[i].RowID, pairs[i].Offset) key2 := keyAdapter.Encode(nil, pairs[j].Key, pairs[j].RowID, pairs[j].Offset) @@ -162,7 +167,7 @@ func (s *iteratorSuite) TestDuplicateIterator(c *C) { c.Assert(iter.Error(), IsNil) c.Assert(len(uniqueKeys), Equals, 0) c.Assert(iter.Close(), IsNil) - c.Assert(engineFile.Close(), IsNil) + c.Assert(engine.Close(), IsNil) // Check duplicates detected by duplicate iterator. iter = pebbleIter{Iterator: duplicateDB.NewIter(&pebble.IterOptions{})} @@ -236,19 +241,23 @@ func (s *iteratorSuite) TestDuplicateIterSeek(c *C) { duplicateDB, err := pebble.Open(filepath.Join(storeDir, "duplicates"), &pebble.Options{}) c.Assert(err, IsNil) - engineFile := &File{ + engine := &Engine{ ctx: context.Background(), db: db, keyAdapter: keyAdapter, duplicateDB: duplicateDB, + tableInfo: &checkpoints.TidbTableInfo{ + DB: "db", + Name: "name", + }, } - iter := newDuplicateIter(context.Background(), engineFile, &pebble.IterOptions{}) + iter := newDuplicateIter(context.Background(), engine, &pebble.IterOptions{}) c.Assert(iter.Seek([]byte{1, 2, 3, 1}), IsTrue) c.Assert(iter.Value(), BytesEquals, pairs[1].Val) c.Assert(iter.Next(), IsTrue) c.Assert(iter.Value(), BytesEquals, pairs[3].Val) c.Assert(iter.Close(), IsNil) - c.Assert(engineFile.Close(), IsNil) + c.Assert(engine.Close(), IsNil) c.Assert(duplicateDB.Close(), IsNil) } diff --git a/br/pkg/lightning/backend/local/local.go b/br/pkg/lightning/backend/local/local.go index c536a1d666433..f4921da0fa55e 100644 --- a/br/pkg/lightning/backend/local/local.go +++ b/br/pkg/lightning/backend/local/local.go @@ -16,25 +16,18 @@ package local import ( "bytes" - "container/heap" "context" - "encoding/binary" - "encoding/json" "fmt" - "io" "math" "os" "path/filepath" - "sort" "strings" "sync" "time" "github.com/cockroachdb/pebble" - "github.com/cockroachdb/pebble/sstable" "github.com/coreos/go-semver/semver" "github.com/docker/go-units" - "github.com/google/btree" "github.com/google/uuid" "github.com/pingcap/errors" "github.com/pingcap/failpoint" @@ -44,7 +37,6 @@ import ( "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/tidb/br/pkg/lightning/backend" "github.com/pingcap/tidb/br/pkg/lightning/backend/kv" - "github.com/pingcap/tidb/br/pkg/lightning/checkpoints" "github.com/pingcap/tidb/br/pkg/lightning/common" "github.com/pingcap/tidb/br/pkg/lightning/config" "github.com/pingcap/tidb/br/pkg/lightning/errormanager" @@ -61,11 +53,12 @@ import ( "github.com/pingcap/tidb/br/pkg/utils" "github.com/pingcap/tidb/br/pkg/version" "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/util/codec" - "github.com/pingcap/tidb/util/hack" "github.com/tikv/client-go/v2/oracle" + tikvclient "github.com/tikv/client-go/v2/tikv" pd "github.com/tikv/pd/client" "go.uber.org/atomic" "go.uber.org/multierr" @@ -81,7 +74,6 @@ import ( const ( dialTimeout = 5 * time.Minute - bigValueSize = 1 << 16 // 64K maxRetryTimes = 5 defaultRetryBackoffTime = 3 * time.Second @@ -118,10 +110,8 @@ var ( errorEngineClosed = errors.New("engine is closed") ) -var ( - engineMetaKey = []byte{0, 'm', 'e', 't', 'a'} - normalIterStartKey = []byte{1} -) +// getImportClientFn is a variable alias for getImportClient used for unit test. +var getImportClientFn = getImportClient // Range record start and end key for localStoreDir.DB // so we can write it to tikv in streaming @@ -130,677 +120,13 @@ type Range struct { end []byte } -// localFileMeta contains some field that is necessary to continue the engine restore/import process. -// These field should be written to disk when we update chunk checkpoint -type localFileMeta struct { - TS uint64 `json:"ts"` - // Length is the number of KV pairs stored by the engine. - Length atomic.Int64 `json:"length"` - // TotalSize is the total pre-compressed KV byte size stored by engine. - TotalSize atomic.Int64 `json:"total_size"` - // Duplicates is the number of duplicates kv pairs detected when importing. Note that the value is - // probably larger than real value, because we may import same range more than once. For accurate - // information, you should iterate the duplicate db after import is finished. - Duplicates atomic.Int64 `json:"duplicates"` -} - -type importMutexState uint32 - -const ( - importMutexStateImport importMutexState = 1 << iota - importMutexStateClose - // importMutexStateReadLock is a special state because in this state we lock engine with read lock - // and add isImportingAtomic with this value. In other state, we directly store with the state value. - // so this must always the last value of this enum. - importMutexStateReadLock -) - -// either a sstMeta or a flush message -type metaOrFlush struct { - meta *sstMeta - flushCh chan struct{} -} - -type File struct { - localFileMeta - closed atomic.Bool - db *pebble.DB - UUID uuid.UUID - localWriters sync.Map - - // isImportingAtomic is an atomic variable indicating whether this engine is importing. - // This should not be used as a "spin lock" indicator. - isImportingAtomic atomic.Uint32 - // flush and ingest sst hold the rlock, other operation hold the wlock. - mutex sync.RWMutex - - ctx context.Context - cancel context.CancelFunc - sstDir string - sstMetasChan chan metaOrFlush - ingestErr common.OnceError - wg sync.WaitGroup - sstIngester sstIngester - finishedRanges syncedRanges - - // sst seq lock - seqLock sync.Mutex - // seq number for incoming sst meta - nextSeq int32 - // max seq of sst metas ingested into pebble - finishedMetaSeq atomic.Int32 - - config backend.LocalEngineConfig - tableInfo *checkpoints.TidbTableInfo - - // total size of SST files waiting to be ingested - pendingFileSize atomic.Int64 - - // statistics for pebble kv iter. - importedKVSize atomic.Int64 - importedKVCount atomic.Int64 - - keyAdapter KeyAdapter - duplicateDetection bool - duplicateDB *pebble.DB - errorMgr *errormanager.ErrorManager -} - -func (e *File) setError(err error) { - if err != nil { - e.ingestErr.Set(err) - e.cancel() - } -} - -func (e *File) Close() error { - log.L().Debug("closing local engine", zap.Stringer("engine", e.UUID), zap.Stack("stack")) - if e.db == nil { - return nil - } - err := errors.Trace(e.db.Close()) - e.db = nil - return err -} - -// Cleanup remove meta and db files -func (e *File) Cleanup(dataDir string) error { - if err := os.RemoveAll(e.sstDir); err != nil { - return errors.Trace(err) - } - - dbPath := filepath.Join(dataDir, e.UUID.String()) - return os.RemoveAll(dbPath) -} - -// Exist checks if db folder existing (meta sometimes won't flush before lightning exit) -func (e *File) Exist(dataDir string) error { - dbPath := filepath.Join(dataDir, e.UUID.String()) - if _, err := os.Stat(dbPath); err != nil { - return err - } - return nil -} - -func (e *File) getSizeProperties() (*sizeProperties, error) { - sstables, err := e.db.SSTables(pebble.WithProperties()) - if err != nil { - log.L().Warn("get table properties failed", zap.Stringer("engine", e.UUID), log.ShortError(err)) - return nil, errors.Trace(err) - } - - sizeProps := newSizeProperties() - for _, level := range sstables { - for _, info := range level { - if prop, ok := info.Properties.UserProperties[propRangeIndex]; ok { - data := hack.Slice(prop) - rangeProps, err := decodeRangeProperties(data) - if err != nil { - log.L().Warn("decodeRangeProperties failed", zap.Stringer("engine", e.UUID), - zap.Stringer("fileNum", info.FileNum), log.ShortError(err)) - return nil, errors.Trace(err) - } - if e.duplicateDetection { - newRangeProps := make(rangeProperties, 0, len(rangeProps)) - for _, p := range rangeProps { - if !bytes.Equal(p.Key, engineMetaKey) { - p.Key, _, _, err = e.keyAdapter.Decode(nil, p.Key) - if err != nil { - log.L().Warn( - "decodeRangeProperties failed because the props key is invalid", - zap.Stringer("engine", e.UUID), - zap.Stringer("fileNum", info.FileNum), - zap.Binary("key", p.Key), - ) - return nil, errors.Trace(err) - } - newRangeProps = append(newRangeProps, p) - } - } - rangeProps = newRangeProps - } - sizeProps.addAll(rangeProps) - } - } - } - - return sizeProps, nil -} - -func isStateLocked(state importMutexState) bool { - return state&(importMutexStateClose|importMutexStateImport) != 0 -} - -func (e *File) isLocked() bool { - // the engine is locked only in import or close state. - return isStateLocked(importMutexState(e.isImportingAtomic.Load())) -} - -func (e *File) getEngineFileSize() backend.EngineFileSize { - metrics := e.db.Metrics() - total := metrics.Total() - var memSize int64 - e.localWriters.Range(func(k, v interface{}) bool { - w := k.(*Writer) - if w.writer != nil { - memSize += int64(w.writer.writer.EstimatedSize()) - } else { - // if kvs are still in memory, only calculate half of the total size - // in our tests, SST file size is about 50% of the raw kv size - memSize += w.batchSize / 2 - } - - return true - }) - - pendingSize := e.pendingFileSize.Load() - // TODO: should also add the in-processing compaction sst writer size into MemSize - return backend.EngineFileSize{ - UUID: e.UUID, - DiskSize: total.Size + pendingSize, - MemSize: memSize, - IsImporting: e.isLocked(), - } -} - -// rLock locks the local file with shard read state. Only used for flush and ingest SST files. -func (e *File) rLock() { - e.mutex.RLock() - e.isImportingAtomic.Add(uint32(importMutexStateReadLock)) -} - -func (e *File) rUnlock() { - if e == nil { - return - } - - e.isImportingAtomic.Sub(uint32(importMutexStateReadLock)) - e.mutex.RUnlock() -} - -// lock locks the local file for importing. -func (e *File) lock(state importMutexState) { - e.mutex.Lock() - e.isImportingAtomic.Store(uint32(state)) -} - -// lockUnless tries to lock the local file unless it is already locked into the state given by -// ignoreStateMask. Returns whether the lock is successful. -func (e *File) lockUnless(newState, ignoreStateMask importMutexState) bool { - curState := e.isImportingAtomic.Load() - if curState&uint32(ignoreStateMask) != 0 { - return false - } - e.lock(newState) - return true -} - -// tryRLock tries to read-lock the local file unless it is already write locked. -// Returns whether the lock is successful. -func (e *File) tryRLock() bool { - curState := e.isImportingAtomic.Load() - // engine is in import/close state. - if isStateLocked(importMutexState(curState)) { - return false - } - e.rLock() - return true -} - -func (e *File) unlock() { - if e == nil { - return - } - e.isImportingAtomic.Store(0) - e.mutex.Unlock() -} - -type metaSeq struct { - // the sequence for this flush message, a flush call can return only if - // all the other flush will lower `flushSeq` are done - flushSeq int32 - // the max sstMeta sequence number in this flush, after the flush is done (all SSTs are ingested), - // we can save chunks will a lower meta sequence number safely. - metaSeq int32 -} - -type metaSeqHeap struct { - arr []metaSeq -} - -func (h *metaSeqHeap) Len() int { - return len(h.arr) -} - -func (h *metaSeqHeap) Less(i, j int) bool { - return h.arr[i].flushSeq < h.arr[j].flushSeq -} - -func (h *metaSeqHeap) Swap(i, j int) { - h.arr[i], h.arr[j] = h.arr[j], h.arr[i] -} - -func (h *metaSeqHeap) Push(x interface{}) { - h.arr = append(h.arr, x.(metaSeq)) -} - -func (h *metaSeqHeap) Pop() interface{} { - item := h.arr[len(h.arr)-1] - h.arr = h.arr[:len(h.arr)-1] - return item -} - -func (e *File) ingestSSTLoop() { - defer e.wg.Done() - - type flushSeq struct { - seq int32 - ch chan struct{} - } - - seq := atomic.NewInt32(0) - finishedSeq := atomic.NewInt32(0) - var seqLock sync.Mutex - // a flush is finished iff all the compaction&ingest tasks with a lower seq number are finished. - flushQueue := make([]flushSeq, 0) - // inSyncSeqs is a heap that stores all the finished compaction tasks whose seq is bigger than `finishedSeq + 1` - // this mean there are still at lease one compaction task with a lower seq unfinished. - inSyncSeqs := &metaSeqHeap{arr: make([]metaSeq, 0)} - - type metaAndSeq struct { - metas []*sstMeta - seq int32 - } - - concurrency := e.config.CompactConcurrency - // when compaction is disabled, ingest is an serial action, so 1 routine is enough - if !e.config.Compact { - concurrency = 1 - } - metaChan := make(chan metaAndSeq, concurrency) - for i := 0; i < concurrency; i++ { - e.wg.Add(1) - go func() { - defer e.wg.Done() - defer func() { - if e.ingestErr.Get() != nil { - seqLock.Lock() - for _, f := range flushQueue { - f.ch <- struct{}{} - } - flushQueue = flushQueue[:0] - seqLock.Unlock() - } - }() - for { - select { - case <-e.ctx.Done(): - return - case metas, ok := <-metaChan: - if !ok { - return - } - ingestMetas := metas.metas - if e.config.Compact { - newMeta, err := e.sstIngester.mergeSSTs(metas.metas, e.sstDir) - if err != nil { - e.setError(err) - return - } - ingestMetas = []*sstMeta{newMeta} - } - // batchIngestSSTs will change ingestMetas' order, so we record the max seq here - metasMaxSeq := ingestMetas[len(ingestMetas)-1].seq - - if err := e.batchIngestSSTs(ingestMetas); err != nil { - e.setError(err) - return - } - seqLock.Lock() - finSeq := finishedSeq.Load() - if metas.seq == finSeq+1 { - finSeq = metas.seq - finMetaSeq := metasMaxSeq - for len(inSyncSeqs.arr) > 0 { - if inSyncSeqs.arr[0].flushSeq == finSeq+1 { - finSeq++ - finMetaSeq = inSyncSeqs.arr[0].metaSeq - heap.Remove(inSyncSeqs, 0) - } else { - break - } - } - - var flushChans []chan struct{} - for _, seq := range flushQueue { - if seq.seq <= finSeq { - flushChans = append(flushChans, seq.ch) - } else { - break - } - } - flushQueue = flushQueue[len(flushChans):] - finishedSeq.Store(finSeq) - e.finishedMetaSeq.Store(finMetaSeq) - seqLock.Unlock() - for _, c := range flushChans { - c <- struct{}{} - } - } else { - heap.Push(inSyncSeqs, metaSeq{flushSeq: metas.seq, metaSeq: metasMaxSeq}) - seqLock.Unlock() - } - } - } - }() - } - - compactAndIngestSSTs := func(metas []*sstMeta) { - if len(metas) > 0 { - seqLock.Lock() - metaSeq := seq.Add(1) - seqLock.Unlock() - select { - case <-e.ctx.Done(): - case metaChan <- metaAndSeq{metas: metas, seq: metaSeq}: - } - } - } - - pendingMetas := make([]*sstMeta, 0, 16) - totalSize := int64(0) - metasTmp := make([]*sstMeta, 0) - addMetas := func() { - if len(metasTmp) == 0 { - return - } - metas := metasTmp - metasTmp = make([]*sstMeta, 0, len(metas)) - if !e.config.Compact { - compactAndIngestSSTs(metas) - return - } - for _, m := range metas { - if m.totalCount > 0 { - pendingMetas = append(pendingMetas, m) - totalSize += m.totalSize - if totalSize >= e.config.CompactThreshold { - compactMetas := pendingMetas - pendingMetas = make([]*sstMeta, 0, len(pendingMetas)) - totalSize = 0 - compactAndIngestSSTs(compactMetas) - } - } - } - } -readMetaLoop: - for { - closed := false - select { - case <-e.ctx.Done(): - close(metaChan) - return - case m, ok := <-e.sstMetasChan: - if !ok { - closed = true - break - } - if m.flushCh != nil { - // meet a flush event, we should trigger a ingest task if there are pending metas, - // and then waiting for all the running flush tasks to be done. - if len(metasTmp) > 0 { - addMetas() - } - if len(pendingMetas) > 0 { - seqLock.Lock() - metaSeq := seq.Add(1) - flushQueue = append(flushQueue, flushSeq{ch: m.flushCh, seq: metaSeq}) - seqLock.Unlock() - select { - case metaChan <- metaAndSeq{metas: pendingMetas, seq: metaSeq}: - case <-e.ctx.Done(): - close(metaChan) - return - } - - pendingMetas = make([]*sstMeta, 0, len(pendingMetas)) - totalSize = 0 - } else { - // none remaining metas needed to be ingested - seqLock.Lock() - curSeq := seq.Load() - finSeq := finishedSeq.Load() - // if all pending SST files are written, directly do a db.Flush - if curSeq == finSeq { - seqLock.Unlock() - m.flushCh <- struct{}{} - } else { - // waiting for pending compaction tasks - flushQueue = append(flushQueue, flushSeq{ch: m.flushCh, seq: curSeq}) - seqLock.Unlock() - } - } - continue readMetaLoop - } - metasTmp = append(metasTmp, m.meta) - // try to drain all the sst meta from the chan to make sure all the SSTs are processed before handle a flush msg. - if len(e.sstMetasChan) > 0 { - continue readMetaLoop - } - - addMetas() - } - if closed { - compactAndIngestSSTs(pendingMetas) - close(metaChan) - return - } - } -} - -func (e *File) addSST(ctx context.Context, m *sstMeta) (int32, error) { - // set pending size after SST file is generated - e.pendingFileSize.Add(m.fileSize) - // make sure sstMeta is sent into the chan in order - e.seqLock.Lock() - defer e.seqLock.Unlock() - e.nextSeq++ - seq := e.nextSeq - m.seq = seq - select { - case e.sstMetasChan <- metaOrFlush{meta: m}: - case <-ctx.Done(): - return 0, ctx.Err() - case <-e.ctx.Done(): - } - return seq, e.ingestErr.Get() -} - -func (e *File) batchIngestSSTs(metas []*sstMeta) error { - if len(metas) == 0 { - return nil - } - sort.Slice(metas, func(i, j int) bool { - return bytes.Compare(metas[i].minKey, metas[j].minKey) < 0 - }) - - metaLevels := make([][]*sstMeta, 0) - for _, meta := range metas { - inserted := false - for i, l := range metaLevels { - if bytes.Compare(l[len(l)-1].maxKey, meta.minKey) >= 0 { - continue - } - metaLevels[i] = append(l, meta) - inserted = true - break - } - if !inserted { - metaLevels = append(metaLevels, []*sstMeta{meta}) - } - } - - for _, l := range metaLevels { - if err := e.ingestSSTs(l); err != nil { - return err - } - } - return nil -} - -func (e *File) ingestSSTs(metas []*sstMeta) error { - // use raw RLock to avoid change the lock state during flushing. - e.mutex.RLock() - defer e.mutex.RUnlock() - if e.closed.Load() { - return errorEngineClosed - } - totalSize := int64(0) - totalCount := int64(0) - fileSize := int64(0) - for _, m := range metas { - totalSize += m.totalSize - totalCount += m.totalCount - fileSize += m.fileSize - } - log.L().Info("write data to local DB", - zap.Int64("size", totalSize), - zap.Int64("kvs", totalCount), - zap.Int("files", len(metas)), - zap.Int64("sstFileSize", fileSize), - zap.String("file", metas[0].path), - logutil.Key("firstKey", metas[0].minKey), - logutil.Key("lastKey", metas[len(metas)-1].maxKey)) - if err := e.sstIngester.ingest(metas); err != nil { - return errors.Trace(err) - } - count := int64(0) - size := int64(0) - for _, m := range metas { - count += m.totalCount - size += m.totalSize - } - e.Length.Add(count) - e.TotalSize.Add(size) - return nil -} - -func (e *File) flushLocalWriters(parentCtx context.Context) error { - eg, ctx := errgroup.WithContext(parentCtx) - e.localWriters.Range(func(k, v interface{}) bool { - eg.Go(func() error { - w := k.(*Writer) - return w.flush(ctx) - }) - return true - }) - return eg.Wait() -} - -func (e *File) flushEngineWithoutLock(ctx context.Context) error { - if err := e.flushLocalWriters(ctx); err != nil { - return err - } - flushChan := make(chan struct{}, 1) - select { - case e.sstMetasChan <- metaOrFlush{flushCh: flushChan}: - case <-ctx.Done(): - return ctx.Err() - case <-e.ctx.Done(): - return e.ctx.Err() - } - - select { - case <-flushChan: - case <-ctx.Done(): - return ctx.Err() - case <-e.ctx.Done(): - return e.ctx.Err() - } - if err := e.ingestErr.Get(); err != nil { - return errors.Trace(err) - } - if err := e.saveEngineMeta(); err != nil { - return err - } - - flushFinishedCh, err := e.db.AsyncFlush() - if err != nil { - return errors.Trace(err) - } - select { - case <-flushFinishedCh: - return nil - case <-ctx.Done(): - return ctx.Err() - case <-e.ctx.Done(): - return e.ctx.Err() - } -} - -func saveEngineMetaToDB(meta *localFileMeta, db *pebble.DB) error { - jsonBytes, err := json.Marshal(meta) - if err != nil { - return errors.Trace(err) - } - // note: we can't set Sync to true since we disabled WAL. - return db.Set(engineMetaKey, jsonBytes, &pebble.WriteOptions{Sync: false}) -} - -// saveEngineMeta saves the metadata about the DB into the DB itself. -// This method should be followed by a Flush to ensure the data is actually synchronized -func (e *File) saveEngineMeta() error { - log.L().Debug("save engine meta", zap.Stringer("uuid", e.UUID), zap.Int64("count", e.Length.Load()), - zap.Int64("size", e.TotalSize.Load())) - return errors.Trace(saveEngineMetaToDB(&e.localFileMeta, e.db)) -} - -func (e *File) loadEngineMeta() error { - jsonBytes, closer, err := e.db.Get(engineMetaKey) - if err != nil { - if err == pebble.ErrNotFound { - log.L().Debug("local db missing engine meta", zap.Stringer("uuid", e.UUID), zap.Error(err)) - return nil - } - return err - } - defer closer.Close() - - if err = json.Unmarshal(jsonBytes, &e.localFileMeta); err != nil { - log.L().Warn("local db failed to deserialize meta", zap.Stringer("uuid", e.UUID), zap.ByteString("content", jsonBytes), zap.Error(err)) - return err - } - log.L().Debug("load engine meta", zap.Stringer("uuid", e.UUID), zap.Int64("count", e.Length.Load()), - zap.Int64("size", e.TotalSize.Load())) - return nil -} - type local struct { - engines sync.Map // sync version of map[uuid.UUID]*File + engines sync.Map // sync version of map[uuid.UUID]*Engine pdCtl *pdutil.PdController conns common.GRPCConns splitCli split.SplitClient + tikvCli *tikvclient.KVStore tls *common.TLS pdAddr string g glue.Glue @@ -825,70 +151,16 @@ type local struct { errorMgr *errormanager.ErrorManager } -// connPool is a lazy pool of gRPC channels. -// When `Get` called, it lazily allocates new connection if connection not full. -// If it's full, then it will return allocated channels round-robin. -type connPool struct { - mu sync.Mutex - - conns []*grpc.ClientConn - next int - cap int - newConn func(ctx context.Context) (*grpc.ClientConn, error) -} - -func (p *connPool) takeConns() (conns []*grpc.ClientConn) { - p.mu.Lock() - defer p.mu.Unlock() - p.conns, conns = nil, p.conns - p.next = 0 - return conns -} - -// Close closes the conn pool. -func (p *connPool) Close() { - for _, c := range p.takeConns() { - if err := c.Close(); err != nil { - log.L().Warn("failed to close clientConn", zap.String("target", c.Target()), log.ShortError(err)) - } - } -} - -// get tries to get an existing connection from the pool, or make a new one if the pool not full. -func (p *connPool) get(ctx context.Context) (*grpc.ClientConn, error) { - p.mu.Lock() - defer p.mu.Unlock() - if len(p.conns) < p.cap { - c, err := p.newConn(ctx) - if err != nil { - return nil, errors.Trace(err) - } - p.conns = append(p.conns, c) - return c, nil - } - - conn := p.conns[p.next] - p.next = (p.next + 1) % p.cap - return conn, nil -} - -// newConnPool creates a new connPool by the specified conn factory function and capacity. -func newConnPool(cap int, newConn func(ctx context.Context) (*grpc.ClientConn, error)) *connPool { - return &connPool{ - cap: cap, - conns: make([]*grpc.ClientConn, 0, cap), - newConn: newConn, - - mu: sync.Mutex{}, - } -} - var bufferPool = membuf.NewPool(1024, manual.Allocator{}) func openDuplicateDB(storeDir string) (*pebble.DB, error) { dbPath := filepath.Join(storeDir, duplicateDBName) // TODO: Optimize the opts for better write. - opts := &pebble.Options{} + opts := &pebble.Options{ + TablePropertyCollectors: []func() pebble.TablePropertyCollector{ + newRangePropertiesCollector, + }, + } return pebble.Open(dbPath, opts) } @@ -929,17 +201,30 @@ func NewLocalBackend( } var duplicateDB *pebble.DB - if cfg.TikvImporter.DuplicateDetection { + if cfg.TikvImporter.DuplicateResolution != config.DupeResAlgNone { duplicateDB, err = openDuplicateDB(localFile) if err != nil { return backend.MakeBackend(nil), errors.Annotate(err, "open duplicate db failed") } } + // The following copies tikv.NewTxnClient without creating yet another pdClient. + spkv, err := tikvclient.NewEtcdSafePointKV(strings.Split(cfg.TiDB.PdAddr, ","), tls.TLSConfig()) + if err != nil { + return backend.MakeBackend(nil), err + } + rpcCli := tikvclient.NewRPCClient(tikvclient.WithSecurity(tls.ToTiKVSecurityConfig())) + pdCliForTiKV := &tikvclient.CodecPDClient{Client: pdCtl.GetPDClient()} + tikvCli, err := tikvclient.NewKVStore("lightning-local-backend", pdCliForTiKV, spkv, rpcCli) + if err != nil { + return backend.MakeBackend(nil), err + } + local := &local{ engines: sync.Map{}, pdCtl: pdCtl, splitCli: splitCli, + tikvCli: tikvCli, tls: tls, pdAddr: cfg.TiDB.PdAddr, g: g, @@ -954,28 +239,28 @@ func NewLocalBackend( engineMemCacheSize: int(cfg.TikvImporter.EngineMemCacheSize), localWriterMemCacheSize: int64(cfg.TikvImporter.LocalWriterMemCacheSize), - duplicateDetection: cfg.TikvImporter.DuplicateDetection, + duplicateDetection: cfg.TikvImporter.DuplicateResolution != config.DupeResAlgNone, checkTiKVAvaliable: cfg.App.CheckRequirements, duplicateDB: duplicateDB, errorMgr: errorMgr, } local.conns = common.NewGRPCConns() - if err = local.checkMultiIngestSupport(ctx, pdCtl); err != nil { + if err = local.checkMultiIngestSupport(ctx); err != nil { return backend.MakeBackend(nil), err } return backend.MakeBackend(local), nil } -func (local *local) checkMultiIngestSupport(ctx context.Context, pdCtl *pdutil.PdController) error { - stores, err := pdCtl.GetPDClient().GetAllStores(ctx, pd.WithExcludeTombstone()) +func (local *local) checkMultiIngestSupport(ctx context.Context) error { + stores, err := local.pdCtl.GetPDClient().GetAllStores(ctx, pd.WithExcludeTombstone()) if err != nil { return errors.Trace(err) } hasTiFlash := false for _, s := range stores { - if version.IsTiFlash(s) { + if s.State == metapb.StoreState_Up && version.IsTiFlash(s) { hasTiFlash = true break } @@ -1032,31 +317,31 @@ func (local *local) checkMultiIngestSupport(ctx context.Context, pdCtl *pdutil.P return nil } -// rlock read locks a local file and returns the File instance if it exists. -func (local *local) rLockEngine(engineId uuid.UUID) *File { +// rlock read locks a local file and returns the Engine instance if it exists. +func (local *local) rLockEngine(engineId uuid.UUID) *Engine { if e, ok := local.engines.Load(engineId); ok { - engine := e.(*File) + engine := e.(*Engine) engine.rLock() return engine } return nil } -// lock locks a local file and returns the File instance if it exists. -func (local *local) lockEngine(engineID uuid.UUID, state importMutexState) *File { +// lock locks a local file and returns the Engine instance if it exists. +func (local *local) lockEngine(engineID uuid.UUID, state importMutexState) *Engine { if e, ok := local.engines.Load(engineID); ok { - engine := e.(*File) + engine := e.(*Engine) engine.lock(state) return engine } return nil } -// tryRLockAllEngines tries to read lock all engines, return all `File`s that are successfully locked. -func (local *local) tryRLockAllEngines() []*File { - var allEngines []*File +// tryRLockAllEngines tries to read lock all engines, return all `Engine`s that are successfully locked. +func (local *local) tryRLockAllEngines() []*Engine { + var allEngines []*Engine local.engines.Range(func(k, v interface{}) bool { - engine := v.(*File) + engine := v.(*Engine) // skip closed engine if engine.tryRLock() { if !engine.closed.Load() { @@ -1072,10 +357,10 @@ func (local *local) tryRLockAllEngines() []*File { // lockAllEnginesUnless tries to lock all engines, unless those which are already locked in the // state given by ignoreStateMask. Returns the list of locked engines. -func (local *local) lockAllEnginesUnless(newState, ignoreStateMask importMutexState) []*File { - var allEngines []*File +func (local *local) lockAllEnginesUnless(newState, ignoreStateMask importMutexState) []*Engine { + var allEngines []*Engine local.engines.Range(func(k, v interface{}) bool { - engine := v.(*File) + engine := v.(*Engine) if engine.lockUnless(newState, ignoreStateMask) { allEngines = append(allEngines, engine) } @@ -1173,21 +458,24 @@ func (local *local) Close() { log.L().Warn("remove local db file failed", zap.Error(err)) } } + + local.tikvCli.Close() + local.pdCtl.Close() } // FlushEngine ensure the written data is saved successfully, to make sure no data lose after restart func (local *local) FlushEngine(ctx context.Context, engineID uuid.UUID) error { - engineFile := local.rLockEngine(engineID) + engine := local.rLockEngine(engineID) // the engine cannot be deleted after while we've acquired the lock identified by UUID. - if engineFile == nil { + if engine == nil { return errors.Errorf("engine '%s' not found", engineID) } - defer engineFile.rUnlock() - if engineFile.closed.Load() { + defer engine.rUnlock() + if engine.closed.Load() { return nil } - return engineFile.flushEngineWithoutLock(ctx) + return engine.flushEngineWithoutLock(ctx) } func (local *local) FlushAllEngines(parentCtx context.Context) (err error) { @@ -1199,10 +487,10 @@ func (local *local) FlushAllEngines(parentCtx context.Context) (err error) { }() eg, ctx := errgroup.WithContext(parentCtx) - for _, engineFile := range allEngines { - ef := engineFile + for _, engine := range allEngines { + e := engine eg.Go(func() error { - return ef.flushEngineWithoutLock(ctx) + return e.flushEngineWithoutLock(ctx) }) } return eg.Wait() @@ -1245,7 +533,7 @@ func (local *local) openEngineDB(engineUUID uuid.UUID, readOnly bool) (*pebble.D return db, errors.Trace(err) } -// This method must be called with holding mutex of File +// OpenEngine must be called with holding mutex of Engine. func (local *local) OpenEngine(ctx context.Context, cfg *backend.EngineConfig, engineUUID uuid.UUID) error { engineCfg := backend.LocalEngineConfig{} if cfg.Local != nil { @@ -1271,7 +559,7 @@ func (local *local) OpenEngine(ctx context.Context, cfg *backend.EngineConfig, e if local.duplicateDetection { keyAdapter = duplicateKeyAdapter{} } - e, _ := local.engines.LoadOrStore(engineUUID, &File{ + e, _ := local.engines.LoadOrStore(engineUUID, &Engine{ UUID: engineUUID, sstDir: sstDir, sstMetasChan: make(chan metaOrFlush, 64), @@ -1284,7 +572,7 @@ func (local *local) OpenEngine(ctx context.Context, cfg *backend.EngineConfig, e errorMgr: local.errorMgr, keyAdapter: keyAdapter, }) - engine := e.(*File) + engine := e.(*Engine) engine.db = db engine.sstIngester = dbSSTIngester{e: engine} if err = engine.loadEngineMeta(); err != nil { @@ -1298,7 +586,7 @@ func (local *local) OpenEngine(ctx context.Context, cfg *backend.EngineConfig, e return nil } -func (local *local) allocateTSIfNotExists(ctx context.Context, engine *File) error { +func (local *local) allocateTSIfNotExists(ctx context.Context, engine *Engine) error { if engine.TS > 0 { return nil } @@ -1315,53 +603,63 @@ func (local *local) allocateTSIfNotExists(ctx context.Context, engine *File) err func (local *local) CloseEngine(ctx context.Context, cfg *backend.EngineConfig, engineUUID uuid.UUID) error { // flush mem table to storage, to free memory, // ask others' advise, looks like unnecessary, but with this we can control memory precisely. - engine, ok := local.engines.Load(engineUUID) + engineI, ok := local.engines.Load(engineUUID) if !ok { // recovery mode, we should reopen this engine file db, err := local.openEngineDB(engineUUID, true) if err != nil { return err } - engineFile := &File{ + engine := &Engine{ UUID: engineUUID, db: db, sstMetasChan: make(chan metaOrFlush), tableInfo: cfg.TableInfo, duplicateDetection: local.duplicateDetection, + duplicateDB: local.duplicateDB, errorMgr: local.errorMgr, } - engineFile.sstIngester = dbSSTIngester{e: engineFile} - if err = engineFile.loadEngineMeta(); err != nil { + engine.sstIngester = dbSSTIngester{e: engine} + keyAdapter := KeyAdapter(noopKeyAdapter{}) + if local.duplicateDetection { + keyAdapter = duplicateKeyAdapter{} + } + engine.keyAdapter = keyAdapter + if err = engine.loadEngineMeta(); err != nil { return err } - local.engines.Store(engineUUID, engineFile) + local.engines.Store(engineUUID, engine) return nil } - engineFile := engine.(*File) - engineFile.rLock() - if engineFile.closed.Load() { - engineFile.rUnlock() + engine := engineI.(*Engine) + engine.rLock() + if engine.closed.Load() { + engine.rUnlock() return nil } - err := engineFile.flushEngineWithoutLock(ctx) - engineFile.rUnlock() + err := engine.flushEngineWithoutLock(ctx) + engine.rUnlock() // use mutex to make sure we won't close sstMetasChan while other routines // trying to do flush. - engineFile.lock(importMutexStateClose) - engineFile.closed.Store(true) - close(engineFile.sstMetasChan) - engineFile.unlock() + engine.lock(importMutexStateClose) + engine.closed.Store(true) + close(engine.sstMetasChan) + engine.unlock() if err != nil { return errors.Trace(err) } - engineFile.wg.Wait() - return engineFile.ingestErr.Get() + engine.wg.Wait() + return engine.ingestErr.Get() } func (local *local) getImportClient(ctx context.Context, storeID uint64) (sst.ImportSSTClient, error) { + return getImportClientFn(local, ctx, storeID) +} + +func getImportClient(local *local, ctx context.Context, storeID uint64) (sst.ImportSSTClient, error) { conn, err := local.getGrpcConn(ctx, storeID) if err != nil { return nil, err @@ -1379,7 +677,7 @@ type rangeStats struct { // tikv will takes the responsibility to do so. func (local *local) WriteToTiKV( ctx context.Context, - engineFile *File, + engine *Engine, region *split.RegionInfo, start, end []byte, regionSplitSize int64, @@ -1412,7 +710,7 @@ func (local *local) WriteToTiKV( begin := time.Now() regionRange := intersectRange(region.Region, Range{start: start, end: end}) opt := &pebble.IterOptions{LowerBound: regionRange.start, UpperBound: regionRange.end} - iter := newKeyIter(ctx, engineFile, opt) + iter := newKVIter(ctx, engine, opt) defer iter.Close() stats := rangeStats{} @@ -1470,7 +768,7 @@ func (local *local) WriteToTiKV( } req.Chunk = &sst.WriteRequest_Batch{ Batch: &sst.WriteBatch{ - CommitTs: engineFile.TS, + CommitTs: engine.TS, }, } clients = append(clients, wstream) @@ -1645,8 +943,8 @@ func splitRangeBySizeProps(fullRange Range, sizeProps *sizeProperties, sizeLimit return ranges } -func (local *local) readAndSplitIntoRange(ctx context.Context, engineFile *File, regionSplitSize int64, regionSplitKeys int64) ([]Range, error) { - iter := newKeyIter(ctx, engineFile, &pebble.IterOptions{}) +func (local *local) readAndSplitIntoRange(ctx context.Context, engine *Engine, regionSplitSize int64, regionSplitKeys int64) ([]Range, error) { + iter := newKVIter(ctx, engine, &pebble.IterOptions{}) defer iter.Close() iterError := func(e string) error { @@ -1670,8 +968,8 @@ func (local *local) readAndSplitIntoRange(ctx context.Context, engineFile *File, } endKey := nextKey(lastKey) - engineFileTotalSize := engineFile.TotalSize.Load() - engineFileLength := engineFile.Length.Load() + engineFileTotalSize := engine.TotalSize.Load() + engineFileLength := engine.Length.Load() // <= 96MB no need to split into range if engineFileTotalSize <= regionSplitSize && engineFileLength <= regionSplitKeys { @@ -1679,7 +977,7 @@ func (local *local) readAndSplitIntoRange(ctx context.Context, engineFile *File, return ranges, nil } - sizeProps, err := engineFile.getSizeProperties() + sizeProps, err := engine.getSizeProperties() if err != nil { return nil, errors.Trace(err) } @@ -1687,7 +985,7 @@ func (local *local) readAndSplitIntoRange(ctx context.Context, engineFile *File, ranges := splitRangeBySizeProps(Range{start: firstKey, end: endKey}, sizeProps, regionSplitSize, regionSplitKeys) - log.L().Info("split engine key ranges", zap.Stringer("engine", engineFile.UUID), + log.L().Info("split engine key ranges", zap.Stringer("engine", engine.UUID), zap.Int64("totalSize", engineFileTotalSize), zap.Int64("totalCount", engineFileLength), logutil.Key("firstKey", firstKey), logutil.Key("lastKey", lastKey), zap.Int("ranges", len(ranges))) @@ -1697,7 +995,7 @@ func (local *local) readAndSplitIntoRange(ctx context.Context, engineFile *File, func (local *local) writeAndIngestByRange( ctxt context.Context, - engineFile *File, + engine *Engine, start, end []byte, regionSplitSize int64, regionSplitKeys int64, @@ -1707,7 +1005,7 @@ func (local *local) writeAndIngestByRange( UpperBound: end, } - iter := newKeyIter(ctxt, engineFile, ito) + iter := newKVIter(ctxt, engine, ito) defer iter.Close() // Needs seek to first because NewIter returns an iterator that is unpositioned hasKey := iter.First() @@ -1718,7 +1016,7 @@ func (local *local) writeAndIngestByRange( log.L().Info("There is no pairs in iterator", logutil.Key("start", start), logutil.Key("end", end)) - engineFile.finishedRanges.add(Range{start: start, end: end}) + engine.finishedRanges.add(Range{start: start, end: end}) return nil } pairStart := append([]byte{}, iter.Key()...) @@ -1759,7 +1057,7 @@ WriteAndIngest: zap.Binary("end", region.Region.GetEndKey()), zap.Reflect("peers", region.Region.GetPeers())) w := local.ingestConcurrency.Apply() - err = local.writeAndIngestPairs(ctx, engineFile, region, pairStart, end, regionSplitSize, regionSplitKeys) + err = local.writeAndIngestPairs(ctx, engine, region, pairStart, end, regionSplitSize, regionSplitKeys) local.ingestConcurrency.Recycle(w) if err != nil { if common.IsContextCanceledError(err) { @@ -1794,7 +1092,7 @@ const ( func (local *local) writeAndIngestPairs( ctx context.Context, - engineFile *File, + engine *Engine, region *split.RegionInfo, start, end []byte, regionSplitSize int64, @@ -1807,7 +1105,7 @@ loopWrite: var metas []*sst.SSTMeta var finishedRange Range var rangeStats rangeStats - metas, finishedRange, rangeStats, err = local.WriteToTiKV(ctx, engineFile, region, start, end, regionSplitSize, regionSplitKeys) + metas, finishedRange, rangeStats, err = local.WriteToTiKV(ctx, engine, region, start, end, regionSplitSize, regionSplitKeys) if err != nil { if common.IsContextCanceledError(err) { return err @@ -1903,9 +1201,9 @@ loopWrite: logutil.Region(region.Region), logutil.Key("start", start), logutil.Key("end", end)) } else { - engineFile.importedKVSize.Add(rangeStats.totalBytes) - engineFile.importedKVCount.Add(rangeStats.count) - engineFile.finishedRanges.add(finishedRange) + engine.importedKVSize.Add(rangeStats.totalBytes) + engine.importedKVCount.Add(rangeStats.count) + engine.finishedRanges.add(finishedRange) metric.BytesCounter.WithLabelValues(metric.TableStateImported).Add(float64(rangeStats.totalBytes)) } return errors.Trace(err) @@ -1914,10 +1212,10 @@ loopWrite: return errors.Trace(err) } -func (local *local) writeAndIngestByRanges(ctx context.Context, engineFile *File, ranges []Range, regionSplitSize int64, regionSplitKeys int64) error { - if engineFile.Length.Load() == 0 { +func (local *local) writeAndIngestByRanges(ctx context.Context, engine *Engine, ranges []Range, regionSplitSize int64, regionSplitKeys int64) error { + if engine.Length.Load() == 0 { // engine is empty, this is likes because it's a index engine but the table contains no index - log.L().Info("engine contains no data", zap.Stringer("uuid", engineFile.UUID)) + log.L().Info("engine contains no data", zap.Stringer("uuid", engine.UUID)) return nil } log.L().Debug("the ranges Length write to tikv", zap.Int("Length", len(ranges))) @@ -1946,7 +1244,7 @@ func (local *local) writeAndIngestByRanges(ctx context.Context, engineFile *File // max retry backoff time: 2+4+8+16=30s backOffTime := time.Second for i := 0; i < maxRetryTimes; i++ { - err = local.writeAndIngestByRange(ctx, engineFile, startKey, endKey, regionSplitSize, regionSplitKeys) + err = local.writeAndIngestByRange(ctx, engine, startKey, endKey, regionSplitSize, regionSplitKeys) if err == nil || common.IsContextCanceledError(err) { return } @@ -1975,23 +1273,6 @@ func (local *local) writeAndIngestByRanges(ctx context.Context, engineFile *File return allErr } -type syncedRanges struct { - sync.Mutex - ranges []Range -} - -func (r *syncedRanges) add(g Range) { - r.Lock() - r.ranges = append(r.ranges, g) - r.Unlock() -} - -func (r *syncedRanges) reset() { - r.Lock() - r.ranges = r.ranges[:0] - r.Unlock() -} - func (local *local) ImportEngine(ctx context.Context, engineUUID uuid.UUID, regionSplitSize int64) error { lf := local.lockEngine(engineUUID, importMutexStateImport) if lf == nil { @@ -2068,110 +1349,139 @@ func (local *local) ImportEngine(ctx context.Context, engineUUID uuid.UUID, regi return nil } -func (local *local) CollectLocalDuplicateRows(ctx context.Context, tbl table.Table) (bool, error) { +func (local *local) CollectLocalDuplicateRows(ctx context.Context, tbl table.Table, tableName string, opts *kv.SessionOptions) (hasDupe bool, err error) { if local.duplicateDB == nil { return false, nil } - log.L().Info("Begin collect duplicate local keys", zap.String("table", tbl.Meta().Name.String())) + + logger := log.With(zap.String("table", tableName)).Begin(zap.InfoLevel, "[detect-dupe] collect duplicate local keys") + defer func() { + logger.End(zap.ErrorLevel, err) + }() + physicalTS, logicalTS, err := local.pdCtl.GetPDClient().GetTS(ctx) if err != nil { return false, err } ts := oracle.ComposeTS(physicalTS, logicalTS) - duplicateManager, err := NewDuplicateManager(local.errorMgr, local.splitCli, ts, local.tls, local.tcpConcurrency) + duplicateManager, err := NewDuplicateManager(local, ts, opts) if err != nil { return false, errors.Annotate(err, "open duplicatemanager failed") } - hasDupe, err := duplicateManager.CollectDuplicateRowsFromLocalIndex(ctx, tbl, local.duplicateDB) + hasDupe, err = duplicateManager.CollectDuplicateRowsFromLocalIndex(ctx, tbl, tableName, local.duplicateDB) if err != nil { return false, errors.Annotate(err, "collect local duplicate rows failed") } return hasDupe, nil } -func (local *local) CollectRemoteDuplicateRows(ctx context.Context, tbl table.Table) (bool, error) { - log.L().Info("Begin collect remote duplicate keys", zap.String("table", tbl.Meta().Name.String())) +func (local *local) CollectRemoteDuplicateRows(ctx context.Context, tbl table.Table, tableName string, opts *kv.SessionOptions) (bool, error) { + log.L().Info("Begin collect remote duplicate keys", zap.String("table", tableName)) physicalTS, logicalTS, err := local.pdCtl.GetPDClient().GetTS(ctx) if err != nil { return false, err } ts := oracle.ComposeTS(physicalTS, logicalTS) - duplicateManager, err := NewDuplicateManager(local.errorMgr, local.splitCli, ts, local.tls, local.tcpConcurrency) + duplicateManager, err := NewDuplicateManager(local, ts, opts) if err != nil { return false, errors.Annotate(err, "open duplicatemanager failed") } - hasDupe, err := duplicateManager.CollectDuplicateRowsFromTiKV(ctx, tbl) + hasDupe, err := duplicateManager.CollectDuplicateRowsFromTiKV(ctx, tbl, tableName) if err != nil { return false, errors.Annotate(err, "collect remote duplicate rows failed") } return hasDupe, nil } -func (e *File) unfinishedRanges(ranges []Range) []Range { - e.finishedRanges.Lock() - defer e.finishedRanges.Unlock() - - e.finishedRanges.ranges = sortAndMergeRanges(e.finishedRanges.ranges) - - return filterOverlapRange(ranges, e.finishedRanges.ranges) -} +func (local *local) ResolveDuplicateRows(ctx context.Context, tbl table.Table, tableName string, algorithm config.DuplicateResolutionAlgorithm) (err error) { + logger := log.With(zap.String("table", tableName)).Begin(zap.InfoLevel, "[resolve-dupe] resolve duplicate rows") + defer func() { + logger.End(zap.ErrorLevel, err) + }() -// sortAndMergeRanges sort the ranges and merge range that overlaps with each other into a single range. -func sortAndMergeRanges(ranges []Range) []Range { - if len(ranges) == 0 { - return ranges + switch algorithm { + case config.DupeResAlgRecord, config.DupeResAlgNone: + logger.Warn("[resolve-dupe] skipping resolution due to selected algorithm. this table will become inconsistent!", zap.Stringer("algorithm", algorithm)) + return nil + case config.DupeResAlgRemove: + break + default: + panic(fmt.Sprintf("[resolve-dupe] unknown resolution algorithm %v", algorithm)) } - sort.Slice(ranges, func(i, j int) bool { - return bytes.Compare(ranges[i].start, ranges[j].start) < 0 + // TODO: reuse the *kv.SessionOptions from NewEncoder for picking the correct time zone. + decoder, err := kv.NewTableKVDecoder(tbl, tableName, &kv.SessionOptions{ + SQLMode: mysql.ModeStrictAllTables, }) + if err != nil { + return err + } - curEnd := ranges[0].end - i := 0 - for j := 1; j < len(ranges); j++ { - if bytes.Compare(curEnd, ranges[j].start) >= 0 { - if bytes.Compare(curEnd, ranges[j].end) < 0 { - curEnd = ranges[j].end - } - } else { - ranges[i].end = curEnd - i++ - ranges[i].start = ranges[j].start - curEnd = ranges[j].end + preRowID := int64(0) + for { + handleRows, lastRowID, err := local.errorMgr.GetConflictKeys(ctx, tableName, preRowID, 1000) + if err != nil { + return errors.Annotate(err, "cannot query conflict keys") + } + if len(handleRows) == 0 { + break } + if err := local.deleteDuplicateRows(ctx, logger, handleRows, decoder); err != nil { + return errors.Annotate(err, "cannot delete duplicated entries") + } + preRowID = lastRowID } - ranges[i].end = curEnd - return ranges[:i+1] + return nil } -func filterOverlapRange(ranges []Range, finishedRanges []Range) []Range { - if len(ranges) == 0 || len(finishedRanges) == 0 { - return ranges +func (local *local) deleteDuplicateRows(ctx context.Context, logger *log.Task, handleRows [][2][]byte, decoder *kv.TableKVDecoder) (err error) { + // Starts a Delete transaction. + txn, err := local.tikvCli.Begin() + if err != nil { + return err } - - result := make([]Range, 0) - for _, r := range ranges { - start := r.start - end := r.end - for len(finishedRanges) > 0 && bytes.Compare(finishedRanges[0].start, end) < 0 { - fr := finishedRanges[0] - if bytes.Compare(fr.start, start) > 0 { - result = append(result, Range{start: start, end: fr.start}) - } - if bytes.Compare(fr.end, start) > 0 { - start = fr.end - } - if bytes.Compare(fr.end, end) > 0 { - break + txn.SetPessimistic(true) + defer func() { + if err == nil { + err = txn.Commit(ctx) + } else { + if rollbackErr := txn.Rollback(); rollbackErr != nil { + logger.Warn("failed to rollback transaction", zap.Error(rollbackErr)) } - finishedRanges = finishedRanges[1:] } - if bytes.Compare(start, end) < 0 { - result = append(result, Range{start: start, end: end}) + }() + + deleteKey := func(key []byte) error { + logger.Debug("[resolve-dupe] will delete key", logutil.Key("key", key)) + return txn.Delete(key) + } + + // Collect all rows & index keys into the deletion transaction. + // (if the number of duplicates is small this should fit entirely in memory) + // (Txn's MemBuf's bufferSizeLimit is currently infinity) + for _, handleRow := range handleRows { + logger.Debug("[resolve-dupe] found row to resolve", + logutil.Key("handle", handleRow[0]), + logutil.Key("row", handleRow[1])) + + if err := deleteKey(handleRow[0]); err != nil { + return err + } + + handle, err := decoder.DecodeHandleFromTable(handleRow[0]) + if err != nil { + return err + } + + err = decoder.IterRawIndexKeys(handle, handleRow[1], deleteKey) + if err != nil { + return err } } - return result + + logger.Info("[resolve-dupe] number of KV pairs to be deleted", zap.Int("count", txn.Len())) + return nil } func (local *local) ResetEngine(ctx context.Context, engineUUID uuid.UUID) error { @@ -2190,15 +1500,15 @@ func (local *local) ResetEngine(ctx context.Context, engineUUID uuid.UUID) error } db, err := local.openEngineDB(engineUUID, false) if err == nil { - // Reset localFileMeta except `Duplicates`. - meta := localFileMeta{ - Duplicates: *atomic.NewInt64(localEngine.localFileMeta.Duplicates.Load()), + // Reset engineMeta except `Duplicates`. + meta := engineMeta{ + Duplicates: *atomic.NewInt64(localEngine.engineMeta.Duplicates.Load()), } if err := saveEngineMetaToDB(&meta, db); err != nil { return errors.Trace(err) } localEngine.db = db - localEngine.localFileMeta = meta + localEngine.engineMeta = meta if !common.IsDirExists(localEngine.sstDir) { if err := os.Mkdir(localEngine.sstDir, 0o755); err != nil { return errors.Trace(err) @@ -2242,11 +1552,9 @@ func (local *local) CleanupEngine(ctx context.Context, engineUUID uuid.UUID) err } func (local *local) CheckRequirements(ctx context.Context, checkCtx *backend.CheckCtx) error { - versionStr, err := local.g.GetSQLExecutor().ObtainStringWithLog( - ctx, - "SELECT version();", - "check TiDB version", - log.L()) + // TODO: support lightning via SQL + db, _ := local.g.GetDB() + versionStr, err := version.FetchVersion(ctx, db) if err != nil { return errors.Trace(err) } @@ -2260,8 +1568,8 @@ func (local *local) CheckRequirements(ctx context.Context, checkCtx *backend.Che return err } - tidbVersion, _ := version.ExtractTiDBVersion(versionStr) - return checkTiFlashVersion(ctx, local.g, checkCtx, *tidbVersion) + serverInfo := version.ParseServerInfo(versionStr) + return checkTiFlashVersion(ctx, local.g, checkCtx, *serverInfo.ServerVersion) } func checkTiDBVersion(_ context.Context, versionStr string, requiredMinVersion, requiredMaxVersion semver.Version) error { @@ -2349,13 +1657,13 @@ func (local *local) LocalWriter(ctx context.Context, cfg *backend.LocalWriterCon if !ok { return nil, errors.Errorf("could not find engine for %s", engineUUID.String()) } - engineFile := e.(*File) - return openLocalWriter(cfg, engineFile, local.localWriterMemCacheSize) + engine := e.(*Engine) + return openLocalWriter(cfg, engine, local.localWriterMemCacheSize) } -func openLocalWriter(cfg *backend.LocalWriterConfig, f *File, cacheSize int64) (*Writer, error) { +func openLocalWriter(cfg *backend.LocalWriterConfig, engine *Engine, cacheSize int64) (*Writer, error) { w := &Writer{ - local: f, + engine: engine, memtableSizeLimit: cacheSize, kvBuffer: bufferPool.NewBuffer(), isKVSorted: cfg.IsKVSorted, @@ -2366,7 +1674,7 @@ func openLocalWriter(cfg *backend.LocalWriterConfig, f *File, cacheSize int64) ( if !w.isKVSorted { w.writeBatch = make([]common.KvPair, units.MiB) } - f.localWriters.Store(w, nil) + engine.localWriters.Store(w, nil) return w, nil } @@ -2486,684 +1794,11 @@ func nextKey(key []byte) []byte { return res } -type rangeOffsets struct { - Size uint64 - Keys uint64 -} - -type rangeProperty struct { - Key []byte - rangeOffsets -} - -func (r *rangeProperty) Less(than btree.Item) bool { - ta := than.(*rangeProperty) - return bytes.Compare(r.Key, ta.Key) < 0 -} - -var _ btree.Item = &rangeProperty{} - -type rangeProperties []rangeProperty - -func decodeRangeProperties(data []byte) (rangeProperties, error) { - r := make(rangeProperties, 0, 16) - for len(data) > 0 { - if len(data) < 4 { - return nil, io.ErrUnexpectedEOF - } - keyLen := int(binary.BigEndian.Uint32(data[:4])) - data = data[4:] - if len(data) < keyLen+8*2 { - return nil, io.ErrUnexpectedEOF - } - key := data[:keyLen] - data = data[keyLen:] - size := binary.BigEndian.Uint64(data[:8]) - keys := binary.BigEndian.Uint64(data[8:]) - data = data[16:] - r = append(r, rangeProperty{Key: key, rangeOffsets: rangeOffsets{Size: size, Keys: keys}}) - } - - return r, nil -} - -func (r rangeProperties) Encode() []byte { - b := make([]byte, 0, 1024) - idx := 0 - for _, p := range r { - b = append(b, 0, 0, 0, 0) - binary.BigEndian.PutUint32(b[idx:], uint32(len(p.Key))) - idx += 4 - b = append(b, p.Key...) - idx += len(p.Key) - - b = append(b, 0, 0, 0, 0, 0, 0, 0, 0) - binary.BigEndian.PutUint64(b[idx:], p.Size) - idx += 8 - - b = append(b, 0, 0, 0, 0, 0, 0, 0, 0) - binary.BigEndian.PutUint64(b[idx:], p.Keys) - idx += 8 - } - return b -} - -func (r rangeProperties) get(key []byte) rangeOffsets { - idx := sort.Search(len(r), func(i int) bool { - return bytes.Compare(r[i].Key, key) >= 0 - }) - return r[idx].rangeOffsets -} - -type RangePropertiesCollector struct { - props rangeProperties - lastOffsets rangeOffsets - lastKey []byte - currentOffsets rangeOffsets - propSizeIdxDistance uint64 - propKeysIdxDistance uint64 -} - -func newRangePropertiesCollector() pebble.TablePropertyCollector { - return &RangePropertiesCollector{ - props: make([]rangeProperty, 0, 1024), - propSizeIdxDistance: defaultPropSizeIndexDistance, - propKeysIdxDistance: defaultPropKeysIndexDistance, - } -} - -func (c *RangePropertiesCollector) sizeInLastRange() uint64 { - return c.currentOffsets.Size - c.lastOffsets.Size -} - -func (c *RangePropertiesCollector) keysInLastRange() uint64 { - return c.currentOffsets.Keys - c.lastOffsets.Keys -} - -func (c *RangePropertiesCollector) insertNewPoint(key []byte) { - c.lastOffsets = c.currentOffsets - c.props = append(c.props, rangeProperty{Key: append([]byte{}, key...), rangeOffsets: c.currentOffsets}) -} - -// implement `pebble.TablePropertyCollector` -// implement `TablePropertyCollector.Add` -func (c *RangePropertiesCollector) Add(key pebble.InternalKey, value []byte) error { - c.currentOffsets.Size += uint64(len(value)) + uint64(len(key.UserKey)) - c.currentOffsets.Keys++ - if len(c.lastKey) == 0 || c.sizeInLastRange() >= c.propSizeIdxDistance || - c.keysInLastRange() >= c.propKeysIdxDistance { - c.insertNewPoint(key.UserKey) - } - c.lastKey = append(c.lastKey[:0], key.UserKey...) - return nil -} - -func (c *RangePropertiesCollector) Finish(userProps map[string]string) error { - if c.sizeInLastRange() > 0 || c.keysInLastRange() > 0 { - c.insertNewPoint(c.lastKey) - } - - userProps[propRangeIndex] = string(c.props.Encode()) - return nil -} - -// The name of the property collector. -func (c *RangePropertiesCollector) Name() string { - return propRangeIndex -} - -type sizeProperties struct { - totalSize uint64 - indexHandles *btree.BTree -} - -func newSizeProperties() *sizeProperties { - return &sizeProperties{indexHandles: btree.New(32)} -} - -func (s *sizeProperties) add(item *rangeProperty) { - if old := s.indexHandles.ReplaceOrInsert(item); old != nil { - o := old.(*rangeProperty) - item.Keys += o.Keys - item.Size += o.Size - } -} - -func (s *sizeProperties) addAll(props rangeProperties) { - prevRange := rangeOffsets{} - for _, r := range props { - s.add(&rangeProperty{ - Key: r.Key, - rangeOffsets: rangeOffsets{Keys: r.Keys - prevRange.Keys, Size: r.Size - prevRange.Size}, - }) - prevRange = r.rangeOffsets - } - if len(props) > 0 { - s.totalSize = props[len(props)-1].Size - } -} - -// iter the tree until f return false -func (s *sizeProperties) iter(f func(p *rangeProperty) bool) { - s.indexHandles.Ascend(func(i btree.Item) bool { - prop := i.(*rangeProperty) - return f(prop) - }) -} - -type sstMeta struct { - path string - minKey []byte - maxKey []byte - totalSize int64 - totalCount int64 - // used for calculate disk-quota - fileSize int64 - seq int32 -} - -type Writer struct { - sync.Mutex - local *File - memtableSizeLimit int64 - - // if the KVs are append in order, we can directly write the into SST file, - // else we must first store them in writeBatch and then batch flush into SST file. - isKVSorted bool - writer *sstWriter - - // bytes buffer for writeBatch - kvBuffer *membuf.Buffer - writeBatch []common.KvPair - // if the kvs in writeBatch are in order, we can avoid doing a `sort.Slice` which - // is quite slow. in our bench, the sort operation eats about 5% of total CPU - isWriteBatchSorted bool - - batchCount int - batchSize int64 - totalSize int64 - totalCount int64 - - lastMetaSeq int32 -} - -func (w *Writer) appendRowsSorted(kvs []common.KvPair) error { - if w.writer == nil { - writer, err := w.createSSTWriter() - if err != nil { - return errors.Trace(err) - } - w.writer = writer - w.writer.minKey = append([]byte{}, kvs[0].Key...) - } - - totalKeyLen := 0 - for i := 0; i < len(kvs); i++ { - totalKeyLen += w.local.keyAdapter.EncodedLen(kvs[i].Key) - } - buf := make([]byte, totalKeyLen) - encodedKvs := make([]common.KvPair, len(kvs)) - for i := 0; i < len(kvs); i++ { - encodedKey := w.local.keyAdapter.Encode(buf, kvs[i].Key, kvs[i].RowID, kvs[i].Offset) - buf = buf[len(encodedKey):] - encodedKvs[i] = common.KvPair{Key: encodedKey, Val: kvs[i].Val} - w.batchSize += int64(len(encodedKvs[i].Key) + len(encodedKvs[i].Val)) - } - - w.batchCount += len(encodedKvs) - w.totalCount += int64(len(encodedKvs)) - return w.writer.writeKVs(encodedKvs) -} - -func (w *Writer) appendRowsUnsorted(ctx context.Context, kvs []common.KvPair) error { - l := len(w.writeBatch) - cnt := w.batchCount - var lastKey []byte - if cnt > 0 { - lastKey = w.writeBatch[cnt-1].Key - } - for _, pair := range kvs { - if w.isWriteBatchSorted && bytes.Compare(lastKey, pair.Key) > 0 { - w.isWriteBatchSorted = false - } - lastKey = pair.Key - w.batchSize += int64(len(pair.Key) + len(pair.Val)) - buf := w.kvBuffer.AllocBytes(w.local.keyAdapter.EncodedLen(pair.Key)) - key := w.local.keyAdapter.Encode(buf, pair.Key, pair.RowID, pair.Offset) - val := w.kvBuffer.AddBytes(pair.Val) - if cnt < l { - w.writeBatch[cnt].Key = key - w.writeBatch[cnt].Val = val - } else { - w.writeBatch = append(w.writeBatch, common.KvPair{Key: key, Val: val}) - } - cnt++ - } - w.batchCount = cnt - - if w.batchSize > w.memtableSizeLimit { - if err := w.flushKVs(ctx); err != nil { - return err - } - } - w.totalCount += int64(len(kvs)) - return nil -} - func (local *local) EngineFileSizes() (res []backend.EngineFileSize) { local.engines.Range(func(k, v interface{}) bool { - engine := v.(*File) + engine := v.(*Engine) res = append(res, engine.getEngineFileSize()) return true }) return } - -func (w *Writer) AppendRows(ctx context.Context, tableName string, columnNames []string, rows kv.Rows) error { - kvs := kv.KvPairsFromRows(rows) - if len(kvs) == 0 { - return nil - } - - if w.local.closed.Load() { - return errorEngineClosed - } - - w.Lock() - defer w.Unlock() - - // if chunk has _tidb_rowid field, we can't ensure that the rows are sorted. - if w.isKVSorted && w.writer == nil { - for _, c := range columnNames { - if c == model.ExtraHandleName.L { - w.isKVSorted = false - } - } - } - - if w.isKVSorted { - return w.appendRowsSorted(kvs) - } - return w.appendRowsUnsorted(ctx, kvs) -} - -func (w *Writer) flush(ctx context.Context) error { - w.Lock() - defer w.Unlock() - if w.batchCount == 0 { - return nil - } - - w.totalSize += w.batchSize - if len(w.writeBatch) > 0 { - if err := w.flushKVs(ctx); err != nil { - return errors.Trace(err) - } - } - - if w.writer != nil { - meta, err := w.writer.close() - if err != nil { - return errors.Trace(err) - } - w.writer = nil - w.batchCount = 0 - if meta != nil && meta.totalSize > 0 { - return w.addSST(ctx, meta) - } - } - - return nil -} - -type flushStatus struct { - local *File - seq int32 -} - -func (f flushStatus) Flushed() bool { - return f.seq <= f.local.finishedMetaSeq.Load() -} - -func (w *Writer) Close(ctx context.Context) (backend.ChunkFlushStatus, error) { - defer w.kvBuffer.Destroy() - defer w.local.localWriters.Delete(w) - err := w.flush(ctx) - // FIXME: in theory this line is useless, but In our benchmark with go1.15 - // this can resolve the memory consistently increasing issue. - // maybe this is a bug related to go GC mechanism. - w.writeBatch = nil - return flushStatus{local: w.local, seq: w.lastMetaSeq}, err -} - -func (w *Writer) IsSynced() bool { - return w.batchCount == 0 && w.lastMetaSeq <= w.local.finishedMetaSeq.Load() -} - -func (w *Writer) flushKVs(ctx context.Context) error { - writer, err := w.createSSTWriter() - if err != nil { - return errors.Trace(err) - } - if !w.isWriteBatchSorted { - sort.Slice(w.writeBatch[:w.batchCount], func(i, j int) bool { - return bytes.Compare(w.writeBatch[i].Key, w.writeBatch[j].Key) < 0 - }) - w.isWriteBatchSorted = true - } - - writer.minKey = append(writer.minKey[:0], w.writeBatch[0].Key...) - err = writer.writeKVs(w.writeBatch[:w.batchCount]) - if err != nil { - return errors.Trace(err) - } - meta, err := writer.close() - if err != nil { - return errors.Trace(err) - } - err = w.addSST(ctx, meta) - if err != nil { - return errors.Trace(err) - } - - w.totalSize += w.batchSize - w.batchSize = 0 - w.batchCount = 0 - w.kvBuffer.Reset() - return nil -} - -func (w *Writer) addSST(ctx context.Context, meta *sstMeta) error { - seq, err := w.local.addSST(ctx, meta) - if err != nil { - return err - } - w.lastMetaSeq = seq - return nil -} - -func (w *Writer) createSSTWriter() (*sstWriter, error) { - path := filepath.Join(w.local.sstDir, uuid.New().String()+".sst") - writer, err := newSSTWriter(path) - if err != nil { - return nil, err - } - sw := &sstWriter{sstMeta: &sstMeta{path: path}, writer: writer} - return sw, nil -} - -var errorUnorderedSSTInsertion = errors.New("inserting KVs into SST without order") - -type sstWriter struct { - *sstMeta - writer *sstable.Writer -} - -func newSSTWriter(path string) (*sstable.Writer, error) { - f, err := os.Create(path) - if err != nil { - return nil, errors.Trace(err) - } - writer := sstable.NewWriter(f, sstable.WriterOptions{ - TablePropertyCollectors: []func() pebble.TablePropertyCollector{ - newRangePropertiesCollector, - }, - BlockSize: 16 * 1024, - }) - return writer, nil -} - -func (sw *sstWriter) writeKVs(kvs []common.KvPair) error { - if len(kvs) == 0 { - return nil - } - - if bytes.Compare(kvs[0].Key, sw.maxKey) <= 0 { - return errorUnorderedSSTInsertion - } - - internalKey := sstable.InternalKey{ - Trailer: uint64(sstable.InternalKeyKindSet), - } - var lastKey []byte - for _, p := range kvs { - if bytes.Equal(p.Key, lastKey) { - log.L().Warn("duplicated key found, skip write", logutil.Key("key", p.Key)) - continue - } - internalKey.UserKey = p.Key - if err := sw.writer.Add(internalKey, p.Val); err != nil { - return errors.Trace(err) - } - sw.totalSize += int64(len(p.Key)) + int64(len(p.Val)) - } - sw.totalCount += int64(len(kvs)) - sw.maxKey = append(sw.maxKey[:0], kvs[len(kvs)-1].Key...) - return nil -} - -func (sw *sstWriter) close() (*sstMeta, error) { - if err := sw.writer.Close(); err != nil { - return nil, errors.Trace(err) - } - meta, err := sw.writer.Metadata() - if err != nil { - return nil, errors.Trace(err) - } - sw.fileSize = int64(meta.Size) - return sw.sstMeta, nil -} - -type sstIter struct { - name string - key []byte - val []byte - iter sstable.Iterator - reader *sstable.Reader - valid bool -} - -func (i *sstIter) Close() error { - if err := i.iter.Close(); err != nil { - return errors.Trace(err) - } - err := i.reader.Close() - return errors.Trace(err) -} - -type sstIterHeap struct { - iters []*sstIter -} - -func (h *sstIterHeap) Len() int { - return len(h.iters) -} - -func (h *sstIterHeap) Less(i, j int) bool { - return bytes.Compare(h.iters[i].key, h.iters[j].key) < 0 -} - -func (h *sstIterHeap) Swap(i, j int) { - h.iters[i], h.iters[j] = h.iters[j], h.iters[i] -} - -func (h *sstIterHeap) Push(x interface{}) { - h.iters = append(h.iters, x.(*sstIter)) -} - -func (h *sstIterHeap) Pop() interface{} { - item := h.iters[len(h.iters)-1] - h.iters = h.iters[:len(h.iters)-1] - return item -} - -func (h *sstIterHeap) Next() ([]byte, []byte, error) { - for { - if len(h.iters) == 0 { - return nil, nil, nil - } - - iter := h.iters[0] - if iter.valid { - iter.valid = false - return iter.key, iter.val, iter.iter.Error() - } - - var k *pebble.InternalKey - k, iter.val = iter.iter.Next() - if k != nil { - iter.key = k.UserKey - iter.valid = true - heap.Fix(h, 0) - } else { - err := iter.Close() - heap.Remove(h, 0) - if err != nil { - return nil, nil, errors.Trace(err) - } - } - } -} - -// sstIngester is a interface used to merge and ingest SST files. -// it's a interface mainly used for test convenience -type sstIngester interface { - mergeSSTs(metas []*sstMeta, dir string) (*sstMeta, error) - ingest([]*sstMeta) error -} - -type dbSSTIngester struct { - e *File -} - -func (i dbSSTIngester) mergeSSTs(metas []*sstMeta, dir string) (*sstMeta, error) { - if len(metas) == 0 { - return nil, errors.New("sst metas is empty") - } else if len(metas) == 1 { - return metas[0], nil - } - - start := time.Now() - newMeta := &sstMeta{ - seq: metas[len(metas)-1].seq, - } - mergeIter := &sstIterHeap{ - iters: make([]*sstIter, 0, len(metas)), - } - - for _, p := range metas { - f, err := os.Open(p.path) - if err != nil { - return nil, errors.Trace(err) - } - reader, err := sstable.NewReader(f, sstable.ReaderOptions{}) - if err != nil { - return nil, errors.Trace(err) - } - iter, err := reader.NewIter(nil, nil) - if err != nil { - return nil, errors.Trace(err) - } - key, val := iter.Next() - if key == nil { - continue - } - if iter.Error() != nil { - return nil, errors.Trace(iter.Error()) - } - mergeIter.iters = append(mergeIter.iters, &sstIter{ - name: p.path, - iter: iter, - key: key.UserKey, - val: val, - reader: reader, - valid: true, - }) - newMeta.totalSize += p.totalSize - newMeta.totalCount += p.totalCount - } - heap.Init(mergeIter) - - name := filepath.Join(dir, fmt.Sprintf("%s.sst", uuid.New())) - writer, err := newSSTWriter(name) - if err != nil { - return nil, errors.Trace(err) - } - newMeta.path = name - - internalKey := sstable.InternalKey{ - Trailer: uint64(sstable.InternalKeyKindSet), - } - key, val, err := mergeIter.Next() - if err != nil { - return nil, err - } - if key == nil { - return nil, errors.New("all ssts are empty!") - } - newMeta.minKey = append(newMeta.minKey[:0], key...) - lastKey := make([]byte, 0) - for { - if bytes.Equal(lastKey, key) { - log.L().Warn("duplicated key found, skipped", zap.Binary("key", lastKey)) - newMeta.totalCount-- - newMeta.totalSize -= int64(len(key) + len(val)) - - goto nextKey - } - internalKey.UserKey = key - err = writer.Add(internalKey, val) - if err != nil { - return nil, err - } - lastKey = append(lastKey[:0], key...) - nextKey: - key, val, err = mergeIter.Next() - if err != nil { - return nil, err - } - if key == nil { - break - } - } - err = writer.Close() - if err != nil { - return nil, errors.Trace(err) - } - meta, err := writer.Metadata() - if err != nil { - return nil, errors.Trace(err) - } - newMeta.maxKey = lastKey - newMeta.fileSize = int64(meta.Size) - - dur := time.Since(start) - log.L().Info("compact sst", zap.Int("fileCount", len(metas)), zap.Int64("size", newMeta.totalSize), - zap.Int64("count", newMeta.totalCount), zap.Duration("cost", dur), zap.String("file", name)) - - // async clean raw SSTs. - go func() { - totalSize := int64(0) - for _, m := range metas { - totalSize += m.fileSize - if err := os.Remove(m.path); err != nil { - log.L().Warn("async cleanup sst file failed", zap.Error(err)) - } - } - // decrease the pending size after clean up - i.e.pendingFileSize.Sub(totalSize) - }() - - return newMeta, err -} - -func (i dbSSTIngester) ingest(metas []*sstMeta) error { - if len(metas) == 0 { - return nil - } - paths := make([]string, 0, len(metas)) - for _, m := range metas { - paths = append(paths, m.path) - } - return i.e.db.Ingest(paths) -} diff --git a/br/pkg/lightning/backend/local/local_freebsd.go b/br/pkg/lightning/backend/local/local_freebsd.go index 08fc827052210..3221052f43904 100644 --- a/br/pkg/lightning/backend/local/local_freebsd.go +++ b/br/pkg/lightning/backend/local/local_freebsd.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build freebsd // +build freebsd package local diff --git a/br/pkg/lightning/backend/local/local_test.go b/br/pkg/lightning/backend/local/local_test.go index d1f700210ea2a..747034068c463 100644 --- a/br/pkg/lightning/backend/local/local_test.go +++ b/br/pkg/lightning/backend/local/local_test.go @@ -37,12 +37,19 @@ import ( "github.com/pingcap/kvproto/pkg/errorpb" sst "github.com/pingcap/kvproto/pkg/import_sstpb" "github.com/pingcap/kvproto/pkg/metapb" + pd "github.com/tikv/pd/client" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "github.com/pingcap/tidb/br/pkg/lightning/backend" "github.com/pingcap/tidb/br/pkg/lightning/backend/kv" "github.com/pingcap/tidb/br/pkg/lightning/common" "github.com/pingcap/tidb/br/pkg/lightning/mydump" "github.com/pingcap/tidb/br/pkg/mock" + "github.com/pingcap/tidb/br/pkg/pdutil" "github.com/pingcap/tidb/br/pkg/restore" + "github.com/pingcap/tidb/br/pkg/version" tidbkv "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/tablecodec" @@ -54,6 +61,7 @@ import ( type localSuite struct{} var _ = Suite(&localSuite{}) +var _ = SerialSuites(&testMultiIngestSuite{}) func Test(t *testing.T) { TestingT(t) @@ -336,7 +344,7 @@ func testLocalWriter(c *C, needSort bool, partitialSort bool) { _, engineUUID := backend.MakeUUID("ww", 0) engineCtx, cancel := context.WithCancel(context.Background()) - f := &File{ + f := &Engine{ db: db, UUID: engineUUID, sstDir: tmpPath, @@ -565,7 +573,7 @@ func (s *localSuite) TestLocalIngestLoop(c *C) { c.Assert(err, IsNil) _, engineUUID := backend.MakeUUID("ww", 0) engineCtx, cancel := context.WithCancel(context.Background()) - f := File{ + f := Engine{ db: db, UUID: engineUUID, sstDir: "", @@ -782,7 +790,7 @@ func (s *localSuite) testMergeSSTs(c *C, kvs [][]common.KvPair, meta *sstMeta) { _, engineUUID := backend.MakeUUID("ww", 0) engineCtx, cancel := context.WithCancel(context.Background()) - f := &File{ + f := &Engine{ db: db, UUID: engineUUID, sstDir: tmpPath, @@ -866,3 +874,343 @@ func (s *localSuite) TestMergeSSTsDuplicated(c *C) { s.testMergeSSTs(c, kvs, &sstMeta{totalCount: 40, totalSize: 640}) } + +type mockPdClient struct { + pd.Client + stores []*metapb.Store +} + +func (c *mockPdClient) GetAllStores(ctx context.Context, opts ...pd.GetStoreOption) ([]*metapb.Store, error) { + return c.stores, nil +} + +type mockGrpcErr struct{} + +func (e mockGrpcErr) GRPCStatus() *status.Status { + return status.New(codes.Unimplemented, "unimplmented") +} + +func (e mockGrpcErr) Error() string { + return "unimplmented" +} + +type mockImportClient struct { + sst.ImportSSTClient + stores []*metapb.Store + curStore *metapb.Store + err error + retry int + cnt int + multiIngestCheckFn func(s *metapb.Store) bool +} + +func (c *mockImportClient) MultiIngest(context.Context, *sst.MultiIngestRequest, ...grpc.CallOption) (*sst.IngestResponse, error) { + defer func() { + c.cnt++ + }() + if c.cnt < c.retry && c.err != nil { + return nil, c.err + } + + if !c.multiIngestCheckFn(c.curStore) { + return nil, mockGrpcErr{} + } + return nil, nil +} + +type testMultiIngestSuite struct { + local *local + pdCli *mockPdClient +} + +func (s *testMultiIngestSuite) SetUpSuite(c *C) { + local := &local{ + pdCtl: &pdutil.PdController{}, + } + pdCli := &mockPdClient{} + local.pdCtl.SetPDClient(pdCli) + s.local = local + s.pdCli = pdCli +} + +func (s *testMultiIngestSuite) TestMultiIngest(c *C) { + defer func() { + getImportClientFn = getImportClient + }() + + allStores := []*metapb.Store{ + { + Id: 1, + State: metapb.StoreState_Offline, + }, + { + Id: 2, + State: metapb.StoreState_Tombstone, + Labels: []*metapb.StoreLabel{ + { + Key: "test", + Value: "tiflash", + }, + }, + }, + { + Id: 3, + State: metapb.StoreState_Up, + Labels: []*metapb.StoreLabel{ + { + Key: "test", + Value: "123", + }, + }, + }, + { + Id: 4, + State: metapb.StoreState_Tombstone, + Labels: []*metapb.StoreLabel{ + { + Key: "engine", + Value: "test", + }, + }, + }, + { + Id: 5, + State: metapb.StoreState_Tombstone, + Labels: []*metapb.StoreLabel{ + { + Key: "engine", + Value: "test123", + }, + }, + }, + { + Id: 6, + State: metapb.StoreState_Offline, + Labels: []*metapb.StoreLabel{ + { + Key: "engine", + Value: "tiflash", + }, + }, + }, + { + Id: 7, + State: metapb.StoreState_Up, + Labels: []*metapb.StoreLabel{ + { + Key: "test", + Value: "123", + }, + { + Key: "engine", + Value: "tiflash", + }, + }, + }, + { + Id: 8, + State: metapb.StoreState_Up, + }, + } + cases := []struct { + filter func(store *metapb.Store) bool + multiIngestSupport func(s *metapb.Store) bool + retry int + err error + supportMutliIngest bool + retErr string + }{ + // test up stores with all support multiIngest + { + func(store *metapb.Store) bool { + return store.State == metapb.StoreState_Up + }, + func(s *metapb.Store) bool { + return true + }, + 0, + nil, + true, + "", + }, + // test all up stores with tiflash not support multi ingest + { + func(store *metapb.Store) bool { + return store.State == metapb.StoreState_Up + }, + func(s *metapb.Store) bool { + return !version.IsTiFlash(s) + }, + 0, + nil, + true, + "", + }, + // test all up stores with only tiflash support multi ingest + { + func(store *metapb.Store) bool { + return store.State == metapb.StoreState_Up + }, + func(s *metapb.Store) bool { + return version.IsTiFlash(s) + }, + 0, + nil, + false, + "", + }, + // test all up stores with some non-tiflash store support multi ingest + { + func(store *metapb.Store) bool { + return store.State == metapb.StoreState_Up + }, + func(s *metapb.Store) bool { + return len(s.Labels) > 0 + }, + 0, + nil, + false, + "", + }, + // test all stores with all states + { + func(store *metapb.Store) bool { + return true + }, + func(s *metapb.Store) bool { + return true + }, + 0, + nil, + true, + "", + }, + // test all non-tiflash stores that support multi ingests + { + func(store *metapb.Store) bool { + return !version.IsTiFlash(store) + }, + func(s *metapb.Store) bool { + return !version.IsTiFlash(s) + }, + 0, + nil, + true, + "", + }, + // test only up stores support multi ingest + { + func(store *metapb.Store) bool { + return true + }, + func(s *metapb.Store) bool { + return s.State == metapb.StoreState_Up + }, + 0, + nil, + true, + "", + }, + // test only offline/tombstore stores support multi ingest + { + func(store *metapb.Store) bool { + return true + }, + func(s *metapb.Store) bool { + return s.State != metapb.StoreState_Up + }, + 0, + nil, + false, + "", + }, + // test grpc return error but no tiflash + { + func(store *metapb.Store) bool { + return !version.IsTiFlash(store) + }, + func(s *metapb.Store) bool { + return true + }, + math.MaxInt32, + errors.New("mock error"), + false, + "", + }, + // test grpc return error and contains offline tiflash + { + func(store *metapb.Store) bool { + return !version.IsTiFlash(store) || store.State != metapb.StoreState_Up + }, + func(s *metapb.Store) bool { + return true + }, + math.MaxInt32, + errors.New("mock error"), + false, + "", + }, + // test grpc return error + { + func(store *metapb.Store) bool { + return true + }, + func(s *metapb.Store) bool { + return true + }, + math.MaxInt32, + errors.New("mock error"), + false, + "mock error", + }, + // test grpc return error only once + { + func(store *metapb.Store) bool { + return true + }, + func(s *metapb.Store) bool { + return true + }, + 1, + errors.New("mock error"), + true, + "", + }, + } + + for _, testCase := range cases { + stores := make([]*metapb.Store, 0, len(allStores)) + for _, s := range allStores { + if testCase.filter(s) { + stores = append(stores, s) + } + } + + importCli := &mockImportClient{ + stores: allStores, + cnt: 0, + retry: testCase.retry, + err: testCase.err, + multiIngestCheckFn: testCase.multiIngestSupport, + } + s.pdCli.stores = stores + + getImportClientFn = func(local *local, ctx context.Context, storeID uint64) (sst.ImportSSTClient, error) { + for _, store := range importCli.stores { + if store.Id == storeID { + importCli.curStore = store + break + } + } + return importCli, nil + } + s.local.supportMultiIngest = false + + err := s.local.checkMultiIngestSupport(context.Background()) + if err != nil { + c.Assert(err, ErrorMatches, testCase.retErr) + } else { + c.Assert(s.local.supportMultiIngest, Equals, testCase.supportMutliIngest) + } + } +} diff --git a/br/pkg/lightning/backend/local/local_unix.go b/br/pkg/lightning/backend/local/local_unix.go index 57b2fcec4149b..05dc7a08bb6da 100644 --- a/br/pkg/lightning/backend/local/local_unix.go +++ b/br/pkg/lightning/backend/local/local_unix.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build !windows // +build !windows package local diff --git a/br/pkg/lightning/backend/local/local_unix_generic.go b/br/pkg/lightning/backend/local/local_unix_generic.go index 2ea66ba4430cb..4c4dadf0adca2 100644 --- a/br/pkg/lightning/backend/local/local_unix_generic.go +++ b/br/pkg/lightning/backend/local/local_unix_generic.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build !freebsd && !windows // +build !freebsd,!windows package local diff --git a/br/pkg/lightning/backend/local/local_windows.go b/br/pkg/lightning/backend/local/local_windows.go index cf0e158088cc0..9133c4403a13f 100644 --- a/br/pkg/lightning/backend/local/local_windows.go +++ b/br/pkg/lightning/backend/local/local_windows.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build windows // +build windows package local diff --git a/br/pkg/lightning/backend/noop/noop.go b/br/pkg/lightning/backend/noop/noop.go index f426c6f1a2047..ac02ab9482e1f 100644 --- a/br/pkg/lightning/backend/noop/noop.go +++ b/br/pkg/lightning/backend/noop/noop.go @@ -21,6 +21,7 @@ import ( "github.com/google/uuid" "github.com/pingcap/tidb/br/pkg/lightning/backend" "github.com/pingcap/tidb/br/pkg/lightning/backend/kv" + "github.com/pingcap/tidb/br/pkg/lightning/config" "github.com/pingcap/tidb/br/pkg/lightning/log" "github.com/pingcap/tidb/br/pkg/lightning/verification" "github.com/pingcap/tidb/parser/model" @@ -142,14 +143,18 @@ func (b noopBackend) LocalWriter(context.Context, *backend.LocalWriterConfig, uu return noopWriter{}, nil } -func (b noopBackend) CollectLocalDuplicateRows(ctx context.Context, tbl table.Table) (bool, error) { +func (b noopBackend) CollectLocalDuplicateRows(ctx context.Context, tbl table.Table, tableName string, opts *kv.SessionOptions) (bool, error) { panic("Unsupported Operation") } -func (b noopBackend) CollectRemoteDuplicateRows(ctx context.Context, tbl table.Table) (bool, error) { +func (b noopBackend) CollectRemoteDuplicateRows(ctx context.Context, tbl table.Table, tableName string, opts *kv.SessionOptions) (bool, error) { panic("Unsupported Operation") } +func (b noopBackend) ResolveDuplicateRows(ctx context.Context, tbl table.Table, tableName string, algorithm config.DuplicateResolutionAlgorithm) error { + return nil +} + type noopEncoder struct{} // Close the encoder. diff --git a/br/pkg/lightning/backend/tidb/tidb.go b/br/pkg/lightning/backend/tidb/tidb.go index 8e7fa1590e885..e7afb91b4a9fb 100644 --- a/br/pkg/lightning/backend/tidb/tidb.go +++ b/br/pkg/lightning/backend/tidb/tidb.go @@ -84,6 +84,9 @@ type tidbEncoder struct { // the index of table columns for each data field. // index == len(table.columns) means this field is `_tidb_rowid` columnIdx []int + // the max index used in this chunk, due to the ignore-columns config, we can't + // directly check the total column count, so we fall back to only check that + // the there are enough columns. columnCnt int } @@ -284,22 +287,27 @@ func (enc *tidbEncoder) Encode(logger log.Logger, row []types.Datum, _ int64, co cols := enc.tbl.Cols() if len(enc.columnIdx) == 0 { - columnCount := 0 + columnMaxIdx := -1 columnIdx := make([]int, len(columnPermutation)) + for i := 0; i < len(columnPermutation); i++ { + columnIdx[i] = -1 + } for i, idx := range columnPermutation { if idx >= 0 { columnIdx[idx] = i - columnCount++ + if idx > columnMaxIdx { + columnMaxIdx = idx + } } } enc.columnIdx = columnIdx - enc.columnCnt = columnCount + enc.columnCnt = columnMaxIdx + 1 } // TODO: since the column count doesn't exactly reflect the real column names, we only check the upper bound currently. // See: tests/generated_columns/data/gencol.various_types.0.sql this sql has no columns, so encodeLoop will fill the // column permutation with default, thus enc.columnCnt > len(row). - if len(row) > enc.columnCnt { + if len(row) < enc.columnCnt { logger.Error("column count mismatch", zap.Ints("column_permutation", columnPermutation), zap.Array("data", kv.RowArrayMarshaler(row))) return emptyTiDBRow, errors.Errorf("column count mismatch, expected %d, got %d", enc.columnCnt, len(row)) @@ -308,8 +316,12 @@ func (enc *tidbEncoder) Encode(logger log.Logger, row []types.Datum, _ int64, co var encoded strings.Builder encoded.Grow(8 * len(row)) encoded.WriteByte('(') + cnt := 0 for i, field := range row { - if i != 0 { + if enc.columnIdx[i] < 0 { + continue + } + if cnt > 0 { encoded.WriteByte(',') } datum := field @@ -321,6 +333,7 @@ func (enc *tidbEncoder) Encode(logger log.Logger, row []types.Datum, _ int64, co ) return nil, err } + cnt++ } encoded.WriteByte(')') return tidbRow{ @@ -331,14 +344,17 @@ func (enc *tidbEncoder) Encode(logger log.Logger, row []types.Datum, _ int64, co } // EncodeRowForRecord encodes a row to a string compatible with INSERT statements. -func EncodeRowForRecord(encTable table.Table, sqlMode mysql.SQLMode, row []types.Datum) string { +func EncodeRowForRecord(encTable table.Table, sqlMode mysql.SQLMode, row []types.Datum, columnPermutation []int) string { enc := tidbEncoder{ tbl: encTable, mode: sqlMode, } - resRow, err := enc.Encode(log.L(), row, 0, nil, "", 0) + resRow, err := enc.Encode(log.L(), row, 0, columnPermutation, "", 0) if err != nil { - return fmt.Sprintf("/* ERROR: %s */", err) + // if encode can't succeed, fallback to record the raw input strings + // ignore the error since it can only happen if the datum type is unknown, this can't happen here. + datumStr, _ := types.DatumsToString(row, true) + return datumStr } return resRow.(tidbRow).insertStmt } @@ -394,14 +410,18 @@ func (be *tidbBackend) CleanupEngine(context.Context, uuid.UUID) error { return nil } -func (be *tidbBackend) CollectLocalDuplicateRows(ctx context.Context, tbl table.Table) (bool, error) { +func (be *tidbBackend) CollectLocalDuplicateRows(ctx context.Context, tbl table.Table, tableName string, opts *kv.SessionOptions) (bool, error) { panic("Unsupported Operation") } -func (be *tidbBackend) CollectRemoteDuplicateRows(ctx context.Context, tbl table.Table) (bool, error) { +func (be *tidbBackend) CollectRemoteDuplicateRows(ctx context.Context, tbl table.Table, tableName string, opts *kv.SessionOptions) (bool, error) { panic("Unsupported Operation") } +func (be *tidbBackend) ResolveDuplicateRows(ctx context.Context, tbl table.Table, tableName string, algorithm config.DuplicateResolutionAlgorithm) error { + return nil +} + func (be *tidbBackend) ImportEngine(context.Context, uuid.UUID, int64) error { return nil } @@ -418,7 +438,7 @@ rowLoop: continue rowLoop case utils.IsRetryableError(err): // retry next loop - default: + case be.errorMgr.TypeErrorsRemain() > 0: // WriteBatchRowsToDB failed in the batch mode and can not be retried, // we need to redo the writing row-by-row to find where the error locates (and skip it correctly in future). if err = be.WriteRowsToDB(ctx, tableName, columnNames, r); err != nil { @@ -426,6 +446,9 @@ rowLoop: // For now, we will treat like maxErrorCount is always 0. So we will just return if any error occurs. return errors.Annotatef(err, "[%s] write rows reach max error count %d", tableName, 0) } + continue rowLoop + default: + return err } } return errors.Annotatef(err, "[%s] batch write rows reach max retry %d and still failed", tableName, writeRowsMaxRetryTimes) @@ -565,7 +588,7 @@ func (be *tidbBackend) FetchRemoteTableModels(ctx context.Context, schemaName st serverInfo := version.ParseServerInfo(versionStr) rows, e := tx.Query(` - SELECT table_name, column_name, column_type, extra + SELECT table_name, column_name, column_type, generation_expression, extra FROM information_schema.columns WHERE table_schema = ? ORDER BY table_name, ordinal_position; @@ -581,8 +604,8 @@ func (be *tidbBackend) FetchRemoteTableModels(ctx context.Context, schemaName st curTable *model.TableInfo ) for rows.Next() { - var tableName, columnName, columnType, columnExtra string - if e := rows.Scan(&tableName, &columnName, &columnType, &columnExtra); e != nil { + var tableName, columnName, columnType, generationExpr, columnExtra string + if e := rows.Scan(&tableName, &columnName, &columnType, &generationExpr, &columnExtra); e != nil { return e } if tableName != curTableName { @@ -611,6 +634,7 @@ func (be *tidbBackend) FetchRemoteTableModels(ctx context.Context, schemaName st FieldType: types.FieldType{ Flag: flag, }, + GeneratedExprString: generationExpr, }) curColOffset++ } @@ -677,8 +701,7 @@ func (be *tidbBackend) LocalWriter( } type Writer struct { - be *tidbBackend - errorMgr *errormanager.ErrorManager + be *tidbBackend } func (w *Writer) Close(ctx context.Context) (backend.ChunkFlushStatus, error) { diff --git a/br/pkg/lightning/backend/tidb/tidb_test.go b/br/pkg/lightning/backend/tidb/tidb_test.go index 3739bf7551db9..9ab3e3ab9feaa 100644 --- a/br/pkg/lightning/backend/tidb/tidb_test.go +++ b/br/pkg/lightning/backend/tidb/tidb_test.go @@ -22,7 +22,6 @@ import ( "testing" "github.com/DATA-DOG/go-sqlmock" - . "github.com/pingcap/check" "github.com/pingcap/tidb/br/pkg/lightning/backend" "github.com/pingcap/tidb/br/pkg/lightning/backend/kv" "github.com/pingcap/tidb/br/pkg/lightning/backend/tidb" @@ -30,21 +29,17 @@ import ( "github.com/pingcap/tidb/br/pkg/lightning/errormanager" "github.com/pingcap/tidb/br/pkg/lightning/log" "github.com/pingcap/tidb/br/pkg/lightning/verification" + "github.com/pingcap/tidb/br/pkg/utils" "github.com/pingcap/tidb/parser/charset" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/types" + "github.com/stretchr/testify/require" "go.uber.org/atomic" ) -func Test(t *testing.T) { - TestingT(t) -} - -var _ = Suite(&mysqlSuite{}) - type mysqlSuite struct { dbHandle *sql.DB mockDB sqlmock.Sqlmock @@ -52,9 +47,9 @@ type mysqlSuite struct { tbl table.Table } -func (s *mysqlSuite) SetUpTest(c *C) { +func createMysqlSuite(t *testing.T) *mysqlSuite { db, mock, err := sqlmock.New() - c.Assert(err, IsNil) + require.NoError(t, err) tys := []byte{ mysql.TypeLong, mysql.TypeLong, mysql.TypeTiny, mysql.TypeInt24, mysql.TypeFloat, mysql.TypeDouble, @@ -67,29 +62,28 @@ func (s *mysqlSuite) SetUpTest(c *C) { } tblInfo := &model.TableInfo{ID: 1, Columns: cols, PKIsHandle: false, State: model.StatePublic} tbl, err := tables.TableFromMeta(kv.NewPanickingAllocators(0), tblInfo) - c.Assert(err, IsNil) - - s.dbHandle = db - s.mockDB = mock - s.backend = tidb.NewTiDBBackend(db, config.ReplaceOnDup, errormanager.New(nil, config.NewConfig())) - s.tbl = tbl + require.NoError(t, err) + backend := tidb.NewTiDBBackend(db, config.ReplaceOnDup, errormanager.New(nil, config.NewConfig())) + return &mysqlSuite{dbHandle: db, mockDB: mock, backend: backend, tbl: tbl} } -func (s *mysqlSuite) TearDownTest(c *C) { +func (s *mysqlSuite) TearDownTest(t *testing.T) { s.backend.Close() - c.Assert(s.mockDB.ExpectationsWereMet(), IsNil) + require.NoError(t, s.mockDB.ExpectationsWereMet()) } -func (s *mysqlSuite) TestWriteRowsReplaceOnDup(c *C) { +func TestWriteRowsReplaceOnDup(t *testing.T) { + s := createMysqlSuite(t) + defer s.TearDownTest(t) s.mockDB. - ExpectExec("\\QREPLACE INTO `foo`.`bar`(`a`,`b`,`c`,`d`,`e`,`f`,`g`,`h`,`i`,`j`,`k`,`l`,`m`,`n`,`o`) VALUES(18446744073709551615,-9223372036854775808,0,NULL,7.5,5e-324,1.7976931348623157e+308,0,'甲乙丙\\r\\n\\0\\Z''\"\\\\`',x'000000abcdef',2557891634,'12.5',51)\\E"). + ExpectExec("\\QREPLACE INTO `foo`.`bar`(`b`,`d`,`e`,`f`,`g`,`h`,`i`,`j`,`k`,`l`,`m`,`n`,`o`) VALUES(-9223372036854775808,NULL,7.5,5e-324,1.7976931348623157e+308,0,'甲乙丙\\r\\n\\0\\Z''\"\\\\`',x'000000abcdef',2557891634,'12.5',51)\\E"). WillReturnResult(sqlmock.NewResult(1, 1)) ctx := context.Background() logger := log.L() engine, err := s.backend.OpenEngine(ctx, &backend.EngineConfig{}, "`foo`.`bar`", 1) - c.Assert(err, IsNil) + require.NoError(t, err) dataRows := s.backend.MakeEmptyRows() dataChecksum := verification.MakeKVChecksum(0, 0, 0) @@ -102,8 +96,11 @@ func (s *mysqlSuite) TestWriteRowsReplaceOnDup(c *C) { perms = append(perms, i) } perms = append(perms, -1) + // skip column a,c due to ignore-columns + perms[0] = -1 + perms[2] = -1 encoder, err := s.backend.NewEncoder(s.tbl, &kv.SessionOptions{SQLMode: 0, Timestamp: 1234567890}) - c.Assert(err, IsNil) + require.NoError(t, err) row, err := encoder.Encode(logger, []types.Datum{ types.NewUintDatum(18446744073709551615), types.NewIntDatum(-9223372036854775808), @@ -121,19 +118,21 @@ func (s *mysqlSuite) TestWriteRowsReplaceOnDup(c *C) { types.NewDecimalDatum(types.NewDecFromFloatForTest(12.5)), types.NewMysqlEnumDatum(types.Enum{Name: "ENUM_NAME", Value: 51}), }, 1, perms, "0.csv", 0) - c.Assert(err, IsNil) + require.NoError(t, err) row.ClassifyAndAppend(&dataRows, &dataChecksum, &indexRows, &indexChecksum) writer, err := engine.LocalWriter(ctx, nil) - c.Assert(err, IsNil) - err = writer.WriteRows(ctx, []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o"}, dataRows) - c.Assert(err, IsNil) + require.NoError(t, err) + err = writer.WriteRows(ctx, []string{"b", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o"}, dataRows) + require.NoError(t, err) st, err := writer.Close(ctx) - c.Assert(err, IsNil) - c.Assert(st, IsNil) + require.NoError(t, err) + require.Nil(t, st) } -func (s *mysqlSuite) TestWriteRowsIgnoreOnDup(c *C) { +func TestWriteRowsIgnoreOnDup(t *testing.T) { + s := createMysqlSuite(t) + defer s.TearDownTest(t) s.mockDB. ExpectExec("\\QINSERT IGNORE INTO `foo`.`bar`(`a`) VALUES(1)\\E"). WillReturnResult(sqlmock.NewResult(1, 1)) @@ -143,7 +142,7 @@ func (s *mysqlSuite) TestWriteRowsIgnoreOnDup(c *C) { ignoreBackend := tidb.NewTiDBBackend(s.dbHandle, config.IgnoreOnDup, errormanager.New(nil, config.NewConfig())) engine, err := ignoreBackend.OpenEngine(ctx, &backend.EngineConfig{}, "`foo`.`bar`", 1) - c.Assert(err, IsNil) + require.NoError(t, err) dataRows := ignoreBackend.MakeEmptyRows() dataChecksum := verification.MakeKVChecksum(0, 0, 0) @@ -151,33 +150,35 @@ func (s *mysqlSuite) TestWriteRowsIgnoreOnDup(c *C) { indexChecksum := verification.MakeKVChecksum(0, 0, 0) encoder, err := ignoreBackend.NewEncoder(s.tbl, &kv.SessionOptions{}) - c.Assert(err, IsNil) + require.NoError(t, err) row, err := encoder.Encode(logger, []types.Datum{ types.NewIntDatum(1), - }, 1, []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1}, "1.csv", 0) - c.Assert(err, IsNil) + }, 1, []int{0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, "1.csv", 0) + require.NoError(t, err) row.ClassifyAndAppend(&dataRows, &dataChecksum, &indexRows, &indexChecksum) writer, err := engine.LocalWriter(ctx, nil) - c.Assert(err, IsNil) + require.NoError(t, err) err = writer.WriteRows(ctx, []string{"a"}, dataRows) - c.Assert(err, IsNil) + require.NoError(t, err) _, err = writer.Close(ctx) - c.Assert(err, IsNil) + require.NoError(t, err) // test encode rows with _tidb_rowid encoder, err = ignoreBackend.NewEncoder(s.tbl, &kv.SessionOptions{}) - c.Assert(err, IsNil) + require.NoError(t, err) rowWithID, err := encoder.Encode(logger, []types.Datum{ types.NewIntDatum(1), types.NewIntDatum(1), // _tidb_rowid field }, 1, []int{0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1}, "2.csv", 0) - c.Assert(err, IsNil) + require.NoError(t, err) // tidbRow is stringer. - c.Assert(fmt.Sprint(rowWithID), Equals, "(1,1)") + require.Equal(t, "(1,1)", fmt.Sprint(rowWithID)) } -func (s *mysqlSuite) TestWriteRowsErrorOnDup(c *C) { +func TestWriteRowsErrorOnDup(t *testing.T) { + s := createMysqlSuite(t) + defer s.TearDownTest(t) s.mockDB. ExpectExec("\\QINSERT INTO `foo`.`bar`(`a`) VALUES(1)\\E"). WillReturnResult(sqlmock.NewResult(1, 1)) @@ -187,7 +188,7 @@ func (s *mysqlSuite) TestWriteRowsErrorOnDup(c *C) { ignoreBackend := tidb.NewTiDBBackend(s.dbHandle, config.ErrorOnDup, errormanager.New(nil, config.NewConfig())) engine, err := ignoreBackend.OpenEngine(ctx, &backend.EngineConfig{}, "`foo`.`bar`", 1) - c.Assert(err, IsNil) + require.NoError(t, err) dataRows := ignoreBackend.MakeEmptyRows() dataChecksum := verification.MakeKVChecksum(0, 0, 0) @@ -195,26 +196,28 @@ func (s *mysqlSuite) TestWriteRowsErrorOnDup(c *C) { indexChecksum := verification.MakeKVChecksum(0, 0, 0) encoder, err := ignoreBackend.NewEncoder(s.tbl, &kv.SessionOptions{}) - c.Assert(err, IsNil) + require.NoError(t, err) row, err := encoder.Encode(logger, []types.Datum{ types.NewIntDatum(1), - }, 1, []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1}, "3.csv", 0) - c.Assert(err, IsNil) + }, 1, []int{0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, "3.csv", 0) + require.NoError(t, err) row.ClassifyAndAppend(&dataRows, &dataChecksum, &indexRows, &indexChecksum) writer, err := engine.LocalWriter(ctx, nil) - c.Assert(err, IsNil) + require.NoError(t, err) err = writer.WriteRows(ctx, []string{"a"}, dataRows) - c.Assert(err, IsNil) + require.NoError(t, err) st, err := writer.Close(ctx) - c.Assert(err, IsNil) - c.Assert(st, IsNil) + require.NoError(t, err) + require.Nil(t, st) } // TODO: temporarily disable this test before we fix strict mode //nolint:unused -func (s *mysqlSuite) testStrictMode(c *C) { +func testStrictMode(t *testing.T) { + s := createMysqlSuite(t) + defer s.TearDownTest(t) ft := *types.NewFieldType(mysql.TypeVarchar) ft.Charset = charset.CharsetUTF8MB4 col0 := &model.ColumnInfo{ID: 1, Name: model.NewCIStr("s0"), State: model.StatePublic, Offset: 0, FieldType: ft} @@ -223,47 +226,51 @@ func (s *mysqlSuite) testStrictMode(c *C) { col1 := &model.ColumnInfo{ID: 2, Name: model.NewCIStr("s1"), State: model.StatePublic, Offset: 1, FieldType: ft} tblInfo := &model.TableInfo{ID: 1, Columns: []*model.ColumnInfo{col0, col1}, PKIsHandle: false, State: model.StatePublic} tbl, err := tables.TableFromMeta(kv.NewPanickingAllocators(0), tblInfo) - c.Assert(err, IsNil) + require.NoError(t, err) bk := tidb.NewTiDBBackend(s.dbHandle, config.ErrorOnDup, errormanager.New(nil, config.NewConfig())) encoder, err := bk.NewEncoder(tbl, &kv.SessionOptions{SQLMode: mysql.ModeStrictAllTables}) - c.Assert(err, IsNil) + require.NoError(t, err) logger := log.L() _, err = encoder.Encode(logger, []types.Datum{ types.NewStringDatum("test"), }, 1, []int{0, -1, -1}, "4.csv", 0) - c.Assert(err, IsNil) + require.NoError(t, err) _, err = encoder.Encode(logger, []types.Datum{ types.NewStringDatum("\xff\xff\xff\xff"), }, 1, []int{0, -1, -1}, "5.csv", 0) - c.Assert(err, ErrorMatches, `.*incorrect utf8 value .* for column s0`) + require.Error(t, err) + require.Regexp(t, `incorrect utf8 value .* for column s0$`, err.Error()) // oepn a new encode because column count changed. encoder, err = bk.NewEncoder(tbl, &kv.SessionOptions{SQLMode: mysql.ModeStrictAllTables}) - c.Assert(err, IsNil) + require.NoError(t, err) _, err = encoder.Encode(logger, []types.Datum{ types.NewStringDatum(""), types.NewStringDatum("非 ASCII 字符串"), }, 1, []int{0, 1, -1}, "6.csv", 0) - c.Assert(err, ErrorMatches, ".*incorrect ascii value .* for column s1") + require.Error(t, err) + require.Regexp(t, "incorrect ascii value .* for column s1$", err.Error()) } -func (s *mysqlSuite) TestFetchRemoteTableModels_3_x(c *C) { +func TestFetchRemoteTableModels_3_x(t *testing.T) { + s := createMysqlSuite(t) + defer s.TearDownTest(t) s.mockDB.ExpectBegin() s.mockDB.ExpectQuery("SELECT version()"). WillReturnRows(sqlmock.NewRows([]string{"version()"}).AddRow("5.7.25-TiDB-v3.0.18")) - s.mockDB.ExpectQuery("\\QSELECT table_name, column_name, column_type, extra FROM information_schema.columns WHERE table_schema = ? ORDER BY table_name, ordinal_position;\\E"). + s.mockDB.ExpectQuery("\\QSELECT table_name, column_name, column_type, generation_expression, extra FROM information_schema.columns WHERE table_schema = ? ORDER BY table_name, ordinal_position;\\E"). WithArgs("test"). - WillReturnRows(sqlmock.NewRows([]string{"table_name", "column_name", "column_type", "extra"}). - AddRow("t", "id", "int(10)", "auto_increment")) + WillReturnRows(sqlmock.NewRows([]string{"table_name", "column_name", "column_type", "generation_expression", "extra"}). + AddRow("t", "id", "int(10)", "", "auto_increment")) s.mockDB.ExpectCommit() bk := tidb.NewTiDBBackend(s.dbHandle, config.ErrorOnDup, errormanager.New(nil, config.NewConfig())) tableInfos, err := bk.FetchRemoteTableModels(context.Background(), "test") - c.Assert(err, IsNil) - c.Assert(tableInfos, DeepEquals, []*model.TableInfo{ + require.NoError(t, err) + require.Equal(t, []*model.TableInfo{ { Name: model.NewCIStr("t"), State: model.StatePublic, @@ -279,17 +286,19 @@ func (s *mysqlSuite) TestFetchRemoteTableModels_3_x(c *C) { }, }, }, - }) + }, tableInfos) } -func (s *mysqlSuite) TestFetchRemoteTableModels_4_0(c *C) { +func TestFetchRemoteTableModels_4_0(t *testing.T) { + s := createMysqlSuite(t) + defer s.TearDownTest(t) s.mockDB.ExpectBegin() s.mockDB.ExpectQuery("SELECT version()"). WillReturnRows(sqlmock.NewRows([]string{"version()"}).AddRow("5.7.25-TiDB-v4.0.0")) - s.mockDB.ExpectQuery("\\QSELECT table_name, column_name, column_type, extra FROM information_schema.columns WHERE table_schema = ? ORDER BY table_name, ordinal_position;\\E"). + s.mockDB.ExpectQuery("\\QSELECT table_name, column_name, column_type, generation_expression, extra FROM information_schema.columns WHERE table_schema = ? ORDER BY table_name, ordinal_position;\\E"). WithArgs("test"). - WillReturnRows(sqlmock.NewRows([]string{"table_name", "column_name", "column_type", "extra"}). - AddRow("t", "id", "bigint(20) unsigned", "auto_increment")) + WillReturnRows(sqlmock.NewRows([]string{"table_name", "column_name", "column_type", "generation_expression", "extra"}). + AddRow("t", "id", "bigint(20) unsigned", "", "auto_increment")) s.mockDB.ExpectQuery("SHOW TABLE `test`.`t` NEXT_ROW_ID"). WillReturnRows(sqlmock.NewRows([]string{"DB_NAME", "TABLE_NAME", "COLUMN_NAME", "NEXT_GLOBAL_ROW_ID"}). AddRow("test", "t", "id", int64(1))) @@ -297,8 +306,8 @@ func (s *mysqlSuite) TestFetchRemoteTableModels_4_0(c *C) { bk := tidb.NewTiDBBackend(s.dbHandle, config.ErrorOnDup, errormanager.New(nil, config.NewConfig())) tableInfos, err := bk.FetchRemoteTableModels(context.Background(), "test") - c.Assert(err, IsNil) - c.Assert(tableInfos, DeepEquals, []*model.TableInfo{ + require.NoError(t, err) + require.Equal(t, []*model.TableInfo{ { Name: model.NewCIStr("t"), State: model.StatePublic, @@ -314,17 +323,19 @@ func (s *mysqlSuite) TestFetchRemoteTableModels_4_0(c *C) { }, }, }, - }) + }, tableInfos) } -func (s *mysqlSuite) TestFetchRemoteTableModels_4_x_auto_increment(c *C) { +func TestFetchRemoteTableModels_4_x_auto_increment(t *testing.T) { + s := createMysqlSuite(t) + defer s.TearDownTest(t) s.mockDB.ExpectBegin() s.mockDB.ExpectQuery("SELECT version()"). WillReturnRows(sqlmock.NewRows([]string{"version()"}).AddRow("5.7.25-TiDB-v4.0.7")) - s.mockDB.ExpectQuery("\\QSELECT table_name, column_name, column_type, extra FROM information_schema.columns WHERE table_schema = ? ORDER BY table_name, ordinal_position;\\E"). + s.mockDB.ExpectQuery("\\QSELECT table_name, column_name, column_type, generation_expression, extra FROM information_schema.columns WHERE table_schema = ? ORDER BY table_name, ordinal_position;\\E"). WithArgs("test"). - WillReturnRows(sqlmock.NewRows([]string{"table_name", "column_name", "column_type", "extra"}). - AddRow("t", "id", "bigint(20)", "")) + WillReturnRows(sqlmock.NewRows([]string{"table_name", "column_name", "column_type", "generation_expression", "extra"}). + AddRow("t", "id", "bigint(20)", "", "")) s.mockDB.ExpectQuery("SHOW TABLE `test`.`t` NEXT_ROW_ID"). WillReturnRows(sqlmock.NewRows([]string{"DB_NAME", "TABLE_NAME", "COLUMN_NAME", "NEXT_GLOBAL_ROW_ID", "ID_TYPE"}). AddRow("test", "t", "id", int64(1), "AUTO_INCREMENT")) @@ -332,8 +343,8 @@ func (s *mysqlSuite) TestFetchRemoteTableModels_4_x_auto_increment(c *C) { bk := tidb.NewTiDBBackend(s.dbHandle, config.ErrorOnDup, errormanager.New(nil, config.NewConfig())) tableInfos, err := bk.FetchRemoteTableModels(context.Background(), "test") - c.Assert(err, IsNil) - c.Assert(tableInfos, DeepEquals, []*model.TableInfo{ + require.NoError(t, err) + require.Equal(t, []*model.TableInfo{ { Name: model.NewCIStr("t"), State: model.StatePublic, @@ -349,17 +360,19 @@ func (s *mysqlSuite) TestFetchRemoteTableModels_4_x_auto_increment(c *C) { }, }, }, - }) + }, tableInfos) } -func (s *mysqlSuite) TestFetchRemoteTableModels_4_x_auto_random(c *C) { +func TestFetchRemoteTableModels_4_x_auto_random(t *testing.T) { + s := createMysqlSuite(t) + defer s.TearDownTest(t) s.mockDB.ExpectBegin() s.mockDB.ExpectQuery("SELECT version()"). WillReturnRows(sqlmock.NewRows([]string{"version()"}).AddRow("5.7.25-TiDB-v4.0.7")) - s.mockDB.ExpectQuery("\\QSELECT table_name, column_name, column_type, extra FROM information_schema.columns WHERE table_schema = ? ORDER BY table_name, ordinal_position;\\E"). + s.mockDB.ExpectQuery("\\QSELECT table_name, column_name, column_type, generation_expression, extra FROM information_schema.columns WHERE table_schema = ? ORDER BY table_name, ordinal_position;\\E"). WithArgs("test"). - WillReturnRows(sqlmock.NewRows([]string{"table_name", "column_name", "column_type", "extra"}). - AddRow("t", "id", "bigint(20)", "")) + WillReturnRows(sqlmock.NewRows([]string{"table_name", "column_name", "column_type", "generation_expression", "extra"}). + AddRow("t", "id", "bigint(20)", "1 + 2", "")) s.mockDB.ExpectQuery("SHOW TABLE `test`.`t` NEXT_ROW_ID"). WillReturnRows(sqlmock.NewRows([]string{"DB_NAME", "TABLE_NAME", "COLUMN_NAME", "NEXT_GLOBAL_ROW_ID", "ID_TYPE"}). AddRow("test", "t", "id", int64(1), "AUTO_RANDOM")) @@ -367,8 +380,8 @@ func (s *mysqlSuite) TestFetchRemoteTableModels_4_x_auto_random(c *C) { bk := tidb.NewTiDBBackend(s.dbHandle, config.ErrorOnDup, errormanager.New(nil, config.NewConfig())) tableInfos, err := bk.FetchRemoteTableModels(context.Background(), "test") - c.Assert(err, IsNil) - c.Assert(tableInfos, DeepEquals, []*model.TableInfo{ + require.NoError(t, err) + require.Equal(t, []*model.TableInfo{ { Name: model.NewCIStr("t"), State: model.StatePublic, @@ -382,15 +395,42 @@ func (s *mysqlSuite) TestFetchRemoteTableModels_4_x_auto_random(c *C) { FieldType: types.FieldType{ Flag: mysql.PriKeyFlag, }, + GeneratedExprString: "1 + 2", }, }, }, - }) + }, tableInfos) } -func (s *mysqlSuite) TestWriteRowsErrorDowngrading(c *C) { +func TestWriteRowsErrorNoRetry(t *testing.T) { nonRetryableError := sql.ErrNoRows + s := createMysqlSuite(t) + defer s.TearDownTest(t) + + // batch insert, fail and rollback. + s.mockDB. + ExpectExec("\\QINSERT INTO `foo`.`bar`(`a`) VALUES(1),(2),(3),(4),(5)\\E"). + WillReturnError(nonRetryableError) + + // disable error record, should not expect retry statements one by one. + ignoreBackend := tidb.NewTiDBBackend(s.dbHandle, config.ErrorOnDup, + errormanager.New(s.dbHandle, &config.Config{}), + ) + dataRows := encodeRowsTiDB(t, ignoreBackend, s.tbl) + ctx := context.Background() + engine, err := ignoreBackend.OpenEngine(ctx, &backend.EngineConfig{}, "`foo`.`bar`", 1) + require.NoError(t, err) + writer, err := engine.LocalWriter(ctx, nil) + require.NoError(t, err) + err = writer.WriteRows(ctx, []string{"a"}, dataRows) + require.Error(t, err) + require.False(t, utils.IsRetryableError(err), "err: %v", err) +} +func TestWriteRowsErrorDowngradingAll(t *testing.T) { + nonRetryableError := sql.ErrNoRows + s := createMysqlSuite(t) + defer s.TearDownTest(t) // First, batch insert, fail and rollback. s.mockDB. ExpectExec("\\QINSERT INTO `foo`.`bar`(`a`) VALUES(1),(2),(3),(4),(5)\\E"). @@ -424,9 +464,69 @@ func (s *mysqlSuite) TestWriteRowsErrorDowngrading(c *C) { ExpectExec("INSERT INTO `tidb_lightning_errors`\\.type_error_v1.*"). WithArgs(sqlmock.AnyArg(), "`foo`.`bar`", "10.csv", int64(0), nonRetryableError.Error(), "(4)"). WillReturnResult(driver.ResultNoRows) + s.mockDB. + ExpectExec("\\QINSERT INTO `foo`.`bar`(`a`) VALUES(5)\\E"). + WillReturnError(nonRetryableError) + s.mockDB. + ExpectExec("INSERT INTO `tidb_lightning_errors`\\.type_error_v1.*"). + WithArgs(sqlmock.AnyArg(), "`foo`.`bar`", "11.csv", int64(0), nonRetryableError.Error(), "(5)"). + WillReturnResult(driver.ResultNoRows) + // disable error record, should not expect retry statements one by one. + ignoreBackend := tidb.NewTiDBBackend(s.dbHandle, config.ErrorOnDup, + errormanager.New(s.dbHandle, &config.Config{ + App: config.Lightning{ + TaskInfoSchemaName: "tidb_lightning_errors", + MaxError: config.MaxError{ + Type: *atomic.NewInt64(10), + }, + }, + }), + ) + dataRows := encodeRowsTiDB(t, ignoreBackend, s.tbl) ctx := context.Background() - logger := log.L() + engine, err := ignoreBackend.OpenEngine(ctx, &backend.EngineConfig{}, "`foo`.`bar`", 1) + require.NoError(t, err) + writer, err := engine.LocalWriter(ctx, nil) + require.NoError(t, err) + err = writer.WriteRows(ctx, []string{"a"}, dataRows) + require.NoError(t, err) +} + +func TestWriteRowsErrorDowngradingExceedThreshold(t *testing.T) { + nonRetryableError := sql.ErrNoRows + s := createMysqlSuite(t) + defer s.TearDownTest(t) + // First, batch insert, fail and rollback. + s.mockDB. + ExpectExec("\\QINSERT INTO `foo`.`bar`(`a`) VALUES(1),(2),(3),(4),(5)\\E"). + WillReturnError(nonRetryableError) + // Then, insert row-by-row due to the non-retryable error. + s.mockDB. + ExpectExec("\\QINSERT INTO `foo`.`bar`(`a`) VALUES(1)\\E"). + WillReturnError(nonRetryableError) + s.mockDB. + ExpectExec("INSERT INTO `tidb_lightning_errors`\\.type_error_v1.*"). + WithArgs(sqlmock.AnyArg(), "`foo`.`bar`", "7.csv", int64(0), nonRetryableError.Error(), "(1)"). + WillReturnResult(driver.ResultNoRows) + s.mockDB. + ExpectExec("\\QINSERT INTO `foo`.`bar`(`a`) VALUES(2)\\E"). + WillReturnError(nonRetryableError) + s.mockDB. + ExpectExec("INSERT INTO `tidb_lightning_errors`\\.type_error_v1.*"). + WithArgs(sqlmock.AnyArg(), "`foo`.`bar`", "8.csv", int64(0), nonRetryableError.Error(), "(2)"). + WillReturnResult(driver.ResultNoRows) + s.mockDB. + ExpectExec("\\QINSERT INTO `foo`.`bar`(`a`) VALUES(3)\\E"). + WillReturnError(nonRetryableError) + s.mockDB. + ExpectExec("INSERT INTO `tidb_lightning_errors`\\.type_error_v1.*"). + WithArgs(sqlmock.AnyArg(), "`foo`.`bar`", "9.csv", int64(0), nonRetryableError.Error(), "(3)"). + WillReturnResult(driver.ResultNoRows) + // the forth row will exceed the error threshold, won't record this error + s.mockDB. + ExpectExec("\\QINSERT INTO `foo`.`bar`(`a`) VALUES(4)\\E"). + WillReturnError(nonRetryableError) ignoreBackend := tidb.NewTiDBBackend(s.dbHandle, config.ErrorOnDup, errormanager.New(s.dbHandle, &config.Config{ @@ -438,56 +538,82 @@ func (s *mysqlSuite) TestWriteRowsErrorDowngrading(c *C) { }, }), ) + dataRows := encodeRowsTiDB(t, ignoreBackend, s.tbl) + ctx := context.Background() engine, err := ignoreBackend.OpenEngine(ctx, &backend.EngineConfig{}, "`foo`.`bar`", 1) - c.Assert(err, IsNil) + require.NoError(t, err) + writer, err := engine.LocalWriter(ctx, nil) + require.NoError(t, err) + err = writer.WriteRows(ctx, []string{"a"}, dataRows) + require.Error(t, err) + st, err := writer.Close(ctx) + require.NoError(t, err) + require.Nil(t, st) +} - dataRows := ignoreBackend.MakeEmptyRows() +func encodeRowsTiDB(t *testing.T, b backend.Backend, tbl table.Table) kv.Rows { + dataRows := b.MakeEmptyRows() dataChecksum := verification.MakeKVChecksum(0, 0, 0) - indexRows := ignoreBackend.MakeEmptyRows() + indexRows := b.MakeEmptyRows() indexChecksum := verification.MakeKVChecksum(0, 0, 0) + logger := log.L() - encoder, err := ignoreBackend.NewEncoder(s.tbl, &kv.SessionOptions{}) - c.Assert(err, IsNil) + encoder, err := b.NewEncoder(tbl, &kv.SessionOptions{}) + require.NoError(t, err) row, err := encoder.Encode(logger, []types.Datum{ types.NewIntDatum(1), - }, 1, []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1}, "7.csv", 0) - c.Assert(err, IsNil) + }, 1, []int{0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, "7.csv", 0) + require.NoError(t, err) row.ClassifyAndAppend(&dataRows, &dataChecksum, &indexRows, &indexChecksum) row, err = encoder.Encode(logger, []types.Datum{ types.NewIntDatum(2), - }, 1, []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1}, "8.csv", 0) - c.Assert(err, IsNil) + }, 1, []int{0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, "8.csv", 0) + require.NoError(t, err) row.ClassifyAndAppend(&dataRows, &dataChecksum, &indexRows, &indexChecksum) row, err = encoder.Encode(logger, []types.Datum{ types.NewIntDatum(3), - }, 1, []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1}, "9.csv", 0) - c.Assert(err, IsNil) + }, 1, []int{0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, "9.csv", 0) + require.NoError(t, err) row.ClassifyAndAppend(&dataRows, &dataChecksum, &indexRows, &indexChecksum) row, err = encoder.Encode(logger, []types.Datum{ types.NewIntDatum(4), - }, 1, []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1}, "10.csv", 0) - c.Assert(err, IsNil) + }, 1, []int{0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, "10.csv", 0) + require.NoError(t, err) row.ClassifyAndAppend(&dataRows, &dataChecksum, &indexRows, &indexChecksum) row, err = encoder.Encode(logger, []types.Datum{ types.NewIntDatum(5), - }, 1, []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, -1}, "11.csv", 0) - c.Assert(err, IsNil) + }, 1, []int{0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, "11.csv", 0) + require.NoError(t, err) row.ClassifyAndAppend(&dataRows, &dataChecksum, &indexRows, &indexChecksum) + return dataRows +} - writer, err := engine.LocalWriter(ctx, nil) - c.Assert(err, IsNil) - err = writer.WriteRows(ctx, []string{"a"}, dataRows) - c.Assert(err, NotNil) - st, err := writer.Close(ctx) - c.Assert(err, IsNil) - c.Assert(st, IsNil) +func TestEncodeRowForRecord(t *testing.T) { + s := createMysqlSuite(t) + + // for a correct row, the will encode a correct result + row := tidb.EncodeRowForRecord(s.tbl, mysql.ModeStrictTransTables, []types.Datum{ + types.NewIntDatum(5), + types.NewStringDatum("test test"), + types.NewBinaryLiteralDatum(types.NewBinaryLiteralFromUint(0xabcdef, 6)), + }, []int{0, -1, -1, -1, -1, -1, -1, -1, 1, 2, -1, -1, -1, -1}) + require.Equal(t, row, "(5,'test test',x'000000abcdef')") + + // the following row will result in column count mismatch error, there for encode + // result will fallback to a "," separated string list. + row = tidb.EncodeRowForRecord(s.tbl, mysql.ModeStrictTransTables, []types.Datum{ + types.NewIntDatum(5), + types.NewStringDatum("test test"), + types.NewBinaryLiteralDatum(types.NewBinaryLiteralFromUint(0xabcdef, 6)), + }, []int{0, -1, -1, -1, -1, -1, -1, -1, 1, 2, 3, -1, -1, -1}) + require.Equal(t, row, "(5, \"test test\", \x00\x00\x00\xab\xcd\xef)") } diff --git a/br/pkg/lightning/checkpoints/glue_checkpoint.go b/br/pkg/lightning/checkpoints/glue_checkpoint.go index db1d3e1a87a27..30b540426f2a7 100644 --- a/br/pkg/lightning/checkpoints/glue_checkpoint.go +++ b/br/pkg/lightning/checkpoints/glue_checkpoint.go @@ -193,7 +193,7 @@ func (g GlueCheckpointsDB) TaskCheckpoint(ctx context.Context) (*TaskCheckpoint, } r := rs[0] defer r.Close() - req := r.NewChunk() + req := r.NewChunk(nil) err = r.Next(ctx, req) if err != nil { return err @@ -242,7 +242,7 @@ func (g GlueCheckpointsDB) Get(ctx context.Context, tableName string) (*TableChe return errors.Trace(err) } r := rs[0] - req := r.NewChunk() + req := r.NewChunk(nil) it := chunk.NewIterator4Chunk(req) for { err = r.Next(ctx, req) @@ -272,7 +272,7 @@ func (g GlueCheckpointsDB) Get(ctx context.Context, tableName string) (*TableChe return errors.Trace(err) } r = rs[0] - req = r.NewChunk() + req = r.NewChunk(nil) it = chunk.NewIterator4Chunk(req) for { err = r.Next(ctx, req) @@ -323,7 +323,7 @@ func (g GlueCheckpointsDB) Get(ctx context.Context, tableName string) (*TableChe } r = rs[0] defer r.Close() - req = r.NewChunk() + req = r.NewChunk(nil) err = r.Next(ctx, req) if err != nil { return err @@ -708,7 +708,7 @@ func (g GlueCheckpointsDB) DestroyErrorCheckpoint(ctx context.Context, tableName return errors.Trace(err) } r := rs[0] - req := r.NewChunk() + req := r.NewChunk(nil) it := chunk.NewIterator4Chunk(req) for { err = r.Next(ctx, req) @@ -787,7 +787,7 @@ func drainFirstRecordSet(ctx context.Context, rss []sqlexec.RecordSet) ([]chunk. } rs := rss[0] var rows []chunk.Row - req := rs.NewChunk() + req := rs.NewChunk(nil) for { err := rs.Next(ctx, req) if err != nil || req.NumRows() == 0 { diff --git a/br/pkg/lightning/common/security.go b/br/pkg/lightning/common/security.go index 1b48213be0a6f..2e7739512bba1 100644 --- a/br/pkg/lightning/common/security.go +++ b/br/pkg/lightning/common/security.go @@ -25,6 +25,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/br/pkg/httputil" + "github.com/tikv/client-go/v2/config" pd "github.com/tikv/pd/client" "google.golang.org/grpc" "google.golang.org/grpc/credentials" @@ -157,6 +158,15 @@ func (tc *TLS) ToPDSecurityOption() pd.SecurityOption { } } +func (tc *TLS) ToTiKVSecurityConfig() config.Security { + return config.Security{ + ClusterSSLCA: tc.caPath, + ClusterSSLCert: tc.certPath, + ClusterSSLKey: tc.keyPath, + ClusterVerifyCN: nil, // FIXME should fill this in? + } +} + func (tc *TLS) TLSConfig() *tls.Config { return tc.inner } diff --git a/br/pkg/lightning/common/storage_unix.go b/br/pkg/lightning/common/storage_unix.go index ba22e92354ceb..465bc912a373b 100644 --- a/br/pkg/lightning/common/storage_unix.go +++ b/br/pkg/lightning/common/storage_unix.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build !windows // +build !windows // TODO: Deduplicate this implementation with DM! diff --git a/br/pkg/lightning/common/storage_windows.go b/br/pkg/lightning/common/storage_windows.go index 21a2398ad66c3..737f21acf8c44 100644 --- a/br/pkg/lightning/common/storage_windows.go +++ b/br/pkg/lightning/common/storage_windows.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build windows // +build windows // TODO: Deduplicate this implementation with DM! diff --git a/br/pkg/lightning/config/config.go b/br/pkg/lightning/config/config.go index 1d7843f7fd59d..d080d1bad16cf 100644 --- a/br/pkg/lightning/config/config.go +++ b/br/pkg/lightning/config/config.go @@ -354,6 +354,67 @@ func (cfg *MaxError) UnmarshalTOML(v interface{}) error { return errors.Errorf("invalid max-error '%v', should be an integer", v) } +// DuplicateResolutionAlgorithm is the config type of how to resolve duplicates. +type DuplicateResolutionAlgorithm int + +const ( + // DupeResAlgNone doesn't detect duplicate. + DupeResAlgNone DuplicateResolutionAlgorithm = iota + + // DupeResAlgRecord only records duplicate records to `lightning_task_info.conflict_error_v1` table on the target TiDB. + DupeResAlgRecord + + // DupeResAlgRemove records all duplicate records like the 'record' algorithm and remove all information related to the + // duplicated rows. Users need to analyze the lightning_task_info.conflict_error_v1 table to add back the correct rows. + DupeResAlgRemove +) + +func (dra *DuplicateResolutionAlgorithm) UnmarshalTOML(v interface{}) error { + if val, ok := v.(string); ok { + return dra.FromStringValue(val) + } + return errors.Errorf("invalid duplicate-resolution '%v', please choose valid option between ['record', 'none', 'remove']", v) +} + +func (dra DuplicateResolutionAlgorithm) MarshalText() ([]byte, error) { + return []byte(dra.String()), nil +} + +func (dra *DuplicateResolutionAlgorithm) FromStringValue(s string) error { + switch strings.ToLower(s) { + case "record": + *dra = DupeResAlgRecord + case "none": + *dra = DupeResAlgNone + case "remove": + *dra = DupeResAlgRemove + default: + return errors.Errorf("invalid duplicate-resolution '%s', please choose valid option between ['record', 'none', 'remove']", s) + } + return nil +} + +func (dra *DuplicateResolutionAlgorithm) MarshalJSON() ([]byte, error) { + return []byte(`"` + dra.String() + `"`), nil +} + +func (dra *DuplicateResolutionAlgorithm) UnmarshalJSON(data []byte) error { + return dra.FromStringValue(strings.Trim(string(data), `"`)) +} + +func (dra DuplicateResolutionAlgorithm) String() string { + switch dra { + case DupeResAlgRecord: + return "record" + case DupeResAlgNone: + return "none" + case DupeResAlgRemove: + return "remove" + default: + panic(fmt.Sprintf("invalid duplicate-resolution type '%d'", dra)) + } +} + // PostRestore has some options which will be executed after kv restored. type PostRestore struct { Checksum PostOpLevel `toml:"checksum" json:"checksum"` @@ -412,6 +473,14 @@ type IgnoreColumns struct { Columns []string `toml:"columns" json:"columns"` } +func (ic *IgnoreColumns) ColumnsMap() map[string]struct{} { + columnMap := make(map[string]struct{}, len(ic.Columns)) + for _, c := range ic.Columns { + columnMap[c] = struct{}{} + } + return columnMap +} + // GetIgnoreColumns gets Ignore config by schema name/regex and table name/regex. func (igCols AllIgnoreColumns) GetIgnoreColumns(db string, table string, caseSensitive bool) (*IgnoreColumns, error) { if !caseSensitive { @@ -448,16 +517,16 @@ type FileRouteRule struct { } type TikvImporter struct { - Addr string `toml:"addr" json:"addr"` - Backend string `toml:"backend" json:"backend"` - OnDuplicate string `toml:"on-duplicate" json:"on-duplicate"` - MaxKVPairs int `toml:"max-kv-pairs" json:"max-kv-pairs"` - SendKVPairs int `toml:"send-kv-pairs" json:"send-kv-pairs"` - RegionSplitSize ByteSize `toml:"region-split-size" json:"region-split-size"` - SortedKVDir string `toml:"sorted-kv-dir" json:"sorted-kv-dir"` - DiskQuota ByteSize `toml:"disk-quota" json:"disk-quota"` - RangeConcurrency int `toml:"range-concurrency" json:"range-concurrency"` - DuplicateDetection bool `toml:"duplicate-detection" json:"duplicate-detection"` + Addr string `toml:"addr" json:"addr"` + Backend string `toml:"backend" json:"backend"` + OnDuplicate string `toml:"on-duplicate" json:"on-duplicate"` + MaxKVPairs int `toml:"max-kv-pairs" json:"max-kv-pairs"` + SendKVPairs int `toml:"send-kv-pairs" json:"send-kv-pairs"` + RegionSplitSize ByteSize `toml:"region-split-size" json:"region-split-size"` + SortedKVDir string `toml:"sorted-kv-dir" json:"sorted-kv-dir"` + DiskQuota ByteSize `toml:"disk-quota" json:"disk-quota"` + RangeConcurrency int `toml:"range-concurrency" json:"range-concurrency"` + DuplicateResolution DuplicateResolutionAlgorithm `toml:"duplicate-resolution" json:"duplicate-resolution"` EngineMemCacheSize ByteSize `toml:"engine-mem-cache-size" json:"engine-mem-cache-size"` LocalWriterMemCacheSize ByteSize `toml:"local-writer-mem-cache-size" json:"local-writer-mem-cache-size"` @@ -483,27 +552,37 @@ type Security struct { KeyPath string `toml:"key-path" json:"key-path"` // RedactInfoLog indicates that whether enabling redact log RedactInfoLog bool `toml:"redact-info-log" json:"redact-info-log"` + + // TLSConfigName is used to set tls config for lightning in DM, so we don't expose this field to user + // DM may running many lightning instances at same time, so we need to set different tls config name for each lightning + TLSConfigName string `toml:"-" json:"-"` } -// RegistersMySQL registers (or deregisters) the TLS config with name "cluster" +// RegisterMySQL registers the TLS config with name "cluster" or security.TLSConfigName // for use in `sql.Open()`. This method is goroutine-safe. func (sec *Security) RegisterMySQL() error { if sec == nil { return nil } tlsConfig, err := common.ToTLSConfig(sec.CAPath, sec.CertPath, sec.KeyPath) - switch { - case err != nil: + if err != nil { return errors.Trace(err) - case tlsConfig != nil: + } + if tlsConfig != nil { // error happens only when the key coincides with the built-in names. - _ = gomysql.RegisterTLSConfig("cluster", tlsConfig) - default: - gomysql.DeregisterTLSConfig("cluster") + _ = gomysql.RegisterTLSConfig(sec.TLSConfigName, tlsConfig) } return nil } +// DeregisterMySQL deregisters the TLS config with security.TLSConfigName +func (sec *Security) DeregisterMySQL() { + if sec == nil || len(sec.CAPath) == 0 { + return + } + gomysql.DeregisterTLSConfig(sec.TLSConfigName) +} + // A duration which can be deserialized from a TOML string. // Implemented as https://github.com/BurntSushi/toml#using-the-encodingtextunmarshaler-interface type Duration struct { @@ -524,6 +603,48 @@ func (d *Duration) MarshalJSON() ([]byte, error) { return []byte(fmt.Sprintf(`"%s"`, d.Duration)), nil } +// Charset defines character set +type Charset int + +const ( + Binary Charset = iota + UTF8MB4 + GB18030 + GBK +) + +// String return the string value of charset +func (c Charset) String() string { + switch c { + case Binary: + return "binary" + case UTF8MB4: + return "utf8mb4" + case GB18030: + return "gb18030" + case GBK: + return "gbk" + default: + return "unknown_charset" + } +} + +// ParseCharset parser character set for string +func ParseCharset(dataCharacterSet string) (Charset, error) { + switch strings.ToLower(dataCharacterSet) { + case "", "binary": + return Binary, nil + case "utf8mb4": + return UTF8MB4, nil + case "gb18030": + return GB18030, nil + case "gbk": + return GBK, nil + default: + return Binary, errors.Errorf("found unsupported data-character-set: %s", dataCharacterSet) + } +} + func NewConfig() *Config { return &Config{ App: Lightning{ @@ -575,12 +696,13 @@ func NewConfig() *Config { DataInvalidCharReplace: string(defaultCSVDataInvalidCharReplace), }, TikvImporter: TikvImporter{ - Backend: "", - OnDuplicate: ReplaceOnDup, - MaxKVPairs: 4096, - SendKVPairs: 32768, - RegionSplitSize: 0, - DiskQuota: ByteSize(math.MaxInt64), + Backend: "", + OnDuplicate: ReplaceOnDup, + MaxKVPairs: 4096, + SendKVPairs: 32768, + RegionSplitSize: 0, + DiskQuota: ByteSize(math.MaxInt64), + DuplicateResolution: DupeResAlgNone, }, PostRestore: PostRestore{ Checksum: OpLevelRequired, @@ -724,6 +846,16 @@ func (cfg *Config) Adjust(ctx context.Context) error { if len(cfg.Mydumper.DataCharacterSet) == 0 { cfg.Mydumper.DataCharacterSet = defaultCSVDataCharacterSet } + charset, err1 := ParseCharset(cfg.Mydumper.DataCharacterSet) + if err1 != nil { + return err1 + } + if charset == GBK || charset == GB18030 { + log.L().Warn( + "incompatible strings may be encountered during the transcoding process and will be replaced, please be aware of the risk of not being able to retain the original information", + zap.String("source-character-set", charset.String()), + zap.ByteString("invalid-char-replacement", []byte(cfg.Mydumper.DataInvalidCharReplace))) + } if cfg.TikvImporter.Backend == "" { return errors.New("tikv-importer.backend must not be empty!") @@ -737,7 +869,6 @@ func (cfg *Config) Adjust(ctx context.Context) error { cfg.PostRestore.Checksum = OpLevelOff cfg.PostRestore.Analyze = OpLevelOff cfg.PostRestore.Compact = false - cfg.TikvImporter.DuplicateDetection = false case BackendImporter, BackendLocal: // RegionConcurrency > NumCPU is meaningless. cpuCount := runtime.NumCPU() @@ -761,8 +892,8 @@ func (cfg *Config) Adjust(ctx context.Context) error { if err := cfg.CheckAndAdjustForLocalBackend(); err != nil { return err } - } else if cfg.TikvImporter.DuplicateDetection { - return errors.Errorf("invalid config: unsupported backend (%s) for duplicate-detection", cfg.TikvImporter.Backend) + } else { + cfg.TikvImporter.DuplicateResolution = DupeResAlgNone } if cfg.TikvImporter.Backend == BackendTiDB { @@ -1003,7 +1134,10 @@ func (cfg *Config) CheckAndAdjustSecurity() error { switch cfg.TiDB.TLS { case "": if len(cfg.TiDB.Security.CAPath) > 0 { - cfg.TiDB.TLS = "cluster" + if cfg.TiDB.Security.TLSConfigName == "" { + cfg.TiDB.Security.TLSConfigName = "cluster" // adjust this the default value + } + cfg.TiDB.TLS = cfg.TiDB.Security.TLSConfigName } else { cfg.TiDB.TLS = "false" } diff --git a/br/pkg/lightning/config/config_test.go b/br/pkg/lightning/config/config_test.go index e46443263053d..07dd7a922da4e 100644 --- a/br/pkg/lightning/config/config_test.go +++ b/br/pkg/lightning/config/config_test.go @@ -323,6 +323,13 @@ func (s *configTestSuite) TestAdjustSecuritySection(c *C) { c.Assert(cfg.TiDB.Security.CAPath, Equals, tc.expectedCA, comment) c.Assert(cfg.TiDB.TLS, Equals, tc.expectedTLS, comment) } + // test different tls config name + cfg := config.NewConfig() + assignMinimalLegalValue(cfg) + cfg.Security.CAPath = "/path/to/ca.pem" + cfg.Security.TLSConfigName = "tidb-tls" + c.Assert(cfg.Adjust(context.Background()), IsNil) + c.Assert(cfg.TiDB.Security.TLSConfigName, Equals, cfg.TiDB.TLS) } func (s *configTestSuite) TestInvalidCSV(c *C) { @@ -507,6 +514,20 @@ func (s *configTestSuite) TestDurationMarshalJSON(c *C) { c.Assert(string(result), Equals, `"13m20s"`) } +func (s *configTestSuite) TestDuplicateResolutionAlgorithm(c *C) { + var dra config.DuplicateResolutionAlgorithm + dra.FromStringValue("record") + c.Assert(dra, Equals, config.DupeResAlgRecord) + dra.FromStringValue("none") + c.Assert(dra, Equals, config.DupeResAlgNone) + dra.FromStringValue("remove") + c.Assert(dra, Equals, config.DupeResAlgRemove) + + c.Assert(config.DupeResAlgRecord.String(), Equals, "record") + c.Assert(config.DupeResAlgNone.String(), Equals, "none") + c.Assert(config.DupeResAlgRemove.String(), Equals, "remove") +} + func (s *configTestSuite) TestLoadConfig(c *C) { cfg, err := config.LoadGlobalConfig([]string{"-tidb-port", "sss"}, nil) c.Assert(err, ErrorMatches, `invalid value "sss" for flag -tidb-port: parse error`) @@ -567,6 +588,13 @@ func (s *configTestSuite) TestLoadConfig(c *C) { result := taskCfg.String() c.Assert(result, Matches, `.*"pd-addr":"172.16.30.11:2379,172.16.30.12:2379".*`) + + cfg, err = config.LoadGlobalConfig([]string{}, nil) + c.Assert(err, IsNil) + c.Assert(cfg.App.Config.File, Matches, ".*lightning.log.*") + cfg, err = config.LoadGlobalConfig([]string{"--log-file", "-"}, nil) + c.Assert(err, IsNil) + c.Assert(cfg.App.Config.File, Equals, "-") } func (s *configTestSuite) TestDefaultImporterBackendValue(c *C) { @@ -840,3 +868,23 @@ func (s *configTestSuite) TestCheckpointKeepStrategy(c *C) { c.Assert(res, DeepEquals, []byte(value)) } } + +func (s configTestSuite) TestLoadCharsetFromConfig(c *C) { + cases := map[string]config.Charset{ + "binary": config.Binary, + "BINARY": config.Binary, + "GBK": config.GBK, + "gbk": config.GBK, + "Gbk": config.GBK, + "gB18030": config.GB18030, + "GB18030": config.GB18030, + } + for k, v := range cases { + charset, err := config.ParseCharset(k) + c.Assert(err, IsNil) + c.Assert(charset, Equals, v) + } + + _, err := config.ParseCharset("Unknown") + c.Assert(err, ErrorMatches, "found unsupported data-character-set: Unknown") +} diff --git a/br/pkg/lightning/config/global.go b/br/pkg/lightning/config/global.go index 7eb8e240c9dfe..d9bd80ef4139a 100644 --- a/br/pkg/lightning/config/global.go +++ b/br/pkg/lightning/config/global.go @@ -200,10 +200,7 @@ func LoadGlobalConfig(args []string, extraFlags func(*flag.FlagSet)) (*GlobalCon if *logFilePath != "" { cfg.App.Config.File = *logFilePath } - // "-" is a special config for log to stdout - if cfg.App.Config.File == "-" { - cfg.App.Config.File = "" - } else if cfg.App.Config.File == "" { + if cfg.App.Config.File == "" { cfg.App.Config.File = timestampLogFileName() } if *tidbHost != "" { diff --git a/br/pkg/lightning/errormanager/errormanager.go b/br/pkg/lightning/errormanager/errormanager.go index 7d4d00904d1f7..4d1e7c0fedf60 100644 --- a/br/pkg/lightning/errormanager/errormanager.go +++ b/br/pkg/lightning/errormanager/errormanager.go @@ -1,10 +1,26 @@ +// Copyright 2021 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, +// 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. + package errormanager import ( "context" "database/sql" "fmt" + "strings" + "github.com/pingcap/errors" "github.com/pingcap/tidb/br/pkg/lightning/common" "github.com/pingcap/tidb/br/pkg/lightning/config" "github.com/pingcap/tidb/br/pkg/lightning/log" @@ -52,13 +68,13 @@ const ( create_time datetime(6) NOT NULL DEFAULT now(6), table_name varchar(261) NOT NULL, index_name varchar(128) NOT NULL, - key_data text NOT NULL, -- decoded from raw_key, human readable only, not for machine use - row_data text NOT NULL, -- decoded from raw_row, human readable only, not for machine use - raw_key mediumblob NOT NULL, -- the conflicted key - raw_value mediumblob NOT NULL, -- the value of the conflicted key - raw_handle mediumblob NOT NULL, -- the data handle derived from the conflicted key or value - raw_row mediumblob NOT NULL, -- the data retrieved from the handle - KEY (raw_key(64), task_id) + key_data text NOT NULL COMMENT 'decoded from raw_key, human readable only, not for machine use', + row_data text NOT NULL COMMENT 'decoded from raw_row, human readable only, not for machine use', + raw_key mediumblob NOT NULL COMMENT 'the conflicted key', + raw_value mediumblob NOT NULL COMMENT 'the value of the conflicted key', + raw_handle mediumblob NOT NULL COMMENT 'the data handle derived from the conflicted key or value', + raw_row mediumblob NOT NULL COMMENT 'the data retrieved from the handle', + KEY (task_id, table_name) ); ` @@ -79,6 +95,13 @@ const ( (task_id, table_name, index_name, key_data, row_data, raw_key, raw_value, raw_handle, raw_row) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?); ` + + selectConflictKeys = ` + SELECT _tidb_rowid, raw_handle, raw_row + FROM %s.` + conflictErrorTableName + ` + WHERE table_name = ? AND _tidb_rowid > ? + ORDER BY _tidb_rowid LIMIT ?; + ` ) type ErrorManager struct { @@ -86,6 +109,11 @@ type ErrorManager struct { taskID int64 schemaEscaped string remainingError config.MaxError + dupResolution config.DuplicateResolutionAlgorithm +} + +func (em *ErrorManager) TypeErrorsRemain() int64 { + return em.remainingError.Type.Load() } // New creates a new error manager. @@ -93,6 +121,7 @@ func New(db *sql.DB, cfg *config.Config) *ErrorManager { em := &ErrorManager{ taskID: cfg.TaskID, remainingError: cfg.App.MaxError, + dupResolution: cfg.TikvImporter.DuplicateResolution, } if len(cfg.App.TaskInfoSchemaName) != 0 { em.db = db @@ -103,7 +132,7 @@ func New(db *sql.DB, cfg *config.Config) *ErrorManager { // Init creates the schemas and tables to store the task information. func (em *ErrorManager) Init(ctx context.Context) error { - if em.db == nil { + if em.db == nil || (em.remainingError.Type.Load() == 0 && em.dupResolution == config.DupeResAlgNone) { return nil } @@ -112,15 +141,21 @@ func (em *ErrorManager) Init(ctx context.Context) error { Logger: log.L(), } - sqls := [][2]string{ - {"create task info schema", createSchema}, - {"create syntax error table", createSyntaxErrorTable}, - {"create type error table", createTypeErrorTable}, - {"create conflict error table", createConflictErrorTable}, + sqls := make([][2]string, 0) + sqls = append(sqls, [2]string{"create task info schema", createSchema}) + if em.remainingError.Syntax.Load() > 0 { + sqls = append(sqls, [2]string{"create syntax error table", createSyntaxErrorTable}) + } + if em.remainingError.Type.Load() > 0 { + sqls = append(sqls, [2]string{"create type error table", createTypeErrorTable}) + } + if em.dupResolution != config.DupeResAlgNone && em.remainingError.Conflict.Load() > 0 { + sqls = append(sqls, [2]string{"create conflict error table", createConflictErrorTable}) } for _, sql := range sqls { - err := exec.Exec(ctx, sql[0], fmt.Sprintf(sql[1], em.schemaEscaped)) + // trim spaces for unit test pattern matching + err := exec.Exec(ctx, sql[0], strings.TrimSpace(fmt.Sprintf(sql[1], em.schemaEscaped))) if err != nil { return err } @@ -140,6 +175,11 @@ func (em *ErrorManager) RecordTypeError( rowText string, encodeErr error, ) error { + // elide the encode error if needed. + if em.remainingError.Type.Dec() < 0 { + return encodeErr + } + if em.db != nil { errMsg := encodeErr.Error() logger = logger.With( @@ -165,11 +205,6 @@ func (em *ErrorManager) RecordTypeError( return multierr.Append(encodeErr, err) } } - - // elide the encode error if needed. - if em.remainingError.Type.Dec() < 0 { - return encodeErr - } return nil } @@ -260,3 +295,31 @@ func (em *ErrorManager) RecordIndexConflictError( return nil }) } + +// GetConflictKeys obtains all (distinct) conflicting rows (handle and their +// values) from the current error report. +func (em *ErrorManager) GetConflictKeys(ctx context.Context, tableName string, prevRowID int64, limit int) (handleRows [][2][]byte, lastRowID int64, err error) { + if em.db == nil { + return nil, 0, nil + } + rows, err := em.db.QueryContext( + ctx, + fmt.Sprintf(selectConflictKeys, em.schemaEscaped), + tableName, + prevRowID, + limit, + ) + if err != nil { + return nil, 0, errors.Trace(err) + } + defer rows.Close() + + for rows.Next() { + var handleRow [2][]byte + if err := rows.Scan(&lastRowID, &handleRow[0], &handleRow[1]); err != nil { + return nil, 0, errors.Trace(err) + } + handleRows = append(handleRows, handleRow) + } + return handleRows, lastRowID, errors.Trace(rows.Err()) +} diff --git a/br/pkg/lightning/errormanager/errormanager_test.go b/br/pkg/lightning/errormanager/errormanager_test.go new file mode 100644 index 0000000000000..2b5aba0e07605 --- /dev/null +++ b/br/pkg/lightning/errormanager/errormanager_test.go @@ -0,0 +1,83 @@ +// Copyright 2021 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, +// 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. + +package errormanager + +import ( + "context" + "testing" + + "github.com/DATA-DOG/go-sqlmock" + . "github.com/pingcap/check" + "github.com/pingcap/tidb/br/pkg/lightning/config" +) + +var _ = Suite(errorManagerSuite{}) + +func TestErrorManager(t *testing.T) { + TestingT(t) +} + +type errorManagerSuite struct{} + +func (e errorManagerSuite) TestInit(c *C) { + db, mock, err := sqlmock.New() + c.Assert(err, IsNil) + + cfg := config.NewConfig() + cfg.TikvImporter.DuplicateResolution = config.DupeResAlgRecord + cfg.App.MaxError.Type.Store(10) + cfg.App.TaskInfoSchemaName = "lightning_errors" + + em := New(db, cfg) + c.Assert(em.dupResolution, Equals, cfg.TikvImporter.DuplicateResolution) + c.Assert(em.remainingError.Type.Load(), Equals, cfg.App.MaxError.Type.Load()) + c.Assert(em.remainingError.Conflict.Load(), Equals, cfg.App.MaxError.Conflict.Load()) + + em.remainingError.Type.Store(0) + em.dupResolution = config.DupeResAlgNone + ctx := context.Background() + err = em.Init(ctx) + c.Assert(err, IsNil) + + em.dupResolution = config.DupeResAlgRecord + mock.ExpectExec("CREATE SCHEMA IF NOT EXISTS `lightning_errors`;"). + WillReturnResult(sqlmock.NewResult(1, 1)) + mock.ExpectExec("CREATE TABLE IF NOT EXISTS `lightning_errors`\\.conflict_error_v1.*"). + WillReturnResult(sqlmock.NewResult(2, 1)) + err = em.Init(ctx) + c.Assert(err, IsNil) + + em.dupResolution = config.DupeResAlgNone + em.remainingError.Type.Store(1) + mock.ExpectExec("CREATE SCHEMA IF NOT EXISTS `lightning_errors`;"). + WillReturnResult(sqlmock.NewResult(3, 1)) + mock.ExpectExec("CREATE TABLE IF NOT EXISTS `lightning_errors`\\.type_error_v1.*"). + WillReturnResult(sqlmock.NewResult(4, 1)) + err = em.Init(ctx) + c.Assert(err, IsNil) + + em.dupResolution = config.DupeResAlgRecord + em.remainingError.Type.Store(1) + mock.ExpectExec("CREATE SCHEMA IF NOT EXISTS `lightning_errors`.*"). + WillReturnResult(sqlmock.NewResult(5, 1)) + mock.ExpectExec("CREATE TABLE IF NOT EXISTS `lightning_errors`\\.type_error_v1.*"). + WillReturnResult(sqlmock.NewResult(6, 1)) + mock.ExpectExec("CREATE TABLE IF NOT EXISTS `lightning_errors`\\.conflict_error_v1.*"). + WillReturnResult(sqlmock.NewResult(7, 1)) + err = em.Init(ctx) + c.Assert(err, IsNil) + + c.Assert(mock.ExpectationsWereMet(), IsNil) +} diff --git a/br/pkg/lightning/lightning.go b/br/pkg/lightning/lightning.go index b068e4bad33f7..9fc40cdf77144 100644 --- a/br/pkg/lightning/lightning.go +++ b/br/pkg/lightning/lightning.go @@ -75,6 +75,9 @@ type Lightning struct { } func initEnv(cfg *config.GlobalConfig) error { + if cfg.App.Config.File == "" { + return nil + } return log.InitLogger(&cfg.App.Config, cfg.TiDB.LogLevel) } @@ -199,7 +202,9 @@ func (l *Lightning) RunOnce(taskCtx context.Context, taskCfg *config.Config, glu } func (l *Lightning) RunServer() error { + l.serverLock.Lock() l.taskCfgs = config.NewConfigList() + l.serverLock.Unlock() log.L().Info( "Lightning server is running, post to /tasks to start an import task", zap.Stringer("address", l.serverAddr), @@ -269,10 +274,7 @@ func (l *Lightning) run(taskCtx context.Context, taskCfg *config.Config, g glue. if taskCfg.TiDB.Security == nil { return } - taskCfg.TiDB.Security.CAPath = "" - if err := taskCfg.TiDB.Security.RegisterMySQL(); err != nil { - log.L().Warn("failed to deregister TLS config", log.ShortError(err)) - } + taskCfg.TiDB.Security.DeregisterMySQL() }() // initiation of default glue should be after RegisterMySQL, which is ready to be called after taskCfg.Adjust @@ -294,6 +296,19 @@ func (l *Lightning) run(taskCtx context.Context, taskCfg *config.Config, g glue. return errors.Annotate(err, "create storage failed") } + // return expectedErr means at least meet one file + expectedErr := errors.New("Stop Iter") + walkErr := s.WalkDir(ctx, &storage.WalkOption{ListCount: 1}, func(string, int64) error { + // return an error when meet the first regular file to break the walk loop + return expectedErr + }) + if !errors.ErrorEqual(walkErr, expectedErr) { + if walkErr == nil { + return errors.Errorf("data-source-dir '%s' doesn't exist or contains no files", taskCfg.Mydumper.SourceDir) + } + return errors.Annotatef(walkErr, "visit data-source-dir '%s' failed", taskCfg.Mydumper.SourceDir) + } + loadTask := log.L().Begin(zap.InfoLevel, "load data source") var mdl *mydump.MDLoader mdl, err = mydump.NewMyDumpLoaderWithStore(ctx, taskCfg, s) @@ -413,12 +428,13 @@ func (l *Lightning) handleGetTask(w http.ResponseWriter) { Current *int64 `json:"current"` QueuedIDs []int64 `json:"queue"` } - + l.serverLock.Lock() if l.taskCfgs != nil { response.QueuedIDs = l.taskCfgs.AllIDs() } else { response.QueuedIDs = []int64{} } + l.serverLock.Unlock() l.cancelLock.Lock() if l.cancel != nil && l.curTask != nil { @@ -460,7 +476,8 @@ func (l *Lightning) handleGetOneTask(w http.ResponseWriter, req *http.Request, t func (l *Lightning) handlePostTask(w http.ResponseWriter, req *http.Request) { w.Header().Set("Cache-Control", "no-store") - + l.serverLock.Lock() + defer l.serverLock.Unlock() if l.taskCfgs == nil { // l.taskCfgs is non-nil only if Lightning is started with RunServer(). // Without the server mode this pointer is default to be nil. diff --git a/br/pkg/lightning/lightning_serial_test.go b/br/pkg/lightning/lightning_serial_test.go new file mode 100644 index 0000000000000..bd268c3d3c39f --- /dev/null +++ b/br/pkg/lightning/lightning_serial_test.go @@ -0,0 +1,216 @@ +// Copyright 2019 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, +// 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. + +package lightning + +import ( + "context" + "path/filepath" + "runtime" + "testing" + + "github.com/docker/go-units" + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/br/pkg/lightning/checkpoints" + "github.com/pingcap/tidb/br/pkg/lightning/config" + "github.com/pingcap/tidb/br/pkg/lightning/glue" + "github.com/pingcap/tidb/br/pkg/lightning/mydump" + "github.com/stretchr/testify/require" +) + +func TestInitEnv(t *testing.T) { + cfg := &config.GlobalConfig{ + App: config.GlobalLightning{StatusAddr: ":45678"}, + } + err := initEnv(cfg) + require.NoError(t, err) + + cfg.App.StatusAddr = "" + cfg.App.Config.File = "." + err = initEnv(cfg) + require.EqualError(t, err, "can't use directory as log file name") +} + +func TestRun(t *testing.T) { + globalConfig := config.NewGlobalConfig() + globalConfig.TiDB.Host = "test.invalid" + globalConfig.TiDB.Port = 4000 + globalConfig.TiDB.PdAddr = "test.invalid:2379" + globalConfig.Mydumper.SourceDir = "not-exists" + globalConfig.TikvImporter.Backend = config.BackendLocal + globalConfig.TikvImporter.SortedKVDir = t.TempDir() + lightning := New(globalConfig) + cfg := config.NewConfig() + err := cfg.LoadFromGlobal(globalConfig) + require.NoError(t, err) + err = lightning.RunOnce(context.Background(), cfg, nil) + require.Error(t, err) + require.Regexp(t, "mydumper dir does not exist$", err.Error()) + + path, _ := filepath.Abs(".") + ctx := context.Background() + invalidGlue := glue.NewExternalTiDBGlue(nil, 0) + err = lightning.run(ctx, &config.Config{ + Mydumper: config.MydumperRuntime{ + SourceDir: "file://" + filepath.ToSlash(path), + Filter: []string{"*.*"}, + DefaultFileRules: true, + }, + Checkpoint: config.Checkpoint{ + Enable: true, + Driver: "invalid", + }, + }, invalidGlue) + require.EqualError(t, err, "open checkpoint db failed: Unknown checkpoint driver invalid") + + err = lightning.run(ctx, &config.Config{ + Mydumper: config.MydumperRuntime{ + SourceDir: ".", + Filter: []string{"*.*"}, + }, + Checkpoint: config.Checkpoint{ + Enable: true, + Driver: "file", + DSN: "any-file", + }, + }, invalidGlue) + require.Error(t, err) +} + +func TestCheckSystemRequirement(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("Local-backend is not supported on Windows") + return + } + + cfg := config.NewConfig() + cfg.App.RegionConcurrency = 16 + cfg.App.CheckRequirements = true + cfg.App.TableConcurrency = 4 + cfg.TikvImporter.Backend = config.BackendLocal + cfg.TikvImporter.LocalWriterMemCacheSize = 128 * units.MiB + cfg.TikvImporter.RangeConcurrency = 16 + + dbMetas := []*mydump.MDDatabaseMeta{ + { + Tables: []*mydump.MDTableMeta{ + { + TotalSize: 500 << 20, + }, + { + TotalSize: 150_000 << 20, + }, + }, + }, + { + Tables: []*mydump.MDTableMeta{ + { + TotalSize: 150_800 << 20, + }, + { + TotalSize: 35 << 20, + }, + { + TotalSize: 100_000 << 20, + }, + }, + }, + { + Tables: []*mydump.MDTableMeta{ + { + TotalSize: 240 << 20, + }, + { + TotalSize: 124_000 << 20, + }, + }, + }, + } + + err := failpoint.Enable("github.com/pingcap/tidb/br/pkg/lightning/backend/local/GetRlimitValue", "return(139415)") + require.NoError(t, err) + err = failpoint.Enable("github.com/pingcap/tidb/br/pkg/lightning/backend/local/SetRlimitError", "return(true)") + require.NoError(t, err) + defer func() { + _ = failpoint.Disable("github.com/pingcap/tidb/br/pkg/lightning/backend/local/SetRlimitError") + }() + // with this dbMetas, the estimated fds will be 139416, so should return error + err = checkSystemRequirement(cfg, dbMetas) + require.Error(t, err) + + err = failpoint.Disable("github.com/pingcap/tidb/br/pkg/lightning/backend/local/GetRlimitValue") + require.NoError(t, err) + + // the min rlimit should be not smaller than the default min value (139416) + err = failpoint.Enable("github.com/pingcap/tidb/br/pkg/lightning/backend/local/GetRlimitValue", "return(139416)") + defer func() { + _ = failpoint.Disable("github.com/pingcap/tidb/br/pkg/lightning/backend/local/GetRlimitValue") + }() + require.NoError(t, err) + err = checkSystemRequirement(cfg, dbMetas) + require.NoError(t, err) +} + +func TestCheckSchemaConflict(t *testing.T) { + cfg := config.NewConfig() + cfg.Checkpoint.Schema = "cp" + cfg.Checkpoint.Driver = config.CheckpointDriverMySQL + + dbMetas := []*mydump.MDDatabaseMeta{ + { + Name: "test", + Tables: []*mydump.MDTableMeta{ + { + Name: checkpoints.CheckpointTableNameTable, + }, + { + Name: checkpoints.CheckpointTableNameEngine, + }, + }, + }, + { + Name: "cp", + Tables: []*mydump.MDTableMeta{ + { + Name: "test", + }, + }, + }, + } + err := checkSchemaConflict(cfg, dbMetas) + require.NoError(t, err) + + dbMetas = append(dbMetas, &mydump.MDDatabaseMeta{ + Name: "cp", + Tables: []*mydump.MDTableMeta{ + { + Name: checkpoints.CheckpointTableNameChunk, + }, + { + Name: "test123", + }, + }, + }) + err = checkSchemaConflict(cfg, dbMetas) + require.Error(t, err) + + cfg.Checkpoint.Enable = false + err = checkSchemaConflict(cfg, dbMetas) + require.NoError(t, err) + + cfg.Checkpoint.Enable = true + cfg.Checkpoint.Driver = config.CheckpointDriverFile + err = checkSchemaConflict(cfg, dbMetas) + require.NoError(t, err) +} diff --git a/br/pkg/lightning/lightning_server_serial_test.go b/br/pkg/lightning/lightning_server_serial_test.go new file mode 100644 index 0000000000000..099299f7f7d4e --- /dev/null +++ b/br/pkg/lightning/lightning_server_serial_test.go @@ -0,0 +1,374 @@ +// Copyright 2021 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, +// 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. + +// Contexts for HTTP requests communicating with a real HTTP server are essential, +// however, when the subject is a mocked server, it would probably be redundant. +//nolint:noctx + +package lightning + +import ( + "context" + "encoding/json" + "fmt" + "net/http" + "strings" + "testing" + "time" + + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/br/pkg/lightning/config" + "github.com/stretchr/testify/require" +) + +type lightningServerSuite struct { + lightning *Lightning + taskCfgCh chan *config.Config + taskRunCh chan struct{} +} + +func createSuite(t *testing.T) (s *lightningServerSuite, clean func()) { + cfg := config.NewGlobalConfig() + cfg.TiDB.Host = "test.invalid" + cfg.TiDB.Port = 4000 + cfg.TiDB.PdAddr = "test.invalid:2379" + cfg.App.ServerMode = true + cfg.App.StatusAddr = "127.0.0.1:0" + cfg.Mydumper.SourceDir = "file://." + cfg.TikvImporter.Backend = config.BackendLocal + cfg.TikvImporter.SortedKVDir = t.TempDir() + + s = new(lightningServerSuite) + s.lightning = New(cfg) + s.taskRunCh = make(chan struct{}, 1) + s.taskCfgCh = make(chan *config.Config) + s.lightning.ctx = context.WithValue(s.lightning.ctx, taskRunNotifyKey, s.taskRunCh) + s.lightning.ctx = context.WithValue(s.lightning.ctx, taskCfgRecorderKey, s.taskCfgCh) + _ = s.lightning.GoServe() + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/br/pkg/lightning/SkipRunTask", "return")) + clean = func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/br/pkg/lightning/SkipRunTask")) + s.lightning.Stop() + } + + return +} + +func TestRunServer(t *testing.T) { + s, clean := createSuite(t) + defer clean() + + url := "http://" + s.lightning.serverAddr.String() + "/tasks" + + resp, err := http.Post(url, "application/toml", strings.NewReader("????")) + require.NoError(t, err) + require.Equal(t, http.StatusNotImplemented, resp.StatusCode) + var data map[string]string + err = json.NewDecoder(resp.Body).Decode(&data) + require.NoError(t, err) + require.Contains(t, data, "error") + require.Equal(t, "server-mode not enabled", data["error"]) + require.NoError(t, resp.Body.Close()) + + go func() { + _ = s.lightning.RunServer() + }() + time.Sleep(100 * time.Millisecond) + + req, err := http.NewRequest(http.MethodPut, url, nil) + require.NoError(t, err) + resp, err = http.DefaultClient.Do(req) + require.NoError(t, err) + require.Equal(t, http.StatusMethodNotAllowed, resp.StatusCode) + require.Contains(t, resp.Header.Get("Allow"), http.MethodPost) + require.NoError(t, resp.Body.Close()) + + resp, err = http.Post(url, "application/toml", strings.NewReader("????")) + require.NoError(t, err) + require.Equal(t, http.StatusBadRequest, resp.StatusCode) + err = json.NewDecoder(resp.Body).Decode(&data) + require.NoError(t, err) + require.Contains(t, data, "error") + require.Regexp(t, "^cannot parse task", data["error"]) + require.NoError(t, resp.Body.Close()) + + resp, err = http.Post(url, "application/toml", strings.NewReader("[mydumper.csv]\nseparator = 'fooo'\ndelimiter= 'foo'")) + require.NoError(t, err) + require.Equal(t, http.StatusBadRequest, resp.StatusCode) + err = json.NewDecoder(resp.Body).Decode(&data) + require.NoError(t, err) + require.Contains(t, data, "error") + require.Regexp(t, "^invalid task configuration:", data["error"]) + require.NoError(t, resp.Body.Close()) + + for i := 0; i < 20; i++ { + resp, err = http.Post(url, "application/toml", strings.NewReader(fmt.Sprintf(` + [mydumper] + data-source-dir = 'file://demo-path-%d' + [mydumper.csv] + separator = '/' + `, i))) + require.NoError(t, err) + require.Equal(t, http.StatusOK, resp.StatusCode) + var result map[string]int + err = json.NewDecoder(resp.Body).Decode(&result) + require.NoError(t, resp.Body.Close()) + require.NoError(t, err) + require.Contains(t, result, "id") + + select { + case taskCfg := <-s.taskCfgCh: + require.Equal(t, "test.invalid", taskCfg.TiDB.Host) + require.Equal(t, fmt.Sprintf("file://demo-path-%d", i), taskCfg.Mydumper.SourceDir) + require.Equal(t, "/", taskCfg.Mydumper.CSV.Separator) + case <-time.After(5 * time.Second): + t.Fatalf("task is not queued after 5 seconds (i = %d)", i) + } + } +} + +func TestGetDeleteTask(t *testing.T) { + s, clean := createSuite(t) + defer clean() + + url := "http://" + s.lightning.serverAddr.String() + "/tasks" + + type getAllResultType struct { + Current int64 + Queue []int64 + } + + getAllTasks := func() (result getAllResultType) { + resp, err := http.Get(url) + require.NoError(t, err) + require.Equal(t, http.StatusOK, resp.StatusCode) + err = json.NewDecoder(resp.Body).Decode(&result) + require.NoError(t, resp.Body.Close()) + require.NoError(t, err) + return + } + + postTask := func(i int) int64 { + resp, err := http.Post(url, "application/toml", strings.NewReader(fmt.Sprintf(` + [mydumper] + data-source-dir = 'file://demo-path-%d' + `, i))) + require.NoError(t, err) + require.Equal(t, http.StatusOK, resp.StatusCode) + var result struct{ ID int64 } + err = json.NewDecoder(resp.Body).Decode(&result) + require.NoError(t, resp.Body.Close()) + require.NoError(t, err) + return result.ID + } + + go func() { + _ = s.lightning.RunServer() + }() + time.Sleep(500 * time.Millisecond) + + // Check `GET /tasks` without any active tasks + require.Equal(t, getAllResultType{ + Current: 0, + Queue: []int64{}, + }, getAllTasks()) + + first := postTask(1) + second := postTask(2) + third := postTask(3) + + require.NotEqual(t, 123456, first) + require.NotEqual(t, 123456, second) + require.NotEqual(t, 123456, third) + + // Check `GET /tasks` returns all tasks currently running + + <-s.taskRunCh + require.Equal(t, getAllResultType{ + Current: first, + Queue: []int64{second, third}, + }, getAllTasks()) + + // Check `GET /tasks/abcdef` returns error + + resp, err := http.Get(url + "/abcdef") + require.NoError(t, err) + require.Equal(t, http.StatusBadRequest, resp.StatusCode) + require.NoError(t, resp.Body.Close()) + + // Check `GET /tasks/123456` returns not found + + resp, err = http.Get(url + "/123456") + require.NoError(t, err) + require.Equal(t, http.StatusNotFound, resp.StatusCode) + require.NoError(t, resp.Body.Close()) + + // Check `GET /tasks/1` returns the desired cfg + + var resCfg config.Config + + resp, err = http.Get(fmt.Sprintf("%s/%d", url, second)) + require.NoError(t, err) + require.Equal(t, http.StatusOK, resp.StatusCode) + err = json.NewDecoder(resp.Body).Decode(&resCfg) + require.NoError(t, resp.Body.Close()) + require.NoError(t, err) + require.Equal(t, "file://demo-path-2", resCfg.Mydumper.SourceDir) + + resp, err = http.Get(fmt.Sprintf("%s/%d", url, first)) + require.NoError(t, err) + require.Equal(t, http.StatusOK, resp.StatusCode) + err = json.NewDecoder(resp.Body).Decode(&resCfg) + require.NoError(t, resp.Body.Close()) + require.NoError(t, err) + require.Equal(t, "file://demo-path-1", resCfg.Mydumper.SourceDir) + + // Check `DELETE /tasks` returns error. + + req, err := http.NewRequest(http.MethodDelete, url, nil) + require.NoError(t, err) + resp, err = http.DefaultClient.Do(req) + require.NoError(t, err) + require.Equal(t, http.StatusBadRequest, resp.StatusCode) + require.NoError(t, resp.Body.Close()) + + // Check `DELETE /tasks/` returns error. + + req.URL.Path = "/tasks/" + resp, err = http.DefaultClient.Do(req) + require.NoError(t, err) + require.Equal(t, http.StatusBadRequest, resp.StatusCode) + require.NoError(t, resp.Body.Close()) + + // Check `DELETE /tasks/(not a number)` returns error. + + req.URL.Path = "/tasks/abcdef" + resp, err = http.DefaultClient.Do(req) + require.NoError(t, err) + require.Equal(t, http.StatusBadRequest, resp.StatusCode) + require.NoError(t, resp.Body.Close()) + + // Check `DELETE /tasks/123456` returns not found + + req.URL.Path = "/tasks/123456" + resp, err = http.DefaultClient.Do(req) + require.NoError(t, err) + require.Equal(t, http.StatusNotFound, resp.StatusCode) + require.NoError(t, resp.Body.Close()) + + // Cancel a queued task, then verify the task list. + + req.URL.Path = fmt.Sprintf("/tasks/%d", second) + resp, err = http.DefaultClient.Do(req) + require.NoError(t, err) + require.Equal(t, http.StatusOK, resp.StatusCode) + require.NoError(t, resp.Body.Close()) + + require.Equal(t, getAllResultType{ + Current: first, + Queue: []int64{third}, + }, getAllTasks()) + + // Cancel a running task, then verify the task list. + + req.URL.Path = fmt.Sprintf("/tasks/%d", first) + resp, err = http.DefaultClient.Do(req) + require.NoError(t, err) + require.Equal(t, http.StatusOK, resp.StatusCode) + require.NoError(t, resp.Body.Close()) + + <-s.taskRunCh + require.Equal(t, getAllResultType{ + Current: third, + Queue: []int64{}, + }, getAllTasks()) +} + +func TestHTTPAPIOutsideServerMode(t *testing.T) { + s, clean := createSuite(t) + defer clean() + + s.lightning.globalCfg.App.ServerMode = false + + url := "http://" + s.lightning.serverAddr.String() + "/tasks" + + errCh := make(chan error) + cfg := config.NewConfig() + cfg.TiDB.DistSQLScanConcurrency = 4 + err := cfg.LoadFromGlobal(s.lightning.globalCfg) + require.NoError(t, err) + go func() { + errCh <- s.lightning.RunOnce(s.lightning.ctx, cfg, nil) + }() + time.Sleep(600 * time.Millisecond) + + var curTask struct { + Current int64 + Queue []int64 + } + + // `GET /tasks` should work fine. + resp, err := http.Get(url) + require.NoError(t, err) + require.Equal(t, http.StatusOK, resp.StatusCode) + err = json.NewDecoder(resp.Body).Decode(&curTask) + require.NoError(t, resp.Body.Close()) + require.NoError(t, err) + require.NotEqual(t, int64(0), curTask.Current) + require.Len(t, curTask.Queue, 0) + + // `POST /tasks` should return 501 + resp, err = http.Post(url, "application/toml", strings.NewReader("??????")) + require.NoError(t, err) + require.Equal(t, http.StatusNotImplemented, resp.StatusCode) + require.NoError(t, resp.Body.Close()) + + // `GET /tasks/(current)` should work fine. + resp, err = http.Get(fmt.Sprintf("%s/%d", url, curTask.Current)) + require.NoError(t, err) + require.Equal(t, http.StatusOK, resp.StatusCode) + require.NoError(t, resp.Body.Close()) + + // `GET /tasks/123456` should return 404 + resp, err = http.Get(url + "/123456") + require.NoError(t, err) + require.Equal(t, http.StatusNotFound, resp.StatusCode) + require.NoError(t, resp.Body.Close()) + + // `PATCH /tasks/(current)/front` should return 501 + req, err := http.NewRequest(http.MethodPatch, fmt.Sprintf("%s/%d/front", url, curTask.Current), nil) + require.NoError(t, err) + resp, err = http.DefaultClient.Do(req) + require.NoError(t, err) + require.Equal(t, http.StatusNotImplemented, resp.StatusCode) + require.NoError(t, resp.Body.Close()) + + // `DELETE /tasks/123456` should return 404 + req.Method = http.MethodDelete + req.URL.Path = "/tasks/123456" + resp, err = http.DefaultClient.Do(req) + require.NoError(t, err) + require.Equal(t, http.StatusNotFound, resp.StatusCode) + require.NoError(t, resp.Body.Close()) + + // `DELETE /tasks/(current)` should return 200 + req.URL.Path = fmt.Sprintf("/tasks/%d", curTask.Current) + resp, err = http.DefaultClient.Do(req) + require.NoError(t, err) + require.Equal(t, http.StatusOK, resp.StatusCode) + require.NoError(t, resp.Body.Close()) + // ... and the task should be canceled now. + require.Equal(t, context.Canceled, <-errCh) +} diff --git a/br/pkg/lightning/lightning_test.go b/br/pkg/lightning/lightning_test.go deleted file mode 100644 index f51510842ead3..0000000000000 --- a/br/pkg/lightning/lightning_test.go +++ /dev/null @@ -1,568 +0,0 @@ -// Copyright 2019 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, -// 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. - -// Contexts for HTTP requests communicating with a real HTTP server are essential, -// however, when the subject is a mocked server, it would probably be redundant. -//nolint:noctx - -// lightningSuite.SetUpTest sets up global logger but the gocheck framework calls this method -// multi times, hence data race may happen. However, the operation setting up the global logger is idempotent. -// Hence in real life the race is harmless. Disable this when race enabled till this get fixed. -// +build !race - -package lightning - -import ( - "context" - "encoding/json" - "fmt" - "net/http" - "path/filepath" - "runtime" - "strings" - "testing" - "time" - - "github.com/docker/go-units" - . "github.com/pingcap/check" - "github.com/pingcap/failpoint" - "github.com/pingcap/tidb/br/pkg/lightning/checkpoints" - "github.com/pingcap/tidb/br/pkg/lightning/config" - "github.com/pingcap/tidb/br/pkg/lightning/glue" - "github.com/pingcap/tidb/br/pkg/lightning/mydump" -) - -type lightningSuite struct{} - -var _ = Suite(&lightningSuite{}) - -func TestLightning(t *testing.T) { - TestingT(t) -} - -func (s *lightningSuite) TestInitEnv(c *C) { - cfg := &config.GlobalConfig{ - App: config.GlobalLightning{StatusAddr: ":45678"}, - } - err := initEnv(cfg) - c.Assert(err, IsNil) - cfg.App.StatusAddr = "" - cfg.App.Config.File = "." - err = initEnv(cfg) - c.Assert(err, ErrorMatches, "can't use directory as log file name") -} - -func (s *lightningSuite) TestRun(c *C) { - globalConfig := config.NewGlobalConfig() - globalConfig.TiDB.Host = "test.invalid" - globalConfig.TiDB.Port = 4000 - globalConfig.TiDB.PdAddr = "test.invalid:2379" - globalConfig.Mydumper.SourceDir = "not-exists" - globalConfig.TikvImporter.Backend = config.BackendLocal - globalConfig.TikvImporter.SortedKVDir = c.MkDir() - lightning := New(globalConfig) - cfg := config.NewConfig() - err := cfg.LoadFromGlobal(globalConfig) - c.Assert(err, IsNil) - err = lightning.RunOnce(context.Background(), cfg, nil) - c.Assert(err, ErrorMatches, ".*mydumper dir does not exist") - - path, _ := filepath.Abs(".") - ctx := context.Background() - invalidGlue := glue.NewExternalTiDBGlue(nil, 0) - err = lightning.run(ctx, &config.Config{ - Mydumper: config.MydumperRuntime{ - SourceDir: "file://" + filepath.ToSlash(path), - Filter: []string{"*.*"}, - DefaultFileRules: true, - }, - Checkpoint: config.Checkpoint{ - Enable: true, - Driver: "invalid", - }, - }, invalidGlue) - c.Assert(err, ErrorMatches, "open checkpoint db failed: Unknown checkpoint driver invalid") - - err = lightning.run(ctx, &config.Config{ - Mydumper: config.MydumperRuntime{ - SourceDir: ".", - Filter: []string{"*.*"}, - }, - Checkpoint: config.Checkpoint{ - Enable: true, - Driver: "file", - DSN: "any-file", - }, - }, invalidGlue) - c.Assert(err, NotNil) -} - -var _ = Suite(&lightningServerSuite{}) - -type lightningServerSuite struct { - lightning *Lightning - taskCfgCh chan *config.Config - taskRunCh chan struct{} -} - -func (s *lightningServerSuite) SetUpTest(c *C) { - cfg := config.NewGlobalConfig() - cfg.TiDB.Host = "test.invalid" - cfg.TiDB.Port = 4000 - cfg.TiDB.PdAddr = "test.invalid:2379" - cfg.App.ServerMode = true - cfg.App.StatusAddr = "127.0.0.1:0" - cfg.Mydumper.SourceDir = "file://." - cfg.TikvImporter.Backend = config.BackendLocal - cfg.TikvImporter.SortedKVDir = c.MkDir() - - s.lightning = New(cfg) - s.taskRunCh = make(chan struct{}, 1) - s.taskCfgCh = make(chan *config.Config) - s.lightning.ctx = context.WithValue(s.lightning.ctx, taskRunNotifyKey, s.taskRunCh) - s.lightning.ctx = context.WithValue(s.lightning.ctx, taskCfgRecorderKey, s.taskCfgCh) - _ = s.lightning.GoServe() - - _ = failpoint.Enable("github.com/pingcap/tidb/br/pkg/lightning/SkipRunTask", "return") -} - -func (s *lightningServerSuite) TearDownTest(c *C) { - _ = failpoint.Disable("github.com/pingcap/tidb/br/pkg/lightning/SkipRunTask") - s.lightning.Stop() -} - -func (s *lightningServerSuite) TestRunServer(c *C) { - url := "http://" + s.lightning.serverAddr.String() + "/tasks" - - resp, err := http.Post(url, "application/toml", strings.NewReader("????")) - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusNotImplemented) - var data map[string]string - err = json.NewDecoder(resp.Body).Decode(&data) - c.Assert(err, IsNil) - c.Assert(data, HasKey, "error") - c.Assert(data["error"], Equals, "server-mode not enabled") - resp.Body.Close() - - go func() { - _ = s.lightning.RunServer() - }() - time.Sleep(100 * time.Millisecond) - - req, err := http.NewRequest(http.MethodPut, url, nil) - c.Assert(err, IsNil) - resp, err = http.DefaultClient.Do(req) - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusMethodNotAllowed) - c.Assert(resp.Header.Get("Allow"), Matches, ".*"+http.MethodPost+".*") - resp.Body.Close() - - resp, err = http.Post(url, "application/toml", strings.NewReader("????")) - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusBadRequest) - err = json.NewDecoder(resp.Body).Decode(&data) - c.Assert(err, IsNil) - c.Assert(data, HasKey, "error") - c.Assert(data["error"], Matches, "cannot parse task.*") - resp.Body.Close() - - resp, err = http.Post(url, "application/toml", strings.NewReader("[mydumper.csv]\nseparator = 'fooo'\ndelimiter= 'foo'")) - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusBadRequest) - err = json.NewDecoder(resp.Body).Decode(&data) - c.Assert(err, IsNil) - c.Assert(data, HasKey, "error") - c.Assert(data["error"], Matches, "invalid task configuration:.*") - resp.Body.Close() - - for i := 0; i < 20; i++ { - resp, err = http.Post(url, "application/toml", strings.NewReader(fmt.Sprintf(` - [mydumper] - data-source-dir = 'file://demo-path-%d' - [mydumper.csv] - separator = '/' - `, i))) - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusOK) - var result map[string]int - err = json.NewDecoder(resp.Body).Decode(&result) - resp.Body.Close() - c.Assert(err, IsNil) - c.Assert(result, HasKey, "id") - - select { - case taskCfg := <-s.taskCfgCh: - c.Assert(taskCfg.TiDB.Host, Equals, "test.invalid") - c.Assert(taskCfg.Mydumper.SourceDir, Equals, fmt.Sprintf("file://demo-path-%d", i)) - c.Assert(taskCfg.Mydumper.CSV.Separator, Equals, "/") - case <-time.After(5 * time.Second): - c.Fatalf("task is not queued after 5 seconds (i = %d)", i) - } - } -} - -func (s *lightningServerSuite) TestGetDeleteTask(c *C) { - url := "http://" + s.lightning.serverAddr.String() + "/tasks" - - type getAllResultType struct { - Current int64 - Queue []int64 - } - - getAllTasks := func() (result getAllResultType) { - resp, err := http.Get(url) - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusOK) - err = json.NewDecoder(resp.Body).Decode(&result) - resp.Body.Close() - c.Assert(err, IsNil) - return - } - - postTask := func(i int) int64 { - resp, err := http.Post(url, "application/toml", strings.NewReader(fmt.Sprintf(` - [mydumper] - data-source-dir = 'file://demo-path-%d' - `, i))) - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusOK) - var result struct{ ID int64 } - err = json.NewDecoder(resp.Body).Decode(&result) - resp.Body.Close() - c.Assert(err, IsNil) - return result.ID - } - - go func() { - _ = s.lightning.RunServer() - }() - time.Sleep(500 * time.Millisecond) - - // Check `GET /tasks` without any active tasks - - c.Assert(getAllTasks(), DeepEquals, getAllResultType{ - Current: 0, - Queue: []int64{}, - }) - - first := postTask(1) - second := postTask(2) - third := postTask(3) - - c.Assert(first, Not(Equals), 123456) - c.Assert(second, Not(Equals), 123456) - c.Assert(third, Not(Equals), 123456) - - // Check `GET /tasks` returns all tasks currently running - - <-s.taskRunCh - c.Assert(getAllTasks(), DeepEquals, getAllResultType{ - Current: first, - Queue: []int64{second, third}, - }) - - // Check `GET /tasks/abcdef` returns error - - resp, err := http.Get(url + "/abcdef") - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusBadRequest) - resp.Body.Close() - - // Check `GET /tasks/123456` returns not found - - resp, err = http.Get(url + "/123456") - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusNotFound) - resp.Body.Close() - - // Check `GET /tasks/1` returns the desired cfg - - var resCfg config.Config - - resp, err = http.Get(fmt.Sprintf("%s/%d", url, second)) - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusOK) - err = json.NewDecoder(resp.Body).Decode(&resCfg) - resp.Body.Close() - c.Assert(err, IsNil) - c.Assert(resCfg.Mydumper.SourceDir, Equals, "file://demo-path-2") - - resp, err = http.Get(fmt.Sprintf("%s/%d", url, first)) - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusOK) - err = json.NewDecoder(resp.Body).Decode(&resCfg) - resp.Body.Close() - c.Assert(err, IsNil) - c.Assert(resCfg.Mydumper.SourceDir, Equals, "file://demo-path-1") - - // Check `DELETE /tasks` returns error. - - req, err := http.NewRequest(http.MethodDelete, url, nil) - c.Assert(err, IsNil) - resp, err = http.DefaultClient.Do(req) - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusBadRequest) - resp.Body.Close() - - // Check `DELETE /tasks/` returns error. - - req.URL.Path = "/tasks/" - resp, err = http.DefaultClient.Do(req) - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusBadRequest) - resp.Body.Close() - - // Check `DELETE /tasks/(not a number)` returns error. - - req.URL.Path = "/tasks/abcdef" - resp, err = http.DefaultClient.Do(req) - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusBadRequest) - resp.Body.Close() - - // Check `DELETE /tasks/123456` returns not found - - req.URL.Path = "/tasks/123456" - resp, err = http.DefaultClient.Do(req) - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusNotFound) - resp.Body.Close() - - // Cancel a queued task, then verify the task list. - - req.URL.Path = fmt.Sprintf("/tasks/%d", second) - resp, err = http.DefaultClient.Do(req) - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusOK) - resp.Body.Close() - - c.Assert(getAllTasks(), DeepEquals, getAllResultType{ - Current: first, - Queue: []int64{third}, - }) - - // Cancel a running task, then verify the task list. - - req.URL.Path = fmt.Sprintf("/tasks/%d", first) - resp, err = http.DefaultClient.Do(req) - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusOK) - resp.Body.Close() - - <-s.taskRunCh - c.Assert(getAllTasks(), DeepEquals, getAllResultType{ - Current: third, - Queue: []int64{}, - }) -} - -func (s *lightningServerSuite) TestHTTPAPIOutsideServerMode(c *C) { - s.lightning.globalCfg.App.ServerMode = false - - url := "http://" + s.lightning.serverAddr.String() + "/tasks" - - errCh := make(chan error) - cfg := config.NewConfig() - err := cfg.LoadFromGlobal(s.lightning.globalCfg) - c.Assert(err, IsNil) - go func() { - errCh <- s.lightning.RunOnce(s.lightning.ctx, cfg, nil) - }() - time.Sleep(600 * time.Millisecond) - - var curTask struct { - Current int64 - Queue []int64 - } - - // `GET /tasks` should work fine. - resp, err := http.Get(url) - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusOK) - err = json.NewDecoder(resp.Body).Decode(&curTask) - resp.Body.Close() - c.Assert(err, IsNil) - c.Assert(curTask.Current, Not(Equals), int64(0)) - c.Assert(curTask.Queue, HasLen, 0) - - // `POST /tasks` should return 501 - resp, err = http.Post(url, "application/toml", strings.NewReader("??????")) - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusNotImplemented) - resp.Body.Close() - - // `GET /tasks/(current)` should work fine. - resp, err = http.Get(fmt.Sprintf("%s/%d", url, curTask.Current)) - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusOK) - resp.Body.Close() - - // `GET /tasks/123456` should return 404 - resp, err = http.Get(url + "/123456") - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusNotFound) - resp.Body.Close() - - // `PATCH /tasks/(current)/front` should return 501 - req, err := http.NewRequest(http.MethodPatch, fmt.Sprintf("%s/%d/front", url, curTask.Current), nil) - c.Assert(err, IsNil) - resp, err = http.DefaultClient.Do(req) - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusNotImplemented) - resp.Body.Close() - - // `DELETE /tasks/123456` should return 404 - req.Method = http.MethodDelete - req.URL.Path = "/tasks/123456" - resp, err = http.DefaultClient.Do(req) - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusNotFound) - resp.Body.Close() - - // `DELETE /tasks/(current)` should return 200 - req.URL.Path = fmt.Sprintf("/tasks/%d", curTask.Current) - resp, err = http.DefaultClient.Do(req) - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusOK) - c.Assert(resp.Body.Close(), IsNil) - // ... and the task should be canceled now. - c.Assert(<-errCh, Equals, context.Canceled) -} - -func (s *lightningServerSuite) TestCheckSystemRequirement(c *C) { - if runtime.GOOS == "windows" { - c.Skip("Local-backend is not supported on Windows") - return - } - - cfg := config.NewConfig() - cfg.App.RegionConcurrency = 16 - cfg.App.CheckRequirements = true - cfg.App.TableConcurrency = 4 - cfg.TikvImporter.Backend = config.BackendLocal - cfg.TikvImporter.LocalWriterMemCacheSize = 128 * units.MiB - cfg.TikvImporter.RangeConcurrency = 16 - - dbMetas := []*mydump.MDDatabaseMeta{ - { - Tables: []*mydump.MDTableMeta{ - { - TotalSize: 500 << 20, - }, - { - TotalSize: 150_000 << 20, - }, - }, - }, - { - Tables: []*mydump.MDTableMeta{ - { - TotalSize: 150_800 << 20, - }, - { - TotalSize: 35 << 20, - }, - { - TotalSize: 100_000 << 20, - }, - }, - }, - { - Tables: []*mydump.MDTableMeta{ - { - TotalSize: 240 << 20, - }, - { - TotalSize: 124_000 << 20, - }, - }, - }, - } - - err := failpoint.Enable("github.com/pingcap/tidb/br/pkg/lightning/backend/local/GetRlimitValue", "return(139415)") - c.Assert(err, IsNil) - err = failpoint.Enable("github.com/pingcap/tidb/br/pkg/lightning/backend/local/SetRlimitError", "return(true)") - c.Assert(err, IsNil) - defer func() { - _ = failpoint.Disable("github.com/pingcap/tidb/br/pkg/lightning/backend/local/SetRlimitError") - }() - // with this dbMetas, the estimated fds will be 139416, so should return error - err = checkSystemRequirement(cfg, dbMetas) - c.Assert(err, NotNil) - - err = failpoint.Disable("github.com/pingcap/tidb/br/pkg/lightning/backend/local/GetRlimitValue") - c.Assert(err, IsNil) - - // the min rlimit should be not smaller than the default min value (139416) - err = failpoint.Enable("github.com/pingcap/tidb/br/pkg/lightning/backend/local/GetRlimitValue", "return(139416)") - defer func() { - _ = failpoint.Disable("github.com/pingcap/tidb/br/pkg/lightning/backend/local/GetRlimitValue") - }() - c.Assert(err, IsNil) - err = checkSystemRequirement(cfg, dbMetas) - c.Assert(err, IsNil) -} - -func (s *lightningServerSuite) TestCheckSchemaConflict(c *C) { - cfg := config.NewConfig() - cfg.Checkpoint.Schema = "cp" - cfg.Checkpoint.Driver = config.CheckpointDriverMySQL - - dbMetas := []*mydump.MDDatabaseMeta{ - { - Name: "test", - Tables: []*mydump.MDTableMeta{ - { - Name: checkpoints.CheckpointTableNameTable, - }, - { - Name: checkpoints.CheckpointTableNameEngine, - }, - }, - }, - { - Name: "cp", - Tables: []*mydump.MDTableMeta{ - { - Name: "test", - }, - }, - }, - } - err := checkSchemaConflict(cfg, dbMetas) - c.Assert(err, IsNil) - - dbMetas = append(dbMetas, &mydump.MDDatabaseMeta{ - Name: "cp", - Tables: []*mydump.MDTableMeta{ - { - Name: checkpoints.CheckpointTableNameChunk, - }, - { - Name: "test123", - }, - }, - }) - err = checkSchemaConflict(cfg, dbMetas) - c.Assert(err, NotNil) - - cfg.Checkpoint.Enable = false - err = checkSchemaConflict(cfg, dbMetas) - c.Assert(err, IsNil) - - cfg.Checkpoint.Enable = true - cfg.Checkpoint.Driver = config.CheckpointDriverFile - err = checkSchemaConflict(cfg, dbMetas) - c.Assert(err, IsNil) -} diff --git a/br/pkg/lightning/log/log.go b/br/pkg/lightning/log/log.go index 2dc24acac1541..8521cf85a6579 100644 --- a/br/pkg/lightning/log/log.go +++ b/br/pkg/lightning/log/log.go @@ -93,8 +93,8 @@ func InitLogger(cfg *Config, tidbLoglevel string) error { // Filter logs from TiDB and PD. return NewFilterCore(core, "github.com/tikv/pd/") }) - - if len(cfg.File) > 0 { + // "-" is a special config for log to stdout. + if len(cfg.File) > 0 && cfg.File != "-" { logCfg.File = pclog.FileLogConfig{ Filename: cfg.File, MaxSize: cfg.FileMaxSize, diff --git a/br/pkg/lightning/log/log_serial_test.go b/br/pkg/lightning/log/log_serial_test.go new file mode 100644 index 0000000000000..63ef2bf321ab1 --- /dev/null +++ b/br/pkg/lightning/log/log_serial_test.go @@ -0,0 +1,43 @@ +package log_test + +import ( + "io" + "os" + "testing" + + "github.com/pingcap/tidb/br/pkg/lightning/log" + "github.com/stretchr/testify/require" +) + +func TestInitStdoutLogger(t *testing.T) { + r, w, err := os.Pipe() + require.NoError(t, err) + oldStdout := os.Stdout + os.Stdout = w + + msg := "logger is initialized to stdout" + outputC := make(chan string, 1) + go func() { + buf := make([]byte, 4096) + n := 0 + for { + nn, err := r.Read(buf[n:]) + if nn == 0 || err == io.EOF { + break + } + require.NoError(t, err) + n += nn + } + outputC <- string(buf[:n]) + }() + + logCfg := &log.Config{File: "-"} + log.InitLogger(logCfg, "info") + log.L().Info(msg) + + os.Stdout = oldStdout + require.NoError(t, w.Close()) + output := <-outputC + require.NoError(t, r.Close()) + require.Contains(t, output, msg) +} diff --git a/parser/auth/auth_test.go b/br/pkg/lightning/main_test.go similarity index 73% rename from parser/auth/auth_test.go rename to br/pkg/lightning/main_test.go index c196f74f418cc..95153fd91e52e 100644 --- a/parser/auth/auth_test.go +++ b/br/pkg/lightning/main_test.go @@ -1,4 +1,4 @@ -// Copyright 2015 PingCAP, Inc. +// Copyright 2021 PingCAP, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -8,22 +8,17 @@ // // 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. -package auth +package lightning import ( + "os" "testing" - - . "github.com/pingcap/check" ) -var _ = Suite(&testAuthSuite{}) - -type testAuthSuite struct { -} - -func TestT(t *testing.T) { - TestingT(t) +func TestMain(m *testing.M) { + os.Exit(m.Run()) } diff --git a/br/pkg/lightning/manual/manual.go b/br/pkg/lightning/manual/manual.go index fbc78814f6ece..476e1f5b0d9f7 100644 --- a/br/pkg/lightning/manual/manual.go +++ b/br/pkg/lightning/manual/manual.go @@ -50,7 +50,7 @@ func New(n int) []byte { throw("out of memory") } // Interpret the C pointer as a pointer to a Go array, then slice. - return (*[MaxArrayLen]byte)(unsafe.Pointer(ptr))[:n:n] + return (*[MaxArrayLen]byte)(ptr)[:n:n] } // Free frees the specified slice. diff --git a/br/pkg/lightning/manual/manual_nocgo.go b/br/pkg/lightning/manual/manual_nocgo.go index 466d1ee63477b..74befbd116e6a 100644 --- a/br/pkg/lightning/manual/manual_nocgo.go +++ b/br/pkg/lightning/manual/manual_nocgo.go @@ -2,6 +2,7 @@ // of this source code is governed by a BSD-style license that can be found in // the LICENSE file. +//go:build !cgo // +build !cgo package manual diff --git a/br/pkg/lightning/mydump/charset_convertor.go b/br/pkg/lightning/mydump/charset_convertor.go index e4cd7a4e72c1d..81e57be681a18 100644 --- a/br/pkg/lightning/mydump/charset_convertor.go +++ b/br/pkg/lightning/mydump/charset_convertor.go @@ -19,41 +19,17 @@ import ( "unicode/utf8" "github.com/pingcap/errors" - "github.com/pingcap/tidb/br/pkg/lightning/log" - "go.uber.org/zap" "golang.org/x/text/encoding" "golang.org/x/text/encoding/simplifiedchinese" -) - -type Charset int -const ( - Binary Charset = iota - UTF8MB4 - GB18030 - GBK + "github.com/pingcap/tidb/br/pkg/lightning/config" ) -func (c Charset) String() string { - switch c { - case Binary: - return "binary" - case UTF8MB4: - return "utf8mb4" - case GB18030: - return "gb18030" - case GBK: - return "gbk" - default: - return "unknown_charset" - } -} - // CharsetConvertor is used to convert a character set to utf8mb4 encoding. // In Lightning, we mainly use it to do the GB18030/GBK -> UTF8MB4 conversion. type CharsetConvertor struct { // sourceCharacterSet represents the charset that the data source uses. - sourceCharacterSet Charset + sourceCharacterSet config.Charset // invalidCharReplacement is the default replacement character bytes for the invalid content, e.g "\ufffd". invalidCharReplacement string @@ -63,14 +39,10 @@ type CharsetConvertor struct { // NewCharsetConvertor creates a new CharsetConvertor. func NewCharsetConvertor(dataCharacterSet, dataInvalidCharReplace string) (*CharsetConvertor, error) { - sourceCharacterSet, err := loadCharsetFromConfig(dataCharacterSet) + sourceCharacterSet, err := config.ParseCharset(dataCharacterSet) if err != nil { return nil, err } - log.L().Warn( - "incompatible strings may be encountered during the transcoding process and will be replaced, please be aware of the risk of not being able to retain the original information", - zap.String("source-character-set", sourceCharacterSet.String()), - zap.ByteString("invalid-char-replacement", []byte(dataInvalidCharReplace))) cc := &CharsetConvertor{ sourceCharacterSet, dataInvalidCharReplace, @@ -87,29 +59,14 @@ func NewCharsetConvertor(dataCharacterSet, dataInvalidCharReplace string) (*Char return cc, nil } -func loadCharsetFromConfig(dataCharacterSet string) (Charset, error) { - switch dataCharacterSet { - case "", "binary": - return Binary, nil - case "utf8mb4": - return UTF8MB4, nil - case "gb18030": - return GB18030, nil - case "gbk": - return GBK, nil - default: - return Binary, errors.Errorf("found unsupported data-character-set: %s", dataCharacterSet) - } -} - func (cc *CharsetConvertor) initDecoder() error { switch cc.sourceCharacterSet { - case Binary, UTF8MB4: + case config.Binary, config.UTF8MB4: return nil - case GB18030: + case config.GB18030: cc.decoder = simplifiedchinese.GB18030.NewDecoder() return nil - case GBK: + case config.GBK: cc.decoder = simplifiedchinese.GBK.NewDecoder() return nil } @@ -118,12 +75,12 @@ func (cc *CharsetConvertor) initDecoder() error { func (cc *CharsetConvertor) initEncoder() error { switch cc.sourceCharacterSet { - case Binary, UTF8MB4: + case config.Binary, config.UTF8MB4: return nil - case GB18030: + case config.GB18030: cc.encoder = simplifiedchinese.GB18030.NewEncoder() return nil - case GBK: + case config.GBK: cc.encoder = simplifiedchinese.GBK.NewEncoder() return nil } @@ -151,7 +108,7 @@ func (cc *CharsetConvertor) Decode(src string) (string, error) { func (cc *CharsetConvertor) precheck(src string) bool { // No need to convert the charset encoding, just return the original data. if len(src) == 0 || cc == nil || - cc.sourceCharacterSet == Binary || cc.sourceCharacterSet == UTF8MB4 || + cc.sourceCharacterSet == config.Binary || cc.sourceCharacterSet == config.UTF8MB4 || cc.decoder == nil || cc.encoder == nil { return false } diff --git a/br/pkg/lightning/mydump/charset_convertor_test.go b/br/pkg/lightning/mydump/charset_convertor_test.go index 5220f0575360c..cf091c09b142e 100644 --- a/br/pkg/lightning/mydump/charset_convertor_test.go +++ b/br/pkg/lightning/mydump/charset_convertor_test.go @@ -12,14 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -package mydump_test +package mydump import ( "io" "os" . "github.com/pingcap/check" - "github.com/pingcap/tidb/br/pkg/lightning/mydump" ) var _ = Suite(&testCharsetConvertorSuite{}) @@ -51,7 +50,7 @@ func (s testCharsetConvertorSuite) TestCharsetConvertor(c *C) { gbkData, err := io.ReadAll(gbkReader) c.Assert(err, IsNil) - cc, err := mydump.NewCharsetConvertor("gb18030", "\ufffd") + cc, err := NewCharsetConvertor("gb18030", "\ufffd") c.Assert(err, IsNil) gbkToUTF8Data, err := cc.Decode(string(gbkData)) c.Assert(err, IsNil) @@ -79,7 +78,7 @@ func (s testCharsetConvertorSuite) TestInvalidCharReplace(c *C) { c.Assert(err, IsNil) gbkData, err := io.ReadAll(gbkReader) c.Assert(err, IsNil) - cc, err := mydump.NewCharsetConvertor("gb18030", dataInvalidCharReplace) + cc, err := NewCharsetConvertor("gb18030", dataInvalidCharReplace) c.Assert(err, IsNil) gbkToUTF8Data, err := cc.Decode(string(gbkData)) c.Assert(err, IsNil) diff --git a/br/pkg/lightning/mydump/parquet_parser_test.go b/br/pkg/lightning/mydump/parquet_parser_test.go index 41fea53a79068..2962e6cb1c5c7 100644 --- a/br/pkg/lightning/mydump/parquet_parser_test.go +++ b/br/pkg/lightning/mydump/parquet_parser_test.go @@ -55,7 +55,7 @@ func (s testParquetParserSuite) TestParquetParser(c *C) { verifyRow := func(i int) { c.Assert(reader.lastRow.RowID, Equals, int64(i+1)) c.Assert(len(reader.lastRow.Row), Equals, 2) - c.Assert(reader.lastRow.Row[0], DeepEquals, types.NewCollationStringDatum(strconv.Itoa(i), "", 0)) + c.Assert(reader.lastRow.Row[0], DeepEquals, types.NewCollationStringDatum(strconv.Itoa(i), "")) c.Assert(reader.lastRow.Row[1], DeepEquals, types.NewIntDatum(int64(i))) } @@ -184,7 +184,7 @@ func (s testParquetParserSuite) TestParquetVariousTypes(c *C) { for i, testCase := range cases { c.Assert(reader.ReadRow(), IsNil) - vals := []types.Datum{types.NewCollationStringDatum(testCase[1].(string), "", 0)} + vals := []types.Datum{types.NewCollationStringDatum(testCase[1].(string), "")} if i%2 == 0 { vals = append(vals, vals[0]) } else { diff --git a/br/pkg/lightning/restore/check_info.go b/br/pkg/lightning/restore/check_info.go index 1b86ee482f362..49a8a8a9427d1 100644 --- a/br/pkg/lightning/restore/check_info.go +++ b/br/pkg/lightning/restore/check_info.go @@ -38,10 +38,11 @@ import ( "github.com/pingcap/tidb/br/pkg/lightning/mydump" "github.com/pingcap/tidb/br/pkg/lightning/verification" "github.com/pingcap/tidb/br/pkg/storage" - "github.com/pingcap/tidb/br/pkg/version" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" + "github.com/pingcap/tidb/types" "github.com/tikv/pd/server/api" pdconfig "github.com/tikv/pd/server/config" @@ -177,6 +178,15 @@ func (rc *Controller) ClusterIsAvailable(ctx context.Context) error { return nil } +func isTiFlash(store *api.MetaStore) bool { + for _, label := range store.Labels { + if label.Key == "engine" && label.Value == "tiflash" { + return true + } + } + return false +} + func (rc *Controller) checkEmptyRegion(ctx context.Context) error { passed := true message := "Cluster doesn't have too many empty regions" @@ -204,7 +214,7 @@ func (rc *Controller) checkEmptyRegion(ctx context.Context) error { } } for _, store := range storeInfo.Stores { - stores[store.Store.Id] = store + stores[store.Store.StoreID] = store } tableCount := 0 for _, db := range rc.dbMetas { @@ -222,10 +232,10 @@ func (rc *Controller) checkEmptyRegion(ctx context.Context) error { ) for storeID, regionCnt := range regions { if store, ok := stores[storeID]; ok { - if store.Store.State != metapb.StoreState_Up { + if metapb.StoreState(metapb.StoreState_value[store.Store.StateName]) != metapb.StoreState_Up { continue } - if version.IsTiFlash(store.Store.Store) { + if isTiFlash(store.Store) { continue } if regionCnt > errorThrehold { @@ -267,10 +277,10 @@ func (rc *Controller) checkRegionDistribution(ctx context.Context) error { } stores := make([]*api.StoreInfo, 0, len(result.Stores)) for _, store := range result.Stores { - if store.Store.State != metapb.StoreState_Up { + if metapb.StoreState(metapb.StoreState_value[store.Store.StateName]) != metapb.StoreState_Up { continue } - if version.IsTiFlash(store.Store.Store) { + if isTiFlash(store.Store) { continue } stores = append(stores, store) @@ -300,11 +310,11 @@ func (rc *Controller) checkRegionDistribution(ctx context.Context) error { passed = false message = fmt.Sprintf("Region distribution is unbalanced, the ratio of the regions count of the store(%v) "+ "with least regions(%v) to the store(%v) with most regions(%v) is %v, but we expect it must not be less than %v", - minStore.Store.Id, minStore.Status.RegionCount, maxStore.Store.Id, maxStore.Status.RegionCount, ratio, errorRegionCntMinMaxRatio) + minStore.Store.StoreID, minStore.Status.RegionCount, maxStore.Store.StoreID, maxStore.Status.RegionCount, ratio, errorRegionCntMinMaxRatio) } else if ratio < warnRegionCntMinMaxRatio { message = fmt.Sprintf("Region distribution is unbalanced, the ratio of the regions count of the store(%v) "+ "with least regions(%v) to the store(%v) with most regions(%v) is %v, but we expect it should not be less than %v", - minStore.Store.Id, minStore.Status.RegionCount, maxStore.Store.Id, maxStore.Status.RegionCount, ratio, warnRegionCntMinMaxRatio) + minStore.Store.StoreID, minStore.Status.RegionCount, maxStore.Store.StoreID, maxStore.Status.RegionCount, ratio, warnRegionCntMinMaxRatio) } return nil } @@ -577,7 +587,7 @@ func hasDefault(col *model.ColumnInfo) bool { col.IsGenerated() || mysql.HasAutoIncrementFlag(col.Flag) } -func (rc *Controller) readColumnsAndCount(ctx context.Context, dataFileMeta mydump.SourceFileMeta) (cols []string, colCnt int, err error) { +func (rc *Controller) readFirstRow(ctx context.Context, dataFileMeta mydump.SourceFileMeta) (cols []string, row []types.Datum, err error) { var reader storage.ReadSeekCloser if dataFileMeta.Type == mydump.SourceTypeParquet { reader, err = mydump.OpenParquetReader(ctx, rc.store, dataFileMeta.Path, dataFileMeta.FileSize) @@ -585,7 +595,7 @@ func (rc *Controller) readColumnsAndCount(ctx context.Context, dataFileMeta mydu reader, err = rc.store.Open(ctx, dataFileMeta.Path) } if err != nil { - return nil, 0, errors.Trace(err) + return nil, nil, errors.Trace(err) } var parser mydump.Parser @@ -596,18 +606,18 @@ func (rc *Controller) readColumnsAndCount(ctx context.Context, dataFileMeta mydu // Create a utf8mb4 convertor to encode and decode data with the charset of CSV files. charsetConvertor, err := mydump.NewCharsetConvertor(rc.cfg.Mydumper.DataCharacterSet, rc.cfg.Mydumper.DataInvalidCharReplace) if err != nil { - return nil, 0, errors.Trace(err) + return nil, nil, errors.Trace(err) } parser, err = mydump.NewCSVParser(&rc.cfg.Mydumper.CSV, reader, blockBufSize, rc.ioWorkers, hasHeader, charsetConvertor) if err != nil { - return nil, 0, errors.Trace(err) + return nil, nil, errors.Trace(err) } case mydump.SourceTypeSQL: parser = mydump.NewChunkParser(rc.cfg.TiDB.SQLMode, reader, blockBufSize, rc.ioWorkers) case mydump.SourceTypeParquet: parser, err = mydump.NewParquetParser(ctx, rc.store, reader, dataFileMeta.Path) if err != nil { - return nil, 0, errors.Trace(err) + return nil, nil, errors.Trace(err) } default: panic(fmt.Sprintf("unknown file type '%s'", dataFileMeta.Type)) @@ -616,13 +626,18 @@ func (rc *Controller) readColumnsAndCount(ctx context.Context, dataFileMeta mydu err = parser.ReadRow() if err != nil && errors.Cause(err) != io.EOF { - return nil, 0, errors.Trace(err) + return nil, nil, errors.Trace(err) } - return parser.Columns(), len(parser.LastRow().Row), nil + return parser.Columns(), parser.LastRow().Row, nil } // SchemaIsValid checks the import file and cluster schema is match. func (rc *Controller) SchemaIsValid(ctx context.Context, tableInfo *mydump.MDTableMeta) ([]string, error) { + if len(tableInfo.DataFiles) == 0 { + log.L().Info("no data files detected", zap.String("db", tableInfo.DB), zap.String("table", tableInfo.Name)) + return nil, nil + } + msgs := make([]string, 0) info, ok := rc.dbInfos[tableInfo.DB].Tables[tableInfo.Name] if !ok { @@ -631,19 +646,11 @@ func (rc *Controller) SchemaIsValid(ctx context.Context, tableInfo *mydump.MDTab return msgs, nil } - igCols := make(map[string]struct{}) igCol, err := rc.cfg.Mydumper.IgnoreColumns.GetIgnoreColumns(tableInfo.DB, tableInfo.Name, rc.cfg.Mydumper.CaseSensitive) if err != nil { return nil, errors.Trace(err) } - for _, col := range igCol.Columns { - igCols[col] = struct{}{} - } - - if len(tableInfo.DataFiles) == 0 { - log.L().Info("no data files detected", zap.String("db", tableInfo.DB), zap.String("table", tableInfo.Name)) - return nil, nil - } + igCols := igCol.ColumnsMap() colCountFromTiDB := len(info.Core.Columns) core := info.Core @@ -658,86 +665,264 @@ func (rc *Controller) SchemaIsValid(ctx context.Context, tableInfo *mydump.MDTab defaultCols[model.ExtraHandleName.String()] = struct{}{} // only check the first file of this table. - if len(tableInfo.DataFiles) > 0 { - dataFile := tableInfo.DataFiles[0] - log.L().Info("datafile to check", zap.String("db", tableInfo.DB), - zap.String("table", tableInfo.Name), zap.String("path", dataFile.FileMeta.Path)) - // get columns name from data file. - dataFileMeta := dataFile.FileMeta - - if tp := dataFileMeta.Type; tp != mydump.SourceTypeCSV && tp != mydump.SourceTypeSQL && tp != mydump.SourceTypeParquet { - msgs = append(msgs, fmt.Sprintf("file '%s' with unknown source type '%s'", dataFileMeta.Path, dataFileMeta.Type.String())) - return msgs, nil - } - colsFromDataFile, colCountFromDataFile, err := rc.readColumnsAndCount(ctx, dataFileMeta) - if err != nil { - return nil, errors.Trace(err) - } - if colsFromDataFile == nil && colCountFromDataFile == 0 { - log.L().Info("file contains no data, skip checking against schema validity", zap.String("path", dataFileMeta.Path)) - return msgs, nil + dataFile := tableInfo.DataFiles[0] + log.L().Info("datafile to check", zap.String("db", tableInfo.DB), + zap.String("table", tableInfo.Name), zap.String("path", dataFile.FileMeta.Path)) + // get columns name from data file. + dataFileMeta := dataFile.FileMeta + + if tp := dataFileMeta.Type; tp != mydump.SourceTypeCSV && tp != mydump.SourceTypeSQL && tp != mydump.SourceTypeParquet { + msgs = append(msgs, fmt.Sprintf("file '%s' with unknown source type '%s'", dataFileMeta.Path, dataFileMeta.Type.String())) + return msgs, nil + } + colsFromDataFile, row, err := rc.readFirstRow(ctx, dataFileMeta) + if err != nil { + return nil, errors.Trace(err) + } + if colsFromDataFile == nil && len(row) == 0 { + log.L().Info("file contains no data, skip checking against schema validity", zap.String("path", dataFileMeta.Path)) + return msgs, nil + } + + if colsFromDataFile == nil { + // when there is no columns name in data file. we must insert data in order. + // so the last several columns either can be ignored or has a default value. + for i := len(row); i < colCountFromTiDB; i++ { + if _, ok := defaultCols[core.Columns[i].Name.L]; !ok { + msgs = append(msgs, fmt.Sprintf("TiDB schema `%s`.`%s` has %d columns,"+ + "and data file has %d columns, but column %s are missing the default value,"+ + "please give column a default value to skip this check", + tableInfo.DB, tableInfo.Name, colCountFromTiDB, len(row), core.Columns[i].Name.L)) + } } + return msgs, nil + } - if colsFromDataFile == nil { - // when there is no columns name in data file. we must insert data in order. - // so the last several columns either can be ignored or has a default value. - for i := colCountFromDataFile; i < colCountFromTiDB; i++ { - if _, ok := defaultCols[core.Columns[i].Name.L]; !ok { - msgs = append(msgs, fmt.Sprintf("TiDB schema `%s`.`%s` has %d columns,"+ - "and data file has %d columns, but column %s are missing the default value,"+ - "please give column a default value to skip this check", - tableInfo.DB, tableInfo.Name, colCountFromTiDB, colCountFromDataFile, core.Columns[i].Name.L)) - } + // compare column names and make sure + // 1. TiDB table info has data file's all columns(besides ignore columns) + // 2. Those columns not introduced in data file always have a default value. + colMap := make(map[string]struct{}) + for col := range igCols { + colMap[col] = struct{}{} + } + for _, col := range core.Columns { + if _, ok := colMap[col.Name.L]; ok { + // tidb's column is ignored + // we need ensure this column has the default value. + if _, hasDefault := defaultCols[col.Name.L]; !hasDefault { + msgs = append(msgs, fmt.Sprintf("TiDB schema `%s`.`%s`'s column %s cannot be ignored,"+ + "because it doesn't have a default value, please set tables.ignoreColumns properly", + tableInfo.DB, tableInfo.Name, col.Name.L)) } } else { - // compare column names and make sure - // 1. TiDB table info has data file's all columns(besides ignore columns) - // 2. Those columns not introduced in data file always have a default value. - colMap := make(map[string]struct{}) - for col := range igCols { - colMap[col] = struct{}{} + colMap[col.Name.L] = struct{}{} + } + } + // tidb_rowid can be ignored in check + colMap[model.ExtraHandleName.String()] = struct{}{} + for _, col := range colsFromDataFile { + if _, ok := colMap[col]; !ok { + checkMsg := "please check table schema" + if dataFileMeta.Type == mydump.SourceTypeCSV && rc.cfg.Mydumper.CSV.Header { + checkMsg += " and csv file header" } - for _, col := range core.Columns { - if _, ok := colMap[col.Name.L]; ok { - // tidb's column is ignored - // we need ensure this column has the default value. - if _, hasDefault := defaultCols[col.Name.L]; !hasDefault { - msgs = append(msgs, fmt.Sprintf("TiDB schema `%s`.`%s`'s column %s cannot be ignored,"+ - "because it doesn't hava a default value, please set tables.ignoreColumns properly", - tableInfo.DB, tableInfo.Name, col.Name.L)) - } - } else { - colMap[col.Name.L] = struct{}{} - } + msgs = append(msgs, fmt.Sprintf("TiDB schema `%s`.`%s` doesn't have column %s, "+ + "%s or use tables.ignoreColumns to ignore %s", + tableInfo.DB, tableInfo.Name, col, checkMsg, col)) + } else { + // remove column for next iteration + delete(colMap, col) + } + } + // if theses rest columns don't have a default value. + for col := range colMap { + if _, ok := defaultCols[col]; ok { + continue + } + msgs = append(msgs, fmt.Sprintf("TiDB schema `%s`.`%s` doesn't have the default value for %s"+ + "please give a default value for %s or choose another column to ignore or add this column in data file", + tableInfo.DB, tableInfo.Name, col, col)) + } + return msgs, nil +} + +// checkCSVHeader try to check whether the csv header config is consistent with the source csv files by: +// 1. pick one table with two CSV files and a unique/primary key +// 2. read the first row of those two CSV files +// 3. checks if the content of those first rows are compatible with the table schema, and whether the +// two rows are identical, to determine if the first rows are a header rows. +func (rc *Controller) checkCSVHeader(ctx context.Context, dbMetas []*mydump.MDDatabaseMeta) error { + // if cfg set header = ture but source files actually contain not header, former SchemaCheck should + // return error in this situation, so we need do it again. + if rc.cfg.Mydumper.CSV.Header { + return nil + } + var ( + tableMeta *mydump.MDTableMeta + csvCount int + hasUniqueIdx bool + ) + // only check one table source files for better performance. The checked table is chosen based on following two factor: + // 1. contains at least 1 csv source file, 2 is preferable + // 2. table schema contains primary key or unique key + // if the two factors can't be both satisfied, the first one has a higher priority +outer: + for _, dbMeta := range dbMetas { + for _, tblMeta := range dbMeta.Tables { + if len(tblMeta.DataFiles) == 0 { + continue } - // tidb_rowid can be ignored in check - colMap[model.ExtraHandleName.String()] = struct{}{} - for _, col := range colsFromDataFile { - if _, ok := colMap[col]; !ok { - checkMsg := "please check table schema" - if dataFileMeta.Type == mydump.SourceTypeCSV && rc.cfg.Mydumper.CSV.Header { - checkMsg += " and csv file header" + tableHasUniqueIdx := false + tableCSVCount := 0 + for _, f := range tblMeta.DataFiles { + if f.FileMeta.Type == mydump.SourceTypeCSV { + tableCSVCount++ + if tableCSVCount >= 2 { + break } - msgs = append(msgs, fmt.Sprintf("TiDB schema `%s`.`%s` doesn't have column %s, "+ - "%s or use tables.ignoreColumns to ignore %s", - tableInfo.DB, tableInfo.Name, col, checkMsg, col)) - } else { - // remove column for next iteration - delete(colMap, col) } } - // if theses rest columns don't have a default value. - for col := range colMap { - if _, ok := defaultCols[col]; ok { - continue + if tableCSVCount == 0 { + continue + } + + info := rc.dbInfos[tblMeta.DB].Tables[tblMeta.Name] + for _, idx := range info.Core.Indices { + if idx.Primary || idx.Unique { + tableHasUniqueIdx = true } - msgs = append(msgs, fmt.Sprintf("TiDB schema `%s`.`%s` doesn't have the default value for %s"+ - "please give a default value for %s or choose another column to ignore or add this column in data file", - tableInfo.DB, tableInfo.Name, col, col)) + } + + if tableCSVCount >= 2 && hasUniqueIdx { + tableMeta = tblMeta + csvCount = tableCSVCount + hasUniqueIdx = tableHasUniqueIdx + // if a perfect table source is found, we can stop check more tables + break outer + } + if tableCSVCount > csvCount || (tableCSVCount == csvCount && !hasUniqueIdx && tableHasUniqueIdx) { + tableMeta = tblMeta + csvCount = tableCSVCount + hasUniqueIdx = tableHasUniqueIdx } } } - return msgs, nil + + if tableMeta == nil { + return nil + } + + var rows [][]types.Datum + for _, f := range tableMeta.DataFiles { + if f.FileMeta.Type != mydump.SourceTypeCSV { + continue + } + _, row, err := rc.readFirstRow(ctx, f.FileMeta) + if err != nil { + return errors.Trace(err) + } + if len(row) > 0 { + rows = append(rows, row) + } + // only check at most two of all the files + if len(rows) >= 2 { + break + } + } + if len(rows) == 0 { + return nil + } else if len(rows) >= 2 { + // if the first row in two source files are not the same, they should not be the header line + // NOTE: though lightning's logic allows different source files contains different columns or the + // order is difference, here we only check if they are exactly the same because this is the common case. + if len(rows[0]) != len(rows[1]) { + return nil + } + + for i := 0; i < len(rows[0]); i++ { + if rows[0][i].GetString() != rows[1][i].GetString() { + return nil + } + } + } + + // check if some fields are unique and not ignored + // if at least one field appears in a unique key, we can sure there is something wrong, + // they should be either the header line or the data is duplicated. + tableInfo := rc.dbInfos[tableMeta.DB].Tables[tableMeta.Name] + tableFields := make(map[string]struct{}) + uniqueIdxFields := make(map[string]struct{}) + ignoreColumns, err := rc.cfg.Mydumper.IgnoreColumns.GetIgnoreColumns(tableMeta.DB, tableMeta.Name, rc.cfg.Mydumper.CaseSensitive) + if err != nil { + return errors.Trace(err) + } + ignoreColsSet := make(map[string]struct{}) + for _, col := range ignoreColumns.Columns { + ignoreColsSet[col] = struct{}{} + } + for _, idx := range tableInfo.Core.Indices { + if !idx.Unique && !idx.Primary { + continue + } + for _, col := range idx.Columns { + if _, ok := ignoreColsSet[col.Name.L]; !ok { + uniqueIdxFields[col.Name.L] = struct{}{} + } + } + } + for _, f := range tableInfo.Core.Columns { + tableFields[f.Name.L] = struct{}{} + } + if common.TableHasAutoRowID(tableInfo.Core) { + tableFields[model.ExtraHandleName.L] = struct{}{} + } + hasUniqueField := false + for _, d := range rows[0] { + val := strings.ToLower(d.GetString()) + if _, ok := tableFields[val]; !ok { + return nil + } + if _, ok := uniqueIdxFields[val]; ok { + hasUniqueField = true + break + } + } + + msg := fmt.Sprintf("source csv files contains header row but `mydumper.csv.header` is false, checked table is `%s`.`%s`", + tableMeta.DB, tableMeta.Name) + level := Warn + if hasUniqueField && len(rows) > 1 { + level = Critical + } else if !checkFieldCompatibility(tableInfo.Core, ignoreColsSet, rows[0]) { + // if there are only 1 csv file or there is not unique key, try to check if all columns are compatible with string value + level = Critical + } + rc.checkTemplate.Collect(level, false, msg) + + return nil +} + +func checkFieldCompatibility(tbl *model.TableInfo, ignoreCols map[string]struct{}, values []types.Datum) bool { + se := kv.NewSession(&kv.SessionOptions{ + SQLMode: mysql.ModeStrictTransTables, + }) + for i, col := range tbl.Columns { + // do not check ignored columns + if _, ok := ignoreCols[col.Name.L]; ok { + continue + } + if i >= len(values) { + break + } + _, err := table.CastValue(se, values[i], col, true, false) + if err != nil { + log.L().Error("field value is not consistent with column type", zap.String("value", values[i].GetString()), + zap.Any("column_info", col), zap.Error(err)) + return false + } + } + + return true } func (rc *Controller) sampleDataFromTable(ctx context.Context, dbName string, tableMeta *mydump.MDTableMeta, tableInfo *model.TableInfo) error { @@ -816,7 +1001,7 @@ outloop: case nil: if !initializedColumns { if len(columnPermutation) == 0 { - columnPermutation, err = createColumnPermutation(columnNames, igCols.Columns, tableInfo) + columnPermutation, err = createColumnPermutation(columnNames, igCols.ColumnsMap(), tableInfo) if err != nil { return errors.Trace(err) } diff --git a/br/pkg/lightning/restore/check_info_test.go b/br/pkg/lightning/restore/check_info_test.go new file mode 100644 index 0000000000000..e1dd939d9c2b1 --- /dev/null +++ b/br/pkg/lightning/restore/check_info_test.go @@ -0,0 +1,405 @@ +// Copyright 2021 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, +// 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. + +package restore + +import ( + "context" + "fmt" + "os" + "path/filepath" + + . "github.com/pingcap/check" + + "github.com/pingcap/tidb/br/pkg/lightning/checkpoints" + "github.com/pingcap/tidb/br/pkg/lightning/config" + "github.com/pingcap/tidb/br/pkg/lightning/mydump" + "github.com/pingcap/tidb/br/pkg/lightning/worker" + "github.com/pingcap/tidb/br/pkg/storage" + "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/parser" + "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/parser/mysql" + tmock "github.com/pingcap/tidb/util/mock" +) + +var _ = Suite(&checkInfoSuite{}) + +type checkInfoSuite struct{} + +const passed CheckType = "pass" + +func (s *checkInfoSuite) TestCheckCSVHeader(c *C) { + dir := c.MkDir() + ctx := context.Background() + mockStore, err := storage.NewLocalStorage(dir) + c.Assert(err, IsNil) + + type tableSource struct { + Name string + SQL string + Sources []string + } + + cases := []struct { + ignoreColumns []*config.IgnoreColumns + // empty msg means check pass + level CheckType + Sources map[string][]*tableSource + }{ + + { + nil, + + passed, + map[string][]*tableSource{ + "db": { + { + "tbl1", + "create table tbl1 (a varchar(16), b varchar(8))", + []string{ + "aa,b\r\n", + }, + }, + }, + }, + }, + { + nil, + + passed, + map[string][]*tableSource{ + "db": { + { + "tbl1", + "create table tbl1 (a varchar(16), b varchar(8))", + []string{ + "a,b\r\ntest1,test2\r\n", + "aa,b\r\n", + }, + }, + }, + }, + }, + { + nil, + + Warn, + map[string][]*tableSource{ + "db": { + { + "tbl1", + "create table tbl1 (a varchar(16), b varchar(8))", + []string{ + "a,b\r\n", + }, + }, + }, + }, + }, + { + nil, + + Warn, + map[string][]*tableSource{ + "db": { + { + "tbl1", + "create table tbl1 (a varchar(16), b varchar(8))", + []string{ + "a,b\r\ntest1,test2\r\n", + "a,b\r\ntest3,test4\n", + }, + }, + }, + }, + }, + { + nil, + + Warn, + map[string][]*tableSource{ + "db": { + { + "tbl1", + "create table tbl1 (a varchar(16), b varchar(8), PRIMARY KEY (`a`))", + []string{ + "a,b\r\ntest1,test2\r\n", + }, + }, + }, + }, + }, + { + nil, + + Critical, + map[string][]*tableSource{ + "db": { + { + "tbl1", + "create table tbl1 (a varchar(16), b varchar(8), PRIMARY KEY (`a`))", + []string{ + "a,b\r\ntest1,test2\r\n", + "a,b\r\ntest3,test4\r\n", + }, + }, + }, + }, + }, + // ignore primary key, should still be warn + { + []*config.IgnoreColumns{ + { + DB: "db", + Table: "tbl1", + Columns: []string{"a"}, + }, + }, + Warn, + map[string][]*tableSource{ + "db": { + { + "tbl1", + "create table tbl1 (a varchar(16), b varchar(8), PRIMARY KEY (`a`))", + []string{ + "a,b\r\ntest1,test2\r\n", + "a,b\r\ntest3,test4\r\n", + }, + }, + }, + }, + }, + // ignore primary key, but has other unique key + { + []*config.IgnoreColumns{ + { + DB: "db", + Table: "tbl1", + Columns: []string{"a"}, + }, + }, + Critical, + map[string][]*tableSource{ + "db": { + { + "tbl1", + "create table tbl1 (a varchar(16), b varchar(8), PRIMARY KEY (`a`), unique key uk (`b`))", + []string{ + "a,b\r\ntest1,test2\r\n", + "a,b\r\ntest3,test4\r\n", + }, + }, + }, + }, + }, + // ignore primary key, non other unique key + { + []*config.IgnoreColumns{ + { + DB: "db", + Table: "tbl1", + Columns: []string{"a"}, + }, + }, + Warn, + map[string][]*tableSource{ + "db": { + { + "tbl1", + "create table tbl1 (a varchar(16), b varchar(8), PRIMARY KEY (`a`), KEY idx_b (`b`))", + []string{ + "a,b\r\ntest1,test2\r\n", + "a,b\r\ntest3,test4\r\n", + }, + }, + }, + }, + }, + // non unique key, but data type inconsistent + { + nil, + Critical, + map[string][]*tableSource{ + "db": { + { + "tbl1", + "create table tbl1 (a bigint, b varchar(8));", + []string{ + "a,b\r\ntest1,test2\r\n", + "a,b\r\ntest3,test4\r\n", + }, + }, + }, + }, + }, + // non unique key, but ignore inconsistent field + { + []*config.IgnoreColumns{ + { + DB: "db", + Table: "tbl1", + Columns: []string{"a"}, + }, + }, + Warn, + map[string][]*tableSource{ + "db": { + { + "tbl1", + "create table tbl1 (a bigint, b varchar(8));", + []string{ + "a,b\r\ntest1,test2\r\n", + "a,b\r\ntest3,test4\r\n", + }, + }, + }, + }, + }, + // multiple tables, test the choose priority + { + nil, + Critical, + map[string][]*tableSource{ + "db": { + { + "tbl1", + "create table tbl1 (a varchar(8), b varchar(8));", + []string{ + "a,b\r\ntest1,test2\r\n", + }, + }, + { + "tbl2", + "create table tbl1 (a varchar(8) primary key, b varchar(8));", + []string{ + "a,b\r\ntest1,test2\r\n", + "a,b\r\ntest3,test4\r\n", + }, + }, + }, + }, + }, + { + nil, + Critical, + map[string][]*tableSource{ + "db": { + { + "tbl1", + "create table tbl1 (a varchar(8), b varchar(8));", + []string{ + "a,b\r\ntest1,test2\r\n", + }, + }, + }, + "db2": { + { + "tbl2", + "create table tbl1 (a bigint, b varchar(8));", + []string{ + "a,b\r\ntest1,test2\r\n", + "a,b\r\ntest3,test4\r\n", + }, + }, + }, + }, + }, + } + + cfg := &config.Config{ + Mydumper: config.MydumperRuntime{ + ReadBlockSize: config.ReadBlockSize, + CSV: config.CSVConfig{ + Separator: ",", + Delimiter: `"`, + Header: false, + NotNull: false, + Null: `\N`, + BackslashEscape: true, + TrimLastSep: false, + }, + }, + } + rc := &Controller{ + cfg: cfg, + store: mockStore, + ioWorkers: worker.NewPool(context.Background(), 1, "io"), + } + + p := parser.New() + p.SetSQLMode(mysql.ModeANSIQuotes) + se := tmock.NewContext() + + for _, ca := range cases { + rc.checkTemplate = NewSimpleTemplate() + cfg.Mydumper.IgnoreColumns = ca.ignoreColumns + rc.dbInfos = make(map[string]*checkpoints.TidbDBInfo) + + dbMetas := make([]*mydump.MDDatabaseMeta, 0) + for db, tbls := range ca.Sources { + tblMetas := make([]*mydump.MDTableMeta, 0, len(tbls)) + dbInfo := &checkpoints.TidbDBInfo{ + Name: db, + Tables: make(map[string]*checkpoints.TidbTableInfo), + } + rc.dbInfos[db] = dbInfo + + for _, tbl := range tbls { + node, err := p.ParseOneStmt(tbl.SQL, "", "") + c.Assert(err, IsNil) + core, err := ddl.MockTableInfo(se, node.(*ast.CreateTableStmt), 0xabcdef) + c.Assert(err, IsNil) + core.State = model.StatePublic + dbInfo.Tables[tbl.Name] = &checkpoints.TidbTableInfo{ + ID: core.ID, + DB: db, + Name: tbl.Name, + Core: core, + } + + fileInfos := make([]mydump.FileInfo, 0, len(tbl.Sources)) + for i, s := range tbl.Sources { + fileName := fmt.Sprintf("%s.%s.%d.csv", db, tbl.Name, i) + err = os.WriteFile(filepath.Join(dir, fileName), []byte(s), 0o644) + c.Assert(err, IsNil) + fileInfos = append(fileInfos, mydump.FileInfo{ + FileMeta: mydump.SourceFileMeta{ + Path: fileName, + Type: mydump.SourceTypeCSV, + FileSize: int64(len(s)), + }, + }) + } + tblMetas = append(tblMetas, &mydump.MDTableMeta{ + DB: db, + Name: tbl.Name, + DataFiles: fileInfos, + }) + } + dbMetas = append(dbMetas, &mydump.MDDatabaseMeta{ + Name: db, + Tables: tblMetas, + }) + } + + err := rc.checkCSVHeader(ctx, dbMetas) + c.Assert(err, IsNil) + if ca.level != passed { + c.Assert(rc.checkTemplate.FailedCount(ca.level), Equals, 1) + } + } + +} diff --git a/br/pkg/lightning/restore/check_template.go b/br/pkg/lightning/restore/check_template.go index 2b7d2a405cde0..3fb8c22904caa 100644 --- a/br/pkg/lightning/restore/check_template.go +++ b/br/pkg/lightning/restore/check_template.go @@ -16,6 +16,7 @@ package restore import ( "fmt" + "strings" "github.com/jedib0t/go-pretty/v6/table" "github.com/jedib0t/go-pretty/v6/text" @@ -41,12 +42,16 @@ type Template interface { // Output print all checks results. Output() string + + // FailedMsg represents the error msg for the failed check. + FailedMsg() string } type SimpleTemplate struct { count int warnFailedCount int criticalFailedCount int + failedMsg []string t table.Writer } @@ -63,10 +68,15 @@ func NewSimpleTemplate() Template { 0, 0, 0, + make([]string, 0), t, } } +func (c *SimpleTemplate) FailedMsg() string { + return strings.Join(c.failedMsg, ";\n") +} + func (c *SimpleTemplate) Collect(t CheckType, passed bool, msg string) { c.count++ if !passed { @@ -77,6 +87,7 @@ func (c *SimpleTemplate) Collect(t CheckType, passed bool, msg string) { c.warnFailedCount++ } } + c.failedMsg = append(c.failedMsg, msg) c.t.AppendRow(table.Row{c.count, msg, t, passed}) c.t.AppendSeparator() } diff --git a/br/pkg/lightning/restore/checksum_test.go b/br/pkg/lightning/restore/checksum_test.go index 0882c172f6af6..6a9f334b31f9a 100644 --- a/br/pkg/lightning/restore/checksum_test.go +++ b/br/pkg/lightning/restore/checksum_test.go @@ -18,6 +18,7 @@ import ( "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/memory" tmock "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/trxevents" @@ -96,11 +97,9 @@ func (s *checksumSuite) TestDoChecksumParallel(c *C) { // db.Close() will close all connections from its idle pool, set it 1 to expect one close db.SetMaxIdleConns(1) - var wg sync.WaitGroup - wg.Add(5) + var wg util.WaitGroupWrapper for i := 0; i < 5; i++ { - go func() { - defer wg.Done() + wg.Run(func() { checksum, err := DoChecksum(ctx, &TidbTableInfo{DB: "test", Name: "t"}) c.Assert(err, IsNil) c.Assert(*checksum, DeepEquals, RemoteChecksum{ @@ -110,7 +109,7 @@ func (s *checksumSuite) TestDoChecksumParallel(c *C) { TotalKVs: 7296873, TotalBytes: 357601387, }) - }() + }) } wg.Wait() @@ -136,14 +135,13 @@ func (s *checksumSuite) TestIncreaseGCLifeTimeFail(c *C) { mock.ExpectClose() ctx := MockDoChecksumCtx(db) - var wg sync.WaitGroup - wg.Add(5) + var wg util.WaitGroupWrapper + for i := 0; i < 5; i++ { - go func() { + wg.Run(func() { _, errChecksum := DoChecksum(ctx, &TidbTableInfo{DB: "test", Name: "t"}) c.Assert(errChecksum, ErrorMatches, "update GC lifetime failed: update gc error: context canceled") - wg.Done() - }() + }) } wg.Wait() diff --git a/br/pkg/lightning/restore/restore.go b/br/pkg/lightning/restore/restore.go index 7ea7be3c9d161..777350a855d7b 100644 --- a/br/pkg/lightning/restore/restore.go +++ b/br/pkg/lightning/restore/restore.go @@ -25,10 +25,13 @@ import ( "sync" "time" + "github.com/coreos/go-semver/semver" "github.com/docker/go-units" + "github.com/google/uuid" "github.com/pingcap/errors" "github.com/pingcap/failpoint" sstpb "github.com/pingcap/kvproto/pkg/import_sstpb" + berrors "github.com/pingcap/tidb/br/pkg/errors" "github.com/pingcap/tidb/br/pkg/lightning/backend" "github.com/pingcap/tidb/br/pkg/lightning/backend/importer" "github.com/pingcap/tidb/br/pkg/lightning/backend/kv" @@ -54,6 +57,7 @@ import ( "github.com/pingcap/tidb/meta/autoid" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/util/collate" + pd "github.com/tikv/pd/client" "go.uber.org/atomic" "go.uber.org/multierr" "go.uber.org/zap" @@ -113,6 +117,11 @@ const ( compactionUpperThreshold = 32 * units.GiB ) +var ( + minTiKVVersionForDuplicateResolution = *semver.New("5.2.0") + maxTiKVVersionForDuplicateResolution = version.NextMajorVersion() +) + // DeliverPauser is a shared pauser to pause progress to (*chunkRestore).encodeLoop var DeliverPauser = common.NewPauser() @@ -346,6 +355,17 @@ func NewRestoreControllerWithPauser( maxOpenFiles = math.MaxInt32 } + if cfg.TikvImporter.DuplicateResolution != config.DupeResAlgNone { + if err := tikv.CheckTiKVVersion(ctx, tls, cfg.TiDB.PdAddr, minTiKVVersionForDuplicateResolution, maxTiKVVersionForDuplicateResolution); err != nil { + if berrors.Is(err, berrors.ErrVersionMismatch) { + log.L().Warn("TiKV version doesn't support duplicate resolution. The resolution algorithm will fall back to 'none'", zap.Error(err)) + cfg.TikvImporter.DuplicateResolution = config.DupeResAlgNone + } else { + return nil, errors.Annotate(err, "check TiKV version for duplicate resolution failed") + } + } + } + backend, err = local.NewLocalBackend(ctx, tls, cfg, g, maxOpenFiles, errorMgr) if err != nil { return nil, errors.Annotate(err, "build local backend failed") @@ -414,7 +434,6 @@ func (rc *Controller) Run(ctx context.Context) error { rc.preCheckRequirements, rc.restoreTables, rc.fullCompact, - rc.switchToNormalMode, rc.cleanCheckpoints, } @@ -768,6 +787,7 @@ func (rc *Controller) restoreSchema(ctx context.Context) error { os.Exit(0) }) + rc.checkpointsWg.Add(1) // checkpointsWg will be done in `rc.listenCheckpointUpdates` go rc.listenCheckpointUpdates() sysVars := ObtainImportantVariables(ctx, rc.tidbGlue.GetSQLExecutor(), !rc.isTiDBBackend()) @@ -851,7 +871,7 @@ func verifyLocalFile(ctx context.Context, cpdb checkpoints.DB, dir string) error for tableName, engineIDs := range targetTables { for _, engineID := range engineIDs { _, eID := backend.MakeUUID(tableName, engineID) - file := local.File{UUID: eID} + file := local.Engine{UUID: eID} err := file.Exist(dir) if err != nil { log.L().Error("can't find local file", @@ -974,7 +994,7 @@ func (rc *Controller) saveStatusCheckpoint(ctx context.Context, tableName string // listenCheckpointUpdates will combine several checkpoints together to reduce database load. func (rc *Controller) listenCheckpointUpdates() { - rc.checkpointsWg.Add(1) + defer rc.checkpointsWg.Done() var lock sync.Mutex coalesed := make(map[string]*checkpoints.TableCheckpointDiff) @@ -1063,7 +1083,6 @@ func (rc *Controller) listenCheckpointUpdates() { } }) } - rc.checkpointsWg.Done() } // buildRunPeriodicActionAndCancelFunc build the runPeriodicAction func and a cancel func @@ -1093,10 +1112,7 @@ func (rc *Controller) buildRunPeriodicActionAndCancelFunc(ctx context.Context, s cancelFuncs = append(cancelFuncs, func(bool) { switchModeTicker.Stop() }) cancelFuncs = append(cancelFuncs, func(do bool) { if do { - log.L().Info("switch to normal mode") - if err := rc.switchToNormalMode(ctx); err != nil { - log.L().Warn("switch tikv to normal mode failed", zap.Error(err)) - } + rc.switchToNormalMode(ctx) } }) switchModeChan = switchModeTicker.C @@ -1236,7 +1252,107 @@ func (rc *Controller) buildRunPeriodicActionAndCancelFunc(ctx context.Context, s var checksumManagerKey struct{} +const ( + pauseGCTTLForDupeRes = time.Hour + pauseGCIntervalForDupeRes = time.Minute +) + +func (rc *Controller) keepPauseGCForDupeRes(ctx context.Context) (<-chan struct{}, error) { + tlsOpt := rc.tls.ToPDSecurityOption() + pdCli, err := pd.NewClientWithContext(ctx, []string{rc.cfg.TiDB.PdAddr}, tlsOpt) + if err != nil { + return nil, errors.Trace(err) + } + + serviceID := "lightning-duplicate-resolution-" + uuid.New().String() + ttl := int64(pauseGCTTLForDupeRes / time.Second) + + var ( + safePoint uint64 + paused bool + ) + // Try to get the minimum safe point across all services as our GC safe point. + for i := 0; i < 10; i++ { + if i > 0 { + time.Sleep(time.Second * 3) + } + minSafePoint, err := pdCli.UpdateServiceGCSafePoint(ctx, serviceID, ttl, 1) + if err != nil { + pdCli.Close() + return nil, errors.Trace(err) + } + newMinSafePoint, err := pdCli.UpdateServiceGCSafePoint(ctx, serviceID, ttl, minSafePoint) + if err != nil { + pdCli.Close() + return nil, errors.Trace(err) + } + if newMinSafePoint <= minSafePoint { + safePoint = minSafePoint + paused = true + break + } + log.L().Warn( + "Failed to register GC safe point because the current minimum safe point is newer"+ + " than what we assume, will retry newMinSafePoint next time", + zap.Uint64("minSafePoint", minSafePoint), + zap.Uint64("newMinSafePoint", newMinSafePoint), + ) + } + if !paused { + pdCli.Close() + return nil, errors.New("failed to pause GC for duplicate resolution after all retries") + } + + exitCh := make(chan struct{}) + go func(safePoint uint64) { + defer pdCli.Close() + defer close(exitCh) + ticker := time.NewTicker(pauseGCIntervalForDupeRes) + defer ticker.Stop() + for { + select { + case <-ticker.C: + minSafePoint, err := pdCli.UpdateServiceGCSafePoint(ctx, serviceID, ttl, safePoint) + if err != nil { + log.L().Warn("Failed to register GC safe point", zap.Error(err)) + continue + } + if minSafePoint > safePoint { + log.L().Warn("The current minimum safe point is newer than what we hold, duplicate records are at"+ + "risk of being GC and not detectable", + zap.Uint64("safePoint", safePoint), + zap.Uint64("minSafePoint", minSafePoint), + ) + safePoint = minSafePoint + } + case <-ctx.Done(): + stopCtx, cancelFunc := context.WithTimeout(context.Background(), time.Second*5) + if _, err := pdCli.UpdateServiceGCSafePoint(stopCtx, serviceID, 0, safePoint); err != nil { + log.L().Warn("Failed to reset safe point ttl to zero", zap.Error(err)) + } + // just make compiler happy + cancelFunc() + return + } + } + }(safePoint) + return exitCh, nil +} + func (rc *Controller) restoreTables(ctx context.Context) error { + if rc.cfg.TikvImporter.DuplicateResolution != config.DupeResAlgNone { + subCtx, cancel := context.WithCancel(ctx) + exitCh, err := rc.keepPauseGCForDupeRes(subCtx) + if err != nil { + cancel() + return errors.Trace(err) + } + defer func() { + cancel() + <-exitCh + }() + } + logTask := log.L().Begin(zap.InfoLevel, "restore all tables data") if rc.tableWorkers == nil { rc.tableWorkers = worker.NewPool(ctx, rc.cfg.App.TableConcurrency, "table") @@ -1374,7 +1490,7 @@ func (rc *Controller) restoreTables(ctx context.Context) error { if err != nil { return errors.Trace(err) } - tr, err := NewTableRestore(tableName, tableMeta, dbInfo, tableInfo, cp, igCols.Columns) + tr, err := NewTableRestore(tableName, tableMeta, dbInfo, tableInfo, cp, igCols.ColumnsMap()) if err != nil { return errors.Trace(err) } @@ -1566,12 +1682,13 @@ func (rc *Controller) doCompact(ctx context.Context, level int32) error { } func (rc *Controller) switchToImportMode(ctx context.Context) { + log.L().Info("switch to import mode") rc.switchTiKVMode(ctx, sstpb.SwitchMode_Import) } -func (rc *Controller) switchToNormalMode(ctx context.Context) error { +func (rc *Controller) switchToNormalMode(ctx context.Context) { + log.L().Info("switch to normal mode") rc.switchTiKVMode(ctx, sstpb.SwitchMode_Normal) - return nil } func (rc *Controller) switchTiKVMode(ctx context.Context, mode sstpb.SwitchMode) { @@ -1804,13 +1921,13 @@ func (rc *Controller) preCheckRequirements(ctx context.Context) error { if rc.tidbGlue.OwnsSQLExecutor() && rc.cfg.App.CheckRequirements { fmt.Print(rc.checkTemplate.Output()) - if !rc.checkTemplate.Success() { - if !taskExist && rc.taskMgr != nil { - rc.taskMgr.CleanupTask(ctx) - } - return errors.Errorf("tidb-lightning pre-check failed." + - " Please fix the failed check(s) or set --check-requirements=false to skip checks") + } + if !rc.checkTemplate.Success() { + if !taskExist && rc.taskMgr != nil { + rc.taskMgr.CleanupTask(ctx) } + return errors.Errorf("tidb-lightning check failed."+ + " Please fix the failed check(s):\n %s", rc.checkTemplate.FailedMsg()) } return nil } @@ -1851,6 +1968,11 @@ func (rc *Controller) DataCheck(ctx context.Context) error { } } } + err = rc.checkCSVHeader(ctx, rc.dbMetas) + if err != nil { + return err + } + if len(checkPointCriticalMsgs) != 0 { rc.checkTemplate.Collect(Critical, false, strings.Join(checkPointCriticalMsgs, "\n")) } else { @@ -2184,6 +2306,16 @@ func (cr *chunkRestore) encodeLoop( pauser, maxKvPairsCnt := rc.pauser, rc.cfg.TikvImporter.MaxKVPairs initializedColumns, reachEOF := false, false + // filteredColumns is column names that excluded ignored columns + // WARN: this might be not correct when different SQL statements contains different fields, + // but since ColumnPermutation also depends on the hypothesis that the columns in one source file is the same + // so this should be ok. + var filteredColumns []string + ignoreColumns, err1 := rc.cfg.Mydumper.IgnoreColumns.GetIgnoreColumns(t.dbInfo.Name, t.tableInfo.Core.Name.O, rc.cfg.Mydumper.CaseSensitive) + if err1 != nil { + err = err1 + return + } for !reachEOF { if err = pauser.Wait(ctx); err != nil { return @@ -2214,6 +2346,26 @@ func (cr *chunkRestore) encodeLoop( return } } + filteredColumns = columnNames + if ignoreColumns != nil && len(ignoreColumns.Columns) > 0 { + filteredColumns = make([]string, 0, len(columnNames)) + ignoreColsMap := ignoreColumns.ColumnsMap() + if len(columnNames) > 0 { + for _, c := range columnNames { + if _, ok := ignoreColsMap[c]; !ok { + filteredColumns = append(filteredColumns, c) + } + } + } else { + // init column names by table schema + // after filtered out some columns, we must explicitly set the columns for TiDB backend + for _, col := range t.tableInfo.Core.Columns { + if _, ok := ignoreColsMap[col.Name.L]; !col.Hidden && !ok { + filteredColumns = append(filteredColumns, col.Name.O) + } + } + } + } initializedColumns = true } case io.EOF: @@ -2232,7 +2384,7 @@ func (cr *chunkRestore) encodeLoop( hasIgnoredEncodeErr := false if encodeErr != nil { - rowText := tidb.EncodeRowForRecord(t.encTable, rc.cfg.TiDB.SQLMode, lastRow.Row) + rowText := tidb.EncodeRowForRecord(t.encTable, rc.cfg.TiDB.SQLMode, lastRow.Row, cr.chunk.ColumnPermutation) encodeErr = rc.errorMgr.RecordTypeError(ctx, logger, t.tableName, cr.chunk.Key.Path, newOffset, rowText, encodeErr) err = errors.Annotatef(encodeErr, "in file %s at offset %d", &cr.chunk.Key, newOffset) hasIgnoredEncodeErr = true @@ -2247,7 +2399,7 @@ func (cr *chunkRestore) encodeLoop( continue } - kvPacket = append(kvPacket, deliveredKVs{kvs: kvs, columns: columnNames, offset: newOffset, rowID: rowID}) + kvPacket = append(kvPacket, deliveredKVs{kvs: kvs, columns: filteredColumns, offset: newOffset, rowID: rowID}) kvSize += kvs.Size() failpoint.Inject("mock-kv-size", func(val failpoint.Value) { kvSize += uint64(val.(int)) diff --git a/br/pkg/lightning/restore/restore_test.go b/br/pkg/lightning/restore/restore_test.go index fc44917fdf3b0..b710a6627a668 100644 --- a/br/pkg/lightning/restore/restore_test.go +++ b/br/pkg/lightning/restore/restore_test.go @@ -745,30 +745,124 @@ func (s *tableRestoreSuite) TestGetColumnsNames(c *C) { func (s *tableRestoreSuite) TestInitializeColumns(c *C) { ccp := &checkpoints.ChunkCheckpoint{} - c.Assert(s.tr.initializeColumns(nil, ccp), IsNil) - c.Assert(ccp.ColumnPermutation, DeepEquals, []int{0, 1, 2, -1}) - ccp.ColumnPermutation = nil - c.Assert(s.tr.initializeColumns([]string{"b", "c", "a"}, ccp), IsNil) - c.Assert(ccp.ColumnPermutation, DeepEquals, []int{2, 0, 1, -1}) + defer func() { + s.tr.ignoreColumns = nil + }() + + cases := []struct { + columns []string + ignoreColumns map[string]struct{} + expectedPermutation []int + errPat string + }{ + { + nil, + nil, + []int{0, 1, 2, -1}, + "", + }, + { + nil, + map[string]struct{}{"b": {}}, + []int{0, -1, 2, -1}, + "", + }, + { + []string{"b", "c", "a"}, + nil, + []int{2, 0, 1, -1}, + "", + }, + { + []string{"b", "c", "a"}, + map[string]struct{}{"b": {}}, + []int{2, -1, 1, -1}, + "", + }, + { + []string{"b"}, + nil, + []int{-1, 0, -1, -1}, + "", + }, + { + []string{"_tidb_rowid", "b", "a", "c"}, + nil, + []int{2, 1, 3, 0}, + "", + }, + { + []string{"_tidb_rowid", "b", "a", "c"}, + map[string]struct{}{"b": {}, "_tidb_rowid": {}}, + []int{2, -1, 3, -1}, + "", + }, + { + []string{"_tidb_rowid", "b", "a", "c", "d"}, + nil, + nil, + `unknown columns in header \[d\]`, + }, + { + []string{"e", "b", "c", "d"}, + nil, + nil, + `unknown columns in header \[e d\]`, + }, + } + + for _, testCase := range cases { + ccp.ColumnPermutation = nil + s.tr.ignoreColumns = testCase.ignoreColumns + err := s.tr.initializeColumns(testCase.columns, ccp) + if len(testCase.errPat) > 0 { + c.Assert(err, NotNil) + c.Assert(err, ErrorMatches, testCase.errPat) + } else { + c.Assert(ccp.ColumnPermutation, DeepEquals, testCase.expectedPermutation) + } + } +} - ccp.ColumnPermutation = nil - c.Assert(s.tr.initializeColumns([]string{"b"}, ccp), IsNil) - c.Assert(ccp.ColumnPermutation, DeepEquals, []int{-1, 0, -1, -1}) +func (s *tableRestoreSuite) TestInitializeColumnsGenerated(c *C) { + p := parser.New() + p.SetSQLMode(mysql.ModeANSIQuotes) + se := tmock.NewContext() - ccp.ColumnPermutation = nil - c.Assert(s.tr.initializeColumns([]string{"_tidb_rowid", "b", "a", "c"}, ccp), IsNil) - c.Assert(ccp.ColumnPermutation, DeepEquals, []int{2, 1, 3, 0}) + cases := []struct { + schema string + columns []string + expectedPermutation []int + }{ + { + "CREATE TABLE `table` (a INT, b INT, C INT, d INT AS (a * 2))", + []string{"b", "c", "a"}, + []int{2, 0, 1, -1, -1}, + }, + // all generated columns and none input columns + { + "CREATE TABLE `table` (a bigint as (1 + 2) stored, b text as (sha1(repeat('x', a))) stored)", + []string{}, + []int{-1, -1, -1}, + }, + } - ccp.ColumnPermutation = nil - err := s.tr.initializeColumns([]string{"_tidb_rowid", "b", "a", "c", "d"}, ccp) - c.Assert(err, NotNil) - c.Assert(err, ErrorMatches, `unknown columns in header \[d\]`) + for _, testCase := range cases { + node, err := p.ParseOneStmt(testCase.schema, "", "") + c.Assert(err, IsNil) + core, err := ddl.MockTableInfo(se, node.(*ast.CreateTableStmt), 0xabcdef) + c.Assert(err, IsNil) + core.State = model.StatePublic + tableInfo := &checkpoints.TidbTableInfo{Name: "table", DB: "db", Core: core} + s.tr, err = NewTableRestore("`db`.`table`", s.tableMeta, s.dbInfo, tableInfo, &checkpoints.TableCheckpoint{}, nil) + c.Assert(err, IsNil) + ccp := &checkpoints.ChunkCheckpoint{} - ccp.ColumnPermutation = nil - err = s.tr.initializeColumns([]string{"e", "b", "c", "d"}, ccp) - c.Assert(err, NotNil) - c.Assert(err, ErrorMatches, `unknown columns in header \[e d\]`) + err = s.tr.initializeColumns(testCase.columns, ccp) + c.Assert(err, IsNil) + c.Assert(ccp.ColumnPermutation, DeepEquals, testCase.expectedPermutation) + } } func (s *tableRestoreSuite) TestCompareChecksumSuccess(c *C) { @@ -986,8 +1080,8 @@ func (s *tableRestoreSuite) TestTableRestoreMetrics(c *C) { db, sqlMock, err := sqlmock.New() c.Assert(err, IsNil) g.EXPECT().GetDB().Return(db, nil).AnyTimes() - sqlMock.ExpectQuery("SELECT version\\(\\);").WillReturnRows(sqlmock.NewRows([]string{"version()"}). - AddRow("5.7.25-TiDB-v5.0.1")) + sqlMock.ExpectQuery("SELECT tidb_version\\(\\);").WillReturnRows(sqlmock.NewRows([]string{"tidb_version()"}). + AddRow("Release Version: v5.2.1\nEdition: Community\n")) web.BroadcastInitProgress(rc.dbMetas) @@ -1024,6 +1118,7 @@ func (s *tableRestoreSuite) TestSaveStatusCheckpoint(c *C) { saveCpCh: saveCpCh, checkpointsDB: checkpoints.NewNullCheckpointsDB(), } + rc.checkpointsWg.Add(1) go rc.listenCheckpointUpdates() start := time.Now() @@ -1234,6 +1329,7 @@ func (s *chunkRestoreSuite) TestEncodeLoop(c *C) { c.Assert(kvs, HasLen, 1) c.Assert(kvs[0].rowID, Equals, int64(19)) c.Assert(kvs[0].offset, Equals, int64(36)) + c.Assert(kvs[0].columns, DeepEquals, []string(nil)) kvs = <-kvsCh c.Assert(len(kvs), Equals, 0) @@ -1306,6 +1402,7 @@ func (s *chunkRestoreSuite) TestEncodeLoopDeliverLimit(c *C) { rc := &Controller{pauser: DeliverPauser, cfg: cfg} c.Assert(failpoint.Enable( "github.com/pingcap/tidb/br/pkg/lightning/restore/mock-kv-size", "return(110000000)"), IsNil) + defer failpoint.Disable("github.com/pingcap/tidb/br/pkg/lightning/restore/mock-kv-size") _, _, err = s.cr.encodeLoop(ctx, kvsCh, s.tr, s.tr.logger, kvEncoder, deliverCompleteCh, rc) c.Assert(err, IsNil) @@ -1355,7 +1452,7 @@ func (s *chunkRestoreSuite) TestEncodeLoopDeliverErrored(c *C) { func (s *chunkRestoreSuite) TestEncodeLoopColumnsMismatch(c *C) { dir := c.MkDir() fileName := "db.table.000.csv" - err := os.WriteFile(filepath.Join(dir, fileName), []byte("1,2,3,4\r\n4,5,6,7\r\n"), 0o644) + err := os.WriteFile(filepath.Join(dir, fileName), []byte("1,2\r\n4,5,6,7\r\n"), 0o644) c.Assert(err, IsNil) store, err := storage.NewLocalStorage(dir) @@ -1385,12 +1482,116 @@ func (s *chunkRestoreSuite) TestEncodeLoopColumnsMismatch(c *C) { Timestamp: 1234567895, }) c.Assert(err, IsNil) + defer kvEncoder.Close() _, _, err = s.cr.encodeLoop(ctx, kvsCh, s.tr, s.tr.logger, kvEncoder, deliverCompleteCh, rc) - c.Assert(err, ErrorMatches, "in file db.table.2.sql:0 at offset 8: column count mismatch, expected 3, got 4") + c.Assert(err, ErrorMatches, "in file db.table.2.sql:0 at offset 4: column count mismatch, expected 3, got 2") c.Assert(kvsCh, HasLen, 0) } +func (s *chunkRestoreSuite) TestEncodeLoopIgnoreColumnsCSV(c *C) { + cases := []struct { + s string + ignoreColumns []*config.IgnoreColumns + kvs deliveredKVs + header bool + }{ + { + "1,2,3\r\n4,5,6\r\n", + []*config.IgnoreColumns{ + { + DB: "db", + Table: "table", + Columns: []string{"a"}, + }, + }, + deliveredKVs{ + rowID: 1, + offset: 6, + columns: []string{"b", "c"}, + }, + false, + }, + { + "b,c\r\n2,3\r\n5,6\r\n", + []*config.IgnoreColumns{ + { + TableFilter: []string{"db*.tab*"}, + Columns: []string{"b"}, + }, + }, + deliveredKVs{ + rowID: 1, + offset: 9, + columns: []string{"c"}, + }, + true, + }, + } + + for _, cs := range cases { + // reset test + s.SetUpTest(c) + s.testEncodeLoopIgnoreColumnsCSV(c, cs.s, cs.ignoreColumns, cs.kvs, cs.header) + } +} + +func (s *chunkRestoreSuite) testEncodeLoopIgnoreColumnsCSV( + c *C, + f string, + ignoreColumns []*config.IgnoreColumns, + deliverKV deliveredKVs, + header bool, +) { + dir := c.MkDir() + fileName := "db.table.000.csv" + err := os.WriteFile(filepath.Join(dir, fileName), []byte(f), 0o644) + c.Assert(err, IsNil) + + store, err := storage.NewLocalStorage(dir) + c.Assert(err, IsNil) + + ctx := context.Background() + cfg := config.NewConfig() + cfg.Mydumper.IgnoreColumns = ignoreColumns + cfg.Mydumper.CSV.Header = header + rc := &Controller{pauser: DeliverPauser, cfg: cfg} + + reader, err := store.Open(ctx, fileName) + c.Assert(err, IsNil) + w := worker.NewPool(ctx, 5, "io") + p, err := mydump.NewCSVParser(&cfg.Mydumper.CSV, reader, 111, w, cfg.Mydumper.CSV.Header, nil) + c.Assert(err, IsNil) + + err = s.cr.parser.Close() + c.Assert(err, IsNil) + s.cr.parser = p + + kvsCh := make(chan []deliveredKVs, 2) + deliverCompleteCh := make(chan deliverResult) + kvEncoder, err := tidb.NewTiDBBackend(nil, config.ReplaceOnDup, errormanager.New(nil, config.NewConfig())).NewEncoder( + s.tr.encTable, + &kv.SessionOptions{ + SQLMode: s.cfg.TiDB.SQLMode, + Timestamp: 1234567895, + }) + c.Assert(err, IsNil) + defer kvEncoder.Close() + + _, _, err = s.cr.encodeLoop(ctx, kvsCh, s.tr, s.tr.logger, kvEncoder, deliverCompleteCh, rc) + c.Assert(err, IsNil) + c.Assert(kvsCh, HasLen, 2) + + kvs := <-kvsCh + c.Assert(kvs, HasLen, 2) + c.Assert(kvs[0].rowID, Equals, deliverKV.rowID) + c.Assert(kvs[0].offset, Equals, deliverKV.offset) + c.Assert(kvs[0].columns, DeepEquals, deliverKV.columns) + + kvs = <-kvsCh + c.Assert(len(kvs), Equals, 0) +} + func (s *chunkRestoreSuite) TestRestore(c *C) { ctx := context.Background() @@ -1778,7 +1979,7 @@ func (s *tableRestoreSuite) TestCheckClusterRegion(c *C) { testCases := []testCase{ { stores: api.StoresInfo{Stores: []*api.StoreInfo{ - {Store: &api.MetaStore{Store: &metapb.Store{Id: 1}}, Status: &api.StoreStatus{RegionCount: 200}}, + {Store: &api.MetaStore{StoreID: 1}, Status: &api.StoreStatus{RegionCount: 200}}, }}, emptyRegions: api.RegionsInfo{ Regions: append([]api.RegionInfo(nil), makeRegions(100, 1)...), @@ -1789,9 +1990,9 @@ func (s *tableRestoreSuite) TestCheckClusterRegion(c *C) { }, { stores: api.StoresInfo{Stores: []*api.StoreInfo{ - {Store: &api.MetaStore{Store: &metapb.Store{Id: 1}}, Status: &api.StoreStatus{RegionCount: 2000}}, - {Store: &api.MetaStore{Store: &metapb.Store{Id: 2}}, Status: &api.StoreStatus{RegionCount: 3100}}, - {Store: &api.MetaStore{Store: &metapb.Store{Id: 3}}, Status: &api.StoreStatus{RegionCount: 2500}}, + {Store: &api.MetaStore{StoreID: 1}, Status: &api.StoreStatus{RegionCount: 2000}}, + {Store: &api.MetaStore{StoreID: 2}, Status: &api.StoreStatus{RegionCount: 3100}}, + {Store: &api.MetaStore{StoreID: 3}, Status: &api.StoreStatus{RegionCount: 2500}}, }}, emptyRegions: api.RegionsInfo{ Regions: append(append(append([]api.RegionInfo(nil), @@ -1809,9 +2010,9 @@ func (s *tableRestoreSuite) TestCheckClusterRegion(c *C) { }, { stores: api.StoresInfo{Stores: []*api.StoreInfo{ - {Store: &api.MetaStore{Store: &metapb.Store{Id: 1}}, Status: &api.StoreStatus{RegionCount: 1200}}, - {Store: &api.MetaStore{Store: &metapb.Store{Id: 2}}, Status: &api.StoreStatus{RegionCount: 3000}}, - {Store: &api.MetaStore{Store: &metapb.Store{Id: 3}}, Status: &api.StoreStatus{RegionCount: 2500}}, + {Store: &api.MetaStore{StoreID: 1}, Status: &api.StoreStatus{RegionCount: 1200}}, + {Store: &api.MetaStore{StoreID: 2}, Status: &api.StoreStatus{RegionCount: 3000}}, + {Store: &api.MetaStore{StoreID: 3}, Status: &api.StoreStatus{RegionCount: 2500}}, }}, expectMsgs: []string{".*Region distribution is unbalanced.*but we expect it must not be less than 0.5.*"}, expectResult: false, @@ -1819,9 +2020,9 @@ func (s *tableRestoreSuite) TestCheckClusterRegion(c *C) { }, { stores: api.StoresInfo{Stores: []*api.StoreInfo{ - {Store: &api.MetaStore{Store: &metapb.Store{Id: 1}}, Status: &api.StoreStatus{RegionCount: 0}}, - {Store: &api.MetaStore{Store: &metapb.Store{Id: 2}}, Status: &api.StoreStatus{RegionCount: 2800}}, - {Store: &api.MetaStore{Store: &metapb.Store{Id: 3}}, Status: &api.StoreStatus{RegionCount: 2500}}, + {Store: &api.MetaStore{StoreID: 1}, Status: &api.StoreStatus{RegionCount: 0}}, + {Store: &api.MetaStore{StoreID: 2}, Status: &api.StoreStatus{RegionCount: 2800}}, + {Store: &api.MetaStore{StoreID: 3}, Status: &api.StoreStatus{RegionCount: 2500}}, }}, expectMsgs: []string{".*Region distribution is unbalanced.*but we expect it must not be less than 0.5.*"}, expectResult: false, diff --git a/br/pkg/lightning/restore/table_restore.go b/br/pkg/lightning/restore/table_restore.go index 4d5385b9c2521..8664943e75199 100644 --- a/br/pkg/lightning/restore/table_restore.go +++ b/br/pkg/lightning/restore/table_restore.go @@ -36,6 +36,7 @@ import ( "github.com/pingcap/tidb/br/pkg/utils" "github.com/pingcap/tidb/meta/autoid" "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" "go.uber.org/multierr" @@ -52,7 +53,7 @@ type TableRestore struct { alloc autoid.Allocators logger log.Logger - ignoreColumns []string + ignoreColumns map[string]struct{} } func NewTableRestore( @@ -61,7 +62,7 @@ func NewTableRestore( dbInfo *checkpoints.TidbDBInfo, tableInfo *checkpoints.TidbTableInfo, cp *checkpoints.TableCheckpoint, - ignoreColumns []string, + ignoreColumns map[string]struct{}, ) (*TableRestore, error) { idAlloc := kv.NewPanickingAllocators(cp.AllocBase) tbl, err := tables.TableFromMeta(idAlloc, tableInfo.Core) @@ -166,15 +167,21 @@ func (tr *TableRestore) initializeColumns(columns []string, ccp *checkpoints.Chu return nil } -func createColumnPermutation(columns []string, ignoreColumns []string, tableInfo *model.TableInfo) ([]int, error) { +func createColumnPermutation(columns []string, ignoreColumns map[string]struct{}, tableInfo *model.TableInfo) ([]int, error) { var colPerm []int if len(columns) == 0 { colPerm = make([]int, 0, len(tableInfo.Columns)+1) shouldIncludeRowID := common.TableHasAutoRowID(tableInfo) // no provided columns, so use identity permutation. - for i := range tableInfo.Columns { - colPerm = append(colPerm, i) + for i, col := range tableInfo.Columns { + idx := i + if _, ok := ignoreColumns[col.Name.L]; ok { + idx = -1 + } else if col.IsGenerated() { + idx = -1 + } + colPerm = append(colPerm, idx) } if shouldIncludeRowID { colPerm = append(colPerm, -1) @@ -192,6 +199,7 @@ func createColumnPermutation(columns []string, ignoreColumns []string, tableInfo func (tr *TableRestore) restoreEngines(pCtx context.Context, rc *Controller, cp *checkpoints.TableCheckpoint) error { indexEngineCp := cp.Engines[indexEngineID] if indexEngineCp == nil { + tr.logger.Error("fail to restoreEngines because indexengine is nil") return errors.Errorf("table %v index engine checkpoint not found", tr.tableName) } // If there is an index engine only, it indicates no data needs to restore. @@ -700,11 +708,15 @@ func (tr *TableRestore) postProcess( return false, errors.Trace(err) } + if !forcePostProcess && rc.cfg.PostRestore.PostProcessAtLast { + return true, nil + } + w := rc.checksumWorks.Apply() defer rc.checksumWorks.Recycle(w) - finished := true - if cp.Status < checkpoints.CheckpointStatusChecksummed { + shouldSkipAnalyze := false + if cp.Status < checkpoints.CheckpointStatusChecksumSkipped { // 4. do table checksum var localChecksum verify.KVChecksum for _, engine := range cp.Engines { @@ -716,11 +728,18 @@ func (tr *TableRestore) postProcess( // 4.5. do duplicate detection. hasDupe := false - if rc.cfg.TikvImporter.DuplicateDetection { + if rc.cfg.TikvImporter.DuplicateResolution != config.DupeResAlgNone { + opts := &kv.SessionOptions{ + SQLMode: mysql.ModeStrictAllTables, + SysVars: rc.sysVars, + } var err error - hasDupe, err = rc.backend.CollectLocalDuplicateRows(ctx, tr.encTable) + hasLocalDupe, err := rc.backend.CollectLocalDuplicateRows(ctx, tr.encTable, tr.tableName, opts) if err != nil { tr.logger.Error("collect local duplicate keys failed", log.ShortError(err)) + return false, err + } else { + hasDupe = hasLocalDupe } } @@ -729,74 +748,81 @@ func (tr *TableRestore) postProcess( return false, err } - if needRemoteDupe && rc.cfg.TikvImporter.DuplicateDetection { - hasRemoteDupe, err := rc.backend.CollectRemoteDuplicateRows(ctx, tr.encTable) - if err != nil { - tr.logger.Error("collect remote duplicate keys failed", log.ShortError(err)) - err = nil + if needRemoteDupe && rc.cfg.TikvImporter.DuplicateResolution != config.DupeResAlgNone { + opts := &kv.SessionOptions{ + SQLMode: mysql.ModeStrictAllTables, + SysVars: rc.sysVars, } - hasDupe = hasDupe || hasRemoteDupe - } - - if rc.cfg.PostRestore.Checksum == config.OpLevelOff { - tr.logger.Info("skip checksum") - if err := rc.saveStatusCheckpoint(ctx, tr.tableName, checkpoints.WholeTableEngineID, nil, checkpoints.CheckpointStatusChecksumSkipped); err != nil { - return false, errors.Trace(err) + hasRemoteDupe, e := rc.backend.CollectRemoteDuplicateRows(ctx, tr.encTable, tr.tableName, opts) + if e != nil { + tr.logger.Error("collect remote duplicate keys failed", log.ShortError(e)) + return false, e + } else { + hasDupe = hasDupe || hasRemoteDupe } - } else if forcePostProcess || !rc.cfg.PostRestore.PostProcessAtLast { - if !needChecksum { - return false, nil + if err = rc.backend.ResolveDuplicateRows(ctx, tr.encTable, tr.tableName, rc.cfg.TikvImporter.DuplicateResolution); err != nil { + tr.logger.Error("resolve remote duplicate keys failed", log.ShortError(err)) + return false, err } + } + + nextStage := checkpoints.CheckpointStatusChecksummed + if rc.cfg.PostRestore.Checksum != config.OpLevelOff && !hasDupe && needChecksum { if cp.Checksum.SumKVS() > 0 || baseTotalChecksum.SumKVS() > 0 { localChecksum.Add(&cp.Checksum) localChecksum.Add(baseTotalChecksum) tr.logger.Info("merged local checksum", zap.Object("checksum", &localChecksum)) } - if hasDupe { - // If there are duplicate keys, do not set the `ChecksumMismatch` error - tr.logger.Warn("checksum not performed due to duplicated records") - } else { - remoteChecksum, err := DoChecksum(ctx, tr.tableInfo) + var remoteChecksum *RemoteChecksum + remoteChecksum, err = DoChecksum(ctx, tr.tableInfo) + if err != nil { + return false, err + } + err = tr.compareChecksum(remoteChecksum, localChecksum) + // with post restore level 'optional', we will skip checksum error + if rc.cfg.PostRestore.Checksum == config.OpLevelOptional { if err != nil { - return false, err - } - err = tr.compareChecksum(remoteChecksum, localChecksum) - // with post restore level 'optional', we will skip checksum error - if rc.cfg.PostRestore.Checksum == config.OpLevelOptional { - if err != nil { - tr.logger.Warn("compare checksum failed, will skip this error and go on", log.ShortError(err)) - err = nil - } + tr.logger.Warn("compare checksum failed, will skip this error and go on", log.ShortError(err)) + err = nil } } - if err == nil { - err = metaMgr.FinishTable(ctx) + } else { + switch { + case rc.cfg.PostRestore.Checksum == config.OpLevelOff: + tr.logger.Info("skip checksum because the checksum option is off") + case hasDupe: + tr.logger.Info("skip checksum&analyze because duplicates were detected") + shouldSkipAnalyze = true + case !needChecksum: + tr.logger.Info("skip checksum&analyze because other lightning instance will do this") + shouldSkipAnalyze = true } + err = nil + nextStage = checkpoints.CheckpointStatusChecksumSkipped + } - saveCpErr := rc.saveStatusCheckpoint(ctx, tr.tableName, checkpoints.WholeTableEngineID, err, checkpoints.CheckpointStatusChecksummed) - if err = firstErr(err, saveCpErr); err != nil { - return false, errors.Trace(err) - } + // Don't call FinishTable when other lightning will calculate checksum. + if err == nil && !hasDupe && needChecksum { + err = metaMgr.FinishTable(ctx) + } - cp.Status = checkpoints.CheckpointStatusChecksummed - } else { - finished = false + saveCpErr := rc.saveStatusCheckpoint(ctx, tr.tableName, checkpoints.WholeTableEngineID, err, nextStage) + if err = firstErr(err, saveCpErr); err != nil { + return false, errors.Trace(err) } - } - if !finished { - return !finished, nil + cp.Status = nextStage } // 5. do table analyze - if cp.Status < checkpoints.CheckpointStatusAnalyzed { + if cp.Status < checkpoints.CheckpointStatusAnalyzeSkipped { switch { - case rc.cfg.PostRestore.Analyze == config.OpLevelOff: + case shouldSkipAnalyze || rc.cfg.PostRestore.Analyze == config.OpLevelOff: tr.logger.Info("skip analyze") if err := rc.saveStatusCheckpoint(ctx, tr.tableName, checkpoints.WholeTableEngineID, nil, checkpoints.CheckpointStatusAnalyzeSkipped); err != nil { return false, errors.Trace(err) } - cp.Status = checkpoints.CheckpointStatusAnalyzed + cp.Status = checkpoints.CheckpointStatusAnalyzeSkipped case forcePostProcess || !rc.cfg.PostRestore.PostProcessAtLast: err := tr.analyzeTable(ctx, rc.tidbGlue.GetSQLExecutor()) // witch post restore level 'optional', we will skip analyze error @@ -812,14 +838,14 @@ func (tr *TableRestore) postProcess( } cp.Status = checkpoints.CheckpointStatusAnalyzed default: - finished = false + return true, nil } } - return !finished, nil + return true, nil } -func parseColumnPermutations(tableInfo *model.TableInfo, columns []string, ignoreColumns []string) ([]int, error) { +func parseColumnPermutations(tableInfo *model.TableInfo, columns []string, ignoreColumns map[string]struct{}) ([]int, error) { colPerm := make([]int, 0, len(tableInfo.Columns)+1) columnMap := make(map[string]int) @@ -827,13 +853,6 @@ func parseColumnPermutations(tableInfo *model.TableInfo, columns []string, ignor columnMap[column] = i } - ignoreMap := make(map[string]int) - for _, column := range ignoreColumns { - if i, ok := columnMap[column]; ok { - ignoreMap[column] = i - } - } - tableColumnMap := make(map[string]int) for i, col := range tableInfo.Columns { tableColumnMap[col.Name.L] = i @@ -843,7 +862,7 @@ func parseColumnPermutations(tableInfo *model.TableInfo, columns []string, ignor var unknownCols []string for _, c := range columns { if _, ok := tableColumnMap[c]; !ok && c != model.ExtraHandleName.L { - if _, ignore := ignoreMap[c]; !ignore { + if _, ignore := ignoreColumns[c]; !ignore { unknownCols = append(unknownCols, c) } } @@ -855,7 +874,7 @@ func parseColumnPermutations(tableInfo *model.TableInfo, columns []string, ignor for _, colInfo := range tableInfo.Columns { if i, ok := columnMap[colInfo.Name.L]; ok { - if _, ignore := ignoreMap[colInfo.Name.L]; !ignore { + if _, ignore := ignoreColumns[colInfo.Name.L]; !ignore { colPerm = append(colPerm, i) } else { log.L().Debug("column ignored by user requirements", @@ -876,11 +895,16 @@ func parseColumnPermutations(tableInfo *model.TableInfo, columns []string, ignor colPerm = append(colPerm, -1) } } + // append _tidb_rowid column + rowIDIdx := -1 if i, ok := columnMap[model.ExtraHandleName.L]; ok { - colPerm = append(colPerm, i) - } else if common.TableHasAutoRowID(tableInfo) { - colPerm = append(colPerm, -1) + if _, ignored := ignoreColumns[model.ExtraHandleName.L]; !ignored { + rowIDIdx = i + } } + // FIXME: the schema info for tidb backend is not complete, so always add the _tidb_rowid field. + // Other logic should ignore this extra field if not needed. + colPerm = append(colPerm, rowIDIdx) return colPerm, nil } diff --git a/br/pkg/lightning/restore/tidb.go b/br/pkg/lightning/restore/tidb.go index 680cd1558e70a..ee1252fd3862d 100644 --- a/br/pkg/lightning/restore/tidb.go +++ b/br/pkg/lightning/restore/tidb.go @@ -93,12 +93,6 @@ func DBFromConfig(ctx context.Context, dsn config.DBStore) (*sql.DB, error) { TLS: dsn.TLS, } - if dsn.Vars != nil { - for k, v := range dsn.Vars { - param.Vars[k] = v - } - } - db, err := param.Connect() if err != nil { return nil, errors.Trace(err) @@ -119,6 +113,12 @@ func DBFromConfig(ctx context.Context, dsn config.DBStore) (*sql.DB, error) { "autocommit": "1", } + if dsn.Vars != nil { + for k, v := range dsn.Vars { + vars[k] = v + } + } + for k, v := range vars { q := fmt.Sprintf("SET SESSION %s = %s;", k, v) if _, err1 := db.ExecContext(ctx, q); err1 != nil { diff --git a/br/pkg/lightning/sigusr1_other.go b/br/pkg/lightning/sigusr1_other.go index af962b4c8bfdf..0e0a050e2c2fd 100644 --- a/br/pkg/lightning/sigusr1_other.go +++ b/br/pkg/lightning/sigusr1_other.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build !linux && !darwin && !freebsd && !unix // +build !linux,!darwin,!freebsd,!unix package lightning diff --git a/br/pkg/lightning/sigusr1_unix.go b/br/pkg/lightning/sigusr1_unix.go index 2280d0bd145ba..ac01998b5e51d 100644 --- a/br/pkg/lightning/sigusr1_unix.go +++ b/br/pkg/lightning/sigusr1_unix.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build linux || darwin || freebsd || unix // +build linux darwin freebsd unix package lightning diff --git a/br/pkg/lightning/web/res.go b/br/pkg/lightning/web/res.go index a9bc02868586e..c45bd5229a5d5 100644 --- a/br/pkg/lightning/web/res.go +++ b/br/pkg/lightning/web/res.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build dev // +build dev package web diff --git a/br/pkg/lightning/web/res_vfsdata.go b/br/pkg/lightning/web/res_vfsdata.go index 098929175e98d..e96e92e007120 100644 --- a/br/pkg/lightning/web/res_vfsdata.go +++ b/br/pkg/lightning/web/res_vfsdata.go @@ -1,5 +1,6 @@ // Code generated by vfsgen; DO NOT EDIT. +//go:build !dev // +build !dev package web diff --git a/br/pkg/logutil/logging.go b/br/pkg/logutil/logging.go index 6434cc8a06791..d247fe7c3375f 100644 --- a/br/pkg/logutil/logging.go +++ b/br/pkg/logutil/logging.go @@ -133,12 +133,17 @@ func RegionBy(key string, region *metapb.Region) zap.Field { return zap.Object(key, zapMarshalRegionMarshaler{region}) } -// Leader make the zap fields for a peer. +// Leader make the zap fields for a peer as leader. // nolint:interfacer func Leader(peer *metapb.Peer) zap.Field { return zap.String("leader", peer.String()) } +// Peer make the zap fields for a peer. +func Peer(peer *metapb.Peer) zap.Field { + return zap.String("peer", peer.String()) +} + type zapSSTMetaMarshaler struct{ *import_sstpb.SSTMeta } func (sstMeta zapSSTMetaMarshaler) MarshalLogObject(enc zapcore.ObjectEncoder) error { @@ -226,3 +231,11 @@ func RedactAny(fieldKey string, key interface{}) zap.Field { } return zap.Any(fieldKey, key) } + +// Redact replaces the zap field by a '?' if redaction is turned on. +func Redact(field zap.Field) zap.Field { + if redact.NeedRedact() { + return zap.String(field.Key, "?") + } + return field +} diff --git a/br/pkg/logutil/logging_test.go b/br/pkg/logutil/logging_test.go index 28ed6a8f708b2..fc4b415a89735 100644 --- a/br/pkg/logutil/logging_test.go +++ b/br/pkg/logutil/logging_test.go @@ -46,7 +46,6 @@ func newFile(j int) *backuppb.File { } func TestRater(t *testing.T) { - t.Parallel() m := prometheus.NewCounter(prometheus.CounterOpts{ Namespace: "testing", Name: "rater", @@ -65,13 +64,11 @@ func TestRater(t *testing.T) { } func TestFile(t *testing.T) { - t.Parallel() assertTrimEqual(t, logutil.File(newFile(1)), `{"file": {"name": "1", "CF": "write", "sha256": "31", "startKey": "31", "endKey": "32", "startVersion": 1, "endVersion": 2, "totalKvs": 1, "totalBytes": 1, "CRC64Xor": 1}}`) } func TestFiles(t *testing.T) { - t.Parallel() cases := []struct { count int expect string @@ -96,7 +93,6 @@ func TestFiles(t *testing.T) { } func TestKey(t *testing.T) { - t.Parallel() encoder := zapcore.NewConsoleEncoder(zapcore.EncoderConfig{}) out, err := encoder.EncodeEntry(zapcore.Entry{}, []zap.Field{logutil.Key("test", []byte{0, 1, 2, 3})}) require.NoError(t, err) @@ -104,7 +100,6 @@ func TestKey(t *testing.T) { } func TestKeys(t *testing.T) { - t.Parallel() cases := []struct { count int expect string @@ -129,7 +124,6 @@ func TestKeys(t *testing.T) { } func TestRewriteRule(t *testing.T) { - t.Parallel() rule := &import_sstpb.RewriteRule{ OldKeyPrefix: []byte("old"), NewKeyPrefix: []byte("new"), @@ -143,7 +137,6 @@ func TestRewriteRule(t *testing.T) { } func TestRegion(t *testing.T) { - t.Parallel() region := &metapb.Region{ Id: 1, StartKey: []byte{0x00, 0x01}, @@ -157,14 +150,12 @@ func TestRegion(t *testing.T) { } func TestLeader(t *testing.T) { - t.Parallel() leader := &metapb.Peer{Id: 2, StoreId: 3} assertTrimEqual(t, logutil.Leader(leader), `{"leader": "id:2 store_id:3 "}`) } func TestSSTMeta(t *testing.T) { - t.Parallel() meta := &import_sstpb.SSTMeta{ Uuid: []byte("mock uuid"), Range: &import_sstpb.Range{ @@ -183,14 +174,12 @@ func TestSSTMeta(t *testing.T) { } func TestShortError(t *testing.T) { - t.Parallel() err := errors.Annotate(berrors.ErrInvalidArgument, "test") assertTrimEqual(t, logutil.ShortError(err), `{"error": "test: [BR:Common:ErrInvalidArgument]invalid argument"}`) } func TestContextual(t *testing.T) { - t.Parallel() testCore, logs := observer.New(zap.InfoLevel) logutil.ResetGlobalLogger(zap.New(testCore)) diff --git a/br/pkg/membuf/buffer_test.go b/br/pkg/membuf/buffer_test.go index 0271aee54c7ef..c5d095d299f9c 100644 --- a/br/pkg/membuf/buffer_test.go +++ b/br/pkg/membuf/buffer_test.go @@ -40,8 +40,6 @@ func (t *testAllocator) Free(_ []byte) { } func TestBufferPool(t *testing.T) { - t.Parallel() - allocator := &testAllocator{} pool := NewPool(2, allocator) @@ -69,8 +67,6 @@ func TestBufferPool(t *testing.T) { } func TestBufferIsolation(t *testing.T) { - t.Parallel() - bytesBuf := NewBuffer() defer bytesBuf.Destroy() diff --git a/br/pkg/metautil/metafile.go b/br/pkg/metautil/metafile.go index 74d7e9d4ad859..e40ab4576bb3e 100644 --- a/br/pkg/metautil/metafile.go +++ b/br/pkg/metautil/metafile.go @@ -5,6 +5,7 @@ package metautil import ( "bytes" "context" + "crypto/rand" "crypto/sha256" "encoding/json" "fmt" @@ -16,6 +17,7 @@ import ( "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" backuppb "github.com/pingcap/kvproto/pkg/brpb" + "github.com/pingcap/kvproto/pkg/encryptionpb" "github.com/pingcap/log" berrors "github.com/pingcap/tidb/br/pkg/errors" "github.com/pingcap/tidb/br/pkg/logutil" @@ -24,6 +26,7 @@ import ( "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/statistics/handle" "github.com/pingcap/tidb/tablecodec" + "github.com/pingcap/tidb/util/encrypt" "go.uber.org/zap" ) @@ -39,6 +42,9 @@ const ( // MetaFileSize represents the limit size of one MetaFile MetaFileSize = 128 * units.MiB + + // CrypterIvLen represents the length of iv of crypter method + CrypterIvLen = 16 ) const ( @@ -49,9 +55,45 @@ const ( MetaV2 ) +func Encrypt(content []byte, cipher *backuppb.CipherInfo) (encryptedContent, iv []byte, err error) { + switch cipher.CipherType { + case encryptionpb.EncryptionMethod_PLAINTEXT: + return content, iv, nil + case encryptionpb.EncryptionMethod_AES128_CTR, + encryptionpb.EncryptionMethod_AES192_CTR, + encryptionpb.EncryptionMethod_AES256_CTR: + // generate random iv for aes crypter + iv = make([]byte, CrypterIvLen) + _, err = rand.Read(iv) + if err != nil { + return content, iv, errors.Trace(err) + } + encryptedContent, err = encrypt.AESEncryptWithCTR(content, cipher.CipherKey, iv) + return + default: + return content, iv, errors.Annotate(berrors.ErrInvalidArgument, "cipher type invalid") + } +} + +func Decrypt(content []byte, cipher *backuppb.CipherInfo, iv []byte) ([]byte, error) { + switch cipher.CipherType { + case encryptionpb.EncryptionMethod_PLAINTEXT: + return content, nil + case encryptionpb.EncryptionMethod_AES128_CTR, + encryptionpb.EncryptionMethod_AES192_CTR, + encryptionpb.EncryptionMethod_AES256_CTR: + return encrypt.AESDecryptWithCTR(content, cipher.CipherKey, iv) + default: + return content, errors.Annotate(berrors.ErrInvalidArgument, "cipher type invalid") + } +} + func walkLeafMetaFile( - ctx context.Context, storage storage.ExternalStorage, file *backuppb.MetaFile, output func(*backuppb.MetaFile), -) error { + ctx context.Context, + storage storage.ExternalStorage, + file *backuppb.MetaFile, + cipher *backuppb.CipherInfo, + output func(*backuppb.MetaFile)) error { if file == nil { return nil } @@ -64,16 +106,23 @@ func walkLeafMetaFile( if err != nil { return errors.Trace(err) } - checksum := sha256.Sum256(content) + + decryptContent, err := Decrypt(content, cipher, node.CipherIv) + if err != nil { + return errors.Trace(err) + } + + checksum := sha256.Sum256(decryptContent) if !bytes.Equal(node.Sha256, checksum[:]) { return errors.Annotatef(berrors.ErrInvalidMetaFile, "checksum mismatch expect %x, got %x", node.Sha256, checksum[:]) } + child := &backuppb.MetaFile{} - if err = proto.Unmarshal(content, child); err != nil { + if err = proto.Unmarshal(decryptContent, child); err != nil { return errors.Trace(err) } - if err = walkLeafMetaFile(ctx, storage, child, output); err != nil { + if err = walkLeafMetaFile(ctx, storage, child, cipher, output); err != nil { return errors.Trace(err) } } @@ -101,13 +150,18 @@ func (tbl *Table) NoChecksum() bool { type MetaReader struct { storage storage.ExternalStorage backupMeta *backuppb.BackupMeta + cipher *backuppb.CipherInfo } // NewMetaReader creates MetaReader. -func NewMetaReader(backpMeta *backuppb.BackupMeta, storage storage.ExternalStorage) *MetaReader { +func NewMetaReader( + backpMeta *backuppb.BackupMeta, + storage storage.ExternalStorage, + cipher *backuppb.CipherInfo) *MetaReader { return &MetaReader{ storage: storage, backupMeta: backpMeta, + cipher: cipher, } } @@ -124,7 +178,7 @@ func (reader *MetaReader) readDDLs(ctx context.Context, output func([]byte)) err output(s) } } - return walkLeafMetaFile(ctx, reader.storage, reader.backupMeta.DdlIndexes, outputFn) + return walkLeafMetaFile(ctx, reader.storage, reader.backupMeta.DdlIndexes, reader.cipher, outputFn) } func (reader *MetaReader) readSchemas(ctx context.Context, output func(*backuppb.Schema)) error { @@ -138,7 +192,7 @@ func (reader *MetaReader) readSchemas(ctx context.Context, output func(*backuppb output(s) } } - return walkLeafMetaFile(ctx, reader.storage, reader.backupMeta.SchemaIndex, outputFn) + return walkLeafMetaFile(ctx, reader.storage, reader.backupMeta.SchemaIndex, reader.cipher, outputFn) } func (reader *MetaReader) readDataFiles(ctx context.Context, output func(*backuppb.File)) error { @@ -152,7 +206,7 @@ func (reader *MetaReader) readDataFiles(ctx context.Context, output func(*backup output(f) } } - return walkLeafMetaFile(ctx, reader.storage, reader.backupMeta.FileIndex, outputFn) + return walkLeafMetaFile(ctx, reader.storage, reader.backupMeta.FileIndex, reader.cipher, outputFn) } // ArchiveSize return the size of Archive data @@ -429,10 +483,14 @@ type MetaWriter struct { // records the total item of in one write meta job. flushedItemNum int + + cipher *backuppb.CipherInfo } // NewMetaWriter creates MetaWriter. -func NewMetaWriter(storage storage.ExternalStorage, metafileSizeLimit int, useV2Meta bool) *MetaWriter { +func NewMetaWriter(storage storage.ExternalStorage, + metafileSizeLimit int, + useV2Meta bool, cipher *backuppb.CipherInfo) *MetaWriter { return &MetaWriter{ start: time.Now(), storage: storage, @@ -444,6 +502,7 @@ func NewMetaWriter(storage storage.ExternalStorage, metafileSizeLimit int, useV2 metafileSizes: make(map[string]int), metafiles: NewSizedMetaFile(metafileSizeLimit), metafileSeqNum: make(map[string]int), + cipher: cipher, } } @@ -489,9 +548,9 @@ func (writer *MetaWriter) StartWriteMetasAsync(ctx context.Context, op AppendOp) writer.wg.Add(1) go func() { defer func() { - writer.wg.Done() - // close errCh after metaCh closed close(writer.errCh) + // close errCh before metaCh closed + writer.wg.Done() }() for { select { @@ -561,7 +620,13 @@ func (writer *MetaWriter) FlushBackupMeta(ctx context.Context) error { } log.Debug("backup meta", zap.Reflect("meta", writer.backupMeta)) log.Info("save backup meta", zap.Int("size", len(backupMetaData))) - return writer.storage.WriteFile(ctx, MetaFile, backupMetaData) + + encryptBuff, iv, err := Encrypt(backupMetaData, writer.cipher) + if err != nil { + return errors.Trace(err) + } + + return writer.storage.WriteFile(ctx, MetaFile, append(iv, encryptBuff...)) } // fillMetasV1 keep the compatibility for old version. @@ -620,14 +685,21 @@ func (writer *MetaWriter) flushMetasV2(ctx context.Context, op AppendOp) error { // Flush metafiles to external storage. writer.metafileSeqNum["metafiles"] += 1 fname := fmt.Sprintf("backupmeta.%s.%09d", name, writer.metafileSeqNum["metafiles"]) - if err = writer.storage.WriteFile(ctx, fname, content); err != nil { + + encyptedContent, iv, err := Encrypt(content, writer.cipher) + if err != nil { + return errors.Trace(err) + } + + if err = writer.storage.WriteFile(ctx, fname, encyptedContent); err != nil { return errors.Trace(err) } checksum := sha256.Sum256(content) file := &backuppb.File{ - Name: fname, - Sha256: checksum[:], - Size_: uint64(len(content)), + Name: fname, + Sha256: checksum[:], + Size_: uint64(len(content)), + CipherIv: iv, } index.MetaFiles = append(index.MetaFiles, file) diff --git a/br/pkg/metautil/metafile_test.go b/br/pkg/metautil/metafile_test.go index dfb38eb272e95..6fe79a2b8e610 100644 --- a/br/pkg/metautil/metafile_test.go +++ b/br/pkg/metautil/metafile_test.go @@ -5,11 +5,11 @@ package metautil import ( "context" "crypto/sha256" - "regexp" "testing" "github.com/golang/mock/gomock" backuppb "github.com/pingcap/kvproto/pkg/brpb" + "github.com/pingcap/kvproto/pkg/encryptionpb" mockstorage "github.com/pingcap/tidb/br/pkg/mock/storage" "github.com/stretchr/testify/require" ) @@ -24,17 +24,19 @@ func checksum(m *backuppb.MetaFile) []byte { } func TestWalkMetaFileEmpty(t *testing.T) { - t.Parallel() - files := []*backuppb.MetaFile{} collect := func(m *backuppb.MetaFile) { files = append(files, m) } - err := walkLeafMetaFile(context.Background(), nil, nil, collect) + cipher := backuppb.CipherInfo{ + CipherType: encryptionpb.EncryptionMethod_PLAINTEXT, + } + + err := walkLeafMetaFile(context.Background(), nil, nil, &cipher, collect) require.NoError(t, err) require.Len(t, files, 0) empty := &backuppb.MetaFile{} - err = walkLeafMetaFile(context.Background(), nil, empty, collect) + err = walkLeafMetaFile(context.Background(), nil, empty, &cipher, collect) require.NoError(t, err) require.Len(t, files, 1) @@ -42,14 +44,15 @@ func TestWalkMetaFileEmpty(t *testing.T) { } func TestWalkMetaFileLeaf(t *testing.T) { - t.Parallel() - leaf := &backuppb.MetaFile{Schemas: []*backuppb.Schema{ {Db: []byte("db"), Table: []byte("table")}, }} files := []*backuppb.MetaFile{} + cipher := backuppb.CipherInfo{ + CipherType: encryptionpb.EncryptionMethod_PLAINTEXT, + } collect := func(m *backuppb.MetaFile) { files = append(files, m) } - err := walkLeafMetaFile(context.Background(), nil, leaf, collect) + err := walkLeafMetaFile(context.Background(), nil, leaf, &cipher, collect) require.NoError(t, err) require.Len(t, files, 1) @@ -57,8 +60,6 @@ func TestWalkMetaFileLeaf(t *testing.T) { } func TestWalkMetaFileInvalid(t *testing.T) { - t.Parallel() - controller := gomock.NewController(t) defer controller.Finish() mockStorage := mockstorage.NewMockExternalStorage(controller) @@ -73,15 +74,17 @@ func TestWalkMetaFileInvalid(t *testing.T) { {Name: "leaf", Sha256: []byte{}}, }} + cipher := backuppb.CipherInfo{ + CipherType: encryptionpb.EncryptionMethod_PLAINTEXT, + } collect := func(m *backuppb.MetaFile) { panic("unreachable") } - err := walkLeafMetaFile(ctx, mockStorage, root, collect) + err := walkLeafMetaFile(ctx, mockStorage, root, &cipher, collect) - require.Regexp(t, regexp.MustCompile(".*ErrInvalidMetaFile.*"), err) + require.Error(t, err) + require.Contains(t, err.Error(), "ErrInvalidMetaFile") } func TestWalkMetaFile(t *testing.T) { - t.Parallel() - controller := gomock.NewController(t) defer controller.Finish() mockStorage := mockstorage.NewMockExternalStorage(controller) @@ -130,8 +133,11 @@ func TestWalkMetaFile(t *testing.T) { }} files := []*backuppb.MetaFile{} + cipher := backuppb.CipherInfo{ + CipherType: encryptionpb.EncryptionMethod_PLAINTEXT, + } collect := func(m *backuppb.MetaFile) { files = append(files, m) } - err := walkLeafMetaFile(ctx, mockStorage, root, collect) + err := walkLeafMetaFile(ctx, mockStorage, root, &cipher, collect) require.NoError(t, err) require.Len(t, files, len(expect)) @@ -139,3 +145,73 @@ func TestWalkMetaFile(t *testing.T) { require.Equal(t, expect[i], files[i]) } } + +type encryptTest struct { + method encryptionpb.EncryptionMethod + rightKey string + wrongKey string +} + +func TestEncryptAndDecrypt(t *testing.T) { + originalData := []byte("pingcap") + testCases := []encryptTest{ + { + method: encryptionpb.EncryptionMethod_UNKNOWN, + }, + { + method: encryptionpb.EncryptionMethod_PLAINTEXT, + }, + { + method: encryptionpb.EncryptionMethod_AES128_CTR, + rightKey: "0123456789012345", + wrongKey: "012345678901234", + }, + { + method: encryptionpb.EncryptionMethod_AES192_CTR, + rightKey: "012345678901234567890123", + wrongKey: "0123456789012345678901234", + }, + { + method: encryptionpb.EncryptionMethod_AES256_CTR, + rightKey: "01234567890123456789012345678901", + wrongKey: "01234567890123456789012345678902", + }, + } + + for _, v := range testCases { + cipher := backuppb.CipherInfo{ + CipherType: v.method, + CipherKey: []byte(v.rightKey), + } + encryptData, iv, err := Encrypt(originalData, &cipher) + if v.method == encryptionpb.EncryptionMethod_UNKNOWN { + require.Error(t, err) + } else if v.method == encryptionpb.EncryptionMethod_PLAINTEXT { + require.Nil(t, err) + require.Equal(t, originalData, encryptData) + + decryptData, err := Decrypt(encryptData, &cipher, iv) + require.Nil(t, err) + require.Equal(t, decryptData, originalData) + } else { + require.Nil(t, err) + require.NotEqual(t, originalData, encryptData) + + decryptData, err := Decrypt(encryptData, &cipher, iv) + require.Nil(t, err) + require.Equal(t, decryptData, originalData) + + wrongCipher := backuppb.CipherInfo{ + CipherType: v.method, + CipherKey: []byte(v.wrongKey), + } + decryptData, err = Decrypt(encryptData, &wrongCipher, iv) + if len(v.rightKey) != len(v.wrongKey) { + require.Error(t, err) + } else { + require.Nil(t, err) + require.NotEqual(t, decryptData, originalData) + } + } + } +} diff --git a/br/pkg/mock/backend.go b/br/pkg/mock/backend.go index a4f4931953e62..ee8016f3d2921 100644 --- a/br/pkg/mock/backend.go +++ b/br/pkg/mock/backend.go @@ -15,34 +15,35 @@ import ( uuid "github.com/google/uuid" backend "github.com/pingcap/tidb/br/pkg/lightning/backend" kv "github.com/pingcap/tidb/br/pkg/lightning/backend/kv" + config "github.com/pingcap/tidb/br/pkg/lightning/config" model "github.com/pingcap/tidb/parser/model" table "github.com/pingcap/tidb/table" ) -// MockBackend is a mock of AbstractBackend interface +// MockBackend is a mock of AbstractBackend interface. type MockBackend struct { ctrl *gomock.Controller recorder *MockBackendMockRecorder } -// MockBackendMockRecorder is the mock recorder for MockBackend +// MockBackendMockRecorder is the mock recorder for MockBackend. type MockBackendMockRecorder struct { mock *MockBackend } -// NewMockBackend creates a new mock instance +// NewMockBackend creates a new mock instance. func NewMockBackend(ctrl *gomock.Controller) *MockBackend { mock := &MockBackend{ctrl: ctrl} mock.recorder = &MockBackendMockRecorder{mock} return mock } -// EXPECT returns an object that allows the caller to indicate expected use +// EXPECT returns an object that allows the caller to indicate expected use. func (m *MockBackend) EXPECT() *MockBackendMockRecorder { return m.recorder } -// CheckRequirements mocks base method +// CheckRequirements mocks base method. func (m *MockBackend) CheckRequirements(arg0 context.Context, arg1 *backend.CheckCtx) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CheckRequirements", arg0, arg1) @@ -50,13 +51,13 @@ func (m *MockBackend) CheckRequirements(arg0 context.Context, arg1 *backend.Chec return ret0 } -// CheckRequirements indicates an expected call of CheckRequirements +// CheckRequirements indicates an expected call of CheckRequirements. func (mr *MockBackendMockRecorder) CheckRequirements(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckRequirements", reflect.TypeOf((*MockBackend)(nil).CheckRequirements), arg0, arg1) } -// CleanupEngine mocks base method +// CleanupEngine mocks base method. func (m *MockBackend) CleanupEngine(arg0 context.Context, arg1 uuid.UUID) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CleanupEngine", arg0, arg1) @@ -64,25 +65,25 @@ func (m *MockBackend) CleanupEngine(arg0 context.Context, arg1 uuid.UUID) error return ret0 } -// CleanupEngine indicates an expected call of CleanupEngine +// CleanupEngine indicates an expected call of CleanupEngine. func (mr *MockBackendMockRecorder) CleanupEngine(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CleanupEngine", reflect.TypeOf((*MockBackend)(nil).CleanupEngine), arg0, arg1) } -// Close mocks base method +// Close mocks base method. func (m *MockBackend) Close() { m.ctrl.T.Helper() m.ctrl.Call(m, "Close") } -// Close indicates an expected call of Close +// Close indicates an expected call of Close. func (mr *MockBackendMockRecorder) Close() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockBackend)(nil).Close)) } -// CloseEngine mocks base method +// CloseEngine mocks base method. func (m *MockBackend) CloseEngine(arg0 context.Context, arg1 *backend.EngineConfig, arg2 uuid.UUID) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CloseEngine", arg0, arg1, arg2) @@ -90,43 +91,43 @@ func (m *MockBackend) CloseEngine(arg0 context.Context, arg1 *backend.EngineConf return ret0 } -// CloseEngine indicates an expected call of CloseEngine +// CloseEngine indicates an expected call of CloseEngine. func (mr *MockBackendMockRecorder) CloseEngine(arg0, arg1, arg2 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CloseEngine", reflect.TypeOf((*MockBackend)(nil).CloseEngine), arg0, arg1, arg2) } -// CollectLocalDuplicateRows mocks base method -func (m *MockBackend) CollectLocalDuplicateRows(arg0 context.Context, arg1 table.Table) (bool, error) { +// CollectLocalDuplicateRows mocks base method. +func (m *MockBackend) CollectLocalDuplicateRows(arg0 context.Context, arg1 table.Table, arg2 string, arg3 *kv.SessionOptions) (bool, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "CollectLocalDuplicateRows", arg0, arg1) + ret := m.ctrl.Call(m, "CollectLocalDuplicateRows", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(bool) ret1, _ := ret[1].(error) return ret0, ret1 } -// CollectLocalDuplicateRows indicates an expected call of CollectLocalDuplicateRows -func (mr *MockBackendMockRecorder) CollectLocalDuplicateRows(arg0, arg1 interface{}) *gomock.Call { +// CollectLocalDuplicateRows indicates an expected call of CollectLocalDuplicateRows. +func (mr *MockBackendMockRecorder) CollectLocalDuplicateRows(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CollectLocalDuplicateRows", reflect.TypeOf((*MockBackend)(nil).CollectLocalDuplicateRows), arg0, arg1) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CollectLocalDuplicateRows", reflect.TypeOf((*MockBackend)(nil).CollectLocalDuplicateRows), arg0, arg1, arg2, arg3) } -// CollectRemoteDuplicateRows mocks base method -func (m *MockBackend) CollectRemoteDuplicateRows(arg0 context.Context, arg1 table.Table) (bool, error) { +// CollectRemoteDuplicateRows mocks base method. +func (m *MockBackend) CollectRemoteDuplicateRows(arg0 context.Context, arg1 table.Table, arg2 string, arg3 *kv.SessionOptions) (bool, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "CollectRemoteDuplicateRows", arg0, arg1) + ret := m.ctrl.Call(m, "CollectRemoteDuplicateRows", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(bool) ret1, _ := ret[1].(error) return ret0, ret1 } -// CollectRemoteDuplicateRows indicates an expected call of CollectRemoteDuplicateRows -func (mr *MockBackendMockRecorder) CollectRemoteDuplicateRows(arg0, arg1 interface{}) *gomock.Call { +// CollectRemoteDuplicateRows indicates an expected call of CollectRemoteDuplicateRows. +func (mr *MockBackendMockRecorder) CollectRemoteDuplicateRows(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CollectRemoteDuplicateRows", reflect.TypeOf((*MockBackend)(nil).CollectRemoteDuplicateRows), arg0, arg1) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CollectRemoteDuplicateRows", reflect.TypeOf((*MockBackend)(nil).CollectRemoteDuplicateRows), arg0, arg1, arg2, arg3) } -// EngineFileSizes mocks base method +// EngineFileSizes mocks base method. func (m *MockBackend) EngineFileSizes() []backend.EngineFileSize { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "EngineFileSizes") @@ -134,13 +135,13 @@ func (m *MockBackend) EngineFileSizes() []backend.EngineFileSize { return ret0 } -// EngineFileSizes indicates an expected call of EngineFileSizes +// EngineFileSizes indicates an expected call of EngineFileSizes. func (mr *MockBackendMockRecorder) EngineFileSizes() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EngineFileSizes", reflect.TypeOf((*MockBackend)(nil).EngineFileSizes)) } -// FetchRemoteTableModels mocks base method +// FetchRemoteTableModels mocks base method. func (m *MockBackend) FetchRemoteTableModels(arg0 context.Context, arg1 string) ([]*model.TableInfo, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FetchRemoteTableModels", arg0, arg1) @@ -149,13 +150,13 @@ func (m *MockBackend) FetchRemoteTableModels(arg0 context.Context, arg1 string) return ret0, ret1 } -// FetchRemoteTableModels indicates an expected call of FetchRemoteTableModels +// FetchRemoteTableModels indicates an expected call of FetchRemoteTableModels. func (mr *MockBackendMockRecorder) FetchRemoteTableModels(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchRemoteTableModels", reflect.TypeOf((*MockBackend)(nil).FetchRemoteTableModels), arg0, arg1) } -// FlushAllEngines mocks base method +// FlushAllEngines mocks base method. func (m *MockBackend) FlushAllEngines(arg0 context.Context) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FlushAllEngines", arg0) @@ -163,13 +164,13 @@ func (m *MockBackend) FlushAllEngines(arg0 context.Context) error { return ret0 } -// FlushAllEngines indicates an expected call of FlushAllEngines +// FlushAllEngines indicates an expected call of FlushAllEngines. func (mr *MockBackendMockRecorder) FlushAllEngines(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FlushAllEngines", reflect.TypeOf((*MockBackend)(nil).FlushAllEngines), arg0) } -// FlushEngine mocks base method +// FlushEngine mocks base method. func (m *MockBackend) FlushEngine(arg0 context.Context, arg1 uuid.UUID) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FlushEngine", arg0, arg1) @@ -177,13 +178,13 @@ func (m *MockBackend) FlushEngine(arg0 context.Context, arg1 uuid.UUID) error { return ret0 } -// FlushEngine indicates an expected call of FlushEngine +// FlushEngine indicates an expected call of FlushEngine. func (mr *MockBackendMockRecorder) FlushEngine(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FlushEngine", reflect.TypeOf((*MockBackend)(nil).FlushEngine), arg0, arg1) } -// ImportEngine mocks base method +// ImportEngine mocks base method. func (m *MockBackend) ImportEngine(arg0 context.Context, arg1 uuid.UUID, arg2 int64) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ImportEngine", arg0, arg1, arg2) @@ -191,13 +192,13 @@ func (m *MockBackend) ImportEngine(arg0 context.Context, arg1 uuid.UUID, arg2 in return ret0 } -// ImportEngine indicates an expected call of ImportEngine +// ImportEngine indicates an expected call of ImportEngine. func (mr *MockBackendMockRecorder) ImportEngine(arg0, arg1, arg2 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ImportEngine", reflect.TypeOf((*MockBackend)(nil).ImportEngine), arg0, arg1, arg2) } -// LocalWriter mocks base method +// LocalWriter mocks base method. func (m *MockBackend) LocalWriter(arg0 context.Context, arg1 *backend.LocalWriterConfig, arg2 uuid.UUID) (backend.EngineWriter, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "LocalWriter", arg0, arg1, arg2) @@ -206,13 +207,13 @@ func (m *MockBackend) LocalWriter(arg0 context.Context, arg1 *backend.LocalWrite return ret0, ret1 } -// LocalWriter indicates an expected call of LocalWriter +// LocalWriter indicates an expected call of LocalWriter. func (mr *MockBackendMockRecorder) LocalWriter(arg0, arg1, arg2 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LocalWriter", reflect.TypeOf((*MockBackend)(nil).LocalWriter), arg0, arg1, arg2) } -// MakeEmptyRows mocks base method +// MakeEmptyRows mocks base method. func (m *MockBackend) MakeEmptyRows() kv.Rows { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MakeEmptyRows") @@ -220,13 +221,13 @@ func (m *MockBackend) MakeEmptyRows() kv.Rows { return ret0 } -// MakeEmptyRows indicates an expected call of MakeEmptyRows +// MakeEmptyRows indicates an expected call of MakeEmptyRows. func (mr *MockBackendMockRecorder) MakeEmptyRows() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MakeEmptyRows", reflect.TypeOf((*MockBackend)(nil).MakeEmptyRows)) } -// NewEncoder mocks base method +// NewEncoder mocks base method. func (m *MockBackend) NewEncoder(arg0 table.Table, arg1 *kv.SessionOptions) (kv.Encoder, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "NewEncoder", arg0, arg1) @@ -235,13 +236,13 @@ func (m *MockBackend) NewEncoder(arg0 table.Table, arg1 *kv.SessionOptions) (kv. return ret0, ret1 } -// NewEncoder indicates an expected call of NewEncoder +// NewEncoder indicates an expected call of NewEncoder. func (mr *MockBackendMockRecorder) NewEncoder(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewEncoder", reflect.TypeOf((*MockBackend)(nil).NewEncoder), arg0, arg1) } -// OpenEngine mocks base method +// OpenEngine mocks base method. func (m *MockBackend) OpenEngine(arg0 context.Context, arg1 *backend.EngineConfig, arg2 uuid.UUID) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "OpenEngine", arg0, arg1, arg2) @@ -249,13 +250,13 @@ func (m *MockBackend) OpenEngine(arg0 context.Context, arg1 *backend.EngineConfi return ret0 } -// OpenEngine indicates an expected call of OpenEngine +// OpenEngine indicates an expected call of OpenEngine. func (mr *MockBackendMockRecorder) OpenEngine(arg0, arg1, arg2 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OpenEngine", reflect.TypeOf((*MockBackend)(nil).OpenEngine), arg0, arg1, arg2) } -// ResetEngine mocks base method +// ResetEngine mocks base method. func (m *MockBackend) ResetEngine(arg0 context.Context, arg1 uuid.UUID) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ResetEngine", arg0, arg1) @@ -263,13 +264,27 @@ func (m *MockBackend) ResetEngine(arg0 context.Context, arg1 uuid.UUID) error { return ret0 } -// ResetEngine indicates an expected call of ResetEngine +// ResetEngine indicates an expected call of ResetEngine. func (mr *MockBackendMockRecorder) ResetEngine(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ResetEngine", reflect.TypeOf((*MockBackend)(nil).ResetEngine), arg0, arg1) } -// RetryImportDelay mocks base method +// ResolveDuplicateRows mocks base method. +func (m *MockBackend) ResolveDuplicateRows(arg0 context.Context, arg1 table.Table, arg2 string, arg3 config.DuplicateResolutionAlgorithm) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ResolveDuplicateRows", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(error) + return ret0 +} + +// ResolveDuplicateRows indicates an expected call of ResolveDuplicateRows. +func (mr *MockBackendMockRecorder) ResolveDuplicateRows(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ResolveDuplicateRows", reflect.TypeOf((*MockBackend)(nil).ResolveDuplicateRows), arg0, arg1, arg2, arg3) +} + +// RetryImportDelay mocks base method. func (m *MockBackend) RetryImportDelay() time.Duration { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "RetryImportDelay") @@ -277,13 +292,13 @@ func (m *MockBackend) RetryImportDelay() time.Duration { return ret0 } -// RetryImportDelay indicates an expected call of RetryImportDelay +// RetryImportDelay indicates an expected call of RetryImportDelay. func (mr *MockBackendMockRecorder) RetryImportDelay() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RetryImportDelay", reflect.TypeOf((*MockBackend)(nil).RetryImportDelay)) } -// ShouldPostProcess mocks base method +// ShouldPostProcess mocks base method. func (m *MockBackend) ShouldPostProcess() bool { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ShouldPostProcess") @@ -291,36 +306,36 @@ func (m *MockBackend) ShouldPostProcess() bool { return ret0 } -// ShouldPostProcess indicates an expected call of ShouldPostProcess +// ShouldPostProcess indicates an expected call of ShouldPostProcess. func (mr *MockBackendMockRecorder) ShouldPostProcess() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ShouldPostProcess", reflect.TypeOf((*MockBackend)(nil).ShouldPostProcess)) } -// MockEngineWriter is a mock of EngineWriter interface +// MockEngineWriter is a mock of EngineWriter interface. type MockEngineWriter struct { ctrl *gomock.Controller recorder *MockEngineWriterMockRecorder } -// MockEngineWriterMockRecorder is the mock recorder for MockEngineWriter +// MockEngineWriterMockRecorder is the mock recorder for MockEngineWriter. type MockEngineWriterMockRecorder struct { mock *MockEngineWriter } -// NewMockEngineWriter creates a new mock instance +// NewMockEngineWriter creates a new mock instance. func NewMockEngineWriter(ctrl *gomock.Controller) *MockEngineWriter { mock := &MockEngineWriter{ctrl: ctrl} mock.recorder = &MockEngineWriterMockRecorder{mock} return mock } -// EXPECT returns an object that allows the caller to indicate expected use +// EXPECT returns an object that allows the caller to indicate expected use. func (m *MockEngineWriter) EXPECT() *MockEngineWriterMockRecorder { return m.recorder } -// AppendRows mocks base method +// AppendRows mocks base method. func (m *MockEngineWriter) AppendRows(arg0 context.Context, arg1 string, arg2 []string, arg3 kv.Rows) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "AppendRows", arg0, arg1, arg2, arg3) @@ -328,13 +343,13 @@ func (m *MockEngineWriter) AppendRows(arg0 context.Context, arg1 string, arg2 [] return ret0 } -// AppendRows indicates an expected call of AppendRows +// AppendRows indicates an expected call of AppendRows. func (mr *MockEngineWriterMockRecorder) AppendRows(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AppendRows", reflect.TypeOf((*MockEngineWriter)(nil).AppendRows), arg0, arg1, arg2, arg3) } -// Close mocks base method +// Close mocks base method. func (m *MockEngineWriter) Close(arg0 context.Context) (backend.ChunkFlushStatus, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Close", arg0) @@ -343,13 +358,13 @@ func (m *MockEngineWriter) Close(arg0 context.Context) (backend.ChunkFlushStatus return ret0, ret1 } -// Close indicates an expected call of Close +// Close indicates an expected call of Close. func (mr *MockEngineWriterMockRecorder) Close(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockEngineWriter)(nil).Close), arg0) } -// IsSynced mocks base method +// IsSynced mocks base method. func (m *MockEngineWriter) IsSynced() bool { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "IsSynced") @@ -357,7 +372,7 @@ func (m *MockEngineWriter) IsSynced() bool { return ret0 } -// IsSynced indicates an expected call of IsSynced +// IsSynced indicates an expected call of IsSynced. func (mr *MockEngineWriterMockRecorder) IsSynced() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsSynced", reflect.TypeOf((*MockEngineWriter)(nil).IsSynced)) diff --git a/br/pkg/mock/mock_cluster.go b/br/pkg/mock/mock_cluster.go index 24e78877939d7..d1ece26505d05 100644 --- a/br/pkg/mock/mock_cluster.go +++ b/br/pkg/mock/mock_cluster.go @@ -6,6 +6,7 @@ import ( "database/sql" "fmt" "io" + "net" "net/http" "net/http/pprof" "net/url" @@ -39,62 +40,87 @@ type Cluster struct { kv.Storage *server.TiDBDriver *domain.Domain - DSN string - PDClient pd.Client + DSN string + PDClient pd.Client + HttpServer *http.Server } // NewCluster create a new mock cluster. func NewCluster() (*Cluster, error) { + cluster := &Cluster{} + pprofOnce.Do(func() { go func() { // Make sure pprof is registered. _ = pprof.Handler addr := "0.0.0.0:12235" log.Info("start pprof", zap.String("addr", addr)) - if e := http.ListenAndServe(addr, nil); e != nil { + cluster.HttpServer = &http.Server{Addr: addr} + if e := cluster.HttpServer.ListenAndServe(); e != nil { log.Warn("fail to start pprof", zap.String("addr", addr), zap.Error(e)) } }() }) - var mockCluster testutils.Cluster storage, err := mockstore.NewMockStore( mockstore.WithClusterInspector(func(c testutils.Cluster) { mockstore.BootstrapWithSingleStore(c) - mockCluster = c + cluster.Cluster = c }), ) if err != nil { return nil, errors.Trace(err) } + cluster.Storage = storage + session.SetSchemaLease(0) session.DisableStats4Test() dom, err := session.BootstrapSession(storage) if err != nil { return nil, errors.Trace(err) } - return &Cluster{ - Storage: storage, - Cluster: mockCluster, - Domain: dom, - PDClient: storage.(tikv.Storage).GetRegionCache().PDClient(), - }, nil + cluster.Domain = dom + + cluster.PDClient = storage.(tikv.Storage).GetRegionCache().PDClient() + return cluster, nil } // Start runs a mock cluster. func (mock *Cluster) Start() error { - statusURL, err := url.Parse(tempurl.Alloc()) - if err != nil { - return errors.Trace(err) + var ( + err error + statusURL *url.URL + addrURL *url.URL + ) + for i := 0; i < 10; i++ { + // retry 10 times to get available port + statusURL, err = url.Parse(tempurl.Alloc()) + if err != nil { + return errors.Trace(err) + } + listen, err := net.Listen("tcp", fmt.Sprintf("127.0.0.1:%s", statusURL.Port())) + if err == nil { + // release port listening + listen.Close() + break + } } statusPort, err := strconv.ParseInt(statusURL.Port(), 10, 32) if err != nil { return errors.Trace(err) } - addrURL, err := url.Parse(tempurl.Alloc()) - if err != nil { - return errors.Trace(err) + for i := 0; i < 10; i++ { + addrURL, err = url.Parse(tempurl.Alloc()) + if err != nil { + return errors.Trace(err) + } + listen, err := net.Listen("tcp", fmt.Sprintf("127.0.0.1:%s", addrURL.Port())) + if err == nil { + // release port listening + listen.Close() + break + } } addrPort, err := strconv.ParseInt(addrURL.Port(), 10, 32) if err != nil { @@ -108,6 +134,7 @@ func (mock *Cluster) Start() error { cfg.Store = "tikv" cfg.Status.StatusPort = uint(statusPort) cfg.Status.ReportStatus = true + cfg.Socket = fmt.Sprintf("/tmp/tidb-mock-%d.sock", time.Now().UnixNano()) svr, err := server.NewServer(cfg, mock.TiDBDriver) if err != nil { @@ -129,11 +156,14 @@ func (mock *Cluster) Stop() { mock.Domain.Close() } if mock.Storage != nil { - mock.Storage.Close() + _ = mock.Storage.Close() } if mock.Server != nil { mock.Server.Close() } + if mock.HttpServer != nil { + _ = mock.HttpServer.Close() + } } type configOverrider func(*mysql.Config) diff --git a/br/pkg/mock/mock_cluster_test.go b/br/pkg/mock/mock_cluster_test.go index bee7220613f2d..01dde0c158901 100644 --- a/br/pkg/mock/mock_cluster_test.go +++ b/br/pkg/mock/mock_cluster_test.go @@ -5,32 +5,19 @@ package mock_test import ( "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/br/pkg/mock" - "github.com/pingcap/tidb/util/testleak" + "github.com/stretchr/testify/require" + "go.uber.org/goleak" ) -func Test(t *testing.T) { - TestingT(t) -} - -var _ = Suite(&testClusterSuite{}) - -type testClusterSuite struct { - mock *mock.Cluster -} - -func (s *testClusterSuite) SetUpSuite(c *C) { - var err error - s.mock, err = mock.NewCluster() - c.Assert(err, IsNil) -} - -func (s *testClusterSuite) TearDownSuite(c *C) { - testleak.AfterTest(c)() -} - -func (s *testClusterSuite) TestSmoke(c *C) { - c.Assert(s.mock.Start(), IsNil) - s.mock.Stop() +func TestSmoke(t *testing.T) { + defer goleak.VerifyNone( + t, + goleak.IgnoreTopFunction("github.com/klauspost/compress/zstd.(*blockDec).startDecoder"), + goleak.IgnoreTopFunction("go.etcd.io/etcd/pkg/logutil.(*MergeLogger).outputLoop"), + goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start")) + m, err := mock.NewCluster() + require.NoError(t, err) + require.NoError(t, m.Start()) + m.Stop() } diff --git a/br/pkg/pdutil/pd.go b/br/pkg/pdutil/pd.go index 2f898d9c062ef..3f4c45d1deefa 100644 --- a/br/pkg/pdutil/pd.go +++ b/br/pkg/pdutil/pd.go @@ -118,14 +118,13 @@ var ( } // defaultPDCfg find by https://github.com/tikv/pd/blob/master/conf/config.toml. + // only use for debug command. defaultPDCfg = map[string]interface{}{ "max-merge-region-keys": 200000, "max-merge-region-size": 20, "leader-schedule-limit": 4, "region-schedule-limit": 2048, - "max-snapshot-count": 3, "enable-location-replacement": "true", - "max-pending-peer-count": 16, } ) diff --git a/br/pkg/pdutil/pd_serial_test.go b/br/pkg/pdutil/pd_serial_test.go index 2dde535cd54b9..c76e49cd70c61 100644 --- a/br/pkg/pdutil/pd_serial_test.go +++ b/br/pkg/pdutil/pd_serial_test.go @@ -35,6 +35,8 @@ func TestScheduler(t *testing.T) { } schedulerPauseCh := make(chan struct{}) pdController := &PdController{addrs: []string{"", ""}, schedulerPauseCh: schedulerPauseCh} + // As pdController.Client is nil, (*pdController).Close() can not be called directly. + defer close(schedulerPauseCh) _, err := pdController.pauseSchedulersAndConfigWith(ctx, []string{scheduler}, nil, mock) require.EqualError(t, err, "failed") @@ -53,7 +55,7 @@ func TestScheduler(t *testing.T) { } _, err = pdController.pauseSchedulersAndConfigWith(ctx, []string{}, cfg, mock) require.Error(t, err) - require.Regexp(t, "^failed to update PD.*", err.Error()) + require.Regexp(t, "^failed to update PD", err.Error()) go func() { <-schedulerPauseCh }() @@ -70,9 +72,7 @@ func TestScheduler(t *testing.T) { _, err = pdController.pauseSchedulersAndConfigWith(ctx, []string{scheduler}, cfg, mock) require.NoError(t, err) - go func() { - <-schedulerPauseCh - }() + // pauseSchedulersAndConfigWith will wait on chan schedulerPauseCh err = pdController.resumeSchedulerWith(ctx, []string{scheduler}, mock) require.NoError(t, err) diff --git a/br/pkg/redact/redact_test.go b/br/pkg/redact/redact_test.go index 9ee743292519a..5647a681974f3 100644 --- a/br/pkg/redact/redact_test.go +++ b/br/pkg/redact/redact_test.go @@ -3,29 +3,24 @@ package redact_test import ( + "encoding/hex" "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/br/pkg/redact" + "github.com/stretchr/testify/require" + "go.uber.org/goleak" ) -type testRedactSuite struct{} +func TestRedact(t *testing.T) { + defer goleak.VerifyNone(t) -func (s *testRedactSuite) SetUpSuite(c *C) {} -func (s *testRedactSuite) TearDownSuite(c *C) {} - -var _ = Suite(&testRedactSuite{}) - -func TestT(t *testing.T) {} - -func (s *testRedactSuite) TestRedact(c *C) { redacted, secret := "?", "secret" redact.InitRedact(false) - c.Assert(redact.String(secret), Equals, secret) - c.Assert(redact.Key([]byte(secret)), Equals, secret) + require.Equal(t, redact.String(secret), secret) + require.Equal(t, redact.Key([]byte(secret)), hex.EncodeToString([]byte(secret))) redact.InitRedact(true) - c.Assert(redact.String(secret), Equals, redacted) - c.Assert(redact.Key([]byte(secret)), Equals, redacted) + require.Equal(t, redact.String(secret), redacted) + require.Equal(t, redact.Key([]byte(secret)), redacted) } diff --git a/br/pkg/restore/client.go b/br/pkg/restore/client.go index 6530523e61882..8ec2006ca59b2 100644 --- a/br/pkg/restore/client.go +++ b/br/pkg/restore/client.go @@ -501,23 +501,11 @@ func (rc *Client) GoCreateTables( } outCh := make(chan CreatedTable, len(tables)) rater := logutil.TraceRateOver(logutil.MetricTableCreatedCounter) - - cts, err := rc.createTables(ctx, rc.db, dom, tables, newTS) + err := rc.createTablesInWorkerPool(ctx, dom, tables, dbPool, newTS, outCh) + //cts, err := rc.createTables(ctx, rc.db, dom, tables, newTS) if err == nil { defer close(outCh) - for _, ct := range cts { - log.Debug("table created and send to next", - zap.Int("output chan size", len(outCh)), - zap.Stringer("table", ct.OldTable.Info.Name), - zap.Stringer("database", ct.OldTable.DB.Name)) - outCh <- ct - rater.Inc() - rater.L().Info("table created", - zap.Stringer("table", ct.OldTable.Info.Name), - zap.Stringer("database", ct.OldTable.DB.Name)) - } - // fall back to old create table (sequential create table) } else if strings.Contains(err.Error(), "[ddl:8204]invalid ddl job") { log.Info("fall back to the old DDL way to create table.") @@ -591,6 +579,43 @@ func (rc *Client) createTablesWithDBPool(ctx context.Context, return eg.Wait() } +func (rc *Client) createTablesInWorkerPool(ctx context.Context, dom *domain.Domain, tables []*metautil.Table, dbPool []*DB, newTS uint64, outCh chan<- CreatedTable) error { + eg, ectx := errgroup.WithContext(ctx) + rater := logutil.TraceRateOver(logutil.MetricTableCreatedCounter) + workers := utils.NewWorkerPool(uint(len(dbPool)), "Create Tables Worker") + numOfTables := len(tables) + lastSent := 0 + for i := int(rc.batchDllSize); i <= numOfTables; i = i + int(rc.batchDllSize) { + log.Info("create tables", zap.Int("table start", lastSent), zap.Int("table end", i)) + if i > numOfTables { + i = numOfTables + } + tableSlice := tables[lastSent:i] + workers.ApplyWithIDInErrorGroup(eg, func(id uint64) error { + db := dbPool[id%uint64(len(dbPool))] + cts, err := rc.createTables(ectx, db, dom, tableSlice, newTS) // ddl job for [lastSent:i) + if err != nil { + log.Error("create tables fail") + return err + } + for _, ct := range cts { + log.Debug("table created and send to next", + zap.Int("output chan size", len(outCh)), + zap.Stringer("table", ct.OldTable.Info.Name), + zap.Stringer("database", ct.OldTable.DB.Name)) + outCh <- ct + rater.Inc() + rater.L().Info("table created", + zap.Stringer("table", ct.OldTable.Info.Name), + zap.Stringer("database", ct.OldTable.DB.Name)) + } + return err + }) + lastSent = i + } + return eg.Wait() +} + // ExecDDLs executes the queries of the ddl jobs. func (rc *Client) ExecDDLs(ctx context.Context, ddlJobs []*model.Job) error { // Sort the ddl jobs by schema version in ascending order. diff --git a/br/pkg/restore/db.go b/br/pkg/restore/db.go index 0134c56280ae9..bae7cace49d53 100644 --- a/br/pkg/restore/db.go +++ b/br/pkg/restore/db.go @@ -99,7 +99,7 @@ func (db *DB) CreateDatabase(ctx context.Context, schema *model.DBInfo) error { // CreateTable executes a CREATE TABLE SQL. func (db *DB) CreateTables(ctx context.Context, tables []*metautil.Table, batchDdlSize uint) error { if bse, ok := db.se.(glue.BulkCreateTableSession); ok { - log.Info("session supports bulk create table.", zap.Uint("batchDdlSize", batchDdlSize)) + log.Info("session supports bulk create table.", zap.Uint("batchDdlSize", batchDdlSize), zap.Int("table size", len(tables))) m := map[string][]*model.TableInfo{} for _, table := range tables { m[table.DB.Name.L] = append(m[table.DB.Name.L], table.Info) diff --git a/br/pkg/restore/db_test.go b/br/pkg/restore/db_test.go index a3659b2b4caba..b9a1c8948f8dd 100644 --- a/br/pkg/restore/db_test.go +++ b/br/pkg/restore/db_test.go @@ -12,6 +12,7 @@ import ( "github.com/golang/protobuf/proto" . "github.com/pingcap/check" backuppb "github.com/pingcap/kvproto/pkg/brpb" + "github.com/pingcap/kvproto/pkg/encryptionpb" "github.com/pingcap/tidb/br/pkg/backup" "github.com/pingcap/tidb/br/pkg/gluetidb" "github.com/pingcap/tidb/br/pkg/metautil" @@ -97,13 +98,33 @@ func (s *testRestoreSchemaSuite) TestRestoreAutoIncID(c *C) { table.DB.Collate = "utf8mb4_bin" err = db.CreateDatabase(context.Background(), table.DB) c.Assert(err, IsNil, Commentf("Error create empty charset db: %s %s", err, s.mock.DSN)) - err = db.CreateTable(context.Background(), &table) + uniqueMap := make(map[restore.UniqueTableName]bool) + err = db.CreateTable(context.Background(), &table, uniqueMap) c.Assert(err, IsNil, Commentf("Error create table: %s %s", err, s.mock.DSN)) + tk.MustExec("use test") - // Check if AutoIncID is altered successfully autoIncID, err = strconv.ParseUint(tk.MustQuery("admin show `\"t\"` next_row_id").Rows()[0][3].(string), 10, 64) c.Assert(err, IsNil, Commentf("Error query auto inc id: %s", err)) + // Check if AutoIncID is altered successfully. c.Assert(autoIncID, Equals, uint64(globalAutoID+100)) + + // try again, failed due to table exists. + table.Info.AutoIncID = globalAutoID + 200 + err = db.CreateTable(context.Background(), &table, uniqueMap) + // Check if AutoIncID is not altered. + autoIncID, err = strconv.ParseUint(tk.MustQuery("admin show `\"t\"` next_row_id").Rows()[0][3].(string), 10, 64) + c.Assert(err, IsNil, Commentf("Error query auto inc id: %s", err)) + c.Assert(autoIncID, Equals, uint64(globalAutoID+100)) + + // try again, success because we use alter sql in unique map. + table.Info.AutoIncID = globalAutoID + 300 + uniqueMap[restore.UniqueTableName{"test", "\"t\""}] = true + err = db.CreateTable(context.Background(), &table, uniqueMap) + // Check if AutoIncID is altered to globalAutoID + 300. + autoIncID, err = strconv.ParseUint(tk.MustQuery("admin show `\"t\"` next_row_id").Rows()[0][3].(string), 10, 64) + c.Assert(err, IsNil, Commentf("Error query auto inc id: %s", err)) + c.Assert(autoIncID, Equals, uint64(globalAutoID+300)) + } func (s *testRestoreSchemaSuite) TestFilterDDLJobs(c *C) { @@ -124,7 +145,11 @@ func (s *testRestoreSchemaSuite) TestFilterDDLJobs(c *C) { ts, err := s.mock.GetOracle().GetTimestamp(context.Background(), &oracle.Option{TxnScope: oracle.GlobalTxnScope}) c.Assert(err, IsNil, Commentf("Error get ts: %s", err)) - metaWriter := metautil.NewMetaWriter(s.storage, metautil.MetaFileSize, false) + cipher := backuppb.CipherInfo{ + CipherType: encryptionpb.EncryptionMethod_PLAINTEXT, + } + + metaWriter := metautil.NewMetaWriter(s.storage, metautil.MetaFileSize, false, &cipher) ctx := context.Background() metaWriter.StartWriteMetasAsync(ctx, metautil.AppendDDL) err = backup.WriteBackupDDLJobs(metaWriter, s.mock.Storage, lastTS, ts) @@ -150,7 +175,7 @@ func (s *testRestoreSchemaSuite) TestFilterDDLJobs(c *C) { c.Assert(err, IsNil) // check the schema version c.Assert(mockMeta.Version, Equals, int32(metautil.MetaV1)) - metaReader := metautil.NewMetaReader(mockMeta, s.storage) + metaReader := metautil.NewMetaReader(mockMeta, s.storage, &cipher) allDDLJobsBytes, err := metaReader.ReadDDLs(ctx) c.Assert(err, IsNil) var allDDLJobs []*model.Job @@ -182,7 +207,11 @@ func (s *testRestoreSchemaSuite) TestFilterDDLJobsV2(c *C) { ts, err := s.mock.GetOracle().GetTimestamp(context.Background(), &oracle.Option{TxnScope: oracle.GlobalTxnScope}) c.Assert(err, IsNil, Commentf("Error get ts: %s", err)) - metaWriter := metautil.NewMetaWriter(s.storage, metautil.MetaFileSize, true) + cipher := backuppb.CipherInfo{ + CipherType: encryptionpb.EncryptionMethod_PLAINTEXT, + } + + metaWriter := metautil.NewMetaWriter(s.storage, metautil.MetaFileSize, true, &cipher) ctx := context.Background() metaWriter.StartWriteMetasAsync(ctx, metautil.AppendDDL) err = backup.WriteBackupDDLJobs(metaWriter, s.mock.Storage, lastTS, ts) @@ -209,7 +238,7 @@ func (s *testRestoreSchemaSuite) TestFilterDDLJobsV2(c *C) { c.Assert(err, IsNil) // check the schema version c.Assert(mockMeta.Version, Equals, int32(metautil.MetaV2)) - metaReader := metautil.NewMetaReader(mockMeta, s.storage) + metaReader := metautil.NewMetaReader(mockMeta, s.storage, &cipher) allDDLJobsBytes, err := metaReader.ReadDDLs(ctx) c.Assert(err, IsNil) var allDDLJobs []*model.Job diff --git a/br/pkg/restore/import.go b/br/pkg/restore/import.go index bb10cc79ffcfb..aafb144959202 100644 --- a/br/pkg/restore/import.go +++ b/br/pkg/restore/import.go @@ -7,6 +7,7 @@ import ( "context" "crypto/tls" "sync" + "sync/atomic" "time" "github.com/google/uuid" @@ -25,6 +26,7 @@ import ( pd "github.com/tikv/pd/client" "go.uber.org/multierr" "go.uber.org/zap" + "golang.org/x/sync/errgroup" "google.golang.org/grpc" "google.golang.org/grpc/backoff" "google.golang.org/grpc/codes" @@ -166,6 +168,8 @@ func (ic *importClient) GetImportClient( ctx, addr, opt, + grpc.WithBlock(), + grpc.FailOnNonTempDialError(true), grpc.WithConnectParams(grpc.ConnectParams{Backoff: bfConf}), grpc.WithKeepaliveParams(ic.keepaliveConf), ) @@ -261,6 +265,7 @@ func (importer *FileImporter) Import( ctx context.Context, files []*backuppb.File, rewriteRules *RewriteRules, + cipher *backuppb.CipherInfo, ) error { start := time.Now() log.Debug("import file", logutil.Files(files)) @@ -312,9 +317,9 @@ func (importer *FileImporter) Import( for i, f := range remainFiles { var downloadMeta *import_sstpb.SSTMeta if importer.isRawKvMode { - downloadMeta, e = importer.downloadRawKVSST(ctx, info, f) + downloadMeta, e = importer.downloadRawKVSST(ctx, info, f, cipher) } else { - downloadMeta, e = importer.downloadSST(ctx, info, f, rewriteRules) + downloadMeta, e = importer.downloadSST(ctx, info, f, rewriteRules, cipher) } failpoint.Inject("restore-storage-error", func(val failpoint.Value) { msg := val.(string) @@ -451,6 +456,7 @@ func (importer *FileImporter) downloadSST( regionInfo *RegionInfo, file *backuppb.File, rewriteRules *RewriteRules, + cipher *backuppb.CipherInfo, ) (*import_sstpb.SSTMeta, error) { uid := uuid.New() id := uid[:] @@ -470,28 +476,50 @@ func (importer *FileImporter) downloadSST( StorageBackend: importer.backend, Name: file.GetName(), RewriteRule: rule, + CipherInfo: cipher, } log.Debug("download SST", logutil.SSTMeta(&sstMeta), logutil.File(file), logutil.Region(regionInfo.Region), + logutil.Leader(regionInfo.Leader), ) - var resp *import_sstpb.DownloadResponse - for _, peer := range regionInfo.Region.GetPeers() { - var err error - resp, err = importer.importClient.DownloadSST(ctx, peer.GetStoreId(), req) - if err != nil { - return nil, errors.Trace(err) - } - if resp.GetError() != nil { - return nil, errors.Annotate(berrors.ErrKVDownloadFailed, resp.GetError().GetMessage()) - } - if resp.GetIsEmpty() { - return nil, errors.Trace(berrors.ErrKVRangeIsEmpty) - } + + var atomicResp atomic.Value + eg, ectx := errgroup.WithContext(ctx) + for _, p := range regionInfo.Region.GetPeers() { + peer := p + eg.Go(func() error { + resp, err := importer.importClient.DownloadSST(ectx, peer.GetStoreId(), req) + if err != nil { + return errors.Trace(err) + } + if resp.GetError() != nil { + return errors.Annotate(berrors.ErrKVDownloadFailed, resp.GetError().GetMessage()) + } + if resp.GetIsEmpty() { + return errors.Trace(berrors.ErrKVRangeIsEmpty) + } + + log.Debug("download from peer", + logutil.Region(regionInfo.Region), + logutil.Peer(peer), + logutil.Key("resp-range-start", resp.Range.Start), + logutil.Key("resp-range-end", resp.Range.Start), + zap.Bool("resp-isempty", resp.IsEmpty), + zap.Uint32("resp-crc32", resp.Crc32), + ) + atomicResp.Store(resp) + return nil + }) + } + if err := eg.Wait(); err != nil { + return nil, err } - sstMeta.Range.Start = truncateTS(resp.Range.GetStart()) - sstMeta.Range.End = truncateTS(resp.Range.GetEnd()) + + downloadResp := atomicResp.Load().(*import_sstpb.DownloadResponse) + sstMeta.Range.Start = truncateTS(downloadResp.Range.GetStart()) + sstMeta.Range.End = truncateTS(downloadResp.Range.GetEnd()) return &sstMeta, nil } @@ -499,6 +527,7 @@ func (importer *FileImporter) downloadRawKVSST( ctx context.Context, regionInfo *RegionInfo, file *backuppb.File, + cipher *backuppb.CipherInfo, ) (*import_sstpb.SSTMeta, error) { uid := uuid.New() id := uid[:] @@ -525,24 +554,38 @@ func (importer *FileImporter) downloadRawKVSST( Name: file.GetName(), RewriteRule: rule, IsRawKv: true, + CipherInfo: cipher, } log.Debug("download SST", logutil.SSTMeta(&sstMeta), logutil.Region(regionInfo.Region)) - var err error - var resp *import_sstpb.DownloadResponse - for _, peer := range regionInfo.Region.GetPeers() { - resp, err = importer.importClient.DownloadSST(ctx, peer.GetStoreId(), req) - if err != nil { - return nil, errors.Trace(err) - } - if resp.GetError() != nil { - return nil, errors.Annotate(berrors.ErrKVDownloadFailed, resp.GetError().GetMessage()) - } - if resp.GetIsEmpty() { - return nil, errors.Trace(berrors.ErrKVRangeIsEmpty) - } + + var atomicResp atomic.Value + eg, ectx := errgroup.WithContext(ctx) + for _, p := range regionInfo.Region.GetPeers() { + peer := p + eg.Go(func() error { + resp, err := importer.importClient.DownloadSST(ectx, peer.GetStoreId(), req) + if err != nil { + return errors.Trace(err) + } + if resp.GetError() != nil { + return errors.Annotate(berrors.ErrKVDownloadFailed, resp.GetError().GetMessage()) + } + if resp.GetIsEmpty() { + return errors.Trace(berrors.ErrKVRangeIsEmpty) + } + + atomicResp.Store(resp) + return nil + }) } - sstMeta.Range.Start = resp.Range.GetStart() - sstMeta.Range.End = resp.Range.GetEnd() + + if err := eg.Wait(); err != nil { + return nil, err + } + + downloadResp := atomicResp.Load().(*import_sstpb.DownloadResponse) + sstMeta.Range.Start = downloadResp.Range.GetStart() + sstMeta.Range.End = downloadResp.Range.GetEnd() return &sstMeta, nil } diff --git a/br/pkg/restore/ingester.go b/br/pkg/restore/ingester.go deleted file mode 100644 index 22d5e389a63c6..0000000000000 --- a/br/pkg/restore/ingester.go +++ /dev/null @@ -1,605 +0,0 @@ -// Copyright 2020 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, -// 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. - -package restore - -import ( - "bytes" - "context" - "crypto/tls" - "strings" - "sync" - "time" - - "github.com/google/uuid" - "github.com/pingcap/errors" - "github.com/pingcap/failpoint" - "github.com/pingcap/kvproto/pkg/errorpb" - sst "github.com/pingcap/kvproto/pkg/import_sstpb" - "github.com/pingcap/kvproto/pkg/kvrpcpb" - "github.com/pingcap/kvproto/pkg/metapb" - "github.com/pingcap/log" - "github.com/pingcap/tidb/br/pkg/conn" - berrors "github.com/pingcap/tidb/br/pkg/errors" - "github.com/pingcap/tidb/br/pkg/kv" - "github.com/pingcap/tidb/br/pkg/logutil" - "github.com/pingcap/tidb/br/pkg/membuf" - "github.com/pingcap/tidb/br/pkg/utils" - "github.com/tikv/pd/pkg/codec" - "go.uber.org/zap" - "google.golang.org/grpc" - "google.golang.org/grpc/backoff" - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/keepalive" -) - -const ( - dialTimeout = 5 * time.Second - - gRPCKeepAliveTime = 10 * time.Second - gRPCKeepAliveTimeout = 3 * time.Second - - // See: https://github.com/tikv/tikv/blob/e030a0aae9622f3774df89c62f21b2171a72a69e/etc/config-template.toml#L360 - regionMaxKeyCount = 1440000 - - defaultSplitSize = 96 * 1024 * 1024 -) - -type retryType int - -const ( - retryNone retryType = iota - retryWrite - retryIngest -) - -type gRPCConns struct { - mu sync.Mutex - conns map[uint64]*conn.Pool - tcpConcurrency int -} - -func (conns *gRPCConns) Close() { - conns.mu.Lock() - defer conns.mu.Unlock() - - for _, cp := range conns.conns { - cp.Close() - } -} - -// Ingester writes and ingests kv to TiKV. -// which used for both BR log restore and Lightning local backend. -type Ingester struct { - // commit ts appends to key in tikv - TS uint64 - - tlsConf *tls.Config - conns gRPCConns - - splitCli SplitClient - WorkerPool *utils.WorkerPool - - batchWriteKVPairs int - regionSplitSize int64 -} - -// NewIngester creates Ingester. -func NewIngester( - splitCli SplitClient, cfg concurrencyCfg, commitTS uint64, tlsConf *tls.Config, -) *Ingester { - workerPool := utils.NewWorkerPool(cfg.IngestConcurrency, "ingest worker") - return &Ingester{ - tlsConf: tlsConf, - conns: gRPCConns{ - tcpConcurrency: cfg.TCPConcurrency, - conns: make(map[uint64]*conn.Pool), - }, - splitCli: splitCli, - WorkerPool: workerPool, - batchWriteKVPairs: cfg.BatchWriteKVPairs, - regionSplitSize: defaultSplitSize, - TS: commitTS, - } -} - -func (i *Ingester) makeConn(ctx context.Context, storeID uint64) (*grpc.ClientConn, error) { - store, err := i.splitCli.GetStore(ctx, storeID) - if err != nil { - return nil, errors.Trace(err) - } - opt := grpc.WithInsecure() - if i.tlsConf != nil { - opt = grpc.WithTransportCredentials(credentials.NewTLS(i.tlsConf)) - } - ctx, cancel := context.WithTimeout(ctx, dialTimeout) - - bfConf := backoff.DefaultConfig - bfConf.MaxDelay = gRPCBackOffMaxDelay - // we should use peer address for tiflash. for tikv, peer address is empty - addr := store.GetPeerAddress() - if addr == "" { - addr = store.GetAddress() - } - grpcConn, err := grpc.DialContext( - ctx, - addr, - opt, - grpc.WithConnectParams(grpc.ConnectParams{Backoff: bfConf}), - grpc.WithKeepaliveParams(keepalive.ClientParameters{ - Time: gRPCKeepAliveTime, - Timeout: gRPCKeepAliveTimeout, - PermitWithoutStream: true, - }), - ) - cancel() - if err != nil { - return nil, errors.Trace(err) - } - return grpcConn, nil -} - -// write [start, end) kv in to tikv. -func (i *Ingester) writeAndIngestByRange( - ctxt context.Context, - iterProducer kv.IterProducer, - start []byte, - end []byte, - remainRanges *syncdRanges, -) error { - select { - case <-ctxt.Done(): - return ctxt.Err() - default: - } - iter := iterProducer.Produce(start, end) - iter.First() - pairStart := append([]byte{}, iter.Key()...) - iter.Last() - pairEnd := append([]byte{}, iter.Key()...) - if bytes.Compare(pairStart, pairEnd) > 0 { - log.Debug("There is no pairs in iterator", logutil.Key("start", start), - logutil.Key("end", end), logutil.Key("pairStart", pairStart), logutil.Key("pairEnd", pairEnd)) - return nil - } - var regions []*RegionInfo - var err error - ctx, cancel := context.WithCancel(ctxt) - defer cancel() - -WriteAndIngest: - for retry := 0; retry < maxRetryTimes; { - if retry != 0 { - select { - case <-time.After(time.Second): - case <-ctx.Done(): - return ctx.Err() - } - } - startKey := codec.EncodeBytes(pairStart) - endKey := codec.EncodeBytes(kv.NextKey(pairEnd)) - regions, err = PaginateScanRegion(ctx, i.splitCli, startKey, endKey, 128) - if err != nil || len(regions) == 0 { - log.Warn("scan region failed", zap.Error(err), zap.Int("region_len", len(regions)), - logutil.Key("startKey", startKey), logutil.Key("endKey", endKey), zap.Int("retry", retry)) - retry++ - continue - } - - for _, region := range regions { - log.Debug("get region", zap.Int("retry", retry), logutil.Key("startKey", startKey), - logutil.Key("endKey", endKey), logutil.Region(region.Region)) - w := i.WorkerPool.ApplyWorker() - var rg *Range - rg, err = i.writeAndIngestPairs(ctx, iter, region, pairStart, pairEnd) - i.WorkerPool.RecycleWorker(w) - if err != nil { - _, regionStart, _ := codec.DecodeBytes(region.Region.StartKey) - // if we have at least succeeded one region, retry without increasing the retry count - if bytes.Compare(regionStart, pairStart) > 0 { - pairStart = regionStart - } else { - retry++ - } - log.Info("retry write and ingest kv pairs", logutil.Key("startKey", pairStart), - logutil.Key("endKey", pairEnd), zap.Error(err), zap.Int("retry", retry)) - continue WriteAndIngest - } - if rg != nil { - remainRanges.add(*rg) - } - } - break - } - return err -} - -func (i *Ingester) writeAndIngestPairs( - ctx context.Context, - iter kv.Iter, - region *RegionInfo, - start, end []byte, -) (*Range, error) { - var err error - var remainRange *Range -loopWrite: - for retry := 0; retry < maxRetryTimes; retry++ { - select { - case <-ctx.Done(): - return remainRange, ctx.Err() - default: - } - var metas []*sst.SSTMeta - metas, remainRange, err = i.writeToTiKV(ctx, iter, region, start, end) - if err != nil { - log.Warn("write to tikv failed", zap.Error(err)) - return nil, err - } - - for _, meta := range metas { - errCnt := 0 - for errCnt < maxRetryTimes { - log.Debug("ingest meta", zap.Reflect("meta", meta)) - var resp *sst.IngestResponse - resp, err = i.ingest(ctx, meta, region) - if err != nil { - log.Warn("ingest failed", zap.Error(err), logutil.SSTMeta(meta), - zap.Reflect("region", region)) - errCnt++ - continue - } - failpoint.Inject("FailIngestMeta", func(val failpoint.Value) { - switch val.(string) { - case "notleader": - resp.Error.NotLeader = &errorpb.NotLeader{ - RegionId: region.Region.Id, Leader: region.Leader, - } - case "epochnotmatch": - resp.Error.EpochNotMatch = &errorpb.EpochNotMatch{ - CurrentRegions: []*metapb.Region{region.Region}, - } - } - }) - var retryTy retryType - var newRegion *RegionInfo - retryTy, newRegion, err = i.isIngestRetryable(ctx, resp, region, meta) - if err == nil { - // ingest next meta - break - } - switch retryTy { - case retryNone: - log.Warn("ingest failed and do not retry", zap.Error(err), logutil.SSTMeta(meta), - zap.Reflect("region", region)) - // met non-retryable error retry whole Write procedure - return remainRange, err - case retryWrite: - region = newRegion - continue loopWrite - case retryIngest: - region = newRegion - continue - } - } - } - - if err != nil { - log.Warn("write and ingest region, will retry import full range", zap.Error(err), - logutil.Region(region.Region), logutil.Key("start", start), logutil.Key("end", end)) - } - return remainRange, errors.Trace(err) - } - - return remainRange, errors.Trace(err) -} - -// writeToTiKV writer engine key-value pairs to tikv and return the sst meta generated by tikv. -// we don't need to do cleanup for the pairs written to tikv if encounters an error, -// tikv will takes the responsibility to do so. -func (i *Ingester) writeToTiKV( - ctx context.Context, - iter kv.Iter, - region *RegionInfo, - start, end []byte, -) ([]*sst.SSTMeta, *Range, error) { - begin := time.Now() - regionRange := intersectRange(region.Region, Range{Start: start, End: end}) - - iter.Seek(regionRange.Start) - firstKey := codec.EncodeBytes(iter.Key()) - var lastKey []byte - if iter.Seek(regionRange.End) { - lastKey = codec.EncodeBytes(iter.Key()) - } else { - iter.Last() - log.Info("region range's end key not in iter, shouldn't happen", - zap.Any("region range", regionRange), logutil.Key("iter last", iter.Key())) - lastKey = codec.EncodeBytes(kv.NextKey(iter.Key())) - } - - if bytes.Compare(firstKey, lastKey) > 0 { - log.Info("keys within region is empty, skip ingest", logutil.Key("start", start), - logutil.Key("regionStart", region.Region.StartKey), logutil.Key("end", end), - logutil.Key("regionEnd", region.Region.EndKey)) - return nil, nil, nil - } - - u := uuid.New() - meta := &sst.SSTMeta{ - Uuid: u[:], - RegionId: region.Region.GetId(), - RegionEpoch: region.Region.GetRegionEpoch(), - Range: &sst.Range{ - Start: firstKey, - End: lastKey, - }, - } - - leaderID := region.Leader.GetId() - clients := make([]sst.ImportSST_WriteClient, 0, len(region.Region.GetPeers())) - requests := make([]*sst.WriteRequest, 0, len(region.Region.GetPeers())) - for _, peer := range region.Region.GetPeers() { - cli, err := i.getImportClient(ctx, peer) - if err != nil { - return nil, nil, err - } - - wstream, err := cli.Write(ctx) - if err != nil { - return nil, nil, errors.Trace(err) - } - - // Bind uuid for this write request - req := &sst.WriteRequest{ - Chunk: &sst.WriteRequest_Meta{ - Meta: meta, - }, - } - if err = wstream.Send(req); err != nil { - return nil, nil, errors.Trace(err) - } - req.Chunk = &sst.WriteRequest_Batch{ - Batch: &sst.WriteBatch{ - CommitTs: i.TS, - }, - } - clients = append(clients, wstream) - requests = append(requests, req) - } - - bytesBuf := membuf.NewBuffer() - defer bytesBuf.Destroy() - pairs := make([]*sst.Pair, 0, i.batchWriteKVPairs) - count := 0 - size := int64(0) - totalCount := 0 - firstLoop := true - regionMaxSize := i.regionSplitSize * 4 / 3 - - for iter.Seek(regionRange.Start); iter.Valid() && bytes.Compare(iter.Key(), regionRange.End) <= 0; iter.Next() { - size += int64(len(iter.Key()) + len(iter.Value())) - // here we reuse the `*sst.Pair`s to optimize object allocation - if firstLoop { - pair := &sst.Pair{ - Key: bytesBuf.AddBytes(iter.Key()), - Value: bytesBuf.AddBytes(iter.Value()), - Op: iter.OpType(), - } - pairs = append(pairs, pair) - } else { - pairs[count].Key = bytesBuf.AddBytes(iter.Key()) - pairs[count].Value = bytesBuf.AddBytes(iter.Value()) - } - count++ - totalCount++ - - if count >= i.batchWriteKVPairs { - for i := range clients { - requests[i].Chunk.(*sst.WriteRequest_Batch).Batch.Pairs = pairs[:count] - if err := clients[i].Send(requests[i]); err != nil { - return nil, nil, errors.Trace(err) - } - } - count = 0 - bytesBuf.Reset() - firstLoop = false - } - if size >= regionMaxSize || totalCount >= regionMaxKeyCount { - break - } - } - - if count > 0 { - for i := range clients { - requests[i].Chunk.(*sst.WriteRequest_Batch).Batch.Pairs = pairs[:count] - if err := clients[i].Send(requests[i]); err != nil { - return nil, nil, errors.Trace(err) - } - } - } - - if iter.Error() != nil { - return nil, nil, errors.Trace(iter.Error()) - } - - var leaderPeerMetas []*sst.SSTMeta - for i, wStream := range clients { - if resp, closeErr := wStream.CloseAndRecv(); closeErr != nil { - return nil, nil, errors.Trace(closeErr) - } else if leaderID == region.Region.Peers[i].GetId() { - leaderPeerMetas = resp.Metas - log.Debug("get metas after write kv stream to tikv", zap.Reflect("metas", leaderPeerMetas)) - } - } - - // if there is not leader currently, we should directly return an error - if leaderPeerMetas == nil { - log.Warn("write to tikv no leader", zap.Reflect("region", region), - zap.Uint64("leader_id", leaderID), zap.Reflect("meta", meta), - zap.Int("kv_pairs", totalCount), zap.Int64("total_bytes", size)) - return nil, nil, errors.Annotatef(berrors.ErrPDLeaderNotFound, "write to tikv with no leader returned, region '%d', leader: %d", - region.Region.Id, leaderID) - } - - log.Debug("write to kv", zap.Reflect("region", region), zap.Uint64("leader", leaderID), - zap.Reflect("meta", meta), zap.Reflect("return metas", leaderPeerMetas), - zap.Int("kv_pairs", totalCount), zap.Int64("total_bytes", size), - zap.Int64("buf_size", bytesBuf.TotalSize()), - zap.Stringer("takeTime", time.Since(begin))) - - var remainRange *Range - if iter.Valid() && iter.Next() { - firstKey := append([]byte{}, iter.Key()...) - remainRange = &Range{Start: firstKey, End: regionRange.End} - log.Info("write to tikv partial finish", zap.Int("count", totalCount), - zap.Int64("size", size), zap.Binary("startKey", regionRange.Start), zap.Binary("endKey", regionRange.End), - zap.Binary("remainStart", remainRange.Start), zap.Binary("remainEnd", remainRange.End), - zap.Reflect("region", region)) - } - - return leaderPeerMetas, remainRange, nil -} - -func (i *Ingester) ingest(ctx context.Context, meta *sst.SSTMeta, region *RegionInfo) (*sst.IngestResponse, error) { - leader := region.Leader - if leader == nil { - leader = region.Region.GetPeers()[0] - } - - cli, err := i.getImportClient(ctx, leader) - if err != nil { - return nil, err - } - reqCtx := &kvrpcpb.Context{ - RegionId: region.Region.GetId(), - RegionEpoch: region.Region.GetRegionEpoch(), - Peer: leader, - } - - req := &sst.IngestRequest{ - Context: reqCtx, - Sst: meta, - } - resp, err := cli.Ingest(ctx, req) - if err != nil { - return nil, errors.Trace(err) - } - return resp, nil -} - -func (i *Ingester) getImportClient(ctx context.Context, peer *metapb.Peer) (sst.ImportSSTClient, error) { - i.conns.mu.Lock() - defer i.conns.mu.Unlock() - - conn, err := i.getGrpcConnLocked(ctx, peer.GetStoreId()) - if err != nil { - return nil, errors.Trace(err) - } - return sst.NewImportSSTClient(conn), nil -} - -func (i *Ingester) getGrpcConnLocked(ctx context.Context, storeID uint64) (*grpc.ClientConn, error) { - if _, ok := i.conns.conns[storeID]; !ok { - i.conns.conns[storeID] = conn.NewConnPool(i.conns.tcpConcurrency, func(ctx context.Context) (*grpc.ClientConn, error) { - return i.makeConn(ctx, storeID) - }) - } - return i.conns.conns[storeID].Get(ctx) -} - -func (i *Ingester) isIngestRetryable( - ctx context.Context, - resp *sst.IngestResponse, - region *RegionInfo, - meta *sst.SSTMeta, -) (retryType, *RegionInfo, error) { - if resp.GetError() == nil { - return retryNone, nil, nil - } - - getRegion := func() (*RegionInfo, error) { - for retry := 0; ; retry++ { - newRegion, err := i.splitCli.GetRegion(ctx, region.Region.GetStartKey()) - if err != nil { - return nil, errors.Trace(err) - } - if newRegion != nil { - return newRegion, nil - } - log.Warn("get region by key return nil, will retry", zap.Reflect("region", region), - zap.Int("retry", retry)) - select { - case <-ctx.Done(): - return nil, ctx.Err() - case <-time.After(time.Second): - } - } - } - - var newRegion *RegionInfo - var err error - switch errPb := resp.GetError(); { - case errPb.NotLeader != nil: - if newLeader := errPb.GetNotLeader().GetLeader(); newLeader != nil { - newRegion = &RegionInfo{ - Leader: newLeader, - Region: region.Region, - } - } else { - newRegion, err = getRegion() - if err != nil { - return retryNone, nil, errors.Trace(err) - } - } - return retryIngest, newRegion, errors.Annotatef(berrors.ErrKVNotLeader, "not leader: %s", errPb.GetMessage()) - case errPb.EpochNotMatch != nil: - if currentRegions := errPb.GetEpochNotMatch().GetCurrentRegions(); currentRegions != nil { - var currentRegion *metapb.Region - for _, r := range currentRegions { - if insideRegion(r, meta) { - currentRegion = r - break - } - } - if currentRegion != nil { - var newLeader *metapb.Peer - for _, p := range currentRegion.Peers { - if p.GetStoreId() == region.Leader.GetStoreId() { - newLeader = p - break - } - } - if newLeader != nil { - newRegion = &RegionInfo{ - Leader: newLeader, - Region: currentRegion, - } - } - } - } - retryTy := retryNone - if newRegion != nil { - retryTy = retryWrite - } - return retryTy, newRegion, errors.Annotatef(berrors.ErrKVEpochNotMatch, "epoch not match: %s", errPb.GetMessage()) - case strings.Contains(errPb.Message, "raft: proposal dropped"): - // TODO: we should change 'Raft raft: proposal dropped' to a error type like 'NotLeader' - newRegion, err = getRegion() - if err != nil { - return retryNone, nil, errors.Trace(err) - } - return retryIngest, newRegion, errors.Annotate(berrors.ErrKVUnknown, errPb.GetMessage()) - } - return retryNone, nil, errors.Annotatef(berrors.ErrKVUnknown, "non-retryable error: %s", resp.GetError().GetMessage()) -} diff --git a/br/pkg/restore/log_client.go b/br/pkg/restore/log_client.go deleted file mode 100644 index fd71a06903ad1..0000000000000 --- a/br/pkg/restore/log_client.go +++ /dev/null @@ -1,761 +0,0 @@ -// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. - -package restore - -import ( - "bytes" - "context" - "encoding/json" - "fmt" - "path/filepath" - "sort" - "strconv" - "strings" - "sync" - "time" - - "github.com/pingcap/errors" - "github.com/pingcap/log" - filter "github.com/pingcap/tidb-tools/pkg/table-filter" - "github.com/pingcap/tidb/br/pkg/cdclog" - berrors "github.com/pingcap/tidb/br/pkg/errors" - "github.com/pingcap/tidb/br/pkg/kv" - "github.com/pingcap/tidb/br/pkg/storage" - "github.com/pingcap/tidb/br/pkg/utils" - "github.com/pingcap/tidb/domain" - "github.com/pingcap/tidb/meta/autoid" - "github.com/pingcap/tidb/parser/model" - titable "github.com/pingcap/tidb/table" - "github.com/tikv/client-go/v2/oracle" - "go.uber.org/zap" - "golang.org/x/sync/errgroup" -) - -const ( - tableLogPrefix = "t_" - logPrefix = "cdclog" - - metaFile = "log.meta" - ddlEventsDir = "ddls" - ddlFilePrefix = "ddl" - - maxUint64 = ^uint64(0) - - maxRetryTimes = 3 -) - -// concurrencyCfg set by user, which can adjust the restore performance. -type concurrencyCfg struct { - BatchWriteKVPairs int - BatchFlushKVPairs int - BatchFlushKVSize int64 - Concurrency uint - TCPConcurrency int - IngestConcurrency uint -} - -// LogMeta represents the log.meta generated by cdc log backup. -type LogMeta struct { - Names map[int64]string `json:"names"` - GlobalResolvedTS uint64 `json:"global_resolved_ts"` -} - -// LogClient sends requests to restore files. -type LogClient struct { - // lock DDL execution - // TODO remove lock by using db session pool if necessary - ddlLock sync.Mutex - - restoreClient *Client - splitClient SplitClient - importerClient ImporterClient - - // ingester is used to write and ingest kvs to tikv. - // lightning has the simlar logic and can reuse it. - ingester *Ingester - - // range of log backup - startTS uint64 - endTS uint64 - - concurrencyCfg concurrencyCfg - // meta info parsed from log backup - meta *LogMeta - eventPullers map[int64]*cdclog.EventPuller - tableBuffers map[int64]*cdclog.TableBuffer - - tableFilter filter.Filter - - // a map to store all drop schema ts, use it as a filter - dropTSMap sync.Map -} - -// NewLogRestoreClient returns a new LogRestoreClient. -func NewLogRestoreClient( - ctx context.Context, - restoreClient *Client, - startTS uint64, - endTS uint64, - tableFilter filter.Filter, - concurrency uint, - batchFlushPairs int, - batchFlushSize int64, - batchWriteKVPairs int, -) (*LogClient, error) { - var err error - if endTS == 0 { - // means restore all log data, - // so we get current ts from restore cluster - endTS, err = restoreClient.GetTS(ctx) - if err != nil { - return nil, errors.Trace(err) - } - } - - tlsConf := restoreClient.GetTLSConfig() - splitClient := NewSplitClient(restoreClient.GetPDClient(), tlsConf) - importClient := NewImportClient(splitClient, tlsConf, restoreClient.keepaliveConf) - - cfg := concurrencyCfg{ - Concurrency: concurrency, - BatchFlushKVPairs: batchFlushPairs, - BatchFlushKVSize: batchFlushSize, - BatchWriteKVPairs: batchWriteKVPairs, - IngestConcurrency: concurrency * 16, - TCPConcurrency: int(concurrency) * 16, - } - - // commitTS append into encode key. we use a unified ts for once log restore. - commitTS := oracle.ComposeTS(time.Now().Unix()*1000, 0) - lc := &LogClient{ - restoreClient: restoreClient, - splitClient: splitClient, - importerClient: importClient, - startTS: startTS, - endTS: endTS, - concurrencyCfg: cfg, - meta: new(LogMeta), - eventPullers: make(map[int64]*cdclog.EventPuller), - tableBuffers: make(map[int64]*cdclog.TableBuffer), - tableFilter: tableFilter, - ingester: NewIngester(splitClient, cfg, commitTS, tlsConf), - } - return lc, nil -} - -// ResetTSRange used for test. -func (l *LogClient) ResetTSRange(startTS uint64, endTS uint64) { - l.startTS = startTS - l.endTS = endTS -} - -func (l *LogClient) maybeTSInRange(ts uint64) bool { - // We choose the last event's ts as file name in cdclog when rotate. - // so even this file name's ts is larger than l.endTS, - // we still need to collect it, because it may have some events in this ts range. - // TODO: find another effective filter to collect files - return ts >= l.startTS -} - -func (l *LogClient) tsInRange(ts uint64) bool { - return l.startTS <= ts && ts <= l.endTS -} - -func (l *LogClient) shouldFilter(item *cdclog.SortItem) bool { - if val, ok := l.dropTSMap.Load(item.Schema); ok { - if val.(uint64) > item.TS { - return true - } - } - return false -} - -// NeedRestoreDDL determines whether to collect ddl file by ts range. -func (l *LogClient) NeedRestoreDDL(fileName string) (bool, error) { - names := strings.Split(fileName, ".") - if len(names) != 2 { - log.Warn("found wrong format of ddl file", zap.String("file", fileName)) - return false, nil - } - if names[0] != ddlFilePrefix { - log.Warn("file doesn't start with ddl", zap.String("file", fileName)) - return false, nil - } - ts, err := strconv.ParseUint(names[1], 10, 64) - if err != nil { - return false, errors.Trace(err) - } - - // According to https://docs.aws.amazon.com/AmazonS3/latest/dev/ListingKeysUsingAPIs.html - // list API return in UTF-8 binary order, so the cdc log create DDL file used - // maxUint64 - the first DDL event's commit ts as the file name to return the latest ddl file. - // see details at https://github.com/pingcap/ticdc/pull/826/files#diff-d2e98b3ed211b7b9bb7b6da63dd48758R81 - ts = maxUint64 - ts - - // In cdc, we choose the first event as the file name of DDL file. - // so if the file ts is large than endTS, we can skip to execute it. - // FIXME find a unified logic to filter row changes files and ddl files. - if ts <= l.endTS { - return true, nil - } - log.Info("filter ddl file by ts", zap.String("name", fileName), zap.Uint64("ts", ts)) - return false, nil -} - -func (l *LogClient) collectDDLFiles(ctx context.Context) ([]string, error) { - ddlFiles := make([]string, 0) - opt := &storage.WalkOption{ - SubDir: ddlEventsDir, - ListCount: -1, - } - err := l.restoreClient.storage.WalkDir(ctx, opt, func(path string, size int64) error { - fileName := filepath.Base(path) - shouldRestore, err := l.NeedRestoreDDL(fileName) - if err != nil { - return errors.Trace(err) - } - if shouldRestore { - ddlFiles = append(ddlFiles, path) - } - return nil - }) - if err != nil { - return nil, errors.Trace(err) - } - - sort.Sort(sort.Reverse(sort.StringSlice(ddlFiles))) - return ddlFiles, nil -} - -func (l *LogClient) isDBRelatedDDL(ddl *cdclog.MessageDDL) bool { - switch ddl.Type { - case model.ActionDropSchema, model.ActionCreateSchema, model.ActionModifySchemaCharsetAndCollate, model.ActionModifySchemaDefaultPlacement: - return true - } - return false -} - -func (l *LogClient) isDropTable(ddl *cdclog.MessageDDL) bool { - return ddl.Type == model.ActionDropTable -} - -func (l *LogClient) doDBDDLJob(ctx context.Context, ddls []string) error { - if len(ddls) == 0 { - log.Info("no ddls to restore") - return nil - } - - for _, path := range ddls { - data, err := l.restoreClient.storage.ReadFile(ctx, path) - if err != nil { - return errors.Trace(err) - } - eventDecoder, err := cdclog.NewJSONEventBatchDecoder(data) - if err != nil { - return errors.Trace(err) - } - for eventDecoder.HasNext() { - item, err := eventDecoder.NextEvent(cdclog.DDL) - if err != nil { - return errors.Trace(err) - } - ddl := item.Data.(*cdclog.MessageDDL) - log.Debug("[doDBDDLJob] parse ddl", zap.String("query", ddl.Query)) - if l.isDBRelatedDDL(ddl) && l.tsInRange(item.TS) { - err = l.restoreClient.db.se.Execute(ctx, ddl.Query) - if err != nil { - log.Error("[doDBDDLJob] exec ddl failed", - zap.String("query", ddl.Query), zap.Error(err)) - return errors.Trace(err) - } - if ddl.Type == model.ActionDropSchema { - // store the drop schema ts, and then we need filter evetns which ts is small than this. - l.dropTSMap.Store(item.Schema, item.TS) - } - } - } - } - return nil -} - -// NeedRestoreRowChange determine whether to collect this file by ts range. -func (l *LogClient) NeedRestoreRowChange(fileName string) (bool, error) { - if fileName == logPrefix { - // this file name appeared when file sink enabled - return true, nil - } - names := strings.Split(fileName, ".") - if len(names) != 2 { - log.Warn("found wrong format of row changes file", zap.String("file", fileName)) - return false, nil - } - if names[0] != logPrefix { - log.Warn("file doesn't start with row changes file", zap.String("file", fileName)) - return false, nil - } - ts, err := strconv.ParseUint(names[1], 10, 64) - if err != nil { - return false, errors.Trace(err) - } - if l.maybeTSInRange(ts) { - return true, nil - } - log.Info("filter file by ts", zap.String("name", fileName), zap.Uint64("ts", ts)) - return false, nil -} - -func (l *LogClient) collectRowChangeFiles(ctx context.Context) (map[int64][]string, error) { - // we should collect all related tables row change files - // by log meta info and by given table filter - rowChangeFiles := make(map[int64][]string) - - // need collect restore tableIDs - tableIDs := make([]int64, 0, len(l.meta.Names)) - - // we need remove duplicate table name in collection. - // when a table create and drop and create again. - // then we will have two different table id with same tables. - // we should keep the latest table id(larger table id), and filter the old one. - nameIDMap := make(map[string]int64) - for tableID, name := range l.meta.Names { - if tid, ok := nameIDMap[name]; ok { - if tid < tableID { - nameIDMap[name] = tableID - } - } else { - nameIDMap[name] = tableID - } - } - for name, tableID := range nameIDMap { - schema, table := ParseQuoteName(name) - if !l.tableFilter.MatchTable(schema, table) { - log.Info("filter tables", zap.String("schema", schema), - zap.String("table", table), zap.Int64("tableID", tableID)) - continue - } - tableIDs = append(tableIDs, tableID) - } - - for _, tID := range tableIDs { - tableID := tID - // FIXME update log meta logic here - dir := fmt.Sprintf("%s%d", tableLogPrefix, tableID) - opt := &storage.WalkOption{ - SubDir: dir, - ListCount: -1, - } - err := l.restoreClient.storage.WalkDir(ctx, opt, func(path string, size int64) error { - fileName := filepath.Base(path) - shouldRestore, err := l.NeedRestoreRowChange(fileName) - if err != nil { - return errors.Trace(err) - } - if shouldRestore { - rowChangeFiles[tableID] = append(rowChangeFiles[tableID], path) - } - return nil - }) - if err != nil { - return nil, errors.Trace(err) - } - } - - // sort file in order - for tID, files := range rowChangeFiles { - sortFiles := files - sort.Slice(sortFiles, func(i, j int) bool { - if filepath.Base(sortFiles[j]) == logPrefix { - return true - } - return sortFiles[i] < sortFiles[j] - }) - rowChangeFiles[tID] = sortFiles - } - - return rowChangeFiles, nil -} - -func (l *LogClient) writeRows(ctx context.Context, kvs kv.Pairs) error { - log.Info("writeRows", zap.Int("kv count", len(kvs))) - if len(kvs) == 0 { - // shouldn't happen - log.Warn("not rows to write") - return nil - } - - // stable sort kvs in memory - sort.SliceStable(kvs, func(i, j int) bool { - return bytes.Compare(kvs[i].Key, kvs[j].Key) < 0 - }) - - // remove duplicate keys, and keep the last one - newKvs := make([]kv.Pair, 0, len(kvs)) - for i := 0; i < len(kvs); i++ { - if i == len(kvs)-1 { - newKvs = append(newKvs, kvs[i]) - break - } - if bytes.Equal(kvs[i].Key, kvs[i+1].Key) { - // skip this one - continue - } - newKvs = append(newKvs, kvs[i]) - } - - remainRange := newSyncdRanges() - remainRange.add(Range{ - Start: newKvs[0].Key, - End: kv.NextKey(newKvs[len(newKvs)-1].Key), - }) - iterProducer := kv.NewSimpleKVIterProducer(newKvs) - for { - remain := remainRange.take() - if len(remain) == 0 { - log.Info("writeRows finish") - break - } - eg, ectx := errgroup.WithContext(ctx) - for _, r := range remain { - rangeReplica := r - l.ingester.WorkerPool.ApplyOnErrorGroup(eg, func() error { - err := l.ingester.writeAndIngestByRange(ectx, iterProducer, rangeReplica.Start, rangeReplica.End, remainRange) - if err != nil { - log.Warn("writeRows failed with range", zap.Any("range", rangeReplica), zap.Error(err)) - return errors.Trace(err) - } - return nil - }) - } - if err := eg.Wait(); err != nil { - return errors.Trace(err) - } - log.Info("writeRows ranges unfinished, retry it", zap.Int("remain ranges", len(remain))) - } - return nil -} - -func (l *LogClient) reloadTableMeta(dom *domain.Domain, tableID int64, item *cdclog.SortItem) error { - err := dom.Reload() - if err != nil { - return errors.Trace(err) - } - // find tableID for this table on cluster - newTableID := l.tableBuffers[tableID].TableID() - var ( - newTableInfo titable.Table - ok bool - ) - if newTableID != 0 { - newTableInfo, ok = dom.InfoSchema().TableByID(newTableID) - if !ok { - log.Error("[restoreFromPuller] can't get table info from dom by tableID", - zap.Int64("backup table id", tableID), - zap.Int64("restore table id", newTableID), - ) - return errors.Trace(err) - } - } else { - // fall back to use schema table get info - newTableInfo, err = dom.InfoSchema().TableByName( - model.NewCIStr(item.Schema), model.NewCIStr(item.Table)) - if err != nil { - log.Error("[restoreFromPuller] can't get table info from dom by table name", - zap.Int64("backup table id", tableID), - zap.Int64("restore table id", newTableID), - zap.String("restore table name", item.Table), - zap.String("restore schema name", item.Schema), - ) - return errors.Trace(err) - } - } - - dbInfo, ok := dom.InfoSchema().SchemaByName(model.NewCIStr(item.Schema)) - if !ok { - return errors.Annotatef(berrors.ErrRestoreSchemaNotExists, "schema %s", item.Schema) - } - allocs := autoid.NewAllocatorsFromTblInfo(dom.Store(), dbInfo.ID, newTableInfo.Meta()) - - // reload - l.tableBuffers[tableID].ReloadMeta(newTableInfo, allocs) - log.Debug("reload table meta for table", - zap.Int64("backup table id", tableID), - zap.Int64("restore table id", newTableID), - zap.String("restore table name", item.Table), - zap.String("restore schema name", item.Schema), - zap.Any("allocator", len(allocs)), - zap.Any("auto", newTableInfo.Meta().GetAutoIncrementColInfo()), - ) - return nil -} - -func (l *LogClient) applyKVChanges(ctx context.Context, tableID int64) error { - log.Info("apply kv changes to tikv", - zap.Any("table", tableID), - ) - dataKVs := kv.Pairs{} - indexKVs := kv.Pairs{} - - tableBuffer := l.tableBuffers[tableID] - if tableBuffer.IsEmpty() { - log.Warn("no kv changes to apply") - return nil - } - - var dataChecksum, indexChecksum kv.Checksum - for _, p := range tableBuffer.KvPairs { - p.ClassifyAndAppend(&dataKVs, &dataChecksum, &indexKVs, &indexChecksum) - } - - err := l.writeRows(ctx, dataKVs) - if err != nil { - return errors.Trace(err) - } - dataKVs = dataKVs.Clear() - - err = l.writeRows(ctx, indexKVs) - if err != nil { - return errors.Trace(err) - } - indexKVs = indexKVs.Clear() - - tableBuffer.Clear() - - return nil -} - -func (l *LogClient) restoreTableFromPuller( - ctx context.Context, - tableID int64, - puller *cdclog.EventPuller, - dom *domain.Domain) error { - for { - item, err := puller.PullOneEvent(ctx) - if err != nil { - return errors.Trace(err) - } - if item == nil { - log.Info("[restoreFromPuller] nothing in this puller, we should stop and flush", - zap.Int64("table id", tableID)) - err = l.applyKVChanges(ctx, tableID) - if err != nil { - return errors.Trace(err) - } - return nil - } - log.Debug("[restoreFromPuller] next event", zap.Any("item", item), zap.Int64("table id", tableID)) - if l.startTS > item.TS { - log.Debug("[restoreFromPuller] item ts is smaller than start ts, skip this item", - zap.Uint64("start ts", l.startTS), - zap.Uint64("end ts", l.endTS), - zap.Uint64("item ts", item.TS), - zap.Int64("table id", tableID)) - continue - } - if l.endTS < item.TS { - log.Warn("[restoreFromPuller] ts is larger than end ts, we should stop and flush", - zap.Uint64("start ts", l.startTS), - zap.Uint64("end ts", l.endTS), - zap.Uint64("item ts", item.TS), - zap.Int64("table id", tableID)) - err = l.applyKVChanges(ctx, tableID) - if err != nil { - return errors.Trace(err) - } - return nil - } - - if l.shouldFilter(item) { - log.Debug("[restoreFromPuller] filter item because later drop schema will affect on this item", - zap.Any("item", item), - zap.Int64("table id", tableID)) - err = l.applyKVChanges(ctx, tableID) - if err != nil { - return errors.Trace(err) - } - continue - } - - switch item.ItemType { - case cdclog.DDL: - name := l.meta.Names[tableID] - schema, table := ParseQuoteName(name) - ddl := item.Data.(*cdclog.MessageDDL) - // ddl not influence on this schema/table - if !(schema == item.Schema && (table == item.Table || l.isDBRelatedDDL(ddl))) { - log.Info("[restoreFromPuller] meet unrelated ddl, and continue pulling", - zap.String("item table", item.Table), - zap.String("table", table), - zap.String("item schema", item.Schema), - zap.String("schema", schema), - zap.Int64("backup table id", tableID), - zap.String("query", ddl.Query), - zap.Int64("table id", tableID)) - continue - } - - // database level ddl job has been executed at the beginning - if l.isDBRelatedDDL(ddl) { - log.Debug("[restoreFromPuller] meet database level ddl, continue pulling", - zap.String("ddl", ddl.Query), - zap.Int64("table id", tableID)) - continue - } - - // wait all previous kvs ingest finished - err = l.applyKVChanges(ctx, tableID) - if err != nil { - return errors.Trace(err) - } - - log.Debug("[restoreFromPuller] execute ddl", zap.String("ddl", ddl.Query)) - - l.ddlLock.Lock() - err = l.restoreClient.db.se.Execute(ctx, fmt.Sprintf("use %s", item.Schema)) - if err != nil { - return errors.Trace(err) - } - - err = l.restoreClient.db.se.Execute(ctx, ddl.Query) - if err != nil { - return errors.Trace(err) - } - l.ddlLock.Unlock() - - // if table dropped, we will pull next event to see if this table will create again. - // with next create table ddl, we can do reloadTableMeta. - if l.isDropTable(ddl) { - log.Info("[restoreFromPuller] skip reload because this is a drop table ddl", - zap.String("ddl", ddl.Query)) - l.tableBuffers[tableID].ResetTableInfo() - continue - } - err = l.reloadTableMeta(dom, tableID, item) - if err != nil { - return errors.Trace(err) - } - case cdclog.RowChanged: - if l.tableBuffers[tableID].TableInfo() == nil { - err = l.reloadTableMeta(dom, tableID, item) - if err != nil { - // shouldn't happen - return errors.Trace(err) - } - } - err = l.tableBuffers[tableID].Append(item) - if err != nil { - return errors.Trace(err) - } - if l.tableBuffers[tableID].ShouldApply() { - err = l.applyKVChanges(ctx, tableID) - if err != nil { - return errors.Trace(err) - } - } - } - } -} - -func (l *LogClient) restoreTables(ctx context.Context, dom *domain.Domain) error { - // 1. decode cdclog with in ts range - // 2. dispatch cdclog events to table level concurrently - // a. encode row changed files to kvpairs and ingest into tikv - // b. exec ddl - log.Debug("start restore tables") - workerPool := utils.NewWorkerPool(l.concurrencyCfg.Concurrency, "table log restore") - eg, ectx := errgroup.WithContext(ctx) - for tableID, puller := range l.eventPullers { - pullerReplica := puller - tableIDReplica := tableID - workerPool.ApplyOnErrorGroup(eg, func() error { - return l.restoreTableFromPuller(ectx, tableIDReplica, pullerReplica, dom) - }) - } - return eg.Wait() -} - -// RestoreLogData restore specify log data from storage. -func (l *LogClient) RestoreLogData(ctx context.Context, dom *domain.Domain) error { - // 1. Retrieve log data from storage - // 2. Find proper data by TS range - // 3. Encode and ingest data to tikv - - // parse meta file - data, err := l.restoreClient.storage.ReadFile(ctx, metaFile) - if err != nil { - return errors.Trace(err) - } - err = json.Unmarshal(data, l.meta) - if err != nil { - return errors.Trace(err) - } - log.Info("get meta from storage", zap.Binary("data", data)) - - if l.startTS > l.meta.GlobalResolvedTS { - return errors.Annotatef(berrors.ErrRestoreRTsConstrain, - "start ts:%d is greater than resolved ts:%d", l.startTS, l.meta.GlobalResolvedTS) - } - if l.endTS > l.meta.GlobalResolvedTS { - log.Info("end ts is greater than resolved ts,"+ - " to keep consistency we only recover data until resolved ts", - zap.Uint64("end ts", l.endTS), - zap.Uint64("resolved ts", l.meta.GlobalResolvedTS)) - l.endTS = l.meta.GlobalResolvedTS - } - - // collect ddl files - ddlFiles, err := l.collectDDLFiles(ctx) - if err != nil { - return errors.Trace(err) - } - - log.Info("collect ddl files", zap.Any("files", ddlFiles)) - - err = l.doDBDDLJob(ctx, ddlFiles) - if err != nil { - return errors.Trace(err) - } - log.Debug("db level ddl executed") - - // collect row change files - rowChangesFiles, err := l.collectRowChangeFiles(ctx) - if err != nil { - return errors.Trace(err) - } - - log.Info("collect row changed files", zap.Any("files", rowChangesFiles)) - - // create event puller to apply changes concurrently - for tableID, files := range rowChangesFiles { - name := l.meta.Names[tableID] - schema, table := ParseQuoteName(name) - log.Info("create puller for table", - zap.Int64("table id", tableID), - zap.String("schema", schema), - zap.String("table", table), - ) - l.eventPullers[tableID], err = cdclog.NewEventPuller(ctx, schema, table, ddlFiles, files, l.restoreClient.storage) - if err != nil { - return errors.Trace(err) - } - // use table name to get table info - var tableInfo titable.Table - var allocs autoid.Allocators - infoSchema := dom.InfoSchema() - if infoSchema.TableExists(model.NewCIStr(schema), model.NewCIStr(table)) { - tableInfo, err = infoSchema.TableByName(model.NewCIStr(schema), model.NewCIStr(table)) - if err != nil { - return errors.Trace(err) - } - dbInfo, ok := dom.InfoSchema().SchemaByName(model.NewCIStr(schema)) - if !ok { - return errors.Annotatef(berrors.ErrRestoreSchemaNotExists, "schema %s", schema) - } - allocs = autoid.NewAllocatorsFromTblInfo(dom.Store(), dbInfo.ID, tableInfo.Meta()) - } - - l.tableBuffers[tableID] = cdclog.NewTableBuffer(tableInfo, allocs, - l.concurrencyCfg.BatchFlushKVPairs, l.concurrencyCfg.BatchFlushKVSize) - } - // restore files - return l.restoreTables(ctx, dom) -} diff --git a/br/pkg/restore/log_client_test.go b/br/pkg/restore/log_client_test.go deleted file mode 100644 index 24f808faaf05b..0000000000000 --- a/br/pkg/restore/log_client_test.go +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. - -package restore_test - -import ( - "context" - "math" - - . "github.com/pingcap/check" - filter "github.com/pingcap/tidb-tools/pkg/table-filter" - "github.com/pingcap/tidb/br/pkg/gluetidb" - "github.com/pingcap/tidb/br/pkg/mock" - "github.com/pingcap/tidb/br/pkg/restore" - "github.com/pingcap/tidb/util/testleak" -) - -type testLogRestoreSuite struct { - mock *mock.Cluster - - client *restore.LogClient -} - -var _ = Suite(&testLogRestoreSuite{}) - -func (s *testLogRestoreSuite) SetUpSuite(c *C) { - var err error - s.mock, err = mock.NewCluster() - c.Assert(err, IsNil) - restoreClient, err := restore.NewRestoreClient( - gluetidb.New(), s.mock.PDClient, s.mock.Storage, nil, defaultKeepaliveCfg) - c.Assert(err, IsNil) - - s.client, err = restore.NewLogRestoreClient( - context.Background(), - restoreClient, - 0, - math.MaxInt64, - filter.NewSchemasFilter("test"), - 8, - 16, - 5<<20, - 16, - ) - c.Assert(err, IsNil) -} - -func (s *testLogRestoreSuite) TearDownSuite(c *C) { - testleak.AfterTest(c)() -} - -func (s *testLogRestoreSuite) TestTsInRange(c *C) { - fileName1 := "cdclog.1" - s.client.ResetTSRange(1, 2) - collected, err := s.client.NeedRestoreRowChange(fileName1) - c.Assert(err, IsNil) - c.Assert(collected, IsTrue) - - // cdclog.3 may have events in [1, 2] - // so we should collect it. - fileName2 := "cdclog.3" - s.client.ResetTSRange(1, 2) - collected, err = s.client.NeedRestoreRowChange(fileName2) - c.Assert(err, IsNil) - c.Assert(collected, IsTrue) - - fileName3 := "cdclog.3" - s.client.ResetTSRange(4, 5) - collected, err = s.client.NeedRestoreRowChange(fileName3) - c.Assert(err, IsNil) - c.Assert(collected, IsFalse) - - // format cdclog will collect, because file sink will generate cdclog for streaming write. - fileName4 := "cdclog" - collected, err = s.client.NeedRestoreRowChange(fileName4) - c.Assert(err, IsNil) - c.Assert(collected, IsTrue) - - for _, fileName := range []string{"cdclog.3.1", "cdclo.3"} { - // wrong format won't collect - collected, err = s.client.NeedRestoreRowChange(fileName) - c.Assert(err, IsNil) - c.Assert(collected, IsFalse) - } - - // format cdclog will collect, because file sink will generate cdclog for streaming write. - ddlFile := "ddl.18446744073709551615" - collected, err = s.client.NeedRestoreDDL(ddlFile) - c.Assert(err, IsNil) - c.Assert(collected, IsTrue) - - for _, fileName := range []string{"ddl", "dld.1"} { - // wrong format won't collect - collected, err = s.client.NeedRestoreDDL(fileName) - c.Assert(err, IsNil) - c.Assert(collected, IsFalse) - } - - s.client.ResetTSRange(424839867765096449, 424839886560821249) - // ddl suffix records the first event's commit ts - - // the file name include the end ts, collect it.(maxUint64 - 424839886560821249) - ddlFile = "ddl.18021904187148730366" - collected, err = s.client.NeedRestoreDDL(ddlFile) - c.Assert(err, IsNil) - c.Assert(collected, IsTrue) - - // the file name include the start ts, collect it.(maxUint64 - 424839867765096449) - ddlFile = "ddl.18021904205944455166" - collected, err = s.client.NeedRestoreDDL(ddlFile) - c.Assert(err, IsNil) - c.Assert(collected, IsTrue) - - // the file first event's ts is smaller than the start ts, collect it. - // because we only know this file's first event not in TSRange. - // FIXME find a unified logic for collection. - ddlFile = "ddl.18021904205944455167" - collected, err = s.client.NeedRestoreDDL(ddlFile) - c.Assert(err, IsNil) - c.Assert(collected, IsTrue) - - // the file first event's ts is large than end ts, skip it. - ddlFile = "ddl.18021904187148730365" - collected, err = s.client.NeedRestoreDDL(ddlFile) - c.Assert(err, IsNil) - c.Assert(collected, IsFalse) -} diff --git a/br/pkg/restore/split_client.go b/br/pkg/restore/split_client.go index e5105a56dc603..10a9913d8e683 100755 --- a/br/pkg/restore/split_client.go +++ b/br/pkg/restore/split_client.go @@ -416,6 +416,11 @@ func (c *pdClient) getMaxReplica(ctx context.Context) (int, error) { if err != nil { return 0, errors.Trace(err) } + defer func() { + if err = res.Body.Close(); err != nil { + log.Error("Response fail to close", zap.Error(err)) + } + }() var conf config.Config if err := json.NewDecoder(res.Body).Decode(&conf); err != nil { return 0, errors.Trace(err) @@ -482,11 +487,15 @@ func (c *pdClient) GetPlacementRule(ctx context.Context, groupID, ruleID string) if err != nil { return rule, errors.Trace(err) } + defer func() { + if err = res.Body.Close(); err != nil { + log.Error("Response fail to close", zap.Error(err)) + } + }() b, err := io.ReadAll(res.Body) if err != nil { return rule, errors.Trace(err) } - res.Body.Close() err = json.Unmarshal(b, &rule) if err != nil { return rule, errors.Trace(err) diff --git a/br/pkg/restore/split_test.go b/br/pkg/restore/split_test.go index 7a39785af2cb9..a4bd794f1a0a1 100644 --- a/br/pkg/restore/split_test.go +++ b/br/pkg/restore/split_test.go @@ -237,7 +237,6 @@ func (b *assertRetryLessThanBackoffer) Attempt() int { } func TestScatterFinishInTime(t *testing.T) { - t.Parallel() client := initTestClient() ranges := initRanges() rewriteRules := initRewriteRules() @@ -283,7 +282,6 @@ func TestScatterFinishInTime(t *testing.T) { // [, aay), [aay, bba), [bba, bbf), [bbf, bbh), [bbh, bbj), // [bbj, cca), [cca, xxe), [xxe, xxz), [xxz, ) func TestSplitAndScatter(t *testing.T) { - t.Parallel() client := initTestClient() ranges := initRanges() rewriteRules := initRewriteRules() diff --git a/br/pkg/restore/systable_restore.go b/br/pkg/restore/systable_restore.go index 1f7d6bb12ca9c..f6235d195a850 100644 --- a/br/pkg/restore/systable_restore.go +++ b/br/pkg/restore/systable_restore.go @@ -34,15 +34,16 @@ var unRecoverableTable = map[string]struct{}{ "global_variables": {}, // all user related tables cannot be recovered for now. - "columns_priv": {}, - "db": {}, - "default_roles": {}, - "global_grants": {}, - "global_priv": {}, - "role_edges": {}, - "tables_priv": {}, - "user": {}, - + "column_stats_usage": {}, + "columns_priv": {}, + "db": {}, + "default_roles": {}, + "global_grants": {}, + "global_priv": {}, + "role_edges": {}, + "tables_priv": {}, + "user": {}, + "capture_plan_baselines_blacklist": {}, // gc info don't need to recover. "gc_delete_range": {}, "gc_delete_range_done": {}, diff --git a/br/pkg/restore/util.go b/br/pkg/restore/util.go index f2185e05c8b5b..812d87b09cec6 100644 --- a/br/pkg/restore/util.go +++ b/br/pkg/restore/util.go @@ -133,6 +133,7 @@ func GetSSTMetaFromFile( Length: file.GetSize_(), RegionId: region.GetId(), RegionEpoch: region.GetRegionEpoch(), + CipherIv: file.GetCipherIv(), } } diff --git a/br/pkg/rtree/logging_test.go b/br/pkg/rtree/logging_test.go index f86dbb0ad1eda..9630cda766aeb 100644 --- a/br/pkg/rtree/logging_test.go +++ b/br/pkg/rtree/logging_test.go @@ -15,7 +15,6 @@ import ( ) func TestLogRanges(t *testing.T) { - t.Parallel() cases := []struct { count int expect string diff --git a/br/pkg/rtree/rtree_test.go b/br/pkg/rtree/rtree_test.go index a4630f4b8c945..a5fce76080f52 100644 --- a/br/pkg/rtree/rtree_test.go +++ b/br/pkg/rtree/rtree_test.go @@ -18,7 +18,6 @@ func newRange(start, end []byte) *rtree.Range { } func TestRangeTree(t *testing.T) { - t.Parallel() rangeTree := rtree.NewRangeTree() require.Nil(t, rangeTree.Get(newRange([]byte(""), []byte("")))) @@ -123,7 +122,6 @@ func TestRangeTree(t *testing.T) { } func TestRangeIntersect(t *testing.T) { - t.Parallel() rg := newRange([]byte("a"), []byte("c")) start, end, isIntersect := rg.Intersect([]byte(""), []byte("")) diff --git a/br/pkg/storage/gcs.go b/br/pkg/storage/gcs.go index 07ce5c8a862b9..c54141b8ee560 100644 --- a/br/pkg/storage/gcs.go +++ b/br/pkg/storage/gcs.go @@ -180,11 +180,6 @@ func (s *gcsStorage) WalkDir(ctx context.Context, opt *WalkOption, fn func(strin opt = &WalkOption{} } - maxKeys := int64(1000) - if opt.ListCount > 0 { - maxKeys = opt.ListCount - } - prefix := path.Join(s.gcs.Prefix, opt.SubDir) if len(prefix) > 0 && !strings.HasSuffix(prefix, "/") { prefix += "/" @@ -194,7 +189,7 @@ func (s *gcsStorage) WalkDir(ctx context.Context, opt *WalkOption, fn func(strin // only need each object's name and size query.SetAttrSelection([]string{"Name", "Size"}) iter := s.bucket.Objects(ctx, query) - for i := int64(0); i != maxKeys; i++ { + for { attrs, err := iter.Next() if err == iterator.Done { break @@ -281,14 +276,6 @@ func newGCSStorage(ctx context.Context, gcs *backuppb.GCS, opts *ExternalStorage // so we need find sst in slash directory gcs.Prefix += "//" } - // TODO remove it after BR remove cfg skip-check-path - if !opts.SkipCheckPath { - // check bucket exists - _, err = bucket.Attrs(ctx) - if err != nil { - return nil, errors.Annotatef(err, "gcs://%s/%s", gcs.Bucket, gcs.Prefix) - } - } return &gcsStorage{gcs: gcs, bucket: bucket}, nil } diff --git a/br/pkg/storage/gcs_test.go b/br/pkg/storage/gcs_test.go index c3e63d6d410a2..ccf3927497bea 100644 --- a/br/pkg/storage/gcs_test.go +++ b/br/pkg/storage/gcs_test.go @@ -4,6 +4,7 @@ package storage import ( "context" + "fmt" "io" "os" @@ -95,6 +96,31 @@ func (r *testStorageSuite) TestGCS(c *C) { c.Assert(list, Equals, "keykey1key2") c.Assert(totalSize, Equals, int64(42)) + // test 1003 files + totalSize = 0 + for i := 0; i < 1000; i += 1 { + err = stg.WriteFile(ctx, fmt.Sprintf("f%d", i), []byte("data")) + c.Assert(err, IsNil) + } + filesSet := make(map[string]struct{}, 1003) + err = stg.WalkDir(ctx, nil, func(name string, size int64) error { + filesSet[name] = struct{}{} + totalSize += size + return nil + }) + c.Assert(err, IsNil) + c.Assert(totalSize, Equals, int64(42+4000)) + _, ok := filesSet["key"] + c.Assert(ok, IsTrue) + _, ok = filesSet["key1"] + c.Assert(ok, IsTrue) + _, ok = filesSet["key2"] + c.Assert(ok, IsTrue) + for i := 0; i < 1000; i += 1 { + _, ok = filesSet[fmt.Sprintf("f%d", i)] + c.Assert(ok, IsTrue) + } + efr, err := stg.Open(ctx, "key2") c.Assert(err, IsNil) diff --git a/br/pkg/storage/hdfs.go b/br/pkg/storage/hdfs.go new file mode 100644 index 0000000000000..cbcc24088292f --- /dev/null +++ b/br/pkg/storage/hdfs.go @@ -0,0 +1,126 @@ +// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +package storage + +import ( + "bytes" + "context" + "fmt" + "os" + "os/exec" + "path/filepath" + + "github.com/pingcap/errors" + berrors "github.com/pingcap/tidb/br/pkg/errors" +) + +// HDFSStorage represents HDFS storage. +type HDFSStorage struct { + remote string +} + +func NewHDFSStorage(remote string) *HDFSStorage { + return &HDFSStorage{ + remote: remote, + } +} + +func getHdfsBin() (string, error) { + hadoop_home, ok := os.LookupEnv("HADOOP_HOME") + if !ok { + return "", errors.Annotatef(berrors.ErrEnvNotSpecified, "please specify environment variable HADOOP_HOME") + } + return filepath.Join(hadoop_home, "bin/hdfs"), nil +} + +func getLinuxUser() (string, bool) { + return os.LookupEnv("HADOOP_LINUX_USER") +} + +func dfsCommand(args ...string) (*exec.Cmd, error) { + bin, err := getHdfsBin() + if err != nil { + return nil, err + } + cmd := []string{} + user, ok := getLinuxUser() + if ok { + cmd = append(cmd, "sudo", "-u", user) + } + cmd = append(cmd, bin, "dfs") + cmd = append(cmd, args...) + return exec.Command(cmd[0], cmd[1:]...), nil +} + +// WriteFile writes a complete file to storage, similar to os.WriteFile +func (s *HDFSStorage) WriteFile(ctx context.Context, name string, data []byte) error { + file_path := fmt.Sprintf("%s/%s", s.remote, name) + cmd, err := dfsCommand("-put", "-", file_path) + if err != nil { + return err + } + + buf := bytes.Buffer{} + buf.Write(data) + cmd.Stdin = &buf + + out, err := cmd.CombinedOutput() + if err != nil { + return errors.Annotate(err, string(out)) + } + return nil +} + +// ReadFile reads a complete file from storage, similar to os.ReadFile +func (s *HDFSStorage) ReadFile(ctx context.Context, name string) ([]byte, error) { + return nil, errors.Annotatef(berrors.ErrUnsupportedOperation, "currently HDFS backend only support rawkv backup") +} + +// FileExists return true if file exists +func (s *HDFSStorage) FileExists(ctx context.Context, name string) (bool, error) { + file_path := fmt.Sprintf("%s/%s", s.remote, name) + cmd, err := dfsCommand("-ls", file_path) + if err != nil { + return false, err + } + out, err := cmd.CombinedOutput() + if _, ok := err.(*exec.ExitError); ok { + // Successfully exit with non-zero value + return false, nil + } + if err != nil { + return false, errors.Annotate(err, string(out)) + } + // Successfully exit with zero value + return true, nil +} + +// DeleteFile delete the file in storage +func (s *HDFSStorage) DeleteFile(ctx context.Context, name string) error { + return errors.Annotatef(berrors.ErrUnsupportedOperation, "currently HDFS backend only support rawkv backup") +} + +// Open a Reader by file path. path is relative path to storage base path +func (s *HDFSStorage) Open(ctx context.Context, path string) (ExternalFileReader, error) { + return nil, errors.Annotatef(berrors.ErrUnsupportedOperation, "currently HDFS backend only support rawkv backup") +} + +// WalkDir traverse all the files in a dir. +// +// fn is the function called for each regular file visited by WalkDir. +// The argument `path` is the file path that can be used in `Open` +// function; the argument `size` is the size in byte of the file determined +// by path. +func (s *HDFSStorage) WalkDir(ctx context.Context, opt *WalkOption, fn func(path string, size int64) error) error { + return errors.Annotatef(berrors.ErrUnsupportedOperation, "currently HDFS backend only support rawkv backup") +} + +// URI returns the base path as a URI +func (s *HDFSStorage) URI() string { + return s.remote +} + +// Create opens a file writer by path. path is relative path to storage base path +func (s *HDFSStorage) Create(ctx context.Context, path string) (ExternalFileWriter, error) { + return nil, errors.Annotatef(berrors.ErrUnsupportedOperation, "currently HDFS backend only support rawkv backup") +} diff --git a/br/pkg/storage/local_unix.go b/br/pkg/storage/local_unix.go index 008cbac8e2562..2dfb89deab476 100644 --- a/br/pkg/storage/local_unix.go +++ b/br/pkg/storage/local_unix.go @@ -1,5 +1,6 @@ // Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. +//go:build !windows // +build !windows package storage diff --git a/br/pkg/storage/local_windows.go b/br/pkg/storage/local_windows.go index d221cc8340f9c..fc79722f34bf4 100644 --- a/br/pkg/storage/local_windows.go +++ b/br/pkg/storage/local_windows.go @@ -1,5 +1,6 @@ // Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. +//go:build windows // +build windows package storage diff --git a/br/pkg/storage/parse.go b/br/pkg/storage/parse.go index 0c7fd8ac62e4f..d5c7e5edec48d 100644 --- a/br/pkg/storage/parse.go +++ b/br/pkg/storage/parse.go @@ -57,6 +57,10 @@ func ParseBackend(rawURL string, options *BackendOptions) (*backuppb.StorageBack local := &backuppb.Local{Path: u.Path} return &backuppb.StorageBackend{Backend: &backuppb.StorageBackend_Local{Local: local}}, nil + case "hdfs": + hdfs := &backuppb.HDFS{Remote: rawURL} + return &backuppb.StorageBackend{Backend: &backuppb.StorageBackend_Hdfs{Hdfs: hdfs}}, nil + case "noop": noop := &backuppb.Noop{} return &backuppb.StorageBackend{Backend: &backuppb.StorageBackend_Noop{Noop: noop}}, nil diff --git a/br/pkg/storage/parse_test.go b/br/pkg/storage/parse_test.go index 64c42700bb024..fc3ee47a095b7 100644 --- a/br/pkg/storage/parse_test.go +++ b/br/pkg/storage/parse_test.go @@ -39,6 +39,10 @@ func (r *testStorageSuite) TestCreateStorage(c *C) { c.Assert(err, IsNil) c.Assert(s.GetNoop(), NotNil) + s, err = ParseBackend("hdfs://127.0.0.1:1231/backup", nil) + c.Assert(err, IsNil) + c.Assert(s.GetHdfs().GetRemote(), Equals, "hdfs://127.0.0.1:1231/backup") + _, err = ParseBackend("s3:///bucket/more/prefix/", &BackendOptions{}) c.Assert(err, ErrorMatches, `please specify the bucket for s3 in s3:///bucket/more/prefix/.*`) diff --git a/br/pkg/storage/s3.go b/br/pkg/storage/s3.go index 2c07b5af2cad0..6accafee7363d 100644 --- a/br/pkg/storage/s3.go +++ b/br/pkg/storage/s3.go @@ -283,14 +283,6 @@ func newS3Storage(backend *backuppb.S3, opts *ExternalStorageOptions) (*S3Storag } c := s3.New(ses) - // TODO remove it after BR remove cfg skip-check-path - if !opts.SkipCheckPath { - err = checkS3Bucket(c, &qs) - if err != nil { - return nil, errors.Annotatef(berrors.ErrStorageInvalidConfig, "Bucket %s is not accessible: %v", qs.Bucket, err) - } - } - if len(qs.Prefix) > 0 && !strings.HasSuffix(qs.Prefix, "/") { qs.Prefix += "/" } diff --git a/br/pkg/storage/s3_test.go b/br/pkg/storage/s3_test.go index 413f5e8881da1..cf30828b07c65 100644 --- a/br/pkg/storage/s3_test.go +++ b/br/pkg/storage/s3_test.go @@ -288,7 +288,6 @@ func (s *s3Suite) TestS3Storage(c *C) { _, err := New(ctx, s3, &ExternalStorageOptions{ SendCredentials: test.sendCredential, CheckPermissions: test.hackPermission, - SkipCheckPath: true, }) if test.errReturn { c.Assert(err, NotNil) @@ -414,7 +413,7 @@ func (s *s3Suite) TestS3Storage(c *C) { func (s *s3Suite) TestS3URI(c *C) { backend, err := ParseBackend("s3://bucket/prefix/", nil) c.Assert(err, IsNil) - storage, err := New(context.Background(), backend, &ExternalStorageOptions{SkipCheckPath: true}) + storage, err := New(context.Background(), backend, &ExternalStorageOptions{}) c.Assert(err, IsNil) c.Assert(storage.URI(), Equals, "s3://bucket/prefix/") } diff --git a/br/pkg/storage/storage.go b/br/pkg/storage/storage.go index 427e625795533..177656fc378a0 100644 --- a/br/pkg/storage/storage.go +++ b/br/pkg/storage/storage.go @@ -121,18 +121,6 @@ type ExternalStorageOptions struct { // NoCredentials means that no cloud credentials are supplied to BR NoCredentials bool - // SkipCheckPath marks whether to skip checking path's existence. - // - // This should only be set to true in testing, to avoid interacting with the - // real world. - // When this field is false (i.e. path checking is enabled), the New() - // function will ensure the path referred by the backend exists by - // recursively creating the folders. This will also throw an error if such - // operation is impossible (e.g. when the bucket storing the path is missing). - - // deprecated: use checkPermissions and specify the checkPermission instead. - SkipCheckPath bool - // HTTPClient to use. The created storage may ignore this field if it is not // directly using HTTP (e.g. the local storage). HTTPClient *http.Client @@ -148,7 +136,6 @@ type ExternalStorageOptions struct { func Create(ctx context.Context, backend *backuppb.StorageBackend, sendCreds bool) (ExternalStorage, error) { return New(ctx, backend, &ExternalStorageOptions{ SendCredentials: sendCreds, - SkipCheckPath: false, HTTPClient: nil, }) } @@ -161,6 +148,11 @@ func New(ctx context.Context, backend *backuppb.StorageBackend, opts *ExternalSt return nil, errors.Annotate(berrors.ErrStorageInvalidConfig, "local config not found") } return NewLocalStorage(backend.Local.Path) + case *backuppb.StorageBackend_Hdfs: + if backend.Hdfs == nil { + return nil, errors.Annotate(berrors.ErrStorageInvalidConfig, "hdfs config not found") + } + return NewHDFSStorage(backend.Hdfs.Remote), nil case *backuppb.StorageBackend_S3: if backend.S3 == nil { return nil, errors.Annotate(berrors.ErrStorageInvalidConfig, "s3 config not found") diff --git a/br/pkg/summary/collector_test.go b/br/pkg/summary/collector_test.go index c2328ee7c2c98..d706b985343f1 100644 --- a/br/pkg/summary/collector_test.go +++ b/br/pkg/summary/collector_test.go @@ -11,8 +11,6 @@ import ( ) func TestSumDurationInt(t *testing.T) { - t.Parallel() - fields := []zap.Field{} logger := func(msg string, fs ...zap.Field) { fields = append(fields, fs...) diff --git a/br/pkg/task/backup.go b/br/pkg/task/backup.go index 2902da7cf9040..87461f53bab74 100644 --- a/br/pkg/task/backup.go +++ b/br/pkg/task/backup.go @@ -257,7 +257,6 @@ func RunBackup(c context.Context, g glue.Glue, cmdName string, cfg *BackupConfig opts := storage.ExternalStorageOptions{ NoCredentials: cfg.NoCreds, SendCredentials: cfg.SendCreds, - SkipCheckPath: cfg.SkipCheckPath, } if err = client.SetStorage(ctx, u, &opts); err != nil { return errors.Trace(err) @@ -316,6 +315,7 @@ func RunBackup(c context.Context, g glue.Glue, cmdName string, cfg *BackupConfig Concurrency: defaultBackupConcurrency, CompressionType: cfg.CompressionType, CompressionLevel: cfg.CompressionLevel, + CipherInfo: &cfg.CipherInfo, } brVersion := g.GetVersion() clusterVersion, err := mgr.GetClusterVersion(ctx) @@ -329,7 +329,8 @@ func RunBackup(c context.Context, g glue.Glue, cmdName string, cfg *BackupConfig } // Metafile size should be less than 64MB. - metawriter := metautil.NewMetaWriter(client.GetStorage(), metautil.MetaFileSize, cfg.UseBackupMetaV2) + metawriter := metautil.NewMetaWriter(client.GetStorage(), + metautil.MetaFileSize, cfg.UseBackupMetaV2, &cfg.CipherInfo) // Hack way to update backupmeta. metawriter.Update(func(m *backuppb.BackupMeta) { m.StartVersion = req.StartVersion @@ -466,7 +467,7 @@ func RunBackup(c context.Context, g glue.Glue, cmdName string, cfg *BackupConfig if !skipChecksum { // Check if checksum from files matches checksum from coprocessor. - err = checksum.FastChecksum(ctx, metawriter.Backupmeta(), client.GetStorage()) + err = checksum.FastChecksum(ctx, metawriter.Backupmeta(), client.GetStorage(), &cfg.CipherInfo) if err != nil { return errors.Trace(err) } diff --git a/br/pkg/task/backup_raw.go b/br/pkg/task/backup_raw.go index 56b6512d856b5..febe151218706 100644 --- a/br/pkg/task/backup_raw.go +++ b/br/pkg/task/backup_raw.go @@ -150,7 +150,6 @@ func RunBackupRaw(c context.Context, g glue.Glue, cmdName string, cfg *RawKvConf opts := storage.ExternalStorageOptions{ NoCredentials: cfg.NoCreds, SendCredentials: cfg.SendCreds, - SkipCheckPath: cfg.SkipCheckPath, } if err = client.SetStorage(ctx, u, &opts); err != nil { return errors.Trace(err) @@ -210,8 +209,9 @@ func RunBackupRaw(c context.Context, g glue.Glue, cmdName string, cfg *RawKvConf Cf: cfg.CF, CompressionType: cfg.CompressionType, CompressionLevel: cfg.CompressionLevel, + CipherInfo: &cfg.CipherInfo, } - metaWriter := metautil.NewMetaWriter(client.GetStorage(), metautil.MetaFileSize, false) + metaWriter := metautil.NewMetaWriter(client.GetStorage(), metautil.MetaFileSize, false, &cfg.CipherInfo) metaWriter.StartWriteMetasAsync(ctx, metautil.AppendDataFile) err = client.BackupRange(ctx, backupRange.StartKey, backupRange.EndKey, req, metaWriter, progressCallBack) if err != nil { diff --git a/br/pkg/task/common.go b/br/pkg/task/common.go index c956936e86c50..357c7d267e449 100644 --- a/br/pkg/task/common.go +++ b/br/pkg/task/common.go @@ -3,9 +3,12 @@ package task import ( + "bytes" "context" "crypto/tls" + "encoding/hex" "net/url" + "os" "path" "strings" "time" @@ -15,11 +18,13 @@ import ( "github.com/gogo/protobuf/proto" "github.com/pingcap/errors" backuppb "github.com/pingcap/kvproto/pkg/brpb" + "github.com/pingcap/kvproto/pkg/encryptionpb" "github.com/pingcap/log" filter "github.com/pingcap/tidb-tools/pkg/table-filter" "github.com/pingcap/tidb/br/pkg/conn" berrors "github.com/pingcap/tidb/br/pkg/errors" "github.com/pingcap/tidb/br/pkg/glue" + "github.com/pingcap/tidb/br/pkg/metautil" "github.com/pingcap/tidb/br/pkg/storage" "github.com/pingcap/tidb/br/pkg/utils" "github.com/pingcap/tidb/sessionctx/variable" @@ -72,7 +77,14 @@ const ( defaultGRPCKeepaliveTime = 10 * time.Second defaultGRPCKeepaliveTimeout = 3 * time.Second - unlimited = 0 + flagCipherType = "crypter.method" + flagCipherKey = "crypter.key" + flagCipherKeyFile = "crypter.key-file" + + unlimited = 0 + crypterAES128KeyLen = 16 + crypterAES192KeyLen = 24 + crypterAES256KeyLen = 32 ) // TLSConfig is the common configuration for TLS connection. @@ -101,6 +113,12 @@ func (tls *TLSConfig) ToTLSConfig() (*tls.Config, error) { return tlsConfig, nil } +// ParseFromFlags parses the TLS config from the flag set. +func (tls *TLSConfig) ParseFromFlags(flags *pflag.FlagSet) (err error) { + tls.CA, tls.Cert, tls.Key, err = ParseTLSTripleFromFlags(flags) + return +} + // Config is the common configuration for all BRIE tasks. type Config struct { storage.BackendOptions @@ -148,6 +166,8 @@ type Config struct { GRPCKeepaliveTime time.Duration `json:"grpc-keepalive-time" toml:"grpc-keepalive-time"` // GrpcKeepaliveTimeout is the max time a grpc conn can keep idel before killed. GRPCKeepaliveTimeout time.Duration `json:"grpc-keepalive-timeout" toml:"grpc-keepalive-timeout"` + + CipherInfo backuppb.CipherInfo `json:"-" toml:"-"` } // DefineCommonFlags defines the flags common to all BRIE commands. @@ -195,6 +215,14 @@ func DefineCommonFlags(flags *pflag.FlagSet) { flags.BoolP(flagSkipCheckPath, "", false, "Skip path verification") _ = flags.MarkHidden(flagSkipCheckPath) + flags.String(flagCipherType, "plaintext", "Encrypt/decrypt method, "+ + "be one of plaintext|aes128-ctr|aes192-ctr|aes256-ctr case-insensitively, "+ + "\"plaintext\" represents no encrypt/decrypt") + flags.String(flagCipherKey, "", + "aes-crypter key, used to encrypt/decrypt the data "+ + "by the hexadecimal string, eg: \"0123456789abcdef0123456789abcdef\"") + flags.String(flagCipherKeyFile, "", "FilePath, its content is used as the cipher-key") + storage.DefineFlags(flags) } @@ -218,13 +246,6 @@ func DefineFilterFlags(command *cobra.Command, defaultFilter []string) { flags.Bool(flagCaseSensitive, false, "whether the table names used in --filter should be case-sensitive") } -// ParseFromFlags parses the TLS config from the flag set. -func (tls *TLSConfig) ParseFromFlags(flags *pflag.FlagSet) error { - var err error - tls.CA, tls.Cert, tls.Key, err = ParseTLSTripleFromFlags(flags) - return err -} - // ParseTLSTripleFromFlags parses the (ca, cert, key) triple from flags. func ParseTLSTripleFromFlags(flags *pflag.FlagSet) (ca, cert, key string, err error) { ca, err = flags.GetString(flagCA) @@ -242,6 +263,104 @@ func ParseTLSTripleFromFlags(flags *pflag.FlagSet) (ca, cert, key string, err er return } +func parseCipherType(t string) (encryptionpb.EncryptionMethod, error) { + ct := encryptionpb.EncryptionMethod_UNKNOWN + switch t { + case "plaintext", "PLAINTEXT": + ct = encryptionpb.EncryptionMethod_PLAINTEXT + case "aes128-ctr", "AES128-CTR": + ct = encryptionpb.EncryptionMethod_AES128_CTR + case "aes192-ctr", "AES192-CTR": + ct = encryptionpb.EncryptionMethod_AES192_CTR + case "aes256-ctr", "AES256-CTR": + ct = encryptionpb.EncryptionMethod_AES256_CTR + default: + return ct, errors.Annotatef(berrors.ErrInvalidArgument, "invalid crypter method '%s'", t) + } + + return ct, nil +} + +func checkCipherKey(cipherKey, cipherKeyFile string) error { + if (len(cipherKey) == 0) == (len(cipherKeyFile) == 0) { + return errors.Annotate(berrors.ErrInvalidArgument, + "exactly one of --crypter.key or --crypter.key-file should be provided") + } + return nil +} + +func getCipherKeyContent(cipherKey, cipherKeyFile string) ([]byte, error) { + if err := checkCipherKey(cipherKey, cipherKeyFile); err != nil { + return nil, errors.Trace(err) + } + + // if cipher-key is valid, convert the hexadecimal string to bytes + if len(cipherKey) > 0 { + return hex.DecodeString(cipherKey) + } + + // convert the content(as hexadecimal string) from cipher-file to bytes + content, err := os.ReadFile(cipherKeyFile) + if err != nil { + return nil, errors.Annotate(err, "failed to read cipher file") + } + + content = bytes.TrimSuffix(content, []byte("\n")) + return hex.DecodeString(string(content)) +} + +func checkCipherKeyMatch(cipher *backuppb.CipherInfo) bool { + switch cipher.CipherType { + case encryptionpb.EncryptionMethod_PLAINTEXT: + return true + case encryptionpb.EncryptionMethod_AES128_CTR: + return len(cipher.CipherKey) == crypterAES128KeyLen + case encryptionpb.EncryptionMethod_AES192_CTR: + return len(cipher.CipherKey) == crypterAES192KeyLen + case encryptionpb.EncryptionMethod_AES256_CTR: + return len(cipher.CipherKey) == crypterAES256KeyLen + default: + return false + } +} + +func (cfg *Config) parseCipherInfo(flags *pflag.FlagSet) error { + crypterStr, err := flags.GetString(flagCipherType) + if err != nil { + return errors.Trace(err) + } + + cfg.CipherInfo.CipherType, err = parseCipherType(crypterStr) + if err != nil { + return errors.Trace(err) + } + + if cfg.CipherInfo.CipherType == encryptionpb.EncryptionMethod_PLAINTEXT { + return nil + } + + key, err := flags.GetString(flagCipherKey) + if err != nil { + return errors.Trace(err) + } + + keyFilePath, err := flags.GetString(flagCipherKeyFile) + if err != nil { + return errors.Trace(err) + } + + cfg.CipherInfo.CipherKey, err = getCipherKeyContent(key, keyFilePath) + if err != nil { + return errors.Trace(err) + } + + if !checkCipherKeyMatch(&cfg.CipherInfo) { + return errors.Annotate(berrors.ErrInvalidArgument, "crypter method and key length not match") + } + + return nil +} + func (cfg *Config) normalizePDURLs() error { for i := range cfg.PD { var err error @@ -366,6 +485,14 @@ func (cfg *Config) ParseFromFlags(flags *pflag.FlagSet) error { if cfg.SkipCheckPath, err = flags.GetBool(flagSkipCheckPath); err != nil { return errors.Trace(err) } + if cfg.SkipCheckPath { + log.L().Info("--skip-check-path is deprecated, need explicitly set it anymore") + } + + if err = cfg.parseCipherInfo(flags); err != nil { + return errors.Trace(err) + } + return cfg.normalizePDURLs() } @@ -424,7 +551,6 @@ func storageOpts(cfg *Config) *storage.ExternalStorageOptions { return &storage.ExternalStorageOptions{ NoCredentials: cfg.NoCreds, SendCredentials: cfg.SendCreds, - SkipCheckPath: cfg.SkipCheckPath, } } @@ -461,9 +587,21 @@ func ReadBackupMeta( return nil, nil, nil, errors.Annotate(err, "load backupmeta failed") } } + + // the prefix of backupmeta file is iv(16 bytes) if encryption method is valid + var iv []byte + if cfg.CipherInfo.CipherType != encryptionpb.EncryptionMethod_PLAINTEXT { + iv = metaData[:metautil.CrypterIvLen] + } + decryptBackupMeta, err := metautil.Decrypt(metaData[len(iv):], &cfg.CipherInfo, iv) + if err != nil { + return nil, nil, nil, errors.Annotate(err, "decrypt failed with wrong key") + } + backupMeta := &backuppb.BackupMeta{} - if err = proto.Unmarshal(metaData, backupMeta); err != nil { - return nil, nil, nil, errors.Annotate(err, "parse backupmeta failed") + if err = proto.Unmarshal(decryptBackupMeta, backupMeta); err != nil { + return nil, nil, nil, errors.Annotate(err, + "parse backupmeta failed because of wrong aes cipher") } return u, s, backupMeta, nil } diff --git a/br/pkg/task/common_test.go b/br/pkg/task/common_test.go index 49bd3cabd0811..6d3baea1bfbbd 100644 --- a/br/pkg/task/common_test.go +++ b/br/pkg/task/common_test.go @@ -3,9 +3,12 @@ package task import ( + "encoding/hex" "fmt" . "github.com/pingcap/check" + backuppb "github.com/pingcap/kvproto/pkg/brpb" + "github.com/pingcap/kvproto/pkg/encryptionpb" "github.com/pingcap/tidb/config" "github.com/spf13/pflag" ) @@ -62,3 +65,99 @@ func (s *testCommonSuite) TestStripingPDURL(c *C) { c.Assert(err, IsNil) c.Assert(noChange, Equals, "127.0.0.1:2379") } + +func (s *testCommonSuite) TestCheckCipherKeyMatch(c *C) { + testCases := []struct { + CipherType encryptionpb.EncryptionMethod + CipherKey string + ok bool + }{ + { + CipherType: encryptionpb.EncryptionMethod_PLAINTEXT, + ok: true, + }, + { + CipherType: encryptionpb.EncryptionMethod_UNKNOWN, + ok: false, + }, + { + CipherType: encryptionpb.EncryptionMethod_AES128_CTR, + CipherKey: "0123456789abcdef0123456789abcdef", + ok: true, + }, + { + CipherType: encryptionpb.EncryptionMethod_AES128_CTR, + CipherKey: "0123456789abcdef0123456789abcd", + ok: false, + }, + { + CipherType: encryptionpb.EncryptionMethod_AES192_CTR, + CipherKey: "0123456789abcdef0123456789abcdef0123456789abcdef", + ok: true, + }, + { + CipherType: encryptionpb.EncryptionMethod_AES192_CTR, + CipherKey: "0123456789abcdef0123456789abcdef0123456789abcdefff", + ok: false, + }, + { + CipherType: encryptionpb.EncryptionMethod_AES256_CTR, + CipherKey: "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef", + ok: true, + }, + { + CipherType: encryptionpb.EncryptionMethod_AES256_CTR, + CipherKey: "", + ok: false, + }, + } + + for _, t := range testCases { + cipherKey, err := hex.DecodeString(t.CipherKey) + c.Assert(err, IsNil) + + r := checkCipherKeyMatch(&backuppb.CipherInfo{ + CipherType: t.CipherType, + CipherKey: cipherKey, + }) + c.Assert(r, Equals, t.ok) + } +} + +func (s *testCommonSuite) TestCheckCipherKey(c *C) { + cases := []struct { + cipherKey string + keyFile string + ok bool + }{ + { + cipherKey: "0123456789abcdef0123456789abcdef", + keyFile: "", + ok: true, + }, + { + cipherKey: "0123456789abcdef0123456789abcdef", + keyFile: "/tmp/abc", + ok: false, + }, + { + cipherKey: "", + keyFile: "/tmp/abc", + ok: true, + }, + { + cipherKey: "", + keyFile: "", + ok: false, + }, + } + + for _, t := range cases { + err := checkCipherKey(t.cipherKey, t.keyFile) + if t.ok { + c.Assert(err, IsNil) + } else { + c.Assert(err, NotNil) + } + } +} diff --git a/br/pkg/task/restore.go b/br/pkg/task/restore.go index bce5b78d38390..0f3347fd1d337 100644 --- a/br/pkg/task/restore.go +++ b/br/pkg/task/restore.go @@ -265,12 +265,12 @@ func RunRestore(c context.Context, g glue.Glue, cmdName string, cfg *RestoreConf opts := storage.ExternalStorageOptions{ NoCredentials: cfg.NoCreds, SendCredentials: cfg.SendCreds, - SkipCheckPath: cfg.SkipCheckPath, } if err = client.SetStorage(ctx, u, &opts); err != nil { return errors.Trace(err) } client.SetRateLimit(cfg.RateLimit) + client.SetCrypter(&cfg.CipherInfo) client.SetConcurrency(uint(cfg.Concurrency)) if cfg.Online { client.EnableOnline() @@ -295,7 +295,7 @@ func RunRestore(c context.Context, g glue.Glue, cmdName string, cfg *RestoreConf return errors.Trace(versionErr) } } - reader := metautil.NewMetaReader(backupMeta, s) + reader := metautil.NewMetaReader(backupMeta, s, &cfg.CipherInfo) if err = client.InitBackupMeta(c, backupMeta, u, s, reader); err != nil { return errors.Trace(err) } @@ -496,7 +496,7 @@ func dropToBlackhole( outCh := make(chan struct{}, 1) go func() { defer func() { - outCh <- struct{}{} + close(outCh) }() for { select { diff --git a/br/pkg/task/restore_log.go b/br/pkg/task/restore_log.go deleted file mode 100644 index 26a8bdae0add0..0000000000000 --- a/br/pkg/task/restore_log.go +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. - -package task - -import ( - "context" - - "github.com/pingcap/errors" - "github.com/pingcap/tidb/br/pkg/glue" - "github.com/pingcap/tidb/br/pkg/restore" - "github.com/pingcap/tidb/br/pkg/storage" - "github.com/spf13/cobra" - "github.com/spf13/pflag" -) - -const ( - flagStartTS = "start-ts" - flagEndTS = "end-ts" - flagBatchWriteCount = "write-kvs" - flagBatchFlushCount = "flush-kvs" - - // represents kv flush to storage for each table. - defaultFlushKV = 5120 - // represents kv size flush to storage for each table. - defaultFlushKVSize = 5 << 20 - // represents kv that write to TiKV once at at time. - defaultWriteKV = 1280 -) - -// LogRestoreConfig is the configuration specific for restore tasks. -type LogRestoreConfig struct { - Config - - StartTS uint64 - EndTS uint64 - - BatchFlushKVPairs int - BatchFlushKVSize int64 - BatchWriteKVPairs int -} - -// DefineLogRestoreFlags defines common flags for the backup command. -func DefineLogRestoreFlags(command *cobra.Command) { - command.Flags().Uint64P(flagStartTS, "", 0, "restore log start ts") - command.Flags().Uint64P(flagEndTS, "", 0, "restore log end ts") - - command.Flags().Uint64P(flagBatchWriteCount, "", 0, "the kv count that write to TiKV once at a time") - command.Flags().Uint64P(flagBatchFlushCount, "", 0, "the kv count that flush from memory to TiKV") -} - -// ParseFromFlags parses the restore-related flags from the flag set. -func (cfg *LogRestoreConfig) ParseFromFlags(flags *pflag.FlagSet) error { - var err error - cfg.StartTS, err = flags.GetUint64(flagStartTS) - if err != nil { - return errors.Trace(err) - } - cfg.EndTS, err = flags.GetUint64(flagEndTS) - if err != nil { - return errors.Trace(err) - } - err = cfg.Config.ParseFromFlags(flags) - if err != nil { - return errors.Trace(err) - } - return nil -} - -// adjustRestoreConfig is use for BR(binary) and BR in TiDB. -// When new config was add and not included in parser. -// we should set proper value in this function. -// so that both binary and TiDB will use same default value. -func (cfg *LogRestoreConfig) adjustRestoreConfig() { - cfg.adjust() - - if cfg.Config.Concurrency == 0 { - cfg.Config.Concurrency = defaultRestoreConcurrency - } - if cfg.BatchFlushKVPairs == 0 { - cfg.BatchFlushKVPairs = defaultFlushKV - } - if cfg.BatchWriteKVPairs == 0 { - cfg.BatchWriteKVPairs = defaultWriteKV - } - if cfg.BatchFlushKVSize == 0 { - cfg.BatchFlushKVSize = defaultFlushKVSize - } - // write kv count doesn't have to excceed flush kv count. - if cfg.BatchWriteKVPairs > cfg.BatchFlushKVPairs { - cfg.BatchWriteKVPairs = cfg.BatchFlushKVPairs - } -} - -// RunLogRestore starts a restore task inside the current goroutine. -func RunLogRestore(c context.Context, g glue.Glue, cfg *LogRestoreConfig) error { - cfg.adjustRestoreConfig() - - ctx, cancel := context.WithCancel(c) - defer cancel() - - // Restore needs domain to do DDL. - needDomain := true - mgr, err := NewMgr(ctx, g, cfg.PD, cfg.TLS, GetKeepalive(&cfg.Config), cfg.CheckRequirements, needDomain) - if err != nil { - return errors.Trace(err) - } - defer mgr.Close() - - u, err := storage.ParseBackend(cfg.Storage, &cfg.BackendOptions) - if err != nil { - return errors.Trace(err) - } - keepaliveCfg := GetKeepalive(&cfg.Config) - keepaliveCfg.PermitWithoutStream = true - client, err := restore.NewRestoreClient(g, mgr.GetPDClient(), mgr.GetStorage(), mgr.GetTLSConfig(), keepaliveCfg) - if err != nil { - return errors.Trace(err) - } - defer client.Close() - - opts := storage.ExternalStorageOptions{ - NoCredentials: cfg.NoCreds, - SendCredentials: cfg.SendCreds, - SkipCheckPath: cfg.SkipCheckPath, - } - if err = client.SetStorage(ctx, u, &opts); err != nil { - return errors.Trace(err) - } - - err = client.LoadRestoreStores(ctx) - if err != nil { - return errors.Trace(err) - } - - logClient, err := restore.NewLogRestoreClient( - ctx, client, cfg.StartTS, cfg.EndTS, cfg.TableFilter, uint(cfg.Concurrency), - cfg.BatchFlushKVPairs, cfg.BatchFlushKVSize, cfg.BatchWriteKVPairs) - if err != nil { - return errors.Trace(err) - } - - return logClient.RestoreLogData(ctx, mgr.GetDomain()) -} diff --git a/br/pkg/task/restore_raw.go b/br/pkg/task/restore_raw.go index c4d636cafecbb..bb1dfddc9ce2d 100644 --- a/br/pkg/task/restore_raw.go +++ b/br/pkg/task/restore_raw.go @@ -81,6 +81,7 @@ func RunRestoreRaw(c context.Context, g glue.Glue, cmdName string, cfg *RestoreR } defer client.Close() client.SetRateLimit(cfg.RateLimit) + client.SetCrypter(&cfg.CipherInfo) client.SetConcurrency(uint(cfg.Concurrency)) if cfg.Online { client.EnableOnline() @@ -91,7 +92,7 @@ func RunRestoreRaw(c context.Context, g glue.Glue, cmdName string, cfg *RestoreR if err != nil { return errors.Trace(err) } - reader := metautil.NewMetaReader(backupMeta, s) + reader := metautil.NewMetaReader(backupMeta, s, &cfg.CipherInfo) if err = client.InitBackupMeta(c, backupMeta, u, s, reader); err != nil { return errors.Trace(err) } diff --git a/br/pkg/trace/tracing_serial_test.go b/br/pkg/trace/tracing_serial_test.go index 89adbdc7783c4..540c73eb38d64 100644 --- a/br/pkg/trace/tracing_serial_test.go +++ b/br/pkg/trace/tracing_serial_test.go @@ -20,7 +20,7 @@ func jobA(ctx context.Context) { ctx = opentracing.ContextWithSpan(ctx, span1) } jobB(ctx) - time.Sleep(10 * time.Millisecond) + time.Sleep(100 * time.Millisecond) } func jobB(ctx context.Context) { @@ -28,7 +28,7 @@ func jobB(ctx context.Context) { span1 := span.Tracer().StartSpan("jobB", opentracing.ChildOf(span.Context())) defer span1.Finish() } - time.Sleep(10 * time.Millisecond) + time.Sleep(100 * time.Millisecond) } func TestSpan(t *testing.T) { @@ -46,7 +46,7 @@ func TestSpan(t *testing.T) { require.NoError(t, err) s := string(content) // possible result: - // "jobA 22:02:02.545296 20.621764ms\n" - // " └─jobB 22:02:02.545297 10.293444ms\n" - require.Regexp(t, `jobA.*2[0-9]\.[0-9]+ms\n └─jobB.*1[0-9]\.[0-9]+ms\n`, s) + // "jobA 22:02:02.545296 200.621764ms\n" + // " └─jobB 22:02:02.545297 100.293444ms\n" + require.Regexp(t, `^jobA.*20[0-9]\.[0-9]+ms\n └─jobB.*10[0-9]\.[0-9]+ms\n$`, s) } diff --git a/br/pkg/utils/backoff_test.go b/br/pkg/utils/backoff_test.go index 7bb345347ccd1..9ee312f24feab 100644 --- a/br/pkg/utils/backoff_test.go +++ b/br/pkg/utils/backoff_test.go @@ -4,35 +4,18 @@ package utils_test import ( "context" + "testing" "time" - . "github.com/pingcap/check" berrors "github.com/pingcap/tidb/br/pkg/errors" - "github.com/pingcap/tidb/br/pkg/mock" "github.com/pingcap/tidb/br/pkg/utils" - "github.com/pingcap/tidb/util/testleak" + "github.com/stretchr/testify/require" "go.uber.org/multierr" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) -var _ = Suite(&testBackofferSuite{}) - -type testBackofferSuite struct { - mock *mock.Cluster -} - -func (s *testBackofferSuite) SetUpSuite(c *C) { - var err error - s.mock, err = mock.NewCluster() - c.Assert(err, IsNil) -} - -func (s *testBackofferSuite) TearDownSuite(c *C) { - testleak.AfterTest(c)() -} - -func (s *testBackofferSuite) TestBackoffWithSuccess(c *C) { +func TestBackoffWithSuccess(t *testing.T) { var counter int backoffer := utils.NewBackoffer(10, time.Nanosecond, time.Nanosecond) err := utils.WithRetry(context.Background(), func() error { @@ -47,11 +30,11 @@ func (s *testBackofferSuite) TestBackoffWithSuccess(c *C) { } return nil }, backoffer) - c.Assert(counter, Equals, 3) - c.Assert(err, IsNil) + require.Equal(t, 3, counter) + require.NoError(t, err) } -func (s *testBackofferSuite) TestBackoffWithFatalError(c *C) { +func TestBackoffWithFatalError(t *testing.T) { var counter int backoffer := utils.NewBackoffer(10, time.Nanosecond, time.Nanosecond) gRPCError := status.Error(codes.Unavailable, "transport is closing") @@ -69,16 +52,16 @@ func (s *testBackofferSuite) TestBackoffWithFatalError(c *C) { } return nil }, backoffer) - c.Assert(counter, Equals, 4) - c.Assert(multierr.Errors(err), DeepEquals, []error{ + require.Equal(t, 4, counter) + require.Equal(t, []error{ gRPCError, berrors.ErrKVEpochNotMatch, berrors.ErrKVDownloadFailed, berrors.ErrKVRangeIsEmpty, - }) + }, multierr.Errors(err)) } -func (s *testBackofferSuite) TestBackoffWithFatalRawGRPCError(c *C) { +func TestBackoffWithFatalRawGRPCError(t *testing.T) { var counter int canceledError := status.Error(codes.Canceled, "context canceled") backoffer := utils.NewBackoffer(10, time.Nanosecond, time.Nanosecond) @@ -86,21 +69,19 @@ func (s *testBackofferSuite) TestBackoffWithFatalRawGRPCError(c *C) { defer func() { counter++ }() return canceledError // nolint:wrapcheck }, backoffer) - c.Assert(counter, Equals, 1) - c.Assert(multierr.Errors(err), DeepEquals, []error{ - canceledError, - }) + require.Equal(t, 1, counter) + require.Equal(t, []error{canceledError}, multierr.Errors(err)) } -func (s *testBackofferSuite) TestBackoffWithRetryableError(c *C) { +func TestBackoffWithRetryableError(t *testing.T) { var counter int backoffer := utils.NewBackoffer(10, time.Nanosecond, time.Nanosecond) err := utils.WithRetry(context.Background(), func() error { defer func() { counter++ }() return berrors.ErrKVEpochNotMatch }, backoffer) - c.Assert(counter, Equals, 10) - c.Assert(multierr.Errors(err), DeepEquals, []error{ + require.Equal(t, 10, counter) + require.Equal(t, []error{ berrors.ErrKVEpochNotMatch, berrors.ErrKVEpochNotMatch, berrors.ErrKVEpochNotMatch, @@ -111,5 +92,34 @@ func (s *testBackofferSuite) TestBackoffWithRetryableError(c *C) { berrors.ErrKVEpochNotMatch, berrors.ErrKVEpochNotMatch, berrors.ErrKVEpochNotMatch, - }) + }, multierr.Errors(err)) +} + +func TestPdBackoffWithRetryableError(t *testing.T) { + var counter int + backoffer := utils.NewPDReqBackoffer() + gRPCError := status.Error(codes.Unavailable, "transport is closing") + err := utils.WithRetry(context.Background(), func() error { + defer func() { counter++ }() + return gRPCError + }, backoffer) + require.Equal(t, 16, counter) + require.Equal(t, []error{ + gRPCError, + gRPCError, + gRPCError, + gRPCError, + gRPCError, + gRPCError, + gRPCError, + gRPCError, + gRPCError, + gRPCError, + gRPCError, + gRPCError, + gRPCError, + gRPCError, + gRPCError, + gRPCError, + }, multierr.Errors(err)) } diff --git a/br/pkg/utils/dyn_pprof_other.go b/br/pkg/utils/dyn_pprof_other.go index c96978cb45f6d..292208db47091 100644 --- a/br/pkg/utils/dyn_pprof_other.go +++ b/br/pkg/utils/dyn_pprof_other.go @@ -1,4 +1,6 @@ +//go:build !linux && !darwin && !freebsd && !unix // +build !linux,!darwin,!freebsd,!unix + // Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. package utils diff --git a/br/pkg/utils/dyn_pprof_unix.go b/br/pkg/utils/dyn_pprof_unix.go index 5ff96dd9a104e..47a14eab1127e 100644 --- a/br/pkg/utils/dyn_pprof_unix.go +++ b/br/pkg/utils/dyn_pprof_unix.go @@ -1,4 +1,6 @@ +//go:build linux || darwin || freebsd || unix // +build linux darwin freebsd unix + // Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. package utils diff --git a/br/pkg/utils/env_test.go b/br/pkg/utils/env_test.go index 89ad840ee7fc7..46cbb21c1a63d 100644 --- a/br/pkg/utils/env_test.go +++ b/br/pkg/utils/env_test.go @@ -4,15 +4,12 @@ package utils import ( "os" + "testing" - "github.com/pingcap/check" + "github.com/stretchr/testify/require" ) -type envSuit struct{} - -var _ = check.Suite(&envSuit{}) - -func (s *envSuit) TestProxyFields(c *check.C) { +func TestProxyFields(t *testing.T) { revIndex := map[string]int{ "http_proxy": 0, "https_proxy": 1, @@ -25,20 +22,20 @@ func (s *envSuit) TestProxyFields(c *check.C) { // Each bit of the mask decided whether this index of `envs` would be set. for mask := 0; mask <= 0b111; mask++ { for _, env := range envs { - c.Assert(os.Unsetenv(env), check.IsNil) + require.NoError(t, os.Unsetenv(env)) } for i := 0; i < 3; i++ { if (1<= ServerTypeAll { + return "" + } + return serverTypeString[s] +} + // ServerInfo is the combination of ServerType and ServerInfo type ServerInfo struct { ServerType ServerType ServerVersion *semver.Version + HasTiKV bool } var ( mysqlVersionRegex = regexp.MustCompile(`^\d+\.\d+\.\d+([0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?`) - tidbVersionRegex = regexp.MustCompile(`-[v]?\d+\.\d+\.\d+([0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?`) + // `select version()` result + tidbVersionRegex = regexp.MustCompile(`-[v]?\d+\.\d+\.\d+([0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?`) + // `select tidb_version()` result + tidbReleaseVersionRegex = regexp.MustCompile(`v\d+\.\d+\.\d+([0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?`) ) // ParseServerInfo parses exported server type and version info from version string func ParseServerInfo(src string) ServerInfo { lowerCase := strings.ToLower(src) serverInfo := ServerInfo{} + isReleaseVersion := false switch { + case strings.Contains(lowerCase, "release version:"): + // this version string is tidb release version + serverInfo.ServerType = ServerTypeTiDB + isReleaseVersion = true case strings.Contains(lowerCase, "tidb"): serverInfo.ServerType = ServerTypeTiDB case strings.Contains(lowerCase, "mariadb"): @@ -293,7 +337,11 @@ func ParseServerInfo(src string) ServerInfo { var versionStr string if serverInfo.ServerType == ServerTypeTiDB { - versionStr = tidbVersionRegex.FindString(src)[1:] + if isReleaseVersion { + versionStr = tidbReleaseVersionRegex.FindString(src) + } else { + versionStr = tidbVersionRegex.FindString(src)[1:] + } versionStr = strings.TrimPrefix(versionStr, "v") } else { versionStr = mysqlVersionRegex.FindString(src) @@ -305,6 +353,13 @@ func ParseServerInfo(src string) ServerInfo { log.L().Warn("fail to parse version", zap.String("version", versionStr)) } + var version string + if serverInfo.ServerVersion != nil { + version = serverInfo.ServerVersion.String() + } + log.L().Info("detect server version", + zap.String("type", serverInfo.ServerType.String()), + zap.String("version", version)) return serverInfo } diff --git a/br/pkg/version/version_test.go b/br/pkg/version/version_test.go index 989fc37437ed7..f2369c964029c 100644 --- a/br/pkg/version/version_test.go +++ b/br/pkg/version/version_test.go @@ -4,25 +4,19 @@ package version import ( "context" + "errors" "fmt" + "strings" "testing" "github.com/DATA-DOG/go-sqlmock" "github.com/coreos/go-semver/semver" - . "github.com/pingcap/check" "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/tidb/br/pkg/version/build" + "github.com/stretchr/testify/require" pd "github.com/tikv/pd/client" ) -type checkSuite struct{} - -var _ = Suite(&checkSuite{}) - -func TestT(t *testing.T) { - TestingT(t) -} - type mockPDClient struct { pd.Client getAllStores func() []*metapb.Store @@ -41,7 +35,12 @@ func tiflash(version string) []*metapb.Store { } } -func (s *checkSuite) TestCheckClusterVersion(c *C) { +func TestCheckClusterVersion(t *testing.T) { + oldReleaseVersion := build.ReleaseVersion + defer func() { + build.ReleaseVersion = oldReleaseVersion + }() + mock := mockPDClient{ Client: nil, } @@ -52,7 +51,8 @@ func (s *checkSuite) TestCheckClusterVersion(c *C) { return tiflash("v4.0.0-rc.1") } err := CheckClusterVersion(context.Background(), &mock, CheckVersionForBR) - c.Assert(err, ErrorMatches, `incompatible.*version v4.0.0-rc.1, try update it to 4.0.0.*`) + require.Error(t, err) + require.Regexp(t, `^incompatible.*version v4.0.0-rc.1, try update it to 4.0.0`, err.Error()) } { @@ -61,7 +61,8 @@ func (s *checkSuite) TestCheckClusterVersion(c *C) { return tiflash("v3.1.0-beta.1") } err := CheckClusterVersion(context.Background(), &mock, CheckVersionForBR) - c.Assert(err, ErrorMatches, `incompatible.*version v3.1.0-beta.1, try update it to 3.1.0.*`) + require.Error(t, err) + require.Regexp(t, `^incompatible.*version v3.1.0-beta.1, try update it to 3.1.0`, err.Error()) } { @@ -70,7 +71,8 @@ func (s *checkSuite) TestCheckClusterVersion(c *C) { return tiflash("v3.0.15") } err := CheckClusterVersion(context.Background(), &mock, CheckVersionForBR) - c.Assert(err, ErrorMatches, `incompatible.*version v3.0.15, try update it to 3.1.0.*`) + require.Error(t, err) + require.Regexp(t, `^incompatible.*version v3.0.15, try update it to 3.1.0`, err.Error()) } { @@ -79,7 +81,7 @@ func (s *checkSuite) TestCheckClusterVersion(c *C) { return []*metapb.Store{{Version: minTiKVVersion.String()}} } err := CheckClusterVersion(context.Background(), &mock, CheckVersionForBR) - c.Assert(err, IsNil) + require.NoError(t, err) } { @@ -89,7 +91,8 @@ func (s *checkSuite) TestCheckClusterVersion(c *C) { return []*metapb.Store{{Version: `v2.1.0`}} } err := CheckClusterVersion(context.Background(), &mock, CheckVersionForBR) - c.Assert(err, ErrorMatches, ".*TiKV .* don't support BR, please upgrade cluster .*") + require.Error(t, err) + require.Regexp(t, "TiKV .* don't support BR, please upgrade cluster ", err.Error()) } { @@ -99,7 +102,8 @@ func (s *checkSuite) TestCheckClusterVersion(c *C) { return []*metapb.Store{{Version: minTiKVVersion.String()}} } err := CheckClusterVersion(context.Background(), &mock, CheckVersionForBR) - c.Assert(err, ErrorMatches, "TiKV .* mismatch, please .*") + require.Error(t, err) + require.Regexp(t, "^TiKV .* mismatch, please ", err.Error()) } { @@ -109,7 +113,8 @@ func (s *checkSuite) TestCheckClusterVersion(c *C) { return []*metapb.Store{{Version: "v4.0.0-rc"}} } err := CheckClusterVersion(context.Background(), &mock, CheckVersionForBR) - c.Assert(err, ErrorMatches, "TiKV .* major version mismatch, please .*") + require.Error(t, err) + require.Regexp(t, "^TiKV .* major version mismatch, please ", err.Error()) } { @@ -119,7 +124,8 @@ func (s *checkSuite) TestCheckClusterVersion(c *C) { return []*metapb.Store{{Version: "v4.0.0-beta.1"}} } err := CheckClusterVersion(context.Background(), &mock, CheckVersionForBR) - c.Assert(err, ErrorMatches, "TiKV .* mismatch, please .*") + require.Error(t, err) + require.Regexp(t, "^TiKV .* mismatch, please ", err.Error()) } { @@ -129,7 +135,7 @@ func (s *checkSuite) TestCheckClusterVersion(c *C) { return []*metapb.Store{{Version: "v4.0.0-rc.1"}} } err := CheckClusterVersion(context.Background(), &mock, CheckVersionForBR) - c.Assert(err, IsNil) + require.NoError(t, err) } { @@ -138,7 +144,7 @@ func (s *checkSuite) TestCheckClusterVersion(c *C) { return []*metapb.Store{{Version: "v4.0.0-rc.1"}} } err := CheckClusterVersion(context.Background(), &mock, CheckVersionForBackup(semver.New("4.0.12"))) - c.Assert(err, IsNil) + require.NoError(t, err) } { @@ -147,7 +153,7 @@ func (s *checkSuite) TestCheckClusterVersion(c *C) { return []*metapb.Store{{Version: "v4.0.0-rc.1"}} } err := CheckClusterVersion(context.Background(), &mock, CheckVersionForBackup(semver.New("5.0.0-rc"))) - c.Assert(err, Not(IsNil)) + require.Error(t, err) } { @@ -157,127 +163,122 @@ func (s *checkSuite) TestCheckClusterVersion(c *C) { return []*metapb.Store{{Version: "v4.0.0-rc.2"}} } err := CheckClusterVersion(context.Background(), &mock, CheckVersionForBR) - c.Assert(err, IsNil) + require.NoError(t, err) } } -func (s *checkSuite) TestCompareVersion(c *C) { - c.Assert(semver.New("4.0.0-rc").Compare(*semver.New("4.0.0-rc.2")), Equals, -1) - c.Assert(semver.New("4.0.0-beta.3").Compare(*semver.New("4.0.0-rc.2")), Equals, -1) - c.Assert(semver.New("4.0.0-rc.1").Compare(*semver.New("4.0.0")), Equals, -1) - c.Assert(semver.New("4.0.0-beta.1").Compare(*semver.New("4.0.0")), Equals, -1) - c.Assert(semver.New(removeVAndHash("4.0.0-rc-35-g31dae220")).Compare(*semver.New("4.0.0-rc.2")), Equals, -1) - c.Assert(semver.New(removeVAndHash("4.0.0-9-g30f0b014")).Compare(*semver.New("4.0.0-rc.1")), Equals, 1) - c.Assert(semver.New(removeVAndHash("v3.0.0-beta-211-g09beefbe0-dirty")). - Compare(*semver.New("3.0.0-beta")), Equals, 0) - c.Assert(semver.New(removeVAndHash("v3.0.5-dirty")). - Compare(*semver.New("3.0.5")), Equals, 0) - c.Assert(semver.New(removeVAndHash("v3.0.5-beta.12-dirty")). - Compare(*semver.New("3.0.5-beta.12")), Equals, 0) - c.Assert(semver.New(removeVAndHash("v2.1.0-rc.1-7-g38c939f-dirty")). - Compare(*semver.New("2.1.0-rc.1")), Equals, 0) +func TestCompareVersion(t *testing.T) { + require.Equal(t, -1, semver.New("4.0.0-rc").Compare(*semver.New("4.0.0-rc.2"))) + require.Equal(t, -1, semver.New("4.0.0-beta.3").Compare(*semver.New("4.0.0-rc.2"))) + require.Equal(t, -1, semver.New("4.0.0-rc.1").Compare(*semver.New("4.0.0"))) + require.Equal(t, -1, semver.New("4.0.0-beta.1").Compare(*semver.New("4.0.0"))) + require.Equal(t, -1, semver.New(removeVAndHash("4.0.0-rc-35-g31dae220")).Compare(*semver.New("4.0.0-rc.2"))) + require.Equal(t, 1, semver.New(removeVAndHash("4.0.0-9-g30f0b014")).Compare(*semver.New("4.0.0-rc.1"))) + require.Equal(t, 0, semver.New(removeVAndHash("v3.0.0-beta-211-g09beefbe0-dirty")). + Compare(*semver.New("3.0.0-beta"))) + require.Equal(t, 0, semver.New(removeVAndHash("v3.0.5-dirty")). + Compare(*semver.New("3.0.5"))) + require.Equal(t, 0, semver.New(removeVAndHash("v3.0.5-beta.12-dirty")). + Compare(*semver.New("3.0.5-beta.12"))) + require.Equal(t, 0, semver.New(removeVAndHash("v2.1.0-rc.1-7-g38c939f-dirty")). + Compare(*semver.New("2.1.0-rc.1"))) } -func (s *checkSuite) TestNextMajorVersion(c *C) { +func TestNextMajorVersion(t *testing.T) { + oldReleaseVersion := build.ReleaseVersion + defer func() { + build.ReleaseVersion = oldReleaseVersion + }() + build.ReleaseVersion = "v4.0.0-rc.1" - c.Assert(NextMajorVersion().String(), Equals, "5.0.0") + require.Equal(t, "5.0.0", NextMajorVersion().String()) build.ReleaseVersion = "4.0.0-rc-35-g31dae220" - c.Assert(NextMajorVersion().String(), Equals, "5.0.0") + require.Equal(t, "5.0.0", NextMajorVersion().String()) build.ReleaseVersion = "4.0.0-9-g30f0b014" - c.Assert(NextMajorVersion().String(), Equals, "5.0.0") + require.Equal(t, "5.0.0", NextMajorVersion().String()) build.ReleaseVersion = "v5.0.0-rc.2" - c.Assert(NextMajorVersion().String(), Equals, "6.0.0") + require.Equal(t, "6.0.0", NextMajorVersion().String()) build.ReleaseVersion = "v5.0.0-master" - c.Assert(NextMajorVersion().String(), Equals, "6.0.0") + require.Equal(t, "6.0.0", NextMajorVersion().String()) + + build.ReleaseVersion = "b7ed87d-dirty" + _ = NextMajorVersion() + //^ doesn't matter what is returned, just need to ensure it doesn't crash. } -func (s *checkSuite) TestExtractTiDBVersion(c *C) { +func TestExtractTiDBVersion(t *testing.T) { vers, err := ExtractTiDBVersion("5.7.10-TiDB-v2.1.0-rc.1-7-g38c939f") - c.Assert(err, IsNil) - c.Assert(*vers, Equals, *semver.New("2.1.0-rc.1")) + require.NoError(t, err) + require.Equal(t, *semver.New("2.1.0-rc.1"), *vers) vers, err = ExtractTiDBVersion("5.7.10-TiDB-v2.0.4-1-g06a0bf5") - c.Assert(err, IsNil) - c.Assert(*vers, Equals, *semver.New("2.0.4")) + require.NoError(t, err) + require.Equal(t, *semver.New("2.0.4"), *vers) vers, err = ExtractTiDBVersion("5.7.10-TiDB-v2.0.7") - c.Assert(err, IsNil) - c.Assert(*vers, Equals, *semver.New("2.0.7")) + require.NoError(t, err) + require.Equal(t, *semver.New("2.0.7"), *vers) vers, err = ExtractTiDBVersion("8.0.12-TiDB-v3.0.5-beta.12") - c.Assert(err, IsNil) - c.Assert(*vers, Equals, *semver.New("3.0.5-beta.12")) + require.NoError(t, err) + require.Equal(t, *semver.New("3.0.5-beta.12"), *vers) vers, err = ExtractTiDBVersion("5.7.25-TiDB-v3.0.0-beta-211-g09beefbe0-dirty") - c.Assert(err, IsNil) - c.Assert(*vers, Equals, *semver.New("3.0.0-beta")) + require.NoError(t, err) + require.Equal(t, *semver.New("3.0.0-beta"), *vers) vers, err = ExtractTiDBVersion("8.0.12-TiDB-v3.0.5-dirty") - c.Assert(err, IsNil) - c.Assert(*vers, Equals, *semver.New("3.0.5")) + require.NoError(t, err) + require.Equal(t, *semver.New("3.0.5"), *vers) vers, err = ExtractTiDBVersion("8.0.12-TiDB-v3.0.5-beta.12-dirty") - c.Assert(err, IsNil) - c.Assert(*vers, Equals, *semver.New("3.0.5-beta.12")) + require.NoError(t, err) + require.Equal(t, *semver.New("3.0.5-beta.12"), *vers) vers, err = ExtractTiDBVersion("5.7.10-TiDB-v2.1.0-rc.1-7-g38c939f-dirty") - c.Assert(err, IsNil) - c.Assert(*vers, Equals, *semver.New("2.1.0-rc.1")) + require.NoError(t, err) + require.Equal(t, *semver.New("2.1.0-rc.1"), *vers) _, err = ExtractTiDBVersion("") - c.Assert(err, ErrorMatches, "not a valid TiDB version.*") + require.Error(t, err) + require.Regexp(t, "^not a valid TiDB version", err.Error()) _, err = ExtractTiDBVersion("8.0.12") - c.Assert(err, ErrorMatches, "not a valid TiDB version.*") + require.Error(t, err) + require.Regexp(t, "^not a valid TiDB version", err.Error()) _, err = ExtractTiDBVersion("not-a-valid-version") - c.Assert(err, NotNil) + require.Error(t, err) } -func (s *checkSuite) TestCheckVersion(c *C) { +func TestCheckVersion(t *testing.T) { err := CheckVersion("TiNB", *semver.New("2.3.5"), *semver.New("2.1.0"), *semver.New("3.0.0")) - c.Assert(err, IsNil) + require.NoError(t, err) err = CheckVersion("TiNB", *semver.New("2.1.0"), *semver.New("2.3.5"), *semver.New("3.0.0")) - c.Assert(err, ErrorMatches, "TiNB version too old.*") + require.Error(t, err) + require.Regexp(t, "^TiNB version too old", err.Error()) err = CheckVersion("TiNB", *semver.New("3.1.0"), *semver.New("2.3.5"), *semver.New("3.0.0")) - c.Assert(err, ErrorMatches, "TiNB version too new.*") + require.Error(t, err) + require.Regexp(t, "^TiNB version too new", err.Error()) err = CheckVersion("TiNB", *semver.New("3.0.0-beta"), *semver.New("2.3.5"), *semver.New("3.0.0")) - c.Assert(err, ErrorMatches, "TiNB version too new.*") -} - -type versionEqualsC struct{} - -func (v versionEqualsC) Info() *CheckerInfo { - return &CheckerInfo{ - Name: "VersionEquals", - Params: []string{"source", "target"}, - } + require.Error(t, err) + require.Regexp(t, "^TiNB version too new", err.Error()) } -func (v versionEqualsC) Check(params []interface{}, names []string) (result bool, error string) { - source := params[0].(*semver.Version) - target := params[1].(*semver.Version) +func versionEqualCheck(source *semver.Version, target *semver.Version) (result bool) { if source == nil || target == nil { - if target == source { - return true, "" - } - return false, fmt.Sprintf("one of version is nil but another is not (%s and %s)", params[0], params[1]) + return target == source } - if source.Equal(*target) { - return true, "" - } - return false, fmt.Sprintf("version not equal (%s vs %s)", source, target) + return source.Equal(*target) } -var versionEquals versionEqualsC - -func (s *checkSuite) TestNormalizeBackupVersion(c *C) { +func TestNormalizeBackupVersion(t *testing.T) { cases := []struct { target string source string @@ -292,13 +293,14 @@ func (s *checkSuite) TestNormalizeBackupVersion(c *C) { for _, testCase := range cases { target, _ := semver.NewVersion(testCase.target) source := NormalizeBackupVersion(testCase.source) - c.Assert(source, versionEquals, target) + result := versionEqualCheck(source, target) + require.Truef(t, result, "source=%v, target=%v", source, target) } } -func (s *checkSuite) TestDetectServerInfo(c *C) { +func TestDetectServerInfo(t *testing.T) { db, mock, err := sqlmock.New() - c.Assert(err, IsNil) + require.NoError(t, err) defer db.Close() mkVer := makeVersion @@ -309,6 +311,8 @@ func (s *checkSuite) TestDetectServerInfo(c *C) { {4, "5.7.25-TiDB-v3.0.7-58-g6adce2367", ServerTypeTiDB, mkVer(3, 0, 7, "58-g6adce2367")}, {5, "5.7.25-TiDB-3.0.6", ServerTypeTiDB, mkVer(3, 0, 6, "")}, {6, "invalid version", ServerTypeUnknown, (*semver.Version)(nil)}, + {7, "Release Version: v5.2.1\nEdition: Community\nGit Commit Hash: cd8fb24c5f7ebd9d479ed228bb41848bd5e97445", ServerTypeTiDB, mkVer(5, 2, 1, "")}, + {8, "Release Version: v5.4.0-alpha-21-g86caab907\nEdition: Community\nGit Commit Hash: 86caab907c481bbc4243b5a3346ec13907cc8721\nGit Branch: master", ServerTypeTiDB, mkVer(5, 4, 0, "alpha-21-g86caab907")}, } dec := func(d []interface{}) (tag int, verStr string, tp ServerType, v *semver.Version) { return d[0].(int), d[1].(string), ServerType(d[2].(int)), d[3].(*semver.Version) @@ -316,22 +320,30 @@ func (s *checkSuite) TestDetectServerInfo(c *C) { for _, datum := range data { tag, r, serverTp, expectVer := dec(datum) - cmt := Commentf("test case number: %d", tag) + cmt := fmt.Sprintf("test case number: %d", tag) - rows := sqlmock.NewRows([]string{"version"}).AddRow(r) - mock.ExpectQuery("SELECT version()").WillReturnRows(rows) + tidbVersionQuery := mock.ExpectQuery("SELECT tidb_version\\(\\);") + if strings.HasPrefix(r, "Release Version:") { + tidbVersionQuery.WillReturnRows(sqlmock.NewRows([]string{"tidb_version"}).AddRow(r)) + } else { + tidbVersionQuery.WillReturnError(errors.New("mock error")) + rows := sqlmock.NewRows([]string{"version"}).AddRow(r) + mock.ExpectQuery("SELECT version\\(\\);").WillReturnRows(rows) + } verStr, err := FetchVersion(context.Background(), db) - c.Assert(err, IsNil, cmt) + require.NoError(t, err, cmt) + info := ParseServerInfo(verStr) - c.Assert(info.ServerType, Equals, serverTp, cmt) - c.Assert(info.ServerVersion == nil, Equals, expectVer == nil, cmt) + require.Equal(t, serverTp, info.ServerType, cmt) + require.Equal(t, expectVer == nil, info.ServerVersion == nil, cmt) if info.ServerVersion == nil { - c.Assert(expectVer, IsNil, cmt) + require.Nil(t, expectVer, cmt) } else { - c.Assert(info.ServerVersion.Equal(*expectVer), IsTrue) + fmt.Printf("%v, %v\n", *info.ServerVersion, *expectVer) + require.True(t, info.ServerVersion.Equal(*expectVer)) } - c.Assert(mock.ExpectationsWereMet(), IsNil, cmt) + require.NoError(t, mock.ExpectationsWereMet(), cmt) } } func makeVersion(major, minor, patch int64, preRelease string) *semver.Version { @@ -343,3 +355,40 @@ func makeVersion(major, minor, patch int64, preRelease string) *semver.Version { Metadata: "", } } + +func TestFetchVersion(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + + tidbVersion := `Release Version: v5.2.1 +Edition: Community +Git Commit Hash: cd8fb24c5f7ebd9d479ed228bb41848bd5e97445 +Git Branch: heads/refs/tags/v5.2.1 +UTC Build Time: 2021-09-08 02:32:56 +GoVersion: go1.16.4 +Race Enabled: false +TiKV Min Version: v3.0.0-60965b006877ca7234adaced7890d7b029ed1306 +Check Table Before Drop: false` + + ctx := context.Background() + mock.ExpectQuery("SELECT tidb_version\\(\\);").WillReturnRows(sqlmock. + NewRows([]string{""}).AddRow(tidbVersion)) + versionStr, err := FetchVersion(ctx, db) + require.NoError(t, err) + require.Equal(t, tidbVersion, versionStr) + + mock.ExpectQuery("SELECT tidb_version\\(\\);").WillReturnError(errors.New("mock failure")) + mock.ExpectQuery("SELECT version\\(\\);").WillReturnRows(sqlmock. + NewRows([]string{""}).AddRow("5.7.25")) + versionStr, err = FetchVersion(ctx, db) + require.NoError(t, err) + require.Equal(t, "5.7.25", versionStr) + + mock.ExpectQuery("SELECT tidb_version\\(\\);").WillReturnError(errors.New("mock failure")) + mock.ExpectQuery("SELECT version\\(\\);").WillReturnError(errors.New("mock failure")) + + _, err = FetchVersion(ctx, db) + require.Error(t, err) + require.Regexp(t, "mock failure$", err.Error()) + +} diff --git a/br/tests/br_300_small_tables/run.sh b/br/tests/br_300_small_tables/run.sh index a649e41240aa1..94de850381cb4 100644 --- a/br/tests/br_300_small_tables/run.sh +++ b/br/tests/br_300_small_tables/run.sh @@ -43,7 +43,7 @@ unset BR_LOG_TO_TERM rm -f $BACKUPMETAV2_LOG export GO_FAILPOINTS="github.com/pingcap/tidb/br/pkg/task/progress-call-back=return(\"$PROGRESS_FILE\")" run_br backup db --db "$DB" --log-file $BACKUPMETAV2_LOG -s "local://$TEST_DIR/${DB}v2" --pd $PD_ADDR --use-backupmeta-v2 -backupv2_size=`grep "backup data size" "${BACKUPMETAV2_LOG}" | grep -oP '\[\K[^\]]+' | grep "backup data size" | awk -F '=' '{print $2}' | grep -oP '\d*\.\d+'` +backupv2_size=`grep "backup-data-size" "${BACKUPMETAV2_LOG}" | grep -oP '\[\K[^\]]+' | grep "backup-data-size" | awk -F '=' '{print $2}' | grep -oP '\d*\.\d+'` echo "backup meta v2 backup size is ${backupv2_size}" export GO_FAILPOINTS="" @@ -61,7 +61,7 @@ rm -rf $PROGRESS_FILE echo "backup meta v1 start..." rm -f $BACKUPMETAV1_LOG run_br backup db --db "$DB" --log-file $BACKUPMETAV1_LOG -s "local://$TEST_DIR/$DB" --pd $PD_ADDR -backupv1_size=`grep "backup data size" "${BACKUPMETAV1_LOG}" | grep -oP '\[\K[^\]]+' | grep "backup data size" | awk -F '=' '{print $2}' | grep -oP '\d*\.\d+'` +backupv1_size=`grep "backup-data-size" "${BACKUPMETAV1_LOG}" | grep -oP '\[\K[^\]]+' | grep "backup-data-size" | awk -F '=' '{print $2}' | grep -oP '\d*\.\d+'` echo "backup meta v1 backup size is ${backupv1_size}" @@ -83,7 +83,7 @@ done rm -rf $RESTORE_LOG echo "restore 1/300 of the table start..." run_br restore table --db $DB --table "sbtest100" --log-file $RESTORE_LOG -s "local://$TEST_DIR/$DB" --pd $PD_ADDR --no-schema -restore_size=`grep "restore data size" "${RESTORE_LOG}" | grep -oP '\[\K[^\]]+' | grep "restore data size" | awk -F '=' '{print $2}' | grep -oP '\d*\.\d+'` +restore_size=`grep "restore-data-size" "${RESTORE_LOG}" | grep -oP '\[\K[^\]]+' | grep "restore-data-size" | awk -F '=' '{print $2}' | grep -oP '\d*\.\d+'` echo "restore data size is ${restore_size}" diff=$(calc "$backupv2_size-$restore_size*$TABLES_COUNT") diff --git a/br/tests/br_crypter/run.sh b/br/tests/br_crypter/run.sh new file mode 100755 index 0000000000000..11cef56b334e5 --- /dev/null +++ b/br/tests/br_crypter/run.sh @@ -0,0 +1,149 @@ +#!/bin/sh +# +# Copyright 2019 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, +# 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. + +set -eu +DB="$TEST_NAME" +TABLE="usertable" +DB_COUNT=3 + +function create_db_with_table(){ + for i in $(seq $DB_COUNT); do + run_sql "CREATE DATABASE $DB${i};" + go-ycsb load mysql -P tests/$TEST_NAME/workload -p mysql.host=$TIDB_IP -p mysql.port=$TIDB_PORT -p mysql.user=root -p mysql.db=$DB${i} + done +} + +function drop_db(){ + for i in $(seq $DB_COUNT); do + run_sql "DROP DATABASE $DB${i};" + done +} + +function check_db_row(){ + for i in $(seq $DB_COUNT); do + row_count_new[${i}]=$(run_sql "SELECT COUNT(*) FROM $DB${i}.$TABLE;" | awk '/COUNT/{print $2}') + done + + fail=false + for i in $(seq $DB_COUNT); do + if [ "${row_count_ori[i]}" != "${row_count_new[i]}" ];then + fail=true + echo "TEST: [$TEST_NAME] fail on database $DB${i}" + fi + echo "database $DB${i} [original] row count: ${row_count_ori[i]}, [after br] row count: ${row_count_new[i]}" + done + + if $fail; then + echo "TEST: [$TEST_NAME] failed!" + exit 1 + fi +} + +function test_crypter_plaintext(){ + echo "backup with crypter method of plaintext" + run_br --pd $PD_ADDR backup full -s "local://$TEST_DIR/$DB/plaintext" --crypter.method "plaintext" + + drop_db + + echo "restore with crypter method of plaintext" + run_br --pd $PD_ADDR restore full -s "local://$TEST_DIR/$DB/plaintext" --crypter.method "PLAINTEXT" + + check_db_row +} + +function test_crypter(){ + CRYPTER_METHOD=$1 + CRYPTER_KEY=$2 + CRYPTER_WRONG_KEY=$3 + CRYPTER_KEY_FILE=$TEST_DIR/$DB/$CRYPTER_METHOD-cipher-key + CRYPTER_WRONG_KEY_FILE=$TEST_DIR/$DB/$CRYPTER_METHOD-wrong-cipher-key + + echo "backup crypter method of $CRYPTER_METHOD with the key of $CRYPTER_KEY" + run_br --pd $PD_ADDR backup full -s "local://$TEST_DIR/$DB/$CRYPTER_METHOD" \ + --crypter.method $CRYPTER_METHOD --crypter.key $CRYPTER_KEY + + drop_db + + echo "restore crypter method of $CRYPTER_METHOD with wrong key of $CRYPTER_WRONG_KEY" + restore_fail=0 + run_br --pd $PD_ADDR restore full -s "local://$TEST_DIR/$DB/$CRYPTER_METHOD" \ + --crypter.method $CRYPTER_METHOD --crypter.key $CRYPTER_WRONG_KEY || restore_fail=1 + if [ $restore_fail -ne 1 ]; then + echo "TEST: [$TEST_NAME] test restore crypter with wrong key failed!" + exit 1 + fi + + echo "restore crypter method of $CRYPTER_METHOD with the key of $CRYPTER_KEY" + run_br --pd $PD_ADDR restore full -s "local://$TEST_DIR/$DB/$CRYPTER_METHOD" \ + --crypter.method $CRYPTER_METHOD --crypter.key $CRYPTER_KEY + + check_db_row + + echo $CRYPTER_KEY > $CRYPTER_KEY_FILE + echo $CRYPTER_WRONG_KEY > $CRYPTER_WRONG_KEY_FILE + + echo "backup crypter method of $CRYPTER_METHOD with the key-file of $CRYPTER_KEY_FILE" + run_br --pd $PD_ADDR backup full -s "local://$TEST_DIR/$DB/${CRYPTER_METHOD}_file" \ + --use-backupmeta-v2=true --crypter.method $CRYPTER_METHOD --crypter.key-file $CRYPTER_KEY_FILE + + drop_db + + echo "backup crypter method of $CRYPTER_METHOD with the wrong key-file of $CRYPTER_WRONG_KEY_FILE" + restore_fail=0 + run_br --pd $PD_ADDR restore full -s "local://$TEST_DIR/$DB/${CRYPTER_METHOD}_file" \ + --crypter.method $CRYPTER_METHOD --crypter.key-file $CRYPTER_WRONG_KEY_FILE || restore_fail=1 + if [ $restore_fail -ne 1 ]; then + echo "TEST: [$TEST_NAME] test restore with wrong key-file failed!" + exit 1 + fi + + echo "restore crypter method of $CRYPTER_METHOD with the key-file of $CRYPTER_KEY_FILE" + run_br --pd $PD_ADDR restore full -s "local://$TEST_DIR/$DB/${CRYPTER_METHOD}_file" \ + --crypter.method $CRYPTER_METHOD --crypter.key-file $CRYPTER_KEY_FILE + + check_db_row +} + +# Create dbs with table +create_db_with_table + +# Get the original row count from dbs +for i in $(seq $DB_COUNT); do + row_count_ori[${i}]=$(run_sql "SELECT COUNT(*) FROM $DB${i}.$TABLE;" | awk '/COUNT/{print $2}') +done + +# Test crypter.method=plaintext for br +test_crypter_plaintext + +# Test crypter.method=AESXXX for br +METHOD=aes128-ctr +KEY="0123456789abcdef0123456789abcdef" +WRONG_KEY="0123456789abcdef0123456789abcdee" +test_crypter $METHOD $KEY $WRONG_KEY + +METHOD=AES192-CTR +KEY="0123456789abcdef0123456789abcdef0123456789abcdef" +WRONG_KEY="0123456789abcdef0123456789abcdef0123456789abcde" +test_crypter $METHOD $KEY $WRONG_KEY + +METHOD=AES256-CTR +KEY="0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" +WRONG_KEY="0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdeff" +test_crypter $METHOD $KEY $WRONG_KEY + +# Drop dbs finally +drop_db + diff --git a/br/tests/br_log_restore/workload b/br/tests/br_crypter/workload similarity index 83% rename from br/tests/br_log_restore/workload rename to br/tests/br_crypter/workload index 664fe7ee88228..448ca3c1a477f 100644 --- a/br/tests/br_log_restore/workload +++ b/br/tests/br_crypter/workload @@ -9,4 +9,4 @@ updateproportion=0 scanproportion=0 insertproportion=0 -requestdistribution=uniform +requestdistribution=uniform \ No newline at end of file diff --git a/br/tests/br_db/run.sh b/br/tests/br_db/run.sh index 14d3152145566..f95f7ff8f620d 100755 --- a/br/tests/br_db/run.sh +++ b/br/tests/br_db/run.sh @@ -67,6 +67,12 @@ if [ "$table_count" -ne "2" ];then exit 1 fi +meta_count=$(run_sql "SHOW STATS_META where Row_count > 0;") +if [ "$meta_count" -ne "2" ];then + echo "TEST: [$TEST_NAME] failed!" + exit 1 +fi + # Test BR DDL query string echo "testing DDL query..." run_curl https://$TIDB_STATUS_ADDR/ddl/history | grep -E '/\*from\(br\)\*/CREATE TABLE' diff --git a/br/tests/br_incremental_ddl/run.sh b/br/tests/br_incremental_ddl/run.sh index d6e27b4626091..68867a194a2a4 100755 --- a/br/tests/br_incremental_ddl/run.sh +++ b/br/tests/br_incremental_ddl/run.sh @@ -42,14 +42,19 @@ run_sql "CREATE DATABASE ${DB};" run_sql "CREATE TABLE ${DB}.${TABLE}1 (c2 CHAR(255));" run_sql "RENAME TABLE ${DB}.${TABLE}1 to ${DB}.${TABLE};" run_sql "TRUNCATE TABLE ${DB}.${TABLE};" + +# create new table to test alter succeed after rename ddl executed. +run_sql "CREATE TABLE IF NOT EXISTS ${DB}.${TABLE}_rename (c CHAR(255));" +run_sql "RENAME TABLE ${DB}.${TABLE}_rename to ${DB}.${TABLE}_rename2;" # insert records for i in $(seq $ROW_COUNT); do run_sql "INSERT INTO ${DB}.${TABLE}(c2) VALUES ('$i');" + run_sql "INSERT INTO ${DB}.${TABLE}_rename2(c) VALUES ('$i');" done # incremental backup echo "incremental backup start..." last_backup_ts=$(run_br validate decode --field="end-version" -s "local://$TEST_DIR/$DB/full" | grep -oE "^[0-9]+") -run_br --pd $PD_ADDR backup table -s "local://$TEST_DIR/$DB/inc" --db $DB -t $TABLE --lastbackupts $last_backup_ts +run_br --pd $PD_ADDR backup db -s "local://$TEST_DIR/$DB/inc" --db $DB --lastbackupts $last_backup_ts run_sql "DROP DATABASE $DB;" # full restore @@ -63,7 +68,7 @@ if [ "${row_count_full}" != "${ROW_COUNT}" ];then fi # incremental restore echo "incremental restore start..." -run_br restore table --db $DB --table $TABLE -s "local://$TEST_DIR/$DB/inc" --pd $PD_ADDR +run_br restore db --db $DB -s "local://$TEST_DIR/$DB/inc" --pd $PD_ADDR row_count_inc=$(run_sql "SELECT COUNT(*) FROM $DB.$TABLE;" | awk '/COUNT/{print $2}') # check full restore if [ "${row_count_inc}" != "${ROW_COUNT}" ];then @@ -71,5 +76,6 @@ if [ "${row_count_inc}" != "${ROW_COUNT}" ];then exit 1 fi run_sql "INSERT INTO ${DB}.${TABLE}(c2) VALUES ('1');" +run_sql "INSERT INTO ${DB}.${TABLE}_rename2(c) VALUES ('1');" run_sql "DROP DATABASE $DB;" diff --git a/br/tests/br_log_restore/run.sh b/br/tests/br_log_restore/run.sh deleted file mode 100755 index 3753e58267816..0000000000000 --- a/br/tests/br_log_restore/run.sh +++ /dev/null @@ -1,181 +0,0 @@ -#!/bin/bash -# -# Copyright 2020 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, -# 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. - -set -eux -DB="$TEST_NAME" -TABLE="usertable" -DB_COUNT=3 -BUCKET="cdcs3" -CDC_COUNT=3 - -# start the s3 server -export MINIO_ACCESS_KEY=brs3accesskey -export MINIO_SECRET_KEY=brs3secretkey -export MINIO_BROWSER=off -export AWS_ACCESS_KEY_ID=$MINIO_ACCESS_KEY -export AWS_SECRET_ACCESS_KEY=$MINIO_SECRET_KEY -export S3_ENDPOINT=127.0.0.1:24928 -rm -rf "$TEST_DIR/$DB" -mkdir -p "$TEST_DIR/$DB" -bin/minio server --address $S3_ENDPOINT "$TEST_DIR/$DB" & -i=0 -while ! curl -o /dev/null -s "http://$S3_ENDPOINT/"; do - i=$(($i+1)) - if [ $i -gt 30 ]; then - echo 'Failed to start minio' - exit 1 - fi - sleep 2 -done - -bin/mc config --config-dir "$TEST_DIR/$TEST_NAME" \ - host add minio http://$S3_ENDPOINT $MINIO_ACCESS_KEY $MINIO_SECRET_KEY -bin/mc mb --config-dir "$TEST_DIR/$TEST_NAME" minio/$BUCKET - -# Start cdc servers -run_cdc server --pd=https://$PD_ADDR --log-file=ticdc.log --addr=0.0.0.0:18301 --advertise-addr=127.0.0.1:18301 & -trap 'cat ticdc.log' ERR - -# TODO: remove this after TiCDC supports TiDB clustered index -run_sql "set @@global.tidb_enable_clustered_index=0" -# TiDB global variables cache 2 seconds -sleep 2 - -# create change feed for s3 log -run_cdc cli changefeed create --pd=https://$PD_ADDR --sink-uri="s3://$BUCKET/$DB?endpoint=http://$S3_ENDPOINT" --changefeed-id="simple-replication-task" - -start_ts=$(run_sql "show master status;" | grep Position | awk -F ':' '{print $2}' | xargs) - -# Fill in the database -for i in $(seq $DB_COUNT); do - run_sql "CREATE DATABASE $DB${i};" - go-ycsb load mysql -P tests/$TEST_NAME/workload -p mysql.host=$TIDB_IP -p mysql.port=$TIDB_PORT -p mysql.user=root -p mysql.db=$DB${i} -done - -for i in $(seq $DB_COUNT); do - row_count_ori[${i}]=$(run_sql "SELECT COUNT(*) FROM $DB${i}.$TABLE;" | awk '/COUNT/{print $2}') -done - -# test drop & create schema/table, finally only db2 has one row -run_sql "create schema ${DB}_DDL1;" -run_sql "create table ${DB}_DDL1.t1 (a int primary key, b varchar(10));" -run_sql "insert into ${DB}_DDL1.t1 values (1, 'x');" - -run_sql "drop schema ${DB}_DDL1;" -run_sql "create schema ${DB}_DDL1;" -run_sql "create schema ${DB}_DDL2;" - -run_sql "create table ${DB}_DDL2.t2 (a int primary key, b varchar(10));" -run_sql "insert into ${DB}_DDl2.t2 values (2, 'x');" - -run_sql "drop table ${DB}_DDL2.t2;" -run_sql "create table ${DB}_DDL2.t2 (a int primary key, b varchar(10));" -run_sql "insert into ${DB}_DDL2.t2 values (3, 'x');" -run_sql "delete from ${DB}_DDL2.t2 where a = 3;" -run_sql "insert into ${DB}_DDL2.t2 values (4, 'x');" - -end_ts=$(run_sql "show master status;" | grep Position | awk -F ':' '{print $2}' | xargs) - - -# if we restore with ts range [start_ts, end_ts], then the below record won't be restored. -run_sql "insert into ${DB}_DDL2.t2 values (5, 'x');" - -wait_time=0 -checkpoint_ts=$(run_cdc cli changefeed query -c simple-replication-task --pd=https://$PD_ADDR | jq '.status."checkpoint-ts"') -while [ "$checkpoint_ts" -lt "$end_ts" ]; do - echo "waiting for cdclog syncing... (checkpoint_ts = $checkpoint_ts; end_ts = $end_ts)" - if [ "$wait_time" -gt 300 ]; then - echo "cdc failed to sync after 300s, please check the CDC log." - exit 1 - fi - sleep 5 - wait_time=$(( wait_time + 5 )) - checkpoint_ts=$(run_cdc cli changefeed query -c simple-replication-task --pd=https://$PD_ADDR | jq '.status."checkpoint-ts"') -done - -# remove the change feed, because we don't want to record the drop ddl. -echo "Y" | run_cdc cli unsafe reset --pd=https://$PD_ADDR - -for i in $(seq $DB_COUNT); do - run_sql "DROP DATABASE $DB${i};" -done -run_sql "DROP DATABASE ${DB}_DDL1" -run_sql "DROP DATABASE ${DB}_DDL2" - -# restore full -export GO_FAILPOINTS='github.com/pingcap/tidb/br/pkg/lightning/backend/local/FailIngestMeta=return("notleader")' -echo "restore start..." -run_br restore cdclog -s "s3://$BUCKET/$DB" --pd $PD_ADDR --s3.endpoint="http://$S3_ENDPOINT" \ - --log-file "restore.log" --log-level "info" --start-ts $start_ts --end-ts $end_ts - -for i in $(seq $DB_COUNT); do - row_count_new[${i}]=$(run_sql "SELECT COUNT(*) FROM $DB${i}.$TABLE;" | awk '/COUNT/{print $2}') -done - -fail=false -row_count=$(run_sql "SELECT COUNT(*) FROM ${DB}_DDL2.t2 WHERE a=4;" | awk '/COUNT/{print $2}') -if [ "$row_count" -ne "1" ]; then - fail=true - echo "TEST: [$TEST_NAME] fail on dml&ddl drop test." -fi - - -# record a=5 shouldn't be restore, because we set -end-ts without this record. -row_count=$(run_sql "SELECT COUNT(*) FROM ${DB}_DDL2.t2 WHERE a=5;" | awk '/COUNT/{print $2}') -if [ "$row_count" -ne "0" ]; then - fail=true - echo "TEST: [$TEST_NAME] fail on ts range test." -fi - -export GO_FAILPOINTS='github.com/pingcap/tidb/br/pkg/lightning/backend/local/FailIngestMeta=return("epochnotmatch")' -echo "restore again to restore a=5 record..." -run_br restore cdclog -s "s3://$BUCKET/$DB" --pd $PD_ADDR --s3.endpoint="http://$S3_ENDPOINT" \ - --log-file "restore.log" --log-level "info" --start-ts $end_ts - -# record a=5 should be restore, because we set -end-ts without this record. -row_count=$(run_sql "SELECT COUNT(*) FROM ${DB}_DDL2.t2 WHERE a=5;" | awk '/COUNT/{print $2}') -if [ "$row_count" -ne "1" ]; then - fail=true - echo "TEST: [$TEST_NAME] fail on recover ts range test." -fi - -# record a=3 should be deleted -row_count=$(run_sql "SELECT COUNT(*) FROM ${DB}_DDL2.t2 WHERE a=3;" | awk '/COUNT/{print $2}') -if [ "$row_count" -ne "0" ]; then - fail=true - echo "TEST: [$TEST_NAME] fail on key not deleted." -fi - - -for i in $(seq $DB_COUNT); do - if [ "${row_count_ori[i]}" != "${row_count_new[i]}" ];then - fail=true - echo "TEST: [$TEST_NAME] fail on database $DB${i}" - fi - echo "database $DB${i} [original] row count: ${row_count_ori[i]}, [after br] row count: ${row_count_new[i]}" -done - -if $fail; then - echo "TEST: [$TEST_NAME] failed!" - exit 1 -fi - -for i in $(seq $DB_COUNT); do - run_sql "DROP DATABASE $DB${i};" -done - -run_sql "DROP DATABASE ${DB}_DDL1" -run_sql "DROP DATABASE ${DB}_DDL2" diff --git a/br/tests/br_other/run.sh b/br/tests/br_other/run.sh index 5b6c5fad52f18..79ffb9d2732e8 100644 --- a/br/tests/br_other/run.sh +++ b/br/tests/br_other/run.sh @@ -95,6 +95,8 @@ run_curl https://$PD_ADDR/pd/api/v1/config/schedule | jq '."max-merge-region-siz run_curl https://$PD_ADDR/pd/api/v1/config/schedule | jq '."max-merge-region-keys"' | grep -E "^0$" backup_fail=0 +# generate 1.sst to make another backup failed. +touch "$TEST_DIR/$DB/lock/1.sst" echo "another backup start expect to fail due to last backup add a lockfile" run_br --pd $PD_ADDR backup full -s "local://$TEST_DIR/$DB/lock" --concurrency 4 || backup_fail=1 if [ "$backup_fail" -ne "1" ];then @@ -135,9 +137,7 @@ default_pd_values='{ "max-merge-region-keys": 200000, "max-merge-region-size": 20, "leader-schedule-limit": 4, - "region-schedule-limit": 2048, - "max-snapshot-count": 3, - "max-pending-peer-count": 16 + "region-schedule-limit": 2048 }' for key in $(echo $default_pd_values | jq 'keys[]'); do diff --git a/br/tests/br_rawkv/run.sh b/br/tests/br_rawkv/run.sh index 62c4c7509c01e..15de10c42322e 100644 --- a/br/tests/br_rawkv/run.sh +++ b/br/tests/br_rawkv/run.sh @@ -51,7 +51,7 @@ test_full_rawkv() { checksum_full=$(checksum $check_range_start $check_range_end) # backup current state of key-values - run_br --pd $PD_ADDR backup raw -s "local://$TEST_DIR/rawkv-full" + run_br --pd $PD_ADDR backup raw -s "local://$TEST_DIR/rawkv-full" --crypter.method "aes128-ctr" --crypter.key "0123456789abcdef0123456789abcdef" clean $check_range_start $check_range_end # Ensure the data is deleted @@ -61,7 +61,7 @@ test_full_rawkv() { fail_and_exit fi - run_br --pd $PD_ADDR restore raw -s "local://$TEST_DIR/rawkv-full" + run_br --pd $PD_ADDR restore raw -s "local://$TEST_DIR/rawkv-full" --crypter.method "aes128-ctr" --crypter.key "0123456789abcdef0123456789abcdef" checksum_new=$(checksum $check_range_start $check_range_end) if [ "$checksum_new" != "$checksum_full" ];then echo "failed to restore" @@ -90,7 +90,7 @@ checksum_partial=$(checksum 311111 311122) # backup rawkv echo "backup start..." -run_br --pd $PD_ADDR backup raw -s "local://$BACKUP_DIR" --start 31 --end 3130303030303030 --format hex --concurrency 4 +run_br --pd $PD_ADDR backup raw -s "local://$BACKUP_DIR" --start 31 --end 3130303030303030 --format hex --concurrency 4 --crypter.method "aes128-ctr" --crypter.key "0123456789abcdef0123456789abcdef" # delete data in range[start-key, end-key) clean 31 3130303030303030 @@ -104,7 +104,7 @@ fi # restore rawkv echo "restore start..." -run_br --pd $PD_ADDR restore raw -s "local://$BACKUP_DIR" --start 31 --end 3130303030303030 --format hex +run_br --pd $PD_ADDR restore raw -s "local://$BACKUP_DIR" --start 31 --end 3130303030303030 --format hex --crypter.method "aes128-ctr" --crypter.key "0123456789abcdef0123456789abcdef" checksum_new=$(checksum 31 3130303030303030) @@ -126,7 +126,7 @@ if [ "$checksum_new" != "$checksum_empty" ];then fi echo "partial restore start..." -run_br --pd $PD_ADDR restore raw -s "local://$BACKUP_DIR" --start 311111 --end 311122 --format hex --concurrency 4 +run_br --pd $PD_ADDR restore raw -s "local://$BACKUP_DIR" --start 311111 --end 311122 --format hex --concurrency 4 --crypter.method "aes128-ctr" --crypter.key "0123456789abcdef0123456789abcdef" bin/rawkv --pd $PD_ADDR \ --ca "$TEST_DIR/certs/ca.pem" \ --cert "$TEST_DIR/certs/br.pem" \ diff --git a/br/tests/config/tidb.toml b/br/tests/config/tidb.toml index dafdb8d71ad28..2de8d2aea8eef 100644 --- a/br/tests/config/tidb.toml +++ b/br/tests/config/tidb.toml @@ -11,3 +11,9 @@ ssl-key = "/tmp/backup_restore_test/certs/tidb.key" cluster-ssl-ca = "/tmp/backup_restore_test/certs/ca.pem" cluster-ssl-cert = "/tmp/backup_restore_test/certs/tidb.pem" cluster-ssl-key = "/tmp/backup_restore_test/certs/tidb.key" + +# experimental section controls the features that are still experimental: their semantics, +# interfaces are subject to change, using these features in the production environment is not recommended. +[experimental] +# enable creating expression index. +allow-expression-index = true diff --git a/br/tests/lightning_checkpoint_dirty_tableid/run.sh b/br/tests/lightning_checkpoint_dirty_tableid/run.sh index eeddfd493c263..72bfb0e60f134 100755 --- a/br/tests/lightning_checkpoint_dirty_tableid/run.sh +++ b/br/tests/lightning_checkpoint_dirty_tableid/run.sh @@ -35,8 +35,12 @@ set -e ILLEGAL_CP_COUNT=$(grep "TiDB Lightning has detected tables with illegal checkpoints. To prevent data loss, this run will stop now." "$TEST_DIR/lightning-checkpoint-dirty-tableid.log" | wc -l) TABLE_SUGGEST=$(grep "checkpoint-remove=" "$TEST_DIR/lightning-checkpoint-dirty-tableid.log" | wc -l) -[ $ILLEGAL_CP_COUNT -eq 1 ] -[ $TABLE_SUGGEST -eq 1 ] +# we got same errors in three place: +# 1. run failed in step 2 +# 2. the whole procedure failed +# 3. main +[ $ILLEGAL_CP_COUNT -eq 3 ] +[ $TABLE_SUGGEST -eq 3 ] # Try again with the file checkpoints @@ -60,5 +64,9 @@ set -e ILLEGAL_CP_COUNT=$(grep "TiDB Lightning has detected tables with illegal checkpoints. To prevent data loss, this run will stop now." "$TEST_DIR/lightning-checkpoint-dirty-tableid.log" | wc -l) TABLE_SUGGEST=$(grep "checkpoint-remove=" "$TEST_DIR/lightning-checkpoint-dirty-tableid.log" | wc -l) -[ $ILLEGAL_CP_COUNT -eq 1 ] -[ $TABLE_SUGGEST -eq 1 ] +# we got same errors in three place: +# 1. run failed in step 2 +# 2. the whole procedure failed +# 3. main +[ $ILLEGAL_CP_COUNT -eq 3 ] +[ $TABLE_SUGGEST -eq 3 ] diff --git a/br/tests/lightning_checksum_mismatch/config.toml b/br/tests/lightning_checksum_mismatch/config.toml new file mode 100644 index 0000000000000..72a81d6eaaa0c --- /dev/null +++ b/br/tests/lightning_checksum_mismatch/config.toml @@ -0,0 +1,9 @@ +[tikv-importer] +backend = "local" +duplicate-resolution = "none" + +[post-restore] +checksum = "required" + +[mydumper.csv] +header = false diff --git a/br/tests/lightning_checksum_mismatch/data/cm-schema-create.sql b/br/tests/lightning_checksum_mismatch/data/cm-schema-create.sql new file mode 100644 index 0000000000000..c505348076d6e --- /dev/null +++ b/br/tests/lightning_checksum_mismatch/data/cm-schema-create.sql @@ -0,0 +1 @@ +create database cm; diff --git a/br/tests/lightning_checksum_mismatch/data/cm.t-schema.sql b/br/tests/lightning_checksum_mismatch/data/cm.t-schema.sql new file mode 100644 index 0000000000000..f2e6ff4a1d4cf --- /dev/null +++ b/br/tests/lightning_checksum_mismatch/data/cm.t-schema.sql @@ -0,0 +1 @@ +create table t(a int primary key, b int, c int); diff --git a/br/tests/lightning_checksum_mismatch/data/cm.t.csv b/br/tests/lightning_checksum_mismatch/data/cm.t.csv new file mode 100644 index 0000000000000..a78ebe6001fde --- /dev/null +++ b/br/tests/lightning_checksum_mismatch/data/cm.t.csv @@ -0,0 +1,5 @@ +1,1,1 +3,3,3 +1,1,1 +2,2,2 +6,6,6 diff --git a/br/tests/lightning_checksum_mismatch/run.sh b/br/tests/lightning_checksum_mismatch/run.sh new file mode 100755 index 0000000000000..d13451d51ec5b --- /dev/null +++ b/br/tests/lightning_checksum_mismatch/run.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +set -eux + +run_lightning 2>&1 | grep -q "Error: checksum mismatched remote vs local" diff --git a/br/tests/lightning_distributed_import/config.toml b/br/tests/lightning_distributed_import/config.toml new file mode 100644 index 0000000000000..200af8e45dfdc --- /dev/null +++ b/br/tests/lightning_distributed_import/config.toml @@ -0,0 +1,9 @@ +[tikv-importer] +backend = 'local' +duplicate-resolution = 'none' + +[post-restore] +checksum = "required" + +[mydumper.csv] +header = false diff --git a/br/tests/lightning_distributed_import/data1/distributed_import-schema-create.sql b/br/tests/lightning_distributed_import/data1/distributed_import-schema-create.sql new file mode 100644 index 0000000000000..19c586879a959 --- /dev/null +++ b/br/tests/lightning_distributed_import/data1/distributed_import-schema-create.sql @@ -0,0 +1 @@ +create database distributed_import; diff --git a/br/tests/lightning_distributed_import/data1/distributed_import.t-schema.sql b/br/tests/lightning_distributed_import/data1/distributed_import.t-schema.sql new file mode 100644 index 0000000000000..7cf7f72809d33 --- /dev/null +++ b/br/tests/lightning_distributed_import/data1/distributed_import.t-schema.sql @@ -0,0 +1 @@ +create table t(a int primary key, b varchar(255), c double); diff --git a/br/tests/lightning_distributed_import/data1/distributed_import.t.csv b/br/tests/lightning_distributed_import/data1/distributed_import.t.csv new file mode 100644 index 0000000000000..7ee53cee3916e --- /dev/null +++ b/br/tests/lightning_distributed_import/data1/distributed_import.t.csv @@ -0,0 +1,5 @@ +1,a1,1.1 +3,b3,3.3 +5,c5,5.5 +7,d7,7.7 +9,e9,9.9 diff --git a/br/tests/lightning_distributed_import/data2/distributed_import-schema-create.sql b/br/tests/lightning_distributed_import/data2/distributed_import-schema-create.sql new file mode 100644 index 0000000000000..19c586879a959 --- /dev/null +++ b/br/tests/lightning_distributed_import/data2/distributed_import-schema-create.sql @@ -0,0 +1 @@ +create database distributed_import; diff --git a/br/tests/lightning_distributed_import/data2/distributed_import.t-schema.sql b/br/tests/lightning_distributed_import/data2/distributed_import.t-schema.sql new file mode 100644 index 0000000000000..7cf7f72809d33 --- /dev/null +++ b/br/tests/lightning_distributed_import/data2/distributed_import.t-schema.sql @@ -0,0 +1 @@ +create table t(a int primary key, b varchar(255), c double); diff --git a/br/tests/lightning_distributed_import/data2/distributed_import.t.csv b/br/tests/lightning_distributed_import/data2/distributed_import.t.csv new file mode 100644 index 0000000000000..1baadab31feac --- /dev/null +++ b/br/tests/lightning_distributed_import/data2/distributed_import.t.csv @@ -0,0 +1,5 @@ +2,a2,2.2 +4,b4,4.4 +6,c6,6.6 +8,d8,8.8 +10,e10,10.10 diff --git a/br/tests/lightning_distributed_import/run.sh b/br/tests/lightning_distributed_import/run.sh new file mode 100644 index 0000000000000..d21bf356b1568 --- /dev/null +++ b/br/tests/lightning_distributed_import/run.sh @@ -0,0 +1,36 @@ +#!/bin/bash +# +# Copyright 2021 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, +# 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. + +set -eux + +LOG_FILE1="$TEST_DIR/lightning-distributed-import1.log" +LOG_FILE2="$TEST_DIR/lightning-distributed-import2.log" + +# let lightning run a bit slow to avoid some table in the first lightning finish too fast. +export GO_FAILPOINTS="github.com/pingcap/tidb/br/pkg/lightning/restore/SlowDownImport=sleep(250)" + +run_lightning --backend local --sorted-kv-dir "$TEST_DIR/lightning_distributed_import.sorted1" \ + -d "tests/$TEST_NAME/data1" --log-file "$LOG_FILE1" --config "tests/$TEST_NAME/config.toml" & +pid1="$!" + +run_lightning --backend local --sorted-kv-dir "$TEST_DIR/lightning_distributed_import.sorted2" \ + -d "tests/$TEST_NAME/data2" --log-file "$LOG_FILE2" --config "tests/$TEST_NAME/config.toml" & +pid2="$!" + +wait "$pid1" "$pid2" + +run_sql 'select count(*) from distributed_import.t' +check_contains 'count(*): 10' diff --git a/br/tests/lightning_duplicate_detection/config1.toml b/br/tests/lightning_duplicate_detection/config1.toml index 43e21be00d81b..0b2b6df2a70e8 100644 --- a/br/tests/lightning_duplicate_detection/config1.toml +++ b/br/tests/lightning_duplicate_detection/config1.toml @@ -1,9 +1,11 @@ [lightning] task-info-schema-name = 'lightning_task_info' +index-concurrency = 10 +table-concurrency = 10 [tikv-importer] backend = "local" -duplicate-detection = true +duplicate-resolution = 'record' [checkpoint] enable = true diff --git a/br/tests/lightning_duplicate_detection/config2.toml b/br/tests/lightning_duplicate_detection/config2.toml index 5939f0e507109..e978ffb9cd8b5 100644 --- a/br/tests/lightning_duplicate_detection/config2.toml +++ b/br/tests/lightning_duplicate_detection/config2.toml @@ -1,9 +1,11 @@ [lightning] task-info-schema-name = 'lightning_task_info' +index-concurrency = 10 +table-concurrency = 10 [tikv-importer] backend = "local" -duplicate-detection = true +duplicate-resolution = 'record' [checkpoint] enable = true diff --git a/br/tests/lightning_duplicate_detection/run.sh b/br/tests/lightning_duplicate_detection/run.sh index 885f34d5e05a5..6aace9b8ae5e4 100644 --- a/br/tests/lightning_duplicate_detection/run.sh +++ b/br/tests/lightning_duplicate_detection/run.sh @@ -16,11 +16,14 @@ set -eux -check_cluster_version 4 0 0 'local backend' || exit 0 +check_cluster_version 5 2 0 'duplicate detection' || exit 0 LOG_FILE1="$TEST_DIR/lightning-duplicate-detection1.log" LOG_FILE2="$TEST_DIR/lightning-duplicate-detection2.log" +# let lightning run a bit slow to avoid some table in the first lightning finish too fast. +export GO_FAILPOINTS="github.com/pingcap/tidb/br/pkg/lightning/restore/SlowDownImport=sleep(250)" + run_lightning --backend local --sorted-kv-dir "$TEST_DIR/lightning_duplicate_detection.sorted1" \ --enable-checkpoint=1 --log-file "$LOG_FILE1" --config "tests/$TEST_NAME/config1.toml" & run_lightning --backend local --sorted-kv-dir "$TEST_DIR/lightning_duplicate_detection.sorted2" \ @@ -48,8 +51,8 @@ verify_detected_rows() { done done mapfile -t expect_rows < <(for row in "${expect_rows[@]}"; do echo "$row"; done | sort | uniq) - mapfile -t actual_rows < <(run_sql "SELECT row_data FROM lightning_task_info.conflict_error_v1 WHERE table_name = \"${table}\"" | - grep "row_data:" | sed 's/^.*(//' | sed 's/).*$//' | sed 's/, */,/g' | sort | uniq) + mapfile -t actual_rows < <(run_sql "SELECT row_data FROM lightning_task_info.conflict_error_v1 WHERE table_name = \"\`dup_detect\`.\`${table}\`\"" | + grep "row_data:" | sed 's/^.*(//' | sed 's/).*$//' | sed 's/"//g' | sed 's/, */,/g' | sort | uniq) equal=0 if [ "${#actual_rows[@]}" = "${#expect_rows[@]}" ]; then equal=1 @@ -63,7 +66,7 @@ verify_detected_rows() { fi set -x if [ "$equal" = "0" ]; then - echo "verify detected rows of ${table} fail, expect: ${expect_rows[@]}, actual: ${actual_rows[@]}" + echo "verify detected rows of ${table} fail, expect: ${expect_rows[*]}, actual: ${actual_rows[*]}" exit 1 fi } diff --git a/br/tests/lightning_duplicate_resolution/config.toml b/br/tests/lightning_duplicate_resolution/config.toml new file mode 100644 index 0000000000000..5454560eb7720 --- /dev/null +++ b/br/tests/lightning_duplicate_resolution/config.toml @@ -0,0 +1,16 @@ +[lightning] +task-info-schema-name = 'lightning_task_info' + +[tikv-importer] +backend = 'local' +duplicate-resolution = 'remove' + +[checkpoint] +enable = false + +[mydumper] +batch-size = 1 +# ensure each file is its own engine to facilitate cross-engine detection. + +[mydumper.csv] +header = true diff --git a/br/tests/lightning_duplicate_resolution/data/dup_resolve-schema-create.sql b/br/tests/lightning_duplicate_resolution/data/dup_resolve-schema-create.sql new file mode 100644 index 0000000000000..f8d42367a3d4c --- /dev/null +++ b/br/tests/lightning_duplicate_resolution/data/dup_resolve-schema-create.sql @@ -0,0 +1 @@ +create schema dup_resolve; diff --git a/br/tests/lightning_duplicate_resolution/data/dup_resolve.a-schema.sql b/br/tests/lightning_duplicate_resolution/data/dup_resolve.a-schema.sql new file mode 100644 index 0000000000000..897f9f20e1aae --- /dev/null +++ b/br/tests/lightning_duplicate_resolution/data/dup_resolve.a-schema.sql @@ -0,0 +1,7 @@ +create table a ( + a int primary key clustered, + b int not null unique, + c text, + d int generated always as (a + b), + key (d) +); diff --git a/br/tests/lightning_duplicate_resolution/data/dup_resolve.a.1.csv b/br/tests/lightning_duplicate_resolution/data/dup_resolve.a.1.csv new file mode 100644 index 0000000000000..3495e40d701e3 --- /dev/null +++ b/br/tests/lightning_duplicate_resolution/data/dup_resolve.a.1.csv @@ -0,0 +1,2 @@ +a,b,c +1,4,1.csv diff --git a/br/tests/lightning_duplicate_resolution/data/dup_resolve.a.2.csv b/br/tests/lightning_duplicate_resolution/data/dup_resolve.a.2.csv new file mode 100644 index 0000000000000..de89d220d0af1 --- /dev/null +++ b/br/tests/lightning_duplicate_resolution/data/dup_resolve.a.2.csv @@ -0,0 +1,2 @@ +a,b,c +1,5,2.csv diff --git a/br/tests/lightning_duplicate_resolution/data/dup_resolve.a.3.csv b/br/tests/lightning_duplicate_resolution/data/dup_resolve.a.3.csv new file mode 100644 index 0000000000000..08370bbb2e4ca --- /dev/null +++ b/br/tests/lightning_duplicate_resolution/data/dup_resolve.a.3.csv @@ -0,0 +1,2 @@ +a,b,c +1,6,3.csv diff --git a/br/tests/lightning_duplicate_resolution/data/dup_resolve.a.4.csv b/br/tests/lightning_duplicate_resolution/data/dup_resolve.a.4.csv new file mode 100644 index 0000000000000..a22ce6d2bd239 --- /dev/null +++ b/br/tests/lightning_duplicate_resolution/data/dup_resolve.a.4.csv @@ -0,0 +1,2 @@ +a,b,c +2,1,4.csv diff --git a/br/tests/lightning_duplicate_resolution/data/dup_resolve.a.5.csv b/br/tests/lightning_duplicate_resolution/data/dup_resolve.a.5.csv new file mode 100644 index 0000000000000..f4f1abd3669ea --- /dev/null +++ b/br/tests/lightning_duplicate_resolution/data/dup_resolve.a.5.csv @@ -0,0 +1,2 @@ +a,b,c +3,30,5.csv diff --git a/br/tests/lightning_duplicate_resolution/data/dup_resolve.a.6.csv b/br/tests/lightning_duplicate_resolution/data/dup_resolve.a.6.csv new file mode 100644 index 0000000000000..3c4367dbc5d2e --- /dev/null +++ b/br/tests/lightning_duplicate_resolution/data/dup_resolve.a.6.csv @@ -0,0 +1,2 @@ +a,b,c +3,30,6.csv diff --git a/br/tests/lightning_duplicate_resolution/data/dup_resolve.a.7.csv b/br/tests/lightning_duplicate_resolution/data/dup_resolve.a.7.csv new file mode 100644 index 0000000000000..7631a73641966 --- /dev/null +++ b/br/tests/lightning_duplicate_resolution/data/dup_resolve.a.7.csv @@ -0,0 +1,2 @@ +a,b,c +4,2,7.csv diff --git a/br/tests/lightning_duplicate_resolution/data/dup_resolve.a.8.csv b/br/tests/lightning_duplicate_resolution/data/dup_resolve.a.8.csv new file mode 100644 index 0000000000000..4fcd577f80475 --- /dev/null +++ b/br/tests/lightning_duplicate_resolution/data/dup_resolve.a.8.csv @@ -0,0 +1,2 @@ +a,b,c +5,2,8.csv diff --git a/br/tests/lightning_duplicate_resolution/data/dup_resolve.a.9.csv b/br/tests/lightning_duplicate_resolution/data/dup_resolve.a.9.csv new file mode 100644 index 0000000000000..740072446a27d --- /dev/null +++ b/br/tests/lightning_duplicate_resolution/data/dup_resolve.a.9.csv @@ -0,0 +1,4 @@ +a,b,c +5,7,9.csv#1 +6,8,9.csv#2 +6,9,9.csv#3 diff --git a/br/tests/lightning_duplicate_resolution/data/dup_resolve.b-schema.sql b/br/tests/lightning_duplicate_resolution/data/dup_resolve.b-schema.sql new file mode 100644 index 0000000000000..925fc25f1e8a9 --- /dev/null +++ b/br/tests/lightning_duplicate_resolution/data/dup_resolve.b-schema.sql @@ -0,0 +1,5 @@ +create table a ( + a int primary key nonclustered, + b int unique, + c varchar(100) unique +); diff --git a/br/tests/lightning_duplicate_resolution/data/dup_resolve.b.1.csv b/br/tests/lightning_duplicate_resolution/data/dup_resolve.b.1.csv new file mode 100644 index 0000000000000..3495e40d701e3 --- /dev/null +++ b/br/tests/lightning_duplicate_resolution/data/dup_resolve.b.1.csv @@ -0,0 +1,2 @@ +a,b,c +1,4,1.csv diff --git a/br/tests/lightning_duplicate_resolution/data/dup_resolve.b.2.csv b/br/tests/lightning_duplicate_resolution/data/dup_resolve.b.2.csv new file mode 100644 index 0000000000000..de89d220d0af1 --- /dev/null +++ b/br/tests/lightning_duplicate_resolution/data/dup_resolve.b.2.csv @@ -0,0 +1,2 @@ +a,b,c +1,5,2.csv diff --git a/br/tests/lightning_duplicate_resolution/data/dup_resolve.b.3.csv b/br/tests/lightning_duplicate_resolution/data/dup_resolve.b.3.csv new file mode 100644 index 0000000000000..08370bbb2e4ca --- /dev/null +++ b/br/tests/lightning_duplicate_resolution/data/dup_resolve.b.3.csv @@ -0,0 +1,2 @@ +a,b,c +1,6,3.csv diff --git a/br/tests/lightning_duplicate_resolution/data/dup_resolve.b.4.csv b/br/tests/lightning_duplicate_resolution/data/dup_resolve.b.4.csv new file mode 100644 index 0000000000000..a22ce6d2bd239 --- /dev/null +++ b/br/tests/lightning_duplicate_resolution/data/dup_resolve.b.4.csv @@ -0,0 +1,2 @@ +a,b,c +2,1,4.csv diff --git a/br/tests/lightning_duplicate_resolution/data/dup_resolve.b.5.csv b/br/tests/lightning_duplicate_resolution/data/dup_resolve.b.5.csv new file mode 100644 index 0000000000000..f4f1abd3669ea --- /dev/null +++ b/br/tests/lightning_duplicate_resolution/data/dup_resolve.b.5.csv @@ -0,0 +1,2 @@ +a,b,c +3,30,5.csv diff --git a/br/tests/lightning_duplicate_resolution/data/dup_resolve.b.6.csv b/br/tests/lightning_duplicate_resolution/data/dup_resolve.b.6.csv new file mode 100644 index 0000000000000..3c4367dbc5d2e --- /dev/null +++ b/br/tests/lightning_duplicate_resolution/data/dup_resolve.b.6.csv @@ -0,0 +1,2 @@ +a,b,c +3,30,6.csv diff --git a/br/tests/lightning_duplicate_resolution/data/dup_resolve.b.7.csv b/br/tests/lightning_duplicate_resolution/data/dup_resolve.b.7.csv new file mode 100644 index 0000000000000..7631a73641966 --- /dev/null +++ b/br/tests/lightning_duplicate_resolution/data/dup_resolve.b.7.csv @@ -0,0 +1,2 @@ +a,b,c +4,2,7.csv diff --git a/br/tests/lightning_duplicate_resolution/data/dup_resolve.b.8.csv b/br/tests/lightning_duplicate_resolution/data/dup_resolve.b.8.csv new file mode 100644 index 0000000000000..7f8b0d9ccdc2f --- /dev/null +++ b/br/tests/lightning_duplicate_resolution/data/dup_resolve.b.8.csv @@ -0,0 +1,4 @@ +a,b,c +5,2,8.csv#1 +7,\N,8.csv#2 +8,\N,8.csv#3 diff --git a/br/tests/lightning_duplicate_resolution/data/dup_resolve.b.9.csv b/br/tests/lightning_duplicate_resolution/data/dup_resolve.b.9.csv new file mode 100644 index 0000000000000..740072446a27d --- /dev/null +++ b/br/tests/lightning_duplicate_resolution/data/dup_resolve.b.9.csv @@ -0,0 +1,4 @@ +a,b,c +5,7,9.csv#1 +6,8,9.csv#2 +6,9,9.csv#3 diff --git a/br/tests/lightning_duplicate_resolution/data/dup_resolve.c-schema.sql b/br/tests/lightning_duplicate_resolution/data/dup_resolve.c-schema.sql new file mode 100644 index 0000000000000..af55f189bf776 --- /dev/null +++ b/br/tests/lightning_duplicate_resolution/data/dup_resolve.c-schema.sql @@ -0,0 +1,7 @@ +create table c ( + a double not null, + b decimal not null, + c text, + primary key (a, b) clustered, + unique key (b, c(10)) +); diff --git a/br/tests/lightning_duplicate_resolution/data/dup_resolve.c.1.csv b/br/tests/lightning_duplicate_resolution/data/dup_resolve.c.1.csv new file mode 100644 index 0000000000000..bf68021fda093 --- /dev/null +++ b/br/tests/lightning_duplicate_resolution/data/dup_resolve.c.1.csv @@ -0,0 +1,9 @@ +a,b,c +2,1,1.csv#1 +3,0,1.csv#2 +5,1,1.csv#3 +7,0,1.csv#4 +1,1,1.csv#5 +3,0,1.csv#6 +7,1,1.csv#7 +9,0,1.csv#8 diff --git a/br/tests/lightning_duplicate_resolution/data/dup_resolve.c.2.csv b/br/tests/lightning_duplicate_resolution/data/dup_resolve.c.2.csv new file mode 100644 index 0000000000000..2486d72cfc90f --- /dev/null +++ b/br/tests/lightning_duplicate_resolution/data/dup_resolve.c.2.csv @@ -0,0 +1,9 @@ +a,b,c +1,1,2.csv#1 +4,0,2.csv#2 +9,1,2.csv#3 +6,0,2.csv#4 +5,1,2.csv#5 +6,0,2.csv#6 +9,1,2.csv#7 +4,0,2.csv#8 diff --git a/br/tests/lightning_duplicate_resolution/run.sh b/br/tests/lightning_duplicate_resolution/run.sh new file mode 100644 index 0000000000000..9012ec0edbfda --- /dev/null +++ b/br/tests/lightning_duplicate_resolution/run.sh @@ -0,0 +1,65 @@ +#!/bin/bash +# +# Copyright 2021 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, +# 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. + +set -eux + +check_cluster_version 5 2 0 'duplicate detection' || exit 0 + +run_lightning + +# Ensure all tables are consistent. +run_sql 'admin check table dup_resolve.a' +run_sql 'admin check table dup_resolve.b' +run_sql 'admin check table dup_resolve.c' + +## Table "a" has a clustered integer key and generated column. + +# only one row remains (2, 1, 4.csv). all others are duplicates 🤷 +run_sql 'select count(*) from dup_resolve.a' +check_contains 'count(*): 1' + +run_sql 'select * from dup_resolve.a' +check_contains 'a: 2' +check_contains 'b: 1' +check_contains 'c: 4.csv' +check_contains 'd: 3' + +## Table "b" has a nonclustered integer key and nullable unique column. +run_sql 'select count(*) from dup_resolve.b' +check_contains 'count(*): 3' + +run_sql 'select * from dup_resolve.b where a = 2' +check_contains 'b: 1' +check_contains 'c: 4.csv' +run_sql 'select * from dup_resolve.b where a = 7' +check_contains 'b: NULL' +check_contains 'c: 8.csv#2' +run_sql 'select * from dup_resolve.b where a = 8' +check_contains 'b: NULL' +check_contains 'c: 8.csv#3' + +## Table "c" has a clustered non-integer key. +run_sql 'select count(*) from dup_resolve.c' +check_contains 'count(*): 4' + +run_sql 'select c from dup_resolve.c where a = 2 and b = 1' +check_contains 'c: 1.csv#1' +run_sql 'select c from dup_resolve.c where a = 7 and b = 0' +check_contains 'c: 1.csv#4' +run_sql 'select c from dup_resolve.c where a = 7 and b = 1' +check_contains 'c: 1.csv#7' +run_sql 'select c from dup_resolve.c where a = 9 and b = 0' +check_contains 'c: 1.csv#8' diff --git a/br/tests/lightning_examples/run.sh b/br/tests/lightning_examples/run.sh index ce66e6a42b781..fb22dd578fb03 100755 --- a/br/tests/lightning_examples/run.sh +++ b/br/tests/lightning_examples/run.sh @@ -16,7 +16,7 @@ set -eu -EXAMPLES_PATH=${EXAMPLES_PATH:-pkg/lightning/mydump/examples} +EXAMPLES_PATH=${EXAMPLES_PATH:-br/pkg/lightning/mydump/examples} # Because of issue JENKINS-45544 we can't use the Unicode filename in the # examples. We are going to rename it in-place. diff --git a/br/tests/lightning_s3/run.sh b/br/tests/lightning_s3/run.sh index 6fed0af2b81da..5b2973784fd7e 100755 --- a/br/tests/lightning_s3/run.sh +++ b/br/tests/lightning_s3/run.sh @@ -62,6 +62,20 @@ _EOF_ run_sql "DROP DATABASE IF EXISTS $DB;" run_sql "DROP TABLE IF EXISTS $DB.$TABLE;" +# test not exist path +rm -f $TEST_DIR/lightning.log +SOURCE_DIR="s3://$BUCKET/not-exist-path?endpoint=http%3A//127.0.0.1%3A9900&access_key=$MINIO_ACCESS_KEY&secret_access_key=$MINIO_SECRET_KEY&force_path_style=true" +! run_lightning -d $SOURCE_DIR --backend local 2> /dev/null +grep -Eq "data-source-dir .* doesn't exist or contains no files" $TEST_DIR/lightning.log + +# test empty dir +rm -f $TEST_DIR/lightning.log +emptyPath=empty-bucket/empty-path +mkdir -p $DBPATH/$emptyPath +SOURCE_DIR="s3://$emptyPath/not-exist-path?endpoint=http%3A//127.0.0.1%3A9900&access_key=$MINIO_ACCESS_KEY&secret_access_key=$MINIO_SECRET_KEY&force_path_style=true" +! run_lightning -d $SOURCE_DIR --backend local 2> /dev/null +grep -Eq "data-source-dir .* doesn't exist or contains no files" $TEST_DIR/lightning.log + SOURCE_DIR="s3://$BUCKET/?endpoint=http%3A//127.0.0.1%3A9900&access_key=$MINIO_ACCESS_KEY&secret_access_key=$MINIO_SECRET_KEY&force_path_style=true" run_lightning -d $SOURCE_DIR --backend local 2> /dev/null run_sql "SELECT count(*), sum(i) FROM \`$DB\`.$TABLE" diff --git a/br/tests/lightning_sqlmode/on.toml b/br/tests/lightning_sqlmode/on.toml index 4bd09629d1394..c78047e08516f 100644 --- a/br/tests/lightning_sqlmode/on.toml +++ b/br/tests/lightning_sqlmode/on.toml @@ -1,3 +1,7 @@ +[lightning] +max-error = 20 +task-info-schema-name = 'sqlmodedb_lightning_task_info' + [tikv-importer] backend = 'local' diff --git a/br/tests/lightning_sqlmode/run.sh b/br/tests/lightning_sqlmode/run.sh index e2829964009dc..81d44c2450d6d 100755 --- a/br/tests/lightning_sqlmode/run.sh +++ b/br/tests/lightning_sqlmode/run.sh @@ -49,10 +49,39 @@ check_contains 'hex(c): ' check_contains 'd: ' run_sql 'DROP DATABASE IF EXISTS sqlmodedb' +run_sql 'DROP DATABASE IF EXISTS sqlmodedb_lightning_task_info' -set +e run_lightning --config "tests/$TEST_NAME/on.toml" --log-file "$TEST_DIR/sqlmode-error.log" -[ $? -ne 0 ] || exit 1 -set -e grep -q '\["kv convert failed"\].*\[original=.*kind=uint64,val=9.*\] \[originalCol=1\] \[colName=a\] \[colType="timestamp BINARY"\]' "$TEST_DIR/sqlmode-error.log" + +run_sql 'SELECT min(id), max(id) FROM sqlmodedb.t' +check_contains 'min(id): 4' +check_contains 'max(id): 4' + +run_sql 'SELECT count(*) FROM sqlmodedb_lightning_task_info.type_error_v1' +check_contains 'count(*): 4' + +run_sql 'SELECT path, `offset`, error, row_data FROM sqlmodedb_lightning_task_info.type_error_v1 WHERE table_name = "`sqlmodedb`.`t`" AND row_data LIKE "(1,%";' +check_contains 'path: sqlmodedb.t.1.sql' +check_contains 'offset: 53' +check_contains 'cannot convert datum from unsigned bigint to type timestamp.' +check_contains "row_data: (1,9,128,'too long','x,y,z')" + +run_sql 'SELECT path, `offset`, error, row_data FROM sqlmodedb_lightning_task_info.type_error_v1 WHERE table_name = "`sqlmodedb`.`t`" AND row_data LIKE "(2,%";' +check_contains 'path: sqlmodedb.t.1.sql' +check_contains 'offset: 100' +check_contains "Incorrect timestamp value: '2000-00-00 00:00:00'" +check_contains "row_data: (2,'2000-00-00 00:00:00',-99999,'🤩',3)" + +run_sql 'SELECT path, `offset`, error, row_data FROM sqlmodedb_lightning_task_info.type_error_v1 WHERE table_name = "`sqlmodedb`.`t`" AND row_data LIKE "(3,%";' +check_contains 'path: sqlmodedb.t.1.sql' +check_contains 'offset: 149' +check_contains "Incorrect timestamp value: '9999-12-31 23:59:59'" +check_contains "row_data: (3,'9999-12-31 23:59:59','NaN',x'99','x+y')" + +run_sql 'SELECT path, `offset`, error, row_data FROM sqlmodedb_lightning_task_info.type_error_v1 WHERE table_name = "`sqlmodedb`.`t`" AND row_data LIKE "(5,%";' +check_contains 'path: sqlmodedb.t.1.sql' +check_contains 'offset: 237' +check_contains "Column 'a' cannot be null" +check_contains "row_data: (5,NULL,NULL,NULL,NULL)" diff --git a/br/tests/lightning_tidb_rowid/data/rowid.explicit_tidb_rowid-schema.sql b/br/tests/lightning_tidb_rowid/data/rowid.explicit_tidb_rowid-schema.sql index 4f1d634485cca..55232f2ff6081 100644 --- a/br/tests/lightning_tidb_rowid/data/rowid.explicit_tidb_rowid-schema.sql +++ b/br/tests/lightning_tidb_rowid/data/rowid.explicit_tidb_rowid-schema.sql @@ -1 +1 @@ -create table explicit_tidb_rowid (pk varchar(6) primary key); \ No newline at end of file +create table explicit_tidb_rowid (pk varchar(6) primary key /*T![clustered_index] NONCLUSTERED */); diff --git a/br/tests/lightning_tidb_rowid/data/rowid.specific_auto_inc-schema.sql b/br/tests/lightning_tidb_rowid/data/rowid.specific_auto_inc-schema.sql index f6962e15a0072..a69f5bf4350eb 100644 --- a/br/tests/lightning_tidb_rowid/data/rowid.specific_auto_inc-schema.sql +++ b/br/tests/lightning_tidb_rowid/data/rowid.specific_auto_inc-schema.sql @@ -1 +1 @@ -create table specific_auto_inc (a varchar(6) primary key, b int unique auto_increment) auto_increment=80000; \ No newline at end of file +create table specific_auto_inc (a varchar(6) primary key /*T![clustered_index] NONCLUSTERED */, b int unique auto_increment) auto_increment=80000; diff --git a/br/tests/run.sh b/br/tests/run.sh index 140491caddc90..bbf17deb3e715 100755 --- a/br/tests/run.sh +++ b/br/tests/run.sh @@ -28,7 +28,7 @@ SELECTED_TEST_NAME="${TEST_NAME-$(find tests -mindepth 2 -maxdepth 2 -name run.s source tests/_utils/run_services trap stop_services EXIT -start_services +start_services $@ # Intermediate file needed because read can be used as a pipe target. # https://stackoverflow.com/q/2746553/ diff --git a/br/tidb-lightning.toml b/br/tidb-lightning.toml index e28a5e5bbffc9..8840eba06bb1d 100644 --- a/br/tidb-lightning.toml +++ b/br/tidb-lightning.toml @@ -99,10 +99,15 @@ addr = "127.0.0.1:8287" # - ignore: keep the old record and ignore the new record (i.e. insert rows using "INSERT IGNORE INTO") # - error: produce an error (i.e. insert rows using "INSERT INTO"), which will count towards the max-error limit. #on-duplicate = "replace" -# Whether to detect duplicate records (unique key conflict) when the backend is 'local'. -# If enabled, duplicate records will be written to `lightning_metadata.conflict_error_v1` table on the target TiDB. -# Enabling duplicate detection will turn off remote checksum computation. -#duplicate-detection = false +# Whether to detect and resolve duplicate records (unique key conflict) when the backend is 'local'. +# Current supports three resolution algorithms: +# - none: doesn't detect duplicate records, which has the best performance of the three algorithms, but probably leads to +# inconsistent data in the target TiDB. +# - record: only records duplicate records to `lightning_task_info.conflict_error_v1` table on the target TiDB. Note that this +# required the version of target TiKV version is no less than v5.2.0, otherwise it will fallback to 'none'. +# - remove: records all duplicate records like the 'record' algorithm and remove all duplicate records to ensure a consistent +# state in the target TiDB. +#duplicate-resolution = 'none' # Maximum KV size of SST files produced in the 'local' backend. This should be the same as # the TiKV region size to avoid further region splitting. The default value is 96 MiB. #region-split-size = '96MiB' @@ -161,6 +166,22 @@ no-schema = false # note that the *data* files are always parsed as binary regardless of schema encoding. #character-set = "auto" +# Specifies the character set of the source data file. Lightning converts the source file from the specified character set to UTF-8 encoding when importing. +# Currently, this configuration only specifies the character set of the CSV files with the following options supported: +# - utf8mb4: Indicates that the source data file uses UTF-8 encoding. +# - GB18030: Indicates that the source data file uses the GB-18030 encoding. +# - GBK: The source data file uses GBK encoding (GBK encoding is an extension of the GB-2312 character set, also known as Code Page 936). +# - binary: Indicates that Lightning does not convert the encoding (by default). +# If left blank, the default value "binary" is used, that is to say, Lightning does not convert the encoding. +# Note that Lightning does not predict about the character set of the source data file and only converts the source file and import the data based on this configuration. +# If the value of this configuration is not the same as the actual encoding of the source data file, a failed import, data loss or data disorder might appear. +data-character-set = "binary" +# Specifies the replacement character in case of incompatible characters during the character set conversion of the source data file. +# This configuration must not be duplicated with field separators, quote definers, and line breaks. +# The default value is "\uFFFD", which is the "error" Rune or Unicode replacement character in UTF-8 encoding. +# Changing the default value might result in potential degradation of parsing performance for the source data file. +data-invalid-char-replace = "\uFFFD" + # make table and database names case-sensitive, i.e. treats `DB`.`TBL` and `db`.`tbl` as two # different objects. Currently only affects [[routes]]. case-sensitive = false diff --git a/cmd/benchdb/main.go b/cmd/benchdb/main.go index cd8819dde940a..4b32f5b1aa1cb 100644 --- a/cmd/benchdb/main.go +++ b/cmd/benchdb/main.go @@ -125,7 +125,7 @@ func (ut *benchDB) mustExec(sql string, args ...interface{}) { } if rs != nil { ctx := context.Background() - req := rs.NewChunk() + req := rs.NewChunk(nil) for { err := rs.Next(ctx, req) if err != nil { diff --git a/cmd/benchfilesort/README.md b/cmd/benchfilesort/README.md deleted file mode 100644 index 79dd784a5709f..0000000000000 --- a/cmd/benchfilesort/README.md +++ /dev/null @@ -1,121 +0,0 @@ -## BenchFileSort - -BenchFileSort is a command line tool to test the performance of util/filesort. - -### Quick Start (Examples) - -Step 1 - Generate the synthetic data - -``` -./benchfilesort gen -keySize 8 -valSize 16 -scale 1000 -``` - -Expected output: - -``` -Generating... -Done! -Data placed in: /path/to/data.out -Time used: xxxx ms -================================= -``` - -Step 2 - Load the data and run the benchmark - -``` -./benchfilesort run -bufSize 50 -nWorkers 1 -inputRatio 100 -outputRatio 50 -``` - -Expected output: - -``` -Loading... - number of rows = 1000, key size = 8, value size = 16 - load 1000 rows -Done! -Loaded 1000 rows -Time used: xxxx ms -================================= -Inputing... -Done! -Input 1000 rows -Time used: xxxx s -================================= -Outputing... -Done! -Output 500 rows -Time used: xxxx ms -================================= -Closing... -Done! -Time used: xxxx ms -================================= -``` - -For performance tuning purpose, `Input` time and `Output` time are two KPIs you should focus on. -`Close` time reflects the GC performance, which might be noteworthy sometimes. - -### Commands and Arguments - -#### `gen` command - -The `gen` command generate the synthetic data for the benchmark. - -You can specify how many rows you want to generate, the key size -and value size for each row. - -The generated data is located in `$dir/data.out` (`$dir` is specified -by the `dir` argument). - -The `gen` command supports the following arguments: - -* `dir` (default: current working directory) - Specify the home directory of generated data - -* `keySize` (default: 8) - Specify the key size for generated rows - -* `valSize` (default: 8) - Specify the value size for generated rows - -* `scale` (default: 100) - Specify how many rows to generate - -* `cpuprofile` (default: "") - Turn on the CPU profile - -#### `run` command - -The `run` command load the synthetic data and run the benchmark. - -You can specify the home directory of the synthetic data. - -The benchmark will use predefined amount of memory, which is controlled -by the `bufSize` argument, to run the test. - -You can control how many rows to input into and output from, which are -defined by the `inputRatio` and `outputRatio` arguments. - -The `run` command supports the following arguments: - -* `dir` (default: current working directory) - Specify the home directory of synthetic data - -* `bufSize` (default: 500000) - Specify the amount of memory used by the benchmark - -* `nWorkers` (default: 1) - Specify the number of workers used in async sorting - -* `inputRatio` (default: 100) - Specify the percentage of rows to input: - - `# of rows to input = # of total rows * inputRatio / 100` - -* `outputRatio` (default: 100) - Specify the percentage of rows to output: - - `# of rows to output = # of rows to input * outputRatio / 100` - -* `cpuprofile` (default: "") - Turn on the CPU profile diff --git a/cmd/benchfilesort/main.go b/cmd/benchfilesort/main.go deleted file mode 100644 index 9a518cf0d5d4b..0000000000000 --- a/cmd/benchfilesort/main.go +++ /dev/null @@ -1,439 +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, -// 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. - -package main - -import ( - "encoding/binary" - "flag" - "fmt" - "math/rand" - "os" - "path/filepath" - "runtime/pprof" - "time" - - "github.com/pingcap/errors" - "github.com/pingcap/log" - "github.com/pingcap/tidb/parser/terror" - "github.com/pingcap/tidb/sessionctx/stmtctx" - "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/codec" - "github.com/pingcap/tidb/util/filesort" - "github.com/pingcap/tidb/util/logutil" -) - -type comparableRow struct { - key []types.Datum - val []types.Datum - handle int64 -} - -var ( - genCmd = flag.NewFlagSet("gen", flag.ExitOnError) - runCmd = flag.NewFlagSet("run", flag.ExitOnError) - - logLevel = "warn" - cpuprofile string - tmpDir string - keySize int - valSize int - bufSize int - scale int - nWorkers int - inputRatio int - outputRatio int -) - -// #nosec G404 -func nextRow(r *rand.Rand, keySize int, valSize int) *comparableRow { - key := make([]types.Datum, keySize) - for i := range key { - key[i] = types.NewDatum(r.Int()) - } - - val := make([]types.Datum, valSize) - for j := range val { - val[j] = types.NewDatum(r.Int()) - } - - handle := r.Int63() - return &comparableRow{key: key, val: val, handle: handle} -} - -func encodeRow(b []byte, row *comparableRow) ([]byte, error) { - var ( - err error - head = make([]byte, 8) - body []byte - ) - sc := &stmtctx.StatementContext{TimeZone: time.Local} - body, err = codec.EncodeKey(sc, body, row.key...) - if err != nil { - return b, errors.Trace(err) - } - body, err = codec.EncodeKey(sc, body, row.val...) - if err != nil { - return b, errors.Trace(err) - } - body, err = codec.EncodeKey(sc, body, types.NewIntDatum(row.handle)) - if err != nil { - return b, errors.Trace(err) - } - - binary.BigEndian.PutUint64(head, uint64(len(body))) - - b = append(b, head...) - b = append(b, body...) - - return b, nil -} - -func decodeRow(fd *os.File) (*comparableRow, error) { - var ( - err error - n int - head = make([]byte, 8) - dcod = make([]types.Datum, 0, keySize+valSize+1) - ) - - n, err = fd.Read(head) - if n != 8 { - return nil, errors.New("incorrect header") - } - if err != nil { - return nil, errors.Trace(err) - } - - rowSize := int(binary.BigEndian.Uint64(head)) - rowBytes := make([]byte, rowSize) - - n, err = fd.Read(rowBytes) - if n != rowSize { - return nil, errors.New("incorrect row") - } - if err != nil { - return nil, errors.Trace(err) - } - - dcod, err = codec.Decode(rowBytes, keySize+valSize+1) - if err != nil { - return nil, errors.Trace(err) - } - - return &comparableRow{ - key: dcod[:keySize], - val: dcod[keySize : keySize+valSize], - handle: dcod[keySize+valSize:][0].GetInt64(), - }, nil -} - -func encodeMeta(b []byte, scale int, keySize int, valSize int) []byte { - meta := make([]byte, 8) - - binary.BigEndian.PutUint64(meta, uint64(scale)) - b = append(b, meta...) - binary.BigEndian.PutUint64(meta, uint64(keySize)) - b = append(b, meta...) - binary.BigEndian.PutUint64(meta, uint64(valSize)) - b = append(b, meta...) - - return b -} - -func decodeMeta(fd *os.File) error { - meta := make([]byte, 24) - if n, err := fd.Read(meta); err != nil || n != 24 { - if n != 24 { - return errors.New("incorrect meta data") - } - return errors.Trace(err) - } - - scale = int(binary.BigEndian.Uint64(meta[:8])) - if scale <= 0 { - return errors.New("number of rows must be positive") - } - - keySize = int(binary.BigEndian.Uint64(meta[8:16])) - if keySize <= 0 { - return errors.New("key size must be positive") - } - - valSize = int(binary.BigEndian.Uint64(meta[16:])) - if valSize <= 0 { - return errors.New("value size must be positive") - } - - return nil -} - -/* - * The synthetic data is exported as a binary format. - * The encoding format is: - * 1) Meta Data - * Three 64-bit integers represent scale size, key size and value size. - * 2) Row Data - * Each row is encoded as: - * One 64-bit integer represent the row size in bytes, followed by the - * the actual row bytes. - */ -// #nosec G404 -func export() error { - var outputBytes []byte - - fileName := filepath.Join(tmpDir, "data.out") - outputFile, err := os.OpenFile(fileName, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) - if err != nil { - return errors.Trace(err) - } - defer terror.Call(outputFile.Close) - - outputBytes = encodeMeta(outputBytes, scale, keySize, valSize) - - seed := rand.NewSource(time.Now().UnixNano()) - r := rand.New(seed) - - for i := 1; i <= scale; i++ { - outputBytes, err = encodeRow(outputBytes, nextRow(r, keySize, valSize)) - if err != nil { - return errors.Trace(err) - } - _, err = outputFile.Write(outputBytes) - if err != nil { - return errors.Trace(err) - } - outputBytes = outputBytes[:0] - } - - return nil -} - -func load(ratio int) ([]*comparableRow, error) { - var ( - err error - fd *os.File - ) - - fileName := filepath.Join(tmpDir, "data.out") - fd, err = os.Open(fileName) - if os.IsNotExist(err) { - return nil, errors.New("data file (data.out) does not exist") - } - if err != nil { - return nil, errors.Trace(err) - } - defer terror.Call(fd.Close) - - err = decodeMeta(fd) - if err != nil { - return nil, errors.Trace(err) - } - - cLogf("\tnumber of rows = %d, key size = %d, value size = %d", scale, keySize, valSize) - - var ( - row *comparableRow - rows = make([]*comparableRow, 0, scale) - ) - - totalRows := int(float64(scale) * (float64(ratio) / 100.0)) - cLogf("\tload %d rows", totalRows) - for i := 1; i <= totalRows; i++ { - row, err = decodeRow(fd) - if err != nil { - return nil, errors.Trace(err) - } - rows = append(rows, row) - } - - return rows, nil -} - -func driveGenCmd() { - err := genCmd.Parse(os.Args[2:]) - terror.MustNil(err) - // Sanity checks - if keySize <= 0 { - log.Fatal("key size must be positive") - } - if valSize <= 0 { - log.Fatal("value size must be positive") - } - if scale <= 0 { - log.Fatal("scale must be positive") - } - if _, err = os.Stat(tmpDir); err != nil { - if os.IsNotExist(err) { - log.Fatal("tmpDir does not exist") - } - log.Fatal(err.Error()) - } - - cLog("Generating...") - start := time.Now() - err = export() - terror.MustNil(err) - cLog("Done!") - cLogf("Data placed in: %s", filepath.Join(tmpDir, "data.out")) - cLog("Time used: ", time.Since(start)) - cLog("=================================") -} - -func driveRunCmd() { - err := runCmd.Parse(os.Args[2:]) - terror.MustNil(err) - // Sanity checks - if bufSize <= 0 { - log.Fatal("buffer size must be positive") - } - if nWorkers <= 0 { - log.Fatal("the number of workers must be positive") - } - if inputRatio < 0 || inputRatio > 100 { - log.Fatal("input ratio must between 0 and 100 (inclusive)") - } - if outputRatio < 0 || outputRatio > 100 { - log.Fatal("output ratio must between 0 and 100 (inclusive)") - } - if _, err = os.Stat(tmpDir); err != nil { - if os.IsNotExist(err) { - log.Fatal("tmpDir does not exist") - } - terror.MustNil(err) - } - - var ( - dir string - profile *os.File - fs *filesort.FileSorter - ) - cLog("Loading...") - start := time.Now() - data, err := load(inputRatio) - terror.MustNil(err) - cLog("Done!") - cLogf("Loaded %d rows", len(data)) - cLog("Time used: ", time.Since(start)) - cLog("=================================") - - sc := new(stmtctx.StatementContext) - fsBuilder := new(filesort.Builder) - byDesc := make([]bool, keySize) - for i := 0; i < keySize; i++ { - byDesc[i] = false - } - dir, err = os.MkdirTemp(tmpDir, "benchfilesort_test") - terror.MustNil(err) - fs, err = fsBuilder.SetSC(sc).SetSchema(keySize, valSize).SetBuf(bufSize).SetWorkers(nWorkers).SetDesc(byDesc).SetDir(dir).Build() - terror.MustNil(err) - - if cpuprofile != "" { - profile, err = os.Create(cpuprofile) - terror.MustNil(err) - } - - cLog("Inputing...") - start = time.Now() - for _, r := range data { - err = fs.Input(r.key, r.val, r.handle) - terror.MustNil(err) - } - cLog("Done!") - cLogf("Input %d rows", len(data)) - cLog("Time used: ", time.Since(start)) - cLog("=================================") - - cLog("Outputing...") - totalRows := int(float64(len(data)) * (float64(outputRatio) / 100.0)) - start = time.Now() - if cpuprofile != "" { - err = pprof.StartCPUProfile(profile) - terror.MustNil(err) - } - for i := 0; i < totalRows; i++ { - _, _, _, err = fs.Output() - terror.MustNil(err) - } - if cpuprofile != "" { - pprof.StopCPUProfile() - } - cLog("Done!") - cLogf("Output %d rows", totalRows) - cLog("Time used: ", time.Since(start)) - cLog("=================================") - - cLog("Closing...") - start = time.Now() - err = fs.Close() - terror.MustNil(err) - cLog("Done!") - cLog("Time used: ", time.Since(start)) - cLog("=================================") -} - -func init() { - err := logutil.InitLogger(logutil.NewLogConfig(logLevel, logutil.DefaultLogFormat, "", logutil.EmptyFileLogConfig, false)) - terror.MustNil(err) - cwd, err1 := os.Getwd() - terror.MustNil(err1) - - genCmd.StringVar(&tmpDir, "dir", cwd, "where to store the generated rows") - genCmd.IntVar(&keySize, "keySize", 8, "the size of key") - genCmd.IntVar(&valSize, "valSize", 8, "the size of value") - genCmd.IntVar(&scale, "scale", 100, "how many rows to generate") - genCmd.StringVar(&cpuprofile, "cpuprofile", "", "write cpu profile to file") - - runCmd.StringVar(&tmpDir, "dir", cwd, "where to load the generated rows") - runCmd.IntVar(&bufSize, "bufSize", 500000, "how many rows held in memory at a time") - runCmd.IntVar(&nWorkers, "nWorkers", 1, "how many workers used in async sorting") - runCmd.IntVar(&inputRatio, "inputRatio", 100, "input percentage") - runCmd.IntVar(&outputRatio, "outputRatio", 100, "output percentage") - runCmd.StringVar(&cpuprofile, "cpuprofile", "", "write cpu profile to file") -} - -func main() { - flag.Parse() - - if len(os.Args) == 1 { - fmt.Printf("Usage:\n\n") - fmt.Printf("\tbenchfilesort command [arguments]\n\n") - fmt.Printf("The commands are:\n\n") - fmt.Println("\tgen\t", "generate rows") - fmt.Println("\trun\t", "run tests") - fmt.Println("") - fmt.Println("Checkout benchfilesort/README for more information.") - return - } - - switch os.Args[1] { - case "gen": - driveGenCmd() - case "run": - driveRunCmd() - default: - fmt.Printf("%q is not valid command.\n", os.Args[1]) - os.Exit(2) - } -} - -func cLogf(format string, args ...interface{}) { - str := fmt.Sprintf(format, args...) - fmt.Println("\033[0;32m" + str + "\033[0m") -} - -func cLog(args ...interface{}) { - str := fmt.Sprint(args...) - fmt.Println("\033[0;32m" + str + "\033[0m") -} diff --git a/cmd/ddltest/column_serial_test.go b/cmd/ddltest/column_serial_test.go index 42e5ac930b216..eb926a7a67eb1 100644 --- a/cmd/ddltest/column_serial_test.go +++ b/cmd/ddltest/column_serial_test.go @@ -24,9 +24,6 @@ import ( "github.com/pingcap/log" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/parser/terror" - plannercore "github.com/pingcap/tidb/planner/core" - "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/types" @@ -209,43 +206,3 @@ func (s *ddlSuite) execColumnOperations(t *testing.T, workerNum, count int, rowI } wg.Wait() } - -func TestCommitWhenSchemaChanged(t *testing.T) { - s := createDDLSuite(t) - defer s.teardown(t) - - s.mustExec("drop table if exists test_commit") - s.mustExec("create table test_commit (a int, b int)") - s.mustExec("insert into test_commit values (1, 1)") - s.mustExec("insert into test_commit values (2, 2)") - - s1, err := session.CreateSession(s.store) - require.NoError(t, err) - ctx := goctx.Background() - _, err = s1.Execute(ctx, "use test_ddl") - require.NoError(t, err) - _, err = s1.Execute(ctx, "begin") - require.NoError(t, err) - _, err = s1.Execute(ctx, "insert into test_commit values (3, 3)") - require.NoError(t, err) - - s.mustExec("alter table test_commit drop column b") - - // When this transaction commit, it will find schema already changed. - _, err = s1.Execute(ctx, "insert into test_commit values (4, 4)") - require.NoError(t, err) - _, err = s1.Execute(ctx, "commit") - require.Truef(t, terror.ErrorEqual(err, plannercore.ErrWrongValueCountOnRow), "err: %v", err) -} - -func TestForIssue24621(t *testing.T) { - s := createDDLSuite(t) - defer s.teardown(t) - - s.mustExec("use test") - s.mustExec("drop table if exists t") - s.mustExec("create table t(a char(250));") - s.mustExec("insert into t values('0123456789abc');") - _, err := s.exec("alter table t modify a char(12) null;") - require.EqualError(t, err, "[types:1265]Data truncated for column 'a', value is '0123456789abc'") -} diff --git a/cmd/ddltest/ddl_serial_test.go b/cmd/ddltest/ddl_serial_test.go index d5dcda20a7529..ad22b4c720e60 100644 --- a/cmd/ddltest/ddl_serial_test.go +++ b/cmd/ddltest/ddl_serial_test.go @@ -33,7 +33,6 @@ import ( _ "github.com/go-sql-driver/mysql" "github.com/pingcap/errors" "github.com/pingcap/log" - zaplog "github.com/pingcap/log" "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" @@ -48,7 +47,6 @@ import ( "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/logutil" "github.com/stretchr/testify/require" "go.uber.org/zap" goctx "golang.org/x/net/context" @@ -91,11 +89,9 @@ type ddlSuite struct { } func createDDLSuite(t *testing.T) (s *ddlSuite) { + var err error s = new(ddlSuite) - err := logutil.InitLogger(&logutil.LogConfig{Config: zaplog.Config{Level: *logLevel}}) - require.NoError(t, err) - s.quit = make(chan struct{}) s.store, err = store.New(fmt.Sprintf("tikv://%s%s", *etcd, *tikvPath)) @@ -122,6 +118,11 @@ func createDDLSuite(t *testing.T) (s *ddlSuite) { require.NoError(t, err) ddl.RunWorker = false session.ResetStoreForWithTiKVTest(s.store) + s.dom.Close() + require.NoError(t, s.store.Close()) + + s.store, err = store.New(fmt.Sprintf("tikv://%s%s", *etcd, *tikvPath)) + require.NoError(t, err) s.s, err = session.CreateSession(s.store) require.NoError(t, err) s.dom, err = session.BootstrapSession(s.store) @@ -239,8 +240,14 @@ func (s *ddlSuite) stopServers() error { defer s.m.Unlock() for i := 0; i < len(s.procs); i++ { - if s.procs[i] != nil { - err := s.killServer(s.procs[i].Process) + if proc := s.procs[i]; proc != nil { + if proc.db != nil { + if err := proc.db.Close(); err != nil { + return err + } + } + + err := s.killServer(proc.Process) if err != nil { return errors.Trace(err) } diff --git a/cmd/ddltest/main_test.go b/cmd/ddltest/main_test.go new file mode 100644 index 0000000000000..890a52a7f4ab8 --- /dev/null +++ b/cmd/ddltest/main_test.go @@ -0,0 +1,44 @@ +// Copyright 2021 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, +// 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. + +package ddltest + +import ( + "fmt" + "os" + "testing" + + zaplog "github.com/pingcap/log" + "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/testbridge" + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + testbridge.WorkaroundGoCheckFlags() + err := logutil.InitLogger(&logutil.LogConfig{Config: zaplog.Config{Level: *logLevel}}) + if err != nil { + fmt.Fprint(os.Stderr, err.Error()) + os.Exit(1) + } + opts := []goleak.Option{ + goleak.IgnoreTopFunction("go.etcd.io/etcd/pkg/logutil.(*MergeLogger).outputLoop"), + goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + goleak.IgnoreTopFunction("internal/poll.runtime_pollWait"), + goleak.IgnoreTopFunction("net/http.(*persistConn).writeLoop"), + goleak.IgnoreTopFunction("github.com/go-sql-driver/mysql.(*mysqlConn).startWatcher.func1"), + goleak.IgnoreTopFunction("database/sql.(*DB).connectionOpener"), + } + goleak.VerifyTestMain(m, opts...) +} diff --git a/cmd/explaintest/config.toml b/cmd/explaintest/config.toml index 979ee2b2eaee5..de401d4952ab4 100644 --- a/cmd/explaintest/config.toml +++ b/cmd/explaintest/config.toml @@ -25,3 +25,4 @@ stats-lease = "0" [experimental] enable-new-charset = true +allow-expression-index = true diff --git a/cmd/explaintest/main.go b/cmd/explaintest/main.go index 6a2976dec8a18..9276b67a6f893 100644 --- a/cmd/explaintest/main.go +++ b/cmd/explaintest/main.go @@ -97,6 +97,13 @@ type tester struct { resultFD *os.File // ctx is used for Compile sql statement ctx sessionctx.Context + + // outputLen, lastQuery, lastLine and lastResult are used for checking the correctness of last query. + // See https://github.com/pingcap/tidb/issues/29475 for details. + outputLen int + lastText string + lastQuery query + lastResult []byte } func newTester(name string) *tester { @@ -172,6 +179,10 @@ LOOP: } } + if err = t.checkLastResult(); err != nil { + return errors.Annotate(err, fmt.Sprintf("sql:%v", t.lastQuery.Query)) + } + return t.flushResult() } @@ -365,7 +376,7 @@ func (t *tester) execute(query query) error { t.singleQuery = false if err != nil { - return errors.Trace(errors.Errorf("run \"%v\" at line %d err %v", st.Text(), query.Line, err)) + return errors.Trace(errors.Errorf("run \"%v\" at line %d err %v", qText, query.Line, err)) } if !record && !create { @@ -374,11 +385,15 @@ func (t *tester) execute(query query) error { buf := make([]byte, t.buf.Len()-offset) if _, err = t.resultFD.ReadAt(buf, int64(offset)); !(err == nil || err == io.EOF) { - return errors.Trace(errors.Errorf("run \"%v\" at line %d err, we got \n%s\nbut read result err %s", st.Text(), query.Line, gotBuf, err)) + return errors.Trace(errors.Errorf("run \"%v\" at line %d err, we got \n%s\nbut read result err %s", qText, query.Line, gotBuf, err)) } if !bytes.Equal(gotBuf, buf) { - return errors.Trace(errors.Errorf("run \"%v\" at line %d err, we need:\n%s\nbut got:\n%s\n", query.Query, query.Line, buf, gotBuf)) + return errors.Trace(errors.Errorf("run \"%v\" at line %d err, we need:\n%s\nbut got:\n%s\n", qText, query.Line, buf, gotBuf)) } + t.outputLen = t.buf.Len() + t.lastText = qText + t.lastQuery = query + t.lastResult = gotBuf } } return errors.Trace(err) @@ -566,6 +581,28 @@ func (t *tester) resultFileName() string { return fmt.Sprintf("./r/%s.result", t.name) } +func (t *tester) checkLastResult() error { + if record || create || t.outputLen == 0 { + return nil + } + fi, err := t.resultFD.Stat() + if err != nil { + return err + } + size := fi.Size() + if size == int64(t.outputLen) { + return nil + } + buf := make([]byte, int(size)-t.outputLen+len(t.lastResult)) + if _, err = t.resultFD.ReadAt(buf, int64(t.outputLen-len(t.lastResult))); !(err == nil || err == io.EOF) { + return errors.Trace(errors.Errorf("run \"%v\" at line %d err, we got \n%s\nbut read result err %s", t.lastText, t.lastQuery.Line, t.lastResult, err)) + } + if !bytes.Equal(t.lastResult, buf) { + return errors.Trace(errors.Errorf("run \"%v\" at line %d err, we need:\n%s\nbut got:\n%s\n", t.lastText, t.lastQuery.Line, buf, t.lastResult)) + } + return nil +} + func loadAllTests() ([]string, error) { // tests must be in t folder files, err := os.ReadDir("./t") diff --git a/cmd/explaintest/r/collation.result b/cmd/explaintest/r/collation.result new file mode 100644 index 0000000000000..193915a15d6c9 --- /dev/null +++ b/cmd/explaintest/r/collation.result @@ -0,0 +1,15 @@ +drop table if exists t; +create table t(a char(10) collate utf8mb4_unicode_ci, b char(10) collate utf8mb4_general_ci); +insert into t values ('啊', '撒旦'); +select coercibility(concat(a, b)) from t; +coercibility(concat(a, b)) +1 +select coercibility(convert(concat(a, b) using utf8mb4) collate utf8mb4_general_ci) from t; +coercibility(convert(concat(a, b) using utf8mb4) collate utf8mb4_general_ci) +0 +select coercibility(convert('a' using utf8mb4)); +coercibility(convert('a' using utf8mb4)) +2 +select coercibility(convert('a' using utf8mb4) collate utf8mb4_general_ci); +coercibility(convert('a' using utf8mb4) collate utf8mb4_general_ci) +0 diff --git a/cmd/explaintest/r/collation_check_use_collation.result b/cmd/explaintest/r/collation_check_use_collation.result new file mode 100644 index 0000000000000..ffd787a4cef43 --- /dev/null +++ b/cmd/explaintest/r/collation_check_use_collation.result @@ -0,0 +1,25 @@ +create database collation_check_use_collation; +use collation_check_use_collation; +CREATE TABLE `t` ( +`a` char(10) DEFAULT NULL +); +CREATE TABLE `t1` ( +`a` char(10) COLLATE utf8mb4_general_ci DEFAULT NULL +); +insert into t values ("a"); +insert into t1 values ("A"); +select a as a_col from t where t.a = all (select a collate utf8mb4_general_ci from t1); +a_col +a +select a as a_col from t where t.a != any (select a collate utf8mb4_general_ci from t1); +a_col +select a as a_col from t where t.a <= all (select a collate utf8mb4_general_ci from t1); +a_col +a +select a as a_col from t where t.a <= any (select a collate utf8mb4_general_ci from t1); +a_col +a +select a as a_col from t where t.a = (select a collate utf8mb4_general_ci from t1); +a_col +a +use test diff --git a/cmd/explaintest/r/explain_easy.result b/cmd/explaintest/r/explain_easy.result index 766edb8f9ed58..2eec1954d46df 100644 --- a/cmd/explaintest/r/explain_easy.result +++ b/cmd/explaintest/r/explain_easy.result @@ -509,7 +509,7 @@ StreamAgg 1.00 root funcs:count(1)->Column#22 ├─TableDual 8000.00 root rows:0 └─Projection 0.01 root test.test01.stat_date, test.test01.show_date, test.test01.region_id └─TableReader 0.01 root data:Selection - └─Selection 0.01 cop[tikv] eq(test.test01.period, 1), ge(test.test01.stat_date, 20191202), ge(test.test01.stat_date, 20191202), gt(cast(test.test01.registration_num, bigint(20) BINARY), 0), le(test.test01.stat_date, 20191202), le(test.test01.stat_date, 20191202) + └─Selection 0.01 cop[tikv] eq(test.test01.period, 1), ge(test.test01.stat_date, 20191202), gt(cast(test.test01.registration_num, bigint(20) BINARY), 0), le(test.test01.stat_date, 20191202) └─TableFullScan 10000.00 cop[tikv] table:test01 keep order:false, stats:pseudo drop table if exists t; create table t(a int, nb int not null, nc int not null); diff --git a/cmd/explaintest/r/explain_generate_column_substitute.result b/cmd/explaintest/r/explain_generate_column_substitute.result index 0cb7623929c11..5162adb37f49c 100644 --- a/cmd/explaintest/r/explain_generate_column_substitute.result +++ b/cmd/explaintest/r/explain_generate_column_substitute.result @@ -520,3 +520,53 @@ select * from t02 use index(eidx) where lower(a) < 'c'; a a b +select @@tidb_allow_function_for_expression_index; +@@tidb_allow_function_for_expression_index +lower, md5, reverse, upper, vitess_hash +CREATE TABLE `PK_S_MULTI_30_tmp` ( +`COL1` double NOT NULL, +`COL2` double NOT NULL, +`COL3` double DEFAULT NULL, +PRIMARY KEY (`COL1`,`COL2`) /*T![clustered_index] NONCLUSTERED */ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; +insert into `PK_S_MULTI_30_tmp` values (-1.7976931348623157e308, 0, 0); +alter table `PK_S_MULTI_30_tmp` add index ((ceil(col1))); +alter table `PK_S_MULTI_30_tmp` add index ((floor(col1))); +insert into `PK_S_MULTI_30_tmp` values (-1.7976931348623157e308, 1, 0); +select * from `PK_S_MULTI_30_tmp` use index (expression_index) where ceil(col1) = ceil(-1.7976931348623157e+308); +COL1 COL2 COL3 +-1.7976931348623157e308 0 0 +-1.7976931348623157e308 1 0 +select * from `PK_S_MULTI_30_tmp` ignore index (expression_index) where ceil(col1) = ceil(-1.7976931348623157e+308); +COL1 COL2 COL3 +-1.7976931348623157e308 0 0 +-1.7976931348623157e308 1 0 +select * from `PK_S_MULTI_30_tmp` use index (expression_index) where floor(col1) = floor(-1.7976931348623157e+308); +COL1 COL2 COL3 +-1.7976931348623157e308 0 0 +-1.7976931348623157e308 1 0 +select * from `PK_S_MULTI_30_tmp` ignore index (expression_index) where floor(col1) = floor(-1.7976931348623157e+308); +COL1 COL2 COL3 +-1.7976931348623157e308 0 0 +-1.7976931348623157e308 1 0 +alter table PK_S_MULTI_30_tmp add index eidx ((truncate(col1, 3))); +select * from PK_S_MULTI_30_tmp ignore index (eidx) where truncate(col1, 3) <= truncate(-1.7976931348623157e308, 3); +COL1 COL2 COL3 +-1.7976931348623157e308 0 0 +-1.7976931348623157e308 1 0 +select * from PK_S_MULTI_30_tmp use index (eidx) where truncate(col1, 3) <= truncate(-1.7976931348623157e308, 3); +COL1 COL2 COL3 +-1.7976931348623157e308 0 0 +-1.7976931348623157e308 1 0 +create table t004(a date); +insert into t004 values ('2021-08-20'); +select * from t004 where timestampadd(microsecond, 1, a) = timestampadd(microsecond, 1, '2021-08-20'); +a +2021-08-20 +alter table t004 add index eidx ((timestampadd(microsecond, 1, a))); +select * from t004 use index(eidx) where timestampadd(microsecond, 1, a) = timestampadd(microsecond, 1, '2021-08-20'); +a +2021-08-20 +select * from t004 ignore index (eidx) where timestampadd(microsecond, 1, a) = timestampadd(microsecond, 1, '2021-08-20'); +a +2021-08-20 diff --git a/cmd/explaintest/r/new_character_set.result b/cmd/explaintest/r/new_character_set.result index 36e9440fc6a79..e48b58e4c8905 100644 --- a/cmd/explaintest/r/new_character_set.result +++ b/cmd/explaintest/r/new_character_set.result @@ -40,3 +40,19 @@ select * from t; a b c 一 一 一 set @@character_set_results = 'utf8mb4'; +drop table if exists t; +create table t (a varchar(255) charset utf8mb4); +set @@character_set_client = 'gbk'; +insert into t values ('中文'); +set @@character_set_client = 'utf8mb4'; +insert into t values ('中文'); +set @@character_set_client = 'gbk'; +prepare p1 from "insert into t values ('中文');"; +execute p1; + +select a, hex(a) from t; +a hex(a) +涓?枃 E6B6933FE69E83 +中文 E4B8ADE69687 +涓?枃 E6B6933FE69E83 +set @@character_set_client = 'utf8mb4'; diff --git a/cmd/explaintest/r/new_character_set_builtin.result b/cmd/explaintest/r/new_character_set_builtin.result index b30ddf3d96e14..fa733d990ef1e 100644 --- a/cmd/explaintest/r/new_character_set_builtin.result +++ b/cmd/explaintest/r/new_character_set_builtin.result @@ -7,6 +7,12 @@ E4B880E4BA8CE4B889 D2BBB6FEC8FD E4B880E4BA8CE4B8890000000000000000000000 select length(a), length(b), length(c) from t; length(a) length(b) length(c) 9 6 20 +select ascii(a), ascii(b), ascii(c) from t; +ascii(a) ascii(b) ascii(c) +228 210 228 +select octet_length(a), octet_length(b), octet_length(c) from t; +octet_length(a) octet_length(b) octet_length(c) +9 6 20 set @@tidb_enable_vectorized_expression = true; select hex(a), hex(b), hex(c) from t; hex(a) hex(b) hex(c) @@ -14,6 +20,12 @@ E4B880E4BA8CE4B889 D2BBB6FEC8FD E4B880E4BA8CE4B8890000000000000000000000 select length(a), length(b), length(c) from t; length(a) length(b) length(c) 9 6 20 +select ascii(a), ascii(b), ascii(c) from t; +ascii(a) ascii(b) ascii(c) +228 210 228 +select octet_length(a), octet_length(b), octet_length(c) from t; +octet_length(a) octet_length(b) octet_length(c) +9 6 20 set @@tidb_enable_vectorized_expression = false; drop table if exists t; create table t (a char(100) charset utf8mb4, b char(100) charset gbk); @@ -32,3 +44,481 @@ select lower(a), lower(b) from t; lower(a) lower(b) àáèéêìíòóùúüāēěīńňōūǎǐǒǔǖǘǚǜⅺⅻ àáèéêìíòóùúüāēěīńňōūǎǐǒǔǖǘǚǜⅪⅫ set @@tidb_enable_vectorized_expression = false; +drop table if exists t; +create table t (a char(20) charset utf8mb4, b char(20) charset gbk, c binary(20)); +insert into t values ('一二三', '一二三', '一二三'); +select to_base64(a), to_base64(b), to_base64(c) from t; +to_base64(a) to_base64(b) to_base64(c) +5LiA5LqM5LiJ 0ru2/sj9 5LiA5LqM5LiJAAAAAAAAAAAAAAA= +set @@tidb_enable_vectorized_expression = true; +select to_base64(a), to_base64(b), to_base64(c) from t; +to_base64(a) to_base64(b) to_base64(c) +5LiA5LqM5LiJ 0ru2/sj9 5LiA5LqM5LiJAAAAAAAAAAAAAAA= +set @@tidb_enable_vectorized_expression = false; +drop table if exists t; +create table t(a char(10)); +insert into t values ('中文'), ('啊'), ('a'), ('1'), ('ㅂ'); +set @@tidb_enable_vectorized_expression = true; +select hex(convert(a using gbk)), convert(a using gbk) from t; +hex(convert(a using gbk)) convert(a using gbk) +D6D0CEC4 中文 +B0A1 啊 +61 a +31 1 +3F ? +select hex(convert('中文' using gbk)), convert('中文' using gbk); +hex(convert('中文' using gbk)) convert('中文' using gbk) +D6D0CEC4 中文 +select hex(convert('啊' using gbk)), convert('啊' using gbk); +hex(convert('啊' using gbk)) convert('啊' using gbk) +B0A1 啊 +select hex(convert('a' using gbk)), convert('a' using gbk); +hex(convert('a' using gbk)) convert('a' using gbk) +61 a +select hex(convert('1' using gbk)), convert('1' using gbk); +hex(convert('1' using gbk)) convert('1' using gbk) +31 1 +select hex(convert('ㅂ' using gbk)), convert('ㅂ' using gbk); +hex(convert('ㅂ' using gbk)) convert('ㅂ' using gbk) +3F ? +select hex(convert(0xe240 using gbk)), convert(0xe240 using gbk); +hex(convert(0xe240 using gbk)) convert(0xe240 using gbk) +E240 釦 +select hex(convert(0x1e240 using gbk)), convert(0x1e240 using gbk); +hex(convert(0x1e240 using gbk)) convert(0x1e240 using gbk) +01E240 釦 +select convert(a using binary), convert(convert(a using gbk) using binary) from t; +convert(a using binary) convert(convert(a using gbk) using binary) +中文 +啊 +a a +1 1 +ㅂ ? +select convert(convert('中文' using gbk) using binary), convert('中文' using binary); +convert(convert('中文' using gbk) using binary) convert('中文' using binary) + 中文 +select convert(convert('ㅂ' using gbk) using binary), convert('ㅂ' using binary); +convert(convert('ㅂ' using gbk) using binary) convert('ㅂ' using binary) +? ㅂ +set @@tidb_enable_vectorized_expression = false; +select hex(convert(a using gbk)), convert(a using gbk) from t; +hex(convert(a using gbk)) convert(a using gbk) +D6D0CEC4 中文 +B0A1 啊 +61 a +31 1 +3F ? +select hex(convert('中文' using gbk)), convert('中文' using gbk); +hex(convert('中文' using gbk)) convert('中文' using gbk) +D6D0CEC4 中文 +select hex(convert('啊' using gbk)), convert('啊' using gbk); +hex(convert('啊' using gbk)) convert('啊' using gbk) +B0A1 啊 +select hex(convert('a' using gbk)), convert('a' using gbk); +hex(convert('a' using gbk)) convert('a' using gbk) +61 a +select hex(convert('1' using gbk)), convert('1' using gbk); +hex(convert('1' using gbk)) convert('1' using gbk) +31 1 +select hex(convert('ㅂ' using gbk)), convert('ㅂ' using gbk); +hex(convert('ㅂ' using gbk)) convert('ㅂ' using gbk) +3F ? +select hex(convert(0xe240 using gbk)), convert(0xe240 using gbk); +hex(convert(0xe240 using gbk)) convert(0xe240 using gbk) +E240 釦 +select hex(convert(0x1e240 using gbk)), convert(0x1e240 using gbk); +hex(convert(0x1e240 using gbk)) convert(0x1e240 using gbk) +01E240 釦 +select convert(a using binary) from t; +convert(a using binary) +中文 +啊 +a +1 +ㅂ +select convert(convert('中文' using gbk) using binary), convert('中文' using binary); +convert(convert('中文' using gbk) using binary) convert('中文' using binary) + 中文 +select convert(convert('ㅂ' using gbk) using binary), convert('ㅂ' using binary); +convert(convert('ㅂ' using gbk) using binary) convert('ㅂ' using binary) +? ㅂ +drop table if exists t; +create table t (a char(20) charset utf8mb4, b char(20) charset gbk, c binary(20)); +insert into t values ('一二三', '一二三', '一二三'); +select md5(a), md5(b), md5(c) from t; +md5(a) md5(b) md5(c) +8093a32450075324682d01456d6e3919 a45d4af7b243e7f393fa09bed72ac73e aae0117857fe54811a5239275dd81133 +set @@tidb_enable_vectorized_expression = true; +select md5(a), md5(b), md5(c) from t; +md5(a) md5(b) md5(c) +8093a32450075324682d01456d6e3919 a45d4af7b243e7f393fa09bed72ac73e aae0117857fe54811a5239275dd81133 +set @@tidb_enable_vectorized_expression = false; +drop table if exists t; +create table t (a char(20) charset utf8mb4, b char(20) charset gbk, c binary(20)); +insert into t values ('一二三', '一二三', '一二三'); +select decode(encode(a,"monty"),"monty") = a, md5(decode(encode(b,"monty"),"monty")) = md5(b), decode(encode(c,"monty"),"monty") = c from t; +decode(encode(a,"monty"),"monty") = a md5(decode(encode(b,"monty"),"monty")) = md5(b) decode(encode(c,"monty"),"monty") = c +1 1 1 +set @@tidb_enable_vectorized_expression = true; +select decode(encode(a,"monty"),"monty") = a, md5(decode(encode(b,"monty"),"monty")) = md5(b), decode(encode(c,"monty"),"monty") = c from t; +decode(encode(a,"monty"),"monty") = a md5(decode(encode(b,"monty"),"monty")) = md5(b) decode(encode(c,"monty"),"monty") = c +1 1 1 +set @@tidb_enable_vectorized_expression = false; +drop table if exists t; +create table t (a char(20) charset utf8mb4, b char(20) charset gbk, c binary(20)); +insert into t values ('一二三', '一二三', '一二三'); +select password(a), password(b), password(c) from t; +password(a) password(b) password(c) +*D13577D198CA3F0AF5C548195065991E0E3EE665 *A669F2B2DD49E2463FE62D8F72DDF4F858687EA5 *9FC0B2ABDF3EC9895E852B15BE432EE0EA0C26BA +set @@tidb_enable_vectorized_expression = true; +select password(a), password(b), password(c) from t; +password(a) password(b) password(c) +*D13577D198CA3F0AF5C548195065991E0E3EE665 *A669F2B2DD49E2463FE62D8F72DDF4F858687EA5 *9FC0B2ABDF3EC9895E852B15BE432EE0EA0C26BA +set @@tidb_enable_vectorized_expression = false; +drop table if exists t; +create table t (a char(20) charset utf8mb4, b char(20) charset gbk, c binary(20)); +insert into t values ('一二三', '一二三', '一二三'); +select sha1(a), sha1(b), sha1(c) from t; +sha1(a) sha1(b) sha1(c) +01c1743ce7a7e822454a659f659bad61375ff10c 30cda4eed59a2ff592f2881f39d42fed6e10cad8 a112317779176843452f88e5b1fdbf3092ad124a +select sha(a), sha(b), sha(c) from t; +sha(a) sha(b) sha(c) +01c1743ce7a7e822454a659f659bad61375ff10c 30cda4eed59a2ff592f2881f39d42fed6e10cad8 a112317779176843452f88e5b1fdbf3092ad124a +set @@tidb_enable_vectorized_expression = true; +select sha1(a), sha1(b), sha1(c) from t; +sha1(a) sha1(b) sha1(c) +01c1743ce7a7e822454a659f659bad61375ff10c 30cda4eed59a2ff592f2881f39d42fed6e10cad8 a112317779176843452f88e5b1fdbf3092ad124a +select sha(a), sha(b), sha(c) from t; +sha(a) sha(b) sha(c) +01c1743ce7a7e822454a659f659bad61375ff10c 30cda4eed59a2ff592f2881f39d42fed6e10cad8 a112317779176843452f88e5b1fdbf3092ad124a +set @@tidb_enable_vectorized_expression = false; +drop table if exists t; +create table t (a char(20) charset utf8mb4, b char(20) charset gbk, c binary(20)); +insert into t values ('一二三', '一二三', '一二三'); +select sha2(a, 0), sha2(b, 0), sha2(c, 0) from t; +sha2(a, 0) sha2(b, 0) sha2(c, 0) +4fc9d8955b6155d931b24a583a6ad872f7d77fd4e4562cf8f619faa9c1a2cdc7 b6c1ae1f8d8a07426ddb13fca5124fb0b9f1f0ef1cca6730615099cf198ca8af f98670d7ccdf803dfa2f24555cfd733d626dd24f5f2bb0b91e37cc4f54a0f359 +select sha2(a, 224), sha2(b, 224), sha2(c, 224) from t; +sha2(a, 224) sha2(b, 224) sha2(c, 224) +ae47a60dd96e1deed3988d8fff3d662165e0aac7ddf371f244d7c11e 2362f577783f6cd6cc10b0308f946f479fef868a39d6339b5d74cc6d eb0de82dfada1205f65ac4aa6e4778d2f7730144f31688d42a316b9c +select sha2(a, 256), sha2(b, 256), sha2(c, 256) from t; +sha2(a, 256) sha2(b, 256) sha2(c, 256) +4fc9d8955b6155d931b24a583a6ad872f7d77fd4e4562cf8f619faa9c1a2cdc7 b6c1ae1f8d8a07426ddb13fca5124fb0b9f1f0ef1cca6730615099cf198ca8af f98670d7ccdf803dfa2f24555cfd733d626dd24f5f2bb0b91e37cc4f54a0f359 +select sha2(a, 384), sha2(b, 384), sha2(c, 384) from t; +sha2(a, 384) sha2(b, 384) sha2(c, 384) +cdb9c8d3e2579d021116ebe9d7d7bb4f5b3a489cae84768f7b3348c9b8d716897a409ea96fd92bfb95e3fd8aa91ffc74 54e75070f1faab03e7ce808ca2824ed4614ad1d58ee1409d8c1e4fd72ecab12c92ac3a2f919721c2aa09b23e5f3cc8aa 1b526bf926dbc53609628f145a6efe2b17eb29754ba2c6e0e33673dbd79d62ea50bbfc233252f06ba27712f8bd406963 +select sha2(a, 514), sha2(b, 514), sha2(c, 514) from t; +sha2(a, 514) sha2(b, 514) sha2(c, 514) +NULL NULL NULL +set @@tidb_enable_vectorized_expression = true; +select sha2(a, 0), sha2(b, 0), sha2(c, 0) from t; +sha2(a, 0) sha2(b, 0) sha2(c, 0) +4fc9d8955b6155d931b24a583a6ad872f7d77fd4e4562cf8f619faa9c1a2cdc7 b6c1ae1f8d8a07426ddb13fca5124fb0b9f1f0ef1cca6730615099cf198ca8af f98670d7ccdf803dfa2f24555cfd733d626dd24f5f2bb0b91e37cc4f54a0f359 +select sha2(a, 224), sha2(b, 224), sha2(c, 224) from t; +sha2(a, 224) sha2(b, 224) sha2(c, 224) +ae47a60dd96e1deed3988d8fff3d662165e0aac7ddf371f244d7c11e 2362f577783f6cd6cc10b0308f946f479fef868a39d6339b5d74cc6d eb0de82dfada1205f65ac4aa6e4778d2f7730144f31688d42a316b9c +select sha2(a, 256), sha2(b, 256), sha2(c, 256) from t; +sha2(a, 256) sha2(b, 256) sha2(c, 256) +4fc9d8955b6155d931b24a583a6ad872f7d77fd4e4562cf8f619faa9c1a2cdc7 b6c1ae1f8d8a07426ddb13fca5124fb0b9f1f0ef1cca6730615099cf198ca8af f98670d7ccdf803dfa2f24555cfd733d626dd24f5f2bb0b91e37cc4f54a0f359 +select sha2(a, 384), sha2(b, 384), sha2(c, 384) from t; +sha2(a, 384) sha2(b, 384) sha2(c, 384) +cdb9c8d3e2579d021116ebe9d7d7bb4f5b3a489cae84768f7b3348c9b8d716897a409ea96fd92bfb95e3fd8aa91ffc74 54e75070f1faab03e7ce808ca2824ed4614ad1d58ee1409d8c1e4fd72ecab12c92ac3a2f919721c2aa09b23e5f3cc8aa 1b526bf926dbc53609628f145a6efe2b17eb29754ba2c6e0e33673dbd79d62ea50bbfc233252f06ba27712f8bd406963 +select sha2(a, 514), sha2(b, 514), sha2(c, 514) from t; +sha2(a, 514) sha2(b, 514) sha2(c, 514) +NULL NULL NULL +set @@tidb_enable_vectorized_expression = false; +drop table if exists t; +create table t (a char(20) charset utf8mb4, b char(20) charset gbk, c binary(20)); +insert into t values ('一二三', '一二三', '一二三'); +select md5(b) from t where md5(b) = 'a45d4af7b243e7f393fa09bed72ac73e'; +md5(b) +a45d4af7b243e7f393fa09bed72ac73e +set @@tidb_enable_vectorized_expression = true; +select md5(b) from t where md5(b) = 'a45d4af7b243e7f393fa09bed72ac73e'; +md5(b) +a45d4af7b243e7f393fa09bed72ac73e +set @@tidb_enable_vectorized_expression = false; +drop table if exists t; +create table t (a char(20)); +insert into t values ('65'), ('123456'), ('123456789'); +select char(a using gbk), char(a using utf8), char(a) from t; +char(a using gbk) char(a using utf8) char(a) +A A A +釦 @ @ +NULL [ [ +select char(12345678 using gbk); +char(12345678 using gbk) +糰N +set @@tidb_enable_vectorized_expression = true; +select char(a using gbk), char(a using utf8), char(a) from t; +char(a using gbk) char(a using utf8) char(a) +A A A +釦 @ @ +NULL [ [ +select char(12345678 using gbk); +char(12345678 using gbk) +糰N +set @@tidb_enable_vectorized_expression = false; +drop table if exists t; +create table t (a char(20) charset utf8mb4, b char(20) charset gbk, c binary(20)); +insert into t values ('一二三', '一二三', '一二三'); +select md5(compress(a)), md5(compress(b)), md5(compress(c)) from t; +md5(compress(a)) md5(compress(b)) md5(compress(c)) +2198d4d3b06a6cba3f9275c7e364105c 5e587a14393aecf0629bb29dbd6b4379 905068487b6220f70bb71a48323826be +set @@tidb_enable_vectorized_expression = true; +select md5(compress(a)), md5(compress(b)), md5(compress(c)) from t; +md5(compress(a)) md5(compress(b)) md5(compress(c)) +2198d4d3b06a6cba3f9275c7e364105c 5e587a14393aecf0629bb29dbd6b4379 905068487b6220f70bb71a48323826be +set @@tidb_enable_vectorized_expression = false; +set @@block_encryption_mode='aes-128-ecb'; +select hex(aes_decrypt(0xC54279F381B0710E145E94106F03C94C, '123')) as a, hex(aes_decrypt(0x7A747EC6F1906276D036B1F3CE27BAAB, '123')) as b; +a b +E4B880E4BA8CE4B889 D2BBB6FEC8FD +set @@block_encryption_mode='aes-128-ofb'; +select hex(aes_decrypt(0x91C44DE866D0745252, '1234567890123456', '1234567890123456')) as a, hex(aes_decrypt(0xA7C77BF214A1, '1234567890123456', '1234567890123456')) as b; +a b +E4B880E4BA8CE4B889 D2BBB6FEC8FD +set @@tidb_enable_vectorized_expression = true; +select hex(aes_decrypt(0x91C44DE866D0745252, '1234567890123456', '1234567890123456')) as a, hex(aes_decrypt(0xA7C77BF214A1, '1234567890123456', '1234567890123456')) as b; +a b +E4B880E4BA8CE4B889 D2BBB6FEC8FD +set @@block_encryption_mode='aes-128-ecb'; +select hex(aes_decrypt(0xC54279F381B0710E145E94106F03C94C, '123')) as a, hex(aes_decrypt(0x7A747EC6F1906276D036B1F3CE27BAAB, '123')) as b; +a b +E4B880E4BA8CE4B889 D2BBB6FEC8FD +set @@tidb_enable_vectorized_expression = false; +drop table if exists t; +create table t (a char(20) charset utf8mb4, b char(20) charset gbk, c binary(20)); +insert into t values ('中文', '中文', '中文'); +select ord(a), ord(b), ord(c) from t; +ord(a) ord(b) ord(c) +14989485 54992 228 +set @@tidb_enable_vectorized_expression = true; +select ord(a), ord(b), ord(c) from t; +ord(a) ord(b) ord(c) +14989485 54992 228 +set @@tidb_enable_vectorized_expression = false; +drop table if exists t; +create table t (a char(20) charset utf8mb4, b char(20) charset gbk, c binary(20)); +insert into t values ('一', '一', 0xe4b880); +insert into t values ('一', '一', 0xd2bb); +insert into t values ('一', '一', 0xe4ba8c); +insert into t values ('一', '一', 0xb6fe); +set @@tidb_enable_vectorized_expression = true; +select hex(concat(a, c)), hex(concat(b, c)) from t; +hex(concat(a, c)) hex(concat(b, c)) +E4B880E4B8800000000000000000000000000000000000 D2BBE4B8800000000000000000000000000000000000 +E4B880D2BB000000000000000000000000000000000000 D2BBD2BB000000000000000000000000000000000000 +E4B880E4BA8C0000000000000000000000000000000000 D2BBE4BA8C0000000000000000000000000000000000 +E4B880B6FE000000000000000000000000000000000000 D2BBB6FE000000000000000000000000000000000000 +select hex(concat(a, 0xe4b880)), hex(concat(b, 0xd2bb)) from t; +hex(concat(a, 0xe4b880)) hex(concat(b, 0xd2bb)) +E4B880E4B880 D2BBD2BB +E4B880E4B880 D2BBD2BB +E4B880E4B880 D2BBD2BB +E4B880E4B880 D2BBD2BB +select a = 0xe4b880, b = 0xd2bb from t; +a = 0xe4b880 b = 0xd2bb +1 1 +1 1 +1 1 +1 1 +select a = c, b = c from t; +a = c b = c +0 0 +0 0 +0 0 +0 0 +select hex(insert(a, 1, 2, 0xe4ba8c)), hex(insert(b, 1, 2, 0xb6fe)) from t; +hex(insert(a, 1, 2, 0xe4ba8c)) hex(insert(b, 1, 2, 0xb6fe)) +E4BA8C B6FE +E4BA8C B6FE +E4BA8C B6FE +E4BA8C B6FE +select hex(insert(a, 1, 2, c)), hex(insert(b, 1, 2, c)) from t; +hex(insert(a, 1, 2, c)) hex(insert(b, 1, 2, c)) +E4B880000000000000000000000000000000000080 E4B8800000000000000000000000000000000000 +D2BB00000000000000000000000000000000000080 D2BB000000000000000000000000000000000000 +E4BA8C000000000000000000000000000000000080 E4BA8C0000000000000000000000000000000000 +B6FE00000000000000000000000000000000000080 B6FE000000000000000000000000000000000000 +select hex(lpad(a, 5, 0xe4ba8c)), hex(lpad(b, 5, 0xb6fe)) from t; +hex(lpad(a, 5, 0xe4ba8c)) hex(lpad(b, 5, 0xb6fe)) +E4BA8CE4BA8CE4BA8CE4BA8CE4B880 B6FEB6FEB6FEB6FED2BB +E4BA8CE4BA8CE4BA8CE4BA8CE4B880 B6FEB6FEB6FEB6FED2BB +E4BA8CE4BA8CE4BA8CE4BA8CE4B880 B6FEB6FEB6FEB6FED2BB +E4BA8CE4BA8CE4BA8CE4BA8CE4B880 B6FEB6FEB6FEB6FED2BB +select hex(lpad(a, 5, c)), hex(lpad(b, 5, c)) from t; +hex(lpad(a, 5, c)) hex(lpad(b, 5, c)) +E4B8E4B880 E4B880D2BB +D2BBE4B880 D2BB00D2BB +E4BAE4B880 E4BA8CD2BB +B6FEE4B880 B6FE00D2BB +select hex(rpad(a, 5, 0xe4ba8c)), hex(rpad(b, 5, 0xb6fe)) from t; +hex(rpad(a, 5, 0xe4ba8c)) hex(rpad(b, 5, 0xb6fe)) +E4B880E4BA8CE4BA8CE4BA8CE4BA8C D2BBB6FEB6FEB6FEB6FE +E4B880E4BA8CE4BA8CE4BA8CE4BA8C D2BBB6FEB6FEB6FEB6FE +E4B880E4BA8CE4BA8CE4BA8CE4BA8C D2BBB6FEB6FEB6FEB6FE +E4B880E4BA8CE4BA8CE4BA8CE4BA8C D2BBB6FEB6FEB6FEB6FE +select hex(rpad(a, 5, c)), hex(rpad(b, 5, c)) from t; +hex(rpad(a, 5, c)) hex(rpad(b, 5, c)) +E4B880E4B8 D2BBE4B880 +E4B880D2BB D2BBD2BB00 +E4B880E4BA D2BBE4BA8C +E4B880B6FE D2BBB6FE00 +select hex(elt(2, a, 0xe4ba8c)), hex(elt(2, b, 0xb6fe)) from t; +hex(elt(2, a, 0xe4ba8c)) hex(elt(2, b, 0xb6fe)) +E4BA8C B6FE +E4BA8C B6FE +E4BA8C B6FE +E4BA8C B6FE +select hex(elt(2, a, c)), hex(elt(2, b, c)) from t; +hex(elt(2, a, c)) hex(elt(2, b, c)) +E4B8800000000000000000000000000000000000 E4B8800000000000000000000000000000000000 +D2BB000000000000000000000000000000000000 D2BB000000000000000000000000000000000000 +E4BA8C0000000000000000000000000000000000 E4BA8C0000000000000000000000000000000000 +B6FE000000000000000000000000000000000000 B6FE000000000000000000000000000000000000 +select hex(instr(a, 0xe4b880)), hex(instr(b, 0xd2bb)) from t; +hex(instr(a, 0xe4b880)) hex(instr(b, 0xd2bb)) +1 1 +1 1 +1 1 +1 1 +select hex(position(a in 0xe4b880)), hex(position(b in 0xd2bb)) from t; +hex(position(a in 0xe4b880)) hex(position(b in 0xd2bb)) +1 1 +1 1 +1 1 +1 1 +select a like 0xe4b880, b like 0xd2bb from t; +a like 0xe4b880 b like 0xd2bb +1 1 +1 1 +1 1 +1 1 +select a = 0xb6fe from t; +Error 3854: Cannot convert string 'B6FE' from binary to utf8mb4 +select b = 0xe4ba8c from t; +Error 3854: Cannot convert string 'E4BA8C' from binary to gbk +select concat(a, 0xb6fe) from t; +Error 3854: Cannot convert string 'B6FE' from binary to utf8mb4 +select concat(b, 0xe4ba8c) from t; +Error 3854: Cannot convert string 'E4BA8C' from binary to gbk +set @@tidb_enable_vectorized_expression = false; +select hex(concat(a, c)), hex(concat(b, c)) from t; +hex(concat(a, c)) hex(concat(b, c)) +E4B880E4B8800000000000000000000000000000000000 D2BBE4B8800000000000000000000000000000000000 +E4B880D2BB000000000000000000000000000000000000 D2BBD2BB000000000000000000000000000000000000 +E4B880E4BA8C0000000000000000000000000000000000 D2BBE4BA8C0000000000000000000000000000000000 +E4B880B6FE000000000000000000000000000000000000 D2BBB6FE000000000000000000000000000000000000 +select hex(concat(a, 0xe4b880)), hex(concat(b, 0xd2bb)) from t; +hex(concat(a, 0xe4b880)) hex(concat(b, 0xd2bb)) +E4B880E4B880 D2BBD2BB +E4B880E4B880 D2BBD2BB +E4B880E4B880 D2BBD2BB +E4B880E4B880 D2BBD2BB +select a = 0xe4b880, b = 0xd2bb from t; +a = 0xe4b880 b = 0xd2bb +1 1 +1 1 +1 1 +1 1 +select a = c, b = c from t; +a = c b = c +0 0 +0 0 +0 0 +0 0 +select hex(insert(a, 1, 2, 0xe4ba8c)), hex(insert(b, 1, 2, 0xb6fe)) from t; +hex(insert(a, 1, 2, 0xe4ba8c)) hex(insert(b, 1, 2, 0xb6fe)) +E4BA8C B6FE +E4BA8C B6FE +E4BA8C B6FE +E4BA8C B6FE +select hex(insert(a, 1, 2, c)), hex(insert(b, 1, 2, c)) from t; +hex(insert(a, 1, 2, c)) hex(insert(b, 1, 2, c)) +E4B880000000000000000000000000000000000080 E4B8800000000000000000000000000000000000 +D2BB00000000000000000000000000000000000080 D2BB000000000000000000000000000000000000 +E4BA8C000000000000000000000000000000000080 E4BA8C0000000000000000000000000000000000 +B6FE00000000000000000000000000000000000080 B6FE000000000000000000000000000000000000 +select hex(lpad(a, 5, 0xe4ba8c)), hex(lpad(b, 5, 0xb6fe)) from t; +hex(lpad(a, 5, 0xe4ba8c)) hex(lpad(b, 5, 0xb6fe)) +E4BA8CE4BA8CE4BA8CE4BA8CE4B880 B6FEB6FEB6FEB6FED2BB +E4BA8CE4BA8CE4BA8CE4BA8CE4B880 B6FEB6FEB6FEB6FED2BB +E4BA8CE4BA8CE4BA8CE4BA8CE4B880 B6FEB6FEB6FEB6FED2BB +E4BA8CE4BA8CE4BA8CE4BA8CE4B880 B6FEB6FEB6FEB6FED2BB +select hex(lpad(a, 5, c)), hex(lpad(b, 5, c)) from t; +hex(lpad(a, 5, c)) hex(lpad(b, 5, c)) +E4B8E4B880 E4B880D2BB +D2BBE4B880 D2BB00D2BB +E4BAE4B880 E4BA8CD2BB +B6FEE4B880 B6FE00D2BB +select hex(rpad(a, 5, 0xe4ba8c)), hex(rpad(b, 5, 0xb6fe)) from t; +hex(rpad(a, 5, 0xe4ba8c)) hex(rpad(b, 5, 0xb6fe)) +E4B880E4BA8CE4BA8CE4BA8CE4BA8C D2BBB6FEB6FEB6FEB6FE +E4B880E4BA8CE4BA8CE4BA8CE4BA8C D2BBB6FEB6FEB6FEB6FE +E4B880E4BA8CE4BA8CE4BA8CE4BA8C D2BBB6FEB6FEB6FEB6FE +E4B880E4BA8CE4BA8CE4BA8CE4BA8C D2BBB6FEB6FEB6FEB6FE +select hex(rpad(a, 5, c)), hex(rpad(b, 5, c)) from t; +hex(rpad(a, 5, c)) hex(rpad(b, 5, c)) +E4B880E4B8 D2BBE4B880 +E4B880D2BB D2BBD2BB00 +E4B880E4BA D2BBE4BA8C +E4B880B6FE D2BBB6FE00 +select hex(elt(2, a, 0xe4ba8c)), hex(elt(2, b, 0xb6fe)) from t; +hex(elt(2, a, 0xe4ba8c)) hex(elt(2, b, 0xb6fe)) +E4BA8C B6FE +E4BA8C B6FE +E4BA8C B6FE +E4BA8C B6FE +select hex(elt(2, a, c)), hex(elt(2, b, c)) from t; +hex(elt(2, a, c)) hex(elt(2, b, c)) +E4B8800000000000000000000000000000000000 E4B8800000000000000000000000000000000000 +D2BB000000000000000000000000000000000000 D2BB000000000000000000000000000000000000 +E4BA8C0000000000000000000000000000000000 E4BA8C0000000000000000000000000000000000 +B6FE000000000000000000000000000000000000 B6FE000000000000000000000000000000000000 +select hex(instr(a, 0xe4b880)), hex(instr(b, 0xd2bb)) from t; +hex(instr(a, 0xe4b880)) hex(instr(b, 0xd2bb)) +1 1 +1 1 +1 1 +1 1 +select hex(position(a in 0xe4b880)), hex(position(b in 0xd2bb)) from t; +hex(position(a in 0xe4b880)) hex(position(b in 0xd2bb)) +1 1 +1 1 +1 1 +1 1 +select a like 0xe4b880, b like 0xd2bb from t; +a like 0xe4b880 b like 0xd2bb +1 1 +1 1 +1 1 +1 1 +select a = 0xb6fe from t; +Error 3854: Cannot convert string 'B6FE' from binary to utf8mb4 +select b = 0xe4ba8c from t; +Error 3854: Cannot convert string 'E4BA8C' from binary to gbk +select concat(a, 0xb6fe) from t; +Error 3854: Cannot convert string 'B6FE' from binary to utf8mb4 +select concat(b, 0xe4ba8c) from t; +Error 3854: Cannot convert string 'E4BA8C' from binary to gbk +drop table if exists t; +create table t (a char(20) charset utf8mb4, b char(20) charset gbk, c binary(20)); +insert into t values ('一二三', '一二三', '一二三'); +set @@block_encryption_mode='aes-128-ecb'; +select hex(aes_encrypt(a, '123')), hex(aes_encrypt(b, '123')), hex(aes_encrypt(c, '123')) from t; +hex(aes_encrypt(a, '123')) hex(aes_encrypt(b, '123')) hex(aes_encrypt(c, '123')) +C54279F381B0710E145E94106F03C94C 7A747EC6F1906276D036B1F3CE27BAAB A0E5E01289017B8A3691CCFBDE81A59ED4A9D5BF50A298D41287E395CDDCAD56 +set @@block_encryption_mode='aes-128-ofb'; +select hex(aes_encrypt(a, '123', '1234567890123456')), hex(aes_encrypt(b, '123', '1234567890123456')), hex(aes_encrypt(c, '123', '1234567890123456')) from t; +hex(aes_encrypt(a, '123', '1234567890123456')) hex(aes_encrypt(b, '123', '1234567890123456')) hex(aes_encrypt(c, '123', '1234567890123456')) +65473346EE2BF64CD2 5344055C9C5A 65473346EE2BF64CD2BA02F128114B0E061E095B +set @@tidb_enable_vectorized_expression = true; +select hex(aes_encrypt(a, '123', '1234567890123456')), hex(aes_encrypt(b, '123', '1234567890123456')), hex(aes_encrypt(c, '123', '1234567890123456')) from t; +hex(aes_encrypt(a, '123', '1234567890123456')) hex(aes_encrypt(b, '123', '1234567890123456')) hex(aes_encrypt(c, '123', '1234567890123456')) +65473346EE2BF64CD2 5344055C9C5A 65473346EE2BF64CD2BA02F128114B0E061E095B +set @@block_encryption_mode='aes-128-ecb'; +select hex(aes_encrypt(a, '123')), hex(aes_encrypt(b, '123')), hex(aes_encrypt(c, '123')) from t; +hex(aes_encrypt(a, '123')) hex(aes_encrypt(b, '123')) hex(aes_encrypt(c, '123')) +C54279F381B0710E145E94106F03C94C 7A747EC6F1906276D036B1F3CE27BAAB A0E5E01289017B8A3691CCFBDE81A59ED4A9D5BF50A298D41287E395CDDCAD56 +set @@tidb_enable_vectorized_expression = false; diff --git a/cmd/explaintest/r/new_character_set_invalid.result b/cmd/explaintest/r/new_character_set_invalid.result new file mode 100644 index 0000000000000..aaeb66a8d9b44 --- /dev/null +++ b/cmd/explaintest/r/new_character_set_invalid.result @@ -0,0 +1,23 @@ +set @@sql_mode = 'strict_trans_tables'; +drop table if exists t; +create table t (a varchar(255) charset gbk, b varchar(255) charset ascii, c varchar(255) charset utf8); +insert into t values ('中文', 'asdf', '字符集'); +insert into t values ('À', 'ø', '😂'); +Error 1366: Incorrect string value '\xC3\x80' for column 'a' +insert into t values ('中文À中文', 'asdføfdsa', '字符集😂字符集'); +Error 1366: Incorrect string value '\xC3\x80\xE4\xB8\xAD\xE6...' for column 'a' +insert into t values (0x4040ffff, 0x4040ffff, 0x4040ffff); +Error 1366: Incorrect string value '\xFF\xFF' for column 'a' +select * from t; +a b c +中文 asdf 字符集 +set @@sql_mode = ''; +insert into t values ('À', 'ø', '😂'); +insert into t values ('中文À中文', 'asdføfdsa', '字符集😂字符集'); +insert into t values (0x4040ffff, 0x4040ffff, 0x4040ffff); +select * from t; +a b c +中文 asdf 字符集 +? ? ? +中文?中文 asdf?fdsa 字符集?字符集 +@@ @@ @@ diff --git a/cmd/explaintest/r/select.result b/cmd/explaintest/r/select.result index 15b71d0e65166..959e761aad086 100644 --- a/cmd/explaintest/r/select.result +++ b/cmd/explaintest/r/select.result @@ -495,3 +495,7 @@ insert into precise_types values ( SELECT a, b, c, d FROM precise_types; a b c d 18446744073709551614 -9223372036854775806 99999999999999999999.0 1.8446744073709552e19 +create table t3(a char(10), primary key (a)); +insert into t3 values ('a'); +select * from t3 where a > 0x80; +Error 1105: Cannot convert string '80' from binary to utf8mb4 diff --git a/cmd/explaintest/run-tests.sh b/cmd/explaintest/run-tests.sh index 1d8061f90d0f0..0ebcabca0b2d5 100755 --- a/cmd/explaintest/run-tests.sh +++ b/cmd/explaintest/run-tests.sh @@ -31,6 +31,8 @@ stats="s" set -eu trap 'set +e; PIDS=$(jobs -p); [ -n "$PIDS" ] && kill -9 $PIDS' EXIT +# make tests stable time zone wise +export TZ="Asia/Shanghai" function help_message() { diff --git a/cmd/explaintest/t/collation.test b/cmd/explaintest/t/collation.test new file mode 100644 index 0000000000000..2b67de475c47c --- /dev/null +++ b/cmd/explaintest/t/collation.test @@ -0,0 +1,9 @@ +--disable_warnings +drop table if exists t; +--enable_warnings +create table t(a char(10) collate utf8mb4_unicode_ci, b char(10) collate utf8mb4_general_ci); +insert into t values ('啊', '撒旦'); +select coercibility(concat(a, b)) from t; +select coercibility(convert(concat(a, b) using utf8mb4) collate utf8mb4_general_ci) from t; +select coercibility(convert('a' using utf8mb4)); +select coercibility(convert('a' using utf8mb4) collate utf8mb4_general_ci); \ No newline at end of file diff --git a/cmd/explaintest/t/collation_check_use_collation.test b/cmd/explaintest/t/collation_check_use_collation.test new file mode 100644 index 0000000000000..67e75f32e38f9 --- /dev/null +++ b/cmd/explaintest/t/collation_check_use_collation.test @@ -0,0 +1,23 @@ +# These tests check that the used collation is correct. + +# prepare database +create database collation_check_use_collation; +use collation_check_use_collation; + +# Check subquery. +CREATE TABLE `t` ( + `a` char(10) DEFAULT NULL +); +CREATE TABLE `t1` ( + `a` char(10) COLLATE utf8mb4_general_ci DEFAULT NULL +); +insert into t values ("a"); +insert into t1 values ("A"); +select a as a_col from t where t.a = all (select a collate utf8mb4_general_ci from t1); +select a as a_col from t where t.a != any (select a collate utf8mb4_general_ci from t1); +select a as a_col from t where t.a <= all (select a collate utf8mb4_general_ci from t1); +select a as a_col from t where t.a <= any (select a collate utf8mb4_general_ci from t1); +select a as a_col from t where t.a = (select a collate utf8mb4_general_ci from t1); + +# cleanup environment +use test diff --git a/cmd/explaintest/t/explain_generate_column_substitute.test b/cmd/explaintest/t/explain_generate_column_substitute.test index c6060780d62f5..152d2c2a6dc7f 100644 --- a/cmd/explaintest/t/explain_generate_column_substitute.test +++ b/cmd/explaintest/t/explain_generate_column_substitute.test @@ -232,3 +232,30 @@ insert into t02 values ('a'), ('b'), ('c'); select * from t02 where lower(a) < 'c'; create index eidx on t02 ((lower(a))); select * from t02 use index(eidx) where lower(a) < 'c'; + +select @@tidb_allow_function_for_expression_index; + +CREATE TABLE `PK_S_MULTI_30_tmp` ( + `COL1` double NOT NULL, + `COL2` double NOT NULL, + `COL3` double DEFAULT NULL, + PRIMARY KEY (`COL1`,`COL2`) /*T![clustered_index] NONCLUSTERED */ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; +insert into `PK_S_MULTI_30_tmp` values (-1.7976931348623157e308, 0, 0); +alter table `PK_S_MULTI_30_tmp` add index ((ceil(col1))); +alter table `PK_S_MULTI_30_tmp` add index ((floor(col1))); +insert into `PK_S_MULTI_30_tmp` values (-1.7976931348623157e308, 1, 0); +select * from `PK_S_MULTI_30_tmp` use index (expression_index) where ceil(col1) = ceil(-1.7976931348623157e+308); +select * from `PK_S_MULTI_30_tmp` ignore index (expression_index) where ceil(col1) = ceil(-1.7976931348623157e+308); +select * from `PK_S_MULTI_30_tmp` use index (expression_index) where floor(col1) = floor(-1.7976931348623157e+308); +select * from `PK_S_MULTI_30_tmp` ignore index (expression_index) where floor(col1) = floor(-1.7976931348623157e+308); +alter table PK_S_MULTI_30_tmp add index eidx ((truncate(col1, 3))); +select * from PK_S_MULTI_30_tmp ignore index (eidx) where truncate(col1, 3) <= truncate(-1.7976931348623157e308, 3); +select * from PK_S_MULTI_30_tmp use index (eidx) where truncate(col1, 3) <= truncate(-1.7976931348623157e308, 3); + +create table t004(a date); +insert into t004 values ('2021-08-20'); +select * from t004 where timestampadd(microsecond, 1, a) = timestampadd(microsecond, 1, '2021-08-20'); +alter table t004 add index eidx ((timestampadd(microsecond, 1, a))); +select * from t004 use index(eidx) where timestampadd(microsecond, 1, a) = timestampadd(microsecond, 1, '2021-08-20'); +select * from t004 ignore index (eidx) where timestampadd(microsecond, 1, a) = timestampadd(microsecond, 1, '2021-08-20'); diff --git a/cmd/explaintest/t/new_character_set.test b/cmd/explaintest/t/new_character_set.test index 4a3322a3dcfa0..8009ba73dae4b 100644 --- a/cmd/explaintest/t/new_character_set.test +++ b/cmd/explaintest/t/new_character_set.test @@ -25,5 +25,17 @@ set @@character_set_results = "BINARY"; select * from t; set names utf8mb4; select * from t; - set @@character_set_results = 'utf8mb4'; + +-- Test for @@character_set_client. +drop table if exists t; +create table t (a varchar(255) charset utf8mb4); +set @@character_set_client = 'gbk'; +insert into t values ('中文'); +set @@character_set_client = 'utf8mb4'; +insert into t values ('中文'); +set @@character_set_client = 'gbk'; +prepare p1 from "insert into t values ('中文');"; +execute p1; +select a, hex(a) from t; +set @@character_set_client = 'utf8mb4'; diff --git a/cmd/explaintest/t/new_character_set_builtin.test b/cmd/explaintest/t/new_character_set_builtin.test index 958431ebe5066..09b823cdcfaa9 100644 --- a/cmd/explaintest/t/new_character_set_builtin.test +++ b/cmd/explaintest/t/new_character_set_builtin.test @@ -1,12 +1,16 @@ --- test for builtin function hex() and length() +-- test for builtin function hex(), length(), ascii(), octet_length() drop table if exists t; create table t (a char(20) charset utf8mb4, b char(20) charset gbk, c binary(20)); insert into t values ('一二三', '一二三', '一二三'); select hex(a), hex(b), hex(c) from t; select length(a), length(b), length(c) from t; +select ascii(a), ascii(b), ascii(c) from t; +select octet_length(a), octet_length(b), octet_length(c) from t; set @@tidb_enable_vectorized_expression = true; select hex(a), hex(b), hex(c) from t; select length(a), length(b), length(c) from t; +select ascii(a), ascii(b), ascii(c) from t; +select octet_length(a), octet_length(b), octet_length(c) from t; set @@tidb_enable_vectorized_expression = false; -- test for builtin function upper() and lower() @@ -20,3 +24,217 @@ select upper(a), upper(b) from t; select lower(a), lower(b) from t; set @@tidb_enable_vectorized_expression = false; +-- test for builtin function to_base64() +drop table if exists t; +create table t (a char(20) charset utf8mb4, b char(20) charset gbk, c binary(20)); +insert into t values ('一二三', '一二三', '一二三'); +select to_base64(a), to_base64(b), to_base64(c) from t; +set @@tidb_enable_vectorized_expression = true; +select to_base64(a), to_base64(b), to_base64(c) from t; +set @@tidb_enable_vectorized_expression = false; + +-- test for builtin function convert() +drop table if exists t; +create table t(a char(10)); +insert into t values ('中文'), ('啊'), ('a'), ('1'), ('ㅂ'); +set @@tidb_enable_vectorized_expression = true; +select hex(convert(a using gbk)), convert(a using gbk) from t; +select hex(convert('中文' using gbk)), convert('中文' using gbk); +select hex(convert('啊' using gbk)), convert('啊' using gbk); +select hex(convert('a' using gbk)), convert('a' using gbk); +select hex(convert('1' using gbk)), convert('1' using gbk); +select hex(convert('ㅂ' using gbk)), convert('ㅂ' using gbk); +select hex(convert(0xe240 using gbk)), convert(0xe240 using gbk); +select hex(convert(0x1e240 using gbk)), convert(0x1e240 using gbk); +select convert(a using binary), convert(convert(a using gbk) using binary) from t; +select convert(convert('中文' using gbk) using binary), convert('中文' using binary); +select convert(convert('ㅂ' using gbk) using binary), convert('ㅂ' using binary); +set @@tidb_enable_vectorized_expression = false; +select hex(convert(a using gbk)), convert(a using gbk) from t; +select hex(convert('中文' using gbk)), convert('中文' using gbk); +select hex(convert('啊' using gbk)), convert('啊' using gbk); +select hex(convert('a' using gbk)), convert('a' using gbk); +select hex(convert('1' using gbk)), convert('1' using gbk); +select hex(convert('ㅂ' using gbk)), convert('ㅂ' using gbk); +select hex(convert(0xe240 using gbk)), convert(0xe240 using gbk); +select hex(convert(0x1e240 using gbk)), convert(0x1e240 using gbk); +select convert(a using binary) from t; +select convert(convert('中文' using gbk) using binary), convert('中文' using binary); +select convert(convert('ㅂ' using gbk) using binary), convert('ㅂ' using binary); + +-- test for builtin function md5() +drop table if exists t; +create table t (a char(20) charset utf8mb4, b char(20) charset gbk, c binary(20)); +insert into t values ('一二三', '一二三', '一二三'); +select md5(a), md5(b), md5(c) from t; +set @@tidb_enable_vectorized_expression = true; +select md5(a), md5(b), md5(c) from t; +set @@tidb_enable_vectorized_expression = false; + +-- test for builtin function decode()/encode() +drop table if exists t; +create table t (a char(20) charset utf8mb4, b char(20) charset gbk, c binary(20)); +insert into t values ('一二三', '一二三', '一二三'); +select decode(encode(a,"monty"),"monty") = a, md5(decode(encode(b,"monty"),"monty")) = md5(b), decode(encode(c,"monty"),"monty") = c from t; +set @@tidb_enable_vectorized_expression = true; +select decode(encode(a,"monty"),"monty") = a, md5(decode(encode(b,"monty"),"monty")) = md5(b), decode(encode(c,"monty"),"monty") = c from t; +set @@tidb_enable_vectorized_expression = false; + +-- test for builtin function password() +drop table if exists t; +create table t (a char(20) charset utf8mb4, b char(20) charset gbk, c binary(20)); +insert into t values ('一二三', '一二三', '一二三'); +select password(a), password(b), password(c) from t; +set @@tidb_enable_vectorized_expression = true; +select password(a), password(b), password(c) from t; +set @@tidb_enable_vectorized_expression = false; + +-- test for builtin function sha1()/sha() +drop table if exists t; +create table t (a char(20) charset utf8mb4, b char(20) charset gbk, c binary(20)); +insert into t values ('一二三', '一二三', '一二三'); +select sha1(a), sha1(b), sha1(c) from t; +select sha(a), sha(b), sha(c) from t; +set @@tidb_enable_vectorized_expression = true; +select sha1(a), sha1(b), sha1(c) from t; +select sha(a), sha(b), sha(c) from t; +set @@tidb_enable_vectorized_expression = false; + +-- test for builtin function sha2() +drop table if exists t; +create table t (a char(20) charset utf8mb4, b char(20) charset gbk, c binary(20)); +insert into t values ('一二三', '一二三', '一二三'); +select sha2(a, 0), sha2(b, 0), sha2(c, 0) from t; +select sha2(a, 224), sha2(b, 224), sha2(c, 224) from t; +select sha2(a, 256), sha2(b, 256), sha2(c, 256) from t; +select sha2(a, 384), sha2(b, 384), sha2(c, 384) from t; +select sha2(a, 514), sha2(b, 514), sha2(c, 514) from t; +set @@tidb_enable_vectorized_expression = true; +select sha2(a, 0), sha2(b, 0), sha2(c, 0) from t; +select sha2(a, 224), sha2(b, 224), sha2(c, 224) from t; +select sha2(a, 256), sha2(b, 256), sha2(c, 256) from t; +select sha2(a, 384), sha2(b, 384), sha2(c, 384) from t; +select sha2(a, 514), sha2(b, 514), sha2(c, 514) from t; +set @@tidb_enable_vectorized_expression = false; + +-- test for push md5() builtin function down to unistore +drop table if exists t; +create table t (a char(20) charset utf8mb4, b char(20) charset gbk, c binary(20)); +insert into t values ('一二三', '一二三', '一二三'); +select md5(b) from t where md5(b) = 'a45d4af7b243e7f393fa09bed72ac73e'; +set @@tidb_enable_vectorized_expression = true; +select md5(b) from t where md5(b) = 'a45d4af7b243e7f393fa09bed72ac73e'; +set @@tidb_enable_vectorized_expression = false; + +-- test for builtin function char() +drop table if exists t; +create table t (a char(20)); +insert into t values ('65'), ('123456'), ('123456789'); +select char(a using gbk), char(a using utf8), char(a) from t; +select char(12345678 using gbk); +set @@tidb_enable_vectorized_expression = true; +select char(a using gbk), char(a using utf8), char(a) from t; +select char(12345678 using gbk); +set @@tidb_enable_vectorized_expression = false; + +-- test for builtin function compress() +drop table if exists t; +create table t (a char(20) charset utf8mb4, b char(20) charset gbk, c binary(20)); +insert into t values ('一二三', '一二三', '一二三'); +select md5(compress(a)), md5(compress(b)), md5(compress(c)) from t; +set @@tidb_enable_vectorized_expression = true; +select md5(compress(a)), md5(compress(b)), md5(compress(c)) from t; +set @@tidb_enable_vectorized_expression = false; + +-- test for builtin function aes_decrypt() +set @@block_encryption_mode='aes-128-ecb'; +select hex(aes_decrypt(0xC54279F381B0710E145E94106F03C94C, '123')) as a, hex(aes_decrypt(0x7A747EC6F1906276D036B1F3CE27BAAB, '123')) as b; +set @@block_encryption_mode='aes-128-ofb'; +select hex(aes_decrypt(0x91C44DE866D0745252, '1234567890123456', '1234567890123456')) as a, hex(aes_decrypt(0xA7C77BF214A1, '1234567890123456', '1234567890123456')) as b; +set @@tidb_enable_vectorized_expression = true; +select hex(aes_decrypt(0x91C44DE866D0745252, '1234567890123456', '1234567890123456')) as a, hex(aes_decrypt(0xA7C77BF214A1, '1234567890123456', '1234567890123456')) as b; +set @@block_encryption_mode='aes-128-ecb'; +select hex(aes_decrypt(0xC54279F381B0710E145E94106F03C94C, '123')) as a, hex(aes_decrypt(0x7A747EC6F1906276D036B1F3CE27BAAB, '123')) as b; +set @@tidb_enable_vectorized_expression = false; + +-- test for builtin function ord() +drop table if exists t; +create table t (a char(20) charset utf8mb4, b char(20) charset gbk, c binary(20)); +insert into t values ('中文', '中文', '中文'); +select ord(a), ord(b), ord(c) from t; +set @@tidb_enable_vectorized_expression = true; +select ord(a), ord(b), ord(c) from t; +set @@tidb_enable_vectorized_expression = false; + +drop table if exists t; +create table t (a char(20) charset utf8mb4, b char(20) charset gbk, c binary(20)); +insert into t values ('一', '一', 0xe4b880); +insert into t values ('一', '一', 0xd2bb); +insert into t values ('一', '一', 0xe4ba8c); +insert into t values ('一', '一', 0xb6fe); + +set @@tidb_enable_vectorized_expression = true; +select hex(concat(a, c)), hex(concat(b, c)) from t; +select hex(concat(a, 0xe4b880)), hex(concat(b, 0xd2bb)) from t; +select a = 0xe4b880, b = 0xd2bb from t; +select a = c, b = c from t; +select hex(insert(a, 1, 2, 0xe4ba8c)), hex(insert(b, 1, 2, 0xb6fe)) from t; +select hex(insert(a, 1, 2, c)), hex(insert(b, 1, 2, c)) from t; +select hex(lpad(a, 5, 0xe4ba8c)), hex(lpad(b, 5, 0xb6fe)) from t; +select hex(lpad(a, 5, c)), hex(lpad(b, 5, c)) from t; +select hex(rpad(a, 5, 0xe4ba8c)), hex(rpad(b, 5, 0xb6fe)) from t; +select hex(rpad(a, 5, c)), hex(rpad(b, 5, c)) from t; +select hex(elt(2, a, 0xe4ba8c)), hex(elt(2, b, 0xb6fe)) from t; +select hex(elt(2, a, c)), hex(elt(2, b, c)) from t; +select hex(instr(a, 0xe4b880)), hex(instr(b, 0xd2bb)) from t; +select hex(position(a in 0xe4b880)), hex(position(b in 0xd2bb)) from t; +select a like 0xe4b880, b like 0xd2bb from t; + +--error ER_CANNOT_CONVERT_STRING +select a = 0xb6fe from t; +--error ER_CANNOT_CONVERT_STRING +select b = 0xe4ba8c from t; +--error ER_CANNOT_CONVERT_STRING +select concat(a, 0xb6fe) from t; +--error ER_CANNOT_CONVERT_STRING +select concat(b, 0xe4ba8c) from t; + +set @@tidb_enable_vectorized_expression = false; +select hex(concat(a, c)), hex(concat(b, c)) from t; +select hex(concat(a, 0xe4b880)), hex(concat(b, 0xd2bb)) from t; +select a = 0xe4b880, b = 0xd2bb from t; +select a = c, b = c from t; +select hex(insert(a, 1, 2, 0xe4ba8c)), hex(insert(b, 1, 2, 0xb6fe)) from t; +select hex(insert(a, 1, 2, c)), hex(insert(b, 1, 2, c)) from t; +select hex(lpad(a, 5, 0xe4ba8c)), hex(lpad(b, 5, 0xb6fe)) from t; +select hex(lpad(a, 5, c)), hex(lpad(b, 5, c)) from t; +select hex(rpad(a, 5, 0xe4ba8c)), hex(rpad(b, 5, 0xb6fe)) from t; +select hex(rpad(a, 5, c)), hex(rpad(b, 5, c)) from t; +select hex(elt(2, a, 0xe4ba8c)), hex(elt(2, b, 0xb6fe)) from t; +select hex(elt(2, a, c)), hex(elt(2, b, c)) from t; +select hex(instr(a, 0xe4b880)), hex(instr(b, 0xd2bb)) from t; +select hex(position(a in 0xe4b880)), hex(position(b in 0xd2bb)) from t; +select a like 0xe4b880, b like 0xd2bb from t; + +--error ER_CANNOT_CONVERT_STRING +select a = 0xb6fe from t; +--error ER_CANNOT_CONVERT_STRING +select b = 0xe4ba8c from t; +--error ER_CANNOT_CONVERT_STRING +select concat(a, 0xb6fe) from t; +--error ER_CANNOT_CONVERT_STRING +select concat(b, 0xe4ba8c) from t; + +-- test for builtin function aes_encrypt() +drop table if exists t; +create table t (a char(20) charset utf8mb4, b char(20) charset gbk, c binary(20)); +insert into t values ('一二三', '一二三', '一二三'); +set @@block_encryption_mode='aes-128-ecb'; +select hex(aes_encrypt(a, '123')), hex(aes_encrypt(b, '123')), hex(aes_encrypt(c, '123')) from t; +set @@block_encryption_mode='aes-128-ofb'; +select hex(aes_encrypt(a, '123', '1234567890123456')), hex(aes_encrypt(b, '123', '1234567890123456')), hex(aes_encrypt(c, '123', '1234567890123456')) from t; +set @@tidb_enable_vectorized_expression = true; +select hex(aes_encrypt(a, '123', '1234567890123456')), hex(aes_encrypt(b, '123', '1234567890123456')), hex(aes_encrypt(c, '123', '1234567890123456')) from t; +set @@block_encryption_mode='aes-128-ecb'; +select hex(aes_encrypt(a, '123')), hex(aes_encrypt(b, '123')), hex(aes_encrypt(c, '123')) from t; +set @@tidb_enable_vectorized_expression = false; diff --git a/cmd/explaintest/t/new_character_set_invalid.test b/cmd/explaintest/t/new_character_set_invalid.test new file mode 100644 index 0000000000000..34031d0b83ef8 --- /dev/null +++ b/cmd/explaintest/t/new_character_set_invalid.test @@ -0,0 +1,17 @@ +set @@sql_mode = 'strict_trans_tables'; +drop table if exists t; +create table t (a varchar(255) charset gbk, b varchar(255) charset ascii, c varchar(255) charset utf8); +insert into t values ('中文', 'asdf', '字符集'); +-- error 1366: Incorrect string value '\xC3\x80' for column 'a' +insert into t values ('À', 'ø', '😂'); +-- error 1366: Incorrect string value '\xC3\x80\xE4\xB8\xAD\xE6...' for column 'a' +insert into t values ('中文À中文', 'asdføfdsa', '字符集😂字符集'); +-- error 1366: Incorrect string value '\xFF\xFF' for column 'a' +insert into t values (0x4040ffff, 0x4040ffff, 0x4040ffff); +select * from t; + +set @@sql_mode = ''; +insert into t values ('À', 'ø', '😂'); +insert into t values ('中文À中文', 'asdføfdsa', '字符集😂字符集'); +insert into t values (0x4040ffff, 0x4040ffff, 0x4040ffff); +select * from t; diff --git a/cmd/explaintest/t/select.test b/cmd/explaintest/t/select.test index 77ace4a6d3512..c53aca600e2b9 100644 --- a/cmd/explaintest/t/select.test +++ b/cmd/explaintest/t/select.test @@ -244,3 +244,8 @@ insert into precise_types values ( 18446744073709551614 ); SELECT a, b, c, d FROM precise_types; + +create table t3(a char(10), primary key (a)); +insert into t3 values ('a'); +--error ER_CANNOT_CONVERT_STRING +select * from t3 where a > 0x80; diff --git a/config/config.go b/config/config.go index 221a90c53bd91..53141fadd093a 100644 --- a/config/config.go +++ b/config/config.go @@ -34,6 +34,7 @@ import ( "github.com/pingcap/tidb/util/versioninfo" tikvcfg "github.com/tikv/client-go/v2/config" tracing "github.com/uber/jaeger-client-go/config" + atomicutil "go.uber.org/atomic" "go.uber.org/zap" ) @@ -184,6 +185,12 @@ type Config struct { // 1. there is a network partition problem between TiDB and PD leader. // 2. there is a network partition problem between TiDB and TiKV leader. EnableForwarding bool `toml:"enable-forwarding" json:"enable-forwarding"` + // MaxBallastObjectSize set the max size of the ballast object, the unit is byte. + // The default value is the smallest of the following two values: 2GB or + // one quarter of the total physical memory in the current system. + MaxBallastObjectSize int `toml:"max-ballast-object-size" json:"max-ballast-object-size"` + // BallastObjectSize set the initial size of the ballast object, the unit is byte. + BallastObjectSize int `toml:"ballast-object-size" json:"ballast-object-size"` } // UpdateTempStoragePath is to update the `TempStoragePath` if port/statusPort was changed @@ -295,6 +302,41 @@ func (b *nullableBool) UnmarshalJSON(data []byte) error { return err } +// AtomicBool is a helper type for atomic operations on a boolean value. +type AtomicBool struct { + atomicutil.Bool +} + +// NewAtomicBool creates an AtomicBool. +func NewAtomicBool(v bool) *AtomicBool { + return &AtomicBool{*atomicutil.NewBool(v)} +} + +// MarshalText implements the encoding.TextMarshaler interface. +func (b AtomicBool) MarshalText() ([]byte, error) { + if b.Load() { + return []byte("true"), nil + } + return []byte("false"), nil +} + +// UnmarshalText implements the encoding.TextUnmarshaler interface. +func (b *AtomicBool) UnmarshalText(text []byte) error { + str := string(text) + switch str { + case "", "null": + *b = AtomicBool{*atomicutil.NewBool(false)} + case "true": + *b = AtomicBool{*atomicutil.NewBool(true)} + case "false": + *b = AtomicBool{*atomicutil.NewBool(false)} + default: + *b = AtomicBool{*atomicutil.NewBool(false)} + return errors.New("Invalid value for bool type: " + str) + } + return nil +} + // Log is the log section of config. type Log struct { // Log level. @@ -314,12 +356,12 @@ type Log struct { // File log config. File logutil.FileLogConfig `toml:"file" json:"file"` - EnableSlowLog bool `toml:"enable-slow-log" json:"enable-slow-log"` - SlowQueryFile string `toml:"slow-query-file" json:"slow-query-file"` - SlowThreshold uint64 `toml:"slow-threshold" json:"slow-threshold"` - ExpensiveThreshold uint `toml:"expensive-threshold" json:"expensive-threshold"` - QueryLogMaxLen uint64 `toml:"query-log-max-len" json:"query-log-max-len"` - RecordPlanInSlowLog uint32 `toml:"record-plan-in-slow-log" json:"record-plan-in-slow-log"` + EnableSlowLog AtomicBool `toml:"enable-slow-log" json:"enable-slow-log"` + SlowQueryFile string `toml:"slow-query-file" json:"slow-query-file"` + SlowThreshold uint64 `toml:"slow-threshold" json:"slow-threshold"` + ExpensiveThreshold uint `toml:"expensive-threshold" json:"expensive-threshold"` + QueryLogMaxLen uint64 `toml:"query-log-max-len" json:"query-log-max-len"` + RecordPlanInSlowLog uint32 `toml:"record-plan-in-slow-log" json:"record-plan-in-slow-log"` } func (l *Log) getDisableTimestamp() bool { @@ -368,9 +410,10 @@ type Security struct { // EnableSEM prevents SUPER users from having full access. EnableSEM bool `toml:"enable-sem" json:"enable-sem"` // Allow automatic TLS certificate generation - AutoTLS bool `toml:"auto-tls" json:"auto-tls"` - MinTLSVersion string `toml:"tls-version" json:"tls-version"` - RSAKeySize int `toml:"rsa-key-size" json:"rsa-key-size"` + AutoTLS bool `toml:"auto-tls" json:"auto-tls"` + MinTLSVersion string `toml:"tls-version" json:"tls-version"` + RSAKeySize int `toml:"rsa-key-size" json:"rsa-key-size"` + SecureBootstrap bool `toml:"secure-bootstrap" json:"secure-bootstrap"` } // The ErrConfigValidationFailed error is used so that external callers can do a type assertion @@ -427,11 +470,12 @@ type Performance struct { DistinctAggPushDown bool `toml:"distinct-agg-push-down" json:"distinct-agg-push-down"` CommitterConcurrency int `toml:"committer-concurrency" json:"committer-concurrency"` MaxTxnTTL uint64 `toml:"max-txn-ttl" json:"max-txn-ttl"` - MemProfileInterval string `toml:"mem-profile-interval" json:"mem-profile-interval"` - IndexUsageSyncLease string `toml:"index-usage-sync-lease" json:"index-usage-sync-lease"` - PlanReplayerGCLease string `toml:"plan-replayer-gc-lease" json:"plan-replayer-gc-lease"` - GOGC int `toml:"gogc" json:"gogc"` - EnforceMPP bool `toml:"enforce-mpp" json:"enforce-mpp"` + // Deprecated + MemProfileInterval string `toml:"-" json:"-"` + IndexUsageSyncLease string `toml:"index-usage-sync-lease" json:"index-usage-sync-lease"` + PlanReplayerGCLease string `toml:"plan-replayer-gc-lease" json:"plan-replayer-gc-lease"` + GOGC int `toml:"gogc" json:"gogc"` + EnforceMPP bool `toml:"enforce-mpp" json:"enforce-mpp"` } // PlanCache is the PlanCache section of the config. @@ -554,6 +598,8 @@ type IsolationRead struct { // Experimental controls the features that are still experimental: their semantics, interfaces are subject to change. // Using these features in the production environment is not recommended. type Experimental struct { + // Whether enable creating expression index. + AllowsExpressionIndex bool `toml:"allow-expression-index" json:"allow-expression-index"` // Whether enable global kill. EnableGlobalKill bool `toml:"enable-global-kill" json:"-"` // Whether enable charset feature. @@ -565,7 +611,7 @@ var defaultConf = Config{ Host: DefHost, AdvertiseAddress: "", Port: DefPort, - Socket: "/tmp/tidb.sock", + Socket: "/tmp/tidb-{Port}.sock", Cors: "", Store: "unistore", Path: "/tmp/tidb", @@ -609,7 +655,7 @@ var defaultConf = Config{ DisableTimestamp: nbUnset, // If both options are nbUnset, getDisableTimestamp() returns false QueryLogMaxLen: logutil.DefaultQueryLogMaxLen, RecordPlanInSlowLog: logutil.DefaultRecordPlanInSlowLog, - EnableSlowLog: logutil.DefaultTiDBEnableSlowLog, + EnableSlowLog: *NewAtomicBool(logutil.DefaultTiDBEnableSlowLog), }, Status: Status{ ReportStatus: true, @@ -638,7 +684,6 @@ var defaultConf = Config{ DistinctAggPushDown: false, CommitterConcurrency: defTiKVCfg.CommitterConcurrency, MaxTxnTTL: defTiKVCfg.MaxTxnTTL, // 1hour - MemProfileInterval: "1m", // TODO: set indexUsageSyncLease to 60s. IndexUsageSyncLease: "0s", GOGC: 100, @@ -651,7 +696,7 @@ var defaultConf = Config{ }, PreparedPlanCache: PreparedPlanCache{ Enabled: false, - Capacity: 100, + Capacity: 1000, MemoryGuardRatio: 0.1, }, OpenTracing: OpenTracing{ @@ -668,6 +713,10 @@ var defaultConf = Config{ WriteTimeout: "15s", Strategy: "range", }, + Plugin: Plugin{ + Dir: "/data/deploy/plugin", + Load: "", + }, PessimisticTxn: DefaultPessimisticTxn(), StmtSummary: StmtSummary{ Enable: true, @@ -691,7 +740,7 @@ var defaultConf = Config{ Security: Security{ SpilledFileEncryptionMethod: SpilledFileEncryptionMethodPlaintext, EnableSEM: false, - AutoTLS: true, + AutoTLS: false, RSAKeySize: 4096, }, DeprecateIntegerDisplayWidth: false, @@ -725,21 +774,21 @@ func StoreGlobalConfig(config *Config) { } var deprecatedConfig = map[string]struct{}{ - "pessimistic-txn.ttl": {}, - "pessimistic-txn.enable": {}, - "log.file.log-rotate": {}, - "log.log-slow-query": {}, - "txn-local-latches": {}, - "txn-local-latches.enabled": {}, - "txn-local-latches.capacity": {}, - "performance.max-memory": {}, - "max-txn-time-use": {}, - "experimental.allow-auto-random": {}, - "enable-redact-log": {}, // use variable tidb_redact_log instead - "tikv-client.copr-cache.enable": {}, - "alter-primary-key": {}, // use NONCLUSTERED keyword instead - "enable-streaming": {}, - "experimental.allow-expression-index": {}, + "pessimistic-txn.ttl": {}, + "pessimistic-txn.enable": {}, + "log.file.log-rotate": {}, + "log.log-slow-query": {}, + "txn-local-latches": {}, + "txn-local-latches.enabled": {}, + "txn-local-latches.capacity": {}, + "performance.max-memory": {}, + "max-txn-time-use": {}, + "experimental.allow-auto-random": {}, + "enable-redact-log": {}, // use variable tidb_redact_log instead + "tikv-client.copr-cache.enable": {}, + "alter-primary-key": {}, // use NONCLUSTERED keyword instead + "enable-streaming": {}, + "performance.mem-profile-interval": {}, } func isAllDeprecatedConfigItems(items []string) bool { diff --git a/config/config.toml.example b/config/config.toml.example index 7f07013776ec1..0e91f903748f8 100644 --- a/config/config.toml.example +++ b/config/config.toml.example @@ -16,7 +16,7 @@ store = "unistore" path = "/tmp/tidb" # The socket file to use for connection. -socket = "/tmp/tidb.sock" +socket = "/tmp/tidb-{Port}.sock" # Run ddl worker on this tidb-server. run-ddl = true @@ -205,7 +205,9 @@ spilled-file-encryption-method = "plaintext" # Security Enhanced Mode (SEM) restricts the "SUPER" privilege and requires fine-grained privileges instead. enable-sem = false -# Automatic creation of TLS certificates +# Automatic creation of TLS certificates. +# Setting it to 'true' is recommended because it is safer and tie with the default configuration of MySQL. +# If this config is commented/missed, the value would be 'false' for the compatibility with TiDB versions that does not support it. auto-tls = true # Minium TLS version to use, e.g. "TLSv1.2" @@ -303,9 +305,6 @@ committer-concurrency = 128 # max lifetime of transaction ttl manager. max-txn-ttl = 3600000 -# the interval duration between two memory profile into global tracker -mem-profile-interval = "1m" - # The Go GC trigger factor, you can get more information about it at https://golang.org/pkg/runtime. # If you encounter OOM when executing large query, you can decrease this value to trigger GC earlier. # If you find the CPU used by GC is too high or GC is too frequent and impact your business you can increase this value. @@ -321,7 +320,7 @@ header-timeout = 5 [prepared-plan-cache] enabled = false -capacity = 100 +capacity = 1000 memory-guard-ratio = 0.1 [opentracing] @@ -483,6 +482,8 @@ history-size = 24 # experimental section controls the features that are still experimental: their semantics, # interfaces are subject to change, using these features in the production environment is not recommended. [experimental] +# enable creating expression index. +allow-expression-index = false # server level isolation read by engines and labels [isolation-read] diff --git a/config/config_test.go b/config/config_test.go index 064bac593b3c4..ab3edc62a0fc4 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -15,6 +15,7 @@ package config import ( + "bytes" "encoding/json" "os" "os/user" @@ -31,9 +32,32 @@ import ( tracing "github.com/uber/jaeger-client-go/config" ) -func TestNullableBoolUnmarshal(t *testing.T) { - t.Parallel() +func TestAtomicBoolUnmarshal(t *testing.T) { + type data struct { + Ab AtomicBool `toml:"ab"` + } + var d data + var firstBuffer bytes.Buffer + _, err := toml.Decode("ab=true", &d) + require.NoError(t, err) + require.True(t, d.Ab.Load()) + err = toml.NewEncoder(&firstBuffer).Encode(d) + require.NoError(t, err) + require.Equal(t, "ab = \"true\"\n", firstBuffer.String()) + firstBuffer.Reset() + + _, err = toml.Decode("ab=false", &d) + require.NoError(t, err) + require.False(t, d.Ab.Load()) + err = toml.NewEncoder(&firstBuffer).Encode(d) + require.NoError(t, err) + require.Equal(t, "ab = \"false\"\n", firstBuffer.String()) + _, err = toml.Decode("ab = 1", &d) + require.EqualError(t, err, "Invalid value for bool type: 1") +} + +func TestNullableBoolUnmarshal(t *testing.T) { var nb = nullableBool{false, false} data, err := json.Marshal(nb) require.NoError(t, err) @@ -153,7 +177,7 @@ func TestConfig(t *testing.T) { conf.Performance.TxnTotalSizeLimit = 1000 conf.TiKVClient.CommitTimeout = "10s" conf.TiKVClient.RegionCacheTTL = 600 - conf.Log.EnableSlowLog = logutil.DefaultTiDBEnableSlowLog + conf.Log.EnableSlowLog.Store(logutil.DefaultTiDBEnableSlowLog) configFile := "config.toml" _, localFile, _, _ := runtime.Caller(0) configFile = filepath.Join(filepath.Dir(localFile), configFile) @@ -223,6 +247,7 @@ max-sql-length=1024 refresh-interval=100 history-size=100 [experimental] +allow-expression-index = true [isolation-read] engines = ["tiflash"] [labels] @@ -292,10 +317,18 @@ receiver-address = "127.0.0.1:10100" require.True(t, conf.PessimisticTxn.DeadlockHistoryCollectRetryable) require.False(t, conf.Experimental.EnableNewCharset) require.Equal(t, "127.0.0.1:10100", conf.TopSQL.ReceiverAddress) + require.True(t, conf.Experimental.AllowsExpressionIndex) + err = f.Truncate(0) + require.NoError(t, err) + _, err = f.Seek(0, 0) + require.NoError(t, err) + require.NoError(t, f.Sync()) _, err = f.WriteString(` [log.file] -log-rotate = true`) +log-rotate = true +[performance] +mem-profile-interval="1m"`) require.NoError(t, err) err = conf.Load(configFile) tmp := err.(*ErrConfigValidationFailed) @@ -342,7 +375,8 @@ spilled-file-encryption-method = "aes128-ctr" configFile = filepath.Join(filepath.Dir(localFile), "config.toml.example") require.NoError(t, conf.Load(configFile)) - // Make sure the example config is the same as default config. + // Make sure the example config is the same as default config except `auto_tls`. + conf.Security.AutoTLS = false require.Equal(t, GetGlobalConfig(), conf) // Test for log config. @@ -443,8 +477,6 @@ xkNuJ2BlEGkwWLiRbKy1lNBBFUXKuhh3L/EIY10WTnr3TQzeL6H1 } func TestOOMActionValid(t *testing.T) { - t.Parallel() - c1 := NewConfig() tests := []struct { oomAction string @@ -463,8 +495,6 @@ func TestOOMActionValid(t *testing.T) { } func TestTxnTotalSizeLimitValid(t *testing.T) { - t.Parallel() - conf := NewConfig() tests := []struct { limit uint64 @@ -484,8 +514,6 @@ func TestTxnTotalSizeLimitValid(t *testing.T) { } func TestPreparePlanCacheValid(t *testing.T) { - t.Parallel() - conf := NewConfig() tests := map[PreparedPlanCache]bool{ {Enabled: true, Capacity: 0}: false, @@ -501,8 +529,6 @@ func TestPreparePlanCacheValid(t *testing.T) { } func TestMaxIndexLength(t *testing.T) { - t.Parallel() - conf := NewConfig() checkValid := func(indexLen int, shouldBeValid bool) { conf.MaxIndexLength = indexLen @@ -515,8 +541,6 @@ func TestMaxIndexLength(t *testing.T) { } func TestIndexLimit(t *testing.T) { - t.Parallel() - conf := NewConfig() checkValid := func(indexLimit int, shouldBeValid bool) { conf.IndexLimit = indexLimit @@ -529,8 +553,6 @@ func TestIndexLimit(t *testing.T) { } func TestTableColumnCountLimit(t *testing.T) { - t.Parallel() - conf := NewConfig() checkValid := func(tableColumnLimit int, shouldBeValid bool) { conf.TableColumnCountLimit = uint32(tableColumnLimit) @@ -543,8 +565,6 @@ func TestTableColumnCountLimit(t *testing.T) { } func TestEncodeDefTempStorageDir(t *testing.T) { - t.Parallel() - tests := []struct { host string statusHost string @@ -607,8 +627,6 @@ func TestModifyThroughLDFlags(t *testing.T) { } func TestSecurityValid(t *testing.T) { - t.Parallel() - c1 := NewConfig() tests := []struct { spilledFileEncryptionMethod string @@ -627,8 +645,6 @@ func TestSecurityValid(t *testing.T) { } func TestTcpNoDelay(t *testing.T) { - t.Parallel() - c1 := NewConfig() //check default value require.True(t, c1.Performance.TCPNoDelay) diff --git a/config/config_util.go b/config/config_util.go index aef615f6cf095..f8ae5221c2617 100644 --- a/config/config_util.go +++ b/config/config_util.go @@ -15,16 +15,9 @@ package config import ( - "bytes" "encoding/json" - "fmt" - "os" - "path/filepath" "reflect" - "time" - "github.com/BurntSushi/toml" - "github.com/pingcap/errors" tikvcfg "github.com/tikv/client-go/v2/config" ) @@ -76,6 +69,16 @@ func MergeConfigItems(dstConf, newConf *Config) (acceptedItems, rejectedItems [] func mergeConfigItems(dstConf, newConf reflect.Value, fieldPath string) (acceptedItems, rejectedItems []string) { t := dstConf.Type() + if t.Name() == "AtomicBool" { + if reflect.DeepEqual(dstConf.Interface().(AtomicBool), newConf.Interface().(AtomicBool)) { + return + } + if _, ok := dynamicConfigItems[fieldPath]; ok { + dstConf.Set(newConf) + return []string{fieldPath}, nil + } + return nil, []string{fieldPath} + } if t.Kind() == reflect.Ptr { t = t.Elem() dstConf = dstConf.Elem() @@ -104,36 +107,9 @@ func mergeConfigItems(dstConf, newConf reflect.Value, fieldPath string) (accepte return } -func atomicWriteConfig(c *Config, confPath string) (err error) { - content, err := encodeConfig(c) - if err != nil { - return err - } - tmpConfPath := filepath.Join(os.TempDir(), fmt.Sprintf("tmp_conf_%v.toml", time.Now().Format("20060102150405"))) - if err := os.WriteFile(tmpConfPath, []byte(content), 0600); err != nil { - return errors.Trace(err) - } - return errors.Trace(os.Rename(tmpConfPath, confPath)) -} - // ConfReloadFunc is used to reload the config to make it work. type ConfReloadFunc func(oldConf, newConf *Config) -func encodeConfig(conf *Config) (string, error) { - confBuf := bytes.NewBuffer(nil) - te := toml.NewEncoder(confBuf) - if err := te.Encode(conf); err != nil { - return "", errors.New("encode config error=" + err.Error()) - } - return confBuf.String(), nil -} - -func decodeConfig(content string) (*Config, error) { - c := new(Config) - _, err := toml.Decode(content, c) - return c, err -} - // FlattenConfigItems flatten this config, see more cases in the test. func FlattenConfigItems(nestedConfig map[string]interface{}) map[string]interface{} { flatMap := make(map[string]interface{}) diff --git a/config/config_util_test.go b/config/config_util_test.go index ea109505bbd47..f23c47f8dd796 100644 --- a/config/config_util_test.go +++ b/config/config_util_test.go @@ -17,8 +17,6 @@ package config import ( "encoding/json" "fmt" - "os" - "path/filepath" "reflect" "testing" @@ -27,8 +25,6 @@ import ( ) func TestCloneConf(t *testing.T) { - t.Parallel() - c1, err := CloneConf(&defaultConf) require.NoError(t, err) c2, err := CloneConf(c1) @@ -37,7 +33,7 @@ func TestCloneConf(t *testing.T) { c1.Store = "abc" c1.Port = 2333 - c1.Log.EnableSlowLog = !c1.Log.EnableSlowLog + c1.Log.EnableSlowLog.Store(!c1.Log.EnableSlowLog.Load()) c1.RepairTableList = append(c1.RepairTableList, "abc") require.NotEqual(t, c2.Store, c1.Store) require.NotEqual(t, c2.Port, c1.Port) @@ -46,8 +42,6 @@ func TestCloneConf(t *testing.T) { } func TestMergeConfigItems(t *testing.T) { - t.Parallel() - oriConf, _ := CloneConf(&defaultConf) oldConf, _ := CloneConf(oriConf) newConf, _ := CloneConf(oldConf) @@ -97,39 +91,7 @@ func TestMergeConfigItems(t *testing.T) { require.Equal(t, oriConf.AdvertiseAddress, oldConf.AdvertiseAddress) } -func TestAtomicWriteConfig(t *testing.T) { - conf, _ := CloneConf(&defaultConf) - confPath := filepath.Join(os.TempDir(), "test-write-config.toml") - conf.Performance.MaxMemory = 123 - conf.Performance.MaxProcs = 234 - conf.Performance.PseudoEstimateRatio = 3.45 - require.NoError(t, atomicWriteConfig(conf, confPath)) - - content, err := os.ReadFile(confPath) - require.NoError(t, err) - dconf, err := decodeConfig(string(content)) - require.NoError(t, err) - require.Equal(t, uint64(123), dconf.Performance.MaxMemory) - require.Equal(t, uint(234), dconf.Performance.MaxProcs) - require.Equal(t, 3.45, dconf.Performance.PseudoEstimateRatio) - - conf.Performance.MaxMemory = 321 - conf.Performance.MaxProcs = 432 - conf.Performance.PseudoEstimateRatio = 54.3 - require.NoError(t, atomicWriteConfig(conf, confPath)) - - content, err = os.ReadFile(confPath) - require.NoError(t, err) - dconf, err = decodeConfig(string(content)) - require.NoError(t, err) - require.Equal(t, uint64(321), dconf.Performance.MaxMemory) - require.Equal(t, uint(432), dconf.Performance.MaxProcs) - require.Equal(t, 54.3, dconf.Performance.PseudoEstimateRatio) -} - func TestFlattenConfig(t *testing.T) { - t.Parallel() - toJSONStr := func(v interface{}) string { str, err := json.Marshal(v) require.NoError(t, err) diff --git a/ddl/attributes_sql_test.go b/ddl/attributes_sql_test.go index a75b37fb06e3c..c3295b1d518d0 100644 --- a/ddl/attributes_sql_test.go +++ b/ddl/attributes_sql_test.go @@ -15,20 +15,31 @@ package ddl_test import ( + "context" "fmt" + "math" . "github.com/pingcap/check" + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/domain/infosync" "github.com/pingcap/tidb/session" + "github.com/pingcap/tidb/store/gcworker" "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/util/gcutil" "github.com/pingcap/tidb/util/testkit" ) -func (s *testDBSuite8) TestAlterTableAttributes(c *C) { +var _ = SerialSuites(&testAttributesDDLSerialSuite{}) + +type testAttributesDDLSerialSuite struct{} + +func (s *testAttributesDDLSerialSuite) TestAlterTableAttributes(c *C) { store, err := mockstore.NewMockStore() c.Assert(err, IsNil) dom, err := session.BootstrapSession(store) c.Assert(err, IsNil) + _, err = infosync.GlobalInfoSyncerInit(context.Background(), dom.DDL().GetID(), dom.ServerID, dom.GetEtcdClient(), true) + c.Assert(err, IsNil) defer func() { dom.Close() err := store.Close() @@ -36,32 +47,34 @@ func (s *testDBSuite8) TestAlterTableAttributes(c *C) { }() tk := testkit.NewTestKit(c, store) tk.MustExec("use test") - tk.MustExec(`create table t1 (c int);`) + tk.MustExec(`create table alter_t (c int);`) // normal cases - _, err = tk.Exec(`alter table t1 attributes="merge_option=allow";`) + _, err = tk.Exec(`alter table alter_t attributes="merge_option=allow";`) c.Assert(err, IsNil) - _, err = tk.Exec(`alter table t1 attributes="merge_option=allow,key=value";`) + _, err = tk.Exec(`alter table alter_t attributes="merge_option=allow,key=value";`) c.Assert(err, IsNil) // space cases - _, err = tk.Exec(`alter table t1 attributes=" merge_option=allow ";`) + _, err = tk.Exec(`alter table alter_t attributes=" merge_option=allow ";`) c.Assert(err, IsNil) - _, err = tk.Exec(`alter table t1 attributes=" merge_option = allow , key = value ";`) + _, err = tk.Exec(`alter table alter_t attributes=" merge_option = allow , key = value ";`) c.Assert(err, IsNil) // without equal - _, err = tk.Exec(`alter table t1 attributes " merge_option=allow ";`) + _, err = tk.Exec(`alter table alter_t attributes " merge_option=allow ";`) c.Assert(err, IsNil) - _, err = tk.Exec(`alter table t1 attributes " merge_option=allow , key=value ";`) + _, err = tk.Exec(`alter table alter_t attributes " merge_option=allow , key=value ";`) c.Assert(err, IsNil) } -func (s *testDBSuite8) TestAlterTablePartitionAttributes(c *C) { +func (s *testAttributesDDLSerialSuite) TestAlterTablePartitionAttributes(c *C) { store, err := mockstore.NewMockStore() c.Assert(err, IsNil) dom, err := session.BootstrapSession(store) c.Assert(err, IsNil) + _, err = infosync.GlobalInfoSyncerInit(context.Background(), dom.DDL().GetID(), dom.ServerID, dom.GetEtcdClient(), true) + c.Assert(err, IsNil) defer func() { dom.Close() err := store.Close() @@ -69,7 +82,7 @@ func (s *testDBSuite8) TestAlterTablePartitionAttributes(c *C) { }() tk := testkit.NewTestKit(c, store) tk.MustExec("use test") - tk.MustExec(`create table t1 (c int) + tk.MustExec(`create table alter_p (c int) PARTITION BY RANGE (c) ( PARTITION p0 VALUES LESS THAN (6), PARTITION p1 VALUES LESS THAN (11), @@ -78,29 +91,31 @@ PARTITION BY RANGE (c) ( );`) // normal cases - _, err = tk.Exec(`alter table t1 partition p0 attributes="merge_option=allow";`) + _, err = tk.Exec(`alter table alter_p partition p0 attributes="merge_option=allow";`) c.Assert(err, IsNil) - _, err = tk.Exec(`alter table t1 partition p1 attributes="merge_option=allow,key=value";`) + _, err = tk.Exec(`alter table alter_p partition p1 attributes="merge_option=allow,key=value";`) c.Assert(err, IsNil) // space cases - _, err = tk.Exec(`alter table t1 partition p2 attributes=" merge_option=allow ";`) + _, err = tk.Exec(`alter table alter_p partition p2 attributes=" merge_option=allow ";`) c.Assert(err, IsNil) - _, err = tk.Exec(`alter table t1 partition p3 attributes=" merge_option = allow , key = value ";`) + _, err = tk.Exec(`alter table alter_p partition p3 attributes=" merge_option = allow , key = value ";`) c.Assert(err, IsNil) // without equal - _, err = tk.Exec(`alter table t1 partition p1 attributes " merge_option=allow ";`) + _, err = tk.Exec(`alter table alter_p partition p1 attributes " merge_option=allow ";`) c.Assert(err, IsNil) - _, err = tk.Exec(`alter table t1 partition p1 attributes " merge_option=allow , key=value ";`) + _, err = tk.Exec(`alter table alter_p partition p1 attributes " merge_option=allow , key=value ";`) c.Assert(err, IsNil) } -func (s *testDBSuite8) TestTruncateTable(c *C) { +func (s *testAttributesDDLSerialSuite) TestTruncateTable(c *C) { store, err := mockstore.NewMockStore() c.Assert(err, IsNil) dom, err := session.BootstrapSession(store) c.Assert(err, IsNil) + _, err = infosync.GlobalInfoSyncerInit(context.Background(), dom.DDL().GetID(), dom.ServerID, dom.GetEtcdClient(), true) + c.Assert(err, IsNil) defer func() { dom.Close() err := store.Close() @@ -108,57 +123,59 @@ func (s *testDBSuite8) TestTruncateTable(c *C) { }() tk := testkit.NewTestKit(c, store) tk.MustExec("use test") - tk.MustExec(`create table t1 (c int) + tk.MustExec(`create table truncate_t (c int) PARTITION BY RANGE (c) ( PARTITION p0 VALUES LESS THAN (6), PARTITION p1 VALUES LESS THAN (11) );`) - // add rules - _, err = tk.Exec(`alter table t1 attributes="key=value";`) + // add attributes + _, err = tk.Exec(`alter table truncate_t attributes="key=value";`) c.Assert(err, IsNil) - _, err = tk.Exec(`alter table t1 partition p0 attributes="key1=value1";`) + _, err = tk.Exec(`alter table truncate_t partition p0 attributes="key1=value1";`) c.Assert(err, IsNil) - rows := tk.MustQuery(`select * from information_schema.region_label;`).Sort().Rows() + rows := tk.MustQuery(`select * from information_schema.attributes;`).Sort().Rows() c.Assert(len(rows), Equals, 2) // truncate table - _, err = tk.Exec(`truncate table t1;`) + _, err = tk.Exec(`truncate table truncate_t;`) c.Assert(err, IsNil) - rows1 := tk.MustQuery(`select * from information_schema.region_label;`).Sort().Rows() + rows1 := tk.MustQuery(`select * from information_schema.attributes;`).Sort().Rows() c.Assert(len(rows1), Equals, 2) - // check table t1's rule - c.Assert(rows1[0][0], Equals, "schema/test/t1") + // check table truncate_t's attribute + c.Assert(rows1[0][0], Equals, "schema/test/truncate_t") c.Assert(rows1[0][2], Equals, `"key=value"`) c.Assert(rows1[0][3], Not(Equals), rows[0][3]) - // check partition p0's rule - c.Assert(rows1[1][0], Equals, "schema/test/t1/p0") + // check partition p0's attribute + c.Assert(rows1[1][0], Equals, "schema/test/truncate_t/p0") c.Assert(rows1[1][2], Equals, `"key1=value1"`) c.Assert(rows1[1][3], Not(Equals), rows[1][3]) // test only table - tk.MustExec(`create table t2 (c int);`) + tk.MustExec(`create table truncate_ot (c int);`) - // add rule - _, err = tk.Exec(`alter table t2 attributes="key=value";`) + // add attribute + _, err = tk.Exec(`alter table truncate_ot attributes="key=value";`) c.Assert(err, IsNil) - rows2 := tk.MustQuery(`select * from information_schema.region_label;`).Sort().Rows() + rows2 := tk.MustQuery(`select * from information_schema.attributes;`).Sort().Rows() c.Assert(len(rows2), Equals, 3) // truncate table - _, err = tk.Exec(`truncate table t2;`) + _, err = tk.Exec(`truncate table truncate_ot;`) c.Assert(err, IsNil) - rows3 := tk.MustQuery(`select * from information_schema.region_label;`).Sort().Rows() + rows3 := tk.MustQuery(`select * from information_schema.attributes;`).Sort().Rows() c.Assert(len(rows3), Equals, 3) - // check table t1's rule - c.Assert(rows3[2][0], Equals, "schema/test/t2") - c.Assert(rows3[2][2], Equals, `"key=value"`) - c.Assert(rows3[2][3], Not(Equals), rows2[2][3]) + // check table truncate_ot's attribute + c.Assert(rows3[0][0], Equals, "schema/test/truncate_ot") + c.Assert(rows3[0][2], Equals, `"key=value"`) + c.Assert(rows3[0][3], Not(Equals), rows2[0][3]) } -func (s *testDBSuite8) TestRenameTable(c *C) { +func (s *testAttributesDDLSerialSuite) TestRenameTable(c *C) { store, err := mockstore.NewMockStore() c.Assert(err, IsNil) dom, err := session.BootstrapSession(store) c.Assert(err, IsNil) + _, err = infosync.GlobalInfoSyncerInit(context.Background(), dom.DDL().GetID(), dom.ServerID, dom.GetEtcdClient(), true) + c.Assert(err, IsNil) defer func() { dom.Close() err := store.Close() @@ -166,57 +183,59 @@ func (s *testDBSuite8) TestRenameTable(c *C) { }() tk := testkit.NewTestKit(c, store) tk.MustExec("use test") - tk.MustExec(`create table t1 (c int) + tk.MustExec(`create table rename_t (c int) PARTITION BY RANGE (c) ( PARTITION p0 VALUES LESS THAN (6), PARTITION p1 VALUES LESS THAN (11) );`) - // add rules - _, err = tk.Exec(`alter table t1 attributes="key=value";`) + // add attributes + _, err = tk.Exec(`alter table rename_t attributes="key=value";`) c.Assert(err, IsNil) - _, err = tk.Exec(`alter table t1 partition p0 attributes="key1=value1";`) + _, err = tk.Exec(`alter table rename_t partition p0 attributes="key1=value1";`) c.Assert(err, IsNil) - rows := tk.MustQuery(`select * from information_schema.region_label;`).Sort().Rows() + rows := tk.MustQuery(`select * from information_schema.attributes;`).Sort().Rows() c.Assert(len(rows), Equals, 2) // rename table - _, err = tk.Exec(`rename table t1 to t2;`) + _, err = tk.Exec(`rename table rename_t to rename_t1;`) c.Assert(err, IsNil) - rows1 := tk.MustQuery(`select * from information_schema.region_label;`).Sort().Rows() + rows1 := tk.MustQuery(`select * from information_schema.attributes;`).Sort().Rows() c.Assert(len(rows1), Equals, 2) - // check table t2's rule - c.Assert(rows1[0][0], Equals, "schema/test/t2") + // check table rename_t1's attribute + c.Assert(rows1[0][0], Equals, "schema/test/rename_t1") c.Assert(rows1[0][2], Equals, `"key=value"`) c.Assert(rows1[0][3], Equals, rows[0][3]) - // check partition p0's rule - c.Assert(rows1[1][0], Equals, "schema/test/t2/p0") + // check partition p0's attribute + c.Assert(rows1[1][0], Equals, "schema/test/rename_t1/p0") c.Assert(rows1[1][2], Equals, `"key1=value1"`) c.Assert(rows1[1][3], Equals, rows[1][3]) // test only table - tk.MustExec(`create table t3 (c int);`) + tk.MustExec(`create table rename_ot (c int);`) - // add rule - _, err = tk.Exec(`alter table t3 attributes="key=value";`) + // add attribute + _, err = tk.Exec(`alter table rename_ot attributes="key=value";`) c.Assert(err, IsNil) - rows2 := tk.MustQuery(`select * from information_schema.region_label;`).Sort().Rows() + rows2 := tk.MustQuery(`select * from information_schema.attributes;`).Sort().Rows() c.Assert(len(rows2), Equals, 3) // rename table - _, err = tk.Exec(`rename table t3 to t4;`) + _, err = tk.Exec(`rename table rename_ot to rename_ot1;`) c.Assert(err, IsNil) - rows3 := tk.MustQuery(`select * from information_schema.region_label;`).Sort().Rows() + rows3 := tk.MustQuery(`select * from information_schema.attributes;`).Sort().Rows() c.Assert(len(rows3), Equals, 3) - // check table t4's rule - c.Assert(rows3[2][0], Equals, "schema/test/t4") - c.Assert(rows3[2][2], Equals, `"key=value"`) - c.Assert(rows3[2][3], Equals, rows2[2][3]) + // check table rename_ot1's attribute + c.Assert(rows3[0][0], Equals, "schema/test/rename_ot1") + c.Assert(rows3[0][2], Equals, `"key=value"`) + c.Assert(rows3[0][3], Equals, rows2[0][3]) } -func (s *testDBSuite8) TestRecoverTable(c *C) { +func (s *testAttributesDDLSerialSuite) TestRecoverTable(c *C) { store, err := mockstore.NewMockStore() c.Assert(err, IsNil) dom, err := session.BootstrapSession(store) c.Assert(err, IsNil) + _, err = infosync.GlobalInfoSyncerInit(context.Background(), dom.DDL().GetID(), dom.ServerID, dom.GetEtcdClient(), true) + c.Assert(err, IsNil) defer func() { dom.Close() err := store.Close() @@ -224,7 +243,7 @@ func (s *testDBSuite8) TestRecoverTable(c *C) { }() tk := testkit.NewTestKit(c, store) tk.MustExec("use test") - tk.MustExec(`create table t1 (c int) + tk.MustExec(`create table recover_t (c int) PARTITION BY RANGE (c) ( PARTITION p0 VALUES LESS THAN (6), PARTITION p1 VALUES LESS THAN (11) @@ -239,36 +258,38 @@ PARTITION BY RANGE (c) ( err = gcutil.EnableGC(tk.Se) c.Assert(err, IsNil) - // add rules - _, err = tk.Exec(`alter table t1 attributes="key=value";`) + // add attributes + _, err = tk.Exec(`alter table recover_t attributes="key=value";`) c.Assert(err, IsNil) - _, err = tk.Exec(`alter table t1 partition p0 attributes="key1=value1";`) + _, err = tk.Exec(`alter table recover_t partition p0 attributes="key1=value1";`) c.Assert(err, IsNil) - rows := tk.MustQuery(`select * from information_schema.region_label;`).Sort().Rows() + rows := tk.MustQuery(`select * from information_schema.attributes;`).Sort().Rows() c.Assert(len(rows), Equals, 2) // drop table - _, err = tk.Exec(`drop table t1;`) + _, err = tk.Exec(`drop table recover_t;`) c.Assert(err, IsNil) // recover table - _, err = tk.Exec(`recover table t1;`) + _, err = tk.Exec(`recover table recover_t;`) c.Assert(err, IsNil) - rows1 := tk.MustQuery(`select * from information_schema.region_label;`).Sort().Rows() + rows1 := tk.MustQuery(`select * from information_schema.attributes;`).Sort().Rows() c.Assert(len(rows1), Equals, 2) - // check table t1's rule - c.Assert(rows1[0][0], Equals, "schema/test/t1") + // check table recover_t's attribute + c.Assert(rows1[0][0], Equals, "schema/test/recover_t") c.Assert(rows1[0][2], Equals, `"key=value"`) c.Assert(rows1[0][3], Equals, rows[0][3]) - // check partition p0's rule - c.Assert(rows1[1][0], Equals, "schema/test/t1/p0") + // check partition p0's attribute + c.Assert(rows1[1][0], Equals, "schema/test/recover_t/p0") c.Assert(rows1[1][2], Equals, `"key1=value1"`) c.Assert(rows1[1][3], Equals, rows[1][3]) } -func (s *testDBSuite8) TestFlashbackTable(c *C) { +func (s *testAttributesDDLSerialSuite) TestFlashbackTable(c *C) { store, err := mockstore.NewMockStore() c.Assert(err, IsNil) dom, err := session.BootstrapSession(store) c.Assert(err, IsNil) + _, err = infosync.GlobalInfoSyncerInit(context.Background(), dom.DDL().GetID(), dom.ServerID, dom.GetEtcdClient(), true) + c.Assert(err, IsNil) defer func() { dom.Close() err := store.Close() @@ -276,7 +297,7 @@ func (s *testDBSuite8) TestFlashbackTable(c *C) { }() tk := testkit.NewTestKit(c, store) tk.MustExec("use test") - tk.MustExec(`create table t1 (c int) + tk.MustExec(`create table flash_t (c int) PARTITION BY RANGE (c) ( PARTITION p0 VALUES LESS THAN (6), PARTITION p1 VALUES LESS THAN (11) @@ -291,53 +312,55 @@ PARTITION BY RANGE (c) ( err = gcutil.EnableGC(tk.Se) c.Assert(err, IsNil) - // add rules - _, err = tk.Exec(`alter table t1 attributes="key=value";`) + // add attributes + _, err = tk.Exec(`alter table flash_t attributes="key=value";`) c.Assert(err, IsNil) - _, err = tk.Exec(`alter table t1 partition p0 attributes="key1=value1";`) + _, err = tk.Exec(`alter table flash_t partition p0 attributes="key1=value1";`) c.Assert(err, IsNil) - rows := tk.MustQuery(`select * from information_schema.region_label;`).Sort().Rows() + rows := tk.MustQuery(`select * from information_schema.attributes;`).Sort().Rows() c.Assert(len(rows), Equals, 2) // drop table - _, err = tk.Exec(`drop table t1;`) + _, err = tk.Exec(`drop table flash_t;`) c.Assert(err, IsNil) // flashback table - _, err = tk.Exec(`flashback table t1 to t2;`) + _, err = tk.Exec(`flashback table flash_t to flash_t1;`) c.Assert(err, IsNil) - rows1 := tk.MustQuery(`select * from information_schema.region_label;`).Sort().Rows() + rows1 := tk.MustQuery(`select * from information_schema.attributes;`).Sort().Rows() c.Assert(len(rows1), Equals, 2) - // check table t2's rule - c.Assert(rows1[0][0], Equals, "schema/test/t2") + // check table flash_t1's attribute + c.Assert(rows1[0][0], Equals, "schema/test/flash_t1") c.Assert(rows1[0][2], Equals, `"key=value"`) c.Assert(rows1[0][3], Equals, rows[0][3]) - // check partition p0's rule - c.Assert(rows1[1][0], Equals, "schema/test/t2/p0") + // check partition p0's attribute + c.Assert(rows1[1][0], Equals, "schema/test/flash_t1/p0") c.Assert(rows1[1][2], Equals, `"key1=value1"`) c.Assert(rows1[1][3], Equals, rows[1][3]) // truncate table - _, err = tk.Exec(`truncate table t2;`) + _, err = tk.Exec(`truncate table flash_t1;`) c.Assert(err, IsNil) // flashback table - _, err = tk.Exec(`flashback table t2 to t3;`) + _, err = tk.Exec(`flashback table flash_t1 to flash_t2;`) c.Assert(err, IsNil) - rows2 := tk.MustQuery(`select * from information_schema.region_label;`).Sort().Rows() + rows2 := tk.MustQuery(`select * from information_schema.attributes;`).Sort().Rows() c.Assert(len(rows1), Equals, 2) - // check table t3's rule - c.Assert(rows2[0][0], Equals, "schema/test/t3") + // check table flash_t2's attribute + c.Assert(rows2[0][0], Equals, "schema/test/flash_t2") c.Assert(rows2[0][2], Equals, `"key=value"`) c.Assert(rows2[0][3], Equals, rows[0][3]) - // check partition p0's rule - c.Assert(rows2[1][0], Equals, "schema/test/t3/p0") + // check partition p0's attribute + c.Assert(rows2[1][0], Equals, "schema/test/flash_t2/p0") c.Assert(rows2[1][2], Equals, `"key1=value1"`) c.Assert(rows2[1][3], Equals, rows[1][3]) } -func (s *testDBSuite8) TestPartition(c *C) { +func (s *testAttributesDDLSerialSuite) TestDropTable(c *C) { store, err := mockstore.NewMockStore() c.Assert(err, IsNil) dom, err := session.BootstrapSession(store) c.Assert(err, IsNil) + _, err = infosync.GlobalInfoSyncerInit(context.Background(), dom.DDL().GetID(), dom.ServerID, dom.GetEtcdClient(), true) + c.Assert(err, IsNil) defer func() { dom.Close() err := store.Close() @@ -345,70 +368,239 @@ func (s *testDBSuite8) TestPartition(c *C) { }() tk := testkit.NewTestKit(c, store) tk.MustExec("use test") - tk.MustExec(`create table t1 (c int) + tk.MustExec(`create table drop_t (c int) +PARTITION BY RANGE (c) ( + PARTITION p0 VALUES LESS THAN (6), + PARTITION p1 VALUES LESS THAN (11) +);`) + failpoint.Enable("github.com/pingcap/tidb/store/gcworker/ignoreDeleteRangeFailed", `return`) + defer func() { + failpoint.Disable("github.com/pingcap/tidb/store/gcworker/ignoreDeleteRangeFailed") + }() + + timeBeforeDrop, _, safePointSQL, resetGC := testkit.MockGC(tk) + defer resetGC() + + // Set GC safe point + tk.MustExec(fmt.Sprintf(safePointSQL, timeBeforeDrop)) + // Set GC enable. + err = gcutil.EnableGC(tk.Se) + c.Assert(err, IsNil) + + gcWorker, err := gcworker.NewMockGCWorker(store) + c.Assert(err, IsNil) + + // add attributes + _, err = tk.Exec(`alter table drop_t attributes="key=value";`) + c.Assert(err, IsNil) + _, err = tk.Exec(`alter table drop_t partition p0 attributes="key1=value1";`) + c.Assert(err, IsNil) + rows := tk.MustQuery(`select * from information_schema.attributes;`).Sort().Rows() + c.Assert(len(rows), Equals, 2) + // drop table + _, err = tk.Exec(`drop table drop_t;`) + c.Assert(err, IsNil) + + err = gcWorker.DeleteRanges(context.Background(), uint64(math.MaxInt64)) + c.Assert(err, IsNil) + rows = tk.MustQuery(`select * from information_schema.attributes;`).Sort().Rows() + c.Assert(len(rows), Equals, 0) +} + +func (s *testAttributesDDLSerialSuite) TestCreateWithSameName(c *C) { + store, err := mockstore.NewMockStore() + c.Assert(err, IsNil) + dom, err := session.BootstrapSession(store) + c.Assert(err, IsNil) + _, err = infosync.GlobalInfoSyncerInit(context.Background(), dom.DDL().GetID(), dom.ServerID, dom.GetEtcdClient(), true) + c.Assert(err, IsNil) + defer func() { + dom.Close() + err := store.Close() + c.Assert(err, IsNil) + }() + tk := testkit.NewTestKit(c, store) + tk.MustExec("use test") + tk.MustExec(`create table recreate_t (c int) +PARTITION BY RANGE (c) ( + PARTITION p0 VALUES LESS THAN (6), + PARTITION p1 VALUES LESS THAN (11) +);`) + failpoint.Enable("github.com/pingcap/tidb/store/gcworker/ignoreDeleteRangeFailed", `return`) + defer func() { + failpoint.Disable("github.com/pingcap/tidb/store/gcworker/ignoreDeleteRangeFailed") + }() + + timeBeforeDrop, _, safePointSQL, resetGC := testkit.MockGC(tk) + defer resetGC() + + // Set GC safe point + tk.MustExec(fmt.Sprintf(safePointSQL, timeBeforeDrop)) + // Set GC enable. + err = gcutil.EnableGC(tk.Se) + c.Assert(err, IsNil) + + gcWorker, err := gcworker.NewMockGCWorker(store) + c.Assert(err, IsNil) + + // add attributes + _, err = tk.Exec(`alter table recreate_t attributes="key=value";`) + c.Assert(err, IsNil) + _, err = tk.Exec(`alter table recreate_t partition p0 attributes="key1=value1";`) + c.Assert(err, IsNil) + rows := tk.MustQuery(`select * from information_schema.attributes;`).Sort().Rows() + c.Assert(len(rows), Equals, 2) + // drop table + _, err = tk.Exec(`drop table recreate_t;`) + c.Assert(err, IsNil) + + rows = tk.MustQuery(`select * from information_schema.attributes;`).Sort().Rows() + c.Assert(len(rows), Equals, 2) + + tk.MustExec(`create table recreate_t (c int) + PARTITION BY RANGE (c) ( + PARTITION p0 VALUES LESS THAN (6), + PARTITION p1 VALUES LESS THAN (11) + );`) + // add attributes + _, err = tk.Exec(`alter table recreate_t attributes="key=value";`) + c.Assert(err, IsNil) + _, err = tk.Exec(`alter table recreate_t partition p1 attributes="key1=value1";`) + c.Assert(err, IsNil) + rows = tk.MustQuery(`select * from information_schema.attributes;`).Sort().Rows() + c.Assert(len(rows), Equals, 3) + + err = gcWorker.DeleteRanges(context.Background(), uint64(math.MaxInt64)) + c.Assert(err, IsNil) + rows = tk.MustQuery(`select * from information_schema.attributes;`).Sort().Rows() + c.Assert(len(rows), Equals, 2) + + // drop table + _, err = tk.Exec(`drop table recreate_t;`) + c.Assert(err, IsNil) + err = gcWorker.DeleteRanges(context.Background(), uint64(math.MaxInt64)) + c.Assert(err, IsNil) + rows = tk.MustQuery(`select * from information_schema.attributes;`).Sort().Rows() + c.Assert(len(rows), Equals, 0) +} + +func (s *testAttributesDDLSerialSuite) TestPartition(c *C) { + store, err := mockstore.NewMockStore() + c.Assert(err, IsNil) + dom, err := session.BootstrapSession(store) + c.Assert(err, IsNil) + _, err = infosync.GlobalInfoSyncerInit(context.Background(), dom.DDL().GetID(), dom.ServerID, dom.GetEtcdClient(), true) + c.Assert(err, IsNil) + defer func() { + dom.Close() + err := store.Close() + c.Assert(err, IsNil) + }() + tk := testkit.NewTestKit(c, store) + tk.MustExec("use test") + tk.MustExec(`create table part (c int) PARTITION BY RANGE (c) ( PARTITION p0 VALUES LESS THAN (6), PARTITION p1 VALUES LESS THAN (11), PARTITION p2 VALUES LESS THAN (20) );`) - tk.MustExec(`create table t2 (c int);`) + tk.MustExec(`create table part1 (c int);`) - // add rules - _, err = tk.Exec(`alter table t1 attributes="key=value";`) + // add attributes + _, err = tk.Exec(`alter table part attributes="key=value";`) c.Assert(err, IsNil) - _, err = tk.Exec(`alter table t1 partition p0 attributes="key1=value1";`) + _, err = tk.Exec(`alter table part partition p0 attributes="key1=value1";`) c.Assert(err, IsNil) - _, err = tk.Exec(`alter table t1 partition p1 attributes="key2=value2";`) + _, err = tk.Exec(`alter table part partition p1 attributes="key2=value2";`) c.Assert(err, IsNil) - rows := tk.MustQuery(`select * from information_schema.region_label;`).Sort().Rows() + rows := tk.MustQuery(`select * from information_schema.attributes;`).Sort().Rows() c.Assert(len(rows), Equals, 3) // drop partition - // partition p0's rule will be deleted - _, err = tk.Exec(`alter table t1 drop partition p0;`) + // partition p0's attribute will be deleted + _, err = tk.Exec(`alter table part drop partition p0;`) c.Assert(err, IsNil) - rows1 := tk.MustQuery(`select * from information_schema.region_label;`).Sort().Rows() + rows1 := tk.MustQuery(`select * from information_schema.attributes;`).Sort().Rows() c.Assert(len(rows1), Equals, 2) - c.Assert(rows1[0][0], Equals, "schema/test/t1") + c.Assert(rows1[0][0], Equals, "schema/test/part") c.Assert(rows1[0][2], Equals, `"key=value"`) c.Assert(rows1[0][3], Equals, rows[0][3]) - c.Assert(rows1[1][0], Equals, "schema/test/t1/p1") + c.Assert(rows1[1][0], Equals, "schema/test/part/p1") c.Assert(rows1[1][2], Equals, `"key2=value2"`) c.Assert(rows1[1][3], Equals, rows[2][3]) // truncate partition // partition p1's key range will be updated - _, err = tk.Exec(`alter table t1 truncate partition p1;`) + _, err = tk.Exec(`alter table part truncate partition p1;`) c.Assert(err, IsNil) - rows2 := tk.MustQuery(`select * from information_schema.region_label;`).Sort().Rows() + rows2 := tk.MustQuery(`select * from information_schema.attributes;`).Sort().Rows() c.Assert(len(rows2), Equals, 2) - c.Assert(rows2[0][0], Equals, "schema/test/t1") + c.Assert(rows2[0][0], Equals, "schema/test/part") c.Assert(rows2[0][2], Equals, `"key=value"`) c.Assert(rows2[0][3], Not(Equals), rows1[0][3]) - c.Assert(rows2[1][0], Equals, "schema/test/t1/p1") + c.Assert(rows2[1][0], Equals, "schema/test/part/p1") c.Assert(rows2[1][2], Equals, `"key2=value2"`) c.Assert(rows2[1][3], Not(Equals), rows1[1][3]) // exchange partition - // partition p1's rule will be exchanged to table t2 + // partition p1's attribute will be exchanged to table part1 _, err = tk.Exec(`set @@tidb_enable_exchange_partition=1;`) c.Assert(err, IsNil) - _, err = tk.Exec(`alter table t1 exchange partition p1 with table t2;`) + _, err = tk.Exec(`alter table part exchange partition p1 with table part1;`) c.Assert(err, IsNil) - rows3 := tk.MustQuery(`select * from information_schema.region_label;`).Sort().Rows() + rows3 := tk.MustQuery(`select * from information_schema.attributes;`).Sort().Rows() c.Assert(len(rows3), Equals, 2) - c.Assert(rows3[0][0], Equals, "schema/test/t1") + c.Assert(rows3[0][0], Equals, "schema/test/part") c.Assert(rows3[0][2], Equals, `"key=value"`) c.Assert(rows3[0][3], Equals, rows2[0][3]) - c.Assert(rows3[1][0], Equals, "schema/test/t2") + c.Assert(rows3[1][0], Equals, "schema/test/part1") c.Assert(rows3[1][2], Equals, `"key2=value2"`) c.Assert(rows3[1][3], Equals, rows2[1][3]) } -func (s *testDBSuite8) TestDefaultKeyword(c *C) { +func (s *testAttributesDDLSerialSuite) TestDropSchema(c *C) { + store, err := mockstore.NewMockStore() + c.Assert(err, IsNil) + dom, err := session.BootstrapSession(store) + c.Assert(err, IsNil) + _, err = infosync.GlobalInfoSyncerInit(context.Background(), dom.DDL().GetID(), dom.ServerID, dom.GetEtcdClient(), true) + c.Assert(err, IsNil) + defer func() { + dom.Close() + err := store.Close() + c.Assert(err, IsNil) + }() + tk := testkit.NewTestKit(c, store) + tk.MustExec("use test") + tk.MustExec(`create table drop_s1 (c int) +PARTITION BY RANGE (c) ( + PARTITION p0 VALUES LESS THAN (6), + PARTITION p1 VALUES LESS THAN (11) +);`) + tk.MustExec(`create table drop_s2 (c int);`) + + // add attributes + _, err = tk.Exec(`alter table drop_s1 attributes="key=value";`) + c.Assert(err, IsNil) + _, err = tk.Exec(`alter table drop_s1 partition p0 attributes="key1=value1";`) + c.Assert(err, IsNil) + _, err = tk.Exec(`alter table drop_s2 attributes="key=value";`) + c.Assert(err, IsNil) + rows := tk.MustQuery(`select * from information_schema.attributes;`).Rows() + c.Assert(len(rows), Equals, 3) + // drop database + _, err = tk.Exec(`drop database test`) + c.Assert(err, IsNil) + rows = tk.MustQuery(`select * from information_schema.attributes;`).Rows() + c.Assert(len(rows), Equals, 0) +} + +func (s *testAttributesDDLSerialSuite) TestDefaultKeyword(c *C) { store, err := mockstore.NewMockStore() c.Assert(err, IsNil) dom, err := session.BootstrapSession(store) c.Assert(err, IsNil) + _, err = infosync.GlobalInfoSyncerInit(context.Background(), dom.DDL().GetID(), dom.ServerID, dom.GetEtcdClient(), true) + c.Assert(err, IsNil) defer func() { dom.Close() err := store.Close() @@ -416,27 +608,27 @@ func (s *testDBSuite8) TestDefaultKeyword(c *C) { }() tk := testkit.NewTestKit(c, store) tk.MustExec("use test") - tk.MustExec(`create table t1 (c int) + tk.MustExec(`create table def (c int) PARTITION BY RANGE (c) ( PARTITION p0 VALUES LESS THAN (6), PARTITION p1 VALUES LESS THAN (11) );`) - // add rules - _, err = tk.Exec(`alter table t1 attributes="key=value";`) + // add attributes + _, err = tk.Exec(`alter table def attributes="key=value";`) c.Assert(err, IsNil) - _, err = tk.Exec(`alter table t1 partition p0 attributes="key1=value1";`) + _, err = tk.Exec(`alter table def partition p0 attributes="key1=value1";`) c.Assert(err, IsNil) - rows := tk.MustQuery(`select * from information_schema.region_label;`).Rows() + rows := tk.MustQuery(`select * from information_schema.attributes;`).Rows() c.Assert(len(rows), Equals, 2) - // reset the partition p0's rule - _, err = tk.Exec(`alter table t1 partition p0 attributes=default;`) + // reset the partition p0's attribute + _, err = tk.Exec(`alter table def partition p0 attributes=default;`) c.Assert(err, IsNil) - rows = tk.MustQuery(`select * from information_schema.region_label;`).Rows() + rows = tk.MustQuery(`select * from information_schema.attributes;`).Rows() c.Assert(len(rows), Equals, 1) - // reset the table t1's rule - _, err = tk.Exec(`alter table t1 attributes=default;`) + // reset the table def's attribute + _, err = tk.Exec(`alter table def attributes=default;`) c.Assert(err, IsNil) - rows = tk.MustQuery(`select * from information_schema.region_label;`).Rows() + rows = tk.MustQuery(`select * from information_schema.attributes;`).Rows() c.Assert(len(rows), Equals, 0) } diff --git a/ddl/backfilling.go b/ddl/backfilling.go index 6be728a56640c..4f54d13959284 100644 --- a/ddl/backfilling.go +++ b/ddl/backfilling.go @@ -425,6 +425,13 @@ func (w *worker) handleReorgTasks(reorgInfo *reorgInfo, totalAddedCount *int64, } func tryDecodeToHandleString(key kv.Key) string { + defer func() { + if r := recover(); r != nil { + logutil.BgLogger().Warn("tryDecodeToHandleString panic", + zap.Any("recover()", r), + zap.Binary("key", key)) + } + }() handle, err := tablecodec.DecodeRowKey(key) if err != nil { recordPrefixIdx := bytes.Index(key, []byte("_r")) @@ -599,6 +606,8 @@ func (w *worker) writePhysicalTableRecord(t table.PhysicalTable, bfWorkerType ba // Simulate the sql mode environment in the worker sessionCtx. sqlMode := reorgInfo.ReorgMeta.SQLMode sessCtx.GetSessionVars().SQLMode = sqlMode + // TODO: skip set the timezone, it will cause data inconsistency when add index, since some reorg place using the timeUtil.SystemLocation() to do the time conversion. (need a more systemic plan) + // sessCtx.GetSessionVars().TimeZone = reorgInfo.ReorgMeta.Location sessCtx.GetSessionVars().StmtCtx.BadNullAsWarning = !sqlMode.HasStrictMode() sessCtx.GetSessionVars().StmtCtx.TruncateAsWarning = !sqlMode.HasStrictMode() sessCtx.GetSessionVars().StmtCtx.OverflowAsWarning = !sqlMode.HasStrictMode() @@ -613,6 +622,8 @@ func (w *worker) writePhysicalTableRecord(t table.PhysicalTable, bfWorkerType ba backfillWorkers = append(backfillWorkers, idxWorker.backfillWorker) go idxWorker.backfillWorker.run(reorgInfo.d, idxWorker, job) case typeUpdateColumnWorker: + // Setting InCreateOrAlterStmt tells the difference between SELECT casting and ALTER COLUMN casting. + sessCtx.GetSessionVars().StmtCtx.InCreateOrAlterStmt = true updateWorker := newUpdateColumnWorker(sessCtx, w, i, t, oldColInfo, colInfo, decodeColMap, reorgInfo.ReorgMeta.SQLMode) updateWorker.priority = job.Priority backfillWorkers = append(backfillWorkers, updateWorker.backfillWorker) diff --git a/ddl/callback_test.go b/ddl/callback_test.go index c048f9c2442ed..c8975da252cad 100644 --- a/ddl/callback_test.go +++ b/ddl/callback_test.go @@ -16,12 +16,13 @@ package ddl import ( "context" + "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/util/logutil" + "github.com/stretchr/testify/require" "go.uber.org/zap" ) @@ -117,9 +118,9 @@ func (tc *TestDDLCallback) OnWatched(ctx context.Context) { tc.BaseCallback.OnWatched(ctx) } -func (s *testDDLSuite) TestCallback(c *C) { +func TestCallback(t *testing.T) { cb := &BaseCallback{} - c.Assert(cb.OnChanged(nil), IsNil) + require.Nil(t, cb.OnChanged(nil)) cb.OnJobRunBefore(nil) cb.OnJobUpdated(nil) cb.OnWatched(context.TODO()) diff --git a/ddl/column.go b/ddl/column.go index f615c8062a2b0..1507e7437982c 100644 --- a/ddl/column.go +++ b/ddl/column.go @@ -27,6 +27,7 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/tidb/config" ddlutil "github.com/pingcap/tidb/ddl/util" + "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" @@ -969,12 +970,14 @@ func (w *worker) doModifyColumnTypeWithData( colName model.CIStr, pos *ast.ColumnPosition, changingIdxs []*model.IndexInfo) (ver int64, _ error) { var err error originalState := changingCol.State + targetCol := changingCol.Clone() + targetCol.Name = colName switch changingCol.State { case model.StateNone: // Column from null to not null. if !mysql.HasNotNullFlag(oldCol.Flag) && mysql.HasNotNullFlag(changingCol.Flag) { // Introduce the `mysql.PreventNullInsertFlag` flag to prevent users from inserting or updating null values. - err := modifyColsFromNull2NotNull(w, dbInfo, tblInfo, []*model.ColumnInfo{oldCol}, oldCol.Name, oldCol.Tp != changingCol.Tp) + err := modifyColsFromNull2NotNull(w, dbInfo, tblInfo, []*model.ColumnInfo{oldCol}, targetCol, oldCol.Tp != changingCol.Tp) if err != nil { if ErrWarnDataTruncated.Equal(err) || errInvalidUseOfNull.Equal(err) { job.State = model.JobStateRollingback @@ -1018,7 +1021,7 @@ func (w *worker) doModifyColumnTypeWithData( // Column from null to not null. if !mysql.HasNotNullFlag(oldCol.Flag) && mysql.HasNotNullFlag(changingCol.Flag) { // Introduce the `mysql.PreventNullInsertFlag` flag to prevent users from inserting or updating null values. - err := modifyColsFromNull2NotNull(w, dbInfo, tblInfo, []*model.ColumnInfo{oldCol}, oldCol.Name, oldCol.Tp != changingCol.Tp) + err := modifyColsFromNull2NotNull(w, dbInfo, tblInfo, []*model.ColumnInfo{oldCol}, targetCol, oldCol.Tp != changingCol.Tp) if err != nil { if ErrWarnDataTruncated.Equal(err) || errInvalidUseOfNull.Equal(err) { job.State = model.JobStateRollingback @@ -1348,6 +1351,14 @@ func (w *updateColumnWorker) getRowRecord(handle kv.Handle, recordKey []byte, ra oldWarn = oldWarn[:0] } w.sessCtx.GetSessionVars().StmtCtx.SetWarnings(oldWarn) + val := w.rowMap[w.oldColInfo.ID] + col := w.newColInfo + if val.Kind() == types.KindNull && col.FieldType.Tp == mysql.TypeTimestamp && mysql.HasNotNullFlag(col.Flag) { + if v, err := expression.GetTimeCurrentTimestamp(w.sessCtx, col.Tp, int8(col.Decimal)); err == nil { + // convert null value to timestamp should be substituted with current timestamp if NOT_NULL flag is set. + w.rowMap[w.oldColInfo.ID] = v + } + } newColVal, err := table.CastValue(w.sessCtx, w.rowMap[w.oldColInfo.ID], w.newColInfo, false, false) if err != nil { return w.reformatErrors(err) @@ -1416,7 +1427,7 @@ func (w *updateColumnWorker) cleanRowMap() { } } -// BackfillDataInTxn will backfill the table record in a transaction, lock corresponding rowKey, if the value of rowKey is changed. +// BackfillDataInTxn will backfill the table record in a transaction. func (w *updateColumnWorker) BackfillDataInTxn(handleRange reorgBackfillTask) (taskCtx backfillTaskContext, errInTxn error) { oprStartTime := time.Now() errInTxn = kv.RunInNewTxn(context.Background(), w.sessCtx.GetStore(), true, func(ctx context.Context, txn kv.Transaction) error { @@ -1483,7 +1494,7 @@ func (w *worker) doModifyColumn( } // Introduce the `mysql.PreventNullInsertFlag` flag to prevent users from inserting or updating null values. - err := modifyColsFromNull2NotNull(w, dbInfo, tblInfo, []*model.ColumnInfo{oldCol}, newCol.Name, oldCol.Tp != newCol.Tp) + err := modifyColsFromNull2NotNull(w, dbInfo, tblInfo, []*model.ColumnInfo{oldCol}, newCol, oldCol.Tp != newCol.Tp) if err != nil { if ErrWarnDataTruncated.Equal(err) || errInvalidUseOfNull.Equal(err) { job.State = model.JobStateRollingback @@ -1666,7 +1677,18 @@ func applyNewAutoRandomBits(d *ddlCtx, m *meta.Meta, dbInfo *model.DBInfo, // 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 context.Context, sctx sessionctx.Context, isDataTruncated bool, schema, table, newCol model.CIStr, oldCols ...*model.ColumnInfo) error { +func checkForNullValue(ctx context.Context, sctx sessionctx.Context, isDataTruncated bool, schema, table model.CIStr, newCol *model.ColumnInfo, oldCols ...*model.ColumnInfo) error { + needCheckNullValue := false + for _, oldCol := range oldCols { + if oldCol.Tp != mysql.TypeTimestamp && newCol.Tp == mysql.TypeTimestamp { + // special case for convert null value of non-timestamp type to timestamp type, null value will be substituted with current timestamp. + continue + } + needCheckNullValue = true + } + if !needCheckNullValue { + return nil + } var buf strings.Builder buf.WriteString("select 1 from %n.%n where ") paramsList := make([]interface{}, 0, 2+len(oldCols)) @@ -1692,7 +1714,7 @@ func checkForNullValue(ctx context.Context, sctx sessionctx.Context, isDataTrunc rowCount := len(rows) if rowCount != 0 { if isDataTruncated { - return ErrWarnDataTruncated.GenWithStackByArgs(newCol.L, rowCount) + return ErrWarnDataTruncated.GenWithStackByArgs(newCol.Name.L, rowCount) } return errInvalidUseOfNull } @@ -1802,8 +1824,7 @@ func rollbackModifyColumnJob(t *meta.Meta, tblInfo *model.TableInfo, job *model. // modifyColsFromNull2NotNull modifies the type definitions of 'null' to 'not null'. // Introduce the `mysql.PreventNullInsertFlag` flag to prevent users from inserting or updating null values. -func modifyColsFromNull2NotNull(w *worker, dbInfo *model.DBInfo, tblInfo *model.TableInfo, cols []*model.ColumnInfo, - newColName model.CIStr, isDataTruncated bool) error { +func modifyColsFromNull2NotNull(w *worker, dbInfo *model.DBInfo, tblInfo *model.TableInfo, cols []*model.ColumnInfo, newCol *model.ColumnInfo, isDataTruncated bool) error { // Get sessionctx from context resource pool. var sctx sessionctx.Context sctx, err := w.sessPool.get() @@ -1820,7 +1841,7 @@ func modifyColsFromNull2NotNull(w *worker, dbInfo *model.DBInfo, tblInfo *model. }) if !skipCheck { // If there is a null value inserted, it cannot be modified and needs to be rollback. - err = checkForNullValue(w.ddlJobCtx, sctx, isDataTruncated, dbInfo.Name, tblInfo.Name, newColName, cols...) + err = checkForNullValue(w.ddlJobCtx, sctx, isDataTruncated, dbInfo.Name, tblInfo.Name, newCol, cols...) if err != nil { return errors.Trace(err) } diff --git a/ddl/column_change_test.go b/ddl/column_change_test.go index 67e3927860346..2349c7fc3d47f 100644 --- a/ddl/column_change_test.go +++ b/ddl/column_change_test.go @@ -48,17 +48,18 @@ type testColumnChangeSuite struct { func (s *testColumnChangeSuite) SetUpSuite(c *C) { SetWaitTimeWhenErrorOccurred(1 * time.Microsecond) s.store = testCreateStore(c, "test_column_change") - d := testNewDDLAndStart( + d, err := testNewDDLAndStart( context.Background(), - c, WithStore(s.store), WithLease(testLease), ) + c.Assert(err, IsNil) defer func() { err := d.Stop() c.Assert(err, IsNil) }() - s.dbInfo = testSchemaInfo(c, d, "test_index_change") + s.dbInfo, err = testSchemaInfo(d, "test_index_change") + c.Assert(err, IsNil) testCreateSchema(c, testNewContext(d), d, s.dbInfo) } @@ -67,20 +68,21 @@ func (s *testColumnChangeSuite) TearDownSuite(c *C) { } func (s *testColumnChangeSuite) TestColumnChange(c *C) { - d := testNewDDLAndStart( + d, err := testNewDDLAndStart( context.Background(), - c, WithStore(s.store), WithLease(testLease), ) + c.Assert(err, IsNil) defer func() { err := d.Stop() c.Assert(err, IsNil) }() // create table t (c1 int, c2 int); - tblInfo := testTableInfo(c, d, "t", 2) + tblInfo, err := testTableInfo(d, "t", 2) + c.Assert(err, IsNil) ctx := testNewContext(d) - err := ctx.NewTxn(context.Background()) + err = ctx.NewTxn(context.Background()) c.Assert(err, IsNil) testCreateTable(c, ctx, d, s.dbInfo, tblInfo) // insert t values (1, 2); @@ -163,12 +165,12 @@ func (s *testColumnChangeSuite) TestColumnChange(c *C) { } func (s *testColumnChangeSuite) TestModifyAutoRandColumnWithMetaKeyChanged(c *C) { - d := testNewDDLAndStart( + d, err := testNewDDLAndStart( context.Background(), - c, WithStore(s.store), WithLease(testLease), ) + c.Assert(err, IsNil) defer func() { err := d.Stop() c.Assert(err, IsNil) diff --git a/ddl/column_test.go b/ddl/column_test.go index 8dc3c9ce80193..c10696b1806cf 100644 --- a/ddl/column_test.go +++ b/ddl/column_test.go @@ -46,14 +46,15 @@ type testColumnSuite struct { func (s *testColumnSuite) SetUpSuite(c *C) { s.store = testCreateStore(c, "test_column") - d := testNewDDLAndStart( + d, err := testNewDDLAndStart( context.Background(), - c, WithStore(s.store), WithLease(testLease), ) + c.Assert(err, IsNil) - s.dbInfo = testSchemaInfo(c, d, "test_column") + s.dbInfo, err = testSchemaInfo(d, "test_column") + c.Assert(err, IsNil) testCreateSchema(c, testNewContext(d), d, s.dbInfo) c.Assert(d.Stop(), IsNil) } @@ -184,19 +185,20 @@ func testDropColumns(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, return job } -func (s *testColumnSuite) TestColumnAAA(c *C) { - d := testNewDDLAndStart( +func (s *testColumnSuite) TestColumnBasic(c *C) { + d, err := testNewDDLAndStart( context.Background(), - c, WithStore(s.store), WithLease(testLease), ) + c.Assert(err, IsNil) defer func() { err := d.Stop() c.Assert(err, IsNil) }() - tblInfo := testTableInfo(c, d, "t1", 3) + tblInfo, err := testTableInfo(d, "t1", 3) + c.Assert(err, IsNil) ctx := testNewContext(d) testCreateTable(c, ctx, d, s.dbInfo, tblInfo) @@ -208,7 +210,7 @@ func (s *testColumnSuite) TestColumnAAA(c *C) { c.Assert(err, IsNil) } - err := ctx.NewTxn(context.Background()) + err = ctx.NewTxn(context.Background()) c.Assert(err, IsNil) i := int64(0) @@ -836,16 +838,17 @@ func (s *testColumnSuite) testGetColumn(t table.Table, name string, isExist bool } func (s *testColumnSuite) TestAddColumn(c *C) { - d := testNewDDLAndStart( + d, err := testNewDDLAndStart( context.Background(), - c, WithStore(s.store), WithLease(testLease), ) - tblInfo := testTableInfo(c, d, "t", 3) + c.Assert(err, IsNil) + tblInfo, err := testTableInfo(d, "t", 3) + c.Assert(err, IsNil) ctx := testNewContext(d) - err := ctx.NewTxn(context.Background()) + err = ctx.NewTxn(context.Background()) c.Assert(err, IsNil) testCreateTable(c, ctx, d, s.dbInfo, tblInfo) @@ -924,16 +927,17 @@ func (s *testColumnSuite) TestAddColumn(c *C) { } func (s *testColumnSuite) TestAddColumns(c *C) { - d := testNewDDLAndStart( + d, err := testNewDDLAndStart( context.Background(), - c, WithStore(s.store), WithLease(testLease), ) - tblInfo := testTableInfo(c, d, "t", 3) + c.Assert(err, IsNil) + tblInfo, err := testTableInfo(d, "t", 3) + c.Assert(err, IsNil) ctx := testNewContext(d) - err := ctx.NewTxn(context.Background()) + err = ctx.NewTxn(context.Background()) c.Assert(err, IsNil) testCreateTable(c, ctx, d, s.dbInfo, tblInfo) @@ -1009,16 +1013,17 @@ func (s *testColumnSuite) TestAddColumns(c *C) { } func (s *testColumnSuite) TestDropColumn(c *C) { - d := testNewDDLAndStart( + d, err := testNewDDLAndStart( context.Background(), - c, WithStore(s.store), WithLease(testLease), ) - tblInfo := testTableInfo(c, d, "t2", 4) + c.Assert(err, IsNil) + tblInfo, err := testTableInfo(d, "t2", 4) + c.Assert(err, IsNil) ctx := testNewContext(d) - err := ctx.NewTxn(context.Background()) + err = ctx.NewTxn(context.Background()) c.Assert(err, IsNil) testCreateTable(c, ctx, d, s.dbInfo, tblInfo) @@ -1085,16 +1090,17 @@ func (s *testColumnSuite) TestDropColumn(c *C) { } func (s *testColumnSuite) TestDropColumns(c *C) { - d := testNewDDLAndStart( + d, err := testNewDDLAndStart( context.Background(), - c, WithStore(s.store), WithLease(testLease), ) - tblInfo := testTableInfo(c, d, "t2", 4) + c.Assert(err, IsNil) + tblInfo, err := testTableInfo(d, "t2", 4) + c.Assert(err, IsNil) ctx := testNewContext(d) - err := ctx.NewTxn(context.Background()) + err = ctx.NewTxn(context.Background()) c.Assert(err, IsNil) testCreateTable(c, ctx, d, s.dbInfo, tblInfo) @@ -1154,12 +1160,12 @@ func (s *testColumnSuite) TestDropColumns(c *C) { } func (s *testColumnSuite) TestModifyColumn(c *C) { - d := testNewDDLAndStart( + d, err := testNewDDLAndStart( context.Background(), - c, WithStore(s.store), WithLease(testLease), ) + c.Assert(err, IsNil) ctx := testNewContext(d) defer func() { @@ -1222,12 +1228,12 @@ func (s *testColumnSuite) TestFieldCase(c *C) { } func (s *testColumnSuite) TestAutoConvertBlobTypeByLength(c *C) { - d := testNewDDLAndStart( + d, err := testNewDDLAndStart( context.Background(), - c, WithStore(s.store), WithLease(testLease), ) + c.Assert(err, IsNil) // Close the customized ddl(worker goroutine included) after the test is finished, otherwise, it will // cause go routine in TiDB leak test. defer func() { diff --git a/ddl/column_type_change_test.go b/ddl/column_type_change_test.go index da26fed509461..573a809894d7d 100644 --- a/ddl/column_type_change_test.go +++ b/ddl/column_type_change_test.go @@ -548,13 +548,13 @@ func (s *testColumnTypeChangeSuite) TestColumnTypeChangeFromStringToOthers(c *C) tk.MustExec("insert into t values ('123.45', '123.45', '123.45', '123.45', '123.45', '123.45', '123', '123')") tk.MustExec("alter table t modify c decimal(7, 4)") tk.MustExec("alter table t modify vc decimal(7, 4)") - tk.MustExec("alter table t modify bny decimal(7, 4)") + tk.MustGetErrCode("alter table t modify bny decimal(7, 4)", mysql.ErrTruncatedWrongValue) tk.MustExec("alter table t modify vbny decimal(7, 4)") tk.MustExec("alter table t modify bb decimal(7, 4)") tk.MustExec("alter table t modify txt decimal(7, 4)") tk.MustExec("alter table t modify e decimal(7, 4)") tk.MustExec("alter table t modify s decimal(7, 4)") - tk.MustQuery("select * from t").Check(testkit.Rows("123.4500 123.4500 123.4500 123.4500 123.4500 123.4500 1.0000 1.0000")) + tk.MustQuery("select * from t").Check(testkit.Rows("123.4500 123.4500 123.45\x00\x00 123.4500 123.4500 123.4500 1.0000 1.0000")) // double reset(tk) tk.MustExec("insert into t values ('123.45', '123.45', '123.45', '123.45', '123.45', '123.45', '123', '123')") @@ -1200,7 +1200,8 @@ func (s *testColumnTypeChangeSuite) TestColumnTypeChangeFromJsonToOthers(c *C) { i json, ui json, f64 json, - str json + str json, + nul json ) `) } @@ -1208,13 +1209,13 @@ func (s *testColumnTypeChangeSuite) TestColumnTypeChangeFromJsonToOthers(c *C) { // To numeric data types. // tinyint reset(tk) - tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')") + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"', null)") // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: '{"obj": 100}' for column 'obj' at row 1". tk.MustGetErrCode("alter table t modify obj tinyint", mysql.ErrTruncatedWrongValue) // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: '[-1, 0, 1]' for column 'arr' at row 1". tk.MustGetErrCode("alter table t modify arr tinyint", mysql.ErrTruncatedWrongValue) // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: 'null' for column 'nil' at row 1". - tk.MustExec("alter table t modify nil tinyint") + tk.MustGetErrCode("alter table t modify nil tinyint", mysql.ErrTruncatedWrongValue) // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: 'true' for column 't' at row 1". tk.MustExec("alter table t modify t tinyint") // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: 'false' for column 'f' at row 1". @@ -1224,17 +1225,18 @@ func (s *testColumnTypeChangeSuite) TestColumnTypeChangeFromJsonToOthers(c *C) { tk.MustGetErrCode("alter table t modify f64 tinyint", mysql.ErrDataOutOfRange) // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: '"json string"' for column 'str' at row 1". tk.MustGetErrCode("alter table t modify str tinyint", mysql.ErrTruncatedWrongValue) - tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] 0 1 0 -22 22 323232323.32323235 \"json string\"")) + tk.MustExec("alter table t modify nul tinyint") + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null 1 0 -22 22 323232323.32323235 \"json string\" ")) // int reset(tk) - tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')") + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"', null)") // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: '{"obj": 100}' for column 'obj' at row 1". tk.MustGetErrCode("alter table t modify obj int", mysql.ErrTruncatedWrongValue) // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: '[-1, 0, 1]' for column 'arr' at row 1". tk.MustGetErrCode("alter table t modify arr int", mysql.ErrTruncatedWrongValue) // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: 'null' for column 'nil' at row 1". - tk.MustExec("alter table t modify nil int") + tk.MustGetErrCode("alter table t modify nil int", mysql.ErrTruncatedWrongValue) // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: 'true' for column 't' at row 1". tk.MustExec("alter table t modify t int") // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: 'false' for column 'f' at row 1". @@ -1244,17 +1246,18 @@ func (s *testColumnTypeChangeSuite) TestColumnTypeChangeFromJsonToOthers(c *C) { tk.MustExec("alter table t modify f64 int") // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: '"json string"' for column 'str' at row 1". tk.MustGetErrCode("alter table t modify str int", mysql.ErrTruncatedWrongValue) - tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] 0 1 0 -22 22 323232323 \"json string\"")) + tk.MustExec("alter table t modify nul int") + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null 1 0 -22 22 323232323 \"json string\" ")) // bigint reset(tk) - tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')") + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"', null)") // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: '{"obj": 100}' for column 'obj' at row 1". tk.MustGetErrCode("alter table t modify obj bigint", mysql.ErrTruncatedWrongValue) // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: '[-1, 0, 1]' for column 'arr' at row 1". tk.MustGetErrCode("alter table t modify arr bigint", mysql.ErrTruncatedWrongValue) // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: 'null' for column 'nil' at row 1". - tk.MustExec("alter table t modify nil bigint") + tk.MustGetErrCode("alter table t modify nil bigint", mysql.ErrTruncatedWrongValue) // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: 'true' for column 't' at row 1". tk.MustExec("alter table t modify t bigint") // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: 'false' for column 'f' at row 1". @@ -1264,17 +1267,18 @@ func (s *testColumnTypeChangeSuite) TestColumnTypeChangeFromJsonToOthers(c *C) { tk.MustExec("alter table t modify f64 bigint") // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: '"json string"' for column 'str' at row 1". tk.MustGetErrCode("alter table t modify str bigint", mysql.ErrTruncatedWrongValue) - tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] 0 1 0 -22 22 323232323 \"json string\"")) + tk.MustExec("alter table t modify nul bigint") + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null 1 0 -22 22 323232323 \"json string\" ")) // unsigned bigint reset(tk) - tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')") + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"', null)") // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: '{"obj": 100}' for column 'obj' at row 1". tk.MustGetErrCode("alter table t modify obj bigint unsigned", mysql.ErrTruncatedWrongValue) // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: '[-1, 0, 1]' for column 'arr' at row 1". tk.MustGetErrCode("alter table t modify arr bigint unsigned", mysql.ErrTruncatedWrongValue) // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: 'null' for column 'nil' at row 1". - tk.MustExec("alter table t modify nil bigint unsigned") + tk.MustGetErrCode("alter table t modify nil bigint unsigned", mysql.ErrTruncatedWrongValue) // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: 'true' for column 't' at row 1". tk.MustExec("alter table t modify t bigint unsigned") // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: 'false' for column 'f' at row 1". @@ -1285,11 +1289,12 @@ func (s *testColumnTypeChangeSuite) TestColumnTypeChangeFromJsonToOthers(c *C) { tk.MustExec("alter table t modify f64 bigint unsigned") // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: '"json string"' for column 'str' at row 1". tk.MustGetErrCode("alter table t modify str bigint unsigned", mysql.ErrTruncatedWrongValue) - tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] 0 1 0 -22 22 323232323 \"json string\"")) + tk.MustExec("alter table t modify nul bigint unsigned") + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null 1 0 -22 22 323232323 \"json string\" ")) // bit reset(tk) - tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')") + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"', null)") tk.MustGetErrCode("alter table t modify obj bit", mysql.ErrUnsupportedDDLOperation) tk.MustGetErrCode("alter table t modify arr bit", mysql.ErrUnsupportedDDLOperation) tk.MustGetErrCode("alter table t modify nil bit", mysql.ErrUnsupportedDDLOperation) @@ -1299,17 +1304,18 @@ func (s *testColumnTypeChangeSuite) TestColumnTypeChangeFromJsonToOthers(c *C) { tk.MustGetErrCode("alter table t modify ui bit", mysql.ErrUnsupportedDDLOperation) tk.MustGetErrCode("alter table t modify f64 bit", mysql.ErrUnsupportedDDLOperation) tk.MustGetErrCode("alter table t modify str bit", mysql.ErrUnsupportedDDLOperation) - tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null true false -22 22 323232323.32323235 \"json string\"")) + tk.MustGetErrCode("alter table t modify nul bit", mysql.ErrUnsupportedDDLOperation) + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null true false -22 22 323232323.32323235 \"json string\" ")) // decimal reset(tk) - tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')") + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"', null)") // MySQL will get "ERROR 3156 (22001) Invalid JSON value for CAST to DECIMAL from column obj at row 1". tk.MustGetErrCode("alter table t modify obj decimal(20, 10)", mysql.ErrTruncatedWrongValue) // MySQL will get "ERROR 3156 (22001) Invalid JSON value for CAST to DECIMAL from column arr at row 1". tk.MustGetErrCode("alter table t modify arr decimal(20, 10)", mysql.ErrTruncatedWrongValue) // MySQL will get "ERROR 3156 (22001) Invalid JSON value for CAST to DECIMAL from column nil at row 1". - tk.MustExec("alter table t modify nil decimal(20, 10)") + tk.MustGetErrCode("alter table t modify nil decimal(20, 10)", mysql.ErrTruncatedWrongValue) tk.MustExec("alter table t modify t decimal(20, 10)") tk.MustExec("alter table t modify f decimal(20, 10)") tk.MustExec("alter table t modify i decimal(20, 10)") @@ -1317,17 +1323,18 @@ func (s *testColumnTypeChangeSuite) TestColumnTypeChangeFromJsonToOthers(c *C) { tk.MustExec("alter table t modify f64 decimal(20, 10)") // MySQL will get "ERROR 1366 (HY000): Incorrect DECIMAL value: '0' for column '' at row -1". tk.MustGetErrCode("alter table t modify str decimal(20, 10)", mysql.ErrBadNumber) - tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] 0.0000000000 1.0000000000 0.0000000000 -22.0000000000 22.0000000000 323232323.3232323500 \"json string\"")) + tk.MustExec("alter table t modify nul decimal(20, 10)") + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null 1.0000000000 0.0000000000 -22.0000000000 22.0000000000 323232323.3232323500 \"json string\" ")) // double reset(tk) - tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')") + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"', null)") // MySQL will get "ERROR 1265 (01000): Data truncated for column 'obj' at row 1". tk.MustGetErrCode("alter table t modify obj double", mysql.ErrTruncatedWrongValue) // MySQL will get "ERROR 1265 (01000): Data truncated for column 'arr' at row 1". tk.MustGetErrCode("alter table t modify arr double", mysql.ErrTruncatedWrongValue) // MySQL will get "ERROR 1265 (01000): Data truncated for column 'nil' at row 1". - tk.MustExec("alter table t modify nil double") + tk.MustGetErrCode("alter table t modify nil double", mysql.ErrTruncatedWrongValue) // MySQL will get "ERROR 1265 (01000): Data truncated for column 't' at row 1". tk.MustExec("alter table t modify t double") // MySQL will get "ERROR 1265 (01000): Data truncated for column 'f' at row 1". @@ -1337,12 +1344,13 @@ func (s *testColumnTypeChangeSuite) TestColumnTypeChangeFromJsonToOthers(c *C) { tk.MustExec("alter table t modify f64 double") // MySQL will get "ERROR 1265 (01000): Data truncated for column 'str' at row 1". tk.MustGetErrCode("alter table t modify str double", mysql.ErrTruncatedWrongValue) - tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] 0 1 0 -22 22 323232323.32323235 \"json string\"")) + tk.MustExec("alter table t modify nul double") + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null 1 0 -22 22 323232323.32323235 \"json string\" ")) // To string data types. // char reset(tk) - tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')") + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"', null)") tk.MustExec("alter table t modify obj char(20)") tk.MustExec("alter table t modify arr char(20)") tk.MustExec("alter table t modify nil char(20)") @@ -1352,11 +1360,12 @@ func (s *testColumnTypeChangeSuite) TestColumnTypeChangeFromJsonToOthers(c *C) { tk.MustExec("alter table t modify ui char(20)") tk.MustExec("alter table t modify f64 char(20)") tk.MustExec("alter table t modify str char(20)") - tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null true false -22 22 323232323.32323235 \"json string\"")) + tk.MustExec("alter table t modify nil char(20)") + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null true false -22 22 323232323.32323235 \"json string\" ")) // varchar reset(tk) - tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')") + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"', null)") tk.MustExec("alter table t modify obj varchar(20)") tk.MustExec("alter table t modify arr varchar(20)") tk.MustExec("alter table t modify nil varchar(20)") @@ -1366,11 +1375,12 @@ func (s *testColumnTypeChangeSuite) TestColumnTypeChangeFromJsonToOthers(c *C) { tk.MustExec("alter table t modify ui varchar(20)") tk.MustExec("alter table t modify f64 varchar(20)") tk.MustExec("alter table t modify str varchar(20)") - tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null true false -22 22 323232323.32323235 \"json string\"")) + tk.MustExec("alter table t modify nul varchar(20)") + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null true false -22 22 323232323.32323235 \"json string\" ")) // binary reset(tk) - tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')") + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"', null)") tk.MustExec("alter table t modify obj binary(20)") tk.MustExec("alter table t modify arr binary(20)") tk.MustExec("alter table t modify nil binary(20)") @@ -1380,6 +1390,7 @@ func (s *testColumnTypeChangeSuite) TestColumnTypeChangeFromJsonToOthers(c *C) { tk.MustExec("alter table t modify ui binary(20)") tk.MustExec("alter table t modify f64 binary(20)") tk.MustExec("alter table t modify str binary(20)") + tk.MustExec("alter table t modify nul binary(20)") tk.MustQuery("select * from t").Check(testkit.Rows( "{\"obj\": 100}\x00\x00\x00\x00\x00\x00\x00\x00 " + "[-1, 0, 1]\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 " + @@ -1389,10 +1400,10 @@ func (s *testColumnTypeChangeSuite) TestColumnTypeChangeFromJsonToOthers(c *C) { "-22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 " + "22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 " + "323232323.32323235\x00\x00 " + - "\"json string\"\x00\x00\x00\x00\x00\x00\x00")) + "\"json string\"\x00\x00\x00\x00\x00\x00\x00 ")) // varbinary reset(tk) - tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')") + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"', null)") tk.MustExec("alter table t modify obj varbinary(20)") tk.MustExec("alter table t modify arr varbinary(20)") tk.MustExec("alter table t modify nil varbinary(20)") @@ -1402,11 +1413,12 @@ func (s *testColumnTypeChangeSuite) TestColumnTypeChangeFromJsonToOthers(c *C) { tk.MustExec("alter table t modify ui varbinary(20)") tk.MustExec("alter table t modify f64 varbinary(20)") tk.MustExec("alter table t modify str varbinary(20)") - tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null true false -22 22 323232323.32323235 \"json string\"")) + tk.MustExec("alter table t modify nul varbinary(20)") + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null true false -22 22 323232323.32323235 \"json string\" ")) // blob reset(tk) - tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')") + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"', null)") tk.MustExec("alter table t modify obj blob") tk.MustExec("alter table t modify arr blob") tk.MustExec("alter table t modify nil blob") @@ -1416,11 +1428,12 @@ func (s *testColumnTypeChangeSuite) TestColumnTypeChangeFromJsonToOthers(c *C) { tk.MustExec("alter table t modify ui blob") tk.MustExec("alter table t modify f64 blob") tk.MustExec("alter table t modify str blob") - tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null true false -22 22 323232323.32323235 \"json string\"")) + tk.MustExec("alter table t modify nul blob") + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null true false -22 22 323232323.32323235 \"json string\" ")) // text reset(tk) - tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')") + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"', null)") tk.MustExec("alter table t modify obj text") tk.MustExec("alter table t modify arr text") tk.MustExec("alter table t modify nil text") @@ -1430,11 +1443,12 @@ func (s *testColumnTypeChangeSuite) TestColumnTypeChangeFromJsonToOthers(c *C) { tk.MustExec("alter table t modify ui text") tk.MustExec("alter table t modify f64 text") tk.MustExec("alter table t modify str text") - tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null true false -22 22 323232323.32323235 \"json string\"")) + tk.MustExec("alter table t modify nul text") + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null true false -22 22 323232323.32323235 \"json string\" ")) // enum reset(tk) - tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')") + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"', null)") tk.MustGetErrCode("alter table t modify obj enum('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')", mysql.ErrUnsupportedDDLOperation) tk.MustGetErrCode("alter table t modify arr enum('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')", mysql.ErrUnsupportedDDLOperation) tk.MustGetErrCode("alter table t modify nil enum('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')", mysql.ErrUnsupportedDDLOperation) @@ -1444,11 +1458,12 @@ func (s *testColumnTypeChangeSuite) TestColumnTypeChangeFromJsonToOthers(c *C) { tk.MustGetErrCode("alter table t modify ui enum('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')", mysql.ErrUnsupportedDDLOperation) tk.MustGetErrCode("alter table t modify f64 enum('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')", mysql.ErrUnsupportedDDLOperation) tk.MustGetErrCode("alter table t modify str enum('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')", mysql.ErrUnsupportedDDLOperation) - tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null true false -22 22 323232323.32323235 \"json string\"")) + tk.MustGetErrCode("alter table t modify nul enum('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')", mysql.ErrUnsupportedDDLOperation) + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null true false -22 22 323232323.32323235 \"json string\" ")) // set reset(tk) - tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')") + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"', null)") tk.MustGetErrCode("alter table t modify obj set('{\"obj\": 100}', '[-1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')", mysql.ErrUnsupportedDDLOperation) tk.MustGetErrCode("alter table t modify arr set('{\"obj\": 100}', '[-1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')", mysql.ErrUnsupportedDDLOperation) tk.MustGetErrCode("alter table t modify nil set('{\"obj\": 100}', '[-1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')", mysql.ErrUnsupportedDDLOperation) @@ -1458,12 +1473,13 @@ func (s *testColumnTypeChangeSuite) TestColumnTypeChangeFromJsonToOthers(c *C) { tk.MustGetErrCode("alter table t modify ui set('{\"obj\": 100}', '[-1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')", mysql.ErrUnsupportedDDLOperation) tk.MustGetErrCode("alter table t modify f64 set('{\"obj\": 100}', '[-1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')", mysql.ErrUnsupportedDDLOperation) tk.MustGetErrCode("alter table t modify str set('{\"obj\": 100}', '[-1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')", mysql.ErrUnsupportedDDLOperation) - tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1] null true false -22 22 323232323.32323235 \"json string\"")) + tk.MustGetErrCode("alter table t modify nul set('{\"obj\": 100}', '[-1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')", mysql.ErrUnsupportedDDLOperation) + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1] null true false -22 22 323232323.32323235 \"json string\" ")) // To date and time data types. // datetime reset(tk) - tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '20200826173501', '20201123', '20200826173501.123456', '\"2020-08-26 17:35:01.123456\"')") + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '20200826173501', '20201123', '20200826173501.123456', '\"2020-08-26 17:35:01.123456\"', null)") tk.MustGetErrCode("alter table t modify obj datetime", mysql.ErrTruncatedWrongValue) tk.MustGetErrCode("alter table t modify arr datetime", mysql.ErrTruncatedWrongValue) tk.MustGetErrCode("alter table t modify nil datetime", mysql.ErrTruncatedWrongValue) @@ -1474,11 +1490,12 @@ func (s *testColumnTypeChangeSuite) TestColumnTypeChangeFromJsonToOthers(c *C) { tk.MustExec("alter table t modify f64 datetime") // MySQL will get "ERROR 1292 (22007): Incorrect datetime value: '"2020-08-26 17:35:01.123456"' for column 'str' at row 1". tk.MustExec("alter table t modify str datetime") - tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null true false 2020-08-26 17:35:01 2020-11-23 00:00:00 2020-08-26 17:35:01 2020-08-26 17:35:01")) + tk.MustExec("alter table t modify nul datetime") + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null true false 2020-08-26 17:35:01 2020-11-23 00:00:00 2020-08-26 17:35:01 2020-08-26 17:35:01 ")) // time reset(tk) - tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '200805', '1111', '200805.11', '\"19:35:41\"')") + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '200805', '1111', '200805.11', '\"19:35:41\"', null)") // MySQL will get "ERROR 1366 (HY000): Incorrect time value: '{"obj": 100}' for column 'obj' at row 1". tk.MustGetErrCode("alter table t modify obj time", mysql.ErrTruncatedWrongValue) // MySQL will get "ERROR 1366 (HY000): Incorrect time value: '[-1, 0, 1]' for column 'arr' at row 11". @@ -1494,11 +1511,12 @@ func (s *testColumnTypeChangeSuite) TestColumnTypeChangeFromJsonToOthers(c *C) { tk.MustExec("alter table t modify f64 time") // MySQL will get "ERROR 1292 (22007): Incorrect time value: '"19:35:41"' for column 'str' at row 1". tk.MustExec("alter table t modify str time") - tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null true false 20:08:05 00:11:11 20:08:05 19:35:41")) + tk.MustExec("alter table t modify nul time") + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null true false 20:08:05 00:11:11 20:08:05 19:35:41 ")) // date reset(tk) - tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '20200826173501', '20201123', '20200826173501.123456', '\"2020-08-26 17:35:01.123456\"')") + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '20200826173501', '20201123', '20200826173501.123456', '\"2020-08-26 17:35:01.123456\"', null)") tk.MustGetErrCode("alter table t modify obj date", mysql.ErrTruncatedWrongValue) tk.MustGetErrCode("alter table t modify arr date", mysql.ErrTruncatedWrongValue) tk.MustGetErrCode("alter table t modify nil date", mysql.ErrTruncatedWrongValue) @@ -1509,11 +1527,12 @@ func (s *testColumnTypeChangeSuite) TestColumnTypeChangeFromJsonToOthers(c *C) { tk.MustExec("alter table t modify f64 date") // MySQL will get "ERROR 1292 (22007): Incorrect date value: '"2020-08-26 17:35:01.123456"' for column 'str' at row 1". tk.MustExec("alter table t modify str date") - tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null true false 2020-08-26 2020-11-23 2020-08-26 2020-08-26")) + tk.MustExec("alter table t modify nul date") + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null true false 2020-08-26 2020-11-23 2020-08-26 2020-08-26 ")) // timestamp reset(tk) - tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '20200826173501', '20201123', '20200826173501.123456', '\"2020-08-26 17:35:01.123456\"')") + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '20200826173501', '20201123', '20200826173501.123456', '\"2020-08-26 17:35:01.123456\"', null)") tk.MustGetErrCode("alter table t modify obj timestamp", mysql.ErrTruncatedWrongValue) tk.MustGetErrCode("alter table t modify arr timestamp", mysql.ErrTruncatedWrongValue) tk.MustGetErrCode("alter table t modify nil timestamp", mysql.ErrTruncatedWrongValue) @@ -1524,17 +1543,18 @@ func (s *testColumnTypeChangeSuite) TestColumnTypeChangeFromJsonToOthers(c *C) { tk.MustExec("alter table t modify f64 timestamp") // MySQL will get "ERROR 1292 (22007): Incorrect timestamptime value: '"2020-08-26 17:35:01.123456"' for column 'str' at row 1". tk.MustExec("alter table t modify str timestamp") - tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null true false 2020-08-26 17:35:01 2020-11-23 00:00:00 2020-08-26 17:35:01 2020-08-26 17:35:01")) + tk.MustExec("alter table t modify nul timestamp") + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null true false 2020-08-26 17:35:01 2020-11-23 00:00:00 2020-08-26 17:35:01 2020-08-26 17:35:01 ")) // year reset(tk) - tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '2020', '91', '9', '\"2020\"')") + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '2020', '91', '9', '\"2020\"', null)") // MySQL will get "ERROR 1366 (HY000): Incorrect integer value: '{"obj": 100}' for column 'obj' at row 1". tk.MustGetErrCode("alter table t modify obj year", mysql.ErrTruncatedWrongValue) // MySQL will get "ERROR 1366 (HY000): Incorrect integer value: '[-1, 0, 1]' for column 'arr' at row 11". tk.MustGetErrCode("alter table t modify arr year", mysql.ErrTruncatedWrongValue) // MySQL will get "ERROR 1366 (HY000): Incorrect integer value: 'null' for column 'nil' at row 1". - tk.MustExec("alter table t modify nil year") + tk.MustGetErrCode("alter table t modify nil year", mysql.ErrTruncatedWrongValue) // MySQL will get "ERROR 1366 (HY000): Incorrect integer value: 'true' for column 't' at row 1". tk.MustExec("alter table t modify t year") // MySQL will get "ERROR 1366 (HY000): Incorrect integer value: 'false' for column 'f' at row 1". @@ -1544,7 +1564,8 @@ func (s *testColumnTypeChangeSuite) TestColumnTypeChangeFromJsonToOthers(c *C) { tk.MustExec("alter table t modify f64 year") // MySQL will get "ERROR 1366 (HY000): Incorrect integer value: '"2020"' for column 'str' at row 1". tk.MustExec("alter table t modify str year") - tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] 0 2001 0 2020 1991 2009 2020")) + tk.MustExec("alter table t modify nul year") + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null 2001 0 2020 1991 2009 2020 ")) } func (s *testColumnTypeChangeSuite) TestUpdateDataAfterChangeTimestampToDate(c *C) { @@ -2128,6 +2149,52 @@ func (s *testColumnTypeChangeSuite) TestCastToTimeStampDecodeError(c *C) { tk.MustQuery("select timestamp(cast('1000-11-11 12-3-1' as date));").Check(testkit.Rows("1000-11-11 00:00:00")) } +// https://github.com/pingcap/tidb/issues/25285. +func (s *testColumnTypeChangeSuite) TestCastFromZeroIntToTimeError(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test;") + + prepare := func() { + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int);") + tk.MustExec("insert into t values (0);") + } + const errCodeNone = -1 + testCases := []struct { + sqlMode string + errCode int + }{ + {"STRICT_TRANS_TABLES", mysql.ErrTruncatedWrongValue}, + {"STRICT_ALL_TABLES", mysql.ErrTruncatedWrongValue}, + {"NO_ZERO_IN_DATE", errCodeNone}, + {"NO_ZERO_DATE", errCodeNone}, + {"ALLOW_INVALID_DATES", errCodeNone}, + {"", errCodeNone}, + } + for _, tc := range testCases { + prepare() + tk.MustExec(fmt.Sprintf("set @@sql_mode = '%s';", tc.sqlMode)) + if tc.sqlMode == "NO_ZERO_DATE" { + tk.MustQuery(`select date(0);`).Check(testkit.Rows("")) + } else { + tk.MustQuery(`select date(0);`).Check(testkit.Rows("0000-00-00")) + } + tk.MustQuery(`select time(0);`).Check(testkit.Rows("00:00:00")) + if tc.errCode == errCodeNone { + tk.MustExec("alter table t modify column a date;") + prepare() + tk.MustExec("alter table t modify column a datetime;") + prepare() + tk.MustExec("alter table t modify column a timestamp;") + } else { + tk.MustGetErrCode("alter table t modify column a date;", mysql.ErrTruncatedWrongValue) + tk.MustGetErrCode("alter table t modify column a datetime;", mysql.ErrTruncatedWrongValue) + tk.MustGetErrCode("alter table t modify column a timestamp;", mysql.ErrTruncatedWrongValue) + } + } + tk.MustExec("drop table if exists t;") +} + func (s *testColumnTypeChangeSuite) TestChangeFromTimeToYear(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test;") @@ -2227,3 +2294,60 @@ func (s *testColumnTypeChangeSuite) TestChangeFromBitToStringInvalidUtf8ErrMsg(c errMsg := "[table:1366]Incorrect string value '\\xEC\\xBD' for column 'a'" tk.MustGetErrMsg("alter table t modify column a varchar(31) collate utf8mb4_general_ci;", errMsg) } + +func (s *testColumnTypeChangeSuite) TestForIssue24621(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 char(250));") + tk.MustExec("insert into t values('0123456789abc');") + errMsg := "[types:1265]Data truncated for column 'a', value is '0123456789abc'" + tk.MustGetErrMsg("alter table t modify a char(12) null;", errMsg) +} + +func (s *testColumnTypeChangeSuite) TestChangeNullValueFromOtherTypeToTimestamp(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + + // Some ddl cases. + prepare := func() { + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int null)") + tk.MustExec("insert into t values()") + tk.MustQuery("select * from t").Check(testkit.Rows("")) + } + + prepare() + tk.MustExec("alter table t modify column a timestamp NOT NULL") + tk.MustQuery("select count(*) from t where a = null").Check(testkit.Rows("0")) + + prepare() + // only from other type NULL to timestamp type NOT NULL, it should be successful. + _, err := tk.Exec("alter table t change column a a1 time NOT NULL") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[ddl:1265]Data truncated for column 'a1' at row 1") + + prepare2 := func() { + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a timestamp null)") + tk.MustExec("insert into t values()") + tk.MustQuery("select * from t").Check(testkit.Rows("")) + } + + prepare2() + // only from other type NULL to timestamp type NOT NULL, it should be successful. (timestamp to timestamp excluded) + _, err = tk.Exec("alter table t modify column a timestamp NOT NULL") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[ddl:1265]Data truncated for column 'a' at row 1") + + // Some dml cases. + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a timestamp NOT NULL)") + _, err = tk.Exec("insert into t values()") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[table:1364]Field 'a' doesn't have a default value") + + _, err = tk.Exec("insert into t values(null)") + c.Assert(err.Error(), Equals, "[table:1048]Column 'a' cannot be null") +} diff --git a/ddl/db_cache_serial_test.go b/ddl/db_cache_serial_test.go new file mode 100644 index 0000000000000..e024cef522682 --- /dev/null +++ b/ddl/db_cache_serial_test.go @@ -0,0 +1,97 @@ +// Copyright 2021 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, +// 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. + +package ddl_test + +import ( + "testing" + "time" + + "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/errno" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/parser/terror" + "github.com/pingcap/tidb/session" + "github.com/pingcap/tidb/store/mockstore" + "github.com/pingcap/tidb/testkit" + "github.com/stretchr/testify/require" +) + +func TestAlterTableCache(t *testing.T) { + store, err := mockstore.NewMockStore() + require.NoError(t, err) + session.SetSchemaLease(600 * time.Millisecond) + session.DisableStats4Test() + dom, err := session.BootstrapSession(store) + require.NoError(t, err) + + dom.SetStatsUpdating(true) + + clean := func() { + dom.Close() + err := store.Close() + require.NoError(t, err) + } + defer clean() + tk := testkit.NewTestKit(t, store) + tk2 := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t1") + tk2.MustExec("use test") + /* Test of cache table */ + tk.MustExec("create table t1 ( n int auto_increment primary key)") + tk.MustGetErrCode("alter table t1 ca", errno.ErrParse) + tk.MustGetErrCode("alter table t2 cache", errno.ErrNoSuchTable) + tk.MustExec("alter table t1 cache") + checkTableCacheStatus(t, tk.Session(), "test", "t1", model.TableCacheStatusEnable) + tk.MustExec("drop table if exists t1") + /*Test can't skip schema checker*/ + tk.MustExec("drop table if exists t1,t2") + tk.MustExec("CREATE TABLE t1 (a int)") + tk.MustExec("CREATE TABLE t2 (a int)") + tk.MustExec("begin") + tk.MustExec("insert into t1 set a=1;") + tk2.MustExec("alter table t1 cache;") + _, err = tk.Exec("commit") + require.True(t, terror.ErrorEqual(domain.ErrInfoSchemaChanged, err)) + /* Test can skip schema checker */ + tk.MustExec("begin") + tk.MustExec("drop table if exists t1") + tk.MustExec("CREATE TABLE t1 (a int)") + tk.MustExec("insert into t1 set a=2;") + tk2.MustExec("alter table t2 cache") + tk.MustExec("commit") + // Test if a table is not exists + tk.MustExec("drop table if exists t") + tk.MustGetErrCode("alter table t cache", errno.ErrNoSuchTable) + tk.MustExec("create table t (a int)") + tk.MustExec("alter table t cache") + // Multiple alter cache is okay + tk.MustExec("alter table t cache") + tk.MustExec("alter table t cache") + // Test a temporary table + tk.MustExec("drop table if exists t") + tk.MustExec("create temporary table t (id int primary key auto_increment, u int unique, v int)") + tk.MustExec("drop table if exists tmp1") + // local temporary table alter is not supported + tk.MustGetErrCode("alter table t cache", errno.ErrUnsupportedDDLOperation) + // test global temporary table + tk.MustExec("create global temporary table tmp1 " + + "(id int not null primary key, code int not null, value int default null, unique key code(code))" + + "on commit delete rows") + tk.MustGetErrMsg("alter table tmp1 cache", ddl.ErrOptOnTemporaryTable.GenWithStackByArgs("alter temporary table cache").Error()) + +} diff --git a/ddl/db_cache_test.go b/ddl/db_cache_test.go new file mode 100644 index 0000000000000..120c0c687e049 --- /dev/null +++ b/ddl/db_cache_test.go @@ -0,0 +1,135 @@ +// Copyright 2021 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, +// 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. + +package ddl_test + +import ( + "testing" + + "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/errno" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/session" + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/table" + "github.com/pingcap/tidb/testkit" + "github.com/stretchr/testify/require" +) + +func checkTableCacheStatus(t *testing.T, se session.Session, dbName, tableName string, status model.TableCacheStatusType) { + tb := testGetTableByNameT(t, se, dbName, tableName) + dom := domain.GetDomain(se) + err := dom.Reload() + require.NoError(t, err) + require.Equal(t, status, tb.Meta().TableCacheStatusType) +} + +func testGetTableByNameT(t *testing.T, ctx sessionctx.Context, db, table string) table.Table { + dom := domain.GetDomain(ctx) + // Make sure the table schema is the new schema. + err := dom.Reload() + require.NoError(t, err) + tbl, err := dom.InfoSchema().TableByName(model.NewCIStr(db), model.NewCIStr(table)) + require.NoError(t, err) + return tbl +} + +func TestAlterPartitionCache(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test;") + tk.MustExec("drop table if exists cache_partition_table;") + tk.MustExec("create table cache_partition_table (a int, b int) partition by hash(a) partitions 3;") + tk.MustGetErrCode("alter table cache_partition_table cache", errno.ErrOptOnCacheTable) + defer tk.MustExec("drop table if exists cache_partition_table;") + tk.MustExec("drop table if exists cache_partition_range_table;") + tk.MustExec(`create table cache_partition_range_table (c1 smallint(6) not null, c2 char(5) default null) partition by range ( c1 ) ( + partition p0 values less than (10), + partition p1 values less than (20), + partition p2 values less than (30), + partition p3 values less than (MAXVALUE) + );`) + tk.MustGetErrCode("alter table cache_partition_range_table cache;", errno.ErrOptOnCacheTable) + defer tk.MustExec("drop table if exists cache_partition_range_table;") + tk.MustExec("drop table if exists partition_list_table;") + tk.MustExec("set @@session.tidb_enable_list_partition = ON") + tk.MustExec(`create table cache_partition_list_table (id int) partition by list (id) ( + partition p0 values in (1,2), + partition p1 values in (3,4), + partition p3 values in (5,null) + );`) + tk.MustGetErrCode("alter table cache_partition_list_table cache", errno.ErrOptOnCacheTable) + tk.MustExec("drop table if exists cache_partition_list_table;") +} + +func TestAlterViewTableCache(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test;") + tk.MustExec("drop table if exists cache_view_t") + tk.MustExec("create table cache_view_t (id int);") + tk.MustExec("create view v as select * from cache_view_t") + tk.MustGetErrCode("alter table v cache", errno.ErrWrongObject) +} + +func TestAlterTableNoCache(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists nocache_t1") + /* Test of cache table */ + tk.MustExec("create table nocache_t1 ( n int auto_increment primary key)") + tk.MustExec("alter table nocache_t1 cache") + checkTableCacheStatus(t, tk.Session(), "test", "nocache_t1", model.TableCacheStatusEnable) + tk.MustExec("alter table nocache_t1 nocache") + checkTableCacheStatus(t, tk.Session(), "test", "nocache_t1", model.TableCacheStatusDisable) + tk.MustExec("drop table if exists t1") + // Test if a table is not exists + tk.MustExec("drop table if exists nocache_t") + tk.MustGetErrCode("alter table nocache_t cache", errno.ErrNoSuchTable) + tk.MustExec("create table nocache_t (a int)") + tk.MustExec("alter table nocache_t nocache") + // Multiple no alter cache is okay + tk.MustExec("alter table nocache_t nocache") + tk.MustExec("alter table nocache_t nocache") +} + +func TestIndexOnCacheTable(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test;") + /*Test cache table can't add/drop/rename index */ + tk.MustExec("drop table if exists cache_index") + tk.MustExec("create table cache_index (c1 int primary key, c2 int, c3 int, index ok2(c2))") + defer tk.MustExec("drop table if exists cache_index") + tk.MustExec("alter table cache_index cache") + tk.MustGetErrCode("create index cache_c2 on cache_index(c2)", errno.ErrOptOnCacheTable) + tk.MustGetErrCode("alter table cache_index add index k2(c2)", errno.ErrOptOnCacheTable) + tk.MustGetErrCode("alter table cache_index drop index ok2", errno.ErrOptOnCacheTable) + /*Test rename index*/ + tk.MustGetErrCode("alter table cache_index rename index ok2 to ok", errno.ErrOptOnCacheTable) + /*Test drop different indexes*/ + tk.MustExec("drop table if exists cache_index_1") + tk.MustExec("create table cache_index_1 (id int, c1 int, c2 int, primary key(id), key i1(c1), key i2(c2));") + tk.MustExec("alter table cache_index_1 cache") + tk.MustGetErrCode("alter table cache_index_1 drop index i1, drop index i2;", errno.ErrOptOnCacheTable) +} diff --git a/ddl/db_change_test.go b/ddl/db_change_test.go index de7879803ddb7..3ae2259ddaf07 100644 --- a/ddl/db_change_test.go +++ b/ddl/db_change_test.go @@ -147,7 +147,7 @@ func (s *serialTestStateChangeSuite) TestShowCreateTable(c *C) { return } } - req := result.NewChunk() + req := result.NewChunk(nil) checkErr = result.Next(context.Background(), req) if checkErr != nil { return @@ -1819,6 +1819,8 @@ func (s *serialTestStateChangeSuite) TestCreateExpressionIndex(c *C) { stateWriteOnlySQLs := []string{"insert into t values (8, 8)", "begin pessimistic;", "insert into t select * from t", "rollback", "insert into t set b = 9", "update t set b = 7 where a = 2", "delete from t where b = 3"} stateWriteReorganizationSQLs := []string{"insert into t values (10, 10)", "begin pessimistic;", "insert into t select * from t", "rollback", "insert into t set b = 11", "update t set b = 7 where a = 5", "delete from t where b = 6"} + // If waitReorg timeout, the worker may enter writeReorg more than 2 times. + reorgTime := 0 var checkErr error d := s.dom.DDL() originalCallback := d.GetHook() @@ -1848,6 +1850,11 @@ func (s *serialTestStateChangeSuite) TestCreateExpressionIndex(c *C) { } // (1, 7), (2, 7), (5, 5), (0, 6), (8, 8), (0, 9) case model.StateWriteReorganization: + if reorgTime < 2 { + reorgTime++ + } else { + return + } for _, sql := range stateWriteReorganizationSQLs { _, checkErr = tk1.Exec(sql) if checkErr != nil { @@ -1880,6 +1887,8 @@ func (s *serialTestStateChangeSuite) TestCreateUniqueExpressionIndex(c *C) { stateDeleteOnlySQLs := []string{"insert into t values (5, 5)", "begin pessimistic;", "insert into t select * from t", "rollback", "insert into t set b = 6", "update t set b = 7 where a = 1", "delete from t where b = 4"} + // If waitReorg timeout, the worker may enter writeReorg more than 2 times. + reorgTime := 0 var checkErr error d := s.dom.DDL() originalCallback := d.GetHook() @@ -1932,6 +1941,11 @@ func (s *serialTestStateChangeSuite) TestCreateUniqueExpressionIndex(c *C) { } // (1, 7), (2, 7), (5, 5), (0, 6), (8, 8), (0, 9) case model.StateWriteReorganization: + if reorgTime < 2 { + reorgTime++ + } else { + return + } _, checkErr = tk1.Exec("insert into t values (10, 10) on duplicate key update a = 11") if checkErr != nil { return diff --git a/ddl/db_integration_test.go b/ddl/db_integration_test.go index a10cced549e3b..3e28686ad2302 100644 --- a/ddl/db_integration_test.go +++ b/ddl/db_integration_test.go @@ -636,6 +636,13 @@ func (s *testIntegrationSuite5) TestErrnoErrorCode(c *C) { tk.MustExec("create table test_error_code_null(c1 char(100) not null);") sql = "insert into test_error_code_null (c1) values(null);" tk.MustGetErrCode(sql, errno.ErrBadNull) + // disable tidb_enable_change_multi_schema + tk.MustExec("set global tidb_enable_change_multi_schema = false") + sql = "alter table test_error_code_null add column (x1 int, x2 int)" + tk.MustGetErrCode(sql, errno.ErrUnsupportedDDLOperation) + sql = "alter table test_error_code_null add column (x1 int, x2 int)" + tk.MustGetErrCode(sql, errno.ErrUnsupportedDDLOperation) + tk.MustExec("set global tidb_enable_change_multi_schema = true") } func (s *testIntegrationSuite3) TestTableDDLWithFloatType(c *C) { @@ -1530,7 +1537,7 @@ func (s *testSerialDBSuite1) TestCreateSecondaryIndexInCluster(c *C) { tk.MustExec("use test") // test create table with non-unique key - tk.MustGetErrCode(` + tk.MustExec(` CREATE TABLE t ( c01 varchar(255) NOT NULL, c02 varchar(255) NOT NULL, @@ -1540,7 +1547,8 @@ CREATE TABLE t ( c06 varchar(255) DEFAULT NULL, PRIMARY KEY (c01,c02,c03) clustered, KEY c04 (c04) -)`, errno.ErrTooLongKey) +)`) + tk.MustExec("drop table t") // test create long clustered primary key. tk.MustGetErrCode(` @@ -1580,7 +1588,7 @@ CREATE TABLE t ( PRIMARY KEY (c01,c02) clustered )`) tk.MustExec("create index idx1 on t(c03)") - tk.MustGetErrCode("create index idx2 on t(c03, c04)", errno.ErrTooLongKey) + tk.MustExec("create index idx2 on t(c03, c04)") tk.MustExec("create unique index uk2 on t(c03, c04)") tk.MustExec("drop table t") @@ -1599,9 +1607,9 @@ CREATE TABLE t ( )`) tk.MustExec("alter table t change c03 c10 varchar(256) default null") tk.MustGetErrCode("alter table t change c10 c100 varchar(1024) default null", errno.ErrTooLongKey) - tk.MustGetErrCode("alter table t modify c10 varchar(600) default null", errno.ErrTooLongKey) + tk.MustExec("alter table t modify c10 varchar(600) default null") tk.MustExec("alter table t modify c06 varchar(600) default null") - tk.MustGetErrCode("alter table t modify c01 varchar(510)", errno.ErrTooLongKey) + tk.MustExec("alter table t modify c01 varchar(510)") tk.MustExec("create table t2 like t") } @@ -2326,6 +2334,18 @@ func (s *testSerialDBSuite1) TestAddExpressionIndex(c *C) { tk.MustExec("create table t(a int, key((a+1)), key((a+2)), key idx((a+3)), key((a+4)));") tk.MustExec("drop table if exists t") tk.MustExec("CREATE TABLE t (A INT, B INT, UNIQUE KEY ((A * 2)));") + + // Test experiment switch. + config.UpdateGlobal(func(conf *config.Config) { + conf.Experimental.AllowsExpressionIndex = false + }) + tk.MustGetErrMsg("create index d on t((repeat(a, 2)))", "[ddl:8200]Unsupported creating expression index containing unsafe functions without allow-expression-index in config") + tk.MustGetErrMsg("create table t(a char(10), key ((repeat(a, 2))));", "[ddl:8200]Unsupported creating expression index containing unsafe functions without allow-expression-index in config") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a char(10), key ((lower(a))))") + config.UpdateGlobal(func(conf *config.Config) { + conf.Experimental.AllowsExpressionIndex = true + }) } func (s *testSerialDBSuite1) TestCreateExpressionIndexError(c *C) { @@ -2887,13 +2907,6 @@ func (s *testIntegrationSuite3) TestCreateTemporaryTable(c *C) { tk.MustGetErrCode("create table t(id int) on commit delete rows", errno.ErrParse) tk.MustGetErrCode("create table t(id int) on commit preserve rows", errno.ErrParse) - tk.MustGetErrCode("create global temporary table tplacement (id int) followers=4 on commit delete rows", errno.ErrOptOnTemporaryTable) - tk.MustGetErrCode("create global temporary table tplacement (id int) primary_region='us-east-1' regions='us-east-1,us-west-1' on commit delete rows", errno.ErrOptOnTemporaryTable) - tk.MustGetErrCode("create global temporary table tplacement (id int) placement policy='x' on commit delete rows", errno.ErrOptOnTemporaryTable) - tk.MustGetErrCode("create temporary table tplacement (id int) followers=4", errno.ErrOptOnTemporaryTable) - tk.MustGetErrCode("create temporary table tplacement (id int) primary_region='us-east-1' regions='us-east-1,us-west-1'", errno.ErrOptOnTemporaryTable) - tk.MustGetErrCode("create temporary table tplacement (id int) placement policy='x'", errno.ErrOptOnTemporaryTable) - // Not support yet. tk.MustGetErrCode("create global temporary table t (id int) on commit preserve rows", errno.ErrUnsupportedDDLOperation) @@ -2967,6 +2980,157 @@ func (s *testIntegrationSuite3) TestCreateTemporaryTable(c *C) { tk.MustExec(updateSafePoint) } +func (s *testIntegrationSuite3) TestAccessLocalTmpTableAfterDropDB(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("create database if not exists tmpdb") + tk.MustExec("create temporary table tmpdb.tmp(id int)") + tk.MustExec("drop database tmpdb") + + tests := []struct { + sql string + errcode int + result []string + queryResult []string + }{ + { + sql: "insert into tmpdb.tmp values(1)", + result: []string{"1"}, + }, + { + sql: "select * from tmpdb.tmp t1 join tmpdb.tmp t2 where t1.id=t2.id", + queryResult: []string{"1 1"}, + }, + { + sql: "select (select id from tmpdb.tmp) id1, t1.id id2 from (select * from tmpdb.tmp) t1 where t1.id=1", + queryResult: []string{"1 1"}, + }, + { + sql: "update tmpdb.tmp set id=2 where id=1", + result: []string{"2"}, + }, + { + sql: "delete from tmpdb.tmp where id=2", + result: []string{}, + }, + { + sql: "insert into tmpdb.tmp select 1 from dual", + result: []string{"1"}, + }, + { + sql: "update tmpdb.tmp t1, tmpdb.tmp t2 set t1.id=2 where t1.id=t2.id", + result: []string{"2"}, + }, + { + sql: "delete t1 from tmpdb.tmp t1 join tmpdb.tmp t2 where t1.id=t2.id", + result: []string{}, + }, + { + sql: "admin check table tmpdb.tmp", + errcode: errno.ErrOptOnTemporaryTable, + }, + { + sql: "alter table tmpdb.tmp add column name char(10)", + errcode: errno.ErrUnsupportedDDLOperation, + }, + } + + executeTests := func() { + tk.MustExec("truncate table tmpdb.tmp") + for _, test := range tests { + switch { + case test.errcode != 0: + tk.MustGetErrCode(test.sql, test.errcode) + case test.queryResult != nil: + tk.MustQuery(test.sql).Check(testkit.Rows(test.queryResult...)) + case test.result != nil: + tk.MustExec(test.sql) + tk.MustQuery("select * from tmpdb.tmp").Check(testkit.Rows(test.result...)) + default: + tk.MustExec(test.sql) + } + } + } + + executeTests() + + // Create the database again. + tk.MustExec("create database tmpdb") + executeTests() + + // Create another table in the database and drop the database again. + tk.MustExec("create temporary table tmpdb.tmp2(id int)") + tk.MustExec("drop database tmpdb") + executeTests() +} + +func (s *testSerialDBSuite) TestPlacementOnTemporaryTable(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists test.tplacement1, db2.t1, db2.tplacement3, db2.tplacement5") + tk.MustExec("drop database if exists db2") + tk.MustExec("drop placement policy if exists x") + tk.MustExec("create placement policy x primary_region='r1' regions='r1'") + defer tk.MustExec("drop placement policy x") + + // Cannot create temporary table with placement options + tk.MustGetErrCode("create global temporary table tplacement1 (id int) followers=4 on commit delete rows", errno.ErrOptOnTemporaryTable) + tk.MustGetErrCode("create global temporary table tplacement1 (id int) primary_region='us-east-1' regions='us-east-1,us-west-1' on commit delete rows", errno.ErrOptOnTemporaryTable) + tk.MustGetErrCode("create global temporary table tplacement1 (id int) placement policy='x' on commit delete rows", errno.ErrOptOnTemporaryTable) + tk.MustGetErrCode("create temporary table tplacement2 (id int) followers=4", errno.ErrOptOnTemporaryTable) + tk.MustGetErrCode("create temporary table tplacement2 (id int) primary_region='us-east-1' regions='us-east-1,us-west-1'", errno.ErrOptOnTemporaryTable) + tk.MustGetErrCode("create temporary table tplacement2 (id int) placement policy='x'", errno.ErrOptOnTemporaryTable) + + // Cannot alter temporary table with placement options + tk.MustExec("create global temporary table tplacement1 (id int) on commit delete rows") + defer tk.MustExec("drop table tplacement1") + tk.MustGetErrCode("alter table tplacement1 followers=4", errno.ErrOptOnTemporaryTable) + tk.MustGetErrCode("alter table tplacement1 primary_region='us-east-1' regions='us-east-1,us-west-1'", errno.ErrOptOnTemporaryTable) + tk.MustGetErrCode("alter table tplacement1 placement policy='x'", errno.ErrOptOnTemporaryTable) + + tk.MustExec("create temporary table tplacement2 (id int)") + tk.MustGetErrCode("alter table tplacement2 followers=4", errno.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table tplacement2 primary_region='us-east-1' regions='us-east-1,us-west-1'", errno.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table tplacement2 placement policy='x'", errno.ErrUnsupportedDDLOperation) + + // Temporary table will not inherit placement from db + tk.MustExec("create database db2 placement policy x") + defer tk.MustExec("drop database db2") + + tk.MustExec("create global temporary table db2.tplacement3 (id int) on commit delete rows") + defer tk.MustExec("drop table db2.tplacement3") + tk.MustQuery("show create table db2.tplacement3").Check(testkit.Rows( + "tplacement3 CREATE GLOBAL TEMPORARY TABLE `tplacement3` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ON COMMIT DELETE ROWS", + )) + + tk.MustExec("create temporary table db2.tplacement4 (id int)") + tk.MustQuery("show create table db2.tplacement4").Check(testkit.Rows( + "tplacement4 CREATE TEMPORARY TABLE `tplacement4` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin", + )) + + tk.MustExec("create table db2.t1 (a int) placement policy 'default'") + defer tk.MustExec("drop table db2.t1") + + tk.MustExec("create global temporary table db2.tplacement5 like db2.t1 on commit delete rows") + defer tk.MustExec("drop table db2.tplacement5") + tk.MustQuery("show create table db2.tplacement5").Check(testkit.Rows( + "tplacement5 CREATE GLOBAL TEMPORARY TABLE `tplacement5` (\n" + + " `a` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ON COMMIT DELETE ROWS", + )) + + tk.MustExec("create temporary table db2.tplacement6 like db2.t1") + defer tk.MustExec("drop table db2.tplacement6") + tk.MustQuery("show create table db2.tplacement6").Check(testkit.Rows( + "tplacement6 CREATE TEMPORARY TABLE `tplacement6` (\n" + + " `a` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin", + )) +} + func (s *testIntegrationSuite3) TestAvoidCreateViewOnLocalTemporaryTable(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") @@ -3420,3 +3584,167 @@ func (s *testIntegrationSuite3) TestTruncateLocalTemporaryTable(c *C) { tk.MustExec("truncate table testt.t3") tk.MustQuery("select * from testt.t3").Check(testkit.Rows()) } + +func (s *testIntegrationSuite3) TestIssue29282(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk1 := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists issue29828_t") + tk.MustExec("create table issue29828_t (id int)") + tk.MustExec("create temporary table issue29828_tmp(id int);") + tk.MustExec("insert into issue29828_tmp values(1)") + tk.MustExec("prepare stmt from 'insert into issue29828_t select * from issue29828_tmp';") + tk.MustExec("execute stmt") + tk.MustQuery("select *from issue29828_t").Check(testkit.Rows("1")) + + tk.MustExec("create temporary table issue29828_tmp1(id int);") + tk.MustExec("insert into issue29828_tmp1 values(1)") + tk.MustExec("begin pessimistic") + tk.MustExec("prepare stmt1 from 'select * from issue29828_t for update union select * from issue29828_tmp1';") + tk.MustQuery("execute stmt1").Check(testkit.Rows("1")) + ch := make(chan struct{}, 1) + tk1.MustExec("use test") + tk1.MustExec("begin pessimistic") + go func() { + // This query should block. + tk1.MustQuery("select * from issue29828_t where id = 1 for update;").Check(testkit.Rows("1")) + ch <- struct{}{} + }() + + select { + case <-time.After(100 * time.Millisecond): + // Expected, query blocked, not finish within 100ms. + tk.MustExec("rollback") + case <-ch: + // Unexpected, test fail. + c.Fail() + } +} + +// See https://github.com/pingcap/tidb/issues/29327 +func (s *testIntegrationSuite3) TestEnumDefaultValue(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` enum('','a','b') NOT NULL DEFAULT 'b' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;") + tk.MustQuery("show create table t1").Check(testkit.Rows("t1 CREATE TABLE `t1` (\n" + + " `a` enum('','a','b') COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'b'\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci")) + tk.MustExec("drop table if exists t1;") + tk.MustExec("CREATE TABLE `t1` ( `a` enum('','a','b') NOT NULL DEFAULT 'b ' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;") + tk.MustQuery("show create table t1").Check(testkit.Rows("t1 CREATE TABLE `t1` (\n" + + " `a` enum('','a','b') COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'b'\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci")) +} + +func (s *testIntegrationSuite3) TestIssue29326(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1 (id int)") + tk.MustExec("insert into t1 values(1)") + defer tk.MustExec("drop table t1") + + tk.MustExec("drop table if exists t2") + tk.MustExec("create table t2 (id int)") + tk.MustExec("insert into t2 values(1)") + defer tk.MustExec("drop table t2") + + tk.MustExec("drop view if exists v1") + defer tk.MustExec("drop view if exists v1") + + tk.MustExec("create view v1 as select 1,1") + rs, err := tk.Exec("select * from v1") + c.Assert(err, IsNil) + tk.ResultSetToResult(rs, Commentf("%v", rs)).Check(testkit.Rows("1 1")) + c.Assert(rs.Fields()[0].Column.Name.O, Equals, "1") + c.Assert(rs.Fields()[1].Column.Name.O, Equals, "Name_exp_1") + + tk.MustExec("drop view if exists v1") + tk.MustExec("create view v1 as select 1, 2, 1, 2, 1, 2, 1, 2") + rs, err = tk.Exec("select * from v1") + c.Assert(err, IsNil) + tk.ResultSetToResult(rs, Commentf("%v", rs)).Check(testkit.Rows("1 2 1 2 1 2 1 2")) + c.Assert(rs.Fields()[0].Column.Name.O, Equals, "1") + c.Assert(rs.Fields()[1].Column.Name.O, Equals, "2") + c.Assert(rs.Fields()[2].Column.Name.O, Equals, "Name_exp_1") + c.Assert(rs.Fields()[3].Column.Name.O, Equals, "Name_exp_2") + c.Assert(rs.Fields()[4].Column.Name.O, Equals, "Name_exp_1_1") + c.Assert(rs.Fields()[5].Column.Name.O, Equals, "Name_exp_1_2") + c.Assert(rs.Fields()[6].Column.Name.O, Equals, "Name_exp_2_1") + c.Assert(rs.Fields()[7].Column.Name.O, Equals, "Name_exp_2_2") + + tk.MustExec("drop view if exists v1") + tk.MustExec("create view v1 as select 't', 't', 1 as t") + rs, err = tk.Exec("select * from v1") + c.Assert(err, IsNil) + tk.ResultSetToResult(rs, Commentf("%v", rs)).Check(testkit.Rows("t t 1")) + c.Assert(rs.Fields()[0].Column.Name.O, Equals, "Name_exp_t") + c.Assert(rs.Fields()[1].Column.Name.O, Equals, "Name_exp_1_t") + c.Assert(rs.Fields()[2].Column.Name.O, Equals, "t") + + tk.MustExec("drop view if exists v1") + tk.MustExec("create definer=`root`@`127.0.0.1` view v1 as select 1, 1 union all select 1, 1") + tk.MustQuery("show create view v1").Check(testkit.Rows("v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`127.0.0.1` " + + "SQL SECURITY DEFINER VIEW `v1` (`1`, `Name_exp_1`) " + + "AS SELECT 1 AS `1`,1 AS `Name_exp_1` UNION ALL SELECT 1 AS `1`,1 AS `1` " + + "utf8mb4 utf8mb4_bin")) + rs, err = tk.Exec("select * from v1") + c.Assert(err, IsNil) + tk.ResultSetToResult(rs, Commentf("%v", rs)).Check(testkit.Rows("1 1", "1 1")) + c.Assert(rs.Fields()[0].Column.Name.O, Equals, "1") + c.Assert(rs.Fields()[1].Column.Name.O, Equals, "Name_exp_1") + + tk.MustExec("drop view if exists v1") + tk.MustExec("create definer=`root`@`127.0.0.1` view v1 as select 'id', id from t1") + tk.MustQuery("show create view v1").Check(testkit.Rows("v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`127.0.0.1` " + + "SQL SECURITY DEFINER VIEW `v1` (`Name_exp_id`, `id`) " + + "AS SELECT _UTF8MB4'id' AS `Name_exp_id`,`id` AS `id` FROM `test`.`t1` " + + "utf8mb4 utf8mb4_bin")) + rs, err = tk.Exec("select * from v1") + c.Assert(err, IsNil) + tk.ResultSetToResult(rs, Commentf("%v", rs)).Check(testkit.Rows("id 1")) + c.Assert(rs.Fields()[0].Column.Name.O, Equals, "Name_exp_id") + c.Assert(rs.Fields()[1].Column.Name.O, Equals, "id") + + tk.MustExec("drop view if exists v1") + tk.MustExec("create definer=`root`@`127.0.0.1` view v1 as select 1, (select id from t1 where t1.id=t2.id) as '1' from t2") + tk.MustQuery("show create view v1").Check(testkit.Rows("v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`127.0.0.1` " + + "SQL SECURITY DEFINER VIEW `v1` (`Name_exp_1`, `1`) " + + "AS SELECT 1 AS `Name_exp_1`,(SELECT `id` AS `id` FROM `test`.`t1` WHERE `t1`.`id`=`t2`.`id`) AS `1` FROM `test`.`t2` " + + "utf8mb4 utf8mb4_bin")) + rs, err = tk.Exec("select * from v1") + c.Assert(err, IsNil) + tk.ResultSetToResult(rs, Commentf("%v", rs)).Check(testkit.Rows("1 1")) + c.Assert(rs.Fields()[0].Column.Name.O, Equals, "Name_exp_1") + c.Assert(rs.Fields()[1].Column.Name.O, Equals, "1") + + tk.MustExec("drop view if exists v1") + tk.MustExec("create definer=`root`@`127.0.0.1` view v1 as select 1 as 'abs(t1.id)', abs(t1.id) from t1") + tk.MustQuery("show create view v1").Check(testkit.Rows("v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`127.0.0.1` " + + "SQL SECURITY DEFINER VIEW `v1` (`abs(t1.id)`, `Name_exp_abs(t1.id)`) " + + "AS SELECT 1 AS `abs(t1.id)`,ABS(`t1`.`id`) AS `Name_exp_abs(t1.id)` FROM `test`.`t1` " + + "utf8mb4 utf8mb4_bin")) + rs, err = tk.Exec("select * from v1") + c.Assert(err, IsNil) + tk.ResultSetToResult(rs, Commentf("%v", rs)).Check(testkit.Rows("1 1")) + c.Assert(rs.Fields()[0].Column.Name.O, Equals, "abs(t1.id)") + c.Assert(rs.Fields()[1].Column.Name.O, Equals, "Name_exp_abs(t1.id)") + + tk.MustExec("drop view if exists v1") + err = tk.ExecToErr("create definer=`root`@`127.0.0.1` view v1 as select 1 as t,1 as t") + c.Assert(infoschema.ErrColumnExists.Equal(err), IsTrue) + + tk.MustExec("drop view if exists v1") + err = tk.ExecToErr("create definer=`root`@`127.0.0.1` view v1 as select 1 as id, id from t1") + c.Assert(infoschema.ErrColumnExists.Equal(err), IsTrue) + + tk.MustExec("drop view if exists v1") + err = tk.ExecToErr("create definer=`root`@`127.0.0.1` view v1 as select * from t1 left join t2 on t1.id=t2.id") + c.Assert(infoschema.ErrColumnExists.Equal(err), IsTrue) + + tk.MustExec("drop view if exists v1") + err = tk.ExecToErr("create definer=`root`@`127.0.0.1` view v1 as select t1.id, t2.id from t1,t2 where t1.id=t2.id") + c.Assert(infoschema.ErrColumnExists.Equal(err), IsTrue) +} diff --git a/ddl/db_partition_test.go b/ddl/db_partition_test.go index 0f038ec55051b..647c421ab6b0d 100644 --- a/ddl/db_partition_test.go +++ b/ddl/db_partition_test.go @@ -224,7 +224,7 @@ func (s *testIntegrationSuite3) TestCreateTableWithPartition(c *C) { partition p0 values less than (to_seconds('2004-01-01')), partition p1 values less than (to_seconds('2005-01-01')));`) tk.MustQuery("show create table t26").Check( - testkit.Rows("t26 CREATE TABLE `t26` (\n `a` date DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\nPARTITION BY RANGE ( TO_SECONDS(`a`) ) (\n PARTITION `p0` VALUES LESS THAN (63240134400),\n PARTITION `p1` VALUES LESS THAN (63271756800)\n)")) + testkit.Rows("t26 CREATE TABLE `t26` (\n `a` date DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\nPARTITION BY RANGE (TO_SECONDS(`a`))\n(PARTITION `p0` VALUES LESS THAN (63240134400),\n PARTITION `p1` VALUES LESS THAN (63271756800))")) tk.MustExec(`create table t27 (a bigint unsigned not null) partition by range(a) ( partition p0 values less than (10), @@ -2153,23 +2153,29 @@ func (s *testIntegrationSuite4) TestAddPartitionTooManyPartitions(c *C) { tk.MustGetErrCode(sql3, tmysql.ErrTooManyPartitions) } -func checkPartitionDelRangeDone(c *C, tk *testkit.TestKit, s *testIntegrationSuite, oldPID int64) { - startTime := time.Now() - partitionPrefix := tablecodec.EncodeTablePrefix(oldPID) +func waitGCDeleteRangeDone(c *C, tk *testkit.TestKit, physicalID int64) bool { var i int for i = 0; i < waitForCleanDataRound; i++ { - rs, err := tk.Exec("select count(1) from mysql.gc_delete_range_done where element_id = ?", oldPID) + rs, err := tk.Exec("select count(1) from mysql.gc_delete_range_done where element_id = ?", physicalID) c.Assert(err, IsNil) rows, err := session.ResultSetToStringSlice(context.Background(), tk.Se, rs) c.Assert(err, IsNil) val := rows[0][0] if val != "0" { - break + return true } time.Sleep(waitForCleanDataInterval) } - if i == waitForCleanDataRound { + return false +} + +func checkPartitionDelRangeDone(c *C, tk *testkit.TestKit, s *testIntegrationSuite, oldPID int64) { + startTime := time.Now() + partitionPrefix := tablecodec.EncodeTablePrefix(oldPID) + + done := waitGCDeleteRangeDone(c, tk, oldPID) + if !done { // Takes too long, give up the check. logutil.BgLogger().Info("truncate partition table", zap.Int64("id", oldPID), @@ -2638,26 +2644,17 @@ func testPartitionDropIndex(c *C, store kv.Storage, lease time.Duration, idxName tk.MustExec(addIdxSQL) ctx := tk.Se.(sessionctx.Context) - is := domain.GetDomain(ctx).InfoSchema() - t, err := is.TableByName(model.NewCIStr("test_db"), model.NewCIStr("partition_drop_idx")) - c.Assert(err, IsNil) - - var idx1 table.Index - for _, pidx := range t.Indices() { - if pidx.Meta().Name.L == idxName { - idx1 = pidx - break - } - } - c.Assert(idx1, NotNil) + indexID := testGetIndexID(c, ctx, "test_db", "partition_drop_idx", idxName) + jobIDExt, reset := setupJobIDExtCallback(ctx) + defer reset() testutil.SessionExecInGoroutine(store, dropIdxSQL, done) ticker := time.NewTicker(lease / 2) defer ticker.Stop() LOOP: for { select { - case err = <-done: + case err := <-done: if err == nil { break LOOP } @@ -2673,23 +2670,7 @@ LOOP: num += step } } - - is = domain.GetDomain(ctx).InfoSchema() - t, err = is.TableByName(model.NewCIStr("test_db"), model.NewCIStr("partition_drop_idx")) - c.Assert(err, IsNil) - // Only one partition id test is taken here. - pid := t.Meta().Partition.Definitions[0].ID - var idxn table.Index - t.Indices() - for _, idx := range t.Indices() { - if idx.Meta().Name.L == idxName { - idxn = idx - break - } - } - c.Assert(idxn, IsNil) - idx := tables.NewIndex(pid, t.Meta(), idx1.Meta()) - checkDelRangeDone(c, ctx, idx) + checkDelRangeAdded(tk, jobIDExt.jobID, indexID) tk.MustExec("drop table partition_drop_idx;") } @@ -2700,7 +2681,7 @@ func (s *testIntegrationSuite2) TestPartitionCancelAddPrimaryKey(c *C) { } func (s *testIntegrationSuite4) TestPartitionCancelAddIndex(c *C) { - idxName := "idx1" + idxName := "c3_index" addIdxSQL := "create unique index c3_index on t1 (c1)" testPartitionCancelAddIndex(c, s.store, s.dom.DDL(), s.lease, idxName, addIdxSQL) } @@ -2737,7 +2718,8 @@ func testPartitionCancelAddIndex(c *C, store kv.Storage, d ddl.DDL, lease time.D hook.OnJobUpdatedExported, c3IdxInfo, checkErr = backgroundExecOnJobUpdatedExported(c, store, ctx, hook, idxName) originHook := d.GetHook() defer d.(ddl.DDLForTest).SetHook(originHook) - d.(ddl.DDLForTest).SetHook(hook) + jobIDExt := wrapJobIDExtCallback(hook) + d.(ddl.DDLForTest).SetHook(jobIDExt) done := make(chan error, 1) go backgroundExec(store, addIdxSQL, done) @@ -2768,17 +2750,7 @@ LOOP: times++ } } - - t := testGetTableByName(c, ctx, "test_db", "t1") - // Only one partition id test is taken here. - pid := t.Meta().Partition.Definitions[0].ID - for _, tidx := range t.Indices() { - c.Assert(strings.EqualFold(tidx.Meta().Name.L, "c3_index"), IsFalse) - } - - idx := tables.NewIndex(pid, t.Meta(), c3IdxInfo) - checkDelRangeDone(c, ctx, idx) - + checkDelRangeAdded(tk, jobIDExt.jobID, c3IdxInfo.ID) tk.MustExec("drop table t1") } @@ -2794,7 +2766,7 @@ func backgroundExecOnJobUpdatedExported(c *C, store kv.Storage, ctx sessionctx.C // When the job satisfies this case of addIndexNotFirstReorg, the worker will start to backfill indexes. if !addIndexNotFirstReorg { // Get the index's meta. - if c3IdxInfo != nil { + if c3IdxInfo.ID != 0 { return } t := testGetTableByName(c, ctx, "test_db", "t1") @@ -2803,7 +2775,7 @@ func backgroundExecOnJobUpdatedExported(c *C, store kv.Storage, ctx sessionctx.C continue } if index.Meta().Name.L == idxName { - c3IdxInfo = index.Meta() + *c3IdxInfo = *index.Meta() } } return @@ -2981,11 +2953,12 @@ func (s *testIntegrationSuite5) TestDropSchemaWithPartitionTable(c *C) { row := rows[0] c.Assert(row.GetString(3), Equals, "drop schema") jobID := row.GetInt64(0) + + var tableIDs []int64 err = kv.RunInNewTxn(context.Background(), s.store, false, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) historyJob, err := t.GetHistoryDDLJob(jobID) c.Assert(err, IsNil) - var tableIDs []int64 err = historyJob.DecodeArgs(&tableIDs) c.Assert(err, IsNil) // There is 2 partitions. @@ -2994,6 +2967,17 @@ func (s *testIntegrationSuite5) TestDropSchemaWithPartitionTable(c *C) { }) c.Assert(err, IsNil) + startTime := time.Now() + done := waitGCDeleteRangeDone(c, tk, tableIDs[2]) + if !done { + // Takes too long, give up the check. + logutil.BgLogger().Info("drop schema", + zap.Int64("id", tableIDs[0]), + zap.Stringer("duration", time.Since(startTime)), + ) + return + } + // check records num after drop database. for i := 0; i < waitForCleanDataRound; i++ { recordsNum = getPartitionTableRecordsNum(c, ctx, tbl.(table.PartitionedTable)) diff --git a/ddl/db_test.go b/ddl/db_test.go index 5cd4893ff17bf..aabfe86528d90 100644 --- a/ddl/db_test.go +++ b/ddl/db_test.go @@ -61,6 +61,7 @@ import ( "github.com/pingcap/tidb/util/domainutil" "github.com/pingcap/tidb/util/israce" "github.com/pingcap/tidb/util/mock" + "github.com/pingcap/tidb/util/sqlexec" "github.com/pingcap/tidb/util/testkit" "github.com/pingcap/tidb/util/testutil" "github.com/tikv/client-go/v2/testutils" @@ -78,7 +79,7 @@ var _ = Suite(&testDBSuite2{&testDBSuite{}}) var _ = Suite(&testDBSuite3{&testDBSuite{}}) var _ = Suite(&testDBSuite4{&testDBSuite{}}) var _ = Suite(&testDBSuite5{&testDBSuite{}}) -var _ = Suite(&testDBSuite6{&testDBSuite{}}) +var _ = SerialSuites(&testDBSuite6{&testDBSuite{}}) var _ = Suite(&testDBSuite7{&testDBSuite{}}) var _ = Suite(&testDBSuite8{&testDBSuite{}}) var _ = SerialSuites(&testSerialDBSuite{&testDBSuite{}}) @@ -126,6 +127,8 @@ func setUpSuite(s *testDBSuite, c *C) { c.Assert(err, IsNil) _, err = s.s.Execute(context.Background(), "set @@global.tidb_max_delta_schema_count= 4096") c.Assert(err, IsNil) + _, err = s.s.Execute(context.Background(), "set @@global.tidb_enable_alter_placement=1") + c.Assert(err, IsNil) } func tearDownSuite(s *testDBSuite, c *C) { @@ -571,7 +574,7 @@ func (s *testDBSuite8) TestCancelAddPrimaryKey(c *C) { } func (s *testDBSuite7) TestCancelAddIndex(c *C) { - idxName := "c3_index " + idxName := "c3_index" addIdxSQL := "create unique index c3_index on t1 (c3)" testCancelAddIndex(c, s.store, s.dom.DDL(), s.lease, idxName, addIdxSQL, "", s.dom) @@ -614,7 +617,8 @@ func testCancelAddIndex(c *C, store kv.Storage, d ddl.DDL, lease time.Duration, ctx := tk.Se.(sessionctx.Context) hook.OnJobUpdatedExported, c3IdxInfo, checkErr = backgroundExecOnJobUpdatedExported(c, store, ctx, hook, idxName) originalHook := d.GetHook() - d.(ddl.DDLForTest).SetHook(hook) + jobIDExt := wrapJobIDExtCallback(hook) + d.(ddl.DDLForTest).SetHook(jobIDExt) done := make(chan error, 1) go backgroundExec(store, addIdxSQL, done) @@ -644,14 +648,7 @@ LOOP: times++ } } - - t := testGetTableByName(c, ctx, "test_db", "t1") - for _, tidx := range t.Indices() { - c.Assert(strings.EqualFold(tidx.Meta().Name.L, idxName), IsFalse) - } - - idx := tables.NewIndex(t.Meta().ID, t.Meta(), c3IdxInfo) - checkDelRangeDone(c, ctx, idx) + checkDelRangeAdded(tk, jobIDExt.jobID, c3IdxInfo.ID) d.(ddl.DDLForTest).SetHook(originalHook) } @@ -1711,16 +1708,9 @@ func testDropIndex(c *C, store kv.Storage, lease time.Duration, createSQL, dropI tk.MustExec("insert into test_drop_index values (?, ?, ?)", i, i, i) } ctx := tk.Se.(sessionctx.Context) - t := testGetTableByName(c, ctx, "test_db", "test_drop_index") - var c3idx table.Index - for _, tidx := range t.Indices() { - if tidx.Meta().Name.L == idxName { - c3idx = tidx - break - } - } - c.Assert(c3idx, NotNil) - + indexID := testGetIndexID(c, ctx, "test_db", "test_drop_index", idxName) + jobIDExt, reset := setupJobIDExtCallback(ctx) + defer reset() testddlutil.SessionExecInGoroutine(store, dropIdxSQL, done) ticker := time.NewTicker(lease / 2) @@ -1748,20 +1738,7 @@ LOOP: rows := tk.MustQuery("explain select c1 from test_drop_index where c3 >= 0") c.Assert(strings.Contains(fmt.Sprintf("%v", rows), idxName), IsFalse) - // Check in index, it must be no index in KV. - // Make sure there is no index with name c3_index. - t = testGetTableByName(c, ctx, "test_db", "test_drop_index") - var nidx table.Index - for _, tidx := range t.Indices() { - if tidx.Meta().Name.L == idxName { - nidx = tidx - break - } - } - c.Assert(nidx, IsNil) - - idx := tables.NewIndex(t.Meta().ID, t.Meta(), c3idx.Meta()) - checkDelRangeDone(c, ctx, idx) + checkDelRangeAdded(tk, jobIDExt.jobID, indexID) tk.MustExec("drop table test_drop_index") } @@ -1819,19 +1796,14 @@ func (s *testDBSuite3) TestCancelDropColumn(c *C) { originalHook := s.dom.DDL().GetHook() s.dom.DDL().(ddl.DDLForTest).SetHook(hook) var err1 error - var c3idx table.Index for i := range testCases { + var c3IdxID int64 testCase = &testCases[i] if testCase.needAddColumn { s.mustExec(tk, c, "alter table test_drop_column add column c3 int") s.mustExec(tk, c, "alter table test_drop_column add index idx_c3(c3)") - tt := s.testGetTable(c, "test_drop_column") - for _, idx := range tt.Indices() { - if strings.EqualFold(idx.Meta().Name.L, "idx_c3") { - c3idx = idx - break - } - } + ctx := tk.Se.(sessionctx.Context) + c3IdxID = testGetIndexID(c, ctx, s.schemaName, "test_drop_column", "idx_c3") } _, err1 = tk.Exec("alter table test_drop_column drop column c3") var col1 *table.Column @@ -1862,9 +1834,10 @@ func (s *testDBSuite3) TestCancelDropColumn(c *C) { c.Assert(err1, IsNil) c.Assert(checkErr, NotNil) c.Assert(checkErr.Error(), Equals, admin.ErrCannotCancelDDLJob.GenWithStackByArgs(jobID).Error()) - // Check index is deleted - ctx := s.s.(sessionctx.Context) - checkDelRangeDone(c, ctx, c3idx) + if c3IdxID != 0 { + // Check index is deleted + checkDelRangeAdded(tk, jobID, c3IdxID) + } } } s.dom.DDL().(ddl.DDLForTest).SetHook(originalHook) @@ -1926,19 +1899,14 @@ func (s *testDBSuite3) TestCancelDropColumns(c *C) { originalHook := s.dom.DDL().GetHook() s.dom.DDL().(ddl.DDLForTest).SetHook(hook) var err1 error - var c3idx table.Index for i := range testCases { + var c3IdxID int64 testCase = &testCases[i] if testCase.needAddColumn { s.mustExec(tk, c, "alter table test_drop_column add column c3 int, add column c4 int") s.mustExec(tk, c, "alter table test_drop_column add index idx_c3(c3)") - tt := s.testGetTable(c, "test_drop_column") - for _, idx := range tt.Indices() { - if strings.EqualFold(idx.Meta().Name.L, "idx_c3") { - c3idx = idx - break - } - } + ctx := tk.Se.(sessionctx.Context) + c3IdxID = testGetIndexID(c, ctx, s.schemaName, "test_drop_column", "idx_c3") } _, err1 = tk.Exec("alter table test_drop_column drop column c3, drop column c4") t := s.testGetTable(c, "test_drop_column") @@ -1967,9 +1935,10 @@ func (s *testDBSuite3) TestCancelDropColumns(c *C) { c.Assert(err1, IsNil) c.Assert(checkErr, NotNil) c.Assert(checkErr.Error(), Equals, admin.ErrCannotCancelDDLJob.GenWithStackByArgs(jobID).Error()) - // Check index is deleted - ctx := s.s.(sessionctx.Context) - checkDelRangeDone(c, ctx, c3idx) + if c3IdxID != 0 { + // Check index is deleted + checkDelRangeAdded(tk, jobID, c3IdxID) + } } } s.dom.DDL().(ddl.DDLForTest).SetHook(originalHook) @@ -1977,47 +1946,56 @@ func (s *testDBSuite3) TestCancelDropColumns(c *C) { s.mustExec(tk, c, "alter table test_drop_column drop column c3, drop column c4") } -func checkDelRangeDone(c *C, ctx sessionctx.Context, idx table.Index) { - startTime := time.Now() - f := func() map[int64]struct{} { - handles := make(map[int64]struct{}) +func testGetIndexID(c *C, ctx sessionctx.Context, dbName, tblName, idxName string) int64 { + is := domain.GetDomain(ctx).InfoSchema() + t, err := is.TableByName(model.NewCIStr(dbName), model.NewCIStr(tblName)) + c.Assert(err, IsNil) - c.Assert(ctx.NewTxn(context.Background()), IsNil) - txn, err := ctx.Txn(true) - c.Assert(err, IsNil) - defer func() { - err := txn.Rollback() - c.Assert(err, IsNil) - }() + for _, idx := range t.Indices() { + if idx.Meta().Name.L == idxName { + return idx.Meta().ID + } + } + c.Fatalf("index %s not found(db: %s, tbl: %s)", idxName, dbName, tblName) + return -1 +} - txn, err = ctx.Txn(true) - c.Assert(err, IsNil) - it, err := idx.SeekFirst(txn) - c.Assert(err, IsNil) - defer it.Close() +type testDDLJobIDCallback struct { + ddl.Callback + jobID int64 +} - for { - _, h, err := it.Next() - if terror.ErrorEqual(err, io.EOF) { - break - } +func (t *testDDLJobIDCallback) OnJobUpdated(job *model.Job) { + if t.jobID == 0 { + t.jobID = job.ID + } + if t.Callback != nil { + t.Callback.OnJobUpdated(job) + } +} - c.Assert(err, IsNil) - handles[h.IntValue()] = struct{}{} - } - return handles +func wrapJobIDExtCallback(oldCallback ddl.Callback) *testDDLJobIDCallback { + return &testDDLJobIDCallback{ + Callback: oldCallback, + jobID: 0, } +} - var handles map[int64]struct{} - for i := 0; i < waitForCleanDataRound; i++ { - handles = f() - if len(handles) != 0 { - time.Sleep(waitForCleanDataInterval) - } else { - break - } +func setupJobIDExtCallback(ctx sessionctx.Context) (jobExt *testDDLJobIDCallback, tearDown func()) { + dom := domain.GetDomain(ctx) + originHook := dom.DDL().GetHook() + jobIDExt := wrapJobIDExtCallback(originHook) + dom.DDL().SetHook(jobIDExt) + return jobIDExt, func() { + dom.DDL().SetHook(originHook) } - c.Assert(handles, HasLen, 0, Commentf("take time %v", time.Since(startTime))) +} + +func checkDelRangeAdded(tk *testkit.TestKit, jobID int64, elemID int64) { + query := `select sum(cnt) from + (select count(1) cnt from mysql.gc_delete_range where job_id = ? and element_id = ? union + select count(1) cnt from mysql.gc_delete_range_done where job_id = ? and element_id = ?) as gdr;` + tk.MustQuery(query, jobID, elemID, jobID, elemID).Check(testkit.Rows("1")) } func checkGlobalIndexCleanUpDone(c *C, ctx sessionctx.Context, tblInfo *model.TableInfo, idxInfo *model.IndexInfo, pid int64) int { @@ -5497,8 +5475,7 @@ func (s *testDBSuite1) TestModifyColumnTime_YearToDate(c *C) { {"year", `"69"`, "date", "", errno.ErrTruncatedWrongValue}, {"year", `"70"`, "date", "", errno.ErrTruncatedWrongValue}, {"year", `"99"`, "date", "", errno.ErrTruncatedWrongValue}, - // MySQL will get "Data truncation: Incorrect date value: '0000'", but TiDB treat 00 as valid datetime. - {"year", `00`, "date", "0000-00-00", 0}, + {"year", `00`, "date", "", errno.ErrTruncatedWrongValue}, {"year", `69`, "date", "", errno.ErrTruncatedWrongValue}, {"year", `70`, "date", "", errno.ErrTruncatedWrongValue}, {"year", `99`, "date", "", errno.ErrTruncatedWrongValue}, @@ -5515,8 +5492,7 @@ func (s *testDBSuite1) TestModifyColumnTime_YearToDatetime(c *C) { {"year", `"69"`, "datetime", "", errno.ErrTruncatedWrongValue}, {"year", `"70"`, "datetime", "", errno.ErrTruncatedWrongValue}, {"year", `"99"`, "datetime", "", errno.ErrTruncatedWrongValue}, - // MySQL will get "Data truncation: Incorrect date value: '0000'", but TiDB treat 00 as valid datetime. - {"year", `00`, "datetime", "0000-00-00 00:00:00", 0}, + {"year", `00`, "datetime", "", errno.ErrTruncatedWrongValue}, {"year", `69`, "datetime", "", errno.ErrTruncatedWrongValue}, {"year", `70`, "datetime", "", errno.ErrTruncatedWrongValue}, {"year", `99`, "datetime", "", errno.ErrTruncatedWrongValue}, @@ -5533,8 +5509,7 @@ func (s *testDBSuite1) TestModifyColumnTime_YearToTimestamp(c *C) { {"year", `"69"`, "timestamp", "", errno.ErrTruncatedWrongValue}, {"year", `"70"`, "timestamp", "", errno.ErrTruncatedWrongValue}, {"year", `"99"`, "timestamp", "", errno.ErrTruncatedWrongValue}, - // MySQL will get "Data truncation: Incorrect date value: '0000'", but TiDB treat 00 as valid datetime. - {"year", `00`, "timestamp", "0000-00-00 00:00:00", 0}, + {"year", `00`, "timestamp", "", errno.ErrTruncatedWrongValue}, {"year", `69`, "timestamp", "", errno.ErrTruncatedWrongValue}, {"year", `70`, "timestamp", "", errno.ErrTruncatedWrongValue}, {"year", `99`, "timestamp", "", errno.ErrTruncatedWrongValue}, @@ -5687,6 +5662,30 @@ func (s *testSerialDBSuite) TestSetTableFlashReplica(c *C) { c.Assert(err.Error(), Equals, "the tiflash replica count: 2 should be less than the total tiflash server count: 0") } +func (s *testSerialDBSuite) TestForbitCacheTableForSystemTable(c *C) { + tk := testkit.NewTestKit(c, s.store) + sysTables := make([]string, 0, 24) + memOrSysDB := []string{"MySQL", "INFORMATION_SCHEMA", "PERFORMANCE_SCHEMA", "METRICS_SCHEMA"} + for _, db := range memOrSysDB { + tk.MustExec("use " + db) + tk.Se.Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil) + rows := tk.MustQuery("show tables").Rows() + for i := 0; i < len(rows); i++ { + sysTables = append(sysTables, rows[i][0].(string)) + } + for _, one := range sysTables { + _, err := tk.Exec(fmt.Sprintf("alter table `%s` cache", one)) + if db == "MySQL" { + c.Assert(err.Error(), Equals, "[ddl:8200]ALTER table cache for tables in system database is currently unsupported") + } else { + c.Assert(err.Error(), Equals, fmt.Sprintf("[planner:1142]ALTER command denied to user 'root'@'%%' for table '%s'", strings.ToLower(one))) + } + + } + sysTables = sysTables[:0] + } +} + func (s *testSerialDBSuite) TestSetTableFlashReplicaForSystemTable(c *C) { tk := testkit.NewTestKit(c, s.store) sysTables := make([]string, 0, 24) @@ -5967,6 +5966,36 @@ func (s *testSerialDBSuite) TestSkipSchemaChecker(c *C) { c.Assert(terror.ErrorEqual(domain.ErrInfoSchemaChanged, err), IsTrue) } +// See issue: https://github.com/pingcap/tidb/issues/29752 +// Ref https://dev.mysql.com/doc/refman/8.0/en/rename-table.html +func (s *testDBSuite2) TestRenameTableWithLocked(c *C) { + defer config.RestoreFunc()() + config.UpdateGlobal(func(conf *config.Config) { + conf.EnableTableLock = true + }) + + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("create database renamedb") + tk.MustExec("create database renamedb2") + tk.MustExec("use renamedb") + tk.MustExec("DROP TABLE IF EXISTS t1;") + tk.MustExec("CREATE TABLE t1 (a int);") + + tk.MustExec("LOCK TABLES t1 WRITE;") + tk.MustGetErrCode("drop database renamedb2;", errno.ErrLockOrActiveTransaction) + tk.MustExec("RENAME TABLE t1 TO t2;") + tk.MustQuery("select * from renamedb.t2").Check(testkit.Rows()) + tk.MustExec("UNLOCK TABLES") + tk.MustExec("RENAME TABLE t2 TO t1;") + tk.MustQuery("select * from renamedb.t1").Check(testkit.Rows()) + + tk.MustExec("LOCK TABLES t1 READ;") + tk.MustGetErrCode("RENAME TABLE t1 TO t2;", errno.ErrTableNotLockedForWrite) + tk.MustExec("UNLOCK TABLES") + + tk.MustExec("drop database renamedb") +} + func (s *testDBSuite2) TestLockTables(c *C) { if israce.RaceEnabled { c.Skip("skip race test") @@ -7262,6 +7291,51 @@ func (s *testSerialDBSuite) TestJsonUnmarshalErrWhenPanicInCancellingPath(c *C) c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '0' for key 'cc'") } +// Close issue #24172. +// See https://github.com/pingcap/tidb/issues/24172 +func (s *testSerialDBSuite) TestCancelJobWriteConflict(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk1 := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(id int)") + + var cancelErr error + var rs []sqlexec.RecordSet + hook := &ddl.TestDDLCallback{} + d := s.dom.DDL() + originalHook := d.GetHook() + d.(ddl.DDLForTest).SetHook(hook) + defer d.(ddl.DDLForTest).SetHook(originalHook) + + // Test when cancelling cannot be retried and adding index succeeds. + hook.OnJobRunBeforeExported = func(job *model.Job) { + if job.Type == model.ActionAddIndex && job.State == model.JobStateRunning && job.SchemaState == model.StateWriteReorganization { + stmt := fmt.Sprintf("admin cancel ddl jobs %d", job.ID) + c.Assert(failpoint.Enable("github.com/pingcap/tidb/kv/mockCommitErrorInNewTxn", `return("no_retry")`), IsNil) + defer func() { c.Assert(failpoint.Disable("github.com/pingcap/tidb/kv/mockCommitErrorInNewTxn"), IsNil) }() + rs, cancelErr = tk1.Se.Execute(context.Background(), stmt) + } + } + tk.MustExec("alter table t add index (id)") + c.Assert(cancelErr.Error(), Equals, "mock commit error") + + // Test when cancelling is retried only once and adding index is cancelled in the end. + var jobID int64 + hook.OnJobRunBeforeExported = func(job *model.Job) { + if job.Type == model.ActionAddIndex && job.State == model.JobStateRunning && job.SchemaState == model.StateWriteReorganization { + jobID = job.ID + stmt := fmt.Sprintf("admin cancel ddl jobs %d", job.ID) + c.Assert(failpoint.Enable("github.com/pingcap/tidb/kv/mockCommitErrorInNewTxn", `return("retry_once")`), IsNil) + defer func() { c.Assert(failpoint.Disable("github.com/pingcap/tidb/kv/mockCommitErrorInNewTxn"), IsNil) }() + rs, cancelErr = tk1.Se.Execute(context.Background(), stmt) + } + } + tk.MustGetErrCode("alter table t add index (id)", errno.ErrCancelledDDLJob) + c.Assert(cancelErr, IsNil) + result := tk1.ResultSetToResultWithCtx(context.Background(), rs[0], Commentf("cancel ddl job fails")) + result.Check(testkit.Rows(fmt.Sprintf("%d successful", jobID))) +} + // For Close issue #24288 // see https://github.com/pingcap/tidb/issues/24288 func (s *testDBSuite8) TestDdlMaxLimitOfIdentifier(c *C) { @@ -7304,18 +7378,12 @@ func testDropIndexes(c *C, store kv.Storage, lease time.Duration, createSQL, dro tk.MustExec("insert into test_drop_indexes values (?, ?, ?)", i, i, i) } ctx := tk.Se.(sessionctx.Context) - t := testGetTableByName(c, ctx, "test_db", "test_drop_indexes") - var idxs []table.Index - for _, tidx := range t.Indices() { - for _, idxName := range idxNames { - if tidx.Meta().Name.L == idxName { - idxs = append(idxs, tidx) - break - } - } + idxIDs := make([]int64, 0, 3) + for _, idxName := range idxNames { + idxIDs = append(idxIDs, testGetIndexID(c, ctx, "test_db", "test_drop_indexes", idxName)) } - c.Assert(idxs, NotNil) - + jobIDExt, resetHook := setupJobIDExtCallback(ctx) + defer resetHook() testddlutil.SessionExecInGoroutine(store, dropIdxSQL, done) ticker := time.NewTicker(lease / 2) @@ -7339,23 +7407,8 @@ LOOP: num += step } } - - // Check in index, it must be no index in KV. - // Make sure there is no index with name c2_index、c3_index. - t = testGetTableByName(c, ctx, "test_db", "test_drop_indexes") - var nidxs []table.Index - for _, tidx := range t.Indices() { - for _, ids := range idxs { - if tidx.Meta().Name.L == ids.Meta().Name.L { - nidxs = append(nidxs, tidx) - } - } - } - c.Assert(nidxs, IsNil) - - for _, idx := range idxs { - idx := tables.NewIndex(t.Meta().ID, t.Meta(), idx.Meta()) - checkDelRangeDone(c, ctx, idx) + for _, idxID := range idxIDs { + checkDelRangeAdded(tk, jobIDExt.jobID, idxID) } } @@ -7589,7 +7642,7 @@ func (s *testDBSuite8) TestCreateTextAdjustLen(c *C) { tk.MustExec("drop table if exists t") } -func (s *testDBSuite2) TestCreateTables(c *C) { +func (s *testDBSuite2) TestBatchCreateTable(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") tk.MustExec("drop table if exists tables_1") @@ -7608,7 +7661,8 @@ func (s *testDBSuite2) TestCreateTables(c *C) { Name: model.NewCIStr("tables_3"), }) - err := d.BatchCreateTableWithInfo(tk.Se, model.NewCIStr("test"), infos, ddl.OnExistError, false) + // correct name + err := d.BatchCreateTableWithInfo(tk.Se, model.NewCIStr("test"), infos, ddl.OnExistError) c.Check(err, IsNil) tk.MustQuery("show tables like '%tables_%'").Check(testkit.Rows("tables_1", "tables_2", "tables_3")) @@ -7619,4 +7673,9 @@ func (s *testDBSuite2) TestCreateTables(c *C) { c.Assert(job[4], Equals, "public") // FIXME: we must change column type to give multiple id // c.Assert(job[6], Matches, "[^,]+,[^,]+,[^,]+") + + // duplicated name + infos[1].Name = model.NewCIStr("tables_1") + err = d.BatchCreateTableWithInfo(tk.Se, model.NewCIStr("test"), infos, ddl.OnExistError) + c.Check(err.Error(), Equals, "[schema:1050]Table 'test.tables_1' already exists") } diff --git a/ddl/ddl.go b/ddl/ddl.go index b6ea01e01caa9..fc783a3886552 100644 --- a/ddl/ddl.go +++ b/ddl/ddl.go @@ -153,8 +153,7 @@ type DDL interface { BatchCreateTableWithInfo(ctx sessionctx.Context, schema model.CIStr, info []*model.TableInfo, - onExist OnExist, - tryRetainID bool) error + onExist OnExist) error // Start campaigns the owner and starts workers. // ctxPool is used for the worker's delRangeManager and creates sessions. @@ -259,10 +258,10 @@ func asyncNotifyEvent(d *ddlCtx, e *util.Event) { case d.ddlEventCh <- e: return default: - logutil.BgLogger().Warn("[ddl] fail to notify DDL event", zap.String("event", e.String())) time.Sleep(time.Microsecond * 10) } } + logutil.BgLogger().Warn("[ddl] fail to notify DDL event", zap.String("event", e.String())) } } @@ -552,6 +551,10 @@ func (d *ddl) doDDLJob(ctx sessionctx.Context, job *model.Job) error { d.limitJobCh <- task // worker should restart to continue handling tasks in limitJobCh, and send back through task.err err := <-task.err + if err != nil { + // The transaction of enqueuing job is failed. + return errors.Trace(err) + } ctx.GetSessionVars().StmtCtx.IsDDLJobInQueue = true @@ -593,7 +596,8 @@ func (d *ddl) doDDLJob(ctx sessionctx.Context, job *model.Job) error { if err != nil { logutil.BgLogger().Error("[ddl] get history DDL job failed, check again", zap.Error(err)) continue - } else if historyJob == nil { + } + if historyJob == nil { logutil.BgLogger().Debug("[ddl] DDL job is not in history, maybe not run", zap.Int64("jobID", jobID)) continue } diff --git a/ddl/ddl_algorithm_test.go b/ddl/ddl_algorithm_serial_test.go similarity index 89% rename from ddl/ddl_algorithm_test.go rename to ddl/ddl_algorithm_serial_test.go index 444eddc41efe5..be9c87af3a163 100644 --- a/ddl/ddl_algorithm_test.go +++ b/ddl/ddl_algorithm_serial_test.go @@ -15,27 +15,25 @@ package ddl_test import ( - . "github.com/pingcap/check" + "testing" + "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/parser/ast" + "github.com/stretchr/testify/require" ) -var _ = Suite(&testDDLAlgorithmSuite{}) - var ( allAlgorithm = []ast.AlgorithmType{ast.AlgorithmTypeCopy, ast.AlgorithmTypeInplace, ast.AlgorithmTypeInstant} ) -type testDDLAlgorithmSuite struct{} - type testCase struct { alterSpec ast.AlterTableSpec supportedAlgorithm []ast.AlgorithmType expectedAlgorithm []ast.AlgorithmType } -func (s *testDDLAlgorithmSuite) TestFindAlterAlgorithm(c *C) { +func TestFindAlterAlgorithm(t *testing.T) { supportedInstantAlgorithms := []ast.AlgorithmType{ast.AlgorithmTypeDefault, ast.AlgorithmTypeCopy, ast.AlgorithmTypeInplace, ast.AlgorithmTypeInstant} expectedInstantAlgorithms := []ast.AlgorithmType{ast.AlgorithmTypeInstant, ast.AlgorithmTypeInstant, ast.AlgorithmTypeInstant, ast.AlgorithmTypeInstant} @@ -77,11 +75,11 @@ func (s *testDDLAlgorithmSuite) TestFindAlterAlgorithm(c *C) { } for _, tc := range testCases { - runAlterAlgorithmTestCases(c, &tc) + runAlterAlgorithmTestCases(t, &tc) } } -func runAlterAlgorithmTestCases(c *C, tc *testCase) { +func runAlterAlgorithmTestCases(t *testing.T, tc *testCase) { unsupported := make([]ast.AlgorithmType, 0, len(allAlgorithm)) Loop: for _, alm := range allAlgorithm { @@ -101,16 +99,16 @@ Loop: for i, alm := range tc.supportedAlgorithm { algorithm, err = ddl.ResolveAlterAlgorithm(&tc.alterSpec, alm) if err != nil { - c.Assert(ddl.ErrAlterOperationNotSupported.Equal(err), IsTrue) + require.True(t, ddl.ErrAlterOperationNotSupported.Equal(err)) } - c.Assert(algorithm, Equals, tc.expectedAlgorithm[i]) + require.Equal(t, tc.expectedAlgorithm[i], algorithm) } // Test unsupported. for _, alm := range unsupported { algorithm, err = ddl.ResolveAlterAlgorithm(&tc.alterSpec, alm) - c.Assert(algorithm, Equals, ast.AlgorithmTypeDefault) - c.Assert(err, NotNil, Commentf("Tp:%v, alm:%s", tc.alterSpec.Tp, alm)) - c.Assert(ddl.ErrAlterOperationNotSupported.Equal(err), IsTrue) + require.Equal(t, ast.AlgorithmTypeDefault, algorithm) + require.Error(t, err) + require.True(t, ddl.ErrAlterOperationNotSupported.Equal(err)) } } diff --git a/ddl/ddl_api.go b/ddl/ddl_api.go index acf16bca1b6fc..fb8e48ac3951d 100644 --- a/ddl/ddl_api.go +++ b/ddl/ddl_api.go @@ -33,7 +33,6 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/ddl/label" - "github.com/pingcap/tidb/ddl/placement" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" @@ -58,6 +57,7 @@ import ( "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/set" + "github.com/pingcap/tidb/util/sqlexec" "go.uber.org/zap" ) @@ -70,28 +70,13 @@ const ( blobMaxLength = 65535 mediumBlobMaxLength = 16777215 longBlobMaxLength = 4294967295 + // When setting the placement policy with "PLACEMENT POLICY `default`", + // it means to remove placement policy from the specified object. + defaultPlacementPolicyName = "default" ) -func (d *ddl) CreateSchema(ctx sessionctx.Context, schema model.CIStr, charsetInfo *ast.CharsetOpt, directPlacementOpts *model.PlacementSettings, placementPolicyRef *model.PolicyRefInfo) error { +func (d *ddl) CreateSchema(ctx sessionctx.Context, schema model.CIStr, charsetInfo *ast.CharsetOpt, directPlacementOpts *model.PlacementSettings, placementPolicyRef *model.PolicyRefInfo) (err error) { dbInfo := &model.DBInfo{Name: schema} - if directPlacementOpts != nil && placementPolicyRef != nil { - return errors.Trace(ErrPlacementPolicyWithDirectOption.GenWithStackByArgs(placementPolicyRef.Name)) - } - if directPlacementOpts != nil { - // check the direct placement option compatibility. - if err := checkPolicyValidation(directPlacementOpts); err != nil { - return errors.Trace(err) - } - dbInfo.DirectPlacementOpts = directPlacementOpts - } - if placementPolicyRef != nil { - // placement policy reference will override the direct placement options. - policy, ok := ctx.GetInfoSchema().(infoschema.InfoSchema).PolicyByName(placementPolicyRef.Name) - if !ok { - return errors.Trace(infoschema.ErrPlacementPolicyNotExists.GenWithStackByArgs(placementPolicyRef.Name)) - } - dbInfo.PlacementPolicyRef = &model.PolicyRefInfo{ID: policy.ID, Name: placementPolicyRef.Name} - } if charsetInfo != nil { chs, coll, err := ResolveCharsetCollation(ast.CharsetOpt{Chs: charsetInfo.Chs, Col: charsetInfo.Col}) if err != nil { @@ -102,6 +87,12 @@ func (d *ddl) CreateSchema(ctx sessionctx.Context, schema model.CIStr, charsetIn } else { dbInfo.Charset, dbInfo.Collate = charset.GetDefaultCharsetAndCollate() } + + dbInfo.PlacementPolicyRef, dbInfo.DirectPlacementOpts, err = checkAndNormalizePlacement(ctx, placementPolicyRef, directPlacementOpts, nil, nil) + if err != nil { + return errors.Trace(err) + } + return d.CreateSchemaWithInfo(ctx, dbInfo, OnExistError, false /*tryRetainID*/) } @@ -191,15 +182,9 @@ func (d *ddl) ModifySchemaDefaultPlacement(ctx sessionctx.Context, stmt *ast.Alt return infoschema.ErrDatabaseNotExists.GenWithStackByArgs(dbName.O) } - if directPlacementOpts != nil && placementPolicyRef != nil { - return errors.Trace(ErrPlacementPolicyWithDirectOption.GenWithStackByArgs(placementPolicyRef.Name)) - } - - if directPlacementOpts != nil { - // check the direct placement option compatibility. - if err := checkPolicyValidation(directPlacementOpts); err != nil { - return errors.Trace(err) - } + placementPolicyRef, directPlacementOpts, err = checkAndNormalizePlacement(ctx, placementPolicyRef, directPlacementOpts, dbInfo.PlacementPolicyRef, dbInfo.DirectPlacementOpts) + if err != nil { + return err } // Do the DDL job. @@ -215,12 +200,81 @@ func (d *ddl) ModifySchemaDefaultPlacement(ctx sessionctx.Context, stmt *ast.Alt return errors.Trace(err) } +func (d *ddl) AlterTablePlacement(ctx sessionctx.Context, ident ast.Ident, placementPolicyRef *model.PolicyRefInfo, directPlacementOpts *model.PlacementSettings) (err error) { + is := d.infoCache.GetLatest() + schema, ok := is.SchemaByName(ident.Schema) + if !ok { + return infoschema.ErrDatabaseNotExists.GenWithStackByArgs(ident.Schema) + } + + tb, err := is.TableByName(ident.Schema, ident.Name) + if err != nil { + return errors.Trace(infoschema.ErrTableNotExists.GenWithStackByArgs(ident.Schema, ident.Name)) + } + + if tb.Meta().TempTableType != model.TempTableNone { + return errors.Trace(ErrOptOnTemporaryTable.GenWithStackByArgs("placement")) + } + + placementPolicyRef, directPlacementOpts, err = checkAndNormalizePlacement(ctx, placementPolicyRef, directPlacementOpts, tb.Meta().PlacementPolicyRef, tb.Meta().DirectPlacementOpts) + if err != nil { + return err + } + + job := &model.Job{ + SchemaID: schema.ID, + TableID: tb.Meta().ID, + SchemaName: schema.Name.L, + Type: model.ActionAlterTablePlacement, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{placementPolicyRef, directPlacementOpts}, + } + + err = d.doDDLJob(ctx, job) + err = d.callHookOnChanged(err) + return errors.Trace(err) +} + +func checkAndNormalizePlacement(ctx sessionctx.Context, placementPolicyRef *model.PolicyRefInfo, directPlacementOpts *model.PlacementSettings, fallbackPlacementPolicyRef *model.PolicyRefInfo, fallbackDirectPlacementOpts *model.PlacementSettings) (*model.PolicyRefInfo, *model.PlacementSettings, error) { + if !ctx.GetSessionVars().EnableAlterPlacement && (placementPolicyRef != nil || directPlacementOpts != nil) { + return nil, nil, ErrPlacementDisabled + } + if placementPolicyRef != nil && directPlacementOpts != nil { + return nil, nil, errors.Trace(ErrPlacementPolicyWithDirectOption.GenWithStackByArgs(placementPolicyRef.Name)) + } + + if placementPolicyRef != nil && placementPolicyRef.Name.L == defaultPlacementPolicyName { + // When policy name is 'default', it means to remove the placement settings + placementPolicyRef = nil + } + + if placementPolicyRef != nil { + policy, ok := ctx.GetInfoSchema().(infoschema.InfoSchema).PolicyByName(placementPolicyRef.Name) + if !ok { + if !ctx.GetSessionVars().EnablePlacementChecks { + ctx.GetSessionVars().StmtCtx.AppendWarning(infoschema.ErrPlacementPolicyNotExists.GenWithStackByArgs(placementPolicyRef.Name)) + return fallbackPlacementPolicyRef, fallbackDirectPlacementOpts, nil + } + return nil, nil, errors.Trace(infoschema.ErrPlacementPolicyNotExists.GenWithStackByArgs(placementPolicyRef.Name)) + } + placementPolicyRef.ID = policy.ID + } + + if directPlacementOpts != nil { + // check the direct placement option compatibility. + if err := checkPolicyValidation(directPlacementOpts); err != nil { + return nil, nil, errors.Trace(err) + } + } + + return placementPolicyRef, directPlacementOpts, nil +} + func (d *ddl) AlterSchema(ctx sessionctx.Context, stmt *ast.AlterDatabaseStmt) (err error) { // Resolve target charset and collation from options. var ( toCharset, toCollate string isAlterCharsetAndCollate, isAlterPlacement bool - policyName model.CIStr placementPolicyRef *model.PolicyRefInfo directPlacementOpts *model.PlacementSettings ) @@ -256,16 +310,7 @@ func (d *ddl) AlterSchema(ctx sessionctx.Context, stmt *ast.AlterDatabaseStmt) ( } isAlterPlacement = true case ast.DatabaseOptionPlacementPolicy: - policyName = model.NewCIStr(val.Value) - if policyName.L == "default" { - placementPolicyRef = nil - } else { - policy, ok := ctx.GetInfoSchema().(infoschema.InfoSchema).PolicyByName(policyName) - if !ok { - return errors.Trace(infoschema.ErrPlacementPolicyNotExists.GenWithStackByArgs(policyName)) - } - placementPolicyRef = &model.PolicyRefInfo{ID: policy.ID, Name: policyName} - } + placementPolicyRef = &model.PolicyRefInfo{Name: model.NewCIStr(val.Value)} isAlterPlacement = true } } @@ -730,6 +775,7 @@ func columnDefToCol(ctx sessionctx.Context, offset int, colDef *ast.ColumnDef, o hasNullFlag = true case ast.ColumnOptionAutoIncrement: col.Flag |= mysql.AutoIncrementFlag + col.Flag |= mysql.NotNullFlag case ast.ColumnOptionPrimaryKey: // Check PriKeyFlag first to avoid extra duplicate constraints. if col.Flag&mysql.PriKeyFlag == 0 { @@ -954,11 +1000,13 @@ func getEnumDefaultValue(v types.Datum, col *table.Column) (string, error) { v.SetMysqlEnum(enumVal, col.Collate) return v.ToString() } - str, err := v.ToString() if err != nil { return "", errors.Trace(err) } + // Ref: https://dev.mysql.com/doc/refman/8.0/en/enum.html + // Trailing spaces are automatically deleted from ENUM member values in the table definition when a table is created. + str = strings.TrimRight(str, " ") enumVal, err := types.ParseEnumName(col.Elems, str, col.Collate) if err != nil { return "", ErrInvalidDefaultValue.GenWithStackByArgs(col.Name.O) @@ -1529,7 +1577,7 @@ func buildTableInfo( tbInfo.CommonHandleVersion = 1 } } - if tbInfo.PKIsHandle || tbInfo.IsCommonHandle { + if tbInfo.HasClusteredIndex() { // Primary key cannot be invisible. if constr.Option != nil && constr.Option.Visibility == ast.IndexVisibilityInvisible { return nil, ErrPKIndexCantBeInvisible @@ -1587,27 +1635,7 @@ func buildTableInfo( idxInfo.ID = allocateIndexID(tbInfo) tbInfo.Indices = append(tbInfo.Indices, idxInfo) } - if tbInfo.IsCommonHandle { - // Ensure tblInfo's each non-unique secondary-index's len + primary-key's len <= MaxIndexLength for clustered index table. - var pkLen, idxLen int - pkLen, err = indexColumnsLen(tbInfo.Columns, tables.FindPrimaryIndex(tbInfo).Columns) - if err != nil { - return - } - for _, idx := range tbInfo.Indices { - if idx.Unique { - // Only need check for non-unique secondary-index. - continue - } - idxLen, err = indexColumnsLen(tbInfo.Columns, idx.Columns) - if err != nil { - return - } - if pkLen+idxLen > config.GetGlobalConfig().MaxIndexLength { - return nil, errTooLongKey.GenWithStackByArgs(config.GetGlobalConfig().MaxIndexLength) - } - } - } + return } @@ -1693,7 +1721,7 @@ func checkTableInfoValidExtra(tbInfo *model.TableInfo) error { return err } -func checkTableInfoValidWithStmt(ctx sessionctx.Context, tbInfo *model.TableInfo, s *ast.CreateTableStmt) error { +func checkTableInfoValidWithStmt(ctx sessionctx.Context, tbInfo *model.TableInfo, s *ast.CreateTableStmt) (err error) { // All of these rely on the AST structure of expressions, which were // lost in the model (got serialized into strings). if err := checkGeneratedColumn(ctx, s.Cols); err != nil { @@ -1712,38 +1740,6 @@ func checkTableInfoValidWithStmt(ctx sessionctx.Context, tbInfo *model.TableInfo } } } - // Can not use both a placement policy and direct assignment. If you alter specify both in a CREATE TABLE or ALTER TABLE an error will be returned. - if tbInfo.DirectPlacementOpts != nil && tbInfo.PlacementPolicyRef != nil { - return errors.Trace(ErrPlacementPolicyWithDirectOption.GenWithStackByArgs(tbInfo.PlacementPolicyRef.Name)) - } - if tbInfo.DirectPlacementOpts != nil { - // check the direct placement option compatibility. - if err := checkPolicyValidation(tbInfo.DirectPlacementOpts); err != nil { - return errors.Trace(err) - } - } - if tbInfo.PlacementPolicyRef != nil { - // placement policy reference will override the direct placement options. - policy, ok := ctx.GetInfoSchema().(infoschema.InfoSchema).PolicyByName(tbInfo.PlacementPolicyRef.Name) - if !ok { - return errors.Trace(infoschema.ErrPlacementPolicyNotExists.GenWithStackByArgs(tbInfo.PlacementPolicyRef.Name)) - } - tbInfo.PlacementPolicyRef.ID = policy.ID - } - - if tbInfo.Partition != nil { - for _, partition := range tbInfo.Partition.Definitions { - if partition.PlacementPolicyRef == nil { - continue - } - - policy, ok := ctx.GetInfoSchema().(infoschema.InfoSchema).PolicyByName(partition.PlacementPolicyRef.Name) - if !ok { - return errors.Trace(infoschema.ErrPlacementPolicyNotExists.GenWithStackByArgs(partition.PlacementPolicyRef.Name)) - } - partition.PlacementPolicyRef.ID = policy.ID - } - } return nil } @@ -1912,7 +1908,7 @@ func buildTableInfoWithStmt(ctx sessionctx.Context, s *ast.CreateTableStmt, dbCh return nil, errors.Trace(err) } - if tbInfo.PlacementPolicyRef == nil && tbInfo.DirectPlacementOpts == nil { + if tbInfo.TempTableType == model.TempTableNone && tbInfo.PlacementPolicyRef == nil && tbInfo.DirectPlacementOpts == nil { // Set the defaults from Schema. Note: they are mutual exclusive! if placementPolicyRef != nil { tbInfo.PlacementPolicyRef = placementPolicyRef @@ -1920,6 +1916,19 @@ func buildTableInfoWithStmt(ctx sessionctx.Context, s *ast.CreateTableStmt, dbCh tbInfo.DirectPlacementOpts = directPlacementOpts } } + tbInfo.PlacementPolicyRef, tbInfo.DirectPlacementOpts, err = checkAndNormalizePlacement(ctx, tbInfo.PlacementPolicyRef, tbInfo.DirectPlacementOpts, placementPolicyRef, directPlacementOpts) + if err != nil { + return nil, errors.Trace(err) + } + + if tbInfo.Partition != nil { + for _, partition := range tbInfo.Partition.Definitions { + partition.PlacementPolicyRef, partition.DirectPlacementOpts, err = checkAndNormalizePlacement(ctx, partition.PlacementPolicyRef, partition.DirectPlacementOpts, nil, nil) + if err != nil { + return nil, errors.Trace(err) + } + } + } // After handleTableOptions, so the partitions can get defaults from Table level err = buildTablePartitionInfo(ctx, s.Partition, tbInfo) @@ -2048,14 +2057,23 @@ func (d *ddl) createTableWithInfoJob( } } - // FIXME: Implement `tryRetainID` - if err := d.assignTableID(tbInfo); err != nil { - return nil, errors.Trace(err) + _, exists := is.TableByID(tbInfo.ID) + if !tryRetainID || exists { + if err := d.assignTableID(tbInfo); err != nil { + return nil, errors.Trace(err) + } } if tbInfo.Partition != nil { - if err := d.assignPartitionIDs(tbInfo.Partition.Definitions); err != nil { - return nil, errors.Trace(err) + // NOTE: does not check if partition ID exists. + // it assumes that: + // 1. the final transaction will detect if there is a duplication + // 2. if table id is not duplicated, so do partition IDs + // since partition search is slow, it is avoided. + if !tryRetainID || exists { + if err := d.assignPartitionIDs(tbInfo.Partition.Definitions); err != nil { + return nil, errors.Trace(err) + } } } @@ -2143,16 +2161,54 @@ func (d *ddl) CreateTableWithInfo( func (d *ddl) BatchCreateTableWithInfo(ctx sessionctx.Context, dbName model.CIStr, infos []*model.TableInfo, - onExist OnExist, - tryRetainID bool) error { + onExist OnExist) error { jobs := &model.Job{ BinlogInfo: &model.HistoryInfo{}, - Args: make([]interface{}, 0, 2), } args := make([]*model.TableInfo, 0, len(infos)) - idx := make([]int, 0, len(infos)) - for i, info := range infos { - job, err := d.createTableWithInfoJob(ctx, dbName, info, onExist, tryRetainID) + + var err error + + // 1. counts how many IDs are there + // 2. if there is any duplicated table name + totalID := 0 + duplication := make(map[string]struct{}) + for _, info := range infos { + if _, ok := duplication[info.Name.L]; ok { + err = infoschema.ErrTableExists.FastGenByArgs("can not batch create tables with same name") + if onExist == OnExistIgnore && infoschema.ErrTableExists.Equal(err) { + ctx.GetSessionVars().StmtCtx.AppendNote(err) + err = nil + } + } + if err != nil { + return errors.Trace(err) + } + + duplication[info.Name.L] = struct{}{} + + totalID += 1 + parts := info.GetPartitionInfo() + if parts != nil { + totalID += len(parts.Definitions) + } + } + + genIDs, err := d.genGlobalIDs(totalID) + if err != nil { + return errors.Trace(err) + } + + for _, info := range infos { + info.ID, genIDs = genIDs[0], genIDs[1:] + + if parts := info.GetPartitionInfo(); parts != nil { + for i := range parts.Definitions { + parts.Definitions[i].ID, genIDs = genIDs[0], genIDs[1:] + } + } + + job, err := d.createTableWithInfoJob(ctx, dbName, info, onExist, true) if err != nil { return errors.Trace(err) } @@ -2168,9 +2224,6 @@ func (d *ddl) BatchCreateTableWithInfo(ctx sessionctx.Context, jobs.SchemaName = job.SchemaName } - // store index to table info - idx = append(idx, i) - // append table job args if len(job.Args) != 1 { return errors.Trace(fmt.Errorf("except only one argument")) @@ -2186,7 +2239,7 @@ func (d *ddl) BatchCreateTableWithInfo(ctx sessionctx.Context, } jobs.Args = append(jobs.Args, args) - err := d.doDDLJob(ctx, jobs) + err = d.doDDLJob(ctx, jobs) if err != nil { // table exists, but if_not_exists flags is true, so we ignore this error. if onExist == OnExistIgnore && infoschema.ErrTableExists.Equal(err) { @@ -2196,7 +2249,7 @@ func (d *ddl) BatchCreateTableWithInfo(ctx sessionctx.Context, return errors.Trace(d.callHookOnChanged(err)) } - for _, j := range idx { + for j := range infos { if err = d.createTableWithInfoPost(ctx, infos[j], jobs.SchemaID); err != nil { return errors.Trace(d.callHookOnChanged(err)) } @@ -2523,7 +2576,7 @@ func handleTableOptions(options []*ast.TableOption, tbInfo *model.TableInfo) err case ast.TableOptionCompression: tbInfo.Compression = op.StrValue case ast.TableOptionShardRowID: - if op.UintValue > 0 && (tbInfo.PKIsHandle || tbInfo.IsCommonHandle) { + if op.UintValue > 0 && tbInfo.HasClusteredIndex() { return errUnsupportedShardRowIDBits } tbInfo.ShardRowIDBits = op.UintValue @@ -2703,6 +2756,22 @@ func isSameTypeMultiSpecs(specs []*ast.AlterTableSpec) bool { return true } +func checkMultiSpecs(sctx sessionctx.Context, specs []*ast.AlterTableSpec) error { + if !sctx.GetSessionVars().EnableChangeMultiSchema { + if len(specs) > 1 { + return errRunMultiSchemaChanges + } + if len(specs) == 1 && len(specs[0].NewColumns) > 1 && specs[0].Tp == ast.AlterTableAddColumns { + return errRunMultiSchemaChanges + } + } else { + if len(specs) > 1 && !isSameTypeMultiSpecs(specs) { + return errRunMultiSchemaChanges + } + } + return nil +} + func (d *ddl) AlterTable(ctx context.Context, sctx sessionctx.Context, ident ast.Ident, specs []*ast.AlterTableSpec) (err error) { validSpecs, err := resolveAlterTableSpec(sctx, specs) if err != nil { @@ -2714,29 +2783,26 @@ func (d *ddl) AlterTable(ctx context.Context, sctx sessionctx.Context, ident ast return ErrWrongObject.GenWithStackByArgs(ident.Schema, ident.Name, "BASE TABLE") } + err = checkMultiSpecs(sctx, validSpecs) + if err != nil { + return err + } + if len(validSpecs) > 1 { - if !sctx.GetSessionVars().EnableChangeMultiSchema { + switch validSpecs[0].Tp { + case ast.AlterTableAddColumns: + err = d.AddColumns(sctx, ident, validSpecs) + case ast.AlterTableDropColumn: + err = d.DropColumns(sctx, ident, validSpecs) + case ast.AlterTableDropPrimaryKey, ast.AlterTableDropIndex: + err = d.DropIndexes(sctx, ident, validSpecs) + default: return errRunMultiSchemaChanges } - - if isSameTypeMultiSpecs(validSpecs) { - switch validSpecs[0].Tp { - case ast.AlterTableAddColumns: - err = d.AddColumns(sctx, ident, validSpecs) - case ast.AlterTableDropColumn: - err = d.DropColumns(sctx, ident, validSpecs) - case ast.AlterTableDropPrimaryKey, ast.AlterTableDropIndex: - err = d.DropIndexes(sctx, ident, validSpecs) - default: - return errRunMultiSchemaChanges - } - if err != nil { - return errors.Trace(err) - } - return nil + if err != nil { + return errors.Trace(err) } - - return errRunMultiSchemaChanges + return nil } for _, spec := range validSpecs { @@ -2833,16 +2899,12 @@ func (d *ddl) AlterTable(ctx context.Context, sctx sessionctx.Context, ident ast newIdent := ast.Ident{Schema: spec.NewTable.Schema, Name: spec.NewTable.Name} isAlterTable := true err = d.RenameTable(sctx, ident, newIdent, isAlterTable) - case ast.AlterTableAlterPartition: - if sctx.GetSessionVars().EnableAlterPlacement { - err = d.AlterTableAlterPartition(sctx, ident, spec) - } else { - err = errors.New("alter partition alter placement is experimental and it is switched off by tidb_enable_alter_placement") - } case ast.AlterTablePartition: // Prevent silent succeed if user executes ALTER TABLE x PARTITION BY ... err = errors.New("alter table partition is unsupported") case ast.AlterTableOption: + var placementSettings *model.PlacementSettings + var placementPolicyRef *model.PolicyRefInfo for i, opt := range spec.Options { switch opt.Tp { case ast.TableOptionShardRowID: @@ -2877,6 +2939,20 @@ func (d *ddl) AlterTable(ctx context.Context, sctx sessionctx.Context, ident ast needsOverwriteCols := needToOverwriteColCharset(spec.Options) err = d.AlterTableCharsetAndCollate(sctx, ident, toCharset, toCollate, needsOverwriteCols) handledCharsetOrCollate = true + case ast.TableOptionPlacementPolicy: + placementPolicyRef = &model.PolicyRefInfo{ + Name: model.NewCIStr(opt.StrValue), + } + case ast.TableOptionPlacementPrimaryRegion, ast.TableOptionPlacementRegions, + ast.TableOptionPlacementFollowerCount, ast.TableOptionPlacementVoterCount, + ast.TableOptionPlacementLearnerCount, ast.TableOptionPlacementSchedule, + ast.TableOptionPlacementConstraints, ast.TableOptionPlacementLeaderConstraints, + ast.TableOptionPlacementLearnerConstraints, ast.TableOptionPlacementFollowerConstraints, + ast.TableOptionPlacementVoterConstraints: + if placementSettings == nil { + placementSettings = &model.PlacementSettings{} + } + err = SetDirectPlacementOpt(placementSettings, ast.PlacementOptionType(opt.Tp), opt.StrValue, opt.UintValue) case ast.TableOptionEngine: default: err = errUnsupportedAlterTableOption @@ -2886,6 +2962,10 @@ func (d *ddl) AlterTable(ctx context.Context, sctx sessionctx.Context, ident ast return errors.Trace(err) } } + + if placementPolicyRef != nil || placementSettings != nil { + err = d.AlterTablePlacement(sctx, ident, placementPolicyRef, placementSettings) + } case ast.AlterTableSetTiFlashReplica: err = d.AlterTableSetTiFlashReplica(sctx, ident, spec.TiFlashReplica) case ast.AlterTableOrderByColumns: @@ -2910,6 +2990,10 @@ func (d *ddl) AlterTable(ctx context.Context, sctx sessionctx.Context, ident ast err = d.AlterTablePartitionAttributes(sctx, ident, spec) case ast.AlterTablePartitionOptions: err = d.AlterTablePartitionOptions(sctx, ident, spec) + case ast.AlterTableCache: + err = d.AlterTableCache(sctx, ident) + case ast.AlterTableNoCache: + err = d.AlterTableNoCache(sctx, ident) default: // Nothing to do now. } @@ -3000,7 +3084,7 @@ func (d *ddl) ShardRowID(ctx sessionctx.Context, tableIdent ast.Ident, uVal uint // Nothing need to do. return nil } - if uVal > 0 && (t.Meta().PKIsHandle || t.Meta().IsCommonHandle) { + if uVal > 0 && t.Meta().HasClusteredIndex() { return errUnsupportedShardRowIDBits } err = verifyNoOverflowShardBits(d.sessPool, t, uVal) @@ -4269,7 +4353,7 @@ func (d *ddl) getModifiableColumnJob(ctx context.Context, sctx sessionctx.Contex // We support modifying the type definitions of 'null' to 'not null' now. var modifyColumnTp byte if !mysql.HasNotNullFlag(col.Flag) && mysql.HasNotNullFlag(newCol.Flag) { - if err = checkForNullValue(ctx, sctx, true, ident.Schema, ident.Name, newCol.Name, col.ColumnInfo); err != nil { + if err = checkForNullValue(ctx, sctx, true, ident.Schema, ident.Name, newCol.ColumnInfo, col.ColumnInfo); err != nil { return nil, errors.Trace(err) } // `modifyColumnTp` indicates that there is a type modification. @@ -4300,6 +4384,7 @@ func (d *ddl) getModifiableColumnJob(ctx context.Context, sctx sessionctx.Contex SQLMode: sctx.GetSessionVars().SQLMode, Warnings: make(map[errors.ErrorID]*terror.Error), WarningsCount: make(map[errors.ErrorID]int64), + Location: sctx.GetSessionVars().Location(), }, Args: []interface{}{&newCol, originalColName, spec.Position, modifyColumnTp, newAutoRandBits}, } @@ -4310,9 +4395,6 @@ func (d *ddl) getModifiableColumnJob(ctx context.Context, sctx sessionctx.Contex // Index has a max-prefix-length constraint. eg: a varchar(100), index idx(a), modifying column a to a varchar(4000) // will cause index idx to break the max-prefix-length constraint. // -// For clustered index: -// Change column in pk need recheck all non-unique index, new pk len + index len < maxIndexLength. -// Change column in secondary only need related index, pk len + new index len < maxIndexLength. func checkColumnWithIndexConstraint(tbInfo *model.TableInfo, originalCol, newCol *model.ColumnInfo) error { columns := make([]*model.ColumnInfo, 0, len(tbInfo.Columns)) columns = append(columns, tbInfo.Columns...) @@ -4327,40 +4409,31 @@ func checkColumnWithIndexConstraint(tbInfo *model.TableInfo, originalCol, newCol } pkIndex := tables.FindPrimaryIndex(tbInfo) - var clusteredPkLen int - if tbInfo.IsCommonHandle { - var err error - clusteredPkLen, err = indexColumnsLen(columns, pkIndex.Columns) - if err != nil { - return err - } - } - checkOneIndex := func(indexInfo *model.IndexInfo, pkLenAppendToKey int, skipCheckIfNotModify bool) (modified bool, err error) { + checkOneIndex := func(indexInfo *model.IndexInfo) (err error) { + var modified bool for _, col := range indexInfo.Columns { if col.Name.L == originalCol.Name.L { modified = true break } } - if skipCheckIfNotModify && !modified { + if !modified { return } err = checkIndexInModifiableColumns(columns, indexInfo.Columns) if err != nil { return } - err = checkIndexPrefixLength(columns, indexInfo.Columns, pkLenAppendToKey) + err = checkIndexPrefixLength(columns, indexInfo.Columns) return } - // Check primary key first and get "does primary key's column has be modified?" info. - var ( - pkModified bool - err error - ) + // Check primary key first. + var err error + if pkIndex != nil { - pkModified, err = checkOneIndex(pkIndex, 0, true) + err = checkOneIndex(pkIndex) if err != nil { return err } @@ -4371,12 +4444,9 @@ func checkColumnWithIndexConstraint(tbInfo *model.TableInfo, originalCol, newCol if indexInfo.Primary { continue } - var pkLenAppendToKey int - if !indexInfo.Unique { - pkLenAppendToKey = clusteredPkLen - } - - _, err = checkOneIndex(indexInfo, pkLenAppendToKey, !tbInfo.IsCommonHandle || !pkModified) + // the second param should always be set to true, check index length only if it was modified + // checkOneIndex needs one param only. + err = checkOneIndex(indexInfo) if err != nil { return err } @@ -4554,6 +4624,7 @@ func (d *ddl) RenameColumn(ctx sessionctx.Context, ident ast.Ident, spec *ast.Al SQLMode: ctx.GetSessionVars().SQLMode, Warnings: make(map[errors.ErrorID]*terror.Error), WarningsCount: make(map[errors.ErrorID]int64), + Location: ctx.GetSessionVars().Location(), }, Args: []interface{}{&newCol, oldColName, spec.Position, 0}, } @@ -4759,6 +4830,14 @@ func (d *ddl) AlterTableSetTiFlashReplica(ctx sessionctx.Context, ident ast.Iden return ErrOptOnTemporaryTable.GenWithStackByArgs("set tiflash replica") } + // Ban setting replica count for tables which has charset not supported by TiFlash + for _, col := range tb.Cols() { + _, ok := charset.TiFlashSupportedCharsets[col.Charset] + if !ok { + return errAlterReplicaForUnsupportedCharsetTable.GenWithStackByArgs(col.Charset) + } + } + tbReplicaInfo := tb.Meta().TiFlashReplica if tbReplicaInfo != nil && tbReplicaInfo.Count == replicaInfo.Count && len(tbReplicaInfo.LocationLabels) == len(replicaInfo.Labels) { @@ -4982,6 +5061,9 @@ func (d *ddl) RenameIndex(ctx sessionctx.Context, ident ast.Ident, spec *ast.Alt if err != nil { return errors.Trace(infoschema.ErrTableNotExists.GenWithStackByArgs(ident.Schema, ident.Name)) } + if tb.Meta().TableCacheStatusType != model.TableCacheStatusDisable { + return errors.Trace(ErrOptOnCacheTable.GenWithStackByArgs("Rename Index")) + } duplicate, err := validateRenameIndex(spec.FromKey, spec.ToKey, tb.Meta()) if duplicate { return nil @@ -5354,6 +5436,7 @@ func (d *ddl) CreatePrimaryKey(ctx sessionctx.Context, ti ast.Ident, indexName m SQLMode: ctx.GetSessionVars().SQLMode, Warnings: make(map[errors.ErrorID]*terror.Error), WarningsCount: make(map[errors.ErrorID]int64), + Location: ctx.GetSessionVars().Location(), }, Args: []interface{}{unique, indexName, indexPartSpecifications, indexOption, sqlMode, nil, global}, Priority: ctx.GetSessionVars().DDLReorgPriority, @@ -5451,6 +5534,9 @@ func (d *ddl) CreateIndex(ctx sessionctx.Context, ti ast.Ident, keyType ast.Inde return errors.Trace(err) } + if t.Meta().TableCacheStatusType != model.TableCacheStatusDisable { + return errors.Trace(ErrOptOnCacheTable.GenWithStackByArgs("Create Index")) + } // Deal with anonymous index. if len(indexName.L) == 0 { colName := model.NewCIStr("expression_index") @@ -5505,22 +5591,6 @@ func (d *ddl) CreateIndex(ctx sessionctx.Context, ti ast.Ident, keyType ast.Inde return errors.Trace(err) } - if !unique && tblInfo.IsCommonHandle { - // Ensure new created non-unique secondary-index's len + primary-key's len <= MaxIndexLength in clustered index table. - var pkLen, idxLen int - pkLen, err = indexColumnsLen(tblInfo.Columns, tables.FindPrimaryIndex(tblInfo).Columns) - if err != nil { - return err - } - idxLen, err = indexColumnsLen(finalColumns, indexColumns) - if err != nil { - return err - } - if pkLen+idxLen > config.GetGlobalConfig().MaxIndexLength { - return errTooLongKey.GenWithStackByArgs(config.GetGlobalConfig().MaxIndexLength) - } - } - global := false if unique && tblInfo.GetPartitionInfo() != nil { ck, err := checkPartitionKeysConstraint(tblInfo.GetPartitionInfo(), indexColumns, tblInfo) @@ -5549,6 +5619,7 @@ func (d *ddl) CreateIndex(ctx sessionctx.Context, ti ast.Ident, keyType ast.Inde SQLMode: ctx.GetSessionVars().SQLMode, Warnings: make(map[errors.ErrorID]*terror.Error), WarningsCount: make(map[errors.ErrorID]int64), + Location: ctx.GetSessionVars().Location(), }, Args: []interface{}{unique, indexName, indexPartSpecifications, indexOption, hiddenCols, global}, Priority: ctx.GetSessionVars().DDLReorgPriority, @@ -5715,6 +5786,9 @@ func (d *ddl) DropIndex(ctx sessionctx.Context, ti ast.Ident, indexName model.CI if err != nil { return errors.Trace(infoschema.ErrTableNotExists.GenWithStackByArgs(ti.Schema, ti.Name)) } + if t.Meta().TableCacheStatusType != model.TableCacheStatusDisable { + return errors.Trace(ErrOptOnCacheTable.GenWithStackByArgs("Drop Index")) + } indexInfo := t.Meta().FindIndexByName(indexName.L) @@ -5768,6 +5842,9 @@ func (d *ddl) DropIndexes(ctx sessionctx.Context, ti ast.Ident, specs []*ast.Alt return err } + if t.Meta().TableCacheStatusType != model.TableCacheStatusDisable { + return errors.Trace(ErrOptOnCacheTable.GenWithStackByArgs("Drop Indexes")) + } indexNames := make([]model.CIStr, 0, len(specs)) ifExists := make([]bool, 0, len(specs)) for _, spec := range specs { @@ -6351,62 +6428,6 @@ func (d *ddl) AlterIndexVisibility(ctx sessionctx.Context, ident ast.Ident, inde return errors.Trace(err) } -func (d *ddl) AlterTableAlterPartition(ctx sessionctx.Context, ident ast.Ident, spec *ast.AlterTableSpec) (err error) { - schema, tb, err := d.getSchemaAndTableByIdent(ctx, ident) - if err != nil { - return errors.Trace(err) - } - - meta := tb.Meta() - if meta.Partition == nil { - return errors.Trace(ErrPartitionMgmtOnNonpartitioned) - } - - partitionID, err := tables.FindPartitionByName(meta, spec.PartitionNames[0].L) - if err != nil { - return errors.Trace(err) - } - - // TODO: the old placement rules should be migrated to new format. use the bundle from meta directly. - bundle := infoschema.GetBundle(d.infoCache.GetLatest(), []int64{partitionID, meta.ID, schema.ID}) - - err = bundle.ApplyPlacementSpec(spec.PlacementSpecs) - if err != nil { - var sb strings.Builder - sb.Reset() - - restoreCtx := format.NewRestoreCtx(format.RestoreStringSingleQuotes|format.RestoreKeyWordLowercase|format.RestoreNameBackQuotes, &sb) - - if e := spec.Restore(restoreCtx); e != nil { - return ErrInvalidPlacementSpec.GenWithStackByArgs("", err) - } - return ErrInvalidPlacementSpec.GenWithStackByArgs(sb.String(), err) - } - - err = bundle.Tidy() - if err != nil { - return errors.Trace(err) - } - bundle.Reset(placement.RuleIndexPartition, []int64{partitionID}) - - job := &model.Job{ - SchemaID: schema.ID, - TableID: meta.ID, - SchemaName: schema.Name.L, - Type: model.ActionAlterTableAlterPartition, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{partitionID, bundle}, - } - - err = d.doDDLJob(ctx, job) - if err != nil { - return errors.Trace(err) - } - - err = d.callHookOnChanged(err) - return errors.Trace(err) -} - func (d *ddl) AlterTableAttributes(ctx sessionctx.Context, ident ast.Ident, spec *ast.AlterTableSpec) error { schema, tb, err := d.getSchemaAndTableByIdent(ctx, ident) if err != nil { @@ -6494,20 +6515,6 @@ func (d *ddl) AlterTablePartitionAttributes(ctx sessionctx.Context, ident ast.Id } func (d *ddl) AlterTablePartitionOptions(ctx sessionctx.Context, ident ast.Ident, spec *ast.AlterTableSpec) (err error) { - schema, tb, err := d.getSchemaAndTableByIdent(ctx, ident) - if err != nil { - return errors.Trace(err) - } - - meta := tb.Meta() - if meta.Partition == nil { - return errors.Trace(ErrPartitionMgmtOnNonpartitioned) - } - - partitionID, err := tables.FindPartitionByName(meta, spec.PartitionNames[0].L) - if err != nil { - return errors.Trace(err) - } var policyRefInfo *model.PolicyRefInfo var placementSettings *model.PlacementSettings if spec.Options != nil { @@ -6536,29 +6543,42 @@ func (d *ddl) AlterTablePartitionOptions(ctx sessionctx.Context, ident ast.Ident } } - // Can not use both a placement policy and direct assignment. If you specify both in a CREATE TABLE or ALTER TABLE an error will be returned. - if placementSettings != nil && policyRefInfo != nil { - return errors.Trace(ErrPlacementPolicyWithDirectOption.GenWithStackByArgs(policyRefInfo.Name)) - } - if placementSettings != nil { - // check the direct placement option compatibility. - if err := checkPolicyValidation(placementSettings); err != nil { + if policyRefInfo != nil || placementSettings != nil { + err = d.AlterTablePartitionPlacement(ctx, ident, spec, policyRefInfo, placementSettings) + if err != nil { return errors.Trace(err) } } - if policyRefInfo != nil { - policy, ok := ctx.GetInfoSchema().(infoschema.InfoSchema).PolicyByName(policyRefInfo.Name) - if !ok { - return errors.Trace(infoschema.ErrPlacementPolicyNotExists.GenWithStackByArgs(policyRefInfo.Name)) - } - policyRefInfo.ID = policy.ID + + return nil +} + +func (d *ddl) AlterTablePartitionPlacement(ctx sessionctx.Context, tableIdent ast.Ident, spec *ast.AlterTableSpec, policyRefInfo *model.PolicyRefInfo, placementSettings *model.PlacementSettings) (err error) { + schema, tb, err := d.getSchemaAndTableByIdent(ctx, tableIdent) + if err != nil { + return errors.Trace(err) + } + + tblInfo := tb.Meta() + if tblInfo.Partition == nil { + return errors.Trace(ErrPartitionMgmtOnNonpartitioned) + } + + partitionID, err := tables.FindPartitionByName(tblInfo, spec.PartitionNames[0].L) + if err != nil { + return errors.Trace(err) + } + ptPlacementPolicyRef, ptPlacementSettings := tblInfo.Partition.GetPlacementByID(partitionID) + policyRefInfo, placementSettings, err = checkAndNormalizePlacement(ctx, policyRefInfo, placementSettings, ptPlacementPolicyRef, ptPlacementSettings) + if err != nil { + return errors.Trace(err) } job := &model.Job{ SchemaID: schema.ID, - TableID: meta.ID, + TableID: tblInfo.ID, SchemaName: schema.Name.L, - Type: model.ActionAlterTablePartitionPolicy, + Type: model.ActionAlterTablePartitionPlacement, BinlogInfo: &model.HistoryInfo{}, Args: []interface{}{partitionID, policyRefInfo, placementSettings}, } @@ -6582,7 +6602,7 @@ func buildPolicyInfo(name model.CIStr, options []*ast.PlacementOption) (*model.P func (d *ddl) CreatePlacementPolicy(ctx sessionctx.Context, stmt *ast.CreatePlacementPolicyStmt) (err error) { policyName := stmt.PolicyName - if policyName.L == "default" { + if policyName.L == defaultPlacementPolicyName { return errors.Trace(infoschema.ErrReservedSyntax.GenWithStackByArgs(policyName)) } is := d.GetInfoSchemaWithInterceptor(ctx) @@ -6678,3 +6698,69 @@ func (d *ddl) AlterPlacementPolicy(ctx sessionctx.Context, stmt *ast.AlterPlacem err = d.callHookOnChanged(err) return errors.Trace(err) } + +func (d *ddl) AlterTableCache(ctx sessionctx.Context, ti ast.Ident) (err error) { + schema, t, err := d.getSchemaAndTableByIdent(ctx, ti) + if err != nil { + return err + } + // if a table is already in cache state, return directly + if t.Meta().TableCacheStatusType == model.TableCacheStatusEnable { + return nil + } + + // forbit cache table in system database. + if util.IsMemOrSysDB(schema.Name.L) { + return errors.Trace(errUnsupportedAlterCacheForSysTable) + } else if t.Meta().TempTableType != model.TempTableNone { + return errors.Trace(ErrOptOnTemporaryTable.GenWithStackByArgs("alter temporary table cache")) + } + + if t.Meta().Partition != nil { + return errors.Trace(ErrOptOnCacheTable.GenWithStackByArgs("partition mode")) + } + + // Initialize the cached table meta lock info in `mysql.table_cache_meta`. + // The operation shouldn't fail in most cases, and if it does, return the error directly. + // This DML and the following DDL is not atomic, that's not a problem. + _, err = ctx.(sqlexec.SQLExecutor).ExecuteInternal(context.Background(), + "insert ignore into mysql.table_cache_meta values (%?, 'NONE', 0, 0)", t.Meta().ID) + if err != nil { + return errors.Trace(err) + } + + job := &model.Job{ + SchemaID: schema.ID, + SchemaName: schema.Name.L, + TableID: t.Meta().ID, + Type: model.ActionAlterCacheTable, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{}, + } + + err = d.doDDLJob(ctx, job) + return d.callHookOnChanged(err) +} + +func (d *ddl) AlterTableNoCache(ctx sessionctx.Context, ti ast.Ident) (err error) { + schema, t, err := d.getSchemaAndTableByIdent(ctx, ti) + if err != nil { + return err + } + // if a table is not in cache state, return directly + if t.Meta().TableCacheStatusType == model.TableCacheStatusDisable { + return nil + } + + job := &model.Job{ + SchemaID: schema.ID, + SchemaName: schema.Name.L, + TableID: t.Meta().ID, + Type: model.ActionAlterNoCacheTable, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{}, + } + + err = d.doDDLJob(ctx, job) + return d.callHookOnChanged(err) +} diff --git a/ddl/ddl_test.go b/ddl/ddl_test.go index 67ce58e091c2d..08eb1f2bbae1d 100644 --- a/ddl/ddl_test.go +++ b/ddl/ddl_test.go @@ -36,6 +36,7 @@ import ( "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/testleak" + "github.com/stretchr/testify/require" "github.com/tikv/client-go/v2/tikv" ) @@ -82,6 +83,7 @@ func TestT(t *testing.T) { conf.Log.SlowThreshold = 10000 conf.TiKVClient.AsyncCommit.SafeWindow = 0 conf.TiKVClient.AsyncCommit.AllowedClockDrift = 0 + conf.Experimental.AllowsExpressionIndex = true }) tikv.EnableFailpoints() @@ -95,16 +97,14 @@ func TestT(t *testing.T) { testleak.AfterTestT(t)() } -func testNewDDLAndStart(ctx context.Context, c *C, options ...Option) *ddl { +func testNewDDLAndStart(ctx context.Context, options ...Option) (*ddl, error) { // init infoCache and a stub infoSchema ic := infoschema.NewCache(2) ic.Insert(infoschema.MockInfoSchemaWithSchemaVer(nil, 0), 0) options = append(options, WithInfoCache(ic)) d := newDDL(ctx, options...) err := d.Start(nil) - c.Assert(err, IsNil) - - return d + return d, err } func testCreateStore(c *C, name string) kv.Storage { @@ -130,6 +130,17 @@ func getSchemaVer(c *C, ctx sessionctx.Context) int64 { return ver } +func getSchemaVerT(t *testing.T, ctx sessionctx.Context) int64 { + err := ctx.NewTxn(context.Background()) + require.NoError(t, err) + txn, err := ctx.Txn(true) + require.NoError(t, err) + m := meta.NewMeta(txn) + ver, err := m.GetSchemaVersion() + require.NoError(t, err) + return ver +} + type historyJobArgs struct { ver int64 db *model.DBInfo @@ -147,6 +158,16 @@ func checkEqualTable(c *C, t1, t2 *model.TableInfo) { c.Assert(t1.AutoIncID, DeepEquals, t2.AutoIncID) } +func checkEqualTableT(t *testing.T, t1, t2 *model.TableInfo) { + require.Equal(t, t1.ID, t2.ID) + require.Equal(t, t1.Name, t2.Name) + require.Equal(t, t1.Charset, t2.Charset) + require.Equal(t, t1.Collate, t2.Collate) + require.EqualValues(t, t1.PKIsHandle, t2.PKIsHandle) + require.EqualValues(t, t1.Comment, t2.Comment) + require.EqualValues(t, t1.AutoIncID, t2.AutoIncID) +} + func checkHistoryJob(c *C, job *model.Job) { c.Assert(job.State, Equals, model.JobStateSynced) } @@ -174,6 +195,29 @@ func checkHistoryJobArgs(c *C, ctx sessionctx.Context, id int64, args *historyJo } } +func checkHistoryJobArgsT(t *testing.T, ctx sessionctx.Context, id int64, args *historyJobArgs) { + txn, err := ctx.Txn(true) + require.NoError(t, err) + tt := meta.NewMeta(txn) + historyJob, err := tt.GetHistoryDDLJob(id) + require.NoError(t, err) + require.Greater(t, historyJob.BinlogInfo.FinishedTS, uint64(0)) + + if args.tbl != nil { + require.Equal(t, args.ver, historyJob.BinlogInfo.SchemaVersion) + checkEqualTableT(t, historyJob.BinlogInfo.TableInfo, args.tbl) + return + } + + // for handling schema job + require.Equal(t, args.ver, historyJob.BinlogInfo.SchemaVersion) + require.EqualValues(t, args.db, historyJob.BinlogInfo.DBInfo) + // only for creating schema job + if args.db != nil && len(args.tblIDs) == 0 { + return + } +} + func buildCreateIdxJob(dbInfo *model.DBInfo, tblInfo *model.TableInfo, unique bool, indexName string, colName string) *model.Job { return &model.Job{ SchemaID: dbInfo.ID, diff --git a/ddl/ddl_worker.go b/ddl/ddl_worker.go index 8ba14be34f56c..f102aad9c5502 100644 --- a/ddl/ddl_worker.go +++ b/ddl/ddl_worker.go @@ -301,6 +301,11 @@ func (d *ddl) addBatchDDLJobs(tasks []*limitJobTask) { return errors.Trace(err) } } + failpoint.Inject("mockAddBatchDDLJobsErr", func(val failpoint.Value) { + if val.(bool) { + failpoint.Return(errors.Errorf("mockAddBatchDDLJobsErr")) + } + }) return nil }) var jobs string @@ -310,7 +315,11 @@ func (d *ddl) addBatchDDLJobs(tasks []*limitJobTask) { metrics.DDLWorkerHistogram.WithLabelValues(metrics.WorkerAddDDLJob, task.job.Type.String(), metrics.RetLabel(err)).Observe(time.Since(startTime).Seconds()) } - logutil.BgLogger().Info("[ddl] add DDL jobs", zap.Int("batch count", len(tasks)), zap.String("jobs", jobs)) + if err != nil { + logutil.BgLogger().Warn("[ddl] add DDL jobs failed", zap.String("jobs", jobs), zap.Error(err)) + } else { + logutil.BgLogger().Info("[ddl] add DDL jobs", zap.Int("batch count", len(tasks)), zap.String("jobs", jobs)) + } } // getHistoryDDLJob gets a DDL job with job's ID from history queue. @@ -411,10 +420,6 @@ func (w *worker) finishDDLJob(t *meta.Meta, job *model.Job) (err error) { // it may be too large that it can not be added to the history queue, too // delete its arguments job.Args = nil - // truncate its query in case, it is too long - if len(job.Query) > 1000 { - job.Query = job.Query[:1000] - } } } if err != nil { @@ -623,9 +628,6 @@ func skipWriteBinlog(job *model.Job) bool { // it's used to update table's TiFlash replica available status. case model.ActionUpdateTiFlashReplicaStatus: return true - // It is done without modifying table info, bin log is not needed - case model.ActionAlterTableAlterPartition: - return true } return false @@ -832,8 +834,6 @@ func (w *worker) runDDLJob(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, ver, err = onCreateSequence(d, t, job) case model.ActionAlterIndexVisibility: ver, err = onAlterIndexVisibility(t, job) - case model.ActionAlterTableAlterPartition: - ver, err = onAlterTableAlterPartition(t, job) case model.ActionAlterSequence: ver, err = onAlterSequence(t, job) case model.ActionRenameTables: @@ -848,8 +848,14 @@ func (w *worker) runDDLJob(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, ver, err = onDropPlacementPolicy(d, t, job) case model.ActionAlterPlacementPolicy: ver, err = onAlterPlacementPolicy(d, t, job) - case model.ActionAlterTablePartitionPolicy: - ver, err = onAlterTablePartitionOptions(t, job) + case model.ActionAlterTablePartitionPlacement: + ver, err = onAlterTablePartitionPlacement(t, job) + case model.ActionAlterTablePlacement: + ver, err = onAlterTablePlacement(d, t, job) + case model.ActionAlterCacheTable: + ver, err = onAlterCacheTable(t, job) + case model.ActionAlterNoCacheTable: + ver, err = onAlterNoCacheTable(t, job) default: // Invalid job, cancel it. job.State = model.JobStateCancelled @@ -1085,15 +1091,6 @@ func updateSchemaVersion(t *meta.Meta, job *model.Job) (int64, error) { diff.AffectedOpts = buildPlacementAffects(oldIDs, oldIDs) } } - case model.ActionAlterTableAlterPartition: - diff.TableID = job.TableID - if len(job.CtxVars) > 0 { - diff.AffectedOpts = []*model.AffectedOption{ - { - TableID: job.CtxVars[0].(int64), - }, - } - } default: diff.TableID = job.TableID } diff --git a/ddl/ddl_worker_test.go b/ddl/ddl_worker_test.go index 90fb4604650a7..5321d12671b40 100644 --- a/ddl/ddl_worker_test.go +++ b/ddl/ddl_worker_test.go @@ -17,6 +17,7 @@ package ddl import ( "context" "sync" + "testing" "time" . "github.com/pingcap/check" @@ -36,6 +37,7 @@ import ( "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/sqlexec" "github.com/pingcap/tidb/util/testutil" + "github.com/stretchr/testify/require" ) var _ = Suite(&testDDLSuite{}) @@ -62,12 +64,12 @@ func (s *testDDLSuite) TestCheckOwner(c *C) { c.Assert(err, IsNil) }() - d1 := testNewDDLAndStart( + d1, err := testNewDDLAndStart( context.Background(), - c, WithStore(store), WithLease(testLease), ) + c.Assert(err, IsNil) defer func() { err := d1.Stop() c.Assert(err, IsNil) @@ -95,12 +97,12 @@ func (s *testDDLSuite) TestNotifyDDLJob(c *C) { } } - d := testNewDDLAndStart( + d, err := testNewDDLAndStart( context.Background(), - c, WithStore(store), WithLease(testLease), ) + c.Assert(err, IsNil) defer func() { err := d.Stop() c.Assert(err, IsNil) @@ -139,12 +141,12 @@ func (s *testDDLSuite) TestNotifyDDLJob(c *C) { // Test the notification mechanism that the owner and the server receiving the DDL request are not on the same TiDB. // And the etcd client is nil. - d1 := testNewDDLAndStart( + d1, err := testNewDDLAndStart( context.Background(), - c, WithStore(store), WithLease(testLease), ) + c.Assert(err, IsNil) defer func() { err := d1.Stop() c.Assert(err, IsNil) @@ -178,12 +180,12 @@ func (s *testDDLSerialSuite) testRunWorker(c *C) { }() RunWorker = false - d := testNewDDLAndStart( + d, err := testNewDDLAndStart( context.Background(), - c, WithStore(store), WithLease(testLease), ) + c.Assert(err, IsNil) testCheckOwner(c, d, false) defer func() { err := d.Stop() @@ -195,12 +197,12 @@ func (s *testDDLSerialSuite) testRunWorker(c *C) { c.Assert(worker, IsNil) // Make sure the DDL job can be done and exit that goroutine. RunWorker = true - d1 := testNewDDLAndStart( + d1, err := testNewDDLAndStart( context.Background(), - c, WithStore(store), WithLease(testLease), ) + c.Assert(err, IsNil) testCheckOwner(c, d1, true) defer func() { err := d1.Stop() @@ -217,12 +219,12 @@ func (s *testDDLSuite) TestSchemaError(c *C) { c.Assert(err, IsNil) }() - d := testNewDDLAndStart( + d, err := testNewDDLAndStart( context.Background(), - c, WithStore(store), WithLease(testLease), ) + c.Assert(err, IsNil) defer func() { err := d.Stop() c.Assert(err, IsNil) @@ -239,12 +241,12 @@ func (s *testDDLSuite) TestTableError(c *C) { c.Assert(err, IsNil) }() - d := testNewDDLAndStart( + d, err := testNewDDLAndStart( context.Background(), - c, WithStore(store), WithLease(testLease), ) + c.Assert(err, IsNil) defer func() { err := d.Stop() c.Assert(err, IsNil) @@ -254,14 +256,16 @@ func (s *testDDLSuite) TestTableError(c *C) { // Schema ID is wrong, so dropping table is failed. doDDLJobErr(c, -1, 1, model.ActionDropTable, nil, ctx, d) // Table ID is wrong, so dropping table is failed. - dbInfo := testSchemaInfo(c, d, "test_ddl") + dbInfo, err := testSchemaInfo(d, "test_ddl") + c.Assert(err, IsNil) testCreateSchema(c, testNewContext(d), d, dbInfo) job := doDDLJobErr(c, dbInfo.ID, -1, model.ActionDropTable, nil, ctx, d) // Table ID or schema ID is wrong, so getting table is failed. - tblInfo := testTableInfo(c, d, "t", 3) + tblInfo, err := testTableInfo(d, "t", 3) + c.Assert(err, IsNil) testCreateTable(c, ctx, d, dbInfo, tblInfo) - err := kv.RunInNewTxn(context.Background(), store, false, func(ctx context.Context, txn kv.Transaction) error { + err = kv.RunInNewTxn(context.Background(), store, false, func(ctx context.Context, txn kv.Transaction) error { job.SchemaID = -1 job.TableID = -1 t := meta.NewMeta(txn) @@ -291,18 +295,19 @@ func (s *testDDLSuite) TestViewError(c *C) { c.Assert(err, IsNil) }() - d := testNewDDLAndStart( + d, err := testNewDDLAndStart( context.Background(), - c, WithStore(store), WithLease(testLease), ) + c.Assert(err, IsNil) defer func() { err := d.Stop() c.Assert(err, IsNil) }() ctx := testNewContext(d) - dbInfo := testSchemaInfo(c, d, "test_ddl") + dbInfo, err := testSchemaInfo(d, "test_ddl") + c.Assert(err, IsNil) testCreateSchema(c, testNewContext(d), d, dbInfo) // Table ID or schema ID is wrong, so getting table is failed. @@ -325,12 +330,12 @@ func (s *testDDLSuite) TestInvalidDDLJob(c *C) { err := store.Close() c.Assert(err, IsNil) }() - d := testNewDDLAndStart( + d, err := testNewDDLAndStart( context.Background(), - c, WithStore(store), WithLease(testLease), ) + c.Assert(err, IsNil) defer func() { err := d.Stop() c.Assert(err, IsNil) @@ -344,7 +349,7 @@ func (s *testDDLSuite) TestInvalidDDLJob(c *C) { BinlogInfo: &model.HistoryInfo{}, Args: []interface{}{}, } - err := d.doDDLJob(ctx, job) + err = d.doDDLJob(ctx, job) c.Assert(err.Error(), Equals, "[ddl:8204]invalid ddl job type: none") } @@ -355,12 +360,12 @@ func (s *testDDLSuite) TestForeignKeyError(c *C) { c.Assert(err, IsNil) }() - d := testNewDDLAndStart( + d, err := testNewDDLAndStart( context.Background(), - c, WithStore(store), WithLease(testLease), ) + c.Assert(err, IsNil) defer func() { err := d.Stop() c.Assert(err, IsNil) @@ -370,8 +375,10 @@ func (s *testDDLSuite) TestForeignKeyError(c *C) { doDDLJobErr(c, -1, 1, model.ActionAddForeignKey, nil, ctx, d) doDDLJobErr(c, -1, 1, model.ActionDropForeignKey, nil, ctx, d) - dbInfo := testSchemaInfo(c, d, "test_ddl") - tblInfo := testTableInfo(c, d, "t", 3) + dbInfo, err := testSchemaInfo(d, "test_ddl") + c.Assert(err, IsNil) + tblInfo, err := testTableInfo(d, "t", 3) + c.Assert(err, IsNil) testCreateSchema(c, ctx, d, dbInfo) testCreateTable(c, ctx, d, dbInfo, tblInfo) doDDLJobErr(c, dbInfo.ID, tblInfo.ID, model.ActionDropForeignKey, []interface{}{model.NewCIStr("c1_foreign_key")}, ctx, d) @@ -384,12 +391,12 @@ func (s *testDDLSuite) TestIndexError(c *C) { c.Assert(err, IsNil) }() - d := testNewDDLAndStart( + d, err := testNewDDLAndStart( context.Background(), - c, WithStore(store), WithLease(testLease), ) + c.Assert(err, IsNil) defer func() { err := d.Stop() c.Assert(err, IsNil) @@ -400,8 +407,10 @@ func (s *testDDLSuite) TestIndexError(c *C) { doDDLJobErr(c, -1, 1, model.ActionAddIndex, nil, ctx, d) doDDLJobErr(c, -1, 1, model.ActionDropIndex, nil, ctx, d) - dbInfo := testSchemaInfo(c, d, "test_ddl") - tblInfo := testTableInfo(c, d, "t", 3) + dbInfo, err := testSchemaInfo(d, "test_ddl") + c.Assert(err, IsNil) + tblInfo, err := testTableInfo(d, "t", 3) + c.Assert(err, IsNil) testCreateSchema(c, ctx, d, dbInfo) testCreateTable(c, ctx, d, dbInfo, tblInfo) @@ -430,20 +439,22 @@ func (s *testDDLSuite) TestColumnError(c *C) { err := store.Close() c.Assert(err, IsNil) }() - d := testNewDDLAndStart( + d, err := testNewDDLAndStart( context.Background(), - c, WithStore(store), WithLease(testLease), ) + c.Assert(err, IsNil) defer func() { err := d.Stop() c.Assert(err, IsNil) }() ctx := testNewContext(d) - dbInfo := testSchemaInfo(c, d, "test_ddl") - tblInfo := testTableInfo(c, d, "t", 3) + dbInfo, err := testSchemaInfo(d, "test_ddl") + c.Assert(err, IsNil) + tblInfo, err := testTableInfo(d, "t", 3) + c.Assert(err, IsNil) testCreateSchema(c, ctx, d, dbInfo) testCreateTable(c, ctx, d, dbInfo, tblInfo) col := &model.ColumnInfo{ @@ -483,6 +494,32 @@ func (s *testDDLSuite) TestColumnError(c *C) { doDDLJobErr(c, dbInfo.ID, tblInfo.ID, model.ActionDropColumns, []interface{}{[]model.CIStr{model.NewCIStr("c5"), model.NewCIStr("c6")}, make([]bool, 2)}, ctx, d) } +func (s *testDDLSerialSuite) TestAddBatchJobError(c *C) { + store := testCreateStore(c, "test_add_batch_job_error") + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() + d, err := testNewDDLAndStart( + context.Background(), + WithStore(store), + WithLease(testLease), + ) + c.Assert(err, IsNil) + defer func() { + err := d.Stop() + c.Assert(err, IsNil) + }() + ctx := testNewContext(d) + c.Assert(failpoint.Enable("github.com/pingcap/tidb/ddl/mockAddBatchDDLJobsErr", `return(true)`), IsNil) + // Test the job runner should not hang forever. + job := &model.Job{SchemaID: 1, TableID: 1} + err = d.doDDLJob(ctx, job) + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "mockAddBatchDDLJobsErr") + c.Assert(failpoint.Disable("github.com/pingcap/tidb/ddl/mockAddBatchDDLJobsErr"), IsNil) +} + func testCheckOwner(c *C, d *ddl, expectedVal bool) { c.Assert(d.isOwner(), Equals, expectedVal) } @@ -504,6 +541,37 @@ func testCheckJobDone(c *C, d *ddl, job *model.Job, isAdd bool) { c.Assert(err, IsNil) } +func testCheckJobDoneT(t *testing.T, d *ddl, job *model.Job, isAdd bool) { + err := kv.RunInNewTxn(context.Background(), d.store, false, func(ctx context.Context, txn kv.Transaction) error { + tt := meta.NewMeta(txn) + historyJob, err := tt.GetHistoryDDLJob(job.ID) + require.NoError(t, err) + require.Equal(t, model.JobStateSynced, historyJob.State) + if isAdd { + require.Equal(t, model.StatePublic, historyJob.SchemaState) + } else { + require.Equal(t, model.StateNone, historyJob.SchemaState) + } + + return nil + }) + require.NoError(t, err) +} + +func testCheckJobCancelledT(t *testing.T, d *ddl, job *model.Job, state *model.SchemaState) { + err := kv.RunInNewTxn(context.Background(), d.store, false, func(ctx context.Context, txn kv.Transaction) error { + tt := meta.NewMeta(txn) + historyJob, err := tt.GetHistoryDDLJob(job.ID) + require.NoError(t, err) + require.True(t, historyJob.IsCancelled() || historyJob.IsRollbackDone(), "history job %s", historyJob) + if state != nil { + require.Equal(t, *state, historyJob.SchemaState) + } + return nil + }) + require.NoError(t, err) +} + func testCheckJobCancelled(c *C, d *ddl, job *model.Job, state *model.SchemaState) { err := kv.RunInNewTxn(context.Background(), d.store, false, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) @@ -535,6 +603,23 @@ func doDDLJobErrWithSchemaState(ctx sessionctx.Context, d *ddl, c *C, schemaID, return job } +func doDDLJobErrWithSchemaStateT(ctx sessionctx.Context, d *ddl, t *testing.T, schemaID, tableID int64, tp model.ActionType, + args []interface{}, state *model.SchemaState) *model.Job { + job := &model.Job{ + SchemaID: schemaID, + TableID: tableID, + Type: tp, + Args: args, + BinlogInfo: &model.HistoryInfo{}, + } + err := d.doDDLJob(ctx, job) + // TODO: Add the detail error check. + require.Error(t, err, "err:%v", err) + testCheckJobCancelledT(t, d, job, state) + + return job +} + func doDDLJobSuccess(ctx sessionctx.Context, d *ddl, c *C, schemaID, tableID int64, tp model.ActionType, args []interface{}) { job := &model.Job{ @@ -553,6 +638,11 @@ func doDDLJobErr(c *C, schemaID, tableID int64, tp model.ActionType, args []inte return doDDLJobErrWithSchemaState(ctx, d, c, schemaID, tableID, tp, args, nil) } +func doDDLJobErrT(t *testing.T, schemaID, tableID int64, tp model.ActionType, args []interface{}, + ctx sessionctx.Context, d *ddl) *model.Job { + return doDDLJobErrWithSchemaStateT(ctx, d, t, schemaID, tableID, tp, args, nil) +} + func checkCancelState(txn kv.Transaction, job *model.Job, test *testCancelJob) error { var checkErr error addIndexFirstReorg := (test.act == model.ActionAddIndex || test.act == model.ActionAddPrimaryKey) && @@ -729,26 +819,28 @@ func (s *testDDLSerialSuite) TestCancelJob(c *C) { err := store.Close() c.Assert(err, IsNil) }() - d := testNewDDLAndStart( + d, err := testNewDDLAndStart( context.Background(), - c, WithStore(store), WithLease(testLease), ) + c.Assert(err, IsNil) defer func() { err := d.Stop() c.Assert(err, IsNil) }() - dbInfo := testSchemaInfo(c, d, "test_cancel_job") + dbInfo, err := testSchemaInfo(d, "test_cancel_job") + c.Assert(err, IsNil) testCreateSchema(c, testNewContext(d), d, dbInfo) // create a partition table. partitionTblInfo := testTableInfoWithPartition(c, d, "t_partition", 5) // Skip using sessPool. Make sure adding primary key can be successful. partitionTblInfo.Columns[0].Flag |= mysql.NotNullFlag // create table t (c1 int, c2 int, c3 int, c4 int, c5 int); - tblInfo := testTableInfo(c, d, "t", 5) + tblInfo, err := testTableInfo(d, "t", 5) + c.Assert(err, IsNil) ctx := testNewContext(d) - err := ctx.NewTxn(context.Background()) + err = ctx.NewTxn(context.Background()) c.Assert(err, IsNil) err = ctx.GetSessionVars().SetSystemVar("tidb_enable_exchange_partition", "1") c.Assert(err, IsNil) @@ -891,14 +983,16 @@ func (s *testDDLSerialSuite) TestCancelJob(c *C) { s.checkAddColumns(c, d, dbInfo.ID, tblInfo.ID, []string{addingColName}, true) // for create table - tblInfo1 := testTableInfo(c, d, "t1", 2) + tblInfo1, err := testTableInfo(d, "t1", 2) + c.Assert(err, IsNil) updateTest(&tests[8]) doDDLJobErrWithSchemaState(ctx, d, c, dbInfo.ID, tblInfo1.ID, model.ActionCreateTable, []interface{}{tblInfo1}, &cancelState) c.Check(checkErr, IsNil) testCheckTableState(c, d, dbInfo, tblInfo1, model.StateNone) // for create database - dbInfo1 := testSchemaInfo(c, d, "test_cancel_job1") + dbInfo1, err := testSchemaInfo(d, "test_cancel_job1") + c.Assert(err, IsNil) updateTest(&tests[9]) doDDLJobErrWithSchemaState(ctx, d, c, dbInfo1.ID, 0, model.ActionCreateSchema, []interface{}{dbInfo1}, &cancelState) c.Check(checkErr, IsNil) @@ -1192,7 +1286,8 @@ func (s *testDDLSerialSuite) TestCancelJob(c *C) { // test exchange partition failed caused by canceled pt := testTableInfoWithPartition(c, d, "pt", 5) - nt := testTableInfo(c, d, "nt", 5) + nt, err := testTableInfo(d, "nt", 5) + c.Assert(err, IsNil) testCreateTable(c, ctx, d, dbInfo, pt) testCreateTable(c, ctx, d, dbInfo, nt) @@ -1438,18 +1533,18 @@ func (s *testDDLSuite) TestParallelDDL(c *C) { err := store.Close() c.Assert(err, IsNil) }() - d := testNewDDLAndStart( + d, err := testNewDDLAndStart( context.Background(), - c, WithStore(store), WithLease(testLease), ) + c.Assert(err, IsNil) defer func() { err := d.Stop() c.Assert(err, IsNil) }() ctx := testNewContext(d) - err := ctx.NewTxn(context.Background()) + err = ctx.NewTxn(context.Background()) c.Assert(err, IsNil) /* build structure: @@ -1469,10 +1564,12 @@ func (s *testDDLSuite) TestParallelDDL(c *C) { } */ // create database test_parallel_ddl_1; - dbInfo1 := testSchemaInfo(c, d, "test_parallel_ddl_1") + dbInfo1, err := testSchemaInfo(d, "test_parallel_ddl_1") + c.Assert(err, IsNil) testCreateSchema(c, ctx, d, dbInfo1) // create table t1 (c1 int, c2 int); - tblInfo1 := testTableInfo(c, d, "t1", 2) + tblInfo1, err := testTableInfo(d, "t1", 2) + c.Assert(err, IsNil) testCreateTable(c, ctx, d, dbInfo1, tblInfo1) // insert t1 values (10, 10), (20, 20) tbl1 := testGetTable(c, d, dbInfo1.ID, tblInfo1.ID) @@ -1481,7 +1578,8 @@ func (s *testDDLSuite) TestParallelDDL(c *C) { _, err = tbl1.AddRecord(ctx, types.MakeDatums(2, 2)) c.Assert(err, IsNil) // create table t2 (c1 int primary key, c2 int, c3 int); - tblInfo2 := testTableInfo(c, d, "t2", 3) + tblInfo2, err := testTableInfo(d, "t2", 3) + c.Assert(err, IsNil) tblInfo2.Columns[0].Flag = mysql.PriKeyFlag | mysql.NotNullFlag tblInfo2.PKIsHandle = true testCreateTable(c, ctx, d, dbInfo1, tblInfo2) @@ -1494,10 +1592,12 @@ func (s *testDDLSuite) TestParallelDDL(c *C) { _, err = tbl2.AddRecord(ctx, types.MakeDatums(3, 3, 3)) c.Assert(err, IsNil) // create database test_parallel_ddl_2; - dbInfo2 := testSchemaInfo(c, d, "test_parallel_ddl_2") + dbInfo2, err := testSchemaInfo(d, "test_parallel_ddl_2") + c.Assert(err, IsNil) testCreateSchema(c, ctx, d, dbInfo2) // create table t3 (c1 int, c2 int, c3 int, c4 int); - tblInfo3 := testTableInfo(c, d, "t3", 4) + tblInfo3, err := testTableInfo(d, "t3", 4) + c.Assert(err, IsNil) testCreateTable(c, ctx, d, dbInfo2, tblInfo3) // insert t3 values (11, 22, 33, 44) tbl3 := testGetTable(c, d, dbInfo2.ID, tblInfo3.ID) @@ -1643,12 +1743,12 @@ func (s *testDDLSuite) TestDDLPackageExecuteSQL(c *C) { c.Assert(err, IsNil) }() - d := testNewDDLAndStart( + d, err := testNewDDLAndStart( context.Background(), - c, WithStore(store), WithLease(testLease), ) + c.Assert(err, IsNil) testCheckOwner(c, d, true) defer func() { err := d.Stop() diff --git a/ddl/error.go b/ddl/error.go index bd3b118a235d5..f95b5baf0e4a9 100644 --- a/ddl/error.go +++ b/ddl/error.go @@ -50,6 +50,7 @@ var ( errUnsupportedAlterTableWithoutValidation = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message("ALTER TABLE WITHOUT VALIDATION is currently unsupported", nil)) errUnsupportedAlterTableOption = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message("This type of ALTER TABLE is currently unsupported", nil)) errUnsupportedAlterReplicaForSysTable = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message("ALTER table replica for tables in system database is currently unsupported", nil)) + errUnsupportedAlterCacheForSysTable = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message("ALTER table cache for tables in system database is currently unsupported", nil)) errBlobKeyWithoutLength = dbterror.ClassDDL.NewStd(mysql.ErrBlobKeyWithoutLength) errKeyPart0 = dbterror.ClassDDL.NewStd(mysql.ErrKeyPart0) errIncorrectPrefixKey = dbterror.ClassDDL.NewStd(mysql.ErrWrongSubKey) @@ -64,6 +65,8 @@ var ( errFkColumnCannotDrop = dbterror.ClassDDL.NewStd(mysql.ErrFkColumnCannotDrop) errFKIncompatibleColumns = dbterror.ClassDDL.NewStd(mysql.ErrFKIncompatibleColumns) + errAlterReplicaForUnsupportedCharsetTable = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message(fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation].Raw, "ALTER table replica for table contain %s charset"), nil)) + errOnlyOnRangeListPartition = dbterror.ClassDDL.NewStd(mysql.ErrOnlyOnRangeListPartition) // errWrongKeyColumn is for table column cannot be indexed. errWrongKeyColumn = dbterror.ClassDDL.NewStd(mysql.ErrWrongKeyColumn) @@ -143,6 +146,8 @@ var ( ErrWrongTableName = dbterror.ClassDDL.NewStd(mysql.ErrWrongTableName) // ErrWrongColumnName returns for wrong column name. ErrWrongColumnName = dbterror.ClassDDL.NewStd(mysql.ErrWrongColumnName) + // ErrWrongUsage returns for wrong ddl syntax usage. + ErrWrongUsage = dbterror.ClassDDL.NewStd(mysql.ErrWrongUsage) // ErrInvalidGroupFuncUse returns for using invalid group functions. ErrInvalidGroupFuncUse = dbterror.ClassDDL.NewStd(mysql.ErrInvalidGroupFuncUse) // ErrTableMustHaveColumns returns for missing column when creating a table. @@ -235,6 +240,8 @@ var ( ErrColumnTypeUnsupportedNextValue = dbterror.ClassDDL.NewStd(mysql.ErrColumnTypeUnsupportedNextValue) // ErrAddColumnWithSequenceAsDefault is returned when the new added column with sequence's nextval as it's default value. ErrAddColumnWithSequenceAsDefault = dbterror.ClassDDL.NewStd(mysql.ErrAddColumnWithSequenceAsDefault) + // ErrUnsupportedExpressionIndex is returned when create an expression index without allow-expression-index. + ErrUnsupportedExpressionIndex = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message(fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation].Raw, "creating expression index containing unsafe functions without allow-expression-index in config"), nil)) // ErrPartitionExchangePartTable is returned when exchange table partition with another table is partitioned. ErrPartitionExchangePartTable = dbterror.ClassDDL.NewStd(mysql.ErrPartitionExchangePartTable) // ErrTablesDifferentMetadata is returned when exchanges tables is not compatible. @@ -253,9 +260,6 @@ var ( // ErrTableOptionInsertMethodUnsupported is returned when create/alter table with insert method option. ErrTableOptionInsertMethodUnsupported = dbterror.ClassDDL.NewStd(mysql.ErrTableOptionInsertMethodUnsupported) - // ErrInvalidPlacementSpec is returned when add/alter an invalid placement rule - ErrInvalidPlacementSpec = dbterror.ClassDDL.NewStd(mysql.ErrInvalidPlacementSpec) - // ErrInvalidPlacementPolicyCheck is returned when txn_scope and commit data changing do not meet the placement policy ErrInvalidPlacementPolicyCheck = dbterror.ClassDDL.NewStd(mysql.ErrPlacementPolicyCheck) @@ -265,6 +269,9 @@ var ( // ErrPlacementPolicyInUse is returned when placement policy is in use in drop/alter. ErrPlacementPolicyInUse = dbterror.ClassDDL.NewStd(mysql.ErrPlacementPolicyInUse) + // ErrPlacementDisabled is returned when tidb_enable_alter_placement = 0 + ErrPlacementDisabled = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message("Alter Placement Rule is disabled, please set 'tidb_enable_alter_placement' if you need to enable it", nil)) + // ErrMultipleDefConstInListPart returns multiple definition of same constant in list partitioning. ErrMultipleDefConstInListPart = dbterror.ClassDDL.NewStd(mysql.ErrMultipleDefConstInListPart) @@ -288,7 +295,8 @@ var ( // ErrOptOnTemporaryTable returns when exec unsupported opt at temporary mode ErrOptOnTemporaryTable = dbterror.ClassDDL.NewStd(mysql.ErrOptOnTemporaryTable) - + // ErrOptOnCacheTable returns when exec unsupported opt at cache mode + ErrOptOnCacheTable = dbterror.ClassDDL.NewStd(mysql.ErrOptOnCacheTable) errUnsupportedOnCommitPreserve = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message("TiDB doesn't support ON COMMIT PRESERVE ROWS for now", nil)) errUnsupportedClusteredSecondaryKey = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message("CLUSTERED/NONCLUSTERED keyword is only supported for primary key", nil)) diff --git a/ddl/fail_test.go b/ddl/fail_test.go index ef671a45bf9f0..387691c30950c 100644 --- a/ddl/fail_test.go +++ b/ddl/fail_test.go @@ -25,20 +25,21 @@ import ( ) func (s *testColumnChangeSuite) TestFailBeforeDecodeArgs(c *C) { - d := testNewDDLAndStart( + d, err := testNewDDLAndStart( context.Background(), - c, WithStore(s.store), WithLease(testLease), ) + c.Assert(err, IsNil) defer func() { err := d.Stop() c.Assert(err, IsNil) }() // create table t_fail (c1 int, c2 int); - tblInfo := testTableInfo(c, d, "t_fail", 2) + tblInfo, err := testTableInfo(d, "t_fail", 2) + c.Assert(err, IsNil) ctx := testNewContext(d) - err := ctx.NewTxn(context.Background()) + err = ctx.NewTxn(context.Background()) c.Assert(err, IsNil) testCreateTable(c, ctx, d, s.dbInfo, tblInfo) // insert t_fail values (1, 2); diff --git a/ddl/failtest/fail_db_serial_test.go b/ddl/failtest/fail_db_serial_test.go index 9b5e70f12ca57..1c509ee121e68 100644 --- a/ddl/failtest/fail_db_serial_test.go +++ b/ddl/failtest/fail_db_serial_test.go @@ -568,6 +568,6 @@ func TestPartitionAddPanic(t *testing.T) { _, err := tk.Exec(`alter table t add partition (partition p1 values less than (20));`) require.Error(t, err) result := tk.MustQuery("show create table t").Rows()[0][1] - require.Regexp(t, `(?s).*PARTITION .p0. VALUES LESS THAN \(10\).*`, result) - require.NotRegexp(t, `(?s).*PARTITION .p0. VALUES LESS THAN \(20\).*`, result) + require.Regexp(t, `PARTITION .p0. VALUES LESS THAN \(10\)`, result) + require.NotRegexp(t, `PARTITION .p0. VALUES LESS THAN \(20\)`, result) } diff --git a/ddl/foreign_key_test.go b/ddl/foreign_key_test.go index 699205380e53d..0ecab739fb184 100644 --- a/ddl/foreign_key_test.go +++ b/ddl/foreign_key_test.go @@ -112,24 +112,26 @@ func getForeignKey(t table.Table, name string) *model.FKInfo { } func (s *testForeignKeySuite) TestForeignKey(c *C) { - d := testNewDDLAndStart( + d, err := testNewDDLAndStart( context.Background(), - c, WithStore(s.store), WithLease(testLease), ) + c.Assert(err, IsNil) defer func() { err := d.Stop() c.Assert(err, IsNil) }() s.d = d - s.dbInfo = testSchemaInfo(c, d, "test_foreign") + s.dbInfo, err = testSchemaInfo(d, "test_foreign") + c.Assert(err, IsNil) ctx := testNewContext(d) s.ctx = ctx testCreateSchema(c, ctx, d, s.dbInfo) - tblInfo := testTableInfo(c, d, "t", 3) + tblInfo, err := testTableInfo(d, "t", 3) + c.Assert(err, IsNil) - err := ctx.NewTxn(context.Background()) + err = ctx.NewTxn(context.Background()) c.Assert(err, IsNil) testCreateTable(c, ctx, d, s.dbInfo, tblInfo) diff --git a/ddl/generated_column.go b/ddl/generated_column.go index 166883c9f75d8..232828a0c107e 100644 --- a/ddl/generated_column.go +++ b/ddl/generated_column.go @@ -18,11 +18,13 @@ import ( "fmt" "github.com/pingcap/errors" + "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/table" ) @@ -265,11 +267,12 @@ func checkModifyGeneratedColumn(sctx sessionctx.Context, tbl table.Table, oldCol } type illegalFunctionChecker struct { - hasIllegalFunc bool - hasAggFunc bool - hasRowVal bool // hasRowVal checks whether the functional index refers to a row value - hasWindowFunc bool - otherErr error + hasIllegalFunc bool + hasAggFunc bool + hasRowVal bool // hasRowVal checks whether the functional index refers to a row value + hasWindowFunc bool + hasNotGAFunc4ExprIdx bool + otherErr error } func (c *illegalFunctionChecker) Enter(inNode ast.Node) (outNode ast.Node, skipChildren bool) { @@ -286,6 +289,10 @@ func (c *illegalFunctionChecker) Enter(inNode ast.Node) (outNode ast.Node, skipC c.otherErr = err return inNode, true } + _, isFuncGA := variable.GAFunction4ExpressionIndex[node.FnName.L] + if !isFuncGA { + c.hasNotGAFunc4ExprIdx = true + } case *ast.SubqueryExpr, *ast.ValuesExpr, *ast.VariableExpr: // Subquery & `values(x)` & variable is not allowed c.hasIllegalFunc = true @@ -344,6 +351,9 @@ func checkIllegalFn4Generated(name string, genType int, expr ast.ExprNode) error if c.otherErr != nil { return c.otherErr } + if genType == typeIndex && c.hasNotGAFunc4ExprIdx && !config.GetGlobalConfig().Experimental.AllowsExpressionIndex { + return ErrUnsupportedExpressionIndex + } return nil } diff --git a/ddl/index.go b/ddl/index.go index 081f80e6b71bd..ffa9d069d4c09 100644 --- a/ddl/index.go +++ b/ddl/index.go @@ -110,12 +110,12 @@ func checkPKOnGeneratedColumn(tblInfo *model.TableInfo, indexPartSpecifications return lastCol, nil } -func checkIndexPrefixLength(columns []*model.ColumnInfo, idxColumns []*model.IndexColumn, pkLenAppendToKey int) error { +func checkIndexPrefixLength(columns []*model.ColumnInfo, idxColumns []*model.IndexColumn) error { idxLen, err := indexColumnsLen(columns, idxColumns) if err != nil { return err } - if idxLen+pkLenAppendToKey > config.GetGlobalConfig().MaxIndexLength { + if idxLen > config.GetGlobalConfig().MaxIndexLength { return errTooLongKey.GenWithStackByArgs(config.GetGlobalConfig().MaxIndexLength) } return nil @@ -304,6 +304,9 @@ func onRenameIndex(t *meta.Meta, job *model.Job) (ver int64, _ error) { if err != nil || tblInfo == nil { return ver, errors.Trace(err) } + if tblInfo.TableCacheStatusType != model.TableCacheStatusDisable { + return ver, errors.Trace(ErrOptOnCacheTable.GenWithStackByArgs("Rename Index")) + } idx := tblInfo.FindIndexByName(from.L) idx.Name = to @@ -368,7 +371,7 @@ func checkPrimaryKeyNotNull(w *worker, sqlMode mysql.SQLMode, t *meta.Meta, job return nil, nil } - err = modifyColsFromNull2NotNull(w, dbInfo, tblInfo, nullCols, model.NewCIStr(""), false) + err = modifyColsFromNull2NotNull(w, dbInfo, tblInfo, nullCols, &model.ColumnInfo{Name: model.NewCIStr("")}, false) if err == nil { return nil, nil } @@ -402,6 +405,9 @@ func (w *worker) onCreateIndex(d *ddlCtx, t *meta.Meta, job *model.Job, isPK boo if err != nil { return ver, errors.Trace(err) } + if tblInfo.TableCacheStatusType != model.TableCacheStatusDisable { + return ver, errors.Trace(ErrOptOnCacheTable.GenWithStackByArgs("Create Index")) + } var ( unique bool @@ -611,6 +617,9 @@ func onDropIndex(t *meta.Meta, job *model.Job) (ver int64, _ error) { if err != nil { return ver, errors.Trace(err) } + if tblInfo.TableCacheStatusType != model.TableCacheStatusDisable { + return ver, errors.Trace(ErrOptOnCacheTable.GenWithStackByArgs("Drop Index")) + } dependentHiddenCols := make([]*model.ColumnInfo, 0) for _, indexColumn := range indexInfo.Columns { @@ -732,6 +741,9 @@ func onDropIndexes(t *meta.Meta, job *model.Job) (ver int64, _ error) { if err != nil { return ver, errors.Trace(err) } + if tblInfo.TableCacheStatusType != model.TableCacheStatusDisable { + return ver, errors.Trace(ErrOptOnCacheTable.GenWithStackByArgs("Drop Indexes")) + } indexInfos, err := checkDropIndexes(tblInfo, job, indexNames, ifExists) if err != nil { @@ -1281,10 +1293,9 @@ func (w *addIndexWorker) batchCheckUniqueKey(txn kv.Transaction, idxRecords []*i return nil } -// BackfillDataInTxn will backfill table index in a transaction, lock corresponding rowKey, if the value of rowKey is changed, -// indicate that index columns values may changed, index is not allowed to be added, so the txn will rollback and retry. +// BackfillDataInTxn will backfill table index in a transaction. If the value of rowKey is changed, there must be some other transactions +// update the row, result in write conflict, so the txn will rollback and retry. // BackfillDataInTxn will add w.batchCnt indices once, default value of w.batchCnt is 128. -// TODO: make w.batchCnt can be modified by system variable. func (w *addIndexWorker) BackfillDataInTxn(handleRange reorgBackfillTask) (taskCtx backfillTaskContext, errInTxn error) { failpoint.Inject("errorMockPanic", func(val failpoint.Value) { if val.(bool) { @@ -1318,13 +1329,6 @@ func (w *addIndexWorker) BackfillDataInTxn(handleRange reorgBackfillTask) (taskC continue } - // Lock the row key to notify us that someone delete or update the row, - // then we should not backfill the index of it, otherwise the adding index is redundant. - err := txn.LockKeys(context.Background(), new(kv.LockCtx), idxRecord.key) - if err != nil { - return errors.Trace(err) - } - // Create the index. handle, err := w.index.Create(w.sessCtx, txn, idxRecord.vals, idxRecord.handle, idxRecord.rsData) if err != nil { diff --git a/ddl/index_change_test.go b/ddl/index_change_test.go index 402ea37d61780..f59a78cbd6b12 100644 --- a/ddl/index_change_test.go +++ b/ddl/index_change_test.go @@ -38,17 +38,18 @@ type testIndexChangeSuite struct { func (s *testIndexChangeSuite) SetUpSuite(c *C) { s.store = testCreateStore(c, "test_index_change") - d := testNewDDLAndStart( + d, err := testNewDDLAndStart( context.Background(), - c, WithStore(s.store), WithLease(testLease), ) + c.Assert(err, IsNil) defer func() { err := d.Stop() c.Assert(err, IsNil) }() - s.dbInfo = testSchemaInfo(c, d, "test_index_change") + s.dbInfo, err = testSchemaInfo(d, "test_index_change") + c.Assert(err, IsNil) testCreateSchema(c, testNewContext(d), d, s.dbInfo) } @@ -57,22 +58,23 @@ func (s *testIndexChangeSuite) TearDownSuite(c *C) { } func (s *testIndexChangeSuite) TestIndexChange(c *C) { - d := testNewDDLAndStart( + d, err := testNewDDLAndStart( context.Background(), - c, WithStore(s.store), WithLease(testLease), ) + c.Assert(err, IsNil) defer func() { err := d.Stop() c.Assert(err, IsNil) }() // create table t (c1 int primary key, c2 int); - tblInfo := testTableInfo(c, d, "t", 2) + tblInfo, err := testTableInfo(d, "t", 2) + c.Assert(err, IsNil) tblInfo.Columns[0].Flag = mysql.PriKeyFlag | mysql.NotNullFlag tblInfo.PKIsHandle = true ctx := testNewContext(d) - err := ctx.NewTxn(context.Background()) + err = ctx.NewTxn(context.Background()) c.Assert(err, IsNil) testCreateTable(c, ctx, d, s.dbInfo, tblInfo) originTable := testGetTable(c, d, s.dbInfo.ID, tblInfo.ID) diff --git a/ddl/label/attributes.go b/ddl/label/attributes.go index 60333426a8b55..b7169411fa6e2 100644 --- a/ddl/label/attributes.go +++ b/ddl/label/attributes.go @@ -125,7 +125,8 @@ func (labels *Labels) Restore() string { // Add will add a new attribute, with validation of all attributes. func (labels *Labels) Add(label Label) error { - for _, l := range *labels { + for i := range *labels { + l := (*labels)[i] res := label.CompatibleWith(&l) if res == AttributesCompatible { continue diff --git a/ddl/label/attributes_test.go b/ddl/label/attributes_test.go index 3198f98f523c3..38ea9f3e52ada 100644 --- a/ddl/label/attributes_test.go +++ b/ddl/label/attributes_test.go @@ -21,8 +21,6 @@ import ( ) func TestNewLabel(t *testing.T) { - t.Parallel() - type TestCase struct { name string input string @@ -58,8 +56,6 @@ func TestNewLabel(t *testing.T) { } func TestRestoreLabel(t *testing.T) { - t.Parallel() - type TestCase struct { name string input Label @@ -94,8 +90,6 @@ func TestRestoreLabel(t *testing.T) { } func TestNewLabels(t *testing.T) { - t.Parallel() - labels, err := NewLabels(nil) require.NoError(t, err) require.Len(t, labels, 0) @@ -128,8 +122,6 @@ func TestNewLabels(t *testing.T) { } func TestAddLabels(t *testing.T) { - t.Parallel() - type TestCase struct { name string labels Labels @@ -191,8 +183,6 @@ func TestAddLabels(t *testing.T) { } func TestRestoreLabels(t *testing.T) { - t.Parallel() - type TestCase struct { name string input Labels diff --git a/ddl/label/rule_test.go b/ddl/label/rule_test.go index 050635579c521..a0d3b02555e13 100644 --- a/ddl/label/rule_test.go +++ b/ddl/label/rule_test.go @@ -22,8 +22,6 @@ import ( ) func TestApplyAttributesSpec(t *testing.T) { - t.Parallel() - // valid case spec := &ast.AttributesSpec{Attributes: "key=value,key1=value1"} rule := NewRule() @@ -51,8 +49,6 @@ func TestApplyAttributesSpec(t *testing.T) { } func TestDefaultOrEmpty(t *testing.T) { - t.Parallel() - specs := []*ast.AttributesSpec{{Attributes: ""}, {Default: true}} for i := range specs { rule := NewRule() @@ -65,8 +61,6 @@ func TestDefaultOrEmpty(t *testing.T) { } func TestReset(t *testing.T) { - t.Parallel() - spec := &ast.AttributesSpec{Attributes: "key=value"} rule := NewRule() require.NoError(t, rule.ApplyAttributesSpec(spec)) diff --git a/ddl/options_test.go b/ddl/options_test.go index b4b796cc6726f..1fe257072eaab 100644 --- a/ddl/options_test.go +++ b/ddl/options_test.go @@ -15,22 +15,19 @@ package ddl_test import ( + "testing" "time" - . "github.com/pingcap/check" "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/util/mock" + "github.com/stretchr/testify/require" "go.etcd.io/etcd/clientv3" ) -type ddlOptionsSuite struct{} - -var _ = Suite(&ddlOptionsSuite{}) - -func (s *ddlOptionsSuite) TestOptions(c *C) { +func TestOptions(t *testing.T) { client, err := clientv3.NewFromURL("test") - c.Assert(err, IsNil) + require.NoError(t, err) callback := &ddl.BaseCallback{} lease := time.Second * 3 store := &mock.Store{} @@ -49,9 +46,9 @@ func (s *ddlOptionsSuite) TestOptions(c *C) { o(opt) } - c.Assert(opt.EtcdCli, Equals, client) - c.Assert(opt.Hook, Equals, callback) - c.Assert(opt.Lease, Equals, lease) - c.Assert(opt.Store, Equals, store) - c.Assert(opt.InfoCache, Equals, infoHandle) + require.Equal(t, client, opt.EtcdCli) + require.Equal(t, callback, opt.Hook) + require.Equal(t, lease, opt.Lease) + require.Equal(t, store, opt.Store) + require.Equal(t, infoHandle, opt.InfoCache) } diff --git a/ddl/partition.go b/ddl/partition.go index ec2a75cb525a7..6f6d3b8b0ff59 100644 --- a/ddl/partition.go +++ b/ddl/partition.go @@ -88,6 +88,7 @@ func (w *worker) onAddTablePartition(d *ddlCtx, t *meta.Meta, job *model.Job) (v return ver, nil } + // notice: addingDefinitions is empty when job is in state model.StateNone tblInfo, partInfo, addingDefinitions, err := checkAddPartition(t, job) if err != nil { return ver, err @@ -116,12 +117,32 @@ func (w *worker) onAddTablePartition(d *ddlCtx, t *meta.Meta, job *model.Job) (v job.State = model.JobStateCancelled return ver, errors.Trace(err) } + // move the adding definition into tableInfo. updateAddingPartitionInfo(partInfo, tblInfo) ver, err = updateVersionAndTableInfoWithCheck(t, job, tblInfo, true) if err != nil { return ver, errors.Trace(err) } + + // modify placement settings + for _, def := range tblInfo.Partition.AddingDefinitions { + if _, err = checkPlacementPolicyRefValidAndCanNonValidJob(t, job, def.PlacementPolicyRef); err != nil { + return ver, errors.Trace(err) + } + } + + bundles, err := alterTablePartitionBundles(t, tblInfo, tblInfo.Partition.AddingDefinitions) + if err != nil { + job.State = model.JobStateCancelled + return ver, errors.Trace(err) + } + + if err = infosync.PutRuleBundlesWithDefaultRetry(context.TODO(), bundles); err != nil { + job.State = model.JobStateCancelled + return ver, errors.Wrapf(err, "failed to notify PD the placement rules") + } + // none -> replica only job.SchemaState = model.StateReplicaOnly case model.StateReplicaOnly: @@ -152,6 +173,7 @@ func (w *worker) onAddTablePartition(d *ddlCtx, t *meta.Meta, job *model.Job) (v if err != nil { return ver, errors.Trace(err) } + // Finish this job. job.FinishTableJob(model.JobStateDone, model.StatePublic, ver, tblInfo) asyncNotifyEvent(d, &util.Event{Tp: model.ActionAddTablePartition, TableInfo: tblInfo, PartInfo: partInfo}) @@ -162,6 +184,28 @@ func (w *worker) onAddTablePartition(d *ddlCtx, t *meta.Meta, job *model.Job) (v return ver, errors.Trace(err) } +func alterTablePartitionBundles(t *meta.Meta, tblInfo *model.TableInfo, addingDefinitions []model.PartitionDefinition) ([]*placement.Bundle, error) { + var bundles []*placement.Bundle + + // bundle for table should be recomputed because it includes some default configs for partitions + tblBundle, err := placement.NewTableBundle(t, tblInfo) + if err != nil { + return nil, errors.Trace(err) + } + + if tblBundle != nil { + bundles = append(bundles, tblBundle) + } + + partitionBundles, err := placement.NewPartitionListBundles(t, addingDefinitions) + if err != nil { + return nil, errors.Trace(err) + } + + bundles = append(bundles, partitionBundles...) + return bundles, nil +} + // updatePartitionInfo merge `addingDefinitions` into `Definitions` in the tableInfo. func updatePartitionInfo(tblInfo *model.TableInfo) { parInfo := &model.PartitionInfo{} @@ -181,15 +225,19 @@ func updateAddingPartitionInfo(partitionInfo *model.PartitionInfo, tblInfo *mode } // rollbackAddingPartitionInfo remove the `addingDefinitions` in the tableInfo. -func rollbackAddingPartitionInfo(tblInfo *model.TableInfo) ([]int64, []string) { +func rollbackAddingPartitionInfo(tblInfo *model.TableInfo) ([]int64, []string, []*placement.Bundle) { physicalTableIDs := make([]int64, 0, len(tblInfo.Partition.AddingDefinitions)) partNames := make([]string, 0, len(tblInfo.Partition.AddingDefinitions)) + rollbackBundles := make([]*placement.Bundle, 0, len(tblInfo.Partition.AddingDefinitions)) for _, one := range tblInfo.Partition.AddingDefinitions { physicalTableIDs = append(physicalTableIDs, one.ID) partNames = append(partNames, one.Name.L) + if one.PlacementPolicyRef != nil || one.DirectPlacementOpts != nil { + rollbackBundles = append(rollbackBundles, placement.NewBundle(one.ID)) + } } tblInfo.Partition.AddingDefinitions = nil - return physicalTableIDs, partNames + return physicalTableIDs, partNames, rollbackBundles } // checkAddPartitionValue values less than value must be strictly increasing for each partition. @@ -375,16 +423,29 @@ func buildTablePartitionInfo(ctx sessionctx.Context, s *ast.PartitionOptions, tb } // buildPartitionDefinitionsInfo build partition definitions info without assign partition id. tbInfo will be constant -func buildPartitionDefinitionsInfo(ctx sessionctx.Context, defs []*ast.PartitionDefinition, tbInfo *model.TableInfo) ([]model.PartitionDefinition, error) { +func buildPartitionDefinitionsInfo(ctx sessionctx.Context, defs []*ast.PartitionDefinition, tbInfo *model.TableInfo) (partitions []model.PartitionDefinition, err error) { switch tbInfo.Partition.Type { case model.PartitionTypeRange: - return buildRangePartitionDefinitions(ctx, defs, tbInfo) + partitions, err = buildRangePartitionDefinitions(ctx, defs, tbInfo) case model.PartitionTypeHash: - return buildHashPartitionDefinitions(ctx, defs, tbInfo) + partitions, err = buildHashPartitionDefinitions(ctx, defs, tbInfo) case model.PartitionTypeList: - return buildListPartitionDefinitions(ctx, defs, tbInfo) + partitions, err = buildListPartitionDefinitions(ctx, defs, tbInfo) + } + + if err != nil { + return nil, err } - return nil, nil + + for idx := range partitions { + def := &partitions[idx] + def.PlacementPolicyRef, def.DirectPlacementOpts, err = checkAndNormalizePlacement(ctx, def.PlacementPolicyRef, def.DirectPlacementOpts, nil, nil) + if err != nil { + return nil, err + } + } + + return partitions, nil } func setPartitionPlacementFromOptions(partition *model.PartitionDefinition, options []*ast.TableOption) error { @@ -432,6 +493,9 @@ func buildHashPartitionDefinitions(_ sessionctx.Context, defs []*ast.PartitionDe def := defs[i] definitions[i].Name = def.Name definitions[i].Comment, _ = def.Comment() + if err := setPartitionPlacementFromOptions(&definitions[i], def.Options); err != nil { + return nil, err + } } } return definitions, nil @@ -954,18 +1018,6 @@ func getTableInfoWithDroppingPartitions(t *model.TableInfo) *model.TableInfo { return nt } -func dropRuleBundles(d *ddlCtx, physicalTableIDs []int64) error { - bundles := make([]*placement.Bundle, 0, len(physicalTableIDs)) - for _, ID := range physicalTableIDs { - oldBundle, ok := d.infoCache.GetLatest().BundleByName(placement.GroupID(ID)) - if ok && !oldBundle.IsEmpty() { - bundles = append(bundles, placement.NewBundle(ID)) - } - } - err := infosync.PutRuleBundles(context.TODO(), bundles) - return err -} - func dropLabelRules(d *ddlCtx, schemaName, tableName string, partNames []string) error { deleteRules := make([]string, 0, len(partNames)) for _, partName := range partNames { @@ -987,12 +1039,10 @@ func (w *worker) onDropTablePartition(d *ddlCtx, t *meta.Meta, job *model.Job) ( if err != nil { return ver, errors.Trace(err) } - var physicalTableIDs []int64 if job.Type == model.ActionAddTablePartition { - var pNames []string // It is rollbacked from adding table partition, just remove addingDefinitions from tableInfo. - physicalTableIDs, pNames = rollbackAddingPartitionInfo(tblInfo) - err = dropRuleBundles(d, physicalTableIDs) + physicalTableIDs, pNames, rollbackBundles := rollbackAddingPartitionInfo(tblInfo) + err = infosync.PutRuleBundlesWithDefaultRetry(context.TODO(), rollbackBundles) if err != nil { job.State = model.JobStateCancelled return ver, errors.Wrapf(err, "failed to notify PD the placement rules") @@ -1011,6 +1061,7 @@ func (w *worker) onDropTablePartition(d *ddlCtx, t *meta.Meta, job *model.Job) ( return ver, nil } + var physicalTableIDs []int64 if job.State == model.JobStateRunning && job.SchemaState == model.StateNone { // Manually set first state. job.SchemaState = model.StatePublic @@ -1027,11 +1078,6 @@ func (w *worker) onDropTablePartition(d *ddlCtx, t *meta.Meta, job *model.Job) ( return ver, errors.Trace(err) } physicalTableIDs = updateDroppingPartitionInfo(tblInfo, partNames) - err = dropRuleBundles(d, physicalTableIDs) - if err != nil { - job.State = model.JobStateCancelled - return ver, errors.Wrapf(err, "failed to notify PD the placement rules") - } err = dropLabelRules(d, job.SchemaName, tblInfo.Name.L, partNames) if err != nil { job.State = model.JobStateCancelled @@ -1158,17 +1204,13 @@ func onTruncateTablePartition(d *ddlCtx, t *meta.Meta, job *model.Job) (int64, e } } - bundles := make([]*placement.Bundle, 0, len(oldIDs)) - - for i, oldID := range oldIDs { - oldBundle, ok := d.infoCache.GetLatest().BundleByName(placement.GroupID(oldID)) - if ok && !oldBundle.IsEmpty() { - bundles = append(bundles, placement.NewBundle(oldID)) - bundles = append(bundles, oldBundle.Clone().Reset(placement.RuleIndexPartition, []int64{newPartitions[i].ID})) - } + bundles, err := placement.NewPartitionListBundles(t, newPartitions) + if err != nil { + job.State = model.JobStateCancelled + return ver, errors.Trace(err) } - err = infosync.PutRuleBundles(context.TODO(), bundles) + err = infosync.PutRuleBundlesWithDefaultRetry(context.TODO(), bundles) if err != nil { job.State = model.JobStateCancelled return ver, errors.Wrapf(err, "failed to notify PD the placement rules") @@ -1365,23 +1407,14 @@ func (w *worker) onExchangeTablePartition(d *ddlCtx, t *meta.Meta, job *model.Jo // the follow code is a swap function for rules of two partitions // though partitions has exchanged their ID, swap still take effect - bundles := make([]*placement.Bundle, 0, 2) - ptBundle, ptOK := d.infoCache.GetLatest().BundleByName(placement.GroupID(partDef.ID)) - ptOK = ptOK && !ptBundle.IsEmpty() - ntBundle, ntOK := d.infoCache.GetLatest().BundleByName(placement.GroupID(nt.ID)) - ntOK = ntOK && !ntBundle.IsEmpty() - if ptOK && ntOK { - bundles = append(bundles, ptBundle.Clone().Reset(placement.RuleIndexPartition, []int64{nt.ID})) - bundles = append(bundles, ntBundle.Clone().Reset(placement.RuleIndexPartition, []int64{partDef.ID})) - } else if ptOK { - bundles = append(bundles, placement.NewBundle(partDef.ID)) - bundles = append(bundles, ptBundle.Clone().Reset(placement.RuleIndexPartition, []int64{nt.ID})) - } else if ntOK { - bundles = append(bundles, placement.NewBundle(nt.ID)) - bundles = append(bundles, ntBundle.Clone().Reset(placement.RuleIndexPartition, []int64{partDef.ID})) - } - err = infosync.PutRuleBundles(context.TODO(), bundles) + + bundles, err := bundlesForExchangeTablePartition(t, job, pt, partDef, nt) if err != nil { + job.State = model.JobStateCancelled + return ver, errors.Trace(err) + } + + if err = infosync.PutRuleBundlesWithDefaultRetry(context.TODO(), bundles); err != nil { job.State = model.JobStateCancelled return ver, errors.Wrapf(err, "failed to notify PD the placement rules") } @@ -1431,6 +1464,48 @@ func (w *worker) onExchangeTablePartition(d *ddlCtx, t *meta.Meta, job *model.Jo return ver, nil } +func bundlesForExchangeTablePartition(t *meta.Meta, job *model.Job, pt *model.TableInfo, newPar *model.PartitionDefinition, nt *model.TableInfo) ([]*placement.Bundle, error) { + bundles := make([]*placement.Bundle, 0, 3) + + ptBundle, err := placement.NewTableBundle(t, pt) + if err != nil { + return nil, errors.Trace(err) + } + if ptBundle != nil { + bundles = append(bundles, ptBundle) + } + + parBundle, err := placement.NewPartitionBundle(t, *newPar) + if err != nil { + return nil, errors.Trace(err) + } + if parBundle != nil { + bundles = append(bundles, parBundle) + } + + ntBundle, err := placement.NewTableBundle(t, nt) + if err != nil { + return nil, errors.Trace(err) + } + if ntBundle != nil { + bundles = append(bundles, ntBundle) + } + + if parBundle == nil && ntBundle != nil { + // newPar.ID is the ID of old table to exchange, so ntBundle != nil means it has some old placement settings. + // We should remove it in this situation + bundles = append(bundles, placement.NewBundle(newPar.ID)) + } + + if parBundle != nil && ntBundle == nil { + // nt.ID is the ID of old partition to exchange, so parBundle != nil means it has some old placement settings. + // We should remove it in this situation + bundles = append(bundles, placement.NewBundle(nt.ID)) + } + + return bundles, nil +} + func checkExchangePartitionRecordValidation(w *worker, pt *model.TableInfo, index int, schemaName, tableName model.CIStr) error { var sql string var paramList []interface{} @@ -1817,53 +1892,6 @@ func truncateTableByReassignPartitionIDs(t *meta.Meta, tblInfo *model.TableInfo) return nil } -func onAlterTableAlterPartition(t *meta.Meta, job *model.Job) (ver int64, err error) { - var partitionID int64 - bundle := &placement.Bundle{} - err = job.DecodeArgs(&partitionID, bundle) - if err != nil { - job.State = model.JobStateCancelled - return 0, errors.Trace(err) - } - - tblInfo, err := getTableInfoAndCancelFaultJob(t, job, job.SchemaID) - if err != nil { - return 0, err - } - - ptInfo := tblInfo.GetPartitionInfo() - if ptInfo.GetNameByID(partitionID) == "" { - job.State = model.JobStateCancelled - return 0, errors.Trace(table.ErrUnknownPartition.GenWithStackByArgs("drop?", tblInfo.Name.O)) - } - - pstate := ptInfo.GetStateByID(partitionID) - switch pstate { - case model.StatePublic: - ptInfo.SetStateByID(partitionID, model.StateGlobalTxnOnly) - ver, err = updateVersionAndTableInfo(t, job, tblInfo, true) - if err != nil { - return ver, errors.Trace(err) - } - job.SchemaState = model.StateGlobalTxnOnly - case model.StateGlobalTxnOnly: - err = infosync.PutRuleBundles(context.TODO(), []*placement.Bundle{bundle}) - if err != nil { - job.State = model.JobStateCancelled - return 0, errors.Wrapf(err, "failed to notify PD the placement rules") - } - ptInfo.SetStateByID(partitionID, model.StatePublic) - // used by ApplyDiff in updateSchemaVersion - job.CtxVars = []interface{}{partitionID} - ver, err = updateVersionAndTableInfo(t, job, tblInfo, true) - if err != nil { - return ver, errors.Trace(err) - } - job.FinishTableJob(model.JobStateDone, model.StatePublic, ver, tblInfo) - } - return ver, nil -} - type partitionExprProcessor func(sessionctx.Context, *model.TableInfo, ast.ExprNode) error type partitionExprChecker struct { diff --git a/ddl/partition_test.go b/ddl/partition_test.go index 6e84bfdda84cd..f2cdd1c4e3597 100644 --- a/ddl/partition_test.go +++ b/ddl/partition_test.go @@ -41,17 +41,18 @@ func (s *testPartitionSuite) TearDownSuite(c *C) { } func (s *testPartitionSuite) TestDropAndTruncatePartition(c *C) { - d := testNewDDLAndStart( + d, err := testNewDDLAndStart( context.Background(), - c, WithStore(s.store), WithLease(testLease), ) + c.Assert(err, IsNil) defer func() { err := d.Stop() c.Assert(err, IsNil) }() - dbInfo := testSchemaInfo(c, d, "test_partition") + dbInfo, err := testSchemaInfo(d, "test_partition") + c.Assert(err, IsNil) testCreateSchema(c, testNewContext(d), d, dbInfo) // generate 5 partition in tableInfo. tblInfo, partIDs := buildTableInfoWithPartition(c, d) diff --git a/ddl/placement/bundle.go b/ddl/placement/bundle.go index 88041528dfaf2..9c493dccdf619 100644 --- a/ddl/placement/bundle.go +++ b/ddl/placement/bundle.go @@ -25,7 +25,7 @@ import ( "strings" "github.com/pingcap/failpoint" - "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/util/codec" @@ -87,10 +87,17 @@ func NewBundleFromConstraintsOptions(options *model.PlacementSettings) (*Bundle, } if len(LeaderConstraints) > 0 { Rules = append(Rules, NewRule(Leader, 1, LeaderConstraints)) + } else if followerCount == 0 { + return nil, fmt.Errorf("%w: you must at least provide common/leader constraints, or set some followers", ErrInvalidPlacementOptions) } if followerCount > 0 { - FollowerRules, err := NewRules(Follower, followerCount, followerConstraints) + // if user did not specify leader, add one + if len(LeaderConstraints) == 0 { + Rules = append(Rules, NewRule(Leader, 1, NewConstraintsDirect())) + } + + FollowerRules, err := NewRules(Voter, followerCount, followerConstraints) if err != nil { return nil, fmt.Errorf("%w: invalid FollowerConstraints", err) } @@ -102,6 +109,8 @@ func NewBundleFromConstraintsOptions(options *model.PlacementSettings) (*Bundle, } } Rules = append(Rules, FollowerRules...) + } else if followerConstraints != "" { + return nil, fmt.Errorf("%w: specify follower constraints without specify how many followers to be placed", ErrInvalidPlacementOptions) } if learnerCount > 0 { @@ -117,6 +126,8 @@ func NewBundleFromConstraintsOptions(options *model.PlacementSettings) (*Bundle, } } Rules = append(Rules, LearnerRules...) + } else if learnerConstraints != "" { + return nil, fmt.Errorf("%w: specify learner constraints without specify how many learners to be placed", ErrInvalidPlacementOptions) } return &Bundle{Rules: Rules}, nil @@ -133,9 +144,6 @@ func NewBundleFromSugarOptions(options *model.PlacementSettings) (*Bundle, error } primaryRegion := strings.TrimSpace(options.PrimaryRegion) - if len(primaryRegion) == 0 { - return nil, fmt.Errorf("%w: empty primary region", ErrInvalidPlacementOptions) - } var regions []string if k := strings.TrimSpace(options.Regions); len(k) > 0 { @@ -151,37 +159,42 @@ func NewBundleFromSugarOptions(options *model.PlacementSettings) (*Bundle, error } schedule := options.Schedule + primaryIndex := 0 // regions must include the primary - sort.Strings(regions) - primaryIndex := sort.SearchStrings(regions, primaryRegion) - if primaryIndex >= len(regions) || regions[primaryIndex] != primaryRegion { - return nil, fmt.Errorf("%w: primary region must be included in regions", ErrInvalidPlacementOptions) + // but we don't see empty primaryRegion and regions as an error + if primaryRegion != "" || len(regions) > 0 { + sort.Strings(regions) + primaryIndex = sort.SearchStrings(regions, primaryRegion) + if primaryIndex >= len(regions) || regions[primaryIndex] != primaryRegion { + return nil, fmt.Errorf("%w: primary region must be included in regions", ErrInvalidPlacementOptions) + } } var Rules []*Rule + // primaryCount only makes sense when len(regions) > 0 + // but we will compute it here anyway for reusing code + var primaryCount uint64 switch strings.ToLower(schedule) { case "", "even": - primaryCount := uint64(math.Ceil(float64(followers+1) / float64(len(regions)))) - Rules = append(Rules, NewRule(Voter, primaryCount, NewConstraintsDirect(NewConstraintDirect("region", In, primaryRegion)))) - - if len(regions) > 1 { - // delete primary from regions - regions = regions[:primaryIndex+copy(regions[primaryIndex:], regions[primaryIndex+1:])] - Rules = append(Rules, NewRule(Follower, followers+1-primaryCount, NewConstraintsDirect(NewConstraintDirect("region", In, regions...)))) - } + primaryCount = uint64(math.Ceil(float64(followers+1) / float64(len(regions)))) case "majority_in_primary": // calculate how many replicas need to be in the primary region for quorum - primaryCount := uint64(math.Ceil(float64(followers+1)/2 + 1)) + primaryCount = uint64(math.Ceil(float64(followers+1)/2 + 1)) + default: + return nil, fmt.Errorf("%w: unsupported schedule %s", ErrInvalidPlacementOptions, schedule) + } + + if len(regions) == 0 { + Rules = append(Rules, NewRule(Voter, followers+1, NewConstraintsDirect())) + } else { Rules = append(Rules, NewRule(Voter, primaryCount, NewConstraintsDirect(NewConstraintDirect("region", In, primaryRegion)))) - if len(regions) > 1 { + if followers+1 > primaryCount { // delete primary from regions regions = regions[:primaryIndex+copy(regions[primaryIndex:], regions[primaryIndex+1:])] Rules = append(Rules, NewRule(Follower, followers+1-primaryCount, NewConstraintsDirect(NewConstraintDirect("region", In, regions...)))) } - default: - return nil, fmt.Errorf("%w: unsupported schedule %s", ErrInvalidPlacementOptions, schedule) } return &Bundle{Rules: Rules}, nil @@ -190,14 +203,14 @@ func NewBundleFromSugarOptions(options *model.PlacementSettings) (*Bundle, error // Non-Exported functionality function, do not use it directly but NewBundleFromOptions // here is for only directly used in the test. func newBundleFromOptions(options *model.PlacementSettings) (bundle *Bundle, err error) { - var isSyntaxSugar bool - if options == nil { return nil, fmt.Errorf("%w: options can not be nil", ErrInvalidPlacementOptions) } - if len(options.PrimaryRegion) > 0 || len(options.Regions) > 0 || len(options.Schedule) > 0 { - isSyntaxSugar = true + // always prefer the sugar syntax, which gives better schedule results most of the time + isSyntaxSugar := true + if len(options.LeaderConstraints) > 0 || len(options.LearnerConstraints) > 0 || len(options.FollowerConstraints) > 0 || len(options.Constraints) > 0 || options.Learners > 0 { + isSyntaxSugar = false } if isSyntaxSugar { @@ -224,59 +237,6 @@ func NewBundleFromOptions(options *model.PlacementSettings) (bundle *Bundle, err return bundle, err } -// ApplyPlacementSpec will apply actions defined in PlacementSpec to the bundle. -func (b *Bundle) ApplyPlacementSpec(specs []*ast.PlacementSpec) error { - for _, spec := range specs { - var role PeerRoleType - switch spec.Role { - case ast.PlacementRoleFollower: - role = Follower - case ast.PlacementRoleLeader: - if spec.Replicas == 0 { - spec.Replicas = 1 - } - if spec.Replicas > 1 { - return ErrLeaderReplicasMustOne - } - role = Leader - case ast.PlacementRoleLearner: - role = Learner - case ast.PlacementRoleVoter: - role = Voter - default: - return ErrMissingRoleField - } - - if spec.Tp == ast.PlacementAlter || spec.Tp == ast.PlacementDrop { - origLen := len(b.Rules) - newRules := b.Rules[:0] - for _, r := range b.Rules { - if r.Role != role { - newRules = append(newRules, r) - } - } - b.Rules = newRules - - // alter == drop + add new rules - if spec.Tp == ast.PlacementDrop { - // error if no rules will be dropped - if len(b.Rules) == origLen { - return fmt.Errorf("%w: %s", ErrNoRulesToDrop, role) - } - continue - } - } - - newRules, err := NewRules(role, spec.Replicas, spec.Constraints) - if err != nil { - return err - } - b.Rules = append(b.Rules, newRules...) - } - - return nil -} - // String implements fmt.Stringer. func (b *Bundle) String() string { t, err := json.Marshal(b) @@ -381,9 +341,10 @@ func (b *Bundle) Reset(ruleIndex int, newIDs []int64) *Bundle { // Involve all the table level objects. startKey := hex.EncodeToString(codec.EncodeBytes(nil, tablecodec.GenTablePrefix(newID))) endKey := hex.EncodeToString(codec.EncodeBytes(nil, tablecodec.GenTablePrefix(newID+1))) - for _, rule := range basicRules { + for j, rule := range basicRules { clone := rule.Clone() - clone.ID = ruleID + // for the rules of one element id, distinguishing the rule ids to avoid the PD's overlap. + clone.ID = ruleID + "_" + strconv.FormatInt(int64(j), 10) clone.GroupID = b.ID clone.StartKeyHex = startKey clone.EndKeyHex = endKey @@ -453,3 +414,99 @@ func (b *Bundle) GetLeaderDC(dcLabelKey string) (string, bool) { } return "", false } + +// NewTableBundle creates a bundle for table key range. +// If table is a partitioned table, it also contains the rules that inherited from table for every partition. +// The bundle does not contain the rules specified independently by each partition +func NewTableBundle(t *meta.Meta, tbInfo *model.TableInfo) (*Bundle, error) { + bundle, err := newBundleFromPolicyOrDirectOptions(t, tbInfo.PlacementPolicyRef, tbInfo.DirectPlacementOpts) + if err != nil { + return nil, err + } + + if bundle == nil { + return nil, nil + } + ids := []int64{tbInfo.ID} + // build the default partition rules in the table-level bundle. + if tbInfo.Partition != nil { + for _, pDef := range tbInfo.Partition.Definitions { + ids = append(ids, pDef.ID) + } + } + bundle.Reset(RuleIndexTable, ids) + return bundle, nil +} + +// NewPartitionBundle creates a bundle for partition key range. +// It only contains the rules specified independently by the partition. +// That is to say the inherited rules from table is not included. +func NewPartitionBundle(t *meta.Meta, def model.PartitionDefinition) (*Bundle, error) { + bundle, err := newBundleFromPolicyOrDirectOptions(t, def.PlacementPolicyRef, def.DirectPlacementOpts) + if err != nil { + return nil, err + } + + if bundle != nil { + bundle.Reset(RuleIndexPartition, []int64{def.ID}) + } + + return bundle, nil +} + +// NewPartitionListBundles creates a bundle list for a partition list +func NewPartitionListBundles(t *meta.Meta, defs []model.PartitionDefinition) ([]*Bundle, error) { + bundles := make([]*Bundle, 0, len(defs)) + // If the partition has the placement rules on their own, build the partition-level bundles additionally. + for _, def := range defs { + bundle, err := NewPartitionBundle(t, def) + if err != nil { + return nil, err + } + + if bundle != nil { + bundles = append(bundles, bundle) + } + } + return bundles, nil +} + +// NewFullTableBundles returns a bundle list with both table bundle and partition bundles +func NewFullTableBundles(t *meta.Meta, tbInfo *model.TableInfo) ([]*Bundle, error) { + var bundles []*Bundle + tableBundle, err := NewTableBundle(t, tbInfo) + if err != nil { + return nil, err + } + + if tableBundle != nil { + bundles = append(bundles, tableBundle) + } + + if tbInfo.Partition != nil { + partitionBundles, err := NewPartitionListBundles(t, tbInfo.Partition.Definitions) + if err != nil { + return nil, err + } + bundles = append(bundles, partitionBundles...) + } + + return bundles, nil +} + +func newBundleFromPolicyOrDirectOptions(t *meta.Meta, ref *model.PolicyRefInfo, directOpts *model.PlacementSettings) (*Bundle, error) { + if directOpts != nil { + return NewBundleFromOptions(directOpts) + } + + if ref != nil { + policy, err := t.GetPolicy(ref.ID) + if err != nil { + return nil, err + } + + return NewBundleFromOptions(policy.PlacementSettings) + } + + return nil, nil +} diff --git a/ddl/placement/bundle_test.go b/ddl/placement/bundle_test.go index 1b6cc8a31f258..225f17f398552 100644 --- a/ddl/placement/bundle_test.go +++ b/ddl/placement/bundle_test.go @@ -20,7 +20,6 @@ import ( . "github.com/pingcap/check" "github.com/pingcap/failpoint" - "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/util/codec" @@ -342,188 +341,6 @@ func (s *testBundleSuite) TestGetLeaderDCByBundle(c *C) { } } -func (s *testBundleSuite) TestApplyPlacmentSpec(c *C) { - type TestCase struct { - name string - input []*ast.PlacementSpec - output []*Rule - err error - } - var tests []TestCase - - tests = append(tests, TestCase{ - name: "empty", - input: []*ast.PlacementSpec{}, - output: []*Rule{}, - }) - - rules, err := NewRules(Voter, 3, `["+zone=sh", "+zone=sh"]`) - c.Assert(err, IsNil) - c.Assert(rules, HasLen, 1) - tests = append(tests, TestCase{ - name: "add voter array", - input: []*ast.PlacementSpec{{ - Role: ast.PlacementRoleVoter, - Tp: ast.PlacementAdd, - Replicas: 3, - Constraints: `["+zone=sh", "+zone=sh"]`, - }}, - output: rules, - }) - - rules, err = NewRules(Learner, 3, `["+zone=sh", "+zone=sh"]`) - c.Assert(err, IsNil) - c.Assert(rules, HasLen, 1) - tests = append(tests, TestCase{ - name: "add learner array", - input: []*ast.PlacementSpec{{ - Role: ast.PlacementRoleLearner, - Tp: ast.PlacementAdd, - Replicas: 3, - Constraints: `["+zone=sh", "+zone=sh"]`, - }}, - output: rules, - }) - - rules, err = NewRules(Follower, 3, `["+zone=sh", "+zone=sh"]`) - c.Assert(err, IsNil) - c.Assert(rules, HasLen, 1) - tests = append(tests, TestCase{ - name: "add follower array", - input: []*ast.PlacementSpec{{ - Role: ast.PlacementRoleFollower, - Tp: ast.PlacementAdd, - Replicas: 3, - Constraints: `["+zone=sh", "+zone=sh"]`, - }}, - output: rules, - }) - - tests = append(tests, TestCase{ - name: "add invalid constraints", - input: []*ast.PlacementSpec{{ - Role: ast.PlacementRoleVoter, - Tp: ast.PlacementAdd, - Replicas: 3, - Constraints: "ne", - }}, - err: ErrInvalidConstraintsFormat, - }) - - tests = append(tests, TestCase{ - name: "add empty role", - input: []*ast.PlacementSpec{{ - Tp: ast.PlacementAdd, - Replicas: 3, - Constraints: "", - }}, - err: ErrMissingRoleField, - }) - - tests = append(tests, TestCase{ - name: "add multiple leaders", - input: []*ast.PlacementSpec{{ - Role: ast.PlacementRoleLeader, - Tp: ast.PlacementAdd, - Replicas: 3, - Constraints: "", - }}, - err: ErrLeaderReplicasMustOne, - }) - - rules, err = NewRules(Leader, 1, "") - c.Assert(err, IsNil) - c.Assert(rules, HasLen, 1) - tests = append(tests, TestCase{ - name: "omit leader field", - input: []*ast.PlacementSpec{{ - Role: ast.PlacementRoleLeader, - Tp: ast.PlacementAdd, - Constraints: "", - }}, - output: rules, - }) - - rules, err = NewRules(Follower, 3, `["-zone=sh","+zone=bj"]`) - c.Assert(err, IsNil) - c.Assert(rules, HasLen, 1) - tests = append(tests, TestCase{ - name: "drop", - input: []*ast.PlacementSpec{ - { - Role: ast.PlacementRoleFollower, - Tp: ast.PlacementAdd, - Replicas: 3, - Constraints: `["- zone=sh", "+zone = bj"]`, - }, - { - Role: ast.PlacementRoleVoter, - Tp: ast.PlacementAdd, - Replicas: 3, - Constraints: `["+ zone=sh", "-zone = bj"]`, - }, - { - Role: ast.PlacementRoleVoter, - Tp: ast.PlacementDrop, - }, - }, - output: rules, - }) - - tests = append(tests, TestCase{ - name: "drop unexisted", - input: []*ast.PlacementSpec{{ - Role: ast.PlacementRoleLeader, - Tp: ast.PlacementDrop, - Constraints: "", - }}, - err: ErrNoRulesToDrop, - }) - - rules1, err := NewRules(Follower, 3, `["-zone=sh","+zone=bj"]`) - c.Assert(err, IsNil) - c.Assert(rules1, HasLen, 1) - rules2, err := NewRules(Voter, 3, `["+zone=sh","-zone=bj"]`) - c.Assert(err, IsNil) - c.Assert(rules2, HasLen, 1) - tests = append(tests, TestCase{ - name: "alter", - input: []*ast.PlacementSpec{ - { - Role: ast.PlacementRoleFollower, - Tp: ast.PlacementAdd, - Replicas: 3, - Constraints: `["- zone=sh", "+zone = bj"]`, - }, - { - Role: ast.PlacementRoleVoter, - Tp: ast.PlacementAdd, - Replicas: 3, - Constraints: `["- zone=sh", "+zone = bj"]`, - }, - { - Role: ast.PlacementRoleVoter, - Tp: ast.PlacementAlter, - Replicas: 3, - Constraints: `["+ zone=sh", "-zone = bj"]`, - }, - }, - output: append(rules1, rules2...), - }) - - for _, t := range tests { - comment := Commentf("%s", t.name) - bundle := &Bundle{} - err := bundle.ApplyPlacementSpec(t.input) - if t.err == nil { - c.Assert(err, IsNil) - matchRules(t.output, bundle.Rules, comment.CheckCommentString(), c) - } else { - c.Assert(errors.Is(err, t.err), IsTrue, comment) - } - } -} - func (s *testBundleSuite) TestString(c *C) { bundle := &Bundle{ ID: GroupID(1), @@ -565,9 +382,11 @@ func (s *testBundleSuite) TestNewBundleFromOptions(c *C) { var tests []TestCase tests = append(tests, TestCase{ - name: "empty 1", - input: &model.PlacementSettings{}, - output: []*Rule{}, + name: "empty 1", + input: &model.PlacementSettings{}, + output: []*Rule{ + NewRule(Voter, 3, NewConstraintsDirect()), + }, }) tests = append(tests, TestCase{ @@ -576,6 +395,14 @@ func (s *testBundleSuite) TestNewBundleFromOptions(c *C) { err: ErrInvalidPlacementOptions, }) + tests = append(tests, TestCase{ + name: "empty 3", + input: &model.PlacementSettings{ + LearnerConstraints: "[+region=us]", + }, + err: ErrInvalidPlacementOptions, + }) + tests = append(tests, TestCase{ name: "sugar syntax: normal case 1", input: &model.PlacementSettings{ @@ -594,17 +421,40 @@ func (s *testBundleSuite) TestNewBundleFromOptions(c *C) { input: &model.PlacementSettings{ PrimaryRegion: "us", Regions: "bj,sh,us", + Followers: 1, }, output: []*Rule{ NewRule(Voter, 1, NewConstraintsDirect( NewConstraintDirect("region", In, "us"), )), - NewRule(Follower, 2, NewConstraintsDirect( + NewRule(Follower, 1, NewConstraintsDirect( NewConstraintDirect("region", In, "bj", "sh"), )), }, }) + tests = append(tests, TestCase{ + name: "sugar syntax: omit regions 1", + input: &model.PlacementSettings{ + Followers: 2, + Schedule: "even", + }, + output: []*Rule{ + NewRule(Voter, 3, NewConstraintsDirect()), + }, + }) + + tests = append(tests, TestCase{ + name: "sugar syntax: omit regions 2", + input: &model.PlacementSettings{ + Followers: 2, + Schedule: "majority_in_primary", + }, + output: []*Rule{ + NewRule(Voter, 3, NewConstraintsDirect()), + }, + }) + tests = append(tests, TestCase{ name: "sugar syntax: wrong schedule prop", input: &model.PlacementSettings{ @@ -690,7 +540,7 @@ func (s *testBundleSuite) TestNewBundleFromOptions(c *C) { NewRule(Leader, 1, NewConstraintsDirect( NewConstraintDirect("region", In, "us"), )), - NewRule(Follower, 2, NewConstraintsDirect( + NewRule(Voter, 2, NewConstraintsDirect( NewConstraintDirect("region", In, "us"), )), }, @@ -707,7 +557,7 @@ func (s *testBundleSuite) TestNewBundleFromOptions(c *C) { NewRule(Leader, 1, NewConstraintsDirect( NewConstraintDirect("region", In, "us"), )), - NewRule(Follower, 2, NewConstraintsDirect( + NewRule(Voter, 2, NewConstraintsDirect( NewConstraintDirect("region", In, "us"), )), NewRule(Learner, 2, NewConstraintsDirect( @@ -716,6 +566,36 @@ func (s *testBundleSuite) TestNewBundleFromOptions(c *C) { }, }) + tests = append(tests, TestCase{ + name: "direct syntax: lack count 1", + input: &model.PlacementSettings{ + LeaderConstraints: "[+region=as]", + FollowerConstraints: "[-region=us]", + }, + err: ErrInvalidPlacementOptions, + }) + + tests = append(tests, TestCase{ + name: "direct syntax: lack count 2", + input: &model.PlacementSettings{ + LeaderConstraints: "[+region=as]", + LearnerConstraints: "[-region=us]", + }, + err: ErrInvalidPlacementOptions, + }) + + tests = append(tests, TestCase{ + name: "direct syntax: omit leader", + input: &model.PlacementSettings{ + Followers: 2, + FollowerConstraints: "[+region=bj]", + }, + output: []*Rule{ + NewRule(Leader, 1, NewConstraintsDirect()), + NewRule(Voter, 2, NewConstraintsDirect(NewConstraintDirect("region", In, "bj"))), + }, + }) + tests = append(tests, TestCase{ name: "direct syntax: conflicts 1", input: &model.PlacementSettings{ diff --git a/ddl/placement/common.go b/ddl/placement/common.go index 7b385daf508ae..6a17c13388d6a 100644 --- a/ddl/placement/common.go +++ b/ddl/placement/common.go @@ -31,16 +31,10 @@ func GroupID(id int64) string { } const ( - // RuleIndexDefault is the default index for a rule, check Rule.Index. - RuleIndexDefault int = iota - // RuleIndexDatabase is the index for a rule of database. - RuleIndexDatabase // RuleIndexTable is the index for a rule of table. - RuleIndexTable + RuleIndexTable = 40 // RuleIndexPartition is the index for a rule of partition. - RuleIndexPartition - // RuleIndexIndex is the index for a rule of index. - RuleIndexIndex + RuleIndexPartition = 80 ) const ( diff --git a/ddl/placement/constraints.go b/ddl/placement/constraints.go index 87619a8df32df..38b678857eee3 100644 --- a/ddl/placement/constraints.go +++ b/ddl/placement/constraints.go @@ -84,7 +84,8 @@ func (constraints *Constraints) Restore() (string, error) { func (constraints *Constraints) Add(label Constraint) error { pass := true - for _, cnst := range *constraints { + for i := range *constraints { + cnst := (*constraints)[i] res := label.CompatibleWith(&cnst) if res == ConstraintCompatible { continue diff --git a/ddl/placement/meta_bundle_test.go b/ddl/placement/meta_bundle_test.go new file mode 100644 index 0000000000000..0306458c1a745 --- /dev/null +++ b/ddl/placement/meta_bundle_test.go @@ -0,0 +1,379 @@ +// Copyright 2021 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, +// 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. + +package placement_test + +import ( + "context" + "encoding/hex" + "encoding/json" + "fmt" + + . "github.com/pingcap/check" + "github.com/pingcap/tidb/ddl/placement" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/meta" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/store/mockstore" + "github.com/pingcap/tidb/tablecodec" + "github.com/pingcap/tidb/util/codec" +) + +var _ = Suite(&testMetaBundleSuite{}) + +type testMetaBundleSuite struct { + policy1 *model.PolicyInfo + policy2 *model.PolicyInfo + tbl1 *model.TableInfo + tbl2 *model.TableInfo + tbl3 *model.TableInfo + tbl4 *model.TableInfo +} + +func (s *testMetaBundleSuite) SetUpSuite(c *C) { + s.policy1 = &model.PolicyInfo{ + ID: 11, + Name: model.NewCIStr("p1"), + PlacementSettings: &model.PlacementSettings{ + PrimaryRegion: "r1", + Regions: "r1,r2", + }, + State: model.StatePublic, + } + s.policy2 = &model.PolicyInfo{ + ID: 12, + Name: model.NewCIStr("p2"), + PlacementSettings: &model.PlacementSettings{ + PrimaryRegion: "r2", + Regions: "r1,r2", + }, + State: model.StatePublic, + } + s.tbl1 = &model.TableInfo{ + ID: 101, + Name: model.NewCIStr("t1"), + PlacementPolicyRef: &model.PolicyRefInfo{ + ID: 11, + Name: model.NewCIStr("p1"), + }, + Partition: &model.PartitionInfo{ + Definitions: []model.PartitionDefinition{ + { + ID: 1000, + Name: model.NewCIStr("par0"), + }, + { + ID: 1001, + Name: model.NewCIStr("par1"), + PlacementPolicyRef: &model.PolicyRefInfo{ID: 12, Name: model.NewCIStr("p2")}, + }, + { + ID: 1002, + Name: model.NewCIStr("par2"), + }, + { + ID: 1003, + Name: model.NewCIStr("par3"), + DirectPlacementOpts: &model.PlacementSettings{PrimaryRegion: "r3", Regions: "r3"}, + }, + }, + }, + } + s.tbl2 = &model.TableInfo{ + ID: 102, + Name: model.NewCIStr("t2"), + Partition: &model.PartitionInfo{ + Definitions: []model.PartitionDefinition{ + { + ID: 1000, + Name: model.NewCIStr("par0"), + PlacementPolicyRef: &model.PolicyRefInfo{ID: 11, Name: model.NewCIStr("p1")}, + }, + { + ID: 1001, + Name: model.NewCIStr("par1"), + }, + { + ID: 1002, + Name: model.NewCIStr("par2"), + DirectPlacementOpts: &model.PlacementSettings{PrimaryRegion: "r2", Regions: "r2"}, + }, + { + ID: 1003, + Name: model.NewCIStr("par3"), + }, + }, + }, + } + s.tbl3 = &model.TableInfo{ + ID: 103, + Name: model.NewCIStr("t3"), + DirectPlacementOpts: &model.PlacementSettings{ + LeaderConstraints: "[+region=bj]", + }, + } + s.tbl4 = &model.TableInfo{ + ID: 104, + Name: model.NewCIStr("t4"), + } +} + +func (s *testMetaBundleSuite) prepareMeta(c *C, store kv.Storage) { + c.Assert(kv.RunInNewTxn(context.TODO(), store, false, func(ctx context.Context, txn kv.Transaction) error { + t := meta.NewMeta(txn) + c.Assert(t.CreatePolicy(s.policy1), IsNil) + c.Assert(t.CreatePolicy(s.policy2), IsNil) + return nil + }), IsNil) +} + +func (s *testMetaBundleSuite) TestNewTableBundle(c *C) { + store := newMockStore(c) + defer func() { + c.Assert(store.Close(), IsNil) + }() + s.prepareMeta(c, store) + c.Assert(kv.RunInNewTxn(context.TODO(), store, false, func(ctx context.Context, txn kv.Transaction) error { + t := meta.NewMeta(txn) + + // tbl1 + bundle, err := placement.NewTableBundle(t, s.tbl1) + c.Assert(err, IsNil) + s.checkTableBundle(c, s.tbl1, bundle) + + // tbl2 + bundle, err = placement.NewTableBundle(t, s.tbl2) + c.Assert(err, IsNil) + s.checkTableBundle(c, s.tbl2, bundle) + + // tbl3 + bundle, err = placement.NewTableBundle(t, s.tbl3) + c.Assert(err, IsNil) + s.checkTableBundle(c, s.tbl3, bundle) + + // tbl4 + bundle, err = placement.NewTableBundle(t, s.tbl4) + c.Assert(err, IsNil) + s.checkTableBundle(c, s.tbl4, bundle) + + return nil + }), IsNil) +} + +func (s *testMetaBundleSuite) TestNewPartitionBundle(c *C) { + store := newMockStore(c) + defer func() { + c.Assert(store.Close(), IsNil) + }() + s.prepareMeta(c, store) + + c.Assert(kv.RunInNewTxn(context.TODO(), store, false, func(ctx context.Context, txn kv.Transaction) error { + t := meta.NewMeta(txn) + + // tbl1.par0 + bundle, err := placement.NewPartitionBundle(t, s.tbl1.Partition.Definitions[0]) + c.Assert(err, IsNil) + s.checkPartitionBundle(c, s.tbl1.Partition.Definitions[0], bundle) + + // tbl1.par1 + bundle, err = placement.NewPartitionBundle(t, s.tbl1.Partition.Definitions[1]) + c.Assert(err, IsNil) + s.checkPartitionBundle(c, s.tbl1.Partition.Definitions[1], bundle) + + // tbl1.par3 + bundle, err = placement.NewPartitionBundle(t, s.tbl1.Partition.Definitions[3]) + c.Assert(err, IsNil) + s.checkPartitionBundle(c, s.tbl1.Partition.Definitions[3], bundle) + + return nil + }), IsNil) +} + +func (s *testMetaBundleSuite) TestNewPartitionListBundles(c *C) { + store := newMockStore(c) + defer func() { + c.Assert(store.Close(), IsNil) + }() + s.prepareMeta(c, store) + + c.Assert(kv.RunInNewTxn(context.TODO(), store, false, func(ctx context.Context, txn kv.Transaction) error { + t := meta.NewMeta(txn) + + bundles, err := placement.NewPartitionListBundles(t, s.tbl1.Partition.Definitions) + c.Assert(err, IsNil) + c.Assert(len(bundles), Equals, 2) + s.checkPartitionBundle(c, s.tbl1.Partition.Definitions[1], bundles[0]) + s.checkPartitionBundle(c, s.tbl1.Partition.Definitions[3], bundles[1]) + + bundles, err = placement.NewPartitionListBundles(t, []model.PartitionDefinition{}) + c.Assert(err, IsNil) + c.Assert(len(bundles), Equals, 0) + + bundles, err = placement.NewPartitionListBundles(t, []model.PartitionDefinition{ + s.tbl1.Partition.Definitions[0], + s.tbl1.Partition.Definitions[2], + }) + c.Assert(err, IsNil) + c.Assert(len(bundles), Equals, 0) + + return nil + }), IsNil) +} + +func (s *testMetaBundleSuite) TestNewFullTableBundles(c *C) { + store := newMockStore(c) + defer func() { + c.Assert(store.Close(), IsNil) + }() + s.prepareMeta(c, store) + + c.Assert(kv.RunInNewTxn(context.TODO(), store, false, func(ctx context.Context, txn kv.Transaction) error { + t := meta.NewMeta(txn) + + bundles, err := placement.NewFullTableBundles(t, s.tbl1) + c.Assert(err, IsNil) + c.Assert(len(bundles), Equals, 3) + s.checkTableBundle(c, s.tbl1, bundles[0]) + s.checkPartitionBundle(c, s.tbl1.Partition.Definitions[1], bundles[1]) + s.checkPartitionBundle(c, s.tbl1.Partition.Definitions[3], bundles[2]) + + bundles, err = placement.NewFullTableBundles(t, s.tbl2) + c.Assert(err, IsNil) + c.Assert(len(bundles), Equals, 2) + s.checkPartitionBundle(c, s.tbl2.Partition.Definitions[0], bundles[0]) + s.checkPartitionBundle(c, s.tbl2.Partition.Definitions[2], bundles[1]) + + bundles, err = placement.NewFullTableBundles(t, s.tbl3) + c.Assert(err, IsNil) + c.Assert(len(bundles), Equals, 1) + s.checkTableBundle(c, s.tbl3, bundles[0]) + + bundles, err = placement.NewFullTableBundles(t, s.tbl4) + c.Assert(err, IsNil) + c.Assert(len(bundles), Equals, 0) + + return nil + }), IsNil) +} + +func (s *testMetaBundleSuite) checkTwoJSONObjectEquals(c *C, expected interface{}, got interface{}) { + expectedJSON, err := json.Marshal(expected) + c.Assert(err, IsNil) + expectedStr := string(expectedJSON) + + gotJSON, err := json.Marshal(got) + c.Assert(err, IsNil) + gotStr := string(gotJSON) + + c.Assert(gotStr, Equals, expectedStr) +} + +func (s *testMetaBundleSuite) checkTableBundle(c *C, tbl *model.TableInfo, got *placement.Bundle) { + if tbl.PlacementPolicyRef == nil && tbl.DirectPlacementOpts == nil { + c.Assert(got, IsNil) + return + } + + expected := &placement.Bundle{ + ID: fmt.Sprintf("TiDB_DDL_%d", tbl.ID), + Index: placement.RuleIndexTable, + Override: true, + Rules: s.expectedRules(c, tbl.PlacementPolicyRef, tbl.DirectPlacementOpts), + } + + for idx, rule := range expected.Rules { + rule.GroupID = expected.ID + rule.Index = placement.RuleIndexTable + rule.ID = fmt.Sprintf("table_rule_%d_%d", tbl.ID, idx) + rule.StartKeyHex = hex.EncodeToString(codec.EncodeBytes(nil, tablecodec.GenTablePrefix(tbl.ID))) + rule.EndKeyHex = hex.EncodeToString(codec.EncodeBytes(nil, tablecodec.GenTablePrefix(tbl.ID+1))) + } + + if tbl.Partition != nil { + for _, par := range tbl.Partition.Definitions { + rules := s.expectedRules(c, tbl.PlacementPolicyRef, tbl.DirectPlacementOpts) + for idx, rule := range rules { + rule.GroupID = expected.ID + rule.Index = placement.RuleIndexPartition + rule.ID = fmt.Sprintf("partition_rule_%d_%d", par.ID, idx) + rule.StartKeyHex = hex.EncodeToString(codec.EncodeBytes(nil, tablecodec.GenTablePrefix(par.ID))) + rule.EndKeyHex = hex.EncodeToString(codec.EncodeBytes(nil, tablecodec.GenTablePrefix(par.ID+1))) + expected.Rules = append(expected.Rules, rule) + } + } + } + + s.checkTwoJSONObjectEquals(c, expected, got) +} + +func (s *testMetaBundleSuite) checkPartitionBundle(c *C, def model.PartitionDefinition, got *placement.Bundle) { + if def.PlacementPolicyRef == nil && def.DirectPlacementOpts == nil { + c.Assert(got, IsNil) + return + } + + expected := &placement.Bundle{ + ID: fmt.Sprintf("TiDB_DDL_%d", def.ID), + Index: placement.RuleIndexPartition, + Override: true, + Rules: s.expectedRules(c, def.PlacementPolicyRef, def.DirectPlacementOpts), + } + + for idx, rule := range expected.Rules { + rule.GroupID = expected.ID + rule.Index = placement.RuleIndexTable + rule.ID = fmt.Sprintf("partition_rule_%d_%d", def.ID, idx) + rule.StartKeyHex = hex.EncodeToString(codec.EncodeBytes(nil, tablecodec.GenTablePrefix(def.ID))) + rule.EndKeyHex = hex.EncodeToString(codec.EncodeBytes(nil, tablecodec.GenTablePrefix(def.ID+1))) + } + + s.checkTwoJSONObjectEquals(c, expected, got) +} + +func (s *testMetaBundleSuite) expectedRules(c *C, ref *model.PolicyRefInfo, direct *model.PlacementSettings) []*placement.Rule { + c.Assert(ref != nil && direct != nil, IsFalse) + + var settings *model.PlacementSettings + if ref != nil { + var policy *model.PolicyInfo + switch ref.ID { + case s.policy1.ID: + policy = s.policy1 + case s.policy2.ID: + policy = s.policy2 + default: + c.FailNow() + } + c.Assert(ref.Name, Equals, policy.Name) + settings = policy.PlacementSettings + } + + if direct != nil { + settings = direct + } + + if settings == nil { + return []*placement.Rule{} + } + + bundle, err := placement.NewBundleFromOptions(settings) + c.Assert(err, IsNil) + return bundle.Rules +} + +func newMockStore(c *C) kv.Storage { + store, err := mockstore.NewMockStore() + c.Assert(err, IsNil) + return store +} diff --git a/ddl/placement_policy.go b/ddl/placement_policy.go index 1dec5315caa9e..3ccba4ef346f6 100644 --- a/ddl/placement_policy.go +++ b/ddl/placement_policy.go @@ -124,6 +124,32 @@ func checkPlacementPolicyExistAndCancelNonExistJob(t *meta.Meta, job *model.Job, return nil, err } +func checkPlacementPolicyRefValidAndCanNonValidJob(t *meta.Meta, job *model.Job, ref *model.PolicyRefInfo) (*model.PolicyInfo, error) { + if ref == nil { + return nil, nil + } + + return checkPlacementPolicyExistAndCancelNonExistJob(t, job, ref.ID) +} + +func checkAllTablePlacementPoliciesExistAndCancelNonExistJob(t *meta.Meta, job *model.Job, tblInfo *model.TableInfo) error { + if _, err := checkPlacementPolicyRefValidAndCanNonValidJob(t, job, tblInfo.PlacementPolicyRef); err != nil { + return errors.Trace(err) + } + + if tblInfo.Partition == nil { + return nil + } + + for _, def := range tblInfo.Partition.Definitions { + if _, err := checkPlacementPolicyRefValidAndCanNonValidJob(t, job, def.PlacementPolicyRef); err != nil { + return errors.Trace(err) + } + } + + return nil +} + func onDropPlacementPolicy(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ error) { policyInfo, err := checkPlacementPolicyExistAndCancelNonExistJob(t, job, job.SchemaID) if err != nil { @@ -236,7 +262,7 @@ func onAlterPlacementPolicy(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, cp := bundle.Clone() bundles = append(bundles, cp.Reset(placement.RuleIndexPartition, []int64{id})) } - err = infosync.PutRuleBundles(context.TODO(), bundles) + err = infosync.PutRuleBundlesWithDefaultRetry(context.TODO(), bundles) if err != nil { job.State = model.JobStateCancelled return ver, errors.Wrapf(err, "failed to notify PD the placement rules") @@ -305,7 +331,7 @@ func getPlacementPolicyDependedObjectsIDs(t *meta.Meta, policy *model.PolicyInfo } if tblInfo.Partition != nil { for _, part := range tblInfo.Partition.Definitions { - if part.PlacementPolicyRef != nil && part.PlacementPolicyRef.ID == part.ID { + if part.PlacementPolicyRef != nil && part.PlacementPolicyRef.ID == policy.ID { partIDs = append(partIDs, part.ID) } } diff --git a/ddl/placement_policy_ddl_test.go b/ddl/placement_policy_ddl_test.go index c713570124efd..28efb3bae3e3c 100644 --- a/ddl/placement_policy_ddl_test.go +++ b/ddl/placement_policy_ddl_test.go @@ -60,14 +60,17 @@ func (s *testDDLSuite) TestPlacementPolicyInUse(c *C) { }() ctx := context.Background() - d := testNewDDLAndStart(ctx, c, WithStore(store)) + d, err := testNewDDLAndStart(ctx, WithStore(store)) + c.Assert(err, IsNil) sctx := testNewContext(d) - db1 := testSchemaInfo(c, d, "db1") + db1, err := testSchemaInfo(d, "db1") + c.Assert(err, IsNil) testCreateSchema(c, sctx, d, db1) db1.State = model.StatePublic - db2 := testSchemaInfo(c, d, "db2") + db2, err := testSchemaInfo(d, "db2") + c.Assert(err, IsNil) testCreateSchema(c, sctx, d, db2) db2.State = model.StatePublic @@ -83,25 +86,29 @@ func (s *testDDLSuite) TestPlacementPolicyInUse(c *C) { testCreatePlacementPolicy(c, sctx, d, p4) testCreatePlacementPolicy(c, sctx, d, p5) - t1 := testTableInfo(c, d, "t1", 1) + t1, err := testTableInfo(d, "t1", 1) + c.Assert(err, IsNil) t1.PlacementPolicyRef = &model.PolicyRefInfo{ID: p1.ID, Name: p1.Name} testCreateTable(c, sctx, d, db1, t1) t1.State = model.StatePublic db1.Tables = append(db1.Tables, t1) - t2 := testTableInfo(c, d, "t2", 1) + t2, err := testTableInfo(d, "t2", 1) + c.Assert(err, IsNil) t2.PlacementPolicyRef = &model.PolicyRefInfo{ID: p1.ID, Name: p1.Name} testCreateTable(c, sctx, d, db2, t2) t2.State = model.StatePublic db2.Tables = append(db2.Tables, t2) - t3 := testTableInfo(c, d, "t3", 1) + t3, err := testTableInfo(d, "t3", 1) + c.Assert(err, IsNil) t3.PlacementPolicyRef = &model.PolicyRefInfo{ID: p2.ID, Name: p2.Name} testCreateTable(c, sctx, d, db1, t3) t3.State = model.StatePublic db1.Tables = append(db1.Tables, t3) - dbP := testSchemaInfo(c, d, "db_p") + dbP, err := testSchemaInfo(d, "db_p") + c.Assert(err, IsNil) dbP.PlacementPolicyRef = &model.PolicyRefInfo{ID: p4.ID, Name: p4.Name} dbP.State = model.StatePublic testCreateSchema(c, sctx, d, dbP) @@ -112,7 +119,7 @@ func (s *testDDLSuite) TestPlacementPolicyInUse(c *C) { t4.State = model.StatePublic db1.Tables = append(db1.Tables, t4) - builder, err := infoschema.NewBuilder(store).InitWithDBInfos( + builder, err := infoschema.NewBuilder(store, nil, nil).InitWithDBInfos( []*model.DBInfo{db1, db2, dbP}, nil, []*model.PolicyInfo{p1, p2, p3, p4, p5}, diff --git a/ddl/placement_policy_test.go b/ddl/placement_policy_test.go index de0f3af4b3ca1..c8626121515d9 100644 --- a/ddl/placement_policy_test.go +++ b/ddl/placement_policy_test.go @@ -16,21 +16,116 @@ package ddl_test import ( "context" + "encoding/json" "fmt" + "math" + "strconv" . "github.com/pingcap/check" + "github.com/pingcap/failpoint" "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/ddl/placement" "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/domain/infosync" mysql "github.com/pingcap/tidb/errno" + "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/store/gcworker" "github.com/pingcap/tidb/util/testkit" "github.com/pingcap/tidb/util/testutil" ) +func clearAllBundles(c *C) { + bundles, err := infosync.GetAllRuleBundles(context.TODO()) + c.Assert(err, IsNil) + clearBundles := make([]*placement.Bundle, 0, len(bundles)) + for _, bundle := range bundles { + clearBundles = append(clearBundles, &placement.Bundle{ID: bundle.ID}) + } + err = infosync.PutRuleBundles(context.TODO(), clearBundles) + c.Assert(err, IsNil) +} + +func checkExistTableBundlesInPD(c *C, do *domain.Domain, dbName string, tbName string) { + tblInfo, err := do.InfoSchema().TableByName(model.NewCIStr(dbName), model.NewCIStr(tbName)) + c.Assert(err, IsNil) + + c.Assert(kv.RunInNewTxn(context.TODO(), do.Store(), false, func(ctx context.Context, txn kv.Transaction) error { + t := meta.NewMeta(txn) + checkTableBundlesInPD(c, t, tblInfo.Meta()) + return nil + }), IsNil) +} + +func checkAllBundlesNotChange(c *C, bundles []*placement.Bundle) { + currentBundles, err := infosync.GetAllRuleBundles(context.TODO()) + c.Assert(err, IsNil) + + bundlesMap := make(map[string]*placement.Bundle) + for _, bundle := range currentBundles { + bundlesMap[bundle.ID] = bundle + } + c.Assert(len(bundlesMap), Equals, len(currentBundles)) + c.Assert(len(currentBundles), Equals, len(bundles)) + + for _, bundle := range bundles { + got, ok := bundlesMap[bundle.ID] + c.Assert(ok, IsTrue) + + expectedJSON, err := json.Marshal(bundle) + c.Assert(err, IsNil) + + gotJSON, err := json.Marshal(got) + c.Assert(err, IsNil) + c.Assert(string(gotJSON), Equals, string(expectedJSON)) + } +} + +func checkTableBundlesInPD(c *C, t *meta.Meta, tblInfo *model.TableInfo) { + checks := make([]*struct { + ID string + bundle *placement.Bundle + }, 0) + + bundle, err := placement.NewTableBundle(t, tblInfo) + c.Assert(err, IsNil) + checks = append(checks, &struct { + ID string + bundle *placement.Bundle + }{ID: placement.GroupID(tblInfo.ID), bundle: bundle}) + + if tblInfo.Partition != nil { + for _, def := range tblInfo.Partition.Definitions { + bundle, err := placement.NewPartitionBundle(t, def) + c.Assert(err, IsNil) + checks = append(checks, &struct { + ID string + bundle *placement.Bundle + }{ID: placement.GroupID(def.ID), bundle: bundle}) + } + } + + for _, check := range checks { + got, err := infosync.GetRuleBundle(context.TODO(), check.ID) + c.Assert(err, IsNil) + if check.bundle == nil { + c.Assert(got.IsEmpty(), IsTrue) + } else { + expectedJSON, err := json.Marshal(check.bundle) + c.Assert(err, IsNil) + + gotJSON, err := json.Marshal(got) + c.Assert(err, IsNil) + c.Assert(string(gotJSON), Equals, string(expectedJSON)) + } + } +} + func (s *testDBSuite6) TestPlacementPolicy(c *C) { + clearAllBundles(c) tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") tk.MustExec("drop placement policy if exists x") @@ -55,16 +150,16 @@ func (s *testDBSuite6) TestPlacementPolicy(c *C) { tk.MustExec("create placement policy x " + "LEARNERS=1 " + "LEARNER_CONSTRAINTS=\"[+region=cn-west-1]\" " + - "VOTERS=3 " + - "VOTER_CONSTRAINTS=\"[+disk=ssd]\"") + "FOLLOWERS=3 " + + "FOLLOWER_CONSTRAINTS=\"[+disk=ssd]\"") checkFunc := func(policyInfo *model.PolicyInfo) { c.Assert(policyInfo.ID != 0, Equals, true) c.Assert(policyInfo.Name.L, Equals, "x") - c.Assert(policyInfo.Followers, Equals, uint64(0)) - c.Assert(policyInfo.FollowerConstraints, Equals, "") - c.Assert(policyInfo.Voters, Equals, uint64(3)) - c.Assert(policyInfo.VoterConstraints, Equals, "[+disk=ssd]") + c.Assert(policyInfo.Followers, Equals, uint64(3)) + c.Assert(policyInfo.FollowerConstraints, Equals, "[+disk=ssd]") + c.Assert(policyInfo.Voters, Equals, uint64(0)) + c.Assert(policyInfo.VoterConstraints, Equals, "") c.Assert(policyInfo.Learners, Equals, uint64(1)) c.Assert(policyInfo.LearnerConstraints, Equals, "[+region=cn-west-1]") c.Assert(policyInfo.State, Equals, model.StatePublic) @@ -96,6 +191,10 @@ func (s *testDBSuite6) TestPlacementPolicy(c *C) { "REGIONS=\"cn-east-1,cn-east-2\" ") tk.MustQuery("show warnings").Check(testkit.Rows("Note 8238 Placement policy 'X' already exists")) + bundles, err := infosync.GetAllRuleBundles(context.TODO()) + c.Assert(err, IsNil) + c.Assert(0, Equals, len(bundles)) + tk.MustExec("drop placement policy x") tk.MustGetErrCode("drop placement policy x", mysql.ErrPlacementPolicyNotExists) tk.MustExec("drop placement policy if exists x") @@ -152,7 +251,7 @@ func (s *testDBSuite6) TestPlacementValidation(c *C) { }, { name: "constraints may be incompatible with itself", - settings: "LEARNERS=1 " + + settings: "FOLLOWERS=3 LEARNERS=1 " + "LEARNER_CONSTRAINTS=\"[+zone=cn-west-1, +zone=cn-west-2]\"", errmsg: "invalid label constraints format: should be [constraint1, ...] (error conflicting label constraints: '+zone=cn-west-2' and '+zone=cn-west-1'), {constraint1: cnt1, ...} (error yaml: unmarshal errors:\n" + " line 1: cannot unmarshal !!seq into map[string]int), or any yaml compatible representation: invalid LearnerConstraints", @@ -188,12 +287,93 @@ func (s *testDBSuite6) TestPlacementValidation(c *C) { err := tk.ExecToErr(sql) c.Assert(err, NotNil) c.Assert(err.Error(), Equals, ca.errmsg) - tk.MustQuery("show placement where target='POLICY x'").Check(testkit.Rows("POLICY x PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east\"")) + tk.MustQuery("show placement where target='POLICY x'").Check(testkit.Rows("POLICY x PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east\" NULL")) } } tk.MustExec("drop placement policy x") } +func (s *testDBSuite6) TestSkipPlacementValidation(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop placement policy if exists x") + tk.MustExec("drop placement policy if exists y") + tk.MustExec("drop table if exists t, t_range_p") + + tk.MustExec("create placement policy `y` followers=2;") + tk.MustExec("alter database test placement policy='y'") + tk.MustQuery(`show create database test`).Check(testutil.RowsWithSep("|", + "test CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ /*T![placement] PLACEMENT POLICY=`y` */", + )) + + tk.MustQuery(`select @@PLACEMENT_CHECKS;`).Check(testkit.Rows("1")) + tk.MustGetErrCode("create table t(a int) PLACEMENT POLICY=\"x\"", mysql.ErrPlacementPolicyNotExists) + + tk.MustExec("SET PLACEMENT_CHECKS = 0;") + tk.MustQuery(`select @@PLACEMENT_CHECKS;`).Check(testkit.Rows("0")) + + // Test for `Create` + // Test `CREATE DATABASE`: Skip the check, and create database with default placement option. + tk.MustExec("create database db_skip_validation PLACEMENT POLICY=\"x\"") + tk.MustQuery(`show create database db_skip_validation`).Check(testutil.RowsWithSep("|", + "db_skip_validation CREATE DATABASE `db_skip_validation` /*!40100 DEFAULT CHARACTER SET utf8mb4 */", + )) + // Test `CREATE TABLE`: Skip the check, and inherit from the database placement policy when create table + tk.MustExec("create table t(a int) PLACEMENT POLICY=\"x\"") + tk.MustQuery("show create table t").Check(testkit.Rows("t CREATE TABLE `t` (\n" + + " `a` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PLACEMENT POLICY=`y` */")) + // Test `CREATE PARTITION`: Skip the check, and inherit from the table placement policy when create partition + tk.MustExec("create table t_range_p(id int) placement policy y partition by range(id) (" + + "PARTITION p0 VALUES LESS THAN (100)," + + "PARTITION p1 VALUES LESS THAN (1000) placement policy x)", + ) + tk.MustQuery("show create table t_range_p").Check(testkit.Rows("t_range_p CREATE TABLE `t_range_p` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PLACEMENT POLICY=`y` */\n" + + "PARTITION BY RANGE (`id`)\n" + + "(PARTITION `p0` VALUES LESS THAN (100),\n" + + " PARTITION `p1` VALUES LESS THAN (1000))", + )) + + // Test for `ALTER` + // Test `ALTER DATABASE`: Skip the check, keep the original opts. + tk.MustExec("alter database db_skip_validation PLACEMENT POLICY=\"x\"") + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 1) + tk.MustQuery(`show create database db_skip_validation`).Check(testutil.RowsWithSep("|", + "db_skip_validation CREATE DATABASE `db_skip_validation` /*!40100 DEFAULT CHARACTER SET utf8mb4 */", + )) + // Test `ALTER TABLE`: Skip the check, keep the original opts. + tk.MustExec("alter table t PLACEMENT POLICY=\"x\"") + tk.MustQuery("show create table t").Check(testkit.Rows("t CREATE TABLE `t` (\n" + + " `a` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PLACEMENT POLICY=`y` */")) + // Test `ALTER PARTITION`: Skip the check, keep the original opts. + tk.MustExec("alter table t_range_p PARTITION p1 placement policy y;") + tk.MustExec("alter table t_range_p PARTITION p0 placement policy x;") + tk.MustQuery("show create table t_range_p").Check(testkit.Rows("t_range_p CREATE TABLE `t_range_p` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PLACEMENT POLICY=`y` */\n" + + "PARTITION BY RANGE (`id`)\n" + + "(PARTITION `p0` VALUES LESS THAN (100),\n" + + " PARTITION `p1` VALUES LESS THAN (1000) /*T![placement] PLACEMENT POLICY=`y` */)", + )) + tk.MustExec("alter table t_range_p PARTITION p1 placement policy x;") + tk.MustQuery("show create table t_range_p").Check(testkit.Rows("t_range_p CREATE TABLE `t_range_p` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PLACEMENT POLICY=`y` */\n" + + "PARTITION BY RANGE (`id`)\n" + + "(PARTITION `p0` VALUES LESS THAN (100),\n" + + " PARTITION `p1` VALUES LESS THAN (1000) /*T![placement] PLACEMENT POLICY=`y` */)", + )) + + tk.MustExec("SET PLACEMENT_CHECKS = 1;") + tk.MustExec("drop table if exists t, t_range_p") + tk.MustExec("alter database test placement policy='default'") + tk.MustExec("drop database db_skip_validation;") + tk.MustExec("drop placement policy if exists y;") +} + func (s *testDBSuite6) TestResetSchemaPlacement(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("drop database if exists TestResetPlacementDB;") @@ -247,35 +427,68 @@ func (s *testDBSuite6) TestResetSchemaPlacement(c *C) { tk.MustExec("drop database TestResetPlacementDB;") } +func (s *testDBSuite6) TestCreateOrReplacePlacementPolicy(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop placement policy if exists x") + + // If the policy does not exist, CREATE OR REPLACE PLACEMENT POLICY is the same as CREATE PLACEMENT POLICY + tk.MustExec("create or replace placement policy x primary_region=\"cn-east-1\" regions=\"cn-east-1,cn-east\"") + defer tk.MustExec("drop placement policy if exists x") + tk.MustQuery("show create placement policy x").Check(testkit.Rows("x CREATE PLACEMENT POLICY `x` PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east\"")) + + // If the policy does exist, CREATE OR REPLACE PLACEMENT_POLICY is the same as ALTER PLACEMENT POLICY. + tk.MustExec("create or replace placement policy x primary_region=\"cn-east-1\" regions=\"cn-east-1\"") + tk.MustQuery("show create placement policy x").Check(testkit.Rows("x CREATE PLACEMENT POLICY `x` PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1\"")) + + // Cannot be used together with the if not exists clause. Ref: https://mariadb.com/kb/en/create-view + tk.MustGetErrMsg("create or replace placement policy if not exists x primary_region=\"cn-east-1\" regions=\"cn-east-1\"", "[ddl:1221]Incorrect usage of OR REPLACE and IF NOT EXISTS") +} + func (s *testDBSuite6) TestAlterPlacementPolicy(c *C) { + clearAllBundles(c) tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") tk.MustExec("drop placement policy if exists x") + tk.MustExec("drop table if exists tp") tk.MustExec("create placement policy x primary_region=\"cn-east-1\" regions=\"cn-east-1,cn-east\"") defer tk.MustExec("drop placement policy if exists x") + // create a table ref to policy x, testing for alter policy will update PD bundles + tk.MustExec(`CREATE TABLE tp (id INT) placement policy x PARTITION BY RANGE (id) ( + PARTITION p0 VALUES LESS THAN (100), + PARTITION p1 VALUES LESS THAN (1000) placement policy x + );`) + defer tk.MustExec("drop table if exists tp") + + policy, ok := tk.Se.GetInfoSchema().(infoschema.InfoSchema).PolicyByName(model.NewCIStr("x")) + c.Assert(ok, IsTrue) + // test for normal cases tk.MustExec("alter placement policy x PRIMARY_REGION=\"bj\" REGIONS=\"bj,sh\"") - tk.MustQuery("show placement where target='POLICY x'").Check(testkit.Rows("POLICY x PRIMARY_REGION=\"bj\" REGIONS=\"bj,sh\"")) - tk.MustQuery("select * from information_schema.placement_rules where policy_name = 'x'").Check(testkit.Rows("3 def x bj bj,sh 0 0")) + tk.MustQuery("show placement where target='POLICY x'").Check(testkit.Rows("POLICY x PRIMARY_REGION=\"bj\" REGIONS=\"bj,sh\" NULL")) + tk.MustQuery("select * from information_schema.placement_rules where policy_name = 'x'").Check(testkit.Rows(strconv.FormatInt(policy.ID, 10) + " def x bj bj,sh 0 0")) + checkExistTableBundlesInPD(c, s.dom, "test", "tp") tk.MustExec("alter placement policy x " + "PRIMARY_REGION=\"bj\" " + "REGIONS=\"bj\" " + "SCHEDULE=\"EVEN\"") - tk.MustQuery("show placement where target='POLICY x'").Check(testkit.Rows("POLICY x PRIMARY_REGION=\"bj\" REGIONS=\"bj\" SCHEDULE=\"EVEN\"")) - tk.MustQuery("select * from INFORMATION_SCHEMA.PLACEMENT_RULES WHERE POLICY_NAME='x'").Check(testkit.Rows("3 def x bj bj EVEN 0 0")) + tk.MustQuery("show placement where target='POLICY x'").Check(testkit.Rows("POLICY x PRIMARY_REGION=\"bj\" REGIONS=\"bj\" SCHEDULE=\"EVEN\" NULL")) + tk.MustQuery("select * from INFORMATION_SCHEMA.PLACEMENT_RULES WHERE POLICY_NAME='x'").Check(testkit.Rows(strconv.FormatInt(policy.ID, 10) + " def x bj bj EVEN 0 0")) + checkExistTableBundlesInPD(c, s.dom, "test", "tp") tk.MustExec("alter placement policy x " + "LEADER_CONSTRAINTS=\"[+region=us-east-1]\" " + "FOLLOWER_CONSTRAINTS=\"[+region=us-east-2]\" " + "FOLLOWERS=3") tk.MustQuery("show placement where target='POLICY x'").Check( - testkit.Rows("POLICY x LEADER_CONSTRAINTS=\"[+region=us-east-1]\" FOLLOWERS=3 FOLLOWER_CONSTRAINTS=\"[+region=us-east-2]\""), + testkit.Rows("POLICY x LEADER_CONSTRAINTS=\"[+region=us-east-1]\" FOLLOWERS=3 FOLLOWER_CONSTRAINTS=\"[+region=us-east-2]\" NULL"), ) tk.MustQuery("SELECT POLICY_NAME,LEADER_CONSTRAINTS,FOLLOWER_CONSTRAINTS,FOLLOWERS FROM information_schema.PLACEMENT_RULES WHERE POLICY_NAME = 'x'").Check( testkit.Rows("x [+region=us-east-1] [+region=us-east-2] 3"), ) + checkExistTableBundlesInPD(c, s.dom, "test", "tp") tk.MustExec("alter placement policy x " + "VOTER_CONSTRAINTS=\"[+region=bj]\" " + @@ -284,7 +497,7 @@ func (s *testDBSuite6) TestAlterPlacementPolicy(c *C) { "VOTERS=5 " + "LEARNERS=3") tk.MustQuery("show placement where target='POLICY x'").Check( - testkit.Rows("POLICY x CONSTRAINTS=\"[+disk=ssd]\" VOTERS=5 VOTER_CONSTRAINTS=\"[+region=bj]\" LEARNERS=3 LEARNER_CONSTRAINTS=\"[+region=sh]\""), + testkit.Rows("POLICY x CONSTRAINTS=\"[+disk=ssd]\" VOTERS=5 VOTER_CONSTRAINTS=\"[+region=bj]\" LEARNERS=3 LEARNER_CONSTRAINTS=\"[+region=sh]\" NULL"), ) tk.MustQuery("SELECT " + "CATALOG_NAME,POLICY_NAME,SCHEMA_NAME,TABLE_NAME,PARTITION_NAME," + @@ -292,8 +505,10 @@ func (s *testDBSuite6) TestAlterPlacementPolicy(c *C) { "SCHEDULE,FOLLOWERS,LEARNERS FROM INFORMATION_SCHEMA.placement_rules WHERE POLICY_NAME='x'").Check( testkit.Rows("def x [+disk=ssd] [+region=sh] 0 3"), ) + checkExistTableBundlesInPD(c, s.dom, "test", "tp") // test alter not exist policies + tk.MustExec("drop table tp") tk.MustExec("drop placement policy x") tk.MustGetErrCode("alter placement policy x REGIONS=\"bj,sh\"", mysql.ErrPlacementPolicyNotExists) tk.MustGetErrCode("alter placement policy x2 REGIONS=\"bj,sh\"", mysql.ErrPlacementPolicyNotExists) @@ -301,6 +516,7 @@ func (s *testDBSuite6) TestAlterPlacementPolicy(c *C) { } func (s *testDBSuite6) TestCreateTableWithPlacementPolicy(c *C) { + clearAllBundles(c) tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") tk.MustExec("drop table if exists t,t_range_p,t_hash_p,t_list_p") @@ -319,6 +535,7 @@ func (s *testDBSuite6) TestCreateTableWithPlacementPolicy(c *C) { "FOLLOWERS=2 ") defer tk.MustExec("DROP TABLE IF EXISTS t") tk.MustQuery("SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TIDB_PLACEMENT_POLICY_NAME, TIDB_DIRECT_PLACEMENT FROM information_schema.Tables WHERE TABLE_SCHEMA='test' AND TABLE_NAME = 't'").Check(testkit.Rows(`def test t PRIMARY_REGION="cn-east-1" REGIONS="cn-east-1, cn-east-2" FOLLOWERS=2`)) + checkExistTableBundlesInPD(c, s.dom, "test", "t") tbl := testGetTableByName(c, tk.Se, "test", "t") c.Assert(tbl, NotNil) @@ -575,7 +792,7 @@ func (s *testDBSuite6) TestPolicyCacheAndPolicyDependency(c *C) { tk.MustExec("create placement policy x primary_region=\"r1\" regions=\"r1,r2\" schedule=\"EVEN\";") po := testGetPolicyByName(c, tk.Se, "x", true) c.Assert(po, NotNil) - tk.MustQuery("show placement").Check(testkit.Rows("POLICY x PRIMARY_REGION=\"r1\" REGIONS=\"r1,r2\" SCHEDULE=\"EVEN\"")) + tk.MustQuery("show placement").Check(testkit.Rows("POLICY x PRIMARY_REGION=\"r1\" REGIONS=\"r1,r2\" SCHEDULE=\"EVEN\" NULL")) tk.MustExec("drop table if exists t") tk.MustExec("create table t (a int) placement policy \"x\"") @@ -643,6 +860,7 @@ func (s *testDBSuite6) TestPolicyCacheAndPolicyDependency(c *C) { } func (s *testDBSuite6) TestAlterTablePartitionWithPlacementPolicy(c *C) { + clearAllBundles(c) tk := testkit.NewTestKit(c, s.store) defer func() { tk.MustExec("drop table if exists t1") @@ -662,19 +880,21 @@ func (s *testDBSuite6) TestAlterTablePartitionWithPlacementPolicy(c *C) { "PRIMARY_REGION,REGIONS,CONSTRAINTS,LEADER_CONSTRAINTS,FOLLOWER_CONSTRAINTS,LEARNER_CONSTRAINTS," + "SCHEDULE,FOLLOWERS,LEARNERS FROM INFORMATION_SCHEMA.placement_rules WHERE table_NAME='t1'").Check( testkit.Rows()) + checkExistTableBundlesInPD(c, s.dom, "test", "t1") tk.MustExec("alter table t1 partition p0 " + "PRIMARY_REGION=\"cn-east-1\" " + "REGIONS=\"cn-east-1, cn-east-2\" " + "FOLLOWERS=2 ") - tk.MustQuery("SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, PARTITION_NAME, TIDB_PLACEMENT_POLICY_NAME, TIDB_DIRECT_PLACEMENT FROM information_schema.Partitions WHERE TABLE_SCHEMA='test' AND TABLE_NAME = 't1' AND PARTITION_NAME = 'p0'").Check(testkit.Rows(`def test t1 p0 PRIMARY_REGION="cn-east-1" REGIONS="cn-east-1, cn-east-2" FOLLOWERS=2`)) + tk.MustQuery("SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, PARTITION_NAME, TIDB_PLACEMENT_POLICY_NAME, TIDB_DIRECT_PLACEMENT FROM information_schema.Partitions WHERE TABLE_SCHEMA='test' AND TABLE_NAME = 't1' AND PARTITION_NAME = 'p0'").Check(testkit.Rows(`def test t1 p0 PRIMARY_REGION="cn-east-1" REGIONS="cn-east-1, cn-east-2" FOLLOWERS=2`)) tk.MustQuery("SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, PARTITION_NAME, TIDB_PLACEMENT_POLICY_NAME, TIDB_DIRECT_PLACEMENT FROM information_schema.Partitions WHERE TABLE_SCHEMA='test' AND TABLE_NAME = 't1' AND PARTITION_NAME = 'p1'").Check(testkit.Rows(`def test t1 p1 `)) tbl := testGetTableByName(c, tk.Se, "test", "t1") c.Assert(tbl, NotNil) ptDef := testGetPartitionDefinitionsByName(c, tk.Se, "test", "t1", "p0") - c.Assert(ptDef.PlacementPolicyRef.Name.L, Equals, "") + c.Assert(ptDef.PlacementPolicyRef, IsNil) c.Assert(ptDef.DirectPlacementOpts, NotNil) + checkExistTableBundlesInPD(c, s.dom, "test", "t1") checkFunc := func(policySetting *model.PlacementSettings) { c.Assert(policySetting.PrimaryRegion, Equals, "cn-east-1") @@ -711,7 +931,8 @@ func (s *testDBSuite6) TestAlterTablePartitionWithPlacementPolicy(c *C) { "FOLLOWERS=2 ") tk.MustExec("alter table t1 partition p0 " + "PLACEMENT POLICY=\"x\"") - tk.MustQuery("SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, PARTITION_NAME, TIDB_PLACEMENT_POLICY_NAME, TIDB_DIRECT_PLACEMENT FROM information_schema.Partitions WHERE TABLE_SCHEMA='test' AND TABLE_NAME = 't1' AND PARTITION_NAME = 'p0'").Check(testkit.Rows(`def test t1 p0 x `)) + tk.MustQuery("SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, PARTITION_NAME, TIDB_PLACEMENT_POLICY_NAME, TIDB_DIRECT_PLACEMENT FROM information_schema.Partitions WHERE TABLE_SCHEMA='test' AND TABLE_NAME = 't1' AND PARTITION_NAME = 'p0'").Check(testkit.Rows(`def test t1 p0 x `)) + checkExistTableBundlesInPD(c, s.dom, "test", "t1") ptDef = testGetPartitionDefinitionsByName(c, tk.Se, "test", "t1", "p0") c.Assert(ptDef, NotNil) @@ -723,11 +944,12 @@ func (s *testDBSuite6) TestAlterTablePartitionWithPlacementPolicy(c *C) { "PRIMARY_REGION=\"cn-east-1\" " + "REGIONS=\"cn-east-1, cn-east-2\" " + "FOLLOWERS=2 ") - tk.MustQuery("SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, PARTITION_NAME, TIDB_PLACEMENT_POLICY_NAME, TIDB_DIRECT_PLACEMENT FROM information_schema.Partitions WHERE TABLE_SCHEMA='test' AND TABLE_NAME = 't1' AND PARTITION_NAME = 'p0'").Check(testkit.Rows("def test t1 p0 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1, cn-east-2\" FOLLOWERS=2")) + tk.MustQuery("SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, PARTITION_NAME, TIDB_PLACEMENT_POLICY_NAME, TIDB_DIRECT_PLACEMENT FROM information_schema.Partitions WHERE TABLE_SCHEMA='test' AND TABLE_NAME = 't1' AND PARTITION_NAME = 'p0'").Check(testkit.Rows("def test t1 p0 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1, cn-east-2\" FOLLOWERS=2")) ptDef = testGetPartitionDefinitionsByName(c, tk.Se, "test", "t1", "p0") c.Assert(ptDef, NotNil) c.Assert(ptDef.DirectPlacementOpts, NotNil) + checkExistTableBundlesInPD(c, s.dom, "test", "t1") checkFunc = func(policySetting *model.PlacementSettings) { c.Assert(policySetting.PrimaryRegion, Equals, "cn-east-1") @@ -763,9 +985,10 @@ func testGetPartitionDefinitionsByName(c *C, ctx sessionctx.Context, db string, } func (s *testDBSuite6) TestPolicyInheritance(c *C) { + clearAllBundles(c) tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") - tk.MustExec("drop table if exists t") + tk.MustExec("drop table if exists t, t0") tk.MustExec("drop placement policy if exists x") // test table inherit database's placement rules. @@ -777,23 +1000,38 @@ func (s *testDBSuite6) TestPolicyInheritance(c *C) { tk.MustQuery("show create table t").Check(testkit.Rows("t CREATE TABLE `t` (\n" + " `a` int(11) DEFAULT NULL\n" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] CONSTRAINTS=\"[+zone=hangzhou]\" */")) + checkExistTableBundlesInPD(c, s.dom, "mydb", "t") tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int) constraints=\"[+zone=suzhou]\"") tk.MustQuery("show create table t").Check(testkit.Rows("t CREATE TABLE `t` (\n" + " `a` int(11) DEFAULT NULL\n" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] CONSTRAINTS=\"[+zone=suzhou]\" */")) + checkExistTableBundlesInPD(c, s.dom, "mydb", "t") tk.MustExec("drop table if exists t") + // test create table like should not inherit database's placement rules. + tk.MustExec("create table t0 (a int) placement policy 'default'") + tk.MustQuery("show create table t0").Check(testkit.Rows("t0 CREATE TABLE `t0` (\n" + + " `a` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) + checkExistTableBundlesInPD(c, s.dom, "mydb", "t0") + tk.MustExec("create table t1 like t0") + tk.MustQuery("show create table t1").Check(testkit.Rows("t1 CREATE TABLE `t1` (\n" + + " `a` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) + checkExistTableBundlesInPD(c, s.dom, "mydb", "t1") + tk.MustExec("drop table if exists t0, t") + // table will inherit db's placement rules, which is shared by all partition as default one. tk.MustExec("create table t(a int) partition by range(a) (partition p0 values less than (100), partition p1 values less than (200))") tk.MustQuery("show create table t").Check(testkit.Rows("t CREATE TABLE `t` (\n" + " `a` int(11) DEFAULT NULL\n" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] CONSTRAINTS=\"[+zone=hangzhou]\" */\n" + - "PARTITION BY RANGE ( `a` ) (\n" + - " PARTITION `p0` VALUES LESS THAN (100),\n" + - " PARTITION `p1` VALUES LESS THAN (200)\n" + - ")")) + "PARTITION BY RANGE (`a`)\n" + + "(PARTITION `p0` VALUES LESS THAN (100),\n" + + " PARTITION `p1` VALUES LESS THAN (200))")) + checkExistTableBundlesInPD(c, s.dom, "mydb", "t") tk.MustExec("drop table if exists t") // partition's specified placement rules will override the default one. @@ -801,10 +1039,10 @@ func (s *testDBSuite6) TestPolicyInheritance(c *C) { tk.MustQuery("show create table t").Check(testkit.Rows("t CREATE TABLE `t` (\n" + " `a` int(11) DEFAULT NULL\n" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] CONSTRAINTS=\"[+zone=hangzhou]\" */\n" + - "PARTITION BY RANGE ( `a` ) (\n" + - " PARTITION `p0` VALUES LESS THAN (100) /*T![placement] CONSTRAINTS=\"[+zone=suzhou]\" */,\n" + - " PARTITION `p1` VALUES LESS THAN (200)\n" + - ")")) + "PARTITION BY RANGE (`a`)\n" + + "(PARTITION `p0` VALUES LESS THAN (100) /*T![placement] CONSTRAINTS=\"[+zone=suzhou]\" */,\n" + + " PARTITION `p1` VALUES LESS THAN (200))")) + checkExistTableBundlesInPD(c, s.dom, "mydb", "t") tk.MustExec("drop table if exists t") // test partition override table's placement rules. @@ -813,8 +1051,1007 @@ func (s *testDBSuite6) TestPolicyInheritance(c *C) { tk.MustQuery("show create table t").Check(testkit.Rows("t CREATE TABLE `t` (\n" + " `a` int(11) DEFAULT NULL\n" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] CONSTRAINTS=\"[+zone=suzhou]\" */\n" + - "PARTITION BY RANGE ( `a` ) (\n" + - " PARTITION `p0` VALUES LESS THAN (100) /*T![placement] CONSTRAINTS=\"[+zone=changzhou]\" */,\n" + - " PARTITION `p1` VALUES LESS THAN (200)\n" + - ")")) + "PARTITION BY RANGE (`a`)\n" + + "(PARTITION `p0` VALUES LESS THAN (100) /*T![placement] CONSTRAINTS=\"[+zone=changzhou]\" */,\n" + + " PARTITION `p1` VALUES LESS THAN (200))")) + checkExistTableBundlesInPD(c, s.dom, "mydb", "t") +} + +func (s *testDBSuite6) TestDatabasePlacement(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("drop database if exists db2") + tk.MustExec("drop placement policy if exists p1") + + tk.MustExec("create placement policy p1 primary_region='r1' regions='r1'") + defer tk.MustExec("drop placement policy p1") + + policy, ok := tk.Se.GetInfoSchema().(infoschema.InfoSchema).PolicyByName(model.NewCIStr("p1")) + c.Assert(ok, IsTrue) + + tk.MustExec(`create database db2`) + defer tk.MustExec("drop database db2") + tk.MustQuery("show create database db2").Check(testkit.Rows( + "db2 CREATE DATABASE `db2` /*!40100 DEFAULT CHARACTER SET utf8mb4 */", + )) + + // alter with policy + tk.MustExec("alter database db2 placement policy p1") + tk.MustQuery("show create database db2").Check(testkit.Rows( + "db2 CREATE DATABASE `db2` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ /*T![placement] PLACEMENT POLICY=`p1` */", + )) + + db, ok := tk.Se.GetInfoSchema().(infoschema.InfoSchema).SchemaByName(model.NewCIStr("db2")) + c.Assert(ok, IsTrue) + c.Assert(db.PlacementPolicyRef.ID, Equals, policy.ID) + c.Assert(db.DirectPlacementOpts, IsNil) + + // alter with direct placement + tk.MustExec("alter database db2 primary_region='r2' regions='r1,r2'") + tk.MustQuery("show create database db2").Check(testkit.Rows( + "db2 CREATE DATABASE `db2` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ /*T![placement] PRIMARY_REGION=\"r2\" REGIONS=\"r1,r2\" */", + )) + + // reset with placement policy 'default' + tk.MustExec("alter database db2 placement policy default") + tk.MustQuery("show create database db2").Check(testkit.Rows( + "db2 CREATE DATABASE `db2` /*!40100 DEFAULT CHARACTER SET utf8mb4 */", + )) + + // error invalid policy + err := tk.ExecToErr("alter database db2 placement policy px") + c.Assert(err.Error(), Equals, "[schema:8239]Unknown placement policy 'px'") + + // error when policy and direct options both set + err = tk.ExecToErr("alter database db2 placement policy p1 primary_region='r2' regions='r2'") + c.Assert(err.Error(), Equals, "[ddl:8240]Placement policy 'p1' can't co-exist with direct placement options") + + // error for invalid placement opt + err = tk.ExecToErr("alter database db2 primary_region='r2' regions='r2' leader_constraints='[+region=bj]'") + c.Assert(err.Error(), Equals, "invalid placement option: should be [LEADER/VOTER/LEARNER/FOLLOWER]_CONSTRAINTS=.. [VOTERS/FOLLOWERS/LEARNERS]=.., mixed other sugar options PRIMARY_REGION=\"r2\" REGIONS=\"r2\" LEADER_CONSTRAINTS=\"[+region=bj]\"") + + // failed alter has no effect + tk.MustQuery("show create database db2").Check(testkit.Rows( + "db2 CREATE DATABASE `db2` /*!40100 DEFAULT CHARACTER SET utf8mb4 */", + )) +} + +func (s *testDBSuite6) TestDropDatabaseGCPlacement(c *C) { + clearAllBundles(c) + failpoint.Enable("github.com/pingcap/tidb/store/gcworker/ignoreDeleteRangeFailed", `return`) + defer func(originGC bool) { + failpoint.Disable("github.com/pingcap/tidb/store/gcworker/ignoreDeleteRangeFailed") + if originGC { + ddl.EmulatorGCEnable() + } else { + ddl.EmulatorGCDisable() + } + }(ddl.IsEmulatorGCEnable()) + ddl.EmulatorGCDisable() + + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("drop database if exists db2") + + tk.MustExec("use test") + + tk.MustExec("create table t (id int) primary_region='r0' regions='r0'") + defer tk.MustExec("drop table if exists t") + + tk.MustExec("create database db2") + tk.MustExec("create table db2.t0 (id int)") + tk.MustExec("create table db2.t1 (id int) primary_region='r1' regions='r1,r2'") + tk.MustExec(`create table db2.t2 (id int) primary_region='r1' regions='r1,r2' PARTITION BY RANGE (id) ( + PARTITION p0 VALUES LESS THAN (100) primary_region='r2' regions='r2', + PARTITION p1 VALUES LESS THAN (1000) + )`) + + is := tk.Se.GetInfoSchema().(infoschema.InfoSchema) + t, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + + tk.MustExec("drop database db2") + + bundles, err := infosync.GetAllRuleBundles(context.TODO()) + c.Assert(err, IsNil) + c.Assert(len(bundles), Equals, 4) + + gcWorker, err := gcworker.NewMockGCWorker(s.store) + c.Assert(err, IsNil) + c.Assert(gcWorker.DeleteRanges(context.TODO(), math.MaxInt64), IsNil) + + bundles, err = infosync.GetAllRuleBundles(context.TODO()) + c.Assert(err, IsNil) + c.Assert(len(bundles), Equals, 1) + c.Assert(bundles[0].ID, Equals, placement.GroupID(t.Meta().ID)) +} + +func (s *testDBSuite6) TestDropTableGCPlacement(c *C) { + clearAllBundles(c) + failpoint.Enable("github.com/pingcap/tidb/store/gcworker/ignoreDeleteRangeFailed", `return`) + defer func(originGC bool) { + failpoint.Disable("github.com/pingcap/tidb/store/gcworker/ignoreDeleteRangeFailed") + if originGC { + ddl.EmulatorGCEnable() + } else { + ddl.EmulatorGCDisable() + } + }(ddl.IsEmulatorGCEnable()) + ddl.EmulatorGCDisable() + + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + + tk.MustExec("create table t0 (id int)") + defer tk.MustExec("drop table if exists t0") + + tk.MustExec("create table t1 (id int) primary_region='r1' regions='r1,r2'") + defer tk.MustExec("drop table if exists t1") + + tk.MustExec(`create table t2 (id int) primary_region='r1' regions='r1,r2' PARTITION BY RANGE (id) ( + PARTITION p0 VALUES LESS THAN (100) primary_region='r2' regions='r2', + PARTITION p1 VALUES LESS THAN (1000) + )`) + defer tk.MustExec("drop table if exists t2") + + is := tk.Se.GetInfoSchema().(infoschema.InfoSchema) + t1, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) + c.Assert(err, IsNil) + + tk.MustExec("drop table t2") + + bundles, err := infosync.GetAllRuleBundles(context.TODO()) + c.Assert(err, IsNil) + c.Assert(len(bundles), Equals, 3) + + gcWorker, err := gcworker.NewMockGCWorker(s.store) + c.Assert(err, IsNil) + c.Assert(gcWorker.DeleteRanges(context.TODO(), math.MaxInt64), IsNil) + + bundles, err = infosync.GetAllRuleBundles(context.TODO()) + c.Assert(err, IsNil) + c.Assert(len(bundles), Equals, 1) + c.Assert(bundles[0].ID, Equals, placement.GroupID(t1.Meta().ID)) +} + +func (s *testDBSuite6) TestAlterTablePlacement(c *C) { + clearAllBundles(c) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists tp") + tk.MustExec("drop placement policy if exists p1") + + tk.MustExec("create placement policy p1 primary_region='r1' regions='r1'") + defer tk.MustExec("drop placement policy p1") + + policy, ok := tk.Se.GetInfoSchema().(infoschema.InfoSchema).PolicyByName(model.NewCIStr("p1")) + c.Assert(ok, IsTrue) + + tk.MustExec(`CREATE TABLE tp (id INT) PARTITION BY RANGE (id) ( + PARTITION p0 VALUES LESS THAN (100), + PARTITION p1 VALUES LESS THAN (1000) + );`) + defer tk.MustExec("drop table tp") + tk.MustQuery("show create table tp").Check(testkit.Rows("" + + "tp CREATE TABLE `tp` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n" + + "PARTITION BY RANGE (`id`)\n" + + "(PARTITION `p0` VALUES LESS THAN (100),\n" + + " PARTITION `p1` VALUES LESS THAN (1000))")) + checkExistTableBundlesInPD(c, s.dom, "test", "tp") + + // alter with policy + tk.MustExec("alter table tp placement policy p1") + tk.MustQuery("show create table tp").Check(testkit.Rows("" + + "tp CREATE TABLE `tp` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PLACEMENT POLICY=`p1` */\n" + + "PARTITION BY RANGE (`id`)\n" + + "(PARTITION `p0` VALUES LESS THAN (100),\n" + + " PARTITION `p1` VALUES LESS THAN (1000))")) + + tb, err := tk.Se.GetInfoSchema().(infoschema.InfoSchema).TableByName(model.NewCIStr("test"), model.NewCIStr("tp")) + c.Assert(err, IsNil) + c.Assert(tb.Meta().PlacementPolicyRef.ID, Equals, policy.ID) + c.Assert(tb.Meta().DirectPlacementOpts, IsNil) + checkExistTableBundlesInPD(c, s.dom, "test", "tp") + + // alter with direct placement + tk.MustExec("alter table tp primary_region='r2' regions='r1,r2'") + tk.MustQuery("show create table tp").Check(testkit.Rows("" + + "tp CREATE TABLE `tp` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PRIMARY_REGION=\"r2\" REGIONS=\"r1,r2\" */\n" + + "PARTITION BY RANGE (`id`)\n" + + "(PARTITION `p0` VALUES LESS THAN (100),\n" + + " PARTITION `p1` VALUES LESS THAN (1000))")) + checkExistTableBundlesInPD(c, s.dom, "test", "tp") + + // reset with placement policy 'default' + tk.MustExec("alter table tp placement policy default") + tk.MustQuery("show create table tp").Check(testkit.Rows("" + + "tp CREATE TABLE `tp` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n" + + "PARTITION BY RANGE (`id`)\n" + + "(PARTITION `p0` VALUES LESS THAN (100),\n" + + " PARTITION `p1` VALUES LESS THAN (1000))")) + checkExistTableBundlesInPD(c, s.dom, "test", "tp") + + // error invalid policy + err = tk.ExecToErr("alter table tp placement policy px") + c.Assert(err.Error(), Equals, "[schema:8239]Unknown placement policy 'px'") + + // error when policy and direct options both set + err = tk.ExecToErr("alter table tp placement policy p1 primary_region='r2' regions='r2'") + c.Assert(err.Error(), Equals, "[ddl:8240]Placement policy 'p1' can't co-exist with direct placement options") + + // error for invalid placement opt + err = tk.ExecToErr("alter table tp primary_region='r2' regions='r2' leader_constraints='[+region=bj]'") + c.Assert(err.Error(), Equals, "invalid placement option: should be [LEADER/VOTER/LEARNER/FOLLOWER]_CONSTRAINTS=.. [VOTERS/FOLLOWERS/LEARNERS]=.., mixed other sugar options PRIMARY_REGION=\"r2\" REGIONS=\"r2\" LEADER_CONSTRAINTS=\"[+region=bj]\"") + + // failed alter has no effect + tk.MustQuery("show create table tp").Check(testkit.Rows("" + + "tp CREATE TABLE `tp` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n" + + "PARTITION BY RANGE (`id`)\n" + + "(PARTITION `p0` VALUES LESS THAN (100),\n" + + " PARTITION `p1` VALUES LESS THAN (1000))")) + checkExistTableBundlesInPD(c, s.dom, "test", "tp") +} + +func (s *testDBSuite6) TestDropTablePartitionGCPlacement(c *C) { + clearAllBundles(c) + failpoint.Enable("github.com/pingcap/tidb/store/gcworker/ignoreDeleteRangeFailed", `return`) + defer func(originGC bool) { + failpoint.Disable("github.com/pingcap/tidb/store/gcworker/ignoreDeleteRangeFailed") + if originGC { + ddl.EmulatorGCEnable() + } else { + ddl.EmulatorGCDisable() + } + }(ddl.IsEmulatorGCEnable()) + ddl.EmulatorGCDisable() + + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + + tk.MustExec("create table t0 (id int)") + defer tk.MustExec("drop table if exists t0") + + tk.MustExec("create table t1 (id int) primary_region='r1' regions='r1,r2'") + defer tk.MustExec("drop table if exists t1") + + tk.MustExec(`create table t2 (id int) primary_region='r1' regions='r1,r2' PARTITION BY RANGE (id) ( + PARTITION p0 VALUES LESS THAN (100) primary_region='r2' regions='r2', + PARTITION p1 VALUES LESS THAN (1000) primary_region='r3' regions='r3' + )`) + defer tk.MustExec("drop table if exists t2") + + is := tk.Se.GetInfoSchema().(infoschema.InfoSchema) + t1, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) + c.Assert(err, IsNil) + t2, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t2")) + c.Assert(err, IsNil) + + tk.MustExec("alter table t2 drop partition p0") + + bundles, err := infosync.GetAllRuleBundles(context.TODO()) + c.Assert(err, IsNil) + c.Assert(len(bundles), Equals, 4) + + gcWorker, err := gcworker.NewMockGCWorker(s.store) + c.Assert(err, IsNil) + c.Assert(gcWorker.DeleteRanges(context.TODO(), math.MaxInt64), IsNil) + + bundles, err = infosync.GetAllRuleBundles(context.TODO()) + c.Assert(err, IsNil) + c.Assert(len(bundles), Equals, 3) + bundlesMap := make(map[string]*placement.Bundle) + for _, bundle := range bundles { + bundlesMap[bundle.ID] = bundle + } + _, ok := bundlesMap[placement.GroupID(t1.Meta().ID)] + c.Assert(ok, IsTrue) + + _, ok = bundlesMap[placement.GroupID(t2.Meta().ID)] + c.Assert(ok, IsTrue) + + _, ok = bundlesMap[placement.GroupID(t2.Meta().Partition.Definitions[1].ID)] + c.Assert(ok, IsTrue) +} + +func (s *testDBSuite6) TestAlterTablePartitionPlacement(c *C) { + clearAllBundles(c) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists tp") + tk.MustExec("drop placement policy if exists p0") + tk.MustExec("drop placement policy if exists p1") + + tk.MustExec("create placement policy p0 primary_region='r0' regions='r0'") + defer tk.MustExec("drop placement policy p0") + + tk.MustExec("create placement policy p1 primary_region='r1' regions='r1'") + defer tk.MustExec("drop placement policy p1") + + policy, ok := tk.Se.GetInfoSchema().(infoschema.InfoSchema).PolicyByName(model.NewCIStr("p1")) + c.Assert(ok, IsTrue) + + tk.MustExec(`CREATE TABLE tp (id INT) placement policy p0 PARTITION BY RANGE (id) ( + PARTITION p0 VALUES LESS THAN (100), + PARTITION p1 VALUES LESS THAN (1000) + );`) + defer tk.MustExec("drop table tp") + tk.MustQuery("show create table tp").Check(testkit.Rows("" + + "tp CREATE TABLE `tp` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PLACEMENT POLICY=`p0` */\n" + + "PARTITION BY RANGE (`id`)\n" + + "(PARTITION `p0` VALUES LESS THAN (100),\n" + + " PARTITION `p1` VALUES LESS THAN (1000))")) + checkExistTableBundlesInPD(c, s.dom, "test", "tp") + + // alter with policy + tk.MustExec("alter table tp partition p0 placement policy p1") + tk.MustQuery("show create table tp").Check(testkit.Rows("" + + "tp CREATE TABLE `tp` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PLACEMENT POLICY=`p0` */\n" + + "PARTITION BY RANGE (`id`)\n" + + "(PARTITION `p0` VALUES LESS THAN (100) /*T![placement] PLACEMENT POLICY=`p1` */,\n" + + " PARTITION `p1` VALUES LESS THAN (1000))")) + + tb, err := tk.Se.GetInfoSchema().(infoschema.InfoSchema).TableByName(model.NewCIStr("test"), model.NewCIStr("tp")) + c.Assert(err, IsNil) + c.Assert(tb.Meta().Partition.Definitions[0].PlacementPolicyRef.ID, Equals, policy.ID) + c.Assert(tb.Meta().Partition.Definitions[0].DirectPlacementOpts, IsNil) + checkExistTableBundlesInPD(c, s.dom, "test", "tp") + + // alter with direct placement + tk.MustExec("alter table tp partition p1 primary_region='r2' regions='r1,r2'") + tk.MustQuery("show create table tp").Check(testkit.Rows("" + + "tp CREATE TABLE `tp` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PLACEMENT POLICY=`p0` */\n" + + "PARTITION BY RANGE (`id`)\n" + + "(PARTITION `p0` VALUES LESS THAN (100) /*T![placement] PLACEMENT POLICY=`p1` */,\n" + + " PARTITION `p1` VALUES LESS THAN (1000) /*T![placement] PRIMARY_REGION=\"r2\" REGIONS=\"r1,r2\" */)")) + checkExistTableBundlesInPD(c, s.dom, "test", "tp") + + tk.MustExec("alter table tp partition p1 primary_region='r3' regions='r3,r4'") + tk.MustQuery("show create table tp").Check(testkit.Rows("" + + "tp CREATE TABLE `tp` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PLACEMENT POLICY=`p0` */\n" + + "PARTITION BY RANGE (`id`)\n" + + "(PARTITION `p0` VALUES LESS THAN (100) /*T![placement] PLACEMENT POLICY=`p1` */,\n" + + " PARTITION `p1` VALUES LESS THAN (1000) /*T![placement] PRIMARY_REGION=\"r3\" REGIONS=\"r3,r4\" */)")) + checkExistTableBundlesInPD(c, s.dom, "test", "tp") + + // reset with placement policy 'default' + tk.MustExec("alter table tp partition p1 placement policy default") + tk.MustQuery("show create table tp").Check(testkit.Rows("" + + "tp CREATE TABLE `tp` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PLACEMENT POLICY=`p0` */\n" + + "PARTITION BY RANGE (`id`)\n" + + "(PARTITION `p0` VALUES LESS THAN (100) /*T![placement] PLACEMENT POLICY=`p1` */,\n" + + " PARTITION `p1` VALUES LESS THAN (1000))")) + checkExistTableBundlesInPD(c, s.dom, "test", "tp") + + tk.MustExec("alter table tp partition p0 placement policy default") + tk.MustQuery("show create table tp").Check(testkit.Rows("" + + "tp CREATE TABLE `tp` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PLACEMENT POLICY=`p0` */\n" + + "PARTITION BY RANGE (`id`)\n" + + "(PARTITION `p0` VALUES LESS THAN (100),\n" + + " PARTITION `p1` VALUES LESS THAN (1000))")) + checkExistTableBundlesInPD(c, s.dom, "test", "tp") + + // error invalid policy + err = tk.ExecToErr("alter table tp partition p1 placement policy px") + c.Assert(err.Error(), Equals, "[schema:8239]Unknown placement policy 'px'") + + // error when policy and direct options both set + err = tk.ExecToErr("alter table tp partition p0 placement policy p1 primary_region='r2' regions='r2'") + c.Assert(err.Error(), Equals, "[ddl:8240]Placement policy 'p1' can't co-exist with direct placement options") + + // error for invalid placement opt + err = tk.ExecToErr("alter table tp partition p1 primary_region='r2' regions='r2' leader_constraints='[+region=bj]'") + c.Assert(err.Error(), Equals, "invalid placement option: should be [LEADER/VOTER/LEARNER/FOLLOWER]_CONSTRAINTS=.. [VOTERS/FOLLOWERS/LEARNERS]=.., mixed other sugar options PRIMARY_REGION=\"r2\" REGIONS=\"r2\" LEADER_CONSTRAINTS=\"[+region=bj]\"") + + // error invalid partition name + err = tk.ExecToErr("alter table tp partition p2 primary_region='r2' regions='r2'") + c.Assert(err.Error(), Equals, "[table:1735]Unknown partition 'p2' in table 'tp'") + + // failed alter has no effect + tk.MustQuery("show create table tp").Check(testkit.Rows("" + + "tp CREATE TABLE `tp` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PLACEMENT POLICY=`p0` */\n" + + "PARTITION BY RANGE (`id`)\n" + + "(PARTITION `p0` VALUES LESS THAN (100),\n" + + " PARTITION `p1` VALUES LESS THAN (1000))")) + checkExistTableBundlesInPD(c, s.dom, "test", "tp") +} + +func (s *testDBSuite6) TestAddPartitionWithPlacement(c *C) { + clearAllBundles(c) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists tp") + tk.MustExec("drop placement policy if exists p1") + + tk.MustExec("create placement policy p1 primary_region='r1' regions='r1'") + defer tk.MustExec("drop placement policy p1") + + policy, ok := tk.Se.GetInfoSchema().(infoschema.InfoSchema).PolicyByName(model.NewCIStr("p1")) + c.Assert(ok, IsTrue) + + tk.MustExec(`CREATE TABLE tp (id INT) PARTITION BY RANGE (id) ( + PARTITION p0 VALUES LESS THAN (100), + PARTITION p1 VALUES LESS THAN (1000) + );`) + defer tk.MustExec("drop table tp") + tk.MustQuery("show create table tp").Check(testkit.Rows("" + + "tp CREATE TABLE `tp` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n" + + "PARTITION BY RANGE (`id`)\n" + + "(PARTITION `p0` VALUES LESS THAN (100),\n" + + " PARTITION `p1` VALUES LESS THAN (1000))")) + checkExistTableBundlesInPD(c, s.dom, "test", "tp") + + // Add partitions + tk.MustExec(`alter table tp add partition ( + partition p2 values less than (10000) placement policy p1, + partition p3 values less than (100000) primary_region="r1" regions="r1,r2", + partition p4 values less than (1000000) placement policy default + )`) + tk.MustQuery("show create table tp").Check(testkit.Rows("" + + "tp CREATE TABLE `tp` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n" + + "PARTITION BY RANGE (`id`)\n" + + "(PARTITION `p0` VALUES LESS THAN (100),\n" + + " PARTITION `p1` VALUES LESS THAN (1000),\n" + + " PARTITION `p2` VALUES LESS THAN (10000) /*T![placement] PLACEMENT POLICY=`p1` */,\n" + + " PARTITION `p3` VALUES LESS THAN (100000) /*T![placement] PRIMARY_REGION=\"r1\" REGIONS=\"r1,r2\" */,\n" + + " PARTITION `p4` VALUES LESS THAN (1000000))")) + checkExistTableBundlesInPD(c, s.dom, "test", "tp") + + tb, err := tk.Se.GetInfoSchema().(infoschema.InfoSchema).TableByName(model.NewCIStr("test"), model.NewCIStr("tp")) + c.Assert(err, IsNil) + c.Assert(tb.Meta().Partition.Definitions[2].PlacementPolicyRef.ID, Equals, policy.ID) + + // error invalid policy + err = tk.ExecToErr("alter table tp add partition (partition p5 values less than (10000000) placement policy px)") + c.Assert(err.Error(), Equals, "[schema:8239]Unknown placement policy 'px'") + + // error when policy and direct options both set + err = tk.ExecToErr("alter table tp add partition (partition p5 values less than (10000000) placement policy p1 primary_region='r2' regions='r2')") + c.Assert(err.Error(), Equals, "[ddl:8240]Placement policy 'p1' can't co-exist with direct placement options") + + // error for invalid placement opt + err = tk.ExecToErr("alter table tp add partition (partition p5 values less than (10000000) primary_region='r2' regions='r2' leader_constraints='[+region=bj]')") + c.Assert(err.Error(), Equals, "invalid placement option: should be [LEADER/VOTER/LEARNER/FOLLOWER]_CONSTRAINTS=.. [VOTERS/FOLLOWERS/LEARNERS]=.., mixed other sugar options PRIMARY_REGION=\"r2\" REGIONS=\"r2\" LEADER_CONSTRAINTS=\"[+region=bj]\"") + + // failed alter has no effect + tk.MustQuery("show create table tp").Check(testkit.Rows("" + + "tp CREATE TABLE `tp` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n" + + "PARTITION BY RANGE (`id`)\n" + + "(PARTITION `p0` VALUES LESS THAN (100),\n" + + " PARTITION `p1` VALUES LESS THAN (1000),\n" + + " PARTITION `p2` VALUES LESS THAN (10000) /*T![placement] PLACEMENT POLICY=`p1` */,\n" + + " PARTITION `p3` VALUES LESS THAN (100000) /*T![placement] PRIMARY_REGION=\"r1\" REGIONS=\"r1,r2\" */,\n" + + " PARTITION `p4` VALUES LESS THAN (1000000))")) + checkExistTableBundlesInPD(c, s.dom, "test", "tp") +} + +func (s *testDBSuite6) TestTruncateTableWithPlacement(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1, tp") + tk.MustExec("drop placement policy if exists p1") + tk.MustExec("drop placement policy if exists p2") + + tk.MustExec("create placement policy p1 primary_region='r1' regions='r1'") + defer tk.MustExec("drop placement policy p1") + + tk.MustExec("create placement policy p2 primary_region='r2' regions='r2'") + defer tk.MustExec("drop placement policy p2") + + policy1, ok := tk.Se.GetInfoSchema().(infoschema.InfoSchema).PolicyByName(model.NewCIStr("p1")) + c.Assert(ok, IsTrue) + + policy2, ok := tk.Se.GetInfoSchema().(infoschema.InfoSchema).PolicyByName(model.NewCIStr("p2")) + c.Assert(ok, IsTrue) + + tk.MustExec(`CREATE TABLE t1 (id INT) primary_region="r1" regions="r1"`) + defer tk.MustExec("drop table t1") + + // test for normal table + tk.MustQuery("show create table t1").Check(testkit.Rows("" + + "t1 CREATE TABLE `t1` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PRIMARY_REGION=\"r1\" REGIONS=\"r1\" */")) + + t1, err := tk.Se.GetInfoSchema().(infoschema.InfoSchema).TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) + c.Assert(err, IsNil) + tk.MustExec("TRUNCATE TABLE t1") + tk.MustQuery("show create table t1").Check(testkit.Rows("" + + "t1 CREATE TABLE `t1` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PRIMARY_REGION=\"r1\" REGIONS=\"r1\" */")) + newT1, err := tk.Se.GetInfoSchema().(infoschema.InfoSchema).TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) + c.Assert(err, IsNil) + c.Assert(newT1.Meta().ID != t1.Meta().ID, IsTrue) + + // test for partitioned table + tk.MustExec(`CREATE TABLE tp (id INT) placement policy p1 PARTITION BY RANGE (id) ( + PARTITION p0 VALUES LESS THAN (100), + PARTITION p1 VALUES LESS THAN (1000) placement policy p2, + PARTITION p2 VALUES LESS THAN (10000) primary_region="r1" regions="r1,r2" + );`) + defer tk.MustExec("drop table tp") + + tp, err := tk.Se.GetInfoSchema().(infoschema.InfoSchema).TableByName(model.NewCIStr("test"), model.NewCIStr("tp")) + c.Assert(err, IsNil) + c.Assert(tp.Meta().PlacementPolicyRef.ID, Equals, policy1.ID) + c.Assert(tp.Meta().Partition.Definitions[1].PlacementPolicyRef.ID, Equals, policy2.ID) + tk.MustQuery("show create table tp").Check(testkit.Rows("" + + "tp CREATE TABLE `tp` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PLACEMENT POLICY=`p1` */\n" + + "PARTITION BY RANGE (`id`)\n" + + "(PARTITION `p0` VALUES LESS THAN (100),\n" + + " PARTITION `p1` VALUES LESS THAN (1000) /*T![placement] PLACEMENT POLICY=`p2` */,\n" + + " PARTITION `p2` VALUES LESS THAN (10000) /*T![placement] PRIMARY_REGION=\"r1\" REGIONS=\"r1,r2\" */)")) + + tk.MustExec("TRUNCATE TABLE tp") + newTp, err := tk.Se.GetInfoSchema().(infoschema.InfoSchema).TableByName(model.NewCIStr("test"), model.NewCIStr("tp")) + c.Assert(err, IsNil) + c.Assert(newTp.Meta().ID != tp.Meta().ID, IsTrue) + c.Assert(newTp.Meta().PlacementPolicyRef.ID, Equals, policy1.ID) + c.Assert(newTp.Meta().Partition.Definitions[1].PlacementPolicyRef.ID, Equals, policy2.ID) + for i := range []int{0, 1, 2} { + c.Assert(newTp.Meta().Partition.Definitions[i].ID != tp.Meta().Partition.Definitions[i].ID, IsTrue) + } +} + +func (s *testDBSuite6) TestTruncateTableGCWithPlacement(c *C) { + clearAllBundles(c) + failpoint.Enable("github.com/pingcap/tidb/store/gcworker/ignoreDeleteRangeFailed", `return`) + defer func(originGC bool) { + failpoint.Disable("github.com/pingcap/tidb/store/gcworker/ignoreDeleteRangeFailed") + if originGC { + ddl.EmulatorGCEnable() + } else { + ddl.EmulatorGCDisable() + } + }(ddl.IsEmulatorGCEnable()) + ddl.EmulatorGCDisable() + + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + + tk.MustExec("create table t0 (id int)") + defer tk.MustExec("drop table if exists t0") + + tk.MustExec("create table t1 (id int) primary_region='r1' regions='r1,r2'") + defer tk.MustExec("drop table if exists t1") + + tk.MustExec(`create table t2 (id int) primary_region='r1' regions='r1,r2' PARTITION BY RANGE (id) ( + PARTITION p0 VALUES LESS THAN (100) primary_region='r2' regions='r2', + PARTITION p1 VALUES LESS THAN (1000) + )`) + defer tk.MustExec("drop table if exists t2") + + tk.MustExec("truncate table t2") + + is := tk.Se.GetInfoSchema().(infoschema.InfoSchema) + t1, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) + c.Assert(err, IsNil) + t2, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t2")) + c.Assert(err, IsNil) + + bundles, err := infosync.GetAllRuleBundles(context.TODO()) + c.Assert(err, IsNil) + c.Assert(len(bundles), Equals, 5) + + gcWorker, err := gcworker.NewMockGCWorker(s.store) + c.Assert(err, IsNil) + c.Assert(gcWorker.DeleteRanges(context.TODO(), math.MaxInt64), IsNil) + + bundles, err = infosync.GetAllRuleBundles(context.TODO()) + c.Assert(err, IsNil) + c.Assert(len(bundles), Equals, 3) + bundlesMap := make(map[string]*placement.Bundle) + for _, bundle := range bundles { + bundlesMap[bundle.ID] = bundle + } + _, ok := bundlesMap[placement.GroupID(t1.Meta().ID)] + c.Assert(ok, IsTrue) + + _, ok = bundlesMap[placement.GroupID(t2.Meta().ID)] + c.Assert(ok, IsTrue) + + _, ok = bundlesMap[placement.GroupID(t2.Meta().Partition.Definitions[0].ID)] + c.Assert(ok, IsTrue) +} + +func (s *testDBSuite6) TestTruncateTablePartitionWithPlacement(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1, tp") + tk.MustExec("drop placement policy if exists p1") + tk.MustExec("drop placement policy if exists p2") + tk.MustExec("drop placement policy if exists p3") + + tk.MustExec("create placement policy p1 primary_region='r1' regions='r1'") + defer tk.MustExec("drop placement policy p1") + + tk.MustExec("create placement policy p2 primary_region='r2' regions='r2'") + defer tk.MustExec("drop placement policy p2") + + tk.MustExec("create placement policy p3 primary_region='r3' regions='r3'") + defer tk.MustExec("drop placement policy p3") + + policy1, ok := tk.Se.GetInfoSchema().(infoschema.InfoSchema).PolicyByName(model.NewCIStr("p1")) + c.Assert(ok, IsTrue) + + policy2, ok := tk.Se.GetInfoSchema().(infoschema.InfoSchema).PolicyByName(model.NewCIStr("p2")) + c.Assert(ok, IsTrue) + + policy3, ok := tk.Se.GetInfoSchema().(infoschema.InfoSchema).PolicyByName(model.NewCIStr("p3")) + c.Assert(ok, IsTrue) + + tk.MustExec(`CREATE TABLE t1 (id INT) primary_region="r1" regions="r1"`) + defer tk.MustExec("drop table t1") + + // test for partitioned table + tk.MustExec(`CREATE TABLE tp (id INT) placement policy p1 PARTITION BY RANGE (id) ( + PARTITION p0 VALUES LESS THAN (100), + PARTITION p1 VALUES LESS THAN (1000) placement policy p2, + PARTITION p2 VALUES LESS THAN (10000) placement policy p3, + PARTITION p3 VALUES LESS THAN (100000) primary_region="r2" regions="r2" + );`) + defer tk.MustExec("drop table tp") + + tp, err := tk.Se.GetInfoSchema().(infoschema.InfoSchema).TableByName(model.NewCIStr("test"), model.NewCIStr("tp")) + c.Assert(err, IsNil) + + tk.MustExec("ALTER TABLE tp TRUNCATE partition p1,p3") + newTp, err := tk.Se.GetInfoSchema().(infoschema.InfoSchema).TableByName(model.NewCIStr("test"), model.NewCIStr("tp")) + c.Assert(err, IsNil) + c.Assert(newTp.Meta().ID, Equals, tp.Meta().ID) + c.Assert(newTp.Meta().PlacementPolicyRef.ID, Equals, policy1.ID) + c.Assert(newTp.Meta().Partition.Definitions[1].PlacementPolicyRef.ID, Equals, policy2.ID) + c.Assert(newTp.Meta().Partition.Definitions[2].PlacementPolicyRef.ID, Equals, policy3.ID) + c.Assert(newTp.Meta().Partition.Definitions[0].ID, Equals, tp.Meta().Partition.Definitions[0].ID) + c.Assert(newTp.Meta().Partition.Definitions[1].ID != tp.Meta().Partition.Definitions[1].ID, IsTrue) + c.Assert(newTp.Meta().Partition.Definitions[2].ID, Equals, tp.Meta().Partition.Definitions[2].ID) + c.Assert(newTp.Meta().Partition.Definitions[3].ID != tp.Meta().Partition.Definitions[3].ID, IsTrue) + + tk.MustQuery("show create table tp").Check(testkit.Rows("" + + "tp CREATE TABLE `tp` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PLACEMENT POLICY=`p1` */\n" + + "PARTITION BY RANGE (`id`)\n" + + "(PARTITION `p0` VALUES LESS THAN (100),\n" + + " PARTITION `p1` VALUES LESS THAN (1000) /*T![placement] PLACEMENT POLICY=`p2` */,\n" + + " PARTITION `p2` VALUES LESS THAN (10000) /*T![placement] PLACEMENT POLICY=`p3` */,\n" + + " PARTITION `p3` VALUES LESS THAN (100000) /*T![placement] PRIMARY_REGION=\"r2\" REGIONS=\"r2\" */)")) +} + +func (s *testDBSuite6) TestTruncatePartitionGCWithPlacement(c *C) { + clearAllBundles(c) + failpoint.Enable("github.com/pingcap/tidb/store/gcworker/ignoreDeleteRangeFailed", `return`) + defer func(originGC bool) { + failpoint.Disable("github.com/pingcap/tidb/store/gcworker/ignoreDeleteRangeFailed") + if originGC { + ddl.EmulatorGCEnable() + } else { + ddl.EmulatorGCDisable() + } + }(ddl.IsEmulatorGCEnable()) + ddl.EmulatorGCDisable() + + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + + tk.MustExec("create table t0 (id int)") + defer tk.MustExec("drop table if exists t0") + + tk.MustExec("create table t1 (id int) primary_region='r1' regions='r1,r2'") + defer tk.MustExec("drop table if exists t1") + + tk.MustExec(`create table t2 (id int) primary_region='r1' regions='r1,r2' PARTITION BY RANGE (id) ( + PARTITION p0 VALUES LESS THAN (100) primary_region='r2' regions='r2', + PARTITION p1 VALUES LESS THAN (1000) + )`) + defer tk.MustExec("drop table if exists t2") + + tk.MustExec("alter table t2 truncate partition p0") + + is := tk.Se.GetInfoSchema().(infoschema.InfoSchema) + t1, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) + c.Assert(err, IsNil) + t2, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t2")) + c.Assert(err, IsNil) + + bundles, err := infosync.GetAllRuleBundles(context.TODO()) + c.Assert(err, IsNil) + c.Assert(len(bundles), Equals, 4) + + gcWorker, err := gcworker.NewMockGCWorker(s.store) + c.Assert(err, IsNil) + c.Assert(gcWorker.DeleteRanges(context.TODO(), math.MaxInt64), IsNil) + + bundles, err = infosync.GetAllRuleBundles(context.TODO()) + c.Assert(err, IsNil) + c.Assert(len(bundles), Equals, 3) + bundlesMap := make(map[string]*placement.Bundle) + for _, bundle := range bundles { + bundlesMap[bundle.ID] = bundle + } + _, ok := bundlesMap[placement.GroupID(t1.Meta().ID)] + c.Assert(ok, IsTrue) + + _, ok = bundlesMap[placement.GroupID(t2.Meta().ID)] + c.Assert(ok, IsTrue) + + _, ok = bundlesMap[placement.GroupID(t2.Meta().Partition.Definitions[0].ID)] + c.Assert(ok, IsTrue) +} + +func (s *testDBSuite6) TestExchangePartitionWithPlacement(c *C) { + clearAllBundles(c) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("set @@tidb_enable_exchange_partition=1") + tk.MustExec("use test") + tk.MustExec("drop table if exists t1, t2, tp") + tk.MustExec("drop placement policy if exists p1") + tk.MustExec("drop placement policy if exists p2") + + tk.MustExec("create placement policy p1 primary_region='r1' regions='r1'") + defer tk.MustExec("drop placement policy p1") + + tk.MustExec("create placement policy p2 primary_region='r2' regions='r2'") + defer tk.MustExec("drop placement policy p2") + + policy1, ok := tk.Se.GetInfoSchema().(infoschema.InfoSchema).PolicyByName(model.NewCIStr("p1")) + c.Assert(ok, IsTrue) + + policy2, ok := tk.Se.GetInfoSchema().(infoschema.InfoSchema).PolicyByName(model.NewCIStr("p2")) + c.Assert(ok, IsTrue) + + tk.MustExec(`CREATE TABLE t1 (id INT) placement policy p1`) + defer tk.MustExec("drop table t1") + + tk.MustExec(`CREATE TABLE t2 (id INT)`) + defer tk.MustExec("drop table t2") + + t1, err := tk.Se.GetInfoSchema().(infoschema.InfoSchema).TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) + c.Assert(err, IsNil) + t1ID := t1.Meta().ID + + t2, err := tk.Se.GetInfoSchema().(infoschema.InfoSchema).TableByName(model.NewCIStr("test"), model.NewCIStr("t2")) + c.Assert(err, IsNil) + t2ID := t2.Meta().ID + + tk.MustExec(`CREATE TABLE tp (id INT) primary_region="r1" regions="r1" PARTITION BY RANGE (id) ( + PARTITION p0 VALUES LESS THAN (100), + PARTITION p1 VALUES LESS THAN (1000) placement policy p2, + PARTITION p2 VALUES LESS THAN (10000) primary_region="r1" regions="r1,r2" + );`) + defer tk.MustExec("drop table tp") + + tp, err := tk.Se.GetInfoSchema().(infoschema.InfoSchema).TableByName(model.NewCIStr("test"), model.NewCIStr("tp")) + c.Assert(err, IsNil) + tpID := tp.Meta().ID + par0ID := tp.Meta().Partition.Definitions[0].ID + par1ID := tp.Meta().Partition.Definitions[1].ID + par2ID := tp.Meta().Partition.Definitions[2].ID + + // exchange par0, t1 + tk.MustExec("alter table tp exchange partition p0 with table t1") + tk.MustQuery("show create table t1").Check(testkit.Rows("" + + "t1 CREATE TABLE `t1` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PLACEMENT POLICY=`p1` */")) + tk.MustQuery("show create table tp").Check(testkit.Rows("" + + "tp CREATE TABLE `tp` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PRIMARY_REGION=\"r1\" REGIONS=\"r1\" */\n" + + "PARTITION BY RANGE (`id`)\n" + + "(PARTITION `p0` VALUES LESS THAN (100),\n" + + " PARTITION `p1` VALUES LESS THAN (1000) /*T![placement] PLACEMENT POLICY=`p2` */,\n" + + " PARTITION `p2` VALUES LESS THAN (10000) /*T![placement] PRIMARY_REGION=\"r1\" REGIONS=\"r1,r2\" */)")) + tp, err = tk.Se.GetInfoSchema().(infoschema.InfoSchema).TableByName(model.NewCIStr("test"), model.NewCIStr("tp")) + c.Assert(err, IsNil) + c.Assert(tp.Meta().ID, Equals, tpID) + c.Assert(tp.Meta().Partition.Definitions[0].ID, Equals, t1ID) + c.Assert(tp.Meta().Partition.Definitions[0].DirectPlacementOpts, IsNil) + c.Assert(tp.Meta().Partition.Definitions[0].PlacementPolicyRef, IsNil) + t1, err = tk.Se.GetInfoSchema().(infoschema.InfoSchema).TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) + c.Assert(err, IsNil) + c.Assert(t1.Meta().ID, Equals, par0ID) + c.Assert(t1.Meta().DirectPlacementOpts, IsNil) + c.Assert(t1.Meta().PlacementPolicyRef.ID, Equals, policy1.ID) + checkExistTableBundlesInPD(c, s.dom, "test", "tp") + + // exchange par0, t2 + tk.MustExec("alter table tp exchange partition p0 with table t2") + tk.MustQuery("show create table t2").Check(testkit.Rows("" + + "t2 CREATE TABLE `t2` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) + tk.MustQuery("show create table tp").Check(testkit.Rows("" + + "tp CREATE TABLE `tp` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PRIMARY_REGION=\"r1\" REGIONS=\"r1\" */\n" + + "PARTITION BY RANGE (`id`)\n" + + "(PARTITION `p0` VALUES LESS THAN (100),\n" + + " PARTITION `p1` VALUES LESS THAN (1000) /*T![placement] PLACEMENT POLICY=`p2` */,\n" + + " PARTITION `p2` VALUES LESS THAN (10000) /*T![placement] PRIMARY_REGION=\"r1\" REGIONS=\"r1,r2\" */)")) + tp, err = tk.Se.GetInfoSchema().(infoschema.InfoSchema).TableByName(model.NewCIStr("test"), model.NewCIStr("tp")) + c.Assert(err, IsNil) + c.Assert(tp.Meta().ID, Equals, tpID) + c.Assert(tp.Meta().Partition.Definitions[0].ID, Equals, t2ID) + c.Assert(tp.Meta().Partition.Definitions[0].DirectPlacementOpts, IsNil) + c.Assert(tp.Meta().Partition.Definitions[0].PlacementPolicyRef, IsNil) + t2, err = tk.Se.GetInfoSchema().(infoschema.InfoSchema).TableByName(model.NewCIStr("test"), model.NewCIStr("t2")) + c.Assert(err, IsNil) + c.Assert(t2.Meta().ID, Equals, t1ID) + c.Assert(t2.Meta().DirectPlacementOpts, IsNil) + c.Assert(t2.Meta().PlacementPolicyRef, IsNil) + checkExistTableBundlesInPD(c, s.dom, "test", "tp") + + // exchange par1, t1 + tk.MustExec("alter table tp exchange partition p1 with table t1") + tk.MustQuery("show create table t1").Check(testkit.Rows("" + + "t1 CREATE TABLE `t1` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PLACEMENT POLICY=`p1` */")) + tk.MustQuery("show create table tp").Check(testkit.Rows("" + + "tp CREATE TABLE `tp` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PRIMARY_REGION=\"r1\" REGIONS=\"r1\" */\n" + + "PARTITION BY RANGE (`id`)\n" + + "(PARTITION `p0` VALUES LESS THAN (100),\n" + + " PARTITION `p1` VALUES LESS THAN (1000) /*T![placement] PLACEMENT POLICY=`p2` */,\n" + + " PARTITION `p2` VALUES LESS THAN (10000) /*T![placement] PRIMARY_REGION=\"r1\" REGIONS=\"r1,r2\" */)")) + tp, err = tk.Se.GetInfoSchema().(infoschema.InfoSchema).TableByName(model.NewCIStr("test"), model.NewCIStr("tp")) + c.Assert(err, IsNil) + c.Assert(tp.Meta().ID, Equals, tpID) + c.Assert(tp.Meta().Partition.Definitions[1].ID, Equals, par0ID) + c.Assert(tp.Meta().Partition.Definitions[1].DirectPlacementOpts, IsNil) + c.Assert(tp.Meta().Partition.Definitions[1].PlacementPolicyRef.ID, Equals, policy2.ID) + t1, err = tk.Se.GetInfoSchema().(infoschema.InfoSchema).TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) + c.Assert(err, IsNil) + c.Assert(t1.Meta().ID, Equals, par1ID) + c.Assert(t1.Meta().DirectPlacementOpts, IsNil) + c.Assert(t1.Meta().PlacementPolicyRef.ID, Equals, policy1.ID) + checkExistTableBundlesInPD(c, s.dom, "test", "tp") + + // exchange par2, t2 + tk.MustExec("alter table tp exchange partition p2 with table t2") + tk.MustQuery("show create table t2").Check(testkit.Rows("" + + "t2 CREATE TABLE `t2` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) + tk.MustQuery("show create table tp").Check(testkit.Rows("" + + "tp CREATE TABLE `tp` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PRIMARY_REGION=\"r1\" REGIONS=\"r1\" */\n" + + "PARTITION BY RANGE (`id`)\n" + + "(PARTITION `p0` VALUES LESS THAN (100),\n" + + " PARTITION `p1` VALUES LESS THAN (1000) /*T![placement] PLACEMENT POLICY=`p2` */,\n" + + " PARTITION `p2` VALUES LESS THAN (10000) /*T![placement] PRIMARY_REGION=\"r1\" REGIONS=\"r1,r2\" */)")) + tp, err = tk.Se.GetInfoSchema().(infoschema.InfoSchema).TableByName(model.NewCIStr("test"), model.NewCIStr("tp")) + c.Assert(err, IsNil) + c.Assert(tp.Meta().ID, Equals, tpID) + c.Assert(tp.Meta().Partition.Definitions[2].ID, Equals, t1ID) + c.Assert(tp.Meta().Partition.Definitions[2].DirectPlacementOpts.PrimaryRegion, Equals, "r1") + c.Assert(tp.Meta().Partition.Definitions[2].DirectPlacementOpts.Regions, Equals, "r1,r2") + c.Assert(tp.Meta().Partition.Definitions[2].PlacementPolicyRef, IsNil) + t2, err = tk.Se.GetInfoSchema().(infoschema.InfoSchema).TableByName(model.NewCIStr("test"), model.NewCIStr("t2")) + c.Assert(err, IsNil) + c.Assert(t2.Meta().ID, Equals, par2ID) + c.Assert(t2.Meta().DirectPlacementOpts, IsNil) + c.Assert(t2.Meta().PlacementPolicyRef, IsNil) + checkExistTableBundlesInPD(c, s.dom, "test", "tp") +} + +func (s *testDBSuite6) TestPDFail(c *C) { + defer func() { + c.Assert(failpoint.Disable("github.com/pingcap/tidb/domain/infosync/putRuleBundlesError"), IsNil) + }() + + clearAllBundles(c) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop placement policy if exists p1") + tk.MustExec("drop table if exists t1, t2, tp") + + tk.MustExec("create placement policy p1 primary_region=\"cn-east-1\" regions=\"cn-east-1,cn-east\"") + defer tk.MustExec("drop placement policy if exists p1") + + tk.MustExec("create table t1(id int)") + defer tk.MustExec("drop table if exists t1") + + tk.MustExec(`CREATE TABLE tp (id INT) placement policy p1 PARTITION BY RANGE (id) ( + PARTITION p0 VALUES LESS THAN (100), + PARTITION p1 VALUES LESS THAN (1000) placement policy p1 + );`) + defer tk.MustExec("drop table if exists tp") + existBundles, err := infosync.GetAllRuleBundles(context.TODO()) + c.Assert(err, IsNil) + + c.Assert(failpoint.Enable("github.com/pingcap/tidb/domain/infosync/putRuleBundlesError", "return(true)"), IsNil) + + // alter policy + err = tk.ExecToErr("alter placement policy p1 primary_region='rx' regions='rx'") + c.Assert(infosync.ErrHTTPServiceError.Equal(err), IsTrue) + tk.MustQuery("show create placement policy p1").Check(testkit.Rows("p1 CREATE PLACEMENT POLICY `p1` PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east\"")) + checkAllBundlesNotChange(c, existBundles) + + // create table + err = tk.ExecToErr("create table t2 (id int) placement policy p1") + c.Assert(infosync.ErrHTTPServiceError.Equal(err), IsTrue) + err = tk.ExecToErr("show create table t2") + c.Assert(infoschema.ErrTableNotExists.Equal(err), IsTrue) + checkAllBundlesNotChange(c, existBundles) + + // alter table + err = tk.ExecToErr("alter table t1 placement policy p1") + c.Assert(infosync.ErrHTTPServiceError.Equal(err), IsTrue) + tk.MustQuery("show create table t1").Check(testkit.Rows("t1 CREATE TABLE `t1` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) + checkAllBundlesNotChange(c, existBundles) + + // add partition + err = tk.ExecToErr("alter table tp add partition (" + + "partition p2 values less than (10000) placement policy p1," + + "partition p3 values less than (100000) primary_region=\"r1\" regions=\"r1,r2\"" + + ")") + c.Assert(infosync.ErrHTTPServiceError.Equal(err), IsTrue) + tk.MustQuery("show create table tp").Check(testkit.Rows("tp CREATE TABLE `tp` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PLACEMENT POLICY=`p1` */\n" + + "PARTITION BY RANGE (`id`)\n" + + "(PARTITION `p0` VALUES LESS THAN (100),\n" + + " PARTITION `p1` VALUES LESS THAN (1000) /*T![placement] PLACEMENT POLICY=`p1` */)")) + checkAllBundlesNotChange(c, existBundles) + + // alter partition + err = tk.ExecToErr(`alter table tp PARTITION p1 primary_region="r2" regions="r2,r3"`) + c.Assert(infosync.ErrHTTPServiceError.Equal(err), IsTrue) + tk.MustQuery("show create table tp").Check(testkit.Rows("tp CREATE TABLE `tp` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PLACEMENT POLICY=`p1` */\n" + + "PARTITION BY RANGE (`id`)\n" + + "(PARTITION `p0` VALUES LESS THAN (100),\n" + + " PARTITION `p1` VALUES LESS THAN (1000) /*T![placement] PLACEMENT POLICY=`p1` */)")) + checkAllBundlesNotChange(c, existBundles) + + // exchange partition + tk.MustExec("alter table tp exchange partition p1 with table t1") + c.Assert(infosync.ErrHTTPServiceError.Equal(err), IsTrue) + tk.MustQuery("show create table t1").Check(testkit.Rows("t1 CREATE TABLE `t1` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) + tk.MustQuery("show create table tp").Check(testkit.Rows("tp CREATE TABLE `tp` (\n" + + " `id` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PLACEMENT POLICY=`p1` */\n" + + "PARTITION BY RANGE (`id`)\n" + + "(PARTITION `p0` VALUES LESS THAN (100),\n" + + " PARTITION `p1` VALUES LESS THAN (1000) /*T![placement] PLACEMENT POLICY=`p1` */)")) + checkAllBundlesNotChange(c, existBundles) } diff --git a/ddl/placement_sql_test.go b/ddl/placement_sql_test.go index 1aa80c2d048ca..62d6f36db1c4a 100644 --- a/ddl/placement_sql_test.go +++ b/ddl/placement_sql_test.go @@ -15,302 +15,20 @@ package ddl_test import ( + "context" "fmt" "sort" . "github.com/pingcap/check" "github.com/pingcap/failpoint" - "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/ddl/placement" mysql "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/session" - "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/util/testkit" "github.com/pingcap/tidb/util/testutil" ) -func (s *testDBSuite6) TestAlterTableAlterPartition(c *C) { - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t1") - - tk.Se.GetSessionVars().EnableAlterPlacement = true - defer func() { - tk.MustExec("drop table if exists t1") - tk.Se.GetSessionVars().EnableAlterPlacement = false - }() - - tk.MustExec(`create table t1 (c int) -PARTITION BY RANGE (c) ( - PARTITION p0 VALUES LESS THAN (6), - PARTITION p1 VALUES LESS THAN (11), - PARTITION p2 VALUES LESS THAN (16), - PARTITION p3 VALUES LESS THAN (21) -);`) - - is := s.dom.InfoSchema() - - tb, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) - c.Assert(err, IsNil) - partDefs := tb.Meta().GetPartitionInfo().Definitions - p0ID := placement.GroupID(partDefs[0].ID) - bundle := &placement.Bundle{ - ID: p0ID, - Rules: []*placement.Rule{{Role: placement.Leader, Count: 1}}, - } - - // normal cases - _, err = tk.Exec(`alter table t1 alter partition p0 -add placement policy - role=follower - replicas=3`) - c.Assert(err, IsNil) - - _, err = tk.Exec(`alter table t1 alter partition p0 -add placement policy - constraints='["+zone=sh"]' - role=follower - replicas=3`) - c.Assert(err, IsNil) - - _, err = tk.Exec(`alter table t1 alter partition p0 -add placement policy - constraints='["+ zone = sh ", "- zone = bj "]' - role=follower - replicas=3`) - c.Assert(err, IsNil) - - _, err = tk.Exec(`alter table t1 alter partition p0 -add placement policy - constraints="{'+zone=sh': 1}" - role=follower`) - c.Assert(err, IsNil) - - _, err = tk.Exec(`alter table t1 alter partition p0 -add placement policy - constraints='{"+ zone = sh ": 1}' - role=follower - replicas=3`) - c.Assert(err, IsNil) - - _, err = tk.Exec(`alter table t1 alter partition p0 -add placement policy - constraints="{'+zone=sh': 1}" - role=follower - replicas=3`) - c.Assert(err, IsNil) - - _, err = tk.Exec(`alter table t1 alter partition p0 -add placement policy - constraints="['+zone=sh']" - role=follower - replicas=3`) - c.Assert(err, IsNil) - - _, err = tk.Exec(`alter table t1 alter partition p0 -add placement policy - constraints='{"+ zone = sh, -zone = bj ": 1}' - role=follower - replicas=3`) - c.Assert(err, IsNil) - - _, err = tk.Exec(`alter table t1 alter partition p0 -add placement policy - constraints='{"+ zone = sh ": 1, "- zone = bj": 2}' - role=follower - replicas=3`) - c.Assert(err, IsNil) - - _, err = tk.Exec(`alter table t1 alter partition p0 -alter placement policy - constraints='{"+ zone = sh, -zone = bj ": 1}' - role=follower - replicas=3`) - c.Assert(err, IsNil) - - s.dom.InfoSchema().SetBundle(bundle) - _, err = tk.Exec(`alter table t1 alter partition p0 -drop placement policy - role=leader`) - c.Assert(err, IsNil) - - _, err = tk.Exec(`alter table t1 alter partition p0 -drop placement policy - role=follower`) - c.Assert(err, ErrorMatches, ".*no rule of such role to drop.*") - - _, err = tk.Exec(`alter table t1 alter partition p0 -add placement policy - role=xxx - constraints='{"+ zone = sh, -zone = bj ": 1}' - replicas=3`) - c.Assert(err, NotNil) - - _, err = tk.Exec(`alter table t1 alter partition p0 -add placement policy - constraints='{"+ zone = sh, -zone = bj ": 1}' - replicas=3`) - c.Assert(err, ErrorMatches, ".*the ROLE field is not specified.*") - - // multiple statements - _, err = tk.Exec(`alter table t1 alter partition p0 -add placement policy - constraints='["+ zone = sh "]' - role=follower - replicas=3, -add placement policy - constraints='{"+ zone = sh, -zone = bj ": 1}' - role=follower - replicas=3`) - c.Assert(err, IsNil) - - _, err = tk.Exec(`alter table t1 alter partition p0 -add placement policy - constraints='["+ zone = sh "]' - role=follower - replicas=3, -add placement policy - constraints='{"+zone=sh,-zone=bj":1,"+zone=sh,-zone=nj":1}' - role=follower - replicas=3`) - c.Assert(err, IsNil) - - _, err = tk.Exec(`alter table t1 alter partition p0 -add placement policy - constraints='{"+ zone = sh ": 1, "- zone = bj,+zone=sh": 2}' - role=follower - replicas=3, -alter placement policy - constraints='{"+ zone = sh, -zone = bj ": 1}' - role=follower - replicas=3`) - c.Assert(err, IsNil) - - _, err = tk.Exec(`alter table t1 alter partition p0 -add placement policy - constraints='["+zone=sh", "-zone=bj"]' - role=follower - replicas=3, -add placement policy - constraints='{"+zone=sh": 1}' - role=follower - replicas=3, -add placement policy - constraints='{"+zone=sh,-zone=bj":1,"+zone=sh,-zone=nj":1}' - role=follower - replicas=3, -alter placement policy - constraints='{"+zone=sh": 1, "-zon =bj,+zone=sh": 1}' - role=follower - replicas=3`) - c.Assert(err, IsNil) - - _, err = tk.Exec(`alter table t1 alter partition p0 -drop placement policy - role=leader, -drop placement policy - role=leader`) - c.Assert(err, ErrorMatches, ".*no rule of such role to drop.*") - - s.dom.InfoSchema().SetBundle(bundle) - _, err = tk.Exec(`alter table t1 alter partition p0 -add placement policy - constraints='{"+zone=sh,-zone=bj":1,"+zone=sh,-zone=nj":1}' - role=voter - replicas=3, -drop placement policy - role=leader`) - c.Assert(err, IsNil) - - // list/dict detection - _, err = tk.Exec(`alter table t1 alter partition p0 -add placement policy - role=follower - constraints='[]'`) - c.Assert(err, ErrorMatches, ".*label constraints with invalid REPLICAS: should be positive.*") - - _, err = tk.Exec(`alter table t1 alter partition p0 -add placement policy - constraints=',,,' - role=follower - replicas=3`) - c.Assert(err, ErrorMatches, "(?s).*invalid label constraints format: .* or any yaml compatible representation.*") - - _, err = tk.Exec(`alter table t1 alter partition p0 -add placement policy - role=voter - replicas=3`) - c.Assert(err, IsNil) - - _, err = tk.Exec(`alter table t1 alter partition p0 -add placement policy - constraints='[,,,' - role=follower - replicas=3`) - c.Assert(err, ErrorMatches, "(?s).*invalid label constraints format: .* or any yaml compatible representation.*") - - _, err = tk.Exec(`alter table t1 alter partition p0 -add placement policy - constraints='{,,,' - role=follower - replicas=3`) - c.Assert(err, ErrorMatches, "(?s).*invalid label constraints format: .* or any yaml compatible representation.*") - - _, err = tk.Exec(`alter table t1 alter partition p0 -add placement policy - constraints='{"+ zone = sh ": 1, "- zone = bj": 2}' - role=follower - replicas=2`) - c.Assert(err, ErrorMatches, ".*should be larger or equal to the number of total replicas.*") - - _, err = tk.Exec(`alter table t1 alter partition p0 -add placement policy - constraints='{"+ zone = sh ": 1, "- zone = bj": 2}' - role=leader`) - c.Assert(err, ErrorMatches, ".*should be larger or equal to the number of total replicas.*") - - _, err = tk.Exec(`alter table t1 alter partition p -add placement policy - constraints='["+zone=sh"]' - role=follower - replicas=3`) - c.Assert(err, ErrorMatches, ".*Unknown partition.*") - - _, err = tk.Exec(`alter table t1 alter partition p0 -add placement policy - constraints='{"+ zone = sh, -zone = bj ": -1}' - role=follower - replicas=3`) - c.Assert(err, ErrorMatches, ".*label constraints in map syntax have invalid replicas: count of labels.*") - - _, err = tk.Exec(`alter table t1 alter partition p0 -add placement policy - constraints='["+ zone = sh"]' - role=leader - replicas=0`) - c.Assert(err, ErrorMatches, ".*Invalid placement option REPLICAS, it is not allowed to be 0.*") - - // invalid partition - tk.MustExec("drop table if exists t1") - tk.MustExec("create table t1 (c int)") - _, err = tk.Exec(`alter table t1 alter partition p -add placement policy - constraints='["+zone=sh"]' - role=follower - replicas=3`) - c.Assert(ddl.ErrPartitionMgmtOnNonpartitioned.Equal(err), IsTrue) - - // issue 20751 - tk.MustExec("drop table if exists t_part_pk_id") - tk.MustExec("create TABLE t_part_pk_id (c1 int,c2 int) partition by range(c1 div c2 ) (partition p0 values less than (2))") - _, err = tk.Exec(`alter table t_part_pk_id alter partition p0 add placement policy constraints='["+host=store1"]' role=leader;`) - c.Assert(err, IsNil) - _, err = tk.Exec(`alter table t_part_pk_id alter partition p0 add placement policy constraints='["+host=store1"]' role=leader replicas=3;`) - c.Assert(err, ErrorMatches, ".*REPLICAS must be 1 if ROLE=leader.*") - tk.MustExec("drop table t_part_pk_id") -} - // TODO: Remove in https://github.com/pingcap/tidb/issues/27971 or change to use SQL PLACEMENT POLICY func (s *testDBSuite1) TestPlacementPolicyCache(c *C) { tk := testkit.NewTestKit(c, s.store) @@ -534,193 +252,6 @@ PARTITION BY RANGE (c) ( } } -func (s *testDBSuite1) TestAbortTxnIfPlacementChanged(c *C) { - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists tp1") - tk.Se.GetSessionVars().EnableAlterPlacement = true - defer func() { - tk.MustExec("drop table if exists tp1") - tk.Se.GetSessionVars().EnableAlterPlacement = false - }() - - tk.MustExec(`create table tp1 (c int) -PARTITION BY RANGE (c) ( - PARTITION p0 VALUES LESS THAN (6), - PARTITION p1 VALUES LESS THAN (11) -);`) - se1, err := session.CreateSession(s.store) - c.Assert(err, IsNil) - tk1 := testkit.NewTestKitWithSession(c, s.store, se1) - tk1.MustExec("use test") - - tk1.Se.GetSessionVars().EnableAlterPlacement = true - defer func() { - tk1.Se.GetSessionVars().EnableAlterPlacement = false - }() - _, err = tk.Exec(`alter table tp1 alter partition p0 -add placement policy - constraints='["+ zone = sh "]' - role=leader - replicas=1;`) - c.Assert(err, IsNil) - // modify p0 when alter p0 placement policy, the txn should be failed - _, err = tk.Exec("begin;") - c.Assert(err, IsNil) - _, err = tk1.Exec(`alter table tp1 alter partition p0 -add placement policy - constraints='["+ zone = sh "]' - role=follower - replicas=3;`) - c.Assert(err, IsNil) - _, err = tk.Exec("insert into tp1 (c) values (1);") - c.Assert(err, IsNil) - _, err = tk.Exec("commit") - c.Assert(err, NotNil) - c.Assert(err.Error(), Matches, "*.[domain:8028]*.") - - _, err = tk.Exec(`alter table tp1 alter partition p1 -add placement policy - constraints='["+ zone = sh "]' - role=leader - replicas=1;`) - c.Assert(err, IsNil) - // modify p0 when alter p1 placement policy, the txn should be success. - _, err = tk.Exec("begin;") - c.Assert(err, IsNil) - _, err = tk1.Exec(`alter table tp1 alter partition p1 -add placement policy - constraints='["+ zone = sh "]' - role=follower - replicas=3;`) - c.Assert(err, IsNil) - _, err = tk.Exec("insert into tp1 (c) values (1);") - c.Assert(err, IsNil) - _, err = tk.Exec("commit") - c.Assert(err, IsNil) -} - -func (s *testSerialSuite) TestGlobalTxnState(c *C) { - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t1") - defer tk.MustExec("drop table if exists t1") - - tk.Se.GetSessionVars().EnableAlterPlacement = true - defer func() { - tk.Se.GetSessionVars().EnableAlterPlacement = false - }() - - tk.MustExec(`create table t1 (c int) -PARTITION BY RANGE (c) ( - PARTITION p0 VALUES LESS THAN (6), - PARTITION p1 VALUES LESS THAN (11) -);`) - - is := s.dom.InfoSchema() - - tb, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) - c.Assert(err, IsNil) - pid, err := tables.FindPartitionByName(tb.Meta(), "p0") - c.Assert(err, IsNil) - groupID := placement.GroupID(pid) - bundle := &placement.Bundle{ - ID: groupID, - Rules: []*placement.Rule{ - { - GroupID: groupID, - Role: placement.Leader, - Count: 1, - Constraints: []placement.Constraint{ - { - Key: placement.DCLabelKey, - Op: placement.In, - Values: []string{"bj"}, - }, - }, - }, - }, - } - failpoint.Enable("tikvclient/injectTxnScope", `return("bj")`) - defer failpoint.Disable("tikvclient/injectTxnScope") - dbInfo := testGetSchemaByName(c, tk.Se, "test") - tk2 := testkit.NewTestKit(c, s.store) - var chkErr error - done := false - testcases := []struct { - name string - hook *ddl.TestDDLCallback - expectErr error - }{ - { - name: "write partition p0 during StateGlobalTxnOnly", - hook: func() *ddl.TestDDLCallback { - hook := &ddl.TestDDLCallback{} - hook.OnJobUpdatedExported = func(job *model.Job) { - if job.Type == model.ActionAlterTableAlterPartition && job.State == model.JobStateRunning && - job.SchemaState == model.StateGlobalTxnOnly && job.SchemaID == dbInfo.ID && done == false { - s.dom.InfoSchema().SetBundle(bundle) - done = true - tk2.MustExec("use test") - tk.MustExec("set global tidb_enable_local_txn = on;") - tk2.MustExec("set @@txn_scope=local") - _, chkErr = tk2.Exec("insert into t1 (c) values (1);") - tk.MustExec("set global tidb_enable_local_txn = off;") - } - } - return hook - }(), - expectErr: fmt.Errorf(".*can not be written by local transactions when its placement policy is being altered.*"), - }, - // FIXME: support abort read txn during StateGlobalTxnOnly - // { - // name: "read partition p0 during middle state", - // hook: func() *ddl.TestDDLCallback { - // hook := &ddl.TestDDLCallback{} - // hook.OnJobUpdatedExported = func(job *model.Job) { - // if job.Type == model.ActionAlterTableAlterPartition && job.State == model.JobStateRunning && - // job.SchemaState == model.StateGlobalTxnOnly && job.SchemaID == dbInfo.ID && done == false { - // done = true - // tk2.MustExec("use test") - // tk2.MustExec("set @@txn_scope=bj") - // tk2.MustExec("begin;") - // tk2.MustExec("select * from t1 where c < 6;") - // _, chkErr = tk2.Exec("commit") - // } - // } - // return hook - // }(), - // expectErr: fmt.Errorf(".*can not be written by local transactions when its placement policy is being altered.*"), - // }, - } - originalHook := s.dom.DDL().GetHook() - testFunc := func(name string, hook *ddl.TestDDLCallback, expectErr error) { - c.Log(name) - done = false - s.dom.DDL().(ddl.DDLForTest).SetHook(hook) - defer func() { - s.dom.DDL().(ddl.DDLForTest).SetHook(originalHook) - }() - _, err = tk.Exec(`alter table t1 alter partition p0 -alter placement policy - constraints='["+zone=bj"]' - role=leader - replicas=1`) - c.Assert(err, IsNil) - c.Assert(done, Equals, true) - if expectErr != nil { - c.Assert(chkErr, NotNil) - c.Assert(chkErr.Error(), Matches, expectErr.Error()) - } else { - c.Assert(chkErr, IsNil) - } - } - - for _, testcase := range testcases { - testFunc(testcase.name, testcase.hook, testcase.expectErr) - } -} - func (s *testDBSuite6) TestCreateSchemaWithPlacement(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("drop schema if exists SchemaDirectPlacementTest") @@ -740,8 +271,8 @@ func (s *testDBSuite6) TestCreateSchemaWithPlacement(c *C) { tk.MustExec(`CREATE PLACEMENT POLICY PolicySchemaTest LEADER_CONSTRAINTS = "[+region=nl]" FOLLOWER_CONSTRAINTS="[+region=se]" FOLLOWERS=4 LEARNER_CONSTRAINTS="[+region=be]" LEARNERS=4`) tk.MustExec(`CREATE PLACEMENT POLICY PolicyTableTest LEADER_CONSTRAINTS = "[+region=tl]" FOLLOWER_CONSTRAINTS="[+region=tf]" FOLLOWERS=2 LEARNER_CONSTRAINTS="[+region=tle]" LEARNERS=1`) - tk.MustQuery("SHOW PLACEMENT like 'POLICY %PolicySchemaTest%'").Check(testkit.Rows("POLICY PolicySchemaTest LEADER_CONSTRAINTS=\"[+region=nl]\" FOLLOWERS=4 FOLLOWER_CONSTRAINTS=\"[+region=se]\" LEARNERS=4 LEARNER_CONSTRAINTS=\"[+region=be]\"")) - tk.MustQuery("SHOW PLACEMENT like 'POLICY %PolicyTableTest%'").Check(testkit.Rows("POLICY PolicyTableTest LEADER_CONSTRAINTS=\"[+region=tl]\" FOLLOWERS=2 FOLLOWER_CONSTRAINTS=\"[+region=tf]\" LEARNERS=1 LEARNER_CONSTRAINTS=\"[+region=tle]\"")) + tk.MustQuery("SHOW PLACEMENT like 'POLICY %PolicySchemaTest%'").Check(testkit.Rows("POLICY PolicySchemaTest LEADER_CONSTRAINTS=\"[+region=nl]\" FOLLOWERS=4 FOLLOWER_CONSTRAINTS=\"[+region=se]\" LEARNERS=4 LEARNER_CONSTRAINTS=\"[+region=be]\" NULL")) + tk.MustQuery("SHOW PLACEMENT like 'POLICY %PolicyTableTest%'").Check(testkit.Rows("POLICY PolicyTableTest LEADER_CONSTRAINTS=\"[+region=tl]\" FOLLOWERS=2 FOLLOWER_CONSTRAINTS=\"[+region=tf]\" LEARNERS=1 LEARNER_CONSTRAINTS=\"[+region=tle]\" NULL")) tk.MustExec("CREATE SCHEMA SchemaPolicyPlacementTest PLACEMENT POLICY = `PolicySchemaTest`") tk.MustQuery("SHOW CREATE SCHEMA SCHEMAPOLICYPLACEMENTTEST").Check(testkit.Rows("SchemaPolicyPlacementTest CREATE DATABASE `SchemaPolicyPlacementTest` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ /*T![placement] PLACEMENT POLICY=`PolicySchemaTest` */")) @@ -752,6 +283,7 @@ func (s *testDBSuite6) TestCreateSchemaWithPlacement(c *C) { " `b` varchar(255) DEFAULT NULL,\n" + " PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */\n" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PRIMARY_REGION=\"nl\" REGIONS=\"se,nz,nl\" FOLLOWERS=3 */")) + tk.MustQuery("SELECT CATALOG_NAME, SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME, TIDB_PLACEMENT_POLICY_NAME, TIDB_DIRECT_PLACEMENT FROM information_schema.schemata WHERE SCHEMA_NAME='SchemaDirectPlacementTest'").Check(testkit.Rows(`def SchemaDirectPlacementTest utf8mb4 utf8mb4_bin PRIMARY_REGION="nl" REGIONS="se,nz,nl" FOLLOWERS=3`)) tk.MustQuery("SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TIDB_PLACEMENT_POLICY_NAME, TIDB_DIRECT_PLACEMENT FROM information_schema.Tables WHERE TABLE_SCHEMA='SchemaDirectPlacementTest' AND TABLE_NAME = 'UseSchemaDefault'").Check(testkit.Rows(`def SchemaDirectPlacementTest UseSchemaDefault PRIMARY_REGION="nl" REGIONS="se,nz,nl" FOLLOWERS=3`)) tk.MustExec(`CREATE TABLE SchemaDirectPlacementTest.UseDirectPlacement (a int unsigned primary key, b varchar(255)) PRIMARY_REGION="se" REGIONS="se"`) @@ -771,6 +303,7 @@ func (s *testDBSuite6) TestCreateSchemaWithPlacement(c *C) { " `b` varchar(255) DEFAULT NULL,\n" + " PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */\n" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PLACEMENT POLICY=`PolicySchemaTest` */")) + tk.MustQuery("SELECT CATALOG_NAME, SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME, TIDB_PLACEMENT_POLICY_NAME, TIDB_DIRECT_PLACEMENT FROM information_schema.schemata WHERE SCHEMA_NAME='SchemaPolicyPlacementTest'").Check(testkit.Rows(`def SchemaPolicyPlacementTest utf8mb4 utf8mb4_bin PolicySchemaTest `)) tk.MustQuery("SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TIDB_PLACEMENT_POLICY_NAME, TIDB_DIRECT_PLACEMENT FROM information_schema.Tables WHERE TABLE_SCHEMA='SchemaPolicyPlacementTest' AND TABLE_NAME = 'UseSchemaDefault'").Check(testkit.Rows(`def SchemaPolicyPlacementTest UseSchemaDefault PolicySchemaTest `)) tk.MustExec(`CREATE TABLE SchemaPolicyPlacementTest.UsePolicy (a int unsigned primary key, b varchar(255)) PLACEMENT POLICY = "PolicyTableTest"`) @@ -816,8 +349,11 @@ func (s *testDBSuite6) TestAlterDBPlacement(c *C) { // Policy Test // Test for Non-Exist policy tk.MustGetErrCode("ALTER DATABASE TestAlterDB PLACEMENT POLICY=`alter_z`;", mysql.ErrPlacementPolicyNotExists) + tk.MustQuery("SELECT CATALOG_NAME, SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME, TIDB_PLACEMENT_POLICY_NAME, TIDB_DIRECT_PLACEMENT FROM information_schema.schemata WHERE SCHEMA_NAME='TestAlterDB'").Check(testkit.Rows(`def TestAlterDB utf8mb4 utf8mb4_bin `)) tk.MustExec("ALTER DATABASE TestAlterDB PLACEMENT POLICY=`alter_x`;") + // Test for information_schema.schemata + tk.MustQuery("SELECT CATALOG_NAME, SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME, TIDB_PLACEMENT_POLICY_NAME, TIDB_DIRECT_PLACEMENT FROM information_schema.schemata WHERE SCHEMA_NAME='TestAlterDB'").Check(testkit.Rows(`def TestAlterDB utf8mb4 utf8mb4_bin alter_x `)) // Test for Show Create Database tk.MustQuery(`show create database TestAlterDB`).Check(testutil.RowsWithSep("|", "TestAlterDB CREATE DATABASE `TestAlterDB` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ "+ @@ -856,6 +392,8 @@ func (s *testDBSuite6) TestAlterDBPlacement(c *C) { // DirectOption Test tk.MustExec("ALTER DATABASE TestAlterDB PRIMARY_REGION=\"se\" FOLLOWERS=2 REGIONS=\"se\";") + // Test for information_schema.schemata + tk.MustQuery("SELECT CATALOG_NAME, SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME, TIDB_PLACEMENT_POLICY_NAME, TIDB_DIRECT_PLACEMENT FROM information_schema.schemata WHERE SCHEMA_NAME='TestAlterDB'").Check(testkit.Rows(`def TestAlterDB utf8mb4 utf8mb4_bin PRIMARY_REGION="se" REGIONS="se" FOLLOWERS=2`)) // Test for Show Create Database tk.MustQuery(`show create database TestAlterDB`).Check(testutil.RowsWithSep("|", "TestAlterDB CREATE DATABASE `TestAlterDB` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ "+ @@ -904,5 +442,33 @@ func (s *testDBSuite6) TestAlterDBPlacement(c *C) { "TestAlterDB CREATE DATABASE `TestAlterDB` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ "+ "/*T![placement] PRIMARY_REGION=\"se\" REGIONS=\"se\" FOLLOWERS=2 */", )) +} + +func (s *testDBSuite6) TestEnablePlacementCheck(c *C) { + + tk := testkit.NewTestKit(c, s.store) + se, err := session.CreateSession4Test(s.store) + c.Assert(err, IsNil) + _, err = se.Execute(context.Background(), "set @@global.tidb_enable_alter_placement=1") + c.Assert(err, IsNil) + + tk.MustExec("drop database if exists TestPlacementDB;") + tk.MustExec("create database TestPlacementDB;") + tk.MustExec("use TestPlacementDB;") + tk.MustExec("drop placement policy if exists placement_x;") + tk.MustExec("create placement policy placement_x PRIMARY_REGION=\"cn-east-1\", REGIONS=\"cn-east-1\";") + se.GetSessionVars().EnableAlterPlacement = true + tk.MustExec("create table t(c int) partition by range (c) (partition p1 values less than (200) followers=2);") + defer func() { + tk.MustExec("drop database if exists TestPlacementDB;") + tk.MustExec("drop placement policy if exists placement_x;") + }() + tk.Se.GetSessionVars().EnableAlterPlacement = false + tk.MustGetErrCode("create database TestPlacementDB2 followers=2;", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter database TestPlacementDB placement policy=placement_x", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("create table t (c int) FOLLOWERS=2;", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t voters=2;", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("create table m (c int) partition by range (c) (partition p1 values less than (200) followers=2);", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t partition p1 placement policy=\"placement_x\";", mysql.ErrUnsupportedDDLOperation) } diff --git a/ddl/reorg.go b/ddl/reorg.go index ff51196d884bb..d1a8f5b0b4b59 100644 --- a/ddl/reorg.go +++ b/ddl/reorg.go @@ -199,6 +199,7 @@ func (w *worker) runReorgJob(t *meta.Meta, reorgInfo *reorgInfo, tblInfo *model. SQLMode: mysql.ModeNone, Warnings: make(map[errors.ErrorID]*terror.Error), WarningsCount: make(map[errors.ErrorID]int64), + Location: time.Local, } } if w.reorgCtx.doneCh == nil { diff --git a/ddl/reorg_test.go b/ddl/reorg_test.go index 269df0dc1c76d..461b5d6cb688a 100644 --- a/ddl/reorg_test.go +++ b/ddl/reorg_test.go @@ -41,12 +41,12 @@ func (s *testDDLSuite) TestReorg(c *C) { c.Assert(err, IsNil) }() - d := testNewDDLAndStart( + d, err := testNewDDLAndStart( context.Background(), - c, WithStore(store), WithLease(testLease), ) + c.Assert(err, IsNil) defer func() { err := d.Stop() c.Assert(err, IsNil) @@ -60,7 +60,7 @@ func (s *testDDLSuite) TestReorg(c *C) { c.Assert(ctx.Value(testCtxKey), Equals, 1) ctx.ClearValue(testCtxKey) - err := ctx.NewTxn(context.Background()) + err = ctx.NewTxn(context.Background()) c.Assert(err, IsNil) txn, err := ctx.Txn(true) c.Assert(err, IsNil) @@ -192,12 +192,12 @@ func (s *testDDLSuite) TestReorgOwner(c *C) { c.Assert(err, IsNil) }() - d1 := testNewDDLAndStart( + d1, err := testNewDDLAndStart( context.Background(), - c, WithStore(store), WithLease(testLease), ) + c.Assert(err, IsNil) defer func() { err := d1.Stop() c.Assert(err, IsNil) @@ -207,21 +207,23 @@ func (s *testDDLSuite) TestReorgOwner(c *C) { testCheckOwner(c, d1, true) - d2 := testNewDDLAndStart( + d2, err := testNewDDLAndStart( context.Background(), - c, WithStore(store), WithLease(testLease), ) + c.Assert(err, IsNil) defer func() { err := d2.Stop() c.Assert(err, IsNil) }() - dbInfo := testSchemaInfo(c, d1, "test_reorg") + dbInfo, err := testSchemaInfo(d1, "test_reorg") + c.Assert(err, IsNil) testCreateSchema(c, ctx, d1, dbInfo) - tblInfo := testTableInfo(c, d1, "t", 3) + tblInfo, err := testTableInfo(d1, "t", 3) + c.Assert(err, IsNil) testCreateTable(c, ctx, d1, dbInfo, tblInfo) t := testGetTable(c, d1, dbInfo.ID, tblInfo.ID) diff --git a/ddl/restart_test.go b/ddl/restart_test.go index 18f1a9759de5b..e1cf6d15fee84 100644 --- a/ddl/restart_test.go +++ b/ddl/restart_test.go @@ -11,6 +11,7 @@ // 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. +//go:build !race // +build !race package ddl @@ -21,6 +22,7 @@ import ( "time" . "github.com/pingcap/check" + "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/util/mock" @@ -109,12 +111,12 @@ func (s *testSchemaSuite) TestSchemaResume(c *C) { c.Assert(err, IsNil) }() - d1 := testNewDDLAndStart( + d1, err := testNewDDLAndStart( context.Background(), - c, WithStore(store), WithLease(testLease), ) + c.Assert(err, IsNil) defer func() { err := d1.Stop() c.Assert(err, IsNil) @@ -122,7 +124,8 @@ func (s *testSchemaSuite) TestSchemaResume(c *C) { testCheckOwner(c, d1, true) - dbInfo := testSchemaInfo(c, d1, "test_restart") + dbInfo, err := testSchemaInfo(d1, "test_restart") + c.Assert(err, IsNil) job := &model.Job{ SchemaID: dbInfo.ID, Type: model.ActionCreateSchema, @@ -148,18 +151,19 @@ func (s *testStatSuite) TestStat(c *C) { c.Assert(err, IsNil) }() - d := testNewDDLAndStart( + d, err := testNewDDLAndStart( context.Background(), - c, WithStore(store), WithLease(testLease), ) + c.Assert(err, IsNil) defer func() { err := d.Stop() c.Assert(err, IsNil) }() - dbInfo := testSchemaInfo(c, d, "test_restart") + dbInfo, err := testSchemaInfo(d, "test_restart") + c.Assert(err, IsNil) testCreateSchema(c, testNewContext(d), d, dbInfo) // TODO: Get this information from etcd. @@ -198,12 +202,45 @@ LOOP: } } +var _ = Suite(&testTableSuite{}) + +type testTableSuite struct { + store kv.Storage + dbInfo *model.DBInfo + + d *ddl +} + +func (s *testTableSuite) SetUpSuite(c *C) { + s.store = testCreateStore(c, "test_table") + ddl, err := testNewDDLAndStart( + context.Background(), + WithStore(s.store), + WithLease(testLease), + ) + c.Assert(err, IsNil) + s.d = ddl + + s.dbInfo, err = testSchemaInfo(s.d, "test_table") + c.Assert(err, IsNil) + testCreateSchema(c, testNewContext(s.d), s.d, s.dbInfo) +} + +func (s *testTableSuite) TearDownSuite(c *C) { + testDropSchema(c, testNewContext(s.d), s.d, s.dbInfo) + err := s.d.Stop() + c.Assert(err, IsNil) + err = s.store.Close() + c.Assert(err, IsNil) +} + func (s *testTableSuite) TestTableResume(c *C) { d := s.d testCheckOwner(c, d, true) - tblInfo := testTableInfo(c, d, "t1", 3) + tblInfo, err := testTableInfo(d, "t1", 3) + c.Assert(err, IsNil) job := &model.Job{ SchemaID: s.dbInfo.ID, TableID: tblInfo.ID, diff --git a/ddl/rollingback_test.go b/ddl/rollingback_test.go index 2d08defcac07c..e8c43edbca406 100644 --- a/ddl/rollingback_test.go +++ b/ddl/rollingback_test.go @@ -70,7 +70,7 @@ func (s *testRollingBackSuite) TestCancelAddIndexJobError(c *C) { jobID = job.ID res, checkErr = tk1.Exec("admin cancel ddl jobs " + strconv.Itoa(int(job.ID))) // drain the result set here, otherwise the cancel action won't take effect immediately. - chk := res.NewChunk() + chk := res.NewChunk(nil) if err := res.Next(context.Background(), chk); err != nil { checkErr = err return diff --git a/ddl/schema.go b/ddl/schema.go index 48288d423c88f..7604037addd40 100644 --- a/ddl/schema.go +++ b/ddl/schema.go @@ -16,9 +16,10 @@ package ddl import ( "context" + "fmt" "github.com/pingcap/errors" - "github.com/pingcap/tidb/ddl/placement" + "github.com/pingcap/tidb/ddl/label" "github.com/pingcap/tidb/domain/infosync" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/meta" @@ -155,11 +156,8 @@ func onModifySchemaDefaultPlacement(t *meta.Meta, job *model.Job) (ver int64, _ return ver, errors.Trace(err) } // Double Check if policy exits while ddl executing - if placementPolicyRef != nil { - _, err = checkPlacementPolicyExistAndCancelNonExistJob(t, job, placementPolicyRef.ID) - if err != nil { - return ver, errors.Trace(err) - } + if _, err = checkPlacementPolicyRefValidAndCanNonValidJob(t, job, placementPolicyRef); err != nil { + return ver, errors.Trace(err) } // Notice: dbInfo.DirectPlacementOpts and dbInfo.PlacementPolicyRef can not be both not nil, which checked before constructing ddl job. @@ -207,19 +205,18 @@ func onDropSchema(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ error) if err != nil { return ver, errors.Trace(err) } - oldIDs := getIDs(tables) - bundles := make([]*placement.Bundle, 0, len(oldIDs)+1) - for _, ID := range append(oldIDs, dbInfo.ID) { - oldBundle, ok := d.infoCache.GetLatest().BundleByName(placement.GroupID(ID)) - if ok && !oldBundle.IsEmpty() { - bundles = append(bundles, placement.NewBundle(ID)) - } + var ruleIDs []string + for _, tblInfo := range tables { + rules := append(getPartitionRuleIDs(job.SchemaName, tblInfo), fmt.Sprintf(label.TableIDFormat, label.IDPrefix, job.SchemaName, tblInfo.Name.L)) + ruleIDs = append(ruleIDs, rules...) } - err := infosync.PutRuleBundles(context.TODO(), bundles) + patch := label.NewRulePatch([]*label.Rule{}, ruleIDs) + err = infosync.UpdateLabelRules(context.TODO(), patch) if err != nil { job.State = model.JobStateCancelled return ver, errors.Trace(err) } + // Update the job state when all affairs done. job.SchemaState = model.StateWriteOnly case model.StateWriteOnly: diff --git a/ddl/schema_test.go b/ddl/schema_test.go index 7ddbe1a4ea0db..2ad14b417d8ec 100644 --- a/ddl/schema_test.go +++ b/ddl/schema_test.go @@ -16,6 +16,7 @@ package ddl import ( "context" + "testing" "time" . "github.com/pingcap/check" @@ -27,6 +28,7 @@ import ( "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" + "github.com/stretchr/testify/require" ) var _ = Suite(&testSchemaSuite{}) @@ -39,14 +41,16 @@ func (s *testSchemaSuite) SetUpSuite(c *C) { func (s *testSchemaSuite) TearDownSuite(c *C) { } -func testSchemaInfo(c *C, d *ddl, name string) *model.DBInfo { +func testSchemaInfo(d *ddl, name string) (*model.DBInfo, error) { dbInfo := &model.DBInfo{ Name: model.NewCIStr(name), } genIDs, err := d.genGlobalIDs(1) - c.Assert(err, IsNil) + if err != nil { + return nil, err + } dbInfo.ID = genIDs[0] - return dbInfo + return dbInfo, nil } func testCreateSchema(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo) *model.Job { @@ -66,6 +70,23 @@ func testCreateSchema(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo return job } +func testCreateSchemaT(t *testing.T, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo) *model.Job { + job := &model.Job{ + SchemaID: dbInfo.ID, + Type: model.ActionCreateSchema, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{dbInfo}, + } + err := d.doDDLJob(ctx, job) + require.NoError(t, err) + + v := getSchemaVerT(t, ctx) + dbInfo.State = model.StatePublic + checkHistoryJobArgsT(t, ctx, job.ID, &historyJobArgs{ver: v, db: dbInfo}) + dbInfo.State = model.StateNone + return job +} + func buildDropSchemaJob(dbInfo *model.DBInfo) *model.Job { return &model.Job{ SchemaID: dbInfo.ID, @@ -82,6 +103,14 @@ func testDropSchema(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo) return job, ver } +func testDropSchemaT(t *testing.T, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo) (*model.Job, int64) { + job := buildDropSchemaJob(dbInfo) + err := d.doDDLJob(ctx, job) + require.NoError(t, err) + ver := getSchemaVerT(t, ctx) + return job, ver +} + func isDDLJobDone(c *C, t *meta.Meta) bool { job, err := t.GetDDLJobByIdx(0) c.Assert(err, IsNil) @@ -129,18 +158,19 @@ func (s *testSchemaSuite) TestSchema(c *C) { err := store.Close() c.Assert(err, IsNil) }() - d := testNewDDLAndStart( + d, err := testNewDDLAndStart( context.Background(), - c, WithStore(store), WithLease(testLease), ) + c.Assert(err, IsNil) defer func() { err := d.Stop() c.Assert(err, IsNil) }() ctx := testNewContext(d) - dbInfo := testSchemaInfo(c, d, "test_schema") + dbInfo, err := testSchemaInfo(d, "test_schema") + c.Assert(err, IsNil) // create a database. job := testCreateSchema(c, ctx, d, dbInfo) @@ -149,7 +179,8 @@ func (s *testSchemaSuite) TestSchema(c *C) { /*** to drop the schema with two tables. ***/ // create table t with 100 records. - tblInfo1 := testTableInfo(c, d, "t", 3) + tblInfo1, err := testTableInfo(d, "t", 3) + c.Assert(err, IsNil) tJob1 := testCreateTable(c, ctx, d, dbInfo, tblInfo1) testCheckTableState(c, d, dbInfo, tblInfo1, model.StatePublic) testCheckJobDone(c, d, tJob1, true) @@ -159,7 +190,8 @@ func (s *testSchemaSuite) TestSchema(c *C) { c.Assert(err, IsNil) } // create table t1 with 1034 records. - tblInfo2 := testTableInfo(c, d, "t1", 3) + tblInfo2, err := testTableInfo(d, "t1", 3) + c.Assert(err, IsNil) tJob2 := testCreateTable(c, ctx, d, dbInfo, tblInfo2) testCheckTableState(c, d, dbInfo, tblInfo2, model.StatePublic) testCheckJobDone(c, d, tJob2, true) @@ -181,11 +213,12 @@ func (s *testSchemaSuite) TestSchema(c *C) { Type: model.ActionDropSchema, BinlogInfo: &model.HistoryInfo{}, } - err := d.doDDLJob(ctx, job) + err = d.doDDLJob(ctx, job) c.Assert(terror.ErrorEqual(err, infoschema.ErrDatabaseDropExists), IsTrue, Commentf("err %v", err)) // Drop a database without a table. - dbInfo1 := testSchemaInfo(c, d, "test1") + dbInfo1, err := testSchemaInfo(d, "test1") + c.Assert(err, IsNil) job = testCreateSchema(c, ctx, d, dbInfo1) testCheckSchemaState(c, d, dbInfo1, model.StatePublic) testCheckJobDone(c, d, job, true) @@ -201,12 +234,12 @@ func (s *testSchemaSuite) TestSchemaWaitJob(c *C) { c.Assert(err, IsNil) }() - d1 := testNewDDLAndStart( + d1, err := testNewDDLAndStart( context.Background(), - c, WithStore(store), WithLease(testLease), ) + c.Assert(err, IsNil) defer func() { err := d1.Stop() c.Assert(err, IsNil) @@ -214,12 +247,12 @@ func (s *testSchemaSuite) TestSchemaWaitJob(c *C) { testCheckOwner(c, d1, true) - d2 := testNewDDLAndStart( + d2, err := testNewDDLAndStart( context.Background(), - c, WithStore(store), WithLease(testLease*4), ) + c.Assert(err, IsNil) defer func() { err := d2.Stop() c.Assert(err, IsNil) @@ -229,7 +262,8 @@ func (s *testSchemaSuite) TestSchemaWaitJob(c *C) { // d2 must not be owner. d2.ownerManager.RetireOwner() - dbInfo := testSchemaInfo(c, d2, "test_schema") + dbInfo, err := testSchemaInfo(d2, "test_schema") + c.Assert(err, IsNil) testCreateSchema(c, ctx, d2, dbInfo) testCheckSchemaState(c, d2, dbInfo, model.StatePublic) diff --git a/ddl/serial_test.go b/ddl/serial_test.go index 8ba3c62dcd54a..51dccd346b336 100644 --- a/ddl/serial_test.go +++ b/ddl/serial_test.go @@ -530,13 +530,17 @@ func (s *testSerialSuite) TestCreateTableWithLike(c *C) { func (s *testSerialSuite) TestCreateTableWithLikeAtTemporaryMode(c *C) { tk := testkit.NewTestKit(c, s.store) + se, err := session.CreateSession4Test(s.store) + c.Assert(err, IsNil) + _, err = se.Execute(context.Background(), "set @@global.tidb_enable_alter_placement=1") + c.Assert(err, IsNil) // Test create table like at temporary mode. tk.MustExec("use test") tk.MustExec("drop table if exists temporary_table;") tk.MustExec("create global temporary table temporary_table (a int, b int,index(a)) on commit delete rows") tk.MustExec("drop table if exists temporary_table_t1;") - _, err := tk.Exec("create table temporary_table_t1 like temporary_table") + _, err = tk.Exec("create table temporary_table_t1 like temporary_table") c.Assert(err.Error(), Equals, core.ErrOptOnTemporaryTable.GenWithStackByArgs("create table like").Error()) tk.MustExec("drop table if exists temporary_table;") @@ -1120,7 +1124,10 @@ func (s *testSerialSuite) TestTableLocksEnable(c *C) { }) tk.MustExec("lock tables t1 write") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows("Warning 1235 LOCK TABLES is not supported. To enable this experimental feature, set 'enable-table-lock' in the configuration file.")) checkTableLock(c, tk.Se, "test", "t1", model.TableLockNone) + tk.MustExec("unlock tables") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows("Warning 1235 UNLOCK TABLES is not supported. To enable this experimental feature, set 'enable-table-lock' in the configuration file.")) } func (s *testSerialDBSuite) TestAutoRandomOnTemporaryTable(c *C) { @@ -1645,6 +1652,7 @@ func (s *testIntegrationSuite7) TestInvisibleIndex(c *C) { // Implicit primary key cannot be invisible index // Create a implicit primary key tk.MustGetErrCode("create table t2(a int not null, unique (a) invisible)", errno.ErrPKIndexCantBeInvisible) + tk.MustGetErrCode("create table t2(a int auto_increment, unique key (a) invisible);", errno.ErrPKIndexCantBeInvisible) // Column `a` become implicit primary key after DDL statement on itself tk.MustExec("create table t2(a int not null)") tk.MustGetErrCode("alter table t2 add unique (a) invisible", errno.ErrPKIndexCantBeInvisible) diff --git a/ddl/stat_test.go b/ddl/stat_test.go index 58cb113352805..933cde0ae95a4 100644 --- a/ddl/stat_test.go +++ b/ddl/stat_test.go @@ -51,26 +51,28 @@ func (s *testSerialStatSuite) TestDDLStatsInfo(c *C) { c.Assert(err, IsNil) }() - d := testNewDDLAndStart( + d, err := testNewDDLAndStart( context.Background(), - c, WithStore(store), WithLease(testLease), ) + c.Assert(err, IsNil) defer func() { err := d.Stop() c.Assert(err, IsNil) }() - dbInfo := testSchemaInfo(c, d, "test_stat") + dbInfo, err := testSchemaInfo(d, "test_stat") + c.Assert(err, IsNil) testCreateSchema(c, testNewContext(d), d, dbInfo) - tblInfo := testTableInfo(c, d, "t", 2) + tblInfo, err := testTableInfo(d, "t", 2) + c.Assert(err, IsNil) ctx := testNewContext(d) testCreateTable(c, ctx, d, dbInfo, tblInfo) t := testGetTable(c, d, dbInfo.ID, tblInfo.ID) // insert t values (1, 1), (2, 2), (3, 3) - _, err := t.AddRecord(ctx, types.MakeDatums(1, 1)) + _, err = t.AddRecord(ctx, types.MakeDatums(1, 1)) c.Assert(err, IsNil) _, err = t.AddRecord(ctx, types.MakeDatums(2, 2)) c.Assert(err, IsNil) diff --git a/ddl/table.go b/ddl/table.go index 71e07302c65b5..80b78491fbde5 100644 --- a/ddl/table.go +++ b/ddl/table.go @@ -59,28 +59,6 @@ func createTable(d *ddlCtx, t *meta.Meta, job *model.Job) (*model.TableInfo, err } return tbInfo, errors.Trace(err) } - // placement rules meta inheritance. - dbInfo, err := checkSchemaExistAndCancelNotExistJob(t, job) - if err != nil { - return tbInfo, errors.Trace(err) - } - err = inheritPlacementRuleFromDB(tbInfo, dbInfo) - if err != nil { - return tbInfo, errors.Trace(err) - } - - // build table & partition bundles if any. - tableBundle, err := newBundleFromTblInfo(t, job, tbInfo) - if err != nil { - return tbInfo, errors.Trace(err) - } - partitionBundles, err := newBundleFromPartition(t, job, tbInfo.Partition) - if err != nil { - return tbInfo, errors.Trace(err) - } - bundles := make([]*placement.Bundle, 0, 1+len(partitionBundles)) - bundles = append(bundles, tableBundle) - bundles = append(bundles, partitionBundles...) switch tbInfo.State { case model.StateNone: @@ -97,8 +75,20 @@ func createTable(d *ddlCtx, t *meta.Meta, job *model.Job) (*model.TableInfo, err failpoint.Return(tbInfo, errors.New("mock create table error")) } }) + + // build table & partition bundles if any. + if err = checkAllTablePlacementPoliciesExistAndCancelNonExistJob(t, job, tbInfo); err != nil { + return tbInfo, errors.Trace(err) + } + + bundles, err := placement.NewFullTableBundles(t, tbInfo) + if err != nil { + job.State = model.JobStateCancelled + return tbInfo, errors.Trace(err) + } + // Send the placement bundle to PD. - err = infosync.PutRuleBundles(context.TODO(), bundles) + err = infosync.PutRuleBundlesWithDefaultRetry(context.TODO(), bundles) if err != nil { job.State = model.JobStateCancelled return tbInfo, errors.Wrapf(err, "failed to notify PD the placement rules") @@ -185,92 +175,6 @@ func onCreateTables(d *ddlCtx, t *meta.Meta, job *model.Job) (int64, error) { return ver, errors.Trace(err) } -func inheritPlacementRuleFromDB(tbInfo *model.TableInfo, dbInfo *model.DBInfo) error { - if tbInfo.DirectPlacementOpts == nil && tbInfo.PlacementPolicyRef == nil { - if dbInfo.DirectPlacementOpts != nil { - clone := *dbInfo.DirectPlacementOpts - tbInfo.DirectPlacementOpts = &clone - } - if dbInfo.PlacementPolicyRef != nil { - clone := *dbInfo.PlacementPolicyRef - tbInfo.PlacementPolicyRef = &clone - } - } - // Can not use both a placement policy and direct assignment. If you alter specify both in a CREATE TABLE or ALTER TABLE an error will be returned. - if tbInfo.DirectPlacementOpts != nil && tbInfo.PlacementPolicyRef != nil { - return ErrPlacementPolicyWithDirectOption.GenWithStackByArgs(tbInfo.PlacementPolicyRef.Name) - } - return nil -} - -func newBundleFromTblInfo(t *meta.Meta, job *model.Job, tbInfo *model.TableInfo) (*placement.Bundle, error) { - bundle, err := newBundleFromPolicyOrDirectOptions(t, job, tbInfo.PlacementPolicyRef, tbInfo.DirectPlacementOpts) - if err != nil { - return nil, errors.Trace(err) - } - if bundle == nil { - return nil, nil - } - ids := []int64{tbInfo.ID} - // build the default partition rules in the table-level bundle. - if tbInfo.Partition != nil { - for _, pDef := range tbInfo.Partition.Definitions { - ids = append(ids, pDef.ID) - } - } - bundle.Reset(placement.RuleIndexTable, ids) - return bundle, nil -} - -func newBundleFromPartition(t *meta.Meta, job *model.Job, partition *model.PartitionInfo) ([]*placement.Bundle, error) { - if partition == nil { - return nil, nil - } - bundles := make([]*placement.Bundle, 0, len(partition.Definitions)) - // If the partition has the placement rules on their own, build the partition-level bundles additionally. - for _, def := range partition.Definitions { - bundle, err := newBundleFromPolicyOrDirectOptions(t, job, def.PlacementPolicyRef, def.DirectPlacementOpts) - if err != nil { - return nil, errors.Trace(err) - } - if bundle == nil { - continue - } - bundle.Reset(placement.RuleIndexPartition, []int64{def.ID}) - bundles = append(bundles, bundle) - continue - } - return bundles, nil -} - -func newBundleFromPolicyOrDirectOptions(t *meta.Meta, job *model.Job, ref *model.PolicyRefInfo, directOpts *model.PlacementSettings) (*placement.Bundle, error) { - if directOpts != nil { - // build bundle from direct placement options. - bundle, err := placement.NewBundleFromOptions(directOpts) - if err != nil { - job.State = model.JobStateCancelled - return nil, errors.Trace(err) - } - return bundle, nil - } - if ref != nil { - // placement policy reference will override the direct placement options. - po, err := checkPlacementPolicyExistAndCancelNonExistJob(t, job, ref.ID) - if err != nil { - job.State = model.JobStateCancelled - return nil, errors.Trace(infoschema.ErrPlacementPolicyNotExists.GenWithStackByArgs(ref.Name)) - } - // build bundle from placement policy. - bundle, err := placement.NewBundleFromOptions(po.PlacementSettings) - if err != nil { - job.State = model.JobStateCancelled - return nil, errors.Trace(err) - } - return bundle, nil - } - return nil, nil -} - func createTableOrViewWithCheck(t *meta.Meta, job *model.Job, schemaID int64, tbInfo *model.TableInfo) error { err := checkTableInfoValid(tbInfo) if err != nil { @@ -693,34 +597,21 @@ func onTruncateTable(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ erro } } - is := d.infoCache.GetLatest() - - bundles := make([]*placement.Bundle, 0, len(oldPartitionIDs)+1) - if oldBundle, ok := is.BundleByName(placement.GroupID(tableID)); ok { - bundles = append(bundles, oldBundle.Clone().Reset(placement.RuleIndexTable, []int64{newTableID})) - } - if pi := tblInfo.GetPartitionInfo(); pi != nil { oldIDs := make([]int64, 0, len(oldPartitionIDs)) newIDs := make([]int64, 0, len(oldPartitionIDs)) newDefs := pi.Definitions for i := range oldPartitionIDs { - newID := newDefs[i].ID - if oldBundle, ok := is.BundleByName(placement.GroupID(oldPartitionIDs[i])); ok && !oldBundle.IsEmpty() { + newDef := &newDefs[i] + newID := newDef.ID + if newDef.PlacementPolicyRef != nil || newDef.DirectPlacementOpts != nil { oldIDs = append(oldIDs, oldPartitionIDs[i]) newIDs = append(newIDs, newID) - bundles = append(bundles, oldBundle.Clone().Reset(placement.RuleIndexPartition, []int64{newID})) } } job.CtxVars = []interface{}{oldIDs, newIDs} } - err = infosync.PutRuleBundles(context.TODO(), bundles) - if err != nil { - job.State = model.JobStateCancelled - return 0, errors.Wrapf(err, "failed to notify PD the placement rules") - } - tableRuleID, partRuleIDs, _, oldRules, err := getOldLabelRules(tblInfo, job.SchemaName, tblInfo.Name.L) if err != nil { job.State = model.JobStateCancelled @@ -740,6 +631,20 @@ func onTruncateTable(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ erro } tblInfo.ID = newTableID + + // build table & partition bundles if any. + bundles, err := placement.NewFullTableBundles(t, tblInfo) + if err != nil { + job.State = model.JobStateCancelled + return ver, errors.Trace(err) + } + + err = infosync.PutRuleBundlesWithDefaultRetry(context.TODO(), bundles) + if err != nil { + job.State = model.JobStateCancelled + return 0, errors.Wrapf(err, "failed to notify PD the placement rules") + } + err = t.CreateTableOrView(schemaID, tblInfo) if err != nil { job.State = model.JobStateCancelled @@ -1352,7 +1257,7 @@ func onAlterTableAttributes(t *meta.Meta, job *model.Job) (ver int64, err error) } if err != nil { job.State = model.JobStateCancelled - return 0, errors.Wrapf(err, "failed to notify PD label rule") + return 0, errors.Wrapf(err, "failed to notify PD the label rules") } ver, err = updateVersionAndTableInfo(t, job, tblInfo, true) if err != nil { @@ -1390,7 +1295,7 @@ func onAlterTablePartitionAttributes(t *meta.Meta, job *model.Job) (ver int64, e } if err != nil { job.State = model.JobStateCancelled - return 0, errors.Wrapf(err, "failed to notify PD region label") + return 0, errors.Wrapf(err, "failed to notify PD the label rules") } ver, err = updateVersionAndTableInfo(t, job, tblInfo, true) if err != nil { @@ -1401,11 +1306,11 @@ func onAlterTablePartitionAttributes(t *meta.Meta, job *model.Job) (ver int64, e return ver, nil } -func onAlterTablePartitionOptions(t *meta.Meta, job *model.Job) (ver int64, err error) { +func onAlterTablePartitionPlacement(t *meta.Meta, job *model.Job) (ver int64, err error) { var partitionID int64 policyRefInfo := &model.PolicyRefInfo{} placementSettings := &model.PlacementSettings{} - err = job.DecodeArgs(&partitionID, policyRefInfo, placementSettings) + err = job.DecodeArgs(&partitionID, &policyRefInfo, &placementSettings) if err != nil { job.State = model.JobStateCancelled return 0, errors.Trace(err) @@ -1416,17 +1321,21 @@ func onAlterTablePartitionOptions(t *meta.Meta, job *model.Job) (ver int64, err } ptInfo := tblInfo.GetPartitionInfo() - isFound := false + var partitionDef *model.PartitionDefinition definitions := ptInfo.Definitions + oldPartitionEnablesPlacement := false for i := range definitions { if partitionID == definitions[i].ID { - definitions[i].DirectPlacementOpts = placementSettings - definitions[i].PlacementPolicyRef = policyRefInfo - isFound = true + def := &definitions[i] + oldPartitionEnablesPlacement = def.PlacementPolicyRef != nil || def.DirectPlacementOpts != nil + def.DirectPlacementOpts = placementSettings + def.PlacementPolicyRef = policyRefInfo + partitionDef = &definitions[i] break } } - if !isFound { + + if partitionDef == nil { job.State = model.JobStateCancelled return 0, errors.Trace(table.ErrUnknownPartition.GenWithStackByArgs("drop?", tblInfo.Name.O)) } @@ -1435,6 +1344,82 @@ func onAlterTablePartitionOptions(t *meta.Meta, job *model.Job) (ver int64, err if err != nil { return ver, errors.Trace(err) } + + if _, err = checkPlacementPolicyRefValidAndCanNonValidJob(t, job, partitionDef.PlacementPolicyRef); err != nil { + return ver, errors.Trace(err) + } + + bundle, err := placement.NewPartitionBundle(t, *partitionDef) + if err != nil { + job.State = model.JobStateCancelled + return ver, errors.Trace(err) + } + + if bundle == nil && oldPartitionEnablesPlacement { + bundle = placement.NewBundle(partitionDef.ID) + } + + // Send the placement bundle to PD. + if bundle != nil { + err = infosync.PutRuleBundlesWithDefaultRetry(context.TODO(), []*placement.Bundle{bundle}) + } + + if err != nil { + job.State = model.JobStateCancelled + return ver, errors.Wrapf(err, "failed to notify PD the placement rules") + } + + job.FinishTableJob(model.JobStateDone, model.StatePublic, ver, tblInfo) + return ver, nil +} + +func onAlterTablePlacement(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, err error) { + policyRefInfo := &model.PolicyRefInfo{} + placementSettings := &model.PlacementSettings{} + err = job.DecodeArgs(&policyRefInfo, &placementSettings) + if err != nil { + job.State = model.JobStateCancelled + return 0, errors.Trace(err) + } + + tblInfo, err := getTableInfoAndCancelFaultJob(t, job, job.SchemaID) + if err != nil { + return 0, err + } + + if _, err = checkPlacementPolicyRefValidAndCanNonValidJob(t, job, policyRefInfo); err != nil { + return 0, errors.Trace(err) + } + + oldTableEnablesPlacement := tblInfo.PlacementPolicyRef != nil || tblInfo.DirectPlacementOpts != nil + tblInfo.PlacementPolicyRef = policyRefInfo + tblInfo.DirectPlacementOpts = placementSettings + + ver, err = updateVersionAndTableInfo(t, job, tblInfo, true) + if err != nil { + return ver, errors.Trace(err) + } + + bundle, err := placement.NewTableBundle(t, tblInfo) + if err != nil { + job.State = model.JobStateCancelled + return ver, errors.Trace(err) + } + + if bundle == nil && oldTableEnablesPlacement { + bundle = placement.NewBundle(tblInfo.ID) + } + + // Send the placement bundle to PD. + if bundle != nil { + err = infosync.PutRuleBundlesWithDefaultRetry(context.TODO(), []*placement.Bundle{bundle}) + } + + if err != nil { + job.State = model.JobStateCancelled + return ver, errors.Trace(err) + } + job.FinishTableJob(model.JobStateDone, model.StatePublic, ver, tblInfo) return ver, nil @@ -1480,3 +1465,81 @@ func updateLabelRules(job *model.Job, tblInfo *model.TableInfo, oldRules map[str patch := label.NewRulePatch(newRules, oldRuleIDs) return infosync.UpdateLabelRules(context.TODO(), patch) } + +func onAlterCacheTable(t *meta.Meta, job *model.Job) (ver int64, err error) { + tbInfo, err := getTableInfoAndCancelFaultJob(t, job, job.SchemaID) + if err != nil { + return 0, errors.Trace(err) + } + // If the table is already in the cache state + if tbInfo.TableCacheStatusType == model.TableCacheStatusEnable { + job.FinishTableJob(model.JobStateDone, model.StatePublic, ver, tbInfo) + return ver, nil + } + + if tbInfo.TempTableType != model.TempTableNone { + return ver, errors.Trace(ErrOptOnTemporaryTable.GenWithStackByArgs("alter temporary table cache")) + } + + if tbInfo.Partition != nil { + return ver, errors.Trace(ErrOptOnCacheTable.GenWithStackByArgs("partition mode")) + } + + switch tbInfo.TableCacheStatusType { + case model.TableCacheStatusDisable: + // disable -> switching + tbInfo.TableCacheStatusType = model.TableCacheStatusSwitching + ver, err = updateVersionAndTableInfoWithCheck(t, job, tbInfo, true) + if err != nil { + return ver, err + } + case model.TableCacheStatusSwitching: + // switching -> enable + tbInfo.TableCacheStatusType = model.TableCacheStatusEnable + ver, err = updateVersionAndTableInfoWithCheck(t, job, tbInfo, true) + if err != nil { + return ver, err + } + // Finish this job. + job.FinishTableJob(model.JobStateDone, model.StatePublic, ver, tbInfo) + default: + job.State = model.JobStateCancelled + err = ErrInvalidDDLState.GenWithStackByArgs("alter table cache", tbInfo.TableCacheStatusType.String()) + } + return ver, err +} + +func onAlterNoCacheTable(t *meta.Meta, job *model.Job) (ver int64, err error) { + tbInfo, err := getTableInfoAndCancelFaultJob(t, job, job.SchemaID) + if err != nil { + return 0, errors.Trace(err) + } + // If the table is not in the cache state + if tbInfo.TableCacheStatusType == model.TableCacheStatusDisable { + job.FinishTableJob(model.JobStateDone, model.StatePublic, ver, tbInfo) + return ver, nil + } + + switch tbInfo.TableCacheStatusType { + case model.TableCacheStatusEnable: + // enable -> switching + tbInfo.TableCacheStatusType = model.TableCacheStatusSwitching + ver, err = updateVersionAndTableInfoWithCheck(t, job, tbInfo, true) + if err != nil { + return ver, err + } + case model.TableCacheStatusSwitching: + // switching -> disable + tbInfo.TableCacheStatusType = model.TableCacheStatusDisable + ver, err = updateVersionAndTableInfoWithCheck(t, job, tbInfo, true) + if err != nil { + return ver, err + } + // Finish this job. + job.FinishTableJob(model.JobStateDone, model.StatePublic, ver, tbInfo) + default: + job.State = model.JobStateCancelled + err = ErrInvalidDDLState.GenWithStackByArgs("alter table no cache", tbInfo.TableCacheStatusType.String()) + } + return ver, err +} diff --git a/ddl/table_split_test.go b/ddl/table_split_test.go index cc8ee498b2d13..299abe09fb686 100644 --- a/ddl/table_split_test.go +++ b/ddl/table_split_test.go @@ -17,35 +17,34 @@ package ddl_test import ( "context" "sync/atomic" + "testing" "time" - . "github.com/pingcap/check" "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/tablecodec" - "github.com/pingcap/tidb/util/testkit" - "github.com/tikv/client-go/v2/tikv" -) + "github.com/pingcap/tidb/testkit" -type testDDLTableSplitSuite struct{} + "github.com/tikv/client-go/v2/tikv" -var _ = Suite(&testDDLTableSplitSuite{}) + "github.com/stretchr/testify/require" +) -func (s *testDDLTableSplitSuite) TestTableSplit(c *C) { +func TestTableSplit(t *testing.T) { store, err := mockstore.NewMockStore() - c.Assert(err, IsNil) + require.NoError(t, err) defer func() { err := store.Close() - c.Assert(err, IsNil) + require.NoError(t, err) }() session.SetSchemaLease(100 * time.Millisecond) session.DisableStats4Test() atomic.StoreUint32(&ddl.EnableSplitTableRegion, 1) dom, err := session.BootstrapSession(store) - c.Assert(err, IsNil) - tk := testkit.NewTestKit(c, store) + require.NoError(t, err) + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") // Synced split table region. tk.MustExec("set global tidb_scatter_region = 1") @@ -56,17 +55,17 @@ func (s *testDDLTableSplitSuite) TestTableSplit(c *C) { defer dom.Close() atomic.StoreUint32(&ddl.EnableSplitTableRegion, 0) infoSchema := dom.InfoSchema() - c.Assert(infoSchema, NotNil) - t, err := infoSchema.TableByName(model.NewCIStr("mysql"), model.NewCIStr("tidb")) - c.Assert(err, IsNil) - checkRegionStartWithTableID(c, t.Meta().ID, store.(kvStore)) + require.NotNil(t, infoSchema) + tbl, err := infoSchema.TableByName(model.NewCIStr("mysql"), model.NewCIStr("tidb")) + require.NoError(t, err) + checkRegionStartWithTableID(t, tbl.Meta().ID, store.(kvStore)) - t, err = infoSchema.TableByName(model.NewCIStr("test"), model.NewCIStr("t_part")) - c.Assert(err, IsNil) - pi := t.Meta().GetPartitionInfo() - c.Assert(pi, NotNil) + tbl, err = infoSchema.TableByName(model.NewCIStr("test"), model.NewCIStr("t_part")) + require.NoError(t, err) + pi := tbl.Meta().GetPartitionInfo() + require.NotNil(t, pi) for _, def := range pi.Definitions { - checkRegionStartWithTableID(c, def.ID, store.(kvStore)) + checkRegionStartWithTableID(t, def.ID, store.(kvStore)) } } @@ -74,14 +73,14 @@ type kvStore interface { GetRegionCache() *tikv.RegionCache } -func checkRegionStartWithTableID(c *C, id int64, store kvStore) { +func checkRegionStartWithTableID(t *testing.T, id int64, store kvStore) { regionStartKey := tablecodec.EncodeTablePrefix(id) var loc *tikv.KeyLocation var err error cache := store.GetRegionCache() loc, err = cache.LocateKey(tikv.NewBackoffer(context.Background(), 5000), regionStartKey) - c.Assert(err, IsNil) + require.NoError(t, err) // Region cache may be out of date, so we need to drop this expired region and load it again. cache.InvalidateCachedRegion(loc.Region) - c.Assert(loc.StartKey, BytesEquals, []byte(regionStartKey)) + require.Equal(t, []byte(regionStartKey), loc.StartKey) } diff --git a/ddl/table_test.go b/ddl/table_test.go index 168dc86dcc243..98b5824c03d8e 100644 --- a/ddl/table_test.go +++ b/ddl/table_test.go @@ -15,158 +15,22 @@ package ddl import ( - "bytes" "context" - "fmt" + "testing" - . "github.com/pingcap/check" "github.com/pingcap/errors" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/meta/autoid" - "github.com/pingcap/tidb/parser/auth" "github.com/pingcap/tidb/parser/model" - "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/types" + "github.com/stretchr/testify/require" ) -var _ = Suite(&testTableSuite{}) - -type testTableSuite struct { - store kv.Storage - dbInfo *model.DBInfo - - d *ddl -} - -func testTableInfoWith2IndexOnFirstColumn(c *C, d *ddl, name string, num int) *model.TableInfo { - normalInfo := testTableInfo(c, d, name, num) - idxs := make([]*model.IndexInfo, 0, 2) - for i := range idxs { - idx := &model.IndexInfo{ - Name: model.NewCIStr(fmt.Sprintf("i%d", i+1)), - State: model.StatePublic, - Columns: []*model.IndexColumn{{Name: model.NewCIStr("c1")}}, - } - idxs = append(idxs, idx) - } - normalInfo.Indices = idxs - normalInfo.Columns[0].FieldType.Flen = 11 - return normalInfo -} - -// testTableInfo creates a test table with num int columns and with no index. -func testTableInfo(c *C, d *ddl, name string, num int) *model.TableInfo { - tblInfo := &model.TableInfo{ - Name: model.NewCIStr(name), - } - genIDs, err := d.genGlobalIDs(1) - c.Assert(err, IsNil) - tblInfo.ID = genIDs[0] - - cols := make([]*model.ColumnInfo, num) - for i := range cols { - col := &model.ColumnInfo{ - Name: model.NewCIStr(fmt.Sprintf("c%d", i+1)), - Offset: i, - DefaultValue: i + 1, - State: model.StatePublic, - } - - col.FieldType = *types.NewFieldType(mysql.TypeLong) - col.ID = allocateColumnID(tblInfo) - cols[i] = col - } - tblInfo.Columns = cols - tblInfo.Charset = "utf8" - tblInfo.Collate = "utf8_bin" - return tblInfo -} - -// testTableInfoWithPartition creates a test table with num int columns and with no index. -func testTableInfoWithPartition(c *C, d *ddl, name string, num int) *model.TableInfo { - tblInfo := testTableInfo(c, d, name, num) - genIDs, err := d.genGlobalIDs(1) - c.Assert(err, IsNil) - pid := genIDs[0] - tblInfo.Partition = &model.PartitionInfo{ - Type: model.PartitionTypeRange, - Expr: tblInfo.Columns[0].Name.L, - Enable: true, - Definitions: []model.PartitionDefinition{{ - ID: pid, - Name: model.NewCIStr("p0"), - LessThan: []string{"maxvalue"}, - }}, - } - - return tblInfo -} - -// testTableInfoWithPartitionLessThan creates a test table with num int columns and one partition specified with lessthan. -func testTableInfoWithPartitionLessThan(c *C, d *ddl, name string, num int, lessthan string) *model.TableInfo { - tblInfo := testTableInfoWithPartition(c, d, name, num) - tblInfo.Partition.Definitions[0].LessThan = []string{lessthan} - return tblInfo -} - -func testAddedNewTablePartitionInfo(c *C, d *ddl, tblInfo *model.TableInfo, partName, lessthan string) *model.PartitionInfo { - genIDs, err := d.genGlobalIDs(1) - c.Assert(err, IsNil) - pid := genIDs[0] - // the new added partition should change the partition state to state none at the beginning. - return &model.PartitionInfo{ - Type: model.PartitionTypeRange, - Expr: tblInfo.Columns[0].Name.L, - Enable: true, - Definitions: []model.PartitionDefinition{{ - ID: pid, - Name: model.NewCIStr(partName), - LessThan: []string{lessthan}, - }}, - } -} - -// testViewInfo creates a test view with num int columns. -func testViewInfo(c *C, d *ddl, name string, num int) *model.TableInfo { - tblInfo := &model.TableInfo{ - Name: model.NewCIStr(name), - } - genIDs, err := d.genGlobalIDs(1) - c.Assert(err, IsNil) - tblInfo.ID = genIDs[0] - - cols := make([]*model.ColumnInfo, num) - viewCols := make([]model.CIStr, num) - - var stmtBuffer bytes.Buffer - stmtBuffer.WriteString("SELECT ") - for i := range cols { - col := &model.ColumnInfo{ - Name: model.NewCIStr(fmt.Sprintf("c%d", i+1)), - Offset: i, - State: model.StatePublic, - } - - col.ID = allocateColumnID(tblInfo) - cols[i] = col - viewCols[i] = col.Name - stmtBuffer.WriteString(cols[i].Name.L + ",") - } - stmtBuffer.WriteString("1 FROM t") - - view := model.ViewInfo{Cols: viewCols, Security: model.SecurityDefiner, Algorithm: model.AlgorithmMerge, - SelectStmt: stmtBuffer.String(), CheckOption: model.CheckOptionCascaded, Definer: &auth.UserIdentity{CurrentUser: true}} - - tblInfo.View = &view - tblInfo.Columns = cols - - return tblInfo -} - -func testCreateTable(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo) *model.Job { +func testCreateTableT(t *testing.T, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo) *model.Job { job := &model.Job{ SchemaID: dbInfo.ID, TableID: tblInfo.ID, @@ -175,36 +39,16 @@ func testCreateTable(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, Args: []interface{}{tblInfo}, } err := d.doDDLJob(ctx, job) - c.Assert(err, IsNil) - - v := getSchemaVer(c, ctx) - tblInfo.State = model.StatePublic - checkHistoryJobArgs(c, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo}) - tblInfo.State = model.StateNone - return job -} - -func testCreateView(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo) *model.Job { - job := &model.Job{ - SchemaID: dbInfo.ID, - TableID: tblInfo.ID, - Type: model.ActionCreateView, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{tblInfo, false, 0}, - } - - c.Assert(tblInfo.IsView(), IsTrue) - err := d.doDDLJob(ctx, job) - c.Assert(err, IsNil) + require.NoError(t, err) - v := getSchemaVer(c, ctx) + v := getSchemaVerT(t, ctx) tblInfo.State = model.StatePublic - checkHistoryJobArgs(c, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo}) + checkHistoryJobArgsT(t, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo}) tblInfo.State = model.StateNone return job } -func testRenameTable(c *C, ctx sessionctx.Context, d *ddl, newSchemaID, oldSchemaID int64, oldSchemaName model.CIStr, tblInfo *model.TableInfo) *model.Job { +func testRenameTable(t *testing.T, ctx sessionctx.Context, d *ddl, newSchemaID, oldSchemaID int64, oldSchemaName model.CIStr, tblInfo *model.TableInfo) *model.Job { job := &model.Job{ SchemaID: newSchemaID, TableID: tblInfo.ID, @@ -213,16 +57,16 @@ func testRenameTable(c *C, ctx sessionctx.Context, d *ddl, newSchemaID, oldSchem Args: []interface{}{oldSchemaID, tblInfo.Name, oldSchemaName}, } err := d.doDDLJob(ctx, job) - c.Assert(err, IsNil) + require.NoError(t, err) - v := getSchemaVer(c, ctx) + v := getSchemaVerT(t, ctx) tblInfo.State = model.StatePublic - checkHistoryJobArgs(c, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo}) + checkHistoryJobArgsT(t, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo}) tblInfo.State = model.StateNone return job } -func testLockTable(c *C, ctx sessionctx.Context, d *ddl, newSchemaID int64, tblInfo *model.TableInfo, lockTp model.TableLockType) *model.Job { +func testLockTable(t *testing.T, ctx sessionctx.Context, d *ddl, newSchemaID int64, tblInfo *model.TableInfo, lockTp model.TableLockType) *model.Job { arg := &lockTablesArg{ LockTables: []model.TableLockTpInfo{{SchemaID: newSchemaID, TableID: tblInfo.ID, Tp: lockTp}}, SessionInfo: model.SessionInfo{ @@ -238,32 +82,33 @@ func testLockTable(c *C, ctx sessionctx.Context, d *ddl, newSchemaID int64, tblI Args: []interface{}{arg}, } err := d.doDDLJob(ctx, job) - c.Assert(err, IsNil) + require.NoError(t, err) - v := getSchemaVer(c, ctx) - checkHistoryJobArgs(c, ctx, job.ID, &historyJobArgs{ver: v}) + v := getSchemaVerT(t, ctx) + checkHistoryJobArgsT(t, ctx, job.ID, &historyJobArgs{ver: v}) return job } -func checkTableLockedTest(c *C, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo, serverID string, sessionID uint64, lockTp model.TableLockType) { +func checkTableLockedTest(t *testing.T, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo, serverID string, sessionID uint64, lockTp model.TableLockType) { err := kv.RunInNewTxn(context.Background(), d.store, false, func(ctx context.Context, txn kv.Transaction) error { - t := meta.NewMeta(txn) - info, err := t.GetTable(dbInfo.ID, tblInfo.ID) - c.Assert(err, IsNil) - - c.Assert(info, NotNil) - c.Assert(info.Lock, NotNil) - c.Assert(len(info.Lock.Sessions) == 1, IsTrue) - c.Assert(info.Lock.Sessions[0].ServerID, Equals, serverID) - c.Assert(info.Lock.Sessions[0].SessionID, Equals, sessionID) - c.Assert(info.Lock.Tp, Equals, lockTp) - c.Assert(info.Lock.State, Equals, model.TableLockStatePublic) + tt := meta.NewMeta(txn) + info, err := tt.GetTable(dbInfo.ID, tblInfo.ID) + require.NoError(t, err) + + require.NotNil(t, info) + require.NotNil(t, info.Lock) + require.Len(t, info.Lock.Sessions, 1) + require.Equal(t, serverID, info.Lock.Sessions[0].ServerID) + require.Equal(t, sessionID, info.Lock.Sessions[0].SessionID) + require.Equal(t, lockTp, info.Lock.Tp) + require.Equal(t, lockTp, info.Lock.Tp) + require.Equal(t, model.TableLockStatePublic, info.Lock.State) return nil }) - c.Assert(err, IsNil) + require.NoError(t, err) } -func testDropTable(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo) *model.Job { +func testDropTableT(t *testing.T, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo) *model.Job { job := &model.Job{ SchemaID: dbInfo.ID, TableID: tblInfo.ID, @@ -271,16 +116,16 @@ func testDropTable(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, t BinlogInfo: &model.HistoryInfo{}, } err := d.doDDLJob(ctx, job) - c.Assert(err, IsNil) + require.NoError(t, err) - v := getSchemaVer(c, ctx) - checkHistoryJobArgs(c, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo}) + v := getSchemaVerT(t, ctx) + checkHistoryJobArgsT(t, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo}) return job } -func testTruncateTable(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo) *model.Job { +func testTruncateTable(t *testing.T, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo) *model.Job { genIDs, err := d.genGlobalIDs(1) - c.Assert(err, IsNil) + require.NoError(t, err) newTableID := genIDs[0] job := &model.Job{ SchemaID: dbInfo.ID, @@ -290,35 +135,35 @@ func testTruncateTable(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInf Args: []interface{}{newTableID}, } err = d.doDDLJob(ctx, job) - c.Assert(err, IsNil) + require.NoError(t, err) - v := getSchemaVer(c, ctx) + v := getSchemaVerT(t, ctx) tblInfo.ID = newTableID - checkHistoryJobArgs(c, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo}) + checkHistoryJobArgsT(t, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo}) return job } -func testCheckTableState(c *C, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo, state model.SchemaState) { +func testCheckTableStateT(t *testing.T, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo, state model.SchemaState) { err := kv.RunInNewTxn(context.Background(), d.store, false, func(ctx context.Context, txn kv.Transaction) error { - t := meta.NewMeta(txn) - info, err := t.GetTable(dbInfo.ID, tblInfo.ID) - c.Assert(err, IsNil) + tt := meta.NewMeta(txn) + info, err := tt.GetTable(dbInfo.ID, tblInfo.ID) + require.NoError(t, err) if state == model.StateNone { - c.Assert(info, IsNil) + require.Nil(t, info) return nil } - c.Assert(info.Name, DeepEquals, tblInfo.Name) - c.Assert(info.State, Equals, state) + require.EqualValues(t, tblInfo.Name, info.Name) + require.Equal(t, state, info.State) return nil }) - c.Assert(err, IsNil) + require.NoError(t, err) } -func testGetTable(c *C, d *ddl, schemaID int64, tableID int64) table.Table { +func testGetTableT(t *testing.T, d *ddl, schemaID int64, tableID int64) table.Table { tbl, err := testGetTableWithError(d, schemaID, tableID) - c.Assert(err, IsNil) + require.NoError(t, err) return tbl } @@ -347,34 +192,161 @@ func testGetTableWithError(d *ddl, schemaID, tableID int64) (table.Table, error) return tbl, nil } -func (s *testTableSuite) SetUpSuite(c *C) { - s.store = testCreateStore(c, "test_table") - s.d = testNewDDLAndStart( +func TestTable(t *testing.T) { + store, err := mockstore.NewMockStore() + require.NoError(t, err) + ddl, err := testNewDDLAndStart( context.Background(), - c, - WithStore(s.store), + WithStore(store), WithLease(testLease), ) + require.NoError(t, err) + + dbInfo, err := testSchemaInfo(ddl, "test_table") + require.NoError(t, err) + testCreateSchemaT(t, testNewContext(ddl), ddl, dbInfo) + + ctx := testNewContext(ddl) + + tblInfo, err := testTableInfo(ddl, "t", 3) + require.NoError(t, err) + job := testCreateTableT(t, ctx, ddl, dbInfo, tblInfo) + testCheckTableStateT(t, ddl, dbInfo, tblInfo, model.StatePublic) + testCheckJobDoneT(t, ddl, job, true) + + // Create an existing table. + newTblInfo, err := testTableInfo(ddl, "t", 3) + require.NoError(t, err) + doDDLJobErrT(t, dbInfo.ID, newTblInfo.ID, model.ActionCreateTable, []interface{}{newTblInfo}, ctx, ddl) + + count := 2000 + tbl := testGetTableT(t, ddl, dbInfo.ID, tblInfo.ID) + for i := 1; i <= count; i++ { + _, err := tbl.AddRecord(ctx, types.MakeDatums(i, i, i)) + require.NoError(t, err) + } - s.dbInfo = testSchemaInfo(c, s.d, "test_table") - testCreateSchema(c, testNewContext(s.d), s.d, s.dbInfo) + job = testDropTableT(t, ctx, ddl, dbInfo, tblInfo) + testCheckJobDoneT(t, ddl, job, false) + + // for truncate table + tblInfo, err = testTableInfo(ddl, "tt", 3) + require.NoError(t, err) + job = testCreateTableT(t, ctx, ddl, dbInfo, tblInfo) + testCheckTableStateT(t, ddl, dbInfo, tblInfo, model.StatePublic) + testCheckJobDoneT(t, ddl, job, true) + job = testTruncateTable(t, ctx, ddl, dbInfo, tblInfo) + testCheckTableStateT(t, ddl, dbInfo, tblInfo, model.StatePublic) + testCheckJobDoneT(t, ddl, job, true) + + // for rename table + dbInfo1, err := testSchemaInfo(ddl, "test_rename_table") + require.NoError(t, err) + testCreateSchemaT(t, testNewContext(ddl), ddl, dbInfo1) + job = testRenameTable(t, ctx, ddl, dbInfo1.ID, dbInfo.ID, dbInfo.Name, tblInfo) + testCheckTableStateT(t, ddl, dbInfo1, tblInfo, model.StatePublic) + testCheckJobDoneT(t, ddl, job, true) + + job = testLockTable(t, ctx, ddl, dbInfo1.ID, tblInfo, model.TableLockWrite) + testCheckTableStateT(t, ddl, dbInfo1, tblInfo, model.StatePublic) + testCheckJobDoneT(t, ddl, job, true) + checkTableLockedTest(t, ddl, dbInfo1, tblInfo, ddl.GetID(), ctx.GetSessionVars().ConnectionID, model.TableLockWrite) + // for alter cache table + job = testAlterCacheTable(t, ctx, ddl, dbInfo1.ID, tblInfo) + testCheckTableStateT(t, ddl, dbInfo1, tblInfo, model.StatePublic) + testCheckJobDoneT(t, ddl, job, true) + checkTableCacheTest(t, ddl, dbInfo1, tblInfo) + // for alter no cache table + job = testAlterNoCacheTable(t, ctx, ddl, dbInfo1.ID, tblInfo) + testCheckTableStateT(t, ddl, dbInfo1, tblInfo, model.StatePublic) + testCheckJobDoneT(t, ddl, job, true) + checkTableNoCacheTest(t, ddl, dbInfo1, tblInfo) + + testDropSchemaT(t, testNewContext(ddl), ddl, dbInfo) + err = ddl.Stop() + require.NoError(t, err) + err = store.Close() + require.NoError(t, err) +} + +func checkTableCacheTest(t *testing.T, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo) { + err := kv.RunInNewTxn(context.Background(), d.store, false, func(ctx context.Context, txn kv.Transaction) error { + tt := meta.NewMeta(txn) + info, err := tt.GetTable(dbInfo.ID, tblInfo.ID) + require.NoError(t, err) + require.NotNil(t, info) + require.NotNil(t, info.TableCacheStatusType) + require.Equal(t, model.TableCacheStatusEnable, info.TableCacheStatusType) + return nil + }) + require.NoError(t, err) +} + +func checkTableNoCacheTest(t *testing.T, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo) { + err := kv.RunInNewTxn(context.Background(), d.store, false, func(ctx context.Context, txn kv.Transaction) error { + tt := meta.NewMeta(txn) + info, err := tt.GetTable(dbInfo.ID, tblInfo.ID) + require.NoError(t, err) + require.NotNil(t, info) + require.Equal(t, model.TableCacheStatusDisable, info.TableCacheStatusType) + return nil + }) + require.NoError(t, err) +} + +func testAlterCacheTable(t *testing.T, ctx sessionctx.Context, d *ddl, newSchemaID int64, tblInfo *model.TableInfo) *model.Job { + job := &model.Job{ + SchemaID: newSchemaID, + TableID: tblInfo.ID, + Type: model.ActionAlterCacheTable, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{}, + } + err := d.doDDLJob(ctx, job) + require.NoError(t, err) + + v := getSchemaVerT(t, ctx) + checkHistoryJobArgsT(t, ctx, job.ID, &historyJobArgs{ver: v}) + return job } -func (s *testTableSuite) TearDownSuite(c *C) { - testDropSchema(c, testNewContext(s.d), s.d, s.dbInfo) - err := s.d.Stop() - c.Assert(err, IsNil) - err = s.store.Close() - c.Assert(err, IsNil) +func testAlterNoCacheTable(t *testing.T, ctx sessionctx.Context, d *ddl, newSchemaID int64, tblInfo *model.TableInfo) *model.Job { + + job := &model.Job{ + SchemaID: newSchemaID, + TableID: tblInfo.ID, + Type: model.ActionAlterNoCacheTable, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{}, + } + err := d.doDDLJob(ctx, job) + require.NoError(t, err) + + v := getSchemaVerT(t, ctx) + checkHistoryJobArgsT(t, ctx, job.ID, &historyJobArgs{ver: v}) + return job } -func (s *testTableSuite) TestCreateTables(c *C) { - d := s.d - ctx := testNewContext(d) +func TestCreateTables(t *testing.T) { + store, err := mockstore.NewMockStore() + require.NoError(t, err) + ddl, err := testNewDDLAndStart( + context.Background(), + WithStore(store), + WithLease(testLease), + ) + require.NoError(t, err) + + dbInfo, err := testSchemaInfo(ddl, "test_table") + require.NoError(t, err) + testCreateSchemaT(t, testNewContext(ddl), ddl, dbInfo) + + ctx := testNewContext(ddl) infos := []*model.TableInfo{} - genIDs, err := d.genGlobalIDs(3) - c.Assert(err, IsNil) + genIDs, err := ddl.genGlobalIDs(3) + require.NoError(t, err) + infos = append(infos, &model.TableInfo{ ID: genIDs[0], Name: model.NewCIStr("s1"), @@ -389,82 +361,15 @@ func (s *testTableSuite) TestCreateTables(c *C) { }) job := &model.Job{ - SchemaID: s.dbInfo.ID, + SchemaID: dbInfo.ID, Type: model.ActionCreateTables, BinlogInfo: &model.HistoryInfo{}, Args: []interface{}{infos}, } - err = d.doDDLJob(ctx, job) - c.Assert(err, IsNil) - - t1 := testGetTable(c, d, s.dbInfo.ID, genIDs[0]) - c.Assert(t1, NotNil) - t2 := testGetTable(c, d, s.dbInfo.ID, genIDs[1]) - c.Assert(t2, NotNil) - t3 := testGetTable(c, d, s.dbInfo.ID, genIDs[2]) - c.Assert(t3, NotNil) -} - -func (s *testTableSuite) TestTable(c *C) { - d := s.d - - ctx := testNewContext(d) - - tblInfo := testTableInfo(c, d, "t", 3) - job := testCreateTable(c, ctx, d, s.dbInfo, tblInfo) - testCheckTableState(c, d, s.dbInfo, tblInfo, model.StatePublic) - testCheckJobDone(c, d, job, true) - - // Create an existing table. - newTblInfo := testTableInfo(c, d, "t", 3) - doDDLJobErr(c, s.dbInfo.ID, newTblInfo.ID, model.ActionCreateTable, []interface{}{newTblInfo}, ctx, d) - - count := 2000 - tbl := testGetTable(c, d, s.dbInfo.ID, tblInfo.ID) - for i := 1; i <= count; i++ { - _, err := tbl.AddRecord(ctx, types.MakeDatums(i, i, i)) - c.Assert(err, IsNil) - } - - job = testDropTable(c, ctx, d, s.dbInfo, tblInfo) - testCheckJobDone(c, d, job, false) + err = ddl.doDDLJob(ctx, job) + require.NoError(t, err) - // for truncate table - tblInfo = testTableInfo(c, d, "tt", 3) - job = testCreateTable(c, ctx, d, s.dbInfo, tblInfo) - testCheckTableState(c, d, s.dbInfo, tblInfo, model.StatePublic) - testCheckJobDone(c, d, job, true) - job = testTruncateTable(c, ctx, d, s.dbInfo, tblInfo) - testCheckTableState(c, d, s.dbInfo, tblInfo, model.StatePublic) - testCheckJobDone(c, d, job, true) - - // for rename table - dbInfo1 := testSchemaInfo(c, s.d, "test_rename_table") - testCreateSchema(c, testNewContext(s.d), s.d, dbInfo1) - job = testRenameTable(c, ctx, d, dbInfo1.ID, s.dbInfo.ID, s.dbInfo.Name, tblInfo) - testCheckTableState(c, d, dbInfo1, tblInfo, model.StatePublic) - testCheckJobDone(c, d, job, true) - - job = testLockTable(c, ctx, d, dbInfo1.ID, tblInfo, model.TableLockWrite) - testCheckTableState(c, d, dbInfo1, tblInfo, model.StatePublic) - testCheckJobDone(c, d, job, true) - checkTableLockedTest(c, d, dbInfo1, tblInfo, d.GetID(), ctx.GetSessionVars().ConnectionID, model.TableLockWrite) -} - -// for drop indexes -func createTestTableForDropIndexes(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, name string, num int) *model.TableInfo { - tableInfo := testTableInfo(c, d, name, num) - var idxs []*model.IndexInfo - for i := 0; i < num; i++ { - idxName := model.NewCIStr(fmt.Sprintf("i%d", i+1)) - idx := &model.IndexInfo{ - Name: idxName, - State: model.StatePublic, - Columns: []*model.IndexColumn{{Name: model.NewCIStr(fmt.Sprintf("c%d", i+1))}}, - } - idxs = append(idxs, idx) - } - tableInfo.Indices = idxs - testCreateTable(c, ctx, d, dbInfo, tableInfo) - return tableInfo + testGetTableT(t, ddl, dbInfo.ID, genIDs[0]) + testGetTableT(t, ddl, dbInfo.ID, genIDs[1]) + testGetTableT(t, ddl, dbInfo.ID, genIDs[2]) } diff --git a/ddl/util/util.go b/ddl/util/util.go index 4b8bb5caa4cfc..62dba84cb4e62 100644 --- a/ddl/util/util.go +++ b/ddl/util/util.go @@ -70,7 +70,7 @@ func loadDeleteRangesFromTable(ctx sessionctx.Context, table string, safePoint u return nil, errors.Trace(err) } - req := rs.NewChunk() + req := rs.NewChunk(nil) it := chunk.NewIterator4Chunk(req) for { err = rs.Next(context.TODO(), req) diff --git a/ddl/util_test.go b/ddl/util_test.go new file mode 100644 index 0000000000000..85baca2ffdd43 --- /dev/null +++ b/ddl/util_test.go @@ -0,0 +1,257 @@ +// Copyright 2021 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, +// 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. + +package ddl + +import ( + "bytes" + "context" + "fmt" + + . "github.com/pingcap/check" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/meta" + "github.com/pingcap/tidb/parser/auth" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/table" + "github.com/pingcap/tidb/types" +) + +func testTableInfoWith2IndexOnFirstColumn(c *C, d *ddl, name string, num int) *model.TableInfo { + normalInfo, err := testTableInfo(d, name, num) + c.Assert(err, IsNil) + idxs := make([]*model.IndexInfo, 0, 2) + for i := range idxs { + idx := &model.IndexInfo{ + Name: model.NewCIStr(fmt.Sprintf("i%d", i+1)), + State: model.StatePublic, + Columns: []*model.IndexColumn{{Name: model.NewCIStr("c1")}}, + } + idxs = append(idxs, idx) + } + normalInfo.Indices = idxs + normalInfo.Columns[0].FieldType.Flen = 11 + return normalInfo +} + +// testTableInfo creates a test table with num int columns and with no index. +func testTableInfo(d *ddl, name string, num int) (*model.TableInfo, error) { + tblInfo := &model.TableInfo{ + Name: model.NewCIStr(name), + } + genIDs, err := d.genGlobalIDs(1) + + if err != nil { + return nil, err + } + tblInfo.ID = genIDs[0] + + cols := make([]*model.ColumnInfo, num) + for i := range cols { + col := &model.ColumnInfo{ + Name: model.NewCIStr(fmt.Sprintf("c%d", i+1)), + Offset: i, + DefaultValue: i + 1, + State: model.StatePublic, + } + + col.FieldType = *types.NewFieldType(mysql.TypeLong) + col.ID = allocateColumnID(tblInfo) + cols[i] = col + } + tblInfo.Columns = cols + tblInfo.Charset = "utf8" + tblInfo.Collate = "utf8_bin" + return tblInfo, nil +} + +// testTableInfoWithPartition creates a test table with num int columns and with no index. +func testTableInfoWithPartition(c *C, d *ddl, name string, num int) *model.TableInfo { + tblInfo, err := testTableInfo(d, name, num) + c.Assert(err, IsNil) + genIDs, err := d.genGlobalIDs(1) + c.Assert(err, IsNil) + pid := genIDs[0] + tblInfo.Partition = &model.PartitionInfo{ + Type: model.PartitionTypeRange, + Expr: tblInfo.Columns[0].Name.L, + Enable: true, + Definitions: []model.PartitionDefinition{{ + ID: pid, + Name: model.NewCIStr("p0"), + LessThan: []string{"maxvalue"}, + }}, + } + + return tblInfo +} + +// testTableInfoWithPartitionLessThan creates a test table with num int columns and one partition specified with lessthan. +func testTableInfoWithPartitionLessThan(c *C, d *ddl, name string, num int, lessthan string) *model.TableInfo { + tblInfo := testTableInfoWithPartition(c, d, name, num) + tblInfo.Partition.Definitions[0].LessThan = []string{lessthan} + return tblInfo +} + +func testAddedNewTablePartitionInfo(c *C, d *ddl, tblInfo *model.TableInfo, partName, lessthan string) *model.PartitionInfo { + genIDs, err := d.genGlobalIDs(1) + c.Assert(err, IsNil) + pid := genIDs[0] + // the new added partition should change the partition state to state none at the beginning. + return &model.PartitionInfo{ + Type: model.PartitionTypeRange, + Expr: tblInfo.Columns[0].Name.L, + Enable: true, + Definitions: []model.PartitionDefinition{{ + ID: pid, + Name: model.NewCIStr(partName), + LessThan: []string{lessthan}, + }}, + } +} + +// testViewInfo creates a test view with num int columns. +func testViewInfo(c *C, d *ddl, name string, num int) *model.TableInfo { + tblInfo := &model.TableInfo{ + Name: model.NewCIStr(name), + } + genIDs, err := d.genGlobalIDs(1) + c.Assert(err, IsNil) + tblInfo.ID = genIDs[0] + + cols := make([]*model.ColumnInfo, num) + viewCols := make([]model.CIStr, num) + + var stmtBuffer bytes.Buffer + stmtBuffer.WriteString("SELECT ") + for i := range cols { + col := &model.ColumnInfo{ + Name: model.NewCIStr(fmt.Sprintf("c%d", i+1)), + Offset: i, + State: model.StatePublic, + } + + col.ID = allocateColumnID(tblInfo) + cols[i] = col + viewCols[i] = col.Name + stmtBuffer.WriteString(cols[i].Name.L + ",") + } + stmtBuffer.WriteString("1 FROM t") + + view := model.ViewInfo{Cols: viewCols, Security: model.SecurityDefiner, Algorithm: model.AlgorithmMerge, + SelectStmt: stmtBuffer.String(), CheckOption: model.CheckOptionCascaded, Definer: &auth.UserIdentity{CurrentUser: true}} + + tblInfo.View = &view + tblInfo.Columns = cols + + return tblInfo +} + +func testCreateTable(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo) *model.Job { + job := &model.Job{ + SchemaID: dbInfo.ID, + TableID: tblInfo.ID, + Type: model.ActionCreateTable, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{tblInfo}, + } + err := d.doDDLJob(ctx, job) + c.Assert(err, IsNil) + + v := getSchemaVer(c, ctx) + tblInfo.State = model.StatePublic + checkHistoryJobArgs(c, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo}) + tblInfo.State = model.StateNone + return job +} + +func testCreateView(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo) *model.Job { + job := &model.Job{ + SchemaID: dbInfo.ID, + TableID: tblInfo.ID, + Type: model.ActionCreateView, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{tblInfo, false, 0}, + } + + c.Assert(tblInfo.IsView(), IsTrue) + err := d.doDDLJob(ctx, job) + c.Assert(err, IsNil) + + v := getSchemaVer(c, ctx) + tblInfo.State = model.StatePublic + checkHistoryJobArgs(c, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo}) + tblInfo.State = model.StateNone + return job +} + +func testDropTable(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo) *model.Job { + job := &model.Job{ + SchemaID: dbInfo.ID, + TableID: tblInfo.ID, + Type: model.ActionDropTable, + BinlogInfo: &model.HistoryInfo{}, + } + err := d.doDDLJob(ctx, job) + c.Assert(err, IsNil) + + v := getSchemaVer(c, ctx) + checkHistoryJobArgs(c, ctx, job.ID, &historyJobArgs{ver: v, tbl: tblInfo}) + return job +} + +func testCheckTableState(c *C, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo, state model.SchemaState) { + err := kv.RunInNewTxn(context.Background(), d.store, false, func(ctx context.Context, txn kv.Transaction) error { + t := meta.NewMeta(txn) + info, err := t.GetTable(dbInfo.ID, tblInfo.ID) + c.Assert(err, IsNil) + + if state == model.StateNone { + c.Assert(info, IsNil) + return nil + } + + c.Assert(info.Name, DeepEquals, tblInfo.Name) + c.Assert(info.State, Equals, state) + return nil + }) + c.Assert(err, IsNil) +} + +func testGetTable(c *C, d *ddl, schemaID int64, tableID int64) table.Table { + tbl, err := testGetTableWithError(d, schemaID, tableID) + c.Assert(err, IsNil) + return tbl +} + +// for drop indexes +func createTestTableForDropIndexes(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInfo, name string, num int) *model.TableInfo { + tableInfo, err := testTableInfo(d, name, num) + c.Assert(err, IsNil) + var idxs []*model.IndexInfo + for i := 0; i < num; i++ { + idxName := model.NewCIStr(fmt.Sprintf("i%d", i+1)) + idx := &model.IndexInfo{ + Name: idxName, + State: model.StatePublic, + Columns: []*model.IndexColumn{{Name: model.NewCIStr(fmt.Sprintf("c%d", i+1))}}, + } + idxs = append(idxs, idx) + } + tableInfo.Indices = idxs + testCreateTable(c, ctx, d, dbInfo, tableInfo) + return tableInfo +} diff --git a/distsql/distsql.go b/distsql/distsql.go index cc5d33a117037..2f952da2a7d3c 100644 --- a/distsql/distsql.go +++ b/distsql/distsql.go @@ -34,10 +34,10 @@ import ( // DispatchMPPTasks dispatches all tasks and returns an iterator. func DispatchMPPTasks(ctx context.Context, sctx sessionctx.Context, tasks []*kv.MPPDispatchRequest, fieldTypes []*types.FieldType, planIDs []int, rootID int) (SelectResult, error) { - resp := sctx.GetMPPClient().DispatchMPPTasks(ctx, sctx.GetSessionVars().KVVars, tasks) + _, allowTiFlashFallback := sctx.GetSessionVars().AllowFallbackToTiKV[kv.TiFlash] + resp := sctx.GetMPPClient().DispatchMPPTasks(ctx, sctx.GetSessionVars().KVVars, tasks, allowTiFlashFallback) if resp == nil { - err := errors.New("client returns nil response") - return nil, err + return nil, errors.New("client returns nil response") } encodeType := tipb.EncodeType_TypeDefault @@ -90,8 +90,7 @@ func Select(ctx context.Context, sctx sessionctx.Context, kvReq *kv.Request, fie } resp := sctx.GetClient().Send(ctx, kvReq, sctx.GetSessionVars().KVVars, sctx.GetSessionVars().StmtCtx.MemTracker, enabledRateLimitAction, eventCb) if resp == nil { - err := errors.New("client returns nil response") - return nil, err + return nil, errors.New("client returns nil response") } label := metrics.LblGeneral @@ -138,13 +137,14 @@ func Select(ctx context.Context, sctx sessionctx.Context, kvReq *kv.Request, fie func SelectWithRuntimeStats(ctx context.Context, sctx sessionctx.Context, kvReq *kv.Request, fieldTypes []*types.FieldType, fb *statistics.QueryFeedback, copPlanIDs []int, rootPlanID int) (SelectResult, error) { sr, err := Select(ctx, sctx, kvReq, fieldTypes, fb) - if err == nil { - if selectResult, ok := sr.(*selectResult); ok { - selectResult.copPlanIDs = copPlanIDs - selectResult.rootPlanID = rootPlanID - } + if err != nil { + return nil, err + } + if selectResult, ok := sr.(*selectResult); ok { + selectResult.copPlanIDs = copPlanIDs + selectResult.rootPlanID = rootPlanID } - return sr, err + return sr, nil } // Analyze do a analyze request. diff --git a/distsql/distsql_test.go b/distsql/distsql_test.go index 75a548c806ced..6ff4a5cb284e5 100644 --- a/distsql/distsql_test.go +++ b/distsql/distsql_test.go @@ -43,7 +43,6 @@ import ( ) func TestSelectNormal(t *testing.T) { - t.Parallel() response, colTypes := createSelectNormal(t, 1, 2, nil, nil) // Test Next. @@ -63,7 +62,6 @@ func TestSelectNormal(t *testing.T) { } func TestSelectMemTracker(t *testing.T) { - t.Parallel() response, colTypes := createSelectNormal(t, 2, 6, nil, nil) // Test Next. @@ -76,7 +74,6 @@ func TestSelectMemTracker(t *testing.T) { } func TestSelectNormalChunkSize(t *testing.T) { - t.Parallel() sctx := newMockSessionContext() sctx.GetSessionVars().EnableChunkRPC = false response, colTypes := createSelectNormal(t, 100, 1000000, nil, sctx) @@ -86,7 +83,6 @@ func TestSelectNormalChunkSize(t *testing.T) { } func TestSelectWithRuntimeStats(t *testing.T) { - t.Parallel() planIDs := []int{1, 2, 3} response, colTypes := createSelectNormal(t, 1, 2, planIDs, nil) @@ -111,7 +107,6 @@ func TestSelectWithRuntimeStats(t *testing.T) { } func TestSelectResultRuntimeStats(t *testing.T) { - t.Parallel() basic := &execdetails.BasicRuntimeStats{} basic.Record(time.Second, 20) s1 := &selectResultRuntimeStats{ @@ -158,7 +153,6 @@ func TestSelectResultRuntimeStats(t *testing.T) { } func TestSelectStreaming(t *testing.T) { - t.Parallel() response, colTypes := createSelectStreaming(t, 1, 2) // Test Next. chk := chunk.New(colTypes, 32, 32) @@ -176,7 +170,6 @@ func TestSelectStreaming(t *testing.T) { } func TestSelectStreamingWithNextRaw(t *testing.T) { - t.Parallel() response, _ := createSelectStreaming(t, 1, 2) data, err := response.NextRaw(context.TODO()) require.NoError(t, err) @@ -184,14 +177,12 @@ func TestSelectStreamingWithNextRaw(t *testing.T) { } func TestSelectStreamingChunkSize(t *testing.T) { - t.Parallel() response, colTypes := createSelectStreaming(t, 100, 1000000) testChunkSize(t, response, colTypes) require.NoError(t, response.Close()) } func TestAnalyze(t *testing.T) { - t.Parallel() sctx := newMockSessionContext() sctx.GetSessionVars().EnableChunkRPC = false request, err := (&RequestBuilder{}).SetKeyRanges(nil). @@ -217,7 +208,6 @@ func TestAnalyze(t *testing.T) { } func TestChecksum(t *testing.T) { - t.Parallel() sctx := newMockSessionContext() sctx.GetSessionVars().EnableChunkRPC = false request, err := (&RequestBuilder{}).SetKeyRanges(nil). diff --git a/distsql/request_builder.go b/distsql/request_builder.go index 44378b2a262a2..44ff8d237f413 100644 --- a/distsql/request_builder.go +++ b/distsql/request_builder.go @@ -18,6 +18,7 @@ import ( "fmt" "math" "sort" + "sync/atomic" "github.com/pingcap/errors" "github.com/pingcap/failpoint" @@ -235,7 +236,7 @@ func (builder *RequestBuilder) getKVPriority(sv *variable.SessionVars) int { } // SetFromSessionVars sets the following fields for "kv.Request" from session variables: -// "Concurrency", "IsolationLevel", "NotFillCache", "ReplicaRead", "SchemaVar". +// "Concurrency", "IsolationLevel", "NotFillCache", "TaskID", "Priority", "ReplicaRead", "ResourceGroupTagger". func (builder *RequestBuilder) SetFromSessionVars(sv *variable.SessionVars) *RequestBuilder { if builder.Request.Concurrency == 0 { // Concurrency may be set to 1 by SetDAGRequest @@ -246,7 +247,7 @@ func (builder *RequestBuilder) SetFromSessionVars(sv *variable.SessionVars) *Req builder.Request.TaskID = sv.StmtCtx.TaskID builder.Request.Priority = builder.getKVPriority(sv) builder.Request.ReplicaRead = sv.GetReplicaRead() - builder.SetResourceGroupTag(sv.StmtCtx) + builder.SetResourceGroupTagger(sv.StmtCtx) return builder } @@ -256,6 +257,12 @@ func (builder *RequestBuilder) SetStreaming(streaming bool) *RequestBuilder { return builder } +// SetPaging sets "Paging" flag for "kv.Request". +func (builder *RequestBuilder) SetPaging(paging bool) *RequestBuilder { + builder.Request.Paging = paging + return builder +} + // SetConcurrency sets "Concurrency" for "kv.Request". func (builder *RequestBuilder) SetConcurrency(concurrency int) *RequestBuilder { builder.Request.Concurrency = concurrency @@ -282,10 +289,10 @@ func (builder *RequestBuilder) SetFromInfoSchema(pis interface{}) *RequestBuilde return builder } -// SetResourceGroupTag sets the request resource group tag. -func (builder *RequestBuilder) SetResourceGroupTag(sc *stmtctx.StatementContext) *RequestBuilder { +// SetResourceGroupTagger sets the request resource group tagger. +func (builder *RequestBuilder) SetResourceGroupTagger(sc *stmtctx.StatementContext) *RequestBuilder { if variable.TopSQLEnabled() { - builder.Request.ResourceGroupTag = sc.GetResourceGroupTag() + builder.Request.ResourceGroupTagger = sc.GetResourceGroupTagger() } return builder } @@ -551,13 +558,25 @@ func PartitionHandlesToKVRanges(handles []kv.Handle) []kv.KeyRange { // IndexRangesToKVRanges converts index ranges to "KeyRange". func IndexRangesToKVRanges(sc *stmtctx.StatementContext, tid, idxID int64, ranges []*ranger.Range, fb *statistics.QueryFeedback) ([]kv.KeyRange, error) { - return IndexRangesToKVRangesForTables(sc, []int64{tid}, idxID, ranges, fb) + return IndexRangesToKVRangesWithInterruptSignal(sc, tid, idxID, ranges, fb, nil, nil) +} + +// IndexRangesToKVRangesWithInterruptSignal converts index ranges to "KeyRange". +// The process can be interrupted by set `interruptSignal` to true. +func IndexRangesToKVRangesWithInterruptSignal(sc *stmtctx.StatementContext, tid, idxID int64, ranges []*ranger.Range, fb *statistics.QueryFeedback, memTracker *memory.Tracker, interruptSignal *atomic.Value) ([]kv.KeyRange, error) { + return indexRangesToKVRangesForTablesWithInterruptSignal(sc, []int64{tid}, idxID, ranges, fb, memTracker, interruptSignal) } // IndexRangesToKVRangesForTables converts indexes ranges to "KeyRange". func IndexRangesToKVRangesForTables(sc *stmtctx.StatementContext, tids []int64, idxID int64, ranges []*ranger.Range, fb *statistics.QueryFeedback) ([]kv.KeyRange, error) { + return indexRangesToKVRangesForTablesWithInterruptSignal(sc, tids, idxID, ranges, fb, nil, nil) +} + +// IndexRangesToKVRangesForTablesWithInterruptSignal converts indexes ranges to "KeyRange". +// The process can be interrupted by set `interruptSignal` to true. +func indexRangesToKVRangesForTablesWithInterruptSignal(sc *stmtctx.StatementContext, tids []int64, idxID int64, ranges []*ranger.Range, fb *statistics.QueryFeedback, memTracker *memory.Tracker, interruptSignal *atomic.Value) ([]kv.KeyRange, error) { if fb == nil || fb.Hist == nil { - return indexRangesToKVWithoutSplit(sc, tids, idxID, ranges) + return indexRangesToKVWithoutSplit(sc, tids, idxID, ranges, memTracker, interruptSignal) } feedbackRanges := make([]*ranger.Range, 0, len(ranges)) for _, ran := range ranges { @@ -642,18 +661,37 @@ func VerifyTxnScope(txnScope string, physicalTableID int64, is infoschema.InfoSc return true } -func indexRangesToKVWithoutSplit(sc *stmtctx.StatementContext, tids []int64, idxID int64, ranges []*ranger.Range) ([]kv.KeyRange, error) { +func indexRangesToKVWithoutSplit(sc *stmtctx.StatementContext, tids []int64, idxID int64, ranges []*ranger.Range, memTracker *memory.Tracker, interruptSignal *atomic.Value) ([]kv.KeyRange, error) { krs := make([]kv.KeyRange, 0, len(ranges)) - for _, ran := range ranges { + const CheckSignalStep = 8 + var estimatedMemUsage int64 + // encodeIndexKey and EncodeIndexSeekKey is time-consuming, thus we need to + // check the interrupt signal periodically. + for i, ran := range ranges { low, high, err := encodeIndexKey(sc, ran) if err != nil { return nil, err } + if i == 0 { + estimatedMemUsage += int64(cap(low) + cap(high)) + } for _, tid := range tids { startKey := tablecodec.EncodeIndexSeekKey(tid, idxID, low) endKey := tablecodec.EncodeIndexSeekKey(tid, idxID, high) + if i == 0 { + estimatedMemUsage += int64(cap(startKey)) + int64(cap(endKey)) + } krs = append(krs, kv.KeyRange{StartKey: startKey, EndKey: endKey}) } + if i%CheckSignalStep == 0 { + if i == 0 && memTracker != nil { + estimatedMemUsage *= int64(len(ranges)) + memTracker.Consume(estimatedMemUsage) + } + if interruptSignal != nil && interruptSignal.Load().(bool) { + return nil, nil + } + } } return krs, nil } @@ -683,6 +721,8 @@ func encodeIndexKey(sc *stmtctx.StatementContext, ran *ranger.Range) ([]byte, [] } } + // NOTE: this is a hard-code operation to avoid wrong results when accessing unique index with NULL; + // Please see https://github.com/pingcap/tidb/issues/29650 for more details if hasNull { // Append 0 to make unique-key range [null, null] to be a scan rather than point-get. high = kv.Key(high).Next() diff --git a/distsql/request_builder_test.go b/distsql/request_builder_test.go index 3b9a7926e0fe1..1c0c99523344b 100644 --- a/distsql/request_builder_test.go +++ b/distsql/request_builder_test.go @@ -38,7 +38,6 @@ type handleRange struct { } func TestTableHandlesToKVRanges(t *testing.T) { - t.Parallel() handles := []kv.Handle{ kv.IntHandle(0), kv.IntHandle(2), @@ -71,7 +70,6 @@ func TestTableHandlesToKVRanges(t *testing.T) { } func TestTableRangesToKVRanges(t *testing.T) { - t.Parallel() ranges := []*ranger.Range{ { LowVal: []types.Datum{types.NewIntDatum(1)}, @@ -129,7 +127,6 @@ func TestTableRangesToKVRanges(t *testing.T) { } func TestIndexRangesToKVRanges(t *testing.T) { - t.Parallel() ranges := []*ranger.Range{ { LowVal: []types.Datum{types.NewIntDatum(1)}, @@ -189,7 +186,6 @@ func TestIndexRangesToKVRanges(t *testing.T) { } func TestRequestBuilder1(t *testing.T) { - t.Parallel() ranges := []*ranger.Range{ { LowVal: []types.Datum{types.NewIntDatum(1)}, @@ -267,7 +263,6 @@ func TestRequestBuilder1(t *testing.T) { } func TestRequestBuilder2(t *testing.T) { - t.Parallel() ranges := []*ranger.Range{ { LowVal: []types.Datum{types.NewIntDatum(1)}, @@ -345,7 +340,6 @@ func TestRequestBuilder2(t *testing.T) { } func TestRequestBuilder3(t *testing.T) { - t.Parallel() handles := []kv.Handle{kv.IntHandle(0), kv.IntHandle(2), kv.IntHandle(3), kv.IntHandle(4), kv.IntHandle(5), kv.IntHandle(10), kv.IntHandle(11), kv.IntHandle(100)} @@ -394,7 +388,6 @@ func TestRequestBuilder3(t *testing.T) { } func TestRequestBuilder4(t *testing.T) { - t.Parallel() keyRanges := []kv.KeyRange{ { StartKey: kv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -443,7 +436,6 @@ func TestRequestBuilder4(t *testing.T) { } func TestRequestBuilder5(t *testing.T) { - t.Parallel() keyRanges := []kv.KeyRange{ { StartKey: kv.Key{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -488,7 +480,6 @@ func TestRequestBuilder5(t *testing.T) { } func TestRequestBuilder6(t *testing.T) { - t.Parallel() keyRanges := []kv.KeyRange{ { StartKey: kv.Key{0x00, 0x01}, @@ -531,7 +522,6 @@ func TestRequestBuilder7(t *testing.T) { // copy iterator variable into a new variable, see issue #27779 replicaRead := replicaRead t.Run(replicaRead.src, func(t *testing.T) { - t.Parallel() vars := variable.NewSessionVars() vars.SetReplicaRead(replicaRead.replicaReadType) @@ -561,7 +551,6 @@ func TestRequestBuilder7(t *testing.T) { } func TestRequestBuilder8(t *testing.T) { - t.Parallel() sv := variable.NewSessionVars() actual, err := (&RequestBuilder{}). SetFromSessionVars(sv). @@ -582,7 +571,6 @@ func TestRequestBuilder8(t *testing.T) { } func TestTableRangesToKVRangesWithFbs(t *testing.T) { - t.Parallel() ranges := []*ranger.Range{ { LowVal: []types.Datum{types.NewIntDatum(1)}, @@ -604,7 +592,6 @@ func TestTableRangesToKVRangesWithFbs(t *testing.T) { } func TestIndexRangesToKVRangesWithFbs(t *testing.T) { - t.Parallel() ranges := []*ranger.Range{ { LowVal: []types.Datum{types.NewIntDatum(1)}, @@ -641,7 +628,6 @@ func TestScanLimitConcurrency(t *testing.T) { // copy iterator variable into a new variable, see issue #27779 tt := tt t.Run(tt.src, func(t *testing.T) { - t.Parallel() firstExec := &tipb.Executor{Tp: tt.tp} switch tt.tp { case tipb.ExecType_TypeTableScan: diff --git a/distsql/select_result_test.go b/distsql/select_result_test.go index 178d29bebeb22..622e672e1ee9d 100644 --- a/distsql/select_result_test.go +++ b/distsql/select_result_test.go @@ -29,8 +29,6 @@ import ( ) func TestUpdateCopRuntimeStats(t *testing.T) { - t.Parallel() - ctx := mock.NewContext() ctx.GetSessionVars().StmtCtx = new(stmtctx.StatementContext) sr := selectResult{ctx: ctx, storeType: kv.TiKV} diff --git a/docs/design/2020-06-24-placement-rules-in-sql.md b/docs/design/2020-06-24-placement-rules-in-sql.md index 0a71f407022a5..7e95d80047f6d 100644 --- a/docs/design/2020-06-24-placement-rules-in-sql.md +++ b/docs/design/2020-06-24-placement-rules-in-sql.md @@ -1,7 +1,7 @@ # Defining placement rules in SQL - Author(s): [djshow832](https://github.com/djshow832) (Ming Zhang), [morgo](https://github.com/morgo) (Morgan Tocker) -- Last updated: 2021-09-13 +- Last updated: 2021-11-28 - Discussion PR: https://github.com/pingcap/tidb/pull/26221 - Tracking Issue: https://github.com/pingcap/tidb/issues/18030 - Original Document (Chinese): https://docs.google.com/document/d/18Kdhi90dv33muF9k_VAIccNLeGf-DdQyUc8JlWF9Gok @@ -172,17 +172,41 @@ Besides `SHOW CREATE PLACEMENT POLICY x` and `SHOW CREATE TABLE t1` it should be A new system table `information_schema.placement_rules` is added to view all explicit placement rules. An explicit rule is one that has been defined by the user and does not use inheritance rules, such as how partitions will use the same rules as the table they belong to. -The table contains columns such as: +The table definition is as follows: -* `rule_definition`: the placement policy definition (could be `PLACEMENT POLICY=x`, syntactic sugar variant or full list of constraints) -* `followers`: the number of followers -* `learners`: the number of learners -* `schema_name`: the schema this applies to. -* `table_name`: the table this applies to. -* `partition_name`: the partition this applies to (NULL if not applicable) -* `scheduling state`: the scheduling state of the placement rule. +```sql ++----------------------+---------------+------+------+---------+-------+ +| Field | Type | Null | Key | Default | Extra | ++----------------------+---------------+------+------+---------+-------+ +| POLICY_ID | bigint(64) | NO | | NULL | | +| CATALOG_NAME | varchar(512) | NO | | NULL | | +| POLICY_NAME | varchar(64) | YES | | NULL | | +| SCHEMA_NAME | varchar(64) | YES | | NULL | | +| TABLE_NAME | varchar(64) | YES | | NULL | | +| PARTITION_NAME | varchar(64) | YES | | NULL | | +| PRIMARY_REGION | varchar(1024) | NO | | NULL | | +| REGIONS | varchar(1024) | NO | | NULL | | +| CONSTRAINTS | varchar(1024) | NO | | NULL | | +| LEADER_CONSTRAINTS | varchar(1024) | NO | | NULL | | +| FOLLOWER_CONSTRAINTS | varchar(1024) | NO | | NULL | | +| LEARNER_CONSTRAINTS | varchar(1024) | NO | | NULL | | +| SCHEDULE | varchar(20) | NO | | NULL | | +| FOLLOWERS | bigint(64) | NO | | NULL | | +| LEARNERS | bigint(64) | NO | | NULL | | ++----------------------+---------------+------+------+---------+-------+ +15 rows in set (0.00 sec) +``` -The system table is a virtual table, which doesn’t persist data. When querying the table, TiDB queries PD and integrates the result in a table format. That also means the metadata is stored on PD instead of TiKV. +##### information_schema.tables and information_schema.partitions + +The information_schema tables for `tables` and `partitions` should be modified to have additional fields for `tidb_placement_policy_name` and `tidb_direct_placement`: + +```golang +{name: "TIDB_PLACEMENT_POLICY_NAME", tp: mysql.TypeVarchar, size: 64}, +{name: "TIDB_DIRECT_PLACEMENT", tp: mysql.TypeVarchar, size: 1024} +``` + +This helps make the information match what is available in `SHOW CREATE TABLE`, but in a structured format. ##### SHOW PLACEMENT @@ -205,8 +229,8 @@ SHOW PLACEMENT; +----------------------------+----------------------------------------------------------------------+------------------+ | target | placement | scheduling_state | +----------------------------+----------------------------------------------------------------------+------------------+ -| POLICY system | PRIMARY_REGION="us-east-1" REGIONS="us-east-1,us-east-2" FOLLOWERS=4 | SCHEDULED | -| POLICY default | PRIMARY_REGION="us-east-1" REGIONS="us-east-1,us-east-2" | SCHEDULED | +| POLICY system | PRIMARY_REGION="us-east-1" REGIONS="us-east-1,us-east-2" FOLLOWERS=4 | NULL | +| POLICY default | PRIMARY_REGION="us-east-1" REGIONS="us-east-1,us-east-2" | NULL | | DATABASE test | PRIMARY_REGION="us-east-1" REGIONS="us-east-1,us-east-2" | SCHEDULED | | TABLE test.t1 | PRIMARY_REGION="us-east-1" REGIONS="us-east-1,us-east-2" | SCHEDULED | | TABLE test.t1 PARTITION p1 | PRIMARY_REGION="us-east-1" REGIONS="us-east-1,us-east-2" | INPROGRESS | @@ -217,8 +241,8 @@ SHOW PLACEMENT LIKE 'POLICY%'; +----------------------------+----------------------------------------------------------------------+------------------+ | target | placement | scheduling_state | +----------------------------+----------------------------------------------------------------------+------------------+ -| POLICY system | PRIMARY_REGION="us-east-1" REGIONS="us-east-1,us-east-2" FOLLOWERS=4 | SCHEDULED | -| POLICY default | PRIMARY_REGION="us-east-1" REGIONS="us-east-1,us-east-2" | SCHEDULED | +| POLICY system | PRIMARY_REGION="us-east-1" REGIONS="us-east-1,us-east-2" FOLLOWERS=4 | NULL | +| POLICY default | PRIMARY_REGION="us-east-1" REGIONS="us-east-1,us-east-2" | NULL | +----------------------------+----------------------------------------------------------------------+------------------+ 2 rows in set (0.00 sec) @@ -231,10 +255,8 @@ SHOW PLACEMENT FOR DATABASE test; | TABLE test.t1 PARTITION p1 | PRIMARY_REGION="us-east-1" REGIONS="us-east-1,us-east-2" | INPROGRESS | +----------------------------+----------------------------------------------------------------------+------------------+ 3 rows in set (0.00 sec) - ``` - TiDB will automatically find the effective rule based on the rule priorities. This statement outputs at most 1 line. For example, when querying a table, only the placement rule defined on the table itself is shown, and the partitions in it will not be shown. @@ -242,12 +264,12 @@ This statement outputs at most 1 line. For example, when querying a table, only The output of this statement contains these fields: * Target: The object queried. It can be a database, table, partition, or index. - * For policies, it is shown as the policy name. - * For database, it is shown in the format `DATABASE database_name` - * For table, it is shown in the format `TABLE database_name.table_name` - * For partition, it is shown in the format `TABLE database_name.table_name PARTITION partition_name` + * For policies, it is shown as the policy name. + * For database, it is shown in the format `DATABASE database_name` + * For table, it is shown in the format `TABLE database_name.table_name` + * For partition, it is shown in the format `TABLE database_name.table_name PARTITION partition_name` * Placement: An equivalent `ALTER` statement on `target` that defines the placement rule. -* Scheduling state: The scheduling progress from the PD aspect. +* Scheduling state: The scheduling progress from the PD aspect. It is always `NULL` for policies. For finding the current use of a placement policy, the following syntax can be used: @@ -396,15 +418,6 @@ Explanation: `+any` changes an earlier proposal where the `FOLLOWERS` count could also be specified. This has been removed to reduce the risk of discrepancies and misconfiguration. See also "Policy Validation" below. -#### Built-in Placement Policies - -By default every system will have two placement policies, which can be modified via `ALTER PLACEMENT POLICY` but never dropped: - -* `default`: This policy is used only in the event that a policy has not been specified. -* `system`: This policy is used for internal TiDB system tables. - -Some common applications might be to increase the replica count on system or default tables. It is not typically recommended to add constraints to these policies as it will lead to cluster inbalance, but it is possible. - #### Schedule Property When using either the syntactic sugar or list format for placement rules, PD is free to schedule followers/leaders wherever it decides. For example: @@ -546,33 +559,33 @@ In this case the default rules will apply to placement, and the output from `SHO For a more complex rule using partitions, consider the following example: ```sql -ALTER TABLE t1 PARTITION p0 PLACEMENT="acdc"; +ALTER TABLE t1 PARTITION p0 PLACEMENT POLICY="acdc"; --> CREATE TABLE t1 (id INT, name VARCHAR(50), purchased DATE) PARTITION BY RANGE( YEAR(purchased) ) ( - PARTITION p0 VALUES LESS THAN (2000) PLACEMENT="acdc", + PARTITION p0 VALUES LESS THAN (2000) PLACEMENT POLICY="acdc", PARTITION p1 VALUES LESS THAN (2005) ); -ALTER TABLE t1 PLACEMENT="xyz"; +ALTER TABLE t1 PLACEMENT POLICY="xyz"; --> CREATE TABLE t1 (id INT, name VARCHAR(50), purchased DATE) PARTITION BY RANGE( YEAR(purchased) ) ( - PARTITION p0 VALUES LESS THAN (2000) PLACEMENT="acdc", + PARTITION p0 VALUES LESS THAN (2000) PLACEMENT POLICY="acdc", PARTITION p1 VALUES LESS THAN (2005) - ) PLACEMENT="xyz"; + ) PLACEMENT POLICY="xyz"; -ALTER TABLE t1 PARTITION p0 PLACEMENT=DEFAULT; +ALTER TABLE t1 PARTITION p0 PLACEMENT POLICY=DEFAULT; --> CREATE TABLE t1 (id INT, name VARCHAR(50), purchased DATE) PARTITION BY RANGE( YEAR(purchased) ) ( PARTITION p0 VALUES LESS THAN (2000), PARTITION p1 VALUES LESS THAN (2005) - ) PLACEMENT="xyz"; + ) PLACEMENT POLICY="xyz"; ``` -The behavior above is described as `ALTER TABLE t1 PARTITION p0 PLACEMENT=DEFAULT` resets the placement of the partition `p0` to be inherited from the table `t1`. +The behavior above is described as `ALTER TABLE t1 PARTITION p0 PLACEMENT POLICY=DEFAULT` resets the placement of the partition `p0` to be inherited from the table `t1`. #### Sequences @@ -1018,6 +1031,13 @@ This specific semantic will be the hardest to implement because of the other dep ## Changelog +* 2021-11-29: + - Updated limits on object length. + - Removed built-in placement policies (not supported for now, need additional discussion due to `DEFAULT` conflicts.) + +* 2021-10-29: + - Add more description to 'scheduling_state'. + * 2021-09-13: - Removed support for `VOTER_CONSTRAINTS` and `VOTERS`. The motivation for this change is that dictionary syntax is ambiguous cases when both `VOTER_CONSTRAINTS` and `FOLLOWER_CONSTAINTS` are set. We can re-add this syntax if there is a clear use-case requirement in future. diff --git a/docs/design/2021-09-22-stale-read.md b/docs/design/2021-09-22-stale-read.md new file mode 100644 index 0000000000000..b12d3d6b9a7f5 --- /dev/null +++ b/docs/design/2021-09-22-stale-read.md @@ -0,0 +1,129 @@ +# Proposal: Support Stale Read in TiDB + +- Author(s): [Yisaer](https://github.com/Yisaer) (Song Gao) +- Last updated: 2021-09-22 +- Tracking Issue: https://github.com/pingcap/tidb/issues/21094 +- Related Document: https://docs.google.com/document/d/1dSbXbudTK-hpz0vIBsmpfuzeQhhTFJ-zDenygt8fmCk/edit?usp=sharing + +## Table of Contents + +* [Introduction](#introduction) +* [Motivation or Background](#motivation-or-background) +* [Detailed Design](#detailed-design) + * [Implementation Overview](#implementation-overview) + * [New Syntax Overview](#new-syntax-overview) +* [Compatibility](#compatibility) + * [ForBidden Behavior](#forbidden-behavior) + * [Statement Priority](#statement-priority) + +## Introduction + +This proposal aims to support Stale Read and describe what Stale Read looks like and how to keep compatibility with other queries. + +## Motivation or Background + +Currently, TiDB supports Follower Read to read data from follower replicas in order to increase the query throughput. TiDB also supports Snapshot Read to read old data with a given snapshot timestamp. + +However, Follower Read still requires an RPC calling between follower replica and leader replica during querying which will be the key bottleneck to scale up the read throughput when there is a hotspot reading in this range. Moreover, in cross region scenario, an extra rpc calling will also increased the latency. + +For Snapshot Read, it only reads data from leader replica which might be a bottleneck, especially in hot spot cases. + +Stale Read is more like the combination of Follower Read and Snapshot Read. It supports TiDB to read data from both leader replicas and follower replicas with no extra RPC calling during followers and leaders. + +It also supports read data with a given snapshot timestamp like Snapshot Read. + +## Detailed Design + +### Implementation Overview + +Normally, TiDB will send data query requests to the storage with a given timestamp to the leader replicas. + +In Stale Read, each replica could handle the data query request because every replica maintains the resolved timestamp from the leader replica. + +This makes each store could know the smallest resolved timestamp they could handle. Thus, TiDB could send data requests with a staleness timestamp to get the data they want. + +### New Syntax Overview + +Here we will introduce how to use Stale Read in TiDB in 4 methods. + +1. Use Stale Read by `SELECT ... FROM ... AS OF TIMESTAMP` format + +```sql +SELECT * FROM t AS OF TIMESTAMP '2021-09-22 15:04:05' WHERE id = 1; +SELECT * FROM t AS OF TIMESTAMP NOW() - INTERVAL 20 SECOND WHERE id = 1; +``` + +You can get detailed grammar `ebnf diagram` for `SELECT ... FROM ... AS OF TIMESTAMP` in this [document](https://docs.pingcap.com/tidb/dev/sql-statement-select) + +2. Use Stale Read by `START TRANSACTION READ ONLY AS OF TIMESTAMP` format + +```sql +START TRANSACTION READ ONLY AS OF TIMESTAMP '2021-09-22 15:04:05'; +SELECT * FROM t WHERE id = 1; +COMMIT; +``` + +You can get detailed grammar `ebnf diagram` for `START TRANSACTION READ ONLY AS OF TIMESTAMP` in this [document](https://docs.pingcap.com/tidb/dev/sql-statement-start-transaction) + +3. Use Stale Read by `SET TRANSACTION READ ONLY AS OF TIMESTAMP` format. + +```sql +SET TRANSACTION READ ONLY AS OF TIMESTAMP '2021-09-22 15:04:05'; +BEGIN; +SELECT * FROM t WHERE id = 1; +COMMIT; +// it also affects next query statement +SET TRANSACTION READ ONLY AS OF TIMESTAMP '2021-09-22 15:04:05'; +SELECT * FROM t WHERE id = 1; +``` + +You can get detailed grammar `ebnf diagram` for `SET TRANSACTION READ ONLY AS OF TIMESTAMP` in this [document](https://docs.pingcap.com/tidb/dev/sql-statement-set-transaction) + +4. Enable Stale Read with given max tolerant staleness in session: + +```sql +// enable stale read with max tolerant 5 seconds ago in session +SET @@tidb_read_staleness='-5'; +select * from t where id = 1; +``` + +Note that Stale Read will only affect the following query statement `SELECT`, it won't affect the interactive transaction, or updating statement like `INSERT`,`DELETE` and `UPDATE` + +#### Detail of AS OF TIMESTAMP + +`AS OF TIMESTAMP` provide several ways to define the staleness of `STALE READ`, you can find detail usage in this [document](https://docs.pingcap.com/tidb/dev/as-of-timestamp#syntax) + +### Compatibility + +This section we will talk about the compatibility between each Stale Read situations. + +#### Forbidden Behavior + +Stale Read by SET TRANSACTION Statement will make next interactive transaction or query with staleness timestamp. + +Thus it is not allowed that querying stale read statement after stale read by SET TRANSACTION statement like following: + +```sql +mysql> set transaction read only as of timestamp now(1); +Query OK, 0 rows affected (0.00 sec) + +mysql> select * from t as of timestamp now(2); +ERROR 8135 (HY000): invalid as of timestamp: can't use select as of while already set transaction as of +``` + +#### Statement Priority + +After enabling `tidb_read_staleness`, the following querying will use given staleness timestamp to get data from replicas. + +And you can still use Stale Read with other forms with different timestamp: + +```sql +SET @@tidb_read_staleness='-5'; +// query data with max tolerant 5 seconds ago +select * from t where id = 1; +// query data with exact 10 seconds ago timestamp for this statement +select * from t as of timestamp now(10) where id = 1; +// query data with exact 10 seconds ago timestamp for next statement +set transaction read only as of timestamp now(10); +select * from t where id = 1; +``` diff --git a/docs/design/2021-09-29-secure-bootstrap.md b/docs/design/2021-09-29-secure-bootstrap.md index ae1b121830d10..5b1ba08e4caa8 100644 --- a/docs/design/2021-09-29-secure-bootstrap.md +++ b/docs/design/2021-09-29-secure-bootstrap.md @@ -81,6 +81,6 @@ The alternative implementation is to generate a random password with `--initiali ## Unresolved Questions - Should the `auth_socket` user on the MySQL-side be the OS-user, or `root`. It is possible to do either. We need to discuss what is the less of 2 evils: - - Having 2 "roots" (localhost, and %) + - Having 2 "roots" (localhost, and %). - Having a default user that is different for everyone, with instructions to create a root account. diff --git a/docs/design/2021-10-20-table-attributes.md b/docs/design/2021-10-20-table-attributes.md new file mode 100644 index 0000000000000..fc1da57d75cac --- /dev/null +++ b/docs/design/2021-10-20-table-attributes.md @@ -0,0 +1,108 @@ +# Proposal: Table Attributes + +- Author(s): [rleungx](https://github.com/rleungx) +- Tracking Issue: https://github.com/tikv/pd/issues/3839 + +## Background + +Recently, we have encountered such a case that the scattered region of a table/partition is merged before inserting the data. We cannot prevent it from happening right now since we are not able to control the scheduling behavior at the table/partition level. However, it will sometimes lead to a serious hot spot problem. Under this circumstance, we are going to support the attributes for the table/partition so that we can handle this case. And we have designed a new mapping mechanism to establish a relationship between tables/partitions and regions which allows the user to specify the attributes to instruct the scheduling of PD. To make use of this feature to manage the table/partition level scheduling easily, we plan to introduce a new syntax in SQL. + +## Proposal + +### Parser + +This feature needs `parser` to support the `ATTRIBUTES` keyword. And we need to introduce two new kinds of SQL syntax for both table and partition. + +For the table, we can use the following SQL to add one or multiple attributes for the table `t`: + +```sql +ALTER TABLE t ATTRIBUTES[=]'key=value[, key1=value1...]'; +``` + +And reset it by using: + +```sql +ALTER TABLE t ATTRIBUTES[=]DEFAULT; +``` + +For partition `p`, the way is almost the same as the table: + +```sql +ALTER TABLE t PARTITION p ATTRIBUTES[=]'key=value[, key1=value1...]'; +``` + +And reset it by using: + +```sql +ALTER TABLE t PARTITION p ATTRIBUTES[=]DEFAULT; +``` + +The attributes here can be any string that doesn't contain the reserved words. + +There is no need for TiDB to know about the actual meaning of these attributes. The only thing that TiDB should do is to construct a request which contains the ID, the table/partition key range, the attributes, etc. Then synchronizing it with PD through the DDL job. All of these will be persisted in PD. + + + +### Display Attributes + +we add a new table in the `INFORMATION_SCHEMA` named `ATTRIBUTES`. If necessary, we can also support syntax like + +```sql +SHOW ATTRIBUTES FOR [{DATABASE|SCHEMA} s][TABLE t][PARTITION p]; +``` +or +``` +SHOW CREATE TABLE t; +``` + +At least we should support one way to show the attributes. Here is an example: + +```sql +SELECT * FROM INFORMATION_SCHEMA.ATTRIBUTES; ++-------------------+-----------+----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| ID | TYPE | ATTRIBUTES | RANGES | ++-------------------+-----------+----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| schema/test/t1/p0 | key-range | "key=value" | [7480000000000000ff3a5f720000000000fa, 7480000000000000ff3b5f720000000000fa] | +| schema/test/t1 | key-range | "key=value" | [7480000000000000ff395f720000000000fa, 7480000000000000ff3a5f720000000000fa], [7480000000000000ff3a5f720000000000fa, 7480000000000000ff3b5f720000000000fa], [7480000000000000ff3b5f720000000000fa, 7480000000000000ff3c5f720000000000fa] | ++-------------------+-----------+----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +``` + +### DDL Management +Here are the concrete behaviors when doing the DDL operations with a table/partition having the attributes. + +#### Drop Clause ++ For the drop table operation, the attributes will be deleted once the GC has finished ++ For the drop schema and partition operation, the attributes will be deleted immediately + +#### Truncate Clause ++ For the truncate table operation, both table range and partition range of attributes will be updated. ++ For the truncate partition operation, the partition range of attributes will be updated. + +#### Recover/Flashback Clause ++ The attributes will be kept as the old values after the recover/flashback process succeed. + +#### Exchange Clause ++ The attributes will be exchanged including the ID and ranges. + +### Privilege Management + +Privilege management is quite straightforward: + +* `ALTER TABLE` statement requires `Alter` privilege +* `information_schema.attributes` only shows the attributes on the objects that visible to the current user +* `ADMIN SHOW DDL` requires `Super` privilege + +### Inheritance +Consider that if we add attributes for a table, all partitions of that table will inherit the attributes by default. As for `CREATE TABLE x LIKE y`, `x` won't inherit attributes from `y`. + +### Priority +We may support adding different attributes for both tables and partitions at the same time. For example, the attribute could be `merge_option=deny` on the table level but `merge_option=allow` on the partition level in the same table. +In this case, we assume that the priority of the partition is higher than the table, so the final results could be that only some partitions can be merged, but the rest cannot. + +Another thing that should be noticed is that if we have already set the attributes for a partition, then setting the new attributes for the table which includes the partition will override the attributes of the partition. + +### Compatibility +There is no compatibility issue. + +### Implementation +In the early stage, we are going to introduce `merge_option` attribute to indicate if a table/partition can be merged. When the `merge_option` equals `deny`, PD will prevent the table or partition from being merged. Otherwise, it will be merged once it is beyond the `split-merge-interval` under the PD default settings. diff --git a/docs/tidb_http_api.md b/docs/tidb_http_api.md index 220c9479aef10..7a7e6d27a20d8 100644 --- a/docs/tidb_http_api.md +++ b/docs/tidb_http_api.md @@ -522,3 +522,11 @@ timezone.* curl -X POST -d "tidb_enable_1pc=0" http://{TiDBIP}:10080/settings ``` +1. Get/Set the size of the Ballast Object + + ```shell + # get current size of the ballast object + curl -v http://{TiDBIP}:10080/debug/ballast-object-sz + # reset the size of the ballast object (2GB in this example) + curl -v -X POST -d "2147483648" http://{TiDBIP}:10080/debug/ballast-object-sz + ``` diff --git a/domain/domain.go b/domain/domain.go index 2e25bcdf3775a..d3a9664b97fe7 100644 --- a/domain/domain.go +++ b/domain/domain.go @@ -32,6 +32,7 @@ import ( "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/ddl" ddlutil "github.com/pingcap/tidb/ddl/util" + "github.com/pingcap/tidb/domain/globalconfigsync" "github.com/pingcap/tidb/domain/infosync" "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/infoschema" @@ -74,6 +75,7 @@ type Domain struct { statsLease time.Duration ddl ddl.DDL info *infosync.InfoSyncer + globalCfgSyncer *globalconfigsync.GlobalConfigSyncer m sync.Mutex SchemaValidator SchemaValidator sysSessionPool *sessionPool @@ -91,8 +93,9 @@ type Domain struct { serverID uint64 serverIDSession *concurrency.Session isLostConnectionToPD sync2.AtomicInt32 // !0: true, 0: false. - - onClose func() + renewLeaseCh chan func() // It is used to call the renewLease function of the cache table. + onClose func() + sysExecutorFactory func(*Domain) (pools.Resource, error) } // loadInfoSchema loads infoschema at startTS. @@ -157,7 +160,7 @@ func (do *Domain) loadInfoSchema(startTS uint64) (infoschema.InfoSchema, bool, i return nil, false, currentSchemaVersion, nil, err } - newISBuilder, err := infoschema.NewBuilder(do.Store()).InitWithDBInfos(schemas, bundles, policies, neededSchemaVersion) + newISBuilder, err := infoschema.NewBuilder(do.Store(), do.renewLeaseCh, do.sysFacHack).InitWithDBInfos(schemas, bundles, policies, neededSchemaVersion) if err != nil { return nil, false, currentSchemaVersion, nil, err } @@ -171,6 +174,16 @@ func (do *Domain) loadInfoSchema(startTS uint64) (infoschema.InfoSchema, bool, i return is, false, currentSchemaVersion, nil, nil } +func (do *Domain) sysFacHack() (pools.Resource, error) { + // TODO: Here we create new sessions with sysFac in DDL, + // which will use `do` as Domain instead of call `domap.Get`. + // That's because `domap.Get` requires a lock, but before + // we initialize Domain finish, we can't require that again. + // After we remove the lazy logic of creating Domain, we + // can simplify code here. + return do.sysExecutorFactory(do) +} + func (do *Domain) fetchPolicies(m *meta.Meta) ([]*model.PolicyInfo, error) { allPolicies, err := m.ListPolicies() if err != nil { @@ -269,7 +282,7 @@ func (do *Domain) tryLoadSchemaDiffs(m *meta.Meta, usedVersion, newVersion int64 } diffs = append(diffs, diff) } - builder := infoschema.NewBuilder(do.Store()).InitWithOldInfoSchema(do.infoCache.GetLatest()) + builder := infoschema.NewBuilder(do.Store(), do.renewLeaseCh, do.sysFacHack).InitWithOldInfoSchema(do.infoCache.GetLatest()) phyTblIDs := make([]int64, 0, len(diffs)) actions := make([]uint64, 0, len(diffs)) for _, diff := range diffs { @@ -285,6 +298,7 @@ func (do *Domain) tryLoadSchemaDiffs(m *meta.Meta, usedVersion, newVersion int64 actions = append(actions, uint64(1< Dumpling is currently in early development stage, and most features are incomplete. Contributions are welcomed! + +- [x] SQL dump is split into multiple files (like `mydumper`) for easy management. +- [x] Export multiple tables in parallel to speed up execution. +- [x] Multiple output formats: SQL, CSV, ... +- [ ] Write to cloud storage (S3, GCS) natively +- [x] Advanced table filtering + +Any questions? Let's discuss in [#sig-migrate in Slack](https://slack.tidb.io/invite?team=tidb-community&channel=sig-migrate&ref=github_sig)! + +Building +-------- + +0. Under directory `tidb` +1. Install Go 1.16 or above +2. Run `make build_dumpling` to compile. The output is in `bin/dumpling`. +3. Run `make dumpling_unit_test` to run the unit tests. +4. Run `make dumpling_integration_test` to run integration tests. For integration test: + - The following executables must be copied or generated or linked into these locations: + * `bin/sync_diff_inspector` (download from [tidb-enterprise-tools-latest-linux-amd64](http://download.pingcap.org/tidb-enterprise-tools-latest-linux-amd64.tar.gz)) + * `bin/tidb-server` (download from [tidb-master-linux-amd64](https://download.pingcap.org/tidb-master-linux-amd64.tar.gz)) + * `bin/tidb-lightning` (download from [tidb-toolkit-latest-linux-amd64](https://download.pingcap.org/tidb-toolkit-latest-linux-amd64.tar.gz)) + * `bin/minio` (download from ) + * Now, you can run `sh ./dumpling/install.sh` to get the above binary files. + - The following programs must be installed: + * `mysql` (the CLI client) + - There must be a local mysql server listening on `127.0.0.1:3306`, and an active user with no password that can be connected through this TCP address. + + +License +------- + +Dumpling is under the Apache 2.0 license. See the [LICENSE](./LICENSE) file for details. + + +[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fpingcap%2Fdumpling.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fpingcap%2Fdumpling?ref=badge_large) \ No newline at end of file diff --git a/dumpling/cli/versions.go b/dumpling/cli/versions.go new file mode 100644 index 0000000000000..2d29dd1296bd6 --- /dev/null +++ b/dumpling/cli/versions.go @@ -0,0 +1,61 @@ +// Copyright 2019 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 cli + +import ( + "fmt" + + "go.uber.org/zap" + + "github.com/pingcap/tidb/dumpling/log" +) + +var ( + // ReleaseVersion is the current program version. + ReleaseVersion = "Unknown" + // BuildTimestamp is the UTC date time when the program is compiled. + BuildTimestamp = "Unknown" + // GitHash is the git commit hash when the program is compiled. + GitHash = "Unknown" + // GitBranch is the active git branch when the program is compiled. + GitBranch = "Unknown" + // GoVersion is the Go compiler version used to compile this program. + GoVersion = "Unknown" +) + +// LongVersion returns the version information of this program as a string. +func LongVersion() string { + return fmt.Sprintf( + "Release version: %s\n"+ + "Git commit hash: %s\n"+ + "Git branch: %s\n"+ + "Build timestamp: %sZ\n"+ + "Go version: %s\n", + ReleaseVersion, + GitHash, + GitBranch, + BuildTimestamp, + GoVersion, + ) +} + +// LogLongVersion logs the version information of this program to the logger. +func LogLongVersion(logger log.Logger) { + logger.Info("Welcome to dumpling", + zap.String("Release Version", ReleaseVersion), + zap.String("Git Commit Hash", GitHash), + zap.String("Git Branch", GitBranch), + zap.String("Build timestamp", BuildTimestamp), + zap.String("Go Version", GoVersion)) +} diff --git a/dumpling/cmd/dumpling/main.go b/dumpling/cmd/dumpling/main.go new file mode 100644 index 0000000000000..44a54f104fdf5 --- /dev/null +++ b/dumpling/cmd/dumpling/main.go @@ -0,0 +1,81 @@ +// Copyright 2019 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 main + +import ( + "context" + "fmt" + "os" + + "github.com/prometheus/client_golang/prometheus" + "github.com/spf13/pflag" + "go.uber.org/zap" + + "github.com/pingcap/tidb/dumpling/cli" + "github.com/pingcap/tidb/dumpling/export" +) + +func main() { + pflag.Usage = func() { + fmt.Fprint(os.Stderr, "Dumpling is a CLI tool that helps you dump MySQL/TiDB data\n\nUsage:\n dumpling [flags]\n\nFlags:\n") + pflag.PrintDefaults() + } + printVersion := pflag.BoolP("version", "V", false, "Print Dumpling version") + + conf := export.DefaultConfig() + conf.DefineFlags(pflag.CommandLine) + + pflag.Parse() + if printHelp, err := pflag.CommandLine.GetBool(export.FlagHelp); printHelp || err != nil { + if err != nil { + fmt.Printf("\nGet help flag error: %s\n", err) + } + pflag.Usage() + return + } + println(cli.LongVersion()) + if *printVersion { + return + } + + err := conf.ParseFromFlags(pflag.CommandLine) + if err != nil { + fmt.Printf("\nparse arguments failed: %+v\n", err) + os.Exit(1) + } + if pflag.NArg() > 0 { + fmt.Printf("\nmeet some unparsed arguments, please check again: %+v\n", pflag.Args()) + os.Exit(1) + } + + registry := prometheus.NewRegistry() + registry.MustRegister(prometheus.NewProcessCollector(prometheus.ProcessCollectorOpts{})) + registry.MustRegister(prometheus.NewGoCollector()) + export.InitMetricsVector(conf.Labels) + export.RegisterMetrics(registry) + prometheus.DefaultGatherer = registry + dumper, err := export.NewDumper(context.Background(), conf) + if err != nil { + fmt.Printf("\ncreate dumper failed: %s\n", err.Error()) + os.Exit(1) + } + err = dumper.Dump() + dumper.Close() + if err != nil { + dumper.L().Error("dump failed error stack info", zap.Error(err)) + fmt.Printf("\ndump failed: %s\n", err.Error()) + os.Exit(1) + } + dumper.L().Info("dump data successfully, dumpling will exit now") +} diff --git a/dumpling/codecov.yml b/dumpling/codecov.yml new file mode 100644 index 0000000000000..d19042b06d268 --- /dev/null +++ b/dumpling/codecov.yml @@ -0,0 +1,14 @@ +coverage: + status: + project: + default: + threshold: 0.2 + patch: + default: + target: 0% # trial operation + changes: no + +comment: + layout: "header, diff" + behavior: default + require_changes: no diff --git a/dumpling/context/context.go b/dumpling/context/context.go new file mode 100644 index 0000000000000..2272c672fa63b --- /dev/null +++ b/dumpling/context/context.go @@ -0,0 +1,64 @@ +// Copyright 2021 PingCAP, Inc. Licensed under Apache-2.0. +// This code is copied from https://github.com/pingcap/dm/blob/master/pkg/context/context.go + +package context + +import ( + gcontext "context" + + "github.com/pingcap/tidb/dumpling/log" +) + +// Context is used to in dm to record some context field like +// * go context +// * logger +type Context struct { + gcontext.Context + logger log.Logger +} + +// Background return a nop context +func Background() *Context { + return &Context{ + Context: gcontext.Background(), + logger: log.Zap(), + } +} + +// NewContext return a new Context +func NewContext(ctx gcontext.Context, logger log.Logger) *Context { + return &Context{ + Context: ctx, + logger: logger, + } +} + +// WithContext set go context +func (c *Context) WithContext(ctx gcontext.Context) *Context { + return &Context{ + Context: ctx, + logger: c.logger, + } +} + +// WithCancel sets a cancel context. +func (c *Context) WithCancel() (*Context, gcontext.CancelFunc) { + ctx, cancel := gcontext.WithCancel(c.Context) + return &Context{ + Context: ctx, + logger: c.logger, + }, cancel +} + +// WithLogger set logger +func (c *Context) WithLogger(logger log.Logger) *Context { + return &Context{ + Context: c.Context, + logger: logger, + } +} + +// L returns real logger +func (c *Context) L() log.Logger { + return c.logger +} diff --git a/dumpling/docs/cn/user-guide.md b/dumpling/docs/cn/user-guide.md new file mode 100644 index 0000000000000..b330a905d6321 --- /dev/null +++ b/dumpling/docs/cn/user-guide.md @@ -0,0 +1,82 @@ +# Dumpling 使用手册 + +[Dumpling](https://github.com/pingcap/tidb/blob/master/dumpling) 是支持以 SQL 文本或者 CSV 格式将 MySQL/TiDB 数据导出的工具。 + +设计初衷是为了替代 [Mydumper](https://github.com/pingcap/mydumper), 所以基本用法可以参考 Mydumper, +当然在实现中没有完全照搬 Mydumper, 因此存在与 Mydumper 不同的用法。 + +下表罗列了一些主要参数 + +| 主要参数 | | +| --------| --- | +| -B 或 --database | 导出指定数据库 | +| -T 或 --tables-list | 导出指定数据表 | +| -f 或 --filter | 导出能匹配模式的表,语法可参考 [table-filter](https://github.com/pingcap/tidb-tools/blob/master/pkg/table-filter/README.md)(只有英文版) | +| --case-sensitive | table-filter 是否大小写敏感,默认为 false 不敏感 | +| -h 或 --host| 链接节点地址(默认 "127.0.0.1")| +| -t 或 --threads | 备份并发线程数| +| -r 或 --rows |将 table 划分成 row 行数据,一般针对大表操作并发生成多个文件。| +| --loglevel | 日志级别 {debug,info,warn,error,dpanic,panic,fatal} (默认 "info") | +| -d 或 --no-data | 不导出数据, 适用于只导出 schema 场景 | +| --no-header | 导出 table csv 数据,不生成 header | +| -W 或 --no-views| 不导出 view, 默认 true | +| -m 或 --no-schemas | 不导出 schema , 只导出数据 | +| -s 或--statement-size | 控制 Insert Statement 的大小,单位 bytes | +| -F 或 --filesize | 将 table 数据划分出来的文件大小, 需指明单位 (如 `128B`, `64KiB`, `32MiB`, `1.5GiB`) | +| --filetype| 导出文件类型 csv/sql (默认 sql) | +| -o 或 --output | 设置导出文件路径 | +| --output-filename-template | 设置导出文件名模版,详情见下 | +| -S 或 --sql | 根据指定的 sql 导出数据,该指令不支持并发导出 | +| --consistency | flush: dump 前用 FTWRL
snapshot: 通过 tso 指定 dump 位置
lock: 对需要 dump 的所有表执行 lock tables read
none: 不加锁 dump,无法保证一致性
auto: MySQL flush, TiDB snapshot| +| --snapshot | snapshot tso, 只在 consistency=snapshot 下生效 | +| --where | 对备份的数据表通过 where 条件指定范围 | +| -p 或 --password | 链接密码 | +| -P 或 --port | 链接端口,默认 4000 | +| -u 或 --user | 默认 root | + +更多具体用法可以使用 -h, --help 进行查看。 + +## Mydumper 相关参考 + +[Mydumper usage](https://github.com/maxbube/mydumper/blob/master/docs/mydumper_usage.rst) + +[TiDB Mydumper 使用文档](https://pingcap.com/docs-cn/stable/reference/tools/mydumper/) + +## Dumpling 下载链接 + +[nightly](https://download.pingcap.org/dumpling-nightly-linux-amd64.tar.gz) + +## 导出文件名模版 + +`--output-filename-template` 参数指定了所有文件的命名方式(不含扩展名)。它使用 [Go 的 `text/template` 语法](https://golang.org/pkg/text/template/)。 + +模板可使用以下字段: + +* `.DB` — 库名 +* `.Table` — 表名、物件名称。 +* `.Index` — 由 0 开始的序列号,代表当前导出的表中的哪一份文件 + +库和表名中可能包含 `/` 之类的特殊字符,而这些字符不能用在文件系统中。因此,Dumpling 提供了一个 `fn` 函数来对这些特殊字符进行百分号编码。它们是: + +* U+0000 到 U+001F (控制字符) +* `/`、`\`、`<`、`>`、`:`、`"`、`*`、`?` (无效的 Windows 路径字符) +* `.` (库/表名分隔符) +* `-`,当出现在 `-schema` 字串里 + +例如,使用 `--output-filename-template '{{fn .Table}}.{{printf "%09d" .Index}}'` 后,Dumpling 会把表 `"db"."tbl:normal"` 导出到 `tbl%3Anormal.000000000.sql`、`tbl%3Anormal.000000001.sql` 等文件。 + +除数据文件外,Dumpling 还支持透过子模版自定义命名表结构文件的名称。默认的配置是: + +| 模版名 | 默认内容 | +|------|---------| +| data | `{{fn .DB}}.{{fn .Table}}.{{.Index}}` | +| schema | `{{fn .DB}}-schema-create` | +| table | `{{fn .DB}}.{{fn .Table}}-schema` | +| event | `{{fn .DB}}.{{fn .Table}}-schema-post` | +| function | `{{fn .DB}}.{{fn .Table}}-schema-post` | +| procedure | `{{fn .DB}}.{{fn .Table}}-schema-post` | +| sequence | `{{fn .DB}}.{{fn .Table}}-schema-sequence` | +| trigger | `{{fn .DB}}.{{fn .Table}}-schema-triggers` | +| view | `{{fn .DB}}.{{fn .Table}}-schema-view` | + +例如,使用 `--output-filename-template '{{define "table"}}{{fn .Table}}.$schema{{end}}{{define "data"}}{{fn .Table}}.{{printf "%09d" .Index}}{{end}}'`后,Dumpling 会把表 `"db"."tbl:normal"` 的结构写到 `tbl%3Anormal.$schema.sql`,以及把数据写到 `tbl%3Anormal.000000000.sql`。 diff --git a/dumpling/docs/en/user-guide.md b/dumpling/docs/en/user-guide.md new file mode 100644 index 0000000000000..e98ae1cf15b5e --- /dev/null +++ b/dumpling/docs/en/user-guide.md @@ -0,0 +1,82 @@ +# Dumpling User Guide + +**Dumpling** is a tool and a Go library for creating SQL dump (CSV/SQL format) from a MySQL-compatible database. + +It is intended to replace `mysqldump` and `mydumper` when targeting TiDB; as a result, its basic usage is similar to that of Mydumper. + +The following table lists the major parameters of Dumpling. + + +| Parameter | Description | +| --------| --- | +| -B or --database | Dump the specified databases. | +| -T or --tables-list | Dump the specified tables | +| -f or --filter | Dump only the tables matching the patterns. See [table-filter](https://github.com/pingcap/tidb-tools/blob/master/pkg/table-filter/README.md) for syntax. | +| --case-sensitive | whether the filter should be case-sensitive, default false(insensitive) | +| -h or --host | Host to connect to. (default: `127.0.0.1`) | +| -t or --threads | Number of threads for concurrent backup. | +| -r or --rows | Split table into multiple files by number of rows. This allows Dumpling to generate multiple files concurrently. (default: unlimited) | +| --loglevel | Log level. {debug, info, warn, error, dpanic, panic, fatal}. (default: `info`) | +| -d or --no-data | Don't dump data, for schema-only case. | +| --no-header | Dump table CSV without header. | +| -W or --no-views | Don't dump views. (default: `true`) | +| -m or --no-schemas | Don't dump schemas, dump data only. | +| -s or --statement-size | Control the size of Insert Statement. Unit: byte. | +| -F or --filesize | The approximate size of the output file. The unit should be explicitly provided (such as `128B`, `64KiB`, `32MiB`, `1.5GiB`) | +| --filetype| The type of dump file. (sql/csv, default "sql") | +| -o or --output | Output directory. The default value is based on time. | +| --output-filename-template | Output file name templates. See below for details. | +| -S or --sql | Dump data with given sql. This argument doesn't support concurrent dump | +| --consistency | Which consistency control to use (default `auto`):
`flush`: Use FTWRL (flush tables with read lock)
`snapshot`: use a snapshot at a given timestamp
`lock`: execute lock tables read for all tables that need to be locked
`none`: dump without locking. It cannot guarantee consistency
`auto`: `flush` on MySQL, `snapshot` on TiDB | +| --snapshot | Snapshot position. Valid only when consistency=snapshot. | +| --where | Specify the dump range by `where` condition. Dump only the selected records. | +| -p or --password | User password. | +| -P or --port | TCP/IP port to connect to. (default: `4000`) | +| -u or --user | Username with privileges to run the dump. (default "root") | + +To see more detailed usage, run the flag `-h` or `--help`. + +## Mydumper Reference + +[Mydumper usage](https://github.com/maxbube/mydumper/blob/master/docs/mydumper_usage.rst) + +[TiDB Mydumper Instructions](https://pingcap.com/docs/stable/reference/tools/mydumper/) + +## Download + +Download the nightly version of Dumpling [here](https://download.pingcap.org/dumpling-nightly-linux-amd64.tar.gz). + +## Output filename template + +The `--output-filename-template` argument specifies how all files are named, before including the file extensions. It accepts strings in the [Go `text/template` syntax](https://golang.org/pkg/text/template/). + +The following fields are available to the template: + +* `.DB` — database name +* `.Table` — table name or object name +* `.Index` — when a table is split into multiple files, this is the 0-based sequence number indicating which part we are dumping + +The database and table names may contain special characters like `/` not acceptable in the file system. Thus, Dumpling also provided a function `fn` to percent-escape these special characters: + +* U+0000 to U+001F (control characters) +* `/`, `\`, `<`, `>`, `:`, `"`, `*`, `?` (invalid Windows path characters) +* `.` (database/table name separator) +* `-`, if appeared as part of `-schema` + +For instance, using `--output-filename-template '{{fn .Table}}.{{printf "%09d" .Index}}'`, Dumpling will write the table `"db"."tbl:normal"` into files named like `tbl%3Anormal.000000000.sql`, `tbl%3Anormal.000000001.sql`, etc. + +Besides the data files, you could also define named templates to replace the file name of the schema files. The default are configuration is: + +| Name | Content | +|------|---------| +| data | `{{fn .DB}}.{{fn .Table}}.{{.Index}}` | +| schema | `{{fn .DB}}-schema-create` | +| table | `{{fn .DB}}.{{fn .Table}}-schema` | +| event | `{{fn .DB}}.{{fn .Table}}-schema-post` | +| function | `{{fn .DB}}.{{fn .Table}}-schema-post` | +| procedure | `{{fn .DB}}.{{fn .Table}}-schema-post` | +| sequence | `{{fn .DB}}.{{fn .Table}}-schema-sequence` | +| trigger | `{{fn .DB}}.{{fn .Table}}-schema-triggers` | +| view | `{{fn .DB}}.{{fn .Table}}-schema-view` | + +For instance, using `--output-filename-template '{{define "table"}}{{fn .Table}}.$schema{{end}}{{define "data"}}{{fn .Table}}.{{printf "%09d" .Index}}{{end}}'`, Dumpling will write the schema of the table `"db"."tbl:normal"` into the file `tbl%3Anormal.$schema.sql`, and data into the files like `tbl%3Anormal.000000000.sql`. diff --git a/dumpling/export/block_allow_list.go b/dumpling/export/block_allow_list.go new file mode 100644 index 0000000000000..2ce925abe02da --- /dev/null +++ b/dumpling/export/block_allow_list.go @@ -0,0 +1,59 @@ +// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +package export + +import ( + "go.uber.org/zap" + + tcontext "github.com/pingcap/tidb/dumpling/context" +) + +func filterDatabases(tctx *tcontext.Context, conf *Config, databases []string) []string { + tctx.L().Debug("start to filter databases") + newDatabases := make([]string, 0, len(databases)) + ignoreDatabases := make([]string, 0, len(databases)) + for _, database := range databases { + if conf.TableFilter.MatchSchema(database) { + newDatabases = append(newDatabases, database) + } else { + ignoreDatabases = append(ignoreDatabases, database) + } + } + if len(ignoreDatabases) > 0 { + tctx.L().Debug("ignore database", zap.Strings("databases", ignoreDatabases)) + } + return newDatabases +} + +func filterTables(tctx *tcontext.Context, conf *Config) { + filterTablesFunc(tctx, conf, conf.TableFilter.MatchTable) +} + +func filterTablesFunc(tctx *tcontext.Context, conf *Config, matchTable func(string, string) bool) { + tctx.L().Debug("start to filter tables") + dbTables := DatabaseTables{} + ignoredDBTable := DatabaseTables{} + + for dbName, tables := range conf.Tables { + for _, table := range tables { + if matchTable(dbName, table.Name) { + dbTables.AppendTable(dbName, table) + } else { + ignoredDBTable.AppendTable(dbName, table) + } + } + // 1. this dbName doesn't match block allow list, don't add + // 2. this dbName matches block allow list, but there is no table in this database, add + if conf.DumpEmptyDatabase { + if _, ok := dbTables[dbName]; !ok && conf.TableFilter.MatchSchema(dbName) { + dbTables[dbName] = make([]*TableInfo, 0) + } + } + } + + if len(ignoredDBTable) > 0 { + tctx.L().Debug("ignore table", zap.String("tables", ignoredDBTable.Literal())) + } + + conf.Tables = dbTables +} diff --git a/dumpling/export/block_allow_list_test.go b/dumpling/export/block_allow_list_test.go new file mode 100644 index 0000000000000..3ce55497d589b --- /dev/null +++ b/dumpling/export/block_allow_list_test.go @@ -0,0 +1,80 @@ +// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +package export + +import ( + "strings" + "testing" + + "github.com/pingcap/tidb-tools/pkg/filter" + tf "github.com/pingcap/tidb-tools/pkg/table-filter" + "github.com/stretchr/testify/require" + + "github.com/pingcap/tidb/br/pkg/version" + tcontext "github.com/pingcap/tidb/dumpling/context" +) + +func TestFilterTables(t *testing.T) { + tctx := tcontext.Background().WithLogger(appLogger) + dbTables := DatabaseTables{} + expectedDBTables := DatabaseTables{} + + dbTables.AppendTables(filter.InformationSchemaName, []string{"xxx"}, []uint64{0}) + dbTables.AppendTables(strings.ToUpper(filter.PerformanceSchemaName), []string{"xxx"}, []uint64{0}) + dbTables.AppendTables("xxx", []string{"yyy"}, []uint64{0}) + expectedDBTables.AppendTables("xxx", []string{"yyy"}, []uint64{0}) + dbTables.AppendTables("yyy", []string{"xxx"}, []uint64{0}) + + tableFilter, err := tf.Parse([]string{"*.*"}) + require.NoError(t, err) + + conf := &Config{ + ServerInfo: version.ServerInfo{ + ServerType: version.ServerTypeTiDB, + }, + Tables: dbTables, + TableFilter: tableFilter, + } + databases := []string{filter.InformationSchemaName, filter.PerformanceSchemaName, "xxx", "yyy"} + require.Equal(t, databases, filterDatabases(tctx, conf, databases)) + + conf.TableFilter = tf.NewSchemasFilter("xxx") + require.Equal(t, []string{"xxx"}, filterDatabases(tctx, conf, databases)) + + filterTables(tcontext.Background(), conf) + require.Len(t, conf.Tables, 1) + require.Equal(t, expectedDBTables, conf.Tables) +} + +func TestFilterDatabaseWithNoTable(t *testing.T) { + dbTables := DatabaseTables{} + expectedDBTables := DatabaseTables{} + + dbTables["xxx"] = []*TableInfo{} + conf := &Config{ + ServerInfo: version.ServerInfo{ + ServerType: version.ServerTypeTiDB, + }, + Tables: dbTables, + TableFilter: tf.NewSchemasFilter("yyy"), + DumpEmptyDatabase: true, + } + filterTables(tcontext.Background(), conf) + require.Len(t, conf.Tables, 0) + + dbTables["xxx"] = []*TableInfo{} + expectedDBTables["xxx"] = []*TableInfo{} + conf.Tables = dbTables + conf.TableFilter = tf.NewSchemasFilter("xxx") + filterTables(tcontext.Background(), conf) + require.Len(t, conf.Tables, 1) + require.Equal(t, expectedDBTables, conf.Tables) + + dbTables["xxx"] = []*TableInfo{} + expectedDBTables = DatabaseTables{} + conf.Tables = dbTables + conf.DumpEmptyDatabase = false + filterTables(tcontext.Background(), conf) + require.Len(t, conf.Tables, 0) + require.Equal(t, expectedDBTables, conf.Tables) +} diff --git a/dumpling/export/config.go b/dumpling/export/config.go new file mode 100644 index 0000000000000..017e4aa9294bb --- /dev/null +++ b/dumpling/export/config.go @@ -0,0 +1,651 @@ +// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +package export + +import ( + "context" + "crypto/tls" + "encoding/json" + "fmt" + "io/ioutil" + "strconv" + "strings" + "text/template" + "time" + + "github.com/coreos/go-semver/semver" + "github.com/docker/go-units" + "github.com/go-sql-driver/mysql" + "github.com/pingcap/errors" + filter "github.com/pingcap/tidb-tools/pkg/table-filter" + "github.com/pingcap/tidb-tools/pkg/utils" + "github.com/prometheus/client_golang/prometheus" + "github.com/spf13/pflag" + "go.uber.org/zap" + + "github.com/pingcap/tidb/br/pkg/storage" + "github.com/pingcap/tidb/br/pkg/version" +) + +const ( + flagDatabase = "database" + flagTablesList = "tables-list" + flagHost = "host" + flagUser = "user" + flagPort = "port" + flagPassword = "password" + flagAllowCleartextPasswords = "allow-cleartext-passwords" + flagThreads = "threads" + flagFilesize = "filesize" + flagStatementSize = "statement-size" + flagOutput = "output" + flagLoglevel = "loglevel" + flagLogfile = "logfile" + flagLogfmt = "logfmt" + flagConsistency = "consistency" + flagSnapshot = "snapshot" + flagNoViews = "no-views" + flagStatusAddr = "status-addr" + flagRows = "rows" + flagWhere = "where" + flagEscapeBackslash = "escape-backslash" + flagFiletype = "filetype" + flagNoHeader = "no-header" + flagNoSchemas = "no-schemas" + flagNoData = "no-data" + flagCsvNullValue = "csv-null-value" + flagSQL = "sql" + flagFilter = "filter" + flagCaseSensitive = "case-sensitive" + flagDumpEmptyDatabase = "dump-empty-database" + flagTidbMemQuotaQuery = "tidb-mem-quota-query" + flagCA = "ca" + flagCert = "cert" + flagKey = "key" + flagCsvSeparator = "csv-separator" + flagCsvDelimiter = "csv-delimiter" + flagOutputFilenameTemplate = "output-filename-template" + flagCompleteInsert = "complete-insert" + flagParams = "params" + flagReadTimeout = "read-timeout" + flagTransactionalConsistency = "transactional-consistency" + flagCompress = "compress" + + // FlagHelp represents the help flag + FlagHelp = "help" +) + +// Config is the dump config for dumpling +type Config struct { + storage.BackendOptions + + AllowCleartextPasswords bool + SortByPk bool + NoViews bool + NoHeader bool + NoSchemas bool + NoData bool + CompleteInsert bool + TransactionalConsistency bool + EscapeBackslash bool + DumpEmptyDatabase bool + PosAfterConnect bool + CompressType storage.CompressType + + Host string + Port int + Threads int + User string + Password string `json:"-"` + Security struct { + CAPath string + CertPath string + KeyPath string + SSLCABytes []byte `json:"-"` + SSLCertBytes []byte `json:"-"` + SSLKEYBytes []byte `json:"-"` + } + + LogLevel string + LogFile string + LogFormat string + OutputDirPath string + StatusAddr string + Snapshot string + Consistency string + CsvNullValue string + SQL string + CsvSeparator string + CsvDelimiter string + Databases []string + + TableFilter filter.Filter `json:"-"` + Where string + FileType string + ServerInfo version.ServerInfo + Logger *zap.Logger `json:"-"` + OutputFileTemplate *template.Template `json:"-"` + Rows uint64 + ReadTimeout time.Duration + TiDBMemQuotaQuery uint64 + FileSize uint64 + StatementSize uint64 + SessionParams map[string]interface{} + Labels prometheus.Labels `json:"-"` + Tables DatabaseTables +} + +// ServerInfoUnknown is the unknown database type to dumpling +var ServerInfoUnknown = version.ServerInfo{ + ServerType: version.ServerTypeUnknown, + ServerVersion: nil, +} + +// DefaultConfig returns the default export Config for dumpling +func DefaultConfig() *Config { + allFilter, _ := filter.Parse([]string{"*.*"}) + return &Config{ + Databases: nil, + Host: "127.0.0.1", + User: "root", + Port: 3306, + Password: "", + Threads: 4, + Logger: nil, + StatusAddr: ":8281", + FileSize: UnspecifiedSize, + StatementSize: DefaultStatementSize, + OutputDirPath: ".", + ServerInfo: ServerInfoUnknown, + SortByPk: true, + Tables: nil, + Snapshot: "", + Consistency: consistencyTypeAuto, + NoViews: true, + Rows: UnspecifiedSize, + Where: "", + FileType: "", + NoHeader: false, + NoSchemas: false, + NoData: false, + CsvNullValue: "\\N", + SQL: "", + TableFilter: allFilter, + DumpEmptyDatabase: true, + SessionParams: make(map[string]interface{}), + OutputFileTemplate: DefaultOutputFileTemplate, + PosAfterConnect: false, + } +} + +// String returns dumpling's config in json format +func (conf *Config) String() string { + cfg, err := json.Marshal(conf) + if err != nil && conf.Logger != nil { + conf.Logger.Error("fail to marshal config to json", zap.Error(err)) + } + return string(cfg) +} + +// GetDSN generates DSN from Config +func (conf *Config) GetDSN(db string) string { + // maxAllowedPacket=0 can be used to automatically fetch the max_allowed_packet variable from server on every connection. + // https://github.com/go-sql-driver/mysql#maxallowedpacket + dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?collation=utf8mb4_general_ci&readTimeout=%s&writeTimeout=30s&interpolateParams=true&maxAllowedPacket=0", + conf.User, conf.Password, conf.Host, conf.Port, db, conf.ReadTimeout) + if len(conf.Security.CAPath) > 0 { + dsn += "&tls=dumpling-tls-target" + } + if conf.AllowCleartextPasswords { + dsn += "&allowCleartextPasswords=1" + } + return dsn +} + +func timestampDirName() string { + return fmt.Sprintf("./export-%s", time.Now().Format(time.RFC3339)) +} + +// DefineFlags defines flags of dumpling's configuration +func (conf *Config) DefineFlags(flags *pflag.FlagSet) { + storage.DefineFlags(flags) + flags.StringSliceP(flagDatabase, "B", nil, "Databases to dump") + flags.StringSliceP(flagTablesList, "T", nil, "Comma delimited table list to dump; must be qualified table names") + flags.StringP(flagHost, "h", "127.0.0.1", "The host to connect to") + flags.StringP(flagUser, "u", "root", "Username with privileges to run the dump") + flags.IntP(flagPort, "P", 4000, "TCP/IP port to connect to") + flags.StringP(flagPassword, "p", "", "User password") + flags.Bool(flagAllowCleartextPasswords, false, "Allow passwords to be sent in cleartext (warning: don't use without TLS)") + flags.IntP(flagThreads, "t", 4, "Number of goroutines to use, default 4") + flags.StringP(flagFilesize, "F", "", "The approximate size of output file") + flags.Uint64P(flagStatementSize, "s", DefaultStatementSize, "Attempted size of INSERT statement in bytes") + flags.StringP(flagOutput, "o", timestampDirName(), "Output directory") + flags.String(flagLoglevel, "info", "Log level: {debug|info|warn|error|dpanic|panic|fatal}") + flags.StringP(flagLogfile, "L", "", "Log file `path`, leave empty to write to console") + flags.String(flagLogfmt, "text", "Log `format`: {text|json}") + flags.String(flagConsistency, consistencyTypeAuto, "Consistency level during dumping: {auto|none|flush|lock|snapshot}") + flags.String(flagSnapshot, "", "Snapshot position (uint64 or MySQL style string timestamp). Valid only when consistency=snapshot") + flags.BoolP(flagNoViews, "W", true, "Do not dump views") + flags.String(flagStatusAddr, ":8281", "dumpling API server and pprof addr") + flags.Uint64P(flagRows, "r", UnspecifiedSize, "If specified, dumpling will split table into chunks and concurrently dump them to different files to improve efficiency. For TiDB v3.0+, specify this will make dumpling split table with each file one TiDB region(no matter how many rows is).\n"+ + "If not specified, dumpling will dump table without inner-concurrency which could be relatively slow. default unlimited") + flags.String(flagWhere, "", "Dump only selected records") + flags.Bool(flagEscapeBackslash, true, "use backslash to escape special characters") + flags.String(flagFiletype, "", "The type of export file (sql/csv)") + flags.Bool(flagNoHeader, false, "whether not to dump CSV table header") + flags.BoolP(flagNoSchemas, "m", false, "Do not dump table schemas with the data") + flags.BoolP(flagNoData, "d", false, "Do not dump table data") + flags.String(flagCsvNullValue, "\\N", "The null value used when export to csv") + flags.StringP(flagSQL, "S", "", "Dump data with given sql. This argument doesn't support concurrent dump") + _ = flags.MarkHidden(flagSQL) + flags.StringSliceP(flagFilter, "f", []string{"*.*", DefaultTableFilter}, "filter to select which tables to dump") + flags.Bool(flagCaseSensitive, false, "whether the filter should be case-sensitive") + flags.Bool(flagDumpEmptyDatabase, true, "whether to dump empty database") + flags.Uint64(flagTidbMemQuotaQuery, UnspecifiedSize, "The maximum memory limit for a single SQL statement, in bytes.") + flags.String(flagCA, "", "The path name to the certificate authority file for TLS connection") + flags.String(flagCert, "", "The path name to the client certificate file for TLS connection") + flags.String(flagKey, "", "The path name to the client private key file for TLS connection") + flags.String(flagCsvSeparator, ",", "The separator for csv files, default ','") + flags.String(flagCsvDelimiter, "\"", "The delimiter for values in csv files, default '\"'") + flags.String(flagOutputFilenameTemplate, "", "The output filename template (without file extension)") + flags.Bool(flagCompleteInsert, false, "Use complete INSERT statements that include column names") + flags.StringToString(flagParams, nil, `Extra session variables used while dumping, accepted format: --params "character_set_client=latin1,character_set_connection=latin1"`) + flags.Bool(FlagHelp, false, "Print help message and quit") + flags.Duration(flagReadTimeout, 15*time.Minute, "I/O read timeout for db connection.") + _ = flags.MarkHidden(flagReadTimeout) + flags.Bool(flagTransactionalConsistency, true, "Only support transactional consistency") + _ = flags.MarkHidden(flagTransactionalConsistency) + flags.StringP(flagCompress, "c", "", "Compress output file type, support 'gzip', 'no-compression' now") +} + +// ParseFromFlags parses dumpling's export.Config from flags +// nolint: gocyclo +func (conf *Config) ParseFromFlags(flags *pflag.FlagSet) error { + var err error + conf.Databases, err = flags.GetStringSlice(flagDatabase) + if err != nil { + return errors.Trace(err) + } + conf.Host, err = flags.GetString(flagHost) + if err != nil { + return errors.Trace(err) + } + conf.User, err = flags.GetString(flagUser) + if err != nil { + return errors.Trace(err) + } + conf.Port, err = flags.GetInt(flagPort) + if err != nil { + return errors.Trace(err) + } + conf.Password, err = flags.GetString(flagPassword) + if err != nil { + return errors.Trace(err) + } + conf.AllowCleartextPasswords, err = flags.GetBool(flagAllowCleartextPasswords) + if err != nil { + return errors.Trace(err) + } + conf.Threads, err = flags.GetInt(flagThreads) + if err != nil { + return errors.Trace(err) + } + conf.StatementSize, err = flags.GetUint64(flagStatementSize) + if err != nil { + return errors.Trace(err) + } + conf.OutputDirPath, err = flags.GetString(flagOutput) + if err != nil { + return errors.Trace(err) + } + conf.LogLevel, err = flags.GetString(flagLoglevel) + if err != nil { + return errors.Trace(err) + } + conf.LogFile, err = flags.GetString(flagLogfile) + if err != nil { + return errors.Trace(err) + } + conf.LogFormat, err = flags.GetString(flagLogfmt) + if err != nil { + return errors.Trace(err) + } + conf.Consistency, err = flags.GetString(flagConsistency) + if err != nil { + return errors.Trace(err) + } + conf.Snapshot, err = flags.GetString(flagSnapshot) + if err != nil { + return errors.Trace(err) + } + conf.NoViews, err = flags.GetBool(flagNoViews) + if err != nil { + return errors.Trace(err) + } + conf.StatusAddr, err = flags.GetString(flagStatusAddr) + if err != nil { + return errors.Trace(err) + } + conf.Rows, err = flags.GetUint64(flagRows) + if err != nil { + return errors.Trace(err) + } + conf.Where, err = flags.GetString(flagWhere) + if err != nil { + return errors.Trace(err) + } + conf.EscapeBackslash, err = flags.GetBool(flagEscapeBackslash) + if err != nil { + return errors.Trace(err) + } + conf.FileType, err = flags.GetString(flagFiletype) + if err != nil { + return errors.Trace(err) + } + conf.NoHeader, err = flags.GetBool(flagNoHeader) + if err != nil { + return errors.Trace(err) + } + conf.NoSchemas, err = flags.GetBool(flagNoSchemas) + if err != nil { + return errors.Trace(err) + } + conf.NoData, err = flags.GetBool(flagNoData) + if err != nil { + return errors.Trace(err) + } + conf.CsvNullValue, err = flags.GetString(flagCsvNullValue) + if err != nil { + return errors.Trace(err) + } + conf.SQL, err = flags.GetString(flagSQL) + if err != nil { + return errors.Trace(err) + } + conf.DumpEmptyDatabase, err = flags.GetBool(flagDumpEmptyDatabase) + if err != nil { + return errors.Trace(err) + } + conf.Security.CAPath, err = flags.GetString(flagCA) + if err != nil { + return errors.Trace(err) + } + conf.Security.CertPath, err = flags.GetString(flagCert) + if err != nil { + return errors.Trace(err) + } + conf.Security.KeyPath, err = flags.GetString(flagKey) + if err != nil { + return errors.Trace(err) + } + conf.CsvSeparator, err = flags.GetString(flagCsvSeparator) + if err != nil { + return errors.Trace(err) + } + conf.CsvDelimiter, err = flags.GetString(flagCsvDelimiter) + if err != nil { + return errors.Trace(err) + } + conf.CompleteInsert, err = flags.GetBool(flagCompleteInsert) + if err != nil { + return errors.Trace(err) + } + conf.ReadTimeout, err = flags.GetDuration(flagReadTimeout) + if err != nil { + return errors.Trace(err) + } + conf.TransactionalConsistency, err = flags.GetBool(flagTransactionalConsistency) + if err != nil { + return errors.Trace(err) + } + conf.TiDBMemQuotaQuery, err = flags.GetUint64(flagTidbMemQuotaQuery) + if err != nil { + return errors.Trace(err) + } + + if conf.Threads <= 0 { + return errors.Errorf("--threads is set to %d. It should be greater than 0", conf.Threads) + } + if len(conf.CsvSeparator) == 0 { + return errors.New("--csv-separator is set to \"\". It must not be an empty string") + } + + if conf.SessionParams == nil { + conf.SessionParams = make(map[string]interface{}) + } + + tablesList, err := flags.GetStringSlice(flagTablesList) + if err != nil { + return errors.Trace(err) + } + fileSizeStr, err := flags.GetString(flagFilesize) + if err != nil { + return errors.Trace(err) + } + filters, err := flags.GetStringSlice(flagFilter) + if err != nil { + return errors.Trace(err) + } + caseSensitive, err := flags.GetBool(flagCaseSensitive) + if err != nil { + return errors.Trace(err) + } + outputFilenameFormat, err := flags.GetString(flagOutputFilenameTemplate) + if err != nil { + return errors.Trace(err) + } + params, err := flags.GetStringToString(flagParams) + if err != nil { + return errors.Trace(err) + } + + conf.TableFilter, err = ParseTableFilter(tablesList, filters) + if err != nil { + return errors.Errorf("failed to parse filter: %s", err) + } + + if !caseSensitive { + conf.TableFilter = filter.CaseInsensitive(conf.TableFilter) + } + + conf.FileSize, err = ParseFileSize(fileSizeStr) + if err != nil { + return errors.Trace(err) + } + + if outputFilenameFormat == "" && conf.SQL != "" { + outputFilenameFormat = DefaultAnonymousOutputFileTemplateText + } + tmpl, err := ParseOutputFileTemplate(outputFilenameFormat) + if err != nil { + return errors.Errorf("failed to parse output filename template (--output-filename-template '%s')\n", outputFilenameFormat) + } + conf.OutputFileTemplate = tmpl + + compressType, err := flags.GetString(flagCompress) + if err != nil { + return errors.Trace(err) + } + conf.CompressType, err = ParseCompressType(compressType) + if err != nil { + return errors.Trace(err) + } + + for k, v := range params { + conf.SessionParams[k] = v + } + + err = conf.BackendOptions.ParseFromFlags(pflag.CommandLine) + if err != nil { + return errors.Trace(err) + } + + return nil +} + +// ParseFileSize parses file size from tables-list and filter arguments +func ParseFileSize(fileSizeStr string) (uint64, error) { + if len(fileSizeStr) == 0 { + return UnspecifiedSize, nil + } else if fileSizeMB, err := strconv.ParseUint(fileSizeStr, 10, 64); err == nil { + fmt.Printf("Warning: -F without unit is not recommended, try using `-F '%dMiB'` in the future\n", fileSizeMB) + return fileSizeMB * units.MiB, nil + } else if size, err := units.RAMInBytes(fileSizeStr); err == nil { + return uint64(size), nil + } + return 0, errors.Errorf("failed to parse filesize (-F '%s')", fileSizeStr) +} + +// ParseTableFilter parses table filter from tables-list and filter arguments +func ParseTableFilter(tablesList, filters []string) (filter.Filter, error) { + if len(tablesList) == 0 { + return filter.Parse(filters) + } + + // only parse -T when -f is default value. otherwise bail out. + if !sameStringArray(filters, []string{"*.*", DefaultTableFilter}) { + return nil, errors.New("cannot pass --tables-list and --filter together") + } + + tableNames := make([]filter.Table, 0, len(tablesList)) + for _, table := range tablesList { + parts := strings.SplitN(table, ".", 2) + if len(parts) < 2 { + return nil, errors.Errorf("--tables-list only accepts qualified table names, but `%s` lacks a dot", table) + } + tableNames = append(tableNames, filter.Table{Schema: parts[0], Name: parts[1]}) + } + + return filter.NewTablesFilter(tableNames...), nil +} + +// ParseCompressType parses compressType string to storage.CompressType +func ParseCompressType(compressType string) (storage.CompressType, error) { + switch compressType { + case "", "no-compression": + return storage.NoCompression, nil + case "gzip", "gz": + return storage.Gzip, nil + default: + return storage.NoCompression, errors.Errorf("unknown compress type %s", compressType) + } +} + +func (conf *Config) createExternalStorage(ctx context.Context) (storage.ExternalStorage, error) { + b, err := storage.ParseBackend(conf.OutputDirPath, &conf.BackendOptions) + if err != nil { + return nil, errors.Trace(err) + } + + // TODO: support setting httpClient with certification later + return storage.New(ctx, b, &storage.ExternalStorageOptions{}) +} + +const ( + // UnspecifiedSize means the filesize/statement-size is unspecified + UnspecifiedSize = 0 + // DefaultStatementSize is the default statement size + DefaultStatementSize = 1000000 + // TiDBMemQuotaQueryName is the session variable TiDBMemQuotaQuery's name in TiDB + TiDBMemQuotaQueryName = "tidb_mem_quota_query" + // DefaultTableFilter is the default exclude table filter. It will exclude all system databases + DefaultTableFilter = "!/^(mysql|sys|INFORMATION_SCHEMA|PERFORMANCE_SCHEMA|METRICS_SCHEMA|INSPECTION_SCHEMA)$/.*" + + defaultDumpThreads = 128 + defaultDumpGCSafePointTTL = 5 * 60 + defaultEtcdDialTimeOut = 3 * time.Second + + dumplingServiceSafePointPrefix = "dumpling" +) + +var ( + decodeRegionVersion = semver.New("3.0.0") + gcSafePointVersion = semver.New("4.0.0") + tableSampleVersion = semver.New("5.0.0-nightly") +) + +func adjustConfig(conf *Config, fns ...func(*Config) error) error { + for _, f := range fns { + err := f(conf) + if err != nil { + return err + } + } + return nil +} + +func registerTLSConfig(conf *Config) error { + if len(conf.Security.CAPath) > 0 { + var err error + var tlsConfig *tls.Config + if len(conf.Security.SSLCABytes) == 0 { + conf.Security.SSLCABytes, err = ioutil.ReadFile(conf.Security.CAPath) + if err != nil { + return errors.Trace(err) + } + conf.Security.SSLCertBytes, err = ioutil.ReadFile(conf.Security.CertPath) + if err != nil { + return errors.Trace(err) + } + conf.Security.SSLKEYBytes, err = ioutil.ReadFile(conf.Security.KeyPath) + if err != nil { + return errors.Trace(err) + } + } + tlsConfig, err = utils.ToTLSConfigWithVerifyByRawbytes(conf.Security.SSLCABytes, + conf.Security.SSLCertBytes, conf.Security.SSLKEYBytes, []string{}) + if err != nil { + return errors.Trace(err) + } + // NOTE for local test(use a self-signed or invalid certificate), we don't need to check CA file. + // see more here https://github.com/go-sql-driver/mysql#tls + if conf.Host == "127.0.0.1" { + tlsConfig.InsecureSkipVerify = true + } + err = mysql.RegisterTLSConfig("dumpling-tls-target", tlsConfig) + if err != nil { + return errors.Trace(err) + } + } + return nil +} + +func validateSpecifiedSQL(conf *Config) error { + if conf.SQL != "" && conf.Where != "" { + return errors.New("can't specify both --sql and --where at the same time. Please try to combine them into --sql") + } + return nil +} + +func adjustFileFormat(conf *Config) error { + conf.FileType = strings.ToLower(conf.FileType) + switch conf.FileType { + case "": + if conf.SQL != "" { + conf.FileType = FileFormatCSVString + } else { + conf.FileType = FileFormatSQLTextString + } + case FileFormatSQLTextString: + if conf.SQL != "" { + return errors.Errorf("unsupported config.FileType '%s' when we specify --sql, please unset --filetype or set it to 'csv'", conf.FileType) + } + case FileFormatCSVString: + default: + return errors.Errorf("unknown config.FileType '%s'", conf.FileType) + } + return nil +} + +func matchMysqlBugversion(info version.ServerInfo) bool { + // if 8.0.3 <= mysql8 version < 8.0.23 + // FLUSH TABLES WITH READ LOCK could block other sessions from executing SHOW TABLE STATUS. + // see more in https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-23.html + if info.ServerType != version.ServerTypeMySQL { + return false + } + currentVersion := info.ServerVersion + bugVersionStart := semver.New("8.0.2") + bugVersionEnd := semver.New("8.0.23") + return bugVersionStart.LessThan(*currentVersion) && currentVersion.LessThan(*bugVersionEnd) +} diff --git a/dumpling/export/config_test.go b/dumpling/export/config_test.go new file mode 100644 index 0000000000000..80c8046d1faa5 --- /dev/null +++ b/dumpling/export/config_test.go @@ -0,0 +1,35 @@ +// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +package export + +import ( + "github.com/pingcap/tidb/br/pkg/version" + "testing" + + "github.com/stretchr/testify/require" + + tcontext "github.com/pingcap/tidb/dumpling/context" +) + +func TestCreateExternalStorage(t *testing.T) { + mockConfig := defaultConfigForTest(t) + loc, err := mockConfig.createExternalStorage(tcontext.Background()) + require.NoError(t, err) + require.Regexp(t, "^file:", loc.URI()) +} + +func TestMatchMysqlBugVersion(t *testing.T) { + cases := []struct { + serverInfo version.ServerInfo + expected bool + }{ + {version.ParseServerInfo("5.7.25-TiDB-3.0.6"), false}, + {version.ParseServerInfo("8.0.2"), false}, + {version.ParseServerInfo("8.0.3"), true}, + {version.ParseServerInfo("8.0.22"), true}, + {version.ParseServerInfo("8.0.23"), false}, + } + for _, x := range cases { + require.Equalf(t, x.expected, matchMysqlBugversion(x.serverInfo), "server info: %s", x.serverInfo) + } +} diff --git a/dumpling/export/consistency.go b/dumpling/export/consistency.go new file mode 100644 index 0000000000000..ef8ba9f31bbe8 --- /dev/null +++ b/dumpling/export/consistency.go @@ -0,0 +1,171 @@ +// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +package export + +import ( + "context" + "database/sql" + + "github.com/pingcap/errors" + + "github.com/pingcap/tidb/br/pkg/utils" + "github.com/pingcap/tidb/br/pkg/version" + tcontext "github.com/pingcap/tidb/dumpling/context" +) + +const ( + consistencyTypeAuto = "auto" + consistencyTypeFlush = "flush" + consistencyTypeLock = "lock" + consistencyTypeSnapshot = "snapshot" + consistencyTypeNone = "none" +) + +var tiDBDisableTableLockErr = errors.New("try to apply lock consistency on TiDB but it doesn't enable table lock. please set enable-table-lock=true in tidb server config") + +// NewConsistencyController returns a new consistency controller +func NewConsistencyController(ctx context.Context, conf *Config, session *sql.DB) (ConsistencyController, error) { + conn, err := session.Conn(ctx) + if err != nil { + return nil, errors.Trace(err) + } + switch conf.Consistency { + case consistencyTypeFlush: + return &ConsistencyFlushTableWithReadLock{ + serverType: conf.ServerInfo.ServerType, + conn: conn, + }, nil + case consistencyTypeLock: + return &ConsistencyLockDumpingTables{ + conn: conn, + conf: conf, + }, nil + case consistencyTypeSnapshot: + if conf.ServerInfo.ServerType != version.ServerTypeTiDB { + return nil, errors.New("snapshot consistency is not supported for this server") + } + return &ConsistencyNone{}, nil + case consistencyTypeNone: + return &ConsistencyNone{}, nil + default: + return nil, errors.Errorf("invalid consistency option %s", conf.Consistency) + } +} + +// ConsistencyController is the interface that controls the consistency of exporting progress +type ConsistencyController interface { + Setup(*tcontext.Context) error + TearDown(context.Context) error + PingContext(context.Context) error +} + +// ConsistencyNone dumps without adding locks, which cannot guarantee consistency +type ConsistencyNone struct{} + +// Setup implements ConsistencyController.Setup +func (c *ConsistencyNone) Setup(_ *tcontext.Context) error { + return nil +} + +// TearDown implements ConsistencyController.TearDown +func (c *ConsistencyNone) TearDown(_ context.Context) error { + return nil +} + +// PingContext implements ConsistencyController.PingContext +func (c *ConsistencyNone) PingContext(_ context.Context) error { + return nil +} + +// ConsistencyFlushTableWithReadLock uses FlushTableWithReadLock before the dump +type ConsistencyFlushTableWithReadLock struct { + serverType version.ServerType + conn *sql.Conn +} + +// Setup implements ConsistencyController.Setup +func (c *ConsistencyFlushTableWithReadLock) Setup(tctx *tcontext.Context) error { + if c.serverType == version.ServerTypeTiDB { + return errors.New("'flush table with read lock' cannot be used to ensure the consistency in TiDB") + } + return FlushTableWithReadLock(tctx, c.conn) +} + +// TearDown implements ConsistencyController.TearDown +func (c *ConsistencyFlushTableWithReadLock) TearDown(ctx context.Context) error { + if c.conn == nil { + return nil + } + defer func() { + c.conn.Close() + c.conn = nil + }() + return UnlockTables(ctx, c.conn) +} + +// PingContext implements ConsistencyController.PingContext +func (c *ConsistencyFlushTableWithReadLock) PingContext(ctx context.Context) error { + if c.conn == nil { + return errors.New("consistency connection has already been closed") + } + return c.conn.PingContext(ctx) +} + +// ConsistencyLockDumpingTables execute lock tables read on all tables before dump +type ConsistencyLockDumpingTables struct { + conn *sql.Conn + conf *Config +} + +// Setup implements ConsistencyController.Setup +func (c *ConsistencyLockDumpingTables) Setup(tctx *tcontext.Context) error { + if c.conf.ServerInfo.ServerType == version.ServerTypeTiDB { + if enableTableLock, err := CheckTiDBEnableTableLock(c.conn); err != nil || !enableTableLock { + if err != nil { + return err + } else { + return tiDBDisableTableLockErr + } + } + } + blockList := make(map[string]map[string]interface{}) + return utils.WithRetry(tctx, func() error { + lockTablesSQL := buildLockTablesSQL(c.conf.Tables, blockList) + _, err := c.conn.ExecContext(tctx, lockTablesSQL) + if err == nil { + if len(blockList) > 0 { + filterTablesFunc(tctx, c.conf, func(db string, tbl string) bool { + if blockTable, ok := blockList[db]; ok { + if _, ok := blockTable[tbl]; ok { + return false + } + } + return true + }) + } + } + return errors.Trace(err) + }, newLockTablesBackoffer(tctx, blockList)) +} + +// TearDown implements ConsistencyController.TearDown +func (c *ConsistencyLockDumpingTables) TearDown(ctx context.Context) error { + if c.conn == nil { + return nil + } + defer func() { + c.conn.Close() + c.conn = nil + }() + return UnlockTables(ctx, c.conn) +} + +// PingContext implements ConsistencyController.PingContext +func (c *ConsistencyLockDumpingTables) PingContext(ctx context.Context) error { + if c.conn == nil { + return errors.New("consistency connection has already been closed") + } + return c.conn.PingContext(ctx) +} + +const snapshotFieldIndex = 1 diff --git a/dumpling/export/consistency_test.go b/dumpling/export/consistency_test.go new file mode 100644 index 0000000000000..dbc47a7ed1723 --- /dev/null +++ b/dumpling/export/consistency_test.go @@ -0,0 +1,220 @@ +// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +package export + +import ( + "context" + "encoding/json" + "errors" + "testing" + + "github.com/DATA-DOG/go-sqlmock" + "github.com/go-sql-driver/mysql" + "github.com/stretchr/testify/require" + + "github.com/pingcap/tidb/br/pkg/version" + dbconfig "github.com/pingcap/tidb/config" + tcontext "github.com/pingcap/tidb/dumpling/context" +) + +func TestConsistencyController(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + _ = db.Close() + }() + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + tctx := tcontext.Background().WithContext(ctx).WithLogger(appLogger) + conf := defaultConfigForTest(t) + resultOk := sqlmock.NewResult(0, 1) + + conf.Consistency = consistencyTypeNone + ctrl, _ := NewConsistencyController(ctx, conf, db) + _, ok := ctrl.(*ConsistencyNone) + require.True(t, ok) + require.NoError(t, ctrl.Setup(tctx)) + require.NoError(t, ctrl.TearDown(tctx)) + + conf.Consistency = consistencyTypeFlush + mock.ExpectExec("FLUSH TABLES WITH READ LOCK").WillReturnResult(resultOk) + mock.ExpectExec("UNLOCK TABLES").WillReturnResult(resultOk) + ctrl, _ = NewConsistencyController(ctx, conf, db) + _, ok = ctrl.(*ConsistencyFlushTableWithReadLock) + require.True(t, ok) + require.NoError(t, ctrl.Setup(tctx)) + require.NoError(t, ctrl.TearDown(tctx)) + require.NoError(t, mock.ExpectationsWereMet()) + + conf.Consistency = consistencyTypeSnapshot + conf.ServerInfo.ServerType = version.ServerTypeTiDB + ctrl, _ = NewConsistencyController(ctx, conf, db) + _, ok = ctrl.(*ConsistencyNone) + require.True(t, ok) + require.NoError(t, ctrl.Setup(tctx)) + require.NoError(t, ctrl.TearDown(tctx)) + + conf.ServerInfo.ServerType = version.ServerTypeMySQL + conf.Consistency = consistencyTypeLock + conf.Tables = NewDatabaseTables(). + AppendTables("db1", []string{"t1", "t2", "t3"}, []uint64{1, 2, 3}). + AppendViews("db2", "t4") + mock.ExpectExec("LOCK TABLES `db1`.`t1` READ,`db1`.`t2` READ,`db1`.`t3` READ").WillReturnResult(resultOk) + mock.ExpectExec("UNLOCK TABLES").WillReturnResult(resultOk) + ctrl, _ = NewConsistencyController(ctx, conf, db) + _, ok = ctrl.(*ConsistencyLockDumpingTables) + require.True(t, ok) + require.NoError(t, ctrl.Setup(tctx)) + require.NoError(t, ctrl.TearDown(tctx)) + require.NoError(t, mock.ExpectationsWereMet()) +} + +func TestConsistencyLockControllerRetry(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + _ = db.Close() + }() + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + tctx := tcontext.Background().WithContext(ctx) + conf := defaultConfigForTest(t) + resultOk := sqlmock.NewResult(0, 1) + + conf.ServerInfo.ServerType = version.ServerTypeMySQL + conf.Consistency = consistencyTypeLock + conf.Tables = NewDatabaseTables(). + AppendTables("db1", []string{"t1", "t2", "t3"}, []uint64{1, 2, 3}). + AppendViews("db2", "t4") + mock.ExpectExec("LOCK TABLES `db1`.`t1` READ,`db1`.`t2` READ,`db1`.`t3` READ"). + WillReturnError(&mysql.MySQLError{Number: ErrNoSuchTable, Message: "Table 'db1.t3' doesn't exist"}) + mock.ExpectExec("LOCK TABLES `db1`.`t1` READ,`db1`.`t2` READ").WillReturnResult(resultOk) + mock.ExpectExec("UNLOCK TABLES").WillReturnResult(resultOk) + ctrl, _ := NewConsistencyController(ctx, conf, db) + _, ok := ctrl.(*ConsistencyLockDumpingTables) + require.True(t, ok) + require.NoError(t, ctrl.Setup(tctx)) + require.NoError(t, ctrl.TearDown(tctx)) + + // should remove table db1.t3 in tables to dump + expectedDumpTables := NewDatabaseTables(). + AppendTables("db1", []string{"t1", "t2"}, []uint64{1, 2}). + AppendViews("db2", "t4") + require.Equal(t, expectedDumpTables, conf.Tables) + require.NoError(t, mock.ExpectationsWereMet()) +} + +func TestResolveAutoConsistency(t *testing.T) { + conf := defaultConfigForTest(t) + cases := []struct { + serverTp version.ServerType + resolvedConsistency string + }{ + {version.ServerTypeTiDB, consistencyTypeSnapshot}, + {version.ServerTypeMySQL, consistencyTypeFlush}, + {version.ServerTypeMariaDB, consistencyTypeFlush}, + {version.ServerTypeUnknown, consistencyTypeNone}, + } + + for _, x := range cases { + conf.Consistency = consistencyTypeAuto + conf.ServerInfo.ServerType = x.serverTp + d := &Dumper{conf: conf} + require.NoError(t, resolveAutoConsistency(d)) + require.Equalf(t, x.resolvedConsistency, conf.Consistency, "server type: %s", x.serverTp.String()) + } +} + +func TestConsistencyControllerError(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + tctx := tcontext.Background().WithContext(ctx).WithLogger(appLogger) + conf := defaultConfigForTest(t) + + conf.Consistency = "invalid_str" + _, err = NewConsistencyController(ctx, conf, db) + require.Error(t, err) + require.Contains(t, err.Error(), "invalid consistency option") + + // snapshot consistency is only available in TiDB + conf.Consistency = consistencyTypeSnapshot + conf.ServerInfo.ServerType = version.ServerTypeUnknown + _, err = NewConsistencyController(ctx, conf, db) + require.Error(t, err) + + // flush consistency is unavailable in TiDB + conf.Consistency = consistencyTypeFlush + conf.ServerInfo.ServerType = version.ServerTypeTiDB + ctrl, _ := NewConsistencyController(ctx, conf, db) + err = ctrl.Setup(tctx) + require.Error(t, err) + + // lock table fail + conf.Consistency = consistencyTypeLock + conf.Tables = NewDatabaseTables().AppendTables("db", []string{"t"}, []uint64{1}) + mock.ExpectExec("LOCK TABLE").WillReturnError(errors.New("")) + ctrl, _ = NewConsistencyController(ctx, conf, db) + err = ctrl.Setup(tctx) + require.Error(t, err) +} + +func TestConsistencyLockTiDBCheck(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + _ = db.Close() + }() + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + tctx := tcontext.Background().WithContext(ctx).WithLogger(appLogger) + conf := defaultConfigForTest(t) + resultOk := sqlmock.NewResult(0, 1) + + conf.ServerInfo.ServerType = version.ServerTypeTiDB + conf.Consistency = consistencyTypeLock + conf.Tables = NewDatabaseTables(). + AppendTables("db1", []string{"t1"}, []uint64{1}) + ctrl, err := NewConsistencyController(ctx, conf, db) + require.NoError(t, err) + + // no tidb_config found, don't allow to lock tables + unknownSysVarErr := errors.New("ERROR 1193 (HY000): Unknown system variable 'tidb_config'") + mock.ExpectQuery("SELECT @@tidb_config").WillReturnError(unknownSysVarErr) + err = ctrl.Setup(tctx) + require.ErrorIs(t, err, unknownSysVarErr) + require.NoError(t, mock.ExpectationsWereMet()) + + // enable-table-lock is false, don't allow to lock tables + tidbConf := dbconfig.NewConfig() + tidbConf.EnableTableLock = false + tidbConfBytes, err := json.Marshal(tidbConf) + require.NoError(t, err) + mock.ExpectQuery("SELECT @@tidb_config").WillReturnRows( + sqlmock.NewRows([]string{"@@tidb_config"}).AddRow(string(tidbConfBytes))) + err = ctrl.Setup(tctx) + require.ErrorIs(t, err, tiDBDisableTableLockErr) + require.NoError(t, mock.ExpectationsWereMet()) + + // enable-table-lock is true, allow to lock tables + tidbConf.EnableTableLock = true + tidbConfBytes, err = json.Marshal(tidbConf) + require.NoError(t, err) + mock.ExpectQuery("SELECT @@tidb_config").WillReturnRows( + sqlmock.NewRows([]string{"@@tidb_config"}).AddRow(string(tidbConfBytes))) + mock.ExpectExec("LOCK TABLES `db1`.`t1` READ").WillReturnResult(resultOk) + mock.ExpectExec("UNLOCK TABLES").WillReturnResult(resultOk) + err = ctrl.Setup(tctx) + require.NoError(t, err) + require.NoError(t, ctrl.TearDown(tctx)) + require.NoError(t, mock.ExpectationsWereMet()) +} diff --git a/dumpling/export/dump.go b/dumpling/export/dump.go new file mode 100755 index 0000000000000..95fd9bedc2596 --- /dev/null +++ b/dumpling/export/dump.go @@ -0,0 +1,1511 @@ +// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +package export + +import ( + "bytes" + "context" + "database/sql" + "encoding/hex" + "fmt" + "math/big" + "sort" + "strconv" + "strings" + "sync/atomic" + "time" + + // import mysql driver + "github.com/go-sql-driver/mysql" + "github.com/pingcap/errors" + "github.com/pingcap/failpoint" + pclog "github.com/pingcap/log" + pd "github.com/tikv/pd/client" + "go.uber.org/zap" + "golang.org/x/sync/errgroup" + + "github.com/pingcap/tidb/br/pkg/storage" + "github.com/pingcap/tidb/br/pkg/summary" + "github.com/pingcap/tidb/br/pkg/version" + "github.com/pingcap/tidb/dumpling/cli" + tcontext "github.com/pingcap/tidb/dumpling/context" + "github.com/pingcap/tidb/dumpling/log" + "github.com/pingcap/tidb/parser" + "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/parser/format" + "github.com/pingcap/tidb/store/helper" + "github.com/pingcap/tidb/tablecodec" + "github.com/pingcap/tidb/util/codec" +) + +var openDBFunc = sql.Open + +var emptyHandleValsErr = errors.New("empty handleVals for TiDB table") + +// Dumper is the dump progress structure +type Dumper struct { + tctx *tcontext.Context + conf *Config + cancelCtx context.CancelFunc + + extStore storage.ExternalStorage + dbHandle *sql.DB + + tidbPDClientForGC pd.Client + selectTiDBTableRegionFunc func(tctx *tcontext.Context, conn *sql.Conn, meta TableMeta) (pkFields []string, pkVals [][]string, err error) + totalTables int64 + charsetAndDefaultCollationMap map[string]string +} + +// NewDumper returns a new Dumper +func NewDumper(ctx context.Context, conf *Config) (*Dumper, error) { + tctx, cancelFn := tcontext.Background().WithContext(ctx).WithCancel() + d := &Dumper{ + tctx: tctx, + conf: conf, + cancelCtx: cancelFn, + selectTiDBTableRegionFunc: selectTiDBTableRegion, + } + err := adjustConfig(conf, + registerTLSConfig, + validateSpecifiedSQL, + adjustFileFormat) + if err != nil { + return nil, err + } + err = runSteps(d, + initLogger, + createExternalStore, + startHTTPService, + openSQLDB, + detectServerInfo, + resolveAutoConsistency, + + validateResolveAutoConsistency, + tidbSetPDClientForGC, + tidbGetSnapshot, + tidbStartGCSavepointUpdateService, + + setSessionParam) + return d, err +} + +// Dump dumps table from database +// nolint: gocyclo +func (d *Dumper) Dump() (dumpErr error) { + initColTypeRowReceiverMap() + var ( + conn *sql.Conn + err error + conCtrl ConsistencyController + ) + tctx, conf, pool := d.tctx, d.conf, d.dbHandle + tctx.L().Info("begin to run Dump", zap.Stringer("conf", conf)) + m := newGlobalMetadata(tctx, d.extStore, conf.Snapshot) + repeatableRead := needRepeatableRead(conf.ServerInfo.ServerType, conf.Consistency) + defer func() { + if dumpErr == nil { + _ = m.writeGlobalMetaData() + } + }() + + // for consistency lock, we should get table list at first to generate the lock tables SQL + if conf.Consistency == consistencyTypeLock { + conn, err = createConnWithConsistency(tctx, pool, repeatableRead) + if err != nil { + return errors.Trace(err) + } + if err = prepareTableListToDump(tctx, conf, conn); err != nil { + conn.Close() + return err + } + conn.Close() + } + + conCtrl, err = NewConsistencyController(tctx, conf, pool) + if err != nil { + return err + } + if err = conCtrl.Setup(tctx); err != nil { + return errors.Trace(err) + } + // To avoid lock is not released + defer func() { + err = conCtrl.TearDown(tctx) + if err != nil { + tctx.L().Warn("fail to tear down consistency controller", zap.Error(err)) + } + }() + + metaConn, err := createConnWithConsistency(tctx, pool, repeatableRead) + if err != nil { + return err + } + defer metaConn.Close() + m.recordStartTime(time.Now()) + // for consistency lock, we can write snapshot info after all tables are locked. + // the binlog pos may changed because there is still possible write between we lock tables and write master status. + // but for the locked tables doing replication that starts from metadata is safe. + // for consistency flush, record snapshot after whole tables are locked. The recorded meta info is exactly the locked snapshot. + // for consistency snapshot, we should use the snapshot that we get/set at first in metadata. TiDB will assure the snapshot of TSO. + // for consistency none, the binlog pos in metadata might be earlier than dumped data. We need to enable safe-mode to assure data safety. + err = m.recordGlobalMetaData(metaConn, conf.ServerInfo.ServerType, false) + if err != nil { + tctx.L().Info("get global metadata failed", zap.Error(err)) + } + + //init charset and default collation map + d.charsetAndDefaultCollationMap, err = GetCharsetAndDefaultCollation(tctx.Context, metaConn) + if err != nil { + return err + } + + // for other consistencies, we should get table list after consistency is set up and GlobalMetaData is cached + if conf.Consistency != consistencyTypeLock { + if err = prepareTableListToDump(tctx, conf, metaConn); err != nil { + return err + } + } + if err = d.renewSelectTableRegionFuncForLowerTiDB(tctx); err != nil { + tctx.L().Info("cannot update select table region info for TiDB", zap.Error(err)) + } + + atomic.StoreInt64(&d.totalTables, int64(calculateTableCount(conf.Tables))) + + rebuildConn := func(conn *sql.Conn) (*sql.Conn, error) { + // make sure that the lock connection is still alive + err1 := conCtrl.PingContext(tctx) + if err1 != nil { + return conn, errors.Trace(err1) + } + // give up the last broken connection + conn.Close() + newConn, err1 := createConnWithConsistency(tctx, pool, repeatableRead) + if err1 != nil { + return conn, errors.Trace(err1) + } + conn = newConn + // renew the master status after connection. dm can't close safe-mode until dm reaches current pos + if conf.PosAfterConnect { + err1 = m.recordGlobalMetaData(conn, conf.ServerInfo.ServerType, true) + if err1 != nil { + return conn, errors.Trace(err1) + } + } + return conn, nil + } + + taskChan := make(chan Task, defaultDumpThreads) + AddGauge(taskChannelCapacity, conf.Labels, defaultDumpThreads) + wg, writingCtx := errgroup.WithContext(tctx) + writerCtx := tctx.WithContext(writingCtx) + writers, tearDownWriters, err := d.startWriters(writerCtx, wg, taskChan, rebuildConn) + if err != nil { + return err + } + defer tearDownWriters() + + if conf.TransactionalConsistency { + if conf.Consistency == consistencyTypeFlush || conf.Consistency == consistencyTypeLock { + tctx.L().Info("All the dumping transactions have started. Start to unlock tables") + } + if err = conCtrl.TearDown(tctx); err != nil { + return errors.Trace(err) + } + } + // Inject consistency failpoint test after we release the table lock + failpoint.Inject("ConsistencyCheck", nil) + + if conf.PosAfterConnect { + // record again, to provide a location to exit safe mode for DM + err = m.recordGlobalMetaData(metaConn, conf.ServerInfo.ServerType, true) + if err != nil { + tctx.L().Info("get global metadata (after connection pool established) failed", zap.Error(err)) + } + } + + summary.SetLogCollector(summary.NewLogCollector(tctx.L().Info)) + summary.SetUnit(summary.BackupUnit) + defer summary.Summary(summary.BackupUnit) + + logProgressCtx, logProgressCancel := tctx.WithCancel() + go d.runLogProgress(logProgressCtx) + defer logProgressCancel() + + tableDataStartTime := time.Now() + + failpoint.Inject("PrintTiDBMemQuotaQuery", func(_ failpoint.Value) { + row := d.dbHandle.QueryRowContext(tctx, "select @@tidb_mem_quota_query;") + var s string + err = row.Scan(&s) + if err != nil { + fmt.Println(errors.Trace(err)) + } else { + fmt.Printf("tidb_mem_quota_query == %s\n", s) + } + }) + + if conf.SQL == "" { + if err = d.dumpDatabases(writerCtx, metaConn, taskChan); err != nil && !errors.ErrorEqual(err, context.Canceled) { + return err + } + } else { + d.dumpSQL(writerCtx, taskChan) + } + close(taskChan) + _ = metaConn.Close() + if err := wg.Wait(); err != nil { + summary.CollectFailureUnit("dump table data", err) + return errors.Trace(err) + } + summary.CollectSuccessUnit("dump cost", countTotalTask(writers), time.Since(tableDataStartTime)) + + summary.SetSuccessStatus(true) + m.recordFinishTime(time.Now()) + return nil +} + +func (d *Dumper) startWriters(tctx *tcontext.Context, wg *errgroup.Group, taskChan <-chan Task, + rebuildConnFn func(*sql.Conn) (*sql.Conn, error)) ([]*Writer, func(), error) { + conf, pool := d.conf, d.dbHandle + writers := make([]*Writer, conf.Threads) + for i := 0; i < conf.Threads; i++ { + conn, err := createConnWithConsistency(tctx, pool, needRepeatableRead(conf.ServerInfo.ServerType, conf.Consistency)) + if err != nil { + return nil, func() {}, err + } + writer := NewWriter(tctx, int64(i), conf, conn, d.extStore) + writer.rebuildConnFn = rebuildConnFn + writer.setFinishTableCallBack(func(task Task) { + if _, ok := task.(*TaskTableData); ok { + IncCounter(finishedTablesCounter, conf.Labels) + // FIXME: actually finishing the last chunk doesn't means this table is 'finished'. + // We can call this table is 'finished' if all its chunks are finished. + // Comment this log now to avoid ambiguity. + // tctx.L().Debug("finished dumping table data", + // zap.String("database", td.Meta.DatabaseName()), + // zap.String("table", td.Meta.TableName())) + } + }) + writer.setFinishTaskCallBack(func(task Task) { + IncGauge(taskChannelCapacity, conf.Labels) + if td, ok := task.(*TaskTableData); ok { + tctx.L().Debug("finish dumping table data task", + zap.String("database", td.Meta.DatabaseName()), + zap.String("table", td.Meta.TableName()), + zap.Int("chunkIdx", td.ChunkIndex)) + } + }) + wg.Go(func() error { + return writer.run(taskChan) + }) + writers[i] = writer + } + tearDown := func() { + for _, w := range writers { + w.conn.Close() + } + } + return writers, tearDown, nil +} + +func (d *Dumper) dumpDatabases(tctx *tcontext.Context, metaConn *sql.Conn, taskChan chan<- Task) error { + conf := d.conf + allTables := conf.Tables + + // policy should be created before database + // placement policy in other server type can be different, so we only handle the tidb server + if conf.ServerInfo.ServerType == version.ServerTypeTiDB { + policyNames, err := ListAllPlacementPolicyNames(metaConn) + if err != nil { + errCause := errors.Cause(err) + if mysqlErr, ok := errCause.(*mysql.MySQLError); ok && mysqlErr.Number == ErrNoSuchTable { + // some old tidb version and other server type doesn't support placement rules, we can skip it. + tctx.L().Debug("cannot dump placement policy, maybe the server doesn't support it", log.ShortError(err)) + } else { + tctx.L().Warn("fail to dump placement policy: ", log.ShortError(err)) + } + } + for _, policy := range policyNames { + createPolicySQL, err := ShowCreatePlacementPolicy(metaConn, policy) + if err != nil { + return errors.Trace(err) + } + wrappedCreatePolicySQL := fmt.Sprintf("/*T![placement] %s */", createPolicySQL) + task := NewTaskPolicyMeta(policy, wrappedCreatePolicySQL) + ctxDone := d.sendTaskToChan(tctx, task, taskChan) + if ctxDone { + return tctx.Err() + } + } + } + + parser1 := parser.New() + for dbName, tables := range allTables { + if !conf.NoSchemas { + createDatabaseSQL, err := ShowCreateDatabase(metaConn, dbName) + if err != nil { + return errors.Trace(err) + } + // adjust db collation + createDatabaseSQL, err = adjustDatabaseCollation(tctx, parser1, createDatabaseSQL, d.charsetAndDefaultCollationMap) + if err != nil { + return errors.Trace(err) + } + task := NewTaskDatabaseMeta(dbName, createDatabaseSQL) + ctxDone := d.sendTaskToChan(tctx, task, taskChan) + if ctxDone { + return tctx.Err() + } + } + + for _, table := range tables { + tctx.L().Debug("start dumping table...", zap.String("database", dbName), + zap.String("table", table.Name)) + meta, err := dumpTableMeta(conf, metaConn, dbName, table) + if err != nil { + return errors.Trace(err) + } + + if !conf.NoSchemas { + if table.Type == TableTypeView { + task := NewTaskViewMeta(dbName, table.Name, meta.ShowCreateTable(), meta.ShowCreateView()) + ctxDone := d.sendTaskToChan(tctx, task, taskChan) + if ctxDone { + return tctx.Err() + } + } else { + // adjust table collation + newCreateSQL, err := adjustTableCollation(tctx, parser1, meta.ShowCreateTable(), d.charsetAndDefaultCollationMap) + if err != nil { + return errors.Trace(err) + } + meta.(*tableMeta).showCreateTable = newCreateSQL + task := NewTaskTableMeta(dbName, table.Name, meta.ShowCreateTable()) + ctxDone := d.sendTaskToChan(tctx, task, taskChan) + if ctxDone { + return tctx.Err() + } + } + } + if table.Type == TableTypeBase { + err = d.dumpTableData(tctx, metaConn, meta, taskChan) + if err != nil { + return errors.Trace(err) + } + } + } + } + + return nil +} + +// adjustDatabaseCollation adjusts db collation and return new create sql and collation +func adjustDatabaseCollation(tctx *tcontext.Context, parser *parser.Parser, originSQL string, charsetAndDefaultCollationMap map[string]string) (string, error) { + stmt, err := parser.ParseOneStmt(originSQL, "", "") + if err != nil { + tctx.L().Warn("parse create database error, maybe tidb parser doesn't support it", zap.String("originSQL", originSQL), log.ShortError(err)) + return originSQL, nil + } + createStmt, ok := stmt.(*ast.CreateDatabaseStmt) + if !ok { + return originSQL, nil + } + var charset string + for _, createOption := range createStmt.Options { + // already have 'Collation' + if createOption.Tp == ast.DatabaseOptionCollate { + return originSQL, nil + } + if createOption.Tp == ast.DatabaseOptionCharset { + charset = createOption.Value + } + } + // get db collation + collation, ok := charsetAndDefaultCollationMap[strings.ToLower(charset)] + if !ok { + tctx.L().Warn("not found database charset default collation.", zap.String("originSQL", originSQL), zap.String("charset", strings.ToLower(charset))) + return originSQL, nil + } + // add collation + createStmt.Options = append(createStmt.Options, &ast.DatabaseOption{Tp: ast.DatabaseOptionCollate, Value: collation}) + // rewrite sql + var b []byte + bf := bytes.NewBuffer(b) + err = createStmt.Restore(&format.RestoreCtx{ + Flags: format.DefaultRestoreFlags | format.RestoreTiDBSpecialComment, + In: bf, + }) + if err != nil { + return "", errors.Trace(err) + } + return bf.String(), nil +} + +// adjustTableCollation adjusts table collation +func adjustTableCollation(tctx *tcontext.Context, parser *parser.Parser, originSQL string, charsetAndDefaultCollationMap map[string]string) (string, error) { + stmt, err := parser.ParseOneStmt(originSQL, "", "") + if err != nil { + tctx.L().Warn("parse create table error, maybe tidb parser doesn't support it", zap.String("originSQL", originSQL), log.ShortError(err)) + return originSQL, nil + } + createStmt, ok := stmt.(*ast.CreateTableStmt) + if !ok { + return originSQL, nil + } + var charset string + var collation string + for _, createOption := range createStmt.Options { + // already have 'Collation' + if createOption.Tp == ast.TableOptionCollate { + collation = createOption.StrValue + break + } + if createOption.Tp == ast.TableOptionCharset { + charset = createOption.StrValue + } + } + + if collation == "" && charset != "" { + // get db collation + collation, ok := charsetAndDefaultCollationMap[strings.ToLower(charset)] + if !ok { + tctx.L().Warn("not found table charset default collation.", zap.String("originSQL", originSQL), zap.String("charset", strings.ToLower(charset))) + return originSQL, nil + } + + // add collation + createStmt.Options = append(createStmt.Options, &ast.TableOption{Tp: ast.TableOptionCollate, StrValue: collation}) + } + + // adjust columns collation + adjustColumnsCollation(tctx, createStmt, charsetAndDefaultCollationMap) + + // rewrite sql + var b []byte + bf := bytes.NewBuffer(b) + err = createStmt.Restore(&format.RestoreCtx{ + Flags: format.DefaultRestoreFlags | format.RestoreTiDBSpecialComment, + In: bf, + }) + if err != nil { + return "", errors.Trace(err) + } + return bf.String(), nil +} + +// adjustColumnsCollation adds column's collation. +func adjustColumnsCollation(tctx *tcontext.Context, createStmt *ast.CreateTableStmt, charsetAndDefaultCollationMap map[string]string) { + for _, col := range createStmt.Cols { + for _, options := range col.Options { + // already have 'Collation' + if options.Tp == ast.ColumnOptionCollate { + continue + } + } + fieldType := col.Tp + if fieldType.Collate != "" { + continue + } + if fieldType.Charset != "" { + // just have charset + collation, ok := charsetAndDefaultCollationMap[strings.ToLower(fieldType.Charset)] + if !ok { + tctx.L().Warn("not found charset default collation for column.", zap.String("table", createStmt.Table.Name.String()), zap.String("column", col.Name.String()), zap.String("charset", strings.ToLower(fieldType.Charset))) + continue + } + fieldType.Collate = collation + } + } +} + +func (d *Dumper) dumpTableData(tctx *tcontext.Context, conn *sql.Conn, meta TableMeta, taskChan chan<- Task) error { + conf := d.conf + if conf.NoData { + return nil + } + + // Update total rows + fieldName, _ := pickupPossibleField(meta, conn) + c := estimateCount(tctx, meta.DatabaseName(), meta.TableName(), conn, fieldName, conf) + AddCounter(estimateTotalRowsCounter, conf.Labels, float64(c)) + + if conf.Rows == UnspecifiedSize { + return d.sequentialDumpTable(tctx, conn, meta, taskChan) + } + return d.concurrentDumpTable(tctx, conn, meta, taskChan) +} + +func (d *Dumper) buildConcatTask(tctx *tcontext.Context, conn *sql.Conn, meta TableMeta) (*TaskTableData, error) { + tableChan := make(chan Task, 128) + errCh := make(chan error, 1) + go func() { + // adjust rows to suitable rows for this table + d.conf.Rows = GetSuitableRows(meta.AvgRowLength()) + err := d.concurrentDumpTable(tctx, conn, meta, tableChan) + d.conf.Rows = UnspecifiedSize + if err != nil { + errCh <- err + } else { + close(errCh) + } + }() + tableDataArr := make([]*tableData, 0) + handleSubTask := func(task Task) { + tableTask, ok := task.(*TaskTableData) + if !ok { + tctx.L().Warn("unexpected task when splitting table chunks", zap.String("task", tableTask.Brief())) + return + } + tableDataInst, ok := tableTask.Data.(*tableData) + if !ok { + tctx.L().Warn("unexpected task.Data when splitting table chunks", zap.String("task", tableTask.Brief())) + return + } + tableDataArr = append(tableDataArr, tableDataInst) + } + for { + select { + case err, ok := <-errCh: + if !ok { + // make sure all the subtasks in tableChan are handled + for len(tableChan) > 0 { + task := <-tableChan + handleSubTask(task) + } + if len(tableDataArr) <= 1 { + return nil, nil + } + queries := make([]string, 0, len(tableDataArr)) + colLen := tableDataArr[0].colLen + for _, tableDataInst := range tableDataArr { + queries = append(queries, tableDataInst.query) + if colLen != tableDataInst.colLen { + tctx.L().Warn("colLen varies for same table", + zap.Int("oldColLen", colLen), + zap.String("oldQuery", queries[0]), + zap.Int("newColLen", tableDataInst.colLen), + zap.String("newQuery", tableDataInst.query)) + return nil, nil + } + } + return NewTaskTableData(meta, newMultiQueriesChunk(queries, colLen), 0, 1), nil + } + return nil, err + case task := <-tableChan: + handleSubTask(task) + } + } +} + +func (d *Dumper) dumpWholeTableDirectly(tctx *tcontext.Context, meta TableMeta, taskChan chan<- Task, partition, orderByClause string, currentChunk, totalChunks int) error { + conf := d.conf + tableIR := SelectAllFromTable(conf, meta, partition, orderByClause) + task := NewTaskTableData(meta, tableIR, currentChunk, totalChunks) + ctxDone := d.sendTaskToChan(tctx, task, taskChan) + if ctxDone { + return tctx.Err() + } + return nil +} + +func (d *Dumper) sequentialDumpTable(tctx *tcontext.Context, conn *sql.Conn, meta TableMeta, taskChan chan<- Task) error { + conf := d.conf + if conf.ServerInfo.ServerType == version.ServerTypeTiDB { + task, err := d.buildConcatTask(tctx, conn, meta) + if err != nil { + return errors.Trace(err) + } + if task != nil { + ctxDone := d.sendTaskToChan(tctx, task, taskChan) + if ctxDone { + return tctx.Err() + } + return nil + } + tctx.L().Info("didn't build tidb concat sqls, will select all from table now", + zap.String("database", meta.DatabaseName()), + zap.String("table", meta.TableName())) + } + orderByClause, err := buildOrderByClause(conf, conn, meta.DatabaseName(), meta.TableName(), meta.HasImplicitRowID()) + if err != nil { + return err + } + return d.dumpWholeTableDirectly(tctx, meta, taskChan, "", orderByClause, 0, 1) +} + +// concurrentDumpTable tries to split table into several chunks to dump +func (d *Dumper) concurrentDumpTable(tctx *tcontext.Context, conn *sql.Conn, meta TableMeta, taskChan chan<- Task) error { + conf := d.conf + db, tbl := meta.DatabaseName(), meta.TableName() + if conf.ServerInfo.ServerType == version.ServerTypeTiDB && + conf.ServerInfo.ServerVersion != nil && + (conf.ServerInfo.ServerVersion.Compare(*tableSampleVersion) >= 0 || + (conf.ServerInfo.HasTiKV && conf.ServerInfo.ServerVersion.Compare(*decodeRegionVersion) >= 0)) { + err := d.concurrentDumpTiDBTables(tctx, conn, meta, taskChan) + // don't retry on context error and successful tasks + if err2 := errors.Cause(err); err2 == nil || err2 == context.DeadlineExceeded || err2 == context.Canceled { + return err + } else if err2 != emptyHandleValsErr { + tctx.L().Info("fallback to concurrent dump tables using rows due to some problem. This won't influence the whole dump process", + zap.String("database", db), zap.String("table", tbl), log.ShortError(err)) + } + } + + orderByClause, err := buildOrderByClause(conf, conn, db, tbl, meta.HasImplicitRowID()) + if err != nil { + return err + } + + field, err := pickupPossibleField(meta, conn) + if err != nil || field == "" { + // skip split chunk logic if not found proper field + tctx.L().Info("fallback to sequential dump due to no proper field. This won't influence the whole dump process", + zap.String("database", db), zap.String("table", tbl), log.ShortError(err)) + return d.dumpWholeTableDirectly(tctx, meta, taskChan, "", orderByClause, 0, 1) + } + + count := estimateCount(d.tctx, db, tbl, conn, field, conf) + tctx.L().Info("get estimated rows count", + zap.String("database", db), + zap.String("table", tbl), + zap.Uint64("estimateCount", count)) + if count < conf.Rows { + // skip chunk logic if estimates are low + tctx.L().Info("fallback to sequential dump due to estimate count < rows. This won't influence the whole dump process", + zap.Uint64("estimate count", count), + zap.Uint64("conf.rows", conf.Rows), + zap.String("database", db), + zap.String("table", tbl)) + return d.dumpWholeTableDirectly(tctx, meta, taskChan, "", orderByClause, 0, 1) + } + + min, max, err := d.selectMinAndMaxIntValue(conn, db, tbl, field) + if err != nil { + tctx.L().Info("fallback to sequential dump due to cannot get bounding values. This won't influence the whole dump process", + log.ShortError(err)) + return d.dumpWholeTableDirectly(tctx, meta, taskChan, "", orderByClause, 0, 1) + } + tctx.L().Debug("get int bounding values", + zap.String("lower", min.String()), + zap.String("upper", max.String())) + + // every chunk would have eventual adjustments + estimatedChunks := count / conf.Rows + estimatedStep := new(big.Int).Sub(max, min).Uint64()/estimatedChunks + 1 + bigEstimatedStep := new(big.Int).SetUint64(estimatedStep) + cutoff := new(big.Int).Set(min) + totalChunks := estimatedChunks + if estimatedStep == 1 { + totalChunks = new(big.Int).Sub(max, min).Uint64() + 1 + } + + selectField, selectLen := meta.SelectedField(), meta.SelectedLen() + + chunkIndex := 0 + nullValueCondition := "" + if conf.Where == "" { + nullValueCondition = fmt.Sprintf("`%s` IS NULL OR ", escapeString(field)) + } + for max.Cmp(cutoff) >= 0 { + nextCutOff := new(big.Int).Add(cutoff, bigEstimatedStep) + where := fmt.Sprintf("%s(`%s` >= %d AND `%s` < %d)", nullValueCondition, escapeString(field), cutoff, escapeString(field), nextCutOff) + query := buildSelectQuery(db, tbl, selectField, "", buildWhereCondition(conf, where), orderByClause) + if len(nullValueCondition) > 0 { + nullValueCondition = "" + } + task := NewTaskTableData(meta, newTableData(query, selectLen, false), chunkIndex, int(totalChunks)) + ctxDone := d.sendTaskToChan(tctx, task, taskChan) + if ctxDone { + return tctx.Err() + } + cutoff = nextCutOff + chunkIndex++ + } + return nil +} + +func (d *Dumper) sendTaskToChan(tctx *tcontext.Context, task Task, taskChan chan<- Task) (ctxDone bool) { + conf := d.conf + select { + case <-tctx.Done(): + return true + case taskChan <- task: + tctx.L().Debug("send task to writer", + zap.String("task", task.Brief())) + DecGauge(taskChannelCapacity, conf.Labels) + return false + } +} + +func (d *Dumper) selectMinAndMaxIntValue(conn *sql.Conn, db, tbl, field string) (*big.Int, *big.Int, error) { + tctx, conf, zero := d.tctx, d.conf, &big.Int{} + query := fmt.Sprintf("SELECT MIN(`%s`),MAX(`%s`) FROM `%s`.`%s`", + escapeString(field), escapeString(field), escapeString(db), escapeString(tbl)) + if conf.Where != "" { + query = fmt.Sprintf("%s WHERE %s", query, conf.Where) + } + tctx.L().Debug("split chunks", zap.String("query", query)) + + var smin sql.NullString + var smax sql.NullString + row := conn.QueryRowContext(tctx, query) + err := row.Scan(&smin, &smax) + if err != nil { + return zero, zero, errors.Annotatef(err, "can't get min/max values to split chunks, query: %s", query) + } + if !smax.Valid || !smin.Valid { + // found no data + return zero, zero, errors.Errorf("no invalid min/max value found in query %s", query) + } + + max := new(big.Int) + min := new(big.Int) + var ok bool + if max, ok = max.SetString(smax.String, 10); !ok { + return zero, zero, errors.Errorf("fail to convert max value %s in query %s", smax.String, query) + } + if min, ok = min.SetString(smin.String, 10); !ok { + return zero, zero, errors.Errorf("fail to convert min value %s in query %s", smin.String, query) + } + return min, max, nil +} + +func (d *Dumper) concurrentDumpTiDBTables(tctx *tcontext.Context, conn *sql.Conn, meta TableMeta, taskChan chan<- Task) error { + db, tbl := meta.DatabaseName(), meta.TableName() + + var ( + handleColNames []string + handleVals [][]string + err error + ) + // for TiDB v5.0+, we can use table sample directly + if d.conf.ServerInfo.ServerVersion.Compare(*tableSampleVersion) >= 0 { + tctx.L().Debug("dumping TiDB tables with TABLESAMPLE", + zap.String("database", db), zap.String("table", tbl)) + handleColNames, handleVals, err = selectTiDBTableSample(tctx, conn, meta) + } else { + // for TiDB v3.0+, we can use table region decode in TiDB directly + tctx.L().Debug("dumping TiDB tables with TABLE REGIONS", + zap.String("database", db), zap.String("table", tbl)) + var partitions []string + if d.conf.ServerInfo.ServerVersion.Compare(*gcSafePointVersion) >= 0 { + partitions, err = GetPartitionNames(conn, db, tbl) + } + if err == nil { + if len(partitions) == 0 { + handleColNames, handleVals, err = d.selectTiDBTableRegionFunc(tctx, conn, meta) + } else { + return d.concurrentDumpTiDBPartitionTables(tctx, conn, meta, taskChan, partitions) + } + } + } + if err != nil { + return err + } + return d.sendConcurrentDumpTiDBTasks(tctx, meta, taskChan, handleColNames, handleVals, "", 0, len(handleVals)+1) +} + +func (d *Dumper) concurrentDumpTiDBPartitionTables(tctx *tcontext.Context, conn *sql.Conn, meta TableMeta, taskChan chan<- Task, partitions []string) error { + db, tbl := meta.DatabaseName(), meta.TableName() + tctx.L().Debug("dumping TiDB tables with TABLE REGIONS for partition table", + zap.String("database", db), zap.String("table", tbl), zap.Strings("partitions", partitions)) + + startChunkIdx := 0 + totalChunk := 0 + cachedHandleVals := make([][][]string, len(partitions)) + + handleColNames, _, err := selectTiDBRowKeyFields(conn, meta, checkTiDBTableRegionPkFields) + if err != nil { + return err + } + // cache handleVals here to calculate the total chunks + for i, partition := range partitions { + handleVals, err := selectTiDBPartitionRegion(tctx, conn, db, tbl, partition) + if err != nil { + return err + } + totalChunk += len(handleVals) + 1 + cachedHandleVals[i] = handleVals + } + for i, partition := range partitions { + err := d.sendConcurrentDumpTiDBTasks(tctx, meta, taskChan, handleColNames, cachedHandleVals[i], partition, startChunkIdx, totalChunk) + if err != nil { + return err + } + startChunkIdx += len(cachedHandleVals[i]) + 1 + } + return nil +} + +func (d *Dumper) sendConcurrentDumpTiDBTasks(tctx *tcontext.Context, + meta TableMeta, taskChan chan<- Task, + handleColNames []string, handleVals [][]string, partition string, startChunkIdx, totalChunk int) error { + db, tbl := meta.DatabaseName(), meta.TableName() + if len(handleVals) == 0 { + if partition == "" { + // return error to make outside function try using rows method to dump data + return errors.Annotatef(emptyHandleValsErr, "table: `%s`.`%s`", escapeString(db), escapeString(tbl)) + } + return d.dumpWholeTableDirectly(tctx, meta, taskChan, partition, buildOrderByClauseString(handleColNames), startChunkIdx, totalChunk) + } + conf := d.conf + selectField, selectLen := meta.SelectedField(), meta.SelectedLen() + where := buildWhereClauses(handleColNames, handleVals) + orderByClause := buildOrderByClauseString(handleColNames) + + for i, w := range where { + query := buildSelectQuery(db, tbl, selectField, partition, buildWhereCondition(conf, w), orderByClause) + task := NewTaskTableData(meta, newTableData(query, selectLen, false), i+startChunkIdx, totalChunk) + ctxDone := d.sendTaskToChan(tctx, task, taskChan) + if ctxDone { + return tctx.Err() + } + } + return nil +} + +// L returns real logger +func (d *Dumper) L() log.Logger { + return d.tctx.L() +} + +func selectTiDBTableSample(tctx *tcontext.Context, conn *sql.Conn, meta TableMeta) (pkFields []string, pkVals [][]string, err error) { + pkFields, pkColTypes, err := selectTiDBRowKeyFields(conn, meta, nil) + if err != nil { + return nil, nil, errors.Trace(err) + } + + query := buildTiDBTableSampleQuery(pkFields, meta.DatabaseName(), meta.TableName()) + rows, err := conn.QueryContext(tctx, query) + if err != nil { + return nil, nil, errors.Trace(err) + } + pkValNum := len(pkFields) + iter := newRowIter(rows, pkValNum) + defer iter.Close() + rowRec := MakeRowReceiver(pkColTypes) + buf := new(bytes.Buffer) + + for iter.HasNext() { + err = iter.Decode(rowRec) + if err != nil { + return nil, nil, errors.Trace(err) + } + pkValRow := make([]string, 0, pkValNum) + for _, rec := range rowRec.receivers { + rec.WriteToBuffer(buf, true) + pkValRow = append(pkValRow, buf.String()) + buf.Reset() + } + pkVals = append(pkVals, pkValRow) + iter.Next() + } + iter.Close() + return pkFields, pkVals, iter.Error() +} + +func buildTiDBTableSampleQuery(pkFields []string, dbName, tblName string) string { + template := "SELECT %s FROM `%s`.`%s` TABLESAMPLE REGIONS() ORDER BY %s" + quotaPk := make([]string, len(pkFields)) + for i, s := range pkFields { + quotaPk[i] = fmt.Sprintf("`%s`", escapeString(s)) + } + pks := strings.Join(quotaPk, ",") + return fmt.Sprintf(template, pks, escapeString(dbName), escapeString(tblName), pks) +} + +func selectTiDBRowKeyFields(conn *sql.Conn, meta TableMeta, checkPkFields func([]string, []string) error) (pkFields, pkColTypes []string, err error) { + if meta.HasImplicitRowID() { + pkFields, pkColTypes = []string{"_tidb_rowid"}, []string{"BIGINT"} + } else { + pkFields, pkColTypes, err = GetPrimaryKeyAndColumnTypes(conn, meta) + if err == nil { + if checkPkFields != nil { + err = checkPkFields(pkFields, pkColTypes) + } + } + } + return +} + +func checkTiDBTableRegionPkFields(pkFields, pkColTypes []string) (err error) { + if len(pkFields) != 1 || len(pkColTypes) != 1 { + err = errors.Errorf("unsupported primary key for selectTableRegion. pkFields: [%s], pkColTypes: [%s]", strings.Join(pkFields, ", "), strings.Join(pkColTypes, ", ")) + return + } + if _, ok := dataTypeInt[pkColTypes[0]]; !ok { + err = errors.Errorf("unsupported primary key type for selectTableRegion. pkFields: [%s], pkColTypes: [%s]", strings.Join(pkFields, ", "), strings.Join(pkColTypes, ", ")) + } + return +} + +func selectTiDBTableRegion(tctx *tcontext.Context, conn *sql.Conn, meta TableMeta) (pkFields []string, pkVals [][]string, err error) { + pkFields, _, err = selectTiDBRowKeyFields(conn, meta, checkTiDBTableRegionPkFields) + if err != nil { + return + } + + var ( + startKey, decodedKey sql.NullString + rowID = -1 + ) + const ( + tableRegionSQL = "SELECT START_KEY,tidb_decode_key(START_KEY) from INFORMATION_SCHEMA.TIKV_REGION_STATUS s WHERE s.DB_NAME = ? AND s.TABLE_NAME = ? AND IS_INDEX = 0 ORDER BY START_KEY;" + tidbRowID = "_tidb_rowid=" + ) + dbName, tableName := meta.DatabaseName(), meta.TableName() + logger := tctx.L().With(zap.String("database", dbName), zap.String("table", tableName)) + err = simpleQueryWithArgs(conn, func(rows *sql.Rows) error { + rowID++ + err = rows.Scan(&startKey, &decodedKey) + if err != nil { + return errors.Trace(err) + } + // first region's start key has no use. It may come from another table or might be invalid + if rowID == 0 { + return nil + } + if !startKey.Valid { + logger.Debug("meet invalid start key", zap.Int("rowID", rowID)) + return nil + } + if !decodedKey.Valid { + logger.Debug("meet invalid decoded start key", zap.Int("rowID", rowID), zap.String("startKey", startKey.String)) + return nil + } + pkVal, err2 := extractTiDBRowIDFromDecodedKey(tidbRowID, decodedKey.String) + if err2 != nil { + logger.Debug("cannot extract pkVal from decoded start key", + zap.Int("rowID", rowID), zap.String("startKey", startKey.String), zap.String("decodedKey", decodedKey.String), zap.Error(err2)) + } else { + pkVals = append(pkVals, []string{pkVal}) + } + return nil + }, tableRegionSQL, dbName, tableName) + + return pkFields, pkVals, errors.Trace(err) +} + +func selectTiDBPartitionRegion(tctx *tcontext.Context, conn *sql.Conn, dbName, tableName, partition string) (pkVals [][]string, err error) { + var ( + rows *sql.Rows + startKeys []string + ) + const ( + partitionRegionSQL = "SHOW TABLE `%s`.`%s` PARTITION(`%s`) REGIONS" + regionRowKey = "r_" + ) + logger := tctx.L().With(zap.String("database", dbName), zap.String("table", tableName), zap.String("partition", partition)) + rows, err = conn.QueryContext(tctx, fmt.Sprintf(partitionRegionSQL, escapeString(dbName), escapeString(tableName), escapeString(partition))) + if err != nil { + err = errors.Trace(err) + return + } + startKeys, err = GetSpecifiedColumnValueAndClose(rows, "START_KEY") + if err != nil { + return + } + for rowID, startKey := range startKeys { + if rowID == 0 { + continue + } + pkVal, err2 := extractTiDBRowIDFromDecodedKey(regionRowKey, startKey) + if err2 != nil { + logger.Debug("show table region start key doesn't have rowID", + zap.Int("rowID", rowID), zap.String("startKey", startKey), zap.Error(err2)) + } else { + pkVals = append(pkVals, []string{pkVal}) + } + } + + return pkVals, nil +} + +func extractTiDBRowIDFromDecodedKey(indexField, key string) (string, error) { + if p := strings.Index(key, indexField); p != -1 { + p += len(indexField) + return key[p:], nil + } + return "", errors.Errorf("decoded key %s doesn't have %s field", key, indexField) +} + +func getListTableTypeByConf(conf *Config) listTableType { + // use listTableByShowTableStatus by default because it has better performance + listType := listTableByShowTableStatus + if conf.Consistency == consistencyTypeLock { + // for consistency lock, we need to build the tables to dump as soon as possible + listType = listTableByInfoSchema + } else if conf.Consistency == consistencyTypeFlush && matchMysqlBugversion(conf.ServerInfo) { + // For some buggy versions of mysql, we need a workaround to get a list of table names. + listType = listTableByShowFullTables + } + return listType +} + +func prepareTableListToDump(tctx *tcontext.Context, conf *Config, db *sql.Conn) error { + databases, err := prepareDumpingDatabases(tctx, conf, db) + if err != nil { + return err + } + + tableTypes := []TableType{TableTypeBase} + if !conf.NoViews { + tableTypes = append(tableTypes, TableTypeView) + } + + ifSeqExists, err := CheckIfSeqExists(db) + if err != nil { + return err + } + var listType listTableType + if ifSeqExists { + tctx.L().Warn("dumpling tableType `sequence` is unsupported for now") + listType = listTableByShowFullTables + } else { + listType = getListTableTypeByConf(conf) + } + + conf.Tables, err = ListAllDatabasesTables(tctx, db, databases, listType, tableTypes...) + if err != nil { + return err + } + + filterTables(tctx, conf) + return nil +} + +func dumpTableMeta(conf *Config, conn *sql.Conn, db string, table *TableInfo) (TableMeta, error) { + tbl := table.Name + selectField, selectLen, err := buildSelectField(conn, db, tbl, conf.CompleteInsert) + if err != nil { + return nil, err + } + var ( + colTypes []*sql.ColumnType + hasImplicitRowID bool + ) + if conf.ServerInfo.ServerType == version.ServerTypeTiDB { + hasImplicitRowID, err = SelectTiDBRowID(conn, db, tbl) + if err != nil { + return nil, err + } + } + + // If all columns are generated + if selectField == "" { + colTypes, err = GetColumnTypes(conn, "*", db, tbl) + } else { + colTypes, err = GetColumnTypes(conn, selectField, db, tbl) + } + if err != nil { + return nil, err + } + + meta := &tableMeta{ + avgRowLength: table.AvgRowLength, + database: db, + table: tbl, + colTypes: colTypes, + selectedField: selectField, + selectedLen: selectLen, + hasImplicitRowID: hasImplicitRowID, + specCmts: []string{ + "/*!40101 SET NAMES binary*/;", + }, + } + + if conf.NoSchemas { + return meta, nil + } + if table.Type == TableTypeView { + viewName := table.Name + createTableSQL, createViewSQL, err1 := ShowCreateView(conn, db, viewName) + if err1 != nil { + return meta, err1 + } + meta.showCreateTable = createTableSQL + meta.showCreateView = createViewSQL + return meta, nil + } + createTableSQL, err := ShowCreateTable(conn, db, tbl) + if err != nil { + return nil, err + } + meta.showCreateTable = createTableSQL + return meta, nil +} + +func (d *Dumper) dumpSQL(tctx *tcontext.Context, taskChan chan<- Task) { + conf := d.conf + meta := &tableMeta{} + data := newTableData(conf.SQL, 0, true) + task := NewTaskTableData(meta, data, 0, 1) + d.sendTaskToChan(tctx, task, taskChan) +} + +func canRebuildConn(consistency string, trxConsistencyOnly bool) bool { + switch consistency { + case consistencyTypeLock, consistencyTypeFlush: + return !trxConsistencyOnly + case consistencyTypeSnapshot, consistencyTypeNone: + return true + default: + return false + } +} + +// Close closes a Dumper and stop dumping immediately +func (d *Dumper) Close() error { + d.cancelCtx() + if d.dbHandle != nil { + return d.dbHandle.Close() + } + return nil +} + +func runSteps(d *Dumper, steps ...func(*Dumper) error) error { + for _, st := range steps { + err := st(d) + if err != nil { + return err + } + } + return nil +} + +func initLogger(d *Dumper) error { + conf := d.conf + var ( + logger log.Logger + err error + props *pclog.ZapProperties + ) + // conf.Logger != nil means dumpling is used as a library + if conf.Logger != nil { + logger = log.NewAppLogger(conf.Logger) + } else { + logger, props, err = log.InitAppLogger(&log.Config{ + Level: conf.LogLevel, + File: conf.LogFile, + Format: conf.LogFormat, + }) + if err != nil { + return errors.Trace(err) + } + pclog.ReplaceGlobals(logger.Logger, props) + cli.LogLongVersion(logger) + } + d.tctx = d.tctx.WithLogger(logger) + return nil +} + +// createExternalStore is an initialization step of Dumper. +func createExternalStore(d *Dumper) error { + tctx, conf := d.tctx, d.conf + extStore, err := conf.createExternalStorage(tctx) + if err != nil { + return errors.Trace(err) + } + d.extStore = extStore + return nil +} + +// startHTTPService is an initialization step of Dumper. +func startHTTPService(d *Dumper) error { + conf := d.conf + if conf.StatusAddr != "" { + go func() { + err := startDumplingService(d.tctx, conf.StatusAddr) + if err != nil { + d.L().Info("meet error when stopping dumpling http service", log.ShortError(err)) + } + }() + } + return nil +} + +// openSQLDB is an initialization step of Dumper. +func openSQLDB(d *Dumper) error { + conf := d.conf + pool, err := sql.Open("mysql", conf.GetDSN("")) + if err != nil { + return errors.Trace(err) + } + d.dbHandle = pool + return nil +} + +// detectServerInfo is an initialization step of Dumper. +func detectServerInfo(d *Dumper) error { + db, conf := d.dbHandle, d.conf + versionStr, err := version.FetchVersion(d.tctx.Context, db) + if err != nil { + conf.ServerInfo = ServerInfoUnknown + return err + } + conf.ServerInfo = version.ParseServerInfo(versionStr) + return nil +} + +// resolveAutoConsistency is an initialization step of Dumper. +func resolveAutoConsistency(d *Dumper) error { + conf := d.conf + if conf.Consistency != consistencyTypeAuto { + return nil + } + switch conf.ServerInfo.ServerType { + case version.ServerTypeTiDB: + conf.Consistency = consistencyTypeSnapshot + case version.ServerTypeMySQL, version.ServerTypeMariaDB: + conf.Consistency = consistencyTypeFlush + default: + conf.Consistency = consistencyTypeNone + } + return nil +} + +func validateResolveAutoConsistency(d *Dumper) error { + conf := d.conf + if conf.Consistency != consistencyTypeSnapshot && conf.Snapshot != "" { + return errors.Errorf("can't specify --snapshot when --consistency isn't snapshot, resolved consistency: %s", conf.Consistency) + } + return nil +} + +// tidbSetPDClientForGC is an initialization step of Dumper. +func tidbSetPDClientForGC(d *Dumper) error { + tctx, si, pool := d.tctx, d.conf.ServerInfo, d.dbHandle + if si.ServerType != version.ServerTypeTiDB || + si.ServerVersion == nil || + si.ServerVersion.Compare(*gcSafePointVersion) < 0 { + return nil + } + pdAddrs, err := GetPdAddrs(tctx, pool) + if err != nil { + tctx.L().Info("meet some problem while fetching pd addrs. This won't affect dump process", log.ShortError(err)) + return nil + } + if len(pdAddrs) > 0 { + doPdGC, err := checkSameCluster(tctx, pool, pdAddrs) + if err != nil { + tctx.L().Info("meet error while check whether fetched pd addr and TiDB belong to one cluster. This won't affect dump process", log.ShortError(err), zap.Strings("pdAddrs", pdAddrs)) + } else if doPdGC { + pdClient, err := pd.NewClientWithContext(tctx, pdAddrs, pd.SecurityOption{}) + if err != nil { + tctx.L().Info("create pd client to control GC failed. This won't affect dump process", log.ShortError(err), zap.Strings("pdAddrs", pdAddrs)) + } + d.tidbPDClientForGC = pdClient + } + } + return nil +} + +// tidbGetSnapshot is an initialization step of Dumper. +func tidbGetSnapshot(d *Dumper) error { + conf, doPdGC := d.conf, d.tidbPDClientForGC != nil + consistency := conf.Consistency + pool, tctx := d.dbHandle, d.tctx + snapshotConsistency := consistency == "snapshot" + if conf.Snapshot == "" && (doPdGC || snapshotConsistency) { + conn, err := pool.Conn(tctx) + if err != nil { + tctx.L().Warn("fail to open connection to get snapshot from TiDB", log.ShortError(err)) + // for consistency snapshot, we must get a snapshot here, or we will dump inconsistent data, but for other consistency we can ignore this error. + if !snapshotConsistency { + err = nil + } + return err + } + snapshot, err := getSnapshot(conn) + _ = conn.Close() + if err != nil { + tctx.L().Warn("fail to get snapshot from TiDB", log.ShortError(err)) + // for consistency snapshot, we must get a snapshot here, or we will dump inconsistent data, but for other consistency we can ignore this error. + if !snapshotConsistency { + err = nil + } + return err + } + conf.Snapshot = snapshot + } + return nil +} + +// tidbStartGCSavepointUpdateService is an initialization step of Dumper. +func tidbStartGCSavepointUpdateService(d *Dumper) error { + tctx, pool, conf := d.tctx, d.dbHandle, d.conf + snapshot, si := conf.Snapshot, conf.ServerInfo + if d.tidbPDClientForGC != nil { + snapshotTS, err := parseSnapshotToTSO(pool, snapshot) + if err != nil { + return err + } + go updateServiceSafePoint(tctx, d.tidbPDClientForGC, defaultDumpGCSafePointTTL, snapshotTS) + } else if si.ServerType == version.ServerTypeTiDB { + tctx.L().Warn("If the amount of data to dump is large, criteria: (data more than 60GB or dumped time more than 10 minutes)\n" + + "you'd better adjust the tikv_gc_life_time to avoid export failure due to TiDB GC during the dump process.\n" + + "Before dumping: run sql `update mysql.tidb set VARIABLE_VALUE = '720h' where VARIABLE_NAME = 'tikv_gc_life_time';` in tidb.\n" + + "After dumping: run sql `update mysql.tidb set VARIABLE_VALUE = '10m' where VARIABLE_NAME = 'tikv_gc_life_time';` in tidb.\n") + } + return nil +} + +func updateServiceSafePoint(tctx *tcontext.Context, pdClient pd.Client, ttl int64, snapshotTS uint64) { + updateInterval := time.Duration(ttl/2) * time.Second + tick := time.NewTicker(updateInterval) + dumplingServiceSafePointID := fmt.Sprintf("%s_%d", dumplingServiceSafePointPrefix, time.Now().UnixNano()) + tctx.L().Info("generate dumpling gc safePoint id", zap.String("id", dumplingServiceSafePointID)) + + for { + tctx.L().Debug("update PD safePoint limit with ttl", + zap.Uint64("safePoint", snapshotTS), + zap.Int64("ttl", ttl)) + for retryCnt := 0; retryCnt <= 10; retryCnt++ { + _, err := pdClient.UpdateServiceGCSafePoint(tctx, dumplingServiceSafePointID, ttl, snapshotTS) + if err == nil { + break + } + tctx.L().Debug("update PD safePoint failed", zap.Error(err), zap.Int("retryTime", retryCnt)) + select { + case <-tctx.Done(): + return + case <-time.After(time.Second): + } + } + select { + case <-tctx.Done(): + return + case <-tick.C: + } + } +} + +// setSessionParam is an initialization step of Dumper. +func setSessionParam(d *Dumper) error { + conf, pool := d.conf, d.dbHandle + si := conf.ServerInfo + consistency, snapshot := conf.Consistency, conf.Snapshot + sessionParam := conf.SessionParams + if si.ServerType == version.ServerTypeTiDB && conf.TiDBMemQuotaQuery != UnspecifiedSize { + sessionParam[TiDBMemQuotaQueryName] = conf.TiDBMemQuotaQuery + } + var err error + if snapshot != "" { + if si.ServerType != version.ServerTypeTiDB { + return errors.New("snapshot consistency is not supported for this server") + } + if consistency == consistencyTypeSnapshot { + conf.ServerInfo.HasTiKV, err = CheckTiDBWithTiKV(pool) + if err != nil { + d.L().Info("cannot check whether TiDB has TiKV, will apply tidb_snapshot by default. This won't affect dump process", log.ShortError(err)) + } + if conf.ServerInfo.HasTiKV { + sessionParam["tidb_snapshot"] = snapshot + } + } + } + if d.dbHandle, err = resetDBWithSessionParams(d.tctx, pool, conf.GetDSN(""), conf.SessionParams); err != nil { + return errors.Trace(err) + } + return nil +} + +func (d *Dumper) renewSelectTableRegionFuncForLowerTiDB(tctx *tcontext.Context) error { + conf := d.conf + if !(conf.ServerInfo.ServerType == version.ServerTypeTiDB && conf.ServerInfo.ServerVersion != nil && conf.ServerInfo.HasTiKV && + conf.ServerInfo.ServerVersion.Compare(*decodeRegionVersion) >= 0 && + conf.ServerInfo.ServerVersion.Compare(*gcSafePointVersion) < 0) { + tctx.L().Debug("no need to build region info because database is not TiDB 3.x") + return nil + } + // for TiDB v3.0+, the original selectTiDBTableRegionFunc will always fail, + // because TiDB v3.0 doesn't have `tidb_decode_key` function nor `DB_NAME`,`TABLE_NAME` columns in `INFORMATION_SCHEMA.TIKV_REGION_STATUS`. + // reference: https://github.com/pingcap/tidb/blob/c497d5c/dumpling/export/dump.go#L775 + // To avoid this function continuously returning errors and confusing users because we fail to init this function at first, + // selectTiDBTableRegionFunc is set to always return an ignorable error at first. + d.selectTiDBTableRegionFunc = func(_ *tcontext.Context, _ *sql.Conn, meta TableMeta) (pkFields []string, pkVals [][]string, err error) { + return nil, nil, errors.Annotatef(emptyHandleValsErr, "table: `%s`.`%s`", escapeString(meta.DatabaseName()), escapeString(meta.TableName())) + } + dbHandle, err := openDBFunc("mysql", conf.GetDSN("")) + if err != nil { + return errors.Trace(err) + } + defer dbHandle.Close() + conn, err := dbHandle.Conn(tctx) + if err != nil { + return errors.Trace(err) + } + defer conn.Close() + dbInfos, err := GetDBInfo(conn, DatabaseTablesToMap(conf.Tables)) + if err != nil { + return errors.Trace(err) + } + regionsInfo, err := GetRegionInfos(conn) + if err != nil { + return errors.Trace(err) + } + tikvHelper := &helper.Helper{} + tableInfos := tikvHelper.GetRegionsTableInfo(regionsInfo, dbInfos) + + tableInfoMap := make(map[string]map[string][]int64, len(conf.Tables)) + for _, region := range regionsInfo.Regions { + tableList := tableInfos[region.ID] + for _, table := range tableList { + db, tbl := table.DB.Name.O, table.Table.Name.O + if _, ok := tableInfoMap[db]; !ok { + tableInfoMap[db] = make(map[string][]int64, len(conf.Tables[db])) + } + + key, err := hex.DecodeString(region.StartKey) + if err != nil { + d.L().Debug("invalid region start key", zap.Error(err), zap.String("key", region.StartKey)) + continue + } + // Auto decode byte if needed. + _, bs, err := codec.DecodeBytes(key, nil) + if err == nil { + key = bs + } + // Try to decode it as a record key. + tableID, handle, err := tablecodec.DecodeRecordKey(key) + if err != nil { + d.L().Debug("cannot decode region start key", zap.Error(err), zap.String("key", region.StartKey), zap.Int64("tableID", tableID)) + continue + } + if handle.IsInt() { + tableInfoMap[db][tbl] = append(tableInfoMap[db][tbl], handle.IntValue()) + } else { + d.L().Debug("not an int handle", zap.Error(err), zap.Stringer("handle", handle)) + } + } + } + for _, tbInfos := range tableInfoMap { + for _, tbInfoLoop := range tbInfos { + // make sure tbInfo is only used in this loop + tbInfo := tbInfoLoop + sort.Slice(tbInfo, func(i, j int) bool { + return tbInfo[i] < tbInfo[j] + }) + } + } + + d.selectTiDBTableRegionFunc = func(tctx *tcontext.Context, conn *sql.Conn, meta TableMeta) (pkFields []string, pkVals [][]string, err error) { + pkFields, _, err = selectTiDBRowKeyFields(conn, meta, checkTiDBTableRegionPkFields) + if err != nil { + return + } + dbName, tableName := meta.DatabaseName(), meta.TableName() + if tbInfos, ok := tableInfoMap[dbName]; ok { + if tbInfo, ok := tbInfos[tableName]; ok { + pkVals = make([][]string, len(tbInfo)) + for i, val := range tbInfo { + pkVals[i] = []string{strconv.FormatInt(val, 10)} + } + } + } + return + } + + return nil +} diff --git a/dumpling/export/dump_test.go b/dumpling/export/dump_test.go new file mode 100644 index 0000000000000..0673e0588f3be --- /dev/null +++ b/dumpling/export/dump_test.go @@ -0,0 +1,190 @@ +// Copyright 2021 PingCAP, Inc. Licensed under Apache-2.0. + +package export + +import ( + "context" + "fmt" + "testing" + "time" + + "github.com/DATA-DOG/go-sqlmock" + "github.com/pingcap/errors" + "github.com/stretchr/testify/require" + "golang.org/x/sync/errgroup" + + "github.com/pingcap/tidb/br/pkg/version" + tcontext "github.com/pingcap/tidb/dumpling/context" + "github.com/pingcap/tidb/parser" +) + +func TestDumpBlock(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + + mock.ExpectQuery(fmt.Sprintf("SHOW CREATE DATABASE `%s`", escapeString(database))). + WillReturnRows(sqlmock.NewRows([]string{"Database", "Create Database"}). + AddRow("test", "CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8mb4 */")) + mock.ExpectQuery(fmt.Sprintf("SELECT DEFAULT_COLLATION_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '%s'", escapeString(database))). + WillReturnRows(sqlmock.NewRows([]string{"DEFAULT_COLLATION_NAME"}). + AddRow("utf8mb4_bin")) + + tctx, cancel := tcontext.Background().WithLogger(appLogger).WithCancel() + defer cancel() + conn, err := db.Conn(tctx) + require.NoError(t, err) + + d := &Dumper{ + tctx: tctx, + conf: DefaultConfig(), + cancelCtx: cancel, + } + wg, writingCtx := errgroup.WithContext(tctx) + writerErr := errors.New("writer error") + + wg.Go(func() error { + return errors.Trace(writerErr) + }) + wg.Go(func() error { + time.Sleep(time.Second) + return context.Canceled + }) + writerCtx := tctx.WithContext(writingCtx) + // simulate taskChan is full + taskChan := make(chan Task, 1) + taskChan <- &TaskDatabaseMeta{} + d.conf.Tables = DatabaseTables{}.AppendTable(database, nil) + d.conf.ServerInfo.ServerType = version.ServerTypeMySQL + require.ErrorIs(t, d.dumpDatabases(writerCtx, conn, taskChan), context.Canceled) + require.ErrorIs(t, wg.Wait(), writerErr) +} + +func TestDumpTableMeta(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + + tctx, cancel := tcontext.Background().WithLogger(appLogger).WithCancel() + defer cancel() + conn, err := db.Conn(tctx) + require.NoError(t, err) + + conf := DefaultConfig() + conf.NoSchemas = true + + for serverType := version.ServerTypeUnknown; serverType < version.ServerTypeAll; serverType++ { + conf.ServerInfo.ServerType = version.ServerType(serverType) + hasImplicitRowID := false + mock.ExpectQuery("SHOW COLUMNS FROM"). + WillReturnRows(sqlmock.NewRows([]string{"Field", "Type", "Null", "Key", "Default", "Extra"}). + AddRow("id", "int(11)", "NO", "PRI", nil, "")) + if serverType == version.ServerTypeTiDB { + mock.ExpectExec("SELECT _tidb_rowid from"). + WillReturnResult(sqlmock.NewResult(0, 0)) + hasImplicitRowID = true + } + mock.ExpectQuery(fmt.Sprintf("SELECT \\* FROM `%s`.`%s`", database, table)). + WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(1)) + meta, err := dumpTableMeta(conf, conn, database, &TableInfo{Type: TableTypeBase, Name: table}) + require.NoError(t, err) + require.Equal(t, database, meta.DatabaseName()) + require.Equal(t, table, meta.TableName()) + require.Equal(t, "*", meta.SelectedField()) + require.Equal(t, 1, meta.SelectedLen()) + require.Equal(t, "", meta.ShowCreateTable()) + require.Equal(t, hasImplicitRowID, meta.HasImplicitRowID()) + } +} + +func TestGetListTableTypeByConf(t *testing.T) { + conf := defaultConfigForTest(t) + cases := []struct { + serverInfo version.ServerInfo + consistency string + expected listTableType + }{ + {version.ParseServerInfo("5.7.25-TiDB-3.0.6"), consistencyTypeSnapshot, listTableByShowTableStatus}, + // no bug version + {version.ParseServerInfo("8.0.2"), consistencyTypeLock, listTableByInfoSchema}, + {version.ParseServerInfo("8.0.2"), consistencyTypeFlush, listTableByShowTableStatus}, + {version.ParseServerInfo("8.0.23"), consistencyTypeNone, listTableByShowTableStatus}, + + // bug version + {version.ParseServerInfo("8.0.3"), consistencyTypeLock, listTableByInfoSchema}, + {version.ParseServerInfo("8.0.3"), consistencyTypeFlush, listTableByShowFullTables}, + {version.ParseServerInfo("8.0.3"), consistencyTypeNone, listTableByShowTableStatus}, + } + + for _, x := range cases { + conf.Consistency = x.consistency + conf.ServerInfo = x.serverInfo + require.Equalf(t, x.expected, getListTableTypeByConf(conf), "server info: %s, consistency: %s", x.serverInfo, x.consistency) + } +} + +func TestAdjustDatabaseCollation(t *testing.T) { + tctx, cancel := tcontext.Background().WithLogger(appLogger).WithCancel() + defer cancel() + parser1 := parser.New() + + originSQLs := []string{ + "create database `test` CHARACTER SET=utf8mb4 COLLATE=utf8mb4_general_ci", + "create database `test` CHARACTER SET=utf8mb4", + } + + expectedSQLs := []string{ + "create database `test` CHARACTER SET=utf8mb4 COLLATE=utf8mb4_general_ci", + "CREATE DATABASE `test` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci", + } + charsetAndDefaultCollationMap := map[string]string{"utf8mb4": "utf8mb4_general_ci"} + for i, originSQL := range originSQLs { + newSQL, err := adjustDatabaseCollation(tctx, parser1, originSQL, charsetAndDefaultCollationMap) + require.NoError(t, err) + require.Equal(t, expectedSQLs[i], newSQL) + } +} + +func TestAdjustTableCollation(t *testing.T) { + tctx, cancel := tcontext.Background().WithLogger(appLogger).WithCancel() + defer cancel() + + parser1 := parser.New() + + originSQLs := []string{ + "create table `test`.`t1` (id int) CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci", + "create table `test`.`t1` (id int) CHARSET=utf8mb4", + "create table `test`.`t1` (id int, name varchar(20) CHARACTER SET utf8mb4, work varchar(20)) CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ", + "create table `test`.`t1` (id int, name varchar(20), work varchar(20)) CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci", + "create table `test`.`t1` (id int, name varchar(20) COLLATE utf8mb4_general_ci, work varchar(20)) CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci", + "create table `test`.`t1` (id int, name varchar(20) COLLATE utf8mb4_general_ci, work varchar(20) CHARACTER SET utf8mb4) CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci", + "create table `test`.`t1` (id int, name varchar(20) CHARACTER SET utf8mb4, work varchar(20)) CHARSET=utf8mb4 ", + "create table `test`.`t1` (id int, name varchar(20), work varchar(20)) CHARSET=utf8mb4", + "create table `test`.`t1` (id int, name varchar(20) COLLATE utf8mb4_general_ci, work varchar(20)) CHARSET=utf8mb4", + "create table `test`.`t1` (id int, name varchar(20) COLLATE utf8mb4_general_ci, work varchar(20) CHARACTER SET utf8mb4) CHARSET=utf8mb4", + } + + expectedSQLs := []string{ + "CREATE TABLE `test`.`t1` (`id` INT) DEFAULT CHARACTER SET = UTF8MB4 DEFAULT COLLATE = UTF8MB4_GENERAL_CI", + "CREATE TABLE `test`.`t1` (`id` INT) DEFAULT CHARACTER SET = UTF8MB4 DEFAULT COLLATE = UTF8MB4_GENERAL_CI", + "CREATE TABLE `test`.`t1` (`id` INT,`name` VARCHAR(20) CHARACTER SET UTF8MB4 COLLATE utf8mb4_general_ci,`work` VARCHAR(20)) DEFAULT CHARACTER SET = UTF8MB4 DEFAULT COLLATE = UTF8MB4_GENERAL_CI", + "CREATE TABLE `test`.`t1` (`id` INT,`name` VARCHAR(20),`work` VARCHAR(20)) DEFAULT CHARACTER SET = UTF8MB4 DEFAULT COLLATE = UTF8MB4_GENERAL_CI", + "CREATE TABLE `test`.`t1` (`id` INT,`name` VARCHAR(20) COLLATE utf8mb4_general_ci,`work` VARCHAR(20)) DEFAULT CHARACTER SET = UTF8MB4 DEFAULT COLLATE = UTF8MB4_GENERAL_CI", + "CREATE TABLE `test`.`t1` (`id` INT,`name` VARCHAR(20) COLLATE utf8mb4_general_ci,`work` VARCHAR(20) CHARACTER SET UTF8MB4 COLLATE utf8mb4_general_ci) DEFAULT CHARACTER SET = UTF8MB4 DEFAULT COLLATE = UTF8MB4_GENERAL_CI", + "CREATE TABLE `test`.`t1` (`id` INT,`name` VARCHAR(20) CHARACTER SET UTF8MB4 COLLATE utf8mb4_general_ci,`work` VARCHAR(20)) DEFAULT CHARACTER SET = UTF8MB4 DEFAULT COLLATE = UTF8MB4_GENERAL_CI", + "CREATE TABLE `test`.`t1` (`id` INT,`name` VARCHAR(20),`work` VARCHAR(20)) DEFAULT CHARACTER SET = UTF8MB4 DEFAULT COLLATE = UTF8MB4_GENERAL_CI", + "CREATE TABLE `test`.`t1` (`id` INT,`name` VARCHAR(20) COLLATE utf8mb4_general_ci,`work` VARCHAR(20)) DEFAULT CHARACTER SET = UTF8MB4 DEFAULT COLLATE = UTF8MB4_GENERAL_CI", + "CREATE TABLE `test`.`t1` (`id` INT,`name` VARCHAR(20) COLLATE utf8mb4_general_ci,`work` VARCHAR(20) CHARACTER SET UTF8MB4 COLLATE utf8mb4_general_ci) DEFAULT CHARACTER SET = UTF8MB4 DEFAULT COLLATE = UTF8MB4_GENERAL_CI", + } + + charsetAndDefaultCollationMap := map[string]string{"utf8mb4": "utf8mb4_general_ci"} + for i, originSQL := range originSQLs { + newSQL, err := adjustTableCollation(tctx, parser1, originSQL, charsetAndDefaultCollationMap) + require.NoError(t, err) + require.Equal(t, expectedSQLs[i], newSQL) + } +} diff --git a/dumpling/export/http_handler.go b/dumpling/export/http_handler.go new file mode 100644 index 0000000000000..91332736f17f2 --- /dev/null +++ b/dumpling/export/http_handler.go @@ -0,0 +1,70 @@ +// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +package export + +import ( + "net" + "net/http" + "net/http/pprof" + "strings" + "time" + + "github.com/pingcap/errors" + "github.com/prometheus/client_golang/prometheus/promhttp" + "github.com/soheilhy/cmux" + + tcontext "github.com/pingcap/tidb/dumpling/context" + "github.com/pingcap/tidb/dumpling/log" +) + +var cmuxReadTimeout = 10 * time.Second + +func startHTTPServer(tctx *tcontext.Context, lis net.Listener) { + router := http.NewServeMux() + router.Handle("/metrics", promhttp.Handler()) + + router.HandleFunc("/debug/pprof/", pprof.Index) + router.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline) + router.HandleFunc("/debug/pprof/profile", pprof.Profile) + router.HandleFunc("/debug/pprof/symbol", pprof.Symbol) + router.HandleFunc("/debug/pprof/trace", pprof.Trace) + + httpServer := &http.Server{ + Handler: router, + } + err := httpServer.Serve(lis) + err = errors.Cause(err) + if err != nil && !isErrNetClosing(err) && err != http.ErrServerClosed { + tctx.L().Info("dumpling http handler return with error", log.ShortError(err)) + } +} + +func startDumplingService(tctx *tcontext.Context, addr string) error { + rootLis, err := net.Listen("tcp", addr) + if err != nil { + return errors.Annotate(err, "start listening") + } + + // create a cmux + m := cmux.New(rootLis) + m.SetReadTimeout(cmuxReadTimeout) // set a timeout, ref: https://github.com/pingcap/tidb-binlog/pull/352 + + httpL := m.Match(cmux.HTTP1Fast()) + go startHTTPServer(tctx, httpL) + + err = m.Serve() // start serving, block + if err != nil && isErrNetClosing(err) { + err = nil + } + return err +} + +var useOfClosedErrMsg = "use of closed network connection" + +// isErrNetClosing checks whether is an ErrNetClosing error +func isErrNetClosing(err error) bool { + if err == nil { + return false + } + return strings.Contains(err.Error(), useOfClosedErrMsg) +} diff --git a/dumpling/export/ir.go b/dumpling/export/ir.go new file mode 100644 index 0000000000000..b74d7dc1dfef3 --- /dev/null +++ b/dumpling/export/ir.go @@ -0,0 +1,107 @@ +// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +package export + +import ( + "bytes" + "database/sql" + "strings" + + "github.com/pingcap/errors" + + tcontext "github.com/pingcap/tidb/dumpling/context" +) + +// TableDataIR is table data intermediate representation. +// A table may be split into multiple TableDataIRs. +type TableDataIR interface { + Start(*tcontext.Context, *sql.Conn) error + Rows() SQLRowIter + Close() error + RawRows() *sql.Rows +} + +// TableMeta contains the meta information of a table. +type TableMeta interface { + DatabaseName() string + TableName() string + ColumnCount() uint + ColumnTypes() []string + ColumnNames() []string + SelectedField() string + SelectedLen() int + SpecialComments() StringIter + ShowCreateTable() string + ShowCreateView() string + AvgRowLength() uint64 + HasImplicitRowID() bool +} + +// SQLRowIter is the iterator on a collection of sql.Row. +type SQLRowIter interface { + Decode(RowReceiver) error + Next() + Error() error + HasNext() bool + // release SQLRowIter + Close() error +} + +// RowReceiverStringer is a combined interface of RowReceiver and Stringer +type RowReceiverStringer interface { + RowReceiver + Stringer +} + +// Stringer is an interface which represents sql types that support writing to buffer in sql/csv type +type Stringer interface { + WriteToBuffer(*bytes.Buffer, bool) + WriteToBufferInCsv(*bytes.Buffer, bool, *csvOption) +} + +// RowReceiver is an interface which represents sql types that support bind address for *sql.Rows +type RowReceiver interface { + BindAddress([]interface{}) +} + +func decodeFromRows(rows *sql.Rows, args []interface{}, row RowReceiver) error { + row.BindAddress(args) + if err := rows.Scan(args...); err != nil { + rows.Close() + return errors.Trace(err) + } + return nil +} + +// StringIter is the iterator on a collection of strings. +type StringIter interface { + Next() string + HasNext() bool +} + +// MetaIR is the interface that wraps database/table/view's metadata +type MetaIR interface { + SpecialComments() StringIter + TargetName() string + MetaSQL() string +} + +func setTableMetaFromRows(rows *sql.Rows) (TableMeta, error) { + tps, err := rows.ColumnTypes() + if err != nil { + return nil, errors.Trace(err) + } + nms, err := rows.Columns() + if err != nil { + return nil, errors.Trace(err) + } + for i := range nms { + nms[i] = wrapBackTicks(nms[i]) + } + return &tableMeta{ + colTypes: tps, + selectedField: strings.Join(nms, ","), + selectedLen: len(nms), + specCmts: []string{"/*!40101 SET NAMES binary*/;"}, + }, nil +} diff --git a/dumpling/export/ir_impl.go b/dumpling/export/ir_impl.go new file mode 100644 index 0000000000000..cd8272c3772a6 --- /dev/null +++ b/dumpling/export/ir_impl.go @@ -0,0 +1,375 @@ +// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +package export + +import ( + "database/sql" + "strings" + + "github.com/pingcap/errors" + "go.uber.org/zap" + + tcontext "github.com/pingcap/tidb/dumpling/context" +) + +// rowIter implements the SQLRowIter interface. +// Note: To create a rowIter, please use `newRowIter()` instead of struct literal. +type rowIter struct { + rows *sql.Rows + hasNext bool + args []interface{} +} + +func newRowIter(rows *sql.Rows, argLen int) *rowIter { + r := &rowIter{ + rows: rows, + hasNext: false, + args: make([]interface{}, argLen), + } + r.hasNext = r.rows.Next() + return r +} + +func (iter *rowIter) Close() error { + return iter.rows.Close() +} + +func (iter *rowIter) Decode(row RowReceiver) error { + return decodeFromRows(iter.rows, iter.args, row) +} + +func (iter *rowIter) Error() error { + return errors.Trace(iter.rows.Err()) +} + +func (iter *rowIter) Next() { + iter.hasNext = iter.rows.Next() +} + +func (iter *rowIter) HasNext() bool { + return iter.hasNext +} + +// multiQueriesChunkIter implements the SQLRowIter interface. +// Note: To create a rowIter, please use `newRowIter()` instead of struct literal. +type multiQueriesChunkIter struct { + tctx *tcontext.Context + conn *sql.Conn + rows *sql.Rows + hasNext bool + id int + queries []string + args []interface{} + err error +} + +func newMultiQueryChunkIter(tctx *tcontext.Context, conn *sql.Conn, queries []string, argLen int) *multiQueriesChunkIter { + r := &multiQueriesChunkIter{ + tctx: tctx, + conn: conn, + queries: queries, + id: 0, + args: make([]interface{}, argLen), + } + r.nextRows() + return r +} + +func (iter *multiQueriesChunkIter) nextRows() { + if iter.id >= len(iter.queries) { + iter.hasNext = false + return + } + var err error + defer func() { + if err != nil { + iter.hasNext = false + iter.err = errors.Trace(err) + } + }() + tctx, conn := iter.tctx, iter.conn + // avoid the empty chunk + for iter.id < len(iter.queries) { + rows := iter.rows + if rows != nil { + err = rows.Close() + if err != nil { + return + } + err = rows.Err() + if err != nil { + return + } + } + tctx.L().Debug("try to start nextRows", zap.String("query", iter.queries[iter.id])) + rows, err = conn.QueryContext(tctx, iter.queries[iter.id]) + if err != nil { + return + } + if err = rows.Err(); err != nil { + return + } + iter.id++ + iter.rows = rows + iter.hasNext = iter.rows.Next() + if iter.hasNext { + return + } + } +} + +func (iter *multiQueriesChunkIter) Close() error { + if iter.err != nil { + return iter.err + } + if iter.rows != nil { + return iter.rows.Close() + } + return nil +} + +func (iter *multiQueriesChunkIter) Decode(row RowReceiver) error { + if iter.err != nil { + return iter.err + } + if iter.rows == nil { + return errors.Errorf("no valid rows found, id: %d", iter.id) + } + return decodeFromRows(iter.rows, iter.args, row) +} + +func (iter *multiQueriesChunkIter) Error() error { + if iter.err != nil { + return iter.err + } + if iter.rows != nil { + return errors.Trace(iter.rows.Err()) + } + return nil +} + +func (iter *multiQueriesChunkIter) Next() { + if iter.err == nil { + iter.hasNext = iter.rows.Next() + if !iter.hasNext { + iter.nextRows() + } + } +} + +func (iter *multiQueriesChunkIter) HasNext() bool { + return iter.hasNext +} + +type stringIter struct { + idx int + ss []string +} + +func newStringIter(ss ...string) StringIter { + return &stringIter{ + idx: 0, + ss: ss, + } +} + +func (m *stringIter) Next() string { + if m.idx >= len(m.ss) { + return "" + } + ret := m.ss[m.idx] + m.idx++ + return ret +} + +func (m *stringIter) HasNext() bool { + return m.idx < len(m.ss) +} + +type tableData struct { + query string + rows *sql.Rows + colLen int + needColTypes bool + colTypes []string + SQLRowIter +} + +func newTableData(query string, colLength int, needColTypes bool) *tableData { + return &tableData{ + query: query, + colLen: colLength, + needColTypes: needColTypes, + } +} + +func (td *tableData) Start(tctx *tcontext.Context, conn *sql.Conn) error { + tctx.L().Debug("try to start tableData", zap.String("query", td.query)) + rows, err := conn.QueryContext(tctx, td.query) + if err != nil { + return errors.Annotatef(err, "sql: %s", td.query) + } + if err = rows.Err(); err != nil { + return errors.Annotatef(err, "sql: %s", td.query) + } + td.SQLRowIter = nil + td.rows = rows + if td.needColTypes { + ns, err := rows.Columns() + if err != nil { + return errors.Trace(err) + } + td.colLen = len(ns) + td.colTypes = make([]string, 0, td.colLen) + colTps, err := rows.ColumnTypes() + if err != nil { + return errors.Trace(err) + } + for _, c := range colTps { + td.colTypes = append(td.colTypes, c.DatabaseTypeName()) + } + } + + return nil +} + +func (td *tableData) Rows() SQLRowIter { + if td.SQLRowIter == nil { + td.SQLRowIter = newRowIter(td.rows, td.colLen) + } + return td.SQLRowIter +} + +func (td *tableData) Close() error { + return td.SQLRowIter.Close() +} + +func (td *tableData) RawRows() *sql.Rows { + return td.rows +} + +type tableMeta struct { + database string + table string + colTypes []*sql.ColumnType + selectedField string + selectedLen int + specCmts []string + showCreateTable string + showCreateView string + avgRowLength uint64 + hasImplicitRowID bool +} + +func (tm *tableMeta) ColumnTypes() []string { + colTypes := make([]string, len(tm.colTypes)) + for i, ct := range tm.colTypes { + colTypes[i] = ct.DatabaseTypeName() + } + return colTypes +} + +func (tm *tableMeta) ColumnNames() []string { + colNames := make([]string, len(tm.colTypes)) + for i, ct := range tm.colTypes { + colNames[i] = ct.Name() + } + return colNames +} + +func (tm *tableMeta) DatabaseName() string { + return tm.database +} + +func (tm *tableMeta) TableName() string { + return tm.table +} + +func (tm *tableMeta) ColumnCount() uint { + return uint(len(tm.colTypes)) +} + +func (tm *tableMeta) SelectedField() string { + return tm.selectedField +} + +func (tm *tableMeta) SelectedLen() int { + return tm.selectedLen +} + +func (tm *tableMeta) SpecialComments() StringIter { + return newStringIter(tm.specCmts...) +} + +func (tm *tableMeta) ShowCreateTable() string { + return tm.showCreateTable +} + +func (tm *tableMeta) ShowCreateView() string { + return tm.showCreateView +} + +func (tm *tableMeta) AvgRowLength() uint64 { + return tm.avgRowLength +} + +func (tm *tableMeta) HasImplicitRowID() bool { + return tm.hasImplicitRowID +} + +type metaData struct { + target string + metaSQL string + specCmts []string +} + +func (m *metaData) SpecialComments() StringIter { + return newStringIter(m.specCmts...) +} + +func (m *metaData) TargetName() string { + return m.target +} + +func (m *metaData) MetaSQL() string { + if !strings.HasSuffix(m.metaSQL, ";\n") { + m.metaSQL += ";\n" + } + return m.metaSQL +} + +type multiQueriesChunk struct { + tctx *tcontext.Context + conn *sql.Conn + queries []string + colLen int + SQLRowIter +} + +func newMultiQueriesChunk(queries []string, colLength int) *multiQueriesChunk { + return &multiQueriesChunk{ + queries: queries, + colLen: colLength, + } +} + +func (td *multiQueriesChunk) Start(tctx *tcontext.Context, conn *sql.Conn) error { + td.tctx = tctx + td.conn = conn + return nil +} + +func (td *multiQueriesChunk) Rows() SQLRowIter { + if td.SQLRowIter == nil { + td.SQLRowIter = newMultiQueryChunkIter(td.tctx, td.conn, td.queries, td.colLen) + } + return td.SQLRowIter +} + +func (td *multiQueriesChunk) Close() error { + return td.SQLRowIter.Close() +} + +func (td *multiQueriesChunk) RawRows() *sql.Rows { + return nil +} diff --git a/dumpling/export/ir_impl_test.go b/dumpling/export/ir_impl_test.go new file mode 100644 index 0000000000000..2f8681b3c1363 --- /dev/null +++ b/dumpling/export/ir_impl_test.go @@ -0,0 +1,128 @@ +// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +package export + +import ( + "strings" + "testing" + + "github.com/DATA-DOG/go-sqlmock" + "github.com/stretchr/testify/require" +) + +type simpleRowReceiver struct { + data []string +} + +func newSimpleRowReceiver(length int) *simpleRowReceiver { + return &simpleRowReceiver{data: make([]string, length)} +} + +func (s *simpleRowReceiver) BindAddress(args []interface{}) { + for i := range args { + args[i] = &s.data[i] + } +} + +func TestRowIter(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + _ = db.Close() + }() + + expectedRows := mock.NewRows([]string{"id"}). + AddRow("1"). + AddRow("2"). + AddRow("3") + mock.ExpectQuery("SELECT id from t").WillReturnRows(expectedRows) + rows, err := db.Query("SELECT id from t") + require.NoError(t, err) + + iter := newRowIter(rows, 1) + for i := 0; i < 100; i++ { + require.True(t, iter.HasNext()) + } + + res := newSimpleRowReceiver(1) + require.NoError(t, iter.Decode(res)) + require.Equal(t, []string{"1"}, res.data) + + iter.Next() + require.True(t, iter.HasNext()) + require.True(t, iter.HasNext()) + require.NoError(t, iter.Decode(res)) + require.Equal(t, []string{"2"}, res.data) + + iter.Next() + require.True(t, iter.HasNext()) + require.NoError(t, iter.Decode(res)) + + iter.Next() + require.Equal(t, []string{"3"}, res.data) + require.False(t, iter.HasNext()) +} + +func TestChunkRowIter(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + _ = db.Close() + }() + + twentyBytes := strings.Repeat("x", 20) + thirtyBytes := strings.Repeat("x", 30) + expectedRows := mock.NewRows([]string{"a", "b"}) + for i := 0; i < 10; i++ { + expectedRows.AddRow(twentyBytes, thirtyBytes) + } + mock.ExpectQuery("SELECT a, b FROM t").WillReturnRows(expectedRows) + rows, err := db.Query("SELECT a, b FROM t") + require.NoError(t, err) + defer func() { + require.NoError(t, rows.Close()) + }() + + var ( + testFileSize uint64 = 200 + testStatementSize uint64 = 101 + + expectedSize = [][]uint64{ + {50, 50}, + {100, 100}, + {150, 150}, + {200, 50}, + } + ) + + sqlRowIter := newRowIter(rows, 2) + + res := newSimpleRowReceiver(2) + wp := newWriterPipe(nil, testFileSize, testStatementSize, nil) + + var resSize [][]uint64 + for sqlRowIter.HasNext() { + wp.currentStatementSize = 0 + for sqlRowIter.HasNext() { + require.NoError(t, sqlRowIter.Decode(res)) + sz := uint64(len(res.data[0]) + len(res.data[1])) + wp.AddFileSize(sz) + sqlRowIter.Next() + resSize = append(resSize, []uint64{wp.currentFileSize, wp.currentStatementSize}) + if wp.ShouldSwitchStatement() { + break + } + } + if wp.ShouldSwitchFile() { + break + } + } + + require.Equal(t, expectedSize, resSize) + require.True(t, sqlRowIter.HasNext()) + require.True(t, wp.ShouldSwitchFile()) + require.True(t, wp.ShouldSwitchStatement()) + require.NoError(t, rows.Close()) + require.Error(t, sqlRowIter.Decode(res)) + sqlRowIter.Next() +} diff --git a/dumpling/export/main_test.go b/dumpling/export/main_test.go new file mode 100644 index 0000000000000..8ea24d1c51e82 --- /dev/null +++ b/dumpling/export/main_test.go @@ -0,0 +1,62 @@ +// Copyright 2021 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, +// 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. + +package export + +import ( + "fmt" + "os" + "testing" + + "github.com/prometheus/client_golang/prometheus" + "github.com/stretchr/testify/require" + "go.uber.org/goleak" + + "github.com/pingcap/tidb/dumpling/log" +) + +var appLogger log.Logger + +func TestMain(m *testing.M) { + initColTypeRowReceiverMap() + + logger, _, err := log.InitAppLogger(&log.Config{ + Level: "debug", + File: "", + Format: "text", + }) + + if err != nil { + _, _ = fmt.Fprintf(os.Stderr, "fail to init logger: %v\n", err) + os.Exit(1) + } + + appLogger = logger + registry := prometheus.NewRegistry() + registry.MustRegister(prometheus.NewProcessCollector(prometheus.ProcessCollectorOpts{})) + registry.MustRegister(prometheus.NewGoCollector()) + RegisterMetrics(registry) + + opts := []goleak.Option{ + goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + } + + goleak.VerifyTestMain(m, opts...) +} + +func defaultConfigForTest(t *testing.T) *Config { + config := DefaultConfig() + require.NoError(t, adjustFileFormat(config)) + return config +} diff --git a/dumpling/export/metadata.go b/dumpling/export/metadata.go new file mode 100644 index 0000000000000..d4ffa3c7aa3d2 --- /dev/null +++ b/dumpling/export/metadata.go @@ -0,0 +1,233 @@ +// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +package export + +import ( + "bytes" + "context" + "database/sql" + "fmt" + "strings" + "time" + + "github.com/pingcap/errors" + "go.uber.org/zap" + + "github.com/pingcap/tidb/br/pkg/storage" + "github.com/pingcap/tidb/br/pkg/version" + tcontext "github.com/pingcap/tidb/dumpling/context" +) + +type globalMetadata struct { + tctx *tcontext.Context + buffer bytes.Buffer + afterConnBuffer bytes.Buffer + snapshot string + + storage storage.ExternalStorage +} + +const ( + metadataPath = "metadata" + metadataTimeLayout = "2006-01-02 15:04:05" + + fileFieldIndex = 0 + posFieldIndex = 1 + gtidSetFieldIndex = 4 +) + +func newGlobalMetadata(tctx *tcontext.Context, s storage.ExternalStorage, snapshot string) *globalMetadata { + return &globalMetadata{ + tctx: tctx, + storage: s, + buffer: bytes.Buffer{}, + snapshot: snapshot, + } +} + +func (m globalMetadata) String() string { + return m.buffer.String() +} + +func (m *globalMetadata) recordStartTime(t time.Time) { + m.buffer.WriteString("Started dump at: " + t.Format(metadataTimeLayout) + "\n") +} + +func (m *globalMetadata) recordFinishTime(t time.Time) { + m.buffer.Write(m.afterConnBuffer.Bytes()) + m.buffer.WriteString("Finished dump at: " + t.Format(metadataTimeLayout) + "\n") +} + +func (m *globalMetadata) recordGlobalMetaData(db *sql.Conn, serverType version.ServerType, afterConn bool) error { // revive:disable-line:flag-parameter + if afterConn { + m.afterConnBuffer.Reset() + return recordGlobalMetaData(m.tctx, db, &m.afterConnBuffer, serverType, afterConn, m.snapshot) + } + return recordGlobalMetaData(m.tctx, db, &m.buffer, serverType, afterConn, m.snapshot) +} + +func recordGlobalMetaData(tctx *tcontext.Context, db *sql.Conn, buffer *bytes.Buffer, serverType version.ServerType, afterConn bool, snapshot string) error { // revive:disable-line:flag-parameter + writeMasterStatusHeader := func() { + buffer.WriteString("SHOW MASTER STATUS:") + if afterConn { + buffer.WriteString(" /* AFTER CONNECTION POOL ESTABLISHED */") + } + buffer.WriteString("\n") + } + + switch serverType { + // For MySQL: + // mysql 5.6+ + // mysql> SHOW MASTER STATUS; + // +-----------+----------+--------------+------------------+-------------------------------------------+ + // | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | + // +-----------+----------+--------------+------------------+-------------------------------------------+ + // | ON.000001 | 7502 | | | 6ce40be3-e359-11e9-87e0-36933cb0ca5a:1-29 | + // +-----------+----------+--------------+------------------+-------------------------------------------+ + // 1 row in set (0.00 sec) + // mysql 5.5- doesn't have column Executed_Gtid_Set + // + // For TiDB: + // mysql> SHOW MASTER STATUS; + // +-------------+--------------------+--------------+------------------+-------------------+ + // | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | + // +-------------+--------------------+--------------+------------------+-------------------+ + // | tidb-binlog | 415195906970746880 | | | | + // +-------------+--------------------+--------------+------------------+-------------------+ + // 1 row in set (0.00 sec) + case version.ServerTypeMySQL, version.ServerTypeTiDB: + str, err := ShowMasterStatus(db) + if err != nil { + return err + } + logFile := getValidStr(str, fileFieldIndex) + var pos string + if serverType == version.ServerTypeTiDB && snapshot != "" { + pos = snapshot + } else { + pos = getValidStr(str, posFieldIndex) + } + gtidSet := getValidStr(str, gtidSetFieldIndex) + + if logFile != "" { + writeMasterStatusHeader() + fmt.Fprintf(buffer, "\tLog: %s\n\tPos: %s\n\tGTID:%s\n", logFile, pos, gtidSet) + } + // For MariaDB: + // SHOW MASTER STATUS; + // +--------------------+----------+--------------+------------------+ + // | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | + // +--------------------+----------+--------------+------------------+ + // | mariadb-bin.000016 | 475 | | | + // +--------------------+----------+--------------+------------------+ + // SELECT @@global.gtid_binlog_pos; + // +--------------------------+ + // | @@global.gtid_binlog_pos | + // +--------------------------+ + // | 0-1-2 | + // +--------------------------+ + // 1 row in set (0.00 sec) + case version.ServerTypeMariaDB: + str, err := ShowMasterStatus(db) + if err != nil { + return err + } + logFile := getValidStr(str, fileFieldIndex) + pos := getValidStr(str, posFieldIndex) + var gtidSet string + err = db.QueryRowContext(context.Background(), "SELECT @@global.gtid_binlog_pos").Scan(>idSet) + if err != nil { + tctx.L().Warn("fail to get gtid for mariaDB", zap.Error(err)) + } + + if logFile != "" { + writeMasterStatusHeader() + fmt.Fprintf(buffer, "\tLog: %s\n\tPos: %s\n\tGTID:%s\n", logFile, pos, gtidSet) + } + default: + return errors.Errorf("unsupported serverType %s for recordGlobalMetaData", serverType.String()) + } + buffer.WriteString("\n") + if serverType == version.ServerTypeTiDB { + return nil + } + + // omit follower status if called after connection pool established + if afterConn { + return nil + } + // get follower status info + var ( + isms bool + query string + ) + if err := simpleQuery(db, "SELECT @@default_master_connection", func(rows *sql.Rows) error { + isms = true + return nil + }); err != nil { + isms = false + } + if isms { + query = "SHOW ALL SLAVES STATUS" + } else { + query = "SHOW SLAVE STATUS" + } + return simpleQuery(db, query, func(rows *sql.Rows) error { + cols, err := rows.Columns() + if err != nil { + return errors.Trace(err) + } + data := make([]sql.NullString, len(cols)) + args := make([]interface{}, 0, len(cols)) + for i := range data { + args = append(args, &data[i]) + } + if err := rows.Scan(args...); err != nil { + return errors.Trace(err) + } + var connName, pos, logFile, host, gtidSet string + for i, col := range cols { + if data[i].Valid { + col = strings.ToLower(col) + switch col { + case "connection_name": + connName = data[i].String + case "exec_master_log_pos": + pos = data[i].String + case "relay_master_log_file": + logFile = data[i].String + case "master_host": + host = data[i].String + case "executed_gtid_set": + gtidSet = data[i].String + } + } + } + if len(host) > 0 { + buffer.WriteString("SHOW SLAVE STATUS:\n") + if isms { + buffer.WriteString("\tConnection name: " + connName + "\n") + } + fmt.Fprintf(buffer, "\tHost: %s\n\tLog: %s\n\tPos: %s\n\tGTID:%s\n\n", host, logFile, pos, gtidSet) + } + return nil + }) +} + +func (m *globalMetadata) writeGlobalMetaData() error { + // keep consistent with mydumper. Never compress metadata + fileWriter, tearDown, err := buildFileWriter(m.tctx, m.storage, metadataPath, storage.NoCompression) + if err != nil { + return err + } + defer tearDown(m.tctx) + + return write(m.tctx, fileWriter, m.String()) +} + +func getValidStr(str []string, idx int) string { + if idx < len(str) { + return str[idx] + } + return "" +} diff --git a/dumpling/export/metadata_test.go b/dumpling/export/metadata_test.go new file mode 100644 index 0000000000000..dc67c73628b87 --- /dev/null +++ b/dumpling/export/metadata_test.go @@ -0,0 +1,316 @@ +// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +package export + +import ( + "context" + "errors" + "fmt" + "os" + "testing" + + "github.com/DATA-DOG/go-sqlmock" + "github.com/stretchr/testify/require" + + "github.com/pingcap/tidb/br/pkg/storage" + "github.com/pingcap/tidb/br/pkg/version" + tcontext "github.com/pingcap/tidb/dumpling/context" +) + +const ( + logFile = "ON.000001" + pos = "7502" + gtidSet = "6ce40be3-e359-11e9-87e0-36933cb0ca5a:1-29" +) + +func TestMysqlMetaData(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + + conn, err := db.Conn(context.Background()) + require.NoError(t, err) + + rows := sqlmock.NewRows([]string{"File", "Position", "Binlog_Do_DB", "Binlog_Ignore_DB", "Executed_Gtid_Set"}). + AddRow(logFile, pos, "", "", gtidSet) + mock.ExpectQuery("SHOW MASTER STATUS").WillReturnRows(rows) + mock.ExpectQuery("SELECT @@default_master_connection").WillReturnError(fmt.Errorf("mock error")) + mock.ExpectQuery("SHOW SLAVE STATUS").WillReturnRows( + sqlmock.NewRows([]string{"exec_master_log_pos", "relay_master_log_file", "master_host", "Executed_Gtid_Set", "Seconds_Behind_Master"})) + + m := newGlobalMetadata(tcontext.Background(), createStorage(t), "") + require.NoError(t, m.recordGlobalMetaData(conn, version.ServerTypeMySQL, false)) + + expected := "SHOW MASTER STATUS:\n" + + "\tLog: ON.000001\n" + + "\tPos: 7502\n" + + "\tGTID:6ce40be3-e359-11e9-87e0-36933cb0ca5a:1-29\n\n" + require.Equal(t, expected, m.buffer.String()) + require.NoError(t, mock.ExpectationsWereMet()) +} + +func TestMetaDataAfterConn(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + + conn, err := db.Conn(context.Background()) + require.NoError(t, err) + + rows := sqlmock.NewRows([]string{"File", "Position", "Binlog_Do_DB", "Binlog_Ignore_DB", "Executed_Gtid_Set"}). + AddRow(logFile, pos, "", "", gtidSet) + pos2 := "7510" + rows2 := sqlmock.NewRows([]string{"File", "Position", "Binlog_Do_DB", "Binlog_Ignore_DB", "Executed_Gtid_Set"}). + AddRow(logFile, pos2, "", "", gtidSet) + mock.ExpectQuery("SHOW MASTER STATUS").WillReturnRows(rows) + mock.ExpectQuery("SELECT @@default_master_connection").WillReturnError(fmt.Errorf("mock error")) + mock.ExpectQuery("SHOW SLAVE STATUS").WillReturnRows( + sqlmock.NewRows([]string{"exec_master_log_pos", "relay_master_log_file", "master_host", "Executed_Gtid_Set", "Seconds_Behind_Master"})) + mock.ExpectQuery("SHOW MASTER STATUS").WillReturnRows(rows2) + + m := newGlobalMetadata(tcontext.Background(), createStorage(t), "") + require.NoError(t, m.recordGlobalMetaData(conn, version.ServerTypeMySQL, false)) + require.NoError(t, m.recordGlobalMetaData(conn, version.ServerTypeMySQL, true)) + + m.buffer.Write(m.afterConnBuffer.Bytes()) + + expected := "SHOW MASTER STATUS:\n" + + "\tLog: ON.000001\n" + + "\tPos: 7502\n" + + "\tGTID:6ce40be3-e359-11e9-87e0-36933cb0ca5a:1-29\n\n" + + "SHOW MASTER STATUS: /* AFTER CONNECTION POOL ESTABLISHED */\n" + + "\tLog: ON.000001\n" + + "\tPos: 7510\n" + + "\tGTID:6ce40be3-e359-11e9-87e0-36933cb0ca5a:1-29\n\n" + require.Equal(t, expected, m.buffer.String()) + require.NoError(t, mock.ExpectationsWereMet()) +} + +func TestMysqlWithFollowersMetaData(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + + conn, err := db.Conn(context.Background()) + require.NoError(t, err) + + rows := sqlmock.NewRows([]string{"File", "Position", "Binlog_Do_DB", "Binlog_Ignore_DB", "Executed_Gtid_Set"}). + AddRow(logFile, pos, "", "", gtidSet) + followerRows := sqlmock.NewRows([]string{"exec_master_log_pos", "relay_master_log_file", "master_host", "Executed_Gtid_Set", "Seconds_Behind_Master"}). + AddRow("256529431", "mysql-bin.001821", "192.168.1.100", gtidSet, 0) + mock.ExpectQuery("SHOW MASTER STATUS").WillReturnRows(rows) + mock.ExpectQuery("SELECT @@default_master_connection").WillReturnError(fmt.Errorf("mock error")) + mock.ExpectQuery("SHOW SLAVE STATUS").WillReturnRows(followerRows) + + m := newGlobalMetadata(tcontext.Background(), createStorage(t), "") + require.NoError(t, m.recordGlobalMetaData(conn, version.ServerTypeMySQL, false)) + + expected := "SHOW MASTER STATUS:\n" + + "\tLog: ON.000001\n" + + "\tPos: 7502\n" + + "\tGTID:6ce40be3-e359-11e9-87e0-36933cb0ca5a:1-29\n\n" + + "SHOW SLAVE STATUS:\n" + + "\tHost: 192.168.1.100\n" + + "\tLog: mysql-bin.001821\n" + + "\tPos: 256529431\n" + + "\tGTID:6ce40be3-e359-11e9-87e0-36933cb0ca5a:1-29\n\n" + require.Equal(t, expected, m.buffer.String()) + require.NoError(t, mock.ExpectationsWereMet()) +} + +func TestMysqlWithNullFollowersMetaData(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + + conn, err := db.Conn(context.Background()) + require.NoError(t, err) + + rows := sqlmock.NewRows([]string{"File", "Position", "Binlog_Do_DB", "Binlog_Ignore_DB", "Executed_Gtid_Set"}). + AddRow(logFile, pos, "", "", gtidSet) + mock.ExpectQuery("SHOW MASTER STATUS").WillReturnRows(rows) + mock.ExpectQuery("SELECT @@default_master_connection").WillReturnError(fmt.Errorf("mock error")) + mock.ExpectQuery("SHOW SLAVE STATUS").WillReturnRows(sqlmock.NewRows([]string{"SQL_Remaining_Delay"}).AddRow(nil)) + + m := newGlobalMetadata(tcontext.Background(), createStorage(t), "") + require.NoError(t, m.recordGlobalMetaData(conn, version.ServerTypeMySQL, false)) + + expected := "SHOW MASTER STATUS:\n" + + "\tLog: ON.000001\n" + + "\tPos: 7502\n" + + "\tGTID:6ce40be3-e359-11e9-87e0-36933cb0ca5a:1-29\n\n" + require.Equal(t, expected, m.buffer.String()) + require.NoError(t, mock.ExpectationsWereMet()) +} + +func TestMariaDBMetaData(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + + conn, err := db.Conn(context.Background()) + require.NoError(t, err) + + logFile := "mariadb-bin.000016" + pos := "475" + gtidSet := "0-1-2" + rows := sqlmock.NewRows([]string{"File", "Position", "Binlog_Do_DB", "Binlog_Ignore_DB"}). + AddRow(logFile, pos, "", "") + mock.ExpectQuery("SHOW MASTER STATUS").WillReturnRows(rows) + rows = sqlmock.NewRows([]string{"@@global.gtid_binlog_pos"}). + AddRow(gtidSet) + mock.ExpectQuery("SELECT @@global.gtid_binlog_pos").WillReturnRows(rows) + mock.ExpectQuery("SHOW SLAVE STATUS").WillReturnRows(rows) + m := newGlobalMetadata(tcontext.Background(), createStorage(t), "") + require.NoError(t, m.recordGlobalMetaData(conn, version.ServerTypeMariaDB, false)) + require.NoError(t, mock.ExpectationsWereMet()) +} + +func TestMariaDBWithFollowersMetaData(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + + conn, err := db.Conn(context.Background()) + require.NoError(t, err) + + rows := sqlmock.NewRows([]string{"File", "Position", "Binlog_Do_DB", "Binlog_Ignore_DB", "Executed_Gtid_Set"}). + AddRow(logFile, pos, "", "", gtidSet) + followerRows := sqlmock.NewRows([]string{"exec_master_log_pos", "relay_master_log_file", "master_host", "Executed_Gtid_Set", "connection_name", "Seconds_Behind_Master"}). + AddRow("256529431", "mysql-bin.001821", "192.168.1.100", gtidSet, "connection_1", 0). + AddRow("256529451", "mysql-bin.001820", "192.168.1.102", gtidSet, "connection_2", 200) + mock.ExpectQuery("SHOW MASTER STATUS").WillReturnRows(rows) + mock.ExpectQuery("SELECT @@default_master_connection"). + WillReturnRows(sqlmock.NewRows([]string{"@@default_master_connection"}). + AddRow("connection_1")) + mock.ExpectQuery("SHOW ALL SLAVES STATUS").WillReturnRows(followerRows) + + m := newGlobalMetadata(tcontext.Background(), createStorage(t), "") + require.NoError(t, m.recordGlobalMetaData(conn, version.ServerTypeMySQL, false)) + + expected := "SHOW MASTER STATUS:\n" + + "\tLog: ON.000001\n" + + "\tPos: 7502\n" + + "\tGTID:6ce40be3-e359-11e9-87e0-36933cb0ca5a:1-29\n\n" + + "SHOW SLAVE STATUS:\n" + + "\tConnection name: connection_1\n" + + "\tHost: 192.168.1.100\n" + + "\tLog: mysql-bin.001821\n" + + "\tPos: 256529431\n" + + "\tGTID:6ce40be3-e359-11e9-87e0-36933cb0ca5a:1-29\n\n" + + "SHOW SLAVE STATUS:\n" + + "\tConnection name: connection_2\n" + + "\tHost: 192.168.1.102\n" + + "\tLog: mysql-bin.001820\n" + + "\tPos: 256529451\n" + + "\tGTID:6ce40be3-e359-11e9-87e0-36933cb0ca5a:1-29\n\n" + require.Equal(t, expected, m.buffer.String()) + require.NoError(t, mock.ExpectationsWereMet()) +} + +func TestEarlierMysqlMetaData(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + + conn, err := db.Conn(context.Background()) + require.NoError(t, err) + + logFile := "mysql-bin.000001" + pos := "4879" + rows := sqlmock.NewRows([]string{"File", "Position", "Binlog_Do_DB", "Binlog_Ignore_DB"}). + AddRow(logFile, pos, "", "") + mock.ExpectQuery("SHOW MASTER STATUS").WillReturnRows(rows) + mock.ExpectQuery("SELECT @@default_master_connection").WillReturnError(fmt.Errorf("mock error")) + mock.ExpectQuery("SHOW SLAVE STATUS").WillReturnRows( + sqlmock.NewRows([]string{"exec_master_log_pos", "relay_master_log_file", "master_host", "Executed_Gtid_Set", "Seconds_Behind_Master"})) + + m := newGlobalMetadata(tcontext.Background(), createStorage(t), "") + require.NoError(t, m.recordGlobalMetaData(conn, version.ServerTypeMySQL, false)) + + expected := "SHOW MASTER STATUS:\n" + + "\tLog: mysql-bin.000001\n" + + "\tPos: 4879\n" + + "\tGTID:\n\n" + require.Equal(t, expected, m.buffer.String()) + require.NoError(t, mock.ExpectationsWereMet()) +} + +func TestTiDBSnapshotMetaData(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + + conn, err := db.Conn(context.Background()) + require.NoError(t, err) + + logFile := "tidb-binlog" + pos := "420633329401856001" + rows := sqlmock.NewRows([]string{"File", "Position", "Binlog_Do_DB", "Binlog_Ignore_DB"}). + AddRow(logFile, pos, "", "") + mock.ExpectQuery("SHOW MASTER STATUS").WillReturnRows(rows) + + m := newGlobalMetadata(tcontext.Background(), createStorage(t), "") + require.NoError(t, m.recordGlobalMetaData(conn, version.ServerTypeTiDB, false)) + + expected := "SHOW MASTER STATUS:\n" + + "\tLog: tidb-binlog\n" + + "\tPos: 420633329401856001\n" + + "\tGTID:\n\n" + require.Equal(t, expected, m.buffer.String()) + + snapshot := "420633273211289601" + rows = sqlmock.NewRows([]string{"File", "Position", "Binlog_Do_DB", "Binlog_Ignore_DB"}). + AddRow(logFile, pos, "", "") + mock.ExpectQuery("SHOW MASTER STATUS").WillReturnRows(rows) + m = newGlobalMetadata(tcontext.Background(), createStorage(t), snapshot) + require.NoError(t, m.recordGlobalMetaData(conn, version.ServerTypeTiDB, false)) + + expected = "SHOW MASTER STATUS:\n" + + "\tLog: tidb-binlog\n" + + "\tPos: 420633273211289601\n" + + "\tGTID:\n\n" + require.Equal(t, expected, m.buffer.String()) + require.NoError(t, mock.ExpectationsWereMet()) +} + +func TestNoPrivilege(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + + conn, err := db.Conn(context.Background()) + require.NoError(t, err) + + mock.ExpectQuery("SHOW MASTER STATUS").WillReturnError(errors.New("lack SUPER or REPLICATION CLIENT privilege")) + + m := newGlobalMetadata(tcontext.Background(), createStorage(t), "") + // some consistencyType will ignore this error, this test make sure no extra message is written + require.Error(t, m.recordGlobalMetaData(conn, version.ServerTypeTiDB, false)) + require.Equal(t, "", m.buffer.String()) +} + +func createStorage(t *testing.T) storage.ExternalStorage { + backend, err := storage.ParseBackend("file:///"+os.TempDir(), nil) + require.NoError(t, err) + testLoc, _ := storage.Create(context.Background(), backend, true) + return testLoc +} diff --git a/dumpling/export/metrics.go b/dumpling/export/metrics.go new file mode 100644 index 0000000000000..cb62caf041228 --- /dev/null +++ b/dumpling/export/metrics.go @@ -0,0 +1,200 @@ +// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +package export + +import ( + "math" + + "github.com/prometheus/client_golang/prometheus" + dto "github.com/prometheus/client_model/go" +) + +var ( + finishedSizeGauge *prometheus.GaugeVec + finishedRowsGauge *prometheus.GaugeVec + finishedTablesCounter *prometheus.CounterVec + estimateTotalRowsCounter *prometheus.CounterVec + writeTimeHistogram *prometheus.HistogramVec + receiveWriteChunkTimeHistogram *prometheus.HistogramVec + errorCount *prometheus.CounterVec + taskChannelCapacity *prometheus.GaugeVec +) + +// InitMetricsVector inits metrics vectors. +// This function must run before RegisterMetrics +func InitMetricsVector(labels prometheus.Labels) { + labelNames := make([]string, 0, len(labels)) + for name := range labels { + labelNames = append(labelNames, name) + } + finishedSizeGauge = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Namespace: "dumpling", + Subsystem: "dump", + Name: "finished_size", + Help: "counter for dumpling finished file size", + }, labelNames) + estimateTotalRowsCounter = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Namespace: "dumpling", + Subsystem: "dump", + Name: "estimate_total_rows", + Help: "estimate total rows for dumpling tables", + }, labelNames) + finishedRowsGauge = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Namespace: "dumpling", + Subsystem: "dump", + Name: "finished_rows", + Help: "counter for dumpling finished rows", + }, labelNames) + finishedTablesCounter = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Namespace: "dumpling", + Subsystem: "dump", + Name: "finished_tables", + Help: "counter for dumpling finished tables", + }, labelNames) + writeTimeHistogram = prometheus.NewHistogramVec( + prometheus.HistogramOpts{ + Namespace: "dumpling", + Subsystem: "write", + Name: "write_duration_time", + Help: "Bucketed histogram of write time (s) of files", + Buckets: prometheus.ExponentialBuckets(0.00005, 2, 20), + }, labelNames) + receiveWriteChunkTimeHistogram = prometheus.NewHistogramVec( + prometheus.HistogramOpts{ + Namespace: "dumpling", + Subsystem: "write", + Name: "receive_chunk_duration_time", + Help: "Bucketed histogram of write time (s) of files", + Buckets: prometheus.ExponentialBuckets(0.00005, 2, 20), + }, labelNames) + errorCount = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Namespace: "dumpling", + Subsystem: "dump", + Name: "error_count", + Help: "Total error count during dumping progress", + }, labelNames) + taskChannelCapacity = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Namespace: "dumpling", + Subsystem: "dump", + Name: "channel_capacity", + Help: "The task channel capacity during dumping progress", + }, labelNames) +} + +// RegisterMetrics registers metrics. +func RegisterMetrics(registry *prometheus.Registry) { + if finishedSizeGauge == nil { + return + } + registry.MustRegister(finishedSizeGauge) + registry.MustRegister(finishedRowsGauge) + registry.MustRegister(estimateTotalRowsCounter) + registry.MustRegister(finishedTablesCounter) + registry.MustRegister(writeTimeHistogram) + registry.MustRegister(receiveWriteChunkTimeHistogram) + registry.MustRegister(errorCount) + registry.MustRegister(taskChannelCapacity) +} + +// RemoveLabelValuesWithTaskInMetrics removes metrics of specified labels. +func RemoveLabelValuesWithTaskInMetrics(labels prometheus.Labels) { + if finishedSizeGauge == nil { + return + } + finishedSizeGauge.Delete(labels) + finishedRowsGauge.Delete(labels) + estimateTotalRowsCounter.Delete(labels) + finishedTablesCounter.Delete(labels) + writeTimeHistogram.Delete(labels) + receiveWriteChunkTimeHistogram.Delete(labels) + errorCount.Delete(labels) + taskChannelCapacity.Delete(labels) +} + +// ReadCounter reports the current value of the counter. +func ReadCounter(counterVec *prometheus.CounterVec, labels prometheus.Labels) float64 { + if counterVec == nil { + return math.NaN() + } + counter := counterVec.With(labels) + var metric dto.Metric + if err := counter.Write(&metric); err != nil { + return math.NaN() + } + return metric.Counter.GetValue() +} + +// AddCounter adds a counter. +func AddCounter(counterVec *prometheus.CounterVec, labels prometheus.Labels, v float64) { + if counterVec == nil { + return + } + counterVec.With(labels).Add(v) +} + +// IncCounter incs a counter. +func IncCounter(counterVec *prometheus.CounterVec, labels prometheus.Labels) { + if counterVec == nil { + return + } + counterVec.With(labels).Inc() +} + +// ObserveHistogram observes a histogram +func ObserveHistogram(histogramVec *prometheus.HistogramVec, labels prometheus.Labels, v float64) { + if histogramVec == nil { + return + } + histogramVec.With(labels).Observe(v) +} + +// ReadGauge reports the current value of the gauge. +func ReadGauge(gaugeVec *prometheus.GaugeVec, labels prometheus.Labels) float64 { + if gaugeVec == nil { + return math.NaN() + } + gauge := gaugeVec.With(labels) + var metric dto.Metric + if err := gauge.Write(&metric); err != nil { + return math.NaN() + } + return metric.Gauge.GetValue() +} + +// AddGauge adds a gauge +func AddGauge(gaugeVec *prometheus.GaugeVec, labels prometheus.Labels, v float64) { + if gaugeVec == nil { + return + } + gaugeVec.With(labels).Add(v) +} + +// SubGauge subs a gauge +func SubGauge(gaugeVec *prometheus.GaugeVec, labels prometheus.Labels, v float64) { + if gaugeVec == nil { + return + } + gaugeVec.With(labels).Sub(v) +} + +// IncGauge incs a gauge +func IncGauge(gaugeVec *prometheus.GaugeVec, labels prometheus.Labels) { + if gaugeVec == nil { + return + } + gaugeVec.With(labels).Inc() +} + +// DecGauge decs a gauge +func DecGauge(gaugeVec *prometheus.GaugeVec, labels prometheus.Labels) { + if gaugeVec == nil { + return + } + gaugeVec.With(labels).Dec() +} diff --git a/dumpling/export/prepare.go b/dumpling/export/prepare.go new file mode 100644 index 0000000000000..777b366c65a78 --- /dev/null +++ b/dumpling/export/prepare.go @@ -0,0 +1,241 @@ +// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +package export + +import ( + "database/sql" + "fmt" + "regexp" + "strings" + "text/template" + + "github.com/pingcap/errors" + + tcontext "github.com/pingcap/tidb/dumpling/context" +) + +const ( + outputFileTemplateSchema = "schema" + outputFileTemplateTable = "table" + outputFileTemplateView = "view" + outputFileTemplateData = "data" + outputFileTemplatePolicy = "placement-policy" + + defaultOutputFileTemplateBase = ` + {{- define "objectName" -}} + {{fn .DB}}.{{fn .Table}} + {{- end -}} + {{- define "schema" -}} + {{fn .DB}}-schema-create + {{- end -}} + {{- define "event" -}} + {{template "objectName" .}}-schema-post + {{- end -}} + {{- define "function" -}} + {{template "objectName" .}}-schema-post + {{- end -}} + {{- define "procedure" -}} + {{template "objectName" .}}-schema-post + {{- end -}} + {{- define "sequence" -}} + {{template "objectName" .}}-schema-sequence + {{- end -}} + {{- define "trigger" -}} + {{template "objectName" .}}-schema-triggers + {{- end -}} + {{- define "view" -}} + {{template "objectName" .}}-schema-view + {{- end -}} + {{- define "table" -}} + {{template "objectName" .}}-schema + {{- end -}} + {{- define "data" -}} + {{template "objectName" .}}.{{.Index}} + {{- end -}} + {{- define "placement-policy" -}} + {{fn .Policy}}-placement-policy-create + {{- end -}} + ` + + // DefaultAnonymousOutputFileTemplateText is the default anonymous output file templateText for dumpling's table data file name + DefaultAnonymousOutputFileTemplateText = "result.{{.Index}}" +) + +var ( + filenameEscapeRegexp = regexp.MustCompile(`[\x00-\x1f%"*./:<>?\\|]|-(?i:schema)`) + // DefaultOutputFileTemplate is the default output file template for dumpling's table data file name + DefaultOutputFileTemplate = template.Must(template.New("data"). + Option("missingkey=error"). + Funcs(template.FuncMap{ + "fn": func(input string) string { + return filenameEscapeRegexp.ReplaceAllStringFunc(input, func(match string) string { + return fmt.Sprintf("%%%02X%s", match[0], match[1:]) + }) + }, + }). + Parse(defaultOutputFileTemplateBase)) +) + +// ParseOutputFileTemplate parses template from the specified text +func ParseOutputFileTemplate(text string) (*template.Template, error) { + return template.Must(DefaultOutputFileTemplate.Clone()).Parse(text) +} + +func prepareDumpingDatabases(tctx *tcontext.Context, conf *Config, db *sql.Conn) ([]string, error) { + databases, err := ShowDatabases(db) + if err != nil { + return nil, err + } + databases = filterDatabases(tctx, conf, databases) + if len(conf.Databases) == 0 { + return databases, nil + } + dbMap := make(map[string]interface{}, len(databases)) + for _, database := range databases { + dbMap[database] = struct{}{} + } + var notExistsDatabases []string + for _, database := range conf.Databases { + if _, ok := dbMap[database]; !ok { + notExistsDatabases = append(notExistsDatabases, database) + } + } + if len(notExistsDatabases) > 0 { + return nil, errors.Errorf("Unknown databases [%s]", strings.Join(notExistsDatabases, ",")) + } + return conf.Databases, nil +} + +type databaseName = string + +// TableType represents the type of table +type TableType int8 + +const ( + // TableTypeBase represents the basic table + TableTypeBase TableType = iota + // TableTypeView represents the view table + TableTypeView + // TableTypeSequence represents the view table + // TODO: need to be supported + TableTypeSequence +) + +const ( + // TableTypeBaseStr represents the basic table string + TableTypeBaseStr = "BASE TABLE" + // TableTypeViewStr represents the view table string + TableTypeViewStr = "VIEW" + // TableTypeSequenceStr represents the view table string + TableTypeSequenceStr = "SEQUENCE" +) + +func (t TableType) String() string { + switch t { + case TableTypeBase: + return TableTypeBaseStr + case TableTypeView: + return TableTypeViewStr + case TableTypeSequence: + return TableTypeSequenceStr + default: + return "UNKNOWN" + } +} + +// ParseTableType parses table type string to TableType +func ParseTableType(s string) (TableType, error) { + switch s { + case TableTypeBaseStr: + return TableTypeBase, nil + case TableTypeViewStr: + return TableTypeView, nil + case TableTypeSequenceStr: + return TableTypeSequence, nil + default: + return TableTypeBase, errors.Errorf("unknown table type %s", s) + } +} + +// TableInfo is the table info for a table in database +type TableInfo struct { + Name string + AvgRowLength uint64 + Type TableType +} + +// Equals returns true the table info is the same with another one +func (t *TableInfo) Equals(other *TableInfo) bool { + return t.Name == other.Name && t.Type == other.Type +} + +// DatabaseTables is the type that represents tables in a database +type DatabaseTables map[databaseName][]*TableInfo + +// NewDatabaseTables returns a new DatabaseTables +func NewDatabaseTables() DatabaseTables { + return DatabaseTables{} +} + +// AppendTable appends a TableInfo to DatabaseTables +func (d DatabaseTables) AppendTable(dbName string, table *TableInfo) DatabaseTables { + d[dbName] = append(d[dbName], table) + return d +} + +// AppendTables appends several basic tables to DatabaseTables +func (d DatabaseTables) AppendTables(dbName string, tableNames []string, avgRowLengths []uint64) DatabaseTables { + for i, t := range tableNames { + d[dbName] = append(d[dbName], &TableInfo{t, avgRowLengths[i], TableTypeBase}) + } + return d +} + +// AppendViews appends several views to DatabaseTables +func (d DatabaseTables) AppendViews(dbName string, viewNames ...string) DatabaseTables { + for _, v := range viewNames { + d[dbName] = append(d[dbName], &TableInfo{v, 0, TableTypeView}) + } + return d +} + +// Merge merges another DatabaseTables +func (d DatabaseTables) Merge(other DatabaseTables) { + for name, infos := range other { + d[name] = append(d[name], infos...) + } +} + +// Literal returns a user-friendly output for DatabaseTables +func (d DatabaseTables) Literal() string { + var b strings.Builder + b.WriteString("tables list\n") + b.WriteString("\n") + + for dbName, tables := range d { + b.WriteString("schema ") + b.WriteString(dbName) + b.WriteString(" :[") + for _, tbl := range tables { + b.WriteString(tbl.Name) + b.WriteString(", ") + } + b.WriteString("]") + } + + return b.String() +} + +// DatabaseTablesToMap transfers DatabaseTables to Map +func DatabaseTablesToMap(d DatabaseTables) map[string]map[string]struct{} { + mp := make(map[string]map[string]struct{}, len(d)) + for name, infos := range d { + mp[name] = make(map[string]struct{}, len(infos)) + for _, info := range infos { + if info.Type == TableTypeBase { + mp[name][info.Name] = struct{}{} + } + } + } + return mp +} diff --git a/dumpling/export/prepare_test.go b/dumpling/export/prepare_test.go new file mode 100644 index 0000000000000..79588de6e4c04 --- /dev/null +++ b/dumpling/export/prepare_test.go @@ -0,0 +1,331 @@ +// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +package export + +import ( + "context" + "fmt" + "strings" + "testing" + + "github.com/DATA-DOG/go-sqlmock" + "github.com/stretchr/testify/require" + + tcontext "github.com/pingcap/tidb/dumpling/context" +) + +func TestPrepareDumpingDatabases(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + + tctx := tcontext.Background().WithLogger(appLogger) + conn, err := db.Conn(tctx) + require.NoError(t, err) + + rows := sqlmock.NewRows([]string{"Database"}). + AddRow("db1"). + AddRow("db2"). + AddRow("db3"). + AddRow("db5") + mock.ExpectQuery("SHOW DATABASES").WillReturnRows(rows) + conf := defaultConfigForTest(t) + conf.Databases = []string{"db1", "db2", "db3"} + result, err := prepareDumpingDatabases(tctx, conf, conn) + require.NoError(t, err) + require.Equal(t, []string{"db1", "db2", "db3"}, result) + + conf.Databases = nil + rows = sqlmock.NewRows([]string{"Database"}). + AddRow("db1"). + AddRow("db2") + mock.ExpectQuery("SHOW DATABASES").WillReturnRows(rows) + result, err = prepareDumpingDatabases(tctx, conf, conn) + require.NoError(t, err) + require.Equal(t, []string{"db1", "db2"}, result) + + mock.ExpectQuery("SHOW DATABASES").WillReturnError(fmt.Errorf("err")) + _, err = prepareDumpingDatabases(tctx, conf, conn) + require.Error(t, err) + + rows = sqlmock.NewRows([]string{"Database"}). + AddRow("db1"). + AddRow("db2"). + AddRow("db3"). + AddRow("db5") + mock.ExpectQuery("SHOW DATABASES").WillReturnRows(rows) + conf.Databases = []string{"db1", "db2", "db4", "db6"} + _, err = prepareDumpingDatabases(tctx, conf, conn) + require.EqualError(t, err, `Unknown databases [db4,db6]`) + require.NoError(t, mock.ExpectationsWereMet()) +} + +func TestListAllTables(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + + conn, err := db.Conn(context.Background()) + require.NoError(t, err) + tctx := tcontext.Background().WithLogger(appLogger) + + // Test list all tables and skipping views. + data := NewDatabaseTables(). + AppendTables("db1", []string{"t1", "t2"}, []uint64{1, 2}). + AppendTables("db2", []string{"t3", "t4", "t5"}, []uint64{3, 4, 5}). + AppendViews("db3", "t6", "t7", "t8") + + dbNames := make([]databaseName, 0, len(data)) + rows := sqlmock.NewRows([]string{"TABLE_SCHEMA", "TABLE_NAME", "TABLE_TYPE", "AVG_ROW_LENGTH"}) + for dbName, tableInfos := range data { + dbNames = append(dbNames, dbName) + + for _, tbInfo := range tableInfos { + if tbInfo.Type == TableTypeView { + continue + } + rows.AddRow(dbName, tbInfo.Name, tbInfo.Type.String(), tbInfo.AvgRowLength) + } + } + query := "SELECT TABLE_SCHEMA,TABLE_NAME,TABLE_TYPE,AVG_ROW_LENGTH FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'" + mock.ExpectQuery(query).WillReturnRows(rows) + + tables, err := ListAllDatabasesTables(tctx, conn, dbNames, listTableByInfoSchema, TableTypeBase) + require.NoError(t, err) + + for d, table := range tables { + expectedTbs, ok := data[d] + require.True(t, ok) + for i := 0; i < len(table); i++ { + require.Truef(t, table[i].Equals(expectedTbs[i]), "%v mismatches expected: %v", table[i], expectedTbs[i]) + } + } + + // Test list all tables and not skipping views. + data = NewDatabaseTables(). + AppendTables("db", []string{"t1"}, []uint64{1}). + AppendViews("db", "t2") + query = "SELECT TABLE_SCHEMA,TABLE_NAME,TABLE_TYPE,AVG_ROW_LENGTH FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' OR TABLE_TYPE='VIEW'" + mock.ExpectQuery(query).WillReturnRows(sqlmock.NewRows([]string{"TABLE_SCHEMA", "TABLE_NAME", "TABLE_TYPE", "AVG_ROW_LENGTH"}). + AddRow("db", "t1", TableTypeBaseStr, 1).AddRow("db", "t2", TableTypeViewStr, nil)) + tables, err = ListAllDatabasesTables(tctx, conn, []string{"db"}, listTableByInfoSchema, TableTypeBase, TableTypeView) + require.NoError(t, err) + require.Len(t, tables, 1) + require.Len(t, tables["db"], 2) + + for i := 0; i < len(tables["db"]); i++ { + require.Truef(t, tables["db"][i].Equals(data["db"][i]), "%v mismatches expected: %v", tables["db"][i], data["db"][i]) + } + + require.NoError(t, mock.ExpectationsWereMet()) +} + +func TestListAllTablesByTableStatus(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + + conn, err := db.Conn(context.Background()) + require.NoError(t, err) + + tctx := tcontext.Background().WithLogger(appLogger) + + // Test list all tables and skipping views. + data := NewDatabaseTables(). + AppendTables("db1", []string{"t1", "t2"}, []uint64{1, 2}). + AppendTables("db2", []string{"t3", "t4", "t5"}, []uint64{3, 4, 5}). + AppendViews("db3", "t6", "t7", "t8") + + query := "SHOW TABLE STATUS FROM `%s`" + showTableStatusColumnNames := []string{"Name", "Engine", "Version", "Row_format", "Rows", "Avg_row_length", "Data_length", "Max_data_length", "Index_length", "Data_free", "Auto_increment", "Create_time", "Update_time", "Check_time", "Collation", "Checksum", "Create_options", "Comment"} + dbNames := make([]databaseName, 0, len(data)) + for dbName, tableInfos := range data { + dbNames = append(dbNames, dbName) + rows := sqlmock.NewRows(showTableStatusColumnNames) + + for _, tbInfo := range tableInfos { + if tbInfo.Type == TableTypeBase { + rows.AddRow(tbInfo.Name, "InnoDB", 10, "Dynamic", 0, 0, 16384, 0, 0, 0, nil, "2021-07-08 03:04:07", nil, nil, "latin1_swedish_ci", nil, "", "") + } else { + rows.AddRow(tbInfo.Name, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, TableTypeView.String()) + } + } + mock.ExpectQuery(fmt.Sprintf(query, dbName)).WillReturnRows(rows) + } + + tables, err := ListAllDatabasesTables(tctx, conn, dbNames, listTableByShowTableStatus, TableTypeBase) + require.NoError(t, err) + + for d, table := range tables { + expectedTbs, ok := data[d] + require.True(t, ok) + + for i := 0; i < len(table); i++ { + require.Truef(t, table[i].Equals(expectedTbs[i]), "%v mismatches expected: %v", table[i], expectedTbs[i]) + } + } + + // Test list all tables and not skipping views. + data = NewDatabaseTables(). + AppendTables("db", []string{"t1"}, []uint64{1}). + AppendViews("db", "t2") + mock.ExpectQuery(fmt.Sprintf(query, "db")).WillReturnRows(sqlmock.NewRows(showTableStatusColumnNames). + AddRow("t1", "InnoDB", 10, "Dynamic", 0, 1, 16384, 0, 0, 0, nil, "2021-07-08 03:04:07", nil, nil, "latin1_swedish_ci", nil, "", ""). + AddRow("t2", nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, TableTypeView.String())) + tables, err = ListAllDatabasesTables(tctx, conn, []string{"db"}, listTableByShowTableStatus, TableTypeBase, TableTypeView) + require.NoError(t, err) + require.Len(t, tables, 1) + require.Len(t, tables["db"], 2) + + for i := 0; i < len(tables["db"]); i++ { + require.Truef(t, tables["db"][i].Equals(data["db"][i]), "%v mismatches expected: %v", tables["db"][i], data["db"][i]) + } + + require.NoError(t, mock.ExpectationsWereMet()) +} + +func TestListAllTablesByShowFullTables(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + + conn, err := db.Conn(context.Background()) + require.NoError(t, err) + + tctx := tcontext.Background().WithLogger(appLogger) + + // Test list all tables and skipping views. + data := NewDatabaseTables(). + AppendTables("db1", []string{"t1", "t2"}, []uint64{1, 2}). + AppendTables("db2", []string{"t3", "t4", "t5"}, []uint64{3, 4, 5}). + AppendViews("db3", "t6", "t7", "t8") + + query := "SHOW FULL TABLES FROM `%s` WHERE TABLE_TYPE='BASE TABLE'" + dbNames := make([]databaseName, 0, len(data)) + for dbName, tableInfos := range data { + dbNames = append(dbNames, dbName) + columnNames := []string{strings.ToUpper(fmt.Sprintf("Tables_in_%s", dbName)), "TABLE_TYPE"} + rows := sqlmock.NewRows(columnNames) + for _, tbInfo := range tableInfos { + if tbInfo.Type == TableTypeBase { + rows.AddRow(tbInfo.Name, TableTypeBase.String()) + } else { + rows.AddRow(tbInfo.Name, TableTypeView.String()) + } + } + mock.ExpectQuery(fmt.Sprintf(query, dbName)).WillReturnRows(rows) + } + + tables, err := ListAllDatabasesTables(tctx, conn, dbNames, listTableByShowFullTables, TableTypeBase) + require.NoError(t, err) + + for d, table := range tables { + expectedTbs, ok := data[d] + require.True(t, ok) + + for i := 0; i < len(table); i++ { + require.Truef(t, table[i].Equals(expectedTbs[i]), "%v mismatches expected: %v", table[i], expectedTbs[i]) + } + } + + // Test list all tables and not skipping views. + query = "SHOW FULL TABLES FROM `%s` WHERE TABLE_TYPE='BASE TABLE' OR TABLE_TYPE='VIEW'" + data = NewDatabaseTables(). + AppendTables("db", []string{"t1"}, []uint64{1}). + AppendViews("db", "t2") + for dbName, tableInfos := range data { + columnNames := []string{strings.ToUpper(fmt.Sprintf("Tables_in_%s", dbName)), "TABLE_TYPE"} + rows := sqlmock.NewRows(columnNames) + for _, tbInfo := range tableInfos { + if tbInfo.Type == TableTypeBase { + rows.AddRow(tbInfo.Name, TableTypeBase.String()) + } else { + rows.AddRow(tbInfo.Name, TableTypeView.String()) + } + } + mock.ExpectQuery(fmt.Sprintf(query, dbName)).WillReturnRows(rows) + } + tables, err = ListAllDatabasesTables(tctx, conn, []string{"db"}, listTableByShowFullTables, TableTypeBase, TableTypeView) + require.NoError(t, err) + require.Len(t, tables, 1) + require.Len(t, tables["db"], 2) + + for i := 0; i < len(tables["db"]); i++ { + require.Truef(t, tables["db"][i].Equals(data["db"][i]), "%v mismatches expected: %v", tables["db"][i], data["db"][i]) + } + + require.NoError(t, mock.ExpectationsWereMet()) +} + +func TestConfigValidation(t *testing.T) { + conf := defaultConfigForTest(t) + conf.Where = "id < 5" + conf.SQL = "select * from t where id > 3" + require.EqualError(t, validateSpecifiedSQL(conf), "can't specify both --sql and --where at the same time. Please try to combine them into --sql") + + conf.Where = "" + require.NoError(t, validateSpecifiedSQL(conf)) + + conf.FileType = FileFormatSQLTextString + err := adjustFileFormat(conf) + require.Error(t, err) + require.Contains(t, err.Error(), "please unset --filetype or set it to 'csv'") + + conf.FileType = FileFormatCSVString + require.NoError(t, adjustFileFormat(conf)) + + conf.FileType = "" + require.NoError(t, adjustFileFormat(conf)) + require.Equal(t, FileFormatCSVString, conf.FileType) + + conf.SQL = "" + conf.FileType = FileFormatSQLTextString + require.NoError(t, adjustFileFormat(conf)) + + conf.FileType = "" + require.NoError(t, adjustFileFormat(conf)) + require.Equal(t, FileFormatSQLTextString, conf.FileType) + + conf.FileType = "rand_str" + require.EqualError(t, adjustFileFormat(conf), "unknown config.FileType 'rand_str'") +} + +func TestValidateResolveAutoConsistency(t *testing.T) { + conf1 := defaultConfigForTest(t) + d := &Dumper{conf: conf1} + conf := d.conf + + testCases := []struct { + confConsistency string + confSnapshot string + err bool + }{ + {consistencyTypeAuto, "", true}, + {consistencyTypeAuto, "123", false}, + {consistencyTypeFlush, "", true}, + {consistencyTypeFlush, "456", false}, + {consistencyTypeLock, "", true}, + {consistencyTypeLock, "789", false}, + {consistencyTypeSnapshot, "", true}, + {consistencyTypeSnapshot, "456", true}, + {consistencyTypeNone, "", true}, + {consistencyTypeNone, "123", false}, + } + for _, testCase := range testCases { + conf.Consistency = testCase.confConsistency + conf.Snapshot = testCase.confSnapshot + if testCase.err == true { + require.NoError(t, validateResolveAutoConsistency(d)) + } else { + require.EqualError(t, validateResolveAutoConsistency(d), fmt.Sprintf("can't specify --snapshot when --consistency isn't snapshot, resolved consistency: %s", conf.Consistency)) + } + } +} diff --git a/dumpling/export/region_results.csv b/dumpling/export/region_results.csv new file mode 100644 index 0000000000000..07c0355b20568 --- /dev/null +++ b/dumpling/export/region_results.csv @@ -0,0 +1,990 @@ +4,"","7480000000000000FF0500000000000000F8" +6,"7480000000000000FF0500000000000000F8","7480000000000000FF0700000000000000F8" +8,"7480000000000000FF0700000000000000F8","7480000000000000FF0900000000000000F8" +10,"7480000000000000FF0900000000000000F8","7480000000000000FF0B00000000000000F8" +12,"7480000000000000FF0B00000000000000F8","7480000000000000FF0D00000000000000F8" +14,"7480000000000000FF0D00000000000000F8","7480000000000000FF0F00000000000000F8" +16,"7480000000000000FF0F00000000000000F8","7480000000000000FF1100000000000000F8" +18,"7480000000000000FF1100000000000000F8","7480000000000000FF1300000000000000F8" +20,"7480000000000000FF1300000000000000F8","7480000000000000FF1500000000000000F8" +22,"7480000000000000FF1500000000000000F8","7480000000000000FF1700000000000000F8" +24,"7480000000000000FF1700000000000000F8","7480000000000000FF1900000000000000F8" +26,"7480000000000000FF1900000000000000F8","7480000000000000FF1B00000000000000F8" +28,"7480000000000000FF1B00000000000000F8","7480000000000000FF1D00000000000000F8" +30,"7480000000000000FF1D00000000000000F8","7480000000000000FF1F00000000000000F8" +32,"7480000000000000FF1F00000000000000F8","7480000000000000FF2100000000000000F8" +34,"7480000000000000FF2100000000000000F8","7480000000000000FF2300000000000000F8" +36,"7480000000000000FF2300000000000000F8","7480000000000000FF2500000000000000F8" +38,"7480000000000000FF2500000000000000F8","7480000000000000FF2700000000000000F8" +40,"7480000000000000FF2700000000000000F8","7480000000000000FF2900000000000000F8" +42,"7480000000000000FF2900000000000000F8","7480000000000000FF295F728000000000FF0EA6010000000000FA" +44,"7480000000000000FF295F728000000000FF0EA6010000000000FA","7480000000000000FF295F728000000000FF1D4C010000000000FA" +46,"7480000000000000FF295F728000000000FF1D4C010000000000FA","7480000000000000FF295F728000000000FF2BF2010000000000FA" +48,"7480000000000000FF295F728000000000FF2BF2010000000000FA","7480000000000000FF295F728000000000FF3A98010000000000FA" +50,"7480000000000000FF295F728000000000FF3A98010000000000FA","7480000000000000FF295F728000000000FF493E010000000000FA" +52,"7480000000000000FF295F728000000000FF493E010000000000FA","7480000000000000FF295F728000000000FF57E4010000000000FA" +54,"7480000000000000FF295F728000000000FF57E4010000000000FA","7480000000000000FF295F728000000000FF668A010000000000FA" +1001,"7480000000000000FF295F728000000000FF668A010000000000FA","7480000000000000FF2F00000000000000F8" +1003,"7480000000000000FF2F00000000000000F8","7480000000000000FF3300000000000000F8" +1005,"7480000000000000FF3300000000000000F8","7480000000000000FF3500000000000000F8" +1007,"7480000000000000FF3500000000000000F8","7480000000000000FF3C00000000000000F8" +1009,"7480000000000000FF3C00000000000000F8","7480000000000000FF4500000000000000F8" +1011,"7480000000000000FF4500000000000000F8","7480000000000000FF4700000000000000F8" +1013,"7480000000000000FF4700000000000000F8","7480000000000000FF4F00000000000000F8" +1015,"7480000000000000FF4F00000000000000F8","7480000000000000FF5400000000000000F8" +1017,"7480000000000000FF5400000000000000F8","7480000000000000FF5800000000000000F8" +1019,"7480000000000000FF5800000000000000F8","7480000000000000FF5E00000000000000F8" +1021,"7480000000000000FF5E00000000000000F8","7480000000000000FF6B00000000000000F8" +1023,"7480000000000000FF6B00000000000000F8","7480000000000000FF7000000000000000F8" +1025,"7480000000000000FF7000000000000000F8","7480000000000000FF7300000000000000F8" +1027,"7480000000000000FF7300000000000000F8","7480000000000000FF7A00000000000000F8" +1029,"7480000000000000FF7A00000000000000F8","7480000000000000FF8500000000000000F8" +1031,"7480000000000000FF8500000000000000F8","7480000000000000FF8900000000000000F8" +1033,"7480000000000000FF8900000000000000F8","7480000000000000FF8D00000000000000F8" +1035,"7480000000000000FF8D00000000000000F8","7480000000000000FF9400000000000000F8" +1037,"7480000000000000FF9400000000000000F8","7480000000000000FF9D00000000000000F8" +1039,"7480000000000000FF9D00000000000000F8","7480000000000000FFA200000000000000F8" +1041,"7480000000000000FFA200000000000000F8","7480000000000000FFA500000000000000F8" +1043,"7480000000000000FFA500000000000000F8","7480000000000000FFAC00000000000000F8" +1045,"7480000000000000FFAC00000000000000F8","7480000000000000FFB900000000000000F8" +1047,"7480000000000000FFB900000000000000F8","7480000000000000FFBD00000000000000F8" +1049,"7480000000000000FFBD00000000000000F8","7480000000000000FFBF00000000000000F8" +1051,"7480000000000000FFBF00000000000000F8","7480000000000000FFC300000000000000F8" +1053,"7480000000000000FFC300000000000000F8","7480000000000000FFCF00000000000000F8" +1055,"7480000000000000FFCF00000000000000F8","7480000000000000FFD400000000000000F8" +1057,"7480000000000000FFD400000000000000F8","7480000000000000FFD800000000000000F8" +1059,"7480000000000000FFD800000000000000F8","7480000000000000FFDE00000000000000F8" +1061,"7480000000000000FFDE00000000000000F8","7480000000000000FFE700000000000000F8" +1063,"7480000000000000FFE700000000000000F8","7480000000000000FFEC00000000000000F8" +1065,"7480000000000000FFEC00000000000000F8","7480000000000000FFF000000000000000F8" +1067,"7480000000000000FFF000000000000000F8","7480000000000000FFF600000000000000F8" +1069,"7480000000000000FFF600000000000000F8","7480000000000000FFFC00000000000000F8" +1071,"7480000000000000FFFC00000000000000F8","7480000000000000FFFE00000000000000F8" +1119,"7480000000000000FFFE00000000000000F8","7480000000000001FF0200000000000000F8" +1135,"7480000000000001FF0200000000000000F8","7480000000000001FF0300000000000000F8" +1137,"7480000000000001FF0300000000000000F8","7480000000000001FF0400000000000000F8" +1127,"7480000000000001FF0400000000000000F8","7480000000000001FF0500000000000000F8" +1073,"7480000000000001FF0500000000000000F8","7480000000000001FF0600000000000000F8" +1125,"7480000000000001FF0600000000000000F8","7480000000000001FF0800000000000000F8" +1083,"7480000000000001FF0800000000000000F8","7480000000000001FF0900000000000000F8" +1075,"7480000000000001FF0900000000000000F8","7480000000000001FF0A00000000000000F8" +1115,"7480000000000001FF0A00000000000000F8","7480000000000001FF0C00000000000000F8" +1077,"7480000000000001FF0C00000000000000F8","7480000000000001FF0D00000000000000F8" +1079,"7480000000000001FF0D00000000000000F8","7480000000000001FF0F00000000000000F8" +1129,"7480000000000001FF0F00000000000000F8","7480000000000001FF1100000000000000F8" +1103,"7480000000000001FF1100000000000000F8","7480000000000001FF1200000000000000F8" +1081,"7480000000000001FF1200000000000000F8","7480000000000001FF1300000000000000F8" +1085,"7480000000000001FF1300000000000000F8","7480000000000001FF1500000000000000F8" +1105,"7480000000000001FF1500000000000000F8","7480000000000001FF1600000000000000F8" +1089,"7480000000000001FF1600000000000000F8","7480000000000001FF1800000000000000F8" +1087,"7480000000000001FF1800000000000000F8","7480000000000001FF1A00000000000000F8" +1099,"7480000000000001FF1A00000000000000F8","7480000000000001FF1C00000000000000F8" +1093,"7480000000000001FF1C00000000000000F8","7480000000000001FF1E00000000000000F8" +1091,"7480000000000001FF1E00000000000000F8","7480000000000001FF1F00000000000000F8" +1143,"7480000000000001FF1F00000000000000F8","7480000000000001FF2200000000000000F8" +1097,"7480000000000001FF2200000000000000F8","7480000000000001FF2300000000000000F8" +1145,"7480000000000001FF2300000000000000F8","7480000000000001FF2400000000000000F8" +1095,"7480000000000001FF2400000000000000F8","7480000000000001FF2500000000000000F8" +1139,"7480000000000001FF2500000000000000F8","7480000000000001FF2800000000000000F8" +1101,"7480000000000001FF2800000000000000F8","7480000000000001FF2A00000000000000F8" +1141,"7480000000000001FF2A00000000000000F8","7480000000000001FF2E00000000000000F8" +1123,"7480000000000001FF2E00000000000000F8","7480000000000001FF2F00000000000000F8" +1107,"7480000000000001FF2F00000000000000F8","7480000000000001FF3000000000000000F8" +1121,"7480000000000001FF3000000000000000F8","7480000000000001FF3100000000000000F8" +1109,"7480000000000001FF3100000000000000F8","7480000000000001FF3200000000000000F8" +1113,"7480000000000001FF3200000000000000F8","7480000000000001FF3500000000000000F8" +1111,"7480000000000001FF3500000000000000F8","7480000000000001FF3600000000000000F8" +1117,"7480000000000001FF3600000000000000F8","7480000000000001FF3A00000000000000F8" +1131,"7480000000000001FF3A00000000000000F8","7480000000000001FF4200000000000000F8" +1133,"7480000000000001FF4200000000000000F8","7480000000000001FF4400000000000000F8" +1147,"7480000000000001FF4400000000000000F8","7480000000000001FF4C00000000000000F8" +1149,"7480000000000001FF4C00000000000000F8","7480000000000001FF4E00000000000000F8" +1153,"7480000000000001FF4E00000000000000F8","7480000000000001FF5000000000000000F8" +1187,"7480000000000001FF5000000000000000F8","7480000000000001FF5100000000000000F8" +1183,"7480000000000001FF5100000000000000F8","7480000000000001FF5300000000000000F8" +1151,"7480000000000001FF5300000000000000F8","7480000000000001FF5400000000000000F8" +1167,"7480000000000001FF5400000000000000F8","7480000000000001FF5500000000000000F8" +1175,"7480000000000001FF5500000000000000F8","7480000000000001FF5700000000000000F8" +1177,"7480000000000001FF5700000000000000F8","7480000000000001FF5800000000000000F8" +1197,"7480000000000001FF5800000000000000F8","7480000000000001FF5900000000000000F8" +1169,"7480000000000001FF5900000000000000F8","7480000000000001FF5A00000000000000F8" +1157,"7480000000000001FF5A00000000000000F8","7480000000000001FF5B00000000000000F8" +1179,"7480000000000001FF5B00000000000000F8","7480000000000001FF5C00000000000000F8" +1191,"7480000000000001FF5C00000000000000F8","7480000000000001FF5D00000000000000F8" +1155,"7480000000000001FF5D00000000000000F8","7480000000000001FF5E00000000000000F8" +1189,"7480000000000001FF5E00000000000000F8","7480000000000001FF6100000000000000F8" +1159,"7480000000000001FF6100000000000000F8","7480000000000001FF6200000000000000F8" +1193,"7480000000000001FF6200000000000000F8","7480000000000001FF6400000000000000F8" +1163,"7480000000000001FF6400000000000000F8","7480000000000001FF6500000000000000F8" +1161,"7480000000000001FF6500000000000000F8","7480000000000001FF6600000000000000F8" +1185,"7480000000000001FF6600000000000000F8","7480000000000001FF6900000000000000F8" +1165,"7480000000000001FF6900000000000000F8","7480000000000001FF6A00000000000000F8" +1171,"7480000000000001FF6A00000000000000F8","7480000000000001FF6E00000000000000F8" +1173,"7480000000000001FF6E00000000000000F8","7480000000000001FF7000000000000000F8" +1181,"7480000000000001FF7000000000000000F8","7480000000000001FF7500000000000000F8" +1195,"7480000000000001FF7500000000000000F8","7480000000000001FF7C00000000000000F8" +1199,"7480000000000001FF7C00000000000000F8","7480000000000001FF8000000000000000F8" +1201,"7480000000000001FF8000000000000000F8","7480000000000001FF8200000000000000F8" +1203,"7480000000000001FF8200000000000000F8","7480000000000001FF8400000000000000F8" +1209,"7480000000000001FF8400000000000000F8","7480000000000001FF8600000000000000F8" +1211,"7480000000000001FF8600000000000000F8","7480000000000001FF8800000000000000F8" +1207,"7480000000000001FF8800000000000000F8","7480000000000001FF8A00000000000000F8" +1217,"7480000000000001FF8A00000000000000F8","7480000000000001FF8B00000000000000F8" +1219,"7480000000000001FF8B00000000000000F8","7480000000000001FF8C00000000000000F8" +1205,"7480000000000001FF8C00000000000000F8","7480000000000001FF8D00000000000000F8" +1213,"7480000000000001FF8D00000000000000F8","7480000000000001FF9100000000000000F8" +1233,"7480000000000001FF9100000000000000F8","7480000000000001FF9400000000000000F8" +1247,"7480000000000001FF9400000000000000F8","7480000000000001FF9500000000000000F8" +1215,"7480000000000001FF9500000000000000F8","7480000000000001FF9600000000000000F8" +1227,"7480000000000001FF9600000000000000F8","7480000000000001FF9700000000000000F8" +1235,"7480000000000001FF9700000000000000F8","7480000000000001FF9900000000000000F8" +1221,"7480000000000001FF9900000000000000F8","7480000000000001FF9A00000000000000F8" +1231,"7480000000000001FF9A00000000000000F8","7480000000000001FF9B00000000000000F8" +1223,"7480000000000001FF9B00000000000000F8","7480000000000001FF9D00000000000000F8" +1229,"7480000000000001FF9D00000000000000F8","7480000000000001FFA000000000000000F8" +1243,"7480000000000001FFA000000000000000F8","7480000000000001FFA500000000000000F8" +1245,"7480000000000001FFA500000000000000F8","7480000000000001FFA600000000000000F8" +1239,"7480000000000001FFA600000000000000F8","7480000000000001FFA700000000000000F8" +1241,"7480000000000001FFA700000000000000F8","7480000000000001FFA900000000000000F8" +1237,"7480000000000001FFA900000000000000F8","7480000000000001FFAA00000000000000F8" +1249,"7480000000000001FFAA00000000000000F8","7480000000000001FFB000000000000000F8" +1251,"7480000000000001FFB000000000000000F8","7480000000000001FFB200000000000000F8" +1255,"7480000000000001FFB200000000000000F8","7480000000000001FFB300000000000000F8" +1257,"7480000000000001FFB300000000000000F8","7480000000000001FFB600000000000000F8" +1267,"7480000000000001FFB600000000000000F8","7480000000000001FFB800000000000000F8" +1275,"7480000000000001FFB800000000000000F8","7480000000000001FFB900000000000000F8" +1273,"7480000000000001FFB900000000000000F8","7480000000000001FFBA00000000000000F8" +1271,"7480000000000001FFBA00000000000000F8","7480000000000001FFBB00000000000000F8" +1277,"7480000000000001FFBB00000000000000F8","7480000000000001FFBC00000000000000F8" +1261,"7480000000000001FFBC00000000000000F8","7480000000000001FFBD00000000000000F8" +1259,"7480000000000001FFBD00000000000000F8","7480000000000001FFBE00000000000000F8" +1279,"7480000000000001FFBE00000000000000F8","7480000000000001FFC600000000000000F8" +1281,"7480000000000001FFC600000000000000F8","7480000000000001FFC800000000000000F8" +1283,"7480000000000001FFC800000000000000F8","7480000000000001FFCA00000000000000F8" +1285,"7480000000000001FFCA00000000000000F8","7480000000000001FFCC00000000000000F8" +1289,"7480000000000001FFCC00000000000000F8","7480000000000001FFCD00000000000000F8" +1291,"7480000000000001FFCD00000000000000F8","7480000000000001FFD000000000000000F8" +1293,"7480000000000001FFD000000000000000F8","7480000000000001FFD200000000000000F8" +1295,"7480000000000001FFD200000000000000F8","7480000000000001FFD400000000000000F8" +1297,"7480000000000001FFD400000000000000F8","7480000000000001FFD600000000000000F8" +1299,"7480000000000001FFD600000000000000F8","7480000000000001FFD800000000000000F8" +1309,"7480000000000001FFD800000000000000F8","7480000000000001FFDA00000000000000F8" +1303,"7480000000000001FFDA00000000000000F8","7480000000000001FFDB00000000000000F8" +1307,"7480000000000001FFDB00000000000000F8","7480000000000001FFDE00000000000000F8" +1311,"7480000000000001FFDE00000000000000F8","7480000000000001FFE000000000000000F8" +1313,"7480000000000001FFE000000000000000F8","7480000000000001FFE200000000000000F8" +1317,"7480000000000001FFE200000000000000F8","7480000000000001FFE400000000000000F8" +1321,"7480000000000001FFE400000000000000F8","7480000000000001FFE600000000000000F8" +1325,"7480000000000001FFE600000000000000F8","7480000000000001FFE800000000000000F8" +1329,"7480000000000001FFE800000000000000F8","7480000000000001FFEA00000000000000F8" +1331,"7480000000000001FFEA00000000000000F8","7480000000000001FFEC00000000000000F8" +1327,"7480000000000001FFEC00000000000000F8","7480000000000001FFED00000000000000F8" +1333,"7480000000000001FFED00000000000000F8","7480000000000001FFF000000000000000F8" +1335,"7480000000000001FFF000000000000000F8","7480000000000001FFF200000000000000F8" +1337,"7480000000000001FFF200000000000000F8","7480000000000001FFF400000000000000F8" +1339,"7480000000000001FFF400000000000000F8","7480000000000001FFF600000000000000F8" +1341,"7480000000000001FFF600000000000000F8","7480000000000001FFF800000000000000F8" +1355,"7480000000000001FFF800000000000000F8","7480000000000001FFFA00000000000000F8" +1343,"7480000000000001FFFA00000000000000F8","7480000000000001FFFB00000000000000F8" +1347,"7480000000000001FFFB00000000000000F8","7480000000000001FFFC00000000000000F8" +1345,"7480000000000001FFFC00000000000000F8","7480000000000001FFFD00000000000000F8" +1353,"7480000000000001FFFD00000000000000F8","7480000000000002FF0100000000000000F8" +1349,"7480000000000002FF0100000000000000F8","7480000000000002FF0200000000000000F8" +1351,"7480000000000002FF0200000000000000F8","7480000000000002FF0500000000000000F8" +1363,"7480000000000002FF0500000000000000F8","7480000000000002FF0800000000000000F8" +1357,"7480000000000002FF0800000000000000F8","7480000000000002FF0900000000000000F8" +1359,"7480000000000002FF0900000000000000F8","7480000000000002FF0B00000000000000F8" +1361,"7480000000000002FF0B00000000000000F8","7480000000000002FF0D00000000000000F8" +1365,"7480000000000002FF0D00000000000000F8","7480000000000002FF1000000000000000F8" +1369,"7480000000000002FF1000000000000000F8","7480000000000002FF1200000000000000F8" +1373,"7480000000000002FF1200000000000000F8","7480000000000002FF1400000000000000F8" +1375,"7480000000000002FF1400000000000000F8","7480000000000002FF1600000000000000F8" +1367,"7480000000000002FF1600000000000000F8","7480000000000002FF1800000000000000F8" +1377,"7480000000000002FF1800000000000000F8","7480000000000002FF1A00000000000000F8" +1383,"7480000000000002FF1A00000000000000F8","7480000000000002FF1C00000000000000F8" +1379,"7480000000000002FF1C00000000000000F8","7480000000000002FF1D00000000000000F8" +1385,"7480000000000002FF1D00000000000000F8","7480000000000002FF2000000000000000F8" +1397,"7480000000000002FF2000000000000000F8","7480000000000002FF2200000000000000F8" +1389,"7480000000000002FF2200000000000000F8","7480000000000002FF2300000000000000F8" +1387,"7480000000000002FF2300000000000000F8","7480000000000002FF2400000000000000F8" +1393,"7480000000000002FF2400000000000000F8","7480000000000002FF2700000000000000F8" +1391,"7480000000000002FF2700000000000000F8","7480000000000002FF2800000000000000F8" +1401,"7480000000000002FF2800000000000000F8","7480000000000002FF2C00000000000000F8" +1399,"7480000000000002FF2C00000000000000F8","7480000000000002FF2D00000000000000F8" +1395,"7480000000000002FF2D00000000000000F8","7480000000000002FF3000000000000000F8" +1403,"7480000000000002FF3000000000000000F8","7480000000000002FF3200000000000000F8" +1405,"7480000000000002FF3200000000000000F8","7480000000000002FF3400000000000000F8" +1411,"7480000000000002FF3400000000000000F8","7480000000000002FF3500000000000000F8" +1409,"7480000000000002FF3500000000000000F8","7480000000000002FF3800000000000000F8" +1413,"7480000000000002FF3800000000000000F8","7480000000000002FF3A00000000000000F8" +1417,"7480000000000002FF3A00000000000000F8","7480000000000002FF3C00000000000000F8" +1415,"7480000000000002FF3C00000000000000F8","7480000000000002FF3D00000000000000F8" +1419,"7480000000000002FF3D00000000000000F8","7480000000000002FF4000000000000000F8" +1423,"7480000000000002FF4000000000000000F8","7480000000000002FF4200000000000000F8" +1421,"7480000000000002FF4200000000000000F8","7480000000000002FF4300000000000000F8" +1425,"7480000000000002FF4300000000000000F8","7480000000000002FF4600000000000000F8" +1427,"7480000000000002FF4600000000000000F8","7480000000000002FF4800000000000000F8" +1429,"7480000000000002FF4800000000000000F8","7480000000000002FF4A00000000000000F8" +1431,"7480000000000002FF4A00000000000000F8","7480000000000002FF4C00000000000000F8" +1437,"7480000000000002FF4C00000000000000F8","7480000000000002FF4E00000000000000F8" +1433,"7480000000000002FF4E00000000000000F8","7480000000000002FF4F00000000000000F8" +1439,"7480000000000002FF4F00000000000000F8","7480000000000002FF5200000000000000F8" +1445,"7480000000000002FF5200000000000000F8","7480000000000002FF5400000000000000F8" +1441,"7480000000000002FF5400000000000000F8","7480000000000002FF5500000000000000F8" +1443,"7480000000000002FF5500000000000000F8","7480000000000002FF5700000000000000F8" +1447,"7480000000000002FF5700000000000000F8","7480000000000002FF5A00000000000000F8" +1449,"7480000000000002FF5A00000000000000F8","7480000000000002FF5C00000000000000F8" +1451,"7480000000000002FF5C00000000000000F8","7480000000000002FF5E00000000000000F8" +1453,"7480000000000002FF5E00000000000000F8","7480000000000002FF6000000000000000F8" +1457,"7480000000000002FF6000000000000000F8","7480000000000002FF6200000000000000F8" +1459,"7480000000000002FF6200000000000000F8","7480000000000002FF6400000000000000F8" +1455,"7480000000000002FF6400000000000000F8","7480000000000002FF6600000000000000F8" +1465,"7480000000000002FF6600000000000000F8","7480000000000002FF6800000000000000F8" +1461,"7480000000000002FF6800000000000000F8","7480000000000002FF6A00000000000000F8" +1463,"7480000000000002FF6A00000000000000F8","7480000000000002FF6C00000000000000F8" +1469,"7480000000000002FF6C00000000000000F8","7480000000000002FF6E00000000000000F8" +1467,"7480000000000002FF6E00000000000000F8","7480000000000002FF6F00000000000000F8" +1471,"7480000000000002FF6F00000000000000F8","7480000000000002FF7200000000000000F8" +1473,"7480000000000002FF7200000000000000F8","7480000000000002FF7400000000000000F8" +1475,"7480000000000002FF7400000000000000F8","7480000000000002FF7600000000000000F8" +1477,"7480000000000002FF7600000000000000F8","7480000000000002FF7800000000000000F8" +1479,"7480000000000002FF7800000000000000F8","7480000000000002FF7A00000000000000F8" +1481,"7480000000000002FF7A00000000000000F8","7480000000000002FF7C00000000000000F8" +1485,"7480000000000002FF7C00000000000000F8","7480000000000002FF7E00000000000000F8" +1487,"7480000000000002FF7E00000000000000F8","7480000000000002FF8000000000000000F8" +1483,"7480000000000002FF8000000000000000F8","7480000000000002FF8200000000000000F8" +1489,"7480000000000002FF8200000000000000F8","7480000000000002FF8400000000000000F8" +1491,"7480000000000002FF8400000000000000F8","7480000000000002FF8600000000000000F8" +1493,"7480000000000002FF8600000000000000F8","7480000000000002FF8800000000000000F8" +1495,"7480000000000002FF8800000000000000F8","7480000000000002FF8A00000000000000F8" +1497,"7480000000000002FF8A00000000000000F8","7480000000000002FF8C00000000000000F8" +1501,"7480000000000002FF8C00000000000000F8","7480000000000002FF8E00000000000000F8" +1499,"7480000000000002FF8E00000000000000F8","7480000000000002FF9000000000000000F8" +1507,"7480000000000002FF9000000000000000F8","7480000000000002FF9200000000000000F8" +1503,"7480000000000002FF9200000000000000F8","7480000000000002FF9400000000000000F8" +1509,"7480000000000002FF9400000000000000F8","7480000000000002FF9600000000000000F8" +1511,"7480000000000002FF9600000000000000F8","7480000000000002FF9800000000000000F8" +1515,"7480000000000002FF9800000000000000F8","7480000000000002FF9A00000000000000F8" +1513,"7480000000000002FF9A00000000000000F8","7480000000000002FF9C00000000000000F8" +1517,"7480000000000002FF9C00000000000000F8","7480000000000002FF9E00000000000000F8" +1519,"7480000000000002FF9E00000000000000F8","7480000000000002FFA000000000000000F8" +1521,"7480000000000002FFA000000000000000F8","7480000000000002FFA200000000000000F8" +1523,"7480000000000002FFA200000000000000F8","7480000000000002FFA400000000000000F8" +1527,"7480000000000002FFA400000000000000F8","7480000000000002FFA600000000000000F8" +1529,"7480000000000002FFA600000000000000F8","7480000000000002FFA800000000000000F8" +1531,"7480000000000002FFA800000000000000F8","7480000000000002FFAA00000000000000F8" +1533,"7480000000000002FFAA00000000000000F8","7480000000000002FFAC00000000000000F8" +1535,"7480000000000002FFAC00000000000000F8","7480000000000002FFAE00000000000000F8" +1537,"7480000000000002FFAE00000000000000F8","7480000000000002FFB000000000000000F8" +1547,"7480000000000002FFB000000000000000F8","7480000000000002FFB200000000000000F8" +1539,"7480000000000002FFB200000000000000F8","7480000000000002FFB300000000000000F8" +1543,"7480000000000002FFB300000000000000F8","7480000000000002FFB500000000000000F8" +1549,"7480000000000002FFB500000000000000F8","7480000000000002FFB800000000000000F8" +1541,"7480000000000002FFB800000000000000F8","7480000000000002FFBA00000000000000F8" +1545,"7480000000000002FFBA00000000000000F8","7480000000000002FFBC00000000000000F8" +1551,"7480000000000002FFBC00000000000000F8","7480000000000002FFBE00000000000000F8" +1553,"7480000000000002FFBE00000000000000F8","7480000000000002FFC000000000000000F8" +1557,"7480000000000002FFC000000000000000F8","7480000000000002FFC200000000000000F8" +1555,"7480000000000002FFC200000000000000F8","7480000000000002FFC400000000000000F8" +1567,"7480000000000002FFC400000000000000F8","7480000000000002FFC500000000000000F8" +1559,"7480000000000002FFC500000000000000F8","7480000000000002FFC700000000000000F8" +1577,"7480000000000002FFC700000000000000F8","7480000000000002FFC800000000000000F8" +1565,"7480000000000002FFC800000000000000F8","7480000000000002FFC900000000000000F8" +1561,"7480000000000002FFC900000000000000F8","7480000000000002FFCB00000000000000F8" +1569,"7480000000000002FFCB00000000000000F8","7480000000000002FFCD00000000000000F8" +1563,"7480000000000002FFCD00000000000000F8","7480000000000002FFCE00000000000000F8" +1571,"7480000000000002FFCE00000000000000F8","7480000000000002FFD400000000000000F8" +1573,"7480000000000002FFD400000000000000F8","7480000000000002FFD600000000000000F8" +1575,"7480000000000002FFD600000000000000F8","7480000000000002FFD800000000000000F8" +1579,"7480000000000002FFD800000000000000F8","7480000000000002FFDA00000000000000F8" +1589,"7480000000000002FFDA00000000000000F8","7480000000000002FFDC00000000000000F8" +1581,"7480000000000002FFDC00000000000000F8","7480000000000002FFDD00000000000000F8" +1591,"7480000000000002FFDD00000000000000F8","7480000000000002FFE000000000000000F8" +1587,"7480000000000002FFE000000000000000F8","7480000000000002FFE200000000000000F8" +1593,"7480000000000002FFE200000000000000F8","7480000000000002FFE400000000000000F8" +1595,"7480000000000002FFE400000000000000F8","7480000000000002FFE600000000000000F8" +1599,"7480000000000002FFE600000000000000F8","7480000000000002FFE800000000000000F8" +1597,"7480000000000002FFE800000000000000F8","7480000000000002FFE900000000000000F8" +1601,"7480000000000002FFE900000000000000F8","7480000000000002FFEB00000000000000F8" +1603,"7480000000000002FFEB00000000000000F8","7480000000000002FFEE00000000000000F8" +1605,"7480000000000002FFEE00000000000000F8","7480000000000002FFF000000000000000F8" +1607,"7480000000000002FFF000000000000000F8","7480000000000002FFF200000000000000F8" +1609,"7480000000000002FFF200000000000000F8","7480000000000002FFF400000000000000F8" +1611,"7480000000000002FFF400000000000000F8","7480000000000002FFF600000000000000F8" +1613,"7480000000000002FFF600000000000000F8","7480000000000002FFF800000000000000F8" +1615,"7480000000000002FFF800000000000000F8","7480000000000002FFFA00000000000000F8" +1621,"7480000000000002FFFA00000000000000F8","7480000000000002FFFC00000000000000F8" +1623,"7480000000000002FFFC00000000000000F8","7480000000000002FFFD00000000000000F8" +1617,"7480000000000002FFFD00000000000000F8","7480000000000002FFFE00000000000000F8" +1619,"7480000000000002FFFE00000000000000F8","7480000000000003FF0000000000000000F8" +1625,"7480000000000003FF0000000000000000F8","7480000000000003FF0400000000000000F8" +1627,"7480000000000003FF0400000000000000F8","7480000000000003FF0600000000000000F8" +1629,"7480000000000003FF0600000000000000F8","7480000000000003FF0800000000000000F8" +1631,"7480000000000003FF0800000000000000F8","7480000000000003FF0A00000000000000F8" +1633,"7480000000000003FF0A00000000000000F8","7480000000000003FF0C00000000000000F8" +1635,"7480000000000003FF0C00000000000000F8","7480000000000003FF0E00000000000000F8" +1637,"7480000000000003FF0E00000000000000F8","7480000000000003FF1000000000000000F8" +1639,"7480000000000003FF1000000000000000F8","7480000000000003FF1200000000000000F8" +1641,"7480000000000003FF1200000000000000F8","7480000000000003FF1400000000000000F8" +1643,"7480000000000003FF1400000000000000F8","7480000000000003FF1600000000000000F8" +1647,"7480000000000003FF1600000000000000F8","7480000000000003FF1800000000000000F8" +1649,"7480000000000003FF1800000000000000F8","7480000000000003FF1A00000000000000F8" +1651,"7480000000000003FF1A00000000000000F8","7480000000000003FF1C00000000000000F8" +1645,"7480000000000003FF1C00000000000000F8","7480000000000003FF1E00000000000000F8" +1657,"7480000000000003FF1E00000000000000F8","7480000000000003FF1F00000000000000F8" +1655,"7480000000000003FF1F00000000000000F8","7480000000000003FF2000000000000000F8" +1677,"7480000000000003FF2000000000000000F8","7480000000000003FF2300000000000000F8" +1671,"7480000000000003FF2300000000000000F8","7480000000000003FF2400000000000000F8" +1675,"7480000000000003FF2400000000000000F8","7480000000000003FF2500000000000000F8" +1681,"7480000000000003FF2500000000000000F8","7480000000000003FF2600000000000000F8" +1679,"7480000000000003FF2600000000000000F8","7480000000000003FF2700000000000000F8" +1661,"7480000000000003FF2700000000000000F8","7480000000000003FF2900000000000000F8" +1665,"7480000000000003FF2900000000000000F8","7480000000000003FF2A00000000000000F8" +1663,"7480000000000003FF2A00000000000000F8","7480000000000003FF2B00000000000000F8" +1659,"7480000000000003FF2B00000000000000F8","7480000000000003FF2C00000000000000F8" +1653,"7480000000000003FF2C00000000000000F8","7480000000000003FF2D00000000000000F8" +1667,"7480000000000003FF2D00000000000000F8","7480000000000003FF3300000000000000F8" +1669,"7480000000000003FF3300000000000000F8","7480000000000003FF3500000000000000F8" +1683,"7480000000000003FF3500000000000000F8","7480000000000003FF3B00000000000000F8" +1685,"7480000000000003FF3B00000000000000F8","7480000000000003FF3E00000000000000F8" +1687,"7480000000000003FF3E00000000000000F8","7480000000000003FF4000000000000000F8" +1689,"7480000000000003FF4000000000000000F8","7480000000000003FF4200000000000000F8" +1691,"7480000000000003FF4200000000000000F8","7480000000000003FF4300000000000000F8" +1693,"7480000000000003FF4300000000000000F8","7480000000000003FF4600000000000000F8" +1695,"7480000000000003FF4600000000000000F8","7480000000000003FF4800000000000000F8" +1697,"7480000000000003FF4800000000000000F8","7480000000000003FF4A00000000000000F8" +1699,"7480000000000003FF4A00000000000000F8","7480000000000003FF4C00000000000000F8" +1701,"7480000000000003FF4C00000000000000F8","7480000000000003FF4E00000000000000F8" +1705,"7480000000000003FF4E00000000000000F8","7480000000000003FF4F00000000000000F8" +1711,"7480000000000003FF4F00000000000000F8","7480000000000003FF5200000000000000F8" +1707,"7480000000000003FF5200000000000000F8","7480000000000003FF5300000000000000F8" +1713,"7480000000000003FF5300000000000000F8","7480000000000003FF5600000000000000F8" +1715,"7480000000000003FF5600000000000000F8","7480000000000003FF5800000000000000F8" +1717,"7480000000000003FF5800000000000000F8","7480000000000003FF5A00000000000000F8" +1719,"7480000000000003FF5A00000000000000F8","7480000000000003FF5C00000000000000F8" +1721,"7480000000000003FF5C00000000000000F8","7480000000000003FF5E00000000000000F8" +1723,"7480000000000003FF5E00000000000000F8","7480000000000003FF6000000000000000F8" +1727,"7480000000000003FF6000000000000000F8","7480000000000003FF6200000000000000F8" +1725,"7480000000000003FF6200000000000000F8","7480000000000003FF6300000000000000F8" +1729,"7480000000000003FF6300000000000000F8","7480000000000003FF6600000000000000F8" +1731,"7480000000000003FF6600000000000000F8","7480000000000003FF6800000000000000F8" +1733,"7480000000000003FF6800000000000000F8","7480000000000003FF6A00000000000000F8" +1735,"7480000000000003FF6A00000000000000F8","7480000000000003FF6C00000000000000F8" +1741,"7480000000000003FF6C00000000000000F8","7480000000000003FF6E00000000000000F8" +1737,"7480000000000003FF6E00000000000000F8","7480000000000003FF6F00000000000000F8" +1765,"7480000000000003FF6F00000000000000F8","7480000000000003FF7200000000000000F8" +1779,"7480000000000003FF7200000000000000F8","7480000000000003FF7300000000000000F8" +1773,"7480000000000003FF7300000000000000F8","7480000000000003FF7400000000000000F8" +1739,"7480000000000003FF7400000000000000F8","7480000000000003FF7500000000000000F8" +1785,"7480000000000003FF7500000000000000F8","7480000000000003FF7600000000000000F8" +1789,"7480000000000003FF7600000000000000F8","7480000000000003FF7700000000000000F8" +1743,"7480000000000003FF7700000000000000F8","7480000000000003FF7800000000000000F8" +1777,"7480000000000003FF7800000000000000F8","7480000000000003FF7A00000000000000F8" +1775,"7480000000000003FF7A00000000000000F8","7480000000000003FF7B00000000000000F8" +1771,"7480000000000003FF7B00000000000000F8","7480000000000003FF7D00000000000000F8" +1761,"7480000000000003FF7D00000000000000F8","7480000000000003FF7E00000000000000F8" +1745,"7480000000000003FF7E00000000000000F8","7480000000000003FF7F00000000000000F8" +1755,"7480000000000003FF7F00000000000000F8","7480000000000003FF8100000000000000F8" +1747,"7480000000000003FF8100000000000000F8","7480000000000003FF8200000000000000F8" +1749,"7480000000000003FF8200000000000000F8","7480000000000003FF8400000000000000F8" +1787,"7480000000000003FF8400000000000000F8","7480000000000003FF8500000000000000F8" +1783,"7480000000000003FF8500000000000000F8","7480000000000003FF8600000000000000F8" +1769,"7480000000000003FF8600000000000000F8","7480000000000003FF8800000000000000F8" +1751,"7480000000000003FF8800000000000000F8","7480000000000003FF8900000000000000F8" +1767,"7480000000000003FF8900000000000000F8","7480000000000003FF8B00000000000000F8" +1753,"7480000000000003FF8B00000000000000F8","7480000000000003FF8C00000000000000F8" +1757,"7480000000000003FF8C00000000000000F8","7480000000000003FF8E00000000000000F8" +1759,"7480000000000003FF8E00000000000000F8","7480000000000003FF9100000000000000F8" +1763,"7480000000000003FF9100000000000000F8","7480000000000003FF9400000000000000F8" +1781,"7480000000000003FF9400000000000000F8","7480000000000003FF9D00000000000000F8" +1791,"7480000000000003FF9D00000000000000F8","7480000000000003FFA400000000000000F8" +1793,"7480000000000003FFA400000000000000F8","7480000000000003FFA600000000000000F8" +1795,"7480000000000003FFA600000000000000F8","7480000000000003FFA800000000000000F8" +1805,"7480000000000003FFA800000000000000F8","7480000000000003FFAA00000000000000F8" +1799,"7480000000000003FFAA00000000000000F8","7480000000000003FFAC00000000000000F8" +1807,"7480000000000003FFAC00000000000000F8","7480000000000003FFAD00000000000000F8" +1803,"7480000000000003FFAD00000000000000F8","7480000000000003FFAE00000000000000F8" +1809,"7480000000000003FFAE00000000000000F8","7480000000000003FFAF00000000000000F8" +1797,"7480000000000003FFAF00000000000000F8","7480000000000003FFB000000000000000F8" +1811,"7480000000000003FFB000000000000000F8","7480000000000003FFB600000000000000F8" +1813,"7480000000000003FFB600000000000000F8","7480000000000003FFB800000000000000F8" +1815,"7480000000000003FFB800000000000000F8","7480000000000003FFBA00000000000000F8" +1817,"7480000000000003FFBA00000000000000F8","7480000000000003FFBC00000000000000F8" +1819,"7480000000000003FFBC00000000000000F8","7480000000000003FFBE00000000000000F8" +1821,"7480000000000003FFBE00000000000000F8","7480000000000003FFC000000000000000F8" +1823,"7480000000000003FFC000000000000000F8","7480000000000003FFC200000000000000F8" +1827,"7480000000000003FFC200000000000000F8","7480000000000003FFC400000000000000F8" +1825,"7480000000000003FFC400000000000000F8","7480000000000003FFC600000000000000F8" +1829,"7480000000000003FFC600000000000000F8","7480000000000003FFC800000000000000F8" +1839,"7480000000000003FFC800000000000000F8","7480000000000003FFCA00000000000000F8" +1837,"7480000000000003FFCA00000000000000F8","7480000000000003FFCB00000000000000F8" +1831,"7480000000000003FFCB00000000000000F8","7480000000000003FFCC00000000000000F8" +1833,"7480000000000003FFCC00000000000000F8","7480000000000003FFCE00000000000000F8" +1841,"7480000000000003FFCE00000000000000F8","7480000000000003FFD600000000000000F8" +1843,"7480000000000003FFD600000000000000F8","7480000000000003FFD800000000000000F8" +1917,"7480000000000003FFD800000000000000F8","7480000000000003FFDC00000000000000F8" +1893,"7480000000000003FFDC00000000000000F8","7480000000000003FFDD00000000000000F8" +1847,"7480000000000003FFDD00000000000000F8","7480000000000003FFDE00000000000000F8" +1869,"7480000000000003FFDE00000000000000F8","7480000000000003FFDF00000000000000F8" +1899,"7480000000000003FFDF00000000000000F8","7480000000000003FFE000000000000000F8" +1849,"7480000000000003FFE000000000000000F8","7480000000000003FFE100000000000000F8" +1845,"7480000000000003FFE100000000000000F8","7480000000000003FFE200000000000000F8" +1909,"7480000000000003FFE200000000000000F8","7480000000000003FFE600000000000000F8" +1879,"7480000000000003FFE600000000000000F8","7480000000000003FFE700000000000000F8" +1851,"7480000000000003FFE700000000000000F8","7480000000000003FFE800000000000000F8" +1865,"7480000000000003FFE800000000000000F8","7480000000000003FFEA00000000000000F8" +1863,"7480000000000003FFEA00000000000000F8","7480000000000003FFEB00000000000000F8" +1853,"7480000000000003FFEB00000000000000F8","7480000000000003FFEC00000000000000F8" +1855,"7480000000000003FFEC00000000000000F8","7480000000000003FFEE00000000000000F8" +1857,"7480000000000003FFEE00000000000000F8","7480000000000003FFF000000000000000F8" +1861,"7480000000000003FFF000000000000000F8","7480000000000003FFF200000000000000F8" +1859,"7480000000000003FFF200000000000000F8","7480000000000003FFF300000000000000F8" +1867,"7480000000000003FFF300000000000000F8","7480000000000003FFF800000000000000F8" +1907,"7480000000000003FFF800000000000000F8","7480000000000003FFFB00000000000000F8" +1915,"7480000000000003FFFB00000000000000F8","7480000000000003FFFC00000000000000F8" +1897,"7480000000000003FFFC00000000000000F8","7480000000000003FFFD00000000000000F8" +1905,"7480000000000003FFFD00000000000000F8","7480000000000003FFFE00000000000000F8" +1891,"7480000000000003FFFE00000000000000F8","7480000000000003FFFF00000000000000F8" +1873,"7480000000000003FFFF00000000000000F8","7480000000000004FF0000000000000000F8" +1901,"7480000000000004FF0000000000000000F8","7480000000000004FF0100000000000000F8" +1913,"7480000000000004FF0100000000000000F8","7480000000000004FF0200000000000000F8" +1871,"7480000000000004FF0200000000000000F8","7480000000000004FF0300000000000000F8" +1889,"7480000000000004FF0300000000000000F8","7480000000000004FF0600000000000000F8" +1875,"7480000000000004FF0600000000000000F8","7480000000000004FF0700000000000000F8" +1881,"7480000000000004FF0700000000000000F8","7480000000000004FF0900000000000000F8" +1887,"7480000000000004FF0900000000000000F8","7480000000000004FF0A00000000000000F8" +1877,"7480000000000004FF0A00000000000000F8","7480000000000004FF0B00000000000000F8" +1885,"7480000000000004FF0B00000000000000F8","7480000000000004FF0F00000000000000F8" +1883,"7480000000000004FF0F00000000000000F8","7480000000000004FF1000000000000000F8" +1919,"7480000000000004FF1000000000000000F8","7480000000000004FF1800000000000000F8" +1911,"7480000000000004FF1800000000000000F8","7480000000000004FF1900000000000000F8" +1921,"7480000000000004FF1900000000000000F8","7480000000000004FF1A00000000000000F8" +1895,"7480000000000004FF1A00000000000000F8","7480000000000004FF1B00000000000000F8" +1903,"7480000000000004FF1B00000000000000F8","7480000000000004FF1F00000000000000F8" +1923,"7480000000000004FF1F00000000000000F8","7480000000000004FF2A00000000000000F8" +1925,"7480000000000004FF2A00000000000000F8","7480000000000004FF2C00000000000000F8" +1929,"7480000000000004FF2C00000000000000F8","7480000000000004FF2E00000000000000F8" +1927,"7480000000000004FF2E00000000000000F8","7480000000000004FF2F00000000000000F8" +1931,"7480000000000004FF2F00000000000000F8","7480000000000004FF3200000000000000F8" +1933,"7480000000000004FF3200000000000000F8","7480000000000004FF3400000000000000F8" +1945,"7480000000000004FF3400000000000000F8","7480000000000004FF3600000000000000F8" +1939,"7480000000000004FF3600000000000000F8","7480000000000004FF3700000000000000F8" +1935,"7480000000000004FF3700000000000000F8","7480000000000004FF3800000000000000F8" +1943,"7480000000000004FF3800000000000000F8","7480000000000004FF3B00000000000000F8" +1941,"7480000000000004FF3B00000000000000F8","7480000000000004FF3C00000000000000F8" +1951,"7480000000000004FF3C00000000000000F8","7480000000000004FF4000000000000000F8" +1947,"7480000000000004FF4000000000000000F8","7480000000000004FF4100000000000000F8" +1961,"7480000000000004FF4100000000000000F8","7480000000000004FF4400000000000000F8" +1953,"7480000000000004FF4400000000000000F8","7480000000000004FF4500000000000000F8" +1965,"7480000000000004FF4500000000000000F8","7480000000000004FF4700000000000000F8" +1957,"7480000000000004FF4700000000000000F8","7480000000000004FF4800000000000000F8" +1955,"7480000000000004FF4800000000000000F8","7480000000000004FF4900000000000000F8" +1959,"7480000000000004FF4900000000000000F8","7480000000000004FF4C00000000000000F8" +1967,"7480000000000004FF4C00000000000000F8","7480000000000004FF5000000000000000F8" +1963,"7480000000000004FF5000000000000000F8","7480000000000004FF5200000000000000F8" +1969,"7480000000000004FF5200000000000000F8","7480000000000004FF5400000000000000F8" +1973,"7480000000000004FF5400000000000000F8","7480000000000004FF5600000000000000F8" +1971,"7480000000000004FF5600000000000000F8","7480000000000004FF5700000000000000F8" +1975,"7480000000000004FF5700000000000000F8","7480000000000004FF5A00000000000000F8" +1977,"7480000000000004FF5A00000000000000F8","7480000000000004FF5C00000000000000F8" +1979,"7480000000000004FF5C00000000000000F8","7480000000000004FF5E00000000000000F8" +1983,"7480000000000004FF5E00000000000000F8","7480000000000004FF6000000000000000F8" +1981,"7480000000000004FF6000000000000000F8","7480000000000004FF6100000000000000F8" +1985,"7480000000000004FF6100000000000000F8","7480000000000004FF6400000000000000F8" +1987,"7480000000000004FF6400000000000000F8","7480000000000004FF6600000000000000F8" +1989,"7480000000000004FF6600000000000000F8","7480000000000004FF6800000000000000F8" +1991,"7480000000000004FF6800000000000000F8","7480000000000004FF6A00000000000000F8" +1995,"7480000000000004FF6A00000000000000F8","7480000000000004FF6C00000000000000F8" +1993,"7480000000000004FF6C00000000000000F8","7480000000000004FF6D00000000000000F8" +1997,"7480000000000004FF6D00000000000000F8","7480000000000004FF7000000000000000F8" +1999,"7480000000000004FF7000000000000000F8","7480000000000004FF7200000000000000F8" +2001,"7480000000000004FF7200000000000000F8","7480000000000004FF7400000000000000F8" +2003,"7480000000000004FF7400000000000000F8","7480000000000004FF7600000000000000F8" +2005,"7480000000000004FF7600000000000000F8","7480000000000004FF7800000000000000F8" +2011,"7480000000000004FF7800000000000000F8","7480000000000004FF7A00000000000000F8" +2007,"7480000000000004FF7A00000000000000F8","7480000000000004FF7C00000000000000F8" +2013,"7480000000000004FF7C00000000000000F8","7480000000000004FF7E00000000000000F8" +2015,"7480000000000004FF7E00000000000000F8","7480000000000004FF8000000000000000F8" +2019,"7480000000000004FF8000000000000000F8","7480000000000004FF8200000000000000F8" +2017,"7480000000000004FF8200000000000000F8","7480000000000004FF8300000000000000F8" +2021,"7480000000000004FF8300000000000000F8","7480000000000004FF8600000000000000F8" +2023,"7480000000000004FF8600000000000000F8","7480000000000004FF8800000000000000F8" +2025,"7480000000000004FF8800000000000000F8","7480000000000004FF8A00000000000000F8" +2027,"7480000000000004FF8A00000000000000F8","7480000000000004FF8C00000000000000F8" +2029,"7480000000000004FF8C00000000000000F8","7480000000000004FF8E00000000000000F8" +2033,"7480000000000004FF8E00000000000000F8","7480000000000004FF9000000000000000F8" +2035,"7480000000000004FF9000000000000000F8","7480000000000004FF9200000000000000F8" +2037,"7480000000000004FF9200000000000000F8","7480000000000004FF9400000000000000F8" +2039,"7480000000000004FF9400000000000000F8","7480000000000004FF9600000000000000F8" +2041,"7480000000000004FF9600000000000000F8","7480000000000004FF9800000000000000F8" +2047,"7480000000000004FF9800000000000000F8","7480000000000004FF9A00000000000000F8" +2043,"7480000000000004FF9A00000000000000F8","7480000000000004FF9B00000000000000F8" +2049,"7480000000000004FF9B00000000000000F8","7480000000000004FF9E00000000000000F8" +2051,"7480000000000004FF9E00000000000000F8","7480000000000004FFA000000000000000F8" +2055,"7480000000000004FFA000000000000000F8","7480000000000004FFA200000000000000F8" +2053,"7480000000000004FFA200000000000000F8","7480000000000004FFA300000000000000F8" +2057,"7480000000000004FFA300000000000000F8","7480000000000004FFA600000000000000F8" +2061,"7480000000000004FFA600000000000000F8","7480000000000004FFA800000000000000F8" +2063,"7480000000000004FFA800000000000000F8","7480000000000004FFAA00000000000000F8" +2065,"7480000000000004FFAA00000000000000F8","7480000000000004FFAC00000000000000F8" +2075,"7480000000000004FFAC00000000000000F8","7480000000000004FFAE00000000000000F8" +2059,"7480000000000004FFAE00000000000000F8","7480000000000004FFAF00000000000000F8" +2073,"7480000000000004FFAF00000000000000F8","7480000000000004FFB200000000000000F8" +2067,"7480000000000004FFB200000000000000F8","7480000000000004FFB400000000000000F8" +2069,"7480000000000004FFB400000000000000F8","7480000000000004FFB600000000000000F8" +2071,"7480000000000004FFB600000000000000F8","7480000000000004FFB800000000000000F8" +2077,"7480000000000004FFB800000000000000F8","7480000000000004FFBA00000000000000F8" +2081,"7480000000000004FFBA00000000000000F8","7480000000000004FFBB00000000000000F8" +2083,"7480000000000004FFBB00000000000000F8","7480000000000004FFBE00000000000000F8" +2085,"7480000000000004FFBE00000000000000F8","7480000000000004FFC000000000000000F8" +2087,"7480000000000004FFC000000000000000F8","7480000000000004FFC200000000000000F8" +2089,"7480000000000004FFC200000000000000F8","7480000000000004FFC400000000000000F8" +2099,"7480000000000004FFC400000000000000F8","7480000000000004FFC600000000000000F8" +2103,"7480000000000004FFC600000000000000F8","7480000000000004FFC800000000000000F8" +2091,"7480000000000004FFC800000000000000F8","7480000000000004FFCA00000000000000F8" +2097,"7480000000000004FFCA00000000000000F8","7480000000000004FFCC00000000000000F8" +2105,"7480000000000004FFCC00000000000000F8","7480000000000004FFCE00000000000000F8" +2107,"7480000000000004FFCE00000000000000F8","7480000000000004FFD000000000000000F8" +2109,"7480000000000004FFD000000000000000F8","7480000000000004FFD200000000000000F8" +2111,"7480000000000004FFD200000000000000F8","7480000000000004FFD400000000000000F8" +2123,"7480000000000004FFD400000000000000F8","7480000000000004FFD600000000000000F8" +2115,"7480000000000004FFD600000000000000F8","7480000000000004FFD700000000000000F8" +2121,"7480000000000004FFD700000000000000F8","7480000000000004FFDA00000000000000F8" +2113,"7480000000000004FFDA00000000000000F8","7480000000000004FFDB00000000000000F8" +2125,"7480000000000004FFDB00000000000000F8","7480000000000004FFDE00000000000000F8" +2127,"7480000000000004FFDE00000000000000F8","7480000000000004FFE000000000000000F8" +2129,"7480000000000004FFE000000000000000F8","7480000000000004FFE200000000000000F8" +2131,"7480000000000004FFE200000000000000F8","7480000000000004FFE400000000000000F8" +2179,"7480000000000004FFE400000000000000F8","7480000000000004FFE600000000000000F8" +2169,"7480000000000004FFE600000000000000F8","7480000000000004FFE700000000000000F8" +2177,"7480000000000004FFE700000000000000F8","7480000000000004FFE800000000000000F8" +2191,"7480000000000004FFE800000000000000F8","7480000000000004FFE900000000000000F8" +2181,"7480000000000004FFE900000000000000F8","7480000000000004FFEA00000000000000F8" +2173,"7480000000000004FFEA00000000000000F8","7480000000000004FFEB00000000000000F8" +2189,"7480000000000004FFEB00000000000000F8","7480000000000004FFEC00000000000000F8" +2185,"7480000000000004FFEC00000000000000F8","7480000000000004FFED00000000000000F8" +2163,"7480000000000004FFED00000000000000F8","7480000000000004FFEE00000000000000F8" +2133,"7480000000000004FFEE00000000000000F8","7480000000000004FFEF00000000000000F8" +2161,"7480000000000004FFEF00000000000000F8","7480000000000004FFF100000000000000F8" +2135,"7480000000000004FFF100000000000000F8","7480000000000004FFF200000000000000F8" +2137,"7480000000000004FFF200000000000000F8","7480000000000004FFF400000000000000F8" +2145,"7480000000000004FFF400000000000000F8","7480000000000004FFF600000000000000F8" +2141,"7480000000000004FFF600000000000000F8","7480000000000004FFF700000000000000F8" +2139,"7480000000000004FFF700000000000000F8","7480000000000004FFF800000000000000F8" +2143,"7480000000000004FFF800000000000000F8","7480000000000004FFFB00000000000000F8" +2147,"7480000000000004FFFB00000000000000F8","7480000000000004FFFE00000000000000F8" +2149,"7480000000000004FFFE00000000000000F8","7480000000000005FF0000000000000000F8" +2171,"7480000000000005FF0000000000000000F8","7480000000000005FF0200000000000000F8" +2151,"7480000000000005FF0200000000000000F8","7480000000000005FF0300000000000000F8" +2157,"7480000000000005FF0300000000000000F8","7480000000000005FF0400000000000000F8" +2153,"7480000000000005FF0400000000000000F8","7480000000000005FF0500000000000000F8" +2155,"7480000000000005FF0500000000000000F8","7480000000000005FF0800000000000000F8" +2159,"7480000000000005FF0800000000000000F8","7480000000000005FF0B00000000000000F8" +2165,"7480000000000005FF0B00000000000000F8","7480000000000005FF0E00000000000000F8" +2167,"7480000000000005FF0E00000000000000F8","7480000000000005FF1100000000000000F8" +2183,"7480000000000005FF1100000000000000F8","7480000000000005FF1900000000000000F8" +2193,"7480000000000005FF1900000000000000F8","7480000000000005FF1E00000000000000F8" +2195,"7480000000000005FF1E00000000000000F8","7480000000000005FF2000000000000000F8" +2197,"7480000000000005FF2000000000000000F8","7480000000000005FF2200000000000000F8" +2199,"7480000000000005FF2200000000000000F8","7480000000000005FF2400000000000000F8" +2241,"7480000000000005FF2400000000000000F8","7480000000000005FF2500000000000000F8" +2235,"7480000000000005FF2500000000000000F8","7480000000000005FF2700000000000000F8" +2245,"7480000000000005FF2700000000000000F8","7480000000000005FF2800000000000000F8" +2203,"7480000000000005FF2800000000000000F8","7480000000000005FF2900000000000000F8" +2231,"7480000000000005FF2900000000000000F8","7480000000000005FF2A00000000000000F8" +2201,"7480000000000005FF2A00000000000000F8","7480000000000005FF2B00000000000000F8" +2221,"7480000000000005FF2B00000000000000F8","7480000000000005FF2E00000000000000F8" +2253,"7480000000000005FF2E00000000000000F8","7480000000000005FF2F00000000000000F8" +2229,"7480000000000005FF2F00000000000000F8","7480000000000005FF3000000000000000F8" +2247,"7480000000000005FF3000000000000000F8","7480000000000005FF3100000000000000F8" +2239,"7480000000000005FF3100000000000000F8","7480000000000005FF3200000000000000F8" +2205,"7480000000000005FF3200000000000000F8","7480000000000005FF3300000000000000F8" +2207,"7480000000000005FF3300000000000000F8","7480000000000005FF3400000000000000F8" +2211,"7480000000000005FF3400000000000000F8","7480000000000005FF3600000000000000F8" +2249,"7480000000000005FF3600000000000000F8","7480000000000005FF3700000000000000F8" +2209,"7480000000000005FF3700000000000000F8","7480000000000005FF3900000000000000F8" +2225,"7480000000000005FF3900000000000000F8","7480000000000005FF3C00000000000000F8" +2223,"7480000000000005FF3C00000000000000F8","7480000000000005FF3D00000000000000F8" +2219,"7480000000000005FF3D00000000000000F8","7480000000000005FF3E00000000000000F8" +2227,"7480000000000005FF3E00000000000000F8","7480000000000005FF3F00000000000000F8" +2213,"7480000000000005FF3F00000000000000F8","7480000000000005FF4000000000000000F8" +2215,"7480000000000005FF4000000000000000F8","7480000000000005FF4200000000000000F8" +2217,"7480000000000005FF4200000000000000F8","7480000000000005FF4400000000000000F8" +2243,"7480000000000005FF4400000000000000F8","7480000000000005FF5000000000000000F8" +2251,"7480000000000005FF5000000000000000F8","7480000000000005FF5500000000000000F8" +2255,"7480000000000005FF5500000000000000F8","7480000000000005FF5800000000000000F8" +2257,"7480000000000005FF5800000000000000F8","7480000000000005FF5A00000000000000F8" +2259,"7480000000000005FF5A00000000000000F8","7480000000000005FF5C00000000000000F8" +2265,"7480000000000005FF5C00000000000000F8","7480000000000005FF5E00000000000000F8" +2333,"7480000000000005FF5E00000000000000F8","7480000000000005FF6000000000000000F8" +2329,"7480000000000005FF6000000000000000F8","7480000000000005FF6100000000000000F8" +2291,"7480000000000005FF6100000000000000F8","7480000000000005FF6200000000000000F8" +2261,"7480000000000005FF6200000000000000F8","7480000000000005FF6300000000000000F8" +2355,"7480000000000005FF6300000000000000F8","7480000000000005FF6500000000000000F8" +2325,"7480000000000005FF6500000000000000F8","7480000000000005FF6600000000000000F8" +2263,"7480000000000005FF6600000000000000F8","7480000000000005FF6700000000000000F8" +2351,"7480000000000005FF6700000000000000F8","7480000000000005FF6800000000000000F8" +2315,"7480000000000005FF6800000000000000F8","7480000000000005FF6900000000000000F8" +2345,"7480000000000005FF6900000000000000F8","7480000000000005FF6B00000000000000F8" +2341,"7480000000000005FF6B00000000000000F8","7480000000000005FF6C00000000000000F8" +2269,"7480000000000005FF6C00000000000000F8","7480000000000005FF6D00000000000000F8" +2331,"7480000000000005FF6D00000000000000F8","7480000000000005FF6E00000000000000F8" +2267,"7480000000000005FF6E00000000000000F8","7480000000000005FF6F00000000000000F8" +2271,"7480000000000005FF6F00000000000000F8","7480000000000005FF7100000000000000F8" +2299,"7480000000000005FF7100000000000000F8","7480000000000005FF7400000000000000F8" +2273,"7480000000000005FF7400000000000000F8","7480000000000005FF7500000000000000F8" +2293,"7480000000000005FF7500000000000000F8","7480000000000005FF7700000000000000F8" +2275,"7480000000000005FF7700000000000000F8","7480000000000005FF7800000000000000F8" +2277,"7480000000000005FF7800000000000000F8","7480000000000005FF7A00000000000000F8" +2279,"7480000000000005FF7A00000000000000F8","7480000000000005FF7C00000000000000F8" +2281,"7480000000000005FF7C00000000000000F8","7480000000000005FF7E00000000000000F8" +2287,"7480000000000005FF7E00000000000000F8","7480000000000005FF8000000000000000F8" +2283,"7480000000000005FF8000000000000000F8","7480000000000005FF8100000000000000F8" +2289,"7480000000000005FF8100000000000000F8","7480000000000005FF8300000000000000F8" +2285,"7480000000000005FF8300000000000000F8","7480000000000005FF8400000000000000F8" +2309,"7480000000000005FF8400000000000000F8","7480000000000005FF8A00000000000000F8" +2295,"7480000000000005FF8A00000000000000F8","7480000000000005FF8B00000000000000F8" +2311,"7480000000000005FF8B00000000000000F8","7480000000000005FF8D00000000000000F8" +2297,"7480000000000005FF8D00000000000000F8","7480000000000005FF8E00000000000000F8" +2301,"7480000000000005FF8E00000000000000F8","7480000000000005FF9000000000000000F8" +2307,"7480000000000005FF9000000000000000F8","7480000000000005FF9100000000000000F8" +2305,"7480000000000005FF9100000000000000F8","7480000000000005FF9200000000000000F8" +2303,"7480000000000005FF9200000000000000F8","7480000000000005FF9500000000000000F8" +2339,"7480000000000005FF9500000000000000F8","7480000000000005FF9B00000000000000F8" +2349,"7480000000000005FF9B00000000000000F8","7480000000000005FF9C00000000000000F8" +2361,"7480000000000005FF9C00000000000000F8","7480000000000005FF9D00000000000000F8" +2313,"7480000000000005FF9D00000000000000F8","7480000000000005FF9E00000000000000F8" +2317,"7480000000000005FF9E00000000000000F8","7480000000000005FFA000000000000000F8" +2347,"7480000000000005FFA000000000000000F8","7480000000000005FFA100000000000000F8" +2321,"7480000000000005FFA100000000000000F8","7480000000000005FFA400000000000000F8" +2319,"7480000000000005FFA400000000000000F8","7480000000000005FFA500000000000000F8" +2337,"7480000000000005FFA500000000000000F8","7480000000000005FFA700000000000000F8" +2323,"7480000000000005FFA700000000000000F8","7480000000000005FFA800000000000000F8" +2327,"7480000000000005FFA800000000000000F8","7480000000000005FFAB00000000000000F8" +2335,"7480000000000005FFAB00000000000000F8","7480000000000005FFB000000000000000F8" +2343,"7480000000000005FFB000000000000000F8","7480000000000005FFB500000000000000F8" +2353,"7480000000000005FFB500000000000000F8","7480000000000005FFBD00000000000000F8" +2357,"7480000000000005FFBD00000000000000F8","7480000000000005FFC000000000000000F8" +2359,"7480000000000005FFC000000000000000F8","7480000000000005FFC200000000000000F8" +2363,"7480000000000005FFC200000000000000F8","7480000000000005FFC400000000000000F8" +2365,"7480000000000005FFC400000000000000F8","7480000000000005FFC600000000000000F8" +2367,"7480000000000005FFC600000000000000F8","7480000000000005FFC800000000000000F8" +2369,"7480000000000005FFC800000000000000F8","7480000000000005FFCA00000000000000F8" +2377,"7480000000000005FFCA00000000000000F8","7480000000000005FFCC00000000000000F8" +2373,"7480000000000005FFCC00000000000000F8","7480000000000005FFCD00000000000000F8" +2371,"7480000000000005FFCD00000000000000F8","7480000000000005FFCE00000000000000F8" +2379,"7480000000000005FFCE00000000000000F8","7480000000000005FFD200000000000000F8" +2381,"7480000000000005FFD200000000000000F8","7480000000000005FFD400000000000000F8" +2383,"7480000000000005FFD400000000000000F8","7480000000000005FFD600000000000000F8" +2385,"7480000000000005FFD600000000000000F8","7480000000000005FFD800000000000000F8" +2391,"7480000000000005FFD800000000000000F8","7480000000000005FFDA00000000000000F8" +2395,"7480000000000005FFDA00000000000000F8","7480000000000005FFDB00000000000000F8" +2397,"7480000000000005FFDB00000000000000F8","7480000000000005FFDE00000000000000F8" +2399,"7480000000000005FFDE00000000000000F8","7480000000000005FFE000000000000000F8" +2401,"7480000000000005FFE000000000000000F8","7480000000000005FFE200000000000000F8" +2403,"7480000000000005FFE200000000000000F8","7480000000000005FFE400000000000000F8" +2405,"7480000000000005FFE400000000000000F8","7480000000000005FFE600000000000000F8" +2409,"7480000000000005FFE600000000000000F8","7480000000000005FFE800000000000000F8" +2411,"7480000000000005FFE800000000000000F8","7480000000000005FFEA00000000000000F8" +2413,"7480000000000005FFEA00000000000000F8","7480000000000005FFEC00000000000000F8" +2407,"7480000000000005FFEC00000000000000F8","7480000000000005FFED00000000000000F8" +2415,"7480000000000005FFED00000000000000F8","7480000000000005FFF000000000000000F8" +2417,"7480000000000005FFF000000000000000F8","7480000000000005FFF200000000000000F8" +2421,"7480000000000005FFF200000000000000F8","7480000000000005FFF400000000000000F8" +2419,"7480000000000005FFF400000000000000F8","7480000000000005FFF600000000000000F8" +2429,"7480000000000005FFF600000000000000F8","7480000000000005FFF800000000000000F8" +2425,"7480000000000005FFF800000000000000F8","7480000000000005FFF900000000000000F8" +2423,"7480000000000005FFF900000000000000F8","7480000000000005FFFB00000000000000F8" +2431,"7480000000000005FFFB00000000000000F8","7480000000000005FFFE00000000000000F8" +2433,"7480000000000005FFFE00000000000000F8","7480000000000006FF0000000000000000F8" +2435,"7480000000000006FF0000000000000000F8","7480000000000006FF0200000000000000F8" +2437,"7480000000000006FF0200000000000000F8","7480000000000006FF0400000000000000F8" +2439,"7480000000000006FF0400000000000000F8","7480000000000006FF0600000000000000F8" +2441,"7480000000000006FF0600000000000000F8","7480000000000006FF0800000000000000F8" +2443,"7480000000000006FF0800000000000000F8","7480000000000006FF0A00000000000000F8" +2445,"7480000000000006FF0A00000000000000F8","7480000000000006FF0C00000000000000F8" +2449,"7480000000000006FF0C00000000000000F8","7480000000000006FF0E00000000000000F8" +2447,"7480000000000006FF0E00000000000000F8","7480000000000006FF0F00000000000000F8" +2451,"7480000000000006FF0F00000000000000F8","7480000000000006FF1200000000000000F8" +2453,"7480000000000006FF1200000000000000F8","7480000000000006FF1400000000000000F8" +2459,"7480000000000006FF1400000000000000F8","7480000000000006FF1600000000000000F8" +2461,"7480000000000006FF1600000000000000F8","7480000000000006FF1800000000000000F8" +2469,"7480000000000006FF1800000000000000F8","7480000000000006FF1A00000000000000F8" +2463,"7480000000000006FF1A00000000000000F8","7480000000000006FF1B00000000000000F8" +2455,"7480000000000006FF1B00000000000000F8","7480000000000006FF1C00000000000000F8" +2457,"7480000000000006FF1C00000000000000F8","7480000000000006FF1D00000000000000F8" +2465,"7480000000000006FF1D00000000000000F8","7480000000000006FF2100000000000000F8" +2467,"7480000000000006FF2100000000000000F8","7480000000000006FF2300000000000000F8" +2475,"7480000000000006FF2300000000000000F8","7480000000000006FF2600000000000000F8" +2471,"7480000000000006FF2600000000000000F8","7480000000000006FF2800000000000000F8" +2477,"7480000000000006FF2800000000000000F8","7480000000000006FF2A00000000000000F8" +2479,"7480000000000006FF2A00000000000000F8","7480000000000006FF2C00000000000000F8" +2481,"7480000000000006FF2C00000000000000F8","7480000000000006FF2E00000000000000F8" +2483,"7480000000000006FF2E00000000000000F8","7480000000000006FF3000000000000000F8" +2485,"7480000000000006FF3000000000000000F8","7480000000000006FF3200000000000000F8" +2487,"7480000000000006FF3200000000000000F8","7480000000000006FF3400000000000000F8" +2495,"7480000000000006FF3400000000000000F8","7480000000000006FF3600000000000000F8" +2489,"7480000000000006FF3600000000000000F8","7480000000000006FF3700000000000000F8" +2497,"7480000000000006FF3700000000000000F8","7480000000000006FF3A00000000000000F8" +2499,"7480000000000006FF3A00000000000000F8","7480000000000006FF3C00000000000000F8" +2491,"7480000000000006FF3C00000000000000F8","7480000000000006FF3E00000000000000F8" +2513,"7480000000000006FF3E00000000000000F8","7480000000000006FF4000000000000000F8" +2501,"7480000000000006FF4000000000000000F8","7480000000000006FF4100000000000000F8" +2507,"7480000000000006FF4100000000000000F8","7480000000000006FF4300000000000000F8" +2511,"7480000000000006FF4300000000000000F8","7480000000000006FF4400000000000000F8" +2503,"7480000000000006FF4400000000000000F8","7480000000000006FF4500000000000000F8" +2505,"7480000000000006FF4500000000000000F8","7480000000000006FF4700000000000000F8" +2515,"7480000000000006FF4700000000000000F8","7480000000000006FF4C00000000000000F8" +2517,"7480000000000006FF4C00000000000000F8","7480000000000006FF4E00000000000000F8" +2519,"7480000000000006FF4E00000000000000F8","7480000000000006FF5000000000000000F8" +2521,"7480000000000006FF5000000000000000F8","7480000000000006FF5200000000000000F8" +2523,"7480000000000006FF5200000000000000F8","7480000000000006FF5400000000000000F8" +2525,"7480000000000006FF5400000000000000F8","7480000000000006FF5600000000000000F8" +2531,"7480000000000006FF5600000000000000F8","7480000000000006FF5800000000000000F8" +2527,"7480000000000006FF5800000000000000F8","7480000000000006FF5900000000000000F8" +2549,"7480000000000006FF5900000000000000F8","7480000000000006FF5B00000000000000F8" +2529,"7480000000000006FF5B00000000000000F8","7480000000000006FF5C00000000000000F8" +2547,"7480000000000006FF5C00000000000000F8","7480000000000006FF5F00000000000000F8" +2563,"7480000000000006FF5F00000000000000F8","7480000000000006FF6000000000000000F8" +2533,"7480000000000006FF6000000000000000F8","7480000000000006FF6100000000000000F8" +2553,"7480000000000006FF6100000000000000F8","7480000000000006FF6200000000000000F8" +2555,"7480000000000006FF6200000000000000F8","7480000000000006FF6400000000000000F8" +2567,"7480000000000006FF6400000000000000F8","7480000000000006FF6500000000000000F8" +2557,"7480000000000006FF6500000000000000F8","7480000000000006FF6600000000000000F8" +2559,"7480000000000006FF6600000000000000F8","7480000000000006FF6700000000000000F8" +2565,"7480000000000006FF6700000000000000F8","7480000000000006FF6800000000000000F8" +2561,"7480000000000006FF6800000000000000F8","7480000000000006FF6900000000000000F8" +2545,"7480000000000006FF6900000000000000F8","7480000000000006FF6A00000000000000F8" +2541,"7480000000000006FF6A00000000000000F8","7480000000000006FF6B00000000000000F8" +2535,"7480000000000006FF6B00000000000000F8","7480000000000006FF6C00000000000000F8" +2537,"7480000000000006FF6C00000000000000F8","7480000000000006FF6E00000000000000F8" +2539,"7480000000000006FF6E00000000000000F8","7480000000000006FF7000000000000000F8" +2543,"7480000000000006FF7000000000000000F8","7480000000000006FF7300000000000000F8" +2551,"7480000000000006FF7300000000000000F8","7480000000000006FF7800000000000000F8" +2571,"7480000000000006FF7800000000000000F8","7480000000000006FF8200000000000000F8" +2573,"7480000000000006FF8200000000000000F8","7480000000000006FF8400000000000000F8" +2575,"7480000000000006FF8400000000000000F8","7480000000000006FF8600000000000000F8" +2569,"7480000000000006FF8600000000000000F8","7480000000000006FF8800000000000000F8" +2577,"7480000000000006FF8800000000000000F8","7480000000000006FF8A00000000000000F8" +2579,"7480000000000006FF8A00000000000000F8","7480000000000006FF8C00000000000000F8" +2583,"7480000000000006FF8C00000000000000F8","7480000000000006FF8D00000000000000F8" +2589,"7480000000000006FF8D00000000000000F8","7480000000000006FF9000000000000000F8" +2585,"7480000000000006FF9000000000000000F8","7480000000000006FF9100000000000000F8" +2591,"7480000000000006FF9100000000000000F8","7480000000000006FF9400000000000000F8" +2593,"7480000000000006FF9400000000000000F8","7480000000000006FF9600000000000000F8" +2595,"7480000000000006FF9600000000000000F8","7480000000000006FF9800000000000000F8" +2599,"7480000000000006FF9800000000000000F8","7480000000000006FF9A00000000000000F8" +2587,"7480000000000006FF9A00000000000000F8","7480000000000006FF9C00000000000000F8" +2603,"7480000000000006FF9C00000000000000F8","7480000000000006FF9E00000000000000F8" +2605,"7480000000000006FF9E00000000000000F8","7480000000000006FFA000000000000000F8" +2607,"7480000000000006FFA000000000000000F8","7480000000000006FFA200000000000000F8" +2609,"7480000000000006FFA200000000000000F8","7480000000000006FFA300000000000000F8" +2597,"7480000000000006FFA300000000000000F8","7480000000000006FFA400000000000000F8" +2601,"7480000000000006FFA400000000000000F8","7480000000000006FFA600000000000000F8" +2611,"7480000000000006FFA600000000000000F8","7480000000000006FFA900000000000000F8" +2615,"7480000000000006FFA900000000000000F8","7480000000000006FFAC00000000000000F8" +2613,"7480000000000006FFAC00000000000000F8","7480000000000006FFAD00000000000000F8" +2617,"7480000000000006FFAD00000000000000F8","7480000000000006FFB000000000000000F8" +2619,"7480000000000006FFB000000000000000F8","7480000000000006FFB200000000000000F8" +2625,"7480000000000006FFB200000000000000F8","7480000000000006FFB400000000000000F8" +2621,"7480000000000006FFB400000000000000F8","7480000000000006FFB600000000000000F8" +2627,"7480000000000006FFB600000000000000F8","7480000000000006FFB800000000000000F8" +2629,"7480000000000006FFB800000000000000F8","7480000000000006FFBA00000000000000F8" +2637,"7480000000000006FFBA00000000000000F8","7480000000000006FFBC00000000000000F8" +2639,"7480000000000006FFBC00000000000000F8","7480000000000006FFBE00000000000000F8" +2633,"7480000000000006FFBE00000000000000F8","7480000000000006FFC000000000000000F8" +2641,"7480000000000006FFC000000000000000F8","7480000000000006FFC100000000000000F8" +2631,"7480000000000006FFC100000000000000F8","7480000000000006FFC200000000000000F8" +2693,"7480000000000006FFC200000000000000F8","7480000000000006FFC500000000000000F8" +2667,"7480000000000006FFC500000000000000F8","7480000000000006FFC700000000000000F8" +2643,"7480000000000006FFC700000000000000F8","7480000000000006FFC800000000000000F8" +2671,"7480000000000006FFC800000000000000F8","7480000000000006FFC900000000000000F8" +2711,"7480000000000006FFC900000000000000F8","7480000000000006FFCA00000000000000F8" +2645,"7480000000000006FFCA00000000000000F8","7480000000000006FFCB00000000000000F8" +2705,"7480000000000006FFCB00000000000000F8","7480000000000006FFCE00000000000000F8" +2707,"7480000000000006FFCE00000000000000F8","7480000000000006FFCF00000000000000F8" +2647,"7480000000000006FFCF00000000000000F8","7480000000000006FFD000000000000000F8" +2701,"7480000000000006FFD000000000000000F8","7480000000000006FFD100000000000000F8" +2695,"7480000000000006FFD100000000000000F8","7480000000000006FFD300000000000000F8" +2709,"7480000000000006FFD300000000000000F8","7480000000000006FFD400000000000000F8" +2651,"7480000000000006FFD400000000000000F8","7480000000000006FFD500000000000000F8" +2665,"7480000000000006FFD500000000000000F8","7480000000000006FFD600000000000000F8" +2649,"7480000000000006FFD600000000000000F8","7480000000000006FFD700000000000000F8" +2653,"7480000000000006FFD700000000000000F8","7480000000000006FFDA00000000000000F8" +2679,"7480000000000006FFDA00000000000000F8","7480000000000006FFDB00000000000000F8" +2657,"7480000000000006FFDB00000000000000F8","7480000000000006FFDD00000000000000F8" +2655,"7480000000000006FFDD00000000000000F8","7480000000000006FFDE00000000000000F8" +2691,"7480000000000006FFDE00000000000000F8","7480000000000006FFE100000000000000F8" +2699,"7480000000000006FFE100000000000000F8","7480000000000006FFE200000000000000F8" +2659,"7480000000000006FFE200000000000000F8","7480000000000006FFE300000000000000F8" +2663,"7480000000000006FFE300000000000000F8","7480000000000006FFE500000000000000F8" +2661,"7480000000000006FFE500000000000000F8","7480000000000006FFE600000000000000F8" +2669,"7480000000000006FFE600000000000000F8","7480000000000006FFEB00000000000000F8" +2683,"7480000000000006FFEB00000000000000F8","7480000000000006FFEE00000000000000F8" +2697,"7480000000000006FFEE00000000000000F8","7480000000000006FFEF00000000000000F8" +2681,"7480000000000006FFEF00000000000000F8","7480000000000006FFF000000000000000F8" +2703,"7480000000000006FFF000000000000000F8","7480000000000006FFF100000000000000F8" +2673,"7480000000000006FFF100000000000000F8","7480000000000006FFF200000000000000F8" +2675,"7480000000000006FFF200000000000000F8","7480000000000006FFF400000000000000F8" +2677,"7480000000000006FFF400000000000000F8","7480000000000006FFF600000000000000F8" +2687,"7480000000000006FFF600000000000000F8","7480000000000006FFFB00000000000000F8" +2685,"7480000000000006FFFB00000000000000F8","7480000000000006FFFC00000000000000F8" +2689,"7480000000000006FFFC00000000000000F8","7480000000000006FFFF00000000000000F8" +2713,"7480000000000006FFFF00000000000000F8","7480000000000007FF0C00000000000000F8" +2715,"7480000000000007FF0C00000000000000F8","7480000000000007FF0E00000000000000F8" +2717,"7480000000000007FF0E00000000000000F8","7480000000000007FF1000000000000000F8" +2719,"7480000000000007FF1000000000000000F8","7480000000000007FF1200000000000000F8" +2721,"7480000000000007FF1200000000000000F8","7480000000000007FF1400000000000000F8" +2723,"7480000000000007FF1400000000000000F8","7480000000000007FF1600000000000000F8" +2725,"7480000000000007FF1600000000000000F8","7480000000000007FF1800000000000000F8" +2727,"7480000000000007FF1800000000000000F8","7480000000000007FF1A00000000000000F8" +2729,"7480000000000007FF1A00000000000000F8","7480000000000007FF1C00000000000000F8" +2731,"7480000000000007FF1C00000000000000F8","7480000000000007FF1E00000000000000F8" +2733,"7480000000000007FF1E00000000000000F8","7480000000000007FF2000000000000000F8" +2735,"7480000000000007FF2000000000000000F8","7480000000000007FF2100000000000000F8" +2739,"7480000000000007FF2100000000000000F8","7480000000000007FF2400000000000000F8" +2741,"7480000000000007FF2400000000000000F8","7480000000000007FF2600000000000000F8" +2745,"7480000000000007FF2600000000000000F8","7480000000000007FF2800000000000000F8" +2743,"7480000000000007FF2800000000000000F8","7480000000000007FF2900000000000000F8" +2753,"7480000000000007FF2900000000000000F8","7480000000000007FF2C00000000000000F8" +2747,"7480000000000007FF2C00000000000000F8","7480000000000007FF2D00000000000000F8" +2751,"7480000000000007FF2D00000000000000F8","7480000000000007FF2F00000000000000F8" +2755,"7480000000000007FF2F00000000000000F8","7480000000000007FF3200000000000000F8" +2763,"7480000000000007FF3200000000000000F8","7480000000000007FF3400000000000000F8" +2765,"7480000000000007FF3400000000000000F8","7480000000000007FF3600000000000000F8" +2759,"7480000000000007FF3600000000000000F8","7480000000000007FF3800000000000000F8" +2757,"7480000000000007FF3800000000000000F8","7480000000000007FF3900000000000000F8" +2761,"7480000000000007FF3900000000000000F8","7480000000000007FF3B00000000000000F8" +2767,"7480000000000007FF3B00000000000000F8","7480000000000007FF3E00000000000000F8" +2769,"7480000000000007FF3E00000000000000F8","7480000000000007FF4000000000000000F8" +2773,"7480000000000007FF4000000000000000F8","7480000000000007FF4200000000000000F8" +2775,"7480000000000007FF4200000000000000F8","7480000000000007FF4300000000000000F8" +2771,"7480000000000007FF4300000000000000F8","7480000000000007FF4400000000000000F8" +2777,"7480000000000007FF4400000000000000F8","7480000000000007FF4700000000000000F8" +2783,"7480000000000007FF4700000000000000F8","7480000000000007FF4A00000000000000F8" +2779,"7480000000000007FF4A00000000000000F8","7480000000000007FF4C00000000000000F8" +2789,"7480000000000007FF4C00000000000000F8","7480000000000007FF4D00000000000000F8" +2787,"7480000000000007FF4D00000000000000F8","7480000000000007FF5000000000000000F8" +2797,"7480000000000007FF5000000000000000F8","7480000000000007FF5200000000000000F8" +2791,"7480000000000007FF5200000000000000F8","7480000000000007FF5400000000000000F8" +2793,"7480000000000007FF5400000000000000F8","7480000000000007FF5600000000000000F8" +2795,"7480000000000007FF5600000000000000F8","7480000000000007FF5800000000000000F8" +2799,"7480000000000007FF5800000000000000F8","7480000000000007FF5A00000000000000F8" +2801,"7480000000000007FF5A00000000000000F8","7480000000000007FF5C00000000000000F8" +2803,"7480000000000007FF5C00000000000000F8","7480000000000007FF5E00000000000000F8" +2805,"7480000000000007FF5E00000000000000F8","7480000000000007FF6000000000000000F8" +2807,"7480000000000007FF6000000000000000F8","7480000000000007FF6200000000000000F8" +2809,"7480000000000007FF6200000000000000F8","7480000000000007FF6400000000000000F8" +2811,"7480000000000007FF6400000000000000F8","7480000000000007FF6600000000000000F8" +2823,"7480000000000007FF6600000000000000F8","7480000000000007FF6800000000000000F8" +2813,"7480000000000007FF6800000000000000F8","7480000000000007FF6A00000000000000F8" +2815,"7480000000000007FF6A00000000000000F8","7480000000000007FF6B00000000000000F8" +2821,"7480000000000007FF6B00000000000000F8","7480000000000007FF6E00000000000000F8" +2817,"7480000000000007FF6E00000000000000F8","7480000000000007FF6F00000000000000F8" +2825,"7480000000000007FF6F00000000000000F8","7480000000000007FF7200000000000000F8" +2827,"7480000000000007FF7200000000000000F8","7480000000000007FF7400000000000000F8" +2829,"7480000000000007FF7400000000000000F8","7480000000000007FF7600000000000000F8" +2831,"7480000000000007FF7600000000000000F8","7480000000000007FF7800000000000000F8" +2833,"7480000000000007FF7800000000000000F8","7480000000000007FF7A00000000000000F8" +2839,"7480000000000007FF7A00000000000000F8","7480000000000007FF7B00000000000000F8" +2843,"7480000000000007FF7B00000000000000F8","7480000000000007FF7C00000000000000F8" +2837,"7480000000000007FF7C00000000000000F8","7480000000000007FF7E00000000000000F8" +2835,"7480000000000007FF7E00000000000000F8","7480000000000007FF8000000000000000F8" +2841,"7480000000000007FF8000000000000000F8","7480000000000007FF8300000000000000F8" +2845,"7480000000000007FF8300000000000000F8","7480000000000007FF8600000000000000F8" +2851,"7480000000000007FF8600000000000000F8","7480000000000007FF8800000000000000F8" +2849,"7480000000000007FF8800000000000000F8","7480000000000007FF8900000000000000F8" +2853,"7480000000000007FF8900000000000000F8","7480000000000007FF8C00000000000000F8" +2857,"7480000000000007FF8C00000000000000F8","7480000000000007FF8E00000000000000F8" +2859,"7480000000000007FF8E00000000000000F8","7480000000000007FF9000000000000000F8" +2861,"7480000000000007FF9000000000000000F8","7480000000000007FF9200000000000000F8" +2863,"7480000000000007FF9200000000000000F8","7480000000000007FF9400000000000000F8" +2865,"7480000000000007FF9400000000000000F8","7480000000000007FF9600000000000000F8" +2867,"7480000000000007FF9600000000000000F8","7480000000000007FF9800000000000000F8" +2869,"7480000000000007FF9800000000000000F8","7480000000000007FF9A00000000000000F8" +2871,"7480000000000007FF9A00000000000000F8","7480000000000007FF9C00000000000000F8" +2873,"7480000000000007FF9C00000000000000F8","7480000000000007FF9E00000000000000F8" +2875,"7480000000000007FF9E00000000000000F8","7480000000000007FFA000000000000000F8" +2879,"7480000000000007FFA000000000000000F8","7480000000000007FFA200000000000000F8" +2877,"7480000000000007FFA200000000000000F8","7480000000000007FFA300000000000000F8" +2881,"7480000000000007FFA300000000000000F8","7480000000000007FFA600000000000000F8" +2903,"7480000000000007FFA600000000000000F8","7480000000000007FFA800000000000000F8" +2895,"7480000000000007FFA800000000000000F8","7480000000000007FFA900000000000000F8" +2899,"7480000000000007FFA900000000000000F8","7480000000000007FFAA00000000000000F8" +2901,"7480000000000007FFAA00000000000000F8","7480000000000007FFAB00000000000000F8" +2891,"7480000000000007FFAB00000000000000F8","7480000000000007FFAC00000000000000F8" +2907,"7480000000000007FFAC00000000000000F8","7480000000000007FFAD00000000000000F8" +2909,"7480000000000007FFAD00000000000000F8","7480000000000007FFAE00000000000000F8" +2885,"7480000000000007FFAE00000000000000F8","7480000000000007FFAF00000000000000F8" +2905,"7480000000000007FFAF00000000000000F8","7480000000000007FFB000000000000000F8" +2883,"7480000000000007FFB000000000000000F8","7480000000000007FFB100000000000000F8" +2893,"7480000000000007FFB100000000000000F8","7480000000000007FFB300000000000000F8" +2897,"7480000000000007FFB300000000000000F8","7480000000000007FFB400000000000000F8" +2887,"7480000000000007FFB400000000000000F8","7480000000000007FFB500000000000000F8" +2889,"7480000000000007FFB500000000000000F8","7480000000000007FFB700000000000000F8" +2911,"7480000000000007FFB700000000000000F8","7480000000000007FFCB00000000000000F8" +2913,"7480000000000007FFCB00000000000000F8","7480000000000007FFCF00000000000000F8" +2915,"7480000000000007FFCF00000000000000F8","7480000000000007FFD100000000000000F8" +2917,"7480000000000007FFD100000000000000F8","7480000000000007FFD600000000000000F8" +2919,"7480000000000007FFD600000000000000F8","7480000000000007FFDF00000000000000F8" +2921,"7480000000000007FFDF00000000000000F8","7480000000000007FFE300000000000000F8" +2923,"7480000000000007FFE300000000000000F8","7480000000000007FFE500000000000000F8" +2925,"7480000000000007FFE500000000000000F8","7480000000000007FFEA00000000000000F8" +2927,"7480000000000007FFEA00000000000000F8","7480000000000007FFF700000000000000F8" +2929,"7480000000000007FFF700000000000000F8","7480000000000007FFFB00000000000000F8" +2931,"7480000000000007FFFB00000000000000F8","7480000000000008FF0000000000000000F8" +2933,"7480000000000008FF0000000000000000F8","7480000000000008FF0600000000000000F8" +2935,"7480000000000008FF0600000000000000F8","7480000000000008FF0E00000000000000F8" +2937,"7480000000000008FF0E00000000000000F8","7480000000000008FF1300000000000000F8" +2939,"7480000000000008FF1300000000000000F8","7480000000000008FF1800000000000000F8" +2941,"7480000000000008FF1800000000000000F8","7480000000000008FF1A00000000000000F8" +2943,"7480000000000008FF1A00000000000000F8","7480000000000008FF2200000000000000F8" +2945,"7480000000000008FF2200000000000000F8","7480000000000008FF2700000000000000F8" +2947,"7480000000000008FF2700000000000000F8","7480000000000008FF2E00000000000000F8" +2949,"7480000000000008FF2E00000000000000F8","7480000000000008FF3000000000000000F8" +4001,"7480000000000008FF3000000000000000F8","7480000000000008FF4300000000000000F8" +4003,"7480000000000008FF4300000000000000F8","7480000000000008FF4400000000000000F8" +4005,"7480000000000008FF4400000000000000F8","7480000000000008FF4500000000000000F8" +4007,"7480000000000008FF4500000000000000F8","7480000000000008FF4600000000000000F8" +4009,"7480000000000008FF4600000000000000F8","7480000000000008FF5000000000000000F8" +4017,"7480000000000008FF5000000000000000F8","7480000000000008FF505F728000000000FF0EA6010000000000FA" +4011,"7480000000000008FF505F728000000000FF0EA6010000000000FA","7480000000000008FF5100000000000000F8" +4019,"7480000000000008FF5100000000000000F8","7480000000000008FF515F728000000000FF2D2A810000000000FA" +4013,"7480000000000008FF515F728000000000FF2D2A810000000000FA","7480000000000008FF5200000000000000F8" +4021,"7480000000000008FF5200000000000000F8","7480000000000008FF525F728000000000FF4BAF010000000000FA" +4015,"7480000000000008FF525F728000000000FF4BAF010000000000FA","7480000000000008FF5300000000000000F8" +4023,"7480000000000008FF5300000000000000F8","7480000000000008FF535F728000000000FF6A33810000000000FA" +4025,"7480000000000008FF535F728000000000FF6A33810000000000FA","7480000000000008FF5500000000000000F8" +5001,"7480000000000008FF5500000000000000F8","7480000000000008FF5800000000000000F8" +5005,"7480000000000008FF5800000000000000F8","7480000000000008FF585F698000000000FF0000010380000000FF000EA60103800000FF00000EA601000000FC" +5009,"7480000000000008FF585F698000000000FF0000010380000000FF000EA60103800000FF00000EA601000000FC","7480000000000008FF585F698000000000FF0000010380000000FF001D4C0103800000FF00001D4C01000000FC" +5013,"7480000000000008FF585F698000000000FF0000010380000000FF001D4C0103800000FF00001D4C01000000FC","7480000000000008FF585F698000000000FF0000010380000000FF002BF20103800000FF00002BF201000000FC" +5017,"7480000000000008FF585F698000000000FF0000010380000000FF002BF20103800000FF00002BF201000000FC","7480000000000008FF585F698000000000FF0000010380000000FF003A980103800000FF00003A9801000000FC" +5021,"7480000000000008FF585F698000000000FF0000010380000000FF003A980103800000FF00003A9801000000FC","7480000000000008FF585F698000000000FF0000010380000000FF00493E0103800000FF0000493E01000000FC" +5025,"7480000000000008FF585F698000000000FF0000010380000000FF00493E0103800000FF0000493E01000000FC","7480000000000008FF585F698000000000FF0000010380000000FF0057E40103800000FF000057E401000000FC" +5029,"7480000000000008FF585F698000000000FF0000010380000000FF0057E40103800000FF000057E401000000FC","7480000000000008FF585F698000000000FF0000010380000000FF00668A0103800000FF0000668A01000000FC" +5003,"7480000000000008FF585F698000000000FF0000010380000000FF00668A0103800000FF0000668A01000000FC","7480000000000008FF585F728000000000FF013EB00000000000FA" +5007,"7480000000000008FF585F728000000000FF013EB00000000000FA","7480000000000008FF585F728000000000FF0FE4B00000000000FA" +5011,"7480000000000008FF585F728000000000FF0FE4B00000000000FA","7480000000000008FF585F728000000000FF1E8AB00000000000FA" +5015,"7480000000000008FF585F728000000000FF1E8AB00000000000FA","7480000000000008FF585F728000000000FF2D30B00000000000FA" +5019,"7480000000000008FF585F728000000000FF2D30B00000000000FA","7480000000000008FF585F728000000000FF3BD6B00000000000FA" +5023,"7480000000000008FF585F728000000000FF3BD6B00000000000FA","7480000000000008FF585F728000000000FF4A7CB00000000000FA" +5027,"7480000000000008FF585F728000000000FF4A7CB00000000000FA","7480000000000008FF585F728000000000FF5922B00000000000FA" +5031,"7480000000000008FF585F728000000000FF5922B00000000000FA","7480000000000008FF585F728000000000FF67C8B00000000000FA" +5033,"7480000000000008FF585F728000000000FF67C8B00000000000FA","7480000000000008FF5B00000000000000F8" +5043,"7480000000000008FF5B00000000000000F8","7480000000000008FF5B5F698000000000FF0000010380000000FF000EA60103800000FF00000EA601000000FC" +5041,"7480000000000008FF5B5F698000000000FF0000010380000000FF000EA60103800000FF00000EA601000000FC","7480000000000008FF5B5F728000000000FF02BF210000000000FA" +5045,"7480000000000008FF5B5F728000000000FF02BF210000000000FA","7480000000000008FF5B5F728000000000FF1165210000000000FA" +5035,"7480000000000008FF5B5F728000000000FF1165210000000000FA","7480000000000008FF5C00000000000000F8" +5049,"7480000000000008FF5C00000000000000F8","7480000000000008FF5C5F698000000000FF0000010380000000FF002D2A8103800000FF00002D2A81000000FC" +5047,"7480000000000008FF5C5F698000000000FF0000010380000000FF002D2A8103800000FF00002D2A81000000FC","7480000000000008FF5C5F728000000000FF2191C10000000000FA" +5051,"7480000000000008FF5C5F728000000000FF2191C10000000000FA","7480000000000008FF5C5F728000000000FF3037C10000000000FA" +5037,"7480000000000008FF5C5F728000000000FF3037C10000000000FA","7480000000000008FF5D00000000000000F8" +5057,"7480000000000008FF5D00000000000000F8","7480000000000008FF5D5F698000000000FF0000010380000000FF004BAF0103800000FF00004BAF01000000FC" +5053,"7480000000000008FF5D5F698000000000FF0000010380000000FF004BAF0103800000FF00004BAF01000000FC","7480000000000008FF5D5F728000000000FF3F7A010000000000FA" +5055,"7480000000000008FF5D5F728000000000FF3F7A010000000000FA","7480000000000008FF5D5F728000000000FF4E20010000000000FA" +5039,"7480000000000008FF5D5F728000000000FF4E20010000000000FA","7480000000000008FF5E00000000000000F8" +5061,"7480000000000008FF5E00000000000000F8","7480000000000008FF5E5F698000000000FF0000010380000000FF006A338103800000FF00006A3381000000FC" +5059,"7480000000000008FF5E5F698000000000FF0000010380000000FF006A338103800000FF00006A3381000000FC","7480000000000008FF5E5F728000000000FF5E25910000000000FA" +5063,"7480000000000008FF5E5F728000000000FF5E25910000000000FA","7480000000000008FF5E5F728000000000FF6CCB910000000000FA" +2,"7480000000000008FF5E5F728000000000FF6CCB910000000000FA","" diff --git a/dumpling/export/retry.go b/dumpling/export/retry.go new file mode 100644 index 0000000000000..13f4931d72a0c --- /dev/null +++ b/dumpling/export/retry.go @@ -0,0 +1,117 @@ +// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +package export + +import ( + "strings" + "time" + + "github.com/go-sql-driver/mysql" + "github.com/pingcap/errors" + "github.com/pingcap/tidb-tools/pkg/dbutil" + "go.uber.org/zap" + + tcontext "github.com/pingcap/tidb/dumpling/context" +) + +const ( + dumpChunkRetryTime = 3 + lockTablesRetryTime = 5 + dumpChunkWaitInterval = 50 * time.Millisecond + dumpChunkMaxWaitInterval = 200 * time.Millisecond + // ErrNoSuchTable is the error code no such table in MySQL/TiDB + ErrNoSuchTable uint16 = 1146 +) + +func newDumpChunkBackoffer(shouldRetry bool) *dumpChunkBackoffer { // revive:disable-line:flag-parameter + if !shouldRetry { + return &dumpChunkBackoffer{ + attempt: 1, + } + } + return &dumpChunkBackoffer{ + attempt: dumpChunkRetryTime, + delayTime: dumpChunkWaitInterval, + maxDelayTime: dumpChunkMaxWaitInterval, + } +} + +type dumpChunkBackoffer struct { + attempt int + delayTime time.Duration + maxDelayTime time.Duration +} + +func (b *dumpChunkBackoffer) NextBackoff(err error) time.Duration { + err = errors.Cause(err) + if _, ok := err.(*mysql.MySQLError); ok && !dbutil.IsRetryableError(err) { + b.attempt = 0 + return 0 + } else if _, ok := err.(*writerError); ok { + // the uploader writer's retry logic is already done in aws client. needn't retry here + b.attempt = 0 + return 0 + } + b.delayTime = 2 * b.delayTime + b.attempt-- + if b.delayTime > b.maxDelayTime { + return b.maxDelayTime + } + return b.delayTime +} + +func (b *dumpChunkBackoffer) Attempt() int { + return b.attempt +} + +func newLockTablesBackoffer(tctx *tcontext.Context, blockList map[string]map[string]interface{}) *lockTablesBackoffer { + return &lockTablesBackoffer{ + tctx: tctx, + attempt: lockTablesRetryTime, + blockList: blockList, + } +} + +type lockTablesBackoffer struct { + tctx *tcontext.Context + attempt int + blockList map[string]map[string]interface{} +} + +func (b *lockTablesBackoffer) NextBackoff(err error) time.Duration { + err = errors.Cause(err) + if mysqlErr, ok := err.(*mysql.MySQLError); ok && mysqlErr.Number == ErrNoSuchTable { + b.attempt-- + db, table, err := getTableFromMySQLError(mysqlErr.Message) + if err != nil { + b.tctx.L().Error("fail to retry lock tables", zap.Error(err)) + b.attempt = 0 + return 0 + } + if _, ok := b.blockList[db]; !ok { + b.blockList[db] = make(map[string]interface{}) + } + b.blockList[db][table] = struct{}{} + return 0 + } + b.attempt = 0 + return 0 +} + +func (b *lockTablesBackoffer) Attempt() int { + return b.attempt +} + +func getTableFromMySQLError(msg string) (db, table string, err error) { + // examples of the error msg: + // Error 1146: Table 'pingcap.t1' doesn't exist + // Error 1146: Table 'quo`te/database.quo.te/database-1.quo.te/table-1' doesn't exist /* doesn't support */ + msg = strings.TrimPrefix(msg, "Table '") + msg = strings.TrimSuffix(msg, "' doesn't exist") + failPart := strings.Split(msg, ".") + if len(failPart) != 2 { + err = errors.Errorf("doesn't support retry lock table %s", msg) + return + } + return failPart[0], failPart[1], nil +} diff --git a/dumpling/export/sql.go b/dumpling/export/sql.go new file mode 100644 index 0000000000000..60e9d08589632 --- /dev/null +++ b/dumpling/export/sql.go @@ -0,0 +1,1442 @@ +// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +package export + +import ( + "bytes" + "context" + "database/sql" + "encoding/json" + "fmt" + "io" + "math" + "net/url" + "strconv" + "strings" + + "github.com/go-sql-driver/mysql" + "github.com/pingcap/errors" + "go.uber.org/zap" + + dbconfig "github.com/pingcap/tidb/config" + tcontext "github.com/pingcap/tidb/dumpling/context" + "github.com/pingcap/tidb/dumpling/log" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/store/helper" +) + +const ( + orderByTiDBRowID = "ORDER BY `_tidb_rowid`" +) + +type listTableType int + +const ( + listTableByInfoSchema listTableType = iota + listTableByShowFullTables + listTableByShowTableStatus +) + +// ShowDatabases shows the databases of a database server. +func ShowDatabases(db *sql.Conn) ([]string, error) { + var res oneStrColumnTable + if err := simpleQuery(db, "SHOW DATABASES", res.handleOneRow); err != nil { + return nil, err + } + return res.data, nil +} + +// ShowTables shows the tables of a database, the caller should use the correct database. +func ShowTables(db *sql.Conn) ([]string, error) { + var res oneStrColumnTable + if err := simpleQuery(db, "SHOW TABLES", res.handleOneRow); err != nil { + return nil, err + } + return res.data, nil +} + +// ShowCreateDatabase constructs the create database SQL for a specified database +// returns (createDatabaseSQL, error) +func ShowCreateDatabase(db *sql.Conn, database string) (string, error) { + var oneRow [2]string + handleOneRow := func(rows *sql.Rows) error { + return rows.Scan(&oneRow[0], &oneRow[1]) + } + query := fmt.Sprintf("SHOW CREATE DATABASE `%s`", escapeString(database)) + err := simpleQuery(db, query, handleOneRow) + if mysqlErr, ok := errors.Cause(err).(*mysql.MySQLError); ok { + // Falling back to simple create statement for MemSQL/SingleStore, because of this: + // ERROR 1706 (HY000): Feature 'SHOW CREATE DATABASE' is not supported by MemSQL. + if mysqlErr.Number == 1706 { + return fmt.Sprintf("CREATE DATABASE `%s`", escapeString(database)), nil + } + } + if err != nil { + return "", errors.Annotatef(err, "sql: %s", query) + } + return oneRow[1], nil +} + +// ShowCreateTable constructs the create table SQL for a specified table +// returns (createTableSQL, error) +func ShowCreateTable(db *sql.Conn, database, table string) (string, error) { + var oneRow [2]string + handleOneRow := func(rows *sql.Rows) error { + return rows.Scan(&oneRow[0], &oneRow[1]) + } + query := fmt.Sprintf("SHOW CREATE TABLE `%s`.`%s`", escapeString(database), escapeString(table)) + err := simpleQuery(db, query, handleOneRow) + if err != nil { + return "", errors.Annotatef(err, "sql: %s", query) + } + return oneRow[1], nil +} + +// ShowCreatePlacementPolicy constructs the create policy SQL for a specified table +// returns (createPoilicySQL, error) +func ShowCreatePlacementPolicy(db *sql.Conn, policy string) (string, error) { + var oneRow [2]string + handleOneRow := func(rows *sql.Rows) error { + return rows.Scan(&oneRow[0], &oneRow[1]) + } + query := fmt.Sprintf("SHOW CREATE PLACEMENT POLICY `%s`", escapeString(policy)) + err := simpleQuery(db, query, handleOneRow) + if err != nil { + return "", errors.Annotatef(err, "sql: %s", query) + } + return oneRow[1], nil +} + +// ShowCreateView constructs the create view SQL for a specified view +// returns (createFakeTableSQL, createViewSQL, error) +func ShowCreateView(db *sql.Conn, database, view string) (createFakeTableSQL string, createRealViewSQL string, err error) { + var fieldNames []string + handleFieldRow := func(rows *sql.Rows) error { + var oneRow [6]sql.NullString + scanErr := rows.Scan(&oneRow[0], &oneRow[1], &oneRow[2], &oneRow[3], &oneRow[4], &oneRow[5]) + if scanErr != nil { + return errors.Trace(scanErr) + } + if oneRow[0].Valid { + fieldNames = append(fieldNames, fmt.Sprintf("`%s` int", escapeString(oneRow[0].String))) + } + return nil + } + var oneRow [4]string + handleOneRow := func(rows *sql.Rows) error { + return rows.Scan(&oneRow[0], &oneRow[1], &oneRow[2], &oneRow[3]) + } + var createTableSQL, createViewSQL strings.Builder + + // Build createTableSQL + query := fmt.Sprintf("SHOW FIELDS FROM `%s`.`%s`", escapeString(database), escapeString(view)) + err = simpleQuery(db, query, handleFieldRow) + if err != nil { + return "", "", errors.Annotatef(err, "sql: %s", query) + } + fmt.Fprintf(&createTableSQL, "CREATE TABLE `%s`(\n", escapeString(view)) + createTableSQL.WriteString(strings.Join(fieldNames, ",\n")) + createTableSQL.WriteString("\n)ENGINE=MyISAM;\n") + + // Build createViewSQL + fmt.Fprintf(&createViewSQL, "DROP TABLE IF EXISTS `%s`;\n", escapeString(view)) + fmt.Fprintf(&createViewSQL, "DROP VIEW IF EXISTS `%s`;\n", escapeString(view)) + query = fmt.Sprintf("SHOW CREATE VIEW `%s`.`%s`", escapeString(database), escapeString(view)) + err = simpleQuery(db, query, handleOneRow) + if err != nil { + return "", "", errors.Annotatef(err, "sql: %s", query) + } + // The result for `show create view` SQL + // mysql> show create view v1; + // +------+-------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ + // | View | Create View | character_set_client | collation_connection | + // +------+-------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ + // | v1 | CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` (`a`) AS SELECT `t`.`a` AS `a` FROM `test`.`t` | utf8 | utf8_general_ci | + // +------+-------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ + SetCharset(&createViewSQL, oneRow[2], oneRow[3]) + createViewSQL.WriteString(oneRow[1]) + createViewSQL.WriteString(";\n") + RestoreCharset(&createViewSQL) + + return createTableSQL.String(), createViewSQL.String(), nil +} + +// SetCharset builds the set charset SQLs +func SetCharset(w *strings.Builder, characterSet, collationConnection string) { + w.WriteString("SET @PREV_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT;\n") + w.WriteString("SET @PREV_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS;\n") + w.WriteString("SET @PREV_COLLATION_CONNECTION=@@COLLATION_CONNECTION;\n") + + fmt.Fprintf(w, "SET character_set_client = %s;\n", characterSet) + fmt.Fprintf(w, "SET character_set_results = %s;\n", characterSet) + fmt.Fprintf(w, "SET collation_connection = %s;\n", collationConnection) +} + +// RestoreCharset builds the restore charset SQLs +func RestoreCharset(w io.StringWriter) { + _, _ = w.WriteString("SET character_set_client = @PREV_CHARACTER_SET_CLIENT;\n") + _, _ = w.WriteString("SET character_set_results = @PREV_CHARACTER_SET_RESULTS;\n") + _, _ = w.WriteString("SET collation_connection = @PREV_COLLATION_CONNECTION;\n") +} + +// ListAllDatabasesTables lists all the databases and tables from the database +// listTableByInfoSchema list tables by table information_schema in MySQL +// listTableByShowTableStatus has better performance than listTableByInfoSchema +// listTableByShowFullTables is used in mysql8 version [8.0.3,8.0.23), more details can be found in the comments of func matchMysqlBugversion +func ListAllDatabasesTables(tctx *tcontext.Context, db *sql.Conn, databaseNames []string, + listType listTableType, tableTypes ...TableType) (DatabaseTables, error) { // revive:disable-line:flag-parameter + dbTables := DatabaseTables{} + var ( + schema, table, tableTypeStr string + tableType TableType + avgRowLength uint64 + err error + ) + + tableTypeConditions := make([]string, len(tableTypes)) + for i, tableType := range tableTypes { + tableTypeConditions[i] = fmt.Sprintf("TABLE_TYPE='%s'", tableType) + } + switch listType { + case listTableByInfoSchema: + query := fmt.Sprintf("SELECT TABLE_SCHEMA,TABLE_NAME,TABLE_TYPE,AVG_ROW_LENGTH FROM INFORMATION_SCHEMA.TABLES WHERE %s", strings.Join(tableTypeConditions, " OR ")) + for _, schema := range databaseNames { + dbTables[schema] = make([]*TableInfo, 0) + } + if err = simpleQueryWithArgs(db, func(rows *sql.Rows) error { + var ( + sqlAvgRowLength sql.NullInt64 + err2 error + ) + if err2 = rows.Scan(&schema, &table, &tableTypeStr, &sqlAvgRowLength); err != nil { + return errors.Trace(err2) + } + tableType, err2 = ParseTableType(tableTypeStr) + if err2 != nil { + return errors.Trace(err2) + } + + if sqlAvgRowLength.Valid { + avgRowLength = uint64(sqlAvgRowLength.Int64) + } else { + avgRowLength = 0 + } + // only append tables to schemas in databaseNames + if _, ok := dbTables[schema]; ok { + dbTables[schema] = append(dbTables[schema], &TableInfo{table, avgRowLength, tableType}) + } + return nil + }, query); err != nil { + return nil, errors.Annotatef(err, "sql: %s", query) + } + case listTableByShowFullTables: + for _, schema = range databaseNames { + dbTables[schema] = make([]*TableInfo, 0) + query := fmt.Sprintf("SHOW FULL TABLES FROM `%s` WHERE %s", + escapeString(schema), strings.Join(tableTypeConditions, " OR ")) + if err = simpleQueryWithArgs(db, func(rows *sql.Rows) error { + var err2 error + if err2 = rows.Scan(&table, &tableTypeStr); err != nil { + return errors.Trace(err2) + } + tableType, err2 = ParseTableType(tableTypeStr) + if err2 != nil { + return errors.Trace(err2) + } + avgRowLength = 0 // can't get avgRowLength from the result of `show full tables` so hardcode to 0 here + dbTables[schema] = append(dbTables[schema], &TableInfo{table, avgRowLength, tableType}) + return nil + }, query); err != nil { + return nil, errors.Annotatef(err, "sql: %s", query) + } + } + default: + const queryTemplate = "SHOW TABLE STATUS FROM `%s`" + selectedTableType := make(map[TableType]struct{}) + for _, tableType = range tableTypes { + selectedTableType[tableType] = struct{}{} + } + for _, schema = range databaseNames { + dbTables[schema] = make([]*TableInfo, 0) + query := fmt.Sprintf(queryTemplate, escapeString(schema)) + rows, err := db.QueryContext(tctx, query) + if err != nil { + return nil, errors.Annotatef(err, "sql: %s", query) + } + results, err := GetSpecifiedColumnValuesAndClose(rows, "NAME", "ENGINE", "AVG_ROW_LENGTH", "COMMENT") + if err != nil { + return nil, errors.Annotatef(err, "sql: %s", query) + } + for _, oneRow := range results { + table, engine, avgRowLengthStr, comment := oneRow[0], oneRow[1], oneRow[2], oneRow[3] + if avgRowLengthStr != "" { + avgRowLength, err = strconv.ParseUint(avgRowLengthStr, 10, 64) + if err != nil { + return nil, errors.Annotatef(err, "sql: %s", query) + } + } else { + avgRowLength = 0 + } + tableType = TableTypeBase + if engine == "" && (comment == "" || comment == TableTypeViewStr) { + tableType = TableTypeView + } else if engine == "" { + tctx.L().Warn("invalid table without engine found", zap.String("database", schema), zap.String("table", table)) + continue + } + if _, ok := selectedTableType[tableType]; !ok { + continue + } + dbTables[schema] = append(dbTables[schema], &TableInfo{table, avgRowLength, tableType}) + } + } + } + return dbTables, nil +} + +func ListAllPlacementPolicyNames(db *sql.Conn) ([]string, error) { + var policyList []string + var policy string + const query = "select distinct policy_name from information_schema.placement_rules where policy_name is not null;" + rows, err := db.QueryContext(context.Background(), query) + if err != nil { + return policyList, errors.Annotatef(err, "sql: %s", query) + } + defer rows.Close() + for rows.Next() { + err := rows.Scan(&policy) + if err != nil { + return policyList, errors.Trace(err) + } + policyList = append(policyList, policy) + } + return policyList, errors.Annotatef(rows.Err(), "sql: %s", query) +} + +// SelectVersion gets the version information from the database server +func SelectVersion(db *sql.DB) (string, error) { + var versionInfo string + const query = "SELECT version()" + row := db.QueryRow(query) + err := row.Scan(&versionInfo) + if err != nil { + return "", errors.Annotatef(err, "sql: %s", query) + } + return versionInfo, nil +} + +// SelectAllFromTable dumps data serialized from a specified table +func SelectAllFromTable(conf *Config, meta TableMeta, partition, orderByClause string) TableDataIR { + database, table := meta.DatabaseName(), meta.TableName() + selectedField, selectLen := meta.SelectedField(), meta.SelectedLen() + query := buildSelectQuery(database, table, selectedField, partition, buildWhereCondition(conf, ""), orderByClause) + + return &tableData{ + query: query, + colLen: selectLen, + } +} + +func buildSelectQuery(database, table, fields, partition, where, orderByClause string) string { + var query strings.Builder + query.WriteString("SELECT ") + if fields == "" { + // If all of the columns are generated, + // we need to make sure the query is valid. + fields = "''" + } + query.WriteString(fields) + query.WriteString(" FROM `") + query.WriteString(escapeString(database)) + query.WriteString("`.`") + query.WriteString(escapeString(table)) + query.WriteByte('`') + if partition != "" { + query.WriteString(" PARTITION(`") + query.WriteString(escapeString(partition)) + query.WriteString("`)") + } + + if where != "" { + query.WriteString(" ") + query.WriteString(where) + } + + if orderByClause != "" { + query.WriteString(" ") + query.WriteString(orderByClause) + } + + return query.String() +} + +func buildOrderByClause(conf *Config, db *sql.Conn, database, table string, hasImplicitRowID bool) (string, error) { // revive:disable-line:flag-parameter + if !conf.SortByPk { + return "", nil + } + if hasImplicitRowID { + return orderByTiDBRowID, nil + } + cols, err := GetPrimaryKeyColumns(db, database, table) + if err != nil { + return "", errors.Trace(err) + } + return buildOrderByClauseString(cols), nil +} + +// SelectTiDBRowID checks whether this table has _tidb_rowid column +func SelectTiDBRowID(db *sql.Conn, database, table string) (bool, error) { + const errBadFieldCode = 1054 + tiDBRowIDQuery := fmt.Sprintf("SELECT _tidb_rowid from `%s`.`%s` LIMIT 0", escapeString(database), escapeString(table)) + _, err := db.ExecContext(context.Background(), tiDBRowIDQuery) + if err != nil { + errMsg := strings.ToLower(err.Error()) + if strings.Contains(errMsg, fmt.Sprintf("%d", errBadFieldCode)) { + return false, nil + } + return false, errors.Annotatef(err, "sql: %s", tiDBRowIDQuery) + } + return true, nil +} + +// GetSuitableRows gets suitable rows for each table +func GetSuitableRows(avgRowLength uint64) uint64 { + const ( + defaultRows = 200000 + maxRows = 1000000 + bytesPerFile = 128 * 1024 * 1024 // 128MB per file by default + ) + if avgRowLength == 0 { + return defaultRows + } + estimateRows := bytesPerFile / avgRowLength + if estimateRows > maxRows { + return maxRows + } + return estimateRows +} + +// GetColumnTypes gets *sql.ColumnTypes from a specified table +func GetColumnTypes(db *sql.Conn, fields, database, table string) ([]*sql.ColumnType, error) { + query := fmt.Sprintf("SELECT %s FROM `%s`.`%s` LIMIT 1", fields, escapeString(database), escapeString(table)) + rows, err := db.QueryContext(context.Background(), query) + if err != nil { + return nil, errors.Annotatef(err, "sql: %s", query) + } + defer rows.Close() + if err = rows.Err(); err != nil { + return nil, errors.Annotatef(err, "sql: %s", query) + } + return rows.ColumnTypes() +} + +// GetPrimaryKeyAndColumnTypes gets all primary columns and their types in ordinal order +func GetPrimaryKeyAndColumnTypes(conn *sql.Conn, meta TableMeta) ([]string, []string, error) { + var ( + colNames, colTypes []string + err error + ) + colNames, err = GetPrimaryKeyColumns(conn, meta.DatabaseName(), meta.TableName()) + if err != nil { + return nil, nil, err + } + colName2Type := string2Map(meta.ColumnNames(), meta.ColumnTypes()) + colTypes = make([]string, len(colNames)) + for i, colName := range colNames { + colTypes[i] = colName2Type[colName] + } + return colNames, colTypes, nil +} + +// GetPrimaryKeyColumns gets all primary columns in ordinal order +func GetPrimaryKeyColumns(db *sql.Conn, database, table string) ([]string, error) { + priKeyColsQuery := fmt.Sprintf("SHOW INDEX FROM `%s`.`%s`", escapeString(database), escapeString(table)) + rows, err := db.QueryContext(context.Background(), priKeyColsQuery) + if err != nil { + return nil, errors.Annotatef(err, "sql: %s", priKeyColsQuery) + } + results, err := GetSpecifiedColumnValuesAndClose(rows, "KEY_NAME", "COLUMN_NAME") + if err != nil { + return nil, errors.Annotatef(err, "sql: %s", priKeyColsQuery) + } + cols := make([]string, 0, len(results)) + for _, oneRow := range results { + keyName, columnName := oneRow[0], oneRow[1] + if keyName == "PRIMARY" { + cols = append(cols, columnName) + } + } + return cols, nil +} + +// getNumericIndex picks up indices according to the following priority: +// primary key > unique key with the smallest count > key with the max cardinality +// primary key with multi cols is before unique key with single col because we will sort result by primary keys +func getNumericIndex(db *sql.Conn, meta TableMeta) (string, error) { + database, table := meta.DatabaseName(), meta.TableName() + colName2Type := string2Map(meta.ColumnNames(), meta.ColumnTypes()) + keyQuery := fmt.Sprintf("SHOW INDEX FROM `%s`.`%s`", escapeString(database), escapeString(table)) + rows, err := db.QueryContext(context.Background(), keyQuery) + if err != nil { + return "", errors.Annotatef(err, "sql: %s", keyQuery) + } + results, err := GetSpecifiedColumnValuesAndClose(rows, "NON_UNIQUE", "SEQ_IN_INDEX", "KEY_NAME", "COLUMN_NAME", "CARDINALITY") + if err != nil { + return "", errors.Annotatef(err, "sql: %s", keyQuery) + } + type keyColumnPair struct { + colName string + count uint64 + } + var ( + uniqueKeyMap = map[string]keyColumnPair{} // unique key name -> key column name, unique key columns count + keyColumn string + maxCardinality int64 = -1 + ) + + // check primary key first, then unique key + for _, oneRow := range results { + nonUnique, seqInIndex, keyName, colName, cardinality := oneRow[0], oneRow[1], oneRow[2], oneRow[3], oneRow[4] + // only try pick the first column, because the second column of pk/uk in where condition will trigger a full table scan + if seqInIndex != "1" { + if pair, ok := uniqueKeyMap[keyName]; ok { + seqInIndexInt, err := strconv.ParseUint(seqInIndex, 10, 64) + if err == nil && seqInIndexInt > pair.count { + uniqueKeyMap[keyName] = keyColumnPair{pair.colName, seqInIndexInt} + } + } + continue + } + _, numberColumn := dataTypeInt[colName2Type[colName]] + if numberColumn { + switch { + case keyName == "PRIMARY": + return colName, nil + case nonUnique == "0": + uniqueKeyMap[keyName] = keyColumnPair{colName, 1} + // pick index column with max cardinality when there is no unique index + case len(uniqueKeyMap) == 0: + cardinalityInt, err := strconv.ParseInt(cardinality, 10, 64) + if err == nil && cardinalityInt > maxCardinality { + keyColumn = colName + maxCardinality = cardinalityInt + } + } + } + } + if len(uniqueKeyMap) > 0 { + var ( + minCols uint64 = math.MaxUint64 + uniqueKeyColumn string + ) + for _, pair := range uniqueKeyMap { + if pair.count < minCols { + uniqueKeyColumn = pair.colName + minCols = pair.count + } + } + return uniqueKeyColumn, nil + } + return keyColumn, nil +} + +// FlushTableWithReadLock flush tables with read lock +func FlushTableWithReadLock(ctx context.Context, db *sql.Conn) error { + const ftwrlQuery = "FLUSH TABLES WITH READ LOCK" + _, err := db.ExecContext(ctx, ftwrlQuery) + return errors.Annotatef(err, "sql: %s", ftwrlQuery) +} + +// LockTables locks table with read lock +func LockTables(ctx context.Context, db *sql.Conn, database, table string) error { + lockTableQuery := fmt.Sprintf("LOCK TABLES `%s`.`%s` READ", escapeString(database), escapeString(table)) + _, err := db.ExecContext(ctx, lockTableQuery) + return errors.Annotatef(err, "sql: %s", lockTableQuery) +} + +// UnlockTables unlocks all tables' lock +func UnlockTables(ctx context.Context, db *sql.Conn) error { + const unlockTableQuery = "UNLOCK TABLES" + _, err := db.ExecContext(ctx, unlockTableQuery) + return errors.Annotatef(err, "sql: %s", unlockTableQuery) +} + +// ShowMasterStatus get SHOW MASTER STATUS result from database +func ShowMasterStatus(db *sql.Conn) ([]string, error) { + var oneRow []string + handleOneRow := func(rows *sql.Rows) error { + cols, err := rows.Columns() + if err != nil { + return errors.Trace(err) + } + fieldNum := len(cols) + oneRow = make([]string, fieldNum) + addr := make([]interface{}, fieldNum) + for i := range oneRow { + addr[i] = &oneRow[i] + } + return rows.Scan(addr...) + } + const showMasterStatusQuery = "SHOW MASTER STATUS" + err := simpleQuery(db, showMasterStatusQuery, handleOneRow) + if err != nil { + return nil, errors.Annotatef(err, "sql: %s", showMasterStatusQuery) + } + return oneRow, nil +} + +// GetSpecifiedColumnValueAndClose get columns' values whose name is equal to columnName and close the given rows +func GetSpecifiedColumnValueAndClose(rows *sql.Rows, columnName string) ([]string, error) { + if rows == nil { + return []string{}, nil + } + defer rows.Close() + columnName = strings.ToUpper(columnName) + var strs []string + columns, _ := rows.Columns() + addr := make([]interface{}, len(columns)) + oneRow := make([]sql.NullString, len(columns)) + fieldIndex := -1 + for i, col := range columns { + if strings.ToUpper(col) == columnName { + fieldIndex = i + } + addr[i] = &oneRow[i] + } + if fieldIndex == -1 { + return strs, nil + } + for rows.Next() { + err := rows.Scan(addr...) + if err != nil { + return strs, errors.Trace(err) + } + if oneRow[fieldIndex].Valid { + strs = append(strs, oneRow[fieldIndex].String) + } + } + return strs, errors.Trace(rows.Err()) +} + +// GetSpecifiedColumnValuesAndClose get columns' values whose name is equal to columnName +func GetSpecifiedColumnValuesAndClose(rows *sql.Rows, columnName ...string) ([][]string, error) { + if rows == nil { + return [][]string{}, nil + } + defer rows.Close() + var strs [][]string + columns, err := rows.Columns() + if err != nil { + return strs, errors.Trace(err) + } + addr := make([]interface{}, len(columns)) + oneRow := make([]sql.NullString, len(columns)) + fieldIndexMp := make(map[int]int) + for i, col := range columns { + addr[i] = &oneRow[i] + for j, name := range columnName { + if strings.ToUpper(col) == name { + fieldIndexMp[i] = j + } + } + } + if len(fieldIndexMp) == 0 { + return strs, nil + } + for rows.Next() { + err := rows.Scan(addr...) + if err != nil { + return strs, errors.Trace(err) + } + written := false + tmpStr := make([]string, len(columnName)) + for colPos, namePos := range fieldIndexMp { + if oneRow[colPos].Valid { + written = true + tmpStr[namePos] = oneRow[colPos].String + } + } + if written { + strs = append(strs, tmpStr) + } + } + return strs, errors.Trace(rows.Err()) +} + +// GetPdAddrs gets PD address from TiDB +func GetPdAddrs(tctx *tcontext.Context, db *sql.DB) ([]string, error) { + const query = "SELECT * FROM information_schema.cluster_info where type = 'pd';" + rows, err := db.QueryContext(tctx, query) + if err != nil { + return []string{}, errors.Annotatef(err, "sql: %s", query) + } + pdAddrs, err := GetSpecifiedColumnValueAndClose(rows, "STATUS_ADDRESS") + return pdAddrs, errors.Annotatef(err, "sql: %s", query) +} + +// GetTiDBDDLIDs gets DDL IDs from TiDB +func GetTiDBDDLIDs(tctx *tcontext.Context, db *sql.DB) ([]string, error) { + const query = "SELECT * FROM information_schema.tidb_servers_info;" + rows, err := db.QueryContext(tctx, query) + if err != nil { + return []string{}, errors.Annotatef(err, "sql: %s", query) + } + ddlIDs, err := GetSpecifiedColumnValueAndClose(rows, "DDL_ID") + return ddlIDs, errors.Annotatef(err, "sql: %s", query) +} + +// getTiDBConfig gets tidb config from TiDB server +// @@tidb_config details doc https://docs.pingcap.com/tidb/stable/system-variables#tidb_config +// this variable exists at least from v2.0.0, so this works in most existing tidb instances +func getTiDBConfig(db *sql.Conn) (dbconfig.Config, error) { + const query = "SELECT @@tidb_config;" + var ( + tidbConfig dbconfig.Config + tidbConfigBytes []byte + ) + row := db.QueryRowContext(context.Background(), query) + err := row.Scan(&tidbConfigBytes) + if err != nil { + return tidbConfig, errors.Annotatef(err, "sql: %s", query) + } + err = json.Unmarshal(tidbConfigBytes, &tidbConfig) + return tidbConfig, errors.Annotatef(err, "sql: %s", query) +} + +// CheckTiDBWithTiKV use sql to check whether current TiDB has TiKV +func CheckTiDBWithTiKV(db *sql.DB) (bool, error) { + conn, err := db.Conn(context.Background()) + if err == nil { + defer conn.Close() + tidbConfig, err := getTiDBConfig(conn) + if err == nil { + return tidbConfig.Store == "tikv", nil + } + } + var count int + const query = "SELECT COUNT(1) as c FROM MYSQL.TiDB WHERE VARIABLE_NAME='tikv_gc_safe_point'" + row := db.QueryRow(query) + err = row.Scan(&count) + if err != nil { + // still return true here. Because sometimes users may not have privileges for MySQL.TiDB database + // In most production cases TiDB has TiKV + return true, errors.Annotatef(err, "sql: %s", query) + } + return count > 0, nil +} + +// CheckIfSeqExists use sql to check whether sequence exists +func CheckIfSeqExists(db *sql.Conn) (bool, error) { + var count int + const query = "SELECT COUNT(1) as c FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='SEQUENCE'" + row := db.QueryRowContext(context.Background(), query) + err := row.Scan(&count) + if err != nil { + return false, errors.Annotatef(err, "sql: %s", query) + } + + return count > 0, nil +} + +// CheckTiDBEnableTableLock use sql variable to check whether current TiDB has TiKV +func CheckTiDBEnableTableLock(db *sql.Conn) (bool, error) { + tidbConfig, err := getTiDBConfig(db) + if err != nil { + return false, err + } + return tidbConfig.EnableTableLock, nil +} + +func getSnapshot(db *sql.Conn) (string, error) { + str, err := ShowMasterStatus(db) + if err != nil { + return "", err + } + return str[snapshotFieldIndex], nil +} + +func isUnknownSystemVariableErr(err error) bool { + return strings.Contains(err.Error(), "Unknown system variable") +} + +// resetDBWithSessionParams will return a new sql.DB as a replacement for input `db` with new session parameters. +// If returned error is nil, the input `db` will be closed. +func resetDBWithSessionParams(tctx *tcontext.Context, db *sql.DB, dsn string, params map[string]interface{}) (*sql.DB, error) { + support := make(map[string]interface{}) + for k, v := range params { + var pv interface{} + if str, ok := v.(string); ok { + if pvi, err := strconv.ParseInt(str, 10, 64); err == nil { + pv = pvi + } else if pvf, err := strconv.ParseFloat(str, 64); err == nil { + pv = pvf + } else { + pv = str + } + } else { + pv = v + } + s := fmt.Sprintf("SET SESSION %s = ?", k) + _, err := db.ExecContext(tctx, s, pv) + if err != nil { + if isUnknownSystemVariableErr(err) { + tctx.L().Info("session variable is not supported by db", zap.String("variable", k), zap.Reflect("value", v)) + continue + } + return nil, errors.Trace(err) + } + + support[k] = pv + } + + for k, v := range support { + var s string + // Wrap string with quote to handle string with space. For example, '2020-10-20 13:41:40' + // For --params argument, quote doesn't matter because it doesn't affect the actual value + if str, ok := v.(string); ok { + s = wrapStringWith(str, "'") + } else { + s = fmt.Sprintf("%v", v) + } + dsn += fmt.Sprintf("&%s=%s", k, url.QueryEscape(s)) + } + + newDB, err := sql.Open("mysql", dsn) + if err == nil { + db.Close() + } + return newDB, errors.Trace(err) +} + +func createConnWithConsistency(ctx context.Context, db *sql.DB, repeatableRead bool) (*sql.Conn, error) { + conn, err := db.Conn(ctx) + if err != nil { + return nil, errors.Trace(err) + } + var query string + if repeatableRead { + query = "SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ" + _, err = conn.ExecContext(ctx, query) + if err != nil { + return nil, errors.Annotatef(err, "sql: %s", query) + } + } + query = "START TRANSACTION /*!40108 WITH CONSISTENT SNAPSHOT */" + _, err = conn.ExecContext(ctx, query) + if err != nil { + // Some MySQL Compatible databases like Vitess and MemSQL/SingleStore + // are newer than 4.1.8 (the version comment) but don't actually support + // `WITH CONSISTENT SNAPSHOT`. So retry without that if the statement fails. + query = "START TRANSACTION" + _, err = conn.ExecContext(ctx, query) + if err != nil { + return nil, errors.Annotatef(err, "sql: %s", query) + } + } + return conn, nil +} + +// buildSelectField returns the selecting fields' string(joined by comma(`,`)), +// and the number of writable fields. +func buildSelectField(db *sql.Conn, dbName, tableName string, completeInsert bool) (string, int, error) { // revive:disable-line:flag-parameter + query := fmt.Sprintf("SHOW COLUMNS FROM `%s`.`%s`", escapeString(dbName), escapeString(tableName)) + rows, err := db.QueryContext(context.Background(), query) + if err != nil { + return "", 0, errors.Annotatef(err, "sql: %s", query) + } + defer rows.Close() + availableFields := make([]string, 0) + + hasGenerateColumn := false + results, err := GetSpecifiedColumnValuesAndClose(rows, "FIELD", "EXTRA") + if err != nil { + return "", 0, errors.Annotatef(err, "sql: %s", query) + } + for _, oneRow := range results { + fieldName, extra := oneRow[0], oneRow[1] + switch extra { + case "STORED GENERATED", "VIRTUAL GENERATED": + hasGenerateColumn = true + continue + } + availableFields = append(availableFields, wrapBackTicks(escapeString(fieldName))) + } + if completeInsert || hasGenerateColumn { + return strings.Join(availableFields, ","), len(availableFields), nil + } + return "*", len(availableFields), nil +} + +func buildWhereClauses(handleColNames []string, handleVals [][]string) []string { + if len(handleColNames) == 0 || len(handleVals) == 0 { + return nil + } + quotaCols := make([]string, len(handleColNames)) + for i, s := range handleColNames { + quotaCols[i] = fmt.Sprintf("`%s`", escapeString(s)) + } + where := make([]string, 0, len(handleVals)+1) + buf := &bytes.Buffer{} + buildCompareClause(buf, quotaCols, handleVals[0], less, false) + where = append(where, buf.String()) + buf.Reset() + for i := 1; i < len(handleVals); i++ { + low, up := handleVals[i-1], handleVals[i] + buildBetweenClause(buf, quotaCols, low, up) + where = append(where, buf.String()) + buf.Reset() + } + buildCompareClause(buf, quotaCols, handleVals[len(handleVals)-1], greater, true) + where = append(where, buf.String()) + buf.Reset() + return where +} + +// return greater than TableRangeScan where clause +// the result doesn't contain brackets +const ( + greater = '>' + less = '<' + equal = '=' +) + +// buildCompareClause build clause with specified bounds. Usually we will use the following two conditions: +// (compare, writeEqual) == (less, false), return quotaCols < bound clause. In other words, (-inf, bound) +// (compare, writeEqual) == (greater, true), return quotaCols >= bound clause. In other words, [bound, +inf) +func buildCompareClause(buf *bytes.Buffer, quotaCols []string, bound []string, compare byte, writeEqual bool) { // revive:disable-line:flag-parameter + for i, col := range quotaCols { + if i > 0 { + buf.WriteString("or(") + } + for j := 0; j < i; j++ { + buf.WriteString(quotaCols[j]) + buf.WriteByte(equal) + buf.WriteString(bound[j]) + buf.WriteString(" and ") + } + buf.WriteString(col) + buf.WriteByte(compare) + if writeEqual && i == len(quotaCols)-1 { + buf.WriteByte(equal) + } + buf.WriteString(bound[i]) + if i > 0 { + buf.WriteByte(')') + } else if i != len(quotaCols)-1 { + buf.WriteByte(' ') + } + } +} + +// getCommonLength returns the common length of low and up +func getCommonLength(low []string, up []string) int { + for i := range low { + if low[i] != up[i] { + return i + } + } + return len(low) +} + +// buildBetweenClause build clause in a specified table range. +// the result where clause will be low <= quotaCols < up. In other words, [low, up) +func buildBetweenClause(buf *bytes.Buffer, quotaCols []string, low []string, up []string) { + singleBetween := func(writeEqual bool) { + buf.WriteString(quotaCols[0]) + buf.WriteByte(greater) + if writeEqual { + buf.WriteByte(equal) + } + buf.WriteString(low[0]) + buf.WriteString(" and ") + buf.WriteString(quotaCols[0]) + buf.WriteByte(less) + buf.WriteString(up[0]) + } + // handle special cases with common prefix + commonLen := getCommonLength(low, up) + if commonLen > 0 { + // unexpected case for low == up, return empty result + if commonLen == len(low) { + buf.WriteString("false") + return + } + for i := 0; i < commonLen; i++ { + if i > 0 { + buf.WriteString(" and ") + } + buf.WriteString(quotaCols[i]) + buf.WriteByte(equal) + buf.WriteString(low[i]) + } + buf.WriteString(" and(") + defer buf.WriteByte(')') + quotaCols = quotaCols[commonLen:] + low = low[commonLen:] + up = up[commonLen:] + } + + // handle special cases with only one column + if len(quotaCols) == 1 { + singleBetween(true) + return + } + buf.WriteByte('(') + singleBetween(false) + buf.WriteString(")or(") + buf.WriteString(quotaCols[0]) + buf.WriteByte(equal) + buf.WriteString(low[0]) + buf.WriteString(" and(") + buildCompareClause(buf, quotaCols[1:], low[1:], greater, true) + buf.WriteString("))or(") + buf.WriteString(quotaCols[0]) + buf.WriteByte(equal) + buf.WriteString(up[0]) + buf.WriteString(" and(") + buildCompareClause(buf, quotaCols[1:], up[1:], less, false) + buf.WriteString("))") +} + +func buildOrderByClauseString(handleColNames []string) string { + if len(handleColNames) == 0 { + return "" + } + separator := "," + quotaCols := make([]string, len(handleColNames)) + for i, col := range handleColNames { + quotaCols[i] = fmt.Sprintf("`%s`", escapeString(col)) + } + return fmt.Sprintf("ORDER BY %s", strings.Join(quotaCols, separator)) +} + +func buildLockTablesSQL(allTables DatabaseTables, blockList map[string]map[string]interface{}) string { + // ,``.`` READ has 11 bytes, "LOCK TABLE" has 10 bytes + estimatedCap := len(allTables)*11 + 10 + s := bytes.NewBuffer(make([]byte, 0, estimatedCap)) + n := false + for dbName, tables := range allTables { + escapedDBName := escapeString(dbName) + for _, table := range tables { + // Lock views will lock related tables. However, we won't dump data only the create sql of view, so we needn't lock view here. + // Besides, mydumper also only lock base table here. https://github.com/maxbube/mydumper/blob/1fabdf87e3007e5934227b504ad673ba3697946c/mydumper.c#L1568 + if table.Type != TableTypeBase { + continue + } + if blockTable, ok := blockList[dbName]; ok { + if _, ok := blockTable[table.Name]; ok { + continue + } + } + if !n { + fmt.Fprintf(s, "LOCK TABLES `%s`.`%s` READ", escapedDBName, escapeString(table.Name)) + n = true + } else { + fmt.Fprintf(s, ",`%s`.`%s` READ", escapedDBName, escapeString(table.Name)) + } + } + } + return s.String() +} + +type oneStrColumnTable struct { + data []string +} + +func (o *oneStrColumnTable) handleOneRow(rows *sql.Rows) error { + var str string + if err := rows.Scan(&str); err != nil { + return errors.Trace(err) + } + o.data = append(o.data, str) + return nil +} + +func simpleQuery(conn *sql.Conn, sql string, handleOneRow func(*sql.Rows) error) error { + return simpleQueryWithArgs(conn, handleOneRow, sql) +} + +func simpleQueryWithArgs(conn *sql.Conn, handleOneRow func(*sql.Rows) error, sql string, args ...interface{}) error { + rows, err := conn.QueryContext(context.Background(), sql, args...) + if err != nil { + return errors.Annotatef(err, "sql: %s, args: %s", sql, args) + } + defer rows.Close() + + for rows.Next() { + if err := handleOneRow(rows); err != nil { + rows.Close() + return errors.Annotatef(err, "sql: %s, args: %s", sql, args) + } + } + rows.Close() + return errors.Annotatef(rows.Err(), "sql: %s, args: %s", sql, args) +} + +func pickupPossibleField(meta TableMeta, db *sql.Conn) (string, error) { + // try using _tidb_rowid first + if meta.HasImplicitRowID() { + return "_tidb_rowid", nil + } + // try to use pk or uk + fieldName, err := getNumericIndex(db, meta) + if err != nil { + return "", err + } + + // if fieldName == "", there is no proper index + return fieldName, nil +} + +func estimateCount(tctx *tcontext.Context, dbName, tableName string, db *sql.Conn, field string, conf *Config) uint64 { + var query string + if strings.TrimSpace(field) == "*" || strings.TrimSpace(field) == "" { + query = fmt.Sprintf("EXPLAIN SELECT * FROM `%s`.`%s`", escapeString(dbName), escapeString(tableName)) + } else { + query = fmt.Sprintf("EXPLAIN SELECT `%s` FROM `%s`.`%s`", escapeString(field), escapeString(dbName), escapeString(tableName)) + } + + if conf.Where != "" { + query += " WHERE " + query += conf.Where + } + + estRows := detectEstimateRows(tctx, db, query, []string{"rows", "estRows", "count"}) + /* tidb results field name is estRows (before 4.0.0-beta.2: count) + +-----------------------+----------+-----------+---------------------------------------------------------+ + | id | estRows | task | access object | operator info | + +-----------------------+----------+-----------+---------------------------------------------------------+ + | tablereader_5 | 10000.00 | root | | data:tablefullscan_4 | + | └─tablefullscan_4 | 10000.00 | cop[tikv] | table:a | table:a, keep order:false, stats:pseudo | + +-----------------------+----------+-----------+---------------------------------------------------------- + + mariadb result field name is rows + +------+-------------+---------+-------+---------------+------+---------+------+----------+-------------+ + | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | + +------+-------------+---------+-------+---------------+------+---------+------+----------+-------------+ + | 1 | SIMPLE | sbtest1 | index | NULL | k_1 | 4 | NULL | 15000049 | Using index | + +------+-------------+---------+-------+---------------+------+---------+------+----------+-------------+ + + mysql result field name is rows + +----+-------------+-------+------------+-------+---------------+-----------+---------+------+------+----------+-------------+ + | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | + +----+-------------+-------+------------+-------+---------------+-----------+---------+------+------+----------+-------------+ + | 1 | SIMPLE | t1 | NULL | index | NULL | multi_col | 10 | NULL | 5 | 100.00 | Using index | + +----+-------------+-------+------------+-------+---------------+-----------+---------+------+------+----------+-------------+ + */ + if estRows > 0 { + return estRows + } + return 0 +} + +func detectEstimateRows(tctx *tcontext.Context, db *sql.Conn, query string, fieldNames []string) uint64 { + rows, err := db.QueryContext(tctx, query) + if err != nil { + tctx.L().Info("can't estimate rows from db", + zap.String("query", query), log.ShortError(err)) + return 0 + } + defer rows.Close() + rows.Next() + columns, err := rows.Columns() + if err != nil { + tctx.L().Info("can't get columns when estimate rows from db", + zap.String("query", query), log.ShortError(err)) + return 0 + } + err = rows.Err() + if err != nil { + tctx.L().Info("rows meet some error during the query when estimate rows", + zap.String("query", query), log.ShortError(err)) + return 0 + } + addr := make([]interface{}, len(columns)) + oneRow := make([]sql.NullString, len(columns)) + fieldIndex := -1 + for i := range oneRow { + addr[i] = &oneRow[i] + } +found: + for i := range oneRow { + for _, fieldName := range fieldNames { + if strings.EqualFold(columns[i], fieldName) { + fieldIndex = i + break found + } + } + } + err = rows.Scan(addr...) + if err != nil || fieldIndex < 0 { + tctx.L().Info("can't estimate rows from db", + zap.String("query", query), zap.Int("fieldIndex", fieldIndex), log.ShortError(err)) + return 0 + } + + estRows, err := strconv.ParseFloat(oneRow[fieldIndex].String, 64) + if err != nil { + tctx.L().Info("can't get parse estimate rows from db", + zap.String("query", query), log.ShortError(err)) + return 0 + } + + return uint64(estRows) +} + +func parseSnapshotToTSO(pool *sql.DB, snapshot string) (uint64, error) { + snapshotTS, err := strconv.ParseUint(snapshot, 10, 64) + if err == nil { + return snapshotTS, nil + } + var tso sql.NullInt64 + query := "SELECT unix_timestamp(?)" + row := pool.QueryRow(query, snapshot) + err = row.Scan(&tso) + if err != nil { + return 0, errors.Annotatef(err, "sql: %s", strings.ReplaceAll(query, "?", fmt.Sprintf(`"%s"`, snapshot))) + } + if !tso.Valid { + return 0, errors.Errorf("snapshot %s format not supported. please use tso or '2006-01-02 15:04:05' format time", snapshot) + } + return (uint64(tso.Int64) << 18) * 1000, nil +} + +func buildWhereCondition(conf *Config, where string) string { + var query strings.Builder + separator := "WHERE" + leftBracket := " " + rightBracket := " " + if conf.Where != "" && where != "" { + leftBracket = " (" + rightBracket = ") " + } + if conf.Where != "" { + query.WriteString(separator) + query.WriteString(leftBracket) + query.WriteString(conf.Where) + query.WriteString(rightBracket) + separator = "AND" + } + if where != "" { + query.WriteString(separator) + query.WriteString(leftBracket) + query.WriteString(where) + query.WriteString(rightBracket) + } + return query.String() +} + +func escapeString(s string) string { + return strings.ReplaceAll(s, "`", "``") +} + +// GetPartitionNames get partition names from a specified table +func GetPartitionNames(db *sql.Conn, schema, table string) (partitions []string, err error) { + partitions = make([]string, 0) + var partitionName sql.NullString + err = simpleQueryWithArgs(db, func(rows *sql.Rows) error { + err := rows.Scan(&partitionName) + if err != nil { + return errors.Trace(err) + } + if partitionName.Valid { + partitions = append(partitions, partitionName.String) + } + return nil + }, "SELECT PARTITION_NAME from INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?", schema, table) + return +} + +// GetPartitionTableIDs get partition tableIDs through histograms. +// SHOW STATS_HISTOGRAMS has db_name,table_name,partition_name but doesn't have partition id +// mysql.stats_histograms has partition_id but doesn't have db_name,table_name,partition_name +// So we combine the results from these two sqls to get partition ids for each table +// If UPDATE_TIME,DISTINCT_COUNT are equal, we assume these two records can represent one line. +// If histograms are not accurate or (UPDATE_TIME,DISTINCT_COUNT) has duplicate data, it's still fine. +// Because the possibility is low and the effect is that we will select more than one regions in one time, +// this will not affect the correctness of the dumping data and will not affect the memory usage much. +// This method is tricky, but no better way is found. +// Because TiDB v3.0.0's information_schema.partition table doesn't have partition name or partition id info +// return (dbName -> tbName -> partitionName -> partitionID, error) +func GetPartitionTableIDs(db *sql.Conn, tables map[string]map[string]struct{}) (map[string]map[string]map[string]int64, error) { + const ( + showStatsHistogramsSQL = "SHOW STATS_HISTOGRAMS" + selectStatsHistogramsSQL = "SELECT TABLE_ID,FROM_UNIXTIME(VERSION DIV 262144 DIV 1000,'%Y-%m-%d %H:%i:%s') AS UPDATE_TIME,DISTINCT_COUNT FROM mysql.stats_histograms" + ) + partitionIDs := make(map[string]map[string]map[string]int64, len(tables)) + rows, err := db.QueryContext(context.Background(), showStatsHistogramsSQL) + if err != nil { + return nil, errors.Annotatef(err, "sql: %s", showStatsHistogramsSQL) + } + results, err := GetSpecifiedColumnValuesAndClose(rows, "DB_NAME", "TABLE_NAME", "PARTITION_NAME", "UPDATE_TIME", "DISTINCT_COUNT") + if err != nil { + return nil, errors.Annotatef(err, "sql: %s", showStatsHistogramsSQL) + } + type partitionInfo struct { + dbName, tbName, partitionName string + } + saveMap := make(map[string]map[string]partitionInfo) + for _, oneRow := range results { + dbName, tbName, partitionName, updateTime, distinctCount := oneRow[0], oneRow[1], oneRow[2], oneRow[3], oneRow[4] + if len(partitionName) == 0 { + continue + } + if tbm, ok := tables[dbName]; ok { + if _, ok = tbm[tbName]; ok { + if _, ok = saveMap[updateTime]; !ok { + saveMap[updateTime] = make(map[string]partitionInfo) + } + saveMap[updateTime][distinctCount] = partitionInfo{ + dbName: dbName, + tbName: tbName, + partitionName: partitionName, + } + } + } + } + if len(saveMap) == 0 { + return map[string]map[string]map[string]int64{}, nil + } + err = simpleQuery(db, selectStatsHistogramsSQL, func(rows *sql.Rows) error { + var ( + tableID int64 + updateTime, distinctCount string + ) + err2 := rows.Scan(&tableID, &updateTime, &distinctCount) + if err2 != nil { + return errors.Trace(err2) + } + if mpt, ok := saveMap[updateTime]; ok { + if partition, ok := mpt[distinctCount]; ok { + dbName, tbName, partitionName := partition.dbName, partition.tbName, partition.partitionName + if _, ok := partitionIDs[dbName]; !ok { + partitionIDs[dbName] = make(map[string]map[string]int64) + } + if _, ok := partitionIDs[dbName][tbName]; !ok { + partitionIDs[dbName][tbName] = make(map[string]int64) + } + partitionIDs[dbName][tbName][partitionName] = tableID + } + } + return nil + }) + return partitionIDs, err +} + +// GetDBInfo get model.DBInfos from database sql interface. +// We need table_id to check whether a region belongs to this table +func GetDBInfo(db *sql.Conn, tables map[string]map[string]struct{}) ([]*model.DBInfo, error) { + const tableIDSQL = "SELECT TABLE_SCHEMA,TABLE_NAME,TIDB_TABLE_ID FROM INFORMATION_SCHEMA.TABLES ORDER BY TABLE_SCHEMA" + + schemas := make([]*model.DBInfo, 0, len(tables)) + var ( + tableSchema, tableName string + tidbTableID int64 + ) + partitionIDs, err := GetPartitionTableIDs(db, tables) + if err != nil { + return nil, err + } + err = simpleQuery(db, tableIDSQL, func(rows *sql.Rows) error { + err2 := rows.Scan(&tableSchema, &tableName, &tidbTableID) + if err2 != nil { + return errors.Trace(err2) + } + if tbm, ok := tables[tableSchema]; !ok { + return nil + } else if _, ok = tbm[tableName]; !ok { + return nil + } + last := len(schemas) - 1 + if last < 0 || schemas[last].Name.O != tableSchema { + schemas = append(schemas, &model.DBInfo{ + Name: model.CIStr{O: tableSchema}, + Tables: make([]*model.TableInfo, 0, len(tables[tableSchema])), + }) + last++ + } + var partition *model.PartitionInfo + if tbm, ok := partitionIDs[tableSchema]; ok { + if ptm, ok := tbm[tableName]; ok { + partition = &model.PartitionInfo{Definitions: make([]model.PartitionDefinition, 0, len(ptm))} + for partitionName, partitionID := range ptm { + partition.Definitions = append(partition.Definitions, model.PartitionDefinition{ + ID: partitionID, + Name: model.CIStr{O: partitionName}, + }) + } + } + } + schemas[last].Tables = append(schemas[last].Tables, &model.TableInfo{ + ID: tidbTableID, + Name: model.CIStr{O: tableName}, + Partition: partition, + }) + return nil + }) + return schemas, err +} + +// GetRegionInfos get region info including regionID, start key, end key from database sql interface. +// start key, end key includes information to help split table +func GetRegionInfos(db *sql.Conn) (*helper.RegionsInfo, error) { + const tableRegionSQL = "SELECT REGION_ID,START_KEY,END_KEY FROM INFORMATION_SCHEMA.TIKV_REGION_STATUS ORDER BY START_KEY;" + var ( + regionID int64 + startKey, endKey string + ) + regionsInfo := &helper.RegionsInfo{Regions: make([]helper.RegionInfo, 0)} + err := simpleQuery(db, tableRegionSQL, func(rows *sql.Rows) error { + err := rows.Scan(®ionID, &startKey, &endKey) + if err != nil { + return errors.Trace(err) + } + regionsInfo.Regions = append(regionsInfo.Regions, helper.RegionInfo{ + ID: regionID, + StartKey: startKey, + EndKey: endKey, + }) + return nil + }) + return regionsInfo, err +} + +// GetCharsetAndDefaultCollation gets charset and default collation map. +func GetCharsetAndDefaultCollation(ctx context.Context, db *sql.Conn) (map[string]string, error) { + charsetAndDefaultCollation := make(map[string]string) + query := "SHOW CHARACTER SET" + + // Show an example. + /* + mysql> SHOW CHARACTER SET; + +----------+---------------------------------+---------------------+--------+ + | Charset | Description | Default collation | Maxlen | + +----------+---------------------------------+---------------------+--------+ + | armscii8 | ARMSCII-8 Armenian | armscii8_general_ci | 1 | + | ascii | US ASCII | ascii_general_ci | 1 | + | big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 | + | binary | Binary pseudo charset | binary | 1 | + | cp1250 | Windows Central European | cp1250_general_ci | 1 | + | cp1251 | Windows Cyrillic | cp1251_general_ci | 1 | + +----------+---------------------------------+---------------------+--------+ + */ + + rows, err := db.QueryContext(ctx, query) + if err != nil { + return nil, errors.Annotatef(err, "sql: %s", query) + } + + defer rows.Close() + for rows.Next() { + var charset, description, collation string + var maxlen int + if scanErr := rows.Scan(&charset, &description, &collation, &maxlen); scanErr != nil { + return nil, errors.Annotatef(err, "sql: %s", query) + } + charsetAndDefaultCollation[strings.ToLower(charset)] = collation + } + if err = rows.Close(); err != nil { + return nil, errors.Annotatef(err, "sql: %s", query) + } + return charsetAndDefaultCollation, err +} diff --git a/dumpling/export/sql_test.go b/dumpling/export/sql_test.go new file mode 100644 index 0000000000000..4fd8cb31276b8 --- /dev/null +++ b/dumpling/export/sql_test.go @@ -0,0 +1,1772 @@ +// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +package export + +import ( + "context" + "database/sql" + "database/sql/driver" + "encoding/csv" + "encoding/json" + "fmt" + "io" + "os" + "path" + "runtime" + "strconv" + "strings" + "testing" + + "github.com/go-sql-driver/mysql" + + "github.com/DATA-DOG/go-sqlmock" + "github.com/coreos/go-semver/semver" + "github.com/pingcap/errors" + "github.com/stretchr/testify/require" + + "github.com/pingcap/tidb/br/pkg/version" + dbconfig "github.com/pingcap/tidb/config" + tcontext "github.com/pingcap/tidb/dumpling/context" +) + +var showIndexHeaders = []string{ + "Table", + "Non_unique", + "Key_name", + "Seq_in_index", + "Column_name", + "Collation", + "Cardinality", + "Sub_part", + "Packed", + "Null", + "Index_type", + "Comment", + "Index_comment", +} + +const ( + database = "foo" + table = "bar" +) + +func TestBuildSelectAllQuery(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + + conn, err := db.Conn(context.Background()) + require.NoError(t, err) + + mockConf := defaultConfigForTest(t) + mockConf.SortByPk = true + + // Test TiDB server. + mockConf.ServerInfo.ServerType = version.ServerTypeTiDB + + orderByClause, err := buildOrderByClause(mockConf, conn, database, table, true) + require.NoError(t, err) + + mock.ExpectQuery("SHOW COLUMNS FROM"). + WillReturnRows(sqlmock.NewRows([]string{"Field", "Type", "Null", "Key", "Default", "Extra"}). + AddRow("id", "int(11)", "NO", "PRI", nil, "")) + + selectedField, _, err := buildSelectField(conn, database, table, false) + require.NoError(t, err) + + q := buildSelectQuery(database, table, selectedField, "", "", orderByClause) + require.Equal(t, fmt.Sprintf("SELECT * FROM `%s`.`%s` ORDER BY `_tidb_rowid`", database, table), q) + + mock.ExpectQuery(fmt.Sprintf("SHOW INDEX FROM `%s`.`%s`", database, table)). + WillReturnRows(sqlmock.NewRows(showIndexHeaders). + AddRow(table, 0, "PRIMARY", 1, "id", "A", 0, nil, nil, "", "BTREE", "", "")) + + orderByClause, err = buildOrderByClause(mockConf, conn, database, table, false) + require.NoError(t, err) + + mock.ExpectQuery("SHOW COLUMNS FROM"). + WillReturnRows(sqlmock.NewRows([]string{"Field", "Type", "Null", "Key", "Default", "Extra"}). + AddRow("id", "int(11)", "NO", "PRI", nil, "")) + + selectedField, _, err = buildSelectField(conn, database, table, false) + require.NoError(t, err) + + q = buildSelectQuery(database, table, selectedField, "", "", orderByClause) + require.Equal(t, fmt.Sprintf("SELECT * FROM `%s`.`%s` ORDER BY `id`", database, table), q) + require.NoError(t, mock.ExpectationsWereMet()) + + // Test other servers. + otherServers := []version.ServerType{version.ServerTypeUnknown, version.ServerTypeMySQL, version.ServerTypeMariaDB} + + // Test table with primary key. + for _, serverTp := range otherServers { + mockConf.ServerInfo.ServerType = serverTp + comment := fmt.Sprintf("server type: %s", serverTp) + + mock.ExpectQuery(fmt.Sprintf("SHOW INDEX FROM `%s`.`%s`", database, table)). + WillReturnRows(sqlmock.NewRows(showIndexHeaders). + AddRow(table, 0, "PRIMARY", 1, "id", "A", 0, nil, nil, "", "BTREE", "", "")) + orderByClause, err := buildOrderByClause(mockConf, conn, database, table, false) + require.NoError(t, err, comment) + + mock.ExpectQuery("SHOW COLUMNS FROM"). + WillReturnRows(sqlmock.NewRows([]string{"Field", "Type", "Null", "Key", "Default", "Extra"}). + AddRow("id", "int(11)", "NO", "PRI", nil, "")) + + selectedField, _, err = buildSelectField(conn, database, table, false) + require.NoError(t, err, comment) + + q = buildSelectQuery(database, table, selectedField, "", "", orderByClause) + require.Equal(t, fmt.Sprintf("SELECT * FROM `%s`.`%s` ORDER BY `id`", database, table), q, comment) + + err = mock.ExpectationsWereMet() + require.NoError(t, err, comment) + require.NoError(t, mock.ExpectationsWereMet(), comment) + } + + // Test table without primary key. + for _, serverTp := range otherServers { + mockConf.ServerInfo.ServerType = serverTp + comment := fmt.Sprintf("server type: %s", serverTp) + + mock.ExpectQuery(fmt.Sprintf("SHOW INDEX FROM `%s`.`%s`", database, table)). + WillReturnRows(sqlmock.NewRows(showIndexHeaders)) + + orderByClause, err := buildOrderByClause(mockConf, conn, database, table, false) + require.NoError(t, err, comment) + + mock.ExpectQuery("SHOW COLUMNS FROM"). + WillReturnRows(sqlmock.NewRows([]string{"Field", "Type", "Null", "Key", "Default", "Extra"}). + AddRow("id", "int(11)", "NO", "PRI", nil, "")) + + selectedField, _, err = buildSelectField(conn, "test", "t", false) + require.NoError(t, err, comment) + + q := buildSelectQuery(database, table, selectedField, "", "", orderByClause) + require.Equal(t, fmt.Sprintf("SELECT * FROM `%s`.`%s`", database, table), q, comment) + + err = mock.ExpectationsWereMet() + require.NoError(t, err, comment) + require.NoError(t, mock.ExpectationsWereMet(), comment) + } + + // Test when config.SortByPk is disabled. + mockConf.SortByPk = false + for tp := version.ServerTypeUnknown; tp < version.ServerTypeAll; tp++ { + mockConf.ServerInfo.ServerType = version.ServerType(tp) + comment := fmt.Sprintf("current server type: %v", tp) + + mock.ExpectQuery("SHOW COLUMNS FROM"). + WillReturnRows(sqlmock.NewRows([]string{"Field", "Type", "Null", "Key", "Default", "Extra"}). + AddRow("id", "int(11)", "NO", "PRI", nil, "")) + + selectedField, _, err := buildSelectField(conn, "test", "t", false) + require.NoError(t, err, comment) + + q := buildSelectQuery(database, table, selectedField, "", "", "") + require.Equal(t, fmt.Sprintf("SELECT * FROM `%s`.`%s`", database, table), q, comment) + require.NoError(t, mock.ExpectationsWereMet(), comment) + } +} + +func TestBuildOrderByClause(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + + conn, err := db.Conn(context.Background()) + require.NoError(t, err) + + mockConf := defaultConfigForTest(t) + mockConf.SortByPk = true + + // Test TiDB server. + mockConf.ServerInfo.ServerType = version.ServerTypeTiDB + + orderByClause, err := buildOrderByClause(mockConf, conn, database, table, true) + require.NoError(t, err) + require.Equal(t, orderByTiDBRowID, orderByClause) + + mock.ExpectQuery(fmt.Sprintf("SHOW INDEX FROM `%s`.`%s`", database, table)). + WillReturnRows(sqlmock.NewRows(showIndexHeaders).AddRow(table, 0, "PRIMARY", 1, "id", "A", 0, nil, nil, "", "BTREE", "", "")) + + orderByClause, err = buildOrderByClause(mockConf, conn, database, table, false) + require.NoError(t, err) + require.Equal(t, "ORDER BY `id`", orderByClause) + + // Test table with primary key. + mock.ExpectQuery(fmt.Sprintf("SHOW INDEX FROM `%s`.`%s`", database, table)). + WillReturnRows(sqlmock.NewRows(showIndexHeaders).AddRow(table, 0, "PRIMARY", 1, "id", "A", 0, nil, nil, "", "BTREE", "", "")) + orderByClause, err = buildOrderByClause(mockConf, conn, database, table, false) + require.NoError(t, err) + require.Equal(t, "ORDER BY `id`", orderByClause) + + // Test table with joint primary key. + mock.ExpectQuery(fmt.Sprintf("SHOW INDEX FROM `%s`.`%s`", database, table)). + WillReturnRows(sqlmock.NewRows(showIndexHeaders). + AddRow(table, 0, "PRIMARY", 1, "id", "A", 0, nil, nil, "", "BTREE", "", ""). + AddRow(table, 0, "PRIMARY", 2, "name", "A", 0, nil, nil, "", "BTREE", "", "")) + orderByClause, err = buildOrderByClause(mockConf, conn, database, table, false) + require.NoError(t, err) + require.Equal(t, "ORDER BY `id`,`name`", orderByClause) + + // Test table without primary key. + mock.ExpectQuery(fmt.Sprintf("SHOW INDEX FROM `%s`.`%s`", database, table)). + WillReturnRows(sqlmock.NewRows(showIndexHeaders)) + + orderByClause, err = buildOrderByClause(mockConf, conn, database, table, false) + require.NoError(t, err) + require.Equal(t, "", orderByClause) + + // Test when config.SortByPk is disabled. + mockConf.SortByPk = false + for _, hasImplicitRowID := range []bool{false, true} { + comment := fmt.Sprintf("current hasImplicitRowID: %v", hasImplicitRowID) + + orderByClause, err := buildOrderByClause(mockConf, conn, database, table, hasImplicitRowID) + require.NoError(t, err, comment) + require.Equal(t, "", orderByClause, comment) + } +} + +func TestBuildSelectField(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + + conn, err := db.Conn(context.Background()) + require.NoError(t, err) + + // generate columns not found + mock.ExpectQuery("SHOW COLUMNS FROM"). + WillReturnRows(sqlmock.NewRows([]string{"Field", "Type", "Null", "Key", "Default", "Extra"}). + AddRow("id", "int(11)", "NO", "PRI", nil, "")) + + selectedField, _, err := buildSelectField(conn, "test", "t", false) + require.Equal(t, "*", selectedField) + require.NoError(t, err) + require.NoError(t, mock.ExpectationsWereMet()) + + // user assigns completeInsert + mock.ExpectQuery("SHOW COLUMNS FROM"). + WillReturnRows(sqlmock.NewRows([]string{"Field", "Type", "Null", "Key", "Default", "Extra"}). + AddRow("id", "int(11)", "NO", "PRI", nil, ""). + AddRow("name", "varchar(12)", "NO", "", nil, ""). + AddRow("quo`te", "varchar(12)", "NO", "UNI", nil, "")) + + selectedField, _, err = buildSelectField(conn, "test", "t", true) + require.Equal(t, "`id`,`name`,`quo``te`", selectedField) + require.NoError(t, err) + require.NoError(t, mock.ExpectationsWereMet()) + + // found generate columns, rest columns is `id`,`name` + mock.ExpectQuery("SHOW COLUMNS FROM"). + WillReturnRows(sqlmock.NewRows([]string{"Field", "Type", "Null", "Key", "Default", "Extra"}). + AddRow("id", "int(11)", "NO", "PRI", nil, ""). + AddRow("name", "varchar(12)", "NO", "", nil, ""). + AddRow("quo`te", "varchar(12)", "NO", "UNI", nil, ""). + AddRow("generated", "varchar(12)", "NO", "", nil, "VIRTUAL GENERATED")) + + selectedField, _, err = buildSelectField(conn, "test", "t", false) + require.Equal(t, "`id`,`name`,`quo``te`", selectedField) + require.NoError(t, err) + require.NoError(t, mock.ExpectationsWereMet()) +} + +func TestParseSnapshotToTSO(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + _ = db.Close() + }() + + snapshot := "2020/07/18 20:31:50" + var unixTimeStamp uint64 = 1595075510 + // generate columns valid snapshot + mock.ExpectQuery(`SELECT unix_timestamp(?)`). + WithArgs(sqlmock.AnyArg()). + WillReturnRows(sqlmock.NewRows([]string{`unix_timestamp("2020/07/18 20:31:50")`}).AddRow(1595075510)) + tso, err := parseSnapshotToTSO(db, snapshot) + require.NoError(t, err) + require.Equal(t, (unixTimeStamp<<18)*1000, tso) + require.NoError(t, mock.ExpectationsWereMet()) + + // generate columns not valid snapshot + mock.ExpectQuery(`SELECT unix_timestamp(?)`). + WithArgs(sqlmock.AnyArg()). + WillReturnRows(sqlmock.NewRows([]string{`unix_timestamp("XXYYZZ")`}).AddRow(nil)) + tso, err = parseSnapshotToTSO(db, "XXYYZZ") + require.EqualError(t, err, "snapshot XXYYZZ format not supported. please use tso or '2006-01-02 15:04:05' format time") + require.Equal(t, uint64(0), tso) + require.NoError(t, mock.ExpectationsWereMet()) +} + +func TestShowCreateView(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + + conn, err := db.Conn(context.Background()) + require.NoError(t, err) + + mock.ExpectQuery("SHOW FIELDS FROM `test`.`v`"). + WillReturnRows(sqlmock.NewRows([]string{"Field", "Type", "Null", "Key", "Default", "Extra"}). + AddRow("a", "int(11)", "YES", nil, "NULL", nil)) + + mock.ExpectQuery("SHOW CREATE VIEW `test`.`v`"). + WillReturnRows(sqlmock.NewRows([]string{"View", "Create View", "character_set_client", "collation_connection"}). + AddRow("v", "CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v` (`a`) AS SELECT `t`.`a` AS `a` FROM `test`.`t`", "utf8", "utf8_general_ci")) + + createTableSQL, createViewSQL, err := ShowCreateView(conn, "test", "v") + require.NoError(t, err) + require.Equal(t, "CREATE TABLE `v`(\n`a` int\n)ENGINE=MyISAM;\n", createTableSQL) + require.Equal(t, "DROP TABLE IF EXISTS `v`;\nDROP VIEW IF EXISTS `v`;\nSET @PREV_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT;\nSET @PREV_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS;\nSET @PREV_COLLATION_CONNECTION=@@COLLATION_CONNECTION;\nSET character_set_client = utf8;\nSET character_set_results = utf8;\nSET collation_connection = utf8_general_ci;\nCREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v` (`a`) AS SELECT `t`.`a` AS `a` FROM `test`.`t`;\nSET character_set_client = @PREV_CHARACTER_SET_CLIENT;\nSET character_set_results = @PREV_CHARACTER_SET_RESULTS;\nSET collation_connection = @PREV_COLLATION_CONNECTION;\n", createViewSQL) + require.NoError(t, mock.ExpectationsWereMet()) +} + +func TestShowCreatePolicy(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + + conn, err := db.Conn(context.Background()) + require.NoError(t, err) + + mock.ExpectQuery("SHOW CREATE PLACEMENT POLICY `policy_x`"). + WillReturnRows(sqlmock.NewRows([]string{"Policy", "Create Policy"}). + AddRow("policy_x", "CREATE PLACEMENT POLICY `policy_x` LEARNERS=1")) + + createPolicySQL, err := ShowCreatePlacementPolicy(conn, "policy_x") + require.NoError(t, err) + require.Equal(t, "CREATE PLACEMENT POLICY `policy_x` LEARNERS=1", createPolicySQL) + require.NoError(t, mock.ExpectationsWereMet()) + +} + +func TestListPolicyNames(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + + conn, err := db.Conn(context.Background()) + require.NoError(t, err) + + mock.ExpectQuery("select distinct policy_name from information_schema.placement_rules where policy_name is not null;"). + WillReturnRows(sqlmock.NewRows([]string{"policy_name"}). + AddRow("policy_x")) + policies, err := ListAllPlacementPolicyNames(conn) + require.NoError(t, err) + require.Equal(t, []string{"policy_x"}, policies) + require.NoError(t, mock.ExpectationsWereMet()) + + // some old tidb version doesn't support placement rules returns error + expectedErr := &mysql.MySQLError{Number: ErrNoSuchTable, Message: "Table 'information_schema.placement_rules' doesn't exist"} + mock.ExpectExec("select distinct policy_name from information_schema.placement_rules where policy_name is not null;"). + WillReturnError(expectedErr) + policies, err = ListAllPlacementPolicyNames(conn) + if mysqlErr, ok := err.(*mysql.MySQLError); ok { + require.Equal(t, mysqlErr.Number, ErrNoSuchTable) + } +} + +func TestGetSuitableRows(t *testing.T) { + testCases := []struct { + avgRowLength uint64 + expectedRows uint64 + }{ + { + 0, + 200000, + }, + { + 32, + 1000000, + }, + { + 1024, + 131072, + }, + { + 4096, + 32768, + }, + } + for _, testCase := range testCases { + rows := GetSuitableRows(testCase.avgRowLength) + require.Equal(t, testCase.expectedRows, rows) + } +} + +func TestSelectTiDBRowID(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + + conn, err := db.Conn(context.Background()) + require.NoError(t, err) + + database, table := "test", "t" + + // _tidb_rowid is unavailable, or PKIsHandle. + mock.ExpectExec("SELECT _tidb_rowid from `test`.`t`"). + WillReturnError(errors.New(`1054, "Unknown column '_tidb_rowid' in 'field list'"`)) + hasImplicitRowID, err := SelectTiDBRowID(conn, database, table) + require.NoError(t, err) + require.False(t, hasImplicitRowID) + + // _tidb_rowid is available. + mock.ExpectExec("SELECT _tidb_rowid from `test`.`t`"). + WillReturnResult(sqlmock.NewResult(0, 0)) + hasImplicitRowID, err = SelectTiDBRowID(conn, database, table) + require.NoError(t, err) + require.True(t, hasImplicitRowID) + + // _tidb_rowid returns error + expectedErr := errors.New("mock error") + mock.ExpectExec("SELECT _tidb_rowid from `test`.`t`"). + WillReturnError(expectedErr) + hasImplicitRowID, err = SelectTiDBRowID(conn, database, table) + require.ErrorIs(t, errors.Cause(err), expectedErr) + require.False(t, hasImplicitRowID) +} + +func TestBuildTableSampleQueries(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + + conn, err := db.Conn(context.Background()) + require.NoError(t, err) + + tctx, cancel := tcontext.Background().WithLogger(appLogger).WithCancel() + + d := &Dumper{ + tctx: tctx, + conf: DefaultConfig(), + cancelCtx: cancel, + selectTiDBTableRegionFunc: selectTiDBTableRegion, + } + d.conf.ServerInfo = version.ServerInfo{ + HasTiKV: true, + ServerType: version.ServerTypeTiDB, + ServerVersion: tableSampleVersion, + } + + testCases := []struct { + handleColNames []string + handleColTypes []string + handleVals [][]driver.Value + expectedWhereClauses []string + hasTiDBRowID bool + }{ + { + []string{}, + []string{}, + [][]driver.Value{}, + nil, + false, + }, + { + []string{"a"}, + []string{"BIGINT"}, + [][]driver.Value{{1}}, + []string{"`a`<1", "`a`>=1"}, + false, + }, + // check whether dumpling can turn to dump whole table + { + []string{"a"}, + []string{"BIGINT"}, + [][]driver.Value{}, + nil, + false, + }, + // check whether dumpling can turn to dump whole table + { + []string{"_tidb_rowid"}, + []string{"BIGINT"}, + [][]driver.Value{}, + nil, + true, + }, + { + []string{"_tidb_rowid"}, + []string{"BIGINT"}, + [][]driver.Value{{1}}, + []string{"`_tidb_rowid`<1", "`_tidb_rowid`>=1"}, + true, + }, + { + []string{"a"}, + []string{"BIGINT"}, + [][]driver.Value{ + {1}, + {2}, + {3}, + }, + []string{"`a`<1", "`a`>=1 and `a`<2", "`a`>=2 and `a`<3", "`a`>=3"}, + false, + }, + { + []string{"a", "b"}, + []string{"BIGINT", "BIGINT"}, + [][]driver.Value{{1, 2}}, + []string{"`a`<1 or(`a`=1 and `b`<2)", "`a`>1 or(`a`=1 and `b`>=2)"}, + false, + }, + { + []string{"a", "b"}, + []string{"BIGINT", "BIGINT"}, + [][]driver.Value{ + {1, 2}, + {3, 4}, + {5, 6}, + }, + []string{ + "`a`<1 or(`a`=1 and `b`<2)", + "(`a`>1 and `a`<3)or(`a`=1 and(`b`>=2))or(`a`=3 and(`b`<4))", + "(`a`>3 and `a`<5)or(`a`=3 and(`b`>=4))or(`a`=5 and(`b`<6))", + "`a`>5 or(`a`=5 and `b`>=6)", + }, + false, + }, + { + []string{"a", "b", "c"}, + []string{"BIGINT", "BIGINT", "BIGINT"}, + [][]driver.Value{ + {1, 2, 3}, + {4, 5, 6}, + }, + []string{ + "`a`<1 or(`a`=1 and `b`<2)or(`a`=1 and `b`=2 and `c`<3)", + "(`a`>1 and `a`<4)or(`a`=1 and(`b`>2 or(`b`=2 and `c`>=3)))or(`a`=4 and(`b`<5 or(`b`=5 and `c`<6)))", + "`a`>4 or(`a`=4 and `b`>5)or(`a`=4 and `b`=5 and `c`>=6)", + }, + false, + }, + { + []string{"a", "b", "c"}, + []string{"BIGINT", "BIGINT", "BIGINT"}, + [][]driver.Value{ + {1, 2, 3}, + {1, 4, 5}, + }, + []string{ + "`a`<1 or(`a`=1 and `b`<2)or(`a`=1 and `b`=2 and `c`<3)", + "`a`=1 and((`b`>2 and `b`<4)or(`b`=2 and(`c`>=3))or(`b`=4 and(`c`<5)))", + "`a`>1 or(`a`=1 and `b`>4)or(`a`=1 and `b`=4 and `c`>=5)", + }, + false, + }, + { + []string{"a", "b", "c"}, + []string{"BIGINT", "BIGINT", "BIGINT"}, + [][]driver.Value{ + {1, 2, 3}, + {1, 2, 8}, + }, + []string{ + "`a`<1 or(`a`=1 and `b`<2)or(`a`=1 and `b`=2 and `c`<3)", + "`a`=1 and `b`=2 and(`c`>=3 and `c`<8)", + "`a`>1 or(`a`=1 and `b`>2)or(`a`=1 and `b`=2 and `c`>=8)", + }, + false, + }, + // special case: avoid return same samples + { + []string{"a", "b", "c"}, + []string{"BIGINT", "BIGINT", "BIGINT"}, + [][]driver.Value{ + {1, 2, 3}, + {1, 2, 3}, + }, + []string{ + "`a`<1 or(`a`=1 and `b`<2)or(`a`=1 and `b`=2 and `c`<3)", + "false", + "`a`>1 or(`a`=1 and `b`>2)or(`a`=1 and `b`=2 and `c`>=3)", + }, + false, + }, + // special case: numbers has bigger lexicographically order but lower number + { + []string{"a", "b", "c"}, + []string{"BIGINT", "BIGINT", "BIGINT"}, + [][]driver.Value{ + {12, 2, 3}, + {111, 4, 5}, + }, + []string{ + "`a`<12 or(`a`=12 and `b`<2)or(`a`=12 and `b`=2 and `c`<3)", + "(`a`>12 and `a`<111)or(`a`=12 and(`b`>2 or(`b`=2 and `c`>=3)))or(`a`=111 and(`b`<4 or(`b`=4 and `c`<5)))", // should return sql correctly + "`a`>111 or(`a`=111 and `b`>4)or(`a`=111 and `b`=4 and `c`>=5)", + }, + false, + }, + // test string fields + { + []string{"a", "b", "c"}, + []string{"BIGINT", "BIGINT", "varchar"}, + [][]driver.Value{ + {1, 2, "3"}, + {1, 4, "5"}, + }, + []string{ + "`a`<1 or(`a`=1 and `b`<2)or(`a`=1 and `b`=2 and `c`<'3')", + "`a`=1 and((`b`>2 and `b`<4)or(`b`=2 and(`c`>='3'))or(`b`=4 and(`c`<'5')))", + "`a`>1 or(`a`=1 and `b`>4)or(`a`=1 and `b`=4 and `c`>='5')", + }, + false, + }, + { + []string{"a", "b", "c", "d"}, + []string{"BIGINT", "BIGINT", "BIGINT", "BIGINT"}, + [][]driver.Value{ + {1, 2, 3, 4}, + {5, 6, 7, 8}, + }, + []string{ + "`a`<1 or(`a`=1 and `b`<2)or(`a`=1 and `b`=2 and `c`<3)or(`a`=1 and `b`=2 and `c`=3 and `d`<4)", + "(`a`>1 and `a`<5)or(`a`=1 and(`b`>2 or(`b`=2 and `c`>3)or(`b`=2 and `c`=3 and `d`>=4)))or(`a`=5 and(`b`<6 or(`b`=6 and `c`<7)or(`b`=6 and `c`=7 and `d`<8)))", + "`a`>5 or(`a`=5 and `b`>6)or(`a`=5 and `b`=6 and `c`>7)or(`a`=5 and `b`=6 and `c`=7 and `d`>=8)", + }, + false, + }, + } + transferHandleValStrings := func(handleColTypes []string, handleVals [][]driver.Value) [][]string { + handleValStrings := make([][]string, 0, len(handleVals)) + for _, handleVal := range handleVals { + handleValString := make([]string, 0, len(handleVal)) + for i, val := range handleVal { + rec := colTypeRowReceiverMap[strings.ToUpper(handleColTypes[i])]() + var valStr string + switch rec.(type) { + case *SQLTypeString: + valStr = fmt.Sprintf("'%s'", val) + case *SQLTypeBytes: + valStr = fmt.Sprintf("x'%x'", val) + case *SQLTypeNumber: + valStr = fmt.Sprintf("%d", val) + } + handleValString = append(handleValString, valStr) + } + handleValStrings = append(handleValStrings, handleValString) + } + return handleValStrings + } + + for caseID, testCase := range testCases { + t.Logf("case #%d", caseID) + handleColNames := testCase.handleColNames + handleColTypes := testCase.handleColTypes + handleVals := testCase.handleVals + handleValStrings := transferHandleValStrings(handleColTypes, handleVals) + + // Test build whereClauses + whereClauses := buildWhereClauses(handleColNames, handleValStrings) + require.Equal(t, testCase.expectedWhereClauses, whereClauses) + + // Test build tasks through table sample + if len(handleColNames) > 0 { + taskChan := make(chan Task, 128) + quotaCols := make([]string, 0, len(handleColNames)) + for _, col := range handleColNames { + quotaCols = append(quotaCols, wrapBackTicks(col)) + } + selectFields := strings.Join(quotaCols, ",") + meta := &mockTableIR{ + dbName: database, + tblName: table, + selectedField: selectFields, + hasImplicitRowID: testCase.hasTiDBRowID, + colTypes: handleColTypes, + colNames: handleColNames, + specCmt: []string{ + "/*!40101 SET NAMES binary*/;", + }, + } + + if !testCase.hasTiDBRowID { + rows := sqlmock.NewRows(showIndexHeaders) + for i, handleColName := range handleColNames { + rows.AddRow(table, 0, "PRIMARY", i, handleColName, "A", 0, nil, nil, "", "BTREE", "", "") + } + mock.ExpectQuery(fmt.Sprintf("SHOW INDEX FROM `%s`.`%s`", database, table)).WillReturnRows(rows) + } + + rows := sqlmock.NewRows(handleColNames) + for _, handleVal := range handleVals { + rows.AddRow(handleVal...) + } + mock.ExpectQuery(fmt.Sprintf("SELECT .* FROM `%s`.`%s` TABLESAMPLE REGIONS", database, table)).WillReturnRows(rows) + // special case, no enough value to split chunks + if len(handleVals) == 0 { + if !testCase.hasTiDBRowID { + rows = sqlmock.NewRows(showIndexHeaders) + for i, handleColName := range handleColNames { + rows.AddRow(table, 0, "PRIMARY", i, handleColName, "A", 0, nil, nil, "", "BTREE", "", "") + } + mock.ExpectQuery(fmt.Sprintf("SHOW INDEX FROM `%s`.`%s`", database, table)).WillReturnRows(rows) + mock.ExpectQuery("SHOW INDEX FROM").WillReturnRows(sqlmock.NewRows(showIndexHeaders)) + } else { + d.conf.Rows = 200000 + mock.ExpectQuery("EXPLAIN SELECT `_tidb_rowid`"). + WillReturnRows(sqlmock.NewRows([]string{"id", "count", "task", "operator info"}). + AddRow("IndexReader_5", "0.00", "root", "index:IndexScan_4")) + } + } + + require.NoError(t, d.concurrentDumpTable(tctx, conn, meta, taskChan)) + require.NoError(t, mock.ExpectationsWereMet()) + orderByClause := buildOrderByClauseString(handleColNames) + + checkQuery := func(i int, query string) { + task := <-taskChan + taskTableData, ok := task.(*TaskTableData) + require.True(t, ok) + require.Equal(t, i, taskTableData.ChunkIndex) + + data, ok := taskTableData.Data.(*tableData) + require.True(t, ok) + require.Equal(t, query, data.query) + } + + // special case, no value found + if len(handleVals) == 0 { + query := buildSelectQuery(database, table, selectFields, "", "", orderByClause) + checkQuery(0, query) + continue + } + + for i, w := range testCase.expectedWhereClauses { + query := buildSelectQuery(database, table, selectFields, "", buildWhereCondition(d.conf, w), orderByClause) + checkQuery(i, query) + } + } + } +} + +func TestBuildPartitionClauses(t *testing.T) { + const ( + dbName = "test" + tbName = "t" + fields = "*" + partition = "p0" + where = "WHERE a > 10" + orderByClause = "ORDER BY a" + ) + testCases := []struct { + partition string + where string + orderByClause string + expectedQuery string + }{ + { + "", + "", + "", + "SELECT * FROM `test`.`t`", + }, + { + partition, + "", + "", + "SELECT * FROM `test`.`t` PARTITION(`p0`)", + }, + { + partition, + where, + "", + "SELECT * FROM `test`.`t` PARTITION(`p0`) WHERE a > 10", + }, + { + partition, + "", + orderByClause, + "SELECT * FROM `test`.`t` PARTITION(`p0`) ORDER BY a", + }, + { + partition, + where, + orderByClause, + "SELECT * FROM `test`.`t` PARTITION(`p0`) WHERE a > 10 ORDER BY a", + }, + { + "", + where, + orderByClause, + "SELECT * FROM `test`.`t` WHERE a > 10 ORDER BY a", + }, + } + for _, testCase := range testCases { + query := buildSelectQuery(dbName, tbName, fields, testCase.partition, testCase.where, testCase.orderByClause) + require.Equal(t, testCase.expectedQuery, query) + } +} + +func TestBuildWhereCondition(t *testing.T) { + conf := DefaultConfig() + testCases := []struct { + confWhere string + chunkWhere string + expectedWhere string + }{ + { + "", + "", + "", + }, + { + "a >= 1000000 and a <= 2000000", + "", + "WHERE a >= 1000000 and a <= 2000000 ", + }, + { + "", + "(`a`>1 and `a`<3)or(`a`=1 and(`b`>=2))or(`a`=3 and(`b`<4))", + "WHERE (`a`>1 and `a`<3)or(`a`=1 and(`b`>=2))or(`a`=3 and(`b`<4)) ", + }, + { + "a >= 1000000 and a <= 2000000", + "(`a`>1 and `a`<3)or(`a`=1 and(`b`>=2))or(`a`=3 and(`b`<4))", + "WHERE (a >= 1000000 and a <= 2000000) AND ((`a`>1 and `a`<3)or(`a`=1 and(`b`>=2))or(`a`=3 and(`b`<4))) ", + }, + } + for _, testCase := range testCases { + conf.Where = testCase.confWhere + where := buildWhereCondition(conf, testCase.chunkWhere) + require.Equal(t, testCase.expectedWhere, where) + } +} + +func TestBuildRegionQueriesWithoutPartition(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + + conn, err := db.Conn(context.Background()) + require.NoError(t, err) + + tctx, cancel := tcontext.Background().WithLogger(appLogger).WithCancel() + + d := &Dumper{ + tctx: tctx, + conf: DefaultConfig(), + cancelCtx: cancel, + selectTiDBTableRegionFunc: selectTiDBTableRegion, + } + d.conf.ServerInfo = version.ServerInfo{ + HasTiKV: true, + ServerType: version.ServerTypeTiDB, + ServerVersion: gcSafePointVersion, + } + d.conf.Rows = 200000 + database := "foo" + table := "bar" + + testCases := []struct { + regionResults [][]driver.Value + handleColNames []string + handleColTypes []string + expectedWhereClauses []string + hasTiDBRowID bool + }{ + { + [][]driver.Value{ + {"7480000000000000FF3300000000000000F8", "7480000000000000FF3300000000000000F8"}, + }, + []string{"a"}, + []string{"BIGINT"}, + []string{ + "", + }, + false, + }, + { + [][]driver.Value{ + {"7480000000000000FF3300000000000000F8", "7480000000000000FF3300000000000000F8"}, + }, + []string{"_tidb_rowid"}, + []string{"BIGINT"}, + []string{ + "", + }, + true, + }, + { + [][]driver.Value{ + {"7480000000000000FF3300000000000000F8", "7480000000000000FF3300000000000000F8"}, + {"7480000000000000FF335F728000000000FF0EA6010000000000FA", "tableID=51, _tidb_rowid=960001"}, + {"7480000000000000FF335F728000000000FF1D4C010000000000FA", "tableID=51, _tidb_rowid=1920001"}, + {"7480000000000000FF335F728000000000FF2BF2010000000000FA", "tableID=51, _tidb_rowid=2880001"}, + }, + []string{"a"}, + []string{"BIGINT"}, + []string{ + "`a`<960001", + "`a`>=960001 and `a`<1920001", + "`a`>=1920001 and `a`<2880001", + "`a`>=2880001", + }, + false, + }, + { + [][]driver.Value{ + {"7480000000000000FF3300000000000000F8", "7480000000000000FF3300000000000000F8"}, + {"7480000000000000FF335F728000000000FF0EA6010000000000FA", "tableID=51, _tidb_rowid=960001"}, + // one invalid key + {"7520000000000000FF335F728000000000FF0EA6010000000000FA", "7520000000000000FF335F728000000000FF0EA6010000000000FA"}, + {"7480000000000000FF335F728000000000FF1D4C010000000000FA", "tableID=51, _tidb_rowid=1920001"}, + {"7480000000000000FF335F728000000000FF2BF2010000000000FA", "tableID=51, _tidb_rowid=2880001"}, + }, + []string{"_tidb_rowid"}, + []string{"BIGINT"}, + []string{ + "`_tidb_rowid`<960001", + "`_tidb_rowid`>=960001 and `_tidb_rowid`<1920001", + "`_tidb_rowid`>=1920001 and `_tidb_rowid`<2880001", + "`_tidb_rowid`>=2880001", + }, + true, + }, + } + + for i, testCase := range testCases { + t.Logf("case #%d", i) + handleColNames := testCase.handleColNames + handleColTypes := testCase.handleColTypes + regionResults := testCase.regionResults + + // Test build tasks through table region + taskChan := make(chan Task, 128) + meta := &mockTableIR{ + dbName: database, + tblName: table, + selectedField: "*", + selectedLen: len(handleColNames), + hasImplicitRowID: testCase.hasTiDBRowID, + colTypes: handleColTypes, + colNames: handleColNames, + specCmt: []string{ + "/*!40101 SET NAMES binary*/;", + }, + } + + mock.ExpectQuery("SELECT PARTITION_NAME from INFORMATION_SCHEMA.PARTITIONS"). + WithArgs(database, table).WillReturnRows(sqlmock.NewRows([]string{"PARTITION_NAME"}).AddRow(nil)) + + if !testCase.hasTiDBRowID { + rows := sqlmock.NewRows(showIndexHeaders) + for i, handleColName := range handleColNames { + rows.AddRow(table, 0, "PRIMARY", i, handleColName, "A", 0, nil, nil, "", "BTREE", "", "") + } + mock.ExpectQuery(fmt.Sprintf("SHOW INDEX FROM `%s`.`%s`", database, table)).WillReturnRows(rows) + } + + rows := sqlmock.NewRows([]string{"START_KEY", "tidb_decode_key(START_KEY)"}) + for _, regionResult := range regionResults { + rows.AddRow(regionResult...) + } + mock.ExpectQuery("SELECT START_KEY,tidb_decode_key\\(START_KEY\\) from INFORMATION_SCHEMA.TIKV_REGION_STATUS"). + WithArgs(database, table).WillReturnRows(rows) + + orderByClause := buildOrderByClauseString(handleColNames) + // special case, no enough value to split chunks + if !testCase.hasTiDBRowID && len(regionResults) <= 1 { + rows = sqlmock.NewRows(showIndexHeaders) + for i, handleColName := range handleColNames { + rows.AddRow(table, 0, "PRIMARY", i, handleColName, "A", 0, nil, nil, "", "BTREE", "", "") + } + mock.ExpectQuery(fmt.Sprintf("SHOW INDEX FROM `%s`.`%s`", database, table)).WillReturnRows(rows) + mock.ExpectQuery("SHOW INDEX FROM").WillReturnRows(sqlmock.NewRows(showIndexHeaders)) + } + require.NoError(t, d.concurrentDumpTable(tctx, conn, meta, taskChan)) + require.NoError(t, mock.ExpectationsWereMet()) + + for i, w := range testCase.expectedWhereClauses { + query := buildSelectQuery(database, table, "*", "", buildWhereCondition(d.conf, w), orderByClause) + task := <-taskChan + taskTableData, ok := task.(*TaskTableData) + require.True(t, ok) + require.Equal(t, i, taskTableData.ChunkIndex) + data, ok := taskTableData.Data.(*tableData) + require.True(t, ok) + require.Equal(t, query, data.query) + } + } +} + +func TestBuildRegionQueriesWithPartitions(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + + conn, err := db.Conn(context.Background()) + require.NoError(t, err) + + tctx, cancel := tcontext.Background().WithLogger(appLogger).WithCancel() + + d := &Dumper{ + tctx: tctx, + conf: DefaultConfig(), + cancelCtx: cancel, + selectTiDBTableRegionFunc: selectTiDBTableRegion, + } + d.conf.ServerInfo = version.ServerInfo{ + HasTiKV: true, + ServerType: version.ServerTypeTiDB, + ServerVersion: gcSafePointVersion, + } + partitions := []string{"p0", "p1", "p2"} + + testCases := []struct { + regionResults [][][]driver.Value + handleColNames []string + handleColTypes []string + expectedWhereClauses [][]string + hasTiDBRowID bool + dumpWholeTable bool + }{ + { + [][][]driver.Value{ + { + {6009, "t_121_i_1_0380000000000ea6010380000000000ea601", "t_121_", 6010, 1, 6010, 0, 0, 0, 74, 1052002}, + {6011, "t_121_", "t_121_i_1_0380000000000ea6010380000000000ea601", 6012, 1, 6012, 0, 0, 0, 68, 972177}, + }, + { + {6015, "t_122_i_1_0380000000002d2a810380000000002d2a81", "t_122_", 6016, 1, 6016, 0, 0, 0, 77, 1092962}, + {6017, "t_122_", "t_122_i_1_0380000000002d2a810380000000002d2a81", 6018, 1, 6018, 0, 0, 0, 66, 939975}, + }, + { + {6021, "t_123_i_1_0380000000004baf010380000000004baf01", "t_123_", 6022, 1, 6022, 0, 0, 0, 85, 1206726}, + {6023, "t_123_", "t_123_i_1_0380000000004baf010380000000004baf01", 6024, 1, 6024, 0, 0, 0, 65, 927576}, + }, + }, + []string{"_tidb_rowid"}, + []string{"BIGINT"}, + [][]string{ + {""}, {""}, {""}, + }, + true, + true, + }, + { + [][][]driver.Value{ + { + {6009, "t_121_i_1_0380000000000ea6010380000000000ea601", "t_121_r_10001", 6010, 1, 6010, 0, 0, 0, 74, 1052002}, + {6013, "t_121_r_10001", "t_121_r_970001", 6014, 1, 6014, 0, 0, 0, 75, 975908}, + {6003, "t_121_r_970001", "t_122_", 6004, 1, 6004, 0, 0, 0, 79, 1022285}, + {6011, "t_121_", "t_121_i_1_0380000000000ea6010380000000000ea601", 6012, 1, 6012, 0, 0, 0, 68, 972177}, + }, + { + {6015, "t_122_i_1_0380000000002d2a810380000000002d2a81", "t_122_r_2070760", 6016, 1, 6016, 0, 0, 0, 77, 1092962}, + {6019, "t_122_r_2070760", "t_122_r_3047115", 6020, 1, 6020, 0, 0, 0, 75, 959650}, + {6005, "t_122_r_3047115", "t_123_", 6006, 1, 6006, 0, 0, 0, 77, 992339}, + {6017, "t_122_", "t_122_i_1_0380000000002d2a810380000000002d2a81", 6018, 1, 6018, 0, 0, 0, 66, 939975}, + }, + { + {6021, "t_123_i_1_0380000000004baf010380000000004baf01", "t_123_r_4186953", 6022, 1, 6022, 0, 0, 0, 85, 1206726}, + {6025, "t_123_r_4186953", "t_123_r_5165682", 6026, 1, 6026, 0, 0, 0, 74, 951379}, + {6007, "t_123_r_5165682", "t_124_", 6008, 1, 6008, 0, 0, 0, 71, 918488}, + {6023, "t_123_", "t_123_i_1_0380000000004baf010380000000004baf01", 6024, 1, 6024, 0, 0, 0, 65, 927576}, + }, + }, + []string{"_tidb_rowid"}, + []string{"BIGINT"}, + [][]string{ + { + "`_tidb_rowid`<10001", + "`_tidb_rowid`>=10001 and `_tidb_rowid`<970001", + "`_tidb_rowid`>=970001", + }, + { + "`_tidb_rowid`<2070760", + "`_tidb_rowid`>=2070760 and `_tidb_rowid`<3047115", + "`_tidb_rowid`>=3047115", + }, + { + "`_tidb_rowid`<4186953", + "`_tidb_rowid`>=4186953 and `_tidb_rowid`<5165682", + "`_tidb_rowid`>=5165682", + }, + }, + true, + false, + }, + { + [][][]driver.Value{ + { + {6041, "t_134_", "t_134_r_960001", 6042, 1, 6042, 0, 0, 0, 69, 964987}, + {6035, "t_134_r_960001", "t_135_", 6036, 1, 6036, 0, 0, 0, 75, 1052130}, + }, + { + {6043, "t_135_", "t_135_r_2960001", 6044, 1, 6044, 0, 0, 0, 69, 969576}, + {6037, "t_135_r_2960001", "t_136_", 6038, 1, 6038, 0, 0, 0, 72, 1014464}, + }, + { + {6045, "t_136_", "t_136_r_4960001", 6046, 1, 6046, 0, 0, 0, 68, 957557}, + {6039, "t_136_r_4960001", "t_137_", 6040, 1, 6040, 0, 0, 0, 75, 1051579}, + }, + }, + []string{"a"}, + []string{"BIGINT"}, + [][]string{ + + { + "`a`<960001", + "`a`>=960001", + }, + { + "`a`<2960001", + "`a`>=2960001", + }, + { + "`a`<4960001", + "`a`>=4960001", + }, + }, + false, + false, + }, + } + + for i, testCase := range testCases { + t.Logf("case #%d", i) + handleColNames := testCase.handleColNames + handleColTypes := testCase.handleColTypes + regionResults := testCase.regionResults + + // Test build tasks through table region + taskChan := make(chan Task, 128) + meta := &mockTableIR{ + dbName: database, + tblName: table, + selectedField: "*", + selectedLen: len(handleColNames), + hasImplicitRowID: testCase.hasTiDBRowID, + colTypes: handleColTypes, + colNames: handleColNames, + specCmt: []string{ + "/*!40101 SET NAMES binary*/;", + }, + } + + rows := sqlmock.NewRows([]string{"PARTITION_NAME"}) + for _, partition := range partitions { + rows.AddRow(partition) + } + mock.ExpectQuery("SELECT PARTITION_NAME from INFORMATION_SCHEMA.PARTITIONS"). + WithArgs(database, table).WillReturnRows(rows) + + if !testCase.hasTiDBRowID { + rows = sqlmock.NewRows(showIndexHeaders) + for i, handleColName := range handleColNames { + rows.AddRow(table, 0, "PRIMARY", i, handleColName, "A", 0, nil, nil, "", "BTREE", "", "") + } + mock.ExpectQuery(fmt.Sprintf("SHOW INDEX FROM `%s`.`%s`", database, table)).WillReturnRows(rows) + } + + for i, partition := range partitions { + rows = sqlmock.NewRows([]string{"REGION_ID", "START_KEY", "END_KEY", "LEADER_ID", "LEADER_STORE_ID", "PEERS", "SCATTERING", "WRITTEN_BYTES", "READ_BYTES", "APPROXIMATE_SIZE(MB)", "APPROXIMATE_KEYS"}) + for _, regionResult := range regionResults[i] { + rows.AddRow(regionResult...) + } + mock.ExpectQuery(fmt.Sprintf("SHOW TABLE `%s`.`%s` PARTITION\\(`%s`\\) REGIONS", escapeString(database), escapeString(table), escapeString(partition))). + WillReturnRows(rows) + } + + orderByClause := buildOrderByClauseString(handleColNames) + require.NoError(t, d.concurrentDumpTable(tctx, conn, meta, taskChan)) + require.NoError(t, mock.ExpectationsWereMet()) + + chunkIdx := 0 + for i, partition := range partitions { + for _, w := range testCase.expectedWhereClauses[i] { + query := buildSelectQuery(database, table, "*", partition, buildWhereCondition(d.conf, w), orderByClause) + task := <-taskChan + taskTableData, ok := task.(*TaskTableData) + require.True(t, ok) + require.Equal(t, chunkIdx, taskTableData.ChunkIndex) + data, ok := taskTableData.Data.(*tableData) + require.True(t, ok) + require.Equal(t, query, data.query) + chunkIdx++ + } + } + } +} + +func buildMockNewRows(mock sqlmock.Sqlmock, columns []string, driverValues [][]driver.Value) *sqlmock.Rows { + rows := mock.NewRows(columns) + for _, driverValue := range driverValues { + rows.AddRow(driverValue...) + } + return rows +} + +func readRegionCsvDriverValues(t *testing.T) [][]driver.Value { + // nolint: dogsled + _, filename, _, _ := runtime.Caller(0) + csvFilename := path.Join(path.Dir(filename), "region_results.csv") + file, err := os.Open(csvFilename) + require.NoError(t, err) + csvReader := csv.NewReader(file) + values := make([][]driver.Value, 0, 990) + for { + results, err := csvReader.Read() + if err == io.EOF { + break + } + require.NoError(t, err) + if len(results) != 3 { + continue + } + regionID, err := strconv.Atoi(results[0]) + require.NoError(t, err) + startKey, endKey := results[1], results[2] + values = append(values, []driver.Value{regionID, startKey, endKey}) + } + return values +} + +func TestBuildVersion3RegionQueries(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + + conn, err := db.Conn(context.Background()) + require.NoError(t, err) + + tctx, cancel := tcontext.Background().WithLogger(appLogger).WithCancel() + oldOpenFunc := openDBFunc + defer func() { + openDBFunc = oldOpenFunc + }() + openDBFunc = func(_, _ string) (*sql.DB, error) { + return db, nil + } + + conf := DefaultConfig() + conf.ServerInfo = version.ServerInfo{ + HasTiKV: true, + ServerType: version.ServerTypeTiDB, + ServerVersion: decodeRegionVersion, + } + database := "test" + conf.Tables = DatabaseTables{ + database: []*TableInfo{ + {"t1", 0, TableTypeBase}, + {"t2", 0, TableTypeBase}, + {"t3", 0, TableTypeBase}, + {"t4", 0, TableTypeBase}, + }, + } + d := &Dumper{ + tctx: tctx, + conf: conf, + cancelCtx: cancel, + selectTiDBTableRegionFunc: selectTiDBTableRegion, + } + showStatsHistograms := buildMockNewRows(mock, []string{"Db_name", "Table_name", "Partition_name", "Column_name", "Is_index", "Update_time", "Distinct_count", "Null_count", "Avg_col_size", "Correlation"}, + [][]driver.Value{ + {"test", "t2", "p0", "a", 0, "2021-06-27 17:43:51", 1999999, 0, 8, 0}, + {"test", "t2", "p1", "a", 0, "2021-06-22 20:30:16", 1260000, 0, 8, 0}, + {"test", "t2", "p2", "a", 0, "2021-06-22 20:32:16", 1230000, 0, 8, 0}, + {"test", "t2", "p3", "a", 0, "2021-06-22 20:36:19", 2000000, 0, 8, 0}, + {"test", "t1", "", "a", 0, "2021-04-22 15:23:58", 7100000, 0, 8, 0}, + {"test", "t3", "", "PRIMARY", 1, "2021-06-27 22:08:43", 4980000, 0, 0, 0}, + {"test", "t4", "p0", "PRIMARY", 1, "2021-06-28 10:54:06", 2000000, 0, 0, 0}, + {"test", "t4", "p1", "PRIMARY", 1, "2021-06-28 10:55:04", 1300000, 0, 0, 0}, + {"test", "t4", "p2", "PRIMARY", 1, "2021-06-28 10:57:05", 1830000, 0, 0, 0}, + {"test", "t4", "p3", "PRIMARY", 1, "2021-06-28 10:59:04", 2000000, 0, 0, 0}, + {"mysql", "global_priv", "", "PRIMARY", 1, "2021-06-04 20:39:44", 0, 0, 0, 0}, + }) + selectMySQLStatsHistograms := buildMockNewRows(mock, []string{"TABLE_ID", "VERSION", "DISTINCT_COUNT"}, + [][]driver.Value{ + {15, "1970-01-01 08:00:00", 0}, + {15, "1970-01-01 08:00:00", 0}, + {15, "1970-01-01 08:00:00", 0}, + {41, "2021-04-22 15:23:58", 7100000}, + {41, "2021-04-22 15:23:59", 7100000}, + {41, "2021-04-22 15:23:59", 7100000}, + {41, "2021-04-22 15:23:59", 7100000}, + {27, "1970-01-01 08:00:00", 0}, + {27, "1970-01-01 08:00:00", 0}, + {25, "1970-01-01 08:00:00", 0}, + {25, "1970-01-01 08:00:00", 0}, + {2098, "2021-06-04 20:39:41", 0}, + {2101, "2021-06-04 20:39:44", 0}, + {2101, "2021-06-04 20:39:44", 0}, + {2101, "2021-06-04 20:39:44", 0}, + {2101, "2021-06-04 20:39:44", 0}, + {2128, "2021-06-22 20:29:19", 1991680}, + {2128, "2021-06-22 20:29:19", 1991680}, + {2128, "2021-06-22 20:29:19", 1991680}, + {2129, "2021-06-22 20:30:16", 1260000}, + {2129, "2021-06-22 20:30:16", 1237120}, + {2129, "2021-06-22 20:30:16", 1237120}, + {2129, "2021-06-22 20:30:16", 1237120}, + {2130, "2021-06-22 20:32:16", 1230000}, + {2130, "2021-06-22 20:32:16", 1216128}, + {2130, "2021-06-22 20:32:17", 1216128}, + {2130, "2021-06-22 20:32:17", 1216128}, + {2131, "2021-06-22 20:36:19", 2000000}, + {2131, "2021-06-22 20:36:19", 1959424}, + {2131, "2021-06-22 20:36:19", 1959424}, + {2131, "2021-06-22 20:36:19", 1959424}, + {2128, "2021-06-27 17:43:51", 1999999}, + {2136, "2021-06-27 22:08:38", 4860000}, + {2136, "2021-06-27 22:08:38", 4860000}, + {2136, "2021-06-27 22:08:38", 4860000}, + {2136, "2021-06-27 22:08:38", 4860000}, + {2136, "2021-06-27 22:08:43", 4980000}, + {2139, "2021-06-28 10:54:05", 1991680}, + {2139, "2021-06-28 10:54:05", 1991680}, + {2139, "2021-06-28 10:54:05", 1991680}, + {2139, "2021-06-28 10:54:05", 1991680}, + {2139, "2021-06-28 10:54:06", 2000000}, + {2140, "2021-06-28 10:55:02", 1246336}, + {2140, "2021-06-28 10:55:02", 1246336}, + {2140, "2021-06-28 10:55:02", 1246336}, + {2140, "2021-06-28 10:55:03", 1246336}, + {2140, "2021-06-28 10:55:04", 1300000}, + {2141, "2021-06-28 10:57:03", 1780000}, + {2141, "2021-06-28 10:57:03", 1780000}, + {2141, "2021-06-28 10:57:03", 1780000}, + {2141, "2021-06-28 10:57:03", 1780000}, + {2141, "2021-06-28 10:57:05", 1830000}, + {2142, "2021-06-28 10:59:03", 1959424}, + {2142, "2021-06-28 10:59:03", 1959424}, + {2142, "2021-06-28 10:59:03", 1959424}, + {2142, "2021-06-28 10:59:03", 1959424}, + {2142, "2021-06-28 10:59:04", 2000000}, + }) + selectRegionStatusHistograms := buildMockNewRows(mock, []string{"REGION_ID", "START_KEY", "END_KEY"}, readRegionCsvDriverValues(t)) + selectInformationSchemaTables := buildMockNewRows(mock, []string{"TABLE_SCHEMA", "TABLE_NAME", "TIDB_TABLE_ID"}, + [][]driver.Value{ + {"mysql", "expr_pushdown_blacklist", 39}, + {"mysql", "user", 5}, + {"mysql", "db", 7}, + {"mysql", "tables_priv", 9}, + {"mysql", "stats_top_n", 37}, + {"mysql", "columns_priv", 11}, + {"mysql", "bind_info", 35}, + {"mysql", "default_roles", 33}, + {"mysql", "role_edges", 31}, + {"mysql", "stats_feedback", 29}, + {"mysql", "gc_delete_range_done", 27}, + {"mysql", "gc_delete_range", 25}, + {"mysql", "help_topic", 17}, + {"mysql", "global_priv", 2101}, + {"mysql", "stats_histograms", 21}, + {"mysql", "opt_rule_blacklist", 2098}, + {"mysql", "stats_meta", 19}, + {"mysql", "stats_buckets", 23}, + {"mysql", "tidb", 15}, + {"mysql", "GLOBAL_VARIABLES", 13}, + {"test", "t2", 2127}, + {"test", "t1", 41}, + {"test", "t3", 2136}, + {"test", "t4", 2138}, + }) + mock.ExpectQuery("SHOW STATS_HISTOGRAMS"). + WillReturnRows(showStatsHistograms) + mock.ExpectQuery("SELECT TABLE_ID,FROM_UNIXTIME"). + WillReturnRows(selectMySQLStatsHistograms) + mock.ExpectQuery("SELECT TABLE_SCHEMA,TABLE_NAME,TIDB_TABLE_ID FROM INFORMATION_SCHEMA.TABLES ORDER BY TABLE_SCHEMA"). + WillReturnRows(selectInformationSchemaTables) + mock.ExpectQuery("SELECT REGION_ID,START_KEY,END_KEY FROM INFORMATION_SCHEMA.TIKV_REGION_STATUS ORDER BY START_KEY;"). + WillReturnRows(selectRegionStatusHistograms) + + require.NoError(t, d.renewSelectTableRegionFuncForLowerTiDB(tctx)) + require.NoError(t, mock.ExpectationsWereMet()) + + testCases := []struct { + tableName string + handleColNames []string + handleColTypes []string + expectedWhereClauses []string + hasTiDBRowID bool + }{ + { + "t1", + []string{"a"}, + []string{"INT"}, + []string{ + "`a`<960001", + "`a`>=960001 and `a`<1920001", + "`a`>=1920001 and `a`<2880001", + "`a`>=2880001 and `a`<3840001", + "`a`>=3840001 and `a`<4800001", + "`a`>=4800001 and `a`<5760001", + "`a`>=5760001 and `a`<6720001", + "`a`>=6720001", + }, + false, + }, + { + "t2", + []string{"a"}, + []string{"INT"}, + []string{ + "`a`<960001", + "`a`>=960001 and `a`<2960001", + "`a`>=2960001 and `a`<4960001", + "`a`>=4960001 and `a`<6960001", + "`a`>=6960001", + }, + false, + }, + { + "t3", + []string{"_tidb_rowid"}, + []string{"BIGINT"}, + []string{ + "`_tidb_rowid`<81584", + "`_tidb_rowid`>=81584 and `_tidb_rowid`<1041584", + "`_tidb_rowid`>=1041584 and `_tidb_rowid`<2001584", + "`_tidb_rowid`>=2001584 and `_tidb_rowid`<2961584", + "`_tidb_rowid`>=2961584 and `_tidb_rowid`<3921584", + "`_tidb_rowid`>=3921584 and `_tidb_rowid`<4881584", + "`_tidb_rowid`>=4881584 and `_tidb_rowid`<5841584", + "`_tidb_rowid`>=5841584 and `_tidb_rowid`<6801584", + "`_tidb_rowid`>=6801584", + }, + true, + }, + { + "t4", + []string{"_tidb_rowid"}, + []string{"BIGINT"}, + []string{ + "`_tidb_rowid`<180001", + "`_tidb_rowid`>=180001 and `_tidb_rowid`<1140001", + "`_tidb_rowid`>=1140001 and `_tidb_rowid`<2200001", + "`_tidb_rowid`>=2200001 and `_tidb_rowid`<3160001", + "`_tidb_rowid`>=3160001 and `_tidb_rowid`<4160001", + "`_tidb_rowid`>=4160001 and `_tidb_rowid`<5120001", + "`_tidb_rowid`>=5120001 and `_tidb_rowid`<6170001", + "`_tidb_rowid`>=6170001 and `_tidb_rowid`<7130001", + "`_tidb_rowid`>=7130001", + }, + true, + }, + } + + for i, testCase := range testCases { + t.Logf("case #%d", i) + table := testCase.tableName + handleColNames := testCase.handleColNames + handleColTypes := testCase.handleColTypes + + // Test build tasks through table region + taskChan := make(chan Task, 128) + meta := &mockTableIR{ + dbName: database, + tblName: table, + selectedField: "*", + hasImplicitRowID: testCase.hasTiDBRowID, + colNames: handleColNames, + colTypes: handleColTypes, + specCmt: []string{ + "/*!40101 SET NAMES binary*/;", + }, + } + + if !testCase.hasTiDBRowID { + rows := sqlmock.NewRows(showIndexHeaders) + for i, handleColName := range handleColNames { + rows.AddRow(table, 0, "PRIMARY", i, handleColName, "A", 0, nil, nil, "", "BTREE", "", "") + } + mock.ExpectQuery(fmt.Sprintf("SHOW INDEX FROM `%s`.`%s`", database, table)).WillReturnRows(rows) + } + + orderByClause := buildOrderByClauseString(handleColNames) + require.NoError(t, d.concurrentDumpTable(tctx, conn, meta, taskChan)) + require.NoError(t, mock.ExpectationsWereMet()) + + chunkIdx := 0 + for _, w := range testCase.expectedWhereClauses { + query := buildSelectQuery(database, table, "*", "", buildWhereCondition(d.conf, w), orderByClause) + task := <-taskChan + taskTableData, ok := task.(*TaskTableData) + require.True(t, ok) + require.Equal(t, chunkIdx, taskTableData.ChunkIndex) + + data, ok := taskTableData.Data.(*tableData) + require.True(t, ok) + require.Equal(t, query, data.query) + + chunkIdx++ + } + } +} + +func TestCheckTiDBWithTiKV(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + _ = db.Close() + }() + + tidbConf := dbconfig.NewConfig() + stores := []string{"unistore", "mocktikv", "tikv"} + for _, store := range stores { + tidbConf.Store = store + tidbConfBytes, err := json.Marshal(tidbConf) + require.NoError(t, err) + mock.ExpectQuery("SELECT @@tidb_config").WillReturnRows( + sqlmock.NewRows([]string{"@@tidb_config"}).AddRow(string(tidbConfBytes))) + hasTiKV, err := CheckTiDBWithTiKV(db) + require.NoError(t, err) + if store == "tikv" { + require.True(t, hasTiKV) + } else { + require.False(t, hasTiKV) + } + require.NoError(t, mock.ExpectationsWereMet()) + } + + errLackPrivilege := errors.New("ERROR 1142 (42000): SELECT command denied to user 'test'@'%' for table 'tidb'") + expectedResults := []interface{}{errLackPrivilege, 1, 0} + for i, res := range expectedResults { + t.Logf("case #%d", i) + mock.ExpectQuery("SELECT @@tidb_config").WillReturnError(errLackPrivilege) + expectedErr, ok := res.(error) + if ok { + mock.ExpectQuery("SELECT COUNT").WillReturnError(expectedErr) + hasTiKV, err := CheckTiDBWithTiKV(db) + require.ErrorIs(t, err, expectedErr) + require.True(t, hasTiKV) + } else if cnt, ok := res.(int); ok { + mock.ExpectQuery("SELECT COUNT").WillReturnRows( + sqlmock.NewRows([]string{"c"}).AddRow(cnt)) + hasTiKV, err := CheckTiDBWithTiKV(db) + require.NoError(t, err) + require.Equal(t, cnt > 0, hasTiKV) + } + require.NoError(t, mock.ExpectationsWereMet()) + } +} + +func TestPickupPossibleField(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + + conn, err := db.Conn(context.Background()) + require.NoError(t, err) + + meta := &mockTableIR{ + dbName: database, + tblName: table, + colNames: []string{"string1", "int1", "int2", "float1", "bin1", "int3", "bool1", "int4"}, + colTypes: []string{"VARCHAR", "INT", "BIGINT", "FLOAT", "BINARY", "MEDIUMINT", "BOOL", "TINYINT"}, + specCmt: []string{ + "/*!40101 SET NAMES binary*/;", + }, + } + + testCases := []struct { + expectedErr error + expectedField string + hasImplicitRowID bool + showIndexResults [][]driver.Value + }{ + { + errors.New("show index error"), + "", + false, + nil, + }, { + nil, + "_tidb_rowid", + true, + nil, + }, // both primary and unique key columns are integers, use primary key first + { + nil, + "int1", + false, + [][]driver.Value{ + {table, 0, "PRIMARY", 1, "int1", "A", 2, nil, nil, "", "BTREE", "", ""}, + {table, 0, "PRIMARY", 2, "float1", "A", 2, nil, nil, "", "BTREE", "", ""}, + {table, 0, "int2", 1, "int2", "A", 2, nil, nil, "YES", "BTREE", "", ""}, + {table, 1, "string1", 1, "string1", "A", 2, nil, nil, "YES", "BTREE", "", ""}, + {table, 1, "int3", 1, "int3", "A", 20, nil, nil, "YES", "BTREE", "", ""}, + }, + }, // primary key doesn't have integer at seq 1, use unique key with integer + { + nil, + "int2", + false, + [][]driver.Value{ + {table, 0, "PRIMARY", 1, "float1", "A", 2, nil, nil, "", "BTREE", "", ""}, + {table, 0, "PRIMARY", 2, "int1", "A", 2, nil, nil, "", "BTREE", "", ""}, + {table, 0, "int2", 1, "int2", "A", 2, nil, nil, "YES", "BTREE", "", ""}, + {table, 1, "string1", 1, "string1", "A", 2, nil, nil, "YES", "BTREE", "", ""}, + {table, 1, "int3", 1, "int3", "A", 20, nil, nil, "YES", "BTREE", "", ""}, + }, + }, // several unique keys, use unique key who has a integer in seq 1 + { + nil, + "int1", + false, + [][]driver.Value{ + {table, 0, "u1", 1, "int1", "A", 2, nil, nil, "YES", "BTREE", "", ""}, + {table, 0, "u1", 2, "string1", "A", 2, nil, nil, "YES", "BTREE", "", ""}, + {table, 0, "u1", 3, "bin1", "A", 2, nil, nil, "YES", "BTREE", "", ""}, + {table, 0, "u2", 1, "float1", "A", 2, nil, nil, "YES", "BTREE", "", ""}, + {table, 0, "u2", 2, "int2", "A", 2, nil, nil, "YES", "BTREE", "", ""}, + }, + }, // several unique keys and ordinary keys, use unique key who has a integer in seq 1 + { + nil, + "int1", + false, + [][]driver.Value{ + {table, 0, "u1", 1, "float1", "A", 2, nil, nil, "YES", "BTREE", "", ""}, + {table, 0, "u1", 2, "int2", "A", 2, nil, nil, "YES", "BTREE", "", ""}, + {table, 0, "u2", 1, "int1", "A", 2, nil, nil, "YES", "BTREE", "", ""}, + {table, 0, "u2", 2, "string1", "A", 2, nil, nil, "YES", "BTREE", "", ""}, + {table, 0, "u2", 3, "bin1", "A", 2, nil, nil, "YES", "BTREE", "", ""}, + {table, 1, "int3", 1, "int3", "A", 2, nil, nil, "YES", "BTREE", "", ""}, + }, + }, // several unique keys and ordinary keys, use unique key who has less columns + { + nil, + "int2", + false, + [][]driver.Value{ + {table, 0, "u1", 1, "int1", "A", 2, nil, nil, "YES", "BTREE", "", ""}, + {table, 0, "u1", 2, "string1", "A", 2, nil, nil, "YES", "BTREE", "", ""}, + {table, 0, "u1", 3, "bin1", "A", 2, nil, nil, "YES", "BTREE", "", ""}, + {table, 0, "u2", 1, "int2", "A", 2, nil, nil, "YES", "BTREE", "", ""}, + {table, 0, "u2", 2, "string1", "A", 2, nil, nil, "YES", "BTREE", "", ""}, + {table, 1, "int3", 1, "int3", "A", 20, nil, nil, "YES", "BTREE", "", ""}, + }, + }, // several unique keys and ordinary keys, use key who has max cardinality + { + nil, + "int2", + false, + [][]driver.Value{ + {table, 0, "PRIMARY", 1, "string1", "A", 2, nil, nil, "", "BTREE", "", ""}, + {table, 0, "u1", 1, "float1", "A", 2, nil, nil, "YES", "BTREE", "", ""}, + {table, 0, "u1", 2, "int3", "A", 2, nil, nil, "YES", "BTREE", "", ""}, + {table, 1, "i1", 1, "int1", "A", 2, nil, nil, "YES", "BTREE", "", ""}, + {table, 1, "i2", 1, "int2", "A", 5, nil, nil, "YES", "BTREE", "", ""}, + {table, 1, "i2", 2, "bool1", "A", 2, nil, nil, "YES", "BTREE", "", ""}, + {table, 1, "i3", 1, "bin1", "A", 10, nil, nil, "YES", "BTREE", "", ""}, + {table, 1, "i3", 2, "int4", "A", 10, nil, nil, "YES", "BTREE", "", ""}, + }, + }, + } + + query := fmt.Sprintf("SHOW INDEX FROM `%s`.`%s`", database, table) + for i, testCase := range testCases { + t.Logf("case #%d", i) + + meta.hasImplicitRowID = testCase.hasImplicitRowID + expectedErr := testCase.expectedErr + if expectedErr != nil { + mock.ExpectQuery(query).WillReturnError(expectedErr) + } else if !testCase.hasImplicitRowID { + rows := sqlmock.NewRows(showIndexHeaders) + for _, showIndexResult := range testCase.showIndexResults { + rows.AddRow(showIndexResult...) + } + mock.ExpectQuery(query).WillReturnRows(rows) + } + + field, err := pickupPossibleField(meta, conn) + if expectedErr != nil { + require.ErrorIs(t, err, expectedErr) + } else { + require.NoError(t, err) + require.Equal(t, testCase.expectedField, field) + } + require.NoError(t, mock.ExpectationsWereMet()) + } +} + +func TestCheckIfSeqExists(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + + conn, err := db.Conn(context.Background()) + require.NoError(t, err) + + mock.ExpectQuery("SELECT COUNT"). + WillReturnRows(sqlmock.NewRows([]string{"c"}). + AddRow("1")) + + exists, err := CheckIfSeqExists(conn) + require.NoError(t, err) + require.Equal(t, true, exists) + + mock.ExpectQuery("SELECT COUNT"). + WillReturnRows(sqlmock.NewRows([]string{"c"}). + AddRow("0")) + + exists, err = CheckIfSeqExists(conn) + require.NoError(t, err) + require.Equal(t, false, exists) +} + +func TestGetCharsetAndDefaultCollation(t *testing.T) { + db, mock, err := sqlmock.New() + require.NoError(t, err) + defer func() { + require.NoError(t, db.Close()) + }() + ctx := context.Background() + conn, err := db.Conn(ctx) + require.NoError(t, err) + + mock.ExpectQuery("SHOW CHARACTER SET"). + WillReturnRows(sqlmock.NewRows([]string{"Charset", "Description", "Default collation", "Maxlen"}). + AddRow("utf8mb4", "UTF-8 Unicode", "utf8mb4_0900_ai_ci", 4). + AddRow("latin1", "cp1252 West European", "latin1_swedish_ci", 1)) + + charsetAndDefaultCollation, err := GetCharsetAndDefaultCollation(ctx, conn) + require.NoError(t, err) + require.Equal(t, "utf8mb4_0900_ai_ci", charsetAndDefaultCollation["utf8mb4"]) + require.Equal(t, "latin1_swedish_ci", charsetAndDefaultCollation["latin1"]) +} + +func makeVersion(major, minor, patch int64, preRelease string) *semver.Version { + return &semver.Version{ + Major: major, + Minor: minor, + Patch: patch, + PreRelease: semver.PreRelease(preRelease), + Metadata: "", + } +} diff --git a/dumpling/export/sql_type.go b/dumpling/export/sql_type.go new file mode 100644 index 0000000000000..511fd43870750 --- /dev/null +++ b/dumpling/export/sql_type.go @@ -0,0 +1,315 @@ +// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +package export + +import ( + "bytes" + "database/sql" + "fmt" +) + +var colTypeRowReceiverMap = map[string]func() RowReceiverStringer{} + +var ( + nullValue = "NULL" + quotationMark = []byte{'\''} + twoQuotationMarks = []byte{'\'', '\''} + doubleQuotationMark = []byte{'"'} +) + +// There are two kinds of scenes to use this dataType +// The first is to be the receiver of table sample, which will use tidb's INFORMATION_SCHEMA.COLUMNS's DATA_TYPE column, which is from +// https://github.com/pingcap/tidb/blob/619c4720059ea619081b01644ef3084b426d282f/executor/infoschema_reader.go#L654 +// https://github.com/pingcap/parser/blob/8e8ed7927bde11c4cf0967afc5e05ab5aeb14cc7/types/etc.go#L44-70 +// The second is to be the receiver of select row type, which will use sql.DB's rows.DatabaseTypeName(), which is from +// https://github.com/go-sql-driver/mysql/blob/v1.5.0/fields.go#L17-97 +func initColTypeRowReceiverMap() { + dataTypeStringArr := []string{ + "CHAR", "NCHAR", "VARCHAR", "NVARCHAR", "CHARACTER", "VARCHARACTER", + "TIMESTAMP", "DATETIME", "DATE", "TIME", "YEAR", "SQL_TSI_YEAR", + "TEXT", "TINYTEXT", "MEDIUMTEXT", "LONGTEXT", + "ENUM", "SET", "JSON", "NULL", "VAR_STRING", + } + + dataTypeIntArr := []string{ + "INTEGER", "BIGINT", "TINYINT", "SMALLINT", "MEDIUMINT", + "INT", "INT1", "INT2", "INT3", "INT8", + } + + dataTypeNumArr := append(dataTypeIntArr, []string{ + "FLOAT", "REAL", "DOUBLE", "DOUBLE PRECISION", + "DECIMAL", "NUMERIC", "FIXED", + "BOOL", "BOOLEAN", + }...) + + dataTypeBinArr := []string{ + "BLOB", "TINYBLOB", "MEDIUMBLOB", "LONGBLOB", "LONG", + "BINARY", "VARBINARY", + "BIT", "GEOMETRY", + } + + for _, s := range dataTypeStringArr { + dataTypeString[s] = struct{}{} + colTypeRowReceiverMap[s] = SQLTypeStringMaker + } + for _, s := range dataTypeIntArr { + dataTypeInt[s] = struct{}{} + } + for _, s := range dataTypeNumArr { + colTypeRowReceiverMap[s] = SQLTypeNumberMaker + } + for _, s := range dataTypeBinArr { + dataTypeBin[s] = struct{}{} + colTypeRowReceiverMap[s] = SQLTypeBytesMaker + } +} + +var dataTypeString, dataTypeInt, dataTypeBin = make(map[string]struct{}), make(map[string]struct{}), make(map[string]struct{}) + +func escapeBackslashSQL(s []byte, bf *bytes.Buffer) { + var ( + escape byte + last = 0 + ) + // reference: https://gist.github.com/siddontang/8875771 + for i := 0; i < len(s); i++ { + escape = 0 + + switch s[i] { + case 0: /* Must be escaped for 'mysql' */ + escape = '0' + case '\n': /* Must be escaped for logs */ + escape = 'n' + case '\r': + escape = 'r' + case '\\': + escape = '\\' + case '\'': + escape = '\'' + case '"': /* Better safe than sorry */ + escape = '"' + case '\032': /* This gives problems on Win32 */ + escape = 'Z' + } + + if escape != 0 { + bf.Write(s[last:i]) + bf.WriteByte('\\') + bf.WriteByte(escape) + last = i + 1 + } + } + bf.Write(s[last:]) +} + +func escapeBackslashCSV(s []byte, bf *bytes.Buffer, opt *csvOption) { + var ( + escape byte + last = 0 + specCmt byte = 0 + ) + if len(opt.delimiter) > 0 { + specCmt = opt.delimiter[0] // if csv has a delimiter, we should use backslash to comment the delimiter in field value + } else if len(opt.separator) > 0 { + specCmt = opt.separator[0] // if csv's delimiter is "", we should escape the separator to avoid error + } + + for i := 0; i < len(s); i++ { + escape = 0 + + switch s[i] { + case 0: /* Must be escaped for 'mysql' */ + escape = '0' + case '\r': + escape = 'r' + case '\n': /* escaped for line terminators */ + escape = 'n' + case '\\': + escape = '\\' + case specCmt: + escape = specCmt + } + + if escape != 0 { + bf.Write(s[last:i]) + bf.WriteByte('\\') + bf.WriteByte(escape) + last = i + 1 + } + } + bf.Write(s[last:]) +} + +func escapeSQL(s []byte, bf *bytes.Buffer, escapeBackslash bool) { // revive:disable-line:flag-parameter + if escapeBackslash { + escapeBackslashSQL(s, bf) + } else { + bf.Write(bytes.ReplaceAll(s, quotationMark, twoQuotationMarks)) + } +} + +func escapeCSV(s []byte, bf *bytes.Buffer, escapeBackslash bool, opt *csvOption) { // revive:disable-line:flag-parameter + switch { + case escapeBackslash: + escapeBackslashCSV(s, bf, opt) + case len(opt.delimiter) > 0: + bf.Write(bytes.ReplaceAll(s, opt.delimiter, append(opt.delimiter, opt.delimiter...))) + default: + bf.Write(s) + } +} + +// SQLTypeStringMaker returns a SQLTypeString +func SQLTypeStringMaker() RowReceiverStringer { + return &SQLTypeString{} +} + +// SQLTypeBytesMaker returns a SQLTypeBytes +func SQLTypeBytesMaker() RowReceiverStringer { + return &SQLTypeBytes{} +} + +// SQLTypeNumberMaker returns a SQLTypeNumber +func SQLTypeNumberMaker() RowReceiverStringer { + return &SQLTypeNumber{} +} + +// MakeRowReceiver constructs RowReceiverArr from column types +func MakeRowReceiver(colTypes []string) RowReceiverArr { + rowReceiverArr := make([]RowReceiverStringer, len(colTypes)) + for i, colTp := range colTypes { + recMaker, ok := colTypeRowReceiverMap[colTp] + if !ok { + recMaker = SQLTypeStringMaker + } + rowReceiverArr[i] = recMaker() + } + return RowReceiverArr{ + bound: false, + receivers: rowReceiverArr, + } +} + +// RowReceiverArr is the combined RowReceiver array +type RowReceiverArr struct { + bound bool + receivers []RowReceiverStringer +} + +// BindAddress implements RowReceiver.BindAddress +func (r RowReceiverArr) BindAddress(args []interface{}) { + if r.bound { + return + } + r.bound = true + for i := range args { + r.receivers[i].BindAddress(args[i : i+1]) + } +} + +// WriteToBuffer implements Stringer.WriteToBuffer +func (r RowReceiverArr) WriteToBuffer(bf *bytes.Buffer, escapeBackslash bool) { + bf.WriteByte('(') + for i, receiver := range r.receivers { + receiver.WriteToBuffer(bf, escapeBackslash) + if i != len(r.receivers)-1 { + bf.WriteByte(',') + } + } + bf.WriteByte(')') +} + +// WriteToBufferInCsv implements Stringer.WriteToBufferInCsv +func (r RowReceiverArr) WriteToBufferInCsv(bf *bytes.Buffer, escapeBackslash bool, opt *csvOption) { + for i, receiver := range r.receivers { + receiver.WriteToBufferInCsv(bf, escapeBackslash, opt) + if i != len(r.receivers)-1 { + bf.Write(opt.separator) + } + } +} + +// SQLTypeNumber implements RowReceiverStringer which represents numeric type columns in database +type SQLTypeNumber struct { + SQLTypeString +} + +// WriteToBuffer implements Stringer.WriteToBuffer +func (s SQLTypeNumber) WriteToBuffer(bf *bytes.Buffer, _ bool) { + if s.RawBytes != nil { + bf.Write(s.RawBytes) + } else { + bf.WriteString(nullValue) + } +} + +// WriteToBufferInCsv implements Stringer.WriteToBufferInCsv +func (s SQLTypeNumber) WriteToBufferInCsv(bf *bytes.Buffer, _ bool, opt *csvOption) { + if s.RawBytes != nil { + bf.Write(s.RawBytes) + } else { + bf.WriteString(opt.nullValue) + } +} + +// SQLTypeString implements RowReceiverStringer which represents string type columns in database +type SQLTypeString struct { + sql.RawBytes +} + +// BindAddress implements RowReceiver.BindAddress +func (s *SQLTypeString) BindAddress(arg []interface{}) { + arg[0] = &s.RawBytes +} + +// WriteToBuffer implements Stringer.WriteToBuffer +func (s *SQLTypeString) WriteToBuffer(bf *bytes.Buffer, escapeBackslash bool) { + if s.RawBytes != nil { + bf.Write(quotationMark) + escapeSQL(s.RawBytes, bf, escapeBackslash) + bf.Write(quotationMark) + } else { + bf.WriteString(nullValue) + } +} + +// WriteToBufferInCsv implements Stringer.WriteToBufferInCsv +func (s *SQLTypeString) WriteToBufferInCsv(bf *bytes.Buffer, escapeBackslash bool, opt *csvOption) { + if s.RawBytes != nil { + bf.Write(opt.delimiter) + escapeCSV(s.RawBytes, bf, escapeBackslash, opt) + bf.Write(opt.delimiter) + } else { + bf.WriteString(opt.nullValue) + } +} + +// SQLTypeBytes implements RowReceiverStringer which represents bytes type columns in database +type SQLTypeBytes struct { + sql.RawBytes +} + +// BindAddress implements RowReceiver.BindAddress +func (s *SQLTypeBytes) BindAddress(arg []interface{}) { + arg[0] = &s.RawBytes +} + +// WriteToBuffer implements Stringer.WriteToBuffer +func (s *SQLTypeBytes) WriteToBuffer(bf *bytes.Buffer, _ bool) { + if s.RawBytes != nil { + fmt.Fprintf(bf, "x'%x'", s.RawBytes) + } else { + bf.WriteString(nullValue) + } +} + +// WriteToBufferInCsv implements Stringer.WriteToBufferInCsv +func (s *SQLTypeBytes) WriteToBufferInCsv(bf *bytes.Buffer, escapeBackslash bool, opt *csvOption) { + if s.RawBytes != nil { + bf.Write(opt.delimiter) + escapeCSV(s.RawBytes, bf, escapeBackslash, opt) + bf.Write(opt.delimiter) + } else { + bf.WriteString(opt.nullValue) + } +} diff --git a/dumpling/export/sql_type_test.go b/dumpling/export/sql_type_test.go new file mode 100644 index 0000000000000..1ed75a3247472 --- /dev/null +++ b/dumpling/export/sql_type_test.go @@ -0,0 +1,55 @@ +// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +package export + +import ( + "bytes" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestEscape(t *testing.T) { + var bf bytes.Buffer + str := []byte(`MWQeWw""'\rNmtGxzGp`) + expectStrBackslash := `MWQeWw\"\"\'\\rNmtGxzGp` + expectStrWithoutBackslash := `MWQeWw""''\rNmtGxzGp` + expectStrBackslashDoubleQuote := `MWQeWw\"\"'\\rNmtGxzGp` + expectStrWithoutBackslashDoubleQuote := `MWQeWw""""'\rNmtGxzGp` + escapeSQL(str, &bf, true) + require.Equal(t, expectStrBackslash, bf.String()) + + bf.Reset() + escapeSQL(str, &bf, false) + require.Equal(t, expectStrWithoutBackslash, bf.String()) + + bf.Reset() + opt := &csvOption{ + delimiter: []byte(`"`), + separator: []byte(`,`), + } + escapeCSV(str, &bf, true, opt) + require.Equal(t, expectStrBackslashDoubleQuote, bf.String()) + + bf.Reset() + escapeCSV(str, &bf, false, opt) + require.Equal(t, expectStrWithoutBackslashDoubleQuote, bf.String()) + + bf.Reset() + str = []byte(`a|*|b"cd`) + expectedStrWithDelimiter := `a|*|b""cd` + expectedStrBackslashWithoutDelimiter := `a\|*\|b"cd` + expectedStrWithoutDelimiter := `a|*|b"cd` + escapeCSV(str, &bf, false, opt) + require.Equal(t, expectedStrWithDelimiter, bf.String()) + + bf.Reset() + opt.delimiter = []byte("") + opt.separator = []byte(`|*|`) + escapeCSV(str, &bf, true, opt) + require.Equal(t, expectedStrBackslashWithoutDelimiter, bf.String()) + + bf.Reset() + escapeCSV(str, &bf, false, opt) + require.Equal(t, expectedStrWithoutDelimiter, bf.String()) +} diff --git a/dumpling/export/status.go b/dumpling/export/status.go new file mode 100644 index 0000000000000..359eae8ed7b1e --- /dev/null +++ b/dumpling/export/status.go @@ -0,0 +1,74 @@ +// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +package export + +import ( + "fmt" + "sync/atomic" + "time" + + "github.com/docker/go-units" + "go.uber.org/zap" + + tcontext "github.com/pingcap/tidb/dumpling/context" +) + +const logProgressTick = 2 * time.Minute + +func (d *Dumper) runLogProgress(tctx *tcontext.Context) { + logProgressTicker := time.NewTicker(logProgressTick) + lastCheckpoint := time.Now() + lastBytes := float64(0) + defer logProgressTicker.Stop() + for { + select { + case <-tctx.Done(): + tctx.L().Debug("stopping log progress") + return + case <-logProgressTicker.C: + nanoseconds := float64(time.Since(lastCheckpoint).Nanoseconds()) + midd := d.GetParameters() + tctx.L().Info("progress", + zap.String("tables", fmt.Sprintf("%.0f/%.0f (%.1f%%)", midd.CompletedTables, float64(d.totalTables), midd.CompletedTables/float64(d.totalTables)*100)), + zap.String("finished rows", fmt.Sprintf("%.0f", midd.FinishedRows)), + zap.String("estimate total rows", fmt.Sprintf("%.0f", midd.EstimateTotalRows)), + zap.String("finished size", units.HumanSize(midd.FinishedBytes)), + zap.Float64("average speed(MiB/s)", (midd.FinishedBytes-lastBytes)/(1048576e-9*nanoseconds)), + ) + + lastCheckpoint = time.Now() + lastBytes = midd.FinishedBytes + } + } +} + +type Midparams struct { + CompletedTables float64 + FinishedBytes float64 + FinishedRows float64 + EstimateTotalRows float64 + TotalTables int64 +} + +func (d *Dumper) GetParameters() (midparams *Midparams) { + conf := d.conf + mid := &Midparams{} + mid.TotalTables = atomic.LoadInt64(&d.totalTables) + mid.CompletedTables = ReadCounter(finishedTablesCounter, conf.Labels) + mid.FinishedBytes = ReadGauge(finishedSizeGauge, conf.Labels) + mid.FinishedRows = ReadGauge(finishedRowsGauge, conf.Labels) + mid.EstimateTotalRows = ReadCounter(estimateTotalRowsCounter, conf.Labels) + return mid +} + +func calculateTableCount(m DatabaseTables) int { + cnt := 0 + for _, tables := range m { + for _, table := range tables { + if table.Type == TableTypeBase { + cnt++ + } + } + } + return cnt +} diff --git a/dumpling/export/status_test.go b/dumpling/export/status_test.go new file mode 100644 index 0000000000000..a002ac3365ffe --- /dev/null +++ b/dumpling/export/status_test.go @@ -0,0 +1,32 @@ +// Copyright 2021 PingCAP, Inc. Licensed under Apache-2.0. + +package export + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestGetParameters(t *testing.T) { + conf := defaultConfigForTest(t) + d := &Dumper{conf: conf} + InitMetricsVector(conf.Labels) + + mid := d.GetParameters() + require.EqualValues(t, float64(0), mid.CompletedTables) + require.EqualValues(t, float64(0), mid.FinishedBytes) + require.EqualValues(t, float64(0), mid.FinishedRows) + require.EqualValues(t, float64(0), mid.EstimateTotalRows) + + AddCounter(finishedTablesCounter, conf.Labels, 10) + AddGauge(finishedSizeGauge, conf.Labels, 20) + AddGauge(finishedRowsGauge, conf.Labels, 30) + AddCounter(estimateTotalRowsCounter, conf.Labels, 40) + + mid = d.GetParameters() + require.EqualValues(t, float64(10), mid.CompletedTables) + require.EqualValues(t, float64(20), mid.FinishedBytes) + require.EqualValues(t, float64(30), mid.FinishedRows) + require.EqualValues(t, float64(40), mid.EstimateTotalRows) +} diff --git a/dumpling/export/task.go b/dumpling/export/task.go new file mode 100644 index 0000000000000..a9e5874fa350b --- /dev/null +++ b/dumpling/export/task.go @@ -0,0 +1,123 @@ +// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +package export + +import "fmt" + +// Task is a file dump task for dumpling, it could either be dumping database/table/view/policy metadata, table data +type Task interface { + // Brief is the brief for a dumping task + Brief() string +} + +// TaskDatabaseMeta is a dumping database metadata task +type TaskDatabaseMeta struct { + Task + DatabaseName string + CreateDatabaseSQL string +} + +// TaskTableMeta is a dumping table metadata task +type TaskTableMeta struct { + Task + DatabaseName string + TableName string + CreateTableSQL string +} + +// TaskViewMeta is a dumping view metadata task +type TaskViewMeta struct { + Task + DatabaseName string + ViewName string + CreateTableSQL string + CreateViewSQL string +} + +// TaskPolicyMeta is a dumping view metadata task +type TaskPolicyMeta struct { + Task + PolicyName string + CreatePolicySQL string +} + +// TaskTableData is a dumping table data task +type TaskTableData struct { + Task + Meta TableMeta + Data TableDataIR + ChunkIndex int + TotalChunks int +} + +// NewTaskDatabaseMeta returns a new dumping database metadata task +func NewTaskDatabaseMeta(dbName, createSQL string) *TaskDatabaseMeta { + return &TaskDatabaseMeta{ + DatabaseName: dbName, + CreateDatabaseSQL: createSQL, + } +} + +// NewTaskTableMeta returns a new dumping table metadata task +func NewTaskTableMeta(dbName, tblName, createSQL string) *TaskTableMeta { + return &TaskTableMeta{ + DatabaseName: dbName, + TableName: tblName, + CreateTableSQL: createSQL, + } +} + +// NewTaskViewMeta returns a new dumping view metadata task +func NewTaskViewMeta(dbName, tblName, createTableSQL, createViewSQL string) *TaskViewMeta { + return &TaskViewMeta{ + DatabaseName: dbName, + ViewName: tblName, + CreateTableSQL: createTableSQL, + CreateViewSQL: createViewSQL, + } +} + +// NewTaskPolicyMeta returns a new dumping placement policy metadata task +func NewTaskPolicyMeta(policyName, createPolicySQL string) *TaskPolicyMeta { + return &TaskPolicyMeta{ + PolicyName: policyName, + CreatePolicySQL: createPolicySQL, + } +} + +// NewTaskTableData returns a new dumping table data task +func NewTaskTableData(meta TableMeta, data TableDataIR, currentChunk, totalChunks int) *TaskTableData { + return &TaskTableData{ + Meta: meta, + Data: data, + ChunkIndex: currentChunk, + TotalChunks: totalChunks, + } +} + +// Brief implements task.Brief +func (t *TaskDatabaseMeta) Brief() string { + return fmt.Sprintf("meta of dababase '%s'", t.DatabaseName) +} + +// Brief implements task.Brief +func (t *TaskTableMeta) Brief() string { + return fmt.Sprintf("meta of table '%s'.'%s'", t.DatabaseName, t.TableName) +} + +// Brief implements task.Brief +func (t *TaskViewMeta) Brief() string { + return fmt.Sprintf("meta of view '%s'.'%s'", t.DatabaseName, t.ViewName) +} + +// Brief implements task.Brief +func (t *TaskPolicyMeta) Brief() string { + return fmt.Sprintf("meta of placement policy '%s'", t.PolicyName) +} + +// Brief implements task.Brief +func (t *TaskTableData) Brief() string { + db, tbl := t.Meta.DatabaseName(), t.Meta.TableName() + idx, total := t.ChunkIndex, t.TotalChunks + return fmt.Sprintf("data of table '%s'.'%s'(%d/%d)", db, tbl, idx, total) +} diff --git a/dumpling/export/test_util.go b/dumpling/export/test_util.go new file mode 100644 index 0000000000000..67d7f62f9fcfb --- /dev/null +++ b/dumpling/export/test_util.go @@ -0,0 +1,181 @@ +// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +package export + +import ( + "context" + "database/sql" + "database/sql/driver" + "fmt" + + "github.com/DATA-DOG/go-sqlmock" + + tcontext "github.com/pingcap/tidb/dumpling/context" +) + +type mockPoisonWriter struct { + buf string +} + +func (m *mockPoisonWriter) Write(_ context.Context, p []byte) (int, error) { + s := string(p) + if s == "poison" { + return 0, fmt.Errorf("poison_error") + } + m.buf = s + return len(s), nil +} + +func (m *mockPoisonWriter) Close(_ context.Context) error { + // noop + return nil +} + +type mockMetaIR struct { + tarName string + meta string + specCmt []string +} + +func (m *mockMetaIR) SpecialComments() StringIter { + return newStringIter(m.specCmt...) +} + +func (m *mockMetaIR) TargetName() string { + return m.tarName +} + +func (m *mockMetaIR) MetaSQL() string { + return m.meta +} + +func newMockMetaIR(targetName string, meta string, specialComments []string) MetaIR { + return &mockMetaIR{ + tarName: targetName, + meta: meta, + specCmt: specialComments, + } +} + +type mockTableIR struct { + dbName string + tblName string + chunIndex int + data [][]driver.Value + selectedField string + selectedLen int + specCmt []string + colTypes []string + colNames []string + escapeBackSlash bool + hasImplicitRowID bool + rowErr error + rows *sql.Rows + SQLRowIter +} + +func (m *mockTableIR) RawRows() *sql.Rows { + return m.rows +} + +func (m *mockTableIR) ShowCreateTable() string { + return "" +} + +func (m *mockTableIR) ShowCreateView() string { + return "" +} + +func (m *mockTableIR) AvgRowLength() uint64 { + return 0 +} + +func (m *mockTableIR) HasImplicitRowID() bool { + return m.hasImplicitRowID +} + +func (m *mockTableIR) Start(_ *tcontext.Context, conn *sql.Conn) error { + return nil +} + +func (m *mockTableIR) DatabaseName() string { + return m.dbName +} + +func (m *mockTableIR) TableName() string { + return m.tblName +} + +func (m *mockTableIR) ChunkIndex() int { + return m.chunIndex +} + +func (m *mockTableIR) ColumnCount() uint { + return uint(len(m.colTypes)) +} + +func (m *mockTableIR) ColumnTypes() []string { + return m.colTypes +} + +func (m *mockTableIR) ColumnNames() []string { + return m.colNames +} + +func (m *mockTableIR) SelectedField() string { + return m.selectedField +} + +func (m *mockTableIR) SelectedLen() int { + return m.selectedLen +} + +func (m *mockTableIR) SpecialComments() StringIter { + return newStringIter(m.specCmt...) +} + +func (m *mockTableIR) Rows() SQLRowIter { + if m.SQLRowIter == nil { + mockRows := sqlmock.NewRows(m.colTypes) + for _, datum := range m.data { + mockRows.AddRow(datum...) + } + db, mock, err := sqlmock.New() + if err != nil { + panic(fmt.Sprintf("sqlmock.New return error: %v", err)) + } + defer db.Close() + mock.ExpectQuery("select 1").WillReturnRows(mockRows) + if m.rowErr != nil { + mockRows.RowError(len(m.data)-1, m.rowErr) + } + rows, err := db.Query("select 1") + if err != nil { + panic(fmt.Sprintf("sqlmock.New return error: %v", err)) + } + m.SQLRowIter = newRowIter(rows, len(m.colTypes)) + m.rows = rows + } + return m.SQLRowIter +} + +func (m *mockTableIR) Close() error { + return nil +} + +func (m *mockTableIR) EscapeBackSlash() bool { + return m.escapeBackSlash +} + +func newMockTableIR(databaseName, tableName string, data [][]driver.Value, specialComments, colTypes []string) *mockTableIR { + return &mockTableIR{ + dbName: databaseName, + tblName: tableName, + data: data, + specCmt: specialComments, + selectedField: "*", + selectedLen: len(colTypes), + colTypes: colTypes, + SQLRowIter: nil, + } +} diff --git a/dumpling/export/util.go b/dumpling/export/util.go new file mode 100644 index 0000000000000..2b4875679df97 --- /dev/null +++ b/dumpling/export/util.go @@ -0,0 +1,81 @@ +// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +package export + +import ( + "context" + "database/sql" + "sort" + "strings" + "time" + + "github.com/pingcap/errors" + "go.etcd.io/etcd/clientv3" + + "github.com/pingcap/tidb/br/pkg/version" + tcontext "github.com/pingcap/tidb/dumpling/context" +) + +const tidbServerInformationPath = "/tidb/server/info" + +func getPdDDLIDs(pCtx context.Context, cli *clientv3.Client) ([]string, error) { + ctx, cancel := context.WithTimeout(pCtx, 10*time.Second) + defer cancel() + + resp, err := cli.Get(ctx, tidbServerInformationPath, clientv3.WithPrefix()) + if err != nil { + return nil, errors.Trace(err) + } + pdDDLIds := make([]string, len(resp.Kvs)) + for i, kv := range resp.Kvs { + items := strings.Split(string(kv.Key), "/") + pdDDLIds[i] = items[len(items)-1] + } + return pdDDLIds, nil +} + +func checkSameCluster(tctx *tcontext.Context, db *sql.DB, pdAddrs []string) (bool, error) { + cli, err := clientv3.New(clientv3.Config{ + Endpoints: pdAddrs, + DialTimeout: defaultEtcdDialTimeOut, + }) + if err != nil { + return false, errors.Trace(err) + } + tidbDDLIDs, err := GetTiDBDDLIDs(tctx, db) + if err != nil { + return false, err + } + pdDDLIDs, err := getPdDDLIDs(tctx, cli) + if err != nil { + return false, err + } + sort.Strings(tidbDDLIDs) + sort.Strings(pdDDLIDs) + + return sameStringArray(tidbDDLIDs, pdDDLIDs), nil +} + +func sameStringArray(a, b []string) bool { + if len(a) != len(b) { + return false + } + for i := range a { + if a[i] != b[i] { + return false + } + } + return true +} + +func string2Map(a, b []string) map[string]string { + a2b := make(map[string]string, len(a)) + for i, str := range a { + a2b[str] = b[i] + } + return a2b +} + +func needRepeatableRead(serverType version.ServerType, consistency string) bool { + return consistency != consistencyTypeSnapshot || serverType != version.ServerTypeTiDB +} diff --git a/dumpling/export/util_test.go b/dumpling/export/util_test.go new file mode 100644 index 0000000000000..c1da95155898e --- /dev/null +++ b/dumpling/export/util_test.go @@ -0,0 +1,31 @@ +// Copyright 2021 PingCAP, Inc. Licensed under Apache-2.0. + +package export + +import ( + "fmt" + "testing" + + "github.com/pingcap/tidb/br/pkg/version" + "github.com/stretchr/testify/require" +) + +func TestRepeatableRead(t *testing.T) { + data := [][]interface{}{ + {version.ServerTypeUnknown, consistencyTypeNone, true}, + {version.ServerTypeMySQL, consistencyTypeFlush, true}, + {version.ServerTypeMariaDB, consistencyTypeLock, true}, + {version.ServerTypeTiDB, consistencyTypeNone, true}, + {version.ServerTypeTiDB, consistencyTypeSnapshot, false}, + {version.ServerTypeTiDB, consistencyTypeLock, true}, + } + dec := func(d []interface{}) (version.ServerType, string, bool) { + return version.ServerType(d[0].(int)), d[1].(string), d[2].(bool) + } + for tag, datum := range data { + serverTp, consistency, expectRepeatableRead := dec(datum) + comment := fmt.Sprintf("test case number: %d", tag) + rr := needRepeatableRead(serverTp, consistency) + require.True(t, rr == expectRepeatableRead, comment) + } +} diff --git a/dumpling/export/writer.go b/dumpling/export/writer.go new file mode 100644 index 0000000000000..7520ff670462f --- /dev/null +++ b/dumpling/export/writer.go @@ -0,0 +1,316 @@ +// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +package export + +import ( + "bytes" + "database/sql" + "fmt" + "strings" + "text/template" + + "github.com/pingcap/errors" + "go.uber.org/zap" + + "github.com/pingcap/tidb/br/pkg/storage" + "github.com/pingcap/tidb/br/pkg/utils" + tcontext "github.com/pingcap/tidb/dumpling/context" +) + +// Writer is the abstraction that keep pulling data from database and write to files. +// Every writer owns a snapshot connection, and will try to get a task from task stream chan and work on it. +type Writer struct { + id int64 + tctx *tcontext.Context + conf *Config + conn *sql.Conn + extStorage storage.ExternalStorage + fileFmt FileFormat + + receivedTaskCount int + + rebuildConnFn func(*sql.Conn) (*sql.Conn, error) + finishTaskCallBack func(Task) + finishTableCallBack func(Task) +} + +// NewWriter returns a new Writer with given configurations +func NewWriter(tctx *tcontext.Context, id int64, config *Config, conn *sql.Conn, externalStore storage.ExternalStorage) *Writer { + sw := &Writer{ + id: id, + tctx: tctx, + conf: config, + conn: conn, + extStorage: externalStore, + finishTaskCallBack: func(Task) {}, + finishTableCallBack: func(Task) {}, + } + switch strings.ToLower(config.FileType) { + case FileFormatSQLTextString: + sw.fileFmt = FileFormatSQLText + case FileFormatCSVString: + sw.fileFmt = FileFormatCSV + } + return sw +} + +func (w *Writer) setFinishTaskCallBack(fn func(Task)) { + w.finishTaskCallBack = fn +} + +func (w *Writer) setFinishTableCallBack(fn func(Task)) { + w.finishTableCallBack = fn +} + +func countTotalTask(writers []*Writer) int { + sum := 0 + for _, w := range writers { + sum += w.receivedTaskCount + } + return sum +} + +func (w *Writer) run(taskStream <-chan Task) error { + for { + select { + case <-w.tctx.Done(): + w.tctx.L().Info("context has been done, the writer will exit", + zap.Int64("writer ID", w.id)) + return nil + case task, ok := <-taskStream: + if !ok { + return nil + } + w.receivedTaskCount++ + err := w.handleTask(task) + if err != nil { + return err + } + w.finishTaskCallBack(task) + } + } +} + +func (w *Writer) handleTask(task Task) error { + switch t := task.(type) { + case *TaskDatabaseMeta: + return w.WriteDatabaseMeta(t.DatabaseName, t.CreateDatabaseSQL) + case *TaskTableMeta: + return w.WriteTableMeta(t.DatabaseName, t.TableName, t.CreateTableSQL) + case *TaskViewMeta: + return w.WriteViewMeta(t.DatabaseName, t.ViewName, t.CreateTableSQL, t.CreateViewSQL) + case *TaskPolicyMeta: + return w.WritePolicyMeta(t.PolicyName, t.CreatePolicySQL) + case *TaskTableData: + err := w.WriteTableData(t.Meta, t.Data, t.ChunkIndex) + if err != nil { + return err + } + if t.ChunkIndex+1 == t.TotalChunks { + w.finishTableCallBack(task) + } + return nil + default: + w.tctx.L().Warn("unsupported writer task type", zap.String("type", fmt.Sprintf("%T", t))) + return nil + } +} + +// WritePolicyMeta writes database meta to a file +func (w *Writer) WritePolicyMeta(policy, createSQL string) error { + tctx, conf := w.tctx, w.conf + fileName, err := (&outputFileNamer{Policy: policy}).render(conf.OutputFileTemplate, outputFileTemplatePolicy) + if err != nil { + return err + } + return writeMetaToFile(tctx, "placement-policy", createSQL, w.extStorage, fileName+".sql", conf.CompressType) +} + +// WriteDatabaseMeta writes database meta to a file +func (w *Writer) WriteDatabaseMeta(db, createSQL string) error { + tctx, conf := w.tctx, w.conf + fileName, err := (&outputFileNamer{DB: db}).render(conf.OutputFileTemplate, outputFileTemplateSchema) + if err != nil { + return err + } + return writeMetaToFile(tctx, db, createSQL, w.extStorage, fileName+".sql", conf.CompressType) +} + +// WriteTableMeta writes table meta to a file +func (w *Writer) WriteTableMeta(db, table, createSQL string) error { + tctx, conf := w.tctx, w.conf + fileName, err := (&outputFileNamer{DB: db, Table: table}).render(conf.OutputFileTemplate, outputFileTemplateTable) + if err != nil { + return err + } + return writeMetaToFile(tctx, db, createSQL, w.extStorage, fileName+".sql", conf.CompressType) +} + +// WriteViewMeta writes view meta to a file +func (w *Writer) WriteViewMeta(db, view, createTableSQL, createViewSQL string) error { + tctx, conf := w.tctx, w.conf + fileNameTable, err := (&outputFileNamer{DB: db, Table: view}).render(conf.OutputFileTemplate, outputFileTemplateTable) + if err != nil { + return err + } + fileNameView, err := (&outputFileNamer{DB: db, Table: view}).render(conf.OutputFileTemplate, outputFileTemplateView) + if err != nil { + return err + } + err = writeMetaToFile(tctx, db, createTableSQL, w.extStorage, fileNameTable+".sql", conf.CompressType) + if err != nil { + return err + } + return writeMetaToFile(tctx, db, createViewSQL, w.extStorage, fileNameView+".sql", conf.CompressType) +} + +// WriteTableData writes table data to a file with retry +func (w *Writer) WriteTableData(meta TableMeta, ir TableDataIR, currentChunk int) error { + tctx, conf, conn := w.tctx, w.conf, w.conn + retryTime := 0 + var lastErr error + return utils.WithRetry(tctx, func() (err error) { + defer func() { + lastErr = err + if err != nil { + IncCounter(errorCount, conf.Labels) + } + }() + retryTime++ + tctx.L().Debug("trying to dump table chunk", zap.Int("retryTime", retryTime), zap.String("db", meta.DatabaseName()), + zap.String("table", meta.TableName()), zap.Int("chunkIndex", currentChunk), zap.NamedError("lastError", lastErr)) + // don't rebuild connection when dump for the first time + if retryTime > 1 { + conn, err = w.rebuildConnFn(conn) + w.conn = conn + if err != nil { + return + } + } + err = ir.Start(tctx, conn) + if err != nil { + return + } + if conf.SQL != "" { + meta, err = setTableMetaFromRows(ir.RawRows()) + if err != nil { + return err + } + } + defer ir.Close() + return w.tryToWriteTableData(tctx, meta, ir, currentChunk) + }, newDumpChunkBackoffer(canRebuildConn(conf.Consistency, conf.TransactionalConsistency))) +} + +func (w *Writer) tryToWriteTableData(tctx *tcontext.Context, meta TableMeta, ir TableDataIR, curChkIdx int) error { + conf, format := w.conf, w.fileFmt + namer := newOutputFileNamer(meta, curChkIdx, conf.Rows != UnspecifiedSize, conf.FileSize != UnspecifiedSize) + fileName, err := namer.NextName(conf.OutputFileTemplate, w.fileFmt.Extension()) + if err != nil { + return err + } + + somethingIsWritten := false + for { + fileWriter, tearDown := buildInterceptFileWriter(tctx, w.extStorage, fileName, conf.CompressType) + n, err := format.WriteInsert(tctx, conf, meta, ir, fileWriter) + tearDown(tctx) + if err != nil { + return err + } + + if w, ok := fileWriter.(*InterceptFileWriter); ok && !w.SomethingIsWritten { + break + } + + tctx.L().Debug("finish dumping table(chunk)", + zap.String("database", meta.DatabaseName()), + zap.String("table", meta.TableName()), + zap.Int("chunkIdx", curChkIdx), + zap.Uint64("total rows", n)) + somethingIsWritten = true + + if conf.FileSize == UnspecifiedSize { + break + } + fileName, err = namer.NextName(conf.OutputFileTemplate, w.fileFmt.Extension()) + if err != nil { + return err + } + } + if !somethingIsWritten { + tctx.L().Info("no data written in table chunk", + zap.String("database", meta.DatabaseName()), + zap.String("table", meta.TableName()), + zap.Int("chunkIdx", curChkIdx)) + } + return nil +} + +func writeMetaToFile(tctx *tcontext.Context, target, metaSQL string, s storage.ExternalStorage, path string, compressType storage.CompressType) error { + fileWriter, tearDown, err := buildFileWriter(tctx, s, path, compressType) + if err != nil { + return errors.Trace(err) + } + defer tearDown(tctx) + + return WriteMeta(tctx, &metaData{ + target: target, + metaSQL: metaSQL, + specCmts: []string{ + "/*!40101 SET NAMES binary*/;", + "/*T![placement] SET PLACEMENT_CHECKS = 0*/;", + }, + }, fileWriter) +} + +type outputFileNamer struct { + ChunkIndex int + FileIndex int + Policy string + DB string + Table string + format string +} + +type csvOption struct { + nullValue string + separator []byte + delimiter []byte +} + +func newOutputFileNamer(meta TableMeta, chunkIdx int, rows, fileSize bool) *outputFileNamer { + o := &outputFileNamer{ + DB: meta.DatabaseName(), + Table: meta.TableName(), + } + o.ChunkIndex = chunkIdx + o.FileIndex = 0 + switch { + case rows && fileSize: + o.format = "%09d%04d" + case fileSize: + o.format = "%09[2]d" + default: + o.format = "%09[1]d" + } + return o +} + +func (namer *outputFileNamer) render(tmpl *template.Template, subName string) (string, error) { + var bf bytes.Buffer + if err := tmpl.ExecuteTemplate(&bf, subName, namer); err != nil { + return "", errors.Trace(err) + } + return bf.String(), nil +} + +func (namer *outputFileNamer) Index() string { + return fmt.Sprintf(namer.format, namer.ChunkIndex, namer.FileIndex) +} + +func (namer *outputFileNamer) NextName(tmpl *template.Template, fileType string) (string, error) { + res, err := namer.render(tmpl, outputFileTemplateData) + namer.FileIndex++ + return res + "." + fileType, err +} diff --git a/dumpling/export/writer_serial_test.go b/dumpling/export/writer_serial_test.go new file mode 100644 index 0000000000000..a606784a1bd6b --- /dev/null +++ b/dumpling/export/writer_serial_test.go @@ -0,0 +1,324 @@ +// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +package export + +import ( + "database/sql/driver" + "fmt" + "strings" + "testing" + + "github.com/pingcap/errors" + "github.com/stretchr/testify/require" + + "github.com/pingcap/tidb/br/pkg/storage" + tcontext "github.com/pingcap/tidb/dumpling/context" +) + +func TestWriteMeta(t *testing.T) { + createTableStmt := "CREATE TABLE `t1` (\n" + + " `a` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\n" + specCmts := []string{"/*!40103 SET TIME_ZONE='+00:00' */;"} + meta := newMockMetaIR("t1", createTableStmt, specCmts) + writer := storage.NewBufferWriter() + + err := WriteMeta(tcontext.Background(), meta, writer) + require.NoError(t, err) + + expected := "/*!40103 SET TIME_ZONE='+00:00' */;\n" + + "CREATE TABLE `t1` (\n" + + " `a` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\n" + require.Equal(t, expected, writer.String()) +} + +func TestWriteInsert(t *testing.T) { + cfg, clean := createMockConfig(t) + defer clean() + + data := [][]driver.Value{ + {"1", "male", "bob@mail.com", "020-1234", nil}, + {"2", "female", "sarah@mail.com", "020-1253", "healthy"}, + {"3", "male", "john@mail.com", "020-1256", "healthy"}, + {"4", "female", "sarah@mail.com", "020-1235", "healthy"}, + } + colTypes := []string{"INT", "SET", "VARCHAR", "VARCHAR", "TEXT"} + specCmts := []string{ + "/*!40101 SET NAMES binary*/;", + "/*!40014 SET FOREIGN_KEY_CHECKS=0*/;", + } + tableIR := newMockTableIR("test", "employee", data, specCmts, colTypes) + bf := storage.NewBufferWriter() + + conf := configForWriteSQL(cfg, UnspecifiedSize, UnspecifiedSize) + n, err := WriteInsert(tcontext.Background(), conf, tableIR, tableIR, bf) + require.NoError(t, err) + require.Equal(t, uint64(4), n) + + expected := "/*!40101 SET NAMES binary*/;\n" + + "/*!40014 SET FOREIGN_KEY_CHECKS=0*/;\n" + + "INSERT INTO `employee` VALUES\n" + + "(1,'male','bob@mail.com','020-1234',NULL),\n" + + "(2,'female','sarah@mail.com','020-1253','healthy'),\n" + + "(3,'male','john@mail.com','020-1256','healthy'),\n" + + "(4,'female','sarah@mail.com','020-1235','healthy');\n" + require.Equal(t, expected, bf.String()) + require.Equal(t, ReadGauge(finishedRowsGauge, conf.Labels), float64(len(data))) + require.Equal(t, ReadGauge(finishedSizeGauge, conf.Labels), float64(len(expected))) +} + +func TestWriteInsertReturnsError(t *testing.T) { + cfg, clean := createMockConfig(t) + defer clean() + + data := [][]driver.Value{ + {"1", "male", "bob@mail.com", "020-1234", nil}, + {"2", "female", "sarah@mail.com", "020-1253", "healthy"}, + {"3", "male", "john@mail.com", "020-1256", "healthy"}, + {"4", "female", "sarah@mail.com", "020-1235", "healthy"}, + } + colTypes := []string{"INT", "SET", "VARCHAR", "VARCHAR", "TEXT"} + specCmts := []string{ + "/*!40101 SET NAMES binary*/;", + "/*!40014 SET FOREIGN_KEY_CHECKS=0*/;", + } + // row errors at last line + rowErr := errors.New("mock row error") + tableIR := newMockTableIR("test", "employee", data, specCmts, colTypes) + tableIR.rowErr = rowErr + bf := storage.NewBufferWriter() + + conf := configForWriteSQL(cfg, UnspecifiedSize, UnspecifiedSize) + n, err := WriteInsert(tcontext.Background(), conf, tableIR, tableIR, bf) + require.ErrorIs(t, err, rowErr) + require.Equal(t, uint64(3), n) + + expected := "/*!40101 SET NAMES binary*/;\n" + + "/*!40014 SET FOREIGN_KEY_CHECKS=0*/;\n" + + "INSERT INTO `employee` VALUES\n" + + "(1,'male','bob@mail.com','020-1234',NULL),\n" + + "(2,'female','sarah@mail.com','020-1253','healthy'),\n" + + "(3,'male','john@mail.com','020-1256','healthy');\n" + require.Equal(t, expected, bf.String()) + // error occurred, should revert pointer to zero + require.Equal(t, ReadGauge(finishedRowsGauge, conf.Labels), float64(0)) + require.Equal(t, ReadGauge(finishedSizeGauge, conf.Labels), float64(0)) +} + +func TestWriteInsertInCsv(t *testing.T) { + cfg, clean := createMockConfig(t) + defer clean() + + data := [][]driver.Value{ + {"1", "male", "bob@mail.com", "020-1234", nil}, + {"2", "female", "sarah@mail.com", "020-1253", "healthy"}, + {"3", "male", "john@mail.com", "020-1256", "healthy"}, + {"4", "female", "sarah@mail.com", "020-1235", "healthy"}, + } + colTypes := []string{"INT", "SET", "VARCHAR", "VARCHAR", "TEXT"} + tableIR := newMockTableIR("test", "employee", data, nil, colTypes) + bf := storage.NewBufferWriter() + + // test nullValue + opt := &csvOption{separator: []byte(","), delimiter: doubleQuotationMark, nullValue: "\\N"} + conf := configForWriteCSV(cfg, true, opt) + n, err := WriteInsertInCsv(tcontext.Background(), conf, tableIR, tableIR, bf) + require.Equal(t, uint64(4), n) + require.NoError(t, err) + + expected := "1,\"male\",\"bob@mail.com\",\"020-1234\",\\N\n" + + "2,\"female\",\"sarah@mail.com\",\"020-1253\",\"healthy\"\n" + + "3,\"male\",\"john@mail.com\",\"020-1256\",\"healthy\"\n" + + "4,\"female\",\"sarah@mail.com\",\"020-1235\",\"healthy\"\n" + require.Equal(t, expected, bf.String()) + require.Equal(t, float64(len(data)), ReadGauge(finishedRowsGauge, conf.Labels)) + require.Equal(t, float64(len(expected)), ReadGauge(finishedSizeGauge, conf.Labels)) + + RemoveLabelValuesWithTaskInMetrics(conf.Labels) + + // test delimiter + bf.Reset() + opt.delimiter = quotationMark + tableIR = newMockTableIR("test", "employee", data, nil, colTypes) + conf = configForWriteCSV(cfg, true, opt) + n, err = WriteInsertInCsv(tcontext.Background(), conf, tableIR, tableIR, bf) + require.Equal(t, uint64(4), n) + require.NoError(t, err) + + expected = "1,'male','bob@mail.com','020-1234',\\N\n" + + "2,'female','sarah@mail.com','020-1253','healthy'\n" + + "3,'male','john@mail.com','020-1256','healthy'\n" + + "4,'female','sarah@mail.com','020-1235','healthy'\n" + require.Equal(t, expected, bf.String()) + require.Equal(t, float64(len(data)), ReadGauge(finishedRowsGauge, conf.Labels)) + require.Equal(t, float64(len(expected)), ReadGauge(finishedSizeGauge, conf.Labels)) + + RemoveLabelValuesWithTaskInMetrics(conf.Labels) + + // test separator + bf.Reset() + opt.separator = []byte(";") + tableIR = newMockTableIR("test", "employee", data, nil, colTypes) + conf = configForWriteCSV(cfg, true, opt) + n, err = WriteInsertInCsv(tcontext.Background(), conf, tableIR, tableIR, bf) + require.Equal(t, uint64(4), n) + require.NoError(t, err) + + expected = "1;'male';'bob@mail.com';'020-1234';\\N\n" + + "2;'female';'sarah@mail.com';'020-1253';'healthy'\n" + + "3;'male';'john@mail.com';'020-1256';'healthy'\n" + + "4;'female';'sarah@mail.com';'020-1235';'healthy'\n" + require.Equal(t, expected, bf.String()) + require.Equal(t, float64(len(data)), ReadGauge(finishedRowsGauge, conf.Labels)) + require.Equal(t, float64(len(expected)), ReadGauge(finishedSizeGauge, conf.Labels)) + + RemoveLabelValuesWithTaskInMetrics(conf.Labels) + + // test delimiter that included in values + bf.Reset() + opt.separator = []byte("&;,?") + opt.delimiter = []byte("ma") + tableIR = newMockTableIR("test", "employee", data, nil, colTypes) + tableIR.colNames = []string{"id", "gender", "email", "phone_number", "status"} + conf = configForWriteCSV(cfg, false, opt) + n, err = WriteInsertInCsv(tcontext.Background(), conf, tableIR, tableIR, bf) + require.Equal(t, uint64(4), n) + require.NoError(t, err) + + expected = "maidma&;,?magenderma&;,?maemamailma&;,?maphone_numberma&;,?mastatusma\n" + + "1&;,?mamamalema&;,?mabob@mamail.comma&;,?ma020-1234ma&;,?\\N\n" + + "2&;,?mafemamalema&;,?masarah@mamail.comma&;,?ma020-1253ma&;,?mahealthyma\n" + + "3&;,?mamamalema&;,?majohn@mamail.comma&;,?ma020-1256ma&;,?mahealthyma\n" + + "4&;,?mafemamalema&;,?masarah@mamail.comma&;,?ma020-1235ma&;,?mahealthyma\n" + require.Equal(t, expected, bf.String()) + require.Equal(t, float64(len(data)), ReadGauge(finishedRowsGauge, conf.Labels)) + require.Equal(t, float64(len(expected)), ReadGauge(finishedSizeGauge, conf.Labels)) + + RemoveLabelValuesWithTaskInMetrics(conf.Labels) +} + +func TestWriteInsertInCsvReturnsError(t *testing.T) { + cfg, clean := createMockConfig(t) + defer clean() + + data := [][]driver.Value{ + {"1", "male", "bob@mail.com", "020-1234", nil}, + {"2", "female", "sarah@mail.com", "020-1253", "healthy"}, + {"3", "male", "john@mail.com", "020-1256", "healthy"}, + {"4", "female", "sarah@mail.com", "020-1235", "healthy"}, + } + colTypes := []string{"INT", "SET", "VARCHAR", "VARCHAR", "TEXT"} + + // row errors at last line + rowErr := errors.New("mock row error") + tableIR := newMockTableIR("test", "employee", data, nil, colTypes) + tableIR.rowErr = rowErr + bf := storage.NewBufferWriter() + + // test nullValue + opt := &csvOption{separator: []byte(","), delimiter: doubleQuotationMark, nullValue: "\\N"} + conf := configForWriteCSV(cfg, true, opt) + n, err := WriteInsertInCsv(tcontext.Background(), conf, tableIR, tableIR, bf) + require.Equal(t, uint64(3), n) + require.ErrorIs(t, err, rowErr) + + expected := "1,\"male\",\"bob@mail.com\",\"020-1234\",\\N\n" + + "2,\"female\",\"sarah@mail.com\",\"020-1253\",\"healthy\"\n" + + "3,\"male\",\"john@mail.com\",\"020-1256\",\"healthy\"\n" + require.Equal(t, expected, bf.String()) + require.Equal(t, float64(0), ReadGauge(finishedRowsGauge, conf.Labels)) + require.Equal(t, float64(0), ReadGauge(finishedSizeGauge, conf.Labels)) + + RemoveLabelValuesWithTaskInMetrics(conf.Labels) +} + +func TestSQLDataTypes(t *testing.T) { + cfg, clean := createMockConfig(t) + defer clean() + + data := [][]driver.Value{ + {"CHAR", "char1", `'char1'`}, + {"INT", 12345, `12345`}, + {"BINARY", 1234, "x'31323334'"}, + } + + for _, datum := range data { + sqlType, origin, result := datum[0].(string), datum[1], datum[2].(string) + + tableData := [][]driver.Value{{origin}} + colType := []string{sqlType} + tableIR := newMockTableIR("test", "t", tableData, nil, colType) + bf := storage.NewBufferWriter() + + conf := configForWriteSQL(cfg, UnspecifiedSize, UnspecifiedSize) + n, err := WriteInsert(tcontext.Background(), conf, tableIR, tableIR, bf) + require.NoError(t, err) + require.Equal(t, uint64(1), n) + + lines := strings.Split(bf.String(), "\n") + require.Len(t, lines, 3) + require.Equal(t, fmt.Sprintf("(%s);", result), lines[1]) + require.Equal(t, float64(1), ReadGauge(finishedRowsGauge, conf.Labels)) + require.Equal(t, float64(len(bf.String())), ReadGauge(finishedSizeGauge, conf.Labels)) + + RemoveLabelValuesWithTaskInMetrics(conf.Labels) + } +} + +func TestWrite(t *testing.T) { + mocksw := &mockPoisonWriter{} + src := []string{"test", "loooooooooooooooooooong", "poison"} + exp := []string{"test", "loooooooooooooooooooong", "poison_error"} + + for i, s := range src { + err := write(tcontext.Background(), mocksw, s) + if err != nil { + require.EqualError(t, err, exp[i]) + } else { + require.Equal(t, s, mocksw.buf) + require.Equal(t, exp[i], mocksw.buf) + } + } + require.NoError(t, write(tcontext.Background(), mocksw, "test")) +} + +// cloneConfigForTest clones a dumpling config. +func cloneConfigForTest(conf *Config) *Config { + clone := &Config{} + *clone = *conf + return clone +} + +func configForWriteSQL(config *Config, fileSize, statementSize uint64) *Config { + cfg := cloneConfigForTest(config) + cfg.FileSize = fileSize + cfg.StatementSize = statementSize + return cfg +} + +func configForWriteCSV(config *Config, noHeader bool, opt *csvOption) *Config { + cfg := cloneConfigForTest(config) + cfg.NoHeader = noHeader + cfg.CsvNullValue = opt.nullValue + cfg.CsvDelimiter = string(opt.delimiter) + cfg.CsvSeparator = string(opt.separator) + cfg.FileSize = UnspecifiedSize + return cfg +} + +func createMockConfig(t *testing.T) (cfg *Config, clean func()) { + cfg = &Config{ + FileSize: UnspecifiedSize, + } + + InitMetricsVector(cfg.Labels) + + clean = func() { + RemoveLabelValuesWithTaskInMetrics(cfg.Labels) + require.Equal(t, float64(0), ReadGauge(finishedRowsGauge, cfg.Labels)) + require.Equal(t, float64(0), ReadGauge(finishedSizeGauge, cfg.Labels)) + } + + return +} diff --git a/dumpling/export/writer_test.go b/dumpling/export/writer_test.go new file mode 100644 index 0000000000000..9c577e8ab848a --- /dev/null +++ b/dumpling/export/writer_test.go @@ -0,0 +1,359 @@ +// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +package export + +import ( + "context" + "database/sql/driver" + "io/ioutil" + "os" + "path" + "sync" + "testing" + + "github.com/DATA-DOG/go-sqlmock" + "github.com/stretchr/testify/require" + + tcontext "github.com/pingcap/tidb/dumpling/context" +) + +func TestWriteDatabaseMeta(t *testing.T) { + dir := t.TempDir() + config := defaultConfigForTest(t) + config.OutputDirPath = dir + + writer, clean := createTestWriter(config, t) + defer clean() + + err := writer.WriteDatabaseMeta("test", "CREATE DATABASE `test`") + require.NoError(t, err) + + p := path.Join(dir, "test-schema-create.sql") + _, err = os.Stat(p) + require.NoError(t, err) + + bytes, err := ioutil.ReadFile(p) + require.NoError(t, err) + require.Equal(t, "/*!40101 SET NAMES binary*/;\n/*T![placement] SET PLACEMENT_CHECKS = 0*/;\nCREATE DATABASE `test`;\n", string(bytes)) +} + +func TestWritePolicyMeta(t *testing.T) { + dir := t.TempDir() + config := defaultConfigForTest(t) + config.OutputDirPath = dir + + writer, clean := createTestWriter(config, t) + defer clean() + + err := writer.WritePolicyMeta("testpolicy", "create placement policy `y` followers=2") + require.NoError(t, err) + + p := path.Join(dir, "testpolicy-placement-policy-create.sql") + _, err = os.Stat(p) + require.NoError(t, err) + + bytes, err := ioutil.ReadFile(p) + require.NoError(t, err) + require.Equal(t, "/*!40101 SET NAMES binary*/;\n/*T![placement] SET PLACEMENT_CHECKS = 0*/;\ncreate placement policy `y` followers=2;\n", string(bytes)) +} + +func TestWriteTableMeta(t *testing.T) { + dir := t.TempDir() + + config := defaultConfigForTest(t) + config.OutputDirPath = dir + + writer, clean := createTestWriter(config, t) + defer clean() + + err := writer.WriteTableMeta("test", "t", "CREATE TABLE t (a INT)") + require.NoError(t, err) + p := path.Join(dir, "test.t-schema.sql") + _, err = os.Stat(p) + require.NoError(t, err) + bytes, err := ioutil.ReadFile(p) + require.NoError(t, err) + require.Equal(t, "/*!40101 SET NAMES binary*/;\n/*T![placement] SET PLACEMENT_CHECKS = 0*/;\nCREATE TABLE t (a INT);\n", string(bytes)) +} + +func TestWriteViewMeta(t *testing.T) { + dir := t.TempDir() + config := defaultConfigForTest(t) + config.OutputDirPath = dir + + writer, clean := createTestWriter(config, t) + defer clean() + + specCmt := "/*!40101 SET NAMES binary*/;\n/*T![placement] SET PLACEMENT_CHECKS = 0*/;\n" + createTableSQL := "CREATE TABLE `v`(\n`a` int\n)ENGINE=MyISAM;\n" + createViewSQL := "DROP TABLE IF EXISTS `v`;\nDROP VIEW IF EXISTS `v`;\nSET @PREV_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT;\nSET @PREV_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS;\nSET @PREV_COLLATION_CONNECTION=@@COLLATION_CONNECTION;\nSET character_set_client = utf8;\nSET character_set_results = utf8;\nSET collation_connection = utf8_general_ci;\nCREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v` (`a`) AS SELECT `t`.`a` AS `a` FROM `test`.`t`;\nSET character_set_client = @PREV_CHARACTER_SET_CLIENT;\nSET character_set_results = @PREV_CHARACTER_SET_RESULTS;\nSET collation_connection = @PREV_COLLATION_CONNECTION;\n" + err := writer.WriteViewMeta("test", "v", createTableSQL, createViewSQL) + require.NoError(t, err) + + p := path.Join(dir, "test.v-schema.sql") + _, err = os.Stat(p) + require.NoError(t, err) + bytes, err := ioutil.ReadFile(p) + require.NoError(t, err) + require.Equal(t, specCmt+createTableSQL, string(bytes)) + + p = path.Join(dir, "test.v-schema-view.sql") + _, err = os.Stat(p) + require.NoError(t, err) + bytes, err = ioutil.ReadFile(p) + require.NoError(t, err) + require.Equal(t, specCmt+createViewSQL, string(bytes)) +} + +func TestWriteTableData(t *testing.T) { + dir := t.TempDir() + config := defaultConfigForTest(t) + config.OutputDirPath = dir + + writer, clean := createTestWriter(config, t) + defer clean() + + data := [][]driver.Value{ + {"1", "male", "bob@mail.com", "020-1234", nil}, + {"2", "female", "sarah@mail.com", "020-1253", "healthy"}, + {"3", "male", "john@mail.com", "020-1256", "healthy"}, + {"4", "female", "sarah@mail.com", "020-1235", "healthy"}, + } + colTypes := []string{"INT", "SET", "VARCHAR", "VARCHAR", "TEXT"} + specCmts := []string{ + "/*!40101 SET NAMES binary*/;", + "/*!40014 SET FOREIGN_KEY_CHECKS=0*/;", + } + tableIR := newMockTableIR("test", "employee", data, specCmts, colTypes) + err := writer.WriteTableData(tableIR, tableIR, 0) + require.NoError(t, err) + + p := path.Join(dir, "test.employee.000000000.sql") + _, err = os.Stat(p) + require.NoError(t, err) + bytes, err := ioutil.ReadFile(p) + require.NoError(t, err) + + expected := "/*!40101 SET NAMES binary*/;\n" + + "/*!40014 SET FOREIGN_KEY_CHECKS=0*/;\n" + + "INSERT INTO `employee` VALUES\n" + + "(1,'male','bob@mail.com','020-1234',NULL),\n" + + "(2,'female','sarah@mail.com','020-1253','healthy'),\n" + + "(3,'male','john@mail.com','020-1256','healthy'),\n" + + "(4,'female','sarah@mail.com','020-1235','healthy');\n" + require.Equal(t, expected, string(bytes)) +} + +func TestWriteTableDataWithFileSize(t *testing.T) { + dir := t.TempDir() + config := defaultConfigForTest(t) + config.OutputDirPath = dir + config.FileSize = 50 + specCmts := []string{ + "/*!40101 SET NAMES binary*/;", + "/*!40014 SET FOREIGN_KEY_CHECKS=0*/;", + } + config.FileSize += uint64(len(specCmts[0]) + 1) + config.FileSize += uint64(len(specCmts[1]) + 1) + config.FileSize += uint64(len("INSERT INTO `employees` VALUES\n")) + + writer, clean := createTestWriter(config, t) + defer clean() + + data := [][]driver.Value{ + {"1", "male", "bob@mail.com", "020-1234", nil}, + {"2", "female", "sarah@mail.com", "020-1253", "healthy"}, + {"3", "male", "john@mail.com", "020-1256", "healthy"}, + {"4", "female", "sarah@mail.com", "020-1235", "healthy"}, + } + colTypes := []string{"INT", "SET", "VARCHAR", "VARCHAR", "TEXT"} + tableIR := newMockTableIR("test", "employee", data, specCmts, colTypes) + err := writer.WriteTableData(tableIR, tableIR, 0) + require.NoError(t, err) + + cases := map[string]string{ + "test.employee.000000000.sql": "/*!40101 SET NAMES binary*/;\n" + + "/*!40014 SET FOREIGN_KEY_CHECKS=0*/;\n" + + "INSERT INTO `employee` VALUES\n" + + "(1,'male','bob@mail.com','020-1234',NULL),\n" + + "(2,'female','sarah@mail.com','020-1253','healthy');\n", + "test.employee.000000001.sql": "/*!40101 SET NAMES binary*/;\n" + + "/*!40014 SET FOREIGN_KEY_CHECKS=0*/;\n" + + "INSERT INTO `employee` VALUES\n" + + "(3,'male','john@mail.com','020-1256','healthy'),\n" + + "(4,'female','sarah@mail.com','020-1235','healthy');\n", + } + + for p, expected := range cases { + p = path.Join(dir, p) + _, err := os.Stat(p) + require.NoError(t, err) + bytes, err := ioutil.ReadFile(p) + require.NoError(t, err) + require.Equal(t, expected, string(bytes)) + } +} + +func TestWriteTableDataWithFileSizeAndRows(t *testing.T) { + dir := t.TempDir() + config := defaultConfigForTest(t) + config.OutputDirPath = dir + config.FileSize = 50 + config.Rows = 4 + specCmts := []string{ + "/*!40101 SET NAMES binary*/;", + "/*!40014 SET FOREIGN_KEY_CHECKS=0*/;", + } + config.FileSize += uint64(len(specCmts[0]) + 1) + config.FileSize += uint64(len(specCmts[1]) + 1) + config.FileSize += uint64(len("INSERT INTO `employees` VALUES\n")) + + writer, clean := createTestWriter(config, t) + defer clean() + + data := [][]driver.Value{ + {"1", "male", "bob@mail.com", "020-1234", nil}, + {"2", "female", "sarah@mail.com", "020-1253", "healthy"}, + {"3", "male", "john@mail.com", "020-1256", "healthy"}, + {"4", "female", "sarah@mail.com", "020-1235", "healthy"}, + } + colTypes := []string{"INT", "SET", "VARCHAR", "VARCHAR", "TEXT"} + tableIR := newMockTableIR("test", "employee", data, specCmts, colTypes) + err := writer.WriteTableData(tableIR, tableIR, 0) + require.NoError(t, err) + + cases := map[string]string{ + "test.employee.0000000000000.sql": "/*!40101 SET NAMES binary*/;\n" + + "/*!40014 SET FOREIGN_KEY_CHECKS=0*/;\n" + + "INSERT INTO `employee` VALUES\n" + + "(1,'male','bob@mail.com','020-1234',NULL),\n" + + "(2,'female','sarah@mail.com','020-1253','healthy');\n", + "test.employee.0000000000001.sql": "/*!40101 SET NAMES binary*/;\n" + + "/*!40014 SET FOREIGN_KEY_CHECKS=0*/;\n" + + "INSERT INTO `employee` VALUES\n" + + "(3,'male','john@mail.com','020-1256','healthy'),\n" + + "(4,'female','sarah@mail.com','020-1235','healthy');\n", + } + + for p, expected := range cases { + p = path.Join(dir, p) + _, err = os.Stat(p) + require.NoError(t, err) + bytes, err := ioutil.ReadFile(p) + require.NoError(t, err) + require.Equal(t, expected, string(bytes)) + } +} + +func TestWriteTableDataWithStatementSize(t *testing.T) { + dir := t.TempDir() + config := defaultConfigForTest(t) + config.OutputDirPath = dir + config.StatementSize = 50 + config.StatementSize += uint64(len("INSERT INTO `employee` VALUES\n")) + var err error + config.OutputFileTemplate, err = ParseOutputFileTemplate("specified-name") + require.NoError(t, err) + + writer, clean := createTestWriter(config, t) + defer clean() + + data := [][]driver.Value{ + {"1", "male", "bob@mail.com", "020-1234", nil}, + {"2", "female", "sarah@mail.com", "020-1253", "healthy"}, + {"3", "male", "john@mail.com", "020-1256", "healthy"}, + {"4", "female", "sarah@mail.com", "020-1235", "healthy"}, + } + colTypes := []string{"INT", "SET", "VARCHAR", "VARCHAR", "TEXT"} + specCmts := []string{ + "/*!40101 SET NAMES binary*/;", + "/*!40014 SET FOREIGN_KEY_CHECKS=0*/;", + } + tableIR := newMockTableIR("te%/st", "employee", data, specCmts, colTypes) + err = writer.WriteTableData(tableIR, tableIR, 0) + require.NoError(t, err) + + // only with statement size + cases := map[string]string{ + "specified-name.sql": "/*!40101 SET NAMES binary*/;\n" + + "/*!40014 SET FOREIGN_KEY_CHECKS=0*/;\n" + + "INSERT INTO `employee` VALUES\n" + + "(1,'male','bob@mail.com','020-1234',NULL),\n" + + "(2,'female','sarah@mail.com','020-1253','healthy');\n" + + "INSERT INTO `employee` VALUES\n" + + "(3,'male','john@mail.com','020-1256','healthy'),\n" + + "(4,'female','sarah@mail.com','020-1235','healthy');\n", + } + + for p, expected := range cases { + p = path.Join(config.OutputDirPath, p) + _, err = os.Stat(p) + require.NoError(t, err) + bytes, err1 := ioutil.ReadFile(p) + require.NoError(t, err1) + require.Equal(t, expected, string(bytes)) + } + + // with file size and statement size + config.FileSize = 204 + config.StatementSize = 95 + config.FileSize += uint64(len(specCmts[0]) + 1) + config.FileSize += uint64(len(specCmts[1]) + 1) + config.StatementSize += uint64(len("INSERT INTO `employee` VALUES\n")) + // test specifying filename format + config.OutputFileTemplate, err = ParseOutputFileTemplate("{{.Index}}-{{.Table}}-{{fn .DB}}") + require.NoError(t, err) + err = os.RemoveAll(config.OutputDirPath) + require.NoError(t, err) + config.OutputDirPath, err = ioutil.TempDir("", "dumpling") + + writer, clean = createTestWriter(config, t) + defer clean() + + cases = map[string]string{ + "000000000-employee-te%25%2Fst.sql": "/*!40101 SET NAMES binary*/;\n" + + "/*!40014 SET FOREIGN_KEY_CHECKS=0*/;\n" + + "INSERT INTO `employee` VALUES\n" + + "(1,'male','bob@mail.com','020-1234',NULL),\n" + + "(2,'female','sarah@mail.com','020-1253','healthy');\n" + + "INSERT INTO `employee` VALUES\n" + + "(3,'male','john@mail.com','020-1256','healthy');\n", + "000000001-employee-te%25%2Fst.sql": "/*!40101 SET NAMES binary*/;\n" + + "/*!40014 SET FOREIGN_KEY_CHECKS=0*/;\n" + + "INSERT INTO `employee` VALUES\n" + + "(4,'female','sarah@mail.com','020-1235','healthy');\n", + } + + tableIR = newMockTableIR("te%/st", "employee", data, specCmts, colTypes) + require.NoError(t, writer.WriteTableData(tableIR, tableIR, 0)) + require.NoError(t, err) + for p, expected := range cases { + p = path.Join(config.OutputDirPath, p) + _, err = os.Stat(p) + require.NoError(t, err) + bytes, err := ioutil.ReadFile(p) + require.NoError(t, err) + require.Equal(t, expected, string(bytes)) + } +} + +var mu sync.Mutex + +func createTestWriter(conf *Config, t *testing.T) (w *Writer, clean func()) { + mu.Lock() + extStore, err := conf.createExternalStorage(context.Background()) + mu.Unlock() + + require.NoError(t, err) + db, _, err := sqlmock.New() + require.NoError(t, err) + conn, err := db.Conn(context.Background()) + require.NoError(t, err) + + w = NewWriter(tcontext.Background(), 0, conf, conn, extStore) + clean = func() { + require.NoError(t, db.Close()) + } + + return +} diff --git a/dumpling/export/writer_util.go b/dumpling/export/writer_util.go new file mode 100755 index 0000000000000..2ccbefad372f9 --- /dev/null +++ b/dumpling/export/writer_util.go @@ -0,0 +1,631 @@ +// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +package export + +import ( + "bytes" + "context" + "fmt" + "io" + "path" + "strings" + "sync" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/failpoint" + "github.com/prometheus/client_golang/prometheus" + "go.uber.org/zap" + + "github.com/pingcap/tidb/br/pkg/storage" + "github.com/pingcap/tidb/br/pkg/summary" + tcontext "github.com/pingcap/tidb/dumpling/context" + "github.com/pingcap/tidb/dumpling/log" +) + +const lengthLimit = 1048576 + +var pool = sync.Pool{New: func() interface{} { + return &bytes.Buffer{} +}} + +type writerPipe struct { + input chan *bytes.Buffer + closed chan struct{} + errCh chan error + labels prometheus.Labels + + finishedFileSize uint64 + currentFileSize uint64 + currentStatementSize uint64 + + fileSizeLimit uint64 + statementSizeLimit uint64 + + w storage.ExternalFileWriter +} + +func newWriterPipe(w storage.ExternalFileWriter, fileSizeLimit, statementSizeLimit uint64, labels prometheus.Labels) *writerPipe { + return &writerPipe{ + input: make(chan *bytes.Buffer, 8), + closed: make(chan struct{}), + errCh: make(chan error, 1), + w: w, + labels: labels, + + currentFileSize: 0, + currentStatementSize: 0, + fileSizeLimit: fileSizeLimit, + statementSizeLimit: statementSizeLimit, + } +} + +func (b *writerPipe) Run(tctx *tcontext.Context) { + defer close(b.closed) + var errOccurs bool + receiveChunkTime := time.Now() + for { + select { + case s, ok := <-b.input: + if !ok { + return + } + if errOccurs { + continue + } + ObserveHistogram(receiveWriteChunkTimeHistogram, b.labels, time.Since(receiveChunkTime).Seconds()) + receiveChunkTime = time.Now() + err := writeBytes(tctx, b.w, s.Bytes()) + ObserveHistogram(writeTimeHistogram, b.labels, time.Since(receiveChunkTime).Seconds()) + AddGauge(finishedSizeGauge, b.labels, float64(s.Len())) + b.finishedFileSize += uint64(s.Len()) + s.Reset() + pool.Put(s) + if err != nil { + errOccurs = true + b.errCh <- err + } + receiveChunkTime = time.Now() + case <-tctx.Done(): + return + } + } +} + +func (b *writerPipe) AddFileSize(fileSize uint64) { + b.currentFileSize += fileSize + b.currentStatementSize += fileSize +} + +func (b *writerPipe) Error() error { + select { + case err := <-b.errCh: + return err + default: + return nil + } +} + +func (b *writerPipe) ShouldSwitchFile() bool { + return b.fileSizeLimit != UnspecifiedSize && b.currentFileSize >= b.fileSizeLimit +} + +func (b *writerPipe) ShouldSwitchStatement() bool { + return (b.fileSizeLimit != UnspecifiedSize && b.currentFileSize >= b.fileSizeLimit) || + (b.statementSizeLimit != UnspecifiedSize && b.currentStatementSize >= b.statementSizeLimit) +} + +// WriteMeta writes MetaIR to a storage.ExternalFileWriter +func WriteMeta(tctx *tcontext.Context, meta MetaIR, w storage.ExternalFileWriter) error { + tctx.L().Debug("start dumping meta data", zap.String("target", meta.TargetName())) + + specCmtIter := meta.SpecialComments() + for specCmtIter.HasNext() { + if err := write(tctx, w, fmt.Sprintf("%s\n", specCmtIter.Next())); err != nil { + return err + } + } + + if err := write(tctx, w, meta.MetaSQL()); err != nil { + return err + } + + tctx.L().Debug("finish dumping meta data", zap.String("target", meta.TargetName())) + return nil +} + +// WriteInsert writes TableDataIR to a storage.ExternalFileWriter in sql type +func WriteInsert(pCtx *tcontext.Context, cfg *Config, meta TableMeta, tblIR TableDataIR, w storage.ExternalFileWriter) (n uint64, err error) { + fileRowIter := tblIR.Rows() + if !fileRowIter.HasNext() { + return 0, fileRowIter.Error() + } + + bf := pool.Get().(*bytes.Buffer) + if bfCap := bf.Cap(); bfCap < lengthLimit { + bf.Grow(lengthLimit - bfCap) + } + + wp := newWriterPipe(w, cfg.FileSize, cfg.StatementSize, cfg.Labels) + + // use context.Background here to make sure writerPipe can deplete all the chunks in pipeline + ctx, cancel := tcontext.Background().WithLogger(pCtx.L()).WithCancel() + var wg sync.WaitGroup + wg.Add(1) + go func() { + wp.Run(ctx) + wg.Done() + }() + defer func() { + cancel() + wg.Wait() + }() + + specCmtIter := meta.SpecialComments() + for specCmtIter.HasNext() { + bf.WriteString(specCmtIter.Next()) + bf.WriteByte('\n') + } + wp.currentFileSize += uint64(bf.Len()) + + var ( + insertStatementPrefix string + row = MakeRowReceiver(meta.ColumnTypes()) + counter uint64 + lastCounter uint64 + escapeBackslash = cfg.EscapeBackslash + ) + + defer func() { + if err != nil { + pCtx.L().Warn("fail to dumping table(chunk), will revert some metrics and start a retry if possible", + zap.String("database", meta.DatabaseName()), + zap.String("table", meta.TableName()), + zap.Uint64("finished rows", lastCounter), + zap.Uint64("finished size", wp.finishedFileSize), + log.ShortError(err)) + SubGauge(finishedRowsGauge, cfg.Labels, float64(lastCounter)) + SubGauge(finishedSizeGauge, cfg.Labels, float64(wp.finishedFileSize)) + } else { + pCtx.L().Debug("finish dumping table(chunk)", + zap.String("database", meta.DatabaseName()), + zap.String("table", meta.TableName()), + zap.Uint64("finished rows", counter), + zap.Uint64("finished size", wp.finishedFileSize)) + summary.CollectSuccessUnit(summary.TotalBytes, 1, wp.finishedFileSize) + summary.CollectSuccessUnit("total rows", 1, counter) + } + }() + + selectedField := meta.SelectedField() + + // if has generated column + if selectedField != "" && selectedField != "*" { + insertStatementPrefix = fmt.Sprintf("INSERT INTO %s (%s) VALUES\n", + wrapBackTicks(escapeString(meta.TableName())), selectedField) + } else { + insertStatementPrefix = fmt.Sprintf("INSERT INTO %s VALUES\n", + wrapBackTicks(escapeString(meta.TableName()))) + } + insertStatementPrefixLen := uint64(len(insertStatementPrefix)) + + for fileRowIter.HasNext() { + wp.currentStatementSize = 0 + bf.WriteString(insertStatementPrefix) + wp.AddFileSize(insertStatementPrefixLen) + + for fileRowIter.HasNext() { + lastBfSize := bf.Len() + if selectedField != "" { + if err = fileRowIter.Decode(row); err != nil { + return counter, errors.Trace(err) + } + row.WriteToBuffer(bf, escapeBackslash) + } else { + bf.WriteString("()") + } + counter++ + wp.AddFileSize(uint64(bf.Len()-lastBfSize) + 2) // 2 is for ",\n" and ";\n" + failpoint.Inject("ChaosBrokenMySQLConn", func(_ failpoint.Value) { + failpoint.Return(0, errors.New("connection is closed")) + }) + + fileRowIter.Next() + shouldSwitch := wp.ShouldSwitchStatement() + if fileRowIter.HasNext() && !shouldSwitch { + bf.WriteString(",\n") + } else { + bf.WriteString(";\n") + } + if bf.Len() >= lengthLimit { + select { + case <-pCtx.Done(): + return counter, pCtx.Err() + case err = <-wp.errCh: + return counter, err + case wp.input <- bf: + bf = pool.Get().(*bytes.Buffer) + if bfCap := bf.Cap(); bfCap < lengthLimit { + bf.Grow(lengthLimit - bfCap) + } + AddGauge(finishedRowsGauge, cfg.Labels, float64(counter-lastCounter)) + lastCounter = counter + } + } + + if shouldSwitch { + break + } + } + if wp.ShouldSwitchFile() { + break + } + } + if bf.Len() > 0 { + wp.input <- bf + } + close(wp.input) + <-wp.closed + AddGauge(finishedRowsGauge, cfg.Labels, float64(counter-lastCounter)) + lastCounter = counter + if err = fileRowIter.Error(); err != nil { + return counter, errors.Trace(err) + } + return counter, wp.Error() +} + +// WriteInsertInCsv writes TableDataIR to a storage.ExternalFileWriter in csv type +func WriteInsertInCsv(pCtx *tcontext.Context, cfg *Config, meta TableMeta, tblIR TableDataIR, w storage.ExternalFileWriter) (n uint64, err error) { + fileRowIter := tblIR.Rows() + if !fileRowIter.HasNext() { + return 0, fileRowIter.Error() + } + + bf := pool.Get().(*bytes.Buffer) + if bfCap := bf.Cap(); bfCap < lengthLimit { + bf.Grow(lengthLimit - bfCap) + } + + wp := newWriterPipe(w, cfg.FileSize, UnspecifiedSize, cfg.Labels) + opt := &csvOption{ + nullValue: cfg.CsvNullValue, + separator: []byte(cfg.CsvSeparator), + delimiter: []byte(cfg.CsvDelimiter), + } + + // use context.Background here to make sure writerPipe can deplete all the chunks in pipeline + ctx, cancel := tcontext.Background().WithLogger(pCtx.L()).WithCancel() + var wg sync.WaitGroup + wg.Add(1) + go func() { + wp.Run(ctx) + wg.Done() + }() + defer func() { + cancel() + wg.Wait() + }() + + var ( + row = MakeRowReceiver(meta.ColumnTypes()) + counter uint64 + lastCounter uint64 + escapeBackslash = cfg.EscapeBackslash + selectedFields = meta.SelectedField() + ) + + defer func() { + if err != nil { + pCtx.L().Warn("fail to dumping table(chunk), will revert some metrics and start a retry if possible", + zap.String("database", meta.DatabaseName()), + zap.String("table", meta.TableName()), + zap.Uint64("finished rows", lastCounter), + zap.Uint64("finished size", wp.finishedFileSize), + log.ShortError(err)) + SubGauge(finishedRowsGauge, cfg.Labels, float64(lastCounter)) + SubGauge(finishedSizeGauge, cfg.Labels, float64(wp.finishedFileSize)) + } else { + pCtx.L().Debug("finish dumping table(chunk)", + zap.String("database", meta.DatabaseName()), + zap.String("table", meta.TableName()), + zap.Uint64("finished rows", counter), + zap.Uint64("finished size", wp.finishedFileSize)) + summary.CollectSuccessUnit(summary.TotalBytes, 1, wp.finishedFileSize) + summary.CollectSuccessUnit("total rows", 1, counter) + } + }() + + if !cfg.NoHeader && len(meta.ColumnNames()) != 0 && selectedFields != "" { + for i, col := range meta.ColumnNames() { + bf.Write(opt.delimiter) + escapeCSV([]byte(col), bf, escapeBackslash, opt) + bf.Write(opt.delimiter) + if i != len(meta.ColumnTypes())-1 { + bf.Write(opt.separator) + } + } + bf.WriteByte('\n') + } + wp.currentFileSize += uint64(bf.Len()) + + for fileRowIter.HasNext() { + lastBfSize := bf.Len() + if selectedFields != "" { + if err = fileRowIter.Decode(row); err != nil { + return counter, errors.Trace(err) + } + row.WriteToBufferInCsv(bf, escapeBackslash, opt) + } + counter++ + wp.currentFileSize += uint64(bf.Len()-lastBfSize) + 1 // 1 is for "\n" + + bf.WriteByte('\n') + if bf.Len() >= lengthLimit { + select { + case <-pCtx.Done(): + return counter, pCtx.Err() + case err = <-wp.errCh: + return counter, err + case wp.input <- bf: + bf = pool.Get().(*bytes.Buffer) + if bfCap := bf.Cap(); bfCap < lengthLimit { + bf.Grow(lengthLimit - bfCap) + } + AddGauge(finishedRowsGauge, cfg.Labels, float64(counter-lastCounter)) + lastCounter = counter + } + } + + fileRowIter.Next() + if wp.ShouldSwitchFile() { + break + } + } + + if bf.Len() > 0 { + wp.input <- bf + } + close(wp.input) + <-wp.closed + AddGauge(finishedRowsGauge, cfg.Labels, float64(counter-lastCounter)) + lastCounter = counter + if err = fileRowIter.Error(); err != nil { + return counter, errors.Trace(err) + } + return counter, wp.Error() +} + +func write(tctx *tcontext.Context, writer storage.ExternalFileWriter, str string) error { + _, err := writer.Write(tctx, []byte(str)) + if err != nil { + // str might be very long, only output the first 200 chars + outputLength := len(str) + if outputLength >= 200 { + outputLength = 200 + } + tctx.L().Warn("fail to write", + zap.String("heading 200 characters", str[:outputLength]), + zap.Error(err)) + } + return errors.Trace(err) +} + +func writeBytes(tctx *tcontext.Context, writer storage.ExternalFileWriter, p []byte) error { + _, err := writer.Write(tctx, p) + if err != nil { + // str might be very long, only output the first 200 chars + outputLength := len(p) + if outputLength >= 200 { + outputLength = 200 + } + tctx.L().Warn("fail to write", + zap.ByteString("heading 200 characters", p[:outputLength]), + zap.Error(err)) + if strings.Contains(err.Error(), "Part number must be an integer between 1 and 10000") { + err = errors.Annotate(err, "workaround: dump file exceeding 50GB, please specify -F=256MB -r=200000 to avoid this problem") + } + } + return errors.Trace(err) +} + +func buildFileWriter(tctx *tcontext.Context, s storage.ExternalStorage, fileName string, compressType storage.CompressType) (storage.ExternalFileWriter, func(ctx context.Context), error) { + fileName += compressFileSuffix(compressType) + fullPath := path.Join(s.URI(), fileName) + writer, err := storage.WithCompression(s, compressType).Create(tctx, fileName) + if err != nil { + tctx.L().Warn("fail to open file", + zap.String("path", fullPath), + zap.Error(err)) + return nil, nil, errors.Trace(err) + } + tctx.L().Debug("opened file", zap.String("path", fullPath)) + tearDownRoutine := func(ctx context.Context) { + err := writer.Close(ctx) + if err == nil { + return + } + err = errors.Trace(err) + tctx.L().Warn("fail to close file", + zap.String("path", fullPath), + zap.Error(err)) + } + return writer, tearDownRoutine, nil +} + +func buildInterceptFileWriter(pCtx *tcontext.Context, s storage.ExternalStorage, fileName string, compressType storage.CompressType) (storage.ExternalFileWriter, func(context.Context)) { + fileName += compressFileSuffix(compressType) + var writer storage.ExternalFileWriter + fullPath := path.Join(s.URI(), fileName) + fileWriter := &InterceptFileWriter{} + initRoutine := func() error { + // use separated context pCtx here to make sure context used in ExternalFile won't be canceled before close, + // which will cause a context canceled error when closing gcs's Writer + w, err := storage.WithCompression(s, compressType).Create(pCtx, fileName) + if err != nil { + pCtx.L().Warn("fail to open file", + zap.String("path", fullPath), + zap.Error(err)) + return newWriterError(err) + } + writer = w + pCtx.L().Debug("opened file", zap.String("path", fullPath)) + fileWriter.ExternalFileWriter = writer + return nil + } + fileWriter.initRoutine = initRoutine + + tearDownRoutine := func(ctx context.Context) { + if writer == nil { + return + } + pCtx.L().Debug("tear down lazy file writer...", zap.String("path", fullPath)) + err := writer.Close(ctx) + if err != nil { + pCtx.L().Warn("fail to close file", + zap.String("path", fullPath), + zap.Error(err)) + } + } + return fileWriter, tearDownRoutine +} + +// LazyStringWriter is an interceptor of io.StringWriter, +// will lazily create file the first time StringWriter need to write something. +type LazyStringWriter struct { + initRoutine func() error + sync.Once + io.StringWriter + err error +} + +// WriteString implements io.StringWriter. It check whether writer has written something and init a file at first time +func (l *LazyStringWriter) WriteString(str string) (int, error) { + l.Do(func() { l.err = l.initRoutine() }) + if l.err != nil { + return 0, errors.Errorf("open file error: %s", l.err.Error()) + } + return l.StringWriter.WriteString(str) +} + +type writerError struct { + error +} + +func (e *writerError) Error() string { + return e.error.Error() +} + +func newWriterError(err error) error { + if err == nil { + return nil + } + return &writerError{error: err} +} + +// InterceptFileWriter is an interceptor of os.File, +// tracking whether a StringWriter has written something. +type InterceptFileWriter struct { + storage.ExternalFileWriter + sync.Once + SomethingIsWritten bool + + initRoutine func() error + err error +} + +// Write implements storage.ExternalFileWriter.Write. It check whether writer has written something and init a file at first time +func (w *InterceptFileWriter) Write(ctx context.Context, p []byte) (int, error) { + w.Do(func() { w.err = w.initRoutine() }) + if len(p) > 0 { + w.SomethingIsWritten = true + } + if w.err != nil { + return 0, errors.Annotate(w.err, "open file error") + } + n, err := w.ExternalFileWriter.Write(ctx, p) + return n, newWriterError(err) +} + +// Close closes the InterceptFileWriter +func (w *InterceptFileWriter) Close(ctx context.Context) error { + return w.ExternalFileWriter.Close(ctx) +} + +func wrapBackTicks(identifier string) string { + if !strings.HasPrefix(identifier, "`") && !strings.HasSuffix(identifier, "`") { + return wrapStringWith(identifier, "`") + } + return identifier +} + +func wrapStringWith(str string, wrapper string) string { + return fmt.Sprintf("%s%s%s", wrapper, str, wrapper) +} + +func compressFileSuffix(compressType storage.CompressType) string { + switch compressType { + case storage.NoCompression: + return "" + case storage.Gzip: + return ".gz" + default: + return "" + } +} + +// FileFormat is the format that output to file. Currently we support SQL text and CSV file format. +type FileFormat int32 + +const ( + // FileFormatUnknown indicates the given file type is unknown + FileFormatUnknown FileFormat = iota + // FileFormatSQLText indicates the given file type is sql type + FileFormatSQLText + // FileFormatCSV indicates the given file type is csv type + FileFormatCSV +) + +const ( + // FileFormatSQLTextString indicates the string/suffix of sql type file + FileFormatSQLTextString = "sql" + // FileFormatCSVString indicates the string/suffix of csv type file + FileFormatCSVString = "csv" +) + +// String implement Stringer.String method. +func (f FileFormat) String() string { + switch f { + case FileFormatSQLText: + return strings.ToUpper(FileFormatSQLTextString) + case FileFormatCSV: + return strings.ToUpper(FileFormatCSVString) + default: + return "unknown" + } +} + +// Extension returns the extension for specific format. +// text -> "sql" +// csv -> "csv" +func (f FileFormat) Extension() string { + switch f { + case FileFormatSQLText: + return FileFormatSQLTextString + case FileFormatCSV: + return FileFormatCSVString + default: + return "unknown_format" + } +} + +// WriteInsert writes TableDataIR to a storage.ExternalFileWriter in sql/csv type +func (f FileFormat) WriteInsert(pCtx *tcontext.Context, cfg *Config, meta TableMeta, tblIR TableDataIR, w storage.ExternalFileWriter) (uint64, error) { + switch f { + case FileFormatSQLText: + return WriteInsert(pCtx, cfg, meta, tblIR, w) + case FileFormatCSV: + return WriteInsertInCsv(pCtx, cfg, meta, tblIR, w) + default: + return 0, errors.Errorf("unknown file format") + } +} diff --git a/dumpling/install.sh b/dumpling/install.sh new file mode 100644 index 0000000000000..e51ee861b099c --- /dev/null +++ b/dumpling/install.sh @@ -0,0 +1,29 @@ +#!/bin/sh + +set -e +TAG="nightly" +pwd=$(pwd) +mkdir -p bin/ + +# download lightning and sync_diff_inspector +wget http://download.pingcap.org/tidb-toolkit-$TAG-linux-amd64.tar.gz -O tools.tar.gz +tar -xzvf tools.tar.gz +mv tidb-toolkit-$TAG-linux-amd64/bin/* bin/ + +LIGHTNING_TAG="master" +# download tidb-lightning +git clone -b $LIGHTNING_TAG https://github.com/pingcap/tidb-lightning +cd $pwd/tidb-lightning && make +cd $pwd +mv tidb-lightning/bin/tidb-lightning bin/ + +TIDB_TAG="master" +# download tidb-server +git clone -b $TIDB_TAG https://github.com/pingcap/tidb +cd $pwd/tidb && make +cd $pwd +mv tidb/bin/tidb-server bin/ + +# download minio +wget https://dl.min.io/server/minio/release/linux-amd64/minio -O bin/minio +chmod a+x bin/minio diff --git a/dumpling/log/log.go b/dumpling/log/log.go new file mode 100644 index 0000000000000..78df0a213c90b --- /dev/null +++ b/dumpling/log/log.go @@ -0,0 +1,70 @@ +// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +package log + +import ( + "github.com/pingcap/errors" + pclog "github.com/pingcap/log" + "go.uber.org/zap" +) + +var appLogger = Logger{zap.NewNop()} + +// Logger wraps the zap logger. +type Logger struct { + *zap.Logger +} + +// Zap returns the global logger. +func Zap() Logger { + return appLogger +} + +// Config serializes log related config in toml/json. +type Config struct { + // Log level. + // One of "debug", "info", "warn", "error", "dpanic", "panic", and "fatal". + Level string `toml:"level" json:"level"` + // Log filename, leave empty to disable file log. + File string `toml:"file" json:"file"` + // Max size for a single file, in MB. + FileMaxSize int `toml:"max-size" json:"max-size"` + // Max log keep days, default is never deleting. + FileMaxDays int `toml:"max-days" json:"max-days"` + // Maximum number of old log files to retain. + FileMaxBackups int `toml:"max-backups" json:"max-backups"` + // Format of the log, one of `text`, `json` or `console`. + Format string `toml:"format" json:"format"` +} + +// InitAppLogger inits the wrapped logger from config. +func InitAppLogger(cfg *Config) (Logger, *pclog.ZapProperties, error) { + logger, props, err := pclog.InitLogger(&pclog.Config{ + Level: cfg.Level, + File: pclog.FileLogConfig{ + Filename: cfg.File, + MaxSize: cfg.FileMaxSize, + MaxDays: cfg.FileMaxDays, + MaxBackups: cfg.FileMaxBackups, + }, + Format: cfg.Format, + }) + if err != nil { + return appLogger, props, errors.Trace(err) + } + return Logger{logger.WithOptions(zap.AddStacktrace(zap.DPanicLevel))}, props, nil +} + +// NewAppLogger returns the wrapped logger from config. +func NewAppLogger(logger *zap.Logger) Logger { + return Logger{logger} +} + +// ShortError contructs a field which only records the error message without the +// verbose text (i.e. excludes the stack trace). +func ShortError(err error) zap.Field { + if err == nil { + return zap.Skip() + } + return zap.String("error", err.Error()) +} diff --git a/dumpling/revive.toml b/dumpling/revive.toml new file mode 100644 index 0000000000000..356c300373b73 --- /dev/null +++ b/dumpling/revive.toml @@ -0,0 +1,52 @@ +ignoreGeneratedHeader = false +severity = "error" +confidence = 0.8 +errorCode = 1 +warningCode = 0 + +[rule.blank-imports] +[rule.context-as-argument] +[rule.dot-imports] +[rule.error-return] +[rule.error-strings] +[rule.error-naming] +[rule.exported] +[rule.if-return] +[rule.var-naming] +[rule.package-comments] +[rule.range] +[rule.receiver-naming] +[rule.indent-error-flow] +[rule.empty-block] +[rule.superfluous-else] +[rule.modifies-parameter] + +# Add these once issues are fixed +[rule.confusing-naming] + severity = "warning" +[rule.confusing-results] + severity = "warning" +[rule.flag-parameter] + severity = "warning" + +# Currently this makes too much noise, but should add it in +# and perhaps ignore it in a few files +#[rule.unused-parameter] +# severity = "warning" +#[rule.deep-exit] +# severity = "warning" + + +# Already checked by megacheck +# [rule.unreachable-code] + +# Adding these will slow down the linter +# They are already provided by megacheck +# [rule.unexported-return] +# [rule.time-naming] +# [rule.errorf] + +# Adding these will slow down the linter +# Not sure if they are already provided by megacheck +# [rule.var-declaration] +# [rule.context-keys-type] diff --git a/dumpling/tests/_utils/check_sync_diff b/dumpling/tests/_utils/check_sync_diff new file mode 100755 index 0000000000000..6bfee5bb92864 --- /dev/null +++ b/dumpling/tests/_utils/check_sync_diff @@ -0,0 +1,38 @@ +#!/bin/bash +# +# Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +# parameter 1: config file for sync_diff_inspector +# parameter 2: max check times + +conf=$1 +check_time=${2-10} + +LOG=$DUMPLING_OUTPUT_DIR/sync_diff_inspector.log + +# change output dir "./output" to "$DUMPLING_OUTPUT_DIR/output" +DUMPLING_OUTPUT_DIR_REGEX=$(echo "$DUMPLING_OUTPUT_DIR/output" | sed -e 's/\//\\\//g') +sed "s/.\/output/${DUMPLING_OUTPUT_DIR_REGEX}/g" $conf > $DUMPLING_OUTPUT_DIR/diff_config.toml +conf=$DUMPLING_OUTPUT_DIR/diff_config.toml + +i=0 +while [ $i -lt $check_time ] +do + bin/sync_diff_inspector --config=$conf >> $LOG 2>&1 + ret=$? + if [ "$ret" == 0 ]; then + echo "check diff successfully" + break + fi + ((i++)) + echo "check diff failed $i-th time, retry later" + sleep 2 +done + +if [ $i -ge $check_time ]; then + echo "check data failed, some data are different!!" + # show \n and other blanks + printf "$(cat $LOG)\n" + exit 1 +fi +cd $PWD diff --git a/dumpling/tests/_utils/file_not_exist b/dumpling/tests/_utils/file_not_exist new file mode 100755 index 0000000000000..a3e83b167caae --- /dev/null +++ b/dumpling/tests/_utils/file_not_exist @@ -0,0 +1,9 @@ +#!/bin/sh +# +# Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +set -eu + +if [ -f "$1" ]; then + echo "[$(date)] File $1 already exists." && exit 1 +fi diff --git a/dumpling/tests/_utils/file_should_exist b/dumpling/tests/_utils/file_should_exist new file mode 100755 index 0000000000000..5c675b5c0c62f --- /dev/null +++ b/dumpling/tests/_utils/file_should_exist @@ -0,0 +1,9 @@ +#!/bin/sh +# +# Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +set -eu + +if [ ! -f "$1" ]; then + echo "[$(date)] File $1 not found." && exit 1 +fi diff --git a/dumpling/tests/_utils/run_dumpling b/dumpling/tests/_utils/run_dumpling new file mode 100755 index 0000000000000..ce04d33d300bb --- /dev/null +++ b/dumpling/tests/_utils/run_dumpling @@ -0,0 +1,12 @@ +#!/bin/sh +# +# Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +set -e + +echo "[$(date)] Executing bin/dumpling..." +echo "$DUMPLING_OUTPUT_DIR" + +bin/dumpling -u "$DUMPLING_TEST_USER" -h 127.0.0.1 \ + -P "$DUMPLING_TEST_PORT" -B "$DUMPLING_TEST_DATABASE" \ + -o "$DUMPLING_OUTPUT_DIR" "$@" diff --git a/dumpling/tests/_utils/run_lightning b/dumpling/tests/_utils/run_lightning new file mode 100755 index 0000000000000..dfe604e913d70 --- /dev/null +++ b/dumpling/tests/_utils/run_lightning @@ -0,0 +1,13 @@ +#!/bin/sh +# +# Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +set -eu + +echo "[$(date)] Executing bin/tidb-lightning..." + +conf=$1 + +bin/tidb-lightning -c $1 + +echo "[$(date)] Executed bin/tidb-lightning" diff --git a/dumpling/tests/_utils/run_services b/dumpling/tests/_utils/run_services new file mode 100755 index 0000000000000..d7a18f4bfa74a --- /dev/null +++ b/dumpling/tests/_utils/run_services @@ -0,0 +1,62 @@ +#!/bin/sh +# +# Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +set -eu + +stop_services() { + killall -9 tidb-server || true + + find "$DUMPLING_TEST_DIR" -maxdepth 1 -not -path "$DUMPLING_TEST_DIR" -not -name "*.log" | xargs rm -r || true +} + +start_services() { + stop_services + echo "Ensure mysql can connected..." + + i=0 + while ! run_sql 'select 0 limit 0' > /dev/null; do + i=$((i+1)) + if [ "$i" -gt 10 ]; then + echo 'Failed to ping MySQL Server' + exit 1 + fi + sleep 3 + done + + echo "Generate TLS keys..." + openssl genrsa -out "$DUMPLING_TEST_DIR/ca.key" 2048 + openssl req -new -batch -sha256 -subj '/CN=127.0.0.1/OU=ca' -key "$DUMPLING_TEST_DIR/ca.key" -out "$DUMPLING_TEST_DIR/ca.csr" + openssl x509 -req -sha256 -days 2 -in "$DUMPLING_TEST_DIR/ca.csr" -signkey "$DUMPLING_TEST_DIR/ca.key" -out "$DUMPLING_TEST_DIR/ca.pem" 2> /dev/null + for cluster in tidb dumpling; do + openssl genrsa -out "$DUMPLING_TEST_DIR/$cluster.key" 2048 + openssl req -new -batch -sha256 -subj "/CN=127.0.0.1/OU=$cluster" -key "$DUMPLING_TEST_DIR/$cluster.key" -out "$DUMPLING_TEST_DIR/$cluster.csr" + openssl x509 -req -sha256 -days 1 -extensions EXT -extfile dumpling/tests/tls/ipsan.cnf -in "$DUMPLING_TEST_DIR/$cluster.csr" -CA "$DUMPLING_TEST_DIR/ca.pem" -CAkey "$DUMPLING_TEST_DIR/ca.key" -CAcreateserial -out "$DUMPLING_TEST_DIR/$cluster.pem" 2> /dev/null + done + + cat > "$DUMPLING_TEST_DIR/tidb.toml" <= 3 and a <= 9" -f "$DB_NAME.$TABLE_NAME" + +actual=$(grep -w "(.*)" ${DUMPLING_OUTPUT_DIR}/${DB_NAME}.${TABLE_NAME}.000000000.sql | cut -c2-2) +expected=$(seq 3 9) +echo "expected ${expected}, actual ${actual}" +[ "$actual" = "$expected" ] + +# Test for OR WHERE case. Better dump MySQL here because Dumpling has some special handle for concurrently dump TiDB tables. +export DUMPLING_TEST_PORT=3306 +run_sql "drop database if exists \`$DB_NAME\`;" +run_sql "create database \`$DB_NAME\`;" +run_sql "create table \`$DB_NAME\`.\`$TABLE_NAME\` (a int primary key, b int);" + +seq 0 99 | xargs -I_ run_sql "insert into \`$DB_NAME\`.\`$TABLE_NAME\` (a,b) values (_, 99-_);" +run_sql "analyze table \`$DB_NAME\`.\`$TABLE_NAME\`;" +run_dumpling --where "b <= 4 or b >= 95" -f "$DB_NAME.$TABLE_NAME" --rows 10 + +actual=$(grep -w "(.*)" ${DUMPLING_OUTPUT_DIR}/${DB_NAME}.${TABLE_NAME}.000000000.sql | cut -c2-2) +expected=$(seq 0 4) +echo "expected ${DUMPLING_OUTPUT_DIR}/${DB_NAME}.${TABLE_NAME}.000000000.sql ${expected}, actual ${actual}" +[ "$actual" = "$expected" ] +actual=$(grep -w "(.*)" ${DUMPLING_OUTPUT_DIR}/${DB_NAME}.${TABLE_NAME}.000000009.sql | cut -c2-3) +expected=$(seq 95 99) +echo "expected ${DUMPLING_OUTPUT_DIR}/${DB_NAME}.${TABLE_NAME}.000000009.sql ${expected}, actual ${actual}" +[ "$actual" = "$expected" ] + +seq 1 8 | xargs -I\? file_not_exist ${DUMPLING_OUTPUT_DIR}/${DB_NAME}.${TABLE_NAME}.00000000\?.sql + +# Test for specifying --filetype sql with --sql, should report an error +set +e +run_dumpling --sql "select * from \`$DB_NAME\`.\`$TABLE_NAME\`" --filetype sql > ${DUMPLING_OUTPUT_DIR}/dumpling.log +set -e + +actual=$(grep -w "unsupported config.FileType 'sql' when we specify --sql, please unset --filetype or set it to 'csv'" ${DUMPLING_OUTPUT_DIR}/dumpling.log|wc -l) +echo "expected 1 return error when specifying --filetype sql and --sql, actual ${actual}" +[ "$actual" = 1 ] + +export DUMPLING_TEST_PORT=4000 +# Test for --sql option. +run_sql "drop database if exists \`$DB_NAME\`;" +run_sql "create database \`$DB_NAME\`;" +run_sql "create sequence \`$DB_NAME\`.\`$SEQUENCE_NAME\` increment by 1;" + +run_dumpling --sql "select nextval(\`$DB_NAME\`.\`$SEQUENCE_NAME\`)" + +actual=$(sed -n '2p' ${DUMPLING_OUTPUT_DIR}/result.000000000.csv) +echo "expected 1, actual ${actual}" +[ "$actual" = 1 ] + +run_dumpling --sql "select nextval(\`$DB_NAME\`.\`$SEQUENCE_NAME\`)" + +actual=$(sed -n '2p' ${DUMPLING_OUTPUT_DIR}/result.000000000.csv) +echo "expected 2, actual ${actual}" +[ "$actual" = 2 ] + +# Test for dump with sequence +run_dumpling | tee ${DUMPLING_OUTPUT_DIR}/dumpling.log +actual=$(grep -w "dump failed" ${DUMPLING_OUTPUT_DIR}/dumpling.log|wc -l) +echo "expected 0, actual ${actual}" +[ "$actual" = 0 ] + +# Test for tidb_mem_quota_query configuration +export GO_FAILPOINTS="github.com/pingcap/tidb/dumpling/export/PrintTiDBMemQuotaQuery=1*return" +run_dumpling | tee ${DUMPLING_OUTPUT_DIR}/dumpling.log +actual=$(grep -w "tidb_mem_quota_query == 1073741824" ${DUMPLING_OUTPUT_DIR}/dumpling.log|wc -l) +echo "expected 1, actual ${actual}" +[ "$actual" = 1 ] + +export GO_FAILPOINTS="" + +# Test for wrong sql causing panic problem: https://github.com/pingcap/dumpling/pull/234#issuecomment-759996695 +set +e +run_dumpling --sql "test" > ${DUMPLING_OUTPUT_DIR}/dumpling.log 2> ${DUMPLING_OUTPUT_DIR}/dumpling.err +set -e + +# check stderr, should not contain panic info +actual=$(grep -w "panic" ${DUMPLING_OUTPUT_DIR}/dumpling.err|wc -l) +echo "expected panic 0, actual ${actual}" +[ "$actual" = 0 ] + +# check stdout, should contain mysql error log +actual=$(grep -w "Error 1064: You have an error in your SQL syntax" ${DUMPLING_OUTPUT_DIR}/dumpling.log|wc -l) +echo "expect contain Error 1064, actual ${actual}" +[ "$actual" -ge 1 ] diff --git a/dumpling/tests/chaos/run.sh b/dumpling/tests/chaos/run.sh new file mode 100755 index 0000000000000..d7c0b7d955446 --- /dev/null +++ b/dumpling/tests/chaos/run.sh @@ -0,0 +1,30 @@ +#!/bin/sh +# +# Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +set -eu +cur=$(cd `dirname $0`; pwd) + +DB_NAME="chaos" +TABLE_NAME="t" + +# drop database on mysql +run_sql "drop database if exists \`$DB_NAME\`;" + +# build data on mysql +run_sql "create database $DB_NAME;" +run_sql "create table $DB_NAME.$TABLE_NAME (a int(255));" + +# insert 100 records +run_sql "insert into $DB_NAME.$TABLE_NAME values $(seq -s, 100 | sed 's/,*$//g' | sed "s/[0-9]*/('1')/g");" + +# dumping with consistency none +export DUMPLING_TEST_DATABASE=$DB_NAME +export GO_FAILPOINTS="github.com/pingcap/tidb/dumpling/export/ChaosBrokenMySQLConn=1*return" +run_dumpling --consistency=none --loglevel debug + +# check data record count +cnt=`grep -o "(1)" ${DUMPLING_OUTPUT_DIR}/${DB_NAME}.${TABLE_NAME}.000000000.sql|wc -l` +echo "1st records count is ${cnt}" +[ $cnt = 100 ] +export GO_FAILPOINTS="" diff --git a/dumpling/tests/consistency/run.sh b/dumpling/tests/consistency/run.sh new file mode 100644 index 0000000000000..0c514615e47f1 --- /dev/null +++ b/dumpling/tests/consistency/run.sh @@ -0,0 +1,62 @@ +#!/bin/sh +# +# Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +set -eu +cur=$(cd `dirname $0`; pwd) + +DB_NAME="mysql_consistency" +TABLE_NAME="t" + +# drop database on mysql +run_sql "drop database if exists \`$DB_NAME\`;" + +# build data on mysql +run_sql "create database $DB_NAME;" +run_sql "create table $DB_NAME.$TABLE_NAME (a int(255));" + +# insert 100 records +run_sql "insert into $DB_NAME.$TABLE_NAME values $(seq -s, 100 | sed 's/,*$//g' | sed "s/[0-9]*/('1')/g");" + +# dumping with consistency flush +export DUMPLING_TEST_DATABASE=$DB_NAME +export GO_FAILPOINTS="github.com/pingcap/tidb/dumpling/export/ConsistencyCheck=1*sleep(5000)" +run_dumpling & +# wait dumpling process to start to sleep +sleep 2 + +# record metadata info +metadata=`run_sql "show master status;"` +metaLog=`echo $metadata | awk -F 'File:' '{print $2}' | awk '{print $1}'` +metaPos=`echo $metadata | awk -F 'Position:' '{print $2}' | awk '{print $1}'` +metaGTID=`echo $metadata | awk -F 'Executed_Gtid_Set:' '{print $2}' | awk '{print $1}'` +# insert 100 more records, test whether dumpling will dump these data out +run_sql "insert into $DB_NAME.$TABLE_NAME values $(seq -s, 100 | sed 's/,*$//g' | sed "s/[0-9]*/('1')/g");" + +wait + +# check data record count +cnt=`grep -o "(1)" ${DUMPLING_OUTPUT_DIR}/${DB_NAME}.${TABLE_NAME}.000000000.sql|wc -l` +echo "1st records count is ${cnt}" +[ $cnt = 100 ] + +# check metadata +echo "metaLog: $metaLog" +echo "metaPos: $metaPos" +echo "metaGTID: $metaGTID" +if [ $metaLog != "" ]; then +[ `grep -o "Log: $metaLog" ${DUMPLING_OUTPUT_DIR}/metadata|wc -l` ] +fi +if [ $metaPos != "" ]; then +[ `grep -o "Pos: $metaPos" ${DUMPLING_OUTPUT_DIR}/metadata|wc -l` ] +fi +if [ $metaGTID != "" ]; then +[ `grep -o "GTID: $metaGTID" ${DUMPLING_OUTPUT_DIR}/metadata|wc -l` ] +fi + +# test dumpling normally +export GO_FAILPOINTS="" +run_dumpling +cnt=`grep -o "(1)" ${DUMPLING_OUTPUT_DIR}/${DB_NAME}.${TABLE_NAME}.000000000.sql|wc -l` +echo "2nd records count is ${cnt}" +[ $cnt = 200 ] diff --git a/dumpling/tests/e2e/conf/diff_config.toml b/dumpling/tests/e2e/conf/diff_config.toml new file mode 100644 index 0000000000000..63faff058a7bd --- /dev/null +++ b/dumpling/tests/e2e/conf/diff_config.toml @@ -0,0 +1,29 @@ +# diff Configuration. + +check-thread-count = 4 + +export-fix-sql = true + +check-struct-only = false + +[task] + output-dir = "./output" + + source-instances = ["mysql1"] + + target-instance = "tidb0" + + target-check-tables = ["e2e.t"] + +[data-sources] +[data-sources.mysql1] +host = "127.0.0.1" +port = 3306 +user = "root" +password = "" + +[data-sources.tidb0] +host = "127.0.0.1" +port = 4000 +user = "root" +password = "" diff --git a/dumpling/tests/e2e/conf/lightning.toml b/dumpling/tests/e2e/conf/lightning.toml new file mode 100644 index 0000000000000..ecd96989c51a0 --- /dev/null +++ b/dumpling/tests/e2e/conf/lightning.toml @@ -0,0 +1,20 @@ +### tidb-lightning config + +[lightning] +server-mode = false +level = "error" +check-requirements = false + +[tikv-importer] +backend="tidb" +on-duplicate = "error" + +[mydumper] +data-source-dir = "/tmp/dumpling_test_result/sql_res.e2e" + +[tidb] +host = "127.0.0.1" +port = 4000 +user = "root" +password = "" +status-port = 10080 diff --git a/dumpling/tests/e2e/run.sh b/dumpling/tests/e2e/run.sh new file mode 100644 index 0000000000000..f0c79ecb146f6 --- /dev/null +++ b/dumpling/tests/e2e/run.sh @@ -0,0 +1,40 @@ +#!/bin/sh +# +# Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +set -eu +cur=$(cd `dirname $0`; pwd) + +DB_NAME="e2e" +TABLE_NAME="t" + +# drop database on tidb +export DUMPLING_TEST_PORT=4000 +run_sql "drop database if exists $DB_NAME;" + +# drop database on mysql +export DUMPLING_TEST_PORT=3306 +run_sql "drop database if exists $DB_NAME;" + +# build data on mysql +run_sql "create database $DB_NAME;" +run_sql "create table $DB_NAME.$TABLE_NAME (a int(255), b blob);" + +# insert 100 records +run_sql "insert into $DB_NAME.$TABLE_NAME (a) values $(seq -s, 100 | sed 's/,*$//g' | sed "s/[0-9]*/('1')/g");" + +# insert blob records +run_sql "insert into $DB_NAME.$TABLE_NAME (b) values (x''),(null),('0'),('1');" + +# dumping +export DUMPLING_TEST_DATABASE=$DB_NAME +run_dumpling + +cat "$cur/conf/lightning.toml" +# use lightning import data to tidb +run_lightning $cur/conf/lightning.toml + +# check mysql and tidb data +check_sync_diff $cur/conf/diff_config.toml + + diff --git a/dumpling/tests/e2e_csv/conf/diff_config.toml b/dumpling/tests/e2e_csv/conf/diff_config.toml new file mode 100644 index 0000000000000..911a102d6bc5e --- /dev/null +++ b/dumpling/tests/e2e_csv/conf/diff_config.toml @@ -0,0 +1,29 @@ +# diff Configuration. + +check-thread-count = 4 + +export-fix-sql = true + +check-struct-only = false + +[task] + output-dir = "./output" + + source-instances = ["mysql1"] + + target-instance = "tidb0" + + target-check-tables = ["e2e_csv.escape", "e2e_csv.t"] + +[data-sources] +[data-sources.mysql1] +host = "127.0.0.1" +port = 3306 +user = "root" +password = "" + +[data-sources.tidb0] +host = "127.0.0.1" +port = 4000 +user = "root" +password = "" diff --git a/dumpling/tests/e2e_csv/conf/lightning.toml b/dumpling/tests/e2e_csv/conf/lightning.toml new file mode 100644 index 0000000000000..f711ad4082c7a --- /dev/null +++ b/dumpling/tests/e2e_csv/conf/lightning.toml @@ -0,0 +1,29 @@ +### tidb-lightning config + +[lightning] +server-mode = false +level = "error" +check-requirements = false + +[tikv-importer] +backend = "tidb" +on-duplicate = "error" + +[mydumper] +data-source-dir = "/tmp/dumpling_test_result/sql_res.e2e_csv" + +[mydumper.csv] +separator = 'separator-place-holder' +delimiter = "delimiter-place-holder" +header = true +not-null = false +null = '\N' +backslash-escape = backslash-escape-place-holder +trim-last-separator = false + +[tidb] +host = "127.0.0.1" +port = 4000 +user = "root" +password = "" +status-port = 10080 diff --git a/dumpling/tests/e2e_csv/data/e2e_csv-schema-create.sql b/dumpling/tests/e2e_csv/data/e2e_csv-schema-create.sql new file mode 100644 index 0000000000000..f2a7a5d64b75a --- /dev/null +++ b/dumpling/tests/e2e_csv/data/e2e_csv-schema-create.sql @@ -0,0 +1 @@ +CREATE DATABASE `e2e_csv` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin */ /*!80016 DEFAULT ENCRYPTION='N' */; diff --git a/dumpling/tests/e2e_csv/data/e2e_csv.escape-schema.sql b/dumpling/tests/e2e_csv/data/e2e_csv.escape-schema.sql new file mode 120000 index 0000000000000..a65c417f0aed1 --- /dev/null +++ b/dumpling/tests/e2e_csv/data/e2e_csv.escape-schema.sql @@ -0,0 +1 @@ +../../naughty_strings/data/naughty_strings.escape-schema.sql \ No newline at end of file diff --git a/dumpling/tests/e2e_csv/data/e2e_csv.escape.sql b/dumpling/tests/e2e_csv/data/e2e_csv.escape.sql new file mode 120000 index 0000000000000..cdf268a4cdf6c --- /dev/null +++ b/dumpling/tests/e2e_csv/data/e2e_csv.escape.sql @@ -0,0 +1 @@ +../../naughty_strings/data/naughty_strings.escape.sql \ No newline at end of file diff --git a/dumpling/tests/e2e_csv/data/e2e_csv.t-schema.sql b/dumpling/tests/e2e_csv/data/e2e_csv.t-schema.sql new file mode 120000 index 0000000000000..0b0969f9000d5 --- /dev/null +++ b/dumpling/tests/e2e_csv/data/e2e_csv.t-schema.sql @@ -0,0 +1 @@ +../../naughty_strings/data/naughty_strings.t-schema.sql \ No newline at end of file diff --git a/dumpling/tests/e2e_csv/data/e2e_csv.t.sql b/dumpling/tests/e2e_csv/data/e2e_csv.t.sql new file mode 120000 index 0000000000000..b40d5df063562 --- /dev/null +++ b/dumpling/tests/e2e_csv/data/e2e_csv.t.sql @@ -0,0 +1 @@ +../../naughty_strings/data/naughty_strings.t.sql \ No newline at end of file diff --git a/dumpling/tests/e2e_csv/run.sh b/dumpling/tests/e2e_csv/run.sh new file mode 100644 index 0000000000000..d80e321d9294a --- /dev/null +++ b/dumpling/tests/e2e_csv/run.sh @@ -0,0 +1,84 @@ +#!/bin/bash +# +# Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +set -eu +cur=$(cd `dirname $0`; pwd) + +DB_NAME="e2e_csv" + +# drop database on mysql +export DUMPLING_TEST_PORT=3306 +run_sql "drop database if exists $DB_NAME;" + +run_sql_file "$DUMPLING_BASE_NAME/data/e2e_csv-schema-create.sql" +export DUMPLING_TEST_DATABASE="e2e_csv" +run_sql_file "$DUMPLING_BASE_NAME/data/e2e_csv.escape-schema.sql" +run_sql_file "$DUMPLING_BASE_NAME/data/e2e_csv.escape.sql" +run_sql_file "$DUMPLING_BASE_NAME/data/e2e_csv.t-schema.sql" + +mkdir -p $DUMPLING_TEST_DIR/data +# lightning will omit empty lines without delimiters now, skip these cases +sed "s/('')/-- ('')/g" "$DUMPLING_BASE_NAME/data/e2e_csv.t.sql" | sed "s/(' ')/-- (' ')/g" > $DUMPLING_TEST_DIR/data/e2e_csv.t.sql +run_sql_file "$DUMPLING_TEST_DIR/data/e2e_csv.t.sql" + +run() { + echo "*** running subtest case ***" + echo "escape_backslash is $escape_backslash" + echo "csv_delimiter is $csv_delimiter" + echo "csv_separator is $csv_separator" + + # drop database on tidb + export DUMPLING_TEST_PORT=4000 + export DUMPLING_TEST_DATABASE="" + run_sql "drop database if exists $DB_NAME;" + + # dumping + export DUMPLING_TEST_PORT=3306 + export DUMPLING_TEST_DATABASE=$DB_NAME + run_dumpling --filetype="csv" --escape-backslash=$escape_backslash --csv-delimiter="$csv_delimiter" --csv-separator="$csv_separator" + + # construct lightning configuration + mkdir -p $DUMPLING_TEST_DIR/conf + cp "$cur/conf/lightning.toml" $DUMPLING_TEST_DIR/conf + + sed -i -e "s/separator-place-holder/$csv_separator/g" $DUMPLING_TEST_DIR/conf/lightning.toml + csv_delimiter_holder=$csv_delimiter + if [ "$csv_delimiter" = '"' ]; then + # We want to replace delimiter-place-holder in lightning.toml to \", + # but sed will identify \" as ", so we need to use \\\" here. + csv_delimiter_holder='\\\"' + fi + sed -i -e "s/delimiter-place-holder/$csv_delimiter_holder/g" $DUMPLING_TEST_DIR/conf/lightning.toml + escape_backslash_holder="true" + if [ "$escape_backslash" = "false" ] && [ "$csv_delimiter" != "" ]; then + escape_backslash_holder="false" + fi + sed -i -e "s/backslash-escape-place-holder/$escape_backslash_holder/g" $DUMPLING_TEST_DIR/conf/lightning.toml + + cat "$DUMPLING_TEST_DIR/conf/lightning.toml" + # use lightning import data to tidb + run_lightning $DUMPLING_TEST_DIR/conf/lightning.toml + + # check mysql and tidb data + check_sync_diff $cur/conf/diff_config.toml +} + +escape_backslash_arr="true false" +csv_delimiter_arr="\" '" +csv_separator_arr=', a aa |*|' + +for escape_backslash in $escape_backslash_arr +do + for csv_separator in $csv_separator_arr + do + for csv_delimiter in $csv_delimiter_arr + do + run + done + if [ "$escape_backslash" = "true" ]; then + csv_delimiter="" + run + fi + done +done diff --git a/dumpling/tests/empty_database/run.sh b/dumpling/tests/empty_database/run.sh new file mode 100644 index 0000000000000..67ee1c0479709 --- /dev/null +++ b/dumpling/tests/empty_database/run.sh @@ -0,0 +1,23 @@ +#!/bin/sh +# +# Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +set -eu +cur=$(cd `dirname $0`; pwd) + +DB_NAME="empty_test" + +# drop database on mysql +run_sql "drop database if exists \`$DB_NAME\`;" + +# build data on mysql +run_sql "create database \`$DB_NAME\`;" + +# dumping +export DUMPLING_TEST_DATABASE=$DB_NAME +run_dumpling + +sql="CREATE DATABASE \`$DB_NAME\`" +cnt=$(sed "s/$sql/$sql\n/g" $DUMPLING_OUTPUT_DIR/$DB_NAME-schema-create.sql | grep -c "$sql") || true +[ $cnt = 1 ] + diff --git a/dumpling/tests/file_size/run.sh b/dumpling/tests/file_size/run.sh new file mode 100644 index 0000000000000..ed8879f62b42d --- /dev/null +++ b/dumpling/tests/file_size/run.sh @@ -0,0 +1,31 @@ +#!/bin/sh +# +# Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +set -eu + +run_sql "drop database if exists file_size" +run_sql "create database file_size" +export DUMPLING_TEST_DATABASE=file_size +run_sql "create table t (a varchar(255))" + +chars_20="1111_0000_1111_0000_" + +# insert 100 records, each occupies 20 bytes +run_sql "insert into t values $(seq -s, 100 | sed 's/,*$//g' | sed "s/[0-9]*/('$chars_20')/g");" + +# dumping with file size = 311 bytes, actually 10 rows +run_dumpling -F 311B + +# the dumping result is expected to be: +# 10 files for insertion(each conatins 10 records / 200 bytes) +file_num=$(find "$DUMPLING_OUTPUT_DIR" -maxdepth 1 -iname "file_size.t.*.sql" | wc -l) +if [ "$file_num" -ne 10 ]; then + echo "obtain file number: $file_num, but expect: 10" && exit 1 +fi + +total_lines=$(find "$DUMPLING_OUTPUT_DIR" -maxdepth 1 -iname "file_size.t.*.sql" -print0 \ + | xargs -0 cat | grep "$chars_20" -c) +if [ ! "$total_lines" = 100 ]; then + echo "obtain record number: $total_lines, but expect: 100" && exit 1 +fi diff --git a/dumpling/tests/ignore_generate_column/conf/diff_config.toml b/dumpling/tests/ignore_generate_column/conf/diff_config.toml new file mode 100644 index 0000000000000..8b4dc38e7cca6 --- /dev/null +++ b/dumpling/tests/ignore_generate_column/conf/diff_config.toml @@ -0,0 +1,29 @@ +# diff Configuration. + +check-thread-count = 4 + +export-fix-sql = true + +check-struct-only = false + +[task] + output-dir = "./output" + + source-instances = ["mysql1"] + + target-instance = "tidb0" + + target-check-tables = ["ignore_generate.t"] + +[data-sources] +[data-sources.mysql1] +host = "127.0.0.1" +port = 3306 +user = "root" +password = "" + +[data-sources.tidb0] +host = "127.0.0.1" +port = 4000 +user = "root" +password = "" diff --git a/dumpling/tests/ignore_generate_column/conf/lightning.toml b/dumpling/tests/ignore_generate_column/conf/lightning.toml new file mode 100644 index 0000000000000..ce9994269e2e1 --- /dev/null +++ b/dumpling/tests/ignore_generate_column/conf/lightning.toml @@ -0,0 +1,20 @@ +### tidb-lightning config + +[lightning] +server-mode = false +level = "error" +check-requirements = false + +[tikv-importer] +backend="tidb" +on-duplicate = "error" + +[mydumper] +data-source-dir = "/tmp/dumpling_test_result/sql_res.ignore_generate_column" + +[tidb] +host = "127.0.0.1" +port = 4000 +user = "root" +password = "" +status-port = 10080 diff --git a/dumpling/tests/ignore_generate_column/run.sh b/dumpling/tests/ignore_generate_column/run.sh new file mode 100644 index 0000000000000..6812e2b3bca51 --- /dev/null +++ b/dumpling/tests/ignore_generate_column/run.sh @@ -0,0 +1,39 @@ +#!/bin/sh +# +# Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +set -eu +cur=$(cd `dirname $0`; pwd) + +DB_NAME="ignore_generate" +TABLE_NAME="t" + +# drop database on tidb +export DUMPLING_TEST_PORT=4000 +run_sql "drop database if exists $DB_NAME;" + +# drop database on mysql +export DUMPLING_TEST_PORT=3306 +run_sql "drop database if exists $DB_NAME;" + +# build data on mysql +run_sql "create database $DB_NAME;" + +# build data with generate column full_name +run_sql "create table $DB_NAME.$TABLE_NAME(first_name varchar(14) NOT NULL, last_name varchar(16) NOT NULL, full_name VARCHAR(30) AS (CONCAT(first_name,'-',last_name))) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;" + +# insert 100 records +run_sql "insert into $DB_NAME.$TABLE_NAME (first_name, last_name) values $(seq -s, 100 | sed 's/,*$//g' | sed "s/[0-9]*/('a', 'b')/g");" + +# dumping +export DUMPLING_TEST_DATABASE=$DB_NAME +run_dumpling + +cat "$cur/conf/lightning.toml" +# use lightning import data to tidb +run_lightning $cur/conf/lightning.toml + +# check mysql and tidb data +check_sync_diff $cur/conf/diff_config.toml + + diff --git a/dumpling/tests/naughty_strings/data/naughty_strings-schema-create.sql b/dumpling/tests/naughty_strings/data/naughty_strings-schema-create.sql new file mode 100644 index 0000000000000..f04ac68867d9d --- /dev/null +++ b/dumpling/tests/naughty_strings/data/naughty_strings-schema-create.sql @@ -0,0 +1 @@ +CREATE DATABASE `naughty_strings` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin */ /*!80016 DEFAULT ENCRYPTION='N' */; diff --git a/dumpling/tests/naughty_strings/data/naughty_strings.escape-schema.sql b/dumpling/tests/naughty_strings/data/naughty_strings.escape-schema.sql new file mode 100644 index 0000000000000..ddc9564c15280 --- /dev/null +++ b/dumpling/tests/naughty_strings/data/naughty_strings.escape-schema.sql @@ -0,0 +1,4 @@ +CREATE TABLE `escape` ( + `a` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin, + `b` varchar(13) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; diff --git a/dumpling/tests/naughty_strings/data/naughty_strings.escape.sql b/dumpling/tests/naughty_strings/data/naughty_strings.escape.sql new file mode 100644 index 0000000000000..1fa1d0d223013 --- /dev/null +++ b/dumpling/tests/naughty_strings/data/naughty_strings.escape.sql @@ -0,0 +1,11 @@ +/*!40101 SET NAMES binary*/; +INSERT INTO `escape` VALUES +('''', '"'), +('"', ''''''), +('''''', '""'), +('""', '''"'''), +('''"''', '"''''''"''"'), +('"''''''''"''"', '"''"''''''''''"'), +('"''"''"''''''''"', ''), +('a",b,"a', 'a,"c",a'), +('bbaa|*|aabb', 'bba|*|a|*|abb'); diff --git a/dumpling/tests/naughty_strings/data/naughty_strings.t-schema.sql b/dumpling/tests/naughty_strings/data/naughty_strings.t-schema.sql new file mode 100644 index 0000000000000..f38d2eb9c355c --- /dev/null +++ b/dumpling/tests/naughty_strings/data/naughty_strings.t-schema.sql @@ -0,0 +1,3 @@ +CREATE TABLE `t` ( + `a` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; diff --git a/dumpling/tests/naughty_strings/data/naughty_strings.t.sql b/dumpling/tests/naughty_strings/data/naughty_strings.t.sql new file mode 100644 index 0000000000000..fa5d74f15f934 --- /dev/null +++ b/dumpling/tests/naughty_strings/data/naughty_strings.t.sql @@ -0,0 +1,513 @@ +/*!40101 SET NAMES binary*/; +INSERT INTO `t` VALUES +(''), +('undefined'), +('undef'), +('null'), +('NULL'), +('(null)'), +('nil'), +('NIL'), +('true'), +('false'), +('True'), +('False'), +('TRUE'), +('FALSE'), +('None'), +('hasOwnProperty'), +('then'), +('\\'), +('\\\\'), +('0'), +('1'), +('1.00'), +('$1.00'), +('1/2'), +('1E2'), +('1E02'), +('1E+02'), +('-1'), +('-1.00'), +('-$1.00'), +('-1/2'), +('-1E2'), +('-1E02'), +('-1E+02'), +('1/0'), +('0/0'), +('-2147483648/-1'), +('-9223372036854775808/-1'), +('-0'), +('-0.0'), +('+0'), +('+0.0'), +('0.00'), +('0..0'), +('.'), +('0.0.0'), +('0,00'), +('0,,0'), +(','), +('0,0,0'), +('0.0/0'), +('1.0/0.0'), +('0.0/0.0'), +('1,0/0,0'), +('0,0/0,0'), +('--1'), +('-'), +('-.'), +('-,'), +('999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999'), +('NaN'), +('Infinity'), +('-Infinity'), +('INF'), +('1#INF'), +('-1#IND'), +('1#QNAN'), +('1#SNAN'), +('1#IND'), +('0x0'), +('0xffffffff'), +('0xffffffffffffffff'), +('0xabad1dea'), +('123456789012345678901234567890123456789'), +('1,000.00'), +('1 000.00'), +('1''000.00'), +('1,000,000.00'), +('1 000 000.00'), +('1''000''000.00'), +('1.000,00'), +('1 000,00'), +('1''000,00'), +('1.000.000,00'), +('1 000 000,00'), +('1''000''000,00'), +('01000'), +('08'), +('09'), +('2.2250738585072011e-308'), +(',./;''[]\\-='), +('<>?:"{}|_+'), +('!@#$%^&*()`~'), +(''), +('€‚ƒ„†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ'), +(' …             ​

   '), +('­؀؁؂؃؄؅؜۝܏᠎​‌‍‎‏‪‫‬‭‮⁠⁡⁢⁣⁤⁦⁧⁨⁩𑂽𛲠𛲡𛲢𛲣𝅳𝅴𝅵𝅶𝅷𝅸𝅹𝅺󠀁󠀠󠀡󠀢󠀣󠀤󠀥󠀦󠀧󠀨󠀩󠀪󠀫󠀬󠀭󠀮󠀯󠀰󠀱󠀲󠀳󠀴󠀵󠀶󠀷󠀸󠀹󠀺󠀻󠀼󠀽󠀾󠀿󠁀󠁁󠁂󠁃󠁄󠁅󠁆󠁇󠁈󠁉󠁊󠁋󠁌󠁍󠁎󠁏󠁐󠁑󠁒󠁓󠁔󠁕󠁖󠁗󠁘󠁙󠁚󠁛󠁜󠁝󠁞󠁟󠁠󠁡󠁢󠁣󠁤󠁥󠁦󠁧󠁨󠁩󠁪󠁫󠁬󠁭󠁮󠁯󠁰󠁱󠁲󠁳󠁴󠁵󠁶󠁷󠁸󠁹󠁺󠁻󠁼󠁽󠁾󠁿'), +(''), +('￾'), +('Ω≈ç√∫˜µ≤≥÷'), +('åß∂ƒ©˙∆˚¬…æ'), +('œ∑´®†¥¨ˆøπ“‘'), +('¡™£¢∞§¶•ªº–≠'), +('¸˛Ç◊ı˜Â¯˘¿'), +('ÅÍÎÏ˝ÓÔÒÚÆ☃'), +('Œ„´‰ˇÁ¨ˆØ∏”’'), +('`⁄€‹›fifl‡°·‚—±'), +('⅛⅜⅝⅞'), +('ЁЂЃЄЅІЇЈЉЊЋЌЍЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя'), +('٠١٢٣٤٥٦٧٨٩'), +('⁰⁴⁵'), +('₀₁₂'), +('⁰⁴⁵₀₁₂'), +('ด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็ ด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็ ด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็'), +(''''), +('"'), +(''''''), +('""'), +('''"'''), +('"''''''''"''"'), +('"''"''"''''''''"'), +(''), +(''), +(''), +(''), +('田中さんにあげて下さい'), +('パーティーへ行かないか'), +('和製漢語'), +('部落格'), +('사회과학원 어학연구소'), +('찦차를 타고 온 펲시맨과 쑛다리 똠방각하'), +('社會科學院語學研究所'), +('울란바토르'), +('𠜎𠜱𠝹𠱓𠱸𠲖𠳏'), +('𐐜 𐐔𐐇𐐝𐐀𐐡𐐇𐐓 𐐙𐐊𐐡𐐝𐐓/𐐝𐐇𐐗𐐊𐐤𐐔 𐐒𐐋𐐗 𐐒𐐌 𐐜 𐐡𐐀𐐖𐐇𐐤𐐓𐐝 𐐱𐑂 𐑄 𐐔𐐇𐐝𐐀𐐡𐐇𐐓 𐐏𐐆𐐅𐐤𐐆𐐚𐐊𐐡𐐝𐐆𐐓𐐆'), +('表ポあA鷗ŒéB逍Üߪąñ丂㐀𠀀'), +('Ⱥ'), +('Ⱦ'), +('ヽ༼ຈل͜ຈ༽ノ ヽ༼ຈل͜ຈ༽ノ'), +('(。◕ ∀ ◕。)'), +('`ィ(´∀`∩'), +('__ロ(,_,*)'), +('・( ̄∀ ̄)・:*:'), +('゚・✿ヾ╲(。◕‿◕。)╱✿・゚'), +(',。・:*:・゜’( ☻ ω ☻ )。・:*:・゜’'), +('(╯°□°)╯︵ ┻━┻)'), +('(ノಥ益ಥ)ノ ┻━┻'), +('┬─┬ノ( º _ ºノ)'), +('( ͡° ͜ʖ ͡°)'), +('¯\\_(ツ)_/¯'), +('😍'), +('👩🏽'), +('👨‍🦰 👨🏿‍🦰 👨‍🦱 👨🏿‍🦱 🦹🏿‍♂️'), +('👾 🙇 💁 🙅 🙆 🙋 🙎 🙍'), +('🐵 🙈 🙉 🙊'), +('❤️ 💔 💌 💕 💞 💓 💗 💖 💘 💝 💟 💜 💛 💚 💙'), +('✋🏿 💪🏿 👐🏿 🙌🏿 👏🏿 🙏🏿'), +('🚾 🆒 🆓 🆕 🆖 🆗 🆙 🏧'), +('0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟'), +('🇺🇸🇷🇺🇸 🇦🇫🇦🇲🇸'), +('🇺🇸🇷🇺🇸🇦🇫🇦🇲'), +('🇺🇸🇷🇺🇸🇦'), +('123'), +('١٢٣'), +('ثم نفس سقطت وبالتحديد،, جزيرتي باستخدام أن دنو. إذ هنا؟ الستار وتنصيب كان. أهّل ايطاليا، بريطانيا-فرنسا قد أخذ. سليمان، إتفاقية بين ما, يذكر الحدود أي بعد, معاملة بولندا، الإطلاق عل إيو.'), +('בְּרֵאשִׁית, בָּרָא אֱלֹהִים, אֵת הַשָּׁמַיִם, וְאֵת הָאָרֶץ'), +('הָיְתָהtestالصفحات التّحول'), +('﷽'), +('ﷺ'), +('مُنَاقَشَةُ سُبُلِ اِسْتِخْدَامِ اللُّغَةِ فِي النُّظُمِ الْقَائِمَةِ وَفِيم يَخُصَّ التَّطْبِيقَاتُ الْحاسُوبِيَّةُ، '), +('᚛ᚄᚓᚐᚋᚒᚄ ᚑᚄᚂᚑᚏᚅ᚜‪‪‪'), +('‪‪᚛                 ᚜‪'), +('‪‪test‪'), +('‫test‫'), +('
test
'), +('test⁠test‫'), +('⁦test⁧'), +('Ṱ̺̺̕o͞ ̷i̲̬͇̪͙n̝̗͕v̟̜̘̦͟o̶̙̰̠kè͚̮̺̪̹̱̤ ̖t̝͕̳̣̻̪͞h̼͓̲̦̳̘̲e͇̣̰̦̬͎ ̢̼̻̱̘h͚͎͙̜̣̲ͅi̦̲̣̰̤v̻͍e̺̭̳̪̰-m̢iͅn̖̺̞̲̯̰d̵̼̟͙̩̼̘̳ ̞̥̱̳̭r̛̗̘e͙p͠r̼̞̻̭̗e̺̠̣͟s̘͇̳͍̝͉e͉̥̯̞̲͚̬͜ǹ̬͎͎̟̖͇̤t͍̬̤͓̼̭͘ͅi̪̱n͠g̴͉ ͏͉ͅc̬̟h͡a̫̻̯͘o̫̟̖͍̙̝͉s̗̦̲.̨̹͈̣'), +('̡͓̞ͅI̗̘̦͝n͇͇͙v̮̫ok̲̫̙͈i̖͙̭̹̠̞n̡̻̮̣̺g̲͈͙̭͙̬͎ ̰t͔̦h̞̲e̢̤ ͍̬̲͖f̴̘͕̣è͖ẹ̥̩l͖͔͚i͓͚̦͠n͖͍̗͓̳̮g͍ ̨o͚̪͡f̘̣̬ ̖̘͖̟͙̮c҉͔̫͖͓͇͖ͅh̵̤̣͚͔á̗̼͕ͅo̼̣̥s̱͈̺̖̦̻͢.̛̖̞̠̫̰'), +('̗̺͖̹̯͓Ṯ̤͍̥͇͈h̲́e͏͓̼̗̙̼̣͔ ͇̜̱̠͓͍ͅN͕͠e̗̱z̘̝̜̺͙p̤̺̹͍̯͚e̠̻̠͜r̨̤͍̺̖͔̖̖d̠̟̭̬̝͟i̦͖̩͓͔̤a̠̗̬͉̙n͚͜ ̻̞̰͚ͅh̵͉i̳̞v̢͇ḙ͎͟-҉̭̩̼͔m̤̭̫i͕͇̝̦n̗͙ḍ̟ ̯̲͕͞ǫ̟̯̰̲͙̻̝f ̪̰̰̗̖̭̘͘c̦͍̲̞͍̩̙ḥ͚a̮͎̟̙͜ơ̩̹͎s̤.̝̝ ҉Z̡̖̜͖̰̣͉̜a͖̰͙̬͡l̲̫̳͍̩g̡̟̼̱͚̞̬ͅo̗͜.̟'), +('̦H̬̤̗̤͝e͜ ̜̥̝̻͍̟́w̕h̖̯͓o̝͙̖͎̱̮ ҉̺̙̞̟͈W̷̼̭a̺̪͍į͈͕̭͙̯̜t̶̼̮s̘͙͖̕ ̠̫̠B̻͍͙͉̳ͅe̵h̵̬͇̫͙i̹͓̳̳̮͎̫̕n͟d̴̪̜̖ ̰͉̩͇͙̲͞ͅT͖̼͓̪͢h͏͓̮̻e̬̝̟ͅ ̤̹̝W͙̞̝͔͇͝ͅa͏͓͔̹̼̣l̴͔̰̤̟͔ḽ̫.͕'), +('Z̮̞̠͙͔ͅḀ̗̞͈̻̗Ḷ͙͎̯̹̞͓G̻O̭̗̮'), +('˙ɐnbᴉlɐ ɐuƃɐɯ ǝɹolop ʇǝ ǝɹoqɐl ʇn ʇunpᴉpᴉɔuᴉ ɹodɯǝʇ poɯsnᴉǝ op pǝs ''ʇᴉlǝ ƃuᴉɔsᴉdᴉpɐ ɹnʇǝʇɔǝsuoɔ ''ʇǝɯɐ ʇᴉs ɹolop ɯnsdᴉ ɯǝɹo˥'), +('00˙Ɩ$-'), +('The quick brown fox jumps over the lazy dog'), +('𝐓𝐡𝐞 𝐪𝐮𝐢𝐜𝐤 𝐛𝐫𝐨𝐰𝐧 𝐟𝐨𝐱 𝐣𝐮𝐦𝐩𝐬 𝐨𝐯𝐞𝐫 𝐭𝐡𝐞 𝐥𝐚𝐳𝐲 𝐝𝐨𝐠'), +('𝕿𝖍𝖊 𝖖𝖚𝖎𝖈𝖐 𝖇𝖗𝖔𝖜𝖓 𝖋𝖔𝖝 𝖏𝖚𝖒𝖕𝖘 𝖔𝖛𝖊𝖗 𝖙𝖍𝖊 𝖑𝖆𝖟𝖞 𝖉𝖔𝖌'), +('𝑻𝒉𝒆 𝒒𝒖𝒊𝒄𝒌 𝒃𝒓𝒐𝒘𝒏 𝒇𝒐𝒙 𝒋𝒖𝒎𝒑𝒔 𝒐𝒗𝒆𝒓 𝒕𝒉𝒆 𝒍𝒂𝒛𝒚 𝒅𝒐𝒈'), +('𝓣𝓱𝓮 𝓺𝓾𝓲𝓬𝓴 𝓫𝓻𝓸𝔀𝓷 𝓯𝓸𝔁 𝓳𝓾𝓶𝓹𝓼 𝓸𝓿𝓮𝓻 𝓽𝓱𝓮 𝓵𝓪𝔃𝔂 𝓭𝓸𝓰'), +('𝕋𝕙𝕖 𝕢𝕦𝕚𝕔𝕜 𝕓𝕣𝕠𝕨𝕟 𝕗𝕠𝕩 𝕛𝕦𝕞𝕡𝕤 𝕠𝕧𝕖𝕣 𝕥𝕙𝕖 𝕝𝕒𝕫𝕪 𝕕𝕠𝕘'), +('𝚃𝚑𝚎 𝚚𝚞𝚒𝚌𝚔 𝚋𝚛𝚘𝚠𝚗 𝚏𝚘𝚡 𝚓𝚞𝚖𝚙𝚜 𝚘𝚟𝚎𝚛 𝚝𝚑𝚎 𝚕𝚊𝚣𝚢 𝚍𝚘𝚐'), +('⒯⒣⒠ ⒬⒰⒤⒞⒦ ⒝⒭⒪⒲⒩ ⒡⒪⒳ ⒥⒰⒨⒫⒮ ⒪⒱⒠⒭ ⒯⒣⒠ ⒧⒜⒵⒴ ⒟⒪⒢'), +(''), +('<script>alert('123');</script>'), +(''), +(''), +('">'), +('''>'), +('>'), +(''), +('< / script >< script >alert(123)< / script >'), +(' onfocus=JaVaSCript:alert(123) autofocus'), +('" onfocus=JaVaSCript:alert(123) autofocus'), +(''' onfocus=JaVaSCript:alert(123) autofocus'), +('<script>alert(123)</script>'), +('ript>alert(123)ript>'), +('-->'), +('";alert(123);t="'), +(''';alert(123);t='''), +('JavaSCript:alert(123)'), +(';alert(123);'), +('src=JaVaSCript:prompt(132)'), +('">javascript:alert(1);'), +('javascript:alert(1);'), +('javascript:alert(1);'), +('javascript:alert(1);'), +('javascript:alert(1);'), +('javascript:alert(1);'), +('javascript:alert(1);'), +('''`"><\\x3Cscript>javascript:alert(1)'), +('''`"><\\x00script>javascript:alert(1)'), +('ABC
DEF'), +('ABC
DEF'), +('ABC
DEF'), +('ABC
DEF'), +('ABC
DEF'), +('ABC
DEF'), +('ABC
DEF'), +('ABC
DEF'), +('ABC
DEF'), +('ABC
DEF'), +('ABC
DEF'), +('ABC
DEF'), +('ABC
DEF'), +('ABC
DEF'), +('ABC
DEF'), +('ABC
DEF'), +('ABC
DEF'), +('ABC
DEF'), +('ABC
DEF'), +('ABC
DEF'), +('ABC
DEF'), +('ABC
DEF'), +('ABC
DEF'), +('ABC
DEF'), +('ABC
DEF'), +('ABC
DEF'), +('ABC
DEF'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('test'), +('`"''>'), +('`"''>'), +('`"''>'), +('`"''>'), +('`"''>'), +('`"''>'), +('`"''>'), +('`"''>'), +('`"''>'), +('`"''>'), +('"`''>'), +('"`''>'), +('"`''>'), +('"`''>'), +('"`''>'), +('"`''>'), +('"`''>'), +('"`''>'), +('"`''>'), +('"`''>'), +('"`''>'), +('"`''>'), +('"`''>'), +('"`''>'), +('"`''>'), +('"`''>'), +('"`''>'), +('"`''>'), +('"`''>'), +('"`''>'), +('"`''>'), +('"`''>'), +('"`''>'), +('"`''>'), +('"`''>'), +('"`''>'), +('"`''>'), +('"`''>'), +('"`''>'), +('"`''>'), +('"`''>'), +('"`''>'), +('"`''>'), +('"`''>'), +('"`''>'), +('"`''>'), +('"`''>'), +(''), +(''), +(''), +(''), +(''), +(''), +(''), +(''), +(''), +(''), +(''), +(''), +(''), +(''), +(''), +(''), +(''), +(''), +(''), +(''), +(''), +(''), +(''), +(''), +(''), +(''), +(''), +(''), +(''), +(''), +(''), +(''), +(''), +(''), +('XXX'), +(''), +(''), +(''), +('<a href=http://foo.bar/#x=`y></a><img alt="`><img src=x:x onerror=javascript:alert(1)></a>">'), +('<!--[if]><script>javascript:alert(1)</script -->'), +('<!--[if<img src=x onerror=javascript:alert(1)//]> -->'), +('<script src="/\\%(jscript)s"></script>'), +('<script src="\\\\%(jscript)s"></script>'), +('<IMG """><SCRIPT>alert("XSS")</SCRIPT>">'), +('<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>'), +('<IMG SRC=# onmouseover="alert(''xxs'')">'), +('<IMG SRC= onmouseover="alert(''xxs'')">'), +('<IMG onmouseover="alert(''xxs'')">'), +('<IMG SRC=javascript:alert('XSS')>'), +('<IMG SRC=javascript:alert('XSS')>'), +('<IMG SRC=javascript:alert('XSS')>'), +('<IMG SRC="jav ascript:alert(''XSS'');">'), +('<IMG SRC="jav ascript:alert(''XSS'');">'), +('<IMG SRC="jav ascript:alert(''XSS'');">'), +('<IMG SRC="jav ascript:alert(''XSS'');">'), +('perl -e ''print "<IMG SRC=java\\0script:alert(\\"XSS\\")>";'' > out'), +('<IMG SRC="  javascript:alert(''XSS'');">'), +('<SCRIPT/XSS SRC="http://ha.ckers.org/xss.js"></SCRIPT>'), +('<BODY onload!#$%&()*~+-_.,:;?@[/|\\]^`=alert("XSS")>'), +('<SCRIPT/SRC="http://ha.ckers.org/xss.js"></SCRIPT>'), +('<<SCRIPT>alert("XSS");//<</SCRIPT>'), +('<SCRIPT SRC=http://ha.ckers.org/xss.js?< B >'), +('<SCRIPT SRC=//ha.ckers.org/.j>'), +('<IMG SRC="javascript:alert(''XSS'')"'), +('<iframe src=http://ha.ckers.org/scriptlet.html <'), +('\\";alert(''XSS'');//'), +('<u oncopy=alert()> Copy me</u>'), +('<i onwheel=alert(1)> Scroll over me </i>'), +('<plaintext>'), +('http://a/%%30%30'), +('</textarea><script>alert(123)</script>'), +('1;DROP TABLE users'), +('1''; DROP TABLE users-- 1'), +(''' OR 1=1 -- 1'), +(''' OR ''1''=''1'), +(' '), +('%'), +('_'), +('-'), +('--'), +('--version'), +('--help'), +('$USER'), +('/dev/null; touch /tmp/blns.fail ; echo'), +('`touch /tmp/blns.fail`'), +('$(touch /tmp/blns.fail)'), +('@{[system "touch /tmp/blns.fail"]}'), +('eval("puts ''hello world''")'), +('System("ls -al /")'), +('`ls -al /`'), +('Kernel.exec("ls -al /")'), +('Kernel.exit(1)'), +('%x(''ls -al /'')'), +('<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE foo [ <!ELEMENT foo ANY ><!ENTITY xxe SYSTEM "file:///etc/passwd" >]><foo>&xxe;</foo>'), +('$HOME'), +('$ENV{''HOME''}'), +('%d'), +('%s%s%s%s%s'), +('{0}'), +('%*.*s'), +('%@'), +('%n'), +('File:///'), +('../../../../../../../../../../../etc/passwd%00'), +('../../../../../../../../../../../etc/hosts'), +('() { 0; }; touch /tmp/blns.shellshock1.fail;'), +('() { _; } >_[$($())] { touch /tmp/blns.shellshock2.fail; }'), +('<<< %s(un=''%s'') = %u'), +('+++ATH0'), +('CON'), +('PRN'), +('AUX'), +('CLOCK$'), +('NUL'), +('A:'), +('ZZ:'), +('COM1'), +('LPT1'), +('LPT2'), +('LPT3'), +('COM2'), +('COM3'), +('COM4'), +('DCC SEND STARTKEYLOGGER 0 0 0'), +('Scunthorpe General Hospital'), +('Penistone Community Church'), +('Lightwater Country Park'), +('Jimmy Clitheroe'), +('Horniman Museum'), +('shitake mushrooms'), +('RomansInSussex.co.uk'), +('http://www.cum.qc.ca/'), +('Craig Cockburn, Software Specialist'), +('Linda Callahan'), +('Dr. Herman I. Libshitz'), +('magna cum laude'), +('Super Bowl XXX'), +('medieval erection of parapets'), +('evaluate'), +('mocha'), +('expression'), +('Arsenal canal'), +('classic'), +('Tyson Gay'), +('Dick Van Dyke'), +('basement'), +('If you''re reading this, you''ve been in a coma for almost 20 years now. We''re trying a new technique. We don''t know where this message will end up in your dream, but we hope it works. Please wake up, we miss you.'), +('Roses are red, violets are blue. Hope you enjoy terminal hue'), +('But now...for my greatest trick...'), +('The quick brown fox... [Beeeep]'), +('Powerلُلُصّبُلُلصّبُررً ॣ ॣh ॣ ॣ冗'), +('🏳0🌈️'), +('జ్ఞ‌ా'), +('گچپژ'); diff --git a/dumpling/tests/naughty_strings/expect/naughty_strings.escape.sql b/dumpling/tests/naughty_strings/expect/naughty_strings.escape.sql new file mode 100644 index 0000000000000..bc578c659f4c4 --- /dev/null +++ b/dumpling/tests/naughty_strings/expect/naughty_strings.escape.sql @@ -0,0 +1,11 @@ +/*!40101 SET NAMES binary*/; +INSERT INTO `escape` VALUES +('\'','\"'), +('\"','\'\''), +('\'\'','\"\"'), +('\"\"','\'\"\''), +('\'\"\'','\"\'\'\'\"\'\"'), +('\"\'\'\'\'\"\'\"','\"\'\"\'\'\'\'\'\"'), +('\"\'\"\'\"\'\'\'\'\"',''), +('a\",b,\"a','a,\"c\",a'), +('bbaa|*|aabb','bba|*|a|*|abb'); diff --git a/dumpling/tests/naughty_strings/expect/naughty_strings.t.sql b/dumpling/tests/naughty_strings/expect/naughty_strings.t.sql new file mode 100644 index 0000000000000..1dd0c5ae209a3 --- /dev/null +++ b/dumpling/tests/naughty_strings/expect/naughty_strings.t.sql @@ -0,0 +1,513 @@ +/*!40101 SET NAMES binary*/; +INSERT INTO `t` VALUES +(''), +('undefined'), +('undef'), +('null'), +('NULL'), +('(null)'), +('nil'), +('NIL'), +('true'), +('false'), +('True'), +('False'), +('TRUE'), +('FALSE'), +('None'), +('hasOwnProperty'), +('then'), +('\'), +('\\'), +('0'), +('1'), +('1.00'), +('$1.00'), +('1/2'), +('1E2'), +('1E02'), +('1E+02'), +('-1'), +('-1.00'), +('-$1.00'), +('-1/2'), +('-1E2'), +('-1E02'), +('-1E+02'), +('1/0'), +('0/0'), +('-2147483648/-1'), +('-9223372036854775808/-1'), +('-0'), +('-0.0'), +('+0'), +('+0.0'), +('0.00'), +('0..0'), +('.'), +('0.0.0'), +('0,00'), +('0,,0'), +(','), +('0,0,0'), +('0.0/0'), +('1.0/0.0'), +('0.0/0.0'), +('1,0/0,0'), +('0,0/0,0'), +('--1'), +('-'), +('-.'), +('-,'), +('999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999'), +('NaN'), +('Infinity'), +('-Infinity'), +('INF'), +('1#INF'), +('-1#IND'), +('1#QNAN'), +('1#SNAN'), +('1#IND'), +('0x0'), +('0xffffffff'), +('0xffffffffffffffff'), +('0xabad1dea'), +('123456789012345678901234567890123456789'), +('1,000.00'), +('1 000.00'), +('1''000.00'), +('1,000,000.00'), +('1 000 000.00'), +('1''000''000.00'), +('1.000,00'), +('1 000,00'), +('1''000,00'), +('1.000.000,00'), +('1 000 000,00'), +('1''000''000,00'), +('01000'), +('08'), +('09'), +('2.2250738585072011e-308'), +(',./;''[]\-='), +('<>?:"{}|_+'), +('!@#$%^&*()`~'), +(''), +('€‚ƒ„†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ'), +(' …             ​

   '), +('­؀؁؂؃؄؅؜۝܏᠎​‌‍‎‏‪‫‬‭‮⁠⁡⁢⁣⁤⁦⁧⁨⁩𑂽𛲠𛲡𛲢𛲣𝅳𝅴𝅵𝅶𝅷𝅸𝅹𝅺󠀁󠀠󠀡󠀢󠀣󠀤󠀥󠀦󠀧󠀨󠀩󠀪󠀫󠀬󠀭󠀮󠀯󠀰󠀱󠀲󠀳󠀴󠀵󠀶󠀷󠀸󠀹󠀺󠀻󠀼󠀽󠀾󠀿󠁀󠁁󠁂󠁃󠁄󠁅󠁆󠁇󠁈󠁉󠁊󠁋󠁌󠁍󠁎󠁏󠁐󠁑󠁒󠁓󠁔󠁕󠁖󠁗󠁘󠁙󠁚󠁛󠁜󠁝󠁞󠁟󠁠󠁡󠁢󠁣󠁤󠁥󠁦󠁧󠁨󠁩󠁪󠁫󠁬󠁭󠁮󠁯󠁰󠁱󠁲󠁳󠁴󠁵󠁶󠁷󠁸󠁹󠁺󠁻󠁼󠁽󠁾󠁿'), +(''), +('￾'), +('Ω≈ç√∫˜µ≤≥÷'), +('åß∂ƒ©˙∆˚¬…æ'), +('œ∑´®†¥¨ˆøπ“‘'), +('¡™£¢∞§¶•ªº–≠'), +('¸˛Ç◊ı˜Â¯˘¿'), +('ÅÍÎÏ˝ÓÔÒÚÆ☃'), +('Œ„´‰ˇÁ¨ˆØ∏”’'), +('`⁄€‹›fifl‡°·‚—±'), +('⅛⅜⅝⅞'), +('ЁЂЃЄЅІЇЈЉЊЋЌЍЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя'), +('٠١٢٣٤٥٦٧٨٩'), +('⁰⁴⁵'), +('₀₁₂'), +('⁰⁴⁵₀₁₂'), +('ด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็ ด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็ ด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็'), +(''''), +('"'), +(''''''), +('""'), +('''"'''), +('"''''''''"''"'), +('"''"''"''''''''"'), +('<foo val=“bar” />'), +('<foo val=“bar” />'), +('<foo val=”bar“ />'), +('<foo val=`bar'' />'), +('田中さんにあげて下さい'), +('パーティーへ行かないか'), +('和製漢語'), +('部落格'), +('사회과학원 어학연구소'), +('찦차를 타고 온 펲시맨과 쑛다리 똠방각하'), +('社會科學院語學研究所'), +('울란바토르'), +('𠜎𠜱𠝹𠱓𠱸𠲖𠳏'), +('𐐜 𐐔𐐇𐐝𐐀𐐡𐐇𐐓 𐐙𐐊𐐡𐐝𐐓/𐐝𐐇𐐗𐐊𐐤𐐔 𐐒𐐋𐐗 𐐒𐐌 𐐜 𐐡𐐀𐐖𐐇𐐤𐐓𐐝 𐐱𐑂 𐑄 𐐔𐐇𐐝𐐀𐐡𐐇𐐓 𐐏𐐆𐐅𐐤𐐆𐐚𐐊𐐡𐐝𐐆𐐓𐐆'), +('表ポあA鷗ŒéB逍Üߪąñ丂㐀𠀀'), +('Ⱥ'), +('Ⱦ'), +('ヽ༼ຈل͜ຈ༽ノ ヽ༼ຈل͜ຈ༽ノ'), +('(。◕ ∀ ◕。)'), +('`ィ(´∀`∩'), +('__ロ(,_,*)'), +('・( ̄∀ ̄)・:*:'), +('゚・✿ヾ╲(。◕‿◕。)╱✿・゚'), +(',。・:*:・゜’( ☻ ω ☻ )。・:*:・゜’'), +('(╯°□°)╯︵ ┻━┻)'), +('(ノಥ益ಥ)ノ ┻━┻'), +('┬─┬ノ( º _ ºノ)'), +('( ͡° ͜ʖ ͡°)'), +('¯\_(ツ)_/¯'), +('😍'), +('👩🏽'), +('👨‍🦰 👨🏿‍🦰 👨‍🦱 👨🏿‍🦱 🦹🏿‍♂️'), +('👾 🙇 💁 🙅 🙆 🙋 🙎 🙍'), +('🐵 🙈 🙉 🙊'), +('❤️ 💔 💌 💕 💞 💓 💗 💖 💘 💝 💟 💜 💛 💚 💙'), +('✋🏿 💪🏿 👐🏿 🙌🏿 👏🏿 🙏🏿'), +('🚾 🆒 🆓 🆕 🆖 🆗 🆙 🏧'), +('0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟'), +('🇺🇸🇷🇺🇸 🇦🇫🇦🇲🇸'), +('🇺🇸🇷🇺🇸🇦🇫🇦🇲'), +('🇺🇸🇷🇺🇸🇦'), +('123'), +('١٢٣'), +('ثم نفس سقطت وبالتحديد،, جزيرتي باستخدام أن دنو. إذ هنا؟ الستار وتنصيب كان. أهّل ايطاليا، بريطانيا-فرنسا قد أخذ. سليمان، إتفاقية بين ما, يذكر الحدود أي بعد, معاملة بولندا، الإطلاق عل إيو.'), +('בְּרֵאשִׁית, בָּרָא אֱלֹהִים, אֵת הַשָּׁמַיִם, וְאֵת הָאָרֶץ'), +('הָיְתָהtestالصفحات التّحول'), +('﷽'), +('ﷺ'), +('مُنَاقَشَةُ سُبُلِ اِسْتِخْدَامِ اللُّغَةِ فِي النُّظُمِ الْقَائِمَةِ وَفِيم يَخُصَّ التَّطْبِيقَاتُ الْحاسُوبِيَّةُ، '), +('᚛ᚄᚓᚐᚋᚒᚄ ᚑᚄᚂᚑᚏᚅ᚜‪‪‪'), +('‪‪᚛                 ᚜‪'), +('‪‪test‪'), +('‫test‫'), +('
test
'), +('test⁠test‫'), +('⁦test⁧'), +('Ṱ̺̺̕o͞ ̷i̲̬͇̪͙n̝̗͕v̟̜̘̦͟o̶̙̰̠kè͚̮̺̪̹̱̤ ̖t̝͕̳̣̻̪͞h̼͓̲̦̳̘̲e͇̣̰̦̬͎ ̢̼̻̱̘h͚͎͙̜̣̲ͅi̦̲̣̰̤v̻͍e̺̭̳̪̰-m̢iͅn̖̺̞̲̯̰d̵̼̟͙̩̼̘̳ ̞̥̱̳̭r̛̗̘e͙p͠r̼̞̻̭̗e̺̠̣͟s̘͇̳͍̝͉e͉̥̯̞̲͚̬͜ǹ̬͎͎̟̖͇̤t͍̬̤͓̼̭͘ͅi̪̱n͠g̴͉ ͏͉ͅc̬̟h͡a̫̻̯͘o̫̟̖͍̙̝͉s̗̦̲.̨̹͈̣'), +('̡͓̞ͅI̗̘̦͝n͇͇͙v̮̫ok̲̫̙͈i̖͙̭̹̠̞n̡̻̮̣̺g̲͈͙̭͙̬͎ ̰t͔̦h̞̲e̢̤ ͍̬̲͖f̴̘͕̣è͖ẹ̥̩l͖͔͚i͓͚̦͠n͖͍̗͓̳̮g͍ ̨o͚̪͡f̘̣̬ ̖̘͖̟͙̮c҉͔̫͖͓͇͖ͅh̵̤̣͚͔á̗̼͕ͅo̼̣̥s̱͈̺̖̦̻͢.̛̖̞̠̫̰'), +('̗̺͖̹̯͓Ṯ̤͍̥͇͈h̲́e͏͓̼̗̙̼̣͔ ͇̜̱̠͓͍ͅN͕͠e̗̱z̘̝̜̺͙p̤̺̹͍̯͚e̠̻̠͜r̨̤͍̺̖͔̖̖d̠̟̭̬̝͟i̦͖̩͓͔̤a̠̗̬͉̙n͚͜ ̻̞̰͚ͅh̵͉i̳̞v̢͇ḙ͎͟-҉̭̩̼͔m̤̭̫i͕͇̝̦n̗͙ḍ̟ ̯̲͕͞ǫ̟̯̰̲͙̻̝f ̪̰̰̗̖̭̘͘c̦͍̲̞͍̩̙ḥ͚a̮͎̟̙͜ơ̩̹͎s̤.̝̝ ҉Z̡̖̜͖̰̣͉̜a͖̰͙̬͡l̲̫̳͍̩g̡̟̼̱͚̞̬ͅo̗͜.̟'), +('̦H̬̤̗̤͝e͜ ̜̥̝̻͍̟́w̕h̖̯͓o̝͙̖͎̱̮ ҉̺̙̞̟͈W̷̼̭a̺̪͍į͈͕̭͙̯̜t̶̼̮s̘͙͖̕ ̠̫̠B̻͍͙͉̳ͅe̵h̵̬͇̫͙i̹͓̳̳̮͎̫̕n͟d̴̪̜̖ ̰͉̩͇͙̲͞ͅT͖̼͓̪͢h͏͓̮̻e̬̝̟ͅ ̤̹̝W͙̞̝͔͇͝ͅa͏͓͔̹̼̣l̴͔̰̤̟͔ḽ̫.͕'), +('Z̮̞̠͙͔ͅḀ̗̞͈̻̗Ḷ͙͎̯̹̞͓G̻O̭̗̮'), +('˙ɐnbᴉlɐ ɐuƃɐɯ ǝɹolop ʇǝ ǝɹoqɐl ʇn ʇunpᴉpᴉɔuᴉ ɹodɯǝʇ poɯsnᴉǝ op pǝs ''ʇᴉlǝ ƃuᴉɔsᴉdᴉpɐ ɹnʇǝʇɔǝsuoɔ ''ʇǝɯɐ ʇᴉs ɹolop ɯnsdᴉ ɯǝɹo˥'), +('00˙Ɩ$-'), +('The quick brown fox jumps over the lazy dog'), +('𝐓𝐡𝐞 𝐪𝐮𝐢𝐜𝐤 𝐛𝐫𝐨𝐰𝐧 𝐟𝐨𝐱 𝐣𝐮𝐦𝐩𝐬 𝐨𝐯𝐞𝐫 𝐭𝐡𝐞 𝐥𝐚𝐳𝐲 𝐝𝐨𝐠'), +('𝕿𝖍𝖊 𝖖𝖚𝖎𝖈𝖐 𝖇𝖗𝖔𝖜𝖓 𝖋𝖔𝖝 𝖏𝖚𝖒𝖕𝖘 𝖔𝖛𝖊𝖗 𝖙𝖍𝖊 𝖑𝖆𝖟𝖞 𝖉𝖔𝖌'), +('𝑻𝒉𝒆 𝒒𝒖𝒊𝒄𝒌 𝒃𝒓𝒐𝒘𝒏 𝒇𝒐𝒙 𝒋𝒖𝒎𝒑𝒔 𝒐𝒗𝒆𝒓 𝒕𝒉𝒆 𝒍𝒂𝒛𝒚 𝒅𝒐𝒈'), +('𝓣𝓱𝓮 𝓺𝓾𝓲𝓬𝓴 𝓫𝓻𝓸𝔀𝓷 𝓯𝓸𝔁 𝓳𝓾𝓶𝓹𝓼 𝓸𝓿𝓮𝓻 𝓽𝓱𝓮 𝓵𝓪𝔃𝔂 𝓭𝓸𝓰'), +('𝕋𝕙𝕖 𝕢𝕦𝕚𝕔𝕜 𝕓𝕣𝕠𝕨𝕟 𝕗𝕠𝕩 𝕛𝕦𝕞𝕡𝕤 𝕠𝕧𝕖𝕣 𝕥𝕙𝕖 𝕝𝕒𝕫𝕪 𝕕𝕠𝕘'), +('𝚃𝚑𝚎 𝚚𝚞𝚒𝚌𝚔 𝚋𝚛𝚘𝚠𝚗 𝚏𝚘𝚡 𝚓𝚞𝚖𝚙𝚜 𝚘𝚟𝚎𝚛 𝚝𝚑𝚎 𝚕𝚊𝚣𝚢 𝚍𝚘𝚐'), +('⒯⒣⒠ ⒬⒰⒤⒞⒦ ⒝⒭⒪⒲⒩ ⒡⒪⒳ ⒥⒰⒨⒫⒮ ⒪⒱⒠⒭ ⒯⒣⒠ ⒧⒜⒵⒴ ⒟⒪⒢'), +('<script>alert(123)</script>'), +('<script>alert('123');</script>'), +('<img src=x onerror=alert(123) />'), +('<svg><script>123<1>alert(123)</script>'), +('"><script>alert(123)</script>'), +('''><script>alert(123)</script>'), +('><script>alert(123)</script>'), +('</script><script>alert(123)</script>'), +('< / script >< script >alert(123)< / script >'), +(' onfocus=JaVaSCript:alert(123) autofocus'), +('" onfocus=JaVaSCript:alert(123) autofocus'), +(''' onfocus=JaVaSCript:alert(123) autofocus'), +('<script>alert(123)</script>'), +('<sc<script>ript>alert(123)</sc</script>ript>'), +('--><script>alert(123)</script>'), +('";alert(123);t="'), +(''';alert(123);t='''), +('JavaSCript:alert(123)'), +(';alert(123);'), +('src=JaVaSCript:prompt(132)'), +('"><script>alert(123);</script x="'), +('''><script>alert(123);</script x='''), +('><script>alert(123);</script x='), +('" autofocus onkeyup="javascript:alert(123)'), +(''' autofocus onkeyup=''javascript:alert(123)'), +('<script\x20type="text/javascript">javascript:alert(1);</script>'), +('<script\x3Etype="text/javascript">javascript:alert(1);</script>'), +('<script\x0Dtype="text/javascript">javascript:alert(1);</script>'), +('<script\x09type="text/javascript">javascript:alert(1);</script>'), +('<script\x0Ctype="text/javascript">javascript:alert(1);</script>'), +('<script\x2Ftype="text/javascript">javascript:alert(1);</script>'), +('<script\x0Atype="text/javascript">javascript:alert(1);</script>'), +('''`"><\x3Cscript>javascript:alert(1)</script>'), +('''`"><\x00script>javascript:alert(1)</script>'), +('ABC<div style="x\x3Aexpression(javascript:alert(1)">DEF'), +('ABC<div style="x:expression\x5C(javascript:alert(1)">DEF'), +('ABC<div style="x:expression\x00(javascript:alert(1)">DEF'), +('ABC<div style="x:exp\x00ression(javascript:alert(1)">DEF'), +('ABC<div style="x:exp\x5Cression(javascript:alert(1)">DEF'), +('ABC<div style="x:\x0Aexpression(javascript:alert(1)">DEF'), +('ABC<div style="x:\x09expression(javascript:alert(1)">DEF'), +('ABC<div style="x:\xE3\x80\x80expression(javascript:alert(1)">DEF'), +('ABC<div style="x:\xE2\x80\x84expression(javascript:alert(1)">DEF'), +('ABC<div style="x:\xC2\xA0expression(javascript:alert(1)">DEF'), +('ABC<div style="x:\xE2\x80\x80expression(javascript:alert(1)">DEF'), +('ABC<div style="x:\xE2\x80\x8Aexpression(javascript:alert(1)">DEF'), +('ABC<div style="x:\x0Dexpression(javascript:alert(1)">DEF'), +('ABC<div style="x:\x0Cexpression(javascript:alert(1)">DEF'), +('ABC<div style="x:\xE2\x80\x87expression(javascript:alert(1)">DEF'), +('ABC<div style="x:\xEF\xBB\xBFexpression(javascript:alert(1)">DEF'), +('ABC<div style="x:\x20expression(javascript:alert(1)">DEF'), +('ABC<div style="x:\xE2\x80\x88expression(javascript:alert(1)">DEF'), +('ABC<div style="x:\x00expression(javascript:alert(1)">DEF'), +('ABC<div style="x:\xE2\x80\x8Bexpression(javascript:alert(1)">DEF'), +('ABC<div style="x:\xE2\x80\x86expression(javascript:alert(1)">DEF'), +('ABC<div style="x:\xE2\x80\x85expression(javascript:alert(1)">DEF'), +('ABC<div style="x:\xE2\x80\x82expression(javascript:alert(1)">DEF'), +('ABC<div style="x:\x0Bexpression(javascript:alert(1)">DEF'), +('ABC<div style="x:\xE2\x80\x81expression(javascript:alert(1)">DEF'), +('ABC<div style="x:\xE2\x80\x83expression(javascript:alert(1)">DEF'), +('ABC<div style="x:\xE2\x80\x89expression(javascript:alert(1)">DEF'), +('<a href="\x0Bjavascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\x0Fjavascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\xC2\xA0javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\x05javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\xE1\xA0\x8Ejavascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\x18javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\x11javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\xE2\x80\x88javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\xE2\x80\x89javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\xE2\x80\x80javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\x17javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\x03javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\x0Ejavascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\x1Ajavascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\x00javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\x10javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\xE2\x80\x82javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\x20javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\x13javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\x09javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\xE2\x80\x8Ajavascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\x14javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\x19javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\xE2\x80\xAFjavascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\x1Fjavascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\xE2\x80\x81javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\x1Djavascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\xE2\x80\x87javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\x07javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\xE1\x9A\x80javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\xE2\x80\x83javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\x04javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\x01javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\x08javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\xE2\x80\x84javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\xE2\x80\x86javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\xE3\x80\x80javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\x12javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\x0Djavascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\x0Ajavascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\x0Cjavascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\x15javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\xE2\x80\xA8javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\x16javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\x02javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\x1Bjavascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\x06javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\xE2\x80\xA9javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\xE2\x80\x85javascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\x1Ejavascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\xE2\x81\x9Fjavascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="\x1Cjavascript:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="javascript\x00:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="javascript\x3A:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="javascript\x09:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="javascript\x0D:javascript:alert(1)" id="fuzzelement1">test</a>'), +('<a href="javascript\x0A:javascript:alert(1)" id="fuzzelement1">test</a>'), +('`"''><img src=xxx:x \x0Aonerror=javascript:alert(1)>'), +('`"''><img src=xxx:x \x22onerror=javascript:alert(1)>'), +('`"''><img src=xxx:x \x0Bonerror=javascript:alert(1)>'), +('`"''><img src=xxx:x \x0Donerror=javascript:alert(1)>'), +('`"''><img src=xxx:x \x2Fonerror=javascript:alert(1)>'), +('`"''><img src=xxx:x \x09onerror=javascript:alert(1)>'), +('`"''><img src=xxx:x \x0Conerror=javascript:alert(1)>'), +('`"''><img src=xxx:x \x00onerror=javascript:alert(1)>'), +('`"''><img src=xxx:x \x27onerror=javascript:alert(1)>'), +('`"''><img src=xxx:x \x20onerror=javascript:alert(1)>'), +('"`''><script>\x3Bjavascript:alert(1)</script>'), +('"`''><script>\x0Djavascript:alert(1)</script>'), +('"`''><script>\xEF\xBB\xBFjavascript:alert(1)</script>'), +('"`''><script>\xE2\x80\x81javascript:alert(1)</script>'), +('"`''><script>\xE2\x80\x84javascript:alert(1)</script>'), +('"`''><script>\xE3\x80\x80javascript:alert(1)</script>'), +('"`''><script>\x09javascript:alert(1)</script>'), +('"`''><script>\xE2\x80\x89javascript:alert(1)</script>'), +('"`''><script>\xE2\x80\x85javascript:alert(1)</script>'), +('"`''><script>\xE2\x80\x88javascript:alert(1)</script>'), +('"`''><script>\x00javascript:alert(1)</script>'), +('"`''><script>\xE2\x80\xA8javascript:alert(1)</script>'), +('"`''><script>\xE2\x80\x8Ajavascript:alert(1)</script>'), +('"`''><script>\xE1\x9A\x80javascript:alert(1)</script>'), +('"`''><script>\x0Cjavascript:alert(1)</script>'), +('"`''><script>\x2Bjavascript:alert(1)</script>'), +('"`''><script>\xF0\x90\x96\x9Ajavascript:alert(1)</script>'), +('"`''><script>-javascript:alert(1)</script>'), +('"`''><script>\x0Ajavascript:alert(1)</script>'), +('"`''><script>\xE2\x80\xAFjavascript:alert(1)</script>'), +('"`''><script>\x7Ejavascript:alert(1)</script>'), +('"`''><script>\xE2\x80\x87javascript:alert(1)</script>'), +('"`''><script>\xE2\x81\x9Fjavascript:alert(1)</script>'), +('"`''><script>\xE2\x80\xA9javascript:alert(1)</script>'), +('"`''><script>\xC2\x85javascript:alert(1)</script>'), +('"`''><script>\xEF\xBF\xAEjavascript:alert(1)</script>'), +('"`''><script>\xE2\x80\x83javascript:alert(1)</script>'), +('"`''><script>\xE2\x80\x8Bjavascript:alert(1)</script>'), +('"`''><script>\xEF\xBF\xBEjavascript:alert(1)</script>'), +('"`''><script>\xE2\x80\x80javascript:alert(1)</script>'), +('"`''><script>\x21javascript:alert(1)</script>'), +('"`''><script>\xE2\x80\x82javascript:alert(1)</script>'), +('"`''><script>\xE2\x80\x86javascript:alert(1)</script>'), +('"`''><script>\xE1\xA0\x8Ejavascript:alert(1)</script>'), +('"`''><script>\x0Bjavascript:alert(1)</script>'), +('"`''><script>\x20javascript:alert(1)</script>'), +('"`''><script>\xC2\xA0javascript:alert(1)</script>'), +('<img \x00src=x onerror="alert(1)">'), +('<img \x47src=x onerror="javascript:alert(1)">'), +('<img \x11src=x onerror="javascript:alert(1)">'), +('<img \x12src=x onerror="javascript:alert(1)">'), +('<img\x47src=x onerror="javascript:alert(1)">'), +('<img\x10src=x onerror="javascript:alert(1)">'), +('<img\x13src=x onerror="javascript:alert(1)">'), +('<img\x32src=x onerror="javascript:alert(1)">'), +('<img\x47src=x onerror="javascript:alert(1)">'), +('<img\x11src=x onerror="javascript:alert(1)">'), +('<img \x47src=x onerror="javascript:alert(1)">'), +('<img \x34src=x onerror="javascript:alert(1)">'), +('<img \x39src=x onerror="javascript:alert(1)">'), +('<img \x00src=x onerror="javascript:alert(1)">'), +('<img src\x09=x onerror="javascript:alert(1)">'), +('<img src\x10=x onerror="javascript:alert(1)">'), +('<img src\x13=x onerror="javascript:alert(1)">'), +('<img src\x32=x onerror="javascript:alert(1)">'), +('<img src\x12=x onerror="javascript:alert(1)">'), +('<img src\x11=x onerror="javascript:alert(1)">'), +('<img src\x00=x onerror="javascript:alert(1)">'), +('<img src\x47=x onerror="javascript:alert(1)">'), +('<img src=x\x09onerror="javascript:alert(1)">'), +('<img src=x\x10onerror="javascript:alert(1)">'), +('<img src=x\x11onerror="javascript:alert(1)">'), +('<img src=x\x12onerror="javascript:alert(1)">'), +('<img src=x\x13onerror="javascript:alert(1)">'), +('<img[a][b][c]src[d]=x[e]onerror=[f]"alert(1)">'), +('<img src=x onerror=\x09"javascript:alert(1)">'), +('<img src=x onerror=\x10"javascript:alert(1)">'), +('<img src=x onerror=\x11"javascript:alert(1)">'), +('<img src=x onerror=\x12"javascript:alert(1)">'), +('<img src=x onerror=\x32"javascript:alert(1)">'), +('<img src=x onerror=\x00"javascript:alert(1)">'), +('<a href=java script:javascript:alert(1)>XXX</a>'), +('<img src="x` `<script>javascript:alert(1)</script>"` `>'), +('<img src onerror /" ''"= alt=javascript:alert(1)//">'), +('<title onpropertychange=javascript:alert(1)>'), +('<a href=http://foo.bar/#x=`y></a><img alt="`><img src=x:x onerror=javascript:alert(1)></a>">'), +('<!--[if]><script>javascript:alert(1)</script -->'), +('<!--[if<img src=x onerror=javascript:alert(1)//]> -->'), +('<script src="/\%(jscript)s"></script>'), +('<script src="\\%(jscript)s"></script>'), +('<IMG """><SCRIPT>alert("XSS")</SCRIPT>">'), +('<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>'), +('<IMG SRC=# onmouseover="alert(''xxs'')">'), +('<IMG SRC= onmouseover="alert(''xxs'')">'), +('<IMG onmouseover="alert(''xxs'')">'), +('<IMG SRC=javascript:alert('XSS')>'), +('<IMG SRC=javascript:alert('XSS')>'), +('<IMG SRC=javascript:alert('XSS')>'), +('<IMG SRC="jav ascript:alert(''XSS'');">'), +('<IMG SRC="jav ascript:alert(''XSS'');">'), +('<IMG SRC="jav ascript:alert(''XSS'');">'), +('<IMG SRC="jav ascript:alert(''XSS'');">'), +('perl -e ''print "<IMG SRC=java\0script:alert(\"XSS\")>";'' > out'), +('<IMG SRC="  javascript:alert(''XSS'');">'), +('<SCRIPT/XSS SRC="http://ha.ckers.org/xss.js"></SCRIPT>'), +('<BODY onload!#$%&()*~+-_.,:;?@[/|\]^`=alert("XSS")>'), +('<SCRIPT/SRC="http://ha.ckers.org/xss.js"></SCRIPT>'), +('<<SCRIPT>alert("XSS");//<</SCRIPT>'), +('<SCRIPT SRC=http://ha.ckers.org/xss.js?< B >'), +('<SCRIPT SRC=//ha.ckers.org/.j>'), +('<IMG SRC="javascript:alert(''XSS'')"'), +('<iframe src=http://ha.ckers.org/scriptlet.html <'), +('\";alert(''XSS'');//'), +('<u oncopy=alert()> Copy me</u>'), +('<i onwheel=alert(1)> Scroll over me </i>'), +('<plaintext>'), +('http://a/%%30%30'), +('</textarea><script>alert(123)</script>'), +('1;DROP TABLE users'), +('1''; DROP TABLE users-- 1'), +(''' OR 1=1 -- 1'), +(''' OR ''1''=''1'), +(' '), +('%'), +('_'), +('-'), +('--'), +('--version'), +('--help'), +('$USER'), +('/dev/null; touch /tmp/blns.fail ; echo'), +('`touch /tmp/blns.fail`'), +('$(touch /tmp/blns.fail)'), +('@{[system "touch /tmp/blns.fail"]}'), +('eval("puts ''hello world''")'), +('System("ls -al /")'), +('`ls -al /`'), +('Kernel.exec("ls -al /")'), +('Kernel.exit(1)'), +('%x(''ls -al /'')'), +('<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE foo [ <!ELEMENT foo ANY ><!ENTITY xxe SYSTEM "file:///etc/passwd" >]><foo>&xxe;</foo>'), +('$HOME'), +('$ENV{''HOME''}'), +('%d'), +('%s%s%s%s%s'), +('{0}'), +('%*.*s'), +('%@'), +('%n'), +('File:///'), +('../../../../../../../../../../../etc/passwd%00'), +('../../../../../../../../../../../etc/hosts'), +('() { 0; }; touch /tmp/blns.shellshock1.fail;'), +('() { _; } >_[$($())] { touch /tmp/blns.shellshock2.fail; }'), +('<<< %s(un=''%s'') = %u'), +('+++ATH0'), +('CON'), +('PRN'), +('AUX'), +('CLOCK$'), +('NUL'), +('A:'), +('ZZ:'), +('COM1'), +('LPT1'), +('LPT2'), +('LPT3'), +('COM2'), +('COM3'), +('COM4'), +('DCC SEND STARTKEYLOGGER 0 0 0'), +('Scunthorpe General Hospital'), +('Penistone Community Church'), +('Lightwater Country Park'), +('Jimmy Clitheroe'), +('Horniman Museum'), +('shitake mushrooms'), +('RomansInSussex.co.uk'), +('http://www.cum.qc.ca/'), +('Craig Cockburn, Software Specialist'), +('Linda Callahan'), +('Dr. Herman I. Libshitz'), +('magna cum laude'), +('Super Bowl XXX'), +('medieval erection of parapets'), +('evaluate'), +('mocha'), +('expression'), +('Arsenal canal'), +('classic'), +('Tyson Gay'), +('Dick Van Dyke'), +('basement'), +('If you''re reading this, you''ve been in a coma for almost 20 years now. We''re trying a new technique. We don''t know where this message will end up in your dream, but we hope it works. Please wake up, we miss you.'), +('Roses are red, violets are blue. Hope you enjoy terminal hue'), +('But now...for my greatest trick...'), +('The quick brown fox... [Beeeep]'), +('Powerلُلُصّبُلُلصّبُررً ॣ ॣh ॣ ॣ冗'), +('🏳0🌈️'), +('జ్ఞ‌ా'), +('گچپژ'); diff --git a/dumpling/tests/naughty_strings/naughty_strings.escape-schema.sql b/dumpling/tests/naughty_strings/naughty_strings.escape-schema.sql new file mode 100644 index 0000000000000..58ef275e2dde3 --- /dev/null +++ b/dumpling/tests/naughty_strings/naughty_strings.escape-schema.sql @@ -0,0 +1,4 @@ +CREATE TABLE `escape` ( + `a` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; + diff --git a/dumpling/tests/naughty_strings/run.sh b/dumpling/tests/naughty_strings/run.sh new file mode 100755 index 0000000000000..a0b66e370d9e6 --- /dev/null +++ b/dumpling/tests/naughty_strings/run.sh @@ -0,0 +1,27 @@ +#!/bin/sh +# +# Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +set -eu + +run_sql "DROP DATABASE IF EXISTS naughty_strings" +run_sql_file "$DUMPLING_BASE_NAME/data/naughty_strings-schema-create.sql" +export DUMPLING_TEST_DATABASE="naughty_strings" +run_sql_file "$DUMPLING_BASE_NAME/data/naughty_strings.t-schema.sql" +run_sql_file "$DUMPLING_BASE_NAME/data/naughty_strings.t.sql" +run_dumpling --escape-backslash=false +# FIXME should compare the schemas too, but they differ too much among MySQL versions. +diff "$DUMPLING_BASE_NAME/expect/naughty_strings.t.sql" "$DUMPLING_OUTPUT_DIR/naughty_strings.t.000000000.sql" + +# run with compress option +rm "$DUMPLING_OUTPUT_DIR/naughty_strings.t.000000000.sql" +run_dumpling --escape-backslash=false --compress "gzip" +file_should_exist "$DUMPLING_OUTPUT_DIR/naughty_strings.t.000000000.sql.gz" +gzip "$DUMPLING_OUTPUT_DIR/naughty_strings.t.000000000.sql.gz" -d +diff "$DUMPLING_BASE_NAME/expect/naughty_strings.t.sql" "$DUMPLING_OUTPUT_DIR/naughty_strings.t.000000000.sql" + +run_sql_file "$DUMPLING_BASE_NAME/data/naughty_strings.escape-schema.sql" +run_sql_file "$DUMPLING_BASE_NAME/data/naughty_strings.escape.sql" +run_dumpling --escape-backslash=true +# FIXME should compare the schemas too, but they differ too much among MySQL versions. +diff "$DUMPLING_BASE_NAME/expect/naughty_strings.escape.sql" "$DUMPLING_OUTPUT_DIR/naughty_strings.escape.000000000.sql" diff --git a/dumpling/tests/no_table_and_db_name/run.sh b/dumpling/tests/no_table_and_db_name/run.sh new file mode 100644 index 0000000000000..b13333dbcd574 --- /dev/null +++ b/dumpling/tests/no_table_and_db_name/run.sh @@ -0,0 +1,42 @@ +#!/bin/sh +# +# Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +set -euv + +assert() { + if ! $@; then + echo "assert [$@] failed, exiting." + exit 1 + fi +} + +TEST_NAME=no_table_and_db_name +run_sql "drop database if exists $TEST_NAME" +run_sql "create database $TEST_NAME" +export DUMPLING_TEST_DATABASE=no_table_and_db_name +run_sql "create table t (a varchar(255))" + +chars_20="1111_0000_1111_0000_" + +# insert 100 records, each occupies 20 bytes +run_sql "insert into t values $(seq -s, 100 | sed 's/,*$//g' | sed "s/[0-9]*/('$chars_20')/g");" + +# dumping with file size = 233 bytes, actually 10 rows +run_dumpling -F 233B --filetype csv --sql "select * from $TEST_NAME.t" + +assert [ $( ls -lh $DUMPLING_OUTPUT_DIR | grep -e ".csv$" | wc -l ) -eq 10 ] + +# 10 files with header. +assert [ $( cat $DUMPLING_OUTPUT_DIR/*.csv | wc -l ) -eq $(( 100 + 10 )) ] + +# TODO: disable --filetype sql --sql "xxx" until dumpling can product a correct sql file +# dumping with file size = 311 bytes, actually 10 rows +# run_dumpling -F 311B --filetype sql --sql "select * from $TEST_NAME.t" + +# assert [ $( ls -lh $DUMPLING_OUTPUT_DIR | grep -e ".sql$" | wc -l ) -eq 10 ] + +# 10 files with header. +# assert [ $( cat $DUMPLING_OUTPUT_DIR/*.sql | wc -l ) -eq $(( 100 + 10 * 2 )) ] + +echo "TEST: [$TEST_NAME] passed." \ No newline at end of file diff --git a/dumpling/tests/null_unique_index/run.sh b/dumpling/tests/null_unique_index/run.sh new file mode 100644 index 0000000000000..23e1c19b4f1f6 --- /dev/null +++ b/dumpling/tests/null_unique_index/run.sh @@ -0,0 +1,26 @@ +#!/bin/sh +# +# Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +set -eu +cur=$(cd `dirname $0`; pwd) + +DB_NAME="null_unique_key" + +# drop database on mysql +run_sql "drop database if exists \`$DB_NAME\`;" + +# build data on mysql +run_sql "create database \`$DB_NAME\`;" +run_sql "create table \`$DB_NAME\`.\`t\` (a int unique key, b int);" +run_sql "insert into \`$DB_NAME\`.\`t\` values (1, 2), (NULL, 1);" + + +# dumping +export DUMPLING_TEST_DATABASE=$DB_NAME +run_dumpling -r 1 + +data="NULL" +cnt=$(sed "s/$data/$data\n/g" $DUMPLING_OUTPUT_DIR/$DB_NAME.t.000000000.sql | grep -c "$data") || true +[ $cnt = 1 ] + diff --git a/dumpling/tests/placement_policy/result/x-placement-policy-create.sql b/dumpling/tests/placement_policy/result/x-placement-policy-create.sql new file mode 100644 index 0000000000000..0b68c742ee1cf --- /dev/null +++ b/dumpling/tests/placement_policy/result/x-placement-policy-create.sql @@ -0,0 +1,3 @@ +/*!40101 SET NAMES binary*/; +/*T![placement] SET PLACEMENT_CHECKS = 0*/; +/*T![placement] CREATE PLACEMENT POLICY `x` PRIMARY_REGION="cn-east-1" REGIONS="cn-east-1,cn-east" */; diff --git a/dumpling/tests/placement_policy/result/x1-placement-policy-create.sql b/dumpling/tests/placement_policy/result/x1-placement-policy-create.sql new file mode 100644 index 0000000000000..d2dafe29b2a85 --- /dev/null +++ b/dumpling/tests/placement_policy/result/x1-placement-policy-create.sql @@ -0,0 +1,3 @@ +/*!40101 SET NAMES binary*/; +/*T![placement] SET PLACEMENT_CHECKS = 0*/; +/*T![placement] CREATE PLACEMENT POLICY `x1` FOLLOWERS=4 */; diff --git a/dumpling/tests/placement_policy/run.sh b/dumpling/tests/placement_policy/run.sh new file mode 100644 index 0000000000000..a5c1409e0db16 --- /dev/null +++ b/dumpling/tests/placement_policy/run.sh @@ -0,0 +1,30 @@ +#!/bin/sh +# +# Copyright 2021 PingCAP, Inc. Licensed under Apache-2.0. + +set -eu + +export DUMPLING_TEST_PORT=4000 + +run_sql "drop database if exists policy" +run_sql "drop placement policy if exists x" +run_sql "drop placement policy if exists x1" +run_sql "create database policy" + +export DUMPLING_TEST_DATABASE="policy" + +run_sql 'CREATE PLACEMENT POLICY x PRIMARY_REGION="cn-east-1" REGIONS="cn-east-1,cn-east";' +run_sql 'CREATE PLACEMENT POLICY x1 FOLLOWERS=4;' + +run_dumpling + +file_should_exist "$DUMPLING_OUTPUT_DIR/policy-schema-create.sql" +file_should_exist "$DUMPLING_OUTPUT_DIR/x-placement-policy-create.sql" +file_should_exist "$DUMPLING_OUTPUT_DIR/x1-placement-policy-create.sql" + +diff "$DUMPLING_BASE_NAME/result/x-placement-policy-create.sql" "$DUMPLING_OUTPUT_DIR/x-placement-policy-create.sql" +diff "$DUMPLING_BASE_NAME/result/x1-placement-policy-create.sql" "$DUMPLING_OUTPUT_DIR/x1-placement-policy-create.sql" + +run_sql "drop placement policy if exists x" +run_sql "drop placement policy if exists x1" +run_sql "drop database if exists policy" diff --git a/dumpling/tests/primary_key/data/pk_case_0.sql b/dumpling/tests/primary_key/data/pk_case_0.sql new file mode 100644 index 0000000000000..0de19421c252c --- /dev/null +++ b/dumpling/tests/primary_key/data/pk_case_0.sql @@ -0,0 +1,14 @@ +# test sorted by primary key +create table `pk_case_0` (a int primary key, b int); +insert into `pk_case_0` values +(0, 10), +(1, 9), +(2, 8), +(3, 7), +(4, 6), +(5, 5), +(6, 4), +(7, 3), +(8, 2), +(9, 1), +(10, 0); diff --git a/dumpling/tests/primary_key/data/pk_case_1.sql b/dumpling/tests/primary_key/data/pk_case_1.sql new file mode 100644 index 0000000000000..f611009bb37f8 --- /dev/null +++ b/dumpling/tests/primary_key/data/pk_case_1.sql @@ -0,0 +1,14 @@ +# test reversely sorted by primary key +create table `pk_case_1` (a int primary key, b int); +insert into `pk_case_1` values +(10, 0), +(9, 1), +(8, 2), +(7, 3), +(6, 4), +(5, 5), +(4, 6), +(3, 7), +(2, 8), +(1, 9), +(0, 10); diff --git a/dumpling/tests/primary_key/data/pk_case_2.sql b/dumpling/tests/primary_key/data/pk_case_2.sql new file mode 100644 index 0000000000000..1c6b40a8a1285 --- /dev/null +++ b/dumpling/tests/primary_key/data/pk_case_2.sql @@ -0,0 +1,14 @@ +# test random order +create table `pk_case_2` (a int primary key, b int); +insert into `pk_case_2` values +(6, 4), +(4, 6), +(8, 2), +(3, 7), +(1, 9), +(2, 8), +(5, 5), +(10, 0), +(0, 10), +(9, 1), +(7, 3); diff --git a/dumpling/tests/primary_key/data/pk_case_3.sql b/dumpling/tests/primary_key/data/pk_case_3.sql new file mode 100644 index 0000000000000..ab69e5b901a09 --- /dev/null +++ b/dumpling/tests/primary_key/data/pk_case_3.sql @@ -0,0 +1,14 @@ +# test random order and no primary key +create table `pk_case_3` (a int, b int, g geometry); +insert into `pk_case_3` values +(6, 4, ST_GeomFromText('POINT(1 1)')), +(4, 6, ST_GeomFromText('LINESTRING(2 1, 6 6)')), +(8, 2, NULL), +(3, 7, NULL), +(1, 9, NULL), +(2, 8, NULL), +(5, 5, NULL), +(10, 0, NULL), +(0, 10, NULL), +(9, 1, NULL), +(7, 3, NULL); diff --git a/dumpling/tests/primary_key/result/pk_case_0.sql b/dumpling/tests/primary_key/result/pk_case_0.sql new file mode 100644 index 0000000000000..6c8c7fb9e6538 --- /dev/null +++ b/dumpling/tests/primary_key/result/pk_case_0.sql @@ -0,0 +1,13 @@ +/*!40101 SET NAMES binary*/; +INSERT INTO `pk_case_0` VALUES +(0,10), +(1,9), +(2,8), +(3,7), +(4,6), +(5,5), +(6,4), +(7,3), +(8,2), +(9,1), +(10,0); diff --git a/dumpling/tests/primary_key/result/pk_case_1.sql b/dumpling/tests/primary_key/result/pk_case_1.sql new file mode 100644 index 0000000000000..4a671cc64f247 --- /dev/null +++ b/dumpling/tests/primary_key/result/pk_case_1.sql @@ -0,0 +1,13 @@ +/*!40101 SET NAMES binary*/; +INSERT INTO `pk_case_1` VALUES +(0,10), +(1,9), +(2,8), +(3,7), +(4,6), +(5,5), +(6,4), +(7,3), +(8,2), +(9,1), +(10,0); diff --git a/dumpling/tests/primary_key/result/pk_case_2.sql b/dumpling/tests/primary_key/result/pk_case_2.sql new file mode 100644 index 0000000000000..af9494d00645d --- /dev/null +++ b/dumpling/tests/primary_key/result/pk_case_2.sql @@ -0,0 +1,13 @@ +/*!40101 SET NAMES binary*/; +INSERT INTO `pk_case_2` VALUES +(0,10), +(1,9), +(2,8), +(3,7), +(4,6), +(5,5), +(6,4), +(7,3), +(8,2), +(9,1), +(10,0); diff --git a/dumpling/tests/primary_key/result/pk_case_3.sql b/dumpling/tests/primary_key/result/pk_case_3.sql new file mode 100644 index 0000000000000..a29e568dd1340 --- /dev/null +++ b/dumpling/tests/primary_key/result/pk_case_3.sql @@ -0,0 +1,13 @@ +/*!40101 SET NAMES binary*/; +INSERT INTO `pk_case_3` VALUES +(6,4,x'000000000101000000000000000000f03f000000000000f03f'), +(4,6,x'000000000102000000020000000000000000000040000000000000f03f00000000000018400000000000001840'), +(8,2,NULL), +(3,7,NULL), +(1,9,NULL), +(2,8,NULL), +(5,5,NULL), +(10,0,NULL), +(0,10,NULL), +(9,1,NULL), +(7,3,NULL); diff --git a/dumpling/tests/primary_key/run.sh b/dumpling/tests/primary_key/run.sh new file mode 100644 index 0000000000000..a0e8c21492d23 --- /dev/null +++ b/dumpling/tests/primary_key/run.sh @@ -0,0 +1,23 @@ +#!/bin/sh +# +# Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +set -eu + +run_sql "drop database if exists primary_key" +run_sql "create database primary_key" +export DUMPLING_TEST_DATABASE=primary_key + +for data in "$DUMPLING_BASE_NAME"/data/*; do + run_sql_file "$data" +done + +run_dumpling + +for file_path in "$DUMPLING_BASE_NAME"/data/*; do + base_name=$(basename "$file_path") + table_name="${base_name%.sql}" + file_should_exist "$DUMPLING_BASE_NAME/result/$table_name.sql" + file_should_exist "$DUMPLING_OUTPUT_DIR/primary_key.$table_name.000000000.sql" + diff "$DUMPLING_BASE_NAME/result/$table_name.sql" "$DUMPLING_OUTPUT_DIR/primary_key.$table_name.000000000.sql" +done diff --git a/dumpling/tests/quote/data/quote-database-schema-create-mysql57.sql b/dumpling/tests/quote/data/quote-database-schema-create-mysql57.sql new file mode 100755 index 0000000000000..0790882615b9f --- /dev/null +++ b/dumpling/tests/quote/data/quote-database-schema-create-mysql57.sql @@ -0,0 +1,3 @@ +/*!40101 SET NAMES binary*/; +/*T![placement] SET PLACEMENT_CHECKS = 0*/; +CREATE DATABASE `quo``te/database` CHARACTER SET = latin1 COLLATE = latin1_swedish_ci; diff --git a/dumpling/tests/quote/data/quote-database-schema-create.sql b/dumpling/tests/quote/data/quote-database-schema-create.sql new file mode 100755 index 0000000000000..d4a6ef081cc11 --- /dev/null +++ b/dumpling/tests/quote/data/quote-database-schema-create.sql @@ -0,0 +1,3 @@ +/*!40101 SET NAMES binary*/; +/*T![placement] SET PLACEMENT_CHECKS = 0*/; +CREATE DATABASE `quo``te/database` CHARACTER SET = latin1 ENCRYPTION = 'N' COLLATE = latin1_swedish_ci; diff --git a/dumpling/tests/quote/data/quote-database.quote-table-schema-mysql57.sql b/dumpling/tests/quote/data/quote-database.quote-table-schema-mysql57.sql new file mode 100755 index 0000000000000..85b0d7b70acf6 --- /dev/null +++ b/dumpling/tests/quote/data/quote-database.quote-table-schema-mysql57.sql @@ -0,0 +1,3 @@ +/*!40101 SET NAMES binary*/; +/*T![placement] SET PLACEMENT_CHECKS = 0*/; +CREATE TABLE `quo``te/table` (`quo``te/col` INT(11) NOT NULL,`a` INT(11) DEFAULT NULL,`gen``id` INT(11) GENERATED ALWAYS AS(`quo``te/col`) VIRTUAL,PRIMARY KEY(`quo``te/col`)) ENGINE = InnoDB DEFAULT CHARACTER SET = LATIN1 DEFAULT COLLATE = LATIN1_SWEDISH_CI; diff --git a/dumpling/tests/quote/data/quote-database.quote-table-schema.sql b/dumpling/tests/quote/data/quote-database.quote-table-schema.sql new file mode 100755 index 0000000000000..2a42478f5c1c9 --- /dev/null +++ b/dumpling/tests/quote/data/quote-database.quote-table-schema.sql @@ -0,0 +1,3 @@ +/*!40101 SET NAMES binary*/; +/*T![placement] SET PLACEMENT_CHECKS = 0*/; +CREATE TABLE `quo``te/table` (`quo``te/col` INT NOT NULL,`a` INT DEFAULT NULL,`gen``id` INT GENERATED ALWAYS AS(`quo``te/col`) VIRTUAL,PRIMARY KEY(`quo``te/col`)) ENGINE = InnoDB DEFAULT CHARACTER SET = LATIN1 DEFAULT COLLATE = LATIN1_SWEDISH_CI; diff --git a/dumpling/tests/quote/data/quote-database.quote-table.000000000-mysql57.sql b/dumpling/tests/quote/data/quote-database.quote-table.000000000-mysql57.sql new file mode 100755 index 0000000000000..5cee6b7b4a67d --- /dev/null +++ b/dumpling/tests/quote/data/quote-database.quote-table.000000000-mysql57.sql @@ -0,0 +1,13 @@ +/*!40101 SET NAMES binary*/; +INSERT INTO `quo``te/table` (`quo``te/col`,`a`) VALUES +(0,10), +(1,9), +(2,8), +(3,7), +(4,6), +(5,5), +(6,4), +(7,3), +(8,2), +(9,1), +(10,0); diff --git a/dumpling/tests/quote/data/quote-database.quote-table.000000000.sql b/dumpling/tests/quote/data/quote-database.quote-table.000000000.sql new file mode 100755 index 0000000000000..5cee6b7b4a67d --- /dev/null +++ b/dumpling/tests/quote/data/quote-database.quote-table.000000000.sql @@ -0,0 +1,13 @@ +/*!40101 SET NAMES binary*/; +INSERT INTO `quo``te/table` (`quo``te/col`,`a`) VALUES +(0,10), +(1,9), +(2,8), +(3,7), +(4,6), +(5,5), +(6,4), +(7,3), +(8,2), +(9,1), +(10,0); diff --git a/dumpling/tests/quote/run.sh b/dumpling/tests/quote/run.sh new file mode 100644 index 0000000000000..eafe61ed51caf --- /dev/null +++ b/dumpling/tests/quote/run.sh @@ -0,0 +1,37 @@ +#!/bin/bash +# +# Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +set -eu + +mkdir -p "$DUMPLING_OUTPUT_DIR"/data + +mysql_version=$(echo "select version()" | mysql -uroot -h127.0.0.1 -P3306 | awk 'NR==2' | awk '{print $1}') +echo "current user mysql version is $mysql_version" +if [[ $mysql_version = 5* ]]; then + # there is a bug in mysql 5.x, see https://bugs.mysql.com/bug.php?id=96994, so we use different create db/table sql + cp "$DUMPLING_BASE_NAME/data/quote-database.quote-table.000000000-mysql57.sql" "$DUMPLING_OUTPUT_DIR/data/quo\`te%2Fdatabase.quo\`te%2Ftable.000000000.sql" + cp "$DUMPLING_BASE_NAME/data/quote-database.quote-table-schema-mysql57.sql" "$DUMPLING_OUTPUT_DIR/data/quo\`te%2Fdatabase.quo\`te%2Ftable-schema.sql" + cp "$DUMPLING_BASE_NAME/data/quote-database-schema-create-mysql57.sql" "$DUMPLING_OUTPUT_DIR/data/quo\`te%2Fdatabase-schema-create.sql" +else + cp "$DUMPLING_BASE_NAME/data/quote-database.quote-table.000000000.sql" "$DUMPLING_OUTPUT_DIR/data/quo\`te%2Fdatabase.quo\`te%2Ftable.000000000.sql" + cp "$DUMPLING_BASE_NAME/data/quote-database.quote-table-schema.sql" "$DUMPLING_OUTPUT_DIR/data/quo\`te%2Fdatabase.quo\`te%2Ftable-schema.sql" + cp "$DUMPLING_BASE_NAME/data/quote-database-schema-create.sql" "$DUMPLING_OUTPUT_DIR/data/quo\`te%2Fdatabase-schema-create.sql" +fi + +db="quo\`te/database" +run_sql "drop database if exists \`quo\`\`te/database\`" +run_sql_file "$DUMPLING_OUTPUT_DIR/data/quo\`te%2Fdatabase-schema-create.sql" +export DUMPLING_TEST_DATABASE=$db + +run_sql_file "$DUMPLING_OUTPUT_DIR/data/quo\`te%2Fdatabase.quo\`te%2Ftable-schema.sql" +run_sql_file "$DUMPLING_OUTPUT_DIR/data/quo\`te%2Fdatabase.quo\`te%2Ftable.000000000.sql" + +run_dumpling + +for file_path in "$DUMPLING_OUTPUT_DIR"/data/*; do + base_name=$(basename "$file_path") + file_should_exist "$DUMPLING_OUTPUT_DIR/data/$base_name" + file_should_exist "$DUMPLING_OUTPUT_DIR/$base_name" + diff "$DUMPLING_OUTPUT_DIR/data/$base_name" "$DUMPLING_OUTPUT_DIR/$base_name" +done diff --git a/dumpling/tests/rows/conf/diff_config.toml b/dumpling/tests/rows/conf/diff_config.toml new file mode 100644 index 0000000000000..4d835c2f55914 --- /dev/null +++ b/dumpling/tests/rows/conf/diff_config.toml @@ -0,0 +1,29 @@ +# diff Configuration. + +check-thread-count = 4 + +export-fix-sql = true + +check-struct-only = false + +[task] + output-dir = "./output" + + source-instances = ["mysql1"] + + target-instance = "tidb0" + + target-check-tables = ["rows.t"] + +[data-sources] +[data-sources.mysql1] +host = "127.0.0.1" +port = 3306 +user = "root" +password = "" + +[data-sources.tidb0] +host = "127.0.0.1" +port = 4000 +user = "root" +password = "" diff --git a/dumpling/tests/rows/conf/lightning.toml b/dumpling/tests/rows/conf/lightning.toml new file mode 100644 index 0000000000000..322049ba819ac --- /dev/null +++ b/dumpling/tests/rows/conf/lightning.toml @@ -0,0 +1,20 @@ +### tidb-lightning config + +[lightning] +server-mode = false +level = "error" +check-requirements = false + +[tikv-importer] +backend="tidb" +on-duplicate = "error" + +[mydumper] +data-source-dir = "/tmp/dumpling_test_result/sql_res.rows" + +[tidb] +host = "127.0.0.1" +port = 4000 +user = "root" +password = "" +status-port = 10080 diff --git a/dumpling/tests/rows/data/rows.t.000000000.sql b/dumpling/tests/rows/data/rows.t.000000000.sql new file mode 100644 index 0000000000000..9c37131cf3ef8 --- /dev/null +++ b/dumpling/tests/rows/data/rows.t.000000000.sql @@ -0,0 +1,101 @@ +insert into `rows`.`t` (a) values +('vr/g 8uoZ&26U+*%|(k3'), +(':v3uo7whT`Zz>tD=[,)\r'), +('nuq,%sl5+i/pX2''Ur-"`'), +("\tB>+a?]m\\9T!{2X@I:'k"), +('8_/GI}Oh&|YPo0k,@[FB'), +("Lnx3WawtgN'.J)\n[C-V!"), +("$cislLng'V/`Ce[\\\nA4K"), +('&)Jd_tHBY-!Lz?Ij0f\t*'), +('B1KGE,#[L:@Pq8\n_*ANF'), +("([\\c:'>U/)wDN4zQf\tC6"), +('$G\\pS,%BRzsCUqWr^`}3'), +('L5mNTib.KEJCRcl}>\res'), +("MaQ.3K'e_ 7nirjET;x\r"), +(']!62nVsu <y8vIzQYD0P'), +('\\bWPzU(KFfmx~2E54k!A'), +('H$<j?)C; t2S=\rEdZyL,'), +('t\r''X)G]DLIuH$f@b"-;S'), +('~dptv(IQ _cR7xYE1`yz'), +('E(}|qA%-]u{)BQ:jGLVC'), +('Rg&ya"|w60< KYJ#ElU7'), +('N}p9uE;,rTne^0B"yLhq'), +('{2T7!>s&@|A_<%O1v*8W'), +('+[2lwQ!\tL{RsnK]$%E&?'), +('h]e*:;$k"VcHi\t6%X\nQB'), +('|<KrxRV\ri!p*FfS3:n=\t'), +('/#f-K$Uj3y6&:i`Rh[~}'), +('08ci<#NP:~-,[D\ry}>=A'), +(";]KwM~F$z.(L'S-N@7Ug"), +('IlDa4YQ[\r;?h65/ZU+mS'), +("QwfKAPBs=MW,\r0E'i?V1"), +("k*90\\Re!#vfYGx:)g'r3"), +("YS:I(/<NQf>ro'`kzaH\t"), +('1`Bq|a9;o"Y]3bM4W_Sh'), +(".MgK'p)+@hY[L:63J>nl"), +('h8gLDqZX:B4OTuYRV=,\\'), +("=]W7N(1}\nKM\\m'xR[?pB"), +('7)_p.;2xoUflRWC<"g/T'), +('.4l]KZ?O8Vkj{;wb0JQ#'), +("x>eRCk?(yJF\t3'g@\rzDl"), +('4b3J{^_p7|L& jGKla\\h'), +("a9\tobE$MG@>.[:_~c2W'"), +('FwK`^GQ>t 3T]vh?A2c\n'), +('7\r%]}Ypk,2LVGW:?d10f'), +('[wmEMFr.bsU;(oflk^7@'), +('?Kb;WeyDh3RF@\nZN,79O'), +('?7]fDsbrUp1I|Yu5(.)N'), +('\tH:`BZi/fbxWnA|.y~{*'), +('md}O[U,FsQI- A1rn^b5'), +('Fz~;,W!3_\th}c"m.V #>'), +('w3ql-W&r*9I@R$\rHu8c '), +('m0!FSH\\pf8GOnN &;CD>'), +(']%-ICWRGJZc\t.BrTKLeS'), +('pHF!GAjkau%N~[h$b7nX'), +(' #{$TiS9w)WCmQ,}n!kv'), +("LWR4qGO/D'&%l`3\nbe^N"), +('S!rfCOj)y\t\r7:nF2shXK'), +('p]de%o\tn 9|6f7IDB`V='), +(':F^#IA%p!w t2m-U;6[E'), +("uioc\rdDV|t@z$7'+0\nIm"), +('7OR\t2?q]{6[QD#kCMig5'), +('GF-LA{&> 0a)tTkO4Mj_'), +('&Ea),-@<gF{21s7X/p"u'), +('5=,YreMA2-y\\3+h^pJsw'), +('\tn"d:bG$lHYQ_Dfp5)?4'), +("o\\7!'&E}gef~M-)$Vbv>"), +('cl5AUQHpP"+r\tj}dg)#*'), +('S1yA;V*E9GsdT(8Hvk|e'), +('Q.eHaOSnkX"x|]w3:;U~'), +('%SRh2]B\nEbu> `\\wp05('), +('1rJc8<(`2q?7sPHzxh.4'), +('( ymTM_+QeZH6KlOR{Di'), +("]Q'2{4iD^,~M0&K*x:<}"), +('O"my6Egs|z$abwSA''}5 '), +('Gl0}W[~N5: 1n=@TJ_F,'), +('|orp1hJXz6]sZiA9DSnH'), +('I<aZs|oK15:x6Vt^9Ww)'), +('S/!_JAI#}`Vc\\4d5{81?'), +('"IB[Q~L@3:c-.O{rkZ}E'), +('8*\n%){GwO~yT^mL/ph0t'), +('`6+/Zy.B_Y[evD@ 9zbp'), +('%zF5&r\\^|N(*kfg{QRjS'), +('p8y"t1-#rq:|mjhM\tWi+'), +('=eBH%l\rP_+qUr)NYDhv;'), +('hr\\z>-:,u+FK32qf0TXw'), +('-sQD>=rN|[ZLR\r\tPGW6u'), +('M)[2EZ.SyzV4dR!~\r"w9'), +('3`Ms\t%!?zZR\no>xG|&JP'), +(':UR8;-x2"{e3P# mlvTG'), +("Z#|> :~or1XS*^$c'j?2"), +('=^?D_Xf\tQ{P%UoYl<pA,'), +('b8cQ0S\n\\>.v_usEO{J\ty'), +('YmW$pkSLqjGxV+)A"KCP'), +('K+aZU\\EnV!qm}vW\rd.c\t'), +("'?dR3JHn(~)p}Gq4z-F!"), +('\\IW(ip!2_Ab}ydfXQ01P'), +(')#b\n&,WwYT{vyMK]\ra/\\'), +('\\F0d~2[K/fk>Ij{^]gLH'), +('78cm$y#4?S;PV]\\Oex=E'), +('d"h=\n\\k)8!:C?qKD(NB['), +(' Vemr1.kpU@B|qQ=M{O#'); diff --git a/dumpling/tests/rows/run.sh b/dumpling/tests/rows/run.sh new file mode 100644 index 0000000000000..1473e4f3a2cdd --- /dev/null +++ b/dumpling/tests/rows/run.sh @@ -0,0 +1,78 @@ +#!/bin/sh +# +# Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +set -eu +cur=$(cd `dirname $0`; pwd) + +DB_NAME="rows" +TABLE_NAME="t" + +# drop database on tidb +export DUMPLING_TEST_PORT=4000 +run_sql "drop database if exists \`$DB_NAME\`;" + +# drop database on mysql +export DUMPLING_TEST_PORT=3306 +run_sql "drop database if exists \`$DB_NAME\`;" + +# build data on mysql +run_sql "create database \`$DB_NAME\`;" +run_sql "create table \`$DB_NAME\`.\`$TABLE_NAME\` (id int not null auto_increment primary key, a varchar(24));" + +# insert 100 records +run_sql_file "$cur/data/rows.t.000000000.sql" + +# make sure the estimated count is accurate +run_sql "analyze table \`$DB_NAME\`.\`$TABLE_NAME\`" + +# dumping +export DUMPLING_TEST_DATABASE=$DB_NAME +run_dumpling --rows 10 --loglevel debug + +# the dumping result is expected to be: +# 10 files for insertion +file_num=$(find "$DUMPLING_OUTPUT_DIR" -maxdepth 1 -iname "$DB_NAME.$TABLE_NAME.*.sql" | wc -l) +if [ "$file_num" -ne 10 ]; then + echo "obtain file number: $file_num, but expect: 10" && exit 1 +fi + +cat "$cur/conf/lightning.toml" +# use lightning import data to tidb +run_lightning $cur/conf/lightning.toml + +# check mysql and tidb data +check_sync_diff $cur/conf/diff_config.toml + +# test dumpling with both rows and filesize +rm -rf "$DUMPLING_OUTPUT_DIR" +run_dumpling --rows 10 --filesize 100B --loglevel debug +# the dumping result is expected to be: +# 50 files for insertion +file_num=$(find "$DUMPLING_OUTPUT_DIR" -maxdepth 1 -iname "$DB_NAME.$TABLE_NAME.*.sql" | wc -l) +if [ "$file_num" -ne 50 ]; then + echo "obtain file number: $file_num, but expect: 50" && exit 1 +fi + +for i in `seq 0 9` +do + r=$(printf "%02d" $i) + for j in `seq 0 4` + do + file_name="$DUMPLING_OUTPUT_DIR/$DB_NAME.$TABLE_NAME.0000000${r}000${j}.sql" + if [ ! -f "$file_name" ]; then + echo "file $file_name doesn't exist, which is not expected" && exit 1 + fi + done +done + +# drop database on tidb +export DUMPLING_TEST_PORT=4000 +run_sql "drop database if exists \`$DB_NAME\`;" + +cat "$cur/conf/lightning.toml" +# use lightning import data to tidb +run_lightning $cur/conf/lightning.toml + +# check mysql and tidb data +check_sync_diff $cur/conf/diff_config.toml diff --git a/dumpling/tests/rows_extreme_int/conf/diff_config.toml b/dumpling/tests/rows_extreme_int/conf/diff_config.toml new file mode 100644 index 0000000000000..1c9624ff3a06f --- /dev/null +++ b/dumpling/tests/rows_extreme_int/conf/diff_config.toml @@ -0,0 +1,29 @@ +# diff Configuration. + +check-thread-count = 4 + +export-fix-sql = true + +check-struct-only = false + +[task] + output-dir = "./output" + + source-instances = ["mysql1"] + + target-instance = "tidb0" + + target-check-tables = ["rei.t*"] + +[data-sources] +[data-sources.mysql1] +host = "127.0.0.1" +port = 3306 +user = "root" +password = "" + +[data-sources.tidb0] +host = "127.0.0.1" +port = 4000 +user = "root" +password = "" diff --git a/dumpling/tests/rows_extreme_int/conf/lightning.toml b/dumpling/tests/rows_extreme_int/conf/lightning.toml new file mode 100644 index 0000000000000..457da0e911851 --- /dev/null +++ b/dumpling/tests/rows_extreme_int/conf/lightning.toml @@ -0,0 +1,20 @@ +### tidb-lightning config + +[lightning] +server-mode = false +level = "error" +check-requirements = false + +[tikv-importer] +backend="tidb" +on-duplicate = "error" + +[mydumper] +data-source-dir = "/tmp/dumpling_test_result/sql_res.rows_extreme_int" + +[tidb] +host = "127.0.0.1" +port = 4000 +user = "root" +password = "" +status-port = 10080 diff --git a/dumpling/tests/rows_extreme_int/data/rei.t.0.sql b/dumpling/tests/rows_extreme_int/data/rei.t.0.sql new file mode 100644 index 0000000000000..1f86071a8cd06 --- /dev/null +++ b/dumpling/tests/rows_extreme_int/data/rei.t.0.sql @@ -0,0 +1,103 @@ +insert into `rei`.`t` (a) values +('8_/GI}Oh&|YPo0k,@[FB'), +("Lnx3WawtgN'.J)\n[C-V!"), +("$cislLng'V/`Ce[\\\nA4K"), +('&)Jd_tHBY-!Lz?Ij0f\t*'), +('B1KGE,#[L:@Pq8\n_*ANF'), +("([\\c:'>U/)wDN4zQf\tC6"), +('$G\\pS,%BRzsCUqWr^`}3'), +('L5mNTib.KEJCRcl}>\res'), +("MaQ.3K'e_ 7nirjET;x\r"), +(']!62nVsu <y8vIzQYD0P'), +('\\bWPzU(KFfmx~2E54k!A'), +('H$<j?)C; t2S=\rEdZyL,'), +('t\r''X)G]DLIuH$f@b"-;S'), +('~dptv(IQ _cR7xYE1`yz'), +('E(}|qA%-]u{)BQ:jGLVC'), +('Rg&ya"|w60< KYJ#ElU7'), +('N}p9uE;,rTne^0B"yLhq'), +('{2T7!>s&@|A_<%O1v*8W'), +('+[2lwQ!\tL{RsnK]$%E&?'), +('h]e*:;$k"VcHi\t6%X\nQB'), +('|<KrxRV\ri!p*FfS3:n=\t'), +('/#f-K$Uj3y6&:i`Rh[~}'), +('08ci<#NP:~-,[D\ry}>=A'), +(";]KwM~F$z.(L'S-N@7Ug"), +('IlDa4YQ[\r;?h65/ZU+mS'), +("QwfKAPBs=MW,\r0E'i?V1"), +("k*90\\Re!#vfYGx:)g'r3"), +("YS:I(/<NQf>ro'`kzaH\t"), +('1`Bq|a9;o"Y]3bM4W_Sh'), +(".MgK'p)+@hY[L:63J>nl"), +('h8gLDqZX:B4OTuYRV=,\\'), +("=]W7N(1}\nKM\\m'xR[?pB"), +('7)_p.;2xoUflRWC<"g/T'), +('.4l]KZ?O8Vkj{;wb0JQ#'), +("x>eRCk?(yJF\t3'g@\rzDl"), +('4b3J{^_p7|L& jGKla\\h'), +("a9\tobE$MG@>.[:_~c2W'"), +('FwK`^GQ>t 3T]vh?A2c\n'), +('7\r%]}Ypk,2LVGW:?d10f'), +('[wmEMFr.bsU;(oflk^7@'), +('?Kb;WeyDh3RF@\nZN,79O'), +('?7]fDsbrUp1I|Yu5(.)N'), +('\tH:`BZi/fbxWnA|.y~{*'), +('md}O[U,FsQI- A1rn^b5'), +('Fz~;,W!3_\th}c"m.V #>'), +('w3ql-W&r*9I@R$\rHu8c '), +('m0!FSH\\pf8GOnN &;CD>'), +(']%-ICWRGJZc\t.BrTKLeS'), +('pHF!GAjkau%N~[h$b7nX'), +(' #{$TiS9w)WCmQ,}n!kv'), +("LWR4qGO/D'&%l`3\nbe^N"), +('S!rfCOj)y\t\r7:nF2shXK'), +('p]de%o\tn 9|6f7IDB`V='), +(':F^#IA%p!w t2m-U;6[E'), +("uioc\rdDV|t@z$7'+0\nIm"), +('7OR\t2?q]{6[QD#kCMig5'), +('GF-LA{&> 0a)tTkO4Mj_'), +('&Ea),-@<gF{21s7X/p"u'), +('5=,YreMA2-y\\3+h^pJsw'), +('\tn"d:bG$lHYQ_Dfp5)?4'), +("o\\7!'&E}gef~M-)$Vbv>"), +('cl5AUQHpP"+r\tj}dg)#*'), +('S1yA;V*E9GsdT(8Hvk|e'), +('Q.eHaOSnkX"x|]w3:;U~'), +('%SRh2]B\nEbu> `\\wp05('), +('1rJc8<(`2q?7sPHzxh.4'), +('( ymTM_+QeZH6KlOR{Di'), +("]Q'2{4iD^,~M0&K*x:<}"), +('O"my6Egs|z$abwSA''}5 '), +('Gl0}W[~N5: 1n=@TJ_F,'), +('|orp1hJXz6]sZiA9DSnH'), +('I<aZs|oK15:x6Vt^9Ww)'), +('S/!_JAI#}`Vc\\4d5{81?'), +('"IB[Q~L@3:c-.O{rkZ}E'), +('8*\n%){GwO~yT^mL/ph0t'), +('`6+/Zy.B_Y[evD@ 9zbp'), +('%zF5&r\\^|N(*kfg{QRjS'), +('p8y"t1-#rq:|mjhM\tWi+'), +('=eBH%l\rP_+qUr)NYDhv;'), +('hr\\z>-:,u+FK32qf0TXw'), +('-sQD>=rN|[ZLR\r\tPGW6u'), +('M)[2EZ.SyzV4dR!~\r"w9'), +('3`Ms\t%!?zZR\no>xG|&JP'), +(':UR8;-x2"{e3P# mlvTG'), +("Z#|> :~or1XS*^$c'j?2"), +('=^?D_Xf\tQ{P%UoYl<pA,'), +('b8cQ0S\n\\>.v_usEO{J\ty'), +('YmW$pkSLqjGxV+)A"KCP'), +('K+aZU\\EnV!qm}vW\rd.c\t'), +("'?dR3JHn(~)p}Gq4z-F!"), +('\\IW(ip!2_Ab}ydfXQ01P'), +(')#b\n&,WwYT{vyMK]\ra/\\'), +('\\F0d~2[K/fk>Ij{^]gLH'), +('78cm$y#4?S;PV]\\Oex=E'), +('d"h=\n\\k)8!:C?qKD(NB['), +(' Vemr1.kpU@B|qQ=M{O#'); +-- add negative primary key +insert into `rei`.`t` (`id`,`a`) values +(-1,'vr/g 8uoZ&26U+*%|(k3'), +(-2,':v3uo7whT`Zz>tD=[,)\r'), +(2147483647,'nuq,%sl5+i/pX2''Ur-"`'), +(2147483646,"\tB>+a?]m\\9T!{2X@I:'k"); \ No newline at end of file diff --git a/dumpling/tests/rows_extreme_int/data/rei.t2.0.sql b/dumpling/tests/rows_extreme_int/data/rei.t2.0.sql new file mode 100644 index 0000000000000..db262925eccc4 --- /dev/null +++ b/dumpling/tests/rows_extreme_int/data/rei.t2.0.sql @@ -0,0 +1,103 @@ +insert into `rei`.`t2` (a) values +('nuq,%sl5+i/pX2''Ur-"`'), +("\tB>+a?]m\\9T!{2X@I:'k"), +('8_/GI}Oh&|YPo0k,@[FB'), +("Lnx3WawtgN'.J)\n[C-V!"), +("$cislLng'V/`Ce[\\\nA4K"), +('&)Jd_tHBY-!Lz?Ij0f\t*'), +('B1KGE,#[L:@Pq8\n_*ANF'), +("([\\c:'>U/)wDN4zQf\tC6"), +('$G\\pS,%BRzsCUqWr^`}3'), +('L5mNTib.KEJCRcl}>\res'), +("MaQ.3K'e_ 7nirjET;x\r"), +(']!62nVsu <y8vIzQYD0P'), +('\\bWPzU(KFfmx~2E54k!A'), +('H$<j?)C; t2S=\rEdZyL,'), +('t\r''X)G]DLIuH$f@b"-;S'), +('~dptv(IQ _cR7xYE1`yz'), +('E(}|qA%-]u{)BQ:jGLVC'), +('Rg&ya"|w60< KYJ#ElU7'), +('N}p9uE;,rTne^0B"yLhq'), +('{2T7!>s&@|A_<%O1v*8W'), +('+[2lwQ!\tL{RsnK]$%E&?'), +('h]e*:;$k"VcHi\t6%X\nQB'), +('|<KrxRV\ri!p*FfS3:n=\t'), +('/#f-K$Uj3y6&:i`Rh[~}'), +('08ci<#NP:~-,[D\ry}>=A'), +(";]KwM~F$z.(L'S-N@7Ug"), +('IlDa4YQ[\r;?h65/ZU+mS'), +("QwfKAPBs=MW,\r0E'i?V1"), +("k*90\\Re!#vfYGx:)g'r3"), +("YS:I(/<NQf>ro'`kzaH\t"), +('1`Bq|a9;o"Y]3bM4W_Sh'), +(".MgK'p)+@hY[L:63J>nl"), +('h8gLDqZX:B4OTuYRV=,\\'), +("=]W7N(1}\nKM\\m'xR[?pB"), +('7)_p.;2xoUflRWC<"g/T'), +('.4l]KZ?O8Vkj{;wb0JQ#'), +("x>eRCk?(yJF\t3'g@\rzDl"), +('4b3J{^_p7|L& jGKla\\h'), +("a9\tobE$MG@>.[:_~c2W'"), +('FwK`^GQ>t 3T]vh?A2c\n'), +('7\r%]}Ypk,2LVGW:?d10f'), +('[wmEMFr.bsU;(oflk^7@'), +('?Kb;WeyDh3RF@\nZN,79O'), +('?7]fDsbrUp1I|Yu5(.)N'), +('\tH:`BZi/fbxWnA|.y~{*'), +('md}O[U,FsQI- A1rn^b5'), +('Fz~;,W!3_\th}c"m.V #>'), +('w3ql-W&r*9I@R$\rHu8c '), +('m0!FSH\\pf8GOnN &;CD>'), +(']%-ICWRGJZc\t.BrTKLeS'), +('pHF!GAjkau%N~[h$b7nX'), +(' #{$TiS9w)WCmQ,}n!kv'), +("LWR4qGO/D'&%l`3\nbe^N"), +('S!rfCOj)y\t\r7:nF2shXK'), +('p]de%o\tn 9|6f7IDB`V='), +(':F^#IA%p!w t2m-U;6[E'), +("uioc\rdDV|t@z$7'+0\nIm"), +('7OR\t2?q]{6[QD#kCMig5'), +('GF-LA{&> 0a)tTkO4Mj_'), +('&Ea),-@<gF{21s7X/p"u'), +('5=,YreMA2-y\\3+h^pJsw'), +('\tn"d:bG$lHYQ_Dfp5)?4'), +("o\\7!'&E}gef~M-)$Vbv>"), +('cl5AUQHpP"+r\tj}dg)#*'), +('S1yA;V*E9GsdT(8Hvk|e'), +('Q.eHaOSnkX"x|]w3:;U~'), +('%SRh2]B\nEbu> `\\wp05('), +('1rJc8<(`2q?7sPHzxh.4'), +('( ymTM_+QeZH6KlOR{Di'), +("]Q'2{4iD^,~M0&K*x:<}"), +('O"my6Egs|z$abwSA''}5 '), +('Gl0}W[~N5: 1n=@TJ_F,'), +('|orp1hJXz6]sZiA9DSnH'), +('I<aZs|oK15:x6Vt^9Ww)'), +('S/!_JAI#}`Vc\\4d5{81?'), +('"IB[Q~L@3:c-.O{rkZ}E'), +('8*\n%){GwO~yT^mL/ph0t'), +('`6+/Zy.B_Y[evD@ 9zbp'), +('%zF5&r\\^|N(*kfg{QRjS'), +('p8y"t1-#rq:|mjhM\tWi+'), +('=eBH%l\rP_+qUr)NYDhv;'), +('hr\\z>-:,u+FK32qf0TXw'), +('-sQD>=rN|[ZLR\r\tPGW6u'), +('M)[2EZ.SyzV4dR!~\r"w9'), +('3`Ms\t%!?zZR\no>xG|&JP'), +(':UR8;-x2"{e3P# mlvTG'), +("Z#|> :~or1XS*^$c'j?2"), +('=^?D_Xf\tQ{P%UoYl<pA,'), +('b8cQ0S\n\\>.v_usEO{J\ty'), +('YmW$pkSLqjGxV+)A"KCP'), +('K+aZU\\EnV!qm}vW\rd.c\t'), +("'?dR3JHn(~)p}Gq4z-F!"), +('\\IW(ip!2_Ab}ydfXQ01P'), +(')#b\n&,WwYT{vyMK]\ra/\\'), +('\\F0d~2[K/fk>Ij{^]gLH'), +('78cm$y#4?S;PV]\\Oex=E'), +('d"h=\n\\k)8!:C?qKD(NB['), +(' Vemr1.kpU@B|qQ=M{O#'); +-- add unsigned primary key +insert into `rei`.`t2` (id,a) values +(18446744073709551615,'vr/g 8uoZ&26U+*%|(k3'), +(18446744073709551614,':v3uo7whT`Zz>tD=[,)\r'); \ No newline at end of file diff --git a/dumpling/tests/rows_extreme_int/run.sh b/dumpling/tests/rows_extreme_int/run.sh new file mode 100644 index 0000000000000..5f9772c8c2c3d --- /dev/null +++ b/dumpling/tests/rows_extreme_int/run.sh @@ -0,0 +1,46 @@ +#!/bin/sh +# +# Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +set -eu +cur=$(cd `dirname $0`; pwd) + +DB_NAME="rei" +TABLE_NAME="t" +TABLE_NAME2="t2" + +# drop database on tidb +export DUMPLING_TEST_PORT=4000 +run_sql "drop database if exists \`$DB_NAME\`;" + +# drop database on mysql +export DUMPLING_TEST_PORT=3306 +run_sql "drop database if exists \`$DB_NAME\`;" + +# build data on mysql +run_sql "create database $DB_NAME;" +run_sql "create table $DB_NAME.$TABLE_NAME (id int not null auto_increment primary key, a varchar(24));" +run_sql "create table $DB_NAME.$TABLE_NAME2 (id bigint unsigned not null auto_increment primary key, a varchar(24));" + +# insert 100 records +run_sql_file "$cur/data/rei.t.0.sql" + +# insert 100 records +run_sql_file "$cur/data/rei.t2.0.sql" + +# analyze table for making sure the estimateCount is correct +run_sql "analyze table $DB_NAME.$TABLE_NAME;" +run_sql "analyze table $DB_NAME.$TABLE_NAME2;" + +# dumping +export DUMPLING_TEST_DATABASE=$DB_NAME +run_dumpling --rows 10 --loglevel debug + +cat "$cur/conf/lightning.toml" +# use lightning import data to tidb +run_lightning $cur/conf/lightning.toml + +# check mysql and tidb data +check_sync_diff $cur/conf/diff_config.toml + + diff --git a/dumpling/tests/run.sh b/dumpling/tests/run.sh new file mode 100755 index 0000000000000..8ccb1bbbbd297 --- /dev/null +++ b/dumpling/tests/run.sh @@ -0,0 +1,67 @@ +#!/bin/bash +# +# Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +# To avoid permission denied error, please run `chmod +x tests/_utils/*`. + +DUMPLING_TEST_DIR=${DUMPLING_TEST_DIR:-"/tmp/dumpling_test_result"} +DUMPLING_TEST_USER=${DUMPLING_TEST_USER:-"root"} + +export DUMPLING_TEST_DIR +export DUMPLING_TEST_USER +export DUMPLING_TEST_PORT=3306 + +set -eu + +mkdir -p "$DUMPLING_TEST_DIR" +PATH="dumpling/tests/_utils:$PATH" +. "dumpling/tests/_utils/run_services" + +file_should_exist bin/tidb-server +file_should_exist bin/tidb-lightning +file_should_exist bin/dumpling +file_should_exist bin/sync_diff_inspector + +trap stop_services EXIT +start_services + +function run_case_by_fullpath() { + script="$1" + echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Running test $script..." + DUMPLING_BASE_NAME="$(dirname "$script")" + export DUMPLING_BASE_NAME + TEST_NAME="$(basename "$(dirname "$script")")" + DUMPLING_OUTPUT_DIR="$DUMPLING_TEST_DIR"/sql_res."$TEST_NAME" + export DUMPLING_OUTPUT_DIR + + VERBOSE=${VERBOSE-} + # run in verbose mode? + echo "Verbose mode = $VERBOSE" + if [ "$VERBOSE" = "true" ]; then + PATH="tests/_utils:$PATH" \ + PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }' \ + bash -x "$script" + else + PATH="tests/_utils:$PATH" \ + bash +x "$script" + fi + echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> TEST: $script Passed Cleaning up test output dir: $DUMPLING_OUTPUT_DIR" + rm -rf "$DUMPLING_OUTPUT_DIR" +} + +if [ "$#" -ge 1 ]; then + test_case="$@" +else + test_case="*" +fi + +if [ "$test_case" == "*" ]; then + for script in dumpling/tests/*/run.sh; do + run_case_by_fullpath "$script" + done +else + script="dumpling/tests/$test_case/run.sh" + run_case_by_fullpath "$script" +fi + +echo "Passed integration tests." diff --git a/dumpling/tests/s3/run.sh b/dumpling/tests/s3/run.sh new file mode 100755 index 0000000000000..1f013b0990f5e --- /dev/null +++ b/dumpling/tests/s3/run.sh @@ -0,0 +1,67 @@ +#!/bin/sh +# +# Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +set -eux + +echo "starting localstack writing to ${DUMPLING_OUTPUT_DIR}" +mkdir -p "${DUMPLING_OUTPUT_DIR}" +ls "${DUMPLING_OUTPUT_DIR}" + +DBPATH="${DUMPLING_OUTPUT_DIR}/s3.minio" + +export MINIO_ACCESS_KEY=testid +export MINIO_SECRET_KEY=testkey8 +export MINIO_BROWSER=off +export S3_ENDPOINT=127.0.0.1:5000 +bin/minio server --address $S3_ENDPOINT "$DBPATH" & +MINIO_PID=$! + +i=0 +while ! curl -o /dev/null -v -s "http://$S3_ENDPOINT/"; do + i=$(($i+1)) + if [ $i -gt 7 ]; then + echo 'Failed to start minio' + exit 1 + fi + sleep 2 +done + +cleanup() { + echo "Stopping motoserver" + kill -2 $MINIO_PID +} +trap cleanup EXIT + +mkdir -p "$DBPATH/mybucket" + +DB_NAME="s3" +TABLE_NAME="t" + +# drop database on mysql +run_sql "drop database if exists \`$DB_NAME\`;" + +# build data on mysql +run_sql "create database $DB_NAME;" +run_sql "create table $DB_NAME.$TABLE_NAME (a int(255));" + +# insert 100 records +run_sql "insert into $DB_NAME.$TABLE_NAME values $(seq -s, 100 | sed 's/,*$//g' | sed "s/[0-9]*/('1')/g");" + +# run dumpling! +HOST_DIR=${DUMPLING_OUTPUT_DIR} +export DUMPLING_OUTPUT_DIR=s3://mybucket/dump +export DUMPLING_TEST_DATABASE=$DB_NAME +export AWS_REGION=us-east-1 +export AWS_ACCESS_KEY_ID="$MINIO_ACCESS_KEY" +export AWS_SECRET_ACCESS_KEY="$MINIO_SECRET_KEY" +run_dumpling --s3.endpoint="http://$S3_ENDPOINT/" +ls "${HOST_DIR}" + +curl -o "${HOST_DIR}/s3-schema-create.sql" http://$S3_ENDPOINT/mybucket/dump/s3-schema-create.sql +curl -o "${HOST_DIR}/s3.t-schema.sql" http://$S3_ENDPOINT/mybucket/dump/s3.t-schema.sql +curl -o "${HOST_DIR}/s3.t.000000000.sql" http://$S3_ENDPOINT/mybucket/dump/s3.t.000000000.sql + +file_should_exist "$HOST_DIR/s3-schema-create.sql" +file_should_exist "$HOST_DIR/s3.t-schema.sql" +file_should_exist "$HOST_DIR/s3.t.000000000.sql" diff --git a/dumpling/tests/tls/ipsan.cnf b/dumpling/tests/tls/ipsan.cnf new file mode 100644 index 0000000000000..2df6bf204ced4 --- /dev/null +++ b/dumpling/tests/tls/ipsan.cnf @@ -0,0 +1,11 @@ +[dn] +CN = 127.0.0.1 +[req] +distinguished_name = dn +[EXT] +subjectAltName = @alt_names +keyUsage = digitalSignature,keyEncipherment +extendedKeyUsage = clientAuth,serverAuth +[alt_names] +DNS.1 = localhost +IP.1 = 127.0.0.1 diff --git a/dumpling/tests/tls/run.sh b/dumpling/tests/tls/run.sh new file mode 100755 index 0000000000000..0e25226109a16 --- /dev/null +++ b/dumpling/tests/tls/run.sh @@ -0,0 +1,29 @@ +#!/bin/sh +# +# Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +set -eux + +WITH_TLS="--ssl-ca=$DUMPLING_TEST_DIR/ca.pem --ssl-cert=$DUMPLING_TEST_DIR/dumpling.pem --ssl-key=$DUMPLING_TEST_DIR/dumpling.key" + +# create a user which can only connect using the "dumpling" cert. +export DUMPLING_TEST_PORT=4000 +run_sql 'drop user if exists dumper;' +run_sql "create user dumper require subject '/CN=127.0.0.1/OU=dumpling';" +run_sql 'grant all on tls.* to dumper;' + +# make some sample data. +export DUMPLING_TEST_USER=dumper +run_sql 'drop database if exists tls;' $WITH_TLS +run_sql 'create database tls;' $WITH_TLS +export DUMPLING_TEST_DATABASE=tls +run_sql 'create table t (a int);' $WITH_TLS +run_sql 'insert into t values (1), (2), (3);' $WITH_TLS + +# run dumpling! +# (we need '--consistency none' because dumper does not have SELECT permission of `mysql`.`tidb`) +run_dumpling --ca "$DUMPLING_TEST_DIR/ca.pem" --cert "$DUMPLING_TEST_DIR/dumpling.pem" --key "$DUMPLING_TEST_DIR/dumpling.key" --consistency none + +file_should_exist "$DUMPLING_OUTPUT_DIR/tls-schema-create.sql" +file_should_exist "$DUMPLING_OUTPUT_DIR/tls.t-schema.sql" +file_should_exist "$DUMPLING_OUTPUT_DIR/tls.t.000000000.sql" diff --git a/dumpling/tests/views/data/views-schema-create.sql b/dumpling/tests/views/data/views-schema-create.sql new file mode 100644 index 0000000000000..2c9d318c1708c --- /dev/null +++ b/dumpling/tests/views/data/views-schema-create.sql @@ -0,0 +1,3 @@ +/*!40101 SET NAMES binary*/; +/*T![placement] SET PLACEMENT_CHECKS = 0*/; +CREATE DATABASE `views` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin */ /*!80016 DEFAULT ENCRYPTION='N' */; diff --git a/dumpling/tests/views/data/views.v-schema-view.sql b/dumpling/tests/views/data/views.v-schema-view.sql new file mode 100644 index 0000000000000..4533ab5c9d668 --- /dev/null +++ b/dumpling/tests/views/data/views.v-schema-view.sql @@ -0,0 +1,14 @@ +/*!40101 SET NAMES binary*/; +/*T![placement] SET PLACEMENT_CHECKS = 0*/; +DROP TABLE IF EXISTS `v`; +DROP VIEW IF EXISTS `v`; +SET @PREV_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT; +SET @PREV_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS; +SET @PREV_COLLATION_CONNECTION=@@COLLATION_CONNECTION; +SET character_set_client = utf8mb4; +SET character_set_results = utf8mb4; +SET collation_connection = utf8mb4_general_ci; +CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `views`.`v` AS select `views`.`t`.`a` AS `a`,`views`.`t`.`b` AS `b` from `views`.`t`; +SET character_set_client = @PREV_CHARACTER_SET_CLIENT; +SET character_set_results = @PREV_CHARACTER_SET_RESULTS; +SET collation_connection = @PREV_COLLATION_CONNECTION; diff --git a/dumpling/tests/views/data/views.v-schema.sql b/dumpling/tests/views/data/views.v-schema.sql new file mode 100644 index 0000000000000..f3054eacd2cff --- /dev/null +++ b/dumpling/tests/views/data/views.v-schema.sql @@ -0,0 +1,6 @@ +/*!40101 SET NAMES binary*/; +/*T![placement] SET PLACEMENT_CHECKS = 0*/; +CREATE TABLE `v`( +`a` int, +`b` int +)ENGINE=MyISAM; diff --git a/dumpling/tests/views/run.sh b/dumpling/tests/views/run.sh new file mode 100644 index 0000000000000..b97513543db5c --- /dev/null +++ b/dumpling/tests/views/run.sh @@ -0,0 +1,35 @@ +#!/bin/sh +# +# Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0. + +set -eu + +run_sql "drop database if exists views" +run_sql_file "$DUMPLING_BASE_NAME/data/views-schema-create.sql" +export DUMPLING_TEST_DATABASE="views" + +run_sql "create table t (a bigint, b varchar(255))" +run_sql_file "$DUMPLING_BASE_NAME/data/views.v-schema-view.sql" + +# insert 20 records to `t`. +run_sql "insert into t values $(seq -s, 20 | sed 's/,*$//g' | sed 's/[0-9]*/(\0,"\0")/g')" + +run_dumpling --no-views +file_not_exist "$DUMPLING_OUTPUT_DIR/views.v-schema.sql" +file_not_exist "$DUMPLING_OUTPUT_DIR/views.v-schema-view.sql" + +rm -rf $DUMPLING_OUTPUT_DIR +run_dumpling --no-views=false +#diff "$DUMPLING_BASE_NAME/data/views-schema-create.sql" "$DUMPLING_OUTPUT_DIR/views-schema-create.sql" +diff "$DUMPLING_BASE_NAME/data/views.v-schema.sql" "$DUMPLING_OUTPUT_DIR/views.v-schema.sql" +diff "$DUMPLING_BASE_NAME/data/views.v-schema-view.sql" "$DUMPLING_OUTPUT_DIR/views.v-schema-view.sql" +file_not_exist "$DUMPLING_OUTPUT_DIR/views.v.000000000.sql" + +# test --no-schemas +rm -rf $DUMPLING_OUTPUT_DIR +run_dumpling --no-schemas +file_not_exist "$DUMPLING_OUTPUT_DIR/views-schema-create.sql" +file_not_exist "$DUMPLING_OUTPUT_DIR/views.t-schema.sql" +file_not_exist "$DUMPLING_OUTPUT_DIR/views.v-schema.sql" +file_not_exist "$DUMPLING_OUTPUT_DIR/views.v-schema-view.sql" +file_not_exist "$DUMPLING_OUTPUT_DIR/views.v.000000000.sql" diff --git a/dumpling/tools/.gitignore b/dumpling/tools/.gitignore new file mode 100644 index 0000000000000..e660fd93d3196 --- /dev/null +++ b/dumpling/tools/.gitignore @@ -0,0 +1 @@ +bin/ diff --git a/dumpling/tools/Makefile b/dumpling/tools/Makefile new file mode 100644 index 0000000000000..468f9840172d3 --- /dev/null +++ b/dumpling/tools/Makefile @@ -0,0 +1,14 @@ +all: bin/govet bin/revive bin/golangci-lint bin/failpoint-ctl + +bin/govet: + go build -o $@ github.com/dnephin/govet + +bin/revive: + go build -o $@ github.com/mgechev/revive + +bin/golangci-lint: + go build -o $@ github.com/golangci/golangci-lint/cmd/golangci-lint + +bin/failpoint-ctl: + go build -o $@ github.com/pingcap/failpoint/failpoint-ctl + diff --git a/dumpling/tools/go.mod b/dumpling/tools/go.mod new file mode 100644 index 0000000000000..38b8eb1890674 --- /dev/null +++ b/dumpling/tools/go.mod @@ -0,0 +1,10 @@ +module github.com/pingcap/tidb/dumpling/_tools + +go 1.16 + +require ( + github.com/dnephin/govet v0.0.0-20171012192244-4a96d43e39d3 + github.com/golangci/golangci-lint v1.33.0 + github.com/mgechev/revive v1.0.2 + github.com/pingcap/failpoint v0.0.0-20210918120811-547c13e3eb00 +) diff --git a/dumpling/tools/go.sum b/dumpling/tools/go.sum new file mode 100644 index 0000000000000..14be46a282212 --- /dev/null +++ b/dumpling/tools/go.sum @@ -0,0 +1,639 @@ +4d63.com/gochecknoglobals v0.0.0-20201008074935-acfc0b28355a h1:wFEQiK85fRsEVF0CRrPAos5LoAryUsIX1kPW/WrIqFw= +4d63.com/gochecknoglobals v0.0.0-20201008074935-acfc0b28355a/go.mod h1:wfdC5ZjKSPr7CybKEcgJhUOgeAQW1+7WcyK8OvUilfo= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/Djarvur/go-err113 v0.0.0-20200511133814-5174e21577d5 h1:XTrzB+F8+SpRmbhAH8HLxhiiG6nYNwaBZjrFps1oWEk= +github.com/Djarvur/go-err113 v0.0.0-20200511133814-5174e21577d5/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= +github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= +github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/OpenPeeDeeP/depguard v1.0.1 h1:VlW4R6jmBIv3/u1JNlawEvJMM4J+dPORPaZasQee8Us= +github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= +github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/bombsimon/wsl/v3 v3.1.0 h1:E5SRssoBgtVFPcYWUOFJEcgaySgdtTNYzsSKDOY7ss8= +github.com/bombsimon/wsl/v3 v3.1.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/daixiang0/gci v0.2.4 h1:BUCKk5nlK2m+kRIsoj+wb/5hazHvHeZieBKWd9Afa8Q= +github.com/daixiang0/gci v0.2.4/go.mod h1:+AV8KmHTGxxwp/pY84TLQfFKp2vuKXXJVzF3kD/hfR4= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denis-tingajkin/go-header v0.3.1 h1:ymEpSiFjeItCy1FOP+x0M2KdCELdEAHUsNa8F+hHc6w= +github.com/denis-tingajkin/go-header v0.3.1/go.mod h1:sq/2IxMhaZX+RRcgHfCRx/m0M5na0fBt4/CRe7Lrji0= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dnephin/govet v0.0.0-20171012192244-4a96d43e39d3 h1:LrNBULdC8dhFb7VeeIfuLAVq2IOFtVD9zIYh838jWfM= +github.com/dnephin/govet v0.0.0-20171012192244-4a96d43e39d3/go.mod h1:pPTX0MEEoAnfbrAGFj4nSVNhl6YbugRj6eardUZdtGo= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= +github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= +github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-critic/go-critic v0.5.2 h1:3RJdgf6u4NZUumoP8nzbqiiNT8e1tC2Oc7jlgqre/IA= +github.com/go-critic/go-critic v0.5.2/go.mod h1:cc0+HvdE3lFpqLecgqMaJcvWWH77sLdBp+wLGPM1Yyo= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-toolsmith/astcast v1.0.0 h1:JojxlmI6STnFVG9yOImLeGREv8W2ocNUM+iOhR6jE7g= +github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= +github.com/go-toolsmith/astcopy v1.0.0 h1:OMgl1b1MEpjFQ1m5ztEO06rz5CUd3oBv9RF7+DyvdG8= +github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= +github.com/go-toolsmith/astequal v1.0.0 h1:4zxD8j3JRFNyLN46lodQuqz3xdKSrur7U/sr0SDS/gQ= +github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astfmt v1.0.0 h1:A0vDDXt+vsvLEdbMFJAUBI/uTbRw1ffOPnxsILnFL6k= +github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= +github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= +github.com/go-toolsmith/astp v1.0.0 h1:alXE75TXgcmupDsMK1fRAy0YUzLzqPVvBKoyWV+KPXg= +github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= +github.com/go-toolsmith/pkgload v1.0.0 h1:4DFWWMXVfbcN5So1sBNW9+yeiMqLFGl1wFLTL5R0Tgg= +github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= +github.com/go-toolsmith/strparse v1.0.0 h1:Vcw78DnpCAKlM20kSbAyO4mPfJn/lyYA4BJUDxe2Jb4= +github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= +github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/go-toolsmith/typep v1.0.2 h1:8xdsa1+FSIH/RhEkgnD1j2CJOy5mNllW1Q9tRiYwvlk= +github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b h1:khEcpUM4yFcxg4/FHQWkvVRmgijNXRfzkIDHh23ggEo= +github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/gofrs/flock v0.8.0 h1:MSdYClljsF3PbENUUEx85nkWfJSGfzYI9yEBZOJz6CY= +github.com/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0= +github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= +github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= +github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= +github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6 h1:YYWNAGTKWhKpcLLt7aSj/odlKrSrelQwlovBpDuf19w= +github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0= +github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613 h1:9kfjN3AdxcbsZBf8NjltjWihK2QfBBBZuv91cMFfDHw= +github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= +github.com/golangci/gocyclo v0.0.0-20180528144436-0a533e8fa43d h1:pXTK/gkVNs7Zyy7WKgLXmpQ5bHTrq5GDsp8R9Qs67g0= +github.com/golangci/gocyclo v0.0.0-20180528144436-0a533e8fa43d/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= +github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a h1:iR3fYXUjHCR97qWS8ch1y9zPNsgXThGwjKPrYfqMPks= +github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= +github.com/golangci/golangci-lint v1.33.0 h1:/o4OtOR3Idim4FHKBJXcy+6ZjNDm82gwK/v6+gWyH9U= +github.com/golangci/golangci-lint v1.33.0/go.mod h1:zMnMLSCaDlrXExYsuq2LOweE9CHVqYk5jexk23UsjYM= +github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc h1:gLLhTLMk2/SutryVJ6D4VZCU3CUqr8YloG7FPIBWFpI= +github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU= +github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 h1:MfyDlzVjl1hoaPzPD4Gpb/QgoRfSBR0jdhwGyAWwMSA= +github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= +github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca h1:kNY3/svz5T29MYHubXix4aDDuE3RWHkPvopM/EDv/MA= +github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= +github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770 h1:EL/O5HGrF7Jaq0yNhBLucz9hTuRzj2LdwGBOaENgxIk= +github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= +github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21 h1:leSNB7iYzLYSSx3J/s5sVf4Drkc68W2wm4Ixh/mr0us= +github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI= +github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0 h1:HVfrLniijszjS1aiNg8JbBMO2+E1WIQ+j/gL4SQqGPg= +github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= +github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSWhqsYNgcuWO2kFlpdOZbP0+yRjmvPGys= +github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gookit/color v1.3.1/go.mod h1:R3ogXq2B9rTbXoSHJ1HyUVAZ3poOJHpd9nQmyGZsfvQ= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= +github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= +github.com/gostaticanalysis/analysisutil v0.1.0 h1:E4c8Y1EQURbBEAHoXc/jBTK7Np14ArT8NPUiSFOl9yc= +github.com/gostaticanalysis/analysisutil v0.1.0/go.mod h1:dMhHRU9KTiDcuLGdy87/2gTR8WruwYZrKdRq9m1O6uw= +github.com/gostaticanalysis/comment v1.3.0 h1:wTVgynbFu8/nz6SGgywA0TcyIoAVsYc7ai/Zp5xNGlw= +github.com/gostaticanalysis/comment v1.3.0/go.mod h1:xMicKDx7XRXYdVwY9f9wQpDJVnqWxw9wCauCMKp+IBI= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jgautheron/goconst v0.0.0-20201117150253-ccae5bf973f3 h1:7nkB9fLPMwtn/R6qfPcHileL/x9ydlhw8XyDrLI1ZXg= +github.com/jgautheron/goconst v0.0.0-20201117150253-ccae5bf973f3/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= +github.com/jingyugao/rowserrcheck v0.0.0-20191204022205-72ab7603b68a h1:GmsqmapfzSJkm28dhRoHz2tLRbJmqhU86IPgBtN3mmk= +github.com/jingyugao/rowserrcheck v0.0.0-20191204022205-72ab7603b68a/go.mod h1:xRskid8CManxVta/ALEhJha/pweKBaVG6fWgc0yH25s= +github.com/jirfag/go-printf-func-name v0.0.0-20191110105641-45db9963cdd3 h1:jNYPNLe3d8smommaoQlK7LOA5ESyUJJ+Wf79ZtA7Vp4= +github.com/jirfag/go-printf-func-name v0.0.0-20191110105641-45db9963cdd3/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= +github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= +github.com/jmoiron/sqlx v1.2.1-0.20190826204134-d7d95172beb5/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.10.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.0/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kunwardeep/paralleltest v1.0.2 h1:/jJRv0TiqPoEy/Y8dQxCFJhD56uS/pnvtatgTZBHokU= +github.com/kunwardeep/paralleltest v1.0.2/go.mod h1:ZPqNm1fVHPllh5LPVujzbVz1JN2GhLxSfY+oqUsvG30= +github.com/kyoh86/exportloopref v0.1.8 h1:5Ry/at+eFdkX9Vsdw3qU4YkvGtzuVfzT4X7S77LoN/M= +github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+sBqGZrRkMwPgg= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/maratori/testpackage v1.0.1 h1:QtJ5ZjqapShm0w5DosRjg0PRlSdAdlx+W6cCKoALdbQ= +github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= +github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb h1:RHba4YImhrUVQDHUCe2BNSOz4tVy2yGyXhvYDvxGgeE= +github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+twI54= +github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mbilski/exhaustivestruct v1.1.0 h1:4ykwscnAFeHJruT+EY3M3vdeP8uXMh0VV2E61iR7XD8= +github.com/mbilski/exhaustivestruct v1.1.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= +github.com/mgechev/dots v0.0.0-20190921121421-c36f7dcfbb81 h1:QASJXOGm2RZ5Ardbc86qNFvby9AqkLDibfChMtAg5QM= +github.com/mgechev/dots v0.0.0-20190921121421-c36f7dcfbb81/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= +github.com/mgechev/revive v1.0.2 h1:v0NxxQ7fSFz/u1NQydPo6EGdq7va0J1BtsZmae6kzUg= +github.com/mgechev/revive v1.0.2/go.mod h1:rb0dQy1LVAxW9SWy5R3LPUjevzUbUS316U5MFySA2lo= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/moricho/tparallel v0.2.1 h1:95FytivzT6rYzdJLdtfn6m1bfFJylOJK41+lgv/EHf4= +github.com/moricho/tparallel v0.2.1/go.mod h1:fXEIZxG2vdfl0ZF8b42f5a78EhjjD5mX8qUplsoSU4k= +github.com/mozilla/tls-observatory v0.0.0-20200317151703-4fa42e1c2dee/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/nakabonne/nestif v0.3.0 h1:+yOViDGhg8ygGrmII72nV9B/zGxY188TYpfolntsaPw= +github.com/nakabonne/nestif v0.3.0/go.mod h1:dI314BppzXjJ4HsCnbo7XzrJHPszZsjnk5wEBSYHI2c= +github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d h1:AREM5mwr4u1ORQBMvzfzBgpsctsbQikCVpvC+tX285E= +github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nishanths/exhaustive v0.1.0 h1:kVlMw8h2LHPMGUVqUj6230oQjjTMFjwcZrnkhXzFfl8= +github.com/nishanths/exhaustive v0.1.0/go.mod h1:S1j9110vxV1ECdCudXRkeMnFQ/DQk9ajLT0Uf2MYZQQ= +github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= +github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.1 h1:jMU0WaQrP0a/YAEq8eJmJKjBoMs+pClEr1vDMlM/Do4= +github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.10.2 h1:aY/nuoWlKJud2J6U0E3NWsjlg+0GtwXxgEqthRdzlcs= +github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d h1:CdDQnGF8Nq9ocOS/xlSptM1N3BbrA6/kmaep5ggwaIA= +github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pingcap/failpoint v0.0.0-20210918120811-547c13e3eb00 h1:C3N3itkduZXDZFh4N3vQ5HEtld3S+Y+StULhWVvumU0= +github.com/pingcap/failpoint v0.0.0-20210918120811-547c13e3eb00/go.mod h1:4qGtCB0QK0wBzKtFEGDhxXnSnbQApw1gc9siScUl8ew= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/polyfloyd/go-errorlint v0.0.0-20201006195004-351e25ade6e3 h1:Amgs0nbayPhBNGh1qPqqr2e7B2qNAcBgRjnBH/lmn8k= +github.com/polyfloyd/go-errorlint v0.0.0-20201006195004-351e25ade6e3/go.mod h1:wi9BfjxjF/bwiZ701TzmfKu6UKC357IOAtNr0Td0Lvw= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= +github.com/quasilyte/go-ruleguard v0.2.0 h1:UOVMyH2EKkxIfzrULvA9n/tO+HtEhqD9mrLSWMr5FwU= +github.com/quasilyte/go-ruleguard v0.2.0/go.mod h1:2RT/tf0Ce0UDj5y243iWKosQogJd8+1G3Rs2fxmlYnw= +github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95 h1:L8QM9bvf68pVdQ3bCFZMDmnt9yqcMBro1pC7F+IPYMY= +github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryancurrah/gomodguard v1.1.0 h1:DWbye9KyMgytn8uYpuHkwf0RHqAYO6Ay/D0TbCpPtVU= +github.com/ryancurrah/gomodguard v1.1.0/go.mod h1:4O8tr7hBODaGE6VIhfJDHcwzh5GUccKSJBU0UMXJFVM= +github.com/ryanrolds/sqlclosecheck v0.3.0 h1:AZx+Bixh8zdUBxUA1NxbxVAS78vTPq4rCb8OUZI9xFw= +github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/securego/gosec/v2 v2.5.0 h1:kjfXLeKdk98gBe2+eYRFMpC4+mxmQQtbidpiiOQ69Qc= +github.com/securego/gosec/v2 v2.5.0/go.mod h1:L/CDXVntIff5ypVHIkqPXbtRpJiNCh6c6Amn68jXDjo= +github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU= +github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= +github.com/shirou/gopsutil v0.0.0-20190901111213-e4ec7b275ada/go.mod h1:WWnYX4lzhCH5h/3YBfyVA3VbLYjlMZZAQcW9ojMexNc= +github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sonatard/noctx v0.0.1 h1:VC1Qhl6Oxx9vvWo3UDgrGXYCeKCe3Wbw7qAWL6FrmTY= +github.com/sonatard/noctx v0.0.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4lqBjiZI= +github.com/sourcegraph/go-diff v0.6.1 h1:hmA1LzxW0n1c3Q4YbrFgg4P99GSnebYa3x8gr0HZqLQ= +github.com/sourcegraph/go-diff v0.6.1/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v1.1.1 h1:KfztREH0tPxJJ+geloSLaAkaPkr4ki2Er5quFV1TDo4= +github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= +github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk= +github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/ssgreg/nlreturn/v2 v2.1.0 h1:6/s4Rc49L6Uo6RLjhWZGBpWWjfzk2yrf1nIW8m4wgVA= +github.com/ssgreg/nlreturn/v2 v2.1.0/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/tdakkota/asciicheck v0.0.0-20200416190851-d7f85be797a2 h1:Xr9gkxfOP0KQWXKNqmwe8vEeSUiUj4Rlee9CMVX2ZUQ= +github.com/tdakkota/asciicheck v0.0.0-20200416190851-d7f85be797a2/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= +github.com/tetafro/godot v1.3.0 h1:rKXb6aAz2AnwS98jYlU3snCFFXnIInQdaGiftNwpj+k= +github.com/tetafro/godot v1.3.0/go.mod h1:/7NLHhv08H1+8DNj0MElpAACw1ajsCuf3TKNQxA5S+0= +github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e h1:RumXZ56IrCj4CL+g1b9OL/oH0QnsF976bC8xQFYUD5Q= +github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tomarrell/wrapcheck v0.0.0-20200807122107-df9e8bcb914d h1:3EZyvNUMsGD1QA8cu0STNn1L7I77rvhf2IhOcHYQhSw= +github.com/tomarrell/wrapcheck v0.0.0-20200807122107-df9e8bcb914d/go.mod h1:yiFB6fFoV7saXirUGfuK+cPtUh4NX/Hf5y2WC2lehu0= +github.com/tommy-muehle/go-mnd v1.3.1-0.20200224220436-e6f9a994e8fa h1:RC4maTWLKKwb7p1cnoygsbKIgNlJqSYBeAFON3Ar8As= +github.com/tommy-muehle/go-mnd v1.3.1-0.20200224220436-e6f9a994e8fa/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig= +github.com/ultraware/funlen v0.0.3 h1:5ylVWm8wsNwH5aWo9438pwvsK0QiqVuUrt9bn7S/iLA= +github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= +github.com/ultraware/whitespace v0.0.4 h1:If7Va4cM03mpgrNH9k49/VOicWpGoG70XPBFFODYDsg= +github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= +github.com/uudashr/gocognit v1.0.1 h1:MoG2fZ0b/Eo7NXoIwCVFLG5JED3qgQz5/NEE+rOsjPs= +github.com/uudashr/gocognit v1.0.1/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.16.0/go.mod h1:YOKImeEosDdBPnxc0gy7INqi3m1zK6A+xl6TwOBhHCA= +github.com/valyala/quicktemplate v1.6.3/go.mod h1:fwPzK2fHuYEODzJ9pkw0ipCPNHZ2tD5KW4lOuSdPKzY= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202 h1:VvcQYSHwXgi7W+TpUR6A9g6Up98WAHf3f/ulnJ62IyA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634 h1:bNEHhJCnrwMKNMmOx3yAynp5vs5/gRy+XWFtZFu7NBM= +golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190221204921-83362c3779f5/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190307163923-6a08e3108db3/go.mod h1:25r3+/G6/xytQM8iWZKq3Hn0kr0rgFKPUNVEL/dr3z4= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200117220505-0cba7a3a9ee9/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200225230052-807dcd883420/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200410194907-79a7a3126eef/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200622203043-20e05c1c8ffa/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200624225443-88f3c62a19ff/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200625211823-6506e20df31f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200731060945-b5fad4ed8dd6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200831203904-5a2aa26beb65/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201007032633-0806396f153e/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201011145850-ed2f50202694/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201013201025-64a9e34f3752 h1:2ntEwh02rqo2jSsrYmp4yKHHjh0CbXP3ZtSUetSB+q8= +golang.org/x/tools v0.0.0-20201013201025-64a9e34f3752/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.6 h1:W18jzjh8mfPez+AwGLxmOImucz/IFjpNlrKVnaj2YVc= +honnef.co/go/tools v0.0.1-2020.1.6/go.mod h1:pyyisuGw24ruLjrr1ddx39WE0y9OooInRzEYLhQB2YY= +k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +mvdan.cc/gofumpt v0.0.0-20200802201014-ab5a8192947d h1:t8TAw9WgTLghti7RYkpPmqk4JtQ3+wcP5GgZqgWeWLQ= +mvdan.cc/gofumpt v0.0.0-20200802201014-ab5a8192947d/go.mod h1:bzrjFmaD6+xqohD3KYP0H2FEuxknnBmyyOxdhLdaIws= +mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I= +mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= +mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphDJbHOQO1DFFFTeBo= +mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= +mvdan.cc/unparam v0.0.0-20200501210554-b37ab49443f7 h1:kAREL6MPwpsk1/PQPFD3Eg7WAQR5mPTWZJaBiG5LDbY= +mvdan.cc/unparam v0.0.0-20200501210554-b37ab49443f7/go.mod h1:HGC5lll35J70Y5v7vCGb9oLhHoScFwkHDJm/05RdSTc= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/dumpling/tools/go_mod_guard.go b/dumpling/tools/go_mod_guard.go new file mode 100644 index 0000000000000..15cf078d9bc13 --- /dev/null +++ b/dumpling/tools/go_mod_guard.go @@ -0,0 +1,18 @@ +package tools + +// This file ensures `go mod tidy` will not delete entries to all tools. + +import ( + // golangci-lint is a package-based linter + _ "github.com/golangci/golangci-lint/pkg/commands" + + // revive is a file-based linter + _ "github.com/mgechev/revive" + + // govet checks for code correctness + _ "github.com/dnephin/govet" + + // failpoint enables manual 'failure' of some execution points. + _ "github.com/pingcap/failpoint" + _ "github.com/pingcap/failpoint/code" +) diff --git a/errno/errcode.go b/errno/errcode.go index 1446742b2edb7..ea1fb86ea7e8c 100644 --- a/errno/errcode.go +++ b/errno/errcode.go @@ -901,6 +901,7 @@ const ( ErrFKIncompatibleColumns = 3780 ErrFunctionalIndexRowValueIsNotAllowed = 3800 ErrDependentByFunctionalIndex = 3837 + ErrCannotConvertString = 3854 ErrInvalidJSONValueForFuncIndex = 3903 ErrJSONValueOutOfRangeForFuncIndex = 3904 ErrFunctionalIndexDataIsTooLong = 3907 @@ -1009,6 +1010,7 @@ const ( ErrDataInConsistentMisMatchIndex = 8134 ErrAsOf = 8135 ErrVariableNoLongerSupported = 8136 + ErrAnalyzeMissColumn = 8137 // Error codes used by TiDB ddl package ErrUnsupportedDDLOperation = 8200 @@ -1045,7 +1047,6 @@ const ( ErrUnsupportedConstraintCheck = 8231 ErrTableOptionUnionUnsupported = 8232 ErrTableOptionInsertMethodUnsupported = 8233 - ErrInvalidPlacementSpec = 8234 ErrDDLReorgElementNotExist = 8235 ErrPlacementPolicyCheck = 8236 ErrInvalidAttributesSpec = 8237 @@ -1053,7 +1054,8 @@ const ( ErrPlacementPolicyNotExists = 8239 ErrPlacementPolicyWithDirectOption = 8240 ErrPlacementPolicyInUse = 8241 - + ErrOptOnCacheTable = 8242 + ErrHTTPServiceError = 8243 // TiKV/PD/TiFlash errors. ErrPDServerTimeout = 9001 ErrTiKVServerTimeout = 9002 diff --git a/errno/errname.go b/errno/errname.go index 9e44ef59f7216..607672e19b816 100644 --- a/errno/errname.go +++ b/errno/errname.go @@ -683,7 +683,7 @@ var MySQLErrName = map[uint16]*mysql.ErrMessage{ ErrFailedReadFromParFile: mysql.Message("Failed to read from the .par file", nil), ErrValuesIsNotIntType: mysql.Message("VALUES value for partition '%-.64s' must have type INT", nil), ErrAccessDeniedNoPassword: mysql.Message("Access denied for user '%-.48s'@'%-.255s'", nil), - ErrSetPasswordAuthPlugin: mysql.Message("SET PASSWORD has no significance for users authenticating via plugins", nil), + ErrSetPasswordAuthPlugin: mysql.Message("SET PASSWORD has no significance for user '%-.48s'@'%-.255s' as authentication plugin does not support it.", nil), ErrGrantPluginUserExists: mysql.Message("GRANT with IDENTIFIED WITH is illegal because the user %-.*s already exists", nil), ErrTruncateIllegalFk: mysql.Message("Cannot truncate a table referenced in a foreign key constraint (%.192s)", nil), ErrPluginIsPermanent: mysql.Message("Plugin '%s' is forcePlusPermanent and can not be unloaded", nil), @@ -896,6 +896,7 @@ var MySQLErrName = map[uint16]*mysql.ErrMessage{ ErrFKIncompatibleColumns: mysql.Message("Referencing column '%s' in foreign key constraint '%s' are incompatible", nil), ErrFunctionalIndexRowValueIsNotAllowed: mysql.Message("Expression of expression index '%s' cannot refer to a row value", nil), ErrDependentByFunctionalIndex: mysql.Message("Column '%s' has an expression index dependency and cannot be dropped or renamed", nil), + ErrCannotConvertString: mysql.Message("Cannot convert string '%.64s' from %s to %s", nil), ErrInvalidJSONValueForFuncIndex: mysql.Message("Invalid JSON value for CAST for expression index '%s'", nil), ErrJSONValueOutOfRangeForFuncIndex: mysql.Message("Out of range JSON value for CAST for expression index '%s'", nil), ErrFunctionalIndexDataIsTooLong: mysql.Message("Data too long for expression index '%s'", nil), @@ -1020,6 +1021,7 @@ var MySQLErrName = map[uint16]*mysql.ErrMessage{ ErrAddColumnWithSequenceAsDefault: mysql.Message("Unsupported using sequence as default value in add column '%s'", nil), ErrUnsupportedType: mysql.Message("Unsupported type %T", nil), ErrAnalyzeMissIndex: mysql.Message("Index '%s' in field list does not exist in table '%s'", nil), + ErrAnalyzeMissColumn: mysql.Message("Column '%s' in ANALYZE column option does not exist in table '%s'", nil), ErrCartesianProductUnsupported: mysql.Message("Cartesian product is unsupported", nil), ErrPreparedStmtNotFound: mysql.Message("Prepared statement not found", nil), ErrWrongParamCount: mysql.Message("Wrong parameter count", nil), @@ -1050,7 +1052,6 @@ var MySQLErrName = map[uint16]*mysql.ErrMessage{ ErrPartitionStatsMissing: mysql.Message("Build table: %s global-level stats failed due to missing partition-level stats", nil), ErrNotSupportedWithSem: mysql.Message("Feature '%s' is not supported when security enhanced mode is enabled", nil), - ErrInvalidPlacementSpec: mysql.Message("Invalid placement policy '%s': %s", nil), ErrPlacementPolicyCheck: mysql.Message("Placement policy didn't meet the constraint, reason: %s", nil), ErrMultiStatementDisabled: mysql.Message("client has multi-statement capability disabled. Run SET GLOBAL tidb_multi_statement_mode='ON' after you understand the security risk", nil), ErrAsOf: mysql.Message("invalid as of timestamp: %s", nil), @@ -1060,7 +1061,7 @@ var MySQLErrName = map[uint16]*mysql.ErrMessage{ ErrPlacementPolicyNotExists: mysql.Message("Unknown placement policy '%-.192s'", nil), ErrPlacementPolicyWithDirectOption: mysql.Message("Placement policy '%s' can't co-exist with direct placement options", nil), ErrPlacementPolicyInUse: mysql.Message("Placement policy '%-.192s' is still in use", nil), - + ErrOptOnCacheTable: mysql.Message("'%s' is unsupported on cache tables.", nil), // TiKV/PD errors. ErrPDServerTimeout: mysql.Message("PD server timeout", nil), ErrTiKVServerTimeout: mysql.Message("TiKV server timeout", nil), diff --git a/errno/infoschema_test.go b/errno/infoschema_test.go index 063cd39072031..3878f57b90ddf 100644 --- a/errno/infoschema_test.go +++ b/errno/infoschema_test.go @@ -21,8 +21,6 @@ import ( ) func TestCopySafety(t *testing.T) { - t.Parallel() - IncrementError(123, "user", "host") IncrementError(321, "user2", "host2") IncrementWarning(123, "user", "host") diff --git a/errors.toml b/errors.toml index 2937e21de6e00..87094603930e3 100644 --- a/errors.toml +++ b/errors.toml @@ -21,6 +21,11 @@ error = ''' backup no leader ''' +["BR:Common:ErrEnvNotSpecified"] +error = ''' +environment variable not found +''' + ["BR:Common:ErrFailedToConnect"] error = ''' failed to make gRPC channels @@ -46,6 +51,11 @@ error = ''' internal error ''' +["BR:Common:ErrUnsupportedOperation"] +error = ''' +the operation is not supported +''' + ["BR:Common:ErrVersionMismatch"] error = ''' version mismatch @@ -346,6 +356,11 @@ error = ''' The used table type doesn't support FULLTEXT indexes ''' +["ddl:1221"] +error = ''' +Incorrect usage of %s and %s +''' + ["ddl:1248"] error = ''' Every derived table must have its own alias @@ -676,11 +691,6 @@ error = ''' CREATE/ALTER table with insert method option is not supported ''' -["ddl:8234"] -error = ''' -Invalid placement policy '%s': %s -''' - ["ddl:8236"] error = ''' Placement policy didn't meet the constraint, reason: %s @@ -701,6 +711,11 @@ error = ''' Placement policy '%-.192s' is still in use ''' +["ddl:8242"] +error = ''' +'%s' is unsupported on cache tables. +''' + ["domain:8027"] error = ''' Information schema is out of date: schema failed to update in 1 lease, please make sure TiDB can connect to TiKV @@ -711,6 +726,11 @@ error = ''' Information schema is changed during the execution of the statement(for example, table definition may be updated by other DDL ran in parallel). If you see this error often, try increasing `tidb_max_delta_schema_count`. [try again later] ''' +["domain:8243"] +error = ''' +HTTP request failed with status %s +''' + ["domain:9009"] error = ''' Prometheus address is not set in PD and etcd @@ -751,6 +771,11 @@ error = ''' Incorrect usage of %s and %s ''' +["executor:1235"] +error = ''' +%-.32s is not supported. To enable this experimental feature, set '%-.32s' in the configuration file. +''' + ["executor:1242"] error = ''' Subquery returns more than 1 row @@ -791,11 +816,21 @@ error = ''' You are not allowed to create a user with GRANT ''' +["executor:1524"] +error = ''' +Plugin '%-.192s' is not loaded +''' + ["executor:1568"] error = ''' Transaction characteristics can't be changed while a transaction is in progress ''' +["executor:1699"] +error = ''' +SET PASSWORD has no significance for user '%-.48s'@'%-.255s' as authentication plugin does not support it. +''' + ["executor:1827"] error = ''' The password hash doesn't have the expected format. Check if the correct password algorithm is being used with the PASSWORD() function. @@ -1206,6 +1241,11 @@ error = ''' Operand should contain %d column(s) ''' +["planner:1242"] +error = ''' +Subquery returns more than 1 row +''' + ["planner:1247"] error = ''' Reference '%-.64s' not supported (%s) @@ -1486,6 +1526,16 @@ error = ''' invalid as of timestamp: %s ''' +["planner:8137"] +error = ''' +Column '%s' in ANALYZE column option does not exist in table '%s' +''' + +["planner:8242"] +error = ''' +'%s' is unsupported on cache tables. +''' + ["privilege:1141"] error = ''' There is no such grant defined for user '%-.48s' on host '%-.255s' diff --git a/executor/adapter.go b/executor/adapter.go index 457e0fee67579..87f87a9712516 100644 --- a/executor/adapter.go +++ b/executor/adapter.go @@ -163,8 +163,13 @@ func (a *recordSet) Next(ctx context.Context, req *chunk.Chunk) (err error) { } // NewChunk create a chunk base on top-level executor's newFirstChunk(). -func (a *recordSet) NewChunk() *chunk.Chunk { - return newFirstChunk(a.executor) +func (a *recordSet) NewChunk(alloc chunk.Allocator) *chunk.Chunk { + if alloc == nil { + return newFirstChunk(a.executor) + } + + base := a.executor.base() + return alloc.Alloc(base.retFieldTypes, base.initCap, base.maxChunkSize) } func (a *recordSet) Close() error { @@ -505,8 +510,13 @@ func (c *chunkRowRecordSet) Next(ctx context.Context, chk *chunk.Chunk) error { return nil } -func (c *chunkRowRecordSet) NewChunk() *chunk.Chunk { - return newFirstChunk(c.e) +func (c *chunkRowRecordSet) NewChunk(alloc chunk.Allocator) *chunk.Chunk { + if alloc == nil { + return newFirstChunk(c.e) + } + + base := c.e.base() + return alloc.Alloc(base.retFieldTypes, base.initCap, base.maxChunkSize) } func (c *chunkRowRecordSet) Close() error { @@ -929,7 +939,7 @@ func (a *ExecStmt) LogSlowQuery(txnTS uint64, succ bool, hasMoreResults bool) { cfg := config.GetGlobalConfig() costTime := time.Since(sessVars.StartTime) + sessVars.DurationParse threshold := time.Duration(atomic.LoadUint64(&cfg.Log.SlowThreshold)) * time.Millisecond - enable := cfg.Log.EnableSlowLog + enable := cfg.Log.EnableSlowLog.Load() // if the level is Debug, or trace is enabled, print slow logs anyway force := level <= zapcore.DebugLevel || trace.IsEnabled() if (!enable || costTime < threshold) && !force { @@ -1003,6 +1013,8 @@ func (a *ExecStmt) LogSlowQuery(txnTS uint64, succ bool, hasMoreResults bool) { WriteSQLRespTotal: stmtDetail.WriteSQLRespDuration, ResultRows: GetResultRowsCount(a.Ctx, a.Plan), ExecRetryCount: a.retryCount, + IsExplicitTxn: sessVars.TxnCtx.IsExplicit, + IsWriteCacheTable: sessVars.StmtCtx.WaitLockLeaseTime > 0, } if a.retryCount > 0 { slowItems.ExecRetryTime = costTime - sessVars.DurationParse - sessVars.DurationCompile - time.Since(a.retryStartTime) @@ -1010,13 +1022,12 @@ func (a *ExecStmt) LogSlowQuery(txnTS uint64, succ bool, hasMoreResults bool) { if _, ok := a.StmtNode.(*ast.CommitStmt); ok { slowItems.PrevStmt = sessVars.PrevStmt.String() } + slowLog := sessVars.SlowLogFormat(slowItems) if trace.IsEnabled() { - trace.Log(a.GoCtx, "details", sessVars.SlowLogFormat(slowItems)) + trace.Log(a.GoCtx, "details", slowLog) } - if costTime < threshold { - logutil.SlowQueryLogger.Debug(sessVars.SlowLogFormat(slowItems)) - } else { - logutil.SlowQueryLogger.Warn(sessVars.SlowLogFormat(slowItems)) + logutil.SlowQueryLogger.Warn(slowLog) + if costTime >= threshold { if sessVars.InRestrictedSQL { totalQueryProcHistogramInternal.Observe(costTime.Seconds()) totalCopProcHistogramInternal.Observe(execDetail.TimeDetail.ProcessTime.Seconds()) @@ -1072,7 +1083,7 @@ func getPlanTree(sctx sessionctx.Context, p plannercore.Plan) string { if atomic.LoadUint32(&cfg.Log.RecordPlanInSlowLog) == 0 { return "" } - planTree, _ := getEncodedPlan(sctx, p, false, nil) + planTree, _ := getEncodedPlan(sctx, p, false) if len(planTree) == 0 { return planTree } @@ -1092,7 +1103,7 @@ func getPlanDigest(sctx sessionctx.Context, p plannercore.Plan) (string, *parser } // getEncodedPlan gets the encoded plan, and generates the hint string if indicated. -func getEncodedPlan(sctx sessionctx.Context, p plannercore.Plan, genHint bool, n ast.StmtNode) (encodedPlan, hintStr string) { +func getEncodedPlan(sctx sessionctx.Context, p plannercore.Plan, genHint bool) (encodedPlan, hintStr string) { var hintSet bool encodedPlan = sctx.GetSessionVars().StmtCtx.GetEncodedPlan() hintStr, hintSet = sctx.GetSessionVars().StmtCtx.GetPlanHint() @@ -1150,7 +1161,7 @@ func (a *ExecStmt) SummaryStmt(succ bool) { // No need to encode every time, so encode lazily. planGenerator := func() (string, string) { - return getEncodedPlan(a.Ctx, a.Plan, !sessVars.InRestrictedSQL, a.StmtNode) + return getEncodedPlan(a.Ctx, a.Plan, !sessVars.InRestrictedSQL) } // Generating plan digest is slow, only generate it once if it's 'Point_Get'. // If it's a point get, different SQLs leads to different plans, so SQL digest @@ -1182,6 +1193,9 @@ func (a *ExecStmt) SummaryStmt(succ bool) { if tikvExecDetailRaw != nil { tikvExecDetail = *(tikvExecDetailRaw.(*util.ExecDetails)) } + if stmtCtx.WaitLockLeaseTime > 0 { + execDetail.BackoffSleep["waitLockLeaseForCacheTable"] = stmtCtx.WaitLockLeaseTime + } stmtExecInfo := &stmtsummary.StmtExecInfo{ SchemaName: strings.ToLower(sessVars.CurrentDB), OriginalSQL: sql, diff --git a/executor/adapter_test.go b/executor/adapter_test.go index 40ae6e168b1f0..aea11b207baac 100644 --- a/executor/adapter_test.go +++ b/executor/adapter_test.go @@ -23,7 +23,6 @@ import ( ) func TestQueryTime(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() diff --git a/executor/admin_test.go b/executor/admin_test.go index f52cb3335968b..72aa436babe9b 100644 --- a/executor/admin_test.go +++ b/executor/admin_test.go @@ -1,4 +1,4 @@ -// Copyright 2018 PingCAP, Inc. +// Copyright 2021 PingCAP, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -17,9 +17,9 @@ package executor_test import ( "context" "fmt" + "testing" "time" - . "github.com/pingcap/check" "github.com/pingcap/errors" mysql "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/executor" @@ -29,14 +29,17 @@ import ( "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" + "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/mock" - "github.com/pingcap/tidb/util/testkit" - "github.com/pingcap/tidb/util/testutil" + "github.com/stretchr/testify/require" ) -func (s *testSuite1) TestAdminCheckIndexRange(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestAdminCheckIndexRange(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec(`drop table if exists check_index_test;`) tk.MustExec(`create table check_index_test (a int, b varchar(10), index a_b (a, b), index b (b))`) @@ -52,8 +55,11 @@ func (s *testSuite1) TestAdminCheckIndexRange(c *C) { result.Check(testkit.Rows("-1 hi 4", "2 cd 2")) } -func (s *testSuite5) TestAdminCheckIndex(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestAdminCheckIndex(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") check := func() { tk.MustExec("insert admin_test (c1, c2) values (1, 1), (2, 2), (5, 5), (10, 10), (11, 11), (NULL, NULL)") @@ -78,16 +84,19 @@ func (s *testSuite5) TestAdminCheckIndex(c *C) { check() } -func (s *testSuite5) TestAdminCheckIndexInTemporaryMode(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestAdminCheckIndexInTemporaryMode(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists temporary_admin_test;") tk.MustExec("create global temporary table temporary_admin_test (c1 int, c2 int, c3 int default 1, primary key (c1), index (c1), unique key(c2)) ON COMMIT DELETE ROWS;") tk.MustExec("insert temporary_admin_test (c1, c2) values (1, 1), (2, 2), (3, 3);") _, err := tk.Exec("admin check table temporary_admin_test;") - c.Assert(err.Error(), Equals, core.ErrOptOnTemporaryTable.GenWithStackByArgs("admin check table").Error()) + require.EqualError(t, err, core.ErrOptOnTemporaryTable.GenWithStackByArgs("admin check table").Error()) _, err = tk.Exec("admin check index temporary_admin_test c1;") - c.Assert(err.Error(), Equals, core.ErrOptOnTemporaryTable.GenWithStackByArgs("admin check index").Error()) + require.EqualError(t, err, core.ErrOptOnTemporaryTable.GenWithStackByArgs("admin check index").Error()) tk.MustExec("drop table if exists temporary_admin_test;") tk.MustExec("drop table if exists non_temporary_admin_test;") @@ -101,20 +110,23 @@ func (s *testSuite5) TestAdminCheckIndexInTemporaryMode(c *C) { tk.MustExec("create global temporary table temporary_admin_checksum_table_with_index_test (id int, count int, PRIMARY KEY(id), KEY(count)) ON COMMIT DELETE ROWS;") tk.MustExec("create global temporary table temporary_admin_checksum_table_without_index_test (id int, count int, PRIMARY KEY(id)) ON COMMIT DELETE ROWS;") _, err = tk.Exec("admin checksum table temporary_admin_checksum_table_with_index_test;") - c.Assert(err.Error(), Equals, core.ErrOptOnTemporaryTable.GenWithStackByArgs("admin checksum table").Error()) + require.EqualError(t, err, core.ErrOptOnTemporaryTable.GenWithStackByArgs("admin checksum table").Error()) _, err = tk.Exec("admin checksum table temporary_admin_checksum_table_without_index_test;") - c.Assert(err.Error(), Equals, core.ErrOptOnTemporaryTable.GenWithStackByArgs("admin checksum table").Error()) + require.EqualError(t, err, core.ErrOptOnTemporaryTable.GenWithStackByArgs("admin checksum table").Error()) tk.MustExec("drop table if exists temporary_admin_checksum_table_with_index_test,temporary_admin_checksum_table_without_index_test;") } -func (s *testSuite5) TestAdminCheckIndexInLocalTemporaryMode(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestAdminCheckIndexInLocalTemporaryMode(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists local_temporary_admin_test;") tk.MustExec("create temporary table local_temporary_admin_test (c1 int, c2 int, c3 int default 1, primary key (c1), index (c1), unique key(c2))") tk.MustExec("insert local_temporary_admin_test (c1, c2) values (1,1), (2,2), (3,3);") _, err := tk.Exec("admin check table local_temporary_admin_test;") - c.Assert(err.Error(), Equals, core.ErrOptOnTemporaryTable.GenWithStackByArgs("admin check table").Error()) + require.EqualError(t, err, core.ErrOptOnTemporaryTable.GenWithStackByArgs("admin check table").Error()) tk.MustExec("drop table if exists temporary_admin_test;") tk.MustExec("drop table if exists local_temporary_admin_checksum_table_with_index_test;") @@ -122,14 +134,52 @@ func (s *testSuite5) TestAdminCheckIndexInLocalTemporaryMode(c *C) { tk.MustExec("create temporary table local_temporary_admin_checksum_table_with_index_test (id int, count int, PRIMARY KEY(id), KEY(count))") tk.MustExec("create temporary table local_temporary_admin_checksum_table_without_index_test (id int, count int, PRIMARY KEY(id))") _, err = tk.Exec("admin checksum table local_temporary_admin_checksum_table_with_index_test;") - c.Assert(err.Error(), Equals, core.ErrOptOnTemporaryTable.GenWithStackByArgs("admin checksum table").Error()) + require.EqualError(t, err, core.ErrOptOnTemporaryTable.GenWithStackByArgs("admin checksum table").Error()) _, err = tk.Exec("admin checksum table local_temporary_admin_checksum_table_without_index_test;") - c.Assert(err.Error(), Equals, core.ErrOptOnTemporaryTable.GenWithStackByArgs("admin checksum table").Error()) + require.EqualError(t, err, core.ErrOptOnTemporaryTable.GenWithStackByArgs("admin checksum table").Error()) tk.MustExec("drop table if exists local_temporary_admin_checksum_table_with_index_test,local_temporary_admin_checksum_table_without_index_test;") } -func (s *testSuite5) TestAdminRecoverIndex(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestAdminCheckIndexInCacheTable(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists cache_admin_test;") + tk.MustExec("create table cache_admin_test (c1 int, c2 int, c3 int default 1, index (c1), unique key(c2))") + tk.MustExec("insert cache_admin_test (c1, c2) values (1, 1), (2, 2), (5, 5), (10, 10), (11, 11)") + tk.MustExec("alter table cache_admin_test cache") + tk.MustExec("admin check table cache_admin_test;") + tk.MustExec("admin check index cache_admin_test c1;") + tk.MustExec("admin check index cache_admin_test c2;") + tk.MustExec("drop table if exists cache_admin_test;") + + tk.MustExec(`drop table if exists check_index_test;`) + tk.MustExec(`create table check_index_test (a int, b varchar(10), index a_b (a, b), index b (b))`) + tk.MustExec(`insert check_index_test values (3, "ab"),(2, "cd"),(1, "ef"),(-1, "hi")`) + tk.MustExec("alter table check_index_test cache") + result := tk.MustQuery("admin check index check_index_test a_b (2, 4);") + result.Check(testkit.Rows("1 ef 3", "2 cd 2")) + result = tk.MustQuery("admin check index check_index_test a_b (3, 5);") + result.Check(testkit.Rows("-1 hi 4", "1 ef 3")) + tk.MustExec("drop table if exists check_index_test;") + + tk.MustExec("drop table if exists cache_admin_table_with_index_test;") + tk.MustExec("drop table if exists cache_admin_table_without_index_test;") + tk.MustExec("create table cache_admin_table_with_index_test (id int, count int, PRIMARY KEY(id), KEY(count))") + tk.MustExec("create table cache_admin_table_without_index_test (id int, count int, PRIMARY KEY(id))") + tk.MustExec("alter table cache_admin_table_with_index_test cache") + tk.MustExec("alter table cache_admin_table_without_index_test cache") + tk.MustExec("admin checksum table cache_admin_table_with_index_test;") + tk.MustExec("admin checksum table cache_admin_table_without_index_test;") + tk.MustExec("drop table if exists cache_admin_table_with_index_test,cache_admin_table_without_index_test;") +} +func TestAdminRecoverIndex(t *testing.T) { + store, domain, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists admin_test") tk.MustExec("create table admin_test (c1 int, c2 int, c3 int default 1, index (c1), unique key(c2))") @@ -150,36 +200,36 @@ func (s *testSuite5) TestAdminRecoverIndex(c *C) { // pk is handle, no additional unique index, no way to recover _, err := tk.Exec("admin recover index admin_test c1") // err:index is not found - c.Assert(err, NotNil) + require.Error(t, err) r = tk.MustQuery("admin recover index admin_test c2") r.Check(testkit.Rows("0 5")) tk.MustExec("admin check index admin_test c2") // Make some corrupted index. - s.ctx = mock.NewContext() - s.ctx.Store = s.store - is := s.domain.InfoSchema() + ctx := mock.NewContext() + ctx.Store = store + is := domain.InfoSchema() dbName := model.NewCIStr("test") tblName := model.NewCIStr("admin_test") tbl, err := is.TableByName(dbName, tblName) - c.Assert(err, IsNil) + require.NoError(t, err) tblInfo := tbl.Meta() idxInfo := tblInfo.FindIndexByName("c2") indexOpr := tables.NewIndex(tblInfo.ID, tblInfo, idxInfo) - sc := s.ctx.GetSessionVars().StmtCtx - txn, err := s.store.Begin() - c.Assert(err, IsNil) + sc := ctx.GetSessionVars().StmtCtx + txn, err := store.Begin() + require.NoError(t, err) err = indexOpr.Delete(sc, txn, types.MakeDatums(1), kv.IntHandle(1)) - c.Assert(err, IsNil) + require.NoError(t, err) err = txn.Commit(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) err = tk.ExecToErr("admin check table admin_test") - c.Assert(err, NotNil) - c.Assert(executor.ErrAdminCheckTable.Equal(err), IsTrue) + require.Error(t, err) + require.True(t, executor.ErrAdminCheckTable.Equal(err)) err = tk.ExecToErr("admin check index admin_test c2") - c.Assert(err, NotNil) + require.Error(t, err) r = tk.MustQuery("SELECT COUNT(*) FROM admin_test USE INDEX(c2)") r.Check(testkit.Rows("4")) @@ -192,39 +242,39 @@ func (s *testSuite5) TestAdminRecoverIndex(c *C) { tk.MustExec("admin check index admin_test c2") tk.MustExec("admin check table admin_test") - txn, err = s.store.Begin() - c.Assert(err, IsNil) + txn, err = store.Begin() + require.NoError(t, err) err = indexOpr.Delete(sc, txn, types.MakeDatums(10), kv.IntHandle(10)) - c.Assert(err, IsNil) + require.NoError(t, err) err = txn.Commit(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) err = tk.ExecToErr("admin check index admin_test c2") - c.Assert(err, NotNil) + require.Error(t, err) r = tk.MustQuery("admin recover index admin_test c2") r.Check(testkit.Rows("1 5")) tk.MustExec("admin check index admin_test c2") tk.MustExec("admin check table admin_test") - txn, err = s.store.Begin() - c.Assert(err, IsNil) + txn, err = store.Begin() + require.NoError(t, err) err = indexOpr.Delete(sc, txn, types.MakeDatums(1), kv.IntHandle(1)) - c.Assert(err, IsNil) + require.NoError(t, err) err = indexOpr.Delete(sc, txn, types.MakeDatums(2), kv.IntHandle(2)) - c.Assert(err, IsNil) + require.NoError(t, err) err = indexOpr.Delete(sc, txn, types.MakeDatums(3), kv.IntHandle(3)) - c.Assert(err, IsNil) + require.NoError(t, err) err = indexOpr.Delete(sc, txn, types.MakeDatums(10), kv.IntHandle(10)) - c.Assert(err, IsNil) + require.NoError(t, err) err = indexOpr.Delete(sc, txn, types.MakeDatums(20), kv.IntHandle(20)) - c.Assert(err, IsNil) + require.NoError(t, err) err = txn.Commit(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) err = tk.ExecToErr("admin check table admin_test") - c.Assert(err, NotNil) + require.Error(t, err) err = tk.ExecToErr("admin check index admin_test c2") - c.Assert(err, NotNil) + require.Error(t, err) r = tk.MustQuery("SELECT COUNT(*) FROM admin_test USE INDEX(c2)") r.Check(testkit.Rows("0")) @@ -242,12 +292,15 @@ func (s *testSuite5) TestAdminRecoverIndex(c *C) { tk.MustExec("admin check table admin_test") } -func (s *testSuite5) TestClusteredIndexAdminRecoverIndex(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestClusteredIndexAdminRecoverIndex(t *testing.T) { + store, domain, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("drop database if exists test_cluster_index_admin_recover;") tk.MustExec("create database test_cluster_index_admin_recover;") tk.MustExec("use test_cluster_index_admin_recover;") - tk.Se.GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeOn + tk.Session().GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeOn dbName := model.NewCIStr("test_cluster_index_admin_recover") tblName := model.NewCIStr("t") @@ -258,24 +311,24 @@ func (s *testSuite5) TestClusteredIndexAdminRecoverIndex(c *C) { tk.MustQuery("admin recover index t `idx`;").Check(testkit.Rows("0 3")) tk.MustExec("admin check table t;") - s.ctx = mock.NewContext() - s.ctx.Store = s.store - is := s.domain.InfoSchema() + ctx := mock.NewContext() + ctx.Store = store + is := domain.InfoSchema() tbl, err := is.TableByName(dbName, tblName) - c.Assert(err, IsNil) + require.NoError(t, err) tblInfo := tbl.Meta() idxInfo := tblInfo.FindIndexByName("idx") indexOpr := tables.NewIndex(tblInfo.ID, tblInfo, idxInfo) - sc := s.ctx.GetSessionVars().StmtCtx + sc := ctx.GetSessionVars().StmtCtx // Some index entries are missed. - txn, err := s.store.Begin() - c.Assert(err, IsNil) - cHandle := testutil.MustNewCommonHandle(c, "1", "3") + txn, err := store.Begin() + require.NoError(t, err) + cHandle := testkit.MustNewCommonHandle(t, "1", "3") err = indexOpr.Delete(sc, txn, types.MakeDatums(2), cHandle) - c.Assert(err, IsNil) + require.NoError(t, err) err = txn.Commit(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) tk.MustGetErrCode("admin check table t", mysql.ErrAdminCheckTable) tk.MustGetErrCode("admin check index t idx", mysql.ErrAdminCheckTable) @@ -285,33 +338,37 @@ func (s *testSuite5) TestClusteredIndexAdminRecoverIndex(c *C) { tk.MustExec("admin check table t;") } -func (s *testSuite5) TestAdminRecoverPartitionTableIndex(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestAdminRecoverPartitionTableIndex(t *testing.T) { + store, domain, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") getTable := func() table.Table { - s.ctx = mock.NewContext() - s.ctx.Store = s.store - is := s.domain.InfoSchema() + ctx := mock.NewContext() + ctx.Store = store + is := domain.InfoSchema() dbName := model.NewCIStr("test") tblName := model.NewCIStr("admin_test") tbl, err := is.TableByName(dbName, tblName) - c.Assert(err, IsNil) + require.NoError(t, err) return tbl } checkFunc := func(tbl table.Table, pid int64, idxValue int) { idxInfo := tbl.Meta().FindIndexByName("c2") indexOpr := tables.NewIndex(pid, tbl.Meta(), idxInfo) - sc := s.ctx.GetSessionVars().StmtCtx - txn, err := s.store.Begin() - c.Assert(err, IsNil) + ctx := mock.NewContext() + sc := ctx.GetSessionVars().StmtCtx + txn, err := store.Begin() + require.NoError(t, err) err = indexOpr.Delete(sc, txn, types.MakeDatums(idxValue), kv.IntHandle(idxValue)) - c.Assert(err, IsNil) + require.NoError(t, err) err = txn.Commit(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) err = tk.ExecToErr("admin check table admin_test") - c.Assert(err, NotNil) - c.Assert(executor.ErrAdminCheckTable.Equal(err), IsTrue) + require.Error(t, err) + require.True(t, executor.ErrAdminCheckTable.Equal(err)) r := tk.MustQuery("SELECT COUNT(*) FROM admin_test USE INDEX(c2)") r.Check(testkit.Rows("2")) @@ -332,7 +389,7 @@ func (s *testSuite5) TestAdminRecoverPartitionTableIndex(c *C) { r.Check(testkit.Rows("0 3")) tbl := getTable() pi := tbl.Meta().GetPartitionInfo() - c.Assert(pi, NotNil) + require.NotNil(t, pi) for i, p := range pi.Definitions { checkFunc(tbl, p.ID, i) } @@ -348,49 +405,52 @@ func (s *testSuite5) TestAdminRecoverPartitionTableIndex(c *C) { r.Check(testkit.Rows("0 3")) tbl = getTable() pi = tbl.Meta().GetPartitionInfo() - c.Assert(pi, NotNil) + require.NotNil(t, pi) for i, p := range pi.Definitions { checkFunc(tbl, p.ID, i*6) } } -func (s *testSuite5) TestAdminRecoverIndex1(c *C) { - tk := testkit.NewTestKit(c, s.store) - s.ctx = mock.NewContext() - s.ctx.Store = s.store +func TestAdminRecoverIndex1(t *testing.T) { + store, domain, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + ctx := mock.NewContext() + ctx.Store = store dbName := model.NewCIStr("test") tblName := model.NewCIStr("admin_test") - sc := s.ctx.GetSessionVars().StmtCtx + sc := ctx.GetSessionVars().StmtCtx tk.MustExec("use test") tk.MustExec("drop table if exists admin_test") - tk.Se.GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeIntOnly + tk.Session().GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeIntOnly tk.MustExec("create table admin_test (c1 varchar(255), c2 int, c3 int default 1, primary key(c1), unique key(c2))") tk.MustExec("insert admin_test (c1, c2) values ('1', 1), ('2', 2), ('3', 3), ('10', 10), ('20', 20)") r := tk.MustQuery("SELECT COUNT(*) FROM admin_test USE INDEX(`primary`)") r.Check(testkit.Rows("5")) - is := s.domain.InfoSchema() + is := domain.InfoSchema() tbl, err := is.TableByName(dbName, tblName) - c.Assert(err, IsNil) + require.NoError(t, err) tblInfo := tbl.Meta() idxInfo := tblInfo.FindIndexByName("primary") - c.Assert(idxInfo, NotNil) + require.NotNil(t, idxInfo) indexOpr := tables.NewIndex(tblInfo.ID, tblInfo, idxInfo) - txn, err := s.store.Begin() - c.Assert(err, IsNil) + txn, err := store.Begin() + require.NoError(t, err) err = indexOpr.Delete(sc, txn, types.MakeDatums("1"), kv.IntHandle(1)) - c.Assert(err, IsNil) + require.NoError(t, err) err = indexOpr.Delete(sc, txn, types.MakeDatums("2"), kv.IntHandle(2)) - c.Assert(err, IsNil) + require.NoError(t, err) err = indexOpr.Delete(sc, txn, types.MakeDatums("3"), kv.IntHandle(3)) - c.Assert(err, IsNil) + require.NoError(t, err) err = indexOpr.Delete(sc, txn, types.MakeDatums("10"), kv.IntHandle(4)) - c.Assert(err, IsNil) + require.NoError(t, err) err = txn.Commit(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) r = tk.MustQuery("SELECT COUNT(*) FROM admin_test USE INDEX(`primary`)") r.Check(testkit.Rows("1")) @@ -406,8 +466,11 @@ func (s *testSuite5) TestAdminRecoverIndex1(c *C) { tk.MustExec("admin check index admin_test `primary`") } -func (s *testSuite5) TestAdminCleanupIndex(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestAdminCleanupIndex(t *testing.T) { + store, domain, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists admin_test") tk.MustExec("create table admin_test (c1 int, c2 int, c3 int default 1, primary key (c1), unique key(c2), key (c3))") @@ -416,20 +479,20 @@ func (s *testSuite5) TestAdminCleanupIndex(c *C) { // pk is handle, no need to cleanup _, err := tk.Exec("admin cleanup index admin_test `primary`") - c.Assert(err, NotNil) + require.Error(t, err) r := tk.MustQuery("admin cleanup index admin_test c2") r.Check(testkit.Rows("0")) r = tk.MustQuery("admin cleanup index admin_test c3") r.Check(testkit.Rows("0")) // Make some dangling index. - s.ctx = mock.NewContext() - s.ctx.Store = s.store - is := s.domain.InfoSchema() + ctx := mock.NewContext() + ctx.Store = store + is := domain.InfoSchema() dbName := model.NewCIStr("test") tblName := model.NewCIStr("admin_test") tbl, err := is.TableByName(dbName, tblName) - c.Assert(err, IsNil) + require.NoError(t, err) tblInfo := tbl.Meta() idxInfo2 := tblInfo.FindIndexByName("c2") @@ -437,31 +500,31 @@ func (s *testSuite5) TestAdminCleanupIndex(c *C) { idxInfo3 := tblInfo.FindIndexByName("c3") indexOpr3 := tables.NewIndex(tblInfo.ID, tblInfo, idxInfo3) - txn, err := s.store.Begin() - c.Assert(err, IsNil) - _, err = indexOpr2.Create(s.ctx, txn, types.MakeDatums(1), kv.IntHandle(-100), nil) - c.Assert(err, IsNil) - _, err = indexOpr2.Create(s.ctx, txn, types.MakeDatums(6), kv.IntHandle(100), nil) - c.Assert(err, IsNil) - _, err = indexOpr2.Create(s.ctx, txn, types.MakeDatums(8), kv.IntHandle(100), nil) - c.Assert(err, IsNil) - _, err = indexOpr2.Create(s.ctx, txn, types.MakeDatums(nil), kv.IntHandle(101), nil) - c.Assert(err, IsNil) - _, err = indexOpr2.Create(s.ctx, txn, types.MakeDatums(nil), kv.IntHandle(102), nil) - c.Assert(err, IsNil) - _, err = indexOpr3.Create(s.ctx, txn, types.MakeDatums(6), kv.IntHandle(200), nil) - c.Assert(err, IsNil) - _, err = indexOpr3.Create(s.ctx, txn, types.MakeDatums(6), kv.IntHandle(-200), nil) - c.Assert(err, IsNil) - _, err = indexOpr3.Create(s.ctx, txn, types.MakeDatums(8), kv.IntHandle(-200), nil) - c.Assert(err, IsNil) + txn, err := store.Begin() + require.NoError(t, err) + _, err = indexOpr2.Create(ctx, txn, types.MakeDatums(1), kv.IntHandle(-100), nil) + require.NoError(t, err) + _, err = indexOpr2.Create(ctx, txn, types.MakeDatums(6), kv.IntHandle(100), nil) + require.NoError(t, err) + _, err = indexOpr2.Create(ctx, txn, types.MakeDatums(8), kv.IntHandle(100), nil) + require.NoError(t, err) + _, err = indexOpr2.Create(ctx, txn, types.MakeDatums(nil), kv.IntHandle(101), nil) + require.NoError(t, err) + _, err = indexOpr2.Create(ctx, txn, types.MakeDatums(nil), kv.IntHandle(102), nil) + require.NoError(t, err) + _, err = indexOpr3.Create(ctx, txn, types.MakeDatums(6), kv.IntHandle(200), nil) + require.NoError(t, err) + _, err = indexOpr3.Create(ctx, txn, types.MakeDatums(6), kv.IntHandle(-200), nil) + require.NoError(t, err) + _, err = indexOpr3.Create(ctx, txn, types.MakeDatums(8), kv.IntHandle(-200), nil) + require.NoError(t, err) err = txn.Commit(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) err = tk.ExecToErr("admin check table admin_test") - c.Assert(err, NotNil) + require.Error(t, err) err = tk.ExecToErr("admin check index admin_test c2") - c.Assert(err, NotNil) + require.Error(t, err) r = tk.MustQuery("SELECT COUNT(*) FROM admin_test USE INDEX(c2)") r.Check(testkit.Rows("11")) r = tk.MustQuery("admin cleanup index admin_test c2") @@ -471,9 +534,9 @@ func (s *testSuite5) TestAdminCleanupIndex(c *C) { tk.MustExec("admin check index admin_test c2") err = tk.ExecToErr("admin check table admin_test") - c.Assert(err, NotNil) + require.Error(t, err) err = tk.ExecToErr("admin check index admin_test c3") - c.Assert(err, NotNil) + require.Error(t, err) r = tk.MustQuery("SELECT COUNT(*) FROM admin_test USE INDEX(c3)") r.Check(testkit.Rows("9")) r = tk.MustQuery("admin cleanup index admin_test c3") @@ -485,18 +548,21 @@ func (s *testSuite5) TestAdminCleanupIndex(c *C) { tk.MustExec("admin check table admin_test") } -func (s *testSuite5) TestAdminCleanupIndexForPartitionTable(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestAdminCleanupIndexForPartitionTable(t *testing.T) { + store, domain, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") getTable := func() table.Table { - s.ctx = mock.NewContext() - s.ctx.Store = s.store - is := s.domain.InfoSchema() + ctx := mock.NewContext() + ctx.Store = store + is := domain.InfoSchema() dbName := model.NewCIStr("test") tblName := model.NewCIStr("admin_test") tbl, err := is.TableByName(dbName, tblName) - c.Assert(err, IsNil) + require.NoError(t, err) return tbl } @@ -506,17 +572,18 @@ func (s *testSuite5) TestAdminCleanupIndexForPartitionTable(c *C) { idxInfo3 := tbl.Meta().FindIndexByName("c3") indexOpr3 := tables.NewIndex(pid, tbl.Meta(), idxInfo3) - txn, err := s.store.Begin() - c.Assert(err, IsNil) - _, err = indexOpr2.Create(s.ctx, txn, types.MakeDatums(idxValue), kv.IntHandle(handle), nil) - c.Assert(err, IsNil) - _, err = indexOpr3.Create(s.ctx, txn, types.MakeDatums(idxValue), kv.IntHandle(handle), nil) - c.Assert(err, IsNil) + txn, err := store.Begin() + ctx := mock.NewContext() + require.NoError(t, err) + _, err = indexOpr2.Create(ctx, txn, types.MakeDatums(idxValue), kv.IntHandle(handle), nil) + require.NoError(t, err) + _, err = indexOpr3.Create(ctx, txn, types.MakeDatums(idxValue), kv.IntHandle(handle), nil) + require.NoError(t, err) err = txn.Commit(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) err = tk.ExecToErr("admin check table admin_test") - c.Assert(err, NotNil) + require.Error(t, err) r := tk.MustQuery("SELECT COUNT(*) FROM admin_test USE INDEX(c2)") r.Check(testkit.Rows("4")) @@ -542,7 +609,7 @@ func (s *testSuite5) TestAdminCleanupIndexForPartitionTable(c *C) { r.Check(testkit.Rows("0")) tbl := getTable() pi := tbl.Meta().GetPartitionInfo() - c.Assert(pi, NotNil) + require.NotNil(t, pi) for i, p := range pi.Definitions { checkFunc(tbl, p.ID, i+6, i+6) } @@ -558,17 +625,20 @@ func (s *testSuite5) TestAdminCleanupIndexForPartitionTable(c *C) { r.Check(testkit.Rows("0")) tbl = getTable() pi = tbl.Meta().GetPartitionInfo() - c.Assert(pi, NotNil) + require.NotNil(t, pi) for i, p := range pi.Definitions { checkFunc(tbl, p.ID, i*6+1, i*6+1) } } -func (s *testSuite5) TestAdminCleanupIndexPKNotHandle(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestAdminCleanupIndexPKNotHandle(t *testing.T) { + store, domain, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists admin_test") - tk.Se.GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeIntOnly + tk.Session().GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeIntOnly tk.MustExec("create table admin_test (c1 int, c2 int, c3 int, primary key (c1, c2))") tk.MustExec("insert admin_test (c1, c2) values (1, 2), (3, 4), (-5, 5)") @@ -576,33 +646,33 @@ func (s *testSuite5) TestAdminCleanupIndexPKNotHandle(c *C) { r.Check(testkit.Rows("0")) // Make some dangling index. - s.ctx = mock.NewContext() - s.ctx.Store = s.store - is := s.domain.InfoSchema() + ctx := mock.NewContext() + ctx.Store = store + is := domain.InfoSchema() dbName := model.NewCIStr("test") tblName := model.NewCIStr("admin_test") tbl, err := is.TableByName(dbName, tblName) - c.Assert(err, IsNil) + require.NoError(t, err) tblInfo := tbl.Meta() idxInfo := tblInfo.FindIndexByName("primary") indexOpr := tables.NewIndex(tblInfo.ID, tblInfo, idxInfo) - txn, err := s.store.Begin() - c.Assert(err, IsNil) - _, err = indexOpr.Create(s.ctx, txn, types.MakeDatums(7, 10), kv.IntHandle(-100), nil) - c.Assert(err, IsNil) - _, err = indexOpr.Create(s.ctx, txn, types.MakeDatums(4, 6), kv.IntHandle(100), nil) - c.Assert(err, IsNil) - _, err = indexOpr.Create(s.ctx, txn, types.MakeDatums(-7, 4), kv.IntHandle(101), nil) - c.Assert(err, IsNil) + txn, err := store.Begin() + require.NoError(t, err) + _, err = indexOpr.Create(ctx, txn, types.MakeDatums(7, 10), kv.IntHandle(-100), nil) + require.NoError(t, err) + _, err = indexOpr.Create(ctx, txn, types.MakeDatums(4, 6), kv.IntHandle(100), nil) + require.NoError(t, err) + _, err = indexOpr.Create(ctx, txn, types.MakeDatums(-7, 4), kv.IntHandle(101), nil) + require.NoError(t, err) err = txn.Commit(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) err = tk.ExecToErr("admin check table admin_test") - c.Assert(err, NotNil) + require.Error(t, err) err = tk.ExecToErr("admin check index admin_test `primary`") - c.Assert(err, NotNil) + require.Error(t, err) r = tk.MustQuery("SELECT COUNT(*) FROM admin_test USE INDEX(`primary`)") r.Check(testkit.Rows("6")) r = tk.MustQuery("admin cleanup index admin_test `primary`") @@ -613,8 +683,11 @@ func (s *testSuite5) TestAdminCleanupIndexPKNotHandle(c *C) { tk.MustExec("admin check table admin_test") } -func (s *testSuite5) TestAdminCleanupIndexMore(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestAdminCleanupIndexMore(t *testing.T) { + store, domain, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists admin_test") tk.MustExec("create table admin_test (c1 int, c2 int, unique key (c1, c2), key (c2))") @@ -624,13 +697,13 @@ func (s *testSuite5) TestAdminCleanupIndexMore(c *C) { tk.MustExec("admin cleanup index admin_test c2") // Make some dangling index. - s.ctx = mock.NewContext() - s.ctx.Store = s.store - is := s.domain.InfoSchema() + ctx := mock.NewContext() + ctx.Store = store + is := domain.InfoSchema() dbName := model.NewCIStr("test") tblName := model.NewCIStr("admin_test") tbl, err := is.TableByName(dbName, tblName) - c.Assert(err, IsNil) + require.NoError(t, err) tblInfo := tbl.Meta() idxInfo1 := tblInfo.FindIndexByName("c1") @@ -638,25 +711,25 @@ func (s *testSuite5) TestAdminCleanupIndexMore(c *C) { idxInfo2 := tblInfo.FindIndexByName("c2") indexOpr2 := tables.NewIndex(tblInfo.ID, tblInfo, idxInfo2) - txn, err := s.store.Begin() - c.Assert(err, IsNil) + txn, err := store.Begin() + require.NoError(t, err) for i := 0; i < 2000; i++ { c1 := int64(2*i + 7) c2 := int64(2*i + 8) - _, err = indexOpr1.Create(s.ctx, txn, types.MakeDatums(c1, c2), kv.IntHandle(c1), nil) - c.Assert(err, IsNil, Commentf(errors.ErrorStack(err))) - _, err = indexOpr2.Create(s.ctx, txn, types.MakeDatums(c2), kv.IntHandle(c1), nil) - c.Assert(err, IsNil) + _, err = indexOpr1.Create(ctx, txn, types.MakeDatums(c1, c2), kv.IntHandle(c1), nil) + require.NoErrorf(t, err, errors.ErrorStack(err)) + _, err = indexOpr2.Create(ctx, txn, types.MakeDatums(c2), kv.IntHandle(c1), nil) + require.NoError(t, err) } err = txn.Commit(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) err = tk.ExecToErr("admin check table admin_test") - c.Assert(err, NotNil) + require.Error(t, err) err = tk.ExecToErr("admin check index admin_test c1") - c.Assert(err, NotNil) + require.Error(t, err) err = tk.ExecToErr("admin check index admin_test c2") - c.Assert(err, NotNil) + require.Error(t, err) r := tk.MustQuery("SELECT COUNT(*) FROM admin_test USE INDEX()") r.Check(testkit.Rows("3")) r = tk.MustQuery("SELECT COUNT(*) FROM admin_test USE INDEX(c1)") @@ -676,11 +749,14 @@ func (s *testSuite5) TestAdminCleanupIndexMore(c *C) { tk.MustExec("admin check table admin_test") } -func (s *testSuite5) TestClusteredAdminCleanupIndex(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestClusteredAdminCleanupIndex(t *testing.T) { + store, domain, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists admin_test") - tk.Se.GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeOn + tk.Session().GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeOn tk.MustExec("create table admin_test (c1 varchar(255), c2 int, c3 char(10) default 'c3', primary key (c1, c3), unique key(c2), key (c3))") tk.MustExec("insert admin_test (c1, c2) values ('c1_1', 2), ('c1_2', 4), ('c1_3', NULL)") tk.MustExec("insert admin_test (c1, c3) values ('c1_4', 'c3_4'), ('c1_5', 'c3_5'), ('c1_6', default)") @@ -691,10 +767,10 @@ func (s *testSuite5) TestClusteredAdminCleanupIndex(c *C) { tk.MustQuery("admin cleanup index admin_test `c3`").Check(testkit.Rows("0")) // Make some dangling index. - s.ctx = mock.NewContext() - s.ctx.Store = s.store - tbl, err := s.domain.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("admin_test")) - c.Assert(err, IsNil) + ctx := mock.NewContext() + ctx.Store = store + tbl, err := domain.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("admin_test")) + require.NoError(t, err) // cleanup clustered primary key takes no effect. tblInfo := tbl.Meta() @@ -707,44 +783,44 @@ func (s *testSuite5) TestClusteredAdminCleanupIndex(c *C) { handle kv.Handle idxVal []types.Datum }{ - {testutil.MustNewCommonHandle(c, "c1_10", "c3_10"), types.MakeDatums(10)}, - {testutil.MustNewCommonHandle(c, "c1_10", "c3_11"), types.MakeDatums(11)}, - {testutil.MustNewCommonHandle(c, "c1_12", "c3_12"), types.MakeDatums(12)}, + {testkit.MustNewCommonHandle(t, "c1_10", "c3_10"), types.MakeDatums(10)}, + {testkit.MustNewCommonHandle(t, "c1_10", "c3_11"), types.MakeDatums(11)}, + {testkit.MustNewCommonHandle(t, "c1_12", "c3_12"), types.MakeDatums(12)}, } c3DanglingIdx := []struct { handle kv.Handle idxVal []types.Datum }{ - {testutil.MustNewCommonHandle(c, "c1_13", "c3_13"), types.MakeDatums("c3_13")}, - {testutil.MustNewCommonHandle(c, "c1_14", "c3_14"), types.MakeDatums("c3_14")}, - {testutil.MustNewCommonHandle(c, "c1_15", "c3_15"), types.MakeDatums("c3_15")}, + {testkit.MustNewCommonHandle(t, "c1_13", "c3_13"), types.MakeDatums("c3_13")}, + {testkit.MustNewCommonHandle(t, "c1_14", "c3_14"), types.MakeDatums("c3_14")}, + {testkit.MustNewCommonHandle(t, "c1_15", "c3_15"), types.MakeDatums("c3_15")}, } - txn, err := s.store.Begin() - c.Assert(err, IsNil) + txn, err := store.Begin() + require.NoError(t, err) for _, di := range c2DanglingIdx { - _, err := indexOpr2.Create(s.ctx, txn, di.idxVal, di.handle, nil) - c.Assert(err, IsNil) + _, err := indexOpr2.Create(ctx, txn, di.idxVal, di.handle, nil) + require.NoError(t, err) } for _, di := range c3DanglingIdx { - _, err := indexOpr3.Create(s.ctx, txn, di.idxVal, di.handle, nil) - c.Assert(err, IsNil) + _, err := indexOpr3.Create(ctx, txn, di.idxVal, di.handle, nil) + require.NoError(t, err) } err = txn.Commit(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) err = tk.ExecToErr("admin check table admin_test") - c.Assert(err, NotNil) + require.Error(t, err) err = tk.ExecToErr("admin check index admin_test c2") - c.Assert(err, NotNil) + require.Error(t, err) tk.MustQuery("SELECT COUNT(*) FROM admin_test USE INDEX(c2)").Check(testkit.Rows("9")) tk.MustQuery("admin cleanup index admin_test c2").Check(testkit.Rows("3")) tk.MustQuery("SELECT COUNT(*) FROM admin_test USE INDEX(c2)").Check(testkit.Rows("6")) tk.MustExec("admin check index admin_test c2") err = tk.ExecToErr("admin check table admin_test") - c.Assert(err, NotNil) + require.Error(t, err) err = tk.ExecToErr("admin check index admin_test c3") - c.Assert(err, NotNil) + require.Error(t, err) tk.MustQuery("SELECT COUNT(*) FROM admin_test USE INDEX(c3)").Check(testkit.Rows("9")) tk.MustQuery("admin cleanup index admin_test c3").Check(testkit.Rows("3")) tk.MustQuery("SELECT COUNT(*) FROM admin_test USE INDEX(c3)").Check(testkit.Rows("6")) @@ -752,8 +828,11 @@ func (s *testSuite5) TestClusteredAdminCleanupIndex(c *C) { tk.MustExec("admin check table admin_test") } -func (s *testSuite3) TestAdminCheckPartitionTableFailed(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestAdminCheckPartitionTableFailed(t *testing.T) { + store, domain, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists admin_test_p") tk.MustExec("create table admin_test_p (c1 int key,c2 int,c3 int,index idx(c2)) partition by hash(c1) partitions 4") @@ -761,45 +840,45 @@ func (s *testSuite3) TestAdminCheckPartitionTableFailed(c *C) { tk.MustExec("admin check table admin_test_p") // Make some corrupted index. Build the index information. - s.ctx = mock.NewContext() - s.ctx.Store = s.store - is := s.domain.InfoSchema() + ctx := mock.NewContext() + ctx.Store = store + is := domain.InfoSchema() dbName := model.NewCIStr("test") tblName := model.NewCIStr("admin_test_p") tbl, err := is.TableByName(dbName, tblName) - c.Assert(err, IsNil) + require.NoError(t, err) tblInfo := tbl.Meta() idxInfo := tblInfo.Indices[0] - sc := s.ctx.GetSessionVars().StmtCtx - tk.Se.GetSessionVars().IndexLookupSize = 3 - tk.Se.GetSessionVars().MaxChunkSize = 3 + sc := ctx.GetSessionVars().StmtCtx + tk.Session().GetSessionVars().IndexLookupSize = 3 + tk.Session().GetSessionVars().MaxChunkSize = 3 // Reduce one row of index on partitions. // Table count > index count. for i := 0; i <= 5; i++ { partitionIdx := i % len(tblInfo.GetPartitionInfo().Definitions) indexOpr := tables.NewIndex(tblInfo.GetPartitionInfo().Definitions[partitionIdx].ID, tblInfo, idxInfo) - txn, err := s.store.Begin() - c.Assert(err, IsNil) + txn, err := store.Begin() + require.NoError(t, err) err = indexOpr.Delete(sc, txn, types.MakeDatums(i), kv.IntHandle(i)) - c.Assert(err, IsNil) + require.NoError(t, err) err = txn.Commit(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) err = tk.ExecToErr("admin check table admin_test_p") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, fmt.Sprintf("[executor:8003]admin_test_p err:[admin:8223]index:<nil> != record:&admin.RecordData{Handle:%d, Values:[]types.Datum{types.Datum{k:0x1, decimal:0x0, length:0x0, i:%d, collation:\"\", b:[]uint8(nil), x:interface {}(nil)}}}", i, i)) - c.Assert(executor.ErrAdminCheckTable.Equal(err), IsTrue) + require.Error(t, err) + require.EqualError(t, err, fmt.Sprintf("[executor:8003]admin_test_p err:[admin:8223]index:<nil> != record:&admin.RecordData{Handle:%d, Values:[]types.Datum{types.Datum{k:0x1, decimal:0x0, length:0x0, i:%d, collation:\"\", b:[]uint8(nil), x:interface {}(nil)}}}", i, i)) + require.True(t, executor.ErrAdminCheckTable.Equal(err)) // TODO: fix admin recover for partition table. // r := tk.MustQuery("admin recover index admin_test_p idx") // r.Check(testkit.Rows("0 0")) // tk.MustExec("admin check table admin_test_p") // Manual recover index. - txn, err = s.store.Begin() - c.Assert(err, IsNil) - _, err = indexOpr.Create(s.ctx, txn, types.MakeDatums(i), kv.IntHandle(i), nil) - c.Assert(err, IsNil) + txn, err = store.Begin() + require.NoError(t, err) + _, err = indexOpr.Create(ctx, txn, types.MakeDatums(i), kv.IntHandle(i), nil) + require.NoError(t, err) err = txn.Commit(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) tk.MustExec("admin check table admin_test_p") } @@ -808,22 +887,21 @@ func (s *testSuite3) TestAdminCheckPartitionTableFailed(c *C) { for i := 0; i <= 5; i++ { partitionIdx := i % len(tblInfo.GetPartitionInfo().Definitions) indexOpr := tables.NewIndex(tblInfo.GetPartitionInfo().Definitions[partitionIdx].ID, tblInfo, idxInfo) - txn, err := s.store.Begin() - c.Assert(err, IsNil) - _, err = indexOpr.Create(s.ctx, txn, types.MakeDatums(i+8), kv.IntHandle(i+8), nil) - c.Assert(err, IsNil) + txn, err := store.Begin() + require.NoError(t, err) + _, err = indexOpr.Create(ctx, txn, types.MakeDatums(i+8), kv.IntHandle(i+8), nil) + require.NoError(t, err) err = txn.Commit(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) err = tk.ExecToErr("admin check table admin_test_p") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, fmt.Sprintf("[executor:8133]handle %d, index:types.Datum{k:0x1, decimal:0x0, length:0x0, i:%d, collation:\"\", b:[]uint8(nil), x:interface {}(nil)} != record:<nil>", i+8, i+8)) + require.EqualError(t, err, fmt.Sprintf("[executor:8133]handle %d, index:types.Datum{k:0x1, decimal:0x0, length:0x0, i:%d, collation:\"\", b:[]uint8(nil), x:interface {}(nil)} != record:<nil>", i+8, i+8)) // TODO: fix admin recover for partition table. - txn, err = s.store.Begin() - c.Assert(err, IsNil) + txn, err = store.Begin() + require.NoError(t, err) err = indexOpr.Delete(sc, txn, types.MakeDatums(i+8), kv.IntHandle(i+8)) - c.Assert(err, IsNil) + require.NoError(t, err) err = txn.Commit(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) tk.MustExec("admin check table admin_test_p") } @@ -831,165 +909,31 @@ func (s *testSuite3) TestAdminCheckPartitionTableFailed(c *C) { for i := 0; i <= 5; i++ { partitionIdx := i % len(tblInfo.GetPartitionInfo().Definitions) indexOpr := tables.NewIndex(tblInfo.GetPartitionInfo().Definitions[partitionIdx].ID, tblInfo, idxInfo) - txn, err := s.store.Begin() - c.Assert(err, IsNil) - _, err = indexOpr.Create(s.ctx, txn, types.MakeDatums(i+8), kv.IntHandle(i), nil) - c.Assert(err, IsNil) + txn, err := store.Begin() + require.NoError(t, err) + _, err = indexOpr.Create(ctx, txn, types.MakeDatums(i+8), kv.IntHandle(i), nil) + require.NoError(t, err) err = txn.Commit(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) err = tk.ExecToErr("admin check table admin_test_p") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, fmt.Sprintf("[executor:8134]col c2, handle %d, index:types.Datum{k:0x1, decimal:0x0, length:0x0, i:%d, collation:\"\", b:[]uint8(nil), x:interface {}(nil)} != record:types.Datum{k:0x1, decimal:0x0, length:0x0, i:%d, collation:\"\", b:[]uint8(nil), x:interface {}(nil)}, compare err:<nil>", i, i+8, i)) + require.EqualError(t, err, fmt.Sprintf("[executor:8134]col c2, handle %d, index:types.Datum{k:0x1, decimal:0x0, length:0x0, i:%d, collation:\"\", b:[]uint8(nil), x:interface {}(nil)} != record:types.Datum{k:0x1, decimal:0x0, length:0x0, i:%d, collation:\"\", b:[]uint8(nil), x:interface {}(nil)}, compare err:<nil>", i, i+8, i)) // TODO: fix admin recover for partition table. - txn, err = s.store.Begin() - c.Assert(err, IsNil) + txn, err = store.Begin() + require.NoError(t, err) err = indexOpr.Delete(sc, txn, types.MakeDatums(i+8), kv.IntHandle(i)) - c.Assert(err, IsNil) + require.NoError(t, err) err = txn.Commit(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) tk.MustExec("admin check table admin_test_p") } } -func (s *testSuiteJoinSerial) TestAdminCheckTableFailed(c *C) { - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists admin_test") - tk.MustExec("create table admin_test (c1 int, c2 int, c3 varchar(255) default '1', primary key(c1), key(c3), unique key(c2), key(c2, c3))") - tk.MustExec("insert admin_test (c1, c2, c3) values (-10, -20, 'y'), (-1, -10, 'z'), (1, 11, 'a'), (2, 12, 'b'), (5, 15, 'c'), (10, 20, 'd'), (20, 30, 'e')") - - // Make some corrupted index. Build the index information. - s.ctx = mock.NewContext() - s.ctx.Store = s.store - is := s.domain.InfoSchema() - dbName := model.NewCIStr("test") - tblName := model.NewCIStr("admin_test") - tbl, err := is.TableByName(dbName, tblName) - c.Assert(err, IsNil) - tblInfo := tbl.Meta() - idxInfo := tblInfo.Indices[1] - indexOpr := tables.NewIndex(tblInfo.ID, tblInfo, idxInfo) - sc := s.ctx.GetSessionVars().StmtCtx - tk.Se.GetSessionVars().IndexLookupSize = 3 - tk.Se.GetSessionVars().MaxChunkSize = 3 - - // Reduce one row of index. - // Table count > index count. - // Index c2 is missing 11. - txn, err := s.store.Begin() - c.Assert(err, IsNil) - err = indexOpr.Delete(sc, txn, types.MakeDatums(-10), kv.IntHandle(-1)) - c.Assert(err, IsNil) - err = txn.Commit(context.Background()) - c.Assert(err, IsNil) - err = tk.ExecToErr("admin check table admin_test") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, - "[executor:8003]admin_test err:[admin:8223]index:<nil> != record:&admin.RecordData{Handle:-1, Values:[]types.Datum{types.Datum{k:0x1, decimal:0x0, length:0x0, i:-10, collation:\"\", b:[]uint8(nil), x:interface {}(nil)}}}") - c.Assert(executor.ErrAdminCheckTable.Equal(err), IsTrue) - tk.MustExec("set @@tidb_redact_log=1;") - err = tk.ExecToErr("admin check table admin_test") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[executor:8003]admin_test err:[admin:8223]index:\"?\" != record:\"?\"") - tk.MustExec("set @@tidb_redact_log=0;") - r := tk.MustQuery("admin recover index admin_test c2") - r.Check(testkit.Rows("1 7")) - tk.MustExec("admin check table admin_test") - - // Add one row of index. - // Table count < index count. - // Index c2 has one more values than table data: 0, and the handle 0 hasn't correlative record. - txn, err = s.store.Begin() - c.Assert(err, IsNil) - _, err = indexOpr.Create(s.ctx, txn, types.MakeDatums(0), kv.IntHandle(0), nil) - c.Assert(err, IsNil) - err = txn.Commit(context.Background()) - c.Assert(err, IsNil) - err = tk.ExecToErr("admin check table admin_test") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[executor:8133]handle 0, index:types.Datum{k:0x1, decimal:0x0, length:0x0, i:0, collation:\"\", b:[]uint8(nil), x:interface {}(nil)} != record:<nil>") - tk.MustExec("set @@tidb_redact_log=1;") - err = tk.ExecToErr("admin check table admin_test") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[executor:8133]handle \"?\", index:\"?\" != record:\"?\"") - tk.MustExec("set @@tidb_redact_log=0;") - - // Add one row of index. - // Table count < index count. - // Index c2 has two more values than table data: 10, 13, and these handles have correlative record. - txn, err = s.store.Begin() - c.Assert(err, IsNil) - err = indexOpr.Delete(sc, txn, types.MakeDatums(0), kv.IntHandle(0)) - c.Assert(err, IsNil) - // Make sure the index value "19" is smaller "21". Then we scan to "19" before "21". - _, err = indexOpr.Create(s.ctx, txn, types.MakeDatums(19), kv.IntHandle(10), nil) - c.Assert(err, IsNil) - _, err = indexOpr.Create(s.ctx, txn, types.MakeDatums(13), kv.IntHandle(2), nil) - c.Assert(err, IsNil) - err = txn.Commit(context.Background()) - c.Assert(err, IsNil) - err = tk.ExecToErr("admin check table admin_test") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[executor:8134]col c2, handle 2, index:types.Datum{k:0x1, decimal:0x0, length:0x0, i:13, collation:\"\", b:[]uint8(nil), x:interface {}(nil)} != record:types.Datum{k:0x1, decimal:0x0, length:0x0, i:12, collation:\"\", b:[]uint8(nil), x:interface {}(nil)}, compare err:<nil>") - tk.MustExec("set @@tidb_redact_log=1;") - err = tk.ExecToErr("admin check table admin_test") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[executor:8134]col c2, handle \"?\", index:\"?\" != record:\"?\", compare err:\"?\"") - tk.MustExec("set @@tidb_redact_log=0;") - - // Table count = index count. - // Two indices have the same handle. - txn, err = s.store.Begin() - c.Assert(err, IsNil) - err = indexOpr.Delete(sc, txn, types.MakeDatums(13), kv.IntHandle(2)) - c.Assert(err, IsNil) - err = indexOpr.Delete(sc, txn, types.MakeDatums(12), kv.IntHandle(2)) - c.Assert(err, IsNil) - err = txn.Commit(context.Background()) - c.Assert(err, IsNil) - err = tk.ExecToErr("admin check table admin_test") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[executor:8134]col c2, handle 10, index:types.Datum{k:0x1, decimal:0x0, length:0x0, i:19, collation:\"\", b:[]uint8(nil), x:interface {}(nil)} != record:types.Datum{k:0x1, decimal:0x0, length:0x0, i:20, collation:\"\", b:[]uint8(nil), x:interface {}(nil)}, compare err:<nil>") - tk.MustExec("set @@tidb_redact_log=1;") - err = tk.ExecToErr("admin check table admin_test") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[executor:8134]col c2, handle \"?\", index:\"?\" != record:\"?\", compare err:\"?\"") - tk.MustExec("set @@tidb_redact_log=0;") - - // Table count = index count. - // Index c2 has one line of data is 19, the corresponding table data is 20. - txn, err = s.store.Begin() - c.Assert(err, IsNil) - _, err = indexOpr.Create(s.ctx, txn, types.MakeDatums(12), kv.IntHandle(2), nil) - c.Assert(err, IsNil) - err = indexOpr.Delete(sc, txn, types.MakeDatums(20), kv.IntHandle(10)) - c.Assert(err, IsNil) - err = txn.Commit(context.Background()) - c.Assert(err, IsNil) - err = tk.ExecToErr("admin check table admin_test") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[executor:8134]col c2, handle 10, index:types.Datum{k:0x1, decimal:0x0, length:0x0, i:19, collation:\"\", b:[]uint8(nil), x:interface {}(nil)} != record:types.Datum{k:0x1, decimal:0x0, length:0x0, i:20, collation:\"\", b:[]uint8(nil), x:interface {}(nil)}, compare err:<nil>") - tk.MustExec("set @@tidb_redact_log=1;") - err = tk.ExecToErr("admin check table admin_test") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[executor:8134]col c2, handle \"?\", index:\"?\" != record:\"?\", compare err:\"?\"") - tk.MustExec("set @@tidb_redact_log=0;") - - // Recover records. - txn, err = s.store.Begin() - c.Assert(err, IsNil) - err = indexOpr.Delete(sc, txn, types.MakeDatums(19), kv.IntHandle(10)) - c.Assert(err, IsNil) - _, err = indexOpr.Create(s.ctx, txn, types.MakeDatums(20), kv.IntHandle(10), nil) - c.Assert(err, IsNil) - err = txn.Commit(context.Background()) - c.Assert(err, IsNil) - tk.MustExec("admin check table admin_test") -} - -func (s *testSuite8) TestAdminCheckTable(c *C) { +func TestAdminCheckTable(t *testing.T) { // test NULL value. - tk := testkit.NewTestKit(c, s.store) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec(`CREATE TABLE test_null ( a int(11) NOT NULL, @@ -1059,7 +1003,7 @@ func (s *testSuite8) TestAdminCheckTable(c *C) { tk.MustExec("use mysql") tk.MustExec(`admin check table test.t;`) err := tk.ExecToErr("admin check table t") - c.Assert(err, NotNil) + require.Error(t, err) // test add index on time type column which have default value tk.MustExec("use test") @@ -1099,21 +1043,27 @@ func (s *testSuite8) TestAdminCheckTable(c *C) { tk.MustExec(`create table t1 (a decimal(2,1), index(a))`) tk.MustExec(`insert into t1 set a='1.9'`) err = tk.ExecToErr(`alter table t1 modify column a decimal(3,2);`) - c.Assert(err, IsNil) + require.NoError(t, err) tk.MustExec(`delete from t1;`) tk.MustExec(`admin check table t1;`) } -func (s *testSuite1) TestAdminCheckPrimaryIndex(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestAdminCheckPrimaryIndex(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("create table t(a bigint unsigned primary key, b int, c int, index idx(a, b));") tk.MustExec("insert into t values(1, 1, 1), (9223372036854775807, 2, 2);") tk.MustExec("admin check index t idx;") } -func (s *testSuite5) TestAdminCheckWithSnapshot(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestAdminCheckWithSnapshot(t *testing.T) { + store, domain, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists admin_t_s") tk.MustExec("create table admin_t_s (a int, b int, key(a));") @@ -1123,27 +1073,27 @@ func (s *testSuite5) TestAdminCheckWithSnapshot(c *C) { snapshotTime := time.Now() - s.ctx = mock.NewContext() - s.ctx.Store = s.store - is := s.domain.InfoSchema() + ctx := mock.NewContext() + ctx.Store = store + is := domain.InfoSchema() dbName := model.NewCIStr("test") tblName := model.NewCIStr("admin_t_s") tbl, err := is.TableByName(dbName, tblName) - c.Assert(err, IsNil) + require.NoError(t, err) tblInfo := tbl.Meta() idxInfo := tblInfo.FindIndexByName("a") idxOpr := tables.NewIndex(tblInfo.ID, tblInfo, idxInfo) - txn, err := s.store.Begin() - c.Assert(err, IsNil) - _, err = idxOpr.Create(s.ctx, txn, types.MakeDatums(2), kv.IntHandle(100), nil) - c.Assert(err, IsNil) + txn, err := store.Begin() + require.NoError(t, err) + _, err = idxOpr.Create(ctx, txn, types.MakeDatums(2), kv.IntHandle(100), nil) + require.NoError(t, err) err = txn.Commit(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) err = tk.ExecToErr("admin check table admin_t_s") - c.Assert(err, NotNil) + require.Error(t, err) err = tk.ExecToErr("admin check index admin_t_s a") - c.Assert(err, NotNil) + require.Error(t, err) // For mocktikv, safe point is not initialized, we manually insert it for snapshot to use. safePointName := "tikv_gc_safe_point" @@ -1160,9 +1110,9 @@ func (s *testSuite5) TestAdminCheckWithSnapshot(c *C) { tk.MustExec("set @@tidb_snapshot = ''") err = tk.ExecToErr("admin check table admin_t_s") - c.Assert(err, NotNil) + require.Error(t, err) err = tk.ExecToErr("admin check index admin_t_s a") - c.Assert(err, NotNil) + require.Error(t, err) r := tk.MustQuery("admin cleanup index admin_t_s a") r.Check(testkit.Rows("1")) @@ -1170,3 +1120,141 @@ func (s *testSuite5) TestAdminCheckWithSnapshot(c *C) { tk.MustExec("admin check index admin_t_s a;") tk.MustExec("drop table if exists admin_t_s") } + +func TestAdminCheckTableFailed(t *testing.T) { + store, domain, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists admin_test") + tk.MustExec("create table admin_test (c1 int, c2 int, c3 varchar(255) default '1', primary key(c1), key(c3), unique key(c2), key(c2, c3))") + tk.MustExec("insert admin_test (c1, c2, c3) values (-10, -20, 'y'), (-1, -10, 'z'), (1, 11, 'a'), (2, 12, 'b'), (5, 15, 'c'), (10, 20, 'd'), (20, 30, 'e')") + + // Make some corrupted index. Build the index information. + ctx := mock.NewContext() + ctx.Store = store + is := domain.InfoSchema() + dbName := model.NewCIStr("test") + tblName := model.NewCIStr("admin_test") + tbl, err := is.TableByName(dbName, tblName) + require.NoError(t, err) + tblInfo := tbl.Meta() + idxInfo := tblInfo.Indices[1] + indexOpr := tables.NewIndex(tblInfo.ID, tblInfo, idxInfo) + sc := ctx.GetSessionVars().StmtCtx + tk.Session().GetSessionVars().IndexLookupSize = 3 + tk.Session().GetSessionVars().MaxChunkSize = 3 + + // Reduce one row of index. + // Table count > index count. + // Index c2 is missing 11. + txn, err := store.Begin() + require.NoError(t, err) + err = indexOpr.Delete(sc, txn, types.MakeDatums(-10), kv.IntHandle(-1)) + require.NoError(t, err) + err = txn.Commit(context.Background()) + require.NoError(t, err) + err = tk.ExecToErr("admin check table admin_test") + require.Error(t, err) + require.EqualError(t, err, "[executor:8003]admin_test err:[admin:8223]index:<nil> != record:&admin.RecordData{Handle:-1, Values:[]types.Datum{types.Datum{k:0x1, decimal:0x0, length:0x0, i:-10, collation:\"\", b:[]uint8(nil), x:interface {}(nil)}}}") + require.True(t, executor.ErrAdminCheckTable.Equal(err)) + tk.MustExec("set @@tidb_redact_log=1;") + err = tk.ExecToErr("admin check table admin_test") + require.Error(t, err) + require.EqualError(t, err, "[executor:8003]admin_test err:[admin:8223]index:\"?\" != record:\"?\"") + tk.MustExec("set @@tidb_redact_log=0;") + r := tk.MustQuery("admin recover index admin_test c2") + r.Check(testkit.Rows("1 7")) + tk.MustExec("admin check table admin_test") + + // Add one row of index. + // Table count < index count. + // Index c2 has one more values than table data: 0, and the handle 0 hasn't correlative record. + txn, err = store.Begin() + require.NoError(t, err) + _, err = indexOpr.Create(ctx, txn, types.MakeDatums(0), kv.IntHandle(0), nil) + require.NoError(t, err) + err = txn.Commit(context.Background()) + require.NoError(t, err) + err = tk.ExecToErr("admin check table admin_test") + require.Error(t, err) + require.EqualError(t, err, "[executor:8133]handle 0, index:types.Datum{k:0x1, decimal:0x0, length:0x0, i:0, collation:\"\", b:[]uint8(nil), x:interface {}(nil)} != record:<nil>") + tk.MustExec("set @@tidb_redact_log=1;") + err = tk.ExecToErr("admin check table admin_test") + require.Error(t, err) + require.EqualError(t, err, "[executor:8133]handle \"?\", index:\"?\" != record:\"?\"") + tk.MustExec("set @@tidb_redact_log=0;") + + // Add one row of index. + // Table count < index count. + // Index c2 has two more values than table data: 10, 13, and these handles have correlative record. + txn, err = store.Begin() + require.NoError(t, err) + err = indexOpr.Delete(sc, txn, types.MakeDatums(0), kv.IntHandle(0)) + require.NoError(t, err) + // Make sure the index value "19" is smaller "21". Then we scan to "19" before "21". + _, err = indexOpr.Create(ctx, txn, types.MakeDatums(19), kv.IntHandle(10), nil) + require.NoError(t, err) + _, err = indexOpr.Create(ctx, txn, types.MakeDatums(13), kv.IntHandle(2), nil) + require.NoError(t, err) + err = txn.Commit(context.Background()) + require.NoError(t, err) + err = tk.ExecToErr("admin check table admin_test") + require.Error(t, err) + require.EqualError(t, err, "[executor:8134]col c2, handle 2, index:types.Datum{k:0x1, decimal:0x0, length:0x0, i:13, collation:\"\", b:[]uint8(nil), x:interface {}(nil)} != record:types.Datum{k:0x1, decimal:0x0, length:0x0, i:12, collation:\"\", b:[]uint8(nil), x:interface {}(nil)}, compare err:<nil>") + tk.MustExec("set @@tidb_redact_log=1;") + err = tk.ExecToErr("admin check table admin_test") + require.Error(t, err) + require.EqualError(t, err, "[executor:8134]col c2, handle \"?\", index:\"?\" != record:\"?\", compare err:\"?\"") + tk.MustExec("set @@tidb_redact_log=0;") + + // Table count = index count. + // Two indices have the same handle. + txn, err = store.Begin() + require.NoError(t, err) + err = indexOpr.Delete(sc, txn, types.MakeDatums(13), kv.IntHandle(2)) + require.NoError(t, err) + err = indexOpr.Delete(sc, txn, types.MakeDatums(12), kv.IntHandle(2)) + require.NoError(t, err) + err = txn.Commit(context.Background()) + require.NoError(t, err) + err = tk.ExecToErr("admin check table admin_test") + require.Error(t, err) + require.EqualError(t, err, "[executor:8134]col c2, handle 10, index:types.Datum{k:0x1, decimal:0x0, length:0x0, i:19, collation:\"\", b:[]uint8(nil), x:interface {}(nil)} != record:types.Datum{k:0x1, decimal:0x0, length:0x0, i:20, collation:\"\", b:[]uint8(nil), x:interface {}(nil)}, compare err:<nil>") + tk.MustExec("set @@tidb_redact_log=1;") + err = tk.ExecToErr("admin check table admin_test") + require.Error(t, err) + require.EqualError(t, err, "[executor:8134]col c2, handle \"?\", index:\"?\" != record:\"?\", compare err:\"?\"") + tk.MustExec("set @@tidb_redact_log=0;") + + // Table count = index count. + // Index c2 has one line of data is 19, the corresponding table data is 20. + txn, err = store.Begin() + require.NoError(t, err) + _, err = indexOpr.Create(ctx, txn, types.MakeDatums(12), kv.IntHandle(2), nil) + require.NoError(t, err) + err = indexOpr.Delete(sc, txn, types.MakeDatums(20), kv.IntHandle(10)) + require.NoError(t, err) + err = txn.Commit(context.Background()) + require.NoError(t, err) + err = tk.ExecToErr("admin check table admin_test") + require.Error(t, err) + require.EqualError(t, err, "[executor:8134]col c2, handle 10, index:types.Datum{k:0x1, decimal:0x0, length:0x0, i:19, collation:\"\", b:[]uint8(nil), x:interface {}(nil)} != record:types.Datum{k:0x1, decimal:0x0, length:0x0, i:20, collation:\"\", b:[]uint8(nil), x:interface {}(nil)}, compare err:<nil>") + tk.MustExec("set @@tidb_redact_log=1;") + err = tk.ExecToErr("admin check table admin_test") + require.Error(t, err) + require.EqualError(t, err, "[executor:8134]col c2, handle \"?\", index:\"?\" != record:\"?\", compare err:\"?\"") + tk.MustExec("set @@tidb_redact_log=0;") + + // Recover records. + txn, err = store.Begin() + require.NoError(t, err) + err = indexOpr.Delete(sc, txn, types.MakeDatums(19), kv.IntHandle(10)) + require.NoError(t, err) + _, err = indexOpr.Create(ctx, txn, types.MakeDatums(20), kv.IntHandle(10), nil) + require.NoError(t, err) + err = txn.Commit(context.Background()) + require.NoError(t, err) + tk.MustExec("admin check table admin_test") +} diff --git a/executor/aggfuncs/aggfunc_test.go b/executor/aggfuncs/aggfunc_test.go index c1ea91ff4a0a5..d106f6b824e62 100644 --- a/executor/aggfuncs/aggfunc_test.go +++ b/executor/aggfuncs/aggfunc_test.go @@ -22,29 +22,23 @@ import ( "unsafe" "github.com/dgryski/go-farm" - . "github.com/pingcap/check" "github.com/pingcap/errors" - "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/executor/aggfuncs" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/expression/aggregation" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/planner/util" - "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/hack" "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/set" "github.com/stretchr/testify/require" - "github.com/tikv/client-go/v2/testutils" ) const ( @@ -52,51 +46,6 @@ const ( separator = " " ) -var _ = Suite(&testSuite{}) - -func TestT(t *testing.T) { - CustomVerboseFlag = true - *CustomParallelSuiteFlag = true - TestingT(t) -} - -type testSuite struct { - *parser.Parser - ctx sessionctx.Context - cluster testutils.Cluster - store kv.Storage - domain *domain.Domain -} - -func (s *testSuite) SetUpSuite(c *C) { - s.Parser = parser.New() - s.ctx = mock.NewContext() - s.ctx.GetSessionVars().StmtCtx.TimeZone = time.Local - store, err := mockstore.NewMockStore( - mockstore.WithClusterInspector(func(c testutils.Cluster) { - mockstore.BootstrapWithSingleStore(c) - s.cluster = c - }), - ) - c.Assert(err, IsNil) - s.store = store - d, err := session.BootstrapSession(s.store) - c.Assert(err, IsNil) - d.SetStatsUpdating(true) - s.domain = d -} - -func (s *testSuite) TearDownSuite(c *C) { -} - -func (s *testSuite) SetUpTest(c *C) { - s.ctx.GetSessionVars().PlanColumnID = 0 -} - -func (s *testSuite) TearDownTest(c *C) { - s.ctx.GetSessionVars().StmtCtx.SetWarnings(nil) -} - type aggTest struct { dataType *types.FieldType numRows int @@ -369,6 +318,7 @@ func testMergePartialResult(t *testing.T, p aggTest) { iter := chunk.NewIterator4Chunk(srcChk) args := []expression.Expression{&expression.Column{RetType: p.dataType, Index: 0}} + ctor := collate.GetCollator(p.dataType.Collate) if p.funcName == ast.AggFuncGroupConcat { args = append(args, &expression.Constant{Value: types.NewStringDatum(separator), RetType: types.NewFieldType(mysql.TypeString)}) } @@ -411,7 +361,7 @@ func testMergePartialResult(t *testing.T, p aggTest) { if p.funcName == ast.AggFuncJsonArrayagg { dt = resultChk.GetRow(0).GetDatum(0, types.NewFieldType(mysql.TypeJSON)) } - result, err := dt.CompareDatum(ctx.GetSessionVars().StmtCtx, &p.results[0]) + result, err := dt.Compare(ctx.GetSessionVars().StmtCtx, &p.results[0], ctor) require.NoError(t, err) require.Equalf(t, 0, result, "%v != %v", dt.String(), p.results[0]) @@ -438,7 +388,7 @@ func testMergePartialResult(t *testing.T, p aggTest) { if p.funcName == ast.AggFuncJsonArrayagg { dt = resultChk.GetRow(0).GetDatum(0, types.NewFieldType(mysql.TypeJSON)) } - result, err = dt.CompareDatum(ctx.GetSessionVars().StmtCtx, &p.results[1]) + result, err = dt.Compare(ctx.GetSessionVars().StmtCtx, &p.results[1], ctor) require.NoError(t, err) require.Equalf(t, 0, result, "%v != %v", dt.String(), p.results[1]) _, err = finalFunc.MergePartialResult(ctx, partialResult, finalPr) @@ -461,114 +411,11 @@ func testMergePartialResult(t *testing.T, p aggTest) { if p.funcName == ast.AggFuncJsonArrayagg { dt = resultChk.GetRow(0).GetDatum(0, types.NewFieldType(mysql.TypeJSON)) } - result, err = dt.CompareDatum(ctx.GetSessionVars().StmtCtx, &p.results[2]) + result, err = dt.Compare(ctx.GetSessionVars().StmtCtx, &p.results[2], ctor) require.NoError(t, err) require.Equalf(t, 0, result, "%v != %v", dt.String(), p.results[2]) } -// Deprecated: migrating to testMergePartialResult(t *testing.T, p aggTest) -func (s *testSuite) testMergePartialResult(c *C, p aggTest) { - srcChk := p.genSrcChk() - iter := chunk.NewIterator4Chunk(srcChk) - - args := []expression.Expression{&expression.Column{RetType: p.dataType, Index: 0}} - if p.funcName == ast.AggFuncGroupConcat { - args = append(args, &expression.Constant{Value: types.NewStringDatum(separator), RetType: types.NewFieldType(mysql.TypeString)}) - } - desc, err := aggregation.NewAggFuncDesc(s.ctx, p.funcName, args, false) - c.Assert(err, IsNil) - if p.orderBy { - desc.OrderByItems = []*util.ByItems{ - {Expr: args[0], Desc: true}, - } - } - partialDesc, finalDesc := desc.Split([]int{0, 1}) - - // build partial func for partial phase. - partialFunc := aggfuncs.Build(s.ctx, partialDesc, 0) - partialResult, _ := partialFunc.AllocPartialResult() - - // build final func for final phase. - finalFunc := aggfuncs.Build(s.ctx, finalDesc, 0) - finalPr, _ := finalFunc.AllocPartialResult() - resultChk := chunk.NewChunkWithCapacity([]*types.FieldType{p.dataType}, 1) - if p.funcName == ast.AggFuncApproxCountDistinct { - resultChk = chunk.NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeString)}, 1) - } - if p.funcName == ast.AggFuncJsonArrayagg { - resultChk = chunk.NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeJSON)}, 1) - } - - // update partial result. - for row := iter.Begin(); row != iter.End(); row = iter.Next() { - _, err = partialFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, partialResult) - c.Assert(err, IsNil) - } - p.messUpChunk(srcChk) - err = partialFunc.AppendFinalResult2Chunk(s.ctx, partialResult, resultChk) - c.Assert(err, IsNil) - dt := resultChk.GetRow(0).GetDatum(0, p.dataType) - if p.funcName == ast.AggFuncApproxCountDistinct { - dt = resultChk.GetRow(0).GetDatum(0, types.NewFieldType(mysql.TypeString)) - } - if p.funcName == ast.AggFuncJsonArrayagg { - dt = resultChk.GetRow(0).GetDatum(0, types.NewFieldType(mysql.TypeJSON)) - } - result, err := dt.CompareDatum(s.ctx.GetSessionVars().StmtCtx, &p.results[0]) - c.Assert(err, IsNil) - c.Assert(result, Equals, 0, Commentf("%v != %v", dt.String(), p.results[0])) - - _, err = finalFunc.MergePartialResult(s.ctx, partialResult, finalPr) - c.Assert(err, IsNil) - partialFunc.ResetPartialResult(partialResult) - - srcChk = p.genSrcChk() - iter = chunk.NewIterator4Chunk(srcChk) - iter.Begin() - iter.Next() - for row := iter.Next(); row != iter.End(); row = iter.Next() { - _, err = partialFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, partialResult) - c.Assert(err, IsNil) - } - p.messUpChunk(srcChk) - resultChk.Reset() - err = partialFunc.AppendFinalResult2Chunk(s.ctx, partialResult, resultChk) - c.Assert(err, IsNil) - dt = resultChk.GetRow(0).GetDatum(0, p.dataType) - if p.funcName == ast.AggFuncApproxCountDistinct { - dt = resultChk.GetRow(0).GetDatum(0, types.NewFieldType(mysql.TypeString)) - } - if p.funcName == ast.AggFuncJsonArrayagg { - dt = resultChk.GetRow(0).GetDatum(0, types.NewFieldType(mysql.TypeJSON)) - } - result, err = dt.CompareDatum(s.ctx.GetSessionVars().StmtCtx, &p.results[1]) - c.Assert(err, IsNil) - c.Assert(result, Equals, 0, Commentf("%v != %v", dt.String(), p.results[1])) - _, err = finalFunc.MergePartialResult(s.ctx, partialResult, finalPr) - c.Assert(err, IsNil) - - if p.funcName == ast.AggFuncApproxCountDistinct { - resultChk = chunk.NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeLonglong)}, 1) - } - if p.funcName == ast.AggFuncJsonArrayagg { - resultChk = chunk.NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeJSON)}, 1) - } - resultChk.Reset() - err = finalFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) - c.Assert(err, IsNil) - - dt = resultChk.GetRow(0).GetDatum(0, p.dataType) - if p.funcName == ast.AggFuncApproxCountDistinct { - dt = resultChk.GetRow(0).GetDatum(0, types.NewFieldType(mysql.TypeLonglong)) - } - if p.funcName == ast.AggFuncJsonArrayagg { - dt = resultChk.GetRow(0).GetDatum(0, types.NewFieldType(mysql.TypeJSON)) - } - result, err = dt.CompareDatum(s.ctx.GetSessionVars().StmtCtx, &p.results[2]) - c.Assert(err, IsNil) - c.Assert(result, Equals, 0, Commentf("%v != %v", dt.String(), p.results[2])) -} - func buildAggTester(funcName string, tp byte, numRows int, results ...interface{}) aggTest { return buildAggTesterWithFieldType(funcName, types.NewFieldType(tp), numRows, results...) } @@ -586,7 +433,7 @@ func buildAggTesterWithFieldType(funcName string, ft *types.FieldType, numRows i return pt } -func (s *testSuite) testMultiArgsMergePartialResult(c *C, p multiArgsAggTest) { +func testMultiArgsMergePartialResult(t *testing.T, ctx sessionctx.Context, p multiArgsAggTest) { srcChk := p.genSrcChk() iter := chunk.NewIterator4Chunk(srcChk) @@ -595,39 +442,40 @@ func (s *testSuite) testMultiArgsMergePartialResult(c *C, p multiArgsAggTest) { args[k] = &expression.Column{RetType: p.dataTypes[k], Index: k} } - desc, err := aggregation.NewAggFuncDesc(s.ctx, p.funcName, args, false) - c.Assert(err, IsNil) + desc, err := aggregation.NewAggFuncDesc(ctx, p.funcName, args, false) + require.NoError(t, err) if p.orderBy { desc.OrderByItems = []*util.ByItems{ {Expr: args[0], Desc: true}, } } + ctor := collate.GetCollator(args[0].GetType().Collate) partialDesc, finalDesc := desc.Split([]int{0, 1}) // build partial func for partial phase. - partialFunc := aggfuncs.Build(s.ctx, partialDesc, 0) + partialFunc := aggfuncs.Build(ctx, partialDesc, 0) partialResult, _ := partialFunc.AllocPartialResult() // build final func for final phase. - finalFunc := aggfuncs.Build(s.ctx, finalDesc, 0) + finalFunc := aggfuncs.Build(ctx, finalDesc, 0) finalPr, _ := finalFunc.AllocPartialResult() resultChk := chunk.NewChunkWithCapacity([]*types.FieldType{p.retType}, 1) // update partial result. for row := iter.Begin(); row != iter.End(); row = iter.Next() { // FIXME: cannot assert error since there are cases of error, e.g. JSON documents may not contain NULL member - _, _ = partialFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, partialResult) + _, _ = partialFunc.UpdatePartialResult(ctx, []chunk.Row{row}, partialResult) } p.messUpChunk(srcChk) - err = partialFunc.AppendFinalResult2Chunk(s.ctx, partialResult, resultChk) - c.Assert(err, IsNil) + err = partialFunc.AppendFinalResult2Chunk(ctx, partialResult, resultChk) + require.NoError(t, err) dt := resultChk.GetRow(0).GetDatum(0, p.retType) - result, err := dt.CompareDatum(s.ctx.GetSessionVars().StmtCtx, &p.results[0]) - c.Assert(err, IsNil) - c.Assert(result, Equals, 0) + result, err := dt.Compare(ctx.GetSessionVars().StmtCtx, &p.results[0], ctor) + require.NoError(t, err) + require.Zero(t, result) - _, err = finalFunc.MergePartialResult(s.ctx, partialResult, finalPr) - c.Assert(err, IsNil) + _, err = finalFunc.MergePartialResult(ctx, partialResult, finalPr) + require.NoError(t, err) partialFunc.ResetPartialResult(partialResult) srcChk = p.genSrcChk() @@ -636,27 +484,27 @@ func (s *testSuite) testMultiArgsMergePartialResult(c *C, p multiArgsAggTest) { iter.Next() for row := iter.Next(); row != iter.End(); row = iter.Next() { // FIXME: cannot check error - _, _ = partialFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, partialResult) + _, _ = partialFunc.UpdatePartialResult(ctx, []chunk.Row{row}, partialResult) } p.messUpChunk(srcChk) resultChk.Reset() - err = partialFunc.AppendFinalResult2Chunk(s.ctx, partialResult, resultChk) - c.Assert(err, IsNil) + err = partialFunc.AppendFinalResult2Chunk(ctx, partialResult, resultChk) + require.NoError(t, err) dt = resultChk.GetRow(0).GetDatum(0, p.retType) - result, err = dt.CompareDatum(s.ctx.GetSessionVars().StmtCtx, &p.results[1]) - c.Assert(err, IsNil) - c.Assert(result, Equals, 0) - _, err = finalFunc.MergePartialResult(s.ctx, partialResult, finalPr) - c.Assert(err, IsNil) + result, err = dt.Compare(ctx.GetSessionVars().StmtCtx, &p.results[1], ctor) + require.NoError(t, err) + require.Zero(t, result) + _, err = finalFunc.MergePartialResult(ctx, partialResult, finalPr) + require.NoError(t, err) resultChk.Reset() - err = finalFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) - c.Assert(err, IsNil) + err = finalFunc.AppendFinalResult2Chunk(ctx, finalPr, resultChk) + require.NoError(t, err) dt = resultChk.GetRow(0).GetDatum(0, p.retType) - result, err = dt.CompareDatum(s.ctx.GetSessionVars().StmtCtx, &p.results[2]) - c.Assert(err, IsNil) - c.Assert(result, Equals, 0) + result, err = dt.Compare(ctx.GetSessionVars().StmtCtx, &p.results[2], ctor) + require.NoError(t, err) + require.Zero(t, result) } // for multiple args in aggfuncs such as json_objectagg(c1, c2) @@ -725,6 +573,7 @@ func testAggFunc(t *testing.T, p aggTest) { ctx := mock.NewContext() args := []expression.Expression{&expression.Column{RetType: p.dataType, Index: 0}} + ctor := collate.GetCollator(p.dataType.Collate) if p.funcName == ast.AggFuncGroupConcat { args = append(args, &expression.Constant{Value: types.NewStringDatum(separator), RetType: types.NewFieldType(mysql.TypeString)}) } @@ -751,7 +600,7 @@ func testAggFunc(t *testing.T, p aggTest) { err = finalFunc.AppendFinalResult2Chunk(ctx, finalPr, resultChk) require.NoError(t, err) dt := resultChk.GetRow(0).GetDatum(0, desc.RetTp) - result, err := dt.CompareDatum(ctx.GetSessionVars().StmtCtx, &p.results[1]) + result, err := dt.Compare(ctx.GetSessionVars().StmtCtx, &p.results[1], ctor) require.NoError(t, err) require.Equalf(t, 0, result, "%v != %v", dt.String(), p.results[1]) @@ -761,7 +610,7 @@ func testAggFunc(t *testing.T, p aggTest) { err = finalFunc.AppendFinalResult2Chunk(ctx, finalPr, resultChk) require.NoError(t, err) dt = resultChk.GetRow(0).GetDatum(0, desc.RetTp) - result, err = dt.CompareDatum(ctx.GetSessionVars().StmtCtx, &p.results[0]) + result, err = dt.Compare(ctx.GetSessionVars().StmtCtx, &p.results[0], ctor) require.NoError(t, err) require.Equalf(t, 0, result, "%v != %v", dt.String(), p.results[0]) @@ -794,7 +643,7 @@ func testAggFunc(t *testing.T, p aggTest) { err = finalFunc.AppendFinalResult2Chunk(ctx, finalPr, resultChk) require.NoError(t, err) dt = resultChk.GetRow(0).GetDatum(0, desc.RetTp) - result, err = dt.CompareDatum(ctx.GetSessionVars().StmtCtx, &p.results[1]) + result, err = dt.Compare(ctx.GetSessionVars().StmtCtx, &p.results[1], ctor) require.NoError(t, err) require.Equalf(t, 0, result, "%v != %v", dt.String(), p.results[1]) @@ -804,143 +653,56 @@ func testAggFunc(t *testing.T, p aggTest) { err = finalFunc.AppendFinalResult2Chunk(ctx, finalPr, resultChk) require.NoError(t, err) dt = resultChk.GetRow(0).GetDatum(0, desc.RetTp) - result, err = dt.CompareDatum(ctx.GetSessionVars().StmtCtx, &p.results[0]) + result, err = dt.Compare(ctx.GetSessionVars().StmtCtx, &p.results[0], ctor) require.NoError(t, err) require.Equalf(t, 0, result, "%v != %v", dt.String(), p.results[0]) } -// Deprecated: migrating to func testAggFunc(t *testing.T, p aggTest) -func (s *testSuite) testAggFunc(c *C, p aggTest) { - srcChk := p.genSrcChk() - - args := []expression.Expression{&expression.Column{RetType: p.dataType, Index: 0}} - if p.funcName == ast.AggFuncGroupConcat { - args = append(args, &expression.Constant{Value: types.NewStringDatum(separator), RetType: types.NewFieldType(mysql.TypeString)}) - } - if p.funcName == ast.AggFuncApproxPercentile { - args = append(args, &expression.Constant{Value: types.NewIntDatum(50), RetType: types.NewFieldType(mysql.TypeLong)}) - } - desc, err := aggregation.NewAggFuncDesc(s.ctx, p.funcName, args, false) - c.Assert(err, IsNil) - if p.orderBy { - desc.OrderByItems = []*util.ByItems{ - {Expr: args[0], Desc: true}, - } - } - finalFunc := aggfuncs.Build(s.ctx, desc, 0) - finalPr, _ := finalFunc.AllocPartialResult() - resultChk := chunk.NewChunkWithCapacity([]*types.FieldType{desc.RetTp}, 1) - - iter := chunk.NewIterator4Chunk(srcChk) - for row := iter.Begin(); row != iter.End(); row = iter.Next() { - _, err = finalFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, finalPr) - c.Assert(err, IsNil) - } - p.messUpChunk(srcChk) - err = finalFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) - c.Assert(err, IsNil) - dt := resultChk.GetRow(0).GetDatum(0, desc.RetTp) - result, err := dt.CompareDatum(s.ctx.GetSessionVars().StmtCtx, &p.results[1]) - c.Assert(err, IsNil) - c.Assert(result, Equals, 0, Commentf("%v != %v", dt.String(), p.results[1])) - - // test the empty input - resultChk.Reset() - finalFunc.ResetPartialResult(finalPr) - err = finalFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) - c.Assert(err, IsNil) - dt = resultChk.GetRow(0).GetDatum(0, desc.RetTp) - result, err = dt.CompareDatum(s.ctx.GetSessionVars().StmtCtx, &p.results[0]) - c.Assert(err, IsNil) - c.Assert(result, Equals, 0, Commentf("%v != %v", dt.String(), p.results[0])) - - // test the agg func with distinct - desc, err = aggregation.NewAggFuncDesc(s.ctx, p.funcName, args, true) - c.Assert(err, IsNil) - if p.orderBy { - desc.OrderByItems = []*util.ByItems{ - {Expr: args[0], Desc: true}, - } - } - finalFunc = aggfuncs.Build(s.ctx, desc, 0) - finalPr, _ = finalFunc.AllocPartialResult() - - resultChk.Reset() - srcChk = p.genSrcChk() - iter = chunk.NewIterator4Chunk(srcChk) - for row := iter.Begin(); row != iter.End(); row = iter.Next() { - _, err = finalFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, finalPr) - c.Assert(err, IsNil) - } - p.messUpChunk(srcChk) - srcChk = p.genSrcChk() - iter = chunk.NewIterator4Chunk(srcChk) - for row := iter.Begin(); row != iter.End(); row = iter.Next() { - _, err = finalFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, finalPr) - c.Assert(err, IsNil) - } - p.messUpChunk(srcChk) - err = finalFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) - c.Assert(err, IsNil) - dt = resultChk.GetRow(0).GetDatum(0, desc.RetTp) - result, err = dt.CompareDatum(s.ctx.GetSessionVars().StmtCtx, &p.results[1]) - c.Assert(err, IsNil) - c.Assert(result, Equals, 0, Commentf("%v != %v", dt.String(), p.results[1])) - - // test the empty input - resultChk.Reset() - finalFunc.ResetPartialResult(finalPr) - err = finalFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) - c.Assert(err, IsNil) - dt = resultChk.GetRow(0).GetDatum(0, desc.RetTp) - result, err = dt.CompareDatum(s.ctx.GetSessionVars().StmtCtx, &p.results[0]) - c.Assert(err, IsNil) - c.Assert(result, Equals, 0, Commentf("%v != %v", dt.String(), p.results[0])) -} - -func (s *testSuite) testAggFuncWithoutDistinct(c *C, p aggTest) { +func testAggFuncWithoutDistinct(t *testing.T, p aggTest) { srcChk := p.genSrcChk() args := []expression.Expression{&expression.Column{RetType: p.dataType, Index: 0}} + ctor := collate.GetCollator(p.dataType.Collate) if p.funcName == ast.AggFuncGroupConcat { args = append(args, &expression.Constant{Value: types.NewStringDatum(separator), RetType: types.NewFieldType(mysql.TypeString)}) } if p.funcName == ast.AggFuncApproxPercentile { args = append(args, &expression.Constant{Value: types.NewIntDatum(50), RetType: types.NewFieldType(mysql.TypeLong)}) } - desc, err := aggregation.NewAggFuncDesc(s.ctx, p.funcName, args, false) - c.Assert(err, IsNil) + ctx := mock.NewContext() + desc, err := aggregation.NewAggFuncDesc(ctx, p.funcName, args, false) + require.NoError(t, err) if p.orderBy { desc.OrderByItems = []*util.ByItems{ {Expr: args[0], Desc: true}, } } - finalFunc := aggfuncs.Build(s.ctx, desc, 0) + finalFunc := aggfuncs.Build(ctx, desc, 0) finalPr, _ := finalFunc.AllocPartialResult() resultChk := chunk.NewChunkWithCapacity([]*types.FieldType{desc.RetTp}, 1) iter := chunk.NewIterator4Chunk(srcChk) for row := iter.Begin(); row != iter.End(); row = iter.Next() { - _, err = finalFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, finalPr) - c.Assert(err, IsNil) + _, err = finalFunc.UpdatePartialResult(ctx, []chunk.Row{row}, finalPr) + require.NoError(t, err) } p.messUpChunk(srcChk) - err = finalFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) - c.Assert(err, IsNil) + err = finalFunc.AppendFinalResult2Chunk(ctx, finalPr, resultChk) + require.NoError(t, err) dt := resultChk.GetRow(0).GetDatum(0, desc.RetTp) - result, err := dt.CompareDatum(s.ctx.GetSessionVars().StmtCtx, &p.results[1]) - c.Assert(err, IsNil) - c.Assert(result, Equals, 0, Commentf("%v != %v", dt.String(), p.results[1])) + result, err := dt.Compare(ctx.GetSessionVars().StmtCtx, &p.results[1], ctor) + require.NoError(t, err) + require.Zerof(t, result, "%v != %v", dt.String(), p.results[1]) // test the empty input resultChk.Reset() finalFunc.ResetPartialResult(finalPr) - err = finalFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) - c.Assert(err, IsNil) + err = finalFunc.AppendFinalResult2Chunk(ctx, finalPr, resultChk) + require.NoError(t, err) dt = resultChk.GetRow(0).GetDatum(0, desc.RetTp) - result, err = dt.CompareDatum(s.ctx.GetSessionVars().StmtCtx, &p.results[0]) - c.Assert(err, IsNil) - c.Assert(result, Equals, 0, Commentf("%v != %v", dt.String(), p.results[0])) + result, err = dt.Compare(ctx.GetSessionVars().StmtCtx, &p.results[0], ctor) + require.NoError(t, err) + require.Zerof(t, result, "%v != %v", dt.String(), p.results[0]) } func testAggMemFunc(t *testing.T, p aggMemTest) { @@ -974,38 +736,7 @@ func testAggMemFunc(t *testing.T, p aggMemTest) { } } -// Deprecated: migrating to testAggMemFunc(t *testing.T, p aggMemTest) -func (s *testSuite) testAggMemFunc(c *C, p aggMemTest) { - srcChk := p.aggTest.genSrcChk() - - args := []expression.Expression{&expression.Column{RetType: p.aggTest.dataType, Index: 0}} - if p.aggTest.funcName == ast.AggFuncGroupConcat { - args = append(args, &expression.Constant{Value: types.NewStringDatum(separator), RetType: types.NewFieldType(mysql.TypeString)}) - } - desc, err := aggregation.NewAggFuncDesc(s.ctx, p.aggTest.funcName, args, p.isDistinct) - c.Assert(err, IsNil) - if p.aggTest.orderBy { - desc.OrderByItems = []*util.ByItems{ - {Expr: args[0], Desc: true}, - } - } - finalFunc := aggfuncs.Build(s.ctx, desc, 0) - finalPr, memDelta := finalFunc.AllocPartialResult() - c.Assert(memDelta, Equals, p.allocMemDelta) - - updateMemDeltas, err := p.updateMemDeltaGens(srcChk, p.aggTest.dataType) - c.Assert(err, IsNil) - iter := chunk.NewIterator4Chunk(srcChk) - i := 0 - for row := iter.Begin(); row != iter.End(); row = iter.Next() { - memDelta, err := finalFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, finalPr) - c.Assert(err, IsNil) - c.Assert(memDelta, Equals, updateMemDeltas[i]) - i++ - } -} - -func (s *testSuite) testMultiArgsAggFunc(c *C, p multiArgsAggTest) { +func testMultiArgsAggFunc(t *testing.T, ctx sessionctx.Context, p multiArgsAggTest) { srcChk := p.genSrcChk() args := make([]expression.Expression, len(p.dataTypes)) @@ -1016,49 +747,50 @@ func (s *testSuite) testMultiArgsAggFunc(c *C, p multiArgsAggTest) { args = append(args, &expression.Constant{Value: types.NewStringDatum(separator), RetType: types.NewFieldType(mysql.TypeString)}) } - desc, err := aggregation.NewAggFuncDesc(s.ctx, p.funcName, args, false) - c.Assert(err, IsNil) + desc, err := aggregation.NewAggFuncDesc(ctx, p.funcName, args, false) + require.NoError(t, err) if p.orderBy { desc.OrderByItems = []*util.ByItems{ {Expr: args[0], Desc: true}, } } - finalFunc := aggfuncs.Build(s.ctx, desc, 0) + ctor := collate.GetCollator(args[0].GetType().Collate) + finalFunc := aggfuncs.Build(ctx, desc, 0) finalPr, _ := finalFunc.AllocPartialResult() resultChk := chunk.NewChunkWithCapacity([]*types.FieldType{desc.RetTp}, 1) iter := chunk.NewIterator4Chunk(srcChk) for row := iter.Begin(); row != iter.End(); row = iter.Next() { // FIXME: cannot assert error since there are cases of error, e.g. rows were cut by GROUPCONCAT - _, _ = finalFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, finalPr) + _, _ = finalFunc.UpdatePartialResult(ctx, []chunk.Row{row}, finalPr) } p.messUpChunk(srcChk) - err = finalFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) - c.Assert(err, IsNil) + err = finalFunc.AppendFinalResult2Chunk(ctx, finalPr, resultChk) + require.NoError(t, err) dt := resultChk.GetRow(0).GetDatum(0, desc.RetTp) - result, err := dt.CompareDatum(s.ctx.GetSessionVars().StmtCtx, &p.results[1]) - c.Assert(err, IsNil) - c.Assert(result, Equals, 0, Commentf("%v != %v", dt.String(), p.results[1])) + result, err := dt.Compare(ctx.GetSessionVars().StmtCtx, &p.results[1], ctor) + require.NoError(t, err) + require.Zerof(t, result, "%v != %v", dt.String(), p.results[1]) // test the empty input resultChk.Reset() finalFunc.ResetPartialResult(finalPr) - err = finalFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) - c.Assert(err, IsNil) + err = finalFunc.AppendFinalResult2Chunk(ctx, finalPr, resultChk) + require.NoError(t, err) dt = resultChk.GetRow(0).GetDatum(0, desc.RetTp) - result, err = dt.CompareDatum(s.ctx.GetSessionVars().StmtCtx, &p.results[0]) - c.Assert(err, IsNil) - c.Assert(result, Equals, 0, Commentf("%v != %v", dt.String(), p.results[0])) + result, err = dt.Compare(ctx.GetSessionVars().StmtCtx, &p.results[0], ctor) + require.NoError(t, err) + require.Zerof(t, result, "%v != %v", dt.String(), p.results[0]) // test the agg func with distinct - desc, err = aggregation.NewAggFuncDesc(s.ctx, p.funcName, args, true) - c.Assert(err, IsNil) + desc, err = aggregation.NewAggFuncDesc(ctx, p.funcName, args, true) + require.NoError(t, err) if p.orderBy { desc.OrderByItems = []*util.ByItems{ {Expr: args[0], Desc: true}, } } - finalFunc = aggfuncs.Build(s.ctx, desc, 0) + finalFunc = aggfuncs.Build(ctx, desc, 0) finalPr, _ = finalFunc.AllocPartialResult() resultChk.Reset() @@ -1066,36 +798,37 @@ func (s *testSuite) testMultiArgsAggFunc(c *C, p multiArgsAggTest) { iter = chunk.NewIterator4Chunk(srcChk) for row := iter.Begin(); row != iter.End(); row = iter.Next() { // FIXME: cannot check error - _, _ = finalFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, finalPr) + _, _ = finalFunc.UpdatePartialResult(ctx, []chunk.Row{row}, finalPr) } p.messUpChunk(srcChk) srcChk = p.genSrcChk() iter = chunk.NewIterator4Chunk(srcChk) for row := iter.Begin(); row != iter.End(); row = iter.Next() { // FIXME: cannot check error - _, _ = finalFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, finalPr) + _, _ = finalFunc.UpdatePartialResult(ctx, []chunk.Row{row}, finalPr) } p.messUpChunk(srcChk) - err = finalFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) - c.Assert(err, IsNil) + err = finalFunc.AppendFinalResult2Chunk(ctx, finalPr, resultChk) + require.NoError(t, err) dt = resultChk.GetRow(0).GetDatum(0, desc.RetTp) - result, err = dt.CompareDatum(s.ctx.GetSessionVars().StmtCtx, &p.results[1]) - c.Assert(err, IsNil) - c.Assert(result, Equals, 0, Commentf("%v != %v", dt.String(), p.results[1])) + result, err = dt.Compare(ctx.GetSessionVars().StmtCtx, &p.results[1], ctor) + require.NoError(t, err) + require.Zerof(t, result, "%v != %v", dt.String(), p.results[1]) // test the empty input resultChk.Reset() finalFunc.ResetPartialResult(finalPr) - err = finalFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) - c.Assert(err, IsNil) + err = finalFunc.AppendFinalResult2Chunk(ctx, finalPr, resultChk) + require.NoError(t, err) dt = resultChk.GetRow(0).GetDatum(0, desc.RetTp) - result, err = dt.CompareDatum(s.ctx.GetSessionVars().StmtCtx, &p.results[0]) - c.Assert(err, IsNil) - c.Assert(result, Equals, 0) + result, err = dt.Compare(ctx.GetSessionVars().StmtCtx, &p.results[0], ctor) + require.NoError(t, err) + require.Zero(t, result) } -func (s *testSuite) testMultiArgsAggMemFunc(c *C, p multiArgsAggMemTest) { +func testMultiArgsAggMemFunc(t *testing.T, p multiArgsAggMemTest) { srcChk := p.multiArgsAggTest.genSrcChk() + ctx := mock.NewContext() args := make([]expression.Expression, len(p.multiArgsAggTest.dataTypes)) for k := 0; k < len(p.multiArgsAggTest.dataTypes); k++ { @@ -1105,29 +838,29 @@ func (s *testSuite) testMultiArgsAggMemFunc(c *C, p multiArgsAggMemTest) { args = append(args, &expression.Constant{Value: types.NewStringDatum(separator), RetType: types.NewFieldType(mysql.TypeString)}) } - desc, err := aggregation.NewAggFuncDesc(s.ctx, p.multiArgsAggTest.funcName, args, p.isDistinct) - c.Assert(err, IsNil) + desc, err := aggregation.NewAggFuncDesc(ctx, p.multiArgsAggTest.funcName, args, p.isDistinct) + require.NoError(t, err) if p.multiArgsAggTest.orderBy { desc.OrderByItems = []*util.ByItems{ {Expr: args[0], Desc: true}, } } - finalFunc := aggfuncs.Build(s.ctx, desc, 0) + finalFunc := aggfuncs.Build(ctx, desc, 0) finalPr, memDelta := finalFunc.AllocPartialResult() - c.Assert(memDelta, Equals, p.allocMemDelta) + require.Equal(t, p.allocMemDelta, memDelta) updateMemDeltas, err := p.multiArgsUpdateMemDeltaGens(srcChk, p.multiArgsAggTest.dataTypes, desc.OrderByItems) - c.Assert(err, IsNil) + require.NoError(t, err) iter := chunk.NewIterator4Chunk(srcChk) i := 0 for row := iter.Begin(); row != iter.End(); row = iter.Next() { - memDelta, _ := finalFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, finalPr) - c.Assert(memDelta, Equals, updateMemDeltas[i]) + memDelta, _ := finalFunc.UpdatePartialResult(ctx, []chunk.Row{row}, finalPr) + require.Equal(t, updateMemDeltas[i], memDelta) i++ } } -func (s *testSuite) benchmarkAggFunc(b *testing.B, p aggTest) { +func benchmarkAggFunc(b *testing.B, ctx sessionctx.Context, p aggTest) { srcChk := chunk.NewChunkWithCapacity([]*types.FieldType{p.dataType}, p.numRows) for i := 0; i < p.numRows; i++ { dt := p.dataGen(i) @@ -1139,7 +872,7 @@ func (s *testSuite) benchmarkAggFunc(b *testing.B, p aggTest) { if p.funcName == ast.AggFuncGroupConcat { args = append(args, &expression.Constant{Value: types.NewStringDatum(separator), RetType: types.NewFieldType(mysql.TypeString)}) } - desc, err := aggregation.NewAggFuncDesc(s.ctx, p.funcName, args, false) + desc, err := aggregation.NewAggFuncDesc(ctx, p.funcName, args, false) if err != nil { b.Fatal(err) } @@ -1148,7 +881,7 @@ func (s *testSuite) benchmarkAggFunc(b *testing.B, p aggTest) { {Expr: args[0], Desc: true}, } } - finalFunc := aggfuncs.Build(s.ctx, desc, 0) + finalFunc := aggfuncs.Build(ctx, desc, 0) resultChk := chunk.NewChunkWithCapacity([]*types.FieldType{desc.RetTp}, 1) iter := chunk.NewIterator4Chunk(srcChk) input := make([]chunk.Row, 0, iter.Len()) @@ -1156,10 +889,10 @@ func (s *testSuite) benchmarkAggFunc(b *testing.B, p aggTest) { input = append(input, row) } b.Run(fmt.Sprintf("%v/%v", p.funcName, p.dataType), func(b *testing.B) { - s.baseBenchmarkAggFunc(b, finalFunc, input, resultChk) + baseBenchmarkAggFunc(b, ctx, finalFunc, input, resultChk) }) - desc, err = aggregation.NewAggFuncDesc(s.ctx, p.funcName, args, true) + desc, err = aggregation.NewAggFuncDesc(ctx, p.funcName, args, true) if err != nil { b.Fatal(err) } @@ -1168,14 +901,14 @@ func (s *testSuite) benchmarkAggFunc(b *testing.B, p aggTest) { {Expr: args[0], Desc: true}, } } - finalFunc = aggfuncs.Build(s.ctx, desc, 0) + finalFunc = aggfuncs.Build(ctx, desc, 0) resultChk.Reset() b.Run(fmt.Sprintf("%v(distinct)/%v", p.funcName, p.dataType), func(b *testing.B) { - s.baseBenchmarkAggFunc(b, finalFunc, input, resultChk) + baseBenchmarkAggFunc(b, ctx, finalFunc, input, resultChk) }) } -func (s *testSuite) benchmarkMultiArgsAggFunc(b *testing.B, p multiArgsAggTest) { +func benchmarkMultiArgsAggFunc(b *testing.B, ctx sessionctx.Context, p multiArgsAggTest) { srcChk := chunk.NewChunkWithCapacity(p.dataTypes, p.numRows) for i := 0; i < p.numRows; i++ { for j := 0; j < len(p.dataGens); j++ { @@ -1193,7 +926,7 @@ func (s *testSuite) benchmarkMultiArgsAggFunc(b *testing.B, p multiArgsAggTest) args = append(args, &expression.Constant{Value: types.NewStringDatum(separator), RetType: types.NewFieldType(mysql.TypeString)}) } - desc, err := aggregation.NewAggFuncDesc(s.ctx, p.funcName, args, false) + desc, err := aggregation.NewAggFuncDesc(ctx, p.funcName, args, false) if err != nil { b.Fatal(err) } @@ -1202,7 +935,7 @@ func (s *testSuite) benchmarkMultiArgsAggFunc(b *testing.B, p multiArgsAggTest) {Expr: args[0], Desc: true}, } } - finalFunc := aggfuncs.Build(s.ctx, desc, 0) + finalFunc := aggfuncs.Build(ctx, desc, 0) resultChk := chunk.NewChunkWithCapacity([]*types.FieldType{desc.RetTp}, 1) iter := chunk.NewIterator4Chunk(srcChk) input := make([]chunk.Row, 0, iter.Len()) @@ -1210,10 +943,10 @@ func (s *testSuite) benchmarkMultiArgsAggFunc(b *testing.B, p multiArgsAggTest) input = append(input, row) } b.Run(fmt.Sprintf("%v/%v", p.funcName, p.dataTypes), func(b *testing.B) { - s.baseBenchmarkAggFunc(b, finalFunc, input, resultChk) + baseBenchmarkAggFunc(b, ctx, finalFunc, input, resultChk) }) - desc, err = aggregation.NewAggFuncDesc(s.ctx, p.funcName, args, true) + desc, err = aggregation.NewAggFuncDesc(ctx, p.funcName, args, true) if err != nil { b.Fatal(err) } @@ -1222,20 +955,19 @@ func (s *testSuite) benchmarkMultiArgsAggFunc(b *testing.B, p multiArgsAggTest) {Expr: args[0], Desc: true}, } } - finalFunc = aggfuncs.Build(s.ctx, desc, 0) + finalFunc = aggfuncs.Build(ctx, desc, 0) resultChk.Reset() b.Run(fmt.Sprintf("%v(distinct)/%v", p.funcName, p.dataTypes), func(b *testing.B) { - s.baseBenchmarkAggFunc(b, finalFunc, input, resultChk) + baseBenchmarkAggFunc(b, ctx, finalFunc, input, resultChk) }) } -func (s *testSuite) baseBenchmarkAggFunc(b *testing.B, - finalFunc aggfuncs.AggFunc, input []chunk.Row, output *chunk.Chunk) { +func baseBenchmarkAggFunc(b *testing.B, ctx sessionctx.Context, finalFunc aggfuncs.AggFunc, input []chunk.Row, output *chunk.Chunk) { finalPr, _ := finalFunc.AllocPartialResult() output.Reset() b.ResetTimer() for i := 0; i < b.N; i++ { - _, err := finalFunc.UpdatePartialResult(s.ctx, input, finalPr) + _, err := finalFunc.UpdatePartialResult(ctx, input, finalPr) if err != nil { b.Fatal(err) } diff --git a/executor/aggfuncs/aggfuncs.go b/executor/aggfuncs/aggfuncs.go index 3de0e80841715..0c0ac5220a6e1 100644 --- a/executor/aggfuncs/aggfuncs.go +++ b/executor/aggfuncs/aggfuncs.go @@ -188,9 +188,8 @@ type baseAggFunc struct { // used to append the final result of this function. ordinal int - // frac stores digits of the fractional part of decimals, - // which makes the decimal be the result of type inferring. - frac int + // retTp means the target type of the final agg should return. + retTp *types.FieldType } func (*baseAggFunc) MergePartialResult(sctx sessionctx.Context, src, dst PartialResult) (memDelta int64, err error) { diff --git a/executor/aggfuncs/builder.go b/executor/aggfuncs/builder.go index bd697c33b9333..e5d9eafbd2a0c 100644 --- a/executor/aggfuncs/builder.go +++ b/executor/aggfuncs/builder.go @@ -18,7 +18,6 @@ import ( "fmt" "strconv" - "github.com/cznic/mathutil" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/expression/aggregation" "github.com/pingcap/tidb/parser/ast" @@ -194,6 +193,7 @@ func buildCount(aggFuncDesc *aggregation.AggFuncDesc, ordinal int) AggFunc { base := baseAggFunc{ args: aggFuncDesc.Args, ordinal: ordinal, + retTp: aggFuncDesc.RetTp, } // If HasDistinct and mode is CompleteMode or Partial1Mode, we should @@ -253,13 +253,9 @@ func buildSum(ctx sessionctx.Context, aggFuncDesc *aggregation.AggFuncDesc, ordi baseAggFunc: baseAggFunc{ args: aggFuncDesc.Args, ordinal: ordinal, + retTp: aggFuncDesc.RetTp, }, } - frac := base.args[0].GetType().Decimal - if frac == -1 { - frac = mysql.MaxDecimalScale - } - base.frac = mathutil.Min(frac, mysql.MaxDecimalScale) switch aggFuncDesc.Mode { case aggregation.DedupMode: return nil @@ -287,16 +283,8 @@ func buildAvg(ctx sessionctx.Context, aggFuncDesc *aggregation.AggFuncDesc, ordi base := baseAggFunc{ args: aggFuncDesc.Args, ordinal: ordinal, + retTp: aggFuncDesc.RetTp, } - frac := base.args[0].GetType().Decimal - if len(base.args) == 2 { - frac = base.args[1].GetType().Decimal - } - if frac == -1 { - frac = mysql.MaxDecimalScale - } - base.frac = mathutil.Min(frac, mysql.MaxDecimalScale) - switch aggFuncDesc.Mode { // Build avg functions which consume the original data and remove the // duplicated input of the same group. @@ -340,13 +328,8 @@ func buildFirstRow(aggFuncDesc *aggregation.AggFuncDesc, ordinal int) AggFunc { base := baseAggFunc{ args: aggFuncDesc.Args, ordinal: ordinal, + retTp: aggFuncDesc.RetTp, } - frac := base.args[0].GetType().Decimal - if frac == -1 { - frac = mysql.MaxDecimalScale - } - base.frac = mathutil.Min(frac, mysql.MaxDecimalScale) - evalType, fieldType := aggFuncDesc.RetTp.EvalType(), aggFuncDesc.RetTp if fieldType.Tp == mysql.TypeBit { evalType = types.ETString @@ -392,15 +375,10 @@ func buildMaxMin(aggFuncDesc *aggregation.AggFuncDesc, ordinal int, isMax bool) baseAggFunc: baseAggFunc{ args: aggFuncDesc.Args, ordinal: ordinal, + retTp: aggFuncDesc.RetTp, }, isMax: isMax, } - frac := base.args[0].GetType().Decimal - if frac == -1 { - frac = mysql.MaxDecimalScale - } - base.frac = mathutil.Min(frac, mysql.MaxDecimalScale) - evalType, fieldType := aggFuncDesc.RetTp.EvalType(), aggFuncDesc.RetTp if fieldType.Tp == mysql.TypeBit { evalType = types.ETString diff --git a/executor/aggfuncs/func_avg.go b/executor/aggfuncs/func_avg.go index fc76ce49f86cd..17203aad50b7e 100644 --- a/executor/aggfuncs/func_avg.go +++ b/executor/aggfuncs/func_avg.go @@ -17,6 +17,8 @@ package aggfuncs import ( "unsafe" + "github.com/pingcap/errors" + "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" @@ -72,7 +74,14 @@ func (e *baseAvgDecimal) AppendFinalResult2Chunk(sctx sessionctx.Context, pr Par if err != nil { return err } - err = finalResult.Round(finalResult, e.frac, types.ModeHalfEven) + if e.retTp == nil { + return errors.New("e.retTp of avg should not be nil") + } + frac := e.retTp.Decimal + if frac == -1 { + frac = mysql.MaxDecimalScale + } + err = finalResult.Round(finalResult, frac, types.ModeHalfEven) if err != nil { return err } @@ -260,7 +269,14 @@ func (e *avgOriginal4DistinctDecimal) AppendFinalResult2Chunk(sctx sessionctx.Co if err != nil { return err } - err = finalResult.Round(finalResult, e.frac, types.ModeHalfEven) + if e.retTp == nil { + return errors.New("e.retTp of avg should not be nil") + } + frac := e.retTp.Decimal + if frac == -1 { + frac = mysql.MaxDecimalScale + } + err = finalResult.Round(finalResult, frac, types.ModeHalfEven) if err != nil { return err } diff --git a/executor/aggfuncs/func_avg_test.go b/executor/aggfuncs/func_avg_test.go index cd896f7027c43..28fbb0095ecc8 100644 --- a/executor/aggfuncs/func_avg_test.go +++ b/executor/aggfuncs/func_avg_test.go @@ -17,34 +17,35 @@ package aggfuncs_test import ( "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/executor/aggfuncs" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/set" ) -func (s *testSuite) TestMergePartialResult4Avg(c *C) { +func TestMergePartialResult4Avg(t *testing.T) { tests := []aggTest{ buildAggTester(ast.AggFuncAvg, mysql.TypeNewDecimal, 5, 2.0, 3.0, 2.375), buildAggTester(ast.AggFuncAvg, mysql.TypeDouble, 5, 2.0, 3.0, 2.375), } for _, test := range tests { - s.testMergePartialResult(c, test) + testMergePartialResult(t, test) } } -func (s *testSuite) TestAvg(c *C) { +func TestAvg(t *testing.T) { tests := []aggTest{ buildAggTester(ast.AggFuncAvg, mysql.TypeNewDecimal, 5, nil, 2.0), buildAggTester(ast.AggFuncAvg, mysql.TypeDouble, 5, nil, 2.0), } + for _, test := range tests { - s.testAggFunc(c, test) + testAggFunc(t, test) } } -func (s *testSuite) TestMemAvg(c *C) { +func TestMemAvg(t *testing.T) { tests := []aggMemTest{ buildAggMemTester(ast.AggFuncAvg, mysql.TypeNewDecimal, 5, aggfuncs.DefPartialResult4AvgDecimalSize, defaultUpdateMemDeltaGens, false), @@ -56,13 +57,12 @@ func (s *testSuite) TestMemAvg(c *C) { aggfuncs.DefPartialResult4AvgDistinctFloat64Size+set.DefFloat64SetBucketMemoryUsage, distinctUpdateMemDeltaGens, true), } for _, test := range tests { - s.testAggMemFunc(c, test) + testAggMemFunc(t, test) } } func BenchmarkAvg(b *testing.B) { - s := testSuite{} - s.SetUpSuite(nil) + ctx := mock.NewContext() rowNum := 50000 tests := []aggTest{ @@ -70,6 +70,6 @@ func BenchmarkAvg(b *testing.B) { buildAggTester(ast.AggFuncAvg, mysql.TypeDouble, rowNum, nil, 2.0), } for _, test := range tests { - s.benchmarkAggFunc(b, test) + benchmarkAggFunc(b, ctx, test) } } diff --git a/executor/aggfuncs/func_bitfuncs_test.go b/executor/aggfuncs/func_bitfuncs_test.go index 6f3570bde8f1b..d4a442c1a61e0 100644 --- a/executor/aggfuncs/func_bitfuncs_test.go +++ b/executor/aggfuncs/func_bitfuncs_test.go @@ -15,24 +15,25 @@ package aggfuncs_test import ( - . "github.com/pingcap/check" + "testing" + "github.com/pingcap/tidb/executor/aggfuncs" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/mysql" ) -func (s *testSuite) TestMergePartialResult4BitFuncs(c *C) { +func TestMergePartialResult4BitFuncs(t *testing.T) { tests := []aggTest{ buildAggTester(ast.AggFuncBitAnd, mysql.TypeLonglong, 5, 0, 0, 0), buildAggTester(ast.AggFuncBitOr, mysql.TypeLonglong, 5, 7, 7, 7), buildAggTester(ast.AggFuncBitXor, mysql.TypeLonglong, 5, 4, 5, 1), } for _, test := range tests { - s.testMergePartialResult(c, test) + testMergePartialResult(t, test) } } -func (s *testSuite) TestMemBitFunc(c *C) { +func TestMemBitFunc(t *testing.T) { tests := []aggMemTest{ buildAggMemTester(ast.AggFuncBitAnd, mysql.TypeLonglong, 5, aggfuncs.DefPartialResult4BitFuncSize, defaultUpdateMemDeltaGens, false), @@ -42,6 +43,6 @@ func (s *testSuite) TestMemBitFunc(c *C) { aggfuncs.DefPartialResult4BitFuncSize, defaultUpdateMemDeltaGens, false), } for _, test := range tests { - s.testAggMemFunc(c, test) + testAggMemFunc(t, test) } } diff --git a/executor/aggfuncs/func_count_test.go b/executor/aggfuncs/func_count_test.go index a1a04c7438d79..b6bbfcfae8151 100644 --- a/executor/aggfuncs/func_count_test.go +++ b/executor/aggfuncs/func_count_test.go @@ -16,16 +16,18 @@ package aggfuncs_test import ( "encoding/binary" + "fmt" "testing" "github.com/dgryski/go-farm" - . "github.com/pingcap/check" "github.com/pingcap/tidb/executor/aggfuncs" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/set" + "github.com/stretchr/testify/require" ) func genApproxDistinctMergePartialResult(begin, end uint64) string { @@ -39,15 +41,15 @@ func genApproxDistinctMergePartialResult(begin, end uint64) string { return string(o.Serialize()) } -func (s *testSuite) TestMergePartialResult4Count(c *C) { +func TestMergePartialResult4Count(t *testing.T) { tester := buildAggTester(ast.AggFuncCount, mysql.TypeLonglong, 5, 5, 3, 8) - s.testMergePartialResult(c, tester) + testMergePartialResult(t, tester) tester = buildAggTester(ast.AggFuncApproxCountDistinct, mysql.TypeLonglong, 5, genApproxDistinctMergePartialResult(0, 5), genApproxDistinctMergePartialResult(2, 5), 5) - s.testMergePartialResult(c, tester) + testMergePartialResult(t, tester) } -func (s *testSuite) TestCount(c *C) { +func TestCount(t *testing.T) { tests := []aggTest{ buildAggTester(ast.AggFuncCount, mysql.TypeLonglong, 5, 0, 5), buildAggTester(ast.AggFuncCount, mysql.TypeFloat, 5, 0, 5), @@ -58,8 +60,10 @@ func (s *testSuite) TestCount(c *C) { buildAggTester(ast.AggFuncCount, mysql.TypeDuration, 5, 0, 5), buildAggTester(ast.AggFuncCount, mysql.TypeJSON, 5, 0, 5), } - for _, test := range tests { - s.testAggFunc(c, test) + for i, test := range tests { + t.Run(fmt.Sprintf("%s_%d", test.funcName, i), func(t *testing.T) { + testAggFunc(t, test) + }) } tests2 := []multiArgsAggTest{ buildMultiArgsAggTester(ast.AggFuncCount, []byte{mysql.TypeLonglong, mysql.TypeLonglong}, mysql.TypeLonglong, 5, 0, 5), @@ -71,8 +75,10 @@ func (s *testSuite) TestCount(c *C) { buildMultiArgsAggTester(ast.AggFuncCount, []byte{mysql.TypeDuration, mysql.TypeDuration}, mysql.TypeLonglong, 5, 0, 5), buildMultiArgsAggTester(ast.AggFuncCount, []byte{mysql.TypeJSON, mysql.TypeJSON}, mysql.TypeLonglong, 5, 0, 5), } - for _, test := range tests2 { - s.testMultiArgsAggFunc(c, test) + for i, test := range tests2 { + t.Run(fmt.Sprintf("%s_%d", test.funcName, i), func(t *testing.T) { + testMultiArgsAggFunc(t, mock.NewContext(), test) + }) } tests3 := []aggTest{ @@ -86,7 +92,7 @@ func (s *testSuite) TestCount(c *C) { buildAggTester(ast.AggFuncCount, mysql.TypeJSON, 5, 0, 5), } for _, test := range tests3 { - s.testAggFunc(c, test) + testAggFunc(t, test) } tests4 := []multiArgsAggTest{ @@ -100,12 +106,14 @@ func (s *testSuite) TestCount(c *C) { buildMultiArgsAggTester(ast.AggFuncApproxCountDistinct, []byte{mysql.TypeJSON, mysql.TypeJSON}, mysql.TypeLonglong, 5, 0, 5), } - for _, test := range tests4 { - s.testMultiArgsAggFunc(c, test) + for i, test := range tests4 { + t.Run(fmt.Sprintf("%s_%d", test.funcName, i), func(t *testing.T) { + testMultiArgsAggFunc(t, mock.NewContext(), test) + }) } } -func (s *testSuite) TestMemCount(c *C) { +func TestMemCount(t *testing.T) { tests := []aggMemTest{ buildAggMemTester(ast.AggFuncCount, mysql.TypeLonglong, 5, aggfuncs.DefPartialResult4CountSize, defaultUpdateMemDeltaGens, false), @@ -142,28 +150,29 @@ func (s *testSuite) TestMemCount(c *C) { buildAggMemTester(ast.AggFuncApproxCountDistinct, mysql.TypeString, 5, aggfuncs.DefPartialResult4ApproxCountDistinctSize, approxCountDistinctUpdateMemDeltaGens, true), } - for _, test := range tests { - s.testAggMemFunc(c, test) + for i, test := range tests { + t.Run(fmt.Sprintf("%s_%d", test.aggTest.funcName, i), func(t *testing.T) { + testAggMemFunc(t, test) + }) } } -func (s *testSuite) TestWriteTime(c *C) { - t, err := types.ParseDate(&(stmtctx.StatementContext{}), "2020-11-11") - c.Assert(err, IsNil) +func TestWriteTime(t *testing.T) { + tt, err := types.ParseDate(&(stmtctx.StatementContext{}), "2020-11-11") + require.NoError(t, err) buf := make([]byte, 16) for i := range buf { buf[i] = uint8(255) } - aggfuncs.WriteTime(buf, t) + aggfuncs.WriteTime(buf, tt) for i := range buf { - c.Assert(buf[i] == uint8(255), IsFalse) + require.False(t, buf[i] == uint8(255)) } } func BenchmarkCount(b *testing.B) { - s := testSuite{} - s.SetUpSuite(nil) + ctx := mock.NewContext() rowNum := 50000 tests := []aggTest{ @@ -177,7 +186,7 @@ func BenchmarkCount(b *testing.B) { buildAggTester(ast.AggFuncCount, mysql.TypeJSON, rowNum, 0, rowNum), } for _, test := range tests { - s.benchmarkAggFunc(b, test) + benchmarkAggFunc(b, ctx, test) } tests2 := []multiArgsAggTest{ @@ -191,7 +200,7 @@ func BenchmarkCount(b *testing.B) { buildMultiArgsAggTester(ast.AggFuncCount, []byte{mysql.TypeJSON, mysql.TypeJSON}, mysql.TypeLonglong, rowNum, 0, rowNum), } for _, test := range tests2 { - s.benchmarkMultiArgsAggFunc(b, test) + benchmarkMultiArgsAggFunc(b, ctx, test) } tests3 := []multiArgsAggTest{ @@ -205,6 +214,6 @@ func BenchmarkCount(b *testing.B) { buildMultiArgsAggTester(ast.AggFuncApproxCountDistinct, []byte{mysql.TypeJSON, mysql.TypeJSON}, mysql.TypeLonglong, rowNum, 0, rowNum), } for _, test := range tests3 { - s.benchmarkMultiArgsAggFunc(b, test) + benchmarkMultiArgsAggFunc(b, ctx, test) } } diff --git a/executor/aggfuncs/func_cume_dist_test.go b/executor/aggfuncs/func_cume_dist_test.go index a68591682317f..77997453f5a23 100644 --- a/executor/aggfuncs/func_cume_dist_test.go +++ b/executor/aggfuncs/func_cume_dist_test.go @@ -23,8 +23,6 @@ import ( ) func TestMemCumeDist(t *testing.T) { - t.Parallel() - tests := []windowMemTest{ buildWindowMemTester(ast.WindowFuncCumeDist, mysql.TypeLonglong, 0, 1, 1, aggfuncs.DefPartialResult4CumeDistSize, rowMemDeltaGens), diff --git a/executor/aggfuncs/func_first_row.go b/executor/aggfuncs/func_first_row.go index c2c33bb0862e4..d93724d0eda4b 100644 --- a/executor/aggfuncs/func_first_row.go +++ b/executor/aggfuncs/func_first_row.go @@ -17,6 +17,8 @@ package aggfuncs import ( "unsafe" + "github.com/pingcap/errors" + "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" @@ -476,7 +478,14 @@ func (e *firstRow4Decimal) AppendFinalResult2Chunk(sctx sessionctx.Context, pr P chk.AppendNull(e.ordinal) return nil } - err := p.val.Round(&p.val, e.frac, types.ModeHalfEven) + if e.retTp == nil { + return errors.New("e.retTp of first_row should not be nil") + } + frac := e.retTp.Decimal + if frac == -1 { + frac = mysql.MaxDecimalScale + } + err := p.val.Round(&p.val, frac, types.ModeHalfEven) if err != nil { return err } diff --git a/executor/aggfuncs/func_first_row_test.go b/executor/aggfuncs/func_first_row_test.go index acd971454406e..2e75edd59e874 100644 --- a/executor/aggfuncs/func_first_row_test.go +++ b/executor/aggfuncs/func_first_row_test.go @@ -15,19 +15,18 @@ package aggfuncs_test import ( + "testing" "time" - . "github.com/pingcap/check" + "github.com/pingcap/tidb/executor/aggfuncs" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/mysql" - - "github.com/pingcap/tidb/executor/aggfuncs" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" "github.com/pingcap/tidb/util/chunk" ) -func (s *testSuite) TestMergePartialResult4FirstRow(c *C) { +func TestMergePartialResult4FirstRow(t *testing.T) { elems := []string{"e", "d", "c", "b", "a"} enumC, _ := types.ParseEnumName(elems, "c", mysql.DefaultCollationName) enumE, _ := types.ParseEnumName(elems, "e", mysql.DefaultCollationName) @@ -48,11 +47,11 @@ func (s *testSuite) TestMergePartialResult4FirstRow(c *C) { buildAggTester(ast.AggFuncFirstRow, mysql.TypeSet, 5, setE, setED, setE), } for _, test := range tests { - s.testMergePartialResult(c, test) + testMergePartialResult(t, test) } } -func (s *testSuite) TestMemFirstRow(c *C) { +func TestMemFirstRow(t *testing.T) { tests := []aggMemTest{ buildAggMemTester(ast.AggFuncFirstRow, mysql.TypeLonglong, 5, aggfuncs.DefPartialResult4FirstRowIntSize, defaultUpdateMemDeltaGens, false), @@ -76,7 +75,7 @@ func (s *testSuite) TestMemFirstRow(c *C) { aggfuncs.DefPartialResult4FirstRowSetSize, firstRowUpdateMemDeltaGens, false), } for _, test := range tests { - s.testAggMemFunc(c, test) + testAggMemFunc(t, test) } } diff --git a/executor/aggfuncs/func_group_concat.go b/executor/aggfuncs/func_group_concat.go index 1718b22682cfd..4cb3993be65ad 100644 --- a/executor/aggfuncs/func_group_concat.go +++ b/executor/aggfuncs/func_group_concat.go @@ -21,15 +21,14 @@ import ( "sync/atomic" "unsafe" - mysql "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/expression" + plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/planner/util" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/codec" "github.com/pingcap/tidb/util/collate" - "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/set" ) @@ -294,6 +293,7 @@ type topNRows struct { // ('---', 'ccc') should be poped from heap, so '-' should be appended to result. // eg: 'aaa---bbb---ccc' -> 'aaa---bbb-' isSepTruncated bool + collators []collate.Collator } func (h topNRows) Len() int { @@ -303,7 +303,7 @@ func (h topNRows) Len() int { func (h topNRows) Less(i, j int) bool { n := len(h.rows[i].byItems) for k := 0; k < n; k++ { - ret, err := h.rows[i].byItems[k].CompareDatum(h.sctx.GetSessionVars().StmtCtx, h.rows[j].byItems[k]) + ret, err := h.rows[i].byItems[k].Compare(h.sctx.GetSessionVars().StmtCtx, h.rows[j].byItems[k], h.collators[k]) if err != nil { h.err = err return false @@ -412,8 +412,10 @@ func (e *groupConcatOrder) AppendFinalResult2Chunk(sctx sessionctx.Context, pr P func (e *groupConcatOrder) AllocPartialResult() (pr PartialResult, memDelta int64) { desc := make([]bool, len(e.byItems)) + ctors := make([]collate.Collator, 0, len(e.byItems)) for i, byItem := range e.byItems { desc[i] = byItem.Desc + ctors = append(ctors, collate.GetCollator(byItem.Expr.GetType().Collate)) } p := &partialResult4GroupConcatOrder{ topN: &topNRows{ @@ -422,6 +424,7 @@ func (e *groupConcatOrder) AllocPartialResult() (pr PartialResult, memDelta int6 limitSize: e.maxLen, sepSize: uint64(len(e.sep)), isSepTruncated: false, + collators: ctors, }, } return PartialResult(p), DefPartialResult4GroupConcatOrderSize + DefTopNRowsSize @@ -479,7 +482,7 @@ func (e *groupConcatOrder) UpdatePartialResult(sctx sessionctx.Context, rowsInGr func (e *groupConcatOrder) MergePartialResult(sctx sessionctx.Context, src, dst PartialResult) (memDelta int64, err error) { // If order by exists, the parallel hash aggregation is forbidden in executorBuilder.buildHashAgg. // So MergePartialResult will not be called. - return 0, dbterror.ClassOptimizer.NewStd(mysql.ErrInternal).GenWithStack("groupConcatOrder.MergePartialResult should not be called") + return 0, plannercore.ErrInternal.GenWithStack("groupConcatOrder.MergePartialResult should not be called") } // SetTruncated will be called in `executorBuilder#buildHashAgg` with duck-type. @@ -514,8 +517,10 @@ func (e *groupConcatDistinctOrder) AppendFinalResult2Chunk(sctx sessionctx.Conte func (e *groupConcatDistinctOrder) AllocPartialResult() (pr PartialResult, memDelta int64) { desc := make([]bool, len(e.byItems)) + ctors := make([]collate.Collator, 0, len(e.byItems)) for i, byItem := range e.byItems { desc[i] = byItem.Desc + ctors = append(ctors, collate.GetCollator(byItem.Expr.GetType().Collate)) } valSet, setSize := set.NewStringSetWithMemoryUsage() p := &partialResult4GroupConcatOrderDistinct{ @@ -525,6 +530,7 @@ func (e *groupConcatDistinctOrder) AllocPartialResult() (pr PartialResult, memDe limitSize: e.maxLen, sepSize: uint64(len(e.sep)), isSepTruncated: false, + collators: ctors, }, valSet: valSet, } @@ -599,7 +605,7 @@ func (e *groupConcatDistinctOrder) UpdatePartialResult(sctx sessionctx.Context, func (e *groupConcatDistinctOrder) MergePartialResult(sctx sessionctx.Context, src, dst PartialResult) (memDelta int64, err error) { // If order by exists, the parallel hash aggregation is forbidden in executorBuilder.buildHashAgg. // So MergePartialResult will not be called. - return 0, dbterror.ClassOptimizer.NewStd(mysql.ErrInternal).GenWithStack("groupConcatDistinctOrder.MergePartialResult should not be called") + return 0, plannercore.ErrInternal.GenWithStack("groupConcatDistinctOrder.MergePartialResult should not be called") } // GetDatumMemSize calculates the memory size of each types.Datum in sortRow.byItems. diff --git a/executor/aggfuncs/func_group_concat_test.go b/executor/aggfuncs/func_group_concat_test.go index be51720e3db0d..eef46c1260e27 100644 --- a/executor/aggfuncs/func_group_concat_test.go +++ b/executor/aggfuncs/func_group_concat_test.go @@ -17,8 +17,8 @@ package aggfuncs_test import ( "bytes" "fmt" + "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/executor/aggfuncs" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/mysql" @@ -28,37 +28,41 @@ import ( "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/codec" "github.com/pingcap/tidb/util/hack" + "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/set" + "github.com/stretchr/testify/require" ) -func (s *testSuite) TestMergePartialResult4GroupConcat(c *C) { +func TestMergePartialResult4GroupConcat(t *testing.T) { test := buildAggTester(ast.AggFuncGroupConcat, mysql.TypeString, 5, "0 1 2 3 4", "2 3 4", "0 1 2 3 4 2 3 4") - s.testMergePartialResult(c, test) + testMergePartialResult(t, test) } -func (s *testSuite) TestGroupConcat(c *C) { +func TestGroupConcat(t *testing.T) { + ctx := mock.NewContext() + test := buildAggTester(ast.AggFuncGroupConcat, mysql.TypeString, 5, nil, "0 1 2 3 4") - s.testAggFunc(c, test) + testAggFunc(t, test) test2 := buildMultiArgsAggTester(ast.AggFuncGroupConcat, []byte{mysql.TypeString, mysql.TypeString}, mysql.TypeString, 5, nil, "44 33 22 11 00") test2.orderBy = true - s.testMultiArgsAggFunc(c, test2) + testMultiArgsAggFunc(t, ctx, test2) defer func() { - err := variable.SetSessionSystemVar(s.ctx.GetSessionVars(), variable.GroupConcatMaxLen, "1024") - c.Assert(err, IsNil) + err := variable.SetSessionSystemVar(ctx.GetSessionVars(), variable.GroupConcatMaxLen, "1024") + require.NoError(t, err) }() // minimum GroupConcatMaxLen is 4 for i := 4; i <= 7; i++ { - err := variable.SetSessionSystemVar(s.ctx.GetSessionVars(), variable.GroupConcatMaxLen, fmt.Sprint(i)) - c.Assert(err, IsNil) + err := variable.SetSessionSystemVar(ctx.GetSessionVars(), variable.GroupConcatMaxLen, fmt.Sprint(i)) + require.NoError(t, err) test2 = buildMultiArgsAggTester(ast.AggFuncGroupConcat, []byte{mysql.TypeString, mysql.TypeString}, mysql.TypeString, 5, nil, "44 33 22 11 00"[:i]) test2.orderBy = true - s.testMultiArgsAggFunc(c, test2) + testMultiArgsAggFunc(t, ctx, test2) } } -func (s *testSuite) TestMemGroupConcat(c *C) { +func TestMemGroupConcat(t *testing.T) { multiArgsTest1 := buildMultiArgsAggMemTester(ast.AggFuncGroupConcat, []byte{mysql.TypeString, mysql.TypeString}, mysql.TypeString, 5, aggfuncs.DefPartialResult4GroupConcatSize+aggfuncs.DefBytesBufferSize, groupConcatMultiArgsUpdateMemDeltaGens, false) multiArgsTest2 := buildMultiArgsAggMemTester(ast.AggFuncGroupConcat, []byte{mysql.TypeString, mysql.TypeString}, mysql.TypeString, 5, @@ -72,8 +76,10 @@ func (s *testSuite) TestMemGroupConcat(c *C) { multiArgsTest4.multiArgsAggTest.orderBy = true multiArgsTests := []multiArgsAggMemTest{multiArgsTest1, multiArgsTest2, multiArgsTest3, multiArgsTest4} - for _, test := range multiArgsTests { - s.testMultiArgsAggMemFunc(c, test) + for i, test := range multiArgsTests { + t.Run(fmt.Sprintf("%s_%d", test.multiArgsAggTest.funcName, i), func(t *testing.T) { + testMultiArgsAggMemFunc(t, test) + }) } } diff --git a/executor/aggfuncs/func_json_arrayagg_test.go b/executor/aggfuncs/func_json_arrayagg_test.go index 2f5382fd8d518..6f9ff09f9ed81 100644 --- a/executor/aggfuncs/func_json_arrayagg_test.go +++ b/executor/aggfuncs/func_json_arrayagg_test.go @@ -15,7 +15,8 @@ package aggfuncs_test import ( - . "github.com/pingcap/check" + "testing" + "github.com/pingcap/errors" "github.com/pingcap/tidb/executor/aggfuncs" "github.com/pingcap/tidb/parser/ast" @@ -25,7 +26,7 @@ import ( "github.com/pingcap/tidb/util/chunk" ) -func (s *testSuite) TestMergePartialResult4JsonArrayagg(c *C) { +func TestMergePartialResult4JsonArrayagg(t *testing.T) { typeList := []byte{mysql.TypeLonglong, mysql.TypeDouble, mysql.TypeString, mysql.TypeJSON} var tests []aggTest @@ -58,11 +59,11 @@ func (s *testSuite) TestMergePartialResult4JsonArrayagg(c *C) { } for _, test := range tests { - s.testMergePartialResult(c, test) + testMergePartialResult(t, test) } } -func (s *testSuite) TestJsonArrayagg(c *C) { +func TestJsonArrayagg(t *testing.T) { typeList := []byte{mysql.TypeLonglong, mysql.TypeDouble, mysql.TypeString, mysql.TypeJSON} var tests []aggTest @@ -84,7 +85,7 @@ func (s *testSuite) TestJsonArrayagg(c *C) { } for _, test := range tests { - s.testAggFuncWithoutDistinct(c, test) + testAggFuncWithoutDistinct(t, test) } } @@ -125,7 +126,7 @@ func jsonArrayaggMemDeltaGens(srcChk *chunk.Chunk, dataType *types.FieldType) (m return memDeltas, nil } -func (s *testSuite) TestMemJsonArrayagg(c *C) { +func TestMemJsonArrayagg(t *testing.T) { typeList := []byte{mysql.TypeLonglong, mysql.TypeDouble, mysql.TypeString, mysql.TypeJSON} var tests []aggMemTest @@ -135,6 +136,6 @@ func (s *testSuite) TestMemJsonArrayagg(c *C) { } for _, test := range tests { - s.testAggMemFunc(c, test) + testAggMemFunc(t, test) } } diff --git a/executor/aggfuncs/func_json_objectagg_test.go b/executor/aggfuncs/func_json_objectagg_test.go index f6d60d0057b14..fd8897773099a 100644 --- a/executor/aggfuncs/func_json_objectagg_test.go +++ b/executor/aggfuncs/func_json_objectagg_test.go @@ -15,15 +15,17 @@ package aggfuncs_test import ( - . "github.com/pingcap/check" + "testing" + "github.com/pingcap/tidb/executor/aggfuncs" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" + "github.com/pingcap/tidb/util/mock" ) -func (s *testSuite) TestMergePartialResult4JsonObjectagg(c *C) { +func TestMergePartialResult4JsonObjectagg(t *testing.T) { typeList := []byte{mysql.TypeLonglong, mysql.TypeDouble, mysql.TypeString, mysql.TypeJSON} var argCombines [][]byte for i := 0; i < len(typeList); i++ { @@ -63,12 +65,13 @@ func (s *testSuite) TestMergePartialResult4JsonObjectagg(c *C) { tests = append(tests, aggTest) } + ctx := mock.NewContext() for _, test := range tests { - s.testMultiArgsMergePartialResult(c, test) + testMultiArgsMergePartialResult(t, ctx, test) } } -func (s *testSuite) TestJsonObjectagg(c *C) { +func TestJsonObjectagg(t *testing.T) { typeList := []byte{mysql.TypeLonglong, mysql.TypeDouble, mysql.TypeString, mysql.TypeJSON} var argCombines [][]byte for i := 0; i < len(typeList); i++ { @@ -100,12 +103,13 @@ func (s *testSuite) TestJsonObjectagg(c *C) { tests = append(tests, aggTest) } + ctx := mock.NewContext() for _, test := range tests { - s.testMultiArgsAggFunc(c, test) + testMultiArgsAggFunc(t, ctx, test) } } -func (s *testSuite) TestMemJsonObjectagg(c *C) { +func TestMemJsonObjectagg(t *testing.T) { typeList := []byte{mysql.TypeLonglong, mysql.TypeDouble, mysql.TypeString, mysql.TypeJSON, mysql.TypeDuration, mysql.TypeNewDecimal, mysql.TypeDate} var argCombines [][]byte for i := 0; i < len(typeList); i++ { @@ -146,7 +150,7 @@ func (s *testSuite) TestMemJsonObjectagg(c *C) { buildMultiArgsAggMemTester(ast.AggFuncJsonObjectAgg, argTypes, mysql.TypeJSON, numRows, aggfuncs.DefPartialResult4JsonObjectAgg+aggfuncs.DefMapStringInterfaceBucketSize, defaultMultiArgsMemDeltaGens, false), } for _, test := range tests { - s.testMultiArgsAggMemFunc(c, test) + testMultiArgsAggMemFunc(t, test) } } } diff --git a/executor/aggfuncs/func_lead_lag_test.go b/executor/aggfuncs/func_lead_lag_test.go index 942b61ec131d9..279f1360eca74 100644 --- a/executor/aggfuncs/func_lead_lag_test.go +++ b/executor/aggfuncs/func_lead_lag_test.go @@ -25,8 +25,6 @@ import ( ) func TestLeadLag(t *testing.T) { - t.Parallel() - zero := expression.NewZero() one := expression.NewOne() two := &expression.Constant{ @@ -120,8 +118,6 @@ func TestLeadLag(t *testing.T) { } func TestMemLeadLag(t *testing.T) { - t.Parallel() - zero := expression.NewZero() one := expression.NewOne() two := &expression.Constant{ diff --git a/executor/aggfuncs/func_max_min.go b/executor/aggfuncs/func_max_min.go index dd3e8e47d4102..504c179516b91 100644 --- a/executor/aggfuncs/func_max_min.go +++ b/executor/aggfuncs/func_max_min.go @@ -18,6 +18,7 @@ import ( "unsafe" "github.com/pingcap/errors" + "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" @@ -812,7 +813,14 @@ func (e *maxMin4Decimal) AppendFinalResult2Chunk(sctx sessionctx.Context, pr Par chk.AppendNull(e.ordinal) return nil } - err := p.val.Round(&p.val, e.frac, types.ModeHalfEven) + if e.retTp == nil { + return errors.New("e.retTp of max or min should not be nil") + } + frac := e.retTp.Decimal + if frac == -1 { + frac = mysql.MaxDecimalScale + } + err := p.val.Round(&p.val, frac, types.ModeHalfEven) if err != nil { return err } diff --git a/executor/aggfuncs/func_max_min_test.go b/executor/aggfuncs/func_max_min_test.go index b33c72de903cd..fea0e78d5f5ef 100644 --- a/executor/aggfuncs/func_max_min_test.go +++ b/executor/aggfuncs/func_max_min_test.go @@ -95,8 +95,6 @@ func minUpdateMemDeltaGens(srcChk *chunk.Chunk, dataType *types.FieldType) (memD } func TestMergePartialResult4MaxMin(t *testing.T) { - t.Parallel() - elems := []string{"e", "d", "c", "b", "a"} enumA, _ := types.ParseEnum(elems, "a", mysql.DefaultCollationName) enumC, _ := types.ParseEnum(elems, "c", mysql.DefaultCollationName) @@ -135,15 +133,12 @@ func TestMergePartialResult4MaxMin(t *testing.T) { for _, test := range tests { test := test t.Run(test.funcName, func(t *testing.T) { - t.Parallel() testMergePartialResult(t, test) }) } } func TestMaxMin(t *testing.T) { - t.Parallel() - unsignedType := types.NewFieldType(mysql.TypeLonglong) unsignedType.Flag |= mysql.UnsignedFlag tests := []aggTest{ @@ -170,15 +165,12 @@ func TestMaxMin(t *testing.T) { for _, test := range tests { test := test t.Run(test.funcName, func(t *testing.T) { - t.Parallel() testAggFunc(t, test) }) } } func TestMemMaxMin(t *testing.T) { - t.Parallel() - tests := []aggMemTest{ buildAggMemTester(ast.AggFuncMax, mysql.TypeLonglong, 5, aggfuncs.DefPartialResult4MaxMinIntSize, defaultUpdateMemDeltaGens, false), @@ -229,7 +221,6 @@ func TestMemMaxMin(t *testing.T) { for _, test := range tests { test := test t.Run(test.aggTest.funcName, func(t *testing.T) { - t.Parallel() testAggMemFunc(t, test) }) } @@ -268,8 +259,6 @@ func testMaxSlidingWindow(tk *testkit.TestKit, tc maxSlidingWindowTestCase) { } func TestMaxSlidingWindow(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() tk := testkit.NewTestKit(t, store) @@ -348,8 +337,6 @@ func TestMaxSlidingWindow(t *testing.T) { } func TestDequeReset(t *testing.T) { - t.Parallel() - deque := aggfuncs.NewDeque(true, func(i, j interface{}) int { return types.CompareInt64(i.(int64), j.(int64)) }) @@ -360,8 +347,6 @@ func TestDequeReset(t *testing.T) { } func TestDequePushPop(t *testing.T) { - t.Parallel() - deque := aggfuncs.NewDeque(true, func(i, j interface{}) int { return types.CompareInt64(i.(int64), j.(int64)) }) diff --git a/executor/aggfuncs/func_ntile_test.go b/executor/aggfuncs/func_ntile_test.go index 723a3c44f7da3..5ec251d3a6bac 100644 --- a/executor/aggfuncs/func_ntile_test.go +++ b/executor/aggfuncs/func_ntile_test.go @@ -23,8 +23,6 @@ import ( ) func TestMemNtile(t *testing.T) { - t.Parallel() - tests := []windowMemTest{ buildWindowMemTester(ast.WindowFuncNtile, mysql.TypeLonglong, 1, 1, 1, aggfuncs.DefPartialResult4Ntile, defaultUpdateMemDeltaGens), diff --git a/executor/aggfuncs/func_percent_rank_test.go b/executor/aggfuncs/func_percent_rank_test.go index 528d726cfe728..25d8bbef73712 100644 --- a/executor/aggfuncs/func_percent_rank_test.go +++ b/executor/aggfuncs/func_percent_rank_test.go @@ -23,8 +23,6 @@ import ( ) func TestMemPercentRank(t *testing.T) { - t.Parallel() - tests := []windowMemTest{ buildWindowMemTester(ast.WindowFuncPercentRank, mysql.TypeLonglong, 0, 1, 1, aggfuncs.DefPartialResult4RankSize, rowMemDeltaGens), diff --git a/executor/aggfuncs/func_percentile_test.go b/executor/aggfuncs/func_percentile_test.go index a114ad1545f9b..dff7c4b6dfaf0 100644 --- a/executor/aggfuncs/func_percentile_test.go +++ b/executor/aggfuncs/func_percentile_test.go @@ -33,8 +33,6 @@ func (a testSlice) Swap(i, j int) { a[i], a[j] = a[j], a[i] } func (a testSlice) Less(i, j int) bool { return a[i] < a[j] } func TestPercentile(t *testing.T) { - t.Parallel() - tests := []aggTest{ buildAggTester(ast.AggFuncApproxPercentile, mysql.TypeLonglong, 5, nil, 2), buildAggTester(ast.AggFuncApproxPercentile, mysql.TypeFloat, 5, nil, 2.0), diff --git a/executor/aggfuncs/func_rank_test.go b/executor/aggfuncs/func_rank_test.go index db1c9ae140367..050069a0d31bc 100644 --- a/executor/aggfuncs/func_rank_test.go +++ b/executor/aggfuncs/func_rank_test.go @@ -23,8 +23,6 @@ import ( ) func TestMemRank(t *testing.T) { - t.Parallel() - tests := []windowMemTest{ buildWindowMemTester(ast.WindowFuncRank, mysql.TypeLonglong, 0, 1, 1, aggfuncs.DefPartialResult4RankSize, rowMemDeltaGens), diff --git a/executor/aggfuncs/func_stddevpop_test.go b/executor/aggfuncs/func_stddevpop_test.go index c3f2d688e9a0f..e9b08422a0a39 100644 --- a/executor/aggfuncs/func_stddevpop_test.go +++ b/executor/aggfuncs/func_stddevpop_test.go @@ -15,25 +15,26 @@ package aggfuncs_test import ( - . "github.com/pingcap/check" + "testing" + "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/mysql" ) -func (s *testSuite) TestMergePartialResult4Stddevpop(c *C) { +func TestMergePartialResult4Stddevpop(t *testing.T) { tests := []aggTest{ buildAggTester(ast.AggFuncStddevPop, mysql.TypeDouble, 5, 1.4142135623730951, 0.816496580927726, 1.3169567191065923), } for _, test := range tests { - s.testMergePartialResult(c, test) + testMergePartialResult(t, test) } } -func (s *testSuite) TestStddevpop(c *C) { +func TestStddevpop(t *testing.T) { tests := []aggTest{ buildAggTester(ast.AggFuncStddevPop, mysql.TypeDouble, 5, nil, 1.4142135623730951), } for _, test := range tests { - s.testAggFunc(c, test) + testAggFunc(t, test) } } diff --git a/executor/aggfuncs/func_stddevsamp_test.go b/executor/aggfuncs/func_stddevsamp_test.go index e8a45f688ab64..d896fa640b5b5 100644 --- a/executor/aggfuncs/func_stddevsamp_test.go +++ b/executor/aggfuncs/func_stddevsamp_test.go @@ -15,25 +15,26 @@ package aggfuncs_test import ( - . "github.com/pingcap/check" + "testing" + "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/mysql" ) -func (s *testSuite) TestMergePartialResult4Stddevsamp(c *C) { +func TestMergePartialResult4Stddevsamp(t *testing.T) { tests := []aggTest{ buildAggTester(ast.AggFuncStddevSamp, mysql.TypeDouble, 5, 1.5811388300841898, 1, 1.407885953173359), } for _, test := range tests { - s.testMergePartialResult(c, test) + testMergePartialResult(t, test) } } -func (s *testSuite) TestStddevsamp(c *C) { +func TestStddevsamp(t *testing.T) { tests := []aggTest{ buildAggTester(ast.AggFuncStddevSamp, mysql.TypeDouble, 5, nil, 1.5811388300841898), } for _, test := range tests { - s.testAggFunc(c, test) + testAggFunc(t, test) } } diff --git a/executor/aggfuncs/func_sum.go b/executor/aggfuncs/func_sum.go index 35b4adbc30164..1d0bf624172cb 100644 --- a/executor/aggfuncs/func_sum.go +++ b/executor/aggfuncs/func_sum.go @@ -17,6 +17,8 @@ package aggfuncs import ( "unsafe" + "github.com/pingcap/errors" + "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" @@ -169,7 +171,14 @@ func (e *sum4Decimal) AppendFinalResult2Chunk(sctx sessionctx.Context, pr Partia chk.AppendNull(e.ordinal) return nil } - err := p.val.Round(&p.val, e.frac, types.ModeHalfEven) + if e.retTp == nil { + return errors.New("e.retTp of sum should not be nil") + } + frac := e.retTp.Decimal + if frac == -1 { + frac = mysql.MaxDecimalScale + } + err := p.val.Round(&p.val, frac, types.ModeHalfEven) if err != nil { return err } diff --git a/executor/aggfuncs/func_sum_test.go b/executor/aggfuncs/func_sum_test.go index b4a744002754b..15e1ebc984524 100644 --- a/executor/aggfuncs/func_sum_test.go +++ b/executor/aggfuncs/func_sum_test.go @@ -26,8 +26,6 @@ import ( ) func TestMergePartialResult4Sum(t *testing.T) { - t.Parallel() - tests := []aggTest{ buildAggTester(ast.AggFuncSum, mysql.TypeNewDecimal, 5, types.NewDecFromInt(10), types.NewDecFromInt(9), types.NewDecFromInt(19)), buildAggTester(ast.AggFuncSum, mysql.TypeDouble, 5, 10.0, 9.0, 19.0), @@ -41,8 +39,6 @@ func TestMergePartialResult4Sum(t *testing.T) { } func TestSum(t *testing.T) { - t.Parallel() - tests := []aggTest{ buildAggTester(ast.AggFuncSum, mysql.TypeNewDecimal, 5, nil, types.NewDecFromInt(10)), buildAggTester(ast.AggFuncSum, mysql.TypeDouble, 5, nil, 10.0), @@ -55,8 +51,6 @@ func TestSum(t *testing.T) { } func TestMemSum(t *testing.T) { - t.Parallel() - tests := []aggMemTest{ buildAggMemTester(ast.AggFuncSum, mysql.TypeDouble, 5, aggfuncs.DefPartialResult4SumFloat64Size, defaultUpdateMemDeltaGens, false), diff --git a/executor/aggfuncs/func_value_test.go b/executor/aggfuncs/func_value_test.go index cde0a3ecb90ab..b1e322821af9e 100644 --- a/executor/aggfuncs/func_value_test.go +++ b/executor/aggfuncs/func_value_test.go @@ -61,8 +61,6 @@ func nthValueEvaluateRowUpdateMemDeltaGens(nth int) updateMemDeltaGens { } func TestMemValue(t *testing.T) { - t.Parallel() - firstMemDeltaGens := nthValueEvaluateRowUpdateMemDeltaGens(1) secondMemDeltaGens := nthValueEvaluateRowUpdateMemDeltaGens(2) fifthMemDeltaGens := nthValueEvaluateRowUpdateMemDeltaGens(5) diff --git a/executor/aggfuncs/func_varpop_test.go b/executor/aggfuncs/func_varpop_test.go index a8c59060bf009..40cedacda63eb 100644 --- a/executor/aggfuncs/func_varpop_test.go +++ b/executor/aggfuncs/func_varpop_test.go @@ -26,8 +26,6 @@ import ( ) func TestMergePartialResult4Varpop(t *testing.T) { - t.Parallel() - tests := []aggTest{ buildAggTester(ast.AggFuncVarPop, mysql.TypeDouble, 5, types.NewFloat64Datum(float64(2)), types.NewFloat64Datum(float64(2)/float64(3)), types.NewFloat64Datum(float64(59)/float64(8)-float64(19*19)/float64(8*8))), } @@ -37,8 +35,6 @@ func TestMergePartialResult4Varpop(t *testing.T) { } func TestVarpop(t *testing.T) { - t.Parallel() - tests := []aggTest{ buildAggTester(ast.AggFuncVarPop, mysql.TypeDouble, 5, nil, types.NewFloat64Datum(float64(2))), } @@ -48,8 +44,6 @@ func TestVarpop(t *testing.T) { } func TestMemVarpop(t *testing.T) { - t.Parallel() - tests := []aggMemTest{ buildAggMemTester(ast.AggFuncVarPop, mysql.TypeDouble, 5, aggfuncs.DefPartialResult4VarPopFloat64Size, defaultUpdateMemDeltaGens, false), @@ -59,7 +53,6 @@ func TestMemVarpop(t *testing.T) { for n, test := range tests { test := test t.Run(fmt.Sprintf("%s_%d", test.aggTest.funcName, n), func(t *testing.T) { - t.Parallel() testAggMemFunc(t, test) }) } diff --git a/executor/aggfuncs/func_varsamp_test.go b/executor/aggfuncs/func_varsamp_test.go index c2cba624336e2..32396b654f540 100644 --- a/executor/aggfuncs/func_varsamp_test.go +++ b/executor/aggfuncs/func_varsamp_test.go @@ -15,25 +15,26 @@ package aggfuncs_test import ( - . "github.com/pingcap/check" + "testing" + "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/mysql" ) -func (s *testSuite) TestMergePartialResult4Varsamp(c *C) { +func TestMergePartialResult4Varsamp(t *testing.T) { tests := []aggTest{ buildAggTester(ast.AggFuncVarSamp, mysql.TypeDouble, 5, 2.5, 1, 1.9821428571428572), } for _, test := range tests { - s.testMergePartialResult(c, test) + testMergePartialResult(t, test) } } -func (s *testSuite) TestVarsamp(c *C) { +func TestVarsamp(t *testing.T) { tests := []aggTest{ buildAggTester(ast.AggFuncVarSamp, mysql.TypeDouble, 5, nil, 2.5), } for _, test := range tests { - s.testAggFunc(c, test) + testAggFunc(t, test) } } diff --git a/executor/aggfuncs/main_test.go b/executor/aggfuncs/main_test.go new file mode 100644 index 0000000000000..f46a63bba4d9a --- /dev/null +++ b/executor/aggfuncs/main_test.go @@ -0,0 +1,31 @@ +// Copyright 2021 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, +// 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. + +package aggfuncs + +import ( + "testing" + + "github.com/pingcap/tidb/util/testbridge" + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + testbridge.WorkaroundGoCheckFlags() + opts := []goleak.Option{ + goleak.IgnoreTopFunction("go.etcd.io/etcd/pkg/logutil.(*MergeLogger).outputLoop"), + goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + } + goleak.VerifyTestMain(m, opts...) +} diff --git a/executor/aggfuncs/row_number_test.go b/executor/aggfuncs/row_number_test.go index c944fb4f56177..361096daf00de 100644 --- a/executor/aggfuncs/row_number_test.go +++ b/executor/aggfuncs/row_number_test.go @@ -23,8 +23,6 @@ import ( ) func TestMemRowNumber(t *testing.T) { - t.Parallel() - tests := []windowMemTest{ buildWindowMemTester(ast.WindowFuncRowNumber, mysql.TypeLonglong, 0, 0, 4, aggfuncs.DefPartialResult4RowNumberSize, defaultUpdateMemDeltaGens), diff --git a/executor/aggfuncs/window_func_test.go b/executor/aggfuncs/window_func_test.go index 5468ed2c779b7..f1854a890c12e 100644 --- a/executor/aggfuncs/window_func_test.go +++ b/executor/aggfuncs/window_func_test.go @@ -18,17 +18,16 @@ import ( "testing" "time" - "github.com/pingcap/tidb/parser/ast" - "github.com/pingcap/tidb/parser/mysql" - "github.com/pingcap/tidb/executor/aggfuncs" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/expression/aggregation" + "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/mock" - "github.com/stretchr/testify/require" ) @@ -78,7 +77,7 @@ func testWindowFunc(t *testing.T, p windowTest) { err = finalFunc.AppendFinalResult2Chunk(ctx, finalPr, resultChk) require.NoError(t, err) dt := resultChk.GetRow(0).GetDatum(0, desc.RetTp) - result, err := dt.CompareDatum(ctx.GetSessionVars().StmtCtx, &p.results[i]) + result, err := dt.Compare(ctx.GetSessionVars().StmtCtx, &p.results[i], collate.GetCollator(desc.RetTp.Collate)) require.NoError(t, err) require.Equal(t, 0, result) resultChk.Reset() @@ -172,8 +171,6 @@ func buildWindowMemTesterWithArgs(funcName string, tp byte, args []expression.Ex } func TestWindowFunctions(t *testing.T) { - t.Parallel() - tests := []windowTest{ buildWindowTester(ast.WindowFuncCumeDist, mysql.TypeLonglong, 0, 1, 1, 1), buildWindowTester(ast.WindowFuncCumeDist, mysql.TypeLonglong, 0, 0, 2, 1, 1), diff --git a/executor/aggregate_test.go b/executor/aggregate_test.go index b3ed40178f65b..a99d7e71a69f4 100644 --- a/executor/aggregate_test.go +++ b/executor/aggregate_test.go @@ -22,6 +22,7 @@ import ( "sort" "strconv" "strings" + "testing" "time" . "github.com/pingcap/check" @@ -32,30 +33,16 @@ import ( plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/testkit/testdata" "github.com/pingcap/tidb/util/sqlexec" - "github.com/pingcap/tidb/util/testkit" - "github.com/pingcap/tidb/util/testutil" + "github.com/stretchr/testify/require" ) -type testSuiteAgg struct { - *baseTestSuite - testData testutil.TestData -} - -func (s *testSuiteAgg) SetUpSuite(c *C) { - s.baseTestSuite.SetUpSuite(c) - var err error - s.testData, err = testutil.LoadTestSuiteData("testdata", "agg_suite") - c.Assert(err, IsNil) -} - -func (s *testSuiteAgg) TearDownSuite(c *C) { - s.baseTestSuite.TearDownSuite(c) - c.Assert(s.testData.GenerateOutputIfNeeded(), IsNil) -} - -func (s *testSuiteAgg) TestAggregation(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestAggregation(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("set @@tidb_hash_join_concurrency=1") tk.MustExec("use test") tk.MustExec("set sql_mode='STRICT_TRANS_TABLES'") // disable only-full-group-by @@ -107,7 +94,7 @@ func (s *testSuiteAgg) TestAggregation(c *C) { result = tk.MustQuery("select approx_count_distinct(c,d) from t") result.Check(testkit.Rows("5")) err := tk.ExecToErr("select count(c,d) from t") - c.Assert(err, NotNil) + require.Error(t, err) result = tk.MustQuery("select d*2 as ee, sum(c) from t group by ee order by ee") result.Check(testkit.Rows("2 2", "4 4", "6 5")) result = tk.MustQuery("select sum(distinct c) as a from t group by d order by a") @@ -208,9 +195,9 @@ func (s *testSuiteAgg) TestAggregation(c *C) { result = tk.MustQuery("select c as d, c as d from t group by d order by d") result.Check(testkit.Rows("1 1", "1 1", "1 1")) err = tk.ExecToErr("select d as d, c as d from t group by d") - c.Assert(err, NotNil) + require.Error(t, err) err = tk.ExecToErr("select t.d, c as d from t group by d") - c.Assert(err, NotNil) + require.Error(t, err) result = tk.MustQuery("select *, c+1 as d from t group by 3 order by d") result.Check(testkit.Rows("1 -1 2")) tk.MustExec("drop table if exists t1") @@ -421,7 +408,7 @@ func (s *testSuiteAgg) TestAggregation(c *C) { _, err = tk.Exec("select std_samp(a) from t") // TODO: Fix this error message. - c.Assert(errors.Cause(err).Error(), Equals, "[expression:1305]FUNCTION test.std_samp does not exist") + require.EqualError(t, errors.Cause(err), "[expression:1305]FUNCTION test.std_samp does not exist") // For issue #14072: wrong result when using generated column with aggregate statement tk.MustExec("drop table if exists t1;") @@ -492,8 +479,10 @@ func (s *testSuiteAgg) TestAggregation(c *C) { tk.MustQuery("select stddev_pop(distinct id) from t1;").Check(testkit.Rows("0.5")) } -func (s *testSuiteAgg) TestAggPrune(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestAggPrune(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t(id int primary key, b varchar(50), c int)") @@ -517,10 +506,12 @@ func (s *testSuiteAgg) TestAggPrune(c *C) { tk.MustQuery("SELECT a, MIN(b), MAX(b) FROM t GROUP BY a").Check(testkit.Rows("1 11 11", "3 <nil> <nil>")) } -func (s *testSuiteAgg) TestGroupConcatAggr(c *C) { +func TestGroupConcatAggr(t *testing.T) { var err error // issue #5411 - tk := testkit.NewTestKit(c, s.store) + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists test;") tk.MustExec("create table test(id int, name int)") @@ -570,21 +561,21 @@ func (s *testSuiteAgg) TestGroupConcatAggr(c *C) { tk.MustExec(fmt.Sprintf("set session group_concat_max_len=%v", maxLen)) result = tk.MustQuery("select group_concat(id ORDER BY name desc, id asc SEPARATOR '--') from test;") result.Check(testkit.Rows(expected[:maxLen])) - c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 1) + require.Len(t, tk.Session().GetSessionVars().StmtCtx.GetWarnings(), 1) } expected = "1--2--1--1--3--3" for maxLen := 4; maxLen < len(expected); maxLen++ { tk.MustExec(fmt.Sprintf("set session group_concat_max_len=%v", maxLen)) result = tk.MustQuery("select group_concat(id ORDER BY name asc, id desc SEPARATOR '--') from test;") result.Check(testkit.Rows(expected[:maxLen])) - c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 1) + require.Len(t, tk.Session().GetSessionVars().StmtCtx.GetWarnings(), 1) } expected = "500,200,30,20,10" for maxLen := 4; maxLen < len(expected); maxLen++ { tk.MustExec(fmt.Sprintf("set session group_concat_max_len=%v", maxLen)) result = tk.MustQuery("select group_concat(distinct name order by name desc) from test;") result.Check(testkit.Rows(expected[:maxLen])) - c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 1) + require.Len(t, tk.Session().GetSessionVars().StmtCtx.GetWarnings(), 1) } tk.MustExec(fmt.Sprintf("set session group_concat_max_len=%v", 1024)) @@ -606,8 +597,7 @@ func (s *testSuiteAgg) TestGroupConcatAggr(c *C) { tk.MustQuery("select 1, 2, 3, 4, 5 , group_concat(name, id ORDER BY 1 desc, id SEPARATOR '++') from test;").Check(testkit.Rows("1 2 3 4 5 5003++2003++301++201++202++101")) tk.MustQuery("select 1, 2, 3, 4, 5 , group_concat(name, id ORDER BY 2 desc, name SEPARATOR '++') from test;").Check(testkit.Rows("1 2 3 4 5 2003++5003++202++101++201++301")) err = tk.ExecToErr("select 1, 2, 3, 4, 5 , group_concat(name, id ORDER BY 3 desc, name SEPARATOR '++') from test;") - c.Assert(err.Error(), Equals, "[planner:1054]Unknown column '3' in 'order clause'") - + require.EqualError(t, err, "[planner:1054]Unknown column '3' in 'order clause'") // test Param Marker tk.MustExec(`prepare s1 from "select 1, 2, 3, 4, 5 , group_concat(name, id ORDER BY floor(id/?) desc, name SEPARATOR '++') from test";`) tk.MustExec("set @a=2;") @@ -618,7 +608,7 @@ func (s *testSuiteAgg) TestGroupConcatAggr(c *C) { tk.MustQuery("execute s1 using @a;").Check(testkit.Rows("1 2 3 4 5 2003++5003++202++101++201++301")) tk.MustExec("set @a=3;") err = tk.ExecToErr("execute s1 using @a;") - c.Assert(err.Error(), Equals, "[planner:1054]Unknown column '?' in 'order clause'") + require.EqualError(t, err, "[planner:1054]Unknown column '?' in 'order clause'") tk.MustExec("set @a=3.0;") tk.MustQuery("execute s1 using @a;").Check(testkit.Rows("1 2 3 4 5 101++202++201++301++2003++5003")) @@ -662,10 +652,12 @@ func (s *testSuiteAgg) TestGroupConcatAggr(c *C) { rows.Check(testkit.Rows("01234567", "12345")) } -func (s *testSuiteAgg) TestSelectDistinct(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestSelectDistinct(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") - s.fillData(tk, "select_distinct_test") + fillData(tk, "select_distinct_test") tk.MustExec("begin") r := tk.MustQuery("select distinct name from select_distinct_test;") @@ -674,8 +666,10 @@ func (s *testSuiteAgg) TestSelectDistinct(c *C) { } -func (s *testSuiteAgg) TestAggPushDown(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestAggPushDown(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t (a int, b int, c int)") @@ -702,8 +696,10 @@ func (s *testSuiteAgg) TestAggPushDown(c *C) { tk.MustQuery("select a, count(b) from (select * from t union all select * from tt) k group by a order by a").Check(testkit.Rows("1 2", "2 1")) } -func (s *testSuiteAgg) TestOnlyFullGroupBy(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestOnlyFullGroupBy(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("set sql_mode = 'ONLY_FULL_GROUP_BY'") tk.MustExec("drop table if exists t") @@ -716,39 +712,39 @@ func (s *testSuiteAgg) TestOnlyFullGroupBy(c *C) { tk.MustQuery("select max(a), any_value(c) from t group by d;") // test incompatible with sql_mode = ONLY_FULL_GROUP_BY err := tk.ExecToErr("select * from t group by d") - c.Assert(terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), IsTrue, Commentf("err %v", err)) + require.Truef(t, terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), "err %v", err) err = tk.ExecToErr("select b-c from t group by b+c") - c.Assert(terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), IsTrue, Commentf("err %v", err)) + require.Truef(t, terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), "err %v", err) err = tk.ExecToErr("select (b-c)*(b+c), min(a) from t group by b+c, b-c") - c.Assert(terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), IsTrue, Commentf("err %v", err)) + require.Truef(t, terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), "err %v", err) err = tk.ExecToErr("select b between c and d from t group by b,c") - c.Assert(terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), IsTrue, Commentf("err %v", err)) + require.Truef(t, terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), "err %v", err) err = tk.ExecToErr("select case b when 1 then c when 2 then d else d end from t group by b,c") - c.Assert(terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), IsTrue, Commentf("err %v", err)) + require.Truef(t, terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), "err %v", err) err = tk.ExecToErr("select c > (select b from t) from t group by b") - c.Assert(terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), IsTrue, Commentf("err %v", err)) + require.Truef(t, terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), "err %v", err) err = tk.ExecToErr("select c is null from t group by b") - c.Assert(terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), IsTrue, Commentf("err %v", err)) + require.Truef(t, terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), "err %v", err) err = tk.ExecToErr("select c is true from t group by b") - c.Assert(terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), IsTrue, Commentf("err %v", err)) + require.Truef(t, terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), "err %v", err) err = tk.ExecToErr("select (c+b)*d from t group by c,d") - c.Assert(terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), IsTrue, Commentf("err %v", err)) + require.Truef(t, terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), "err %v", err) err = tk.ExecToErr("select b in (c,d) from t group by b,c") - c.Assert(terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), IsTrue, Commentf("err %v", err)) + require.Truef(t, terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), "err %v", err) err = tk.ExecToErr("select b like '%a' from t group by c") - c.Assert(terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), IsTrue, Commentf("err %v", err)) + require.Truef(t, terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), "err %v", err) err = tk.ExecToErr("select c REGEXP '1.*' from t group by b") - c.Assert(terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), IsTrue, Commentf("err %v", err)) + require.Truef(t, terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), "err %v", err) err = tk.ExecToErr("select -b from t group by c") - c.Assert(terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), IsTrue, Commentf("err %v", err)) + require.Truef(t, terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), "err %v", err) err = tk.ExecToErr("select a, max(b) from t") - c.Assert(terror.ErrorEqual(err, plannercore.ErrMixOfGroupFuncAndFields), IsTrue, Commentf("err %v", err)) + require.Truef(t, terror.ErrorEqual(err, plannercore.ErrMixOfGroupFuncAndFields), "err %v", err) err = tk.ExecToErr("select sum(a)+b from t") - c.Assert(terror.ErrorEqual(err, plannercore.ErrMixOfGroupFuncAndFields), IsTrue, Commentf("err %v", err)) + require.Truef(t, terror.ErrorEqual(err, plannercore.ErrMixOfGroupFuncAndFields), "err %v", err) err = tk.ExecToErr("select count(b), c from t") - c.Assert(terror.ErrorEqual(err, plannercore.ErrMixOfGroupFuncAndFields), IsTrue, Commentf("err %v", err)) + require.Truef(t, terror.ErrorEqual(err, plannercore.ErrMixOfGroupFuncAndFields), "err %v", err) err = tk.ExecToErr("select distinct a, b, count(a) from t") - c.Assert(terror.ErrorEqual(err, plannercore.ErrMixOfGroupFuncAndFields), IsTrue, Commentf("err %v", err)) + require.Truef(t, terror.ErrorEqual(err, plannercore.ErrMixOfGroupFuncAndFields), "err %v", err) // test compatible with sql_mode = ONLY_FULL_GROUP_BY tk.MustQuery("select a from t group by a,b,c") tk.MustQuery("select b from t group by b") @@ -777,7 +773,7 @@ func (s *testSuiteAgg) TestOnlyFullGroupBy(c *C) { tk.MustQuery("select * from t group by b,d") // test functional depend on a unique null column err = tk.ExecToErr("select * from t group by b,c") - c.Assert(terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), IsTrue, Commentf("err %v", err)) + require.Truef(t, terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), "err %v", err) // test functional dependency derived from keys in where condition tk.MustQuery("select * from t where c = d group by b, c") tk.MustQuery("select t.*, x.* from t, x where t.a = x.a group by t.a") @@ -785,7 +781,7 @@ func (s *testSuiteAgg) TestOnlyFullGroupBy(c *C) { tk.MustQuery("select t.*, x.* from t, x where t.b = x.a group by t.b, t.d") tk.MustQuery("select t.b, x.* from t, x where t.b = x.a group by t.b") err = tk.ExecToErr("select t.*, x.* from t, x where t.c = x.a group by t.b, t.c") - c.Assert(terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), IsTrue, Commentf("err %v", err)) + require.Truef(t, terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), "err %v", err) // test functional dependency derived from keys in join tk.MustQuery("select t.*, x.* from t inner join x on t.a = x.a group by t.a") tk.MustQuery("select t.*, x.* from t inner join x on (t.b = x.b and t.d = x.d) group by t.b, x.d") @@ -795,9 +791,9 @@ func (s *testSuiteAgg) TestOnlyFullGroupBy(c *C) { tk.MustQuery("select x.b, t.* from t right join x on x.b = t.b group by x.b, t.d") tk.MustQuery("select x.b, t.* from t right join x on t.b = x.b group by x.b, t.d") err = tk.ExecToErr("select t.b, x.* from t right join x on t.b = x.b group by t.b, x.d") - c.Assert(terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), IsTrue, Commentf("err %v", err)) + require.Truef(t, terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), "err %v", err) err = tk.ExecToErr("select t.b, x.* from t right join x on t.b = x.b group by t.b, x.d") - c.Assert(terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), IsTrue, Commentf("err %v", err)) + require.Truef(t, terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), "err %v", err) // FixMe: test functional dependency of derived table // tk.MustQuery("select * from (select * from t) as e group by a") @@ -808,14 +804,16 @@ func (s *testSuiteAgg) TestOnlyFullGroupBy(c *C) { // test order by tk.MustQuery("select c from t group by c,d order by d") err = tk.ExecToErr("select c from t group by c order by d") - c.Assert(terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), IsTrue, Commentf("err %v", err)) + require.Truef(t, terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), "err %v", err) // test ambiguous column err = tk.ExecToErr("select c from t,x group by t.c") - c.Assert(terror.ErrorEqual(err, plannercore.ErrAmbiguous), IsTrue, Commentf("err %v", err)) + require.Truef(t, terror.ErrorEqual(err, plannercore.ErrAmbiguous), "err %v", err) } -func (s *testSuiteAgg) TestIssue16279(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue16279(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("set sql_mode = 'ONLY_FULL_GROUP_BY'") tk.MustExec("drop table if exists s") @@ -825,8 +823,10 @@ func (s *testSuiteAgg) TestIssue16279(c *C) { tk.MustQuery("select count(a) , date_format(a, '%Y-%m-%d') as xx from s group by xx") } -func (s *testSuiteAgg) TestIssue24676(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue24676(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("set sql_mode = 'ONLY_FULL_GROUP_BY'") tk.MustExec("drop table if exists t1") @@ -837,11 +837,13 @@ func (s *testSuiteAgg) TestIssue24676(c *C) { tk.MustQuery("SELECT c1 FROM t1 GROUP BY c1 ORDER BY c1 ASC;") tk.MustQuery("SELECT ((floor(((`c1` - 0.0) / 50000)) * 50000) + 0.0) AS `c1` FROM `t1` GROUP BY ((floor(((`c1` - 0.0) / 50000)) * 50000) + 0.0) ORDER BY ((floor(((`c1` - 0.0) / 50000)) * 50000) + 0.0) ASC;") err := tk.ExecToErr("SELECT ((floor(((`c1` - 10) / 300)) * 50000) + 0.0) AS `c1` FROM `t1` GROUP BY ((floor(((`c1` - 0.0) / 50000)) * 50000) + 0.0) ORDER BY ((floor(((`c1` - 0.0) / 50000)) * 50000) + 0.0) ASC;") - c.Assert(terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), IsTrue, Commentf("err %v", err)) + require.Truef(t, terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), "err %v", err) } -func (s *testSuiteAgg) TestAggPushDownPartitionTable(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestAggPushDownPartitionTable(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t1") tk.MustExec(`CREATE TABLE t1 ( @@ -872,8 +874,10 @@ func (s *testSuiteAgg) TestAggPushDownPartitionTable(c *C) { "99 102")) } -func (s *testSuiteAgg) TestIssue13652(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue13652(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("set sql_mode = 'ONLY_FULL_GROUP_BY'") tk.MustExec("drop table if exists t") @@ -883,11 +887,13 @@ func (s *testSuiteAgg) TestIssue13652(c *C) { tk.MustQuery("select a from t group by +a") tk.MustQuery("select a from t group by ((+a))") _, err := tk.Exec("select a from t group by (-a)") - c.Assert(err.Error(), Equals, "[planner:1055]Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.t.a' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by") + require.EqualError(t, err, "[planner:1055]Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.t.a' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by") } -func (s *testSuiteAgg) TestIssue14947(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue14947(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("set sql_mode = 'ONLY_FULL_GROUP_BY'") tk.MustExec("drop table if exists t") @@ -895,9 +901,11 @@ func (s *testSuiteAgg) TestIssue14947(c *C) { tk.MustQuery("select ((+a+1)) as tmp from t group by tmp") } -func (s *testSuiteAgg) TestHaving(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) - +func TestHaving(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec("set sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION'") tk.MustExec("drop table if exists t") tk.MustExec("create table t (c1 int, c2 int, c3 int)") @@ -920,8 +928,11 @@ func (s *testSuiteAgg) TestHaving(c *C) { tk.MustQuery("select 1 from t group by c1 having sum(abs(c2 + c3)) = c1").Check(testkit.Rows("1")) } -func (s *testSuiteAgg) TestIssue26496(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestIssue26496(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec("drop table if exists UK_NSPRE_19416") tk.MustExec("CREATE TABLE `UK_NSPRE_19416` ( `COL1` binary(20) DEFAULT NULL, `COL2` varchar(20) DEFAULT NULL, `COL4` datetime DEFAULT NULL, `COL3` bigint(20) DEFAULT NULL, `COL5` float DEFAULT NULL, UNIQUE KEY `UK_COL1` (`COL1`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin") @@ -929,8 +940,11 @@ func (s *testSuiteAgg) TestIssue26496(c *C) { tk.MustQuery("select t1.col1, count(t2.col1) from UK_NSPRE_19416 as t1 left join UK_NSPRE_19416 as t2 on t1.col1 = t2.col1 where t1.col1 in (0x550C4A4390BA14FD6D382DD29063E10210C99381, 0x004DAD637B37CC4A9742484AB93F97EDE2AB8BD5, 0xC5B428E2EBC1B78F0B183899A8DF55C88A333F86) group by t1.col1, t2.col1 having t1.col1 in (0x9B4B48FEBA9225BACF8F9ADEAEE810AEC26DC7A2, 0x25A6C4FAD832F8E0267AAA504CFAE767565C8B84, 0xE26E5B0080EC5A8156DACE67D13B239500E540E6)").Check(nil) } -func (s *testSuiteAgg) TestAggEliminator(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestAggEliminator(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec("create table t(a int primary key, b int)") tk.MustQuery("select min(a), min(a) from t").Check(testkit.Rows("<nil> <nil>")) @@ -942,10 +956,13 @@ func (s *testSuiteAgg) TestAggEliminator(c *C) { tk.MustQuery("select group_concat(b, b) from t group by a").Sort().Check(testkit.Rows("-1-1", "-2-2", "11", "<nil>")) } -func (s *testSuiteAgg) TestClusterIndexMaxMinEliminator(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestClusterIndexMaxMinEliminator(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec("drop table if exists t;") - tk.Se.GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeOn + tk.Session().GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeOn tk.MustExec("create table t (a int, b int, c int, primary key(a, b));") for i := 0; i < 10+1; i++ { tk.MustExec("insert into t values (?, ?, ?)", i, i, i) @@ -955,8 +972,11 @@ func (s *testSuiteAgg) TestClusterIndexMaxMinEliminator(c *C) { tk.MustQuery("select min(a), max(a), min(b), max(b) from t;").Check(testkit.Rows("0 10 0 10")) } -func (s *testSuiteAgg) TestMaxMinFloatScalaFunc(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestMaxMinFloatScalaFunc(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec(`DROP TABLE IF EXISTS T;`) tk.MustExec(`CREATE TABLE T(A VARCHAR(10), B VARCHAR(10), C FLOAT);`) @@ -965,8 +985,11 @@ func (s *testSuiteAgg) TestMaxMinFloatScalaFunc(c *C) { tk.MustQuery(`SELECT MIN(CASE B WHEN 'val_b' THEN C ELSE 0 END) val_b FROM T WHERE cast(A as signed) = 0 GROUP BY a;`).Check(testkit.Rows("12.190999984741211")) } -func (s *testSuiteAgg) TestBuildProjBelowAgg(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestBuildProjBelowAgg(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec("drop table if exists t;") tk.MustExec("create table t (i int);") tk.MustExec("insert into t values (1), (1), (1),(2),(3),(2),(3),(2),(3);") @@ -977,8 +1000,11 @@ func (s *testSuiteAgg) TestBuildProjBelowAgg(c *C) { "4 3 18 7,7,7 8")) } -func (s *testSuiteAgg) TestInjectProjBelowTopN(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestInjectProjBelowTopN(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec("drop table if exists t;") tk.MustExec("create table t (i int);") tk.MustExec("insert into t values (1), (1), (1),(2),(3),(2),(3),(2),(3);") @@ -986,17 +1012,19 @@ func (s *testSuiteAgg) TestInjectProjBelowTopN(c *C) { input []string output [][]string ) - s.testData.GetTestCases(c, &input, &output) + aggMergeSuiteData.GetTestCases(t, &input, &output) for i, tt := range input { - s.testData.OnRecord(func() { - output[i] = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + testdata.OnRecord(func() { + output[i] = testdata.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) }) tk.MustQuery(tt).Check(testkit.Rows(output[i]...)) } } -func (s *testSuiteAgg) TestFirstRowEnum(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestFirstRowEnum(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec(`use test;`) tk.MustExec(`drop table if exists t;`) tk.MustExec(`create table t(a enum('a', 'b'));`) @@ -1006,8 +1034,11 @@ func (s *testSuiteAgg) TestFirstRowEnum(c *C) { )) } -func (s *testSuiteAgg) TestAggJSON(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestAggJSON(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec(`drop table if exists t;`) tk.MustExec(`create table t(a datetime, b json, index idx(a));`) tk.MustExec(`insert into t values('2019-03-20 21:50:00', '["a", "b", 1]');`) @@ -1055,8 +1086,11 @@ func (s *testSuiteAgg) TestAggJSON(c *C) { )) } -func (s *testSuiteAgg) TestIssue10099(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestIssue10099(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t(a char(10), b char(10))") tk.MustExec("insert into t values('1', '222'), ('12', '22')") @@ -1064,16 +1098,22 @@ func (s *testSuiteAgg) TestIssue10099(c *C) { tk.MustQuery("select approx_count_distinct( a, b) from t").Check(testkit.Rows("2")) } -func (s *testSuiteAgg) TestIssue10098(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestIssue10098(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec(`drop table if exists t;`) tk.MustExec("create table t(a char(10), b char(10))") tk.MustExec("insert into t values('1', '222'), ('12', '22')") tk.MustQuery("select group_concat(distinct a, b) from t").Check(testkit.Rows("1222,1222")) } -func (s *testSuiteAgg) TestIssue10608(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestIssue10608(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec(`drop table if exists t, s;`) tk.MustExec("create table t(a int)") tk.MustExec("create table s(a int, b int)") @@ -1084,9 +1124,13 @@ func (s *testSuiteAgg) TestIssue10608(c *C) { } -func (s *testSuiteAgg) TestIssue12759HashAggCalledByApply(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) - tk.Se.GetSessionVars().SetHashAggFinalConcurrency(4) +func TestIssue12759HashAggCalledByApply(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.Session().GetSessionVars().SetHashAggFinalConcurrency(4) tk.MustExec(`insert into mysql.opt_rule_blacklist value("decorrelate");`) defer func() { tk.MustExec(`delete from mysql.opt_rule_blacklist where name = "decorrelate";`) @@ -1101,17 +1145,20 @@ func (s *testSuiteAgg) TestIssue12759HashAggCalledByApply(c *C) { input []string output [][]string ) - s.testData.GetTestCases(c, &input, &output) + aggMergeSuiteData.GetTestCases(t, &input, &output) for i, tt := range input { - s.testData.OnRecord(func() { - output[i] = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + testdata.OnRecord(func() { + output[i] = testdata.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) }) tk.MustQuery(tt).Check(testkit.Rows(output[i]...)) } } -func (s *testSuiteAgg) TestPR15242ShallowCopy(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestPR15242ShallowCopy(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec(`drop table if exists t;`) tk.MustExec(`create table t(a json);`) tk.MustExec(`insert into t values ('{"id": 1,"score":23}');`) @@ -1119,21 +1166,24 @@ func (s *testSuiteAgg) TestPR15242ShallowCopy(c *C) { tk.MustExec(`insert into t values ('{"id": 1,"score":233}');`) tk.MustExec(`insert into t values ('{"id": 2,"score":233}');`) tk.MustExec(`insert into t values ('{"id": 3,"score":233}');`) - tk.Se.GetSessionVars().MaxChunkSize = 2 + tk.Session().GetSessionVars().MaxChunkSize = 2 tk.MustQuery(`select max(JSON_EXTRACT(a, '$.score')) as max_score,JSON_EXTRACT(a,'$.id') as id from t group by id order by id;`).Check(testkit.Rows("233 1", "233 2", "233 3")) } -func (s *testSuiteAgg) TestIssue15690(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) - tk.Se.GetSessionVars().MaxChunkSize = 2 +func TestIssue15690(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.Session().GetSessionVars().MaxChunkSize = 2 // check for INT type tk.MustExec(`drop table if exists t;`) tk.MustExec(`create table t(a int);`) tk.MustExec(`insert into t values(null),(null);`) tk.MustExec(`insert into t values(0),(2),(2),(4),(8);`) tk.MustQuery(`select /*+ stream_agg() */ distinct * from t;`).Check(testkit.Rows("<nil>", "0", "2", "4", "8")) - c.Assert(tk.Se.GetSessionVars().StmtCtx.WarningCount(), Equals, uint16(0)) + require.Equal(t, tk.Session().GetSessionVars().StmtCtx.WarningCount(), uint16(0)) // check for FLOAT type tk.MustExec(`drop table if exists t;`) @@ -1141,15 +1191,14 @@ func (s *testSuiteAgg) TestIssue15690(c *C) { tk.MustExec(`insert into t values(null),(null),(null),(null);`) tk.MustExec(`insert into t values(1.1),(1.1);`) tk.MustQuery(`select /*+ stream_agg() */ distinct * from t;`).Check(testkit.Rows("<nil>", "1.1")) - c.Assert(tk.Se.GetSessionVars().StmtCtx.WarningCount(), Equals, uint16(0)) - + require.Equal(t, tk.Session().GetSessionVars().StmtCtx.WarningCount(), uint16(0)) // check for DECIMAL type tk.MustExec(`drop table if exists t;`) tk.MustExec(`create table t(a decimal(5,1));`) tk.MustExec(`insert into t values(null),(null),(null);`) tk.MustExec(`insert into t values(1.1),(2.2),(2.2);`) tk.MustQuery(`select /*+ stream_agg() */ distinct * from t;`).Check(testkit.Rows("<nil>", "1.1", "2.2")) - c.Assert(tk.Se.GetSessionVars().StmtCtx.WarningCount(), Equals, uint16(0)) + require.Equal(t, tk.Session().GetSessionVars().StmtCtx.WarningCount(), uint16(0)) // check for DATETIME type tk.MustExec(`drop table if exists t;`) @@ -1157,14 +1206,14 @@ func (s *testSuiteAgg) TestIssue15690(c *C) { tk.MustExec(`insert into t values(null);`) tk.MustExec(`insert into t values("2019-03-20 21:50:00"),("2019-03-20 21:50:01"), ("2019-03-20 21:50:00");`) tk.MustQuery(`select /*+ stream_agg() */ distinct * from t;`).Check(testkit.Rows("<nil>", "2019-03-20 21:50:00", "2019-03-20 21:50:01")) - c.Assert(tk.Se.GetSessionVars().StmtCtx.WarningCount(), Equals, uint16(0)) + require.Equal(t, tk.Session().GetSessionVars().StmtCtx.WarningCount(), uint16(0)) // check for JSON type tk.MustExec(`drop table if exists t;`) tk.MustExec(`create table t(a json);`) tk.MustExec(`insert into t values(null),(null),(null),(null);`) tk.MustQuery(`select /*+ stream_agg() */ distinct * from t;`).Check(testkit.Rows("<nil>")) - c.Assert(tk.Se.GetSessionVars().StmtCtx.WarningCount(), Equals, uint16(0)) + require.Equal(t, tk.Session().GetSessionVars().StmtCtx.WarningCount(), uint16(0)) // check for char type tk.MustExec(`drop table if exists t;`) @@ -1172,12 +1221,15 @@ func (s *testSuiteAgg) TestIssue15690(c *C) { tk.MustExec(`insert into t values(null),(null),(null),(null);`) tk.MustExec(`insert into t values('a'),('b');`) tk.MustQuery(`select /*+ stream_agg() */ distinct * from t;`).Check(testkit.Rows("<nil>", "a", "b")) - c.Assert(tk.Se.GetSessionVars().StmtCtx.WarningCount(), Equals, uint16(0)) + require.Equal(t, tk.Session().GetSessionVars().StmtCtx.WarningCount(), uint16(0)) } -func (s *testSuiteAgg) TestIssue15958(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) - tk.Se.GetSessionVars().MaxChunkSize = 2 +func TestIssue15958(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.Session().GetSessionVars().MaxChunkSize = 2 tk.MustExec(`drop table if exists t;`) tk.MustExec(`create table t(y year);`) tk.MustExec(`insert into t values (2020), (2000), (2050);`) @@ -1185,8 +1237,10 @@ func (s *testSuiteAgg) TestIssue15958(c *C) { tk.MustQuery(`select avg(y) from t`).Check(testkit.Rows("2023.3333")) } -func (s *testSuiteAgg) TestIssue17216(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestIssue17216(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t1") tk.MustExec(`CREATE TABLE t1 ( @@ -1197,7 +1251,7 @@ func (s *testSuiteAgg) TestIssue17216(c *C) { tk.MustQuery("SELECT count(distinct col1) FROM t1").Check(testkit.Rows("48")) } -func (s *testSuiteAgg) TestHashAggRuntimeStat(c *C) { +func TestHashAggRuntimeStat(t *testing.T) { partialInfo := &executor.AggWorkerInfo{ Concurrency: 5, WallTime: int64(time.Second * 20), @@ -1229,12 +1283,11 @@ func (s *testSuiteAgg) TestHashAggRuntimeStat(c *C) { }) } expect := "partial_worker:{wall_time:20s, concurrency:5, task_num:25, tot_wait:10s, tot_exec:5s, tot_time:10s, max:4s, p95:4s}, final_worker:{wall_time:10s, concurrency:8, task_num:40, tot_wait:16ms, tot_exec:8ms, tot_time:28ms, max:7ms, p95:7ms}" - c.Assert(stats.String(), Equals, expect) - c.Assert(stats.String(), Equals, expect) - c.Assert(stats.Clone().String(), Equals, expect) + require.Equal(t, expect, stats.String()) + require.Equal(t, expect, stats.Clone().String()) stats.Merge(stats.Clone()) expect = "partial_worker:{wall_time:40s, concurrency:5, task_num:50, tot_wait:20s, tot_exec:10s, tot_time:20s, max:4s, p95:4s}, final_worker:{wall_time:20s, concurrency:8, task_num:80, tot_wait:32ms, tot_exec:16ms, tot_time:56ms, max:7ms, p95:7ms}" - c.Assert(stats.String(), Equals, expect) + require.Equal(t, expect, stats.String()) } func reconstructParallelGroupConcatResult(rows [][]interface{}) []string { @@ -1256,8 +1309,10 @@ func reconstructParallelGroupConcatResult(rows [][]interface{}) []string { return data } -func (s *testSuiteAgg) TestParallelStreamAggGroupConcat(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestParallelStreamAggGroupConcat(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test;") tk.MustExec("drop table if exists t;") tk.MustExec("CREATE TABLE t(a bigint, b bigint);") @@ -1291,19 +1346,21 @@ func (s *testSuiteAgg) TestParallelStreamAggGroupConcat(c *C) { break } } - c.Assert(ok, Equals, true) + require.True(t, ok) obtained := reconstructParallelGroupConcatResult(tk.MustQuery(sql).Rows()) - c.Assert(len(obtained), Equals, len(expected)) + require.Equal(t, len(expected), len(obtained)) for i := 0; i < len(obtained); i++ { - c.Assert(obtained[i], Equals, expected[i]) + require.Equal(t, expected[i], obtained[i]) } } } } -func (s *testSuiteAgg) TestIssue20658(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) - tk.MustExec("use test;") +func TestIssue20658(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") aggFuncs := []string{"count(a)", "sum(a)", "avg(a)", "max(a)", "min(a)", "bit_or(a)", "bit_xor(a)", "bit_and(a)", "var_pop(a)", "var_samp(a)", "stddev_pop(a)", "stddev_samp(a)", "approx_count_distinct(a)", "approx_percentile(a, 7)"} sqlFormat := "select /*+ stream_agg() */ %s from t group by b;" @@ -1342,7 +1399,7 @@ func (s *testSuiteAgg) TestIssue20658(c *C) { continue } v, err := strconv.ParseFloat(rowStr, 64) - c.Assert(err, IsNil, cmt) + require.NoError(t, err, cmt) ret[i] = v } sort.Float64s(ret) @@ -1364,74 +1421,21 @@ func (s *testSuiteAgg) TestIssue20658(c *C) { break } } - c.Assert(ok, Equals, true, comment) + require.True(t, ok, comment) rows := mustParseAndSort(tk.MustQuery(sql).Rows(), comment) - c.Assert(len(rows), Equals, len(expected), comment) + require.Equal(t, len(expected), len(rows), comment) for i := range rows { - c.Assert(math.Abs(rows[i]-expected[i]), Less, 1e-3, comment) + require.Less(t, math.Abs(rows[i]-expected[i]), 1e-3, comment) } } } } -func (s *testSerialSuite) TestRandomPanicAggConsume(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) - tk.MustExec("set @@tidb_max_chunk_size=32") - tk.MustExec("set @@tidb_init_chunk_size=1") - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a int)") - for i := 0; i <= 1000; i++ { - tk.MustExec(fmt.Sprintf("insert into t values(%v),(%v),(%v)", i, i, i)) - } - - fpName := "github.com/pingcap/tidb/executor/ConsumeRandomPanic" - c.Assert(failpoint.Enable(fpName, "5%panic(\"ERROR 1105 (HY000): Out Of Memory Quota![conn_id=1]\")"), IsNil) - defer func() { - c.Assert(failpoint.Disable(fpName), IsNil) - }() - - // Test 10 times panic for each AggExec. - var res sqlexec.RecordSet - for i := 1; i <= 10; i++ { - var err error - for err == nil { - // Test paralleled hash agg. - res, err = tk.Exec("select /*+ HASH_AGG() */ count(a) from t group by a") - if err == nil { - _, err = session.GetRows4Test(context.Background(), tk.Se, res) - c.Assert(res.Close(), IsNil) - } - } - c.Assert(err.Error(), Equals, "failpoint panic: ERROR 1105 (HY000): Out Of Memory Quota![conn_id=1]") - - err = nil - for err == nil { - // Test unparalleled hash agg. - res, err = tk.Exec("select /*+ HASH_AGG() */ count(distinct a) from t") - if err == nil { - _, err = session.GetRows4Test(context.Background(), tk.Se, res) - c.Assert(res.Close(), IsNil) - } - } - c.Assert(err.Error(), Equals, "failpoint panic: ERROR 1105 (HY000): Out Of Memory Quota![conn_id=1]") - - err = nil - for err == nil { - // Test stream agg. - res, err = tk.Exec("select /*+ STREAM_AGG() */ count(a) from t") - if err == nil { - _, err = session.GetRows4Test(context.Background(), tk.Se, res) - c.Assert(res.Close(), IsNil) - } - } - c.Assert(err.Error(), Equals, "failpoint panic: ERROR 1105 (HY000): Out Of Memory Quota![conn_id=1]") - } -} - -func (s *testSuiteAgg) TestIssue23277(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestIssue23277(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test;") tk.MustExec("drop table if exists t;") @@ -1461,9 +1465,32 @@ func (s *testSuiteAgg) TestIssue23277(c *C) { tk.MustExec("drop table t;") } +func TestAvgDecimal(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test;") + tk.MustExec("drop table if exists td;") + tk.MustExec("create table td (col_bigint bigint(20), col_smallint smallint(6));") + tk.MustExec("insert into td values (null, 22876);") + tk.MustExec("insert into td values (9220557287087669248, 32767);") + tk.MustExec("insert into td values (28030, 32767);") + tk.MustExec("insert into td values (-3309864251140603904,32767);") + tk.MustExec("insert into td values (4,0);") + tk.MustExec("insert into td values (null,0);") + tk.MustExec("insert into td values (4,-23828);") + tk.MustExec("insert into td values (54720,32767);") + tk.MustExec("insert into td values (0,29815);") + tk.MustExec("insert into td values (10017,-32661);") + tk.MustQuery(" SELECT AVG( col_bigint / col_smallint) AS field1 FROM td;").Sort().Check(testkit.Rows("25769363061037.62077260")) + tk.MustExec("drop table td;") +} + // https://github.com/pingcap/tidb/issues/23314 -func (s *testSuiteAgg) TestIssue23314(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue23314(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t1") tk.MustExec("create table t1(col1 time(2) NOT NULL)") @@ -1472,8 +1499,10 @@ func (s *testSuiteAgg) TestIssue23314(c *C) { res.Check(testkit.Rows("16:40:20.01")) } -func (s *testSerialSuite) TestAggInDisk(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestAggInDisk(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("set tidb_hashagg_final_concurrency = 1;") tk.MustExec("set tidb_hashagg_partial_concurrency = 1;") @@ -1492,10 +1521,10 @@ func (s *testSerialSuite) TestAggInDisk(c *C) { line := fmt.Sprintf("%v", row) disk := fmt.Sprintf("%v", row[length-1]) if strings.Contains(line, "HashAgg") { - c.Assert(strings.Contains(disk, "0 Bytes"), IsFalse) - c.Assert(strings.Contains(disk, "MB") || + require.False(t, strings.Contains(disk, "0 Bytes")) + require.True(t, strings.Contains(disk, "MB") || strings.Contains(disk, "KB") || - strings.Contains(disk, "Bytes"), IsTrue) + strings.Contains(disk, "Bytes")) } } @@ -1510,3 +1539,60 @@ func (s *testSerialSuite) TestAggInDisk(c *C) { tk.MustQuery("select /*+ HASH_AGG() */ count(c) from t;").Check(testkit.Rows("0")) tk.MustQuery("select /*+ HASH_AGG() */ count(c) from t group by c1;").Check(testkit.Rows()) } + +func TestRandomPanicAggConsume(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("set @@tidb_max_chunk_size=32") + tk.MustExec("set @@tidb_init_chunk_size=1") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int)") + for i := 0; i <= 1000; i++ { + tk.MustExec(fmt.Sprintf("insert into t values(%v),(%v),(%v)", i, i, i)) + } + + fpName := "github.com/pingcap/tidb/executor/ConsumeRandomPanic" + require.NoError(t, failpoint.Enable(fpName, "5%panic(\"ERROR 1105 (HY000): Out Of Memory Quota![conn_id=1]\")")) + defer func() { + require.NoError(t, failpoint.Disable(fpName)) + }() + + // Test 10 times panic for each AggExec. + var res sqlexec.RecordSet + for i := 1; i <= 10; i++ { + var err error + for err == nil { + // Test paralleled hash agg. + res, err = tk.Exec("select /*+ HASH_AGG() */ count(a) from t group by a") + if err == nil { + _, err = session.GetRows4Test(context.Background(), tk.Session(), res) + require.NoError(t, res.Close()) + } + } + require.EqualError(t, err, "failpoint panic: ERROR 1105 (HY000): Out Of Memory Quota![conn_id=1]") + + err = nil + for err == nil { + // Test unparalleled hash agg. + res, err = tk.Exec("select /*+ HASH_AGG() */ count(distinct a) from t") + if err == nil { + _, err = session.GetRows4Test(context.Background(), tk.Session(), res) + require.NoError(t, res.Close()) + } + } + require.EqualError(t, err, "failpoint panic: ERROR 1105 (HY000): Out Of Memory Quota![conn_id=1]") + + err = nil + for err == nil { + // Test stream agg. + res, err = tk.Exec("select /*+ STREAM_AGG() */ count(a) from t") + if err == nil { + _, err = session.GetRows4Test(context.Background(), tk.Session(), res) + require.NoError(t, res.Close()) + } + } + require.EqualError(t, err, "failpoint panic: ERROR 1105 (HY000): Out Of Memory Quota![conn_id=1]") + } +} diff --git a/executor/analyze.go b/executor/analyze.go index 675cb33161453..9414b2fbade1e 100644 --- a/executor/analyze.go +++ b/executor/analyze.go @@ -114,9 +114,9 @@ func (e *AnalyzeExec) Next(ctx context.Context, req *chunk.Chunk) error { } type globalStatsInfo struct { isIndex int - // When the `isIndex == 0`, the idxID will be the column ID. - // Otherwise, the idxID will be the index ID. - idxID int64 + // When the `isIndex == 0`, histIDs will be the column IDs. + // Otherwise, histIDs will only contain the index ID. + histIDs []int64 statsVersion int } // globalStatsMap is a map used to store which partition tables and the corresponding indexes need global-level stats. @@ -151,19 +151,22 @@ func (e *AnalyzeExec) Next(ctx context.Context, req *chunk.Chunk) error { } if results.TableID.IsPartitionTable() && needGlobalStats { for _, result := range results.Ars { - for _, hg := range result.Hist { - // It's normal virtual column, skip. - if hg == nil { - continue - } + if result.IsIndex == 0 { // If it does not belong to the statistics of index, we need to set it to -1 to distinguish. - idxID := int64(-1) - if result.IsIndex != 0 { - idxID = hg.ID + globalStatsID := globalStatsKey{tableID: results.TableID.TableID, indexID: int64(-1)} + histIDs := make([]int64, 0, len(result.Hist)) + for _, hg := range result.Hist { + // It's normal virtual column, skip. + if hg == nil { + continue + } + histIDs = append(histIDs, hg.ID) } - globalStatsID := globalStatsKey{results.TableID.TableID, idxID} - if _, ok := globalStatsMap[globalStatsID]; !ok { - globalStatsMap[globalStatsID] = globalStatsInfo{result.IsIndex, hg.ID, results.StatsVer} + globalStatsMap[globalStatsID] = globalStatsInfo{isIndex: result.IsIndex, histIDs: histIDs, statsVersion: results.StatsVer} + } else { + for _, hg := range result.Hist { + globalStatsID := globalStatsKey{tableID: results.TableID.TableID, indexID: hg.ID} + globalStatsMap[globalStatsID] = globalStatsInfo{isIndex: result.IsIndex, histIDs: []int64{hg.ID}, statsVersion: results.StatsVer} } } } @@ -184,7 +187,7 @@ func (e *AnalyzeExec) Next(ctx context.Context, req *chunk.Chunk) error { } if needGlobalStats { for globalStatsID, info := range globalStatsMap { - globalStats, err := statsHandle.MergePartitionStats2GlobalStatsByTableID(e.ctx, e.opts, e.ctx.GetInfoSchema().(infoschema.InfoSchema), globalStatsID.tableID, info.isIndex, info.idxID) + globalStats, err := statsHandle.MergePartitionStats2GlobalStatsByTableID(e.ctx, e.opts, e.ctx.GetInfoSchema().(infoschema.InfoSchema), globalStatsID.tableID, info.isIndex, info.histIDs) if err != nil { if types.ErrPartitionStatsMissing.Equal(err) { // When we find some partition-level stats are missing, we need to report warning. @@ -196,7 +199,7 @@ func (e *AnalyzeExec) Next(ctx context.Context, req *chunk.Chunk) error { for i := 0; i < globalStats.Num; i++ { hg, cms, topN, fms := globalStats.Hg[i], globalStats.Cms[i], globalStats.TopN[i], globalStats.Fms[i] // fms for global stats doesn't need to dump to kv. - err = statsHandle.SaveStatsToStorage(globalStatsID.tableID, globalStats.Count, info.isIndex, hg, cms, topN, fms, info.statsVersion, 1, false) + err = statsHandle.SaveStatsToStorage(globalStatsID.tableID, globalStats.Count, info.isIndex, hg, cms, topN, fms, info.statsVersion, 1, false, true) if err != nil { logutil.Logger(ctx).Error("save global-level stats to storage failed", zap.Error(err)) } @@ -386,7 +389,7 @@ func (e *AnalyzeIndexExec) fetchAnalyzeResult(ranges []*ranger.Range, isNullRang } else { kvReqBuilder = builder.SetIndexRangesForTables(e.ctx.GetSessionVars().StmtCtx, []int64{e.tableID.GetStatisticsID()}, e.idxInfo.ID, ranges) } - kvReqBuilder.SetResourceGroupTag(e.ctx.GetSessionVars().StmtCtx) + kvReqBuilder.SetResourceGroupTagger(e.ctx.GetSessionVars().StmtCtx) kvReq, err := kvReqBuilder. SetAnalyzeRequest(e.analyzePB). SetStartTS(e.snapshot). @@ -747,7 +750,7 @@ func (e *AnalyzeColumnsExec) open(ranges []*ranger.Range) error { func (e *AnalyzeColumnsExec) buildResp(ranges []*ranger.Range) (distsql.SelectResult, error) { var builder distsql.RequestBuilder reqBuilder := builder.SetHandleRangesForTables(e.ctx.GetSessionVars().StmtCtx, []int64{e.TableID.GetStatisticsID()}, e.handleCols != nil && !e.handleCols.IsInt(), ranges, nil) - builder.SetResourceGroupTag(e.ctx.GetSessionVars().StmtCtx) + builder.SetResourceGroupTagger(e.ctx.GetSessionVars().StmtCtx) // Always set KeepOrder of the request to be true, in order to compute // correct `correlation` of columns. kvReq, err := reqBuilder. @@ -770,7 +773,7 @@ func (e *AnalyzeColumnsExec) buildResp(ranges []*ranger.Range) (distsql.SelectRe // decodeSampleDataWithVirtualColumn constructs the virtual column by evaluating from the deocded normal columns. // If it failed, it would return false to trigger normal decoding way without the virtual column. func (e AnalyzeColumnsExec) decodeSampleDataWithVirtualColumn( - collector *statistics.ReservoirRowSampleCollector, + collector statistics.RowSampleCollector, fieldTps []*types.FieldType, virtualColIdx []int, schema *expression.Schema, @@ -779,9 +782,9 @@ func (e AnalyzeColumnsExec) decodeSampleDataWithVirtualColumn( for _, col := range e.schemaForVirtualColEval.Columns { totFts = append(totFts, col.RetType) } - chk := chunk.NewChunkWithCapacity(totFts, len(collector.Samples)) + chk := chunk.NewChunkWithCapacity(totFts, len(collector.Base().Samples)) decoder := codec.NewDecoder(chk, e.ctx.GetSessionVars().Location()) - for _, sample := range collector.Samples { + for _, sample := range collector.Base().Samples { for i := range sample.Columns { if schema.Columns[i].VirtualExpr != nil { continue @@ -799,7 +802,7 @@ func (e AnalyzeColumnsExec) decodeSampleDataWithVirtualColumn( iter := chunk.NewIterator4Chunk(chk) for row, i := iter.Begin(), 0; row != iter.End(); row, i = iter.Next(), i+1 { datums := row.GetDatumRow(totFts) - collector.Samples[i].Columns = datums + collector.Base().Samples[i].Columns = datums } return nil } @@ -842,9 +845,9 @@ func (e *AnalyzeColumnsExec) buildSamplingStats( }() l := len(e.analyzePB.ColReq.ColumnsInfo) + len(e.analyzePB.ColReq.ColumnGroups) - rootRowCollector := statistics.NewReservoirRowSampleCollector(int(e.analyzePB.ColReq.SampleSize), l) + rootRowCollector := statistics.NewRowSampleCollector(int(e.analyzePB.ColReq.SampleSize), e.analyzePB.ColReq.GetSampleRate(), l) for i := 0; i < l; i++ { - rootRowCollector.FMSketches = append(rootRowCollector.FMSketches, statistics.NewFMSketch(maxSketchSize)) + rootRowCollector.Base().FMSketches = append(rootRowCollector.Base().FMSketches, statistics.NewFMSketch(maxSketchSize)) } sc := e.ctx.GetSessionVars().StmtCtx statsConcurrency, err := getBuildStatsConcurrency(e.ctx) @@ -894,7 +897,7 @@ func (e *AnalyzeColumnsExec) buildSamplingStats( } } else { // If there's no virtual column or we meet error during eval virtual column, we fallback to normal decode otherwise. - for _, sample := range rootRowCollector.Samples { + for _, sample := range rootRowCollector.Base().Samples { for i := range sample.Columns { sample.Columns[i], err = tablecodec.DecodeColumnValue(sample.Columns[i].GetBytes(), &e.colsInfo[i].FieldType, sc.TimeZone) if err != nil { @@ -904,7 +907,7 @@ func (e *AnalyzeColumnsExec) buildSamplingStats( } } - for _, sample := range rootRowCollector.Samples { + for _, sample := range rootRowCollector.Base().Samples { // Calculate handle from the row data for each row. It will be used to sort the samples. sample.Handle, err = e.handleCols.BuildHandleByDatums(sample.Columns) if err != nil { @@ -916,8 +919,8 @@ func (e *AnalyzeColumnsExec) buildSamplingStats( // The order of the samples are broken when merging samples from sub-collectors. // So now we need to sort the samples according to the handle in order to calculate correlation. - sort.Slice(rootRowCollector.Samples, func(i, j int) bool { - return rootRowCollector.Samples[i].Handle.Compare(rootRowCollector.Samples[j].Handle) < 0 + sort.Slice(rootRowCollector.Base().Samples, func(i, j int) bool { + return rootRowCollector.Base().Samples[i].Handle.Compare(rootRowCollector.Base().Samples[j].Handle) < 0 }) totalLen := len(e.colsInfo) + len(e.indexes) @@ -941,7 +944,7 @@ func (e *AnalyzeColumnsExec) buildSamplingStats( isColumn: true, slicePos: i, } - fmSketches = append(fmSketches, rootRowCollector.FMSketches[i]) + fmSketches = append(fmSketches, rootRowCollector.Base().FMSketches[i]) } indexPushedDownResult := <-idxNDVPushDownCh @@ -950,8 +953,8 @@ func (e *AnalyzeColumnsExec) buildSamplingStats( } for _, offset := range indexesWithVirtualColOffsets { ret := indexPushedDownResult.results[e.indexes[offset].ID] - rootRowCollector.NullCount[colLen+offset] = ret.Count - rootRowCollector.FMSketches[colLen+offset] = ret.Ars[0].Fms[0] + rootRowCollector.Base().NullCount[colLen+offset] = ret.Count + rootRowCollector.Base().FMSketches[colLen+offset] = ret.Ars[0].Fms[0] } // build index stats @@ -963,7 +966,7 @@ func (e *AnalyzeColumnsExec) buildSamplingStats( isColumn: false, slicePos: colLen + i, } - fmSketches = append(fmSketches, rootRowCollector.FMSketches[colLen+i]) + fmSketches = append(fmSketches, rootRowCollector.Base().FMSketches[colLen+i]) } close(buildTaskChan) panicCnt := 0 @@ -983,7 +986,7 @@ func (e *AnalyzeColumnsExec) buildSamplingStats( if err != nil { return 0, nil, nil, nil, nil, err } - count = rootRowCollector.Count + count = rootRowCollector.Base().Count if needExtStats { statsHandle := domain.GetDomain(e.ctx).StatsHandle() extStats, err = statsHandle.BuildExtendedStats(e.TableID.GetStatisticsID(), e.colsInfo, sampleCollectors) @@ -1160,7 +1163,7 @@ func (e *AnalyzeColumnsExec) buildSubIndexJobForSpecialIndex(indexInfos []*model } type samplingMergeResult struct { - collector *statistics.ReservoirRowSampleCollector + collector statistics.RowSampleCollector err error } @@ -1190,9 +1193,9 @@ func (e *AnalyzeColumnsExec) subMergeWorker(resultCh chan<- *samplingMergeResult failpoint.Inject("mockAnalyzeSamplingMergeWorkerPanic", func() { panic("failpoint triggered") }) - retCollector := statistics.NewReservoirRowSampleCollector(int(e.analyzePB.ColReq.SampleSize), l) + retCollector := statistics.NewRowSampleCollector(int(e.analyzePB.ColReq.SampleSize), e.analyzePB.ColReq.GetSampleRate(), l) for i := 0; i < l; i++ { - retCollector.FMSketches = append(retCollector.FMSketches, statistics.NewFMSketch(maxSketchSize)) + retCollector.Base().FMSketches = append(retCollector.Base().FMSketches, statistics.NewFMSketch(maxSketchSize)) } for { data, ok := <-taskCh @@ -1205,11 +1208,9 @@ func (e *AnalyzeColumnsExec) subMergeWorker(resultCh chan<- *samplingMergeResult resultCh <- &samplingMergeResult{err: err} return } - subCollector := &statistics.ReservoirRowSampleCollector{ - MaxSampleSize: int(e.analyzePB.ColReq.SampleSize), - } - subCollector.FromProto(colResp.RowCollector) - e.job.Update(subCollector.Count) + subCollector := statistics.NewRowSampleCollector(int(e.analyzePB.ColReq.SampleSize), e.analyzePB.ColReq.GetSampleRate(), l) + subCollector.Base().FromProto(colResp.RowCollector) + e.job.Update(subCollector.Base().Count) retCollector.MergeCollector(subCollector) } resultCh <- &samplingMergeResult{collector: retCollector} @@ -1217,7 +1218,7 @@ func (e *AnalyzeColumnsExec) subMergeWorker(resultCh chan<- *samplingMergeResult type samplingBuildTask struct { id int64 - rootRowCollector *statistics.ReservoirRowSampleCollector + rootRowCollector statistics.RowSampleCollector tp *types.FieldType isColumn bool slicePos int @@ -1256,8 +1257,8 @@ workLoop: topns[task.slicePos] = nil continue } - sampleItems := make([]*statistics.SampleItem, 0, task.rootRowCollector.MaxSampleSize) - for j, row := range task.rootRowCollector.Samples { + sampleItems := make([]*statistics.SampleItem, 0, task.rootRowCollector.Base().Samples.Len()) + for j, row := range task.rootRowCollector.Base().Samples { if row.Columns[task.slicePos].IsNull() { continue } @@ -1276,17 +1277,17 @@ workLoop: } collector = &statistics.SampleCollector{ Samples: sampleItems, - NullCount: task.rootRowCollector.NullCount[task.slicePos], - Count: task.rootRowCollector.Count - task.rootRowCollector.NullCount[task.slicePos], - FMSketch: task.rootRowCollector.FMSketches[task.slicePos], - TotalSize: task.rootRowCollector.TotalSizes[task.slicePos], + NullCount: task.rootRowCollector.Base().NullCount[task.slicePos], + Count: task.rootRowCollector.Base().Count - task.rootRowCollector.Base().NullCount[task.slicePos], + FMSketch: task.rootRowCollector.Base().FMSketches[task.slicePos], + TotalSize: task.rootRowCollector.Base().TotalSizes[task.slicePos], } } else { var tmpDatum types.Datum var err error idx := e.indexes[task.slicePos-colLen] - sampleItems := make([]*statistics.SampleItem, 0, task.rootRowCollector.MaxSampleSize) - for _, row := range task.rootRowCollector.Samples { + sampleItems := make([]*statistics.SampleItem, 0, task.rootRowCollector.Base().Samples.Len()) + for _, row := range task.rootRowCollector.Base().Samples { if len(idx.Columns) == 1 && row.Columns[idx.Columns[0].Offset].IsNull() { continue } @@ -1315,10 +1316,10 @@ workLoop: } collector = &statistics.SampleCollector{ Samples: sampleItems, - NullCount: task.rootRowCollector.NullCount[task.slicePos], - Count: task.rootRowCollector.Count - task.rootRowCollector.NullCount[task.slicePos], - FMSketch: task.rootRowCollector.FMSketches[task.slicePos], - TotalSize: task.rootRowCollector.TotalSizes[task.slicePos], + NullCount: task.rootRowCollector.Base().NullCount[task.slicePos], + Count: task.rootRowCollector.Base().Count - task.rootRowCollector.Base().NullCount[task.slicePos], + FMSketch: task.rootRowCollector.Base().FMSketches[task.slicePos], + TotalSize: task.rootRowCollector.Base().TotalSizes[task.slicePos], } } if task.isColumn { @@ -1619,7 +1620,7 @@ func (e *AnalyzeFastExec) calculateEstimateSampleStep() (err error) { return } defer terror.Call(rs.Close) - chk := rs.NewChunk() + chk := rs.NewChunk(nil) err = rs.Next(context.TODO(), chk) if err != nil { return @@ -1852,7 +1853,7 @@ func (e *AnalyzeFastExec) handleScanTasks(bo *tikv.Backoffer) (keysSize int, err if e.ctx.GetSessionVars().GetReplicaRead().IsFollowerRead() { snapshot.SetOption(kv.ReplicaRead, kv.ReplicaReadFollower) } - setResourceGroupTagForTxn(e.ctx.GetSessionVars().StmtCtx, snapshot) + setResourceGroupTaggerForTxn(e.ctx.GetSessionVars().StmtCtx, snapshot) for _, t := range e.scanTasks { iter, err := snapshot.Iter(kv.Key(t.StartKey), kv.Key(t.EndKey)) if err != nil { @@ -1873,7 +1874,7 @@ func (e *AnalyzeFastExec) handleSampTasks(workID int, step uint32, err *error) { snapshot.SetOption(kv.NotFillCache, true) snapshot.SetOption(kv.IsolationLevel, kv.SI) snapshot.SetOption(kv.Priority, kv.PriorityLow) - setResourceGroupTagForTxn(e.ctx.GetSessionVars().StmtCtx, snapshot) + setResourceGroupTaggerForTxn(e.ctx.GetSessionVars().StmtCtx, snapshot) readReplicaType := e.ctx.GetSessionVars().GetReplicaRead() if readReplicaType.IsFollowerRead() { snapshot.SetOption(kv.ReplicaRead, readReplicaType) @@ -2047,7 +2048,7 @@ func (e *AnalyzeFastExec) runTasks() ([]*statistics.Histogram, []*statistics.CMS func (e *AnalyzeFastExec) buildStats() (hists []*statistics.Histogram, cms []*statistics.CMSketch, topNs []*statistics.TopN, fms []*statistics.FMSketch, err error) { // To set rand seed, it's for unit test. // To ensure that random sequences are different in non-test environments, RandSeed must be set time.Now(). - if RandSeed == 1 { + if atomic.LoadInt64(&RandSeed) == 1 { atomic.StoreInt64(&e.randSeed, time.Now().UnixNano()) } else { atomic.StoreInt64(&e.randSeed, RandSeed) diff --git a/executor/analyze_test.go b/executor/analyze_test.go index 1343ac7f663c8..3ee10fe9a3626 100644 --- a/executor/analyze_test.go +++ b/executor/analyze_test.go @@ -20,9 +20,10 @@ import ( "strconv" "strings" "sync" + "sync/atomic" + "testing" "time" - . "github.com/pingcap/check" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/executor" @@ -41,20 +42,20 @@ import ( "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/tablecodec" + "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/codec" "github.com/pingcap/tidb/util/collate" - "github.com/pingcap/tidb/util/israce" - "github.com/pingcap/tidb/util/testkit" + "github.com/stretchr/testify/require" "github.com/tikv/client-go/v2/testutils" "github.com/tikv/client-go/v2/tikv" "github.com/tikv/client-go/v2/tikvrpc" ) -var _ = Suite(&testFastAnalyze{}) - -func (s *testSuite1) TestAnalyzePartition(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestAnalyzePartition(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) testkit.WithPruneMode(tk, variable.Static, func() { tk.MustExec("use test") tk.MustExec("drop table if exists t") @@ -72,24 +73,24 @@ PARTITION BY RANGE ( a ) ( } tk.MustExec("analyze table t") - is := tk.Se.(sessionctx.Context).GetInfoSchema().(infoschema.InfoSchema) + is := tk.Session().(sessionctx.Context).GetInfoSchema().(infoschema.InfoSchema) table, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) + require.NoError(t, err) pi := table.Meta().GetPartitionInfo() - c.Assert(pi, NotNil) - do, err := session.GetDomain(s.store) - c.Assert(err, IsNil) + require.NotNil(t, pi) + do, err := session.GetDomain(store) + require.NoError(t, err) handle := do.StatsHandle() for _, def := range pi.Definitions { statsTbl := handle.GetPartitionStats(table.Meta(), def.ID) - c.Assert(statsTbl.Pseudo, IsFalse) - c.Assert(len(statsTbl.Columns), Equals, 3) - c.Assert(len(statsTbl.Indices), Equals, 1) + require.False(t, statsTbl.Pseudo) + require.Len(t, statsTbl.Columns, 3) + require.Len(t, statsTbl.Indices, 1) for _, col := range statsTbl.Columns { - c.Assert(col.Len()+col.Num(), Greater, 0) + require.Greater(t, col.Len()+col.Num(), 0) } for _, idx := range statsTbl.Indices { - c.Assert(idx.Len()+idx.Num(), Greater, 0) + require.Greater(t, idx.Len()+idx.Num(), 0) } } @@ -99,41 +100,47 @@ PARTITION BY RANGE ( a ) ( tk.MustExec(fmt.Sprintf(`insert into t values (%d, %d, "hello")`, i, i)) } tk.MustExec("alter table t analyze partition p0") - is = tk.Se.(sessionctx.Context).GetInfoSchema().(infoschema.InfoSchema) + is = tk.Session().(sessionctx.Context).GetInfoSchema().(infoschema.InfoSchema) table, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) + require.NoError(t, err) pi = table.Meta().GetPartitionInfo() - c.Assert(pi, NotNil) + require.NotNil(t, pi) for i, def := range pi.Definitions { statsTbl := handle.GetPartitionStats(table.Meta(), def.ID) if i == 0 { - c.Assert(statsTbl.Pseudo, IsFalse) - c.Assert(len(statsTbl.Columns), Equals, 3) - c.Assert(len(statsTbl.Indices), Equals, 1) + require.False(t, statsTbl.Pseudo) + require.Len(t, statsTbl.Columns, 3) + require.Len(t, statsTbl.Indices, 1) } else { - c.Assert(statsTbl.Pseudo, IsTrue) + require.True(t, statsTbl.Pseudo) } } }) } -func (s *testSuite1) TestAnalyzeReplicaReadFollower(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestAnalyzeReplicaReadFollower(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int)") - ctx := tk.Se.(sessionctx.Context) + ctx := tk.Session().(sessionctx.Context) ctx.GetSessionVars().SetReplicaRead(kv.ReplicaReadFollower) tk.MustExec("analyze table t") } -func (s *testSuite1) TestClusterIndexAnalyze(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestClusterIndexAnalyze(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("drop database if exists test_cluster_index_analyze;") tk.MustExec("create database test_cluster_index_analyze;") tk.MustExec("use test_cluster_index_analyze;") - tk.Se.GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeOn + tk.Session().GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeOn tk.MustExec("create table t (a int, b int, c int, primary key(a, b));") for i := 0; i < 100; i++ { @@ -157,18 +164,26 @@ func (s *testSuite1) TestClusterIndexAnalyze(c *C) { tk.MustExec("drop table t;") } -func (s *testSuite1) TestAnalyzeRestrict(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestAnalyzeRestrict(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int)") - ctx := tk.Se.(sessionctx.Context) + ctx := tk.Session().(sessionctx.Context) ctx.GetSessionVars().InRestrictedSQL = true tk.MustExec("analyze table t") } -func (s *testSuite1) TestAnalyzeParameters(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestAnalyzeParameters(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + dom, err := session.BootstrapSession(store) + require.NoError(t, err) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int)") @@ -180,50 +195,56 @@ func (s *testSuite1) TestAnalyzeParameters(c *C) { tk.MustExec("set @@tidb_enable_fast_analyze = 1") tk.MustExec("set @@tidb_analyze_version = 1") tk.MustExec("analyze table t with 30 samples") - is := tk.Se.(sessionctx.Context).GetInfoSchema().(infoschema.InfoSchema) + is := tk.Session().(sessionctx.Context).GetInfoSchema().(infoschema.InfoSchema) table, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) + require.NoError(t, err) tableInfo := table.Meta() - tbl := s.dom.StatsHandle().GetTableStats(tableInfo) + tbl := dom.StatsHandle().GetTableStats(tableInfo) col := tbl.Columns[1] - c.Assert(col.Len(), Equals, 20) - c.Assert(len(col.TopN.TopN), Equals, 1) + require.Equal(t, 20, col.Len()) + require.Len(t, col.TopN.TopN, 1) width, depth := col.CMSketch.GetWidthAndDepth() - c.Assert(depth, Equals, int32(5)) - c.Assert(width, Equals, int32(2048)) + require.Equal(t, int32(5), depth) + require.Equal(t, int32(2048), width) tk.MustExec("analyze table t with 4 buckets, 0 topn, 4 cmsketch width, 4 cmsketch depth") - tbl = s.dom.StatsHandle().GetTableStats(tableInfo) + tbl = dom.StatsHandle().GetTableStats(tableInfo) col = tbl.Columns[1] - c.Assert(col.Len(), Equals, 4) - c.Assert(col.TopN, IsNil) + require.Equal(t, 4, col.Len()) + require.Nil(t, col.TopN) width, depth = col.CMSketch.GetWidthAndDepth() - c.Assert(depth, Equals, int32(4)) - c.Assert(width, Equals, int32(4)) + require.Equal(t, int32(4), depth) + require.Equal(t, int32(4), width) // Test very large cmsketch tk.MustExec(fmt.Sprintf("analyze table t with %d cmsketch width, %d cmsketch depth", core.CMSketchSizeLimit, 1)) - tbl = s.dom.StatsHandle().GetTableStats(tableInfo) + tbl = dom.StatsHandle().GetTableStats(tableInfo) col = tbl.Columns[1] - c.Assert(col.Len(), Equals, 20) - c.Assert(len(col.TopN.TopN), Equals, 1) + require.Equal(t, 20, col.Len()) + + require.Len(t, col.TopN.TopN, 1) width, depth = col.CMSketch.GetWidthAndDepth() - c.Assert(depth, Equals, int32(1)) - c.Assert(width, Equals, int32(core.CMSketchSizeLimit)) + require.Equal(t, int32(1), depth) + require.Equal(t, int32(core.CMSketchSizeLimit), width) // Test very large cmsketch tk.MustExec("analyze table t with 20480 cmsketch width, 50 cmsketch depth") - tbl = s.dom.StatsHandle().GetTableStats(tableInfo) + tbl = dom.StatsHandle().GetTableStats(tableInfo) col = tbl.Columns[1] - c.Assert(col.Len(), Equals, 20) - c.Assert(len(col.TopN.TopN), Equals, 1) + require.Equal(t, 20, col.Len()) + require.Len(t, col.TopN.TopN, 1) width, depth = col.CMSketch.GetWidthAndDepth() - c.Assert(depth, Equals, int32(50)) - c.Assert(width, Equals, int32(20480)) + require.Equal(t, int32(50), depth) + require.Equal(t, int32(20480), width) } -func (s *testSuite1) TestAnalyzeTooLongColumns(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestAnalyzeTooLongColumns(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + dom, err := session.BootstrapSession(store) + require.NoError(t, err) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t(a json)") @@ -231,31 +252,31 @@ func (s *testSuite1) TestAnalyzeTooLongColumns(c *C) { tk.MustExec(fmt.Sprintf("insert into t values ('%s')", value)) tk.MustExec("analyze table t") - is := tk.Se.(sessionctx.Context).GetInfoSchema().(infoschema.InfoSchema) + is := tk.Session().(sessionctx.Context).GetInfoSchema().(infoschema.InfoSchema) table, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) + require.NoError(t, err) tableInfo := table.Meta() - tbl := s.dom.StatsHandle().GetTableStats(tableInfo) - c.Assert(tbl.Columns[1].Len(), Equals, 0) - c.Assert(tbl.Columns[1].TotColSize, Equals, int64(65559)) + tbl := dom.StatsHandle().GetTableStats(tableInfo) + require.Equal(t, 0, tbl.Columns[1].Len()) + require.Equal(t, int64(65559), tbl.Columns[1].TotColSize) } -func (s *testSuite1) TestAnalyzeIndexExtractTopN(c *C) { +func TestAnalyzeIndexExtractTopN(t *testing.T) { _ = checkHistogram - c.Skip("unstable, skip it and fix it before 20210618") + t.Skip("unstable, skip it and fix it before 20210618") store, err := mockstore.NewMockStore() - c.Assert(err, IsNil) + require.NoError(t, err) defer func() { err := store.Close() - c.Assert(err, IsNil) + require.NoError(t, err) }() var dom *domain.Domain session.DisableStats4Test() session.SetSchemaLease(0) dom, err = session.BootstrapSession(store) - c.Assert(err, IsNil) + require.NoError(t, err) defer dom.Close() - tk := testkit.NewTestKit(c, store) + tk := testkit.NewTestKit(t, store) tk.MustExec("create database test_index_extract_topn") tk.MustExec("use test_index_extract_topn") @@ -265,31 +286,31 @@ func (s *testSuite1) TestAnalyzeIndexExtractTopN(c *C) { tk.MustExec("set @@session.tidb_analyze_version=2") tk.MustExec("analyze table t") - is := tk.Se.(sessionctx.Context).GetInfoSchema().(infoschema.InfoSchema) + is := tk.Session().(sessionctx.Context).GetInfoSchema().(infoschema.InfoSchema) table, err := is.TableByName(model.NewCIStr("test_index_extract_topn"), model.NewCIStr("t")) - c.Assert(err, IsNil) + require.NoError(t, err) tableInfo := table.Meta() tbl := dom.StatsHandle().GetTableStats(tableInfo) // Construct TopN, should be (1, 1) -> 2 and (1, 2) -> 2 topn := statistics.NewTopN(2) { - key1, err := codec.EncodeKey(tk.Se.GetSessionVars().StmtCtx, nil, types.NewIntDatum(1), types.NewIntDatum(1)) - c.Assert(err, IsNil) + key1, err := codec.EncodeKey(tk.Session().GetSessionVars().StmtCtx, nil, types.NewIntDatum(1), types.NewIntDatum(1)) + require.NoError(t, err) topn.AppendTopN(key1, 2) - key2, err := codec.EncodeKey(tk.Se.GetSessionVars().StmtCtx, nil, types.NewIntDatum(1), types.NewIntDatum(2)) - c.Assert(err, IsNil) + key2, err := codec.EncodeKey(tk.Session().GetSessionVars().StmtCtx, nil, types.NewIntDatum(1), types.NewIntDatum(2)) + require.NoError(t, err) topn.AppendTopN(key2, 2) } for _, idx := range tbl.Indices { - ok, err := checkHistogram(tk.Se.GetSessionVars().StmtCtx, &idx.Histogram) - c.Assert(err, IsNil) - c.Assert(ok, IsTrue) - c.Assert(idx.TopN.Equal(topn), IsTrue) + ok, err := checkHistogram(tk.Session().GetSessionVars().StmtCtx, &idx.Histogram) + require.NoError(t, err) + require.True(t, ok) + require.True(t, idx.TopN.Equal(topn)) } } -func (s *testFastAnalyze) TestAnalyzeFastSample(c *C) { +func TestAnalyzeFastSample(t *testing.T) { var cls testutils.Cluster store, err := mockstore.NewMockStore( mockstore.WithClusterInspector(func(c testutils.Cluster) { @@ -297,25 +318,25 @@ func (s *testFastAnalyze) TestAnalyzeFastSample(c *C) { cls = c }), ) - c.Assert(err, IsNil) + require.NoError(t, err) defer func() { err := store.Close() - c.Assert(err, IsNil) + require.NoError(t, err) }() var dom *domain.Domain session.DisableStats4Test() session.SetSchemaLease(0) dom, err = session.BootstrapSession(store) - c.Assert(err, IsNil) + require.NoError(t, err) defer dom.Close() - tk := testkit.NewTestKit(c, store) - executor.RandSeed = 123 + tk := testkit.NewTestKit(t, store) + atomic.StoreInt64(&executor.RandSeed, 123) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int primary key, b int, index index_b(b))") tbl, err := dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) + require.NoError(t, err) tblInfo := tbl.Meta() tid := tblInfo.ID @@ -327,7 +348,7 @@ func (s *testFastAnalyze) TestAnalyzeFastSample(c *C) { tk.MustExec(fmt.Sprintf("insert into t values (%d, %d)", i, i)) } - handleCols := core.BuildHandleColsForAnalyze(tk.Se, tblInfo) + handleCols := core.BuildHandleColsForAnalyze(tk.Session(), tblInfo, true, nil) var colsInfo []*model.ColumnInfo var indicesInfo []*model.IndexInfo for _, col := range tblInfo.Columns { @@ -345,12 +366,12 @@ func (s *testFastAnalyze) TestAnalyzeFastSample(c *C) { opts[ast.AnalyzeOptNumSamples] = 20 // Get a start_ts later than the above inserts. tk.MustExec("begin") - txn, err := tk.Se.Txn(false) - c.Assert(err, IsNil) + txn, err := tk.Session().Txn(false) + require.NoError(t, err) ts := txn.StartTS() tk.MustExec("commit") mockExec := &executor.AnalyzeTestFastExec{ - Ctx: tk.Se.(sessionctx.Context), + Ctx: tk.Session().(sessionctx.Context), HandleCols: handleCols, ColsInfo: colsInfo, IdxsInfo: indicesInfo, @@ -364,15 +385,15 @@ func (s *testFastAnalyze) TestAnalyzeFastSample(c *C) { Opts: opts, } err = mockExec.TestFastSample() - c.Assert(err, IsNil) - c.Assert(len(mockExec.Collectors), Equals, 3) + require.NoError(t, err) + require.Len(t, mockExec.Collectors, 3) for i := 0; i < 2; i++ { samples := mockExec.Collectors[i].Samples - c.Assert(len(samples), Equals, 20) + require.Len(t, samples, 20) for j := 1; j < 20; j++ { - cmp, err := samples[j].Value.CompareDatum(tk.Se.GetSessionVars().StmtCtx, &samples[j-1].Value) - c.Assert(err, IsNil) - c.Assert(cmp, Greater, 0) + cmp, err := samples[j].Value.Compare(tk.Session().GetSessionVars().StmtCtx, &samples[j-1].Value, collate.GetBinaryCollator()) + require.NoError(t, err) + require.Greater(t, cmp, 0) } } } @@ -380,7 +401,7 @@ func (s *testFastAnalyze) TestAnalyzeFastSample(c *C) { func checkHistogram(sc *stmtctx.StatementContext, hg *statistics.Histogram) (bool, error) { for i := 0; i < len(hg.Buckets); i++ { lower, upper := hg.GetLower(i), hg.GetUpper(i) - cmp, err := upper.CompareDatum(sc, lower) + cmp, err := upper.Compare(sc, lower, collate.GetBinaryCollator()) if cmp < 0 || err != nil { return false, err } @@ -388,7 +409,7 @@ func checkHistogram(sc *stmtctx.StatementContext, hg *statistics.Histogram) (boo continue } previousUpper := hg.GetUpper(i - 1) - cmp, err = lower.CompareDatum(sc, previousUpper) + cmp, err = lower.Compare(sc, previousUpper, collate.GetBinaryCollator()) if cmp <= 0 || err != nil { return false, err } @@ -396,8 +417,8 @@ func checkHistogram(sc *stmtctx.StatementContext, hg *statistics.Histogram) (boo return true, nil } -func (s *testFastAnalyze) TestFastAnalyze(c *C) { - c.Skip("Skip this unstable test(#25782) and bring it back before 2021-07-29.") +func TestFastAnalyze(t *testing.T) { + t.Skip("Skip this unstable test(#25782) and bring it back before 2021-07-29.") var cls testutils.Cluster store, err := mockstore.NewMockStore( mockstore.WithClusterInspector(func(c testutils.Cluster) { @@ -405,20 +426,20 @@ func (s *testFastAnalyze) TestFastAnalyze(c *C) { cls = c }), ) - c.Assert(err, IsNil) + require.NoError(t, err) defer func() { err := store.Close() - c.Assert(err, IsNil) + require.NoError(t, err) }() var dom *domain.Domain session.DisableStats4Test() session.SetSchemaLease(0) dom, err = session.BootstrapSession(store) - c.Assert(err, IsNil) + require.NoError(t, err) dom.SetStatsUpdating(true) defer dom.Close() - tk := testkit.NewTestKit(c, store) - executor.RandSeed = 123 + tk := testkit.NewTestKit(t, store) + atomic.StoreInt64(&executor.RandSeed, 123) tk.MustExec("use test") tk.MustExec("drop table if exists t") @@ -429,7 +450,7 @@ func (s *testFastAnalyze) TestFastAnalyze(c *C) { // Should not panic. tk.MustExec("analyze table t") tblInfo, err := dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) + require.NoError(t, err) tid := tblInfo.Meta().ID // construct 6 regions split by {10, 20, 30, 40, 50} @@ -441,21 +462,21 @@ func (s *testFastAnalyze) TestFastAnalyze(c *C) { } tk.MustExec("analyze table t with 5 buckets, 6 samples") - is := tk.Se.(sessionctx.Context).GetInfoSchema().(infoschema.InfoSchema) + is := tk.Session().(sessionctx.Context).GetInfoSchema().(infoschema.InfoSchema) table, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) + require.NoError(t, err) tableInfo := table.Meta() tbl := dom.StatsHandle().GetTableStats(tableInfo) // TODO(tangenta): add stats_meta.row_count assertion. for _, col := range tbl.Columns { - ok, err := checkHistogram(tk.Se.GetSessionVars().StmtCtx, &col.Histogram) - c.Assert(err, IsNil) - c.Assert(ok, IsTrue) + ok, err := checkHistogram(tk.Session().GetSessionVars().StmtCtx, &col.Histogram) + require.NoError(t, err) + require.True(t, ok) } for _, idx := range tbl.Indices { - ok, err := checkHistogram(tk.Se.GetSessionVars().StmtCtx, &idx.Histogram) - c.Assert(err, IsNil) - c.Assert(ok, IsTrue) + ok, err := checkHistogram(tk.Session().GetSessionVars().StmtCtx, &idx.Histogram) + require.NoError(t, err) + require.True(t, ok) } // Test CM Sketch built from fast analyze. @@ -516,27 +537,11 @@ func (s *testFastAnalyze) TestFastAnalyze(c *C) { */ } -func (s *testSerialSuite2) TestFastAnalyze4GlobalStats(c *C) { - if israce.RaceEnabled { - c.Skip("unstable, skip race test") - } - tk := testkit.NewTestKit(c, s.store) - tk.MustExec(`create database if not exists test_fast_gstats`) - tk.MustExec("use test_fast_gstats") - tk.MustExec("set @@session.tidb_enable_fast_analyze=1") - tk.MustExec("set @@session.tidb_build_stats_concurrency=1") - // test fast analyze in dynamic mode - tk.MustExec("set @@session.tidb_analyze_version = 2;") - tk.MustExec("set @@session.tidb_partition_prune_mode = 'dynamic';") - tk.MustExec("drop table if exists test_fast_gstats;") - tk.MustExec("create table test_fast_gstats(a int, b int) PARTITION BY HASH(a) PARTITIONS 2;") - tk.MustExec("insert into test_fast_gstats values(1,1),(3,3),(4,4),(2,2),(5,5);") - err := tk.ExecToErr("analyze table test_fast_gstats;") - c.Assert(err, ErrorMatches, ".*Fast analyze hasn't reached General Availability and only support analyze version 1 currently.*") -} +func TestIssue15993(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) -func (s *testSuite1) TestIssue15993(c *C) { - tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") tk.MustExec("drop table if exists t0") tk.MustExec("CREATE TABLE t0(c0 INT PRIMARY KEY);") @@ -545,8 +550,11 @@ func (s *testSuite1) TestIssue15993(c *C) { tk.MustExec("ANALYZE TABLE t0 INDEX PRIMARY;") } -func (s *testSuite1) TestIssue15751(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue15751(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec("drop table if exists t0") tk.MustExec("CREATE TABLE t0(c0 INT, c1 INT, PRIMARY KEY(c0, c1))") @@ -556,8 +564,11 @@ func (s *testSuite1) TestIssue15751(c *C) { tk.MustExec("ANALYZE TABLE t0") } -func (s *testSuite1) TestIssue15752(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue15752(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec("drop table if exists t0") tk.MustExec("CREATE TABLE t0(c0 INT)") @@ -568,130 +579,6 @@ func (s *testSuite1) TestIssue15752(c *C) { tk.MustExec("ANALYZE TABLE t0 INDEX i0") } -func (s *testSerialSuite2) TestAnalyzeIndex(c *C) { - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t1") - tk.MustExec("create table t1 (id int, v int, primary key(id), index k(v))") - tk.MustExec("insert into t1(id, v) values(1, 2), (2, 2), (3, 2), (4, 2), (5, 1), (6, 3), (7, 4)") - tk.MustExec("set @@tidb_analyze_version=1") - tk.MustExec("analyze table t1 index k") - c.Assert(len(tk.MustQuery("show stats_buckets where table_name = 't1' and column_name = 'k' and is_index = 1").Rows()), Greater, 0) - tk.MustExec("set @@tidb_analyze_version=default") - tk.MustExec("analyze table t1") - c.Assert(len(tk.MustQuery("show stats_topn where table_name = 't1' and column_name = 'k' and is_index = 1").Rows()), Greater, 0) - - func() { - defer tk.MustExec("set @@session.tidb_enable_fast_analyze=0") - tk.MustExec("drop stats t1") - tk.MustExec("set @@session.tidb_enable_fast_analyze=1") - tk.MustExec("set @@tidb_analyze_version=1") - tk.MustExec("analyze table t1 index k") - c.Assert(len(tk.MustQuery("show stats_buckets where table_name = 't1' and column_name = 'k' and is_index = 1").Rows()), Greater, 1) - }() -} - -func (s *testSerialSuite2) TestAnalyzeIncremental(c *C) { - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("set @@tidb_analyze_version = 1") - tk.Se.GetSessionVars().EnableStreaming = false - s.testAnalyzeIncremental(tk, c) -} - -func (s *testSerialSuite2) TestAnalyzeIncrementalStreaming(c *C) { - c.Skip("unistore hasn't support streaming yet.") - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.Se.GetSessionVars().EnableStreaming = true - s.testAnalyzeIncremental(tk, c) -} - -// nolint:unused -func (s *testSerialSuite2) testAnalyzeIncremental(tk *testkit.TestKit, c *C) { - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a int, b int, primary key(a), index idx(b))") - tk.MustExec("analyze incremental table t index") - tk.MustQuery("show stats_buckets").Check(testkit.Rows()) - tk.MustExec("insert into t values (1,1)") - tk.MustExec("analyze incremental table t index") - tk.MustQuery("show stats_buckets").Check(testkit.Rows("test t a 0 0 1 1 1 1 0", "test t idx 1 0 1 1 1 1 0")) - tk.MustExec("insert into t values (2,2)") - tk.MustExec("analyze incremental table t index") - tk.MustQuery("show stats_buckets").Check(testkit.Rows("test t a 0 0 1 1 1 1 0", "test t a 0 1 2 1 2 2 0", "test t idx 1 0 1 1 1 1 0", "test t idx 1 1 2 1 2 2 0")) - tk.MustExec("analyze incremental table t index") - // Result should not change. - tk.MustQuery("show stats_buckets").Check(testkit.Rows("test t a 0 0 1 1 1 1 0", "test t a 0 1 2 1 2 2 0", "test t idx 1 0 1 1 1 1 0", "test t idx 1 1 2 1 2 2 0")) - - // Test analyze incremental with feedback. - tk.MustExec("insert into t values (3,3)") - oriProbability := statistics.FeedbackProbability.Load() - oriMinLogCount := handle.MinLogScanCount.Load() - defer func() { - statistics.FeedbackProbability.Store(oriProbability) - handle.MinLogScanCount.Store(oriMinLogCount) - }() - statistics.FeedbackProbability.Store(1) - handle.MinLogScanCount.Store(0) - is := s.dom.InfoSchema() - table, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) - tblInfo := table.Meta() - tk.MustQuery("select * from t use index(idx) where b = 3") - tk.MustQuery("select * from t where a > 1") - h := s.dom.StatsHandle() - c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) - c.Assert(h.DumpStatsFeedbackToKV(), IsNil) - c.Assert(h.HandleUpdateStats(is), IsNil) - c.Assert(h.Update(is), IsNil) - c.Assert(h.LoadNeededHistograms(), IsNil) - tk.MustQuery("show stats_buckets").Check(testkit.Rows("test t a 0 0 1 1 1 1 0", "test t a 0 1 3 0 2 2147483647 0", "test t idx 1 0 1 1 1 1 0", "test t idx 1 1 2 1 2 2 0")) - tblStats := h.GetTableStats(tblInfo) - val, err := codec.EncodeKey(tk.Se.GetSessionVars().StmtCtx, nil, types.NewIntDatum(3)) - c.Assert(err, IsNil) - c.Assert(tblStats.Indices[tblInfo.Indices[0].ID].QueryBytes(val), Equals, uint64(1)) - c.Assert(statistics.IsAnalyzed(tblStats.Indices[tblInfo.Indices[0].ID].Flag), IsFalse) - c.Assert(statistics.IsAnalyzed(tblStats.Columns[tblInfo.Columns[0].ID].Flag), IsFalse) - - tk.MustExec("analyze incremental table t index") - c.Assert(h.LoadNeededHistograms(), IsNil) - tk.MustQuery("show stats_buckets").Check(testkit.Rows("test t a 0 0 1 1 1 1 0", "test t a 0 1 2 1 2 2 0", "test t a 0 2 3 1 3 3 0", - "test t idx 1 0 1 1 1 1 0", "test t idx 1 1 2 1 2 2 0", "test t idx 1 2 3 1 3 3 0")) - tblStats = h.GetTableStats(tblInfo) - c.Assert(tblStats.Indices[tblInfo.Indices[0].ID].QueryBytes(val), Equals, uint64(1)) - - // test analyzeIndexIncremental for global-level stats; - tk.MustExec("set @@session.tidb_analyze_version = 1;") - tk.MustQuery("select @@tidb_analyze_version").Check(testkit.Rows("1")) - tk.MustExec("set @@tidb_partition_prune_mode = 'static';") - tk.MustExec("drop table if exists t;") - tk.MustExec(`create table t (a int, b int, primary key(a), index idx(b)) partition by range (a) ( - partition p0 values less than (10), - partition p1 values less than (20), - partition p2 values less than (30) - );`) - tk.MustExec("analyze incremental table t index") - c.Assert(h.LoadNeededHistograms(), IsNil) - tk.MustQuery("show stats_buckets").Check(testkit.Rows()) - tk.MustExec("insert into t values (1,1)") - tk.MustExec("analyze incremental table t index") - tk.MustQuery("show warnings").Check(testkit.Rows()) // no warning - c.Assert(h.LoadNeededHistograms(), IsNil) - tk.MustQuery("show stats_buckets").Check(testkit.Rows("test t p0 a 0 0 1 1 1 1 0", "test t p0 idx 1 0 1 1 1 1 0")) - tk.MustExec("insert into t values (2,2)") - tk.MustExec("analyze incremental table t index") - c.Assert(h.LoadNeededHistograms(), IsNil) - tk.MustQuery("show stats_buckets").Check(testkit.Rows("test t p0 a 0 0 1 1 1 1 0", "test t p0 a 0 1 2 1 2 2 0", "test t p0 idx 1 0 1 1 1 1 0", "test t p0 idx 1 1 2 1 2 2 0")) - tk.MustExec("set @@tidb_partition_prune_mode = 'dynamic';") - tk.MustExec("insert into t values (11,11)") - err = tk.ExecToErr("analyze incremental table t index") - c.Assert(err.Error(), Equals, "[stats]: global statistics for partitioned tables unavailable in ANALYZE INCREMENTAL") -} - -type testFastAnalyze struct { -} - type regionProperityClient struct { tikv.Client mu struct { @@ -715,7 +602,7 @@ func (c *regionProperityClient) SendRequest(ctx context.Context, addr string, re return c.Client.SendRequest(ctx, addr, req, timeout) } -func (s *testFastAnalyze) TestFastAnalyzeRetryRowCount(c *C) { +func TestFastAnalyzeRetryRowCount(t *testing.T) { cli := ®ionProperityClient{} hijackClient := func(c tikv.Client) tikv.Client { cli.Client = c @@ -730,23 +617,23 @@ func (s *testFastAnalyze) TestFastAnalyzeRetryRowCount(c *C) { }), mockstore.WithClientHijacker(hijackClient), ) - c.Assert(err, IsNil) + require.NoError(t, err) defer func() { err := store.Close() - c.Assert(err, IsNil) + require.NoError(t, err) }() dom, err := session.BootstrapSession(store) - c.Assert(err, IsNil) + require.NoError(t, err) defer dom.Close() + tk := testkit.NewTestKit(t, store) - tk := testkit.NewTestKit(c, store) tk.MustExec("use test") tk.MustExec("drop table if exists retry_row_count") tk.MustExec("create table retry_row_count(a int primary key)") tblInfo, err := dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("retry_row_count")) - c.Assert(err, IsNil) + require.NoError(t, err) tid := tblInfo.Meta().ID - c.Assert(dom.StatsHandle().Update(dom.InfoSchema()), IsNil) + require.NoError(t, dom.StatsHandle().Update(dom.InfoSchema())) tk.MustExec("set @@session.tidb_enable_fast_analyze=1") tk.MustExec("set @@session.tidb_build_stats_concurrency=1") tk.MustExec("set @@tidb_analyze_version = 1") @@ -759,26 +646,30 @@ func (s *testFastAnalyze) TestFastAnalyzeRetryRowCount(c *C) { tk.MustQuery("select * from retry_row_count") tk.MustExec("analyze table retry_row_count") row := tk.MustQuery(`show stats_meta where db_name = "test" and table_name = "retry_row_count"`).Rows()[0] - c.Assert(row[5], Equals, "30") + require.Equal(t, "30", row[5]) } -func (s *testSuite10) TestFailedAnalyzeRequest(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestFailedAnalyzeRequest(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int primary key, b int, index index_b(b))") tk.MustExec("set @@tidb_analyze_version = 1") - c.Assert(failpoint.Enable("github.com/pingcap/tidb/executor/buildStatsFromResult", `return(true)`), IsNil) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/buildStatsFromResult", `return(true)`)) _, err := tk.Exec("analyze table t") - c.Assert(err.Error(), Equals, "mock buildStatsFromResult error") - c.Assert(failpoint.Disable("github.com/pingcap/tidb/executor/buildStatsFromResult"), IsNil) + require.Equal(t, "mock buildStatsFromResult error", err.Error()) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/executor/buildStatsFromResult")) } -func (s *testSuite1) TestExtractTopN(c *C) { - if israce.RaceEnabled { - c.Skip("unstable, skip race test") - } - tk := testkit.NewTestKit(c, s.store) +func TestExtractTopN(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + dom, err := session.BootstrapSession(store) + require.NoError(t, err) + tk := testkit.NewTestKit(t, store) tk.MustExec("create database if not exists test_extract_topn") tk.MustExec("use test_extract_topn") tk.MustExec("drop table if exists test_extract_topn") @@ -791,19 +682,19 @@ func (s *testSuite1) TestExtractTopN(c *C) { tk.MustExec(fmt.Sprintf("insert into test_extract_topn values (%d, 0)", i+10)) } tk.MustExec("analyze table test_extract_topn") - is := s.dom.InfoSchema() + is := dom.InfoSchema() table, err := is.TableByName(model.NewCIStr("test_extract_topn"), model.NewCIStr("test_extract_topn")) - c.Assert(err, IsNil) + require.NoError(t, err) tblInfo := table.Meta() - tblStats := s.dom.StatsHandle().GetTableStats(tblInfo) + tblStats := dom.StatsHandle().GetTableStats(tblInfo) colStats := tblStats.Columns[tblInfo.Columns[1].ID] - c.Assert(len(colStats.TopN.TopN), Equals, 10) + require.Len(t, colStats.TopN.TopN, 10) item := colStats.TopN.TopN[0] - c.Assert(item.Count, Equals, uint64(11)) + require.Equal(t, uint64(11), item.Count) idxStats := tblStats.Indices[tblInfo.Indices[0].ID] - c.Assert(len(idxStats.TopN.TopN), Equals, 10) + require.Len(t, idxStats.TopN.TopN, 10) idxItem := idxStats.TopN.TopN[0] - c.Assert(idxItem.Count, Equals, uint64(11)) + require.Equal(t, uint64(11), idxItem.Count) // The columns are: DBName, table name, column name, is index, value, count. tk.MustQuery("show stats_topn where column_name in ('b', 'index_b')").Sort().Check(testkit.Rows("test_extract_topn test_extract_topn b 0 0 11", "test_extract_topn test_extract_topn b 0 1 1", @@ -828,8 +719,13 @@ func (s *testSuite1) TestExtractTopN(c *C) { )) } -func (s *testSuite1) TestHashInTopN(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestHashInTopN(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + dom, err := session.BootstrapSession(store) + require.NoError(t, err) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int, b float, c decimal(30, 10), d varchar(20))") @@ -844,32 +740,35 @@ func (s *testSuite1) TestHashInTopN(c *C) { tk.MustExec("set @@tidb_analyze_version = 1") // get stats of normal analyze tk.MustExec("analyze table t") - is := s.dom.InfoSchema() + is := dom.InfoSchema() tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) + require.NoError(t, err) tblInfo := tbl.Meta() - tblStats1 := s.dom.StatsHandle().GetTableStats(tblInfo).Copy() + tblStats1 := dom.StatsHandle().GetTableStats(tblInfo).Copy() // get stats of fast analyze tk.MustExec("set @@tidb_enable_fast_analyze = 1") tk.MustExec("analyze table t") - tblStats2 := s.dom.StatsHandle().GetTableStats(tblInfo).Copy() + tblStats2 := dom.StatsHandle().GetTableStats(tblInfo).Copy() // check the hash for topn for _, col := range tblInfo.Columns { topn1 := tblStats1.Columns[col.ID].TopN.TopN cm2 := tblStats2.Columns[col.ID].TopN for _, topnMeta := range topn1 { count2, exists := cm2.QueryTopN(topnMeta.Encoded) - c.Assert(exists, Equals, true) - c.Assert(count2, Equals, topnMeta.Count) + require.True(t, exists) + require.Equal(t, topnMeta.Count, count2) } } } -func (s *testSuite1) TestNormalAnalyzeOnCommonHandle(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestNormalAnalyzeOnCommonHandle(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec("drop table if exists t1, t2, t3, t4") - tk.Se.GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeOn + tk.Session().GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeOn tk.MustExec("CREATE TABLE t1 (a int primary key, b int)") tk.MustExec("insert into t1 values(1,1), (2,2), (3,3)") tk.MustExec("CREATE TABLE t2 (a varchar(255) primary key, b int)") @@ -914,9 +813,12 @@ func (s *testSuite1) TestNormalAnalyzeOnCommonHandle(c *C) { "test t3 c 1 2 3 1 3 3 0")) } -func (s *testSuite1) TestDefaultValForAnalyze(c *C) { - c.Skip("skip race test") - tk := testkit.NewTestKit(c, s.store) +func TestDefaultValForAnalyze(t *testing.T) { + t.Skip("skip race test") + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("drop database if exists test_default_val_for_analyze;") tk.MustExec("create database test_default_val_for_analyze;") tk.MustExec("use test_default_val_for_analyze") @@ -949,10 +851,277 @@ func (s *testSuite1) TestDefaultValForAnalyze(c *C) { "└─IndexRangeScan_5 1.00 cop[tikv] table:t, index:a(a) range:[1,1], keep order:false")) } -func (s *testSerialSuite2) TestIssue27429(c *C) { +func TestAnalyzeFullSamplingOnIndexWithVirtualColumnOrPrefixColumn(t *testing.T) { + t.Skip("unstable, skip it and fix it before 20210624") + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists sampling_index_virtual_col") + tk.MustExec("create table sampling_index_virtual_col(a int, b int as (a+1), index idx(b))") + tk.MustExec("insert into sampling_index_virtual_col (a) values (1), (2), (null), (3), (4), (null), (5), (5), (5), (5)") + tk.MustExec("set @@session.tidb_analyze_version = 2") + tk.MustExec("analyze table sampling_index_virtual_col with 1 topn") + tk.MustQuery("show stats_buckets where table_name = 'sampling_index_virtual_col' and column_name = 'idx'").Check(testkit.Rows( + "test sampling_index_virtual_col idx 1 0 1 1 2 2 0", + "test sampling_index_virtual_col idx 1 1 2 1 3 3 0", + "test sampling_index_virtual_col idx 1 2 3 1 4 4 0", + "test sampling_index_virtual_col idx 1 3 4 1 5 5 0")) + tk.MustQuery("show stats_topn where table_name = 'sampling_index_virtual_col' and column_name = 'idx'").Check(testkit.Rows("test sampling_index_virtual_col idx 1 6 4")) + row := tk.MustQuery(`show stats_histograms where db_name = "test" and table_name = "sampling_index_virtual_col"`).Rows()[0] + // The NDV. + require.Equal(t, "5", row[6]) + // The NULLs. + require.Equal(t, "2", row[7]) + tk.MustExec("drop table if exists sampling_index_prefix_col") + tk.MustExec("create table sampling_index_prefix_col(a varchar(3), index idx(a(1)))") + tk.MustExec("insert into sampling_index_prefix_col (a) values ('aa'), ('ab'), ('ac'), ('bb')") + tk.MustExec("analyze table sampling_index_prefix_col with 1 topn") + tk.MustQuery("show stats_buckets where table_name = 'sampling_index_prefix_col' and column_name = 'idx'").Check(testkit.Rows( + "test sampling_index_prefix_col idx 1 0 1 1 b b 0", + )) + tk.MustQuery("show stats_topn where table_name = 'sampling_index_prefix_col' and column_name = 'idx'").Check(testkit.Rows("test sampling_index_prefix_col idx 1 a 3")) +} + +func TestSnapshotAnalyze(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, index index_a(a))") + is := tk.Session().(sessionctx.Context).GetInfoSchema().(infoschema.InfoSchema) + tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + tblInfo := tbl.Meta() + tid := tblInfo.ID + tk.MustExec("insert into t values(1),(1),(1)") + tk.MustExec("begin") + txn, err := tk.Session().Txn(false) + require.NoError(t, err) + startTS1 := txn.StartTS() + tk.MustExec("commit") + tk.MustExec("insert into t values(2),(2),(2)") + tk.MustExec("begin") + txn, err = tk.Session().Txn(false) + require.NoError(t, err) + startTS2 := txn.StartTS() + tk.MustExec("commit") + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/injectAnalyzeSnapshot", fmt.Sprintf("return(%d)", startTS1))) + tk.MustExec("analyze table t") + rows := tk.MustQuery(fmt.Sprintf("select count, snapshot from mysql.stats_meta where table_id = %d", tid)).Rows() + require.Len(t, rows, 1) + require.Equal(t, "3", rows[0][0]) + s1Str := rows[0][1].(string) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/injectAnalyzeSnapshot", fmt.Sprintf("return(%d)", startTS2))) + tk.MustExec("analyze table t") + rows = tk.MustQuery(fmt.Sprintf("select count, snapshot from mysql.stats_meta where table_id = %d", tid)).Rows() + require.Len(t, rows, 1) + require.Equal(t, "6", rows[0][0]) + s2Str := rows[0][1].(string) + require.True(t, s1Str != s2Str) + tk.MustExec("set @@session.tidb_analyze_version = 2") + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/injectAnalyzeSnapshot", fmt.Sprintf("return(%d)", startTS1))) + tk.MustExec("analyze table t") + rows = tk.MustQuery(fmt.Sprintf("select count, snapshot from mysql.stats_meta where table_id = %d", tid)).Rows() + require.Len(t, rows, 1) + require.Equal(t, "6", rows[0][0]) + s3Str := rows[0][1].(string) + require.Equal(t, s2Str, s3Str) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/executor/injectAnalyzeSnapshot")) +} + +func TestAdjustSampleRateNote(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use test") + statsHandle := domain.GetDomain(tk.Session().(sessionctx.Context)).StatsHandle() + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, index index_a(a))") + require.NoError(t, statsHandle.HandleDDLEvent(<-statsHandle.DDLEventCh())) + is := tk.Session().(sessionctx.Context).GetInfoSchema().(infoschema.InfoSchema) + tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + tblInfo := tbl.Meta() + tid := tblInfo.ID + tk.MustExec(fmt.Sprintf("update mysql.stats_meta set count = 220000 where table_id=%d", tid)) + require.NoError(t, statsHandle.Update(is)) + result := tk.MustQuery("show stats_meta where table_name = 't'") + require.Equal(t, "220000", result.Rows()[0][5]) + tk.MustExec("analyze table t") + tk.MustQuery("show warnings").Check(testkit.Rows("Note 1105 Analyze use auto adjusted sample rate 0.500000 for table test.t.")) + tk.MustExec("insert into t values(1),(1),(1)") + require.NoError(t, statsHandle.DumpStatsDeltaToKV(handle.DumpAll)) + require.NoError(t, statsHandle.Update(is)) + result = tk.MustQuery("show stats_meta where table_name = 't'") + require.Equal(t, "3", result.Rows()[0][5]) + tk.MustExec("analyze table t") + tk.MustQuery("show warnings").Check(testkit.Rows("Note 1105 Analyze use auto adjusted sample rate 1.000000 for table test.t.")) +} + +func TestFastAnalyze4GlobalStats(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec(`create database if not exists test_fast_gstats`) + tk.MustExec("use test_fast_gstats") + tk.MustExec("set @@session.tidb_enable_fast_analyze=1") + tk.MustExec("set @@session.tidb_build_stats_concurrency=1") + // test fast analyze in dynamic mode + tk.MustExec("set @@session.tidb_analyze_version = 2;") + tk.MustExec("set @@session.tidb_partition_prune_mode = 'dynamic';") + tk.MustExec("drop table if exists test_fast_gstats;") + tk.MustExec("create table test_fast_gstats(a int, b int) PARTITION BY HASH(a) PARTITIONS 2;") + tk.MustExec("insert into test_fast_gstats values(1,1),(3,3),(4,4),(2,2),(5,5);") + err := tk.ExecToErr("analyze table test_fast_gstats;") + require.EqualError(t, err, "Fast analyze hasn't reached General Availability and only support analyze version 1 currently.") +} + +func TestAnalyzeIndex(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1 (id int, v int, primary key(id), index k(v))") + tk.MustExec("insert into t1(id, v) values(1, 2), (2, 2), (3, 2), (4, 2), (5, 1), (6, 3), (7, 4)") + tk.MustExec("set @@tidb_analyze_version=1") + tk.MustExec("analyze table t1 index k") + require.Greater(t, len(tk.MustQuery("show stats_buckets where table_name = 't1' and column_name = 'k' and is_index = 1").Rows()), 0) + tk.MustExec("set @@tidb_analyze_version=default") + tk.MustExec("analyze table t1") + require.Greater(t, len(tk.MustQuery("show stats_topn where table_name = 't1' and column_name = 'k' and is_index = 1").Rows()), 0) + + func() { + defer tk.MustExec("set @@session.tidb_enable_fast_analyze=0") + tk.MustExec("drop stats t1") + tk.MustExec("set @@session.tidb_enable_fast_analyze=1") + tk.MustExec("set @@tidb_analyze_version=1") + tk.MustExec("analyze table t1 index k") + require.Greater(t, len(tk.MustQuery("show stats_buckets where table_name = 't1' and column_name = 'k' and is_index = 1").Rows()), 1) + }() +} + +func TestAnalyzeIncremental(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + dom, err := session.BootstrapSession(store) + require.NoError(t, err) + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("set @@tidb_analyze_version = 1") + tk.Session().GetSessionVars().EnableStreaming = false + testAnalyzeIncremental(tk, t, dom) +} + +func TestAnalyzeIncrementalStreaming(t *testing.T) { + t.Skip("unistore hasn't support streaming yet.") + store, clean := testkit.CreateMockStore(t) + dom, err := session.BootstrapSession(store) + require.NoError(t, err) + + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.Session().GetSessionVars().EnableStreaming = true + testAnalyzeIncremental(tk, t, dom) +} + +func testAnalyzeIncremental(tk *testkit.TestKit, t *testing.T, dom *domain.Domain) { + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int, primary key(a), index idx(b))") + tk.MustExec("analyze incremental table t index") + tk.MustQuery("show stats_buckets").Check(testkit.Rows()) + tk.MustExec("insert into t values (1,1)") + tk.MustExec("analyze incremental table t index") + tk.MustQuery("show stats_buckets").Check(testkit.Rows("test t a 0 0 1 1 1 1 0", "test t idx 1 0 1 1 1 1 0")) + tk.MustExec("insert into t values (2,2)") + tk.MustExec("analyze incremental table t index") + tk.MustQuery("show stats_buckets").Check(testkit.Rows("test t a 0 0 1 1 1 1 0", "test t a 0 1 2 1 2 2 0", "test t idx 1 0 1 1 1 1 0", "test t idx 1 1 2 1 2 2 0")) + tk.MustExec("analyze incremental table t index") + // Result should not change. + tk.MustQuery("show stats_buckets").Check(testkit.Rows("test t a 0 0 1 1 1 1 0", "test t a 0 1 2 1 2 2 0", "test t idx 1 0 1 1 1 1 0", "test t idx 1 1 2 1 2 2 0")) + + // Test analyze incremental with feedback. + tk.MustExec("insert into t values (3,3)") + oriProbability := statistics.FeedbackProbability.Load() + oriMinLogCount := handle.MinLogScanCount.Load() + defer func() { + statistics.FeedbackProbability.Store(oriProbability) + handle.MinLogScanCount.Store(oriMinLogCount) + }() + statistics.FeedbackProbability.Store(1) + handle.MinLogScanCount.Store(0) + is := dom.InfoSchema() + table, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + tblInfo := table.Meta() + tk.MustQuery("select * from t use index(idx) where b = 3") + tk.MustQuery("select * from t where a > 1") + h := dom.StatsHandle() + require.NoError(t, h.DumpStatsDeltaToKV(handle.DumpAll)) + require.NoError(t, h.DumpStatsFeedbackToKV()) + require.NoError(t, h.HandleUpdateStats(is)) + require.NoError(t, h.Update(is)) + require.NoError(t, h.LoadNeededHistograms()) + tk.MustQuery("show stats_buckets").Check(testkit.Rows("test t a 0 0 1 1 1 1 0", "test t a 0 1 3 0 2 2147483647 0", "test t idx 1 0 1 1 1 1 0", "test t idx 1 1 2 1 2 2 0")) + tblStats := h.GetTableStats(tblInfo) + val, err := codec.EncodeKey(tk.Session().GetSessionVars().StmtCtx, nil, types.NewIntDatum(3)) + require.NoError(t, err) + require.Equal(t, uint64(1), tblStats.Indices[tblInfo.Indices[0].ID].QueryBytes(val)) + require.False(t, statistics.IsAnalyzed(tblStats.Indices[tblInfo.Indices[0].ID].Flag)) + require.False(t, statistics.IsAnalyzed(tblStats.Columns[tblInfo.Columns[0].ID].Flag)) + + tk.MustExec("analyze incremental table t index") + require.NoError(t, h.LoadNeededHistograms()) + tk.MustQuery("show stats_buckets").Check(testkit.Rows("test t a 0 0 1 1 1 1 0", "test t a 0 1 2 1 2 2 0", "test t a 0 2 3 1 3 3 0", + "test t idx 1 0 1 1 1 1 0", "test t idx 1 1 2 1 2 2 0", "test t idx 1 2 3 1 3 3 0")) + tblStats = h.GetTableStats(tblInfo) + require.Equal(t, uint64(1), tblStats.Indices[tblInfo.Indices[0].ID].QueryBytes(val)) + + // test analyzeIndexIncremental for global-level stats; + tk.MustExec("set @@session.tidb_analyze_version = 1;") + tk.MustQuery("select @@tidb_analyze_version").Check(testkit.Rows("1")) + tk.MustExec("set @@tidb_partition_prune_mode = 'static';") + tk.MustExec("drop table if exists t;") + tk.MustExec(`create table t (a int, b int, primary key(a), index idx(b)) partition by range (a) ( + partition p0 values less than (10), + partition p1 values less than (20), + partition p2 values less than (30) + );`) + tk.MustExec("analyze incremental table t index") + require.NoError(t, h.LoadNeededHistograms()) + tk.MustQuery("show stats_buckets").Check(testkit.Rows()) + tk.MustExec("insert into t values (1,1)") + tk.MustExec("analyze incremental table t index") + tk.MustQuery("show warnings").Check(testkit.Rows()) // no warning + require.NoError(t, h.LoadNeededHistograms()) + tk.MustQuery("show stats_buckets").Check(testkit.Rows("test t p0 a 0 0 1 1 1 1 0", "test t p0 idx 1 0 1 1 1 1 0")) + tk.MustExec("insert into t values (2,2)") + tk.MustExec("analyze incremental table t index") + require.NoError(t, h.LoadNeededHistograms()) + tk.MustQuery("show stats_buckets").Check(testkit.Rows("test t p0 a 0 0 1 1 1 1 0", "test t p0 a 0 1 2 1 2 2 0", "test t p0 idx 1 0 1 1 1 1 0", "test t p0 idx 1 1 2 1 2 2 0")) + tk.MustExec("set @@tidb_partition_prune_mode = 'dynamic';") + tk.MustExec("insert into t values (11,11)") + err = tk.ExecToErr("analyze incremental table t index") + require.Equal(t, "[stats]: global statistics for partitioned tables unavailable in ANALYZE INCREMENTAL", err.Error()) +} + +func TestIssue27429(t *testing.T) { collate.SetNewCollationEnabledForTest(true) defer collate.SetNewCollationEnabledForTest(false) - tk := testkit.NewTestKit(c, s.store) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table test.t(id int, value varchar(20) charset utf8mb4 collate utf8mb4_general_ci, value1 varchar(20) charset utf8mb4 collate utf8mb4_bin)") @@ -962,10 +1131,13 @@ func (s *testSerialSuite2) TestIssue27429(c *C) { tk.MustQuery("select upper(group_concat(distinct value)) from test.t;").Check(testkit.Rows("ABC,DEF")) } -func (s *testSerialSuite2) TestIssue20874(c *C) { +func TestIssue20874(t *testing.T) { collate.SetNewCollationEnabledForTest(true) defer collate.SetNewCollationEnabledForTest(false) - tk := testkit.NewTestKit(c, s.store) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("delete from mysql.stats_histograms") @@ -1013,8 +1185,11 @@ func (s *testSerialSuite2) TestIssue20874(c *C) { )) } -func (s *testSerialSuite2) TestAnalyzeClusteredIndexPrimary(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestAnalyzeClusteredIndexPrimary(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t0") tk.MustExec("drop table if exists t1") @@ -1038,97 +1213,23 @@ func (s *testSerialSuite2) TestAnalyzeClusteredIndexPrimary(c *C) { "test t1 a 0 1111 1")) } -func (s *testSuite1) TestAnalyzeFullSamplingOnIndexWithVirtualColumnOrPrefixColumn(c *C) { - c.Skip("unstable, skip it and fix it before 20210624") - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists sampling_index_virtual_col") - tk.MustExec("create table sampling_index_virtual_col(a int, b int as (a+1), index idx(b))") - tk.MustExec("insert into sampling_index_virtual_col (a) values (1), (2), (null), (3), (4), (null), (5), (5), (5), (5)") - tk.MustExec("set @@session.tidb_analyze_version = 2") - tk.MustExec("analyze table sampling_index_virtual_col with 1 topn") - tk.MustQuery("show stats_buckets where table_name = 'sampling_index_virtual_col' and column_name = 'idx'").Check(testkit.Rows( - "test sampling_index_virtual_col idx 1 0 1 1 2 2 0", - "test sampling_index_virtual_col idx 1 1 2 1 3 3 0", - "test sampling_index_virtual_col idx 1 2 3 1 4 4 0", - "test sampling_index_virtual_col idx 1 3 4 1 5 5 0")) - tk.MustQuery("show stats_topn where table_name = 'sampling_index_virtual_col' and column_name = 'idx'").Check(testkit.Rows("test sampling_index_virtual_col idx 1 6 4")) - row := tk.MustQuery(`show stats_histograms where db_name = "test" and table_name = "sampling_index_virtual_col"`).Rows()[0] - // The NDV. - c.Assert(row[6], Equals, "5") - // The NULLs. - c.Assert(row[7], Equals, "2") - tk.MustExec("drop table if exists sampling_index_prefix_col") - tk.MustExec("create table sampling_index_prefix_col(a varchar(3), index idx(a(1)))") - tk.MustExec("insert into sampling_index_prefix_col (a) values ('aa'), ('ab'), ('ac'), ('bb')") - tk.MustExec("analyze table sampling_index_prefix_col with 1 topn") - tk.MustQuery("show stats_buckets where table_name = 'sampling_index_prefix_col' and column_name = 'idx'").Check(testkit.Rows( - "test sampling_index_prefix_col idx 1 0 1 1 b b 0", - )) - tk.MustQuery("show stats_topn where table_name = 'sampling_index_prefix_col' and column_name = 'idx'").Check(testkit.Rows("test sampling_index_prefix_col idx 1 a 3")) -} +func TestAnalyzeSamplingWorkPanic(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() -func (s *testSerialSuite2) TestAnalyzeSamplingWorkPanic(c *C) { - tk := testkit.NewTestKit(c, s.store) + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("set @@session.tidb_analyze_version = 2") tk.MustExec("create table t(a int)") tk.MustExec("insert into t values(1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12)") tk.MustExec("split table t between (-9223372036854775808) and (9223372036854775807) regions 12") - c.Assert(failpoint.Enable("github.com/pingcap/tidb/executor/mockAnalyzeSamplingBuildWorkerPanic", "return(1)"), IsNil) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/mockAnalyzeSamplingBuildWorkerPanic", "return(1)")) err := tk.ExecToErr("analyze table t") - c.Assert(err, NotNil) - c.Assert(failpoint.Disable("github.com/pingcap/tidb/executor/mockAnalyzeSamplingBuildWorkerPanic"), IsNil) - - c.Assert(failpoint.Enable("github.com/pingcap/tidb/executor/mockAnalyzeSamplingMergeWorkerPanic", "return(1)"), IsNil) + require.NotNil(t, err) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/executor/mockAnalyzeSamplingBuildWorkerPanic")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/mockAnalyzeSamplingMergeWorkerPanic", "return(1)")) err = tk.ExecToErr("analyze table t") - c.Assert(err, NotNil) - c.Assert(failpoint.Disable("github.com/pingcap/tidb/executor/mockAnalyzeSamplingMergeWorkerPanic"), IsNil) -} - -func (s *testSuite10) TestSnapshotAnalyze(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 int, index index_a(a))") - is := tk.Se.(sessionctx.Context).GetInfoSchema().(infoschema.InfoSchema) - tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) - tblInfo := tbl.Meta() - tid := tblInfo.ID - tk.MustExec("insert into t values(1),(1),(1)") - tk.MustExec("begin") - txn, err := tk.Se.Txn(false) - c.Assert(err, IsNil) - startTS1 := txn.StartTS() - tk.MustExec("commit") - tk.MustExec("insert into t values(2),(2),(2)") - tk.MustExec("begin") - txn, err = tk.Se.Txn(false) - c.Assert(err, IsNil) - startTS2 := txn.StartTS() - tk.MustExec("commit") - c.Assert(failpoint.Enable("github.com/pingcap/tidb/executor/injectAnalyzeSnapshot", fmt.Sprintf("return(%d)", startTS1)), IsNil) - tk.MustExec("analyze table t") - rows := tk.MustQuery(fmt.Sprintf("select count, snapshot from mysql.stats_meta where table_id = %d", tid)).Rows() - c.Assert(len(rows), Equals, 1) - c.Assert(rows[0][0], Equals, "3") - s1Str := rows[0][1].(string) - c.Assert(failpoint.Enable("github.com/pingcap/tidb/executor/injectAnalyzeSnapshot", fmt.Sprintf("return(%d)", startTS2)), IsNil) - tk.MustExec("analyze table t") - rows = tk.MustQuery(fmt.Sprintf("select count, snapshot from mysql.stats_meta where table_id = %d", tid)).Rows() - c.Assert(len(rows), Equals, 1) - c.Assert(rows[0][0], Equals, "6") - s2Str := rows[0][1].(string) - c.Assert(s1Str != s2Str, IsTrue) - tk.MustExec("set @@session.tidb_analyze_version = 2") - c.Assert(failpoint.Enable("github.com/pingcap/tidb/executor/injectAnalyzeSnapshot", fmt.Sprintf("return(%d)", startTS1)), IsNil) - tk.MustExec("analyze table t") - rows = tk.MustQuery(fmt.Sprintf("select count, snapshot from mysql.stats_meta where table_id = %d", tid)).Rows() - c.Assert(len(rows), Equals, 1) - c.Assert(rows[0][0], Equals, "6") - s3Str := rows[0][1].(string) - c.Assert(s3Str, Equals, s2Str) - c.Assert(failpoint.Disable("github.com/pingcap/tidb/executor/injectAnalyzeSnapshot"), IsNil) + require.NotNil(t, err) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/executor/mockAnalyzeSamplingMergeWorkerPanic")) } diff --git a/executor/apply_cache_test.go b/executor/apply_cache_test.go index 9cbb20f0f2b01..35ba3604d5b37 100644 --- a/executor/apply_cache_test.go +++ b/executor/apply_cache_test.go @@ -17,24 +17,20 @@ package executor import ( "strconv" "strings" + "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/mock" + "github.com/stretchr/testify/require" ) -var _ = SerialSuites(&testApplyCacheSuite{}) - -type testApplyCacheSuite struct { -} - -func (s *testApplyCacheSuite) TestApplyCache(c *C) { +func TestApplyCache(t *testing.T) { ctx := mock.NewContext() ctx.GetSessionVars().MemQuotaApplyCache = 100 applyCache, err := newApplyCache(ctx) - c.Assert(err, IsNil) + require.NoError(t, err) fields := []*types.FieldType{types.NewFieldType(mysql.TypeLonglong)} value := make([]*chunk.List, 3) @@ -48,36 +44,36 @@ func (s *testApplyCacheSuite) TestApplyCache(c *C) { key[i] = []byte(strings.Repeat(strconv.Itoa(i), 100)) // TODO: *chunk.List.GetMemTracker().BytesConsumed() is not accurate, fix it later. - c.Assert(applyCacheKVMem(key[i], value[i]), Equals, int64(100)) + require.Equal(t, int64(100), applyCacheKVMem(key[i], value[i])) } ok, err := applyCache.Set(key[0], value[0]) - c.Assert(err, IsNil) - c.Assert(ok, Equals, true) + require.NoError(t, err) + require.True(t, ok) result, err := applyCache.Get(key[0]) - c.Assert(err, IsNil) - c.Assert(result, NotNil) + require.NoError(t, err) + require.NotNil(t, result) ok, err = applyCache.Set(key[1], value[1]) - c.Assert(err, IsNil) - c.Assert(ok, Equals, true) + require.NoError(t, err) + require.True(t, ok) result, err = applyCache.Get(key[1]) - c.Assert(err, IsNil) - c.Assert(result, NotNil) + require.NoError(t, err) + require.NotNil(t, result) ok, err = applyCache.Set(key[2], value[2]) - c.Assert(err, IsNil) - c.Assert(ok, Equals, true) + require.NoError(t, err) + require.True(t, ok) result, err = applyCache.Get(key[2]) - c.Assert(err, IsNil) - c.Assert(result, NotNil) + require.NoError(t, err) + require.NotNil(t, result) // Both key[0] and key[1] are not in the cache result, err = applyCache.Get(key[0]) - c.Assert(err, IsNil) - c.Assert(result, IsNil) + require.NoError(t, err) + require.Nil(t, result) result, err = applyCache.Get(key[1]) - c.Assert(err, IsNil) - c.Assert(result, IsNil) + require.NoError(t, err) + require.Nil(t, result) } diff --git a/executor/batch_point_get.go b/executor/batch_point_get.go index 01efdf1097349..c30bf507d6d9d 100644 --- a/executor/batch_point_get.go +++ b/executor/batch_point_get.go @@ -78,8 +78,9 @@ type BatchPointGetExec struct { // virtualColumnRetFieldTypes records the RetFieldTypes of virtual columns. virtualColumnRetFieldTypes []*types.FieldType - snapshot kv.Snapshot - stats *runtimeStatsWithSnapshot + snapshot kv.Snapshot + stats *runtimeStatsWithSnapshot + cacheTable kv.MemBuffer } // buildVirtualColumnInfo saves virtual column indices and sort them in definition order @@ -115,6 +116,9 @@ func (e *BatchPointGetExec) Open(context.Context) error { } else { snapshot = e.ctx.GetSnapshotWithTS(e.snapshotTS) } + if e.cacheTable != nil { + snapshot = cacheTableSnapshot{snapshot, e.cacheTable} + } if e.runtimeStats != nil { snapshotStats := &txnsnapshot.SnapshotRuntimeStats{} e.stats = &runtimeStatsWithSnapshot{ @@ -145,7 +149,7 @@ func (e *BatchPointGetExec) Open(context.Context) error { }, }) } - setResourceGroupTagForTxn(stmtCtx, snapshot) + setResourceGroupTaggerForTxn(stmtCtx, snapshot) var batchGetter kv.BatchGetter = snapshot if txn.Valid() { lock := e.tblInfo.Lock @@ -162,6 +166,48 @@ func (e *BatchPointGetExec) Open(context.Context) error { return nil } +// CacheTable always use memBuffer in session as snapshot. +// cacheTableSnapshot inherits kv.Snapshot and override the BatchGet methods and Get methods. +type cacheTableSnapshot struct { + kv.Snapshot + memBuffer kv.MemBuffer +} + +func (s cacheTableSnapshot) BatchGet(ctx context.Context, keys []kv.Key) (map[string][]byte, error) { + values := make(map[string][]byte) + if s.memBuffer == nil { + return values, nil + } + + for _, key := range keys { + val, err := s.memBuffer.Get(ctx, key) + if kv.ErrNotExist.Equal(err) { + continue + } + + if err != nil { + return nil, err + } + + if len(val) == 0 { + continue + } + + values[string(key)] = val + } + + return values, nil +} + +func (s cacheTableSnapshot) Get(ctx context.Context, key kv.Key) ([]byte, error) { + return s.memBuffer.Get(ctx, key) +} + +// MockNewCacheTableSnapShot only serves for test. +func MockNewCacheTableSnapShot(snapshot kv.Snapshot, memBuffer kv.MemBuffer) *cacheTableSnapshot { + return &cacheTableSnapshot{snapshot, memBuffer} +} + // Close implements the Executor interface. func (e *BatchPointGetExec) Close() error { if e.runtimeStats != nil && e.snapshot != nil { diff --git a/executor/batch_point_get_test.go b/executor/batch_point_get_test.go index 81d20849793f5..44809a9211f90 100644 --- a/executor/batch_point_get_test.go +++ b/executor/batch_point_get_test.go @@ -1,4 +1,4 @@ -// Copyright 2019 PingCAP, Inc. +// Copyright 2021 PingCAP, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -15,56 +15,26 @@ package executor_test import ( + "context" "fmt" "sync" + "testing" "time" - . "github.com/pingcap/check" - "github.com/pingcap/errors" "github.com/pingcap/failpoint" - "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/executor" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/store/mockstore" - "github.com/pingcap/tidb/util/testkit" + "github.com/pingcap/tidb/testkit" + "github.com/stretchr/testify/require" + "github.com/tikv/client-go/v2/tikv" ) -type testBatchPointGetSuite struct { - store kv.Storage - dom *domain.Domain -} - -func newStoreWithBootstrap() (kv.Storage, *domain.Domain, error) { - store, err := mockstore.NewMockStore() - if err != nil { - return nil, nil, errors.Trace(err) - } - - session.SetSchemaLease(0) - session.DisableStats4Test() - - dom, err := session.BootstrapSession(store) - if err != nil { - return nil, nil, err - } - return store, dom, errors.Trace(err) -} - -func (s *testBatchPointGetSuite) SetUpSuite(c *C) { - store, dom, err := newStoreWithBootstrap() - c.Assert(err, IsNil) - s.store = store - s.dom = dom -} +func TestBatchPointGetExec(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() -func (s *testBatchPointGetSuite) TearDownSuite(c *C) { - s.dom.Close() - s.store.Close() -} - -func (s *testBatchPointGetSuite) TestBatchPointGetExec(c *C) { - tk := testkit.NewTestKit(c, s.store) + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int primary key auto_increment not null, b int, c int, unique key idx_abc(a, b, c))") @@ -108,8 +78,11 @@ func (s *testBatchPointGetSuite) TestBatchPointGetExec(c *C) { )) } -func (s *testBatchPointGetSuite) TestBatchPointGetInTxn(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestBatchPointGetInTxn(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t (id int primary key auto_increment, name varchar(30))") @@ -135,8 +108,11 @@ func (s *testBatchPointGetSuite) TestBatchPointGetInTxn(c *C) { tk.MustExec("rollback") } -func (s *testBatchPointGetSuite) TestBatchPointGetCache(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestBatchPointGetCache(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("create table customers (id int primary key, token varchar(255) unique)") tk.MustExec("INSERT INTO test.customers (id, token) VALUES (28, '07j')") @@ -146,8 +122,11 @@ func (s *testBatchPointGetSuite) TestBatchPointGetCache(c *C) { tk.MustQuery("SELECT id, token FROM test.customers WHERE id IN (28, 29);").Check(testkit.Rows("28 07j", "29 03j")) } -func (s *testBatchPointGetSuite) TestIssue18843(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue18843(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("create table t18843 ( id bigint(10) primary key, f varchar(191) default null, unique key `idx_f` (`f`))") tk.MustExec("insert into t18843 values (1, '')") @@ -158,8 +137,11 @@ func (s *testBatchPointGetSuite) TestIssue18843(c *C) { tk.MustQuery("select * from t18843 where f is null").Check(testkit.Rows("2 <nil>")) } -func (s *testBatchPointGetSuite) TestIssue24562(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue24562(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists ttt") tk.MustExec("create table ttt(a enum(\"a\",\"b\",\"c\",\"d\"), primary key(a));") @@ -168,8 +150,11 @@ func (s *testBatchPointGetSuite) TestIssue24562(c *C) { tk.MustQuery("select * from ttt where ttt.a in (1,\"b\")").Check(testkit.Rows("a")) } -func (s *testBatchPointGetSuite) TestBatchPointGetUnsignedHandleWithSort(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestBatchPointGetUnsignedHandleWithSort(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t2") tk.MustExec("create table t2 (id bigint(20) unsigned, primary key(id))") @@ -180,17 +165,19 @@ func (s *testBatchPointGetSuite) TestBatchPointGetUnsignedHandleWithSort(c *C) { tk.MustQuery("select id from t2 where id in (8738875760185212610, 1, 9814441339970117597) order by id desc").Check(testkit.Rows("9814441339970117597", "8738875760185212610", "1")) } -func (s *testBatchPointGetSuite) TestBatchPointGetLockExistKey(c *C) { +func TestBatchPointGetLockExistKey(t *testing.T) { var wg sync.WaitGroup errCh := make(chan error) + store, clean := testkit.CreateMockStore(t) + defer clean() testLock := func(rc bool, key string, tableName string) { doneCh := make(chan struct{}, 1) - tk1, tk2 := testkit.NewTestKit(c, s.store), testkit.NewTestKit(c, s.store) + tk1, tk2 := testkit.NewTestKit(t, store), testkit.NewTestKit(t, store) errCh <- tk1.ExecToErr("use test") errCh <- tk2.ExecToErr("use test") - tk1.Se.GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeIntOnly + tk1.Session().GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeIntOnly errCh <- tk1.ExecToErr(fmt.Sprintf("drop table if exists %s", tableName)) errCh <- tk1.ExecToErr(fmt.Sprintf("create table %s(id int, v int, k int, %s key0(id, v))", tableName, key)) @@ -304,7 +291,7 @@ func (s *testBatchPointGetSuite) TestBatchPointGetLockExistKey(c *C) { } // should works for common handle in clustered index - tk := testkit.NewTestKit(c, s.store) + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t(id varchar(40) primary key)") @@ -319,12 +306,59 @@ func (s *testBatchPointGetSuite) TestBatchPointGetLockExistKey(c *C) { close(errCh) }() for err := range errCh { - c.Assert(err, IsNil) + require.NoError(t, err) } } -func (s *testBatchPointGetSuite) TestPointGetForTemporaryTable(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestBatchPointGetIssue25167(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int primary key)") + defer func() { + tk.MustExec("drop table if exists t") + }() + time.Sleep(50 * time.Millisecond) + tk.MustExec("set @a=(select current_timestamp(3))") + tk.MustExec("insert into t values (1)") + tk.MustQuery("select * from t as of timestamp @a where a in (1,2,3)").Check(testkit.Rows()) +} + +func TestCacheSnapShot(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + se := tk.Session() + ctx := context.Background() + txn, err := se.GetStore().Begin(tikv.WithStartTS(0)) + memBuffer := txn.GetMemBuffer() + require.NoError(t, err) + var keys []kv.Key + for i := 0; i < 2; i++ { + keys = append(keys, []byte(string(rune(i)))) + } + err = memBuffer.Set(keys[0], []byte("1111")) + require.NoError(t, err) + err = memBuffer.Set(keys[1], []byte("2222")) + require.NoError(t, err) + cacheTableSnapShot := executor.MockNewCacheTableSnapShot(nil, memBuffer) + get, err := cacheTableSnapShot.Get(ctx, keys[0]) + require.NoError(t, err) + require.Equal(t, get, []byte("1111")) + batchGet, err := cacheTableSnapShot.BatchGet(ctx, keys) + require.NoError(t, err) + require.Equal(t, batchGet[string(keys[0])], []byte("1111")) + require.Equal(t, batchGet[string(keys[1])], []byte("2222")) +} + +func TestPointGetForTemporaryTable(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create global temporary table t1 (id int primary key, val int) on commit delete rows") @@ -333,9 +367,9 @@ func (s *testBatchPointGetSuite) TestPointGetForTemporaryTable(c *C) { tk.MustQuery("explain format = 'brief' select * from t1 where id in (1, 2, 3)"). Check(testkit.Rows("Batch_Point_Get 3.00 root table:t1 handle:[1 2 3], keep order:false, desc:false")) - c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/mockstore/unistore/rpcServerBusy", "return(true)"), IsNil) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/store/mockstore/unistore/rpcServerBusy", "return(true)")) defer func() { - c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/mockstore/unistore/rpcServerBusy"), IsNil) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/store/mockstore/unistore/rpcServerBusy")) }() // Batch point get. @@ -346,17 +380,3 @@ func (s *testBatchPointGetSuite) TestPointGetForTemporaryTable(c *C) { tk.MustQuery("select * from t1 where id = 1").Check(testkit.Rows("1 1")) tk.MustQuery("select * from t1 where id = 2").Check(testkit.Rows()) } - -func (s *testBatchPointGetSuite) TestBatchPointGetIssue25167(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 int primary key)") - defer func() { - tk.MustExec("drop table if exists t") - }() - time.Sleep(50 * time.Millisecond) - tk.MustExec("set @a=(select current_timestamp(3))") - tk.MustExec("insert into t values (1)") - tk.MustQuery("select * from t as of timestamp @a where a in (1,2,3)").Check(testkit.Rows()) -} diff --git a/executor/brie.go b/executor/brie.go index cb84745f17a2a..9be7349c494a8 100644 --- a/executor/brie.go +++ b/executor/brie.go @@ -23,6 +23,8 @@ import ( "time" "github.com/pingcap/errors" + backuppb "github.com/pingcap/kvproto/pkg/brpb" + "github.com/pingcap/kvproto/pkg/encryptionpb" filter "github.com/pingcap/tidb-tools/pkg/table-filter" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/model" @@ -43,6 +45,7 @@ import ( "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/printer" + "github.com/pingcap/tidb/util/sem" "github.com/pingcap/tidb/util/sqlexec" "github.com/tikv/client-go/v2/oracle" ) @@ -205,11 +208,6 @@ func (b *executorBuilder) buildBRIE(s *ast.BRIEStmt, schema *expression.Schema) } tidbCfg := config.GetGlobalConfig() - if tidbCfg.Store != "tikv" { - b.err = errors.Errorf("%s requires tikv store, not %s", s.Kind, tidbCfg.Store) - return nil - } - cfg := task.Config{ TLS: task.TLSConfig{ CA: tidbCfg.Security.ClusterSSLCA, @@ -221,6 +219,9 @@ func (b *executorBuilder) buildBRIE(s *ast.BRIEStmt, schema *expression.Schema) Checksum: true, SendCreds: true, LogProgress: true, + CipherInfo: backuppb.CipherInfo{ + CipherType: encryptionpb.EncryptionMethod_PLAINTEXT, + }, } storageURL, err := url.Parse(s.Storage) @@ -234,10 +235,27 @@ func (b *executorBuilder) buildBRIE(s *ast.BRIEStmt, schema *expression.Schema) storage.ExtractQueryParameters(storageURL, &cfg.S3) case "gs", "gcs": storage.ExtractQueryParameters(storageURL, &cfg.GCS) + case "hdfs": + if sem.IsEnabled() { + // Storage is not permitted to be hdfs when SEM is enabled. + b.err = ErrNotSupportedWithSem.GenWithStackByArgs("hdfs storage") + return nil + } + case "local", "file", "": + if sem.IsEnabled() { + // Storage is not permitted to be local when SEM is enabled. + b.err = ErrNotSupportedWithSem.GenWithStackByArgs("local storage") + return nil + } default: break } + if tidbCfg.Store != "tikv" { + b.err = errors.Errorf("%s requires tikv store, not %s", s.Kind, tidbCfg.Store) + return nil + } + cfg.Storage = storageURL.String() e.info.storage = cfg.Storage @@ -452,6 +470,12 @@ func (gs *tidbGlueSession) Execute(ctx context.Context, sql string) error { return err } +func (gs *tidbGlueSession) ExecuteInternal(ctx context.Context, sql string, args ...interface{}) error { + exec := gs.se.(sqlexec.SQLExecutor) + _, err := exec.ExecuteInternal(ctx, sql, args...) + return err +} + // CreateDatabase implements glue.Session func (gs *tidbGlueSession) CreateDatabase(ctx context.Context, schema *model.DBInfo) error { d := domain.GetDomain(gs.se).DDL() diff --git a/executor/brie_test.go b/executor/brie_test.go index 12b61b0e51146..b4eca0564da45 100644 --- a/executor/brie_test.go +++ b/executor/brie_test.go @@ -18,32 +18,28 @@ import ( "context" "fmt" "strings" - gotime "time" + "testing" + "time" "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/planner/core" - "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util" - "github.com/pingcap/tidb/util/mock" - - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/auth" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/planner/core" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util" + "github.com/pingcap/tidb/util/mock" + "github.com/stretchr/testify/require" ) -type testBRIESuite struct{} - -var _ = Suite(&testBRIESuite{}) - -func (s *testBRIESuite) TestGlueGetVersion(c *C) { +func TestGlueGetVersion(t *testing.T) { g := tidbGlueSession{} version := g.GetVersion() - c.Assert(version, Matches, `(.|\n)*Release Version(.|\n)*`) - c.Assert(version, Matches, `(.|\n)*Git Commit Hash(.|\n)*`) - c.Assert(version, Matches, `(.|\n)*GoVersion(.|\n)*`) + require.Contains(t, version, `Release Version`) + require.Contains(t, version, `Git Commit Hash`) + require.Contains(t, version, `GoVersion`) } func brieTaskInfoToResult(info *brieTaskInfo) string { @@ -63,13 +59,13 @@ func brieTaskInfoToResult(info *brieTaskInfo) string { return strings.Join(arr, ", ") + "\n" } -func fetchShowBRIEResult(c *C, e *ShowExec, brieColTypes []*types.FieldType) string { +func fetchShowBRIEResult(t *testing.T, e *ShowExec, brieColTypes []*types.FieldType) string { e.result = newFirstChunk(e) - c.Assert(e.fetchShowBRIE(ast.BRIEKindBackup), IsNil) + require.NoError(t, e.fetchShowBRIE(ast.BRIEKindBackup)) return e.result.ToString(brieColTypes) } -func (s *testBRIESuite) TestFetchShowBRIE(c *C) { +func TestFetchShowBRIE(t *testing.T) { // Compose a mocked session manager. ps := make([]*util.ProcessInfo, 0, 1) pi := &util.ProcessInfo{ @@ -95,9 +91,9 @@ func (s *testBRIESuite) TestFetchShowBRIE(c *C) { p := parser.New() p.SetParserConfig(parser.ParserConfig{EnableWindowFunction: true, EnableStrictDoubleTypeCheck: true}) stmt, err := p.ParseOneStmt("show backups", "", "") - c.Assert(err, IsNil) + require.NoError(t, err) plan, _, err := core.BuildLogicalPlanForTest(ctx, sctx, stmt, infoschema.MockInfoSchema([]*model.TableInfo{core.MockSignedTable(), core.MockUnsignedTable(), core.MockView()})) - c.Assert(err, IsNil) + require.NoError(t, err) schema := plan.Schema() // Compose executor. @@ -105,10 +101,10 @@ func (s *testBRIESuite) TestFetchShowBRIE(c *C) { baseExecutor: newBaseExecutor(sctx, schema, 0), Tp: ast.ShowBackups, } - c.Assert(e.Open(ctx), IsNil) + require.NoError(t, e.Open(ctx)) tp := mysql.TypeDatetime - lateTime := types.NewTime(types.FromGoTime(gotime.Now().Add(-outdatedDuration.Duration+1)), tp, 0) + lateTime := types.NewTime(types.FromGoTime(time.Now().Add(-outdatedDuration.Duration+1)), tp, 0) brieColTypes := make([]*types.FieldType, 0, len(schema.Columns)) for _, col := range schema.Columns { brieColTypes = append(brieColTypes, col.RetType) @@ -127,20 +123,20 @@ func (s *testBRIESuite) TestFetchShowBRIE(c *C) { info1Res := brieTaskInfoToResult(info1) globalBRIEQueue.registerTask(ctx, info1) - c.Assert(fetchShowBRIEResult(c, e, brieColTypes), Equals, info1Res) + require.Equal(t, info1Res, fetchShowBRIEResult(t, e, brieColTypes)) // Query again, this info should already have been cleaned - c.Assert(fetchShowBRIEResult(c, e, brieColTypes), HasLen, 0) + require.Len(t, fetchShowBRIEResult(t, e, brieColTypes), 0) // Register this task again, we should be able to fetch this info globalBRIEQueue.registerTask(ctx, info1) - c.Assert(fetchShowBRIEResult(c, e, brieColTypes), Equals, info1Res) + require.Equal(t, info1Res, fetchShowBRIEResult(t, e, brieColTypes)) // Query again, we should be able to fetch this info again, because we have cleared in last clearInterval - c.Assert(fetchShowBRIEResult(c, e, brieColTypes), Equals, info1Res) + require.Equal(t, info1Res, fetchShowBRIEResult(t, e, brieColTypes)) // Reset clear time, we should only fetch info2 this time. - globalBRIEQueue.lastClearTime = gotime.Now().Add(-clearInterval - gotime.Second) + globalBRIEQueue.lastClearTime = time.Now().Add(-clearInterval - time.Second) currTime := types.CurrentTime(tp) info2 := &brieTaskInfo{ kind: ast.BRIEKindBackup, @@ -154,5 +150,5 @@ func (s *testBRIESuite) TestFetchShowBRIE(c *C) { info2Res := brieTaskInfoToResult(info2) globalBRIEQueue.registerTask(ctx, info2) globalBRIEQueue.clearTask(e.ctx.GetSessionVars().StmtCtx) - c.Assert(fetchShowBRIEResult(c, e, brieColTypes), Equals, info2Res) + require.Equal(t, info2Res, fetchShowBRIEResult(t, e, brieColTypes)) } diff --git a/executor/builder.go b/executor/builder.go index 491f438067d6a..b7fdbbc313143 100644 --- a/executor/builder.go +++ b/executor/builder.go @@ -17,10 +17,12 @@ package executor import ( "bytes" "context" + "math" "sort" "strconv" "strings" "sync" + "sync/atomic" "time" "unsafe" @@ -28,6 +30,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/kvproto/pkg/diagnosticspb" + "github.com/pingcap/log" "github.com/pingcap/tidb/distsql" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/executor/aggfuncs" @@ -44,6 +47,7 @@ import ( "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/statistics" + "github.com/pingcap/tidb/store/helper" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/table/temptable" @@ -51,10 +55,11 @@ import ( "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/admin" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/cteutil" - "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/execdetails" "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/memory" "github.com/pingcap/tidb/util/ranger" "github.com/pingcap/tidb/util/rowcodec" "github.com/pingcap/tidb/util/timeutil" @@ -88,6 +93,9 @@ type executorBuilder struct { // isStaleness means whether this statement use stale read. isStaleness bool readReplicaScope string + inUpdateStmt bool + inDeleteStmt bool + inInsertStmt bool } // CTEStorages stores resTbl and iterInTbl for CTEExec. @@ -116,6 +124,23 @@ type MockPhysicalPlan interface { GetExecutor() Executor } +// MockExecutorBuilder is a wrapper for executorBuilder. +// ONLY used in test. +type MockExecutorBuilder struct { + *executorBuilder +} + +// NewMockExecutorBuilderForTest is ONLY used in test. +func NewMockExecutorBuilderForTest(ctx sessionctx.Context, is infoschema.InfoSchema, ti *TelemetryInfo, snapshotTS uint64, isStaleness bool, replicaReadScope string) *MockExecutorBuilder { + return &MockExecutorBuilder{ + executorBuilder: newExecutorBuilder(ctx, is, ti, snapshotTS, isStaleness, replicaReadScope)} +} + +// Build builds an executor tree according to `p`. +func (b *MockExecutorBuilder) Build(p plannercore.Plan) Executor { + return b.build(p) +} + func (b *executorBuilder) build(p plannercore.Plan) Executor { switch v := p.(type) { case nil: @@ -162,8 +187,8 @@ func (b *executorBuilder) build(p plannercore.Plan) Executor { return b.buildLoadStats(v) case *plannercore.IndexAdvise: return b.buildIndexAdvise(v) - case *plannercore.PlanReplayerSingle: - return b.buildPlanReplayerSingle(v) + case *plannercore.PlanReplayer: + return b.buildPlanReplayer(v) case *plannercore.PhysicalLimit: return b.buildLimit(v) case *plannercore.Prepare: @@ -275,15 +300,13 @@ func (b *executorBuilder) buildCancelDDLJobs(v *plannercore.CancelDDLJobs) Execu baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ID()), jobIDs: v.JobIDs, } - txn, err := e.ctx.Txn(true) - if err != nil { - b.err = err - return nil - } - - e.errs, b.err = admin.CancelJobs(txn, e.jobIDs) - if b.err != nil { - return nil + // Run within a new transaction. If it runs within the session transaction, commit failure won't be reported to the user. + errInTxn := kv.RunInNewTxn(context.Background(), e.ctx.GetStore(), true, func(ctx context.Context, txn kv.Transaction) (err error) { + e.errs, err = admin.CancelJobs(txn, e.jobIDs) + return + }) + if errInTxn != nil { + b.err = errInTxn } return e } @@ -789,6 +812,7 @@ func (b *executorBuilder) buildSetConfig(v *plannercore.SetConfig) Executor { } func (b *executorBuilder) buildInsert(v *plannercore.Insert) Executor { + b.inInsertStmt = true if v.SelectPlan != nil { // Try to update the forUpdateTS for insert/replace into select statements. // Set the selectPlan parameter to nil to make it always update the forUpdateTS. @@ -905,10 +929,18 @@ func (b *executorBuilder) buildIndexAdvise(v *plannercore.IndexAdvise) Executor return e } -func (b *executorBuilder) buildPlanReplayerSingle(v *plannercore.PlanReplayerSingle) Executor { +func (b *executorBuilder) buildPlanReplayer(v *plannercore.PlanReplayer) Executor { + if v.Load { + e := &PlanReplayerLoadExec{ + baseExecutor: newBaseExecutor(b.ctx, nil, v.ID()), + info: &PlanReplayerLoadInfo{Path: v.File, Ctx: b.ctx}, + } + return e + } e := &PlanReplayerSingleExec{ - baseExecutor: newBaseExecutor(b.ctx, nil, v.ID()), - info: &PlanReplayerSingleInfo{v.ExecStmt, v.Analyze, v.Load, v.File, b.ctx}, + baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ID()), + ExecStmt: v.ExecStmt, + Analyze: v.Analyze, } return e } @@ -965,8 +997,11 @@ func (b *executorBuilder) buildTrace(v *plannercore.Trace) Executor { stmtNode: v.StmtNode, builder: b, format: v.Format, + + optimizerTrace: v.OptimizerTrace, + optimizerTraceTarget: v.OptimizerTraceTarget, } - if t.format == plannercore.TraceFormatLog { + if t.format == plannercore.TraceFormatLog && !t.optimizerTrace { return &SortExec{ baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ID(), t), ByItems: []*plannerutil.ByItems{ @@ -1031,6 +1066,7 @@ func (b *executorBuilder) buildUnionScanFromReader(reader Executor, v *plannerco return x } us := &UnionScanExec{baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ID(), reader)} + us.cacheTable = v.CacheTable // Get the handle column index of the below Plan. us.belowHandleCols = v.HandleCols us.mutableRow = chunk.MutRowFromTypes(retTypes(us)) @@ -1041,6 +1077,11 @@ func (b *executorBuilder) buildUnionScanFromReader(reader Executor, v *plannerco reader = sel.children[0] } + us.collators = make([]collate.Collator, 0, len(us.columns)) + for _, tp := range retTypes(us) { + us.collators = append(us.collators, collate.GetCollator(tp.Collate)) + } + switch x := reader.(type) { case *TableReaderExecutor: us.desc = x.desc @@ -1075,6 +1116,12 @@ func (b *executorBuilder) buildUnionScanFromReader(reader Executor, v *plannerco us.columns = x.columns us.table = x.table us.virtualColumnIndex = buildVirtualColumnIndex(us.Schema(), us.columns) + case *IndexMergeReaderExecutor: + // IndexMergeReader doesn't care order for now. So we will not set desc and useIndex. + us.conditions, us.conditionsWithVirCol = plannercore.SplitSelCondsWithVirtualColumn(v.Conditions) + us.columns = x.columns + us.table = x.table + us.virtualColumnIndex = buildVirtualColumnIndex(us.Schema(), us.columns) default: // The mem table will not be written by sql directly, so we can omit the union scan to avoid err reporting. return originReader @@ -1195,15 +1242,6 @@ func (b *executorBuilder) buildHashJoin(v *plannercore.PhysicalHashJoin) Executo } } - // consider collations - leftTypes := make([]*types.FieldType, 0, len(retTypes(leftExec))) - for _, tp := range retTypes(leftExec) { - leftTypes = append(leftTypes, tp.Clone()) - } - rightTypes := make([]*types.FieldType, 0, len(retTypes(rightExec))) - for _, tp := range retTypes(rightExec) { - rightTypes = append(rightTypes, tp.Clone()) - } leftIsBuildSide := true e.isNullEQ = v.IsNullEQ @@ -1246,24 +1284,32 @@ func (b *executorBuilder) buildHashJoin(v *plannercore.PhysicalHashJoin) Executo } executorCountHashJoinExec.Inc() + // We should use JoinKey to construct the type information using by hashing, instead of using the child's schema directly. + // When a hybrid type column is hashed multiple times, we need to distinguish what field types are used. + // For example, the condition `enum = int and enum = string`, we should use ETInt to hash the first column, + // and use ETString to hash the second column, although they may be the same column. + leftExecTypes, rightExecTypes := retTypes(leftExec), retTypes(rightExec) + leftTypes, rightTypes := make([]*types.FieldType, 0, len(v.LeftJoinKeys)), make([]*types.FieldType, 0, len(v.RightJoinKeys)) + for i, col := range v.LeftJoinKeys { + leftTypes = append(leftTypes, leftExecTypes[col.Index].Clone()) + leftTypes[i].Flag = col.RetType.Flag + } + for i, col := range v.RightJoinKeys { + rightTypes = append(rightTypes, rightExecTypes[col.Index].Clone()) + rightTypes[i].Flag = col.RetType.Flag + } + + // consider collations for i := range v.EqualConditions { - chs, coll := v.EqualConditions[i].CharsetAndCollation(e.ctx) - bt := leftTypes[v.LeftJoinKeys[i].Index] - bt.Charset, bt.Collate = chs, coll - pt := rightTypes[v.RightJoinKeys[i].Index] - pt.Charset, pt.Collate = chs, coll + chs, coll := v.EqualConditions[i].CharsetAndCollation() + leftTypes[i].Charset, leftTypes[i].Collate = chs, coll + rightTypes[i].Charset, rightTypes[i].Collate = chs, coll } if leftIsBuildSide { e.buildTypes, e.probeTypes = leftTypes, rightTypes } else { e.buildTypes, e.probeTypes = rightTypes, leftTypes } - for _, key := range e.buildKeys { - e.buildTypes[key.Index].Flag = key.RetType.Flag - } - for _, key := range e.probeKeys { - e.probeTypes[key.Index].Flag = key.RetType.Flag - } return e } @@ -1405,6 +1451,12 @@ func (b *executorBuilder) buildProjection(v *plannercore.PhysicalProjection) Exe if int64(v.StatsCount()) < int64(b.ctx.GetSessionVars().MaxChunkSize) { e.numWorkers = 0 } + + // Use un-parallel projection for query that write on memdb to avoid data race. + // See also https://github.com/pingcap/tidb/issues/26832 + if b.inUpdateStmt || b.inDeleteStmt || b.inInsertStmt || b.hasLock { + e.numWorkers = 0 + } return e } @@ -1517,6 +1569,14 @@ func (b *executorBuilder) buildMemTable(v *plannercore.PhysicalMemTable) Executo extractor: v.Extractor.(*plannercore.ClusterLogTableExtractor), }, } + case strings.ToLower(infoschema.TableTiDBHotRegionsHistory): + return &MemTableReaderExec{ + baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ID()), + table: v.Table, + retriever: &hotRegionsHistoryRetriver{ + extractor: v.Extractor.(*plannercore.HotRegionsHistoryTableExtractor), + }, + } case strings.ToLower(infoschema.TableInspectionResult): return &MemTableReaderExec{ baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ID()), @@ -1597,7 +1657,7 @@ func (b *executorBuilder) buildMemTable(v *plannercore.PhysicalMemTable) Executo strings.ToLower(infoschema.TableClientErrorsSummaryGlobal), strings.ToLower(infoschema.TableClientErrorsSummaryByUser), strings.ToLower(infoschema.TableClientErrorsSummaryByHost), - strings.ToLower(infoschema.TableRegionLabel), + strings.ToLower(infoschema.TableAttributes), strings.ToLower(infoschema.TablePlacementRules): return &MemTableReaderExec{ baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ID()), @@ -1913,6 +1973,7 @@ func (b *executorBuilder) buildSplitRegion(v *plannercore.SplitRegion) Executor } func (b *executorBuilder) buildUpdate(v *plannercore.Update) Executor { + b.inUpdateStmt = true tblID2table := make(map[int64]table.Table, len(v.TblColPosInfos)) multiUpdateOnSameTable := make(map[int64]bool) for _, info := range v.TblColPosInfos { @@ -1985,6 +2046,7 @@ func getAssignFlag(ctx sessionctx.Context, v *plannercore.Update, schemaLen int) } func (b *executorBuilder) buildDelete(v *plannercore.Delete) Executor { + b.inDeleteStmt = true tblID2table := make(map[int64]table.Table, len(v.TblColPosInfos)) for _, info := range v.TblColPosInfos { tblID2table[info.TblID], _ = b.is.TableByID(info.TblID) @@ -2216,9 +2278,33 @@ func (b *executorBuilder) buildAnalyzeSamplingPushdown(task plannercore.AnalyzeC baseCount: count, baseModifyCnt: modifyCount, } + sampleRate := new(float64) + if opts[ast.AnalyzeOptNumSamples] == 0 { + *sampleRate = math.Float64frombits(opts[ast.AnalyzeOptSampleRate]) + if *sampleRate < 0 { + *sampleRate = b.getAdjustedSampleRate(b.ctx, task.TableID.GetStatisticsID(), task.TblInfo) + if task.PartitionName != "" { + sc.AppendNote(errors.Errorf( + "Analyze use auto adjusted sample rate %f for table %s.%s's partition %s.", + *sampleRate, + task.DBName, + task.TableName, + task.PartitionName, + )) + } else { + sc.AppendNote(errors.Errorf( + "Analyze use auto adjusted sample rate %f for table %s.%s.", + *sampleRate, + task.DBName, + task.TableName, + )) + } + } + } e.analyzePB.ColReq = &tipb.AnalyzeColumnsReq{ BucketSize: int64(opts[ast.AnalyzeOptNumBuckets]), SampleSize: int64(opts[ast.AnalyzeOptNumSamples]), + SampleRate: sampleRate, SketchSize: maxSketchSize, ColumnsInfo: util.ColumnsToProto(task.ColsInfo, task.TblInfo.PKIsHandle), ColumnGroups: colGroups, @@ -2233,6 +2319,60 @@ func (b *executorBuilder) buildAnalyzeSamplingPushdown(task plannercore.AnalyzeC return &analyzeTask{taskType: colTask, colExec: e, job: job} } +// getAdjustedSampleRate calculate the sample rate by the table size. If we cannot get the table size. We use the 0.001 as the default sample rate. +func (b *executorBuilder) getAdjustedSampleRate(sctx sessionctx.Context, tid int64, tblInfo *model.TableInfo) float64 { + statsHandle := domain.GetDomain(sctx).StatsHandle() + defaultRate := 0.001 + if statsHandle == nil { + return defaultRate + } + var statsTbl *statistics.Table + if tid == tblInfo.ID { + statsTbl = statsHandle.GetTableStats(tblInfo) + } else { + statsTbl = statsHandle.GetPartitionStats(tblInfo, tid) + } + approxiCount, hasPD := b.getApproximateTableCountFromPD(sctx, tid) + // If there's no stats meta and no pd, return the default rate. + if statsTbl == nil && !hasPD { + return defaultRate + } + // If the count in stats_meta is still 0 and there's no information from pd side, we scan all rows. + if statsTbl.Count == 0 && !hasPD { + return 1 + } + // we have issue https://github.com/pingcap/tidb/issues/29216. + // To do a workaround for this issue, we check the approxiCount from the pd side to do a comparison. + // If the count from the stats_meta is extremely smaller than the approximate count from the pd, + // we think that we meet this issue and use the approximate count to calculate the sample rate. + if float64(statsTbl.Count*100) < approxiCount { + // Confirmed by TiKV side, the experience error rate of the approximate count is about 20%. + // So we increase the number to 150000 to reduce this error rate. + return math.Min(1, 150000/approxiCount) + } + // If we don't go into the above if branch and we still detect the count is zero. Return 1 to prevent the dividing zero. + if statsTbl.Count == 0 { + return 1 + } + // We are expected to scan about 100000 rows or so. + // Since there's tiny error rate around the count from the stats meta, we use 110000 to get a little big result + return math.Min(1, 110000/float64(statsTbl.Count)) +} + +func (b *executorBuilder) getApproximateTableCountFromPD(sctx sessionctx.Context, tid int64) (float64, bool) { + tikvStore, ok := sctx.GetStore().(helper.Storage) + if !ok { + return 0, false + } + regionStats := &helper.PDRegionStats{} + pdHelper := helper.NewHelper(tikvStore) + err := pdHelper.GetPDRegionStats(tid, regionStats) + if err != nil { + return 0, false + } + return float64(regionStats.StorageKeys), true +} + func (b *executorBuilder) buildAnalyzeColumnsPushdown(task plannercore.AnalyzeColumnsTask, opts map[ast.AnalyzeOptionType]uint64, autoAnalyze string, schemaForVirtualColEval *expression.Schema) *analyzeTask { if task.StatsVersion == statistics.Version2 { return b.buildAnalyzeSamplingPushdown(task, opts, autoAnalyze, schemaForVirtualColEval) @@ -2613,6 +2753,21 @@ func (b *executorBuilder) buildIndexLookUpJoin(v *plannercore.PhysicalIndexJoin) outerTypes[col.Index].Flag = col.RetType.Flag } + // We should use JoinKey to construct the type information using by hashing, instead of using the child's schema directly. + // When a hybrid type column is hashed multiple times, we need to distinguish what field types are used. + // For example, the condition `enum = int and enum = string`, we should use ETInt to hash the first column, + // and use ETString to hash the second column, although they may be the same column. + innerHashTypes := make([]*types.FieldType, len(v.InnerHashKeys)) + outerHashTypes := make([]*types.FieldType, len(v.OuterHashKeys)) + for i, col := range v.InnerHashKeys { + innerHashTypes[i] = innerTypes[col.Index].Clone() + innerHashTypes[i].Flag = col.RetType.Flag + } + for i, col := range v.OuterHashKeys { + outerHashTypes[i] = outerTypes[col.Index].Clone() + outerHashTypes[i].Flag = col.RetType.Flag + } + var ( outerFilter []expression.Expression leftTypes, rightTypes []*types.FieldType @@ -2647,12 +2802,14 @@ func (b *executorBuilder) buildIndexLookUpJoin(v *plannercore.PhysicalIndexJoin) e := &IndexLookUpJoin{ baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ID(), outerExec), outerCtx: outerCtx{ - rowTypes: outerTypes, - filter: outerFilter, + rowTypes: outerTypes, + hashTypes: outerHashTypes, + filter: outerFilter, }, innerCtx: innerCtx{ readerBuilder: &dataReaderBuilder{Plan: innerPlan, executorBuilder: b}, rowTypes: innerTypes, + hashTypes: innerHashTypes, colLens: v.IdxColLens, hasPrefixCol: hasPrefixCol, }, @@ -2661,6 +2818,7 @@ func (b *executorBuilder) buildIndexLookUpJoin(v *plannercore.PhysicalIndexJoin) indexRanges: v.Ranges, keyOff2IdxOff: v.KeyOff2IdxOff, lastColHelper: v.CompareFilters, + finished: &atomic.Value{}, } childrenUsedSchema := markChildrenUsedCols(v.Schema(), v.Children()[0].Schema(), v.Children()[1].Schema()) e.joiner = newJoiner(b.ctx, v.JoinType, v.InnerChildIdx == 0, defaultValues, v.OtherConditions, leftTypes, rightTypes, childrenUsedSchema) @@ -2670,23 +2828,29 @@ func (b *executorBuilder) buildIndexLookUpJoin(v *plannercore.PhysicalIndexJoin) } innerKeyCols := make([]int, len(v.InnerJoinKeys)) innerKeyColIDs := make([]int64, len(v.InnerJoinKeys)) + keyCollators := make([]collate.Collator, 0, len(v.InnerJoinKeys)) for i := 0; i < len(v.InnerJoinKeys); i++ { innerKeyCols[i] = v.InnerJoinKeys[i].Index innerKeyColIDs[i] = v.InnerJoinKeys[i].ID + keyCollators = append(keyCollators, collate.GetCollator(v.InnerJoinKeys[i].RetType.Collate)) } e.outerCtx.keyCols = outerKeyCols e.innerCtx.keyCols = innerKeyCols e.innerCtx.keyColIDs = innerKeyColIDs + e.innerCtx.keyCollators = keyCollators outerHashCols, innerHashCols := make([]int, len(v.OuterHashKeys)), make([]int, len(v.InnerHashKeys)) + hashCollators := make([]collate.Collator, 0, len(v.InnerHashKeys)) for i := 0; i < len(v.OuterHashKeys); i++ { outerHashCols[i] = v.OuterHashKeys[i].Index } for i := 0; i < len(v.InnerHashKeys); i++ { innerHashCols[i] = v.InnerHashKeys[i].Index + hashCollators = append(hashCollators, collate.GetCollator(v.InnerHashKeys[i].RetType.Collate)) } e.outerCtx.hashCols = outerHashCols e.innerCtx.hashCols = innerHashCols + e.innerCtx.hashCollators = hashCollators e.joinResult = newFirstChunk(e) executorCounterIndexLookUpJoin.Inc() @@ -2738,8 +2902,10 @@ func (b *executorBuilder) buildIndexLookUpMergeJoin(v *plannercore.PhysicalIndex outerKeyCols[i] = v.OuterJoinKeys[i].Index } innerKeyCols := make([]int, len(v.InnerJoinKeys)) + keyCollators := make([]collate.Collator, 0, len(v.InnerJoinKeys)) for i := 0; i < len(v.InnerJoinKeys); i++ { innerKeyCols[i] = v.InnerJoinKeys[i].Index + keyCollators = append(keyCollators, collate.GetCollator(v.InnerJoinKeys[i].RetType.Collate)) } executorCounterIndexLookUpJoin.Inc() @@ -2758,6 +2924,7 @@ func (b *executorBuilder) buildIndexLookUpMergeJoin(v *plannercore.PhysicalIndex rowTypes: innerTypes, joinKeys: v.InnerJoinKeys, keyCols: innerKeyCols, + keyCollators: keyCollators, compareFuncs: v.CompareFuncs, colLens: v.IdxColLens, desc: v.Desc, @@ -2813,7 +2980,7 @@ func buildNoRangeTableReader(b *executorBuilder, v *plannercore.PhysicalTableRea return nil, err } ts := v.GetTableScan() - if err = b.validCanReadTemporaryTable(ts.Table); err != nil { + if err = b.validCanReadTemporaryOrCacheTable(ts.Table); err != nil { return nil, err } @@ -2929,7 +3096,7 @@ func (b *executorBuilder) buildTableReader(v *plannercore.PhysicalTableReader) E } ts := v.GetTableScan() - if err = b.validCanReadTemporaryTable(ts.Table); err != nil { + if err = b.validCanReadTemporaryOrCacheTable(ts.Table); err != nil { b.err = err return nil } @@ -3031,8 +3198,7 @@ func prunePartitionForInnerExecutor(ctx sessionctx.Context, tbl table.Table, sch return nil, false, nil, nil } if lookUpContent[0].keyColIDs == nil { - return nil, false, nil, - dbterror.ClassOptimizer.NewStd(mysql.ErrInternal).GenWithStack("cannot get column IDs when dynamic pruning") + return nil, false, nil, plannercore.ErrInternal.GenWithStack("cannot get column IDs when dynamic pruning") } keyColOffsets := make([]int, len(lookUpContent[0].keyColIDs)) for i, colID := range lookUpContent[0].keyColIDs { @@ -3044,8 +3210,7 @@ func prunePartitionForInnerExecutor(ctx sessionctx.Context, tbl table.Table, sch } } if offset == -1 { - return nil, false, nil, - dbterror.ClassOptimizer.NewStd(mysql.ErrInternal).GenWithStack("invalid column offset when dynamic pruning") + return nil, false, nil, plannercore.ErrInternal.GenWithStack("invalid column offset when dynamic pruning") } keyColOffsets[i] = offset } @@ -3152,7 +3317,7 @@ func buildNoRangeIndexReader(b *executorBuilder, v *plannercore.PhysicalIndexRea func (b *executorBuilder) buildIndexReader(v *plannercore.PhysicalIndexReader) Executor { is := v.IndexPlans[0].(*plannercore.PhysicalIndexScan) - if err := b.validCanReadTemporaryTable(is.Table); err != nil { + if err := b.validCanReadTemporaryOrCacheTable(is.Table); err != nil { b.err = err return nil } @@ -3311,7 +3476,7 @@ func buildNoRangeIndexLookUpReader(b *executorBuilder, v *plannercore.PhysicalIn func (b *executorBuilder) buildIndexLookUpReader(v *plannercore.PhysicalIndexLookUpReader) Executor { is := v.IndexPlans[0].(*plannercore.PhysicalIndexScan) - if err := b.validCanReadTemporaryTable(is.Table); err != nil { + if err := b.validCanReadTemporaryOrCacheTable(is.Table); err != nil { b.err = err return nil } @@ -3426,7 +3591,7 @@ func buildNoRangeIndexMergeReader(b *executorBuilder, v *plannercore.PhysicalInd func (b *executorBuilder) buildIndexMergeReader(v *plannercore.PhysicalIndexMergeReader) Executor { ts := v.TablePlans[0].(*plannercore.PhysicalTableScan) - if err := b.validCanReadTemporaryTable(ts.Table); err != nil { + if err := b.validCanReadTemporaryOrCacheTable(ts.Table); err != nil { b.err = err return nil } @@ -3490,21 +3655,21 @@ type mockPhysicalIndexReader struct { } func (builder *dataReaderBuilder) buildExecutorForIndexJoin(ctx context.Context, lookUpContents []*indexJoinLookUpContent, - IndexRanges []*ranger.Range, keyOff2IdxOff []int, cwc *plannercore.ColWithCmpFuncManager, canReorderHandles bool) (Executor, error) { - return builder.buildExecutorForIndexJoinInternal(ctx, builder.Plan, lookUpContents, IndexRanges, keyOff2IdxOff, cwc, canReorderHandles) + IndexRanges []*ranger.Range, keyOff2IdxOff []int, cwc *plannercore.ColWithCmpFuncManager, canReorderHandles bool, memTracker *memory.Tracker, interruptSignal *atomic.Value) (Executor, error) { + return builder.buildExecutorForIndexJoinInternal(ctx, builder.Plan, lookUpContents, IndexRanges, keyOff2IdxOff, cwc, canReorderHandles, memTracker, interruptSignal) } func (builder *dataReaderBuilder) buildExecutorForIndexJoinInternal(ctx context.Context, plan plannercore.Plan, lookUpContents []*indexJoinLookUpContent, - IndexRanges []*ranger.Range, keyOff2IdxOff []int, cwc *plannercore.ColWithCmpFuncManager, canReorderHandles bool) (Executor, error) { + IndexRanges []*ranger.Range, keyOff2IdxOff []int, cwc *plannercore.ColWithCmpFuncManager, canReorderHandles bool, memTracker *memory.Tracker, interruptSignal *atomic.Value) (Executor, error) { switch v := plan.(type) { case *plannercore.PhysicalTableReader: - return builder.buildTableReaderForIndexJoin(ctx, v, lookUpContents, IndexRanges, keyOff2IdxOff, cwc, canReorderHandles) + return builder.buildTableReaderForIndexJoin(ctx, v, lookUpContents, IndexRanges, keyOff2IdxOff, cwc, canReorderHandles, memTracker, interruptSignal) case *plannercore.PhysicalIndexReader: - return builder.buildIndexReaderForIndexJoin(ctx, v, lookUpContents, IndexRanges, keyOff2IdxOff, cwc) + return builder.buildIndexReaderForIndexJoin(ctx, v, lookUpContents, IndexRanges, keyOff2IdxOff, cwc, memTracker, interruptSignal) case *plannercore.PhysicalIndexLookUpReader: - return builder.buildIndexLookUpReaderForIndexJoin(ctx, v, lookUpContents, IndexRanges, keyOff2IdxOff, cwc) + return builder.buildIndexLookUpReaderForIndexJoin(ctx, v, lookUpContents, IndexRanges, keyOff2IdxOff, cwc, memTracker, interruptSignal) case *plannercore.PhysicalUnionScan: - return builder.buildUnionScanForIndexJoin(ctx, v, lookUpContents, IndexRanges, keyOff2IdxOff, cwc, canReorderHandles) + return builder.buildUnionScanForIndexJoin(ctx, v, lookUpContents, IndexRanges, keyOff2IdxOff, cwc, canReorderHandles, memTracker, interruptSignal) // The inner child of IndexJoin might be Projection when a combination of the following conditions is true: // 1. The inner child fetch data using indexLookupReader // 2. PK is not handle @@ -3512,11 +3677,11 @@ func (builder *dataReaderBuilder) buildExecutorForIndexJoinInternal(ctx context. // In this case, an extra column tidb_rowid will be appended in the output result of IndexLookupReader(see copTask.doubleReadNeedProj). // Then we need a Projection upon IndexLookupReader to prune the redundant column. case *plannercore.PhysicalProjection: - return builder.buildProjectionForIndexJoin(ctx, v, lookUpContents, IndexRanges, keyOff2IdxOff, cwc) + return builder.buildProjectionForIndexJoin(ctx, v, lookUpContents, IndexRanges, keyOff2IdxOff, cwc, memTracker, interruptSignal) // Need to support physical selection because after PR 16389, TiDB will push down all the expr supported by TiKV or TiFlash // in predicate push down stage, so if there is an expr which only supported by TiFlash, a physical selection will be added after index read case *plannercore.PhysicalSelection: - childExec, err := builder.buildExecutorForIndexJoinInternal(ctx, v.Children()[0], lookUpContents, IndexRanges, keyOff2IdxOff, cwc, canReorderHandles) + childExec, err := builder.buildExecutorForIndexJoinInternal(ctx, v.Children()[0], lookUpContents, IndexRanges, keyOff2IdxOff, cwc, canReorderHandles, memTracker, interruptSignal) if err != nil { return nil, err } @@ -3534,9 +3699,9 @@ func (builder *dataReaderBuilder) buildExecutorForIndexJoinInternal(ctx context. func (builder *dataReaderBuilder) buildUnionScanForIndexJoin(ctx context.Context, v *plannercore.PhysicalUnionScan, values []*indexJoinLookUpContent, indexRanges []*ranger.Range, keyOff2IdxOff []int, - cwc *plannercore.ColWithCmpFuncManager, canReorderHandles bool) (Executor, error) { + cwc *plannercore.ColWithCmpFuncManager, canReorderHandles bool, memTracker *memory.Tracker, interruptSignal *atomic.Value) (Executor, error) { childBuilder := &dataReaderBuilder{Plan: v.Children()[0], executorBuilder: builder.executorBuilder} - reader, err := childBuilder.buildExecutorForIndexJoin(ctx, values, indexRanges, keyOff2IdxOff, cwc, canReorderHandles) + reader, err := childBuilder.buildExecutorForIndexJoin(ctx, values, indexRanges, keyOff2IdxOff, cwc, canReorderHandles, memTracker, interruptSignal) if err != nil { return nil, err } @@ -3550,7 +3715,7 @@ func (builder *dataReaderBuilder) buildUnionScanForIndexJoin(ctx context.Context func (builder *dataReaderBuilder) buildTableReaderForIndexJoin(ctx context.Context, v *plannercore.PhysicalTableReader, lookUpContents []*indexJoinLookUpContent, indexRanges []*ranger.Range, keyOff2IdxOff []int, - cwc *plannercore.ColWithCmpFuncManager, canReorderHandles bool) (Executor, error) { + cwc *plannercore.ColWithCmpFuncManager, canReorderHandles bool, memTracker *memory.Tracker, interruptSignal *atomic.Value) (Executor, error) { e, err := buildNoRangeTableReader(builder.executorBuilder, v) if err != nil { return nil, err @@ -3558,7 +3723,7 @@ func (builder *dataReaderBuilder) buildTableReaderForIndexJoin(ctx context.Conte tbInfo := e.table.Meta() if v.IsCommonHandle { if tbInfo.GetPartitionInfo() == nil || !builder.ctx.GetSessionVars().UseDynamicPartitionPrune() { - kvRanges, err := buildKvRangesForIndexJoin(e.ctx, getPhysicalTableID(e.table), -1, lookUpContents, indexRanges, keyOff2IdxOff, cwc) + kvRanges, err := buildKvRangesForIndexJoin(e.ctx, getPhysicalTableID(e.table), -1, lookUpContents, indexRanges, keyOff2IdxOff, cwc, memTracker, interruptSignal) if err != nil { return nil, err } @@ -3574,7 +3739,7 @@ func (builder *dataReaderBuilder) buildTableReaderForIndexJoin(ctx context.Conte return nil, err } var kvRanges []kv.KeyRange - if keyColumnsIncludeAllPartitionColumns(lookUpContents[0].keyCols, pe) { + if len(lookUpContents) > 0 && keyColumnsIncludeAllPartitionColumns(lookUpContents[0].keyCols, pe) { // In this case we can use dynamic partition pruning. locateKey := make([]types.Datum, e.Schema().Len()) kvRanges = make([]kv.KeyRange, 0, len(lookUpContents)) @@ -3587,7 +3752,7 @@ func (builder *dataReaderBuilder) buildTableReaderForIndexJoin(ctx context.Conte return nil, err } pid := p.GetPhysicalID() - tmp, err := buildKvRangesForIndexJoin(e.ctx, pid, -1, []*indexJoinLookUpContent{content}, indexRanges, keyOff2IdxOff, cwc) + tmp, err := buildKvRangesForIndexJoin(e.ctx, pid, -1, []*indexJoinLookUpContent{content}, indexRanges, keyOff2IdxOff, cwc, nil, interruptSignal) if err != nil { return nil, err } @@ -3602,7 +3767,7 @@ func (builder *dataReaderBuilder) buildTableReaderForIndexJoin(ctx context.Conte kvRanges = make([]kv.KeyRange, 0, len(partitions)*len(lookUpContents)) for _, p := range partitions { pid := p.GetPhysicalID() - tmp, err := buildKvRangesForIndexJoin(e.ctx, pid, -1, lookUpContents, indexRanges, keyOff2IdxOff, cwc) + tmp, err := buildKvRangesForIndexJoin(e.ctx, pid, -1, lookUpContents, indexRanges, keyOff2IdxOff, cwc, memTracker, interruptSignal) if err != nil { return nil, err } @@ -3629,7 +3794,7 @@ func (builder *dataReaderBuilder) buildTableReaderForIndexJoin(ctx context.Conte return nil, err } var kvRanges []kv.KeyRange - if keyColumnsIncludeAllPartitionColumns(lookUpContents[0].keyCols, pe) { + if len(lookUpContents) > 0 && keyColumnsIncludeAllPartitionColumns(lookUpContents[0].keyCols, pe) { locateKey := make([]types.Datum, e.Schema().Len()) kvRanges = make([]kv.KeyRange, 0, len(lookUpContents)) for _, content := range lookUpContents { @@ -3768,14 +3933,14 @@ func (builder *dataReaderBuilder) buildTableReaderFromKvRanges(ctx context.Conte } func (builder *dataReaderBuilder) buildIndexReaderForIndexJoin(ctx context.Context, v *plannercore.PhysicalIndexReader, - lookUpContents []*indexJoinLookUpContent, indexRanges []*ranger.Range, keyOff2IdxOff []int, cwc *plannercore.ColWithCmpFuncManager) (Executor, error) { + lookUpContents []*indexJoinLookUpContent, indexRanges []*ranger.Range, keyOff2IdxOff []int, cwc *plannercore.ColWithCmpFuncManager, memoryTracker *memory.Tracker, interruptSignal *atomic.Value) (Executor, error) { e, err := buildNoRangeIndexReader(builder.executorBuilder, v) if err != nil { return nil, err } tbInfo := e.table.Meta() if tbInfo.GetPartitionInfo() == nil || !builder.ctx.GetSessionVars().UseDynamicPartitionPrune() { - kvRanges, err := buildKvRangesForIndexJoin(e.ctx, e.physicalTableID, e.index.ID, lookUpContents, indexRanges, keyOff2IdxOff, cwc) + kvRanges, err := buildKvRangesForIndexJoin(e.ctx, e.physicalTableID, e.index.ID, lookUpContents, indexRanges, keyOff2IdxOff, cwc, memoryTracker, interruptSignal) if err != nil { return nil, err } @@ -3814,7 +3979,7 @@ func (builder *dataReaderBuilder) buildIndexReaderForIndexJoin(ctx context.Conte } func (builder *dataReaderBuilder) buildIndexLookUpReaderForIndexJoin(ctx context.Context, v *plannercore.PhysicalIndexLookUpReader, - lookUpContents []*indexJoinLookUpContent, indexRanges []*ranger.Range, keyOff2IdxOff []int, cwc *plannercore.ColWithCmpFuncManager) (Executor, error) { + lookUpContents []*indexJoinLookUpContent, indexRanges []*ranger.Range, keyOff2IdxOff []int, cwc *plannercore.ColWithCmpFuncManager, memTracker *memory.Tracker, interruptSignal *atomic.Value) (Executor, error) { e, err := buildNoRangeIndexLookUpReader(builder.executorBuilder, v) if err != nil { return nil, err @@ -3822,7 +3987,7 @@ func (builder *dataReaderBuilder) buildIndexLookUpReaderForIndexJoin(ctx context tbInfo := e.table.Meta() if tbInfo.GetPartitionInfo() == nil || !builder.ctx.GetSessionVars().UseDynamicPartitionPrune() { - e.kvRanges, err = buildKvRangesForIndexJoin(e.ctx, getPhysicalTableID(e.table), e.index.ID, lookUpContents, indexRanges, keyOff2IdxOff, cwc) + e.kvRanges, err = buildKvRangesForIndexJoin(e.ctx, getPhysicalTableID(e.table), e.index.ID, lookUpContents, indexRanges, keyOff2IdxOff, cwc, memTracker, interruptSignal) if err != nil { return nil, err } @@ -3862,18 +4027,18 @@ func (builder *dataReaderBuilder) buildIndexLookUpReaderForIndexJoin(ctx context } func (builder *dataReaderBuilder) buildProjectionForIndexJoin(ctx context.Context, v *plannercore.PhysicalProjection, - lookUpContents []*indexJoinLookUpContent, indexRanges []*ranger.Range, keyOff2IdxOff []int, cwc *plannercore.ColWithCmpFuncManager) (Executor, error) { + lookUpContents []*indexJoinLookUpContent, indexRanges []*ranger.Range, keyOff2IdxOff []int, cwc *plannercore.ColWithCmpFuncManager, memTracker *memory.Tracker, interruptSignal *atomic.Value) (Executor, error) { var ( childExec Executor err error ) switch op := v.Children()[0].(type) { case *plannercore.PhysicalIndexLookUpReader: - if childExec, err = builder.buildIndexLookUpReaderForIndexJoin(ctx, op, lookUpContents, indexRanges, keyOff2IdxOff, cwc); err != nil { + if childExec, err = builder.buildIndexLookUpReaderForIndexJoin(ctx, op, lookUpContents, indexRanges, keyOff2IdxOff, cwc, memTracker, interruptSignal); err != nil { return nil, err } case *plannercore.PhysicalTableReader: - if childExec, err = builder.buildTableReaderForIndexJoin(ctx, op, lookUpContents, indexRanges, keyOff2IdxOff, cwc, true); err != nil { + if childExec, err = builder.buildTableReaderForIndexJoin(ctx, op, lookUpContents, indexRanges, keyOff2IdxOff, cwc, true, memTracker, interruptSignal); err != nil { return nil, err } default: @@ -3937,12 +4102,12 @@ func buildRangesForIndexJoin(ctx sessionctx.Context, lookUpContents []*indexJoin return retRanges, nil } - return ranger.UnionRanges(ctx.GetSessionVars().StmtCtx, tmpDatumRanges, true) + return ranger.UnionRanges(ctx, tmpDatumRanges, true) } // buildKvRangesForIndexJoin builds kv ranges for index join when the inner plan is index scan plan. func buildKvRangesForIndexJoin(ctx sessionctx.Context, tableID, indexID int64, lookUpContents []*indexJoinLookUpContent, - ranges []*ranger.Range, keyOff2IdxOff []int, cwc *plannercore.ColWithCmpFuncManager) (_ []kv.KeyRange, err error) { + ranges []*ranger.Range, keyOff2IdxOff []int, cwc *plannercore.ColWithCmpFuncManager, memTracker *memory.Tracker, interruptSignal *atomic.Value) (_ []kv.KeyRange, err error) { kvRanges := make([]kv.KeyRange, 0, len(ranges)*len(lookUpContents)) lastPos := len(ranges[0].LowVal) - 1 sc := ctx.GetSessionVars().StmtCtx @@ -3961,7 +4126,7 @@ func buildKvRangesForIndexJoin(ctx sessionctx.Context, tableID, indexID int64, l if indexID == -1 { tmpKvRanges, err = distsql.CommonHandleRangesToKVRanges(sc, []int64{tableID}, ranges) } else { - tmpKvRanges, err = distsql.IndexRangesToKVRanges(sc, tableID, indexID, ranges, nil) + tmpKvRanges, err = distsql.IndexRangesToKVRangesWithInterruptSignal(sc, tableID, indexID, ranges, nil, memTracker, interruptSignal) } if err != nil { return nil, err @@ -3983,7 +4148,12 @@ func buildKvRangesForIndexJoin(ctx sessionctx.Context, tableID, indexID int64, l } } } - + if len(kvRanges) != 0 && memTracker != nil { + memTracker.Consume(int64(2 * cap(kvRanges[0].StartKey) * len(kvRanges))) + } + if len(tmpDatumRanges) != 0 && memTracker != nil { + memTracker.Consume(2 * int64(len(tmpDatumRanges)) * types.EstimatedMemUsage(tmpDatumRanges[0].LowVal, len(tmpDatumRanges))) + } if cwc == nil { sort.Slice(kvRanges, func(i, j int) bool { return bytes.Compare(kvRanges[i].StartKey, kvRanges[j].StartKey) < 0 @@ -3991,7 +4161,7 @@ func buildKvRangesForIndexJoin(ctx sessionctx.Context, tableID, indexID int64, l return kvRanges, nil } - tmpDatumRanges, err = ranger.UnionRanges(ctx.GetSessionVars().StmtCtx, tmpDatumRanges, true) + tmpDatumRanges, err = ranger.UnionRanges(ctx, tmpDatumRanges, true) if err != nil { return nil, err } @@ -3999,7 +4169,7 @@ func buildKvRangesForIndexJoin(ctx sessionctx.Context, tableID, indexID int64, l if indexID == -1 { return distsql.CommonHandleRangesToKVRanges(ctx.GetSessionVars().StmtCtx, []int64{tableID}, tmpDatumRanges) } - return distsql.IndexRangesToKVRanges(ctx.GetSessionVars().StmtCtx, tableID, indexID, tmpDatumRanges, nil) + return distsql.IndexRangesToKVRangesWithInterruptSignal(ctx.GetSessionVars().StmtCtx, tableID, indexID, tmpDatumRanges, nil, memTracker, interruptSignal) } func (b *executorBuilder) buildWindow(v *plannercore.PhysicalWindow) Executor { @@ -4145,7 +4315,8 @@ func (b *executorBuilder) buildShuffle(v *plannercore.PhysicalShuffle) *ShuffleE for j, dataSource := range v.DataSources { stub := plannercore.PhysicalShuffleReceiverStub{ - Receiver: (unsafe.Pointer)(receivers[j]), + Receiver: (unsafe.Pointer)(receivers[j]), + DataSource: dataSource, }.Init(b.ctx, dataSource.Stats(), dataSource.SelectBlockOffset(), nil) stub.SetSchema(dataSource.Schema()) v.Tails[j].SetChildren(stub) @@ -4231,7 +4402,7 @@ func NewRowDecoder(ctx sessionctx.Context, schema *expression.Schema, tbl *model } func (b *executorBuilder) buildBatchPointGet(plan *plannercore.BatchPointGetPlan) Executor { - if err := b.validCanReadTemporaryTable(plan.TblInfo); err != nil { + if err := b.validCanReadTemporaryOrCacheTable(plan.TblInfo); err != nil { b.err = err return nil } @@ -4260,7 +4431,9 @@ func (b *executorBuilder) buildBatchPointGet(plan *plannercore.BatchPointGetPlan partTblID: plan.PartTblID, columns: plan.Columns, } - + if plan.TblInfo.TableCacheStatusType == model.TableCacheStatusEnable { + e.cacheTable = b.getCacheTable(plan.TblInfo, startTS) + } if plan.TblInfo.TempTableType != model.TempTableNone { // Temporary table should not do any lock operations e.lock = false @@ -4516,6 +4689,28 @@ func (b *executorBuilder) buildCTETableReader(v *plannercore.PhysicalCTETable) E chkIdx: 0, } } +func (b *executorBuilder) validCanReadTemporaryOrCacheTable(tbl *model.TableInfo) error { + err := b.validCanReadTemporaryTable(tbl) + if err != nil { + return err + } + return b.validCanReadCacheTable(tbl) +} + +func (b *executorBuilder) validCanReadCacheTable(tbl *model.TableInfo) error { + if tbl.TableCacheStatusType == model.TableCacheStatusDisable { + return nil + } + + sessionVars := b.ctx.GetSessionVars() + + // Temporary table can't switch into cache table. so the following code will not cause confusion + if sessionVars.TxnCtx.IsStaleness || b.isStaleness { + return errors.Trace(errors.New("can not stale read cache table")) + } + + return nil +} func (b *executorBuilder) validCanReadTemporaryTable(tbl *model.TableInfo) error { if tbl.TempTableType == model.TempTableNone { @@ -4537,3 +4732,32 @@ func (b *executorBuilder) validCanReadTemporaryTable(tbl *model.TableInfo) error return nil } + +func (b *executorBuilder) getCacheTable(tblInfo *model.TableInfo, startTS uint64) kv.MemBuffer { + tbl, ok := b.is.TableByID(tblInfo.ID) + if !ok { + b.err = errors.Trace(infoschema.ErrTableNotExists.GenWithStackByArgs(b.ctx.GetSessionVars().CurrentDB, tblInfo.Name)) + return nil + } + cacheData := tbl.(table.CachedTable).TryReadFromCache(startTS) + if cacheData != nil { + b.ctx.GetSessionVars().StmtCtx.ReadFromTableCache = true + return cacheData + } + if !b.ctx.GetSessionVars().StmtCtx.InExplainStmt && !b.inDeleteStmt && !b.inUpdateStmt { + go func() { + defer func() { + if r := recover(); r != nil { + logutil.BgLogger().Error("panic in the recoverable goroutine", + zap.Reflect("r", r), + zap.Stack("stack trace")) + } + }() + err := tbl.(table.CachedTable).UpdateLockForRead(context.Background(), b.ctx.GetStore(), startTS) + if err != nil { + log.Warn("Update Lock Info Error") + } + }() + } + return nil +} diff --git a/executor/checksum.go b/executor/checksum.go index 611510cec864d..69fd6ed319e75 100644 --- a/executor/checksum.go +++ b/executor/checksum.go @@ -241,7 +241,7 @@ func (c *checksumContext) buildTableRequest(ctx sessionctx.Context, tableID int6 } var builder distsql.RequestBuilder - builder.SetResourceGroupTag(ctx.GetSessionVars().StmtCtx) + builder.SetResourceGroupTagger(ctx.GetSessionVars().StmtCtx) return builder.SetHandleRanges(ctx.GetSessionVars().StmtCtx, tableID, c.TableInfo.IsCommonHandle, ranges, nil). SetChecksumRequest(checksum). SetStartTS(c.StartTs). @@ -258,7 +258,7 @@ func (c *checksumContext) buildIndexRequest(ctx sessionctx.Context, tableID int6 ranges := ranger.FullRange() var builder distsql.RequestBuilder - builder.SetResourceGroupTag(ctx.GetSessionVars().StmtCtx) + builder.SetResourceGroupTagger(ctx.GetSessionVars().StmtCtx) return builder.SetIndexRanges(ctx.GetSessionVars().StmtCtx, tableID, indexInfo.ID, ranges). SetChecksumRequest(checksum). SetStartTS(c.StartTs). diff --git a/executor/collation_test.go b/executor/collation_test.go index d439a8df4fe02..83d0b7251d6bd 100644 --- a/executor/collation_test.go +++ b/executor/collation_test.go @@ -1,4 +1,4 @@ -// Copyright 2020 PingCAP, Inc. +// Copyright 2021 PingCAP, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -15,21 +15,18 @@ package executor import ( - . "github.com/pingcap/check" + "testing" + "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/mock" + "github.com/stretchr/testify/require" ) -var _ = SerialSuites(&testCollationSuite{}) - -type testCollationSuite struct { -} - -func (s *testCollationSuite) TestVecGroupChecker(c *C) { +func TestVecGroupChecker(t *testing.T) { collate.SetNewCollationEnabledForTest(true) defer collate.SetNewCollationEnabledForTest(false) @@ -53,35 +50,35 @@ func (s *testCollationSuite) TestVecGroupChecker(c *C) { tp.Collate = "bin" groupChecker.reset() _, err := groupChecker.splitIntoGroups(chk) - c.Assert(err, IsNil) + require.NoError(t, err) for i := 0; i < 6; i++ { b, e := groupChecker.getNextGroup() - c.Assert(b, Equals, i) - c.Assert(e, Equals, i+1) + require.Equal(t, b, i) + require.Equal(t, e, i+1) } - c.Assert(groupChecker.isExhausted(), IsTrue) + require.True(t, groupChecker.isExhausted()) tp.Collate = "utf8_general_ci" groupChecker.reset() _, err = groupChecker.splitIntoGroups(chk) - c.Assert(err, IsNil) + require.NoError(t, err) for i := 0; i < 3; i++ { b, e := groupChecker.getNextGroup() - c.Assert(b, Equals, i*2) - c.Assert(e, Equals, i*2+2) + require.Equal(t, b, i*2) + require.Equal(t, e, i*2+2) } - c.Assert(groupChecker.isExhausted(), IsTrue) + require.True(t, groupChecker.isExhausted()) tp.Collate = "utf8_unicode_ci" groupChecker.reset() _, err = groupChecker.splitIntoGroups(chk) - c.Assert(err, IsNil) + require.NoError(t, err) for i := 0; i < 3; i++ { b, e := groupChecker.getNextGroup() - c.Assert(b, Equals, i*2) - c.Assert(e, Equals, i*2+2) + require.Equal(t, b, i*2) + require.Equal(t, e, i*2+2) } - c.Assert(groupChecker.isExhausted(), IsTrue) + require.True(t, groupChecker.isExhausted()) // test padding tp.Collate = "utf8_bin" @@ -92,9 +89,9 @@ func (s *testCollationSuite) TestVecGroupChecker(c *C) { chk.Column(0).AppendString("a ") groupChecker.reset() _, err = groupChecker.splitIntoGroups(chk) - c.Assert(err, IsNil) + require.NoError(t, err) b, e := groupChecker.getNextGroup() - c.Assert(b, Equals, 0) - c.Assert(e, Equals, 3) - c.Assert(groupChecker.isExhausted(), IsTrue) + require.Equal(t, b, 0) + require.Equal(t, e, 3) + require.True(t, groupChecker.isExhausted()) } diff --git a/executor/compiler.go b/executor/compiler.go index 7fc7cc45e47c9..74a878b4d3293 100644 --- a/executor/compiler.go +++ b/executor/compiler.go @@ -61,7 +61,6 @@ func (c *Compiler) Compile(ctx context.Context, stmtNode ast.StmtNode) (*ExecStm if err != nil { return nil, err } - stmtNode = plannercore.TryAddExtraLimit(c.Ctx, stmtNode) finalPlan, names, err := planner.Optimize(ctx, c.Ctx, stmtNode, ret.InfoSchema) if err != nil { @@ -235,16 +234,22 @@ func getStmtDbLabel(stmtNode ast.StmtNode) map[string]struct{} { } case *ast.CreateBindingStmt: var resNode ast.ResultSetNode + var tableRef *ast.TableRefsClause if x.OriginNode != nil { switch n := x.OriginNode.(type) { case *ast.SelectStmt: - resNode = n.From.TableRefs + tableRef = n.From case *ast.DeleteStmt: - resNode = n.TableRefs.TableRefs + tableRef = n.TableRefs case *ast.UpdateStmt: - resNode = n.TableRefs.TableRefs + tableRef = n.TableRefs case *ast.InsertStmt: - resNode = n.Table.TableRefs + tableRef = n.Table + } + if tableRef != nil { + resNode = tableRef.TableRefs + } else { + resNode = nil } dbLabels := getDbFromResultNode(resNode) for _, db := range dbLabels { @@ -255,13 +260,18 @@ func getStmtDbLabel(stmtNode ast.StmtNode) map[string]struct{} { if len(dbLabelSet) == 0 && x.HintedNode != nil { switch n := x.HintedNode.(type) { case *ast.SelectStmt: - resNode = n.From.TableRefs + tableRef = n.From case *ast.DeleteStmt: - resNode = n.TableRefs.TableRefs + tableRef = n.TableRefs case *ast.UpdateStmt: - resNode = n.TableRefs.TableRefs + tableRef = n.TableRefs case *ast.InsertStmt: - resNode = n.Table.TableRefs + tableRef = n.Table + } + if tableRef != nil { + resNode = tableRef.TableRefs + } else { + resNode = nil } dbLabels := getDbFromResultNode(resNode) for _, db := range dbLabels { diff --git a/executor/concurrent_map_test.go b/executor/concurrent_map_test.go index ebf2da277ed4f..6a149c8dc93db 100644 --- a/executor/concurrent_map_test.go +++ b/executor/concurrent_map_test.go @@ -1,4 +1,4 @@ -// Copyright 2020 PingCAP, Inc. +// Copyright 2021 PingCAP, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -16,19 +16,20 @@ package executor import ( "sync" + "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/util/chunk" + "github.com/stretchr/testify/require" ) // TestConcurrentMap first inserts 1000 entries, then checks them -func (cm *pkgTestSuite) TestConcurrentMap(c *C) { +func TestConcurrentMap(t *testing.T) { m := newConcurrentMap() const iterations = 1000 const mod = 111 wg := &sync.WaitGroup{} wg.Add(2) - // Using go routines insert 1000 entires into the map. + // Using go routines insert 1000 entries into the map. go func() { defer wg.Done() for i := 0; i < iterations/2; i++ { @@ -50,17 +51,17 @@ func (cm *pkgTestSuite) TestConcurrentMap(c *C) { for i := 0; i < iterations; i++ { found := false for en, ok := m.Get(uint64(i % mod)); en != nil; en = en.next { - c.Assert(ok, IsTrue) + require.True(t, ok) if en.ptr.RowIdx == uint32(i) && en.ptr.ChkIdx == uint32(i) { found = true } } - c.Assert(found, IsTrue) + require.True(t, found) } // test some unexpected cases _, ok := m.Get(uint64(mod)) - c.Assert(ok, IsFalse) + require.False(t, ok) _, ok = m.Get(uint64(mod + 1)) - c.Assert(ok, IsFalse) + require.False(t, ok) } diff --git a/executor/coprocessor.go b/executor/coprocessor.go index 6eb438d5aaeb5..8970629c9f4b8 100644 --- a/executor/coprocessor.go +++ b/executor/coprocessor.go @@ -118,8 +118,8 @@ func (h *CoprocessorDAGHandler) buildResponseAndSendToStream(chk *chunk.Chunk, t return stream.Send(h.buildErrorResponse(err)) } - for _, c := range chunks { - resp := h.buildStreamResponse(&c) + for i := range chunks { + resp := h.buildStreamResponse(&chunks[i]) if err = stream.Send(resp); err != nil { return err } @@ -144,8 +144,8 @@ func (h *CoprocessorDAGHandler) buildDAGExecutor(req *coprocessor.Request) (Exec Username: dagReq.User.UserName, Hostname: dagReq.User.UserHost, } - authName, authHost, success := pm.GetAuthWithoutVerification(dagReq.User.UserName, dagReq.User.UserHost) - if success { + authName, authHost, success := pm.MatchIdentity(dagReq.User.UserName, dagReq.User.UserHost, false) + if success && pm.GetAuthWithoutVerification(authName, authHost) { h.sctx.GetSessionVars().User.AuthUsername = authName h.sctx.GetSessionVars().User.AuthHostname = authHost h.sctx.GetSessionVars().ActiveRoles = pm.GetDefaultRoles(authName, authHost) diff --git a/executor/cte.go b/executor/cte.go index 3ce82c3920559..8345bf5e57f5d 100644 --- a/executor/cte.go +++ b/executor/cte.go @@ -204,8 +204,10 @@ func (e *CTEExec) Close() (err error) { } // `iterInTbl` and `resTbl` are shared by multiple operators, // so will be closed when the SQL finishes. - if err = e.iterOutTbl.DerefAndClose(); err != nil { - return err + if e.iterOutTbl != nil { + if err = e.iterOutTbl.DerefAndClose(); err != nil { + return err + } } } diff --git a/executor/cte_serial_test.go b/executor/cte_serial_test.go deleted file mode 100644 index b8b04551b0c6e..0000000000000 --- a/executor/cte_serial_test.go +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2021 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, -// 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. - -package executor_test - -import ( - "fmt" - "math/rand" - "sort" - "testing" - - "github.com/pingcap/failpoint" - "github.com/pingcap/tidb/config" - "github.com/pingcap/tidb/testkit" - "github.com/stretchr/testify/require" -) - -func TestSpillToDisk(t *testing.T) { - defer config.RestoreFunc()() - config.UpdateGlobal(func(conf *config.Config) { - conf.OOMUseTmpStorage = true - }) - - store, close := testkit.CreateMockStore(t) - defer close() - - tk := testkit.NewTestKit(t, store) - tk.MustExec("use test;") - - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/testCTEStorageSpill", "return(true)")) - defer func() { - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/executor/testCTEStorageSpill")) - tk.MustExec("set tidb_mem_quota_query = 1073741824;") - }() - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/testSortedRowContainerSpill", "return(true)")) - defer func() { - require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/executor/testSortedRowContainerSpill")) - }() - - // Use duplicated rows to test UNION DISTINCT. - tk.MustExec("set tidb_mem_quota_query = 1073741824;") - insertStr := "insert into t1 values(0)" - rowNum := 1000 - vals := make([]int, rowNum) - vals[0] = 0 - for i := 1; i < rowNum; i++ { - v := rand.Intn(100) - vals[i] = v - insertStr += fmt.Sprintf(", (%d)", v) - } - tk.MustExec("drop table if exists t1;") - tk.MustExec("create table t1(c1 int);") - tk.MustExec(insertStr) - tk.MustExec("set tidb_mem_quota_query = 40000;") - tk.MustExec("set cte_max_recursion_depth = 500000;") - sql := fmt.Sprintf("with recursive cte1 as ( "+ - "select c1 from t1 "+ - "union "+ - "select c1 + 1 c1 from cte1 where c1 < %d) "+ - "select c1 from cte1 order by c1;", rowNum) - rows := tk.MustQuery(sql) - - memTracker := tk.Session().GetSessionVars().StmtCtx.MemTracker - diskTracker := tk.Session().GetSessionVars().StmtCtx.DiskTracker - require.Greater(t, memTracker.MaxConsumed(), int64(0)) - require.Greater(t, diskTracker.MaxConsumed(), int64(0)) - - sort.Ints(vals) - resRows := make([]string, 0, rowNum) - for i := vals[0]; i <= rowNum; i++ { - resRows = append(resRows, fmt.Sprintf("%d", i)) - } - rows.Check(testkit.Rows(resRows...)) -} diff --git a/executor/cte_test.go b/executor/cte_test.go index 3a9c3a5a7987f..bf6d33ede4a42 100644 --- a/executor/cte_test.go +++ b/executor/cte_test.go @@ -16,15 +16,17 @@ package executor_test import ( "fmt" + "math/rand" + "sort" "testing" + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/testkit" "github.com/stretchr/testify/require" ) func TestBasicCTE(t *testing.T) { - t.Parallel() - store, close := testkit.CreateMockStore(t) defer close() @@ -74,8 +76,6 @@ func TestBasicCTE(t *testing.T) { } func TestUnionDistinct(t *testing.T) { - t.Parallel() - store, close := testkit.CreateMockStore(t) defer close() @@ -103,8 +103,6 @@ func TestUnionDistinct(t *testing.T) { } func TestCTEMaxRecursionDepth(t *testing.T) { - t.Parallel() - store, close := testkit.CreateMockStore(t) defer close() @@ -146,8 +144,6 @@ func TestCTEMaxRecursionDepth(t *testing.T) { } func TestCTEWithLimit(t *testing.T) { - t.Parallel() - store, close := testkit.CreateMockStore(t) defer close() @@ -354,3 +350,61 @@ func TestCTEWithLimit(t *testing.T) { rows = tk.MustQuery("with recursive cte1(c1) as (select c1 from t1 union all select c1 + 1 from cte1 limit 4 offset 4) select * from cte1;") rows.Check(testkit.Rows("3", "4", "3", "4")) } + +func TestSpillToDisk(t *testing.T) { + defer config.RestoreFunc()() + config.UpdateGlobal(func(conf *config.Config) { + conf.OOMUseTmpStorage = true + }) + + store, close := testkit.CreateMockStore(t) + defer close() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test;") + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/testCTEStorageSpill", "return(true)")) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/executor/testCTEStorageSpill")) + tk.MustExec("set tidb_mem_quota_query = 1073741824;") + }() + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/testSortedRowContainerSpill", "return(true)")) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/executor/testSortedRowContainerSpill")) + }() + + // Use duplicated rows to test UNION DISTINCT. + tk.MustExec("set tidb_mem_quota_query = 1073741824;") + insertStr := "insert into t1 values(0)" + rowNum := 1000 + vals := make([]int, rowNum) + vals[0] = 0 + for i := 1; i < rowNum; i++ { + v := rand.Intn(100) + vals[i] = v + insertStr += fmt.Sprintf(", (%d)", v) + } + tk.MustExec("drop table if exists t1;") + tk.MustExec("create table t1(c1 int);") + tk.MustExec(insertStr) + tk.MustExec("set tidb_mem_quota_query = 40000;") + tk.MustExec("set cte_max_recursion_depth = 500000;") + sql := fmt.Sprintf("with recursive cte1 as ( "+ + "select c1 from t1 "+ + "union "+ + "select c1 + 1 c1 from cte1 where c1 < %d) "+ + "select c1 from cte1 order by c1;", rowNum) + rows := tk.MustQuery(sql) + + memTracker := tk.Session().GetSessionVars().StmtCtx.MemTracker + diskTracker := tk.Session().GetSessionVars().StmtCtx.DiskTracker + require.Greater(t, memTracker.MaxConsumed(), int64(0)) + require.Greater(t, diskTracker.MaxConsumed(), int64(0)) + + sort.Ints(vals) + resRows := make([]string, 0, rowNum) + for i := vals[0]; i <= rowNum; i++ { + resRows = append(resRows, fmt.Sprintf("%d", i)) + } + rows.Check(testkit.Rows(resRows...)) +} diff --git a/executor/ddl.go b/executor/ddl.go index 1fa57f77822aa..4c2be5828b8a8 100644 --- a/executor/ddl.go +++ b/executor/ddl.go @@ -185,7 +185,18 @@ func (e *DDLExec) Next(ctx context.Context, req *chunk.Chunk) (err error) { case *ast.AlterSequenceStmt: err = e.executeAlterSequence(x) case *ast.CreatePlacementPolicyStmt: + if x.OrReplace && x.IfNotExists { + err = ddl.ErrWrongUsage.GenWithStackByArgs("OR REPLACE", "IF NOT EXISTS") + break + } err = e.executeCreatePlacementPolicy(x) + if x.OrReplace && errors.ErrorEqual(err, infoschema.ErrPlacementPolicyExists) { + alterStmt := &ast.AlterPlacementPolicyStmt{ + PolicyName: x.PolicyName, + PlacementOptions: x.PlacementOptions, + } + err = e.executeAlterPlacementPolicy(alterStmt) + } case *ast.DropPlacementPolicyStmt: err = e.executeDropPlacementPolicy(x) case *ast.AlterPlacementPolicyStmt: @@ -361,7 +372,7 @@ func (e *DDLExec) createSessionTemporaryTable(s *ast.CreateTableStmt) error { return err } - return e.tempTableDDL.CreateLocalTemporaryTable(dbInfo.Name, tbInfo) + return e.tempTableDDL.CreateLocalTemporaryTable(dbInfo, tbInfo) } func (e *DDLExec) executeCreateView(s *ast.CreateViewStmt) error { @@ -791,20 +802,23 @@ func (e *DDLExec) executeFlashbackTable(s *ast.FlashBackTableStmt) error { } func (e *DDLExec) executeLockTables(s *ast.LockTablesStmt) error { + if !config.TableLockEnabled() { + e.ctx.GetSessionVars().StmtCtx.AppendWarning(ErrFuncNotEnabled.GenWithStackByArgs("LOCK TABLES", "enable-table-lock")) + return nil + } + for _, tb := range s.TableLocks { if _, ok := e.getLocalTemporaryTable(tb.Table.Schema, tb.Table.Name); ok { return ddl.ErrUnsupportedLocalTempTableDDL.GenWithStackByArgs("LOCK TABLES") } } - if !config.TableLockEnabled() { - return nil - } return domain.GetDomain(e.ctx).DDL().LockTables(e.ctx, s) } func (e *DDLExec) executeUnlockTables(_ *ast.UnlockTablesStmt) error { if !config.TableLockEnabled() { + e.ctx.GetSessionVars().StmtCtx.AppendWarning(ErrFuncNotEnabled.GenWithStackByArgs("UNLOCK TABLES", "enable-table-lock")) return nil } lockedTables := e.ctx.GetAllTableLocks() diff --git a/executor/ddl_test.go b/executor/ddl_test.go index 1e8c4701a814a..eb3f344e0c3fb 100644 --- a/executor/ddl_test.go +++ b/executor/ddl_test.go @@ -111,7 +111,7 @@ func (s *testSuite6) TestCreateTable(c *C) { rs, err := tk.Exec(`desc issue312_1`) c.Assert(err, IsNil) ctx := context.Background() - req := rs.NewChunk() + req := rs.NewChunk(nil) it := chunk.NewIterator4Chunk(req) for { err1 := rs.Next(ctx, req) @@ -125,7 +125,7 @@ func (s *testSuite6) TestCreateTable(c *C) { } rs, err = tk.Exec(`desc issue312_2`) c.Assert(err, IsNil) - req = rs.NewChunk() + req = rs.NewChunk(nil) it = chunk.NewIterator4Chunk(req) for { err1 := rs.Next(ctx, req) @@ -536,7 +536,7 @@ func (s *testSuite6) TestAlterTableAddColumn(c *C) { now := time.Now().Add(-1 * time.Millisecond).Format(types.TimeFormat) r, err := tk.Exec("select c2 from alter_test") c.Assert(err, IsNil) - req := r.NewChunk() + req := r.NewChunk(nil) err = r.Next(context.Background(), req) c.Assert(err, IsNil) row := req.GetRow(0) @@ -564,7 +564,7 @@ func (s *testSuite6) TestAlterTableAddColumns(c *C) { tk.MustExec("alter table alter_test add column (c7 timestamp default current_timestamp, c3 varchar(50) default 'CURRENT_TIMESTAMP')") r, err := tk.Exec("select c2 from alter_test") c.Assert(err, IsNil) - req := r.NewChunk() + req := r.NewChunk(nil) err = r.Next(context.Background(), req) c.Assert(err, IsNil) row := req.GetRow(0) @@ -1205,7 +1205,7 @@ func (s *testSuite6) TestMaxHandleAddIndex(c *C) { tk.MustExec("admin check table t1") } -func (s *testSuite6) TestSetDDLReorgWorkerCnt(c *C) { +func (s *testSerialSuite) TestSetDDLReorgWorkerCnt(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") err := ddlutil.LoadDDLReorgVars(context.Background(), tk.Se) @@ -1244,7 +1244,7 @@ func (s *testSuite6) TestSetDDLReorgWorkerCnt(c *C) { tk.MustQuery("select @@global.tidb_ddl_reorg_worker_cnt").Check(testkit.Rows("256")) } -func (s *testSuite6) TestSetDDLReorgBatchSize(c *C) { +func (s *testSerialSuite) TestSetDDLReorgBatchSize(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") err := ddlutil.LoadDDLReorgVars(context.Background(), tk.Se) diff --git a/executor/delete_test.go b/executor/delete_test.go index 639be55450003..64c61996fac66 100644 --- a/executor/delete_test.go +++ b/executor/delete_test.go @@ -1,4 +1,4 @@ -// Copyright 2020 PingCAP, Inc. +// Copyright 2021 PingCAP, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -16,15 +16,18 @@ package executor_test import ( "sync" + "testing" "time" - . "github.com/pingcap/check" "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/util/testkit" + "github.com/pingcap/tidb/testkit" ) -func (s *testSuite8) TestDeleteLockKey(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestDeleteLockKey(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec(`drop table if exists t1, t2, t3, t4, t5, t6;`) @@ -73,26 +76,26 @@ func (s *testSuite8) TestDeleteLockKey(c *C) { }, } var wg sync.WaitGroup - for _, t := range cases { + for _, testCase := range cases { wg.Add(1) - go func(t struct { + go func(testCase struct { ddl string pre string tk1Stmt string tk2Stmt string }) { - tk1, tk2 := testkit.NewTestKit(c, s.store), testkit.NewTestKit(c, s.store) + tk1, tk2 := testkit.NewTestKit(t, store), testkit.NewTestKit(t, store) tk1.MustExec("use test") tk2.MustExec("use test") - tk1.Se.GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeIntOnly - tk1.MustExec(t.ddl) - tk1.MustExec(t.pre) + tk1.Session().GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeIntOnly + tk1.MustExec(testCase.ddl) + tk1.MustExec(testCase.pre) tk1.MustExec("begin pessimistic") tk2.MustExec("begin pessimistic") - tk1.MustExec(t.tk1Stmt) + tk1.MustExec(testCase.tk1Stmt) doneCh := make(chan struct{}, 1) go func() { - tk2.MustExec(t.tk2Stmt) + tk2.MustExec(testCase.tk2Stmt) doneCh <- struct{}{} }() time.Sleep(50 * time.Millisecond) @@ -100,13 +103,16 @@ func (s *testSuite8) TestDeleteLockKey(c *C) { <-doneCh tk2.MustExec("commit") wg.Done() - }(t) + }(testCase) } wg.Wait() } -func (s *testSuite8) TestIssue21200(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue21200(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("drop database if exists TEST1") tk.MustExec("create database TEST1") tk.MustExec("use TEST1") diff --git a/executor/distsql.go b/executor/distsql.go index 5a39794a8e76b..1c31130dc53b5 100644 --- a/executor/distsql.go +++ b/executor/distsql.go @@ -197,12 +197,14 @@ type IndexReaderExecutor struct { } // Close clears all resources hold by current object. -func (e *IndexReaderExecutor) Close() error { +func (e *IndexReaderExecutor) Close() (err error) { if e.table != nil && e.table.Meta().TempTableType != model.TempTableNone { return nil } - err := e.result.Close() + if e.result != nil { + err = e.result.Close() + } e.result = nil e.ctx.StoreQueryFeedback(e.feedback) return err @@ -279,6 +281,7 @@ func (e *IndexReaderExecutor) open(ctx context.Context, kvRanges []kv.KeyRange) e.kvRanges = kvRanges // Treat temporary table as dummy table, avoid sending distsql request to TiKV. // In a test case IndexReaderExecutor is mocked and e.table is nil. + // Avoid sending distsql request to TIKV. if e.table != nil && e.table.Meta().TempTableType != model.TempTableNone { return nil } @@ -373,6 +376,9 @@ type IndexLookUpExecutor struct { // extraPIDColumnIndex is used for partition reader to add an extra partition ID column, default -1 extraPIDColumnIndex offsetOptional + + // cancelFunc is called when close the executor + cancelFunc context.CancelFunc } type getHandleType int8 @@ -486,6 +492,8 @@ func (e *IndexLookUpExecutor) open(ctx context.Context) error { func (e *IndexLookUpExecutor) startWorkers(ctx context.Context, initBatchSize int) error { // indexWorker will write to workCh and tableWorker will read from workCh, // so fetching index and getting table data can run concurrently. + ctx, cancel := context.WithCancel(ctx) + e.cancelFunc = cancel workCh := make(chan *lookupTableTask, 1) if err := e.startIndexWorker(ctx, workCh, initBatchSize); err != nil { return err @@ -675,6 +683,10 @@ func (e *IndexLookUpExecutor) Close() error { return nil } + if e.cancelFunc != nil { + e.cancelFunc() + e.cancelFunc = nil + } close(e.finished) // Drain the resultCh and discard the result, in case that Next() doesn't fully // consume the data, background worker still writing to resultCh and block forever. @@ -1118,6 +1130,13 @@ func (w *tableWorker) compareData(ctx context.Context, task *lookupTableTask, ta chk := newFirstChunk(tableReader) tblInfo := w.idxLookup.table.Meta() vals := make([]types.Datum, 0, len(w.idxTblCols)) + + // Prepare collator for compare. + collators := make([]collate.Collator, 0, len(w.idxColTps)) + for _, tp := range w.idxColTps { + collators = append(collators, collate.GetCollator(tp.Collate)) + } + for { err := Next(ctx, tableReader, chk) if err != nil { @@ -1154,19 +1173,19 @@ func (w *tableWorker) compareData(ctx context.Context, task *lookupTableTask, ta } tablecodec.TruncateIndexValues(tblInfo, w.idxLookup.index, vals) sctx := w.idxLookup.ctx.GetSessionVars().StmtCtx - for i, val := range vals { + for i := range vals { col := w.idxTblCols[i] tp := &col.FieldType idxVal := idxRow.GetDatum(i, tp) tablecodec.TruncateIndexValue(&idxVal, w.idxLookup.index.Columns[i], col.ColumnInfo) - cmpRes, err := idxVal.CompareDatum(sctx, &val) + cmpRes, err := idxVal.Compare(sctx, &vals[i], collators[i]) if err != nil { return ErrDataInConsistentMisMatchIndex.GenWithStackByArgs(col.Name, - handle, idxRow.GetDatum(i, tp), val, err) + handle, idxRow.GetDatum(i, tp), vals[i], err) } if cmpRes != 0 { return ErrDataInConsistentMisMatchIndex.GenWithStackByArgs(col.Name, - handle, idxRow.GetDatum(i, tp), val, err) + handle, idxRow.GetDatum(i, tp), vals[i], err) } } } diff --git a/executor/distsql_test.go b/executor/distsql_test.go index 78bed88f61043..a832b8913f66c 100644 --- a/executor/distsql_test.go +++ b/executor/distsql_test.go @@ -81,7 +81,7 @@ func (s *testSuite3) TestCopClientSend(c *C) { // Send coprocessor request when the table split. rs, err := tk.Exec("select sum(id) from copclient") c.Assert(err, IsNil) - req := rs.NewChunk() + req := rs.NewChunk(nil) err = rs.Next(ctx, req) c.Assert(err, IsNil) c.Assert(req.GetRow(0).GetMyDecimal(0).String(), Equals, "499500") @@ -96,7 +96,7 @@ func (s *testSuite3) TestCopClientSend(c *C) { // Check again. rs, err = tk.Exec("select sum(id) from copclient") c.Assert(err, IsNil) - req = rs.NewChunk() + req = rs.NewChunk(nil) err = rs.Next(ctx, req) c.Assert(err, IsNil) c.Assert(req.GetRow(0).GetMyDecimal(0).String(), Equals, "499500") @@ -105,7 +105,7 @@ func (s *testSuite3) TestCopClientSend(c *C) { // Check there is no goroutine leak. rs, err = tk.Exec("select * from copclient order by id") c.Assert(err, IsNil) - req = rs.NewChunk() + req = rs.NewChunk(nil) err = rs.Next(ctx, req) c.Assert(err, IsNil) c.Assert(rs.Close(), IsNil) diff --git a/executor/errors.go b/executor/errors.go index fe5da7ce0871e..f6e0f87d08e6b 100644 --- a/executor/errors.go +++ b/executor/errors.go @@ -61,6 +61,10 @@ var ( ErrCTEMaxRecursionDepth = dbterror.ClassExecutor.NewStd(mysql.ErrCTEMaxRecursionDepth) ErrDataInConsistentExtraIndex = dbterror.ClassExecutor.NewStd(mysql.ErrDataInConsistentExtraIndex) ErrDataInConsistentMisMatchIndex = dbterror.ClassExecutor.NewStd(mysql.ErrDataInConsistentMisMatchIndex) + ErrNotSupportedWithSem = dbterror.ClassOptimizer.NewStd(mysql.ErrNotSupportedWithSem) + ErrPluginIsNotLoaded = dbterror.ClassExecutor.NewStd(mysql.ErrPluginIsNotLoaded) + ErrSetPasswordAuthPlugin = dbterror.ClassExecutor.NewStd(mysql.ErrSetPasswordAuthPlugin) + ErrFuncNotEnabled = dbterror.ClassExecutor.NewStdErr(mysql.ErrNotSupportedYet, parser_mysql.Message("%-.32s is not supported. To enable this experimental feature, set '%-.32s' in the configuration file.", nil)) errUnsupportedFlashbackTmpTable = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message("Recover/flashback table is not supported on temporary tables", nil)) errTruncateWrongInsertValue = dbterror.ClassTable.NewStdErr(mysql.ErrTruncatedWrongValue, parser_mysql.Message("Incorrect %-.32s value: '%-.128s' for column '%.192s' at row %d", nil)) diff --git a/executor/executor.go b/executor/executor.go index 46cca549462d1..7923c9d696787 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -31,6 +31,7 @@ import ( "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" "github.com/pingcap/failpoint" + "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/domain/infosync" @@ -39,7 +40,6 @@ import ( "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/meta/autoid" - "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/auth" "github.com/pingcap/tidb/parser/model" @@ -978,18 +978,30 @@ func (e *SelectLockExec) Next(ctx context.Context, req *chunk.Chunk) error { } func newLockCtx(seVars *variable.SessionVars, lockWaitTime int64) *tikvstore.LockCtx { - var planDigest *parser.Digest - _, sqlDigest := seVars.StmtCtx.SQLDigest() - if variable.TopSQLEnabled() { - _, planDigest = seVars.StmtCtx.GetPlanDigest() - } lockCtx := tikvstore.NewLockCtx(seVars.TxnCtx.GetForUpdateTS(), lockWaitTime, seVars.StmtCtx.GetLockWaitStartTime()) lockCtx.Killed = &seVars.Killed lockCtx.PessimisticLockWaited = &seVars.StmtCtx.PessimisticLockWaited lockCtx.LockKeysDuration = &seVars.StmtCtx.LockKeysDuration lockCtx.LockKeysCount = &seVars.StmtCtx.LockKeysCount lockCtx.LockExpired = &seVars.TxnCtx.LockExpire - lockCtx.ResourceGroupTag = resourcegrouptag.EncodeResourceGroupTag(sqlDigest, planDigest) + lockCtx.ResourceGroupTagger = func(req *kvrpcpb.PessimisticLockRequest) []byte { + if req == nil { + return nil + } + if len(req.Mutations) == 0 { + return nil + } + if mutation := req.Mutations[0]; mutation != nil { + label := resourcegrouptag.GetResourceGroupLabelByKey(mutation.Key) + normalized, digest := seVars.StmtCtx.SQLDigest() + if len(normalized) == 0 { + return nil + } + _, planDigest := seVars.StmtCtx.GetPlanDigest() + return resourcegrouptag.EncodeResourceGroupTag(digest, planDigest, label) + } + return nil + } lockCtx.OnDeadlock = func(deadlock *tikverr.ErrDeadlock) { cfg := config.GetGlobalConfig() if deadlock.IsRetryable && !cfg.PessimisticTxn.DeadlockHistoryCollectRetryable { @@ -1692,6 +1704,9 @@ func ResetContextOfStmt(ctx sessionctx.Context, s ast.StmtNode) (err error) { sc.CTEStorageMap = map[int]*CTEStorages{} sc.IsStaleness = false sc.LockTableIDs = make(map[int64]struct{}) + sc.EnableOptimizeTrace = false + sc.LogicalOptimizeTrace = nil + sc.OptimizerCETrace = nil sc.InitMemTracker(memory.LabelForSQLText, vars.MemQuotaQuery) sc.InitDiskTracker(memory.LabelForSQLText, -1) @@ -1904,8 +1919,8 @@ func FillVirtualColumnValue(virtualRetTypes []*types.FieldType, virtualColumnInd return nil } -func setResourceGroupTagForTxn(sc *stmtctx.StatementContext, snapshot kv.Snapshot) { +func setResourceGroupTaggerForTxn(sc *stmtctx.StatementContext, snapshot kv.Snapshot) { if snapshot != nil && variable.TopSQLEnabled() { - snapshot.SetOption(kv.ResourceGroupTag, sc.GetResourceGroupTag()) + snapshot.SetOption(kv.ResourceGroupTagger, sc.GetResourceGroupTagger()) } } diff --git a/executor/executor_pkg_test.go b/executor/executor_pkg_test.go index e15fd0ceda486..1b449f5fed6a6 100644 --- a/executor/executor_pkg_test.go +++ b/executor/executor_pkg_test.go @@ -19,10 +19,10 @@ import ( "crypto/tls" "runtime" "strconv" + "testing" "time" "unsafe" - . "github.com/pingcap/check" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/executor/aggfuncs" @@ -32,7 +32,7 @@ import ( "github.com/pingcap/tidb/parser/auth" "github.com/pingcap/tidb/parser/mysql" plannerutil "github.com/pingcap/tidb/planner/util" - txninfo "github.com/pingcap/tidb/session/txninfo" + "github.com/pingcap/tidb/session/txninfo" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" @@ -42,23 +42,15 @@ import ( "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/ranger" "github.com/pingcap/tidb/util/tableutil" + "github.com/stretchr/testify/require" ) -var _ = SerialSuites(&testExecSuite{}) -var _ = SerialSuites(&testExecSerialSuite{}) - // Note: it's a tricky way to export the `inspectionSummaryRules` and `inspectionRules` for unit test but invisible for normal code var ( InspectionSummaryRules = inspectionSummaryRules InspectionRules = inspectionRules ) -type testExecSuite struct { -} - -type testExecSerialSuite struct { -} - // mockSessionManager is a mocked session manager which is used for test. type mockSessionManager struct { PS []*util.ProcessInfo @@ -105,7 +97,16 @@ func (msm *mockSessionManager) SetServerID(serverID uint64) { msm.serverID = serverID } -func (s *testExecSuite) TestShowProcessList(c *C) { +func TestExecutorPkg(t *testing.T) { + t.Run("ShowProcessList", SubTestShowProcessList) + t.Run("BuildKvRangesForIndexJoinWithoutCwc", SubTestBuildKvRangesForIndexJoinWithoutCwc) + t.Run("GetFieldsFromLine", SubTestGetFieldsFromLine) + t.Run("SlowQueryRuntimeStats", SubTestSlowQueryRuntimeStats) + t.Run("AggPartialResultMapperB", SubTestAggPartialResultMapperB) + t.Run("FilterTemporaryTableKeys", SubTestFilterTemporaryTableKeys) +} + +func SubTestShowProcessList(t *testing.T) { // Compose schema. names := []string{"Id", "User", "Host", "db", "Command", "Time", "State", "Info"} ftypes := []byte{mysql.TypeLonglong, mysql.TypeVarchar, mysql.TypeVarchar, @@ -139,23 +140,23 @@ func (s *testExecSuite) TestShowProcessList(c *C) { ctx := context.Background() err := e.Open(ctx) - c.Assert(err, IsNil) + require.NoError(t, err) chk := newFirstChunk(e) it := chunk.NewIterator4Chunk(chk) // Run test and check results. for _, p := range ps { err = e.Next(context.Background(), chk) - c.Assert(err, IsNil) + require.NoError(t, err) for row := it.Begin(); row != it.End(); row = it.Next() { - c.Assert(row.GetUint64(0), Equals, p.ID) + require.Equal(t, row.GetUint64(0), p.ID) } } err = e.Next(context.Background(), chk) - c.Assert(err, IsNil) - c.Assert(chk.NumRows(), Equals, 0) + require.NoError(t, err) + require.Equal(t, 0, chk.NumRows()) err = e.Close() - c.Assert(err, IsNil) + require.NoError(t, err) } func buildSchema(names []string, ftypes []byte) *expression.Schema { @@ -178,7 +179,7 @@ func buildSchema(names []string, ftypes []byte) *expression.Schema { return schema } -func (s *testExecSuite) TestBuildKvRangesForIndexJoinWithoutCwc(c *C) { +func SubTestBuildKvRangesForIndexJoinWithoutCwc(t *testing.T) { indexRanges := make([]*ranger.Range, 0, 6) indexRanges = append(indexRanges, generateIndexRange(1, 1, 1, 1, 1)) indexRanges = append(indexRanges, generateIndexRange(1, 1, 2, 1, 1)) @@ -196,13 +197,13 @@ func (s *testExecSuite) TestBuildKvRangesForIndexJoinWithoutCwc(c *C) { keyOff2IdxOff := []int{1, 3} ctx := mock.NewContext() - kvRanges, err := buildKvRangesForIndexJoin(ctx, 0, 0, joinKeyRows, indexRanges, keyOff2IdxOff, nil) - c.Assert(err, IsNil) + kvRanges, err := buildKvRangesForIndexJoin(ctx, 0, 0, joinKeyRows, indexRanges, keyOff2IdxOff, nil, nil, nil) + require.NoError(t, err) // Check the kvRanges is in order. for i, kvRange := range kvRanges { - c.Assert(kvRange.StartKey.Cmp(kvRange.EndKey) < 0, IsTrue) + require.True(t, kvRange.StartKey.Cmp(kvRange.EndKey) < 0) if i > 0 { - c.Assert(kvRange.StartKey.Cmp(kvRanges[i-1].EndKey) >= 0, IsTrue) + require.True(t, kvRange.StartKey.Cmp(kvRanges[i-1].EndKey) >= 0) } } } @@ -222,7 +223,7 @@ func generateDatumSlice(vals ...int64) []types.Datum { return datums } -func (s *testExecSuite) TestGetFieldsFromLine(c *C) { +func SubTestGetFieldsFromLine(t *testing.T) { tests := []struct { input string expected []string @@ -265,15 +266,143 @@ func (s *testExecSuite) TestGetFieldsFromLine(c *C) { for _, test := range tests { got, err := ldInfo.getFieldsFromLine([]byte(test.input)) - c.Assert(err, IsNil, Commentf("failed: %s", test.input)) - assertEqualStrings(c, got, test.expected) + require.NoErrorf(t, err, "failed: %s", test.input) + assertEqualStrings(t, got, test.expected) } _, err := ldInfo.getFieldsFromLine([]byte(`1,a string,100.20`)) - c.Assert(err, IsNil) + require.NoError(t, err) +} + +func assertEqualStrings(t *testing.T, got []field, expect []string) { + require.Equal(t, len(expect), len(got)) + for i := 0; i < len(got); i++ { + require.Equal(t, expect[i], string(got[i].str)) + } +} + +func SubTestSlowQueryRuntimeStats(t *testing.T) { + stats := &slowQueryRuntimeStats{ + totalFileNum: 2, + readFileNum: 2, + readFile: time.Second, + initialize: time.Millisecond, + readFileSize: 1024 * 1024 * 1024, + parseLog: int64(time.Millisecond * 100), + concurrent: 15, + } + require.Equal(t, "initialize: 1ms, read_file: 1s, parse_log: {time:100ms, concurrency:15}, total_file: 2, read_file: 2, read_size: 1024 MB", stats.String()) + require.Equal(t, stats.Clone().String(), stats.String()) + stats.Merge(stats.Clone()) + require.Equal(t, "initialize: 2ms, read_file: 2s, parse_log: {time:200ms, concurrency:15}, total_file: 4, read_file: 4, read_size: 2 GB", stats.String()) } -func (s *testExecSerialSuite) TestLoadDataWithDifferentEscapeChar(c *C) { +// Test whether the actual buckets in Golang Map is same with the estimated number. +// The test relies the implement of Golang Map. ref https://github.com/golang/go/blob/go1.13/src/runtime/map.go#L114 +func SubTestAggPartialResultMapperB(t *testing.T) { + if runtime.Version() < `go1.13` { + t.Skip("Unsupported version") + } + type testCase struct { + rowNum int + expectedB int + expectedGrowing bool + } + cases := []testCase{ + { + rowNum: 0, + expectedB: 0, + expectedGrowing: false, + }, + { + rowNum: 100, + expectedB: 4, + expectedGrowing: false, + }, + { + rowNum: 10000, + expectedB: 11, + expectedGrowing: false, + }, + { + rowNum: 1000000, + expectedB: 18, + expectedGrowing: false, + }, + { + rowNum: 851968, // 6.5 * (1 << 17) + expectedB: 17, + expectedGrowing: false, + }, + { + rowNum: 851969, // 6.5 * (1 << 17) + 1 + expectedB: 18, + expectedGrowing: true, + }, + { + rowNum: 425984, // 6.5 * (1 << 16) + expectedB: 16, + expectedGrowing: false, + }, + { + rowNum: 425985, // 6.5 * (1 << 16) + 1 + expectedB: 17, + expectedGrowing: true, + }, + } + + for _, tc := range cases { + aggMap := make(aggPartialResultMapper) + tempSlice := make([]aggfuncs.PartialResult, 10) + for num := 0; num < tc.rowNum; num++ { + aggMap[strconv.Itoa(num)] = tempSlice + } + + require.Equal(t, tc.expectedB, getB(aggMap)) + require.Equal(t, tc.expectedGrowing, getGrowing(aggMap)) + } +} + +// A header for a Go map. +// nolint:structcheck +type hmap struct { + // Note: the format of the hmap is also encoded in cmd/compile/internal/gc/reflect.go. + // Make sure this stays in sync with the compiler's definition. + count int // nolint:unused // # live cells == size of map. Must be first (used by len() builtin) + flags uint8 // nolint:unused + B uint8 // nolint:unused // log_2 of # of buckets (can hold up to loadFactor * 2^B items) + noverflow uint16 // nolint:unused // approximate number of overflow buckets; see incrnoverflow for details + hash0 uint32 // nolint:unused // hash seed + + buckets unsafe.Pointer // nolint:unused // array of 2^B Buckets. may be nil if count==0. + oldbuckets unsafe.Pointer // nolint:unused // previous bucket array of half the size, non-nil only when growing + nevacuate uintptr // nolint:unused // progress counter for evacuation (buckets less than this have been evacuated) +} + +func getB(m aggPartialResultMapper) int { + point := (**hmap)(unsafe.Pointer(&m)) + value := *point + return int(value.B) +} + +func getGrowing(m aggPartialResultMapper) bool { + point := (**hmap)(unsafe.Pointer(&m)) + value := *point + return value.oldbuckets != nil +} + +func SubTestFilterTemporaryTableKeys(t *testing.T) { + vars := variable.NewSessionVars() + const tableID int64 = 3 + vars.TxnCtx = &variable.TransactionContext{ + TemporaryTables: map[int64]tableutil.TempTable{tableID: nil}, + } + + res := filterTemporaryTableKeys(vars, []kv.Key{tablecodec.EncodeTablePrefix(tableID), tablecodec.EncodeTablePrefix(42)}) + require.Len(t, res, 1) +} + +func TestLoadDataWithDifferentEscapeChar(t *testing.T) { tests := []struct { input string escapeChar byte @@ -295,27 +424,20 @@ func (s *testExecSerialSuite) TestLoadDataWithDifferentEscapeChar(c *C) { }, } got, err := ldInfo.getFieldsFromLine([]byte(test.input)) - c.Assert(err, IsNil, Commentf("failed: %s", test.input)) - assertEqualStrings(c, got, test.expected) - } -} - -func assertEqualStrings(c *C, got []field, expect []string) { - c.Assert(len(got), Equals, len(expect)) - for i := 0; i < len(got); i++ { - c.Assert(string(got[i].str), Equals, expect[i]) + require.NoErrorf(t, err, "failed: %s", test.input) + assertEqualStrings(t, got, test.expected) } } -func (s *testExecSerialSuite) TestSortSpillDisk(c *C) { +func TestSortSpillDisk(t *testing.T) { defer config.RestoreFunc()() config.UpdateGlobal(func(conf *config.Config) { conf.OOMUseTmpStorage = true conf.MemQuotaQuery = 1 }) - c.Assert(failpoint.Enable("github.com/pingcap/tidb/executor/testSortedRowContainerSpill", "return(true)"), IsNil) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/testSortedRowContainerSpill", "return(true)")) defer func() { - c.Assert(failpoint.Disable("github.com/pingcap/tidb/executor/testSortedRowContainerSpill"), IsNil) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/executor/testSortedRowContainerSpill")) }() ctx := mock.NewContext() ctx.GetSessionVars().InitChunkSize = variable.DefMaxChunkSize @@ -341,28 +463,28 @@ func (s *testExecSerialSuite) TestSortSpillDisk(c *C) { chk := newFirstChunk(exec) dataSource.prepareChunks() err := exec.Open(tmpCtx) - c.Assert(err, IsNil) + require.NoError(t, err) for { err = exec.Next(tmpCtx, chk) - c.Assert(err, IsNil) + require.NoError(t, err) if chk.NumRows() == 0 { break } } // Test only 1 partition and all data in memory. - c.Assert(len(exec.partitionList), Equals, 1) - c.Assert(exec.partitionList[0].AlreadySpilledSafeForTest(), Equals, false) - c.Assert(exec.partitionList[0].NumRow(), Equals, 2048) + require.Len(t, exec.partitionList, 1) + require.Equal(t, false, exec.partitionList[0].AlreadySpilledSafeForTest()) + require.Equal(t, 2048, exec.partitionList[0].NumRow()) err = exec.Close() - c.Assert(err, IsNil) + require.NoError(t, err) ctx.GetSessionVars().StmtCtx.MemTracker = memory.NewTracker(-1, 1) dataSource.prepareChunks() err = exec.Open(tmpCtx) - c.Assert(err, IsNil) + require.NoError(t, err) for { err = exec.Next(tmpCtx, chk) - c.Assert(err, IsNil) + require.NoError(t, err) if chk.NumRows() == 0 { break } @@ -372,37 +494,37 @@ func (s *testExecSerialSuite) TestSortSpillDisk(c *C) { // Maybe the second add() will called before spilling, depends on // Golang goroutine scheduling. So the result has two possibilities. if len(exec.partitionList) == 2 { - c.Assert(len(exec.partitionList), Equals, 2) - c.Assert(exec.partitionList[0].AlreadySpilledSafeForTest(), Equals, true) - c.Assert(exec.partitionList[1].AlreadySpilledSafeForTest(), Equals, true) - c.Assert(exec.partitionList[0].NumRow(), Equals, 1024) - c.Assert(exec.partitionList[1].NumRow(), Equals, 1024) + require.Len(t, exec.partitionList, 2) + require.Equal(t, true, exec.partitionList[0].AlreadySpilledSafeForTest()) + require.Equal(t, true, exec.partitionList[1].AlreadySpilledSafeForTest()) + require.Equal(t, 1024, exec.partitionList[0].NumRow()) + require.Equal(t, 1024, exec.partitionList[1].NumRow()) } else { - c.Assert(len(exec.partitionList), Equals, 1) - c.Assert(exec.partitionList[0].AlreadySpilledSafeForTest(), Equals, true) - c.Assert(exec.partitionList[0].NumRow(), Equals, 2048) + require.Len(t, exec.partitionList, 1) + require.Equal(t, true, exec.partitionList[0].AlreadySpilledSafeForTest()) + require.Equal(t, 2048, exec.partitionList[0].NumRow()) } err = exec.Close() - c.Assert(err, IsNil) + require.NoError(t, err) ctx.GetSessionVars().StmtCtx.MemTracker = memory.NewTracker(-1, 24000) dataSource.prepareChunks() err = exec.Open(tmpCtx) - c.Assert(err, IsNil) + require.NoError(t, err) for { err = exec.Next(tmpCtx, chk) - c.Assert(err, IsNil) + require.NoError(t, err) if chk.NumRows() == 0 { break } } // Test only 1 partition but spill disk. - c.Assert(len(exec.partitionList), Equals, 1) - c.Assert(exec.partitionList[0].AlreadySpilledSafeForTest(), Equals, true) - c.Assert(exec.partitionList[0].NumRow(), Equals, 2048) + require.Len(t, exec.partitionList, 1) + require.Equal(t, true, exec.partitionList[0].AlreadySpilledSafeForTest()) + require.Equal(t, 2048, exec.partitionList[0].NumRow()) err = exec.Close() - c.Assert(err, IsNil) + require.NoError(t, err) // Test partition nums. ctx = mock.NewContext() @@ -430,137 +552,16 @@ func (s *testExecSerialSuite) TestSortSpillDisk(c *C) { chk = newFirstChunk(exec) dataSource.prepareChunks() err = exec.Open(tmpCtx) - c.Assert(err, IsNil) + require.NoError(t, err) for { err = exec.Next(tmpCtx, chk) - c.Assert(err, IsNil) + require.NoError(t, err) if chk.NumRows() == 0 { break } } // Don't spill too many partitions. - c.Assert(len(exec.partitionList) <= 4, IsTrue) + require.True(t, len(exec.partitionList) <= 4) err = exec.Close() - c.Assert(err, IsNil) -} - -func (s *pkgTestSuite) TestSlowQueryRuntimeStats(c *C) { - stats := &slowQueryRuntimeStats{ - totalFileNum: 2, - readFileNum: 2, - readFile: time.Second, - initialize: time.Millisecond, - readFileSize: 1024 * 1024 * 1024, - parseLog: int64(time.Millisecond * 100), - concurrent: 15, - } - c.Assert(stats.String(), Equals, "initialize: 1ms, read_file: 1s, parse_log: {time:100ms, concurrency:15}, total_file: 2, read_file: 2, read_size: 1024 MB") - c.Assert(stats.String(), Equals, stats.Clone().String()) - stats.Merge(stats.Clone()) - c.Assert(stats.String(), Equals, "initialize: 2ms, read_file: 2s, parse_log: {time:200ms, concurrency:15}, total_file: 4, read_file: 4, read_size: 2 GB") -} - -// Test whether the actual buckets in Golang Map is same with the estimated number. -// The test relies the implement of Golang Map. ref https://github.com/golang/go/blob/go1.13/src/runtime/map.go#L114 -func (s *pkgTestSuite) TestAggPartialResultMapperB(c *C) { - if runtime.Version() < `go1.13` { - c.Skip("Unsupported version") - } - type testCase struct { - rowNum int - expectedB int - expectedGrowing bool - } - cases := []testCase{ - { - rowNum: 0, - expectedB: 0, - expectedGrowing: false, - }, - { - rowNum: 100, - expectedB: 4, - expectedGrowing: false, - }, - { - rowNum: 10000, - expectedB: 11, - expectedGrowing: false, - }, - { - rowNum: 1000000, - expectedB: 18, - expectedGrowing: false, - }, - { - rowNum: 851968, // 6.5 * (1 << 17) - expectedB: 17, - expectedGrowing: false, - }, - { - rowNum: 851969, // 6.5 * (1 << 17) + 1 - expectedB: 18, - expectedGrowing: true, - }, - { - rowNum: 425984, // 6.5 * (1 << 16) - expectedB: 16, - expectedGrowing: false, - }, - { - rowNum: 425985, // 6.5 * (1 << 16) + 1 - expectedB: 17, - expectedGrowing: true, - }, - } - - for _, tc := range cases { - aggMap := make(aggPartialResultMapper) - tempSlice := make([]aggfuncs.PartialResult, 10) - for num := 0; num < tc.rowNum; num++ { - aggMap[strconv.Itoa(num)] = tempSlice - } - - c.Assert(getB(aggMap), Equals, tc.expectedB) - c.Assert(getGrowing(aggMap), Equals, tc.expectedGrowing) - } -} - -// A header for a Go map. -// nolint:structcheck -type hmap struct { - // Note: the format of the hmap is also encoded in cmd/compile/internal/gc/reflect.go. - // Make sure this stays in sync with the compiler's definition. - count int // nolint:unused // # live cells == size of map. Must be first (used by len() builtin) - flags uint8 // nolint:unused - B uint8 // nolint:unused // log_2 of # of buckets (can hold up to loadFactor * 2^B items) - noverflow uint16 // nolint:unused // approximate number of overflow buckets; see incrnoverflow for details - hash0 uint32 // nolint:unused // hash seed - - buckets unsafe.Pointer // nolint:unused // array of 2^B Buckets. may be nil if count==0. - oldbuckets unsafe.Pointer // nolint:unused // previous bucket array of half the size, non-nil only when growing - nevacuate uintptr // nolint:unused // progress counter for evacuation (buckets less than this have been evacuated) -} - -func getB(m aggPartialResultMapper) int { - point := (**hmap)(unsafe.Pointer(&m)) - value := *point - return int(value.B) -} - -func getGrowing(m aggPartialResultMapper) bool { - point := (**hmap)(unsafe.Pointer(&m)) - value := *point - return value.oldbuckets != nil -} - -func (s *pkgTestSuite) TestFilterTemporaryTableKeys(c *C) { - vars := variable.NewSessionVars() - const tableID int64 = 3 - vars.TxnCtx = &variable.TransactionContext{ - TemporaryTables: map[int64]tableutil.TempTable{tableID: nil}, - } - - res := filterTemporaryTableKeys(vars, []kv.Key{tablecodec.EncodeTablePrefix(tableID), tablecodec.EncodeTablePrefix(42)}) - c.Assert(res, HasLen, 1) + require.NoError(t, err) } diff --git a/executor/executor_required_rows_test.go b/executor/executor_required_rows_test.go index e71c59c04f995..4a1d83becd5ba 100644 --- a/executor/executor_required_rows_test.go +++ b/executor/executor_required_rows_test.go @@ -40,6 +40,15 @@ import ( "github.com/tikv/client-go/v2/oracle" ) +var _ = SerialSuites(&testExecSuite{}) +var _ = SerialSuites(&testExecSerialSuite{}) + +type testExecSuite struct { +} + +type testExecSerialSuite struct { +} + type requiredRowsDataSource struct { baseExecutor totalRows int diff --git a/executor/executor_test.go b/executor/executor_test.go index 9e4ba4a18d931..ef4f434a9fb67 100644 --- a/executor/executor_test.go +++ b/executor/executor_test.go @@ -15,12 +15,17 @@ package executor_test import ( + "archive/zip" "context" "flag" "fmt" "math" + "math/rand" "net" "os" + "path/filepath" + "reflect" + "runtime" "strconv" "strings" "sync" @@ -64,6 +69,7 @@ import ( "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/tablecodec" + testkit2 "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/admin" @@ -76,9 +82,11 @@ import ( "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/rowcodec" "github.com/pingcap/tidb/util/testkit" + "github.com/pingcap/tidb/util/testleak" "github.com/pingcap/tidb/util/testutil" "github.com/pingcap/tidb/util/timeutil" "github.com/pingcap/tipb/go-tipb" + "github.com/stretchr/testify/require" "github.com/tikv/client-go/v2/oracle" "github.com/tikv/client-go/v2/testutils" "github.com/tikv/client-go/v2/tikv" @@ -107,15 +115,11 @@ var _ = Suite(&testSuiteJoin1{&baseTestSuite{}}) var _ = Suite(&testSuiteJoin2{&baseTestSuite{}}) var _ = Suite(&testSuiteJoin3{&baseTestSuite{}}) var _ = SerialSuites(&testSuiteJoinSerial{&baseTestSuite{}}) -var _ = Suite(&testSuiteAgg{baseTestSuite: &baseTestSuite{}}) var _ = Suite(&testSuite6{&baseTestSuite{}}) var _ = Suite(&testSuite7{&baseTestSuite{}}) var _ = Suite(&testSuite8{&baseTestSuite{}}) -var _ = SerialSuites(&testShowStatsSuite{&baseTestSuite{}}) -var _ = Suite(&testBypassSuite{}) var _ = Suite(&testUpdateSuite{}) var _ = Suite(&testPointGetSuite{}) -var _ = Suite(&testBatchPointGetSuite{}) var _ = SerialSuites(&testRecoverTable{}) var _ = SerialSuites(&testMemTableReaderSuite{&testClusterTableBase{}}) var _ = SerialSuites(&testFlushSuite{}) @@ -166,6 +170,22 @@ type baseTestSuite struct { ctx *mock.Context // nolint:structcheck } +func newStoreWithBootstrap() (kv.Storage, *domain.Domain, error) { + store, err := mockstore.NewMockStore() + if err != nil { + return nil, nil, errors.Trace(err) + } + + session.SetSchemaLease(0) + session.DisableStats4Test() + + dom, err := session.BootstrapSession(store) + if err != nil { + return nil, nil, err + } + return store, dom, errors.Trace(err) +} + var mockTikv = flag.Bool("mockTikv", true, "use mock tikv store in executor test") func (s *baseTestSuite) SetUpSuite(c *C) { @@ -186,6 +206,11 @@ func (s *baseTestSuite) SetUpSuite(c *C) { } d, err := session.BootstrapSession(s.store) c.Assert(err, IsNil) + se, err := session.CreateSession4Test(s.store) + c.Assert(err, IsNil) + _, err = se.Execute(context.Background(), "set @@global.tidb_enable_alter_placement=1") + c.Assert(err, IsNil) + se.Close() d.SetStatsUpdating(true) s.domain = d config.UpdateGlobal(func(conf *config.Config) { @@ -370,7 +395,7 @@ func (s *testSuite3) TestAdmin(c *C) { // cancel DDL jobs test r, err := tk.Exec("admin cancel ddl jobs 1") c.Assert(err, IsNil, Commentf("err %v", err)) - req := r.NewChunk() + req := r.NewChunk(nil) err = r.Next(ctx, req) c.Assert(err, IsNil) row := req.GetRow(0) @@ -381,7 +406,7 @@ func (s *testSuite3) TestAdmin(c *C) { // show ddl test; r, err = tk.Exec("admin show ddl") c.Assert(err, IsNil) - req = r.NewChunk() + req = r.NewChunk(nil) err = r.Next(ctx, req) c.Assert(err, IsNil) row = req.GetRow(0) @@ -400,7 +425,7 @@ func (s *testSuite3) TestAdmin(c *C) { c.Assert(row.GetString(2), Equals, serverInfo.IP+":"+ strconv.FormatUint(uint64(serverInfo.Port), 10)) c.Assert(row.GetString(3), Equals, "") - req = r.NewChunk() + req = r.NewChunk(nil) err = r.Next(ctx, req) c.Assert(err, IsNil) c.Assert(req.NumRows() == 0, IsTrue) @@ -410,7 +435,7 @@ func (s *testSuite3) TestAdmin(c *C) { // show DDL jobs test r, err = tk.Exec("admin show ddl jobs") c.Assert(err, IsNil) - req = r.NewChunk() + req = r.NewChunk(nil) err = r.Next(ctx, req) c.Assert(err, IsNil) row = req.GetRow(0) @@ -426,7 +451,7 @@ func (s *testSuite3) TestAdmin(c *C) { r, err = tk.Exec("admin show ddl jobs 20") c.Assert(err, IsNil) - req = r.NewChunk() + req = r.NewChunk(nil) err = r.Next(ctx, req) c.Assert(err, IsNil) row = req.GetRow(0) @@ -566,6 +591,41 @@ func (s *testSuiteP2) TestAdminShowDDLJobs(c *C) { c.Assert(row[9], Equals, "<nil>") } +func (s *testSuiteP2) TestAdminShowDDLJobsInfo(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("create database if not exists test_admin_show_ddl_jobs") + defer tk.MustExec("drop database if exists test_admin_show_ddl_jobs") + tk.MustExec("use test_admin_show_ddl_jobs") + tk.MustExec("drop table if exists t, t1;") + tk.MustExec("create table t (a int);") + tk.MustExec("create table t1 (a int);") + + // Test for issue: https://github.com/pingcap/tidb/issues/29915 + tk.MustExec("drop placement policy if exists x;") + tk.MustExec("create placement policy x followers=4;") + tk.MustExec("alter table t placement policy x;") + c.Assert(tk.MustQuery("admin show ddl jobs 1").Rows()[0][3], Equals, "alter table placement") + + tk.MustExec("rename table t to tt, t1 to tt1") + c.Assert(tk.MustQuery("admin show ddl jobs 1").Rows()[0][3], Equals, "rename tables") + + tk.MustExec("create table tt2 (c int) PARTITION BY RANGE (c) " + + "(PARTITION p0 VALUES LESS THAN (6)," + + "PARTITION p1 VALUES LESS THAN (11)," + + "PARTITION p2 VALUES LESS THAN (16)," + + "PARTITION p3 VALUES LESS THAN (21));") + tk.MustExec("alter table tt2 partition p0 " + + "PRIMARY_REGION=\"cn-east-1\" " + + "REGIONS=\"cn-east-1, cn-east-2\" " + + "FOLLOWERS=2 ") + c.Assert(tk.MustQuery("admin show ddl jobs 1").Rows()[0][3], Equals, "alter table partition placement") + + tk.MustExec("alter table tt1 cache") + c.Assert(tk.MustQuery("admin show ddl jobs 1").Rows()[0][3], Equals, "alter table cache") + tk.MustExec("alter table tt1 nocache") + c.Assert(tk.MustQuery("admin show ddl jobs 1").Rows()[0][3], Equals, "alter table nocache") +} + func (s *testSuiteP2) TestAdminChecksumOfPartitionedTable(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("USE test;") @@ -597,35 +657,33 @@ type testCase struct { } func checkCases(tests []testCase, ld *executor.LoadDataInfo, - c *C, tk *testkit.TestKit, ctx sessionctx.Context, selectSQL, deleteSQL string) { + t *testing.T, tk *testkit2.TestKit, ctx sessionctx.Context, selectSQL, deleteSQL string) { origin := ld.IgnoreLines for _, tt := range tests { ld.IgnoreLines = origin - c.Assert(ctx.NewTxn(context.Background()), IsNil) + require.Nil(t, ctx.NewTxn(context.Background())) ctx.GetSessionVars().StmtCtx.DupKeyAsWarning = true ctx.GetSessionVars().StmtCtx.BadNullAsWarning = true ctx.GetSessionVars().StmtCtx.InLoadDataStmt = true ctx.GetSessionVars().StmtCtx.InDeleteStmt = false data, reachLimit, err1 := ld.InsertData(context.Background(), tt.data1, tt.data2) - c.Assert(err1, IsNil) - c.Assert(reachLimit, IsFalse) + require.NoError(t, err1) + require.False(t, reachLimit) err1 = ld.CheckAndInsertOneBatch(context.Background(), ld.GetRows(), ld.GetCurBatchCnt()) - c.Assert(err1, IsNil) + require.NoError(t, err1) ld.SetMaxRowsInBatch(20000) if tt.restData == nil { - c.Assert(data, HasLen, 0, - Commentf("data1:%v, data2:%v, data:%v", string(tt.data1), string(tt.data2), string(data))) + require.Len(t, data, 0, "data1:%v, data2:%v, data:%v", string(tt.data1), string(tt.data2), string(data)) } else { - c.Assert(data, DeepEquals, tt.restData, - Commentf("data1:%v, data2:%v, data:%v", string(tt.data1), string(tt.data2), string(data))) + require.Equal(t, tt.restData, data, "data1:%v, data2:%v, data:%v", string(tt.data1), string(tt.data2), string(data)) } ld.SetMessage() - tk.CheckLastMessage(tt.expectedMsg) + require.Equal(t, tt.expectedMsg, tk.Session().LastMessage()) ctx.StmtCommit() txn, err := ctx.Txn(true) - c.Assert(err, IsNil) + require.NoError(t, err) err = txn.Commit(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) r := tk.MustQuery(selectSQL) r.Check(testutil.RowsWithSep("|", tt.expected...)) tk.MustExec(deleteSQL) @@ -1145,7 +1203,7 @@ func (s *testSuiteP1) TestIssue2612(c *C) { tk.MustExec(`insert into t values ('2016-02-13 15:32:24', '2016-02-11 17:23:22');`) rs, err := tk.Exec(`select timediff(finish_at, create_at) from t;`) c.Assert(err, IsNil) - req := rs.NewChunk() + req := rs.NewChunk(nil) err = rs.Next(context.Background(), req) c.Assert(err, IsNil) c.Assert(req.GetRow(0).GetDuration(0, 0).String(), Equals, "-46:09:02") @@ -2302,8 +2360,8 @@ func (s *testSuiteP2) TestTableScan(c *C) { c.Assert(len(result.Rows()), GreaterEqual, 4) tk.MustExec("use test") tk.MustExec("create database mytest") - rowStr1 := fmt.Sprintf("%s %s %s %s %v", "def", "mysql", "utf8mb4", "utf8mb4_bin", nil) - rowStr2 := fmt.Sprintf("%s %s %s %s %v", "def", "mytest", "utf8mb4", "utf8mb4_bin", nil) + rowStr1 := fmt.Sprintf("%s %s %s %s %v %v %v", "def", "mysql", "utf8mb4", "utf8mb4_bin", nil, nil, nil) + rowStr2 := fmt.Sprintf("%s %s %s %s %v %v %v", "def", "mytest", "utf8mb4", "utf8mb4_bin", nil, nil, nil) tk.MustExec("use information_schema") result = tk.MustQuery("select * from schemata where schema_name = 'mysql'") result.Check(testkit.Rows(rowStr1)) @@ -3293,6 +3351,16 @@ func (s *testSuite) TestEmptyEnum(c *C) { tk.MustQuery("select * from t").Check(testkit.Rows("", "")) tk.MustExec("insert into t values (null)") tk.MustQuery("select * from t").Check(testkit.Rows("", "", "<nil>")) + + // Test https://github.com/pingcap/tidb/issues/29525. + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (id int auto_increment primary key, c1 enum('a', '', 'c'));") + tk.MustExec("insert into t(c1) values (0);") + tk.MustQuery("select id, c1+0, c1 from t;").Check(testkit.Rows("1 0 ")) + tk.MustExec("alter table t change c1 c1 enum('a', '') not null;") + tk.MustQuery("select id, c1+0, c1 from t;").Check(testkit.Rows("1 0 ")) + tk.MustExec("insert into t(c1) values (0);") + tk.MustQuery("select id, c1+0, c1 from t;").Check(testkit.Rows("1 0 ", "2 0 ")) } // TestIssue4024 This tests https://github.com/pingcap/tidb/issues/4024 @@ -3628,7 +3696,7 @@ func (s *testSuite) TestBit(c *C) { c.Assert(err, NotNil) r, err := tk.Exec("select * from t where c1 = 2") c.Assert(err, IsNil) - req := r.NewChunk() + req := r.NewChunk(nil) err = r.Next(context.Background(), req) c.Assert(err, IsNil) c.Assert(types.BinaryLiteral(req.GetRow(0).GetBytes(0)), DeepEquals, types.NewBinaryLiteralFromUint(2, -1)) @@ -4529,7 +4597,7 @@ func (s *testSuite3) TestMaxOneRow(c *C) { rs, err := tk.Exec(`select (select t1.a from t1 where t1.a > t2.a) as a from t2;`) c.Assert(err, IsNil) - err = rs.Next(context.TODO(), rs.NewChunk()) + err = rs.Next(context.TODO(), rs.NewChunk(nil)) c.Assert(err.Error(), Equals, "[executor:1242]Subquery returns more than 1 row") c.Assert(rs.Close(), IsNil) @@ -5673,7 +5741,7 @@ func (s *testSuiteWithCliBaseCharset) TestCharsetFeature(c *C) { tk.MustQuery("show charset").Check(testkit.Rows( "ascii US ASCII ascii_bin 1", "binary binary binary 1", - "gbk Chinese Internal Code Specification gbk_bin 2", + "gbk Chinese Internal Code Specification gbk_chinese_ci 2", "latin1 Latin1 latin1_bin 1", "utf8 UTF-8 Unicode utf8_bin 3", "utf8mb4 UTF-8 Unicode utf8mb4_bin 4", @@ -5682,6 +5750,7 @@ func (s *testSuiteWithCliBaseCharset) TestCharsetFeature(c *C) { "ascii_bin ascii 65 Yes Yes 1", "binary binary 63 Yes Yes 1", "gbk_bin gbk 87 Yes 1", + "gbk_chinese_ci gbk 28 Yes Yes 1", "latin1_bin latin1 47 Yes Yes 1", "utf8_bin utf8 83 Yes Yes 1", "utf8_general_ci utf8 33 Yes 1", @@ -5693,13 +5762,13 @@ func (s *testSuiteWithCliBaseCharset) TestCharsetFeature(c *C) { tk.MustExec("set names gbk;") tk.MustQuery("select @@character_set_connection;").Check(testkit.Rows("gbk")) - tk.MustQuery("select @@collation_connection;").Check(testkit.Rows("gbk_bin")) + tk.MustQuery("select @@collation_connection;").Check(testkit.Rows("gbk_chinese_ci")) tk.MustExec("set @@character_set_client=gbk;") tk.MustQuery("select @@character_set_client;").Check(testkit.Rows("gbk")) tk.MustExec("set names utf8mb4;") tk.MustExec("set @@character_set_connection=gbk;") tk.MustQuery("select @@character_set_connection;").Check(testkit.Rows("gbk")) - tk.MustQuery("select @@collation_connection;").Check(testkit.Rows("gbk_bin")) + tk.MustQuery("select @@collation_connection;").Check(testkit.Rows("gbk_chinese_ci")) tk.MustGetErrCode("select _gbk 'a';", errno.ErrUnknownCharacterSet) @@ -5711,13 +5780,13 @@ func (s *testSuiteWithCliBaseCharset) TestCharsetFeature(c *C) { tk.MustQuery("show create table t3").Check(testkit.Rows("t3 CREATE TABLE `t3` (\n" + " `a` char(10) DEFAULT NULL,\n" + " `b` char(10) DEFAULT NULL\n" + - ") ENGINE=InnoDB DEFAULT CHARSET=gbk COLLATE=gbk_bin", + ") ENGINE=InnoDB DEFAULT CHARSET=gbk COLLATE=gbk_chinese_ci", )) tk.MustExec("create table t4(a char(10));") tk.MustExec("alter table t4 add column b char(10) charset gbk;") tk.MustQuery("show create table t4").Check(testkit.Rows("t4 CREATE TABLE `t4` (\n" + " `a` char(10) DEFAULT NULL,\n" + - " `b` char(10) CHARACTER SET gbk COLLATE gbk_bin DEFAULT NULL\n" + + " `b` char(10) CHARACTER SET gbk COLLATE gbk_chinese_ci DEFAULT NULL\n" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin", )) @@ -5726,7 +5795,7 @@ func (s *testSuiteWithCliBaseCharset) TestCharsetFeature(c *C) { tk.MustExec("create table t1(a char(10));") tk.MustQuery("show create table t1").Check(testkit.Rows("t1 CREATE TABLE `t1` (\n" + " `a` char(10) DEFAULT NULL\n" + - ") ENGINE=InnoDB DEFAULT CHARSET=gbk COLLATE=gbk_bin", + ") ENGINE=InnoDB DEFAULT CHARSET=gbk COLLATE=gbk_chinese_ci", )) } @@ -8662,6 +8731,7 @@ func (s *testResourceTagSuite) TestResourceGroupTag(c *C) { defer failpoint.Disable("github.com/pingcap/tidb/store/mockstore/unistore/unistoreRPCClientSendHook") var sqlDigest, planDigest *parser.Digest + var tagLabel tipb.ResourceGroupTagLabel checkFn := func() {} unistore.UnistoreRPCClientSendHook = func(req *tikvrpc.Request) { var startKey []byte @@ -8704,6 +8774,7 @@ func (s *testResourceTagSuite) TestResourceGroupTag(c *C) { c.Assert(err, IsNil) sqlDigest = parser.NewDigest(tag.SqlDigest) planDigest = parser.NewDigest(tag.PlanDigest) + tagLabel = *tag.Label checkFn() } @@ -8713,19 +8784,76 @@ func (s *testResourceTagSuite) TestResourceGroupTag(c *C) { } cases := []struct { - sql string - ignore bool + sql string + tagLabels map[tipb.ResourceGroupTagLabel]struct{} + ignore bool }{ - {sql: "insert into t values(1,1),(2,2),(3,3)"}, - {sql: "select * from t use index (idx) where a=1"}, - {sql: "select * from t use index (idx) where a in (1,2,3)"}, - {sql: "select * from t use index (idx) where a>1"}, - {sql: "select * from t where b>1"}, - {sql: "begin pessimistic", ignore: true}, - {sql: "insert into t values(4,4)"}, - {sql: "commit", ignore: true}, - {sql: "update t set a=5,b=5 where a=5"}, - {sql: "replace into t values(6,6)"}, + { + sql: "insert into t values(1,1),(2,2),(3,3)", + tagLabels: map[tipb.ResourceGroupTagLabel]struct{}{ + tipb.ResourceGroupTagLabel_ResourceGroupTagLabelIndex: {}, + }, + }, + { + sql: "select * from t use index (idx) where a=1", + tagLabels: map[tipb.ResourceGroupTagLabel]struct{}{ + tipb.ResourceGroupTagLabel_ResourceGroupTagLabelRow: {}, + tipb.ResourceGroupTagLabel_ResourceGroupTagLabelIndex: {}, + }, + }, + { + sql: "select * from t use index (idx) where a in (1,2,3)", + tagLabels: map[tipb.ResourceGroupTagLabel]struct{}{ + tipb.ResourceGroupTagLabel_ResourceGroupTagLabelRow: {}, + tipb.ResourceGroupTagLabel_ResourceGroupTagLabelIndex: {}, + }, + }, + { + sql: "select * from t use index (idx) where a>1", + tagLabels: map[tipb.ResourceGroupTagLabel]struct{}{ + tipb.ResourceGroupTagLabel_ResourceGroupTagLabelRow: {}, + tipb.ResourceGroupTagLabel_ResourceGroupTagLabelIndex: {}, + }, + }, + { + sql: "select * from t where b>1", + tagLabels: map[tipb.ResourceGroupTagLabel]struct{}{ + tipb.ResourceGroupTagLabel_ResourceGroupTagLabelRow: {}, + }, + }, + { + sql: "select a from t use index (idx) where a>1", + tagLabels: map[tipb.ResourceGroupTagLabel]struct{}{ + tipb.ResourceGroupTagLabel_ResourceGroupTagLabelIndex: {}, + }, + }, + { + sql: "begin pessimistic", + ignore: true, + }, + { + sql: "insert into t values(4,4)", + tagLabels: map[tipb.ResourceGroupTagLabel]struct{}{ + tipb.ResourceGroupTagLabel_ResourceGroupTagLabelRow: {}, + tipb.ResourceGroupTagLabel_ResourceGroupTagLabelIndex: {}, + }, + }, + { + sql: "commit", + ignore: true, + }, + { + sql: "update t set a=5,b=5 where a=5", + tagLabels: map[tipb.ResourceGroupTagLabel]struct{}{ + tipb.ResourceGroupTagLabel_ResourceGroupTagLabelIndex: {}, + }, + }, + { + sql: "replace into t values(6,6)", + tagLabels: map[tipb.ResourceGroupTagLabel]struct{}{ + tipb.ResourceGroupTagLabel_ResourceGroupTagLabelIndex: {}, + }, + }, } for _, ca := range cases { resetVars() @@ -8747,6 +8875,8 @@ func (s *testResourceTagSuite) TestResourceGroupTag(c *C) { } c.Assert(sqlDigest.String(), Equals, expectSQLDigest.String(), commentf) c.Assert(planDigest.String(), Equals, expectPlanDigest.String()) + _, ok := ca.tagLabels[tagLabel] + c.Assert(ok, Equals, true) checkCnt++ } @@ -8972,6 +9102,109 @@ func (s *testStaleTxnSuite) TestInvalidReadTemporaryTable(c *C) { } } +func (s *testStaleTxnSuite) TestInvalidReadCacheTable(c *C) { + tk := testkit.NewTestKit(c, s.store) + // For mocktikv, safe point is not initialized, we manually insert it for snapshot to use. + safePointName := "tikv_gc_safe_point" + safePointValue := "20160102-15:04:05 -0700" + safePointComment := "All versions after safe point can be accessed. (DO NOT EDIT)" + updateSafePoint := fmt.Sprintf(`INSERT INTO mysql.tidb VALUES ('%[1]s', '%[2]s', '%[3]s') + ON DUPLICATE KEY + UPDATE variable_value = '%[2]s', comment = '%[3]s'`, safePointName, safePointValue, safePointComment) + tk.MustExec(updateSafePoint) + tk.MustExec("use test") + tk.MustExec("drop table if exists cache_tmp1") + tk.MustExec("create table cache_tmp1 " + + "(id int not null primary key, code int not null, value int default null, unique key code(code))") + tk.MustExec("alter table cache_tmp1 cache") + tk.MustExec("drop table if exists cache_tmp2") + tk.MustExec("create table cache_tmp2 (id int not null primary key, code int not null, value int default null, unique key code(code));") + tk.MustExec("alter table cache_tmp2 cache") + tk.MustExec("drop table if exists cache_tmp3 , cache_tmp4, cache_tmp5") + tk.MustExec("create table cache_tmp3 (id int not null primary key, code int not null, value int default null, unique key code(code));") + tk.MustExec("create table cache_tmp4 (id int not null primary key, code int not null, value int default null, unique key code(code));") + tk.MustExec("create table cache_tmp5 (id int primary key);") + // sleep 1us to make test stale + time.Sleep(time.Microsecond) + + queries := []struct { + sql string + }{ + { + sql: "select * from cache_tmp1 where id=1", + }, + { + sql: "select * from cache_tmp1 where code=1", + }, + { + sql: "select * from cache_tmp1 where id in (1, 2, 3)", + }, + { + sql: "select * from cache_tmp1 where code in (1, 2, 3)", + }, + { + sql: "select * from cache_tmp1 where id > 1", + }, + { + sql: "select /*+use_index(cache_tmp1, code)*/ * from cache_tmp1 where code > 1", + }, + { + sql: "select /*+use_index(cache_tmp1, code)*/ code from cache_tmp1 where code > 1", + }, + } + + addStaleReadToSQL := func(sql string) string { + idx := strings.Index(sql, " where ") + if idx < 0 { + return "" + } + return sql[0:idx] + " as of timestamp NOW(6)" + sql[idx:] + } + for _, query := range queries { + sql := addStaleReadToSQL(query.sql) + if sql != "" { + tk.MustGetErrMsg(sql, "can not stale read cache table") + } + } + + tk.MustExec("start transaction read only as of timestamp NOW(6)") + for _, query := range queries { + tk.MustGetErrMsg(query.sql, "can not stale read cache table") + } + tk.MustExec("commit") + + for _, query := range queries { + tk.MustExec(query.sql) + } + + // Test normal table when cache table exits. + tk.MustExec("insert into cache_tmp5 values(1);") + tk.MustExec("set @a=now(6);") + time.Sleep(time.Microsecond) + tk.MustExec("drop table cache_tmp5") + tk.MustExec("create table cache_tmp5 (id int primary key);") + tk.MustQuery("select * from cache_tmp5 as of timestamp(@a) where id=1;").Check(testkit.Rows("1")) + tk.MustQuery("select * from cache_tmp4 as of timestamp(@a), cache_tmp3 as of timestamp(@a) where cache_tmp3.id=1;") + tk.MustGetErrMsg("select * from cache_tmp4 as of timestamp(@a), cache_tmp2 as of timestamp(@a) where cache_tmp2.id=1;", "can not stale read cache table") + tk.MustExec("set transaction read only as of timestamp NOW(6)") + tk.MustExec("start transaction") + for _, query := range queries { + tk.MustGetErrMsg(query.sql, "can not stale read cache table") + } + tk.MustExec("commit") + + for _, query := range queries { + tk.MustExec(query.sql) + } + + tk.MustExec("set @@tidb_snapshot=NOW(6)") + for _, query := range queries { + // enable historical read cache table + tk.MustExec(query.sql) + + } +} + func (s *testSuite) TestTableSampleTemporaryTable(c *C) { tk := testkit.NewTestKit(c, s.store) // For mocktikv, safe point is not initialized, we manually insert it for snapshot to use. @@ -9140,6 +9373,42 @@ func (s *testSuite) TestGetResultRowsCount(c *C) { } } +func checkFileName(s string) bool { + files := []string{ + "config.toml", + "meta.txt", + "stats/test.t_dump_single.json", + "schema/test.t_dump_single.schema.txt", + "variables.toml", + "sqls.sql", + "session_bindings.sql", + "global_bindings.sql", + "explain.txt", + } + for _, f := range files { + if strings.Compare(f, s) == 0 { + return true + } + } + return false +} + +func (s *testSuiteWithData) TestPlanReplayerDumpSingle(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t_dump_single") + tk.MustExec("create table t_dump_single(a int)") + res := tk.MustQuery("plan replayer dump explain select * from t_dump_single") + path := s.testData.ConvertRowsToStrings(res.Rows()) + + reader, err := zip.OpenReader(filepath.Join(domain.GetPlanReplayerDirName(), path[0])) + c.Assert(err, IsNil) + defer reader.Close() + for _, file := range reader.File { + c.Assert(checkFileName(file.Name), IsTrue) + } +} + func (s *testSuiteP1) TestIssue28935(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("set @@tidb_enable_vectorized_expression=true") @@ -9152,3 +9421,213 @@ func (s *testSuiteP1) TestIssue28935(c *C) { tk.MustQuery(`select trim(leading null from " a "), trim(both null from " a "), trim(trailing null from " a ")`).Check(testkit.Rows("<nil> <nil> <nil>")) tk.MustQuery(`select trim(null from " a ")`).Check(testkit.Rows("<nil>")) } + +func (s *testSuiteP1) TestIssue29412(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t29142_1") + tk.MustExec("drop table if exists t29142_2") + tk.MustExec("create table t29142_1(a int);") + tk.MustExec("create table t29142_2(a double);") + tk.MustExec("insert into t29142_1 value(20);") + tk.MustQuery("select sum(distinct a) as x from t29142_1 having x > some ( select a from t29142_2 where x in (a));").Check(nil) +} + +func (s *testSerialSuite) TestIssue28650(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(a int, index(a));") + tk.MustExec("create table t2(a int, c int, b char(50), index(a,c,b));") + tk.MustExec("set tidb_enable_rate_limit_action=off;") + + wg := &sync.WaitGroup{} + sql := `explain analyze + select /*+ stream_agg(@sel_1) stream_agg(@sel_3) %s(@sel_2 t2)*/ count(1) from + ( + SELECT t2.a AS t2_external_user_ext_id, t2.b AS t2_t1_ext_id FROM t2 INNER JOIN (SELECT t1.a AS d_t1_ext_id FROM t1 GROUP BY t1.a) AS anon_1 ON anon_1.d_t1_ext_id = t2.a WHERE t2.c = 123 AND t2.b + IN ("%s") ) tmp` + + wg.Add(1) + sqls := make([]string, 2) + go func() { + defer wg.Done() + inElems := make([]string, 1000) + for i := 0; i < len(inElems); i++ { + inElems[i] = fmt.Sprintf("wm_%dbDgAAwCD-v1QB%dxky-g_dxxQCw", rand.Intn(100), rand.Intn(100)) + } + sqls[0] = fmt.Sprintf(sql, "inl_join", strings.Join(inElems, "\",\"")) + sqls[1] = fmt.Sprintf(sql, "inl_hash_join", strings.Join(inElems, "\",\"")) + }() + + tk.MustExec("insert into t1 select rand()*400;") + for i := 0; i < 10; i++ { + tk.MustExec("insert into t1 select rand()*400 from t1;") + } + config.UpdateGlobal(func(conf *config.Config) { + conf.OOMAction = config.OOMActionCancel + }) + defer func() { + config.UpdateGlobal(func(conf *config.Config) { + conf.OOMAction = config.OOMActionLog + }) + }() + wg.Wait() + for _, sql := range sqls { + tk.MustExec("set @@tidb_mem_quota_query = 1073741824") // 1GB + c.Assert(tk.QueryToErr(sql), IsNil) + tk.MustExec("set @@tidb_mem_quota_query = 33554432") // 32MB, out of memory during executing + c.Assert(strings.Contains(tk.QueryToErr(sql).Error(), "Out Of Memory Quota!"), IsTrue) + tk.MustExec("set @@tidb_mem_quota_query = 65536") // 64KB, out of memory during building the plan + func() { + defer func() { + r := recover() + c.Assert(r, NotNil) + err := errors.Errorf("%v", r) + c.Assert(strings.Contains(err.Error(), "Out Of Memory Quota!"), IsTrue) + }() + tk.MustExec(sql) + }() + } +} + +func (s *testSerialSuite) TestIssue30289(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + fpName := "github.com/pingcap/tidb/executor/issue30289" + c.Assert(failpoint.Enable(fpName, `return(true)`), IsNil) + defer func() { + c.Assert(failpoint.Disable(fpName), IsNil) + }() + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int)") + err := tk.QueryToErr("select /*+ hash_join(t1) */ * from t t1 join t t2 on t1.a=t2.a") + c.Assert(err.Error(), Matches, "issue30289 build return error") +} + +// Test invoke Close without invoking Open before for each operators. +func (s *testSerialSuite) TestUnreasonablyClose(c *C) { + defer testleak.AfterTest(c)() + + is := infoschema.MockInfoSchema([]*model.TableInfo{plannercore.MockSignedTable(), plannercore.MockUnsignedTable()}) + se, err := session.CreateSession4Test(s.store) + c.Assert(err, IsNil) + _, err = se.Execute(context.Background(), "use test") + c.Assert(err, IsNil) + // To enable the shuffleExec operator. + _, err = se.Execute(context.Background(), "set @@tidb_merge_join_concurrency=4") + c.Assert(err, IsNil) + + var opsNeedsCovered = []plannercore.PhysicalPlan{ + &plannercore.PhysicalHashJoin{}, + &plannercore.PhysicalMergeJoin{}, + &plannercore.PhysicalIndexJoin{}, + &plannercore.PhysicalIndexHashJoin{}, + &plannercore.PhysicalTableReader{}, + &plannercore.PhysicalIndexReader{}, + &plannercore.PhysicalIndexLookUpReader{}, + &plannercore.PhysicalIndexMergeReader{}, + &plannercore.PhysicalApply{}, + &plannercore.PhysicalHashAgg{}, + &plannercore.PhysicalStreamAgg{}, + &plannercore.PhysicalLimit{}, + &plannercore.PhysicalSort{}, + &plannercore.PhysicalTopN{}, + &plannercore.PhysicalCTE{}, + &plannercore.PhysicalCTETable{}, + &plannercore.PhysicalMaxOneRow{}, + &plannercore.PhysicalProjection{}, + &plannercore.PhysicalSelection{}, + &plannercore.PhysicalTableDual{}, + &plannercore.PhysicalWindow{}, + &plannercore.PhysicalShuffle{}, + &plannercore.PhysicalUnionAll{}, + } + executorBuilder := executor.NewMockExecutorBuilderForTest(se, is, nil, math.MaxUint64, false, "global") + + var opsNeedsCoveredMask uint64 = 1<<len(opsNeedsCovered) - 1 + opsAlreadyCoveredMask := uint64(0) + for i, tc := range []string{ + "select /*+ hash_join(t1)*/ * from t t1 join t t2 on t1.a = t2.a", + "select /*+ merge_join(t1)*/ * from t t1 join t t2 on t1.f = t2.f", + "select t.f from t use index(f)", + "select /*+ inl_join(t1) */ * from t t1 join t t2 on t1.f=t2.f", + "select /*+ inl_hash_join(t1) */ * from t t1 join t t2 on t1.f=t2.f", + "SELECT count(1) FROM (SELECT (SELECT min(a) FROM t as t2 WHERE t2.a > t1.a) AS a from t as t1) t", + "select /*+ hash_agg() */ count(f) from t group by a", + "select /*+ stream_agg() */ count(f) from t group by a", + "select * from t order by a, f", + "select * from t order by a, f limit 1", + "select * from t limit 1", + "select (select t1.a from t t1 where t1.a > t2.a) as a from t t2;", + "select a + 1 from t", + "select count(*) a from t having a > 1", + "select * from t where a = 1.1", + "with recursive cte1(c1) as (select 1 union select c1 + 1 from cte1 limit 5 offset 0) select * from cte1", + "select /*+use_index_merge(t, c_d_e, f)*/ * from t where c < 1 or f > 2", + "select sum(f) over (partition by f) from t", + "select /*+ merge_join(t1)*/ * from t t1 join t t2 on t1.d = t2.d", + "select a from t union all select a from t", + } { + comment := Commentf("case:%v sql:%s", i, tc) + c.Assert(err, IsNil, comment) + stmt, err := s.ParseOneStmt(tc, "", "") + c.Assert(err, IsNil, comment) + + err = se.NewTxn(context.Background()) + c.Assert(err, IsNil, comment) + p, _, err := planner.Optimize(context.TODO(), se, stmt, is) + c.Assert(err, IsNil, comment) + // This for loop level traverses the plan tree to get which operators are covered. + for child := []plannercore.PhysicalPlan{p.(plannercore.PhysicalPlan)}; len(child) != 0; { + newChild := make([]plannercore.PhysicalPlan, 0, len(child)) + for _, ch := range child { + found := false + for k, t := range opsNeedsCovered { + if reflect.TypeOf(t) == reflect.TypeOf(ch) { + opsAlreadyCoveredMask |= 1 << k + found = true + break + } + } + c.Assert(found, IsTrue, Commentf("case: %v sql: %s operator %v is not registered in opsNeedsCoveredMask", i, tc, reflect.TypeOf(ch))) + switch x := ch.(type) { + case *plannercore.PhysicalCTE: + newChild = append(newChild, x.RecurPlan) + newChild = append(newChild, x.SeedPlan) + continue + case *plannercore.PhysicalShuffle: + newChild = append(newChild, x.DataSources...) + newChild = append(newChild, x.Tails...) + continue + } + newChild = append(newChild, ch.Children()...) + } + child = newChild + } + + e := executorBuilder.Build(p) + + func() { + defer func() { + r := recover() + buf := make([]byte, 4096) + stackSize := runtime.Stack(buf, false) + buf = buf[:stackSize] + c.Assert(r, IsNil, Commentf("case: %v\n sql: %s\n error stack: %v", i, tc, string(buf))) + }() + c.Assert(e.Close(), IsNil, comment) + }() + } + // The following code is used to make sure all the operators registered + // in opsNeedsCoveredMask are covered. + commentBuf := strings.Builder{} + if opsAlreadyCoveredMask != opsNeedsCoveredMask { + for i := range opsNeedsCovered { + if opsAlreadyCoveredMask&(1<<i) != 1<<i { + commentBuf.WriteString(fmt.Sprintf(" %v", reflect.TypeOf(opsNeedsCovered[i]))) + } + } + } + c.Assert(opsAlreadyCoveredMask, Equals, opsNeedsCoveredMask, Commentf("these operators are not covered %s", commentBuf.String())) +} diff --git a/executor/explain_test.go b/executor/explain_test.go index c5d23628dfbaa..a26f373e10b71 100644 --- a/executor/explain_test.go +++ b/executor/explain_test.go @@ -365,3 +365,24 @@ func (s *testSuite) TestExplainStatementsSummary(c *C) { tk.MustQuery("desc select * from information_schema.statements_summary where digest in ('a','b','c')").Check(testutil.RowsWithSep(" ", `MemTableScan_5 10000.00 root table:STATEMENTS_SUMMARY digests: ["a","b","c"]`)) } + +func (s *testSuite) TestFix29401(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("drop table if exists tt123;") + tk.MustExec(`CREATE TABLE tt123 ( + id int(11) NOT NULL, + a bigint(20) DEFAULT NULL, + b char(20) DEFAULT NULL, + c datetime DEFAULT NULL, + d double DEFAULT NULL, + e json DEFAULT NULL, + f decimal(40,6) DEFAULT NULL, + PRIMARY KEY (id) /*T![clustered_index] CLUSTERED */, + KEY a (a), + KEY b (b), + KEY c (c), + KEY d (d), + KEY f (f) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;`) + tk.MustExec(" explain select /*+ inl_hash_join(t1) */ * from tt123 t1 join tt123 t2 on t1.b=t2.e;") +} diff --git a/executor/explainfor_test.go b/executor/explainfor_test.go index 7df050b88fcaa..5befb576c132a 100644 --- a/executor/explainfor_test.go +++ b/executor/explainfor_test.go @@ -20,14 +20,13 @@ import ( "fmt" "math" "strconv" - "strings" "sync" . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/auth" "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/session" - txninfo "github.com/pingcap/tidb/session/txninfo" + "github.com/pingcap/tidb/session/txninfo" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/israce" @@ -259,6 +258,7 @@ type testPrepareSerialSuite struct { } func (s *testPrepareSerialSuite) TestExplainForConnPlanCache(c *C) { + c.Skip("unstable") if israce.RaceEnabled { c.Skip("skip race test") } @@ -287,10 +287,9 @@ func (s *testPrepareSerialSuite) TestExplainForConnPlanCache(c *C) { explainQuery := "explain for connection " + strconv.FormatUint(tk1.Se.ShowProcess().ID, 10) explainResult := testkit.Rows( - "Selection_8 8000.00 root eq(cast(test.t.a, double BINARY), 1)", - "└─TableReader_7 8000.00 root data:Selection_6", - " └─Selection_6 8000.00 cop[tikv] eq(cast(test.t.a, double BINARY), 1)", - " └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "TableReader_7 10.00 root data:Selection_6", + "└─Selection_6 10.00 cop[tikv] eq(test.t.a, 1)", + " └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", ) // Now the ProcessInfo held by mockSessionManager1 will not be updated in real time. @@ -303,6 +302,9 @@ func (s *testPrepareSerialSuite) TestExplainForConnPlanCache(c *C) { PS: []*util.ProcessInfo{tk1.Se.ShowProcess()}, }) tk2.MustQuery(explainQuery).Check(explainResult) + tk1.MustExec(executeQuery) + // The plan can not be cached because the string type parameter will be convert to int type for calculation. + tk1.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) // multiple test, '1000' is both effective and efficient. repeats := 1000 @@ -511,9 +513,14 @@ func (s *testPrepareSerialSuite) TestPointGetUserVarPlanCache(c *C) { tkProcess := tk.Se.ShowProcess() ps := []*util.ProcessInfo{tkProcess} tk.Se.SetSessionManager(&mockSessionManager1{PS: ps}) - rows := tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)).Rows() - c.Assert(strings.Contains(fmt.Sprintf("%v", rows[5][0]), "IndexRangeScan"), IsTrue) - c.Assert(strings.Contains(fmt.Sprintf("%v", rows[5][3]), "table:t2"), IsTrue) + tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)).Check(testkit.Rows( // can use idx_a + `Projection_9 1.00 root test.t1.a, test.t1.b, test.t2.a, test.t2.b`, + `└─IndexJoin_17 1.00 root inner join, inner:TableReader_13, outer key:test.t2.a, inner key:test.t1.a, equal cond:eq(test.t2.a, test.t1.a)`, + ` ├─Selection_44(Build) 0.80 root not(isnull(test.t2.a))`, + ` │ └─Point_Get_43 1.00 root table:t2, index:idx_a(a) `, + ` └─TableReader_13(Probe) 0.00 root data:Selection_12`, + ` └─Selection_12 0.00 cop[tikv] eq(test.t1.a, 1)`, + ` └─TableRangeScan_11 1.00 cop[tikv] table:t1 range: decided by [test.t2.a], keep order:false, stats:pseudo`)) tk.MustExec("set @a=2") tk.MustQuery("execute stmt using @a").Check(testkit.Rows( @@ -522,9 +529,14 @@ func (s *testPrepareSerialSuite) TestPointGetUserVarPlanCache(c *C) { tkProcess = tk.Se.ShowProcess() ps = []*util.ProcessInfo{tkProcess} tk.Se.SetSessionManager(&mockSessionManager1{PS: ps}) - rows = tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)).Rows() - c.Assert(strings.Contains(fmt.Sprintf("%v", rows[5][0]), "IndexRangeScan"), IsTrue) - c.Assert(strings.Contains(fmt.Sprintf("%v", rows[5][3]), "table:t2"), IsTrue) + tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)).Check(testkit.Rows( // can use idx_a + `Projection_9 1.00 root test.t1.a, test.t1.b, test.t2.a, test.t2.b`, + `└─IndexJoin_17 1.00 root inner join, inner:TableReader_13, outer key:test.t2.a, inner key:test.t1.a, equal cond:eq(test.t2.a, test.t1.a)`, + ` ├─Selection_44(Build) 0.80 root not(isnull(test.t2.a))`, + ` │ └─Point_Get_43 1.00 root table:t2, index:idx_a(a) `, + ` └─TableReader_13(Probe) 0.00 root data:Selection_12`, + ` └─Selection_12 0.00 cop[tikv] eq(test.t1.a, 2)`, + ` └─TableRangeScan_11 1.00 cop[tikv] table:t1 range: decided by [test.t2.a], keep order:false, stats:pseudo`)) tk.MustQuery("execute stmt using @a").Check(testkit.Rows( "2 4 2 2", )) @@ -605,15 +617,15 @@ func (s *testPrepareSerialSuite) TestIssue28259(c *C) { tk.MustExec("set @a=-1696020282760139948, @b=-2619168038882941276, @c=-4004648990067362699;") tk.MustQuery("execute stmt using @a,@b,@c;").Check(testkit.Rows()) - tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) tk.MustQuery("execute stmt using @a,@b,@c;").Check(testkit.Rows()) tkProcess = tk.Se.ShowProcess() ps = []*util.ProcessInfo{tkProcess} tk.Se.SetSessionManager(&mockSessionManager1{PS: ps}) res = tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) - c.Assert(len(res.Rows()), Equals, 3) + c.Assert(len(res.Rows()), Equals, 4) c.Assert(res.Rows()[0][0], Matches, ".*Selection.*") - c.Assert(res.Rows()[2][0], Matches, ".*IndexFullScan.*") + c.Assert(res.Rows()[3][0], Matches, ".*IndexFullScan.*") res = tk.MustQuery("explain format = 'brief' select col1 from UK_GCOL_VIRTUAL_18588 use index(UK_COL1) " + "where col1 between -1696020282760139948 and -2619168038882941276 or col1 < -4004648990067362699;") @@ -643,7 +655,7 @@ func (s *testPrepareSerialSuite) TestIssue28259(c *C) { tk.MustExec("set @a=2, @b=1, @c=1;") tk.MustQuery("execute stmt using @a,@b,@c;").Check(testkit.Rows()) - tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) tk.MustQuery("execute stmt using @a,@b,@c;").Check(testkit.Rows()) tkProcess = tk.Se.ShowProcess() ps = []*util.ProcessInfo{tkProcess} @@ -653,7 +665,7 @@ func (s *testPrepareSerialSuite) TestIssue28259(c *C) { c.Assert(res.Rows()[1][0], Matches, ".*Selection.*") c.Assert(res.Rows()[1][4], Equals, "lt(test.t.b, 1), or(and(ge(test.t.a, 2), le(test.t.a, 1)), lt(test.t.a, 1))") c.Assert(res.Rows()[2][0], Matches, ".*IndexReader.*") - c.Assert(res.Rows()[4][0], Matches, ".*IndexFullScan.*") + c.Assert(res.Rows()[4][0], Matches, ".*IndexRangeScan.*") res = tk.MustQuery("explain format = 'brief' select a from t use index(idx) " + "where (a between 0 and 2 or a < 2) and b < 1;") @@ -690,7 +702,7 @@ func (s *testPrepareSerialSuite) TestIssue28259(c *C) { tk.MustExec("set @a=2, @b=1, @c=1;") tk.MustQuery("execute stmt using @a,@b,@c;").Check(testkit.Rows()) - tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) tk.MustQuery("execute stmt using @a,@b,@c;").Check(testkit.Rows()) tkProcess = tk.Se.ShowProcess() ps = []*util.ProcessInfo{tkProcess} @@ -699,7 +711,7 @@ func (s *testPrepareSerialSuite) TestIssue28259(c *C) { c.Assert(len(res.Rows()), Equals, 6) c.Assert(res.Rows()[1][0], Matches, ".*Selection.*") c.Assert(res.Rows()[2][0], Matches, ".*IndexLookUp.*") - c.Assert(res.Rows()[3][0], Matches, ".*IndexFullScan.*") + c.Assert(res.Rows()[3][0], Matches, ".*IndexRangeScan.*") c.Assert(res.Rows()[4][0], Matches, ".*Selection.*") c.Assert(res.Rows()[5][0], Matches, ".*TableRowIDScan.*") @@ -822,7 +834,7 @@ func (s *testPrepareSerialSuite) TestIssue28696(c *C) { c.Assert(res.Rows()[4][0], Matches, ".*TableRowIDScan.*") } -func (s *testPrepareSerialSuite) TestIssue28710(c *C) { +func (s *testPrepareSerialSuite) TestIndexMerge4PlanCache(c *C) { tk := testkit.NewTestKitWithInit(c, s.store) orgEnable := core.PreparedPlanCacheEnabled() @@ -890,4 +902,628 @@ func (s *testPrepareSerialSuite) TestIssue28710(c *C) { c.Assert(res.Rows()[2][4], Equals, "range:(0,3), keep order:false, stats:pseudo") c.Assert(res.Rows()[3][0], Matches, ".*IndexRangeScan.*") c.Assert(res.Rows()[3][4], Equals, "range:(1,+inf], keep order:false, stats:pseudo") + + // test for prefix index + tk.MustExec("drop table if exists t1;") + tk.MustExec("create table t1(a int primary key, b varchar(255), c int, index idx_c(c));") + tk.MustExec("create unique index idx_b on t1(b(3));") + tk.MustExec("insert into t1 values(1,'abcdfsafd',1),(2,'addfdsafd',2),(3,'ddcdsaf',3),(4,'bbcsa',4);") + tk.MustExec("prepare stmt from 'select /*+ USE_INDEX_MERGE(t1, primary, idx_b, idx_c) */ * from t1 where b = ? or a > 10 or c > 10;';") + tk.MustExec("set @a='bbcsa', @b='ddcdsaf';") + tk.MustQuery("execute stmt using @a;").Check(testkit.Rows("4 bbcsa 4")) + + tkProcess = tk.Se.ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Se.SetSessionManager(&mockSessionManager1{PS: ps}) + res = tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) + c.Assert(res.Rows()[1][0], Matches, ".*IndexMerge.*") + + tk.MustQuery("execute stmt using @b;").Check(testkit.Rows("3 ddcdsaf 3")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + tk.MustQuery("execute stmt using @b;").Check(testkit.Rows("3 ddcdsaf 3")) + tkProcess = tk.Se.ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Se.SetSessionManager(&mockSessionManager1{PS: ps}) + res = tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) + c.Assert(res.Rows()[1][0], Matches, ".*IndexMerge.*") + + // rewrite the origin indexMerge test + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int, b int, c int, primary key(a), key(b))") + tk.MustExec("prepare stmt from 'select /*+ inl_join(t2) */ * from t t1 join t t2 on t1.a = t2.a and t1.c = t2.c where t2.a = 1 or t2.b = 1;';") + tk.MustQuery("execute stmt;").Check(testkit.Rows()) + + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1(a int primary key, b int, c int, key(b), key(c));") + tk.MustExec("INSERT INTO t1 VALUES (10, 10, 10), (11, 11, 11)") + tk.MustExec("prepare stmt from 'select /*+ use_index_merge(t1) */ * from t1 where c=? or (b=? and a=?);';") + tk.MustExec("set @a = 10, @b = 11;") + tk.MustQuery("execute stmt using @a, @a, @a").Check(testkit.Rows("10 10 10")) + tk.MustQuery("execute stmt using @b, @b, @b").Check(testkit.Rows("11 11 11")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + tk.MustExec("prepare stmt from 'select /*+ use_index_merge(t1) */ * from t1 where c=? or (b=? and (a=? or a=?));';") + tk.MustQuery("execute stmt using @a, @a, @a, @a").Check(testkit.Rows("10 10 10")) + tk.MustQuery("execute stmt using @b, @b, @b, @b").Check(testkit.Rows("11 11 11")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + tk.MustExec("prepare stmt from 'select /*+ use_index_merge(t1) */ * from t1 where c=? or (b=? and (a=? and c=?));';") + tk.MustQuery("execute stmt using @a, @a, @a, @a").Check(testkit.Rows("10 10 10")) + tk.MustQuery("execute stmt using @b, @b, @b, @b").Check(testkit.Rows("11 11 11")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + tk.MustExec("prepare stmt from 'select /*+ use_index_merge(t1) */ * from t1 where c=? or (b=? and (a >= ? and a <= ?));';") + tk.MustQuery("execute stmt using @a, @a, @b, @a").Check(testkit.Rows("10 10 10")) + tk.MustQuery("execute stmt using @b, @b, @b, @b").Check(testkit.Rows("11 11 11")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + + tk.MustExec("prepare stmt from 'select /*+ use_index_merge(t1) */ * from t1 where c=10 or (a >=? and a <= ?);';") + tk.MustExec("set @a=9, @b=10, @c=11;") + tk.MustQuery("execute stmt using @a, @a;").Check(testkit.Rows("10 10 10")) + tk.MustQuery("execute stmt using @a, @c;").Check(testkit.Rows("10 10 10", "11 11 11")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + tk.MustQuery("execute stmt using @c, @a;").Check(testkit.Rows("10 10 10")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + + tk.MustExec("prepare stmt from 'select /*+ use_index_merge(t1) */ * from t1 where c=10 or (a >=? and a <= ?);';") + tk.MustExec("set @a=9, @b=10, @c=11;") + tk.MustQuery("execute stmt using @a, @c;").Check(testkit.Rows("10 10 10", "11 11 11")) + tk.MustQuery("execute stmt using @a, @a;").Check(testkit.Rows("10 10 10")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + tk.MustQuery("execute stmt using @c, @a;").Check(testkit.Rows("10 10 10")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + + tk.MustExec("prepare stmt from 'select /*+ use_index_merge(t1) */ * from t1 where c=10 or (a >=? and a <= ?);';") + tk.MustExec("set @a=9, @b=10, @c=11;") + tk.MustQuery("execute stmt using @c, @a;").Check(testkit.Rows("10 10 10")) + tk.MustQuery("execute stmt using @a, @c;").Check(testkit.Rows("10 10 10", "11 11 11")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + tk.MustQuery("execute stmt using @a, @a;").Check(testkit.Rows("10 10 10")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + + tk.MustExec("drop table if exists t0") + tk.MustExec("CREATE TABLE t0(c0 INT AS (1), c1 INT PRIMARY KEY)") + tk.MustExec("INSERT INTO t0(c1) VALUES (0)") + tk.MustExec("CREATE INDEX i0 ON t0(c0)") + tk.MustExec("prepare stmt from 'SELECT /*+ USE_INDEX_MERGE(t0, i0, PRIMARY)*/ t0.c0 FROM t0 WHERE t0.c1 OR t0.c0;';") + tk.MustQuery("execute stmt;").Check(testkit.Rows("1")) + tk.MustQuery("execute stmt;").Check(testkit.Rows("1")) + // The plan contains the generated column, so it can not be cached. + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) + + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("create table t1(id int primary key, a int, b int, c int, d int)") + tk.MustExec("create index t1a on t1(a)") + tk.MustExec("create index t1b on t1(b)") + tk.MustExec("create table t2(id int primary key, a int)") + tk.MustExec("create index t2a on t2(a)") + tk.MustExec("insert into t1 values(1,1,1,1,1),(2,2,2,2,2),(3,3,3,3,3),(4,4,4,4,4),(5,5,5,5,5)") + tk.MustExec("insert into t2 values(1,1),(5,5)") + tk.MustExec("prepare stmt from 'select /*+ use_index_merge(t1, t1a, t1b) */ sum(t1.a) from t1 join t2 on t1.id = t2.id where t1.a < ? or t1.b > ?';") + tk.MustExec("set @a=2, @b=4, @c=5;") + tk.MustQuery("execute stmt using @a, @b").Check(testkit.Rows("6")) + tk.MustQuery("execute stmt using @a, @c").Check(testkit.Rows("1")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) +} + +func (s *testPrepareSerialSuite) TestSetOperations4PlanCache(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + + orgEnable := core.PreparedPlanCacheEnabled() + defer func() { + core.SetPreparedPlanCache(orgEnable) + }() + core.SetPreparedPlanCache(true) + + var err error + tk.Se, err = session.CreateSession4TestWithOpt(s.store, &session.Opt{ + PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), + }) + c.Assert(err, IsNil) + + tk.MustExec("use test") + tk.MustExec("set @@tidb_enable_collect_execution_info=0;") + tk.MustExec("drop table if exists t1, t2;") + tk.MustExec("CREATE TABLE `t1` (a int);") + tk.MustExec("CREATE TABLE `t2` (a int);") + tk.MustExec("insert into t1 values(1), (2);") + tk.MustExec("insert into t2 values(1), (3);") + // test for UNION + tk.MustExec("prepare stmt from 'select * from t1 where a > ? union select * from t2 where a > ?;';") + tk.MustExec("set @a=0, @b=1;") + tk.MustQuery("execute stmt using @a, @b;").Sort().Check(testkit.Rows("1", "2", "3")) + tk.MustQuery("execute stmt using @b, @a;").Sort().Check(testkit.Rows("1", "2", "3")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + tk.MustQuery("execute stmt using @b, @b;").Sort().Check(testkit.Rows("2", "3")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + tk.MustQuery("execute stmt using @a, @a;").Sort().Check(testkit.Rows("1", "2", "3")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + + tk.MustExec("prepare stmt from 'select * from t1 where a > ? union all select * from t2 where a > ?;';") + tk.MustExec("set @a=0, @b=1;") + tk.MustQuery("execute stmt using @a, @b;").Sort().Check(testkit.Rows("1", "2", "3")) + tk.MustQuery("execute stmt using @b, @a;").Sort().Check(testkit.Rows("1", "2", "3")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + tk.MustQuery("execute stmt using @b, @b;").Sort().Check(testkit.Rows("2", "3")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + tk.MustQuery("execute stmt using @a, @a;").Sort().Check(testkit.Rows("1", "1", "2", "3")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + + // test for EXCEPT + tk.MustExec("prepare stmt from 'select * from t1 where a > ? except select * from t2 where a > ?;';") + tk.MustExec("set @a=0, @b=1;") + tk.MustQuery("execute stmt using @a, @a;").Sort().Check(testkit.Rows("2")) + tk.MustQuery("execute stmt using @b, @a;").Sort().Check(testkit.Rows("2")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + tk.MustQuery("execute stmt using @b, @b;").Sort().Check(testkit.Rows("2")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + tk.MustQuery("execute stmt using @a, @b;").Sort().Check(testkit.Rows("1", "2")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + + // test for INTERSECT + tk.MustExec("prepare stmt from 'select * from t1 where a > ? union select * from t2 where a > ?;';") + tk.MustExec("set @a=0, @b=1;") + tk.MustQuery("execute stmt using @a, @a;").Sort().Check(testkit.Rows("1", "2", "3")) + tk.MustQuery("execute stmt using @b, @a;").Sort().Check(testkit.Rows("1", "2", "3")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + tk.MustQuery("execute stmt using @b, @b;").Sort().Check(testkit.Rows("2", "3")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + tk.MustQuery("execute stmt using @a, @b;").Sort().Check(testkit.Rows("1", "2", "3")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + + // test for UNION + INTERSECT + tk.MustExec("prepare stmt from 'select * from t1 union all select * from t1 intersect select * from t2;'") + tk.MustQuery("execute stmt;").Sort().Check(testkit.Rows("1", "1", "2")) + + tk.MustExec("prepare stmt from '(select * from t1 union all select * from t1) intersect select * from t2;'") + tk.MustQuery("execute stmt;").Sort().Check(testkit.Rows("1")) + + // test for order by and limit + tk.MustExec("prepare stmt from '(select * from t1 union all select * from t1 intersect select * from t2) order by a limit 2;'") + tk.MustQuery("execute stmt;").Sort().Check(testkit.Rows("1", "1")) +} + +func (s *testPrepareSerialSuite) TestSPM4PlanCache(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + + orgEnable := core.PreparedPlanCacheEnabled() + defer func() { + core.SetPreparedPlanCache(orgEnable) + }() + core.SetPreparedPlanCache(true) + + var err error + tk.Se, err = session.CreateSession4TestWithOpt(s.store, &session.Opt{ + PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), + }) + c.Assert(err, IsNil) + + tk.MustExec("use test") + tk.MustExec("set @@tidb_enable_collect_execution_info=0;") + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a int, index idx_a(a));") + tk.MustExec("delete from mysql.bind_info where default_db='test';") + tk.MustExec("admin reload bindings;") + + res := tk.MustQuery("explain format = 'brief' select * from t;") + c.Assert(res.Rows()[0][0], Matches, ".*TableReader.*") + c.Assert(res.Rows()[1][0], Matches, ".*TableFullScan.*") + + tk.MustExec("prepare stmt from 'select * from t;';") + tk.MustQuery("execute stmt;").Check(testkit.Rows()) + + tkProcess := tk.Se.ShowProcess() + ps := []*util.ProcessInfo{tkProcess} + tk.Se.SetSessionManager(&mockSessionManager1{PS: ps}) + res = tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) + c.Assert(res.Rows()[0][0], Matches, ".*TableReader.*") + c.Assert(res.Rows()[1][0], Matches, ".*TableFullScan.*") + + tk.MustExec("create global binding for select * from t using select * from t use index(idx_a);") + + res = tk.MustQuery("explain format = 'brief' select * from t;") + c.Assert(res.Rows()[0][0], Matches, ".*IndexReader.*") + c.Assert(res.Rows()[1][0], Matches, ".*IndexFullScan.*") + tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("1")) + + tk.MustQuery("execute stmt;").Check(testkit.Rows()) + // The bindSQL has changed, the previous cache is invalid. + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) + tk.MustQuery("execute stmt;").Check(testkit.Rows()) + tkProcess = tk.Se.ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Se.SetSessionManager(&mockSessionManager1{PS: ps}) + res = tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) + // We can use the new binding. + c.Assert(res.Rows()[0][0], Matches, ".*IndexReader.*") + c.Assert(res.Rows()[1][0], Matches, ".*IndexFullScan.*") + tk.MustQuery("execute stmt;").Check(testkit.Rows()) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + tk.MustQuery("execute stmt;").Check(testkit.Rows()) + tk.MustQuery("select @@last_plan_from_binding").Check(testkit.Rows("1")) + + tk.MustExec("delete from mysql.bind_info where default_db='test';") + tk.MustExec("admin reload bindings;") +} + +func (s *testPrepareSerialSuite) TestHint4PlanCache(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + + orgEnable := core.PreparedPlanCacheEnabled() + defer func() { + core.SetPreparedPlanCache(orgEnable) + }() + core.SetPreparedPlanCache(true) + + var err error + tk.Se, err = session.CreateSession4TestWithOpt(s.store, &session.Opt{ + PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), + }) + c.Assert(err, IsNil) + + tk.MustExec("use test") + tk.MustExec("set @@tidb_enable_collect_execution_info=0;") + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a int, index idx_a(a));") + + tk.MustExec("prepare stmt from 'select * from t;';") + tk.MustQuery("execute stmt;").Check(testkit.Rows()) + tk.MustQuery("execute stmt;").Check(testkit.Rows()) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + + tk.MustExec("prepare stmt from 'select /*+ IGNORE_PLAN_CACHE() */ * from t;';") + tk.MustQuery("execute stmt;").Check(testkit.Rows()) + tk.MustQuery("execute stmt;").Check(testkit.Rows()) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) +} + +func (s *testPrepareSerialSuite) TestSelectView4PlanCache(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + + orgEnable := core.PreparedPlanCacheEnabled() + defer func() { + core.SetPreparedPlanCache(orgEnable) + }() + core.SetPreparedPlanCache(true) + + var err error + tk.Se, err = session.CreateSession4TestWithOpt(s.store, &session.Opt{ + PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), + }) + c.Assert(err, IsNil) + + tk.MustExec("use test") + tk.MustExec("set @@tidb_enable_collect_execution_info=0;") + tk.MustExec("drop table if exists view_t;") + tk.MustExec("create table view_t (a int,b int)") + tk.MustExec("insert into view_t values(1,2)") + tk.MustExec("create definer='root'@'localhost' view view1 as select * from view_t") + tk.MustExec("create definer='root'@'localhost' view view2(c,d) as select * from view_t") + tk.MustExec("create definer='root'@'localhost' view view3(c,d) as select a,b from view_t") + tk.MustExec("create definer='root'@'localhost' view view4 as select * from (select * from (select * from view_t) tb1) tb;") + tk.MustExec("prepare stmt1 from 'select * from view1;'") + tk.MustQuery("execute stmt1;").Check(testkit.Rows("1 2")) + tk.MustQuery("execute stmt1;").Check(testkit.Rows("1 2")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + + tk.MustExec("prepare stmt2 from 'select * from view2;'") + tk.MustQuery("execute stmt2;").Check(testkit.Rows("1 2")) + tk.MustQuery("execute stmt2;").Check(testkit.Rows("1 2")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + + tk.MustExec("prepare stmt3 from 'select * from view3;'") + tk.MustQuery("execute stmt3;").Check(testkit.Rows("1 2")) + tk.MustQuery("execute stmt3;").Check(testkit.Rows("1 2")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + + tk.MustExec("prepare stmt4 from 'select * from view4;'") + tk.MustQuery("execute stmt4;").Check(testkit.Rows("1 2")) + tk.MustQuery("execute stmt4;").Check(testkit.Rows("1 2")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + + tk.MustExec("drop table view_t;") + tk.MustExec("create table view_t(c int,d int)") + err = tk.ExecToErr("execute stmt1;") + c.Assert(err.Error(), Equals, "[planner:1356]View 'test.view1' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them") + err = tk.ExecToErr("execute stmt2") + c.Assert(err.Error(), Equals, "[planner:1356]View 'test.view2' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them") + err = tk.ExecToErr("execute stmt3") + c.Assert(err.Error(), Equals, core.ErrViewInvalid.GenWithStackByArgs("test", "view3").Error()) + tk.MustExec("drop table view_t;") + tk.MustExec("create table view_t(a int,b int,c int)") + tk.MustExec("insert into view_t values(1,2,3)") + + tk.MustQuery("execute stmt1;").Check(testkit.Rows("1 2")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) + tk.MustQuery("execute stmt1;").Check(testkit.Rows("1 2")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + + tk.MustQuery("execute stmt2;").Check(testkit.Rows("1 2")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) + tk.MustQuery("execute stmt2;").Check(testkit.Rows("1 2")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + + tk.MustQuery("execute stmt3;").Check(testkit.Rows("1 2")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) + tk.MustQuery("execute stmt3;").Check(testkit.Rows("1 2")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + + tk.MustQuery("execute stmt4;").Check(testkit.Rows("1 2")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) + tk.MustQuery("execute stmt4;").Check(testkit.Rows("1 2")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + + tk.MustExec("alter table view_t drop column a") + tk.MustExec("alter table view_t add column a int after b") + tk.MustExec("update view_t set a=1;") + + tk.MustQuery("execute stmt1;").Check(testkit.Rows("1 2")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) + tk.MustQuery("execute stmt1;").Check(testkit.Rows("1 2")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + + tk.MustQuery("execute stmt2;").Check(testkit.Rows("1 2")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) + tk.MustQuery("execute stmt2;").Check(testkit.Rows("1 2")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + + tk.MustQuery("execute stmt3;").Check(testkit.Rows("1 2")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) + tk.MustQuery("execute stmt3;").Check(testkit.Rows("1 2")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + + tk.MustQuery("execute stmt4;").Check(testkit.Rows("1 2")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) + tk.MustQuery("execute stmt4;").Check(testkit.Rows("1 2")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + + tk.MustExec("drop table view_t;") + tk.MustExec("drop view view1,view2,view3,view4;") + + tk.MustExec("set @@tidb_enable_window_function = 1") + defer func() { + tk.MustExec("set @@tidb_enable_window_function = 0") + }() + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a int, b int)") + tk.MustExec("insert into t values (1,1),(1,2),(2,1),(2,2)") + tk.MustExec("create definer='root'@'localhost' view v as select a, first_value(a) over(rows between 1 preceding and 1 following), last_value(a) over(rows between 1 preceding and 1 following) from t") + tk.MustExec("prepare stmt from 'select * from v;';") + tk.MustQuery("execute stmt;").Check(testkit.Rows("1 1 1", "1 1 2", "2 1 2", "2 2 2")) + tk.MustQuery("execute stmt;").Check(testkit.Rows("1 1 1", "1 1 2", "2 1 2", "2 2 2")) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + + tk.MustExec("drop view v;") +} + +func (s *testPrepareSerialSuite) TestInvisibleIndex4PlanCache(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + + orgEnable := core.PreparedPlanCacheEnabled() + defer func() { + core.SetPreparedPlanCache(orgEnable) + }() + core.SetPreparedPlanCache(true) + + var err error + tk.Se, err = session.CreateSession4TestWithOpt(s.store, &session.Opt{ + PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), + }) + c.Assert(err, IsNil) + + tk.MustExec("use test") + tk.MustExec("set @@tidb_enable_collect_execution_info=0;") + tk.MustExec("drop table if exists t;") + tk.MustExec("CREATE TABLE t(c1 INT, index idx_c(c1));") + + tk.MustExec("prepare stmt from 'select * from t use index(idx_c) where c1 > 1;';") + tk.MustQuery("execute stmt;").Check(testkit.Rows()) + tk.MustQuery("execute stmt;").Check(testkit.Rows()) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + + tk.MustExec("ALTER TABLE t ALTER INDEX idx_c INVISIBLE;") + err = tk.ExecToErr("select * from t use index(idx_c) where c1 > 1;") + c.Assert(err.Error(), Equals, "[planner:1176]Key 'idx_c' doesn't exist in table 't'") + + err = tk.ExecToErr("execute stmt;") + c.Assert(err.Error(), Equals, "[planner:1176]Key 'idx_c' doesn't exist in table 't'") +} + +func (s *testPrepareSerialSuite) TestCTE4PlanCache(c *C) { + // CTE can not be cached, because part of it will be treated as a subquery. + tk := testkit.NewTestKitWithInit(c, s.store) + + orgEnable := core.PreparedPlanCacheEnabled() + defer func() { + core.SetPreparedPlanCache(orgEnable) + }() + core.SetPreparedPlanCache(true) + + var err error + tk.Se, err = session.CreateSession4TestWithOpt(s.store, &session.Opt{ + PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), + }) + c.Assert(err, IsNil) + + tk.MustExec("use test") + tk.MustExec("set @@tidb_enable_collect_execution_info=0;") + tk.MustExec("prepare stmt from 'with recursive cte1 as (" + + "select ? c1 " + + "union all " + + "select c1 + 1 c1 from cte1 where c1 < ?) " + + "select * from cte1;';") + tk.MustExec("set @a=5, @b=4, @c=2, @d=1;") + tk.MustQuery("execute stmt using @d, @a").Check(testkit.Rows("1", "2", "3", "4", "5")) + tk.MustQuery("execute stmt using @d, @b").Check(testkit.Rows("1", "2", "3", "4")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) + tk.MustQuery("execute stmt using @c, @b").Check(testkit.Rows("2", "3", "4")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) + + // Two seed parts. + tk.MustExec("prepare stmt from 'with recursive cte1 as (" + + "select 1 c1 " + + "union all " + + "select 2 c1 " + + "union all " + + "select c1 + 1 c1 from cte1 where c1 < ?) " + + "select * from cte1 order by c1;';") + tk.MustExec("set @a=10, @b=2;") + tk.MustQuery("execute stmt using @a").Check(testkit.Rows("1", "2", "2", "3", "3", "4", "4", "5", "5", "6", "6", "7", "7", "8", "8", "9", "9", "10", "10")) + tk.MustQuery("execute stmt using @b").Check(testkit.Rows("1", "2", "2")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) + + // Two recursive parts. + tk.MustExec("prepare stmt from 'with recursive cte1 as (" + + "select 1 c1 " + + "union all " + + "select 2 c1 " + + "union all " + + "select c1 + 1 c1 from cte1 where c1 < ? " + + "union all " + + "select c1 + ? c1 from cte1 where c1 < ?) " + + "select * from cte1 order by c1;';") + tk.MustExec("set @a=1, @b=2, @c=3, @d=4, @e=5;") + tk.MustQuery("execute stmt using @c, @b, @e;").Check(testkit.Rows("1", "2", "2", "3", "3", "3", "4", "4", "5", "5", "5", "6", "6")) + tk.MustQuery("execute stmt using @b, @a, @d;").Check(testkit.Rows("1", "2", "2", "2", "3", "3", "3", "4", "4", "4")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) + + tk.MustExec("drop table if exists t1;") + tk.MustExec("create table t1(a int);") + tk.MustExec("insert into t1 values(1);") + tk.MustExec("insert into t1 values(2);") + tk.MustExec("prepare stmt from 'SELECT * FROM t1 dt WHERE EXISTS(WITH RECURSIVE qn AS (SELECT a*? AS b UNION ALL SELECT b+? FROM qn WHERE b=?) SELECT * FROM qn WHERE b=a);';") + tk.MustExec("set @a=1, @b=2, @c=3, @d=4, @e=5, @f=0;") + + tk.MustQuery("execute stmt using @f, @a, @f").Check(testkit.Rows("1")) + tk.MustQuery("execute stmt using @a, @b, @a").Check(testkit.Rows("1")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) + + tk.MustExec("prepare stmt from 'with recursive c(p) as (select ?), cte(a, b) as (select 1, 1 union select a+?, 1 from cte, c where a < ?) select * from cte order by 1, 2;';") + tk.MustQuery("execute stmt using @a, @a, @e;").Check(testkit.Rows("1 1", "2 1", "3 1", "4 1", "5 1")) + tk.MustQuery("execute stmt using @b, @b, @c;").Check(testkit.Rows("1 1", "3 1")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) +} + +func (s *testPrepareSerialSuite) TestValidity4PlanCache(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + + orgEnable := core.PreparedPlanCacheEnabled() + defer func() { + core.SetPreparedPlanCache(orgEnable) + }() + core.SetPreparedPlanCache(true) + + var err error + tk.Se, err = session.CreateSession4TestWithOpt(s.store, &session.Opt{ + PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), + }) + c.Assert(err, IsNil) + + tk.MustExec("use test") + tk.MustExec("set @@tidb_enable_collect_execution_info=0;") + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a int);") + + tk.MustExec("prepare stmt from 'select * from t;';") + tk.MustQuery("execute stmt;").Check(testkit.Rows()) + tk.MustQuery("execute stmt;").Check(testkit.Rows()) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + + tk.MustExec("drop database if exists plan_cache;") + tk.MustExec("create database plan_cache;") + tk.MustExec("use plan_cache;") + tk.MustExec("create table t(a int);") + tk.MustExec("insert into t values(1);") + tk.MustQuery("execute stmt;").Check(testkit.Rows()) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) + tk.MustQuery("execute stmt;").Check(testkit.Rows()) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + + tk.MustExec("prepare stmt from 'select * from t;';") + tk.MustQuery("execute stmt;").Check(testkit.Rows("1")) + tk.MustQuery("execute stmt;").Check(testkit.Rows("1")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + + tk.MustExec("use test") + tk.MustQuery("execute stmt;").Check(testkit.Rows("1")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) +} + +func (s *testPrepareSerialSuite) TestListPartition4PlanCache(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + + orgEnable := core.PreparedPlanCacheEnabled() + defer func() { + core.SetPreparedPlanCache(orgEnable) + }() + core.SetPreparedPlanCache(true) + + var err error + tk.Se, err = session.CreateSession4TestWithOpt(s.store, &session.Opt{ + PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), + }) + c.Assert(err, IsNil) + + tk.MustExec("use test") + tk.MustExec("set @@tidb_enable_collect_execution_info=0;") + tk.MustExec("set @@session.tidb_enable_list_partition=1;") + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a int, b int) PARTITION BY LIST (a) ( PARTITION p0 VALUES IN (1, 2, 3), PARTITION p1 VALUES IN (4, 5, 6));") + + tk.MustExec("set @@tidb_partition_prune_mode='static';") + tk.MustExec("prepare stmt from 'select * from t;';") + tk.MustQuery("execute stmt;").Check(testkit.Rows()) + tk.MustQuery("execute stmt;").Check(testkit.Rows()) + // The list partition plan can not be cached. + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) +} + +func (s *testSerialSuite) TestMoreSessions4PlanCache(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk2 := testkit.NewTestKitWithInit(c, s.store) + + orgEnable := core.PreparedPlanCacheEnabled() + defer func() { + core.SetPreparedPlanCache(orgEnable) + }() + core.SetPreparedPlanCache(true) + + var err error + tk.Se, err = session.CreateSession4TestWithOpt(s.store, &session.Opt{ + PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), + }) + c.Assert(err, IsNil) + + tk.MustExec("set @@tidb_enable_collect_execution_info=0;") + tk.MustExec("use test;") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int);") + tk.MustExec("prepare stmt from 'select * from t;';") + + tk.MustQuery("execute stmt").Check(testkit.Rows()) + tk.MustQuery("execute stmt").Check(testkit.Rows()) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + + tk2.Se, err = session.CreateSession4TestWithOpt(s.store, &session.Opt{ + PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), + }) + c.Assert(err, IsNil) + + tk2.MustExec("use test;") + err = tk2.ExecToErr("execute stmt;") + c.Assert(err.Error(), Equals, "[planner:8111]Prepared statement not found") + tk2.MustExec("prepare stmt from 'select * from t;';") + tk2.MustQuery("execute stmt").Check(testkit.Rows()) + tk2.MustQuery("execute stmt").Check(testkit.Rows()) + tk2.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + + tk.MustQuery("execute stmt").Check(testkit.Rows()) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) +} + +func (s *testSuite) TestIssue28792(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("use test") + tk.MustExec("CREATE TABLE t12(a INT, b INT)") + tk.MustExec("CREATE TABLE t97(a INT, b INT UNIQUE NOT NULL);") + r1 := tk.MustQuery("EXPLAIN SELECT t12.a, t12.b FROM t12 LEFT JOIN t97 on t12.b = t97.b;").Rows() + r2 := tk.MustQuery("EXPLAIN SELECT t12.a, t12.b FROM t12 LEFT JOIN t97 use index () on t12.b = t97.b;").Rows() + c.Assert(r1, DeepEquals, r2) } diff --git a/executor/grant.go b/executor/grant.go index f17fb420f63eb..cbe15b2c350d0 100644 --- a/executor/grant.go +++ b/executor/grant.go @@ -72,14 +72,37 @@ func (e *GrantExec) Next(ctx context.Context, req *chunk.Chunk) error { dbName = e.ctx.GetSessionVars().CurrentDB } - // Make sure the table exist. + // For table & column level, check whether table exists and privilege is valid if e.Level.Level == ast.GrantLevelTable { + // Return if privilege is invalid, to fail before not existing table, see issue #29302 + for _, p := range e.Privs { + if len(p.Cols) == 0 { + if !mysql.AllTablePrivs.Has(p.Priv) && p.Priv != mysql.AllPriv && p.Priv != mysql.UsagePriv && p.Priv != mysql.GrantPriv && p.Priv != mysql.ExtendedPriv { + return ErrIllegalGrantForTable + } + } else { + if !mysql.AllColumnPrivs.Has(p.Priv) && p.Priv != mysql.AllPriv && p.Priv != mysql.UsagePriv { + return ErrWrongUsage.GenWithStackByArgs("COLUMN GRANT", "NON-COLUMN PRIVILEGES") + } + } + } dbNameStr := model.NewCIStr(dbName) schema := e.ctx.GetInfoSchema().(infoschema.InfoSchema) tbl, err := schema.TableByName(dbNameStr, model.NewCIStr(e.Level.TableName)) - // Allow GRANT on non-existent table, see issue #28533 - if err != nil && !terror.ErrorEqual(err, infoschema.ErrTableNotExists) { - return err + // Allow GRANT on non-existent table with at least create privilege, see issue #28533 #29268 + if err != nil { + allowed := false + if terror.ErrorEqual(err, infoschema.ErrTableNotExists) { + for _, p := range e.Privs { + if p.Priv == mysql.AllPriv || p.Priv&mysql.CreatePriv > 0 { + allowed = true + break + } + } + } + if !allowed { + return err + } } // Note the table name compare is case sensitive here. if tbl != nil && tbl.Meta().Name.String() != e.Level.TableName { @@ -144,7 +167,7 @@ func (e *GrantExec) Next(ctx context.Context, req *chunk.Chunk) error { } _, err := internalSession.(sqlexec.SQLExecutor).ExecuteInternal(ctx, `INSERT INTO %n.%n (Host, User, authentication_string, plugin) VALUES (%?, %?, %?, %?);`, - mysql.SystemDB, mysql.UserTable, user.User.Hostname, user.User.Username, pwd, authPlugin) + mysql.SystemDB, mysql.UserTable, strings.ToLower(user.User.Hostname), user.User.Username, pwd, authPlugin) if err != nil { return err } @@ -465,7 +488,7 @@ func (e *GrantExec) grantGlobalLevel(priv *ast.PrivElem, user *ast.UserSpec, int if err != nil { return err } - sqlexec.MustFormatSQL(sql, ` WHERE User=%? AND Host=%?`, user.User.Username, user.User.Hostname) + sqlexec.MustFormatSQL(sql, ` WHERE User=%? AND Host=%?`, user.User.Username, strings.ToLower(user.User.Hostname)) _, err = internalSession.(sqlexec.SQLExecutor).ExecuteInternal(context.Background(), sql.String()) return err @@ -622,13 +645,6 @@ func composeDBPrivUpdate(sql *strings.Builder, priv mysql.PrivilegeType, value s func composeTablePrivUpdateForGrant(ctx sessionctx.Context, sql *strings.Builder, priv mysql.PrivilegeType, name string, host string, db string, tbl string) error { var newTablePriv, newColumnPriv []string if priv != mysql.AllPriv { - // TODO: https://github.com/pingcap/parser/pull/581 removed privs from all priv lists - // it is to avoid add GRANT in GRANT ALL SQLs - // WithGRANT seems broken, fix it later - if priv != mysql.GrantPriv && !mysql.AllTablePrivs.Has(priv) { - return ErrIllegalGrantForTable - } - currTablePriv, currColumnPriv, err := getTablePriv(ctx, name, host, db, tbl) if err != nil { return err @@ -658,10 +674,6 @@ func composeTablePrivUpdateForGrant(ctx sessionctx.Context, sql *strings.Builder func composeColumnPrivUpdateForGrant(ctx sessionctx.Context, sql *strings.Builder, priv mysql.PrivilegeType, name string, host string, db string, tbl string, col string) error { var newColumnPriv []string if priv != mysql.AllPriv { - if !mysql.AllColumnPrivs.Has(priv) { - return ErrWrongUsage.GenWithStackByArgs("COLUMN GRANT", "NON-COLUMN PRIVILEGES") - } - currColumnPriv, err := getColumnPriv(ctx, name, host, db, tbl, col) if err != nil { return err @@ -796,7 +808,7 @@ func getRowsAndFields(ctx sessionctx.Context, rs sqlexec.RecordSet) ([]chunk.Row func getRowFromRecordSet(ctx context.Context, se sessionctx.Context, rs sqlexec.RecordSet) ([]chunk.Row, error) { var rows []chunk.Row - req := rs.NewChunk() + req := rs.NewChunk(nil) for { err := rs.Next(ctx, req) if err != nil || req.NumRows() == 0 { diff --git a/executor/grant_test.go b/executor/grant_test.go index 200624d56778d..240e9e5e41154 100644 --- a/executor/grant_test.go +++ b/executor/grant_test.go @@ -1,4 +1,4 @@ -// Copyright 2016 PingCAP, Inc. +// Copyright 2021 PingCAP, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -17,18 +17,22 @@ package executor_test import ( "fmt" "strings" + "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/executor" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/parser/auth" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" - "github.com/pingcap/tidb/util/testkit" + "github.com/pingcap/tidb/testkit" + "github.com/stretchr/testify/require" ) -func (s *testSuiteP1) TestGrantGlobal(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestGrantGlobal(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) // Create a new user. createUserSQL := `CREATE USER 'testGlobal'@'localhost' IDENTIFIED BY '123';` tk.MustExec(createUserSQL) @@ -64,8 +68,11 @@ func (s *testSuiteP1) TestGrantGlobal(c *C) { } } -func (s *testSuite3) TestGrantDBScope(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestGrantDBScope(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) // Create a new user. createUserSQL := `CREATE USER 'testDB'@'localhost' IDENTIFIED BY '123';` tk.MustExec(createUserSQL) @@ -94,14 +101,17 @@ func (s *testSuite3) TestGrantDBScope(c *C) { // Grant in wrong scope. _, err := tk.Exec(` grant create user on test.* to 'testDB1'@'localhost';`) - c.Assert(terror.ErrorEqual(err, executor.ErrWrongUsage.GenWithStackByArgs("DB GRANT", "GLOBAL PRIVILEGES")), IsTrue) + require.True(t, terror.ErrorEqual(err, executor.ErrWrongUsage.GenWithStackByArgs("DB GRANT", "GLOBAL PRIVILEGES"))) _, err = tk.Exec("GRANT SUPER ON test.* TO 'testDB1'@'localhost';") - c.Assert(terror.ErrorEqual(err, executor.ErrWrongUsage.GenWithStackByArgs("DB GRANT", "NON-DB PRIVILEGES")), IsTrue) + require.True(t, terror.ErrorEqual(err, executor.ErrWrongUsage.GenWithStackByArgs("DB GRANT", "NON-DB PRIVILEGES"))) } -func (s *testSuite3) TestWithGrantOption(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestWithGrantOption(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) // Create a new user. createUserSQL := `CREATE USER 'testWithGrant'@'localhost' IDENTIFIED BY '123';` tk.MustExec(createUserSQL) @@ -121,8 +131,11 @@ func (s *testSuite3) TestWithGrantOption(c *C) { tk.MustQuery("SELECT grant_priv FROM mysql.user WHERE User=\"testWithGrant1\"").Check(testkit.Rows("Y")) } -func (s *testSuiteP1) TestGrantTableScope(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestGrantTableScope(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) // Create a new user. createUserSQL := `CREATE USER 'testTbl'@'localhost' IDENTIFIED BY '123';` tk.MustExec(createUserSQL) @@ -135,11 +148,11 @@ func (s *testSuiteP1) TestGrantTableScope(c *C) { sql := fmt.Sprintf("GRANT %s ON test.test1 TO 'testTbl'@'localhost';", mysql.Priv2Str[v]) tk.MustExec(sql) rows := tk.MustQuery(`SELECT Table_priv FROM mysql.Tables_priv WHERE User="testTbl" and host="localhost" and db="test" and Table_name="test1";`).Rows() - c.Assert(rows, HasLen, 1) + require.Len(t, rows, 1) row := rows[0] - c.Assert(row, HasLen, 1) + require.Len(t, rows, 1) p := fmt.Sprintf("%v", row[0]) - c.Assert(strings.Index(p, mysql.Priv2SetStr[v]), Greater, -1) + require.Greater(t, strings.Index(p, mysql.Priv2SetStr[v]), -1) } // Create a new user. createUserSQL = `CREATE USER 'testTbl1'@'localhost' IDENTIFIED BY '123';` @@ -151,19 +164,22 @@ func (s *testSuiteP1) TestGrantTableScope(c *C) { // Make sure all the table privs for granted user are in the Table_priv set. for _, v := range mysql.AllTablePrivs { rows := tk.MustQuery(`SELECT Table_priv FROM mysql.Tables_priv WHERE User="testTbl1" and host="localhost" and db="test" and Table_name="test2";`).Rows() - c.Assert(rows, HasLen, 1) + require.Len(t, rows, 1) row := rows[0] - c.Assert(row, HasLen, 1) + require.Len(t, rows, 1) p := fmt.Sprintf("%v", row[0]) - c.Assert(strings.Index(p, mysql.Priv2SetStr[v]), Greater, -1) + require.Greater(t, strings.Index(p, mysql.Priv2SetStr[v]), -1) } _, err := tk.Exec("GRANT SUPER ON test2 TO 'testTbl1'@'localhost';") - c.Assert(err, ErrorMatches, "\\[executor:1144\\]Illegal GRANT/REVOKE command; please consult the manual to see which privileges can be used") + require.EqualError(t, err, "[executor:1144]Illegal GRANT/REVOKE command; please consult the manual to see which privileges can be used") } -func (s *testSuite3) TestGrantColumnScope(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestGrantColumnScope(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) // Create a new user. createUserSQL := `CREATE USER 'testCol'@'localhost' IDENTIFIED BY '123';` tk.MustExec(createUserSQL) @@ -178,11 +194,11 @@ func (s *testSuite3) TestGrantColumnScope(c *C) { sql := fmt.Sprintf("GRANT %s(c1) ON test.test3 TO 'testCol'@'localhost';", mysql.Priv2Str[v]) tk.MustExec(sql) rows := tk.MustQuery(`SELECT Column_priv FROM mysql.Columns_priv WHERE User="testCol" and host="localhost" and db="test" and Table_name="test3" and Column_name="c1";`).Rows() - c.Assert(rows, HasLen, 1) + require.Len(t, rows, 1) row := rows[0] - c.Assert(row, HasLen, 1) + require.Len(t, rows, 1) p := fmt.Sprintf("%v", row[0]) - c.Assert(strings.Index(p, mysql.Priv2SetStr[v]), Greater, -1) + require.Greater(t, strings.Index(p, mysql.Priv2SetStr[v]), -1) } // Create a new user. @@ -194,19 +210,22 @@ func (s *testSuite3) TestGrantColumnScope(c *C) { // Make sure all the column privs for granted user are in the Column_priv set. for _, v := range mysql.AllColumnPrivs { rows := tk.MustQuery(`SELECT Column_priv FROM mysql.Columns_priv WHERE User="testCol1" and host="localhost" and db="test" and Table_name="test3" and Column_name="c2";`).Rows() - c.Assert(rows, HasLen, 1) + require.Len(t, rows, 1) row := rows[0] - c.Assert(row, HasLen, 1) + require.Len(t, rows, 1) p := fmt.Sprintf("%v", row[0]) - c.Assert(strings.Index(p, mysql.Priv2SetStr[v]), Greater, -1) + require.Greater(t, strings.Index(p, mysql.Priv2SetStr[v]), -1) } _, err := tk.Exec("GRANT SUPER(c2) ON test3 TO 'testCol1'@'localhost';") - c.Assert(err, ErrorMatches, "\\[executor:1221\\]Incorrect usage of COLUMN GRANT and NON-COLUMN PRIVILEGES") + require.EqualError(t, err, "[executor:1221]Incorrect usage of COLUMN GRANT and NON-COLUMN PRIVILEGES") } -func (s *testSuite3) TestIssue2456(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue2456(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("CREATE USER 'dduser'@'%' IDENTIFIED by '123456';") tk.MustExec("CREATE DATABASE `dddb_%`;") tk.MustExec("CREATE table `dddb_%`.`te%` (id int);") @@ -214,17 +233,23 @@ func (s *testSuite3) TestIssue2456(c *C) { tk.MustExec("GRANT ALL PRIVILEGES ON `dddb_%`.`te%` to 'dduser'@'%';") } -func (s *testSuite3) TestNoAutoCreateUser(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestNoAutoCreateUser(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec(`DROP USER IF EXISTS 'test'@'%'`) tk.MustExec(`SET sql_mode='NO_AUTO_CREATE_USER'`) _, err := tk.Exec(`GRANT ALL PRIVILEGES ON *.* to 'test'@'%' IDENTIFIED BY 'xxx'`) - c.Check(err, NotNil) - c.Assert(terror.ErrorEqual(err, executor.ErrCantCreateUserWithGrant), IsTrue) + require.Error(t, err) + require.True(t, terror.ErrorEqual(err, executor.ErrCantCreateUserWithGrant)) } -func (s *testSuite3) TestCreateUserWhenGrant(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestCreateUserWhenGrant(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec(`DROP USER IF EXISTS 'test'@'%'`) // This only applies to sql_mode:NO_AUTO_CREATE_USER off tk.MustExec(`SET SQL_MODE=''`) @@ -236,14 +261,17 @@ func (s *testSuite3) TestCreateUserWhenGrant(c *C) { tk.MustExec(`DROP USER IF EXISTS 'test'@'%'`) } -func (s *testSuite3) TestGrantPrivilegeAtomic(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestGrantPrivilegeAtomic(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec(`drop role if exists r1, r2, r3, r4;`) tk.MustExec(`create role r1, r2, r3;`) tk.MustExec(`create table test.testatomic(x int);`) _, err := tk.Exec(`grant update, select, insert, delete on *.* to r1, r2, r4;`) - c.Assert(terror.ErrorEqual(err, executor.ErrCantCreateUserWithGrant), IsTrue) + require.True(t, terror.ErrorEqual(err, executor.ErrCantCreateUserWithGrant)) tk.MustQuery(`select Update_priv, Select_priv, Insert_priv, Delete_priv from mysql.user where user in ('r1', 'r2', 'r3', 'r4') and host = "%";`).Check(testkit.Rows( "N N N N", "N N N N", @@ -251,7 +279,7 @@ func (s *testSuite3) TestGrantPrivilegeAtomic(c *C) { )) tk.MustExec(`grant update, select, insert, delete on *.* to r1, r2, r3;`) _, err = tk.Exec(`revoke all on *.* from r1, r2, r4, r3;`) - c.Check(err, NotNil) + require.Error(t, err) tk.MustQuery(`select Update_priv, Select_priv, Insert_priv, Delete_priv from mysql.user where user in ('r1', 'r2', 'r3', 'r4') and host = "%";`).Check(testkit.Rows( "Y Y Y Y", "Y Y Y Y", @@ -259,11 +287,11 @@ func (s *testSuite3) TestGrantPrivilegeAtomic(c *C) { )) _, err = tk.Exec(`grant update, select, insert, delete on test.* to r1, r2, r4;`) - c.Assert(terror.ErrorEqual(err, executor.ErrCantCreateUserWithGrant), IsTrue) + require.True(t, terror.ErrorEqual(err, executor.ErrCantCreateUserWithGrant)) tk.MustQuery(`select Update_priv, Select_priv, Insert_priv, Delete_priv from mysql.db where user in ('r1', 'r2', 'r3', 'r4') and host = "%";`).Check(testkit.Rows()) tk.MustExec(`grant update, select, insert, delete on test.* to r1, r2, r3;`) _, err = tk.Exec(`revoke all on *.* from r1, r2, r4, r3;`) - c.Check(err, NotNil) + require.Error(t, err) tk.MustQuery(`select Update_priv, Select_priv, Insert_priv, Delete_priv from mysql.db where user in ('r1', 'r2', 'r3', 'r4') and host = "%";`).Check(testkit.Rows( "Y Y Y Y", "Y Y Y Y", @@ -271,11 +299,11 @@ func (s *testSuite3) TestGrantPrivilegeAtomic(c *C) { )) _, err = tk.Exec(`grant update, select, insert, delete on test.testatomic to r1, r2, r4;`) - c.Assert(terror.ErrorEqual(err, executor.ErrCantCreateUserWithGrant), IsTrue) + require.True(t, terror.ErrorEqual(err, executor.ErrCantCreateUserWithGrant)) tk.MustQuery(`select Table_priv from mysql.tables_priv where user in ('r1', 'r2', 'r3', 'r4') and host = "%";`).Check(testkit.Rows()) tk.MustExec(`grant update, select, insert, delete on test.testatomic to r1, r2, r3;`) _, err = tk.Exec(`revoke all on *.* from r1, r2, r4, r3;`) - c.Check(err, NotNil) + require.Error(t, err) tk.MustQuery(`select Table_priv from mysql.tables_priv where user in ('r1', 'r2', 'r3', 'r4') and host = "%";`).Check(testkit.Rows( "Select,Insert,Update,Delete", "Select,Insert,Update,Delete", @@ -287,8 +315,11 @@ func (s *testSuite3) TestGrantPrivilegeAtomic(c *C) { } -func (s *testSuite3) TestIssue2654(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue2654(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec(`DROP USER IF EXISTS 'test'@'%'`) tk.MustExec(`CREATE USER 'test'@'%' IDENTIFIED BY 'test'`) tk.MustExec("GRANT SELECT ON test.* to 'test'") @@ -296,8 +327,11 @@ func (s *testSuite3) TestIssue2654(c *C) { rows.Check(testkit.Rows(`test %`)) } -func (s *testSuite3) TestGrantUnderANSIQuotes(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestGrantUnderANSIQuotes(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) // Fix a bug that the GrantExec fails in ANSI_QUOTES sql mode // The bug is caused by the improper usage of double quotes like: // INSERT INTO mysql.user ... VALUES ("..", "..", "..") @@ -307,8 +341,11 @@ func (s *testSuite3) TestGrantUnderANSIQuotes(c *C) { tk.MustExec(`DROP USER IF EXISTS 'web'@'%'`) } -func (s *testSuite3) TestMaintainRequire(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestMaintainRequire(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) // test create with require tk.MustExec(`CREATE USER 'ssl_auser'@'%' require issuer '/CN=TiDB admin/OU=TiDB/O=PingCAP/L=San Francisco/ST=California/C=US' subject '/CN=tester1/OU=TiDB/O=PingCAP.Inc/L=Haidian/ST=Beijing/C=ZH' cipher 'AES128-GCM-SHA256'`) @@ -356,57 +393,104 @@ func (s *testSuite3) TestMaintainRequire(c *C) { // check issuer/subject/cipher value _, err := tk.Exec(`CREATE USER 'u4'@'%' require issuer 'CN=TiDB,OU=PingCAP'`) - c.Assert(err, NotNil) + require.Error(t, err) _, err = tk.Exec(`CREATE USER 'u5'@'%' require subject '/CN=TiDB\OU=PingCAP'`) - c.Assert(err, NotNil) + require.Error(t, err) _, err = tk.Exec(`CREATE USER 'u6'@'%' require subject '/CN=TiDB\NC=PingCAP'`) - c.Assert(err, NotNil) + require.Error(t, err) _, err = tk.Exec(`CREATE USER 'u7'@'%' require cipher 'AES128-GCM-SHA1'`) - c.Assert(err, NotNil) + require.Error(t, err) _, err = tk.Exec(`CREATE USER 'u8'@'%' require subject '/CN'`) - c.Assert(err, NotNil) + require.Error(t, err) _, err = tk.Exec(`CREATE USER 'u9'@'%' require cipher 'TLS_AES_256_GCM_SHA384' cipher 'RC4-SHA'`) - c.Assert(err.Error(), Equals, "Duplicate require CIPHER clause") + require.EqualError(t, err, "Duplicate require CIPHER clause") _, err = tk.Exec(`CREATE USER 'u9'@'%' require issuer 'CN=TiDB,OU=PingCAP' issuer 'CN=TiDB,OU=PingCAP2'`) - c.Assert(err.Error(), Equals, "Duplicate require ISSUER clause") + require.EqualError(t, err, "Duplicate require ISSUER clause") _, err = tk.Exec(`CREATE USER 'u9'@'%' require subject '/CN=TiDB\OU=PingCAP' subject '/CN=TiDB\OU=PingCAP2'`) - c.Assert(err.Error(), Equals, "Duplicate require SUBJECT clause") + require.EqualError(t, err, "Duplicate require SUBJECT clause") _, err = tk.Exec(`CREATE USER 'u9'@'%' require ssl ssl`) - c.Assert(err, NotNil) + require.Error(t, err) _, err = tk.Exec(`CREATE USER 'u9'@'%' require x509 x509`) - c.Assert(err, NotNil) + require.Error(t, err) } -func (s *testSuite3) TestMaintainAuthString(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestMaintainAuthString(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec(`CREATE USER 'maint_auth_str1'@'%' IDENTIFIED BY 'foo'`) tk.MustQuery("SELECT authentication_string FROM mysql.user WHERE `Host` = '%' and `User` = 'maint_auth_str1'").Check(testkit.Rows("*F3A2A51A9B0F2BE2468926B4132313728C250DBF")) tk.MustExec(`ALTER USER 'maint_auth_str1'@'%' REQUIRE SSL`) tk.MustQuery("SELECT authentication_string FROM mysql.user WHERE `Host` = '%' and `User` = 'maint_auth_str1'").Check(testkit.Rows("*F3A2A51A9B0F2BE2468926B4132313728C250DBF")) } -func (s *testSuite3) TestGrantOnNonExistTable(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestGrantOnNonExistTable(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("create user genius") tk.MustExec("use test") _, err := tk.Exec("select * from nonexist") - c.Assert(terror.ErrorEqual(err, infoschema.ErrTableNotExists), IsTrue) - // GRANT ON non-existent table success, see issue #28533 - tk.MustExec("grant Select,Insert on nonexist to 'genius'") + require.True(t, terror.ErrorEqual(err, infoschema.ErrTableNotExists)) + _, err = tk.Exec("grant Select,Insert on nonexist to 'genius'") + require.True(t, terror.ErrorEqual(err, infoschema.ErrTableNotExists)) tk.MustExec("create table if not exists xx (id int)") // Case sensitive _, err = tk.Exec("grant Select,Insert on XX to 'genius'") - c.Assert(terror.ErrorEqual(err, infoschema.ErrTableNotExists), IsTrue) + require.True(t, terror.ErrorEqual(err, infoschema.ErrTableNotExists)) _, err = tk.Exec("grant Select,Insert on xx to 'genius'") - c.Assert(err, IsNil) + require.NoError(t, err) _, err = tk.Exec("grant Select,Update on test.xx to 'genius'") - c.Assert(err, IsNil) + require.NoError(t, err) + + // issue #29268 + tk.MustExec("CREATE DATABASE d29268") + defer tk.MustExec("DROP DATABASE IF EXISTS d29268") + tk.MustExec("USE d29268") + tk.MustExec("CREATE USER u29268") + defer tk.MustExec("DROP USER u29268") + + // without create privilege + err = tk.ExecToErr("GRANT SELECT ON t29268 TO u29268") + require.Error(t, err) + require.True(t, terror.ErrorEqual(err, infoschema.ErrTableNotExists)) + err = tk.ExecToErr("GRANT DROP, INSERT ON t29268 TO u29268") + require.Error(t, err) + require.True(t, terror.ErrorEqual(err, infoschema.ErrTableNotExists)) + err = tk.ExecToErr("GRANT UPDATE, CREATE VIEW, SHOW VIEW ON t29268 TO u29268") + require.Error(t, err) + require.True(t, terror.ErrorEqual(err, infoschema.ErrTableNotExists)) + err = tk.ExecToErr("GRANT DELETE, REFERENCES, ALTER ON t29268 TO u29268") + require.Error(t, err) + require.True(t, terror.ErrorEqual(err, infoschema.ErrTableNotExists)) + + // with create privilege + tk.MustExec("GRANT CREATE ON t29268 TO u29268") + tk.MustExec("GRANT CREATE, SELECT ON t29268 TO u29268") + tk.MustExec("GRANT CREATE, DROP, INSERT ON t29268 TO u29268") + + // check privilege + tk.Session().Auth(&auth.UserIdentity{Username: "u29268", Hostname: "localhost"}, nil, nil) + tk.MustExec("USE d29268") + tk.MustExec("CREATE TABLE t29268 (c1 int)") + tk.MustExec("INSERT INTO t29268 VALUES (1), (2)") + tk.MustQuery("SELECT c1 FROM t29268").Check(testkit.Rows("1", "2")) + tk.MustExec("DROP TABLE t29268") + + // check grant all + tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "localhost"}, nil, nil) + tk.MustExec("GRANT ALL ON t29268 TO u29268") } -func (s *testSuite3) TestIssue22721(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue22721(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("create table if not exists xx (id int)") tk.MustExec("CREATE USER 'sync_ci_data'@'%' IDENTIFIED BY 'sNGNQo12fEHe0n3vU';") @@ -416,21 +500,24 @@ func (s *testSuite3) TestIssue22721(c *C) { tk.MustExec("GRANT USAGE ON test.xx TO 'sync_ci_data'@'%';") } -func (s *testSuite3) TestPerformanceSchemaPrivGrant(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestPerformanceSchemaPrivGrant(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("create user issue27867;") defer func() { tk.MustExec("drop user issue27867;") }() - c.Assert(tk.Se.Auth(&auth.UserIdentity{Username: "root", Hostname: "localhost"}, nil, nil), IsTrue) + require.True(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "localhost"}, nil, nil)) err := tk.ExecToErr("grant all on performance_schema.* to issue27867;") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[executor:1044]Access denied for user 'root'@'%' to database 'performance_schema'") + require.Error(t, err) + require.EqualError(t, err, "[executor:1044]Access denied for user 'root'@'%' to database 'performance_schema'") // Check case insensitivity err = tk.ExecToErr("grant all on PERFormanCE_scHemA.* to issue27867;") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[executor:1044]Access denied for user 'root'@'%' to database 'PERFormanCE_scHemA'") + require.Error(t, err) + require.EqualError(t, err, "[executor:1044]Access denied for user 'root'@'%' to database 'PERFormanCE_scHemA'") // Check other database privileges tk.MustExec("grant select on performance_schema.* to issue27867;") tk.MustExec("grant insert on performance_schema.* to issue27867;") @@ -439,36 +526,39 @@ func (s *testSuite3) TestPerformanceSchemaPrivGrant(c *C) { tk.MustExec("grant drop on performance_schema.* to issue27867;") tk.MustExec("grant lock tables on performance_schema.* to issue27867;") err = tk.ExecToErr("grant create on performance_schema.* to issue27867;") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[executor:1044]Access denied for user 'root'@'%' to database 'performance_schema'") + require.Error(t, err) + require.EqualError(t, err, "[executor:1044]Access denied for user 'root'@'%' to database 'performance_schema'") err = tk.ExecToErr("grant references on performance_schema.* to issue27867;") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[executor:1044]Access denied for user 'root'@'%' to database 'performance_schema'") + require.Error(t, err) + require.EqualError(t, err, "[executor:1044]Access denied for user 'root'@'%' to database 'performance_schema'") err = tk.ExecToErr("grant alter on PERFormAnCE_scHemA.* to issue27867;") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[executor:1044]Access denied for user 'root'@'%' to database 'PERFormAnCE_scHemA'") + require.Error(t, err) + require.EqualError(t, err, "[executor:1044]Access denied for user 'root'@'%' to database 'PERFormAnCE_scHemA'") err = tk.ExecToErr("grant execute on performance_schema.* to issue27867;") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[executor:1044]Access denied for user 'root'@'%' to database 'performance_schema'") + require.Error(t, err) + require.EqualError(t, err, "[executor:1044]Access denied for user 'root'@'%' to database 'performance_schema'") err = tk.ExecToErr("grant index on PERFormanCE_scHemA.* to issue27867;") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[executor:1044]Access denied for user 'root'@'%' to database 'PERFormanCE_scHemA'") + require.Error(t, err) + require.EqualError(t, err, "[executor:1044]Access denied for user 'root'@'%' to database 'PERFormanCE_scHemA'") err = tk.ExecToErr("grant create view on performance_schema.* to issue27867;") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[executor:1044]Access denied for user 'root'@'%' to database 'performance_schema'") + require.Error(t, err) + require.EqualError(t, err, "[executor:1044]Access denied for user 'root'@'%' to database 'performance_schema'") err = tk.ExecToErr("grant show view on performance_schema.* to issue27867;") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[executor:1044]Access denied for user 'root'@'%' to database 'performance_schema'") + require.Error(t, err) + require.EqualError(t, err, "[executor:1044]Access denied for user 'root'@'%' to database 'performance_schema'") } -func (s *testSuite3) TestGrantDynamicPrivs(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestGrantDynamicPrivs(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("create user dyn") _, err := tk.Exec("GRANT BACKUP_ADMIN ON test.* TO dyn") - c.Assert(terror.ErrorEqual(err, executor.ErrIllegalPrivilegeLevel), IsTrue) + require.True(t, terror.ErrorEqual(err, executor.ErrIllegalPrivilegeLevel)) _, err = tk.Exec("GRANT BOGUS_GRANT ON *.* TO dyn") - c.Assert(terror.ErrorEqual(err, executor.ErrDynamicPrivilegeNotRegistered), IsTrue) + require.True(t, terror.ErrorEqual(err, executor.ErrDynamicPrivilegeNotRegistered)) tk.MustExec("GRANT BACKUP_Admin ON *.* TO dyn") // grant one priv tk.MustQuery("SELECT * FROM mysql.global_grants WHERE `Host` = '%' AND `User` = 'dyn' ORDER BY user,host,priv,with_grant_option").Check(testkit.Rows("dyn % BACKUP_ADMIN N")) @@ -491,3 +581,17 @@ func (s *testSuite3) TestGrantDynamicPrivs(c *C) { tk.MustQuery("SELECT Grant_Priv FROM mysql.user WHERE `Host` = '%' AND `User` = 'dyn'").Check(testkit.Rows("Y")) tk.MustQuery("SELECT WITH_GRANT_OPTION FROM mysql.global_grants WHERE `Host` = '%' AND `User` = 'dyn' AND Priv='CONNECTION_ADMIN'").Check(testkit.Rows("Y")) } + +func TestNonExistTableIllegalGrant(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("create user u29302") + defer tk.MustExec("drop user u29302") + // Table level, not existing table, illegal privilege + tk.MustGetErrCode("grant create temporary tables on NotExistsD29302.NotExistsT29302 to u29302", mysql.ErrIllegalGrantForTable) + tk.MustGetErrCode("grant lock tables on test.NotExistsT29302 to u29302", mysql.ErrIllegalGrantForTable) + // Column level, not existing table, illegal privilege + tk.MustGetErrCode("grant create temporary tables (NotExistsCol) on NotExistsD29302.NotExistsT29302 to u29302;", mysql.ErrWrongUsage) +} diff --git a/executor/hash_table.go b/executor/hash_table.go index 0f5dc311ccd60..b22f98bbef501 100644 --- a/executor/hash_table.go +++ b/executor/hash_table.go @@ -34,6 +34,7 @@ import ( // hashContext keeps the needed hash context of a db table in hash join. type hashContext struct { + // allTypes one-to-one correspondence with keyColIdx allTypes []*types.FieldType keyColIdx []int buf []byte @@ -84,9 +85,9 @@ type hashRowContainer struct { rowContainer *chunk.RowContainer } -func newHashRowContainer(sCtx sessionctx.Context, estCount int, hCtx *hashContext) *hashRowContainer { +func newHashRowContainer(sCtx sessionctx.Context, estCount int, hCtx *hashContext, allTypes []*types.FieldType) *hashRowContainer { maxChunkSize := sCtx.GetSessionVars().MaxChunkSize - rc := chunk.NewRowContainer(hCtx.allTypes, maxChunkSize) + rc := chunk.NewRowContainer(allTypes, maxChunkSize) c := &hashRowContainer{ sc: sCtx.GetSessionVars().StmtCtx, hCtx: hCtx, @@ -171,7 +172,7 @@ func (c *hashRowContainer) PutChunkSelected(chk *chunk.Chunk, selected, ignoreNu hCtx := c.hCtx for keyIdx, colIdx := range c.hCtx.keyColIdx { ignoreNull := len(ignoreNulls) > keyIdx && ignoreNulls[keyIdx] - err := codec.HashChunkSelected(c.sc, hCtx.hashVals, chk, hCtx.allTypes[colIdx], colIdx, hCtx.buf, hCtx.hasNull, selected, ignoreNull) + err := codec.HashChunkSelected(c.sc, hCtx.hashVals, chk, hCtx.allTypes[keyIdx], colIdx, hCtx.buf, hCtx.hasNull, selected, ignoreNull) if err != nil { return errors.Trace(err) } diff --git a/executor/hash_table_test.go b/executor/hash_table_test.go index 9b9dfa4dbd329..50ef8adb72f5e 100644 --- a/executor/hash_table_test.go +++ b/executor/hash_table_test.go @@ -1,4 +1,4 @@ -// Copyright 2019 PingCAP, Inc. +// Copyright 2021 PingCAP, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -18,14 +18,15 @@ import ( "fmt" "hash" "hash/fnv" + "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/memory" "github.com/pingcap/tidb/util/mock" + "github.com/stretchr/testify/require" ) func initBuildChunk(numRows int) (*chunk.Chunk, []*types.FieldType) { @@ -82,34 +83,34 @@ func (h hashCollision) Sum(b []byte) []byte { panic("not implement func (h hashCollision) Size() int { panic("not implemented") } func (h hashCollision) BlockSize() int { panic("not implemented") } -func (s *pkgTestSerialSuite) TestHashRowContainer(c *C) { +func TestHashRowContainer(t *testing.T) { hashFunc := fnv.New64 - rowContainer, copiedRC := s.testHashRowContainer(c, hashFunc, false) - c.Assert(rowContainer.stat.probeCollision, Equals, int64(0)) + rowContainer, copiedRC := testHashRowContainer(t, hashFunc, false) + require.Equal(t, int64(0), rowContainer.stat.probeCollision) // On windows time.Now() is imprecise, the elapse time may equal 0 - c.Assert(rowContainer.stat.buildTableElapse >= 0, IsTrue) - c.Assert(copiedRC.stat.probeCollision, Equals, rowContainer.stat.probeCollision) - c.Assert(copiedRC.stat.buildTableElapse, Equals, rowContainer.stat.buildTableElapse) + require.True(t, rowContainer.stat.buildTableElapse >= 0) + require.Equal(t, rowContainer.stat.probeCollision, copiedRC.stat.probeCollision) + require.Equal(t, rowContainer.stat.buildTableElapse, copiedRC.stat.buildTableElapse) - rowContainer, copiedRC = s.testHashRowContainer(c, hashFunc, true) - c.Assert(rowContainer.stat.probeCollision, Equals, int64(0)) - c.Assert(rowContainer.stat.buildTableElapse >= 0, IsTrue) - c.Assert(copiedRC.stat.probeCollision, Equals, rowContainer.stat.probeCollision) - c.Assert(copiedRC.stat.buildTableElapse, Equals, rowContainer.stat.buildTableElapse) + rowContainer, copiedRC = testHashRowContainer(t, hashFunc, true) + require.Equal(t, int64(0), rowContainer.stat.probeCollision) + require.True(t, rowContainer.stat.buildTableElapse >= 0) + require.Equal(t, rowContainer.stat.probeCollision, copiedRC.stat.probeCollision) + require.Equal(t, rowContainer.stat.buildTableElapse, copiedRC.stat.buildTableElapse) h := &hashCollision{count: 0} hashFuncCollision := func() hash.Hash64 { return h } - rowContainer, copiedRC = s.testHashRowContainer(c, hashFuncCollision, false) - c.Assert(h.count > 0, IsTrue) - c.Assert(rowContainer.stat.probeCollision > int64(0), IsTrue) - c.Assert(rowContainer.stat.buildTableElapse >= 0, IsTrue) - c.Assert(copiedRC.stat.probeCollision, Equals, rowContainer.stat.probeCollision) - c.Assert(copiedRC.stat.buildTableElapse, Equals, rowContainer.stat.buildTableElapse) + rowContainer, copiedRC = testHashRowContainer(t, hashFuncCollision, false) + require.True(t, h.count > 0) + require.True(t, rowContainer.stat.probeCollision > int64(0)) + require.True(t, rowContainer.stat.buildTableElapse >= 0) + require.Equal(t, rowContainer.stat.probeCollision, copiedRC.stat.probeCollision) + require.Equal(t, rowContainer.stat.buildTableElapse, copiedRC.stat.buildTableElapse) } -func (s *pkgTestSerialSuite) testHashRowContainer(c *C, hashFunc func() hash.Hash64, spill bool) (originRC, copiedRC *hashRowContainer) { +func testHashRowContainer(t *testing.T, hashFunc func() hash.Hash64, spill bool) (originRC, copiedRC *hashRowContainer) { sctx := mock.NewContext() var err error numRows := 10 @@ -125,7 +126,7 @@ func (s *pkgTestSerialSuite) testHashRowContainer(c *C, hashFunc func() hash.Has for i := 0; i < numRows; i++ { hCtx.hashVals = append(hCtx.hashVals, hashFunc()) } - rowContainer := newHashRowContainer(sctx, 0, hCtx) + rowContainer := newHashRowContainer(sctx, 0, hCtx, hCtx.allTypes) copiedRC = rowContainer.ShallowCopy() tracker := rowContainer.GetMemTracker() tracker.SetLabel(memory.LabelForBuildSideResult) @@ -134,16 +135,16 @@ func (s *pkgTestSerialSuite) testHashRowContainer(c *C, hashFunc func() hash.Has rowContainer.rowContainer.ActionSpillForTest().Action(tracker) } err = rowContainer.PutChunk(chk0, nil) - c.Assert(err, IsNil) + require.NoError(t, err) err = rowContainer.PutChunk(chk1, nil) - c.Assert(err, IsNil) + require.NoError(t, err) rowContainer.ActionSpill().(*chunk.SpillDiskAction).WaitForTest() - c.Assert(rowContainer.alreadySpilledSafeForTest(), Equals, spill) - c.Assert(rowContainer.GetMemTracker().BytesConsumed() == 0, Equals, spill) - c.Assert(rowContainer.GetMemTracker().BytesConsumed() > 0, Equals, !spill) + require.Equal(t, spill, rowContainer.alreadySpilledSafeForTest()) + require.Equal(t, spill, rowContainer.GetMemTracker().BytesConsumed() == 0) + require.Equal(t, !spill, rowContainer.GetMemTracker().BytesConsumed() > 0) if rowContainer.alreadySpilledSafeForTest() { - c.Assert(rowContainer.GetDiskTracker(), NotNil) - c.Assert(rowContainer.GetDiskTracker().BytesConsumed() > 0, Equals, true) + require.NotNil(t, rowContainer.GetDiskTracker()) + require.True(t, rowContainer.GetDiskTracker().BytesConsumed() > 0) } probeChk, probeColType := initProbeChunk(2) @@ -155,9 +156,9 @@ func (s *pkgTestSerialSuite) testHashRowContainer(c *C, hashFunc func() hash.Has probeCtx.hasNull = make([]bool, 1) probeCtx.hashVals = append(hCtx.hashVals, hashFunc()) matched, _, err := rowContainer.GetMatchedRowsAndPtrs(hCtx.hashVals[1].Sum64(), probeRow, probeCtx) - c.Assert(err, IsNil) - c.Assert(len(matched), Equals, 2) - c.Assert(matched[0].GetDatumRow(colTypes), DeepEquals, chk0.GetRow(1).GetDatumRow(colTypes)) - c.Assert(matched[1].GetDatumRow(colTypes), DeepEquals, chk1.GetRow(1).GetDatumRow(colTypes)) + require.NoError(t, err) + require.Equal(t, 2, len(matched)) + require.Equal(t, chk0.GetRow(1).GetDatumRow(colTypes), matched[0].GetDatumRow(colTypes)) + require.Equal(t, chk1.GetRow(1).GetDatumRow(colTypes), matched[1].GetDatumRow(colTypes)) return rowContainer, copiedRC } diff --git a/executor/index_advise_test.go b/executor/index_advise_test.go index 694721cf5001c..5371ecd051bc1 100644 --- a/executor/index_advise_test.go +++ b/executor/index_advise_test.go @@ -1,4 +1,4 @@ -// Copyright 2019 PingCAP, Inc. +// Copyright 2021 PingCAP, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -16,32 +16,36 @@ package executor_test import ( "os" + "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/executor" "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/util/testkit" + "github.com/pingcap/tidb/testkit" + "github.com/stretchr/testify/require" ) -func (s *testSuite1) TestIndexAdvise(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIndexAdvise(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) _, err := tk.Exec("index advise infile '/tmp/nonexistence.sql'") - c.Assert(err.Error(), Equals, "Index Advise: don't support load file without local field") + require.EqualError(t, err, "Index Advise: don't support load file without local field") _, err = tk.Exec("index advise local infile ''") - c.Assert(err.Error(), Equals, "Index Advise: infile path is empty") + require.EqualError(t, err, "Index Advise: infile path is empty") _, err = tk.Exec("index advise local infile '/tmp/nonexistence.sql' lines terminated by ''") - c.Assert(err.Error(), Equals, "Index Advise: don't support advise index for SQL terminated by nil") + require.EqualError(t, err, "Index Advise: don't support advise index for SQL terminated by nil") path := "/tmp/index_advise.sql" fp, err := os.Create(path) - c.Assert(err, IsNil) - c.Assert(fp, NotNil) + require.NoError(t, err) + require.NotNil(t, fp) defer func() { err = fp.Close() - c.Assert(err, IsNil) + require.NoError(t, err) err = os.Remove(path) - c.Assert(err, IsNil) + require.NoError(t, err) }() _, err = fp.WriteString("\n" + @@ -53,16 +57,15 @@ func (s *testSuite1) TestIndexAdvise(c *C) { "\n" + "select a,b from t1,t2 where t1.a = t2.b;\n" + "\n") - c.Assert(err, IsNil) + require.NoError(t, err) // TODO: Using "tastCase" to do more test when we finish the index advisor completely. tk.MustExec("index advise local infile '/tmp/index_advise.sql' max_minutes 3 max_idxnum per_table 4 per_db 5") - ctx := tk.Se.(sessionctx.Context) + ctx := tk.Session().(sessionctx.Context) ia, ok := ctx.Value(executor.IndexAdviseVarKey).(*executor.IndexAdviseInfo) defer ctx.SetValue(executor.IndexAdviseVarKey, nil) - c.Assert(ok, IsTrue) - c.Assert(ia.MaxMinutes, Equals, uint64(3)) - c.Assert(ia.MaxIndexNum.PerTable, Equals, uint64(4)) - c.Assert(ia.MaxIndexNum.PerDB, Equals, uint64(5)) - + require.True(t, ok) + require.Equal(t, uint64(3), ia.MaxMinutes) + require.Equal(t, uint64(4), ia.MaxIndexNum.PerTable) + require.Equal(t, uint64(5), ia.MaxIndexNum.PerDB) } diff --git a/executor/index_lookup_hash_join.go b/executor/index_lookup_hash_join.go index d794d3253e105..0beb3e59e66b1 100644 --- a/executor/index_lookup_hash_join.go +++ b/executor/index_lookup_hash_join.go @@ -28,6 +28,7 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/tidb/expression" plannercore "github.com/pingcap/tidb/planner/core" + "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/codec" @@ -147,11 +148,13 @@ func (e *IndexNestedLoopHashJoin) Open(ctx context.Context) error { } e.memTracker = memory.NewTracker(e.id, -1) e.memTracker.AttachTo(e.ctx.GetSessionVars().StmtCtx.MemTracker) + e.cancelFunc = nil e.innerPtrBytes = make([][]byte, 0, 8) if e.runtimeStats != nil { e.stats = &indexLookUpJoinRuntimeStats{} e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, e.stats) } + e.finished.Store(false) e.startWorkers(ctx) return nil } @@ -166,19 +169,17 @@ func (e *IndexNestedLoopHashJoin) startWorkers(ctx context.Context) { innerCh := make(chan *indexHashJoinTask, concurrency) if e.keepOuterOrder { e.taskCh = make(chan *indexHashJoinTask, concurrency) - } - e.workerWg.Add(1) - ow := e.newOuterWorker(innerCh) - go util.WithRecovery(func() { ow.run(workerCtx) }, e.finishJoinWorkers) - - if !e.keepOuterOrder { - e.resultCh = make(chan *indexHashJoinResult, concurrency) - } else { // When `keepOuterOrder` is true, each task holds their own `resultCh` // individually, thus we do not need a global resultCh. e.resultCh = nil + } else { + e.resultCh = make(chan *indexHashJoinResult, concurrency) } e.joinChkResourceCh = make([]chan *chunk.Chunk, concurrency) + e.workerWg.Add(1) + ow := e.newOuterWorker(innerCh) + go util.WithRecovery(func() { ow.run(workerCtx) }, e.finishJoinWorkers) + for i := 0; i < concurrency; i++ { if !e.keepOuterOrder { e.joinChkResourceCh[i] = make(chan *chunk.Chunk, 1) @@ -201,6 +202,7 @@ func (e *IndexNestedLoopHashJoin) startWorkers(ctx context.Context) { func (e *IndexNestedLoopHashJoin) finishJoinWorkers(r interface{}) { if r != nil { + e.IndexLookUpJoin.finished.Store(true) err := errors.New(fmt.Sprintf("%v", r)) if !e.keepOuterOrder { e.resultCh <- &indexHashJoinResult{err: err} @@ -209,6 +211,7 @@ func (e *IndexNestedLoopHashJoin) finishJoinWorkers(r interface{}) { e.taskCh <- task } if e.cancelFunc != nil { + e.IndexLookUpJoin.ctxCancelReason.Store(err) e.cancelFunc() } } @@ -245,6 +248,9 @@ func (e *IndexNestedLoopHashJoin) Next(ctx context.Context, req *chunk.Chunk) er return result.err } case <-ctx.Done(): + if err := e.IndexLookUpJoin.ctxCancelReason.Load(); err != nil { + return err.(error) + } return ctx.Err() } req.SwapColumns(result.chk) @@ -274,6 +280,9 @@ func (e *IndexNestedLoopHashJoin) runInOrder(ctx context.Context, req *chunk.Chu return result.err } case <-ctx.Done(): + if err := e.IndexLookUpJoin.ctxCancelReason.Load(); err != nil { + return err.(error) + } return ctx.Err() } req.SwapColumns(result.chk) @@ -303,7 +312,6 @@ func (e *IndexNestedLoopHashJoin) isDryUpTasks(ctx context.Context) bool { func (e *IndexNestedLoopHashJoin) Close() error { if e.cancelFunc != nil { e.cancelFunc() - e.cancelFunc = nil } if e.resultCh != nil { for range e.resultCh { @@ -319,6 +327,7 @@ func (e *IndexNestedLoopHashJoin) Close() error { close(e.joinChkResourceCh[i]) } e.joinChkResourceCh = nil + e.finished.Store(false) return e.baseExecutor.Close() } @@ -326,6 +335,7 @@ func (ow *indexHashJoinOuterWorker) run(ctx context.Context) { defer trace.StartRegion(ctx, "IndexHashJoinOuterWorker").End() defer close(ow.innerCh) for { + failpoint.Inject("TestIssue30211", nil) task, err := ow.buildTask(ctx) failpoint.Inject("testIndexHashJoinOuterWorkerErr", func() { err = errors.New("mockIndexHashJoinOuterWorkerErr") @@ -415,8 +425,8 @@ func (e *IndexNestedLoopHashJoin) newOuterWorker(innerCh chan *indexHashJoinTask func (e *IndexNestedLoopHashJoin) newInnerWorker(taskCh chan *indexHashJoinTask, workerID int) *indexHashJoinInnerWorker { // Since multiple inner workers run concurrently, we should copy join's indexRanges for every worker to avoid data race. - copiedRanges := make([]*ranger.Range, 0, len(e.indexRanges)) - for _, ran := range e.indexRanges { + copiedRanges := make([]*ranger.Range, 0, len(e.indexRanges.Range())) + for _, ran := range e.indexRanges.Range() { copiedRanges = append(copiedRanges, ran.Clone()) } var innerStats *innerWorkerRuntimeStats @@ -432,6 +442,8 @@ func (e *IndexNestedLoopHashJoin) newInnerWorker(taskCh chan *indexHashJoinTask, indexRanges: copiedRanges, keyOff2IdxOff: e.keyOff2IdxOff, stats: innerStats, + lookup: &e.IndexLookUpJoin, + memTracker: memory.NewTracker(memory.LabelForIndexJoinInnerWorker, -1), }, taskCh: taskCh, joiner: e.joiners[workerID], @@ -441,6 +453,14 @@ func (e *IndexNestedLoopHashJoin) newInnerWorker(taskCh chan *indexHashJoinTask, joinKeyBuf: make([]byte, 1), outerRowStatus: make([]outerRowStatusFlag, 0, e.maxChunkSize), } + iw.memTracker.AttachTo(e.memTracker) + if len(copiedRanges) != 0 { + // We should not consume this memory usage in `iw.memTracker`. The + // memory usage of inner worker will be reset the end of iw.handleTask. + // While the life cycle of this memory consumption exists throughout the + // whole active period of inner worker. + e.ctx.GetSessionVars().StmtCtx.MemTracker.Consume(2 * types.EstimatedMemUsage(copiedRanges[0].LowVal, len(copiedRanges))) + } if e.lastColHelper != nil { // nextCwf.TmpConstant needs to be reset for every individual // inner worker to avoid data race when the inner workers is running @@ -554,7 +574,7 @@ func (iw *indexHashJoinInnerWorker) buildHashTableForOuterResult(ctx context.Con } } h.Reset() - err := codec.HashChunkRow(iw.ctx.GetSessionVars().StmtCtx, h, row, iw.outerCtx.rowTypes, hashColIdx, buf) + err := codec.HashChunkRow(iw.ctx.GetSessionVars().StmtCtx, h, row, iw.outerCtx.hashTypes, hashColIdx, buf) failpoint.Inject("testIndexHashJoinBuildErr", func() { err = errors.New("mockIndexHashJoinBuildErr") }) @@ -584,6 +604,9 @@ func (iw *indexHashJoinInnerWorker) handleHashJoinInnerWorkerPanic(r interface{} } func (iw *indexHashJoinInnerWorker) handleTask(ctx context.Context, task *indexHashJoinTask, joinResult *indexHashJoinResult, h hash.Hash64, resultCh chan *indexHashJoinResult) error { + defer func() { + iw.memTracker.Consume(-iw.memTracker.BytesConsumed()) + }() var joinStartTime time.Time if iw.stats != nil { start := time.Now() @@ -631,6 +654,9 @@ func (iw *indexHashJoinInnerWorker) doJoinUnordered(ctx context.Context, task *i select { case resultCh <- joinResult: case <-ctx.Done(): + if err := iw.lookup.ctxCancelReason.Load(); err != nil { + return err.(error) + } return ctx.Err() } joinResult, ok = iw.getNewJoinResult(ctx) @@ -645,7 +671,7 @@ func (iw *indexHashJoinInnerWorker) doJoinUnordered(ctx context.Context, task *i func (iw *indexHashJoinInnerWorker) getMatchedOuterRows(innerRow chunk.Row, task *indexHashJoinTask, h hash.Hash64, buf []byte) (matchedRows []chunk.Row, matchedRowPtr []chunk.RowPtr, err error) { h.Reset() - err = codec.HashChunkRow(iw.ctx.GetSessionVars().StmtCtx, h, innerRow, iw.rowTypes, iw.hashCols, buf) + err = codec.HashChunkRow(iw.ctx.GetSessionVars().StmtCtx, h, innerRow, iw.hashTypes, iw.hashCols, buf) if err != nil { return nil, nil, err } @@ -659,7 +685,7 @@ func (iw *indexHashJoinInnerWorker) getMatchedOuterRows(innerRow chunk.Row, task matchedRowPtr = make([]chunk.RowPtr, 0, len(iw.matchedOuterPtrs)) for _, ptr := range iw.matchedOuterPtrs { outerRow := task.outerResult.GetRow(ptr) - ok, err := codec.EqualChunkRow(iw.ctx.GetSessionVars().StmtCtx, innerRow, iw.rowTypes, iw.keyCols, outerRow, iw.outerCtx.rowTypes, iw.outerCtx.hashCols) + ok, err := codec.EqualChunkRow(iw.ctx.GetSessionVars().StmtCtx, innerRow, iw.hashTypes, iw.hashCols, outerRow, iw.outerCtx.hashTypes, iw.outerCtx.hashCols) if err != nil { return nil, nil, err } @@ -759,7 +785,7 @@ func (iw *indexHashJoinInnerWorker) doJoinInOrder(ctx context.Context, task *ind } } // TODO: matchedInnerRowPtrs and matchedInnerRows can be moved to inner worker. - matchedInnerRows := make([]chunk.Row, len(task.matchedInnerRowPtrs)) + matchedInnerRows := make([]chunk.Row, 0, len(task.matchedInnerRowPtrs)) var hasMatched, hasNull, ok bool for chkIdx, innerRowPtrs4Chk := range task.matchedInnerRowPtrs { for outerRowIdx, innerRowPtrs := range innerRowPtrs4Chk { @@ -779,6 +805,9 @@ func (iw *indexHashJoinInnerWorker) doJoinInOrder(ctx context.Context, task *ind select { case resultCh <- joinResult: case <-ctx.Done(): + if err := iw.lookup.ctxCancelReason.Load(); err != nil { + return err.(error) + } return ctx.Err() } joinResult, ok = iw.getNewJoinResult(ctx) diff --git a/executor/index_lookup_join.go b/executor/index_lookup_join.go index 4eec2ce1fe650..4be2f24272ae4 100644 --- a/executor/index_lookup_join.go +++ b/executor/index_lookup_join.go @@ -27,6 +27,7 @@ import ( "unsafe" "github.com/pingcap/errors" + "github.com/pingcap/failpoint" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" @@ -36,6 +37,7 @@ import ( "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/execdetails" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/memory" @@ -73,7 +75,7 @@ type IndexLookUpJoin struct { requiredRows int64 - indexRanges []*ranger.Range + indexRanges ranger.MutableRanges keyOff2IdxOff []int innerPtrBytes [][]byte @@ -82,14 +84,17 @@ type IndexLookUpJoin struct { memTracker *memory.Tracker // track memory usage. - stats *indexLookUpJoinRuntimeStats + stats *indexLookUpJoinRuntimeStats + ctxCancelReason atomic.Value + finished *atomic.Value } type outerCtx struct { - rowTypes []*types.FieldType - keyCols []int - hashCols []int - filter expression.CNFExprs + rowTypes []*types.FieldType + keyCols []int + hashTypes []*types.FieldType + hashCols []int + filter expression.CNFExprs } type innerCtx struct { @@ -97,7 +102,10 @@ type innerCtx struct { rowTypes []*types.FieldType keyCols []int keyColIDs []int64 // the original ID in its table, used by dynamic partition pruning + keyCollators []collate.Collator + hashTypes []*types.FieldType hashCols []int + hashCollators []collate.Collator colLens []int hasPrefixCol bool } @@ -143,11 +151,13 @@ type innerWorker struct { outerCtx outerCtx ctx sessionctx.Context executorChk *chunk.Chunk + lookup *IndexLookUpJoin indexRanges []*ranger.Range nextColCompareFilters *plannercore.ColWithCmpFuncManager keyOff2IdxOff []int stats *innerWorkerRuntimeStats + memTracker *memory.Tracker } // Open implements the Executor interface. @@ -159,10 +169,12 @@ func (e *IndexLookUpJoin) Open(ctx context.Context) error { e.memTracker = memory.NewTracker(e.id, -1) e.memTracker.AttachTo(e.ctx.GetSessionVars().StmtCtx.MemTracker) e.innerPtrBytes = make([][]byte, 0, 8) + e.finished.Store(false) if e.runtimeStats != nil { e.stats = &indexLookUpJoinRuntimeStats{} e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, e.stats) } + e.cancelFunc = nil e.startWorkers(ctx) return nil } @@ -202,8 +214,8 @@ func (e *IndexLookUpJoin) newOuterWorker(resultCh, innerCh chan *lookUpJoinTask) func (e *IndexLookUpJoin) newInnerWorker(taskCh chan *lookUpJoinTask) *innerWorker { // Since multiple inner workers run concurrently, we should copy join's indexRanges for every worker to avoid data race. - copiedRanges := make([]*ranger.Range, 0, len(e.indexRanges)) - for _, ran := range e.indexRanges { + copiedRanges := make([]*ranger.Range, 0, len(e.indexRanges.Range())) + for _, ran := range e.indexRanges.Range() { copiedRanges = append(copiedRanges, ran.Clone()) } @@ -220,6 +232,16 @@ func (e *IndexLookUpJoin) newInnerWorker(taskCh chan *lookUpJoinTask) *innerWork indexRanges: copiedRanges, keyOff2IdxOff: e.keyOff2IdxOff, stats: innerStats, + lookup: e, + memTracker: memory.NewTracker(memory.LabelForIndexJoinInnerWorker, -1), + } + iw.memTracker.AttachTo(e.memTracker) + if len(copiedRanges) != 0 { + // We should not consume this memory usage in `iw.memTracker`. The + // memory usage of inner worker will be reset the end of iw.handleTask. + // While the life cycle of this memory consumption exists throughout the + // whole active period of inner worker. + e.ctx.GetSessionVars().StmtCtx.MemTracker.Consume(2 * types.EstimatedMemUsage(copiedRanges[0].LowVal, len(copiedRanges))) } if e.lastColHelper != nil { // nextCwf.TmpConstant needs to be reset for every individual @@ -296,6 +318,9 @@ func (e *IndexLookUpJoin) getFinishedTask(ctx context.Context) (*lookUpJoinTask, select { case task = <-e.resultCh: case <-ctx.Done(): + if err := e.ctxCancelReason.Load(); err != nil { + return nil, err.(error) + } return nil, ctx.Err() } if task == nil { @@ -308,6 +333,9 @@ func (e *IndexLookUpJoin) getFinishedTask(ctx context.Context) (*lookUpJoinTask, return nil, err } case <-ctx.Done(): + if err := e.ctxCancelReason.Load(); err != nil { + return nil, err.(error) + } return nil, ctx.Err() } @@ -331,19 +359,24 @@ func (ow *outerWorker) run(ctx context.Context, wg *sync.WaitGroup) { defer trace.StartRegion(ctx, "IndexLookupJoinOuterWorker").End() defer func() { if r := recover(); r != nil { + ow.lookup.finished.Store(true) buf := make([]byte, 4096) stackSize := runtime.Stack(buf, false) buf = buf[:stackSize] logutil.Logger(ctx).Error("outerWorker panicked", zap.String("stack", string(buf))) task := &lookUpJoinTask{doneCh: make(chan error, 1)} - task.doneCh <- errors.Errorf("%v", r) + err := errors.Errorf("%v", r) + task.doneCh <- err ow.pushToChan(ctx, task, ow.resultCh) + ow.lookup.ctxCancelReason.Store(err) + ow.lookup.cancelFunc() } close(ow.resultCh) close(ow.innerCh) wg.Done() }() for { + failpoint.Inject("TestIssue30211", nil) task, err := ow.buildTask(ctx) if err != nil { task.doneCh <- err @@ -448,12 +481,16 @@ func (iw *innerWorker) run(ctx context.Context, wg *sync.WaitGroup) { var task *lookUpJoinTask defer func() { if r := recover(); r != nil { + iw.lookup.finished.Store(true) buf := make([]byte, 4096) stackSize := runtime.Stack(buf, false) buf = buf[:stackSize] logutil.Logger(ctx).Error("innerWorker panicked", zap.String("stack", string(buf))) + err := errors.Errorf("%v", r) // "task != nil" is guaranteed when panic happened. - task.doneCh <- errors.Errorf("%v", r) + task.doneCh <- err + iw.lookup.ctxCancelReason.Store(err) + iw.lookup.cancelFunc() } wg.Done() }() @@ -487,6 +524,9 @@ func (iw *innerWorker) handleTask(ctx context.Context, task *lookUpJoinTask) err atomic.AddInt64(&iw.stats.totalTime, int64(time.Since(start))) }() } + defer func() { + iw.memTracker.Consume(-iw.memTracker.BytesConsumed()) + }() lookUpContents, err := iw.constructLookupContent(task) if err != nil { return err @@ -525,8 +565,11 @@ func (iw *innerWorker) constructLookupContent(task *lookUpJoinTask) ([]*indexJoi } return nil, err } + if rowIdx == 0 { + iw.lookup.memTracker.Consume(types.EstimatedMemUsage(dLookUpKey, numRows)) + } if dHashKey == nil { - // Append null to make looUpKeys the same length as outer Result. + // Append null to make lookUpKeys the same length as outer Result. task.encodedLookUpKeys[chkIdx].AppendNull(0) continue } @@ -590,7 +633,7 @@ func (iw *innerWorker) constructDatumLookupKey(task *lookUpJoinTask, chkIdx, row } return nil, nil, err } - cmp, err := outerValue.CompareDatum(sc, &innerValue) + cmp, err := outerValue.Compare(sc, &innerValue, iw.hashCollators[i]) if err != nil { return nil, nil, err } @@ -612,7 +655,7 @@ func (iw *innerWorker) sortAndDedupLookUpContents(lookUpContents []*indexJoinLoo } sc := iw.ctx.GetSessionVars().StmtCtx sort.Slice(lookUpContents, func(i, j int) bool { - cmp := compareRow(sc, lookUpContents[i].keys, lookUpContents[j].keys) + cmp := compareRow(sc, lookUpContents[i].keys, lookUpContents[j].keys, iw.keyCollators) if cmp != 0 || iw.nextColCompareFilters == nil { return cmp < 0 } @@ -620,7 +663,7 @@ func (iw *innerWorker) sortAndDedupLookUpContents(lookUpContents []*indexJoinLoo }) deDupedLookupKeys := lookUpContents[:1] for i := 1; i < len(lookUpContents); i++ { - cmp := compareRow(sc, lookUpContents[i].keys, lookUpContents[i-1].keys) + cmp := compareRow(sc, lookUpContents[i].keys, lookUpContents[i-1].keys, iw.keyCollators) if cmp != 0 || (iw.nextColCompareFilters != nil && iw.nextColCompareFilters.CompareRow(lookUpContents[i].row, lookUpContents[i-1].row) != 0) { deDupedLookupKeys = append(deDupedLookupKeys, lookUpContents[i]) } @@ -628,9 +671,9 @@ func (iw *innerWorker) sortAndDedupLookUpContents(lookUpContents []*indexJoinLoo return deDupedLookupKeys } -func compareRow(sc *stmtctx.StatementContext, left, right []types.Datum) int { +func compareRow(sc *stmtctx.StatementContext, left, right []types.Datum, ctors []collate.Collator) int { for idx := 0; idx < len(left); idx++ { - cmp, err := left[idx].CompareDatum(sc, &right[idx]) + cmp, err := left[idx].Compare(sc, &right[idx], ctors[idx]) // We only compare rows with the same type, no error to return. terror.Log(err) if cmp > 0 { @@ -649,7 +692,7 @@ func (iw *innerWorker) fetchInnerResults(ctx context.Context, task *lookUpJoinTa atomic.AddInt64(&iw.stats.fetch, int64(time.Since(start))) }() } - innerExec, err := iw.readerBuilder.buildExecutorForIndexJoin(ctx, lookUpContent, iw.indexRanges, iw.keyOff2IdxOff, iw.nextColCompareFilters, true) + innerExec, err := iw.readerBuilder.buildExecutorForIndexJoin(ctx, lookUpContent, iw.indexRanges, iw.keyOff2IdxOff, iw.nextColCompareFilters, true, iw.memTracker, iw.lookup.finished) if innerExec != nil { defer terror.Call(innerExec.Close) } @@ -663,6 +706,9 @@ func (iw *innerWorker) fetchInnerResults(ctx context.Context, task *lookUpJoinTa for { select { case <-ctx.Done(): + if err := iw.lookup.ctxCancelReason.Load(); err != nil { + return err.(error) + } return ctx.Err() default: } @@ -731,6 +777,7 @@ func (e *IndexLookUpJoin) Close() error { e.workerWg.Wait() e.memTracker = nil e.task = nil + e.finished.Store(false) return e.baseExecutor.Close() } diff --git a/executor/index_lookup_join_test.go b/executor/index_lookup_join_test.go index 335b67843fb2c..262190dd1ac81 100644 --- a/executor/index_lookup_join_test.go +++ b/executor/index_lookup_join_test.go @@ -19,54 +19,65 @@ import ( "fmt" "math/rand" "strings" + "testing" - . "github.com/pingcap/check" + "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/util/israce" - "github.com/pingcap/tidb/util/testkit" + "github.com/stretchr/testify/require" ) -func (s *testSuite1) TestIndexLookupJoinHang(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestIndexLookupJoinHang(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec("create table idxJoinOuter (a int unsigned)") tk.MustExec("create table idxJoinInner (a int unsigned unique)") tk.MustExec("insert idxJoinOuter values (1), (1), (1), (1), (1)") tk.MustExec("insert idxJoinInner values (1)") - tk.Se.GetSessionVars().IndexJoinBatchSize = 1 - tk.Se.GetSessionVars().SetIndexLookupJoinConcurrency(1) + tk.Session().GetSessionVars().IndexJoinBatchSize = 1 + tk.Session().GetSessionVars().SetIndexLookupJoinConcurrency(1) rs, err := tk.Exec("select /*+ INL_JOIN(i)*/ * from idxJoinOuter o left join idxJoinInner i on o.a = i.a where o.a in (1, 2) and (i.a - 3) > 0") - c.Assert(err, IsNil) - req := rs.NewChunk() + require.NoError(t, err) + req := rs.NewChunk(nil) for i := 0; i < 5; i++ { // FIXME: cannot check err, since err exists, Panic: [tikv:1690]BIGINT UNSIGNED value is out of range in '(Column#0 - 3)' _ = rs.Next(context.Background(), req) } err = rs.Close() - c.Assert(err, IsNil) + require.NoError(t, err) rs, err = tk.Exec("select /*+ INL_HASH_JOIN(i)*/ * from idxJoinOuter o left join idxJoinInner i on o.a = i.a where o.a in (1, 2) and (i.a - 3) > 0") - c.Assert(err, IsNil) - req = rs.NewChunk() + require.NoError(t, err) + req = rs.NewChunk(nil) for i := 0; i < 5; i++ { // to fix: cannot check err, since err exists, Panic: [tikv:1690]BIGINT UNSIGNED value is out of range in '(Column#0 - 3)' _ = rs.Next(context.Background(), req) } err = rs.Close() - c.Assert(err, IsNil) + require.NoError(t, err) rs, err = tk.Exec("select /*+ INL_MERGE_JOIN(i)*/ * from idxJoinOuter o left join idxJoinInner i on o.a = i.a where o.a in (1, 2) and (i.a - 3) > 0") - c.Assert(err, IsNil) - req = rs.NewChunk() + require.NoError(t, err) + req = rs.NewChunk(nil) for i := 0; i < 5; i++ { // to fix: cannot check err, since err exists, Panic: [tikv:1690]BIGINT UNSIGNED value is out of range in '(Column#0 - 3)' _ = rs.Next(context.Background(), req) } err = rs.Close() - c.Assert(err, IsNil) + require.NoError(t, err) } -func (s *testSuite1) TestIndexJoinUnionScan(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestIndexJoinUnionScan(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1") + tk.MustExec("drop table if exists t2") tk.MustExec("create table t1(id int primary key, a int)") tk.MustExec("create table t2(id int primary key, a int, b int, key idx_a(a))") tk.MustExec("insert into t2 values (1,1,1),(4,2,4)") @@ -113,8 +124,14 @@ func (s *testSuite1) TestIndexJoinUnionScan(c *C) { tk.MustExec("rollback") } -func (s *testSuite1) TestBatchIndexJoinUnionScan(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestBatchIndexJoinUnionScanTest(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1;") + tk.MustExec("drop table if exists t2;") 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_init_chunk_size=1") @@ -129,8 +146,12 @@ func (s *testSuite1) TestBatchIndexJoinUnionScan(c *C) { tk.MustExec("rollback") } -func (s *testSuite1) TestInapplicableIndexJoinHint(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestInapplicableIndexJoinHint(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") 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);`) @@ -168,8 +189,12 @@ func (s *testSuite1) TestInapplicableIndexJoinHint(c *C) { tk.MustQuery(`show warnings;`).Check(testkit.Rows(`Warning 1815 Optimizer Hint /*+ INL_MERGE_JOIN(t2) */ is inapplicable`)) } -func (s *testSuite) TestIndexJoinOverflow(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestIndexJoinOverflow(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec(`drop table if exists t1, t2`) tk.MustExec(`create table t1(a int)`) tk.MustExec(`insert into t1 values (-1)`) @@ -179,8 +204,12 @@ func (s *testSuite) TestIndexJoinOverflow(c *C) { tk.MustQuery(`select /*+ INL_MERGE_JOIN(t2) */ * from t1 join t2 on t1.a = t2.a;`).Check(testkit.Rows()) } -func (s *testSuite5) TestIssue11061(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestIssue11061(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec("drop table if exists t1, t2") tk.MustExec("create table t1(c varchar(30), index ix_c(c(10)))") tk.MustExec("insert into t1 (c) values('7_chars'), ('13_characters')") @@ -189,8 +218,12 @@ func (s *testSuite5) TestIssue11061(c *C) { tk.MustQuery("SELECT /*+ INL_MERGE_JOIN(t1) */ SUM(LENGTH(c)) FROM t1 WHERE c IN (SELECT t1.c FROM t1)").Check(testkit.Rows("20")) } -func (s *testSuite5) TestIndexJoinPartitionTable(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestIndexJoinPartitionTable(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int, b int not null, c int, key idx(c)) partition by hash(b) partitions 30") tk.MustExec("insert into t values(1, 27, 2)") @@ -199,8 +232,11 @@ func (s *testSuite5) TestIndexJoinPartitionTable(c *C) { tk.MustQuery("SELECT /*+ INL_MERGE_JOIN(t1) */ count(1) FROM t t1 INNER JOIN (SELECT a, max(c) AS c FROM t WHERE b = 27 AND a = 1 GROUP BY a) t2 ON t1.a = t2.a AND t1.c = t2.c WHERE t1.b = 27").Check(testkit.Rows("1")) } -func (s *testSuite5) TestIndexJoinMultiCondition(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIndexJoinMultiCondition(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t1, t2") tk.MustExec("create table t1(a int not null, b int not null, key idx_a_b(a,b))") @@ -210,8 +246,11 @@ func (s *testSuite5) TestIndexJoinMultiCondition(c *C) { tk.MustQuery("select /*+ TIDB_INLJ(t1) */ count(*) from t1, t2 where t1.a = t2.a and t1.b < t2.b").Check(testkit.Rows("3")) } -func (s *testSuite5) TestIssue16887(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue16887(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists admin_roles, admin_role_has_permissions") tk.MustExec("CREATE TABLE `admin_role_has_permissions` (`permission_id` bigint(20) unsigned NOT NULL, `role_id` bigint(20) unsigned NOT NULL, PRIMARY KEY (`permission_id`,`role_id`), KEY `admin_role_has_permissions_role_id_foreign` (`role_id`))") @@ -219,13 +258,16 @@ func (s *testSuite5) TestIssue16887(c *C) { tk.MustExec("INSERT INTO `admin_roles` (`id`, `name`, `created_at`, `updated_at`) VALUES(1, 'admin','2020-04-27 02:40:03', '2020-04-27 02:40:03'),(2, 'developer','2020-04-27 02:40:03', '2020-04-27 02:40:03'),(3, 'analyst','2020-04-27 02:40:03', '2020-04-27 02:40:03'),(4, 'channel_admin','2020-04-27 02:40:03', '2020-04-27 02:40:03'),(5, 'test','2020-04-27 02:40:08', '2020-04-27 02:40:08')") tk.MustExec("INSERT INTO `admin_role_has_permissions` (`permission_id`, `role_id`) VALUES(1, 1),(2, 1),(3, 1),(4, 1),(5, 1),(6, 1),(7, 1),(8, 1),(9, 1),(10, 1),(11, 1),(12, 1),(13, 1),(14, 1),(15, 1),(16, 1),(17, 1),(18, 1),(19, 1),(20, 1),(21, 1),(22, 1),(23, 1),(24, 1),(25, 1),(26, 1),(27, 1),(28, 1),(29, 1),(30, 1),(31, 1),(32, 1),(33, 1),(34, 1),(35, 1),(36, 1),(37, 1),(38, 1),(39, 1),(40, 1),(41, 1),(42, 1),(43, 1),(44, 1),(45, 1),(46, 1),(47, 1),(48, 1),(49, 1),(50, 1),(51, 1),(52, 1),(53, 1),(54, 1),(55, 1),(56, 1),(57, 1),(58, 1),(59, 1),(60, 1),(61, 1),(62, 1),(63, 1),(64, 1),(65, 1),(66, 1),(67, 1),(68, 1),(69, 1),(70, 1),(71, 1),(72, 1),(73, 1),(74, 1),(75, 1),(76, 1),(77, 1),(78, 1),(79, 1),(80, 1),(81, 1),(82, 1),(83, 1),(5, 4),(6, 4),(7, 4),(84, 5),(85, 5),(86, 5)") rows := tk.MustQuery("SELECT /*+ inl_merge_join(admin_role_has_permissions) */ `admin_roles`.* FROM `admin_roles` INNER JOIN `admin_role_has_permissions` ON `admin_roles`.`id` = `admin_role_has_permissions`.`role_id` WHERE `admin_role_has_permissions`.`permission_id`\n IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67)").Rows() - c.Assert(len(rows), Equals, 70) + require.Len(t, rows, 70) rows = tk.MustQuery("show warnings").Rows() - c.Assert(len(rows) > 0, Equals, true) + require.Less(t, 0, len(rows)) } -func (s *testSuite5) TestIndexJoinEnumSetIssue19233(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIndexJoinEnumSetIssue19233(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t;") tk.MustExec("drop table if exists i;") @@ -253,18 +295,21 @@ func (s *testSuite5) TestIndexJoinEnumSetIssue19233(c *C) { for _, hint := range []string{"INL_HASH_JOIN", "INL_JOIN"} { sql := fmt.Sprintf(`select /*+ %s(%s) */ * from i, %s where i.objectType = %s.type;`, hint, table, table, table) rows := tk.MustQuery(sql).Rows() - c.Assert(len(rows), Equals, 64) + require.Len(t, rows, 64) for i := 0; i < len(rows); i++ { - c.Assert(fmt.Sprint(rows[i][0]), Equals, "HOST_PORT") + require.Equal(t, "HOST_PORT", rows[i][0]) } rows = tk.MustQuery("show warnings").Rows() - c.Assert(len(rows), Equals, 0) + require.Len(t, rows, 0) } } } -func (s *testSuite5) TestIssue19411(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue19411(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("create table t1 (c_int int, primary key (c_int))") tk.MustExec("create table t2 (c_int int, primary key (c_int)) partition by hash (c_int) partitions 4") @@ -279,8 +324,11 @@ func (s *testSuite5) TestIssue19411(c *C) { tk.MustExec("commit") } -func (s *testSuite5) TestIssue23653(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue23653(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t1, t2") tk.MustExec("create table t1 (c_int int, c_str varchar(40), primary key(c_str), unique key(c_int), unique key(c_str))") @@ -291,8 +339,11 @@ func (s *testSuite5) TestIssue23653(c *C) { "2 reverent keller 2 reverent keller")) } -func (s *testSuite5) TestIssue23656(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue23656(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t1, t2") tk.MustExec("create table t1 (c_int int, c_str varchar(40), primary key(c_int, c_str(4)))") @@ -304,8 +355,11 @@ func (s *testSuite5) TestIssue23656(c *C) { "2 blissful aryabhata 2 blissful aryabhata")) } -func (s *testSuite5) TestIssue23722(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue23722(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t;") tk.MustExec("create table t (a int, b char(10), c blob, primary key (c(5)) clustered);") @@ -337,8 +391,11 @@ func (s *testSuite5) TestIssue23722(c *C) { "order by col_15 , col_16 , col_17 , col_18 , col_19;").Check(testkit.Rows("38799.400 20301 KETeFZhkoxnwMAhA Charlie zyhXEppZdqyqNV")) } -func (s *testSuite5) TestIssue24547(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue24547(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists a") tk.MustExec("drop table if exists b") @@ -349,8 +406,59 @@ func (s *testSuite5) TestIssue24547(c *C) { tk.MustExec("delete a from a inner join b on a.k1 = b.k1 and a.k2 = b.k2 where b.k2 <> '333'") } -func (s *testSuite5) TestIssue27893(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue27138(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1,t2") + + tk.MustExec("set @old_tidb_partition_prune_mode=@@tidb_partition_prune_mode") + tk.MustExec("set @@tidb_partition_prune_mode=dynamic") + defer tk.MustExec("set @@tidb_partition_prune_mode=@old_tidb_partition_prune_mode") + + tk.MustExec(`CREATE TABLE t1 ( + id int(10) unsigned NOT NULL, + pc int(10) unsigned NOT NULL, + PRIMARY KEY (id,pc) /*T![clustered_index] CLUSTERED */ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci +PARTITION BY HASH( pc ) +PARTITIONS 1`) + defer tk.MustExec("drop table t1") + + // Order of columns is also important to reproduce the bug! + tk.MustExec(`CREATE TABLE t2 ( + prefiller bigint(20) NOT NULL, + pk tinyint(3) unsigned NOT NULL, + postfiller bigint(20) NOT NULL, + PRIMARY KEY (pk) /*T![clustered_index] CLUSTERED */ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin `) + defer tk.MustExec("drop table t2") + + // Why does the t2.prefiller need be at least 2^32 ? If smaller the bug will not appear!?! + tk.MustExec("insert into t2 values ( pow(2,32), 1, 1), ( pow(2,32)+1, 2, 0)") + + // Why must it be = 1 and not 2? + tk.MustQuery("explain select /* +INL_JOIN(t1,t2) */ t1.id, t1.pc from t1 where id in ( select prefiller from t2 where t2.postfiller = 1 )").Check(testkit.Rows("" + + "IndexJoin_15 10.00 root inner join, inner:TableReader_14, outer key:test.t2.prefiller, inner key:test.t1.id, equal cond:eq(test.t2.prefiller, test.t1.id)]\n" + + "[├─HashAgg_25(Build) 8.00 root group by:test.t2.prefiller, funcs:firstrow(test.t2.prefiller)->test.t2.prefiller]\n" + + "[│ └─TableReader_26 8.00 root data:HashAgg_20]\n" + + "[│ └─HashAgg_20 8.00 cop[tikv] group by:test.t2.prefiller, ]\n" + + "[│ └─Selection_24 10.00 cop[tikv] eq(test.t2.postfiller, 1)]\n" + + "[│ └─TableFullScan_23 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo]\n" + + "[└─TableReader_14(Probe) 1.00 root partition:all data:TableRangeScan_13]\n" + + "[ └─TableRangeScan_13 1.00 cop[tikv] table:t1 range: decided by [test.t2.prefiller], keep order:false, stats:pseudo")) + tk.MustQuery("show warnings").Check(testkit.Rows()) + // without fix it fails with: "runtime error: index out of range [0] with length 0" + tk.MustQuery("select /* +INL_JOIN(t1,t2) */ t1.id, t1.pc from t1 where id in ( select prefiller from t2 where t2.postfiller = 1 )").Check(testkit.Rows()) +} + +func TestIssue27893(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t1") tk.MustExec("drop table if exists t2") @@ -362,11 +470,14 @@ func (s *testSuite5) TestIssue27893(c *C) { tk.MustQuery("select /*+ inl_hash_join(t2) */ count(*) from t1 join t2 on t1.a = t2.a").Check(testkit.Rows("1")) } -func (s *testSuite5) TestPartitionTableIndexJoinAndIndexReader(c *C) { +func TestPartitionTableIndexJoinAndIndexReader(t *testing.T) { if israce.RaceEnabled { - c.Skip("exhaustive types test, skip race test") + t.Skip("exhaustive types test, skip race test") } - tk := testkit.NewTestKit(c, s.store) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("set @@tidb_partition_prune_mode='dynamic'") tk.MustExec(`create table t (a int, b int, key(a)) partition by hash(a) partitions 4`) diff --git a/executor/index_lookup_merge_join.go b/executor/index_lookup_merge_join.go index 75d61b1cb3a51..7e4ac6a515ae9 100644 --- a/executor/index_lookup_merge_join.go +++ b/executor/index_lookup_merge_join.go @@ -32,6 +32,7 @@ import ( "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/execdetails" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/memory" @@ -65,7 +66,7 @@ type IndexLookUpMergeJoin struct { task *lookUpMergeJoinTask - indexRanges []*ranger.Range + indexRanges ranger.MutableRanges keyOff2IdxOff []int // lastColHelper store the information for last col if there's complicated filter like col > x_col and col < x_col + 100. @@ -88,6 +89,7 @@ type innerMergeCtx struct { rowTypes []*types.FieldType joinKeys []*expression.Column keyCols []int + keyCollators []collate.Collator compareFuncs []expression.CompareFunc colLens []int desc bool @@ -237,8 +239,8 @@ func (e *IndexLookUpMergeJoin) newOuterWorker(resultCh, innerCh chan *lookUpMerg func (e *IndexLookUpMergeJoin) newInnerMergeWorker(taskCh chan *lookUpMergeJoinTask, workID int) *innerMergeWorker { // Since multiple inner workers run concurrently, we should copy join's indexRanges for every worker to avoid data race. - copiedRanges := make([]*ranger.Range, 0, len(e.indexRanges)) - for _, ran := range e.indexRanges { + copiedRanges := make([]*ranger.Range, 0, len(e.indexRanges.Range())) + for _, ran := range e.indexRanges.Range() { copiedRanges = append(copiedRanges, ran.Clone()) } imw := &innerMergeWorker{ @@ -502,7 +504,7 @@ func (imw *innerMergeWorker) handleTask(ctx context.Context, task *lookUpMergeJo dLookUpKeys[i], dLookUpKeys[lenKeys-i-1] = dLookUpKeys[lenKeys-i-1], dLookUpKeys[i] } } - imw.innerExec, err = imw.readerBuilder.buildExecutorForIndexJoin(ctx, dLookUpKeys, imw.indexRanges, imw.keyOff2IdxOff, imw.nextColCompareFilters, false) + imw.innerExec, err = imw.readerBuilder.buildExecutorForIndexJoin(ctx, dLookUpKeys, imw.indexRanges, imw.keyOff2IdxOff, imw.nextColCompareFilters, false, nil, nil) if imw.innerExec != nil { defer terror.Call(imw.innerExec.Close) } @@ -697,7 +699,7 @@ func (imw *innerMergeWorker) constructDatumLookupKey(task *lookUpMergeJoinTask, } return nil, err } - cmp, err := outerValue.CompareDatum(sc, &innerValue) + cmp, err := outerValue.Compare(sc, &innerValue, imw.keyCollators[i]) if err != nil { return nil, err } @@ -717,7 +719,7 @@ func (imw *innerMergeWorker) dedupDatumLookUpKeys(lookUpContents []*indexJoinLoo sc := imw.ctx.GetSessionVars().StmtCtx deDupedLookUpContents := lookUpContents[:1] for i := 1; i < len(lookUpContents); i++ { - cmp := compareRow(sc, lookUpContents[i].keys, lookUpContents[i-1].keys) + cmp := compareRow(sc, lookUpContents[i].keys, lookUpContents[i-1].keys, imw.keyCollators) if cmp != 0 || (imw.nextColCompareFilters != nil && imw.nextColCompareFilters.CompareRow(lookUpContents[i].row, lookUpContents[i-1].row) != 0) { deDupedLookUpContents = append(deDupedLookUpContents, lookUpContents[i]) } diff --git a/executor/index_merge_reader.go b/executor/index_merge_reader.go index 60828bd514ac4..cd27a5049b8b5 100644 --- a/executor/index_merge_reader.go +++ b/executor/index_merge_reader.go @@ -133,6 +133,8 @@ func (e *IndexMergeReaderExecutor) Open(ctx context.Context) (err error) { } e.finished = make(chan struct{}) e.resultCh = make(chan *lookupTableTask, atomic.LoadInt32(&LookupTableTaskChannelSize)) + e.memTracker = memory.NewTracker(e.id, -1) + e.memTracker.AttachTo(e.ctx.GetSessionVars().StmtCtx.MemTracker) return nil } @@ -520,7 +522,7 @@ func (e *IndexMergeReaderExecutor) startIndexMergeTableScanWorker(ctx context.Co finished: e.finished, indexMergeExec: e, tblPlans: e.tblPlans, - memTracker: memory.NewTracker(memory.LabelForSimpleTask, -1), + memTracker: e.memTracker, } ctx1, cancel := context.WithCancel(ctx) go func() { diff --git a/executor/index_merge_reader_test.go b/executor/index_merge_reader_test.go index 51620b861a94a..7fc2ac15e9473 100644 --- a/executor/index_merge_reader_test.go +++ b/executor/index_merge_reader_test.go @@ -17,6 +17,8 @@ package executor_test import ( "fmt" "math/rand" + "regexp" + "strconv" "strings" . "github.com/pingcap/check" @@ -170,3 +172,157 @@ func (s *testSuite1) TestPartitionTableRandomIndexMerge(c *C) { tk.MustQuery("select /*+ USE_INDEX_MERGE(tpk, a, b) */ * from tpk where " + cond).Sort().Check(result) } } + +func (s *testSuite1) TestIndexMergeInTransaction(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + + for i := 0; i < 2; i++ { + tk.MustExec("drop table if exists t1;") + tk.MustExec("create table t1(c1 int, c2 int, c3 int, pk int, key(c1), key(c2), key(c3), primary key(pk));") + if i == 1 { + tk.MustExec("set tx_isolation = 'READ-COMMITTED';") + } + tk.MustExec("begin;") + // Expect two IndexScan(c1, c2). + tk.MustQuery("explain select /*+ use_index_merge(t1) */ * from t1 where (c1 < 10 or c2 < 10) and c3 < 10;").Check(testkit.Rows( + "IndexMerge_9 1841.86 root ", + "├─IndexRangeScan_5(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo", + "├─IndexRangeScan_6(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo", + "└─Selection_8(Probe) 1841.86 cop[tikv] lt(test.t1.c3, 10)", + " └─TableRowIDScan_7 5542.21 cop[tikv] table:t1 keep order:false, stats:pseudo")) + // Expect one IndexScan(c2) and one TableScan(pk). + tk.MustQuery("explain select /*+ use_index_merge(t1) */ * from t1 where (pk < 10 or c2 < 10) and c3 < 10;").Check(testkit.Rows( + "IndexMerge_9 1106.67 root ", + "├─TableRangeScan_5(Build) 3333.33 cop[tikv] table:t1 range:[-inf,10), keep order:false, stats:pseudo", + "├─IndexRangeScan_6(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo", + "└─Selection_8(Probe) 1106.67 cop[tikv] lt(test.t1.c3, 10)", + " └─TableRowIDScan_7 3330.01 cop[tikv] table:t1 keep order:false, stats:pseudo")) + + // Test with normal key. + tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (c1 < 10 or c2 < 10) and c3 < 10;").Check(testkit.Rows()) + tk.MustExec("insert into t1 values(1, 1, 1, 1);") + tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (c1 < 10 or c2 < 10) and c3 < 10;").Check(testkit.Rows("1 1 1 1")) + tk.MustExec("update t1 set c3 = 100 where c3 = 1;") + tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (c1 < 10 or c2 < 10) and c3 < 10;").Check(testkit.Rows()) + tk.MustExec("delete from t1;") + tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (c1 < 10 or c2 < 10) and c3 < 10;").Check(testkit.Rows()) + + // Test with primary key, so the partialPlan is TableScan. + tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (pk < 10 or c2 < 10) and c3 < 10;").Check(testkit.Rows()) + tk.MustExec("insert into t1 values(1, 1, 1, 1);") + tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (pk < 10 or c2 < 10) and c3 < 10;").Check(testkit.Rows("1 1 1 1")) + tk.MustExec("update t1 set c3 = 100 where c3 = 1;") + tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (pk < 10 or c2 < 10) and c3 < 10;").Check(testkit.Rows()) + tk.MustExec("delete from t1;") + tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (pk < 10 or c2 < 10) and c3 < 10;").Check(testkit.Rows()) + tk.MustExec("commit;") + if i == 1 { + tk.MustExec("set tx_isolation = 'REPEATABLE-READ';") + } + } + + // Same with above, but select ... for update. + tk.MustExec("drop table if exists t1;") + tk.MustExec("create table t1(c1 int, c2 int, c3 int, pk int, key(c1), key(c2), key(c3), primary key(pk));") + tk.MustExec("begin;") + tk.MustQuery("explain select /*+ use_index_merge(t1) */ * from t1 where (c1 < 10 or c2 < 10) and c3 < 10 for update;").Check(testkit.Rows( + "SelectLock_6 1841.86 root for update 0", + "└─IndexMerge_11 1841.86 root ", + " ├─IndexRangeScan_7(Build) 3323.33 cop[tikv] table:t1, index:c1(c1) range:[-inf,10), keep order:false, stats:pseudo", + " ├─IndexRangeScan_8(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo", + " └─Selection_10(Probe) 1841.86 cop[tikv] lt(test.t1.c3, 10)", + " └─TableRowIDScan_9 5542.21 cop[tikv] table:t1 keep order:false, stats:pseudo")) + tk.MustQuery("explain select /*+ use_index_merge(t1) */ * from t1 where (pk < 10 or c2 < 10) and c3 < 10 for update;").Check(testkit.Rows( + "SelectLock_6 1106.67 root for update 0", + "└─IndexMerge_11 1106.67 root ", + " ├─TableRangeScan_7(Build) 3333.33 cop[tikv] table:t1 range:[-inf,10), keep order:false, stats:pseudo", + " ├─IndexRangeScan_8(Build) 3323.33 cop[tikv] table:t1, index:c2(c2) range:[-inf,10), keep order:false, stats:pseudo", + " └─Selection_10(Probe) 1106.67 cop[tikv] lt(test.t1.c3, 10)", + " └─TableRowIDScan_9 3330.01 cop[tikv] table:t1 keep order:false, stats:pseudo")) + + // Test with normal key. + tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (c1 < 10 or c2 < 10) and c3 < 10 for update;").Check(testkit.Rows()) + tk.MustExec("insert into t1 values(1, 1, 1, 1);") + tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (c1 < 10 or c2 < 10) and c3 < 10 for update;").Check(testkit.Rows("1 1 1 1")) + tk.MustExec("update t1 set c3 = 100 where c3 = 1;") + tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (c1 < 10 or c2 < 10) and c3 < 10 for update;").Check(testkit.Rows()) + tk.MustExec("delete from t1;") + tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (c1 < 10 or c2 < 10) and c3 < 10 for update;").Check(testkit.Rows()) + + // Test with primary key, so the partialPlan is TableScan. + tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (pk < 10 or c2 < 10) and c3 < 10 for update;").Check(testkit.Rows()) + tk.MustExec("insert into t1 values(1, 1, 1, 1);") + tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (pk < 10 or c2 < 10) and c3 < 10 for update;").Check(testkit.Rows("1 1 1 1")) + tk.MustExec("update t1 set c3 = 100 where c3 = 1;") + tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (pk < 10 or c2 < 10) and c3 < 10 for update;").Check(testkit.Rows()) + tk.MustExec("delete from t1;") + tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (pk < 10 or c2 < 10) and c3 < 10 for update;").Check(testkit.Rows()) + tk.MustExec("commit;") + + // Test partition table. + tk.MustExec("drop table if exists t1;") + tk.MustExec(`create table t1(c1 int, c2 int, c3 int, pk int, part int, key(c1), key(c2), key(c3), primary key(pk, part)) + partition by range(part) ( + partition p0 values less than (10), + partition p1 values less than (20), + partition p2 values less than (maxvalue))`) + tk.MustExec("begin;") + tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (c1 < 20 or c2 < 20) and c3 < 20;").Check(testkit.Rows()) + + tk.MustExec("insert into t1 values(1, 1, 1, 1, 1);") + tk.MustExec("insert into t1 values(11, 11, 11, 11, 11);") + tk.MustExec("insert into t1 values(21, 21, 21, 21, 21);") + tk.MustExec("insert into t1 values(31, 31, 31, 31, 31);") + res := tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (c1 < 20 or c2 < 20) and c3 < 20;").Sort() + res.Check(testkit.Rows("1 1 1 1 1", "11 11 11 11 11")) + res = tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (pk < 20 or c2 < 20) and c3 < 20;").Sort() + res.Check(testkit.Rows("1 1 1 1 1", "11 11 11 11 11")) + + tk.MustExec("update t1 set c3 = 100 where c3 = 1;") + res = tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (c1 < 20 or c2 < 20) and c3 < 20;") + res.Check(testkit.Rows("11 11 11 11 11")) + res = tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (pk < 20 or c2 < 20) and c3 < 20;") + res.Check(testkit.Rows("11 11 11 11 11")) + + tk.MustExec("delete from t1;") + res = tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (c1 < 20 or c2 < 20) and c3 < 20;") + res.Check(testkit.Rows()) + res = tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where (pk < 20 or c2 < 20) and c3 < 20;") + res.Check(testkit.Rows()) + tk.MustExec("commit;") +} + +func (test *testSerialSuite2) TestIndexMergeReaderMemTracker(c *C) { + tk := testkit.NewTestKit(c, test.store) + tk.MustExec("use test;") + tk.MustExec("create table t1(c1 int, c2 int, c3 int, key(c1), key(c2), key(c3));") + + insertStr := "insert into t1 values(0, 0, 0)" + rowNum := 1000 + for i := 0; i < rowNum; i++ { + insertStr += fmt.Sprintf(" ,(%d, %d, %d)", i, i, i) + } + insertStr += ";" + memTracker := tk.Se.GetSessionVars().StmtCtx.MemTracker + + tk.MustExec(insertStr) + + oriMaxUsage := memTracker.MaxConsumed() + + // We select all rows in t1, so the mem usage is more clear. + tk.MustQuery("select /*+ use_index_merge(t1) */ * from t1 where c1 > 1 or c2 > 1") + + newMaxUsage := memTracker.MaxConsumed() + c.Assert(newMaxUsage, Greater, oriMaxUsage) + + res := tk.MustQuery("explain analyze select /*+ use_index_merge(t1) */ * from t1 where c1 > 1 or c2 > 1") + c.Assert(len(res.Rows()), Equals, 4) + // Parse "xxx KB" and check it's greater than 0. + memStr := res.Rows()[0][7].(string) + re, err := regexp.Compile("[0-9]+ KB") + c.Assert(err, IsNil) + c.Assert(re.MatchString(memStr), IsTrue) + bytes, err := strconv.ParseFloat(memStr[:len(memStr)-3], 32) + c.Assert(err, IsNil) + c.Assert(bytes, Greater, 0.0) +} diff --git a/executor/infoschema_reader.go b/executor/infoschema_reader.go index ea49a66c7fe20..1e4fcae3829ba 100644 --- a/executor/infoschema_reader.go +++ b/executor/infoschema_reader.go @@ -47,6 +47,7 @@ import ( "github.com/pingcap/tidb/parser/terror" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/privilege" + "github.com/pingcap/tidb/privilege/privileges" "github.com/pingcap/tidb/session/txninfo" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" @@ -161,8 +162,8 @@ func (e *memtableRetriever) retrieve(ctx context.Context, sctx sessionctx.Contex infoschema.TableClientErrorsSummaryByUser, infoschema.TableClientErrorsSummaryByHost: err = e.setDataForClientErrorsSummary(sctx, e.table.Name.O) - case infoschema.TableRegionLabel: - err = e.setDataForRegionLabel(sctx) + case infoschema.TableAttributes: + err = e.setDataForAttributes(sctx) case infoschema.TablePlacementRules: err = e.setDataFromPlacementRules(ctx, sctx, dbs) } @@ -353,6 +354,13 @@ func (e *memtableRetriever) setDataFromSchemata(ctx sessionctx.Context, schemas if len(schema.Collate) > 0 { collation = schema.Collate // Overwrite default } + var policyName, directPlacement interface{} + if schema.PlacementPolicyRef != nil { + policyName = schema.PlacementPolicyRef.Name.O + } + if schema.DirectPlacementOpts != nil { + directPlacement = schema.DirectPlacementOpts.String() + } if checker != nil && !checker.RequestVerification(ctx.GetSessionVars().ActiveRoles, schema.Name.L, "", "", mysql.AllPrivMask) { continue @@ -362,7 +370,9 @@ func (e *memtableRetriever) setDataFromSchemata(ctx sessionctx.Context, schemas schema.Name.O, // SCHEMA_NAME charset, // DEFAULT_CHARACTER_SET_NAME collation, // DEFAULT_COLLATION_NAME - nil, + nil, // SQL_PATH + policyName, // TIDB_PLACEMENT_POLICY_NAME + directPlacement, // TIDB_DIRECT_PLACEMENT ) rows = append(rows, record) } @@ -569,7 +579,7 @@ func (e *memtableRetriever) setDataFromTables(ctx context.Context, sctx sessionc rowCount = 1 } } - if table.PKIsHandle || table.IsCommonHandle { + if table.HasClusteredIndex() { pkType = "CLUSTERED" } shardingInfo := infoschema.GetShardingInfo(schema, table) @@ -655,11 +665,21 @@ func (e *hugeMemTableRetriever) setDataForColumns(ctx context.Context, sctx sess for e.tblIdx < len(schema.Tables) { table := schema.Tables[e.tblIdx] e.tblIdx++ - if checker != nil && !checker.RequestVerification(sctx.GetSessionVars().ActiveRoles, schema.Name.L, table.Name.L, "", mysql.AllPrivMask) { - continue + hasPrivs := false + var priv mysql.PrivilegeType + if checker != nil { + for _, p := range mysql.AllColumnPrivs { + if checker.RequestVerification(sctx.GetSessionVars().ActiveRoles, schema.Name.L, table.Name.L, "", p) { + hasPrivs = true + priv |= p + } + } + if !hasPrivs { + continue + } } - e.dataForColumnsInTable(ctx, sctx, schema, table) + e.dataForColumnsInTable(ctx, sctx, schema, table, priv) if len(e.rows) >= batch { return nil } @@ -669,7 +689,7 @@ func (e *hugeMemTableRetriever) setDataForColumns(ctx context.Context, sctx sess return nil } -func (e *hugeMemTableRetriever) dataForColumnsInTable(ctx context.Context, sctx sessionctx.Context, schema *model.DBInfo, tbl *model.TableInfo) { +func (e *hugeMemTableRetriever) dataForColumnsInTable(ctx context.Context, sctx sessionctx.Context, schema *model.DBInfo, tbl *model.TableInfo, priv mysql.PrivilegeType) { if err := tryFillViewColumnType(ctx, sctx, sctx.GetInfoSchema().(infoschema.InfoSchema), schema.Name, tbl); err != nil { sctx.GetSessionVars().StmtCtx.AppendWarning(err) return @@ -750,9 +770,9 @@ func (e *hugeMemTableRetriever) dataForColumnsInTable(ctx context.Context, sctx columnType, // COLUMN_TYPE columnDesc.Key, // COLUMN_KEY columnDesc.Extra, // EXTRA - "select,insert,update,references", // PRIVILEGES - columnDesc.Comment, // COLUMN_COMMENT - col.GeneratedExprString, // GENERATION_EXPRESSION + strings.ToLower(privileges.PrivToString(priv, mysql.AllColumnPrivs, mysql.Priv2Str)), // PRIVILEGES + columnDesc.Comment, // COLUMN_COMMENT + col.GeneratedExprString, // GENERATION_EXPRESSION ) e.rows = append(e.rows, record) } @@ -1433,13 +1453,13 @@ func (e *memtableRetriever) setDataForTiKVRegionStatus(ctx sessionctx.Context) e } allSchemas := ctx.GetInfoSchema().(infoschema.InfoSchema).AllSchemas() tableInfos := tikvHelper.GetRegionsTableInfo(regionsInfo, allSchemas) - for _, region := range regionsInfo.Regions { - tableList := tableInfos[region.ID] + for i := range regionsInfo.Regions { + tableList := tableInfos[regionsInfo.Regions[i].ID] if len(tableList) == 0 { - e.setNewTiKVRegionStatusCol(®ion, nil) + e.setNewTiKVRegionStatusCol(®ionsInfo.Regions[i], nil) } - for _, table := range tableList { - e.setNewTiKVRegionStatusCol(®ion, &table) + for j := range tableList { + e.setNewTiKVRegionStatusCol(®ionsInfo.Regions[i], &tableList[j]) } } return nil @@ -1488,8 +1508,8 @@ func (e *memtableRetriever) setDataForTikVRegionPeers(ctx sessionctx.Context) er if err != nil { return err } - for _, region := range regionsInfo.Regions { - e.setNewTiKVRegionPeersCols(®ion) + for i := range regionsInfo.Regions { + e.setNewTiKVRegionPeersCols(®ionsInfo.Regions[i]) } return nil } @@ -2736,11 +2756,11 @@ func (e *TiFlashSystemTableRetriever) dataForTiFlashSystemTables(ctx sessionctx. return rows, nil } -func (e *memtableRetriever) setDataForRegionLabel(ctx sessionctx.Context) error { +func (e *memtableRetriever) setDataForAttributes(ctx sessionctx.Context) error { checker := privilege.GetPrivilegeManager(ctx) var rows [][]types.Datum rules, err := infosync.GetAllLabelRules(context.TODO()) - failpoint.Inject("mockOutputOfRegionLabel", func() { + failpoint.Inject("mockOutputOfAttributes", func() { convert := func(i interface{}) []interface{} { return []interface{}{i} } @@ -2759,7 +2779,7 @@ func (e *memtableRetriever) setDataForRegionLabel(ctx sessionctx.Context) error }) if err != nil { - return errors.Wrap(err, "get region label failed") + return errors.Wrap(err, "get the label rules failed") } for _, rule := range rules { skip := true diff --git a/executor/infoschema_reader_test.go b/executor/infoschema_reader_test.go index 5ec96107ca9c0..53fd409f0fd2a 100644 --- a/executor/infoschema_reader_test.go +++ b/executor/infoschema_reader_test.go @@ -37,7 +37,7 @@ import ( "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/server" "github.com/pingcap/tidb/session" - txninfo "github.com/pingcap/tidb/session/txninfo" + "github.com/pingcap/tidb/session/txninfo" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/statistics/handle" @@ -161,7 +161,7 @@ func (s *testInfoschemaTableSuite) TestSchemataTables(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustQuery("select * from information_schema.SCHEMATA where schema_name='mysql';").Check( - testkit.Rows("def mysql utf8mb4 utf8mb4_bin <nil>")) + testkit.Rows("def mysql utf8mb4 utf8mb4_bin <nil> <nil> <nil>")) // Test the privilege of new user for information_schema.schemata. tk.MustExec("create user schemata_tester") @@ -175,7 +175,7 @@ func (s *testInfoschemaTableSuite) TestSchemataTables(c *C) { schemataTester.MustQuery("select * from information_schema.SCHEMATA where schema_name='mysql';").Check( [][]interface{}{}) schemataTester.MustQuery("select * from information_schema.SCHEMATA where schema_name='INFORMATION_SCHEMA';").Check( - testkit.Rows("def INFORMATION_SCHEMA utf8mb4 utf8mb4_bin <nil>")) + testkit.Rows("def INFORMATION_SCHEMA utf8mb4 utf8mb4_bin <nil> <nil> <nil>")) // Test the privilege of user with privilege of mysql for information_schema.schemata. tk.MustExec("CREATE ROLE r_mysql_priv;") @@ -184,7 +184,7 @@ func (s *testInfoschemaTableSuite) TestSchemataTables(c *C) { schemataTester.MustExec("set role r_mysql_priv") schemataTester.MustQuery("select count(*) from information_schema.SCHEMATA;").Check(testkit.Rows("2")) schemataTester.MustQuery("select * from information_schema.SCHEMATA;").Check( - testkit.Rows("def INFORMATION_SCHEMA utf8mb4 utf8mb4_bin <nil>", "def mysql utf8mb4 utf8mb4_bin <nil>")) + testkit.Rows("def INFORMATION_SCHEMA utf8mb4 utf8mb4_bin <nil> <nil> <nil>", "def mysql utf8mb4 utf8mb4_bin <nil> <nil> <nil>")) } func (s *testInfoschemaTableSuite) TestTableIDAndIndexID(c *C) { @@ -587,7 +587,7 @@ func (s *testInfoschemaTableSuite) TestForAnalyzeStatus(c *C) { tk.MustExec("create table t1 (a int, b int, index idx(a))") tk.MustExec("insert into t1 values (1,2),(3,4)") tk.MustExec("analyze table t1") - tk.MustQuery("show warnings").Check(testkit.Rows()) // no warning + tk.MustQuery("show warnings").Check(testkit.Rows("Note 1105 Analyze use auto adjusted sample rate 1.000000 for table test.t1.")) // 1 note. c.Assert(s.dom.StatsHandle().LoadNeededHistograms(), IsNil) tk.MustExec("CREATE ROLE r_t1 ;") tk.MustExec("GRANT ALL PRIVILEGES ON test.t1 TO r_t1;") @@ -711,12 +711,13 @@ func (s *testInfoschemaClusterTableSuite) setUpMockPDHTTPServer() (*httptest.Ser }, nil })) // mock PD API - router.Handle(pdapi.ClusterVersion, fn.Wrap(func() (string, error) { return "4.0.0-alpha", nil })) router.Handle(pdapi.Status, fn.Wrap(func() (interface{}, error) { return struct { + Version string `json:"version"` GitHash string `json:"git_hash"` StartTimestamp int64 `json:"start_timestamp"` }{ + Version: "4.0.0-alpha", GitHash: "mock-pd-githash", StartTimestamp: s.startTime.Unix(), }, nil @@ -917,7 +918,7 @@ func (s *testInfoschemaClusterTableSuite) TestTableStorageStats(c *C) { tk.MustQuery("select TABLE_SCHEMA, sum(TABLE_SIZE) from information_schema.TABLE_STORAGE_STATS where TABLE_SCHEMA = 'test' group by TABLE_SCHEMA;").Check(testkit.Rows( "test 2", )) - c.Assert(len(tk.MustQuery("select TABLE_NAME from information_schema.TABLE_STORAGE_STATS where TABLE_SCHEMA = 'mysql';").Rows()), Equals, 26) + c.Assert(len(tk.MustQuery("select TABLE_NAME from information_schema.TABLE_STORAGE_STATS where TABLE_SCHEMA = 'mysql';").Rows()), Equals, 27) // More tests about the privileges. tk.MustExec("create user 'testuser'@'localhost'") @@ -943,14 +944,14 @@ func (s *testInfoschemaClusterTableSuite) TestTableStorageStats(c *C) { Hostname: "localhost", }, nil, nil), Equals, true) - tk.MustQuery("select count(1) from information_schema.TABLE_STORAGE_STATS where TABLE_SCHEMA = 'mysql'").Check(testkit.Rows("26")) + tk.MustQuery("select count(1) from information_schema.TABLE_STORAGE_STATS where TABLE_SCHEMA = 'mysql'").Check(testkit.Rows("27")) c.Assert(tk.Se.Auth(&auth.UserIdentity{ Username: "testuser3", Hostname: "localhost", }, nil, nil), Equals, true) - tk.MustQuery("select count(1) from information_schema.TABLE_STORAGE_STATS where TABLE_SCHEMA = 'mysql'").Check(testkit.Rows("26")) + tk.MustQuery("select count(1) from information_schema.TABLE_STORAGE_STATS where TABLE_SCHEMA = 'mysql'").Check(testkit.Rows("27")) } func (s *testInfoschemaTableSuite) TestSequences(c *C) { diff --git a/executor/insert.go b/executor/insert.go index ea4ba06dacdcd..2862416ddf04a 100644 --- a/executor/insert.go +++ b/executor/insert.go @@ -66,7 +66,7 @@ func (e *InsertExec) exec(ctx context.Context, rows [][]types.Datum) error { if err != nil { return err } - setResourceGroupTagForTxn(sessVars.StmtCtx, txn) + setResourceGroupTaggerForTxn(sessVars.StmtCtx, txn) txnSize := txn.Size() sessVars.StmtCtx.AddRecordRows(uint64(len(rows))) // If you use the IGNORE keyword, duplicate-key error that occurs while executing the INSERT statement are ignored. @@ -389,6 +389,9 @@ func (e *InsertExec) doDupRowUpdate(ctx context.Context, handle kv.Handle, oldRo // Update old row when the key is duplicated. e.evalBuffer4Dup.SetDatums(e.row4Update...) for _, col := range cols { + if col.LazyErr != nil { + return col.LazyErr + } val, err1 := col.Expr.Eval(e.evalBuffer4Dup.ToRow()) if err1 != nil { return err1 diff --git a/executor/insert_common.go b/executor/insert_common.go index 57f987592fb1b..9c7adbb3c4d1a 100644 --- a/executor/insert_common.go +++ b/executor/insert_common.go @@ -682,6 +682,11 @@ func setDatumAutoIDAndCast(ctx sessionctx.Context, d *types.Datum, id int64, col d.SetAutoID(id, col.Flag) var err error *d, err = table.CastValue(ctx, *d, col.ToInfo(), false, false) + if err == nil && d.GetInt64() < id { + // Auto ID is out of range, the truncated ID is possible to duplicate with an existing ID. + // To prevent updating unrelated rows in the REPLACE statement, it is better to throw an error. + return autoid.ErrAutoincReadFailed + } return err } @@ -783,7 +788,10 @@ func (e *InsertValues) adjustAutoIncrementDatum(ctx context.Context, d types.Dat if retryInfo.Retrying { id, ok := retryInfo.GetCurrAutoIncrementID() if ok { - d.SetAutoID(id, c.Flag) + err := setDatumAutoIDAndCast(e.ctx, &d, id, c) + if err != nil { + return types.Datum{}, err + } return d, nil } } @@ -856,7 +864,10 @@ func (e *InsertValues) adjustAutoRandomDatum(ctx context.Context, d types.Datum, if retryInfo.Retrying { autoRandomID, ok := retryInfo.GetCurrAutoRandomID() if ok { - d.SetAutoID(autoRandomID, c.Flag) + err := setDatumAutoIDAndCast(e.ctx, &d, autoRandomID, c) + if err != nil { + return types.Datum{}, err + } return d, nil } } @@ -882,7 +893,10 @@ func (e *InsertValues) adjustAutoRandomDatum(ctx context.Context, d types.Datum, return types.Datum{}, err } e.ctx.GetSessionVars().StmtCtx.InsertID = uint64(recordID) - d.SetAutoID(recordID, c.Flag) + err = setDatumAutoIDAndCast(e.ctx, &d, recordID, c) + if err != nil { + return types.Datum{}, err + } retryInfo.AddAutoRandomID(recordID) return d, nil } diff --git a/executor/insert_test.go b/executor/insert_test.go index d2d5b232b53af..ab41475d3e6fa 100644 --- a/executor/insert_test.go +++ b/executor/insert_test.go @@ -331,7 +331,7 @@ func (s *testSuite3) TestInsertWrongValueForField(c *C) { tk.MustExec(`create table t1(a char(10) charset utf8);`) tk.MustExec(`insert into t1 values('我');`) tk.MustExec(`alter table t1 add column b char(10) charset ascii as ((a));`) - tk.MustQuery(`select * from t1;`).Check(testkit.Rows(`我 `)) + tk.MustQuery(`select * from t1;`).Check(testkit.Rows("我 ?")) tk.MustExec(`drop table if exists t;`) tk.MustExec(`create table t (a year);`) @@ -1753,3 +1753,85 @@ func (s *testSuite13) TestIssue26762(c *C) { _, err = tk.Exec("insert into t1 values('2020-02-31');") c.Assert(err.Error(), Equals, `[table:1292]Incorrect date value: '2020-02-31' for column 'c1' at row 1`) } + +func (s *testSuite10) TestStringtoDecimal(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (id decimal(10))") + tk.MustGetErrCode("insert into t values('1sdf')", errno.ErrTruncatedWrongValueForField) + tk.MustGetErrCode("insert into t values('1edf')", errno.ErrTruncatedWrongValueForField) + tk.MustGetErrCode("insert into t values('12Ea')", errno.ErrTruncatedWrongValueForField) + tk.MustGetErrCode("insert into t values('1E')", errno.ErrTruncatedWrongValueForField) + tk.MustGetErrCode("insert into t values('1e')", errno.ErrTruncatedWrongValueForField) + tk.MustGetErrCode("insert into t values('1.2A')", errno.ErrTruncatedWrongValueForField) + tk.MustGetErrCode("insert into t values('1.2.3.4.5')", errno.ErrTruncatedWrongValueForField) + tk.MustGetErrCode("insert into t values('1.2.')", errno.ErrTruncatedWrongValueForField) + tk.MustGetErrCode("insert into t values('1,999.00')", errno.ErrTruncatedWrongValueForField) + tk.MustExec("insert into t values('12e-3')") + tk.MustQuery("show warnings;").Check(testutil.RowsWithSep("|", "Warning|1292|Truncated incorrect DECIMAL value: '0.012'")) + tk.MustQuery("select id from t").Check(testkit.Rows("0")) + tk.MustExec("drop table if exists t") +} + +func (s *testSuite13) TestIssue17745(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec(`use test`) + tk.MustExec("drop table if exists tt1") + tk.MustExec("create table tt1 (c1 decimal(64))") + tk.MustGetErrCode("insert into tt1 values(89000000000000000000000000000000000000000000000000000000000000000000000000000000000000000)", errno.ErrWarnDataOutOfRange) + tk.MustGetErrCode("insert into tt1 values(89123456789012345678901234567890123456789012345678901234567890123456789012345678900000000)", errno.ErrWarnDataOutOfRange) + tk.MustExec("insert ignore into tt1 values(89123456789012345678901234567890123456789012345678901234567890123456789012345678900000000)") + tk.MustQuery("show warnings;").Check(testkit.Rows(`Warning 1690 DECIMAL value is out of range in '(64, 0)'`, `Warning 1292 Truncated incorrect DECIMAL value: '789012345678901234567890123456789012345678901234567890123456789012345678900000000'`)) + tk.MustQuery("select c1 from tt1").Check(testkit.Rows("9999999999999999999999999999999999999999999999999999999999999999")) + tk.MustGetErrCode("update tt1 set c1 = 89123456789012345678901234567890123456789012345678901234567890123456789012345678900000000", errno.ErrWarnDataOutOfRange) + tk.MustExec("drop table if exists tt1") + tk.MustGetErrCode("insert into tt1 values(4556414e723532)", errno.ErrIllegalValueForType) + tk.MustQuery("select 888888888888888888888888888888888888888888888888888888888888888888888888888888888888").Check(testkit.Rows("99999999999999999999999999999999999999999999999999999999999999999")) + tk.MustQuery("show warnings;").Check(testutil.RowsWithSep("|", "Warning|1292|Truncated incorrect DECIMAL value: '888888888888888888888888888888888888888888888888888888888888888888888888888888888'")) +} + +// TestInsertIssue29892 test the double type with auto_increment problem, just leverage the serial test suite. +func (s *testAutoRandomSuite) TestInsertIssue29892(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec(`use test`) + + tk.MustExec("set global tidb_txn_mode='optimistic';") + tk.MustExec("set global tidb_disable_txn_auto_retry=false;") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a double auto_increment key, b int)") + tk.MustExec("insert into t values (146576794, 1)") + + tk1 := testkit.NewTestKit(c, s.store) + tk1.MustExec(`use test`) + tk1.MustExec("begin") + tk1.MustExec("insert into t(b) select 1") + + tk2 := testkit.NewTestKit(c, s.store) + tk2.MustExec(`use test`) + tk2.MustExec("begin") + tk2.MustExec("insert into t values (146576795, 1)") + tk2.MustExec("insert into t values (146576796, 1)") + tk2.MustExec("commit") + + // since the origin auto-id (146576795) is cached in retryInfo, it will be fetched again to do the retry again, + // which will duplicate with what has been inserted in tk1. + _, err := tk1.Exec("commit") + c.Assert(err, NotNil) + c.Assert(strings.Contains(err.Error(), "Duplicate entry"), Equals, true) +} + +// https://github.com/pingcap/tidb/issues/29483. +func (s *testSuite13) TestReplaceAllocatingAutoID(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("drop database if exists replace_auto_id;") + tk.MustExec("create database replace_auto_id;") + tk.MustExec(`use replace_auto_id;`) + + tk.MustExec("SET sql_mode='NO_ENGINE_SUBSTITUTION';") + tk.MustExec("DROP TABLE IF EXISTS t1;") + tk.MustExec("CREATE TABLE t1 (a tinyint not null auto_increment primary key, b char(20));") + tk.MustExec("INSERT INTO t1 VALUES (127,'maxvalue');") + // Note that this error is different from MySQL's duplicated primary key error. + tk.MustGetErrCode("REPLACE INTO t1 VALUES (0,'newmaxvalue');", errno.ErrAutoincReadFailed) +} diff --git a/executor/join.go b/executor/join.go index 716ce2a229d3f..09990e6c5d4b1 100644 --- a/executor/join.go +++ b/executor/join.go @@ -116,7 +116,9 @@ type hashjoinWorkerResult struct { // Close implements the Executor Close interface. func (e *HashJoinExec) Close() error { - close(e.closeCh) + if e.closeCh != nil { + close(e.closeCh) + } e.finished.Store(true) if e.prepared { if e.buildFinished != nil { @@ -156,6 +158,9 @@ func (e *HashJoinExec) Close() error { // Open implements the Executor Open interface. func (e *HashJoinExec) Open(ctx context.Context) error { + if err := e.baseExecutor.Open(ctx); err != nil { + return err + } e.prepared = false e.memTracker = memory.NewTracker(e.id, -1) e.memTracker.AttachTo(e.ctx.GetSessionVars().StmtCtx.MemTracker) @@ -179,7 +184,7 @@ func (e *HashJoinExec) Open(ctx context.Context) error { } e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, e.stats) } - return e.baseExecutor.Open(ctx) + return nil } // fetchProbeSideChunks get chunks from fetches chunks from the big table in a background goroutine @@ -214,9 +219,13 @@ func (e *HashJoinExec) fetchProbeSideChunks(ctx context.Context) { return } if !hasWaitedForBuild { + failpoint.Inject("issue30289", func(val failpoint.Value) { + if val.(bool) { + probeSideResult.Reset() + } + }) if probeSideResult.NumRows() == 0 && !e.useOuterToBuild { e.finished.Store(true) - return } emptyBuild, buildErr := e.wait4BuildSide() if buildErr != nil { @@ -258,6 +267,13 @@ func (e *HashJoinExec) wait4BuildSide() (emptyBuild bool, err error) { func (e *HashJoinExec) fetchBuildSideRows(ctx context.Context, chkCh chan<- *chunk.Chunk, doneCh <-chan struct{}) { defer close(chkCh) var err error + failpoint.Inject("issue30289", func(val failpoint.Value) { + if val.(bool) { + err = errors.Errorf("issue30289 build return error") + e.buildFinished <- errors.Trace(err) + return + } + }) for { if e.finished.Load().(bool) { return @@ -566,7 +582,7 @@ func (e *HashJoinExec) join2Chunk(workerID uint, probeSideChk *chunk.Chunk, hCtx hCtx.initHash(probeSideChk.NumRows()) for keyIdx, i := range hCtx.keyColIdx { ignoreNull := len(e.isNullEQ) > keyIdx && e.isNullEQ[keyIdx] - err = codec.HashChunkSelected(rowContainer.sc, hCtx.hashVals, probeSideChk, hCtx.allTypes[i], i, hCtx.buf, hCtx.hasNull, selected, ignoreNull) + err = codec.HashChunkSelected(rowContainer.sc, hCtx.hashVals, probeSideChk, hCtx.allTypes[keyIdx], i, hCtx.buf, hCtx.hasNull, selected, ignoreNull) if err != nil { joinResult.err = err return false, joinResult @@ -607,8 +623,8 @@ func (e *HashJoinExec) join2Chunk(workerID uint, probeSideChk *chunk.Chunk, hCtx // join2ChunkForOuterHashJoin joins chunks when using the outer to build a hash table (refer to outer hash join) func (e *HashJoinExec) join2ChunkForOuterHashJoin(workerID uint, probeSideChk *chunk.Chunk, hCtx *hashContext, rowContainer *hashRowContainer, joinResult *hashjoinWorkerResult) (ok bool, _ *hashjoinWorkerResult) { hCtx.initHash(probeSideChk.NumRows()) - for _, i := range hCtx.keyColIdx { - err := codec.HashChunkColumns(rowContainer.sc, hCtx.hashVals, probeSideChk, hCtx.allTypes[i], i, hCtx.buf, hCtx.hasNull) + for keyIdx, i := range hCtx.keyColIdx { + err := codec.HashChunkColumns(rowContainer.sc, hCtx.hashVals, probeSideChk, hCtx.allTypes[keyIdx], i, hCtx.buf, hCtx.hasNull) if err != nil { joinResult.err = err return false, joinResult @@ -656,7 +672,7 @@ func (e *HashJoinExec) Next(ctx context.Context, req *chunk.Chunk) (err error) { allTypes: e.buildTypes, keyColIdx: buildKeyColIdx, } - e.rowContainer = newHashRowContainer(e.ctx, int(e.buildSideEstCount), hCtx) + e.rowContainer = newHashRowContainer(e.ctx, int(e.buildSideEstCount), hCtx, retTypes(e.buildSideExec)) // we shallow copies rowContainer for each probe worker to avoid lock contention e.rowContainerForProbe = make([]*hashRowContainer, e.concurrency) for i := uint(0); i < e.concurrency; i++ { diff --git a/executor/join_test.go b/executor/join_test.go index 35d5a914d6470..a11e71332d07f 100644 --- a/executor/join_test.go +++ b/executor/join_test.go @@ -656,6 +656,39 @@ func (s *testSuiteJoin1) TestUsing(c *C) { tk.MustQuery("select t1.t0, t2.t0 from t1 join t2 using(t0) having t1.t0 > 0").Check(testkit.Rows("1 1")) } +func (s *testSuiteWithData) TestUsingAndNaturalJoinSchema(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1, t2, t3, t4") + tk.MustExec("create table t1 (c int, b int);") + tk.MustExec("create table t2 (a int, b int);") + tk.MustExec("create table t3 (b int, c int);") + tk.MustExec("create table t4 (y int, c int);") + + tk.MustExec("insert into t1 values (10,1);") + tk.MustExec("insert into t1 values (3 ,1);") + tk.MustExec("insert into t1 values (3 ,2);") + tk.MustExec("insert into t2 values (2, 1);") + tk.MustExec("insert into t3 values (1, 3);") + tk.MustExec("insert into t3 values (1,10);") + tk.MustExec("insert into t4 values (11,3);") + tk.MustExec("insert into t4 values (2, 3);") + + var input []string + var output []struct { + SQL string + Res []string + } + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i].SQL = tt + output[i].Res = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Sort().Rows()) + }) + tk.MustQuery(tt).Sort().Check(testkit.Rows(output[i].Res...)) + } +} + func (s *testSuiteWithData) TestNaturalJoin(c *C) { tk := testkit.NewTestKit(c, s.store) @@ -1107,7 +1140,7 @@ func (s *testSuiteJoin1) TestJoinLeak(c *C) { tk.MustExec("commit") result, err := tk.Exec("select * from t t1 left join (select 1) t2 on 1") c.Assert(err, IsNil) - req := result.NewChunk() + req := result.NewChunk(nil) err = result.Next(context.Background(), req) c.Assert(err, IsNil) time.Sleep(time.Millisecond) @@ -2610,3 +2643,39 @@ func (s *testSuiteJoinSerial) TestIssue25902(c *C) { tk.MustQuery("select * from tt1 where ts in (select ts from tt2);").Check(testkit.Rows()) tk.MustExec("set @@session.time_zone = @tmp;") } + +func (s *testSuiteJoinSerial) TestIssue30211(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(a int, index(a));") + tk.MustExec("create table t2(a int, index(a));") + func() { + fpName := "github.com/pingcap/tidb/executor/TestIssue30211" + c.Assert(failpoint.Enable(fpName, `panic("TestIssue30211 IndexJoinPanic")`), IsNil) + defer func() { + c.Assert(failpoint.Disable(fpName), IsNil) + }() + err := tk.QueryToErr("select /*+ inl_join(t1) */ * from t1 join t2 on t1.a = t2.a;").Error() + c.Assert(err, Matches, "failpoint panic: TestIssue30211 IndexJoinPanic") + + err = tk.QueryToErr("select /*+ inl_hash_join(t1) */ * from t1 join t2 on t1.a = t2.a;").Error() + c.Assert(err, Matches, "failpoint panic: TestIssue30211 IndexJoinPanic") + }() + tk.MustExec("insert into t1 values(1),(2);") + tk.MustExec("insert into t2 values(1),(1),(2),(2);") + tk.MustExec("set @@tidb_mem_quota_query=8000;") + tk.MustExec("set tidb_index_join_batch_size = 1;") + config.UpdateGlobal(func(conf *config.Config) { + conf.OOMAction = config.OOMActionCancel + }) + defer func() { + config.UpdateGlobal(func(conf *config.Config) { + conf.OOMAction = config.OOMActionLog + }) + }() + err := tk.QueryToErr("select /*+ inl_join(t1) */ * from t1 join t2 on t1.a = t2.a;").Error() + c.Assert(strings.Contains(err, "Out Of Memory Quota"), IsTrue) + err = tk.QueryToErr("select /*+ inl_hash_join(t1) */ * from t1 join t2 on t1.a = t2.a;").Error() + c.Assert(strings.Contains(err, "Out Of Memory Quota"), IsTrue) +} diff --git a/executor/load_data.go b/executor/load_data.go index 03539a4f8c9a9..1202675ebbce0 100644 --- a/executor/load_data.go +++ b/executor/load_data.go @@ -419,9 +419,9 @@ func (e *LoadDataInfo) isInQuoter(bs []byte) bool { return inQuoter } -// indexOfTerminator return index of terminator, if not, return -1. +// IndexOfTerminator return index of terminator, if not, return -1. // normally, the field terminator and line terminator is short, so we just use brute force algorithm. -func (e *LoadDataInfo) indexOfTerminator(bs []byte, isInQuoter bool) int { +func (e *LoadDataInfo) IndexOfTerminator(bs []byte, inQuoter bool) int { fieldTerm := []byte(e.FieldsInfo.Terminated) fieldTermLen := len(fieldTerm) lineTerm := []byte(e.LinesInfo.Terminated) @@ -459,13 +459,10 @@ func (e *LoadDataInfo) indexOfTerminator(bs []byte, isInQuoter bool) int { } } atFieldStart := true - inQuoter := false loop: for i := 0; i < len(bs); i++ { if atFieldStart && bs[i] == e.FieldsInfo.Enclosed { - if !isInQuoter { - inQuoter = true - } + inQuoter = !inQuoter atFieldStart = false continue } @@ -525,7 +522,7 @@ func (e *LoadDataInfo) getLine(prevData, curData []byte, ignore bool) ([]byte, [ if ignore { endIdx = strings.Index(string(hack.String(curData[curStartIdx:])), e.LinesInfo.Terminated) } else { - endIdx = e.indexOfTerminator(curData[curStartIdx:], inquotor) + endIdx = e.IndexOfTerminator(curData[curStartIdx:], inquotor) } } if endIdx == -1 { @@ -539,7 +536,7 @@ func (e *LoadDataInfo) getLine(prevData, curData []byte, ignore bool) ([]byte, [ if ignore { endIdx = strings.Index(string(hack.String(curData[startingLen:])), e.LinesInfo.Terminated) } else { - endIdx = e.indexOfTerminator(curData[startingLen:], inquotor) + endIdx = e.IndexOfTerminator(curData[startingLen:], inquotor) } if endIdx != -1 { nextDataIdx := startingLen + endIdx + terminatedLen @@ -560,7 +557,7 @@ func (e *LoadDataInfo) getLine(prevData, curData []byte, ignore bool) ([]byte, [ if ignore { endIdx = strings.Index(string(hack.String(prevData[startingLen:])), e.LinesInfo.Terminated) } else { - endIdx = e.indexOfTerminator(prevData[startingLen:], inquotor) + endIdx = e.IndexOfTerminator(prevData[startingLen:], inquotor) } if endIdx >= prevLen { return prevData[startingLen : startingLen+endIdx], curData[nextDataIdx:], true diff --git a/executor/main_test.go b/executor/main_test.go index cb02b1576e59f..bff65b72d6a2d 100644 --- a/executor/main_test.go +++ b/executor/main_test.go @@ -12,27 +12,41 @@ // See the License for the specific language governing permissions and // limitations under the License. -package executor +package executor_test import ( + "fmt" "os" "testing" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/meta/autoid" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/testkit/testdata" + "github.com/pingcap/tidb/testkit/testmain" "github.com/pingcap/tidb/util/testbridge" "github.com/tikv/client-go/v2/tikv" "go.uber.org/goleak" ) +var testDataMap = make(testdata.BookKeeper) +var prepareMergeSuiteData testdata.TestData +var aggMergeSuiteData testdata.TestData + func TestMain(m *testing.M) { testbridge.WorkaroundGoCheckFlags() + testDataMap.LoadTestSuiteData("testdata", "prepare_suite") + testDataMap.LoadTestSuiteData("testdata", "agg_suite") + prepareMergeSuiteData = testDataMap["prepare_suite"] + aggMergeSuiteData = testDataMap["agg_suite"] + autoid.SetStep(5000) config.UpdateGlobal(func(conf *config.Config) { conf.Log.SlowThreshold = 30000 // 30s conf.TiKVClient.AsyncCommit.SafeWindow = 0 conf.TiKVClient.AsyncCommit.AllowedClockDrift = 0 + conf.Experimental.AllowsExpressionIndex = true }) tikv.EnableFailpoints() tmpDir := config.GetGlobalConfig().TempStoragePath @@ -44,5 +58,19 @@ func TestMain(m *testing.M) { goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), goleak.IgnoreTopFunction("gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun"), } - goleak.VerifyTestMain(m, opts...) + callback := func(i int) int { + testDataMap.GenerateOutputIfNeeded() + return i + } + + goleak.VerifyTestMain(testmain.WrapTestingM(m, callback), opts...) +} + +func fillData(tk *testkit.TestKit, table string) { + tk.MustExec("use test") + tk.MustExec(fmt.Sprintf("create table %s(id int not null default 1, name varchar(255), PRIMARY KEY(id));", table)) + + // insert data + tk.MustExec(fmt.Sprintf("insert INTO %s VALUES (1, \"hello\");", table)) + tk.MustExec(fmt.Sprintf("insert into %s values (2, \"hello\");", table)) } diff --git a/executor/mem_reader.go b/executor/mem_reader.go index 7cb4b15197d07..d345d11670c6e 100644 --- a/executor/mem_reader.go +++ b/executor/mem_reader.go @@ -33,6 +33,18 @@ import ( "github.com/pingcap/tidb/util/rowcodec" ) +type memReader interface { + getMemRows() ([][]types.Datum, error) + getMemRowsHandle() ([]kv.Handle, error) +} + +var ( + _ memReader = &memIndexReader{} + _ memReader = &memTableReader{} + _ memReader = &memIndexLookUpReader{} + _ memReader = &memIndexMergeReader{} +) + type memIndexReader struct { ctx sessionctx.Context index *model.IndexInfo @@ -46,6 +58,7 @@ type memIndexReader struct { outputOffset []int // belowHandleCols is the handle's position of the below scan plan. belowHandleCols plannercore.HandleCols + cacheTable kv.MemBuffer } func buildMemIndexReader(us *UnionScanExec, idxReader *IndexReaderExecutor) *memIndexReader { @@ -64,6 +77,7 @@ func buildMemIndexReader(us *UnionScanExec, idxReader *IndexReaderExecutor) *mem retFieldTypes: retTypes(us), outputOffset: outputOffset, belowHandleCols: us.belowHandleCols, + cacheTable: us.cacheTable, } } @@ -92,7 +106,7 @@ func (m *memIndexReader) getMemRows() ([][]types.Datum, error) { } mutableRow := chunk.MutRowFromTypes(m.retFieldTypes) - err := iterTxnMemBuffer(m.ctx, m.kvRanges, func(key, value []byte) error { + err := iterTxnMemBuffer(m.ctx, m.cacheTable, m.kvRanges, func(key, value []byte) error { data, err := m.decodeIndexKeyValue(key, value, tps) if err != nil { return err @@ -152,6 +166,9 @@ type memTableReader struct { colIDs map[int64]int buffer allocBuf pkColIDs []int64 + cacheTable kv.MemBuffer + // Used when extracting handles from row in memTableReader.getMemRowsHandle. + handleCols plannercore.HandleCols } type allocBuf struct { @@ -194,14 +211,15 @@ func buildMemTableReader(us *UnionScanExec, tblReader *TableReaderExecutor) *mem handleBytes: make([]byte, 0, 16), rd: rd, }, - pkColIDs: pkColIDs, + pkColIDs: pkColIDs, + cacheTable: us.cacheTable, } } // TODO: Try to make memXXXReader lazy, There is no need to decode many rows when parent operator only need 1 row. func (m *memTableReader) getMemRows() ([][]types.Datum, error) { mutableRow := chunk.MutRowFromTypes(m.retFieldTypes) - err := iterTxnMemBuffer(m.ctx, m.kvRanges, func(key, value []byte) error { + err := iterTxnMemBuffer(m.ctx, m.cacheTable, m.kvRanges, func(key, value []byte) error { row, err := m.decodeRecordKeyValue(key, value) if err != nil { return err @@ -309,6 +327,23 @@ func (m *memTableReader) getRowData(handle kv.Handle, value []byte) ([][]byte, e return values, nil } +// getMemRowsHandle is called when memIndexMergeReader.partialPlans[i] is TableScan. +func (m *memTableReader) getMemRowsHandle() ([]kv.Handle, error) { + rows, err := m.getMemRows() + if err != nil { + return nil, err + } + handles := make([]kv.Handle, 0, len(rows)) + for _, row := range rows { + handle, err := m.handleCols.BuildHandleByDatums(row) + if err != nil { + return nil, err + } + handles = append(handles, handle) + } + return handles, nil +} + func hasColVal(data [][]byte, colIDs map[int64]int, id int64) bool { offset, ok := colIDs[id] if ok && data[offset] != nil { @@ -319,27 +354,24 @@ func hasColVal(data [][]byte, colIDs map[int64]int, id int64) bool { type processKVFunc func(key, value []byte) error -func iterTxnMemBuffer(ctx sessionctx.Context, kvRanges []kv.KeyRange, fn processKVFunc) error { +func iterTxnMemBuffer(ctx sessionctx.Context, cacheTable kv.MemBuffer, kvRanges []kv.KeyRange, fn processKVFunc) error { txn, err := ctx.Txn(true) if err != nil { return err } - tempTableData := ctx.GetSessionVars().TemporaryTableData for _, rg := range kvRanges { iter := txn.GetMemBuffer().SnapshotIter(rg.StartKey, rg.EndKey) - if tempTableData != nil { - snapIter, err := tempTableData.Iter(rg.StartKey, rg.EndKey) - if err != nil { - return err - } - - iter, err = transaction.NewUnionIter(iter, snapIter, false) + snapCacheIter, err := getSnapIter(ctx, cacheTable, rg) + if err != nil { + return err + } + if snapCacheIter != nil { + iter, err = transaction.NewUnionIter(iter, snapCacheIter, false) if err != nil { return err } } - for ; iter.Valid(); err = iter.Next() { if err != nil { return err @@ -357,6 +389,25 @@ func iterTxnMemBuffer(ctx sessionctx.Context, kvRanges []kv.KeyRange, fn process return nil } +func getSnapIter(ctx sessionctx.Context, cacheTable kv.MemBuffer, rg kv.KeyRange) (kv.Iterator, error) { + var snapCacheIter kv.Iterator + tempTableData := ctx.GetSessionVars().TemporaryTableData + if tempTableData != nil { + snapIter, err := tempTableData.Iter(rg.StartKey, rg.EndKey) + if err != nil { + return nil, err + } + snapCacheIter = snapIter + } else if cacheTable != nil { + cacheIter, err := cacheTable.Iter(rg.StartKey, rg.EndKey) + if err != nil { + return nil, errors.Trace(err) + } + snapCacheIter = cacheIter + } + return snapCacheIter, nil +} + func reverseDatumSlice(rows [][]types.Datum) { for i, j := 0, len(rows)-1; i < j; i, j = i+1, j-1 { rows[i], rows[j] = rows[j], rows[i] @@ -365,7 +416,7 @@ func reverseDatumSlice(rows [][]types.Datum) { func (m *memIndexReader) getMemRowsHandle() ([]kv.Handle, error) { handles := make([]kv.Handle, 0, m.addedRowsLen) - err := iterTxnMemBuffer(m.ctx, m.kvRanges, func(key, value []byte) error { + err := iterTxnMemBuffer(m.ctx, m.cacheTable, m.kvRanges, func(key, value []byte) error { handle, err := tablecodec.DecodeIndexHandle(key, value, len(m.index.Columns)) if err != nil { return err @@ -400,6 +451,8 @@ type memIndexLookUpReader struct { partitionMode bool // if it is accessing a partition table partitionTables []table.PhysicalTable // partition tables to access partitionKVRanges [][]kv.KeyRange // kv ranges for these partition tables + + cacheTable kv.MemBuffer } func buildMemIndexLookUpReader(us *UnionScanExec, idxLookUpReader *IndexLookUpExecutor) *memIndexLookUpReader { @@ -414,6 +467,7 @@ func buildMemIndexLookUpReader(us *UnionScanExec, idxLookUpReader *IndexLookUpEx retFieldTypes: retTypes(us), outputOffset: outputOffset, belowHandleCols: us.belowHandleCols, + cacheTable: us.cacheTable, } return &memIndexLookUpReader{ @@ -429,6 +483,7 @@ func buildMemIndexLookUpReader(us *UnionScanExec, idxLookUpReader *IndexLookUpEx partitionMode: idxLookUpReader.partitionTableMode, partitionKVRanges: idxLookUpReader.partitionKVRanges, partitionTables: idxLookUpReader.prunedPartitions, + cacheTable: us.cacheTable, } } @@ -462,26 +517,131 @@ func (m *memIndexLookUpReader) getMemRows() ([][]types.Datum, error) { return nil, nil } - colIDs := make(map[int64]int, len(m.columns)) - for i, col := range m.columns { - colIDs[col.ID] = i + colIDs, pkColIDs, rd := getColIDAndPkColIDs(m.table, m.columns) + memTblReader := &memTableReader{ + ctx: m.ctx, + table: m.table.Meta(), + columns: m.columns, + kvRanges: tblKVRanges, + conditions: m.conditions, + addedRows: make([][]types.Datum, 0, numHandles), + retFieldTypes: m.retFieldTypes, + colIDs: colIDs, + pkColIDs: pkColIDs, + buffer: allocBuf{ + handleBytes: make([]byte, 0, 16), + rd: rd, + }, + cacheTable: m.cacheTable, } - tblInfo := m.table.Meta() - colInfos := make([]rowcodec.ColInfo, 0, len(m.columns)) - for i := range m.columns { - col := m.columns[i] - colInfos = append(colInfos, rowcodec.ColInfo{ - ID: col.ID, - IsPKHandle: tblInfo.PKIsHandle && mysql.HasPriKeyFlag(col.Flag), - Ft: rowcodec.FieldTypeFromModelColumn(col), - }) + return memTblReader.getMemRows() +} + +func (m *memIndexLookUpReader) getMemRowsHandle() ([]kv.Handle, error) { + return nil, errors.New("getMemRowsHandle has not been implemented for memIndexLookUpReader") +} + +type memIndexMergeReader struct { + ctx sessionctx.Context + columns []*model.ColumnInfo + table table.Table + conditions []expression.Expression + retFieldTypes []*types.FieldType + indexMergeReader *IndexMergeReaderExecutor + memReaders []memReader + + // partition mode + partitionMode bool // if it is accessing a partition table + partitionTables []table.PhysicalTable // partition tables to access + partitionKVRanges [][][]kv.KeyRange // kv ranges for these partition tables +} + +func buildMemIndexMergeReader(us *UnionScanExec, indexMergeReader *IndexMergeReaderExecutor) *memIndexMergeReader { + indexCount := len(indexMergeReader.indexes) + memReaders := make([]memReader, 0, indexCount) + for i := 0; i < indexCount; i++ { + if indexMergeReader.indexes[i] == nil { + colIDs, pkColIDs, rd := getColIDAndPkColIDs(indexMergeReader.table, indexMergeReader.columns) + memReaders = append(memReaders, &memTableReader{ + ctx: us.ctx, + table: indexMergeReader.table.Meta(), + columns: indexMergeReader.columns, + kvRanges: nil, + conditions: us.conditions, + addedRows: make([][]types.Datum, 0), + retFieldTypes: retTypes(us), + colIDs: colIDs, + pkColIDs: pkColIDs, + buffer: allocBuf{ + handleBytes: make([]byte, 0, 16), + rd: rd, + }, + handleCols: indexMergeReader.handleCols, + }) + } else { + outputOffset := []int{len(indexMergeReader.indexes[i].Columns)} + memReaders = append(memReaders, &memIndexReader{ + ctx: us.ctx, + index: indexMergeReader.indexes[i], + table: indexMergeReader.table.Meta(), + kvRanges: nil, + desc: indexMergeReader.descs[i], + retFieldTypes: retTypes(us), + outputOffset: outputOffset, + belowHandleCols: us.belowHandleCols, + }) + } } - pkColIDs := tables.TryGetCommonPkColumnIds(tblInfo) - if len(pkColIDs) == 0 { - pkColIDs = []int64{-1} + + return &memIndexMergeReader{ + ctx: us.ctx, + table: indexMergeReader.table, + columns: indexMergeReader.columns, + conditions: us.conditions, + retFieldTypes: retTypes(us), + indexMergeReader: indexMergeReader, + memReaders: memReaders, + + partitionMode: indexMergeReader.partitionTableMode, + partitionTables: indexMergeReader.prunedPartitions, + partitionKVRanges: indexMergeReader.partitionKeyRanges, } - rd := rowcodec.NewByteDecoder(colInfos, pkColIDs, nil, nil) +} + +func (m *memIndexMergeReader) getMemRows() ([][]types.Datum, error) { + tbls := []table.Table{m.table} + // [partNum][indexNum][rangeNum] + var kvRanges [][][]kv.KeyRange + if m.partitionMode { + tbls = tbls[:0] + for _, p := range m.partitionTables { + tbls = append(tbls, p) + } + kvRanges = m.partitionKVRanges + } else { + kvRanges = append(kvRanges, m.indexMergeReader.keyRanges) + } + + tblKVRanges := make([]kv.KeyRange, 0, 16) + numHandles := 0 + for i, tbl := range tbls { + handles, err := m.unionHandles(kvRanges[i]) + if err != nil { + return nil, err + } + if len(handles) == 0 { + continue + } + numHandles += len(handles) + tblKVRanges = append(tblKVRanges, distsql.TableHandlesToKVRanges(getPhysicalTableID(tbl), handles)...) + } + + if numHandles == 0 { + return nil, nil + } + colIDs, pkColIDs, rd := getColIDAndPkColIDs(m.table, m.columns) + memTblReader := &memTableReader{ ctx: m.ctx, table: m.table.Meta(), @@ -500,3 +660,62 @@ func (m *memIndexLookUpReader) getMemRows() ([][]types.Datum, error) { return memTblReader.getMemRows() } + +// Union all handles of different Indexes. +func (m *memIndexMergeReader) unionHandles(kvRanges [][]kv.KeyRange) (finalHandles []kv.Handle, err error) { + if len(m.memReaders) != len(kvRanges) { + return nil, errors.Errorf("len(kvRanges) should be equal to len(memReaders)") + } + + hMap := kv.NewHandleMap() + var handles []kv.Handle + for i, reader := range m.memReaders { + switch r := reader.(type) { + case *memTableReader: + r.kvRanges = kvRanges[i] + case *memIndexReader: + r.kvRanges = kvRanges[i] + default: + return nil, errors.New("memReader have to be memTableReader or memIndexReader") + } + if handles, err = reader.getMemRowsHandle(); err != nil { + return nil, err + } + // Filter same row. + for _, h := range handles { + if _, ok := hMap.Get(h); !ok { + finalHandles = append(finalHandles, h) + hMap.Set(h, true) + } + } + } + return finalHandles, nil +} + +func (m *memIndexMergeReader) getMemRowsHandle() ([]kv.Handle, error) { + return nil, errors.New("getMemRowsHandle has not been implemented for memIndexMergeReader") +} + +func getColIDAndPkColIDs(table table.Table, columns []*model.ColumnInfo) (map[int64]int, []int64, *rowcodec.BytesDecoder) { + colIDs := make(map[int64]int, len(columns)) + for i, col := range columns { + colIDs[col.ID] = i + } + + tblInfo := table.Meta() + colInfos := make([]rowcodec.ColInfo, 0, len(columns)) + for i := range columns { + col := columns[i] + colInfos = append(colInfos, rowcodec.ColInfo{ + ID: col.ID, + IsPKHandle: tblInfo.PKIsHandle && mysql.HasPriKeyFlag(col.Flag), + Ft: rowcodec.FieldTypeFromModelColumn(col), + }) + } + pkColIDs := tables.TryGetCommonPkColumnIds(tblInfo) + if len(pkColIDs) == 0 { + pkColIDs = []int64{-1} + } + rd := rowcodec.NewByteDecoder(colInfos, pkColIDs, nil, nil) + return colIDs, pkColIDs, rd +} diff --git a/executor/memory_test.go b/executor/memory_test.go index f6b395b285a5f..12843f86079e8 100644 --- a/executor/memory_test.go +++ b/executor/memory_test.go @@ -82,7 +82,7 @@ func (s *testMemoryLeak) TestPBMemoryLeak(c *C) { c.Assert(err, IsNil) record := records[0] rowCnt := 0 - chk := record.NewChunk() + chk := record.NewChunk(nil) for { c.Assert(record.Next(context.Background(), chk), IsNil) rowCnt += chk.NumRows() diff --git a/executor/memtable_reader.go b/executor/memtable_reader.go index 70d091de84849..1f014e53d26ae 100644 --- a/executor/memtable_reader.go +++ b/executor/memtable_reader.go @@ -15,6 +15,7 @@ package executor import ( + "bytes" "container/heap" "context" "encoding/json" @@ -39,18 +40,22 @@ import ( plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/store/helper" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/codec" "github.com/pingcap/tidb/util/execdetails" "github.com/pingcap/tidb/util/pdapi" "github.com/pingcap/tidb/util/set" + "github.com/tikv/client-go/v2/tikv" "go.uber.org/zap" "google.golang.org/grpc" "google.golang.org/grpc/credentials" ) const clusterLogBatchSize = 256 +const hotRegionsHistoryBatchSize = 256 type dummyCloser struct{} @@ -696,3 +701,299 @@ func (e *clusterLogRetriever) close() error { func (e *clusterLogRetriever) getRuntimeStats() execdetails.RuntimeStats { return nil } + +type hotRegionsResult struct { + addr string + messages *HistoryHotRegions + err error +} + +type hotRegionsResponseHeap []hotRegionsResult + +func (h hotRegionsResponseHeap) Len() int { + return len(h) +} + +func (h hotRegionsResponseHeap) Less(i, j int) bool { + lhs, rhs := h[i].messages.HistoryHotRegion[0], h[j].messages.HistoryHotRegion[0] + if lhs.UpdateTime != rhs.UpdateTime { + return lhs.UpdateTime < rhs.UpdateTime + } + return lhs.HotDegree < rhs.HotDegree +} + +func (h hotRegionsResponseHeap) Swap(i, j int) { + h[i], h[j] = h[j], h[i] +} + +func (h *hotRegionsResponseHeap) Push(x interface{}) { + *h = append(*h, x.(hotRegionsResult)) +} + +func (h *hotRegionsResponseHeap) Pop() interface{} { + old := *h + n := len(old) + x := old[n-1] + *h = old[0 : n-1] + return x +} + +type hotRegionsHistoryRetriver struct { + dummyCloser + isDrained bool + retrieving bool + heap *hotRegionsResponseHeap + extractor *plannercore.HotRegionsHistoryTableExtractor +} + +// HistoryHotRegionsRequest wrap conditions push down to PD. +type HistoryHotRegionsRequest struct { + StartTime int64 `json:"start_time,omitempty"` + EndTime int64 `json:"end_time,omitempty"` + RegionIDs []uint64 `json:"region_ids,omitempty"` + StoreIDs []uint64 `json:"store_ids,omitempty"` + PeerIDs []uint64 `json:"peer_ids,omitempty"` + IsLearners []bool `json:"is_learners,omitempty"` + IsLeaders []bool `json:"is_leaders,omitempty"` + HotRegionTypes []string `json:"hot_region_type,omitempty"` +} + +// HistoryHotRegions records filtered hot regions stored in each PD. +// it's the response of PD. +type HistoryHotRegions struct { + HistoryHotRegion []*HistoryHotRegion `json:"history_hot_region"` +} + +// HistoryHotRegion records each hot region's statistics. +// it's the response of PD. +type HistoryHotRegion struct { + UpdateTime int64 `json:"update_time,omitempty"` + RegionID uint64 `json:"region_id,omitempty"` + StoreID uint64 `json:"store_id,omitempty"` + PeerID uint64 `json:"peer_id,omitempty"` + IsLearner bool `json:"is_learner,omitempty"` + IsLeader bool `json:"is_leader,omitempty"` + HotRegionType string `json:"hot_region_type,omitempty"` + HotDegree int64 `json:"hot_degree,omitempty"` + FlowBytes float64 `json:"flow_bytes,omitempty"` + KeyRate float64 `json:"key_rate,omitempty"` + QueryRate float64 `json:"query_rate,omitempty"` + StartKey []byte `json:"start_key,omitempty"` + EndKey []byte `json:"end_key,omitempty"` +} + +func (e *hotRegionsHistoryRetriver) initialize(ctx context.Context, sctx sessionctx.Context) ([]chan hotRegionsResult, error) { + if !hasPriv(sctx, mysql.ProcessPriv) { + return nil, plannercore.ErrSpecificAccessDenied.GenWithStackByArgs("PROCESS") + } + pdServers, err := infoschema.GetPDServerInfo(sctx) + if err != nil { + return nil, err + } + + // To avoid search hot regions interface overload, the user should specify the time range in normally SQL. + if e.extractor.StartTime == 0 { + return nil, errors.New("denied to scan hot regions, please specified the start time, such as `update_time > '2020-01-01 00:00:00'`") + } + if e.extractor.EndTime == 0 { + return nil, errors.New("denied to scan hot regions, please specified the end time, such as `update_time < '2020-01-01 00:00:00'`") + } + + historyHotRegionsRequest := &HistoryHotRegionsRequest{ + StartTime: e.extractor.StartTime, + EndTime: e.extractor.EndTime, + RegionIDs: e.extractor.RegionIDs, + StoreIDs: e.extractor.StoreIDs, + PeerIDs: e.extractor.PeerIDs, + IsLearners: e.extractor.IsLearners, + IsLeaders: e.extractor.IsLeaders, + } + + return e.startRetrieving(ctx, sctx, pdServers, historyHotRegionsRequest) +} + +func (e *hotRegionsHistoryRetriver) startRetrieving( + ctx context.Context, + sctx sessionctx.Context, + pdServers []infoschema.ServerInfo, + req *HistoryHotRegionsRequest, +) ([]chan hotRegionsResult, error) { + + var results []chan hotRegionsResult + for _, srv := range pdServers { + for typ := range e.extractor.HotRegionTypes { + req.HotRegionTypes = []string{typ} + jsonBody, err := json.Marshal(req) + if err != nil { + return nil, err + } + body := bytes.NewBuffer(jsonBody) + ch := make(chan hotRegionsResult) + results = append(results, ch) + go func(ch chan hotRegionsResult, address string, body *bytes.Buffer) { + util.WithRecovery(func() { + defer close(ch) + url := fmt.Sprintf("%s://%s%s", util.InternalHTTPSchema(), address, pdapi.HotHistory) + req, err := http.NewRequest(http.MethodGet, url, body) + if err != nil { + ch <- hotRegionsResult{err: errors.Trace(err)} + return + } + req.Header.Add("PD-Allow-follower-handle", "true") + resp, err := util.InternalHTTPClient().Do(req) + if err != nil { + ch <- hotRegionsResult{err: errors.Trace(err)} + return + } + defer func() { + terror.Log(resp.Body.Close()) + }() + if resp.StatusCode != http.StatusOK { + ch <- hotRegionsResult{err: errors.Errorf("request %s failed: %s", url, resp.Status)} + return + } + var historyHotRegions HistoryHotRegions + if err = json.NewDecoder(resp.Body).Decode(&historyHotRegions); err != nil { + ch <- hotRegionsResult{err: errors.Trace(err)} + return + } + ch <- hotRegionsResult{addr: address, messages: &historyHotRegions} + }, nil) + }(ch, srv.StatusAddr, body) + } + } + return results, nil +} + +func (e *hotRegionsHistoryRetriver) retrieve(ctx context.Context, sctx sessionctx.Context) ([][]types.Datum, error) { + if e.extractor.SkipRequest || e.isDrained { + return nil, nil + } + + if !e.retrieving { + e.retrieving = true + results, err := e.initialize(ctx, sctx) + if err != nil { + e.isDrained = true + return nil, err + } + // Initialize the heap + e.heap = &hotRegionsResponseHeap{} + for _, ch := range results { + result := <-ch + if result.err != nil || len(result.messages.HistoryHotRegion) == 0 { + if result.err != nil { + sctx.GetSessionVars().StmtCtx.AppendWarning(result.err) + } + continue + } + *e.heap = append(*e.heap, result) + } + heap.Init(e.heap) + } + // Merge the results + var finalRows [][]types.Datum + allSchemas := sctx.GetInfoSchema().(infoschema.InfoSchema).AllSchemas() + tz := sctx.GetSessionVars().Location() + tikvStore, ok := sctx.GetStore().(helper.Storage) + if !ok { + return nil, errors.New("Information about hot region can be gotten only when the storage is TiKV") + } + tikvHelper := &helper.Helper{ + Store: tikvStore, + RegionCache: tikvStore.GetRegionCache(), + } + for e.heap.Len() > 0 && len(finalRows) < hotRegionsHistoryBatchSize { + minTimeItem := heap.Pop(e.heap).(hotRegionsResult) + row, err := e.getHotRegionRowWithSchemaInfo(minTimeItem.messages.HistoryHotRegion[0], tikvHelper, allSchemas, tz) + if err != nil { + return nil, err + } + if row != nil { + finalRows = append(finalRows, row) + } + minTimeItem.messages.HistoryHotRegion = minTimeItem.messages.HistoryHotRegion[1:] + // Fetch next message item + if len(minTimeItem.messages.HistoryHotRegion) != 0 { + heap.Push(e.heap, minTimeItem) + } + } + // All streams are drained + e.isDrained = e.heap.Len() == 0 + return finalRows, nil +} + +func (e *hotRegionsHistoryRetriver) getHotRegionRowWithSchemaInfo( + hisHotRegion *HistoryHotRegion, + tikvHelper *helper.Helper, + allSchemas []*model.DBInfo, + tz *time.Location, +) ([]types.Datum, error) { + _, startKey, _ := codec.DecodeBytes(hisHotRegion.StartKey, []byte{}) + _, endKey, _ := codec.DecodeBytes(hisHotRegion.EndKey, []byte{}) + region := &tikv.KeyLocation{StartKey: startKey, EndKey: endKey} + hotRange, err := helper.NewRegionFrameRange(region) + if err != nil { + return nil, err + } + + f := tikvHelper.FindTableIndexOfRegion(allSchemas, hotRange) + // Ignore row without corresponding schema f. + if f == nil { + return nil, nil + } + row := make([]types.Datum, len(infoschema.TableTiDBHotRegionsHistoryCols)) + updateTimestamp := time.Unix(hisHotRegion.UpdateTime/1000, (hisHotRegion.UpdateTime%1000)*int64(time.Millisecond)) + + if updateTimestamp.Location() != tz { + updateTimestamp.In(tz) + } + updateTime := types.NewTime(types.FromGoTime(updateTimestamp), mysql.TypeTimestamp, types.MinFsp) + row[0].SetMysqlTime(updateTime) + row[1].SetString(strings.ToUpper(f.DBName), mysql.DefaultCollationName) + row[2].SetString(strings.ToUpper(f.TableName), mysql.DefaultCollationName) + row[3].SetInt64(f.TableID) + if f.IndexName != "" { + row[4].SetString(strings.ToUpper(f.IndexName), mysql.DefaultCollationName) + row[5].SetInt64(f.IndexID) + } else { + row[4].SetNull() + row[5].SetNull() + } + row[6].SetInt64(int64(hisHotRegion.RegionID)) + row[7].SetInt64(int64(hisHotRegion.StoreID)) + row[8].SetInt64(int64(hisHotRegion.PeerID)) + if hisHotRegion.IsLearner { + row[9].SetInt64(1) + } else { + row[9].SetInt64(0) + } + if hisHotRegion.IsLeader { + row[10].SetInt64(1) + } else { + row[10].SetInt64(0) + } + + row[11].SetString(strings.ToUpper(hisHotRegion.HotRegionType), mysql.DefaultCollationName) + if hisHotRegion.HotDegree != 0 { + row[12].SetInt64(hisHotRegion.HotDegree) + } else { + row[12].SetNull() + } + if hisHotRegion.FlowBytes != 0 { + row[13].SetFloat64(hisHotRegion.FlowBytes) + } else { + row[13].SetNull() + } + if hisHotRegion.KeyRate != 0 { + row[14].SetFloat64(hisHotRegion.KeyRate) + } else { + row[14].SetNull() + } + if hisHotRegion.QueryRate != 0 { + row[15].SetFloat64(hisHotRegion.QueryRate) + } else { + row[15].SetNull() + } + return row, nil +} diff --git a/executor/memtable_reader_test.go b/executor/memtable_reader_test.go index 817741c2edd21..9fa51faaa3737 100644 --- a/executor/memtable_reader_test.go +++ b/executor/memtable_reader_test.go @@ -16,9 +16,13 @@ package executor_test import ( "context" + "crypto/tls" + "encoding/json" "fmt" + "io" "log" "net" + "net/http" "net/http/httptest" "os" "path/filepath" @@ -33,8 +37,11 @@ import ( "github.com/pingcap/kvproto/pkg/diagnosticspb" "github.com/pingcap/sysutil" "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/executor" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/session" + "github.com/pingcap/tidb/store/helper" "github.com/pingcap/tidb/util/pdapi" "github.com/pingcap/tidb/util/testkit" pmodel "github.com/prometheus/common/model" @@ -956,3 +963,441 @@ func (s *testMemTableReaderSuite) TestTiDBClusterLogError(c *C) { c.Assert(err.Error(), Equals, "denied to scan full logs (use `SELECT * FROM cluster_log WHERE message LIKE '%'` explicitly if intentionally)") c.Assert(rs.Close(), IsNil) } + +type mockStoreWithMultiPD struct { + helper.Storage + hosts []string +} + +var hotRegionsResponses = make(map[string]*executor.HistoryHotRegions, 3) + +func (s *mockStoreWithMultiPD) EtcdAddrs() ([]string, error) { return s.hosts, nil } +func (s *mockStoreWithMultiPD) TLSConfig() *tls.Config { panic("not implemented") } +func (s *mockStoreWithMultiPD) StartGCWorker() error { panic("not implemented") } +func (s *mockStoreWithMultiPD) Name() string { return "mockStore" } +func (s *mockStoreWithMultiPD) Describe() string { return "" } + +var _ = SerialSuites(&testHotRegionsHistoryTableSuite{testInfoschemaTableSuiteBase: &testInfoschemaTableSuiteBase{}}) + +type testHotRegionsHistoryTableSuite struct { + *testInfoschemaTableSuiteBase + httpServers []*httptest.Server + startTime time.Time +} + +func (s *testHotRegionsHistoryTableSuite) SetUpSuite(c *C) { + s.testInfoschemaTableSuiteBase.SetUpSuite(c) + store := &mockStoreWithMultiPD{ + s.store.(helper.Storage), + make([]string, 3), + } + // start 3 PD server with hotRegionsServer and store them in s.store + for i := 0; i < 3; i++ { + httpServer, mockAddr := s.setUpMockPDHTTPServer(c) + c.Assert(httpServer, NotNil) + s.httpServers = append(s.httpServers, httpServer) + store.hosts[i] = mockAddr + } + s.store = store + s.startTime = time.Now() +} + +func writeJSONError(w http.ResponseWriter, code int, prefix string, err error) { + type errorResponse struct { + Error string `json:"error"` + } + w.WriteHeader(code) + if err != nil { + prefix += ": " + err.Error() + } + _ = json.NewEncoder(w).Encode(errorResponse{Error: prefix}) +} + +func hisHotRegionsHandler(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Access-Control-Allow-Origin", "*") + data, err := io.ReadAll(r.Body) + if err != nil { + writeJSONError(w, http.StatusInternalServerError, "unable to read req", err) + return + } + r.Body.Close() + req := &executor.HistoryHotRegionsRequest{} + err = json.Unmarshal(data, req) + if err != nil { + writeJSONError(w, http.StatusInternalServerError, "unable to serialize req", err) + return + } + resp := &executor.HistoryHotRegions{} + for _, typ := range req.HotRegionTypes { + resp.HistoryHotRegion = append(resp.HistoryHotRegion, hotRegionsResponses[typ+r.Host].HistoryHotRegion...) + } + w.WriteHeader(http.StatusOK) + jsonResp, err := json.Marshal(resp) + if err != nil { + writeJSONError(w, http.StatusInternalServerError, "unable to marshal resp", err) + return + } + w.Write(jsonResp) +} + +func (s *testHotRegionsHistoryTableSuite) setUpMockPDHTTPServer(c *C) (*httptest.Server, string) { + // mock PD http server + router := mux.NewRouter() + server := httptest.NewServer(router) + mockAddr := strings.TrimPrefix(server.URL, "http://") + // mock PD API + router.Handle(pdapi.Status, fn.Wrap(func() (interface{}, error) { + return struct { + Version string `json:"version"` + GitHash string `json:"git_hash"` + StartTimestamp int64 `json:"start_timestamp"` + }{ + Version: "4.0.0-alpha", + GitHash: "mock-pd-githash", + StartTimestamp: s.startTime.Unix(), + }, nil + })) + // mock hisory hot regions response + router.HandleFunc(pdapi.HotHistory, hisHotRegionsHandler) + return server, mockAddr +} + +func (s *testHotRegionsHistoryTableSuite) TearDownSuite(c *C) { + for _, server := range s.httpServers { + server.Close() + } + s.testInfoschemaTableSuiteBase.TearDownSuite(c) +} + +func (s *testHotRegionsHistoryTableSuite) TestTiDBHotRegionsHistory(c *C) { + var unixTimeMs = func(s string) int64 { + t, err := time.ParseInLocation("2006-01-02 15:04:05", s, time.Local) + c.Assert(err, IsNil) + return t.UnixNano() / int64(time.Millisecond) + } + fullHotRegions := [][]string{ + // mysql table_id = 11, record_id = 1, table_name = TABLES_PRIV + {"2019-10-10 10:10:11", "MYSQL", "TABLES_PRIV", "11", "<nil>", "<nil>", "1", "1", "11111", "0", "1", "READ", "99", "99", "99", "99"}, + {"2019-10-10 10:10:12", "MYSQL", "TABLES_PRIV", "11", "<nil>", "<nil>", "2", "2", "22222", "0", "0", "WRITE", "99", "99", "99", "99"}, + // mysql table_id = 21, record_id = 1, table_name = STATS_META + {"2019-10-10 10:10:13", "MYSQL", "STATS_META", "21", "<nil>", "<nil>", "3", "3", "33333", "0", "1", "READ", "99", "99", "99", "99"}, + {"2019-10-10 10:10:14", "MYSQL", "STATS_META", "21", "<nil>", "<nil>", "4", "4", "44444", "0", "0", "WRITE", "99", "99", "99", "99"}, + // table_id = 131, record_id=1, deleted schema + {"2019-10-10 10:10:15", "UNKONW", "UNKONW", "131", "UNKONW", "<nil>", "5", "5", "55555", "0", "1", "READ", "99", "99", "99", "99"}, + {"2019-10-10 10:10:16", "UNKONW", "UNKONW", "131", "UNKONW", "<nil>", "6", "6", "66666", "0", "0", "WRITE", "99", "99", "99", "99"}, + // mysql table_id = 11, index_id = 1, index_value = 1, table_name = TABLES_PRIV, index_name = PRIMARY + {"2019-10-10 10:10:17", "MYSQL", "TABLES_PRIV", "11", "PRIMARY", "1", "1", "1", "11111", "0", "1", "READ", "99", "99", "99", "99"}, + {"2019-10-10 10:10:18", "MYSQL", "TABLES_PRIV", "11", "PRIMARY", "1", "2", "2", "22222", "0", "0", "WRITE", "99", "99", "99", "99"}, + // mysql table_id = 21 ,index_id = 1, index_value = 1, table_name = STATS_META, index_name = IDX_VER + {"2019-10-10 10:10:19", "MYSQL", "STATS_META", "21", "IDX_VER", "1", "3", "3", "33333", "0", "1", "READ", "99", "99", "99", "99"}, + {"2019-10-10 10:10:20", "MYSQL", "STATS_META", "21", "IDX_VER", "1", "4", "4", "44444", "0", "0", "WRITE", "99", "99", "99", "99"}, + // mysql table_id = 21 ,index_id = 2, index_value = 1, table_name = STATS_META, index_name = TBL + {"2019-10-10 10:10:21", "MYSQL", "STATS_META", "21", "TBL", "2", "5", "5", "55555", "0", "1", "READ", "99", "99", "99", "99"}, + {"2019-10-10 10:10:22", "MYSQL", "STATS_META", "21", "TBL", "2", "6", "6", "66666", "0", "0", "WRITE", "99", "99", "99", "99"}, + // table_id = 131, index_id = 1, index_value = 1, deleted schema + {"2019-10-10 10:10:23", "UNKONW", "UNKONW", "131", "UNKONW", "1", "5", "5", "55555", "0", "1", "READ", "99", "99", "99", "99"}, + {"2019-10-10 10:10:24", "UNKONW", "UNKONW", "131", "UNKONW", "1", "6", "6", "66666", "0", "0", "WRITE", "99", "99", "99", "99"}, + } + + pdResps := []map[string]*executor.HistoryHotRegions{ + { + core.HotRegionTypeRead: { + HistoryHotRegion: []*executor.HistoryHotRegion{ + // mysql table_id = 11, record_id = 1, table_name = TABLES_PRIV + {UpdateTime: unixTimeMs("2019-10-10 10:10:11"), RegionID: 1, StoreID: 1, PeerID: 11111, IsLearner: false, IsLeader: true, HotRegionType: "READ", HotDegree: 99, FlowBytes: 99, KeyRate: 99, QueryRate: 99, + StartKey: []byte{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xb, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfa}, + EndKey: []byte{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xb, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfa}}, + // mysql table_id = 21, record_id = 1, table_name = STATS_META + {UpdateTime: unixTimeMs("2019-10-10 10:10:13"), RegionID: 3, StoreID: 3, PeerID: 33333, IsLearner: false, IsLeader: true, HotRegionType: "READ", HotDegree: 99, FlowBytes: 99, KeyRate: 99, QueryRate: 99, + StartKey: []byte{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x15, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfa}, + EndKey: []byte{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x15, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfa}}, + }, + }, + core.HotRegionTypeWrite: { + HistoryHotRegion: []*executor.HistoryHotRegion{ + // mysql table_id = 11, record_id = 1, table_name = TABLES_PRIV + {UpdateTime: unixTimeMs("2019-10-10 10:10:12"), RegionID: 2, StoreID: 2, PeerID: 22222, IsLearner: false, IsLeader: false, HotRegionType: "WRITE", HotDegree: 99, FlowBytes: 99, KeyRate: 99, QueryRate: 99, + StartKey: []byte{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xb, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfa}, + EndKey: []byte{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xb, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfa}}, + // mysql table_id = 21, record_id = 1, table_name = STATS_META + {UpdateTime: unixTimeMs("2019-10-10 10:10:14"), RegionID: 4, StoreID: 4, PeerID: 44444, IsLearner: false, IsLeader: false, HotRegionType: "WRITE", HotDegree: 99, FlowBytes: 99, KeyRate: 99, QueryRate: 99, + StartKey: []byte{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x15, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfa}, + EndKey: []byte{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x15, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfa}}, + }, + }, + }, + { + core.HotRegionTypeRead: { + HistoryHotRegion: []*executor.HistoryHotRegion{ + // table_id = 131, record_id=1, deleted schema + {UpdateTime: unixTimeMs("2019-10-10 10:10:15"), RegionID: 5, StoreID: 5, PeerID: 55555, IsLearner: false, IsLeader: true, HotRegionType: "READ", HotDegree: 99, FlowBytes: 99, KeyRate: 99, QueryRate: 99, + StartKey: []byte{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x83, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfa}, + EndKey: []byte{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x83, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfa}}, + // mysql table_id = 11, index_id = 1, index_value = 1, table_name = TABLES_PRIV, index_name = PRIMARY + {UpdateTime: unixTimeMs("2019-10-10 10:10:17"), RegionID: 1, StoreID: 1, PeerID: 11111, IsLearner: false, IsLeader: true, HotRegionType: "READ", HotDegree: 99, FlowBytes: 99, KeyRate: 99, QueryRate: 99, + StartKey: []byte{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xb, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfa}, + EndKey: []byte{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xb, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfa}}, + }, + }, + core.HotRegionTypeWrite: { + HistoryHotRegion: []*executor.HistoryHotRegion{ + // table_id = 131, record_id=1, deleted schema + {UpdateTime: unixTimeMs("2019-10-10 10:10:16"), RegionID: 6, StoreID: 6, PeerID: 66666, IsLearner: false, IsLeader: false, HotRegionType: "WRITE", HotDegree: 99, FlowBytes: 99, KeyRate: 99, QueryRate: 99, + StartKey: []byte{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x83, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfa}, + EndKey: []byte{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x83, 0x5f, 0x72, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfa}}, + // mysql table_id = 11, index_id = 1, index_value = 1, table_name = TABLES_PRIV, index_name = PRIMARY + {UpdateTime: unixTimeMs("2019-10-10 10:10:18"), RegionID: 2, StoreID: 2, PeerID: 22222, IsLearner: false, IsLeader: false, HotRegionType: "WRITE", HotDegree: 99, FlowBytes: 99, KeyRate: 99, QueryRate: 99, + StartKey: []byte{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xb, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfa}, + EndKey: []byte{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xb, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfa}}, + }, + }, + }, + { + core.HotRegionTypeRead: { + HistoryHotRegion: []*executor.HistoryHotRegion{ + // mysql table_id = 21 ,index_id = 1, index_value = 1, table_name = STATS_META, index_name = IDX_VER + {UpdateTime: unixTimeMs("2019-10-10 10:10:19"), RegionID: 3, StoreID: 3, PeerID: 33333, IsLearner: false, IsLeader: true, HotRegionType: "READ", HotDegree: 99, FlowBytes: 99, KeyRate: 99, QueryRate: 99, + StartKey: []byte{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x15, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfa}, + EndKey: []byte{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x15, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfa}}, + // mysql table_id = 21 ,index_id = 2, index_value = 1, table_name = STATS_META, index_name = TBL + {UpdateTime: unixTimeMs("2019-10-10 10:10:21"), RegionID: 5, StoreID: 5, PeerID: 55555, IsLearner: false, IsLeader: true, HotRegionType: "READ", HotDegree: 99, FlowBytes: 99, KeyRate: 99, QueryRate: 99, + StartKey: []byte{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x15, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfa}, + EndKey: []byte{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x15, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfa}}, + // table_id = 131, index_id = 1, index_value = 1, deleted schema + {UpdateTime: unixTimeMs("2019-10-10 10:10:23"), RegionID: 5, StoreID: 5, PeerID: 55555, IsLeader: true, HotRegionType: "READ", HotDegree: 99, FlowBytes: 99, KeyRate: 99, QueryRate: 99, + StartKey: []byte{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x83, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfa}, + EndKey: []byte{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x83, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfa}}, + }, + }, + core.HotRegionTypeWrite: { + HistoryHotRegion: []*executor.HistoryHotRegion{ + // mysql table_id = 21 ,index_id = 1, index_value = 1, table_name = STATS_META, index_name = IDX_VER + {UpdateTime: unixTimeMs("2019-10-10 10:10:20"), RegionID: 4, StoreID: 4, PeerID: 44444, IsLearner: false, IsLeader: false, HotRegionType: "WRITE", HotDegree: 99, FlowBytes: 99, KeyRate: 99, QueryRate: 99, + StartKey: []byte{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x15, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfa}, + EndKey: []byte{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x15, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfa}}, + // mysql table_id = 21 ,index_id = 2, index_value = 1, table_name = STATS_META, index_name = TBL + {UpdateTime: unixTimeMs("2019-10-10 10:10:22"), RegionID: 6, StoreID: 6, PeerID: 66666, IsLearner: false, IsLeader: false, HotRegionType: "WRITE", HotDegree: 99, FlowBytes: 99, KeyRate: 99, QueryRate: 99, + StartKey: []byte{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x15, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfa}, + EndKey: []byte{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x15, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfa}}, + // table_id = 131, index_id = 1, index_value = 1, deleted schema + {UpdateTime: unixTimeMs("2019-10-10 10:10:24"), RegionID: 6, StoreID: 6, PeerID: 66666, IsLearner: false, IsLeader: false, HotRegionType: "WRITE", HotDegree: 99, FlowBytes: 99, KeyRate: 99, QueryRate: 99, + StartKey: []byte{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x83, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfa}, + EndKey: []byte{0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x83, 0x5f, 0x69, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfa}}, + }, + }, + }, + } + + var cases = []struct { + conditions []string + reqCount int32 + expected [][]string + }{ + { + conditions: []string{ + "update_time>='2019-10-10 10:10:10'", + "update_time<='2019-10-11 10:10:10'", + }, // time filtered by PD, assume response suit time range, and ignore deleted schemas + expected: [][]string{ + fullHotRegions[0], fullHotRegions[1], fullHotRegions[2], + fullHotRegions[3], + fullHotRegions[6], fullHotRegions[7], fullHotRegions[8], + fullHotRegions[9], fullHotRegions[10], fullHotRegions[11], + }, + }, + { + conditions: []string{ + "update_time>=TIMESTAMP('2019-10-10 10:10:10')", + "update_time<=TIMESTAMP('2019-10-11 10:10:10')", + }, // test support of timestamp + expected: [][]string{ + fullHotRegions[0], fullHotRegions[1], fullHotRegions[2], + fullHotRegions[3], + fullHotRegions[6], fullHotRegions[7], fullHotRegions[8], + fullHotRegions[9], fullHotRegions[10], fullHotRegions[11], + }, + }, + { + conditions: []string{ + "update_time>='2019-10-10 10:10:10'", + "update_time<='2019-10-11 10:10:10'", + "table_id=11", + }, + expected: [][]string{ + fullHotRegions[0], fullHotRegions[1], fullHotRegions[6], fullHotRegions[7], + }, + }, + { + conditions: []string{ + "update_time>='2019-10-10 10:10:10'", + "update_time<='2019-10-11 10:10:10'", + "table_name='TABLES_PRIV'", + }, + expected: [][]string{ + fullHotRegions[0], fullHotRegions[1], fullHotRegions[6], fullHotRegions[7], + }, + }, + { + conditions: []string{ + "update_time>='2019-10-10 10:10:10'", + "update_time<='2019-10-11 10:10:10'", + "table_id=21", + "index_id=1", + }, + expected: [][]string{ + fullHotRegions[8], fullHotRegions[9], + }, + }, + { + conditions: []string{ + "update_time>='2019-10-10 10:10:10'", + "update_time<='2019-10-11 10:10:10'", + "table_id=21", + "index_id=1", + "table_name='TABLES_PRIV'", + }, // table_id != table_name -> nil + expected: [][]string{}, + }, + { + conditions: []string{ + "update_time>='2019-10-10 10:10:10'", + "update_time<='2019-10-11 10:10:10'", + "table_id=21", + "index_id=1", + "table_name='STATS_META'", + }, // table_id = table_name + expected: [][]string{ + fullHotRegions[8], fullHotRegions[9], + }, + }, + { + conditions: []string{ + "update_time>='2019-10-10 10:10:10'", + "update_time<='2019-10-11 10:10:10'", + "table_id=21", + "index_id=1", + "index_name='UNKONW'", + }, // index_id != index_name -> nil + expected: [][]string{}, + }, + { + conditions: []string{ + "update_time>='2019-10-10 10:10:10'", + "update_time<='2019-10-11 10:10:10'", + "table_id=21", + "index_id=1", + "index_name='IDX_VER'", + }, // index_id = index_name + expected: [][]string{ + fullHotRegions[8], fullHotRegions[9], + }, + }, + { + conditions: []string{ + "update_time>='2019-10-10 10:10:10'", + "update_time<='2019-10-11 10:10:10'", + "index_id=1", + "index_name='IDX_VER'", + "table_id>=21", // unpushed down predicates 21>=21 + }, + expected: [][]string{ + fullHotRegions[8], fullHotRegions[9], + }, + }, + { + conditions: []string{ + "update_time>='2019-10-10 10:10:10'", + "update_time<='2019-10-11 10:10:10'", + "index_id=1", + "index_name='IDX_VER'", + "table_id>21", // unpushed down predicates + }, // 21!>21 -> nil + expected: [][]string{}, + }, + { + conditions: []string{ + "update_time>='2019-10-10 10:10:10'", + "update_time<='2019-10-11 10:10:10'", + "index_id=1", + "index_name='IDX_VER'", + "table_id>=21", // unpushed down predicates + "db_name='MYSQL'", + }, + expected: [][]string{ + fullHotRegions[8], fullHotRegions[9], + }, + }, + { + conditions: []string{ + "update_time>='2019-10-10 10:10:10'", + "update_time<='2019-10-11 10:10:10'", + "index_id=1", + "index_name='IDX_VER'", + "table_id>=21", // unpushed down predicates + "db_name='MYSQL'", + "peer_id>=33334", + }, + expected: [][]string{ + fullHotRegions[9], + }, + }, + { + conditions: []string{ + "update_time>='2019-10-10 10:10:10'", + "update_time<='2019-10-11 10:10:10'", + "index_id=1", + "index_name='IDX_VER'", + "table_id>=21", // unpushed down predicates + "db_name='UNKNOW'", + }, + expected: [][]string{}, + }, + } + + // mock http resp + store := s.store.(*mockStoreWithMultiPD) + for i, resp := range pdResps { + for k, v := range resp { + hotRegionsResponses[k+store.hosts[i]] = v + } + } + tk := testkit.NewTestKit(c, s.store) + for _, cas := range cases { + sql := "select * from information_schema.tidb_hot_regions_history" + if len(cas.conditions) > 0 { + sql = fmt.Sprintf("%s where %s", sql, strings.Join(cas.conditions, " and ")) + } + result := tk.MustQuery(sql) + warnings := tk.Se.GetSessionVars().StmtCtx.GetWarnings() + c.Assert(len(warnings), Equals, 0, Commentf("unexpected warnigns: %+v, sql: %s", warnings, sql)) + var expected []string + for _, row := range cas.expected { + expectedRow := row + expected = append(expected, strings.Join(expectedRow, " ")) + } + result.Check(testkit.Rows(expected...)) + } +} + +func (s *testHotRegionsHistoryTableSuite) TestTiDBHotRegionsHistoryError(c *C) { + tk := testkit.NewTestKit(c, s.store) + fpName := "github.com/pingcap/tidb/executor/mockTiDBHotRegionsHistory" + c.Assert(failpoint.Enable(fpName, `return("")`), IsNil) + defer func() { c.Assert(failpoint.Disable(fpName), IsNil) }() + + // Test without start time error + rs, err := tk.Exec("select * from information_schema.tidb_hot_regions_history") + c.Assert(err, IsNil) + _, err = session.ResultSetToStringSlice(context.Background(), tk.Se, rs) + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "denied to scan hot regions, please specified the start time, such as `update_time > '2020-01-01 00:00:00'`") + c.Assert(rs.Close(), IsNil) + + // Test without end time error. + rs, err = tk.Exec("select * from information_schema.tidb_hot_regions_history where update_time>='2019/08/26 06:18:13.011'") + c.Assert(err, IsNil) + _, err = session.ResultSetToStringSlice(context.Background(), tk.Se, rs) + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "denied to scan hot regions, please specified the end time, such as `update_time < '2020-01-01 00:00:00'`") + c.Assert(rs.Close(), IsNil) +} diff --git a/executor/merge_join.go b/executor/merge_join.go index a28cb93c4648d..7ba07335af865 100644 --- a/executor/merge_join.go +++ b/executor/merge_join.go @@ -53,6 +53,7 @@ type MergeJoinExec struct { } type mergeJoinTable struct { + inited bool isInner bool childIndex int joinKeys []*expression.Column @@ -108,10 +109,14 @@ func (t *mergeJoinTable) init(exec *MergeJoinExec) { } t.memTracker.AttachTo(exec.memTracker) + t.inited = true t.memTracker.Consume(t.childChunk.MemoryUsage()) } func (t *mergeJoinTable) finish() error { + if !t.inited { + return nil + } t.memTracker.Consume(-t.childChunk.MemoryUsage()) if t.isInner { diff --git a/executor/merge_join_test.go b/executor/merge_join_test.go index 9cf56fe1716c8..4d616513963e4 100644 --- a/executor/merge_join_test.go +++ b/executor/merge_join_test.go @@ -848,7 +848,6 @@ func (s *testSuiteJoin3) TestVectorizedShuffleMergeJoin(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("set @@session.tidb_merge_join_concurrency = 4;") tk.MustExec("use test") - tk.MustExec("use test") existTableMap := make(map[string]struct{}) runTest := func(ts1, ts2 []int) { getTable := func(prefix string, ts []int) string { diff --git a/executor/oomtest/oom_serial_test.go b/executor/oomtest/oom_test.go similarity index 89% rename from executor/oomtest/oom_serial_test.go rename to executor/oomtest/oom_test.go index bf70e0814cb69..d592456bb61cd 100644 --- a/executor/oomtest/oom_serial_test.go +++ b/executor/oomtest/oom_test.go @@ -56,13 +56,15 @@ func TestMemTracker4UpdateExec(t *testing.T) { tk.MustExec("create table t_MemTracker4UpdateExec (id int, a int, b int, index idx_a(`a`))") log.SetLevel(zap.InfoLevel) - oom.tracker = "" + + oom.SetTracker("") + tk.MustExec("insert into t_MemTracker4UpdateExec values (1,1,1), (2,2,2), (3,3,3)") - require.Equal(t, "schemaLeaseChecker is not set for this transaction", oom.tracker) + require.Equal(t, "schemaLeaseChecker is not set for this transaction", oom.GetTracker()) tk.Session().GetSessionVars().MemQuotaQuery = 244 tk.MustExec("update t_MemTracker4UpdateExec set a = 4") - require.Equal(t, "expensive_query during bootstrap phase", oom.tracker) + require.Equal(t, "expensive_query during bootstrap phase", oom.GetTracker()) } func TestMemTracker4InsertAndReplaceExec(t *testing.T) { @@ -77,54 +79,62 @@ func TestMemTracker4InsertAndReplaceExec(t *testing.T) { tk.MustExec("create table t_MemTracker4InsertAndReplaceExec (id int, a int, b int, index idx_a(`a`))") log.SetLevel(zap.InfoLevel) - oom.tracker = "" + + oom.SetTracker("") + tk.MustExec("insert into t_MemTracker4InsertAndReplaceExec values (1,1,1), (2,2,2), (3,3,3)") - require.Equal(t, "schemaLeaseChecker is not set for this transaction", oom.tracker) + require.Equal(t, "schemaLeaseChecker is not set for this transaction", oom.GetTracker()) tk.Session().GetSessionVars().MemQuotaQuery = 1 tk.MustExec("insert into t_MemTracker4InsertAndReplaceExec values (1,1,1), (2,2,2), (3,3,3)") - require.Equal(t, "expensive_query during bootstrap phase", oom.tracker) + require.Equal(t, "expensive_query during bootstrap phase", oom.GetTracker()) tk.Session().GetSessionVars().MemQuotaQuery = -1 - oom.tracker = "" + oom.SetTracker("") + tk.MustExec("replace into t_MemTracker4InsertAndReplaceExec values (1,1,1), (2,2,2), (3,3,3)") - require.Equal(t, "", oom.tracker) + require.Equal(t, "", oom.GetTracker()) tk.Session().GetSessionVars().MemQuotaQuery = 1 tk.MustExec("replace into t_MemTracker4InsertAndReplaceExec values (1,1,1), (2,2,2), (3,3,3)") - require.Equal(t, "expensive_query during bootstrap phase", oom.tracker) + require.Equal(t, "expensive_query during bootstrap phase", oom.GetTracker()) tk.Session().GetSessionVars().MemQuotaQuery = -1 - oom.tracker = "" + oom.SetTracker("") + tk.MustExec("insert into t_MemTracker4InsertAndReplaceExec select * from t") - require.Equal(t, "", oom.tracker) + require.Equal(t, "", oom.GetTracker()) tk.Session().GetSessionVars().MemQuotaQuery = 1 tk.MustExec("insert into t_MemTracker4InsertAndReplaceExec select * from t") - require.Equal(t, "expensive_query during bootstrap phase", oom.tracker) + require.Equal(t, "expensive_query during bootstrap phase", oom.GetTracker()) tk.Session().GetSessionVars().MemQuotaQuery = -1 - oom.tracker = "" + oom.SetTracker("") + tk.MustExec("replace into t_MemTracker4InsertAndReplaceExec select * from t") - require.Equal(t, "", oom.tracker) + require.Equal(t, "", oom.GetTracker()) tk.Session().GetSessionVars().MemQuotaQuery = 1 tk.MustExec("replace into t_MemTracker4InsertAndReplaceExec select * from t") - require.Equal(t, "expensive_query during bootstrap phase", oom.tracker) + require.Equal(t, "expensive_query during bootstrap phase", oom.GetTracker()) tk.Session().GetSessionVars().MemQuotaQuery = -1 tk.Session().GetSessionVars().DMLBatchSize = 1 tk.Session().GetSessionVars().BatchInsert = true - oom.tracker = "" + + oom.SetTracker("") + tk.MustExec("insert into t_MemTracker4InsertAndReplaceExec values (1,1,1), (2,2,2), (3,3,3)") - require.Equal(t, "", oom.tracker) + require.Equal(t, "", oom.GetTracker()) tk.Session().GetSessionVars().MemQuotaQuery = 1 tk.MustExec("insert into t_MemTracker4InsertAndReplaceExec values (1,1,1), (2,2,2), (3,3,3)") - require.Equal(t, "expensive_query during bootstrap phase", oom.tracker) + require.Equal(t, "expensive_query during bootstrap phase", oom.GetTracker()) tk.Session().GetSessionVars().MemQuotaQuery = -1 - oom.tracker = "" + oom.SetTracker("") + tk.MustExec("replace into t_MemTracker4InsertAndReplaceExec values (1,1,1), (2,2,2), (3,3,3)") - require.Equal(t, "", oom.tracker) + require.Equal(t, "", oom.GetTracker()) tk.Session().GetSessionVars().MemQuotaQuery = 1 tk.MustExec("replace into t_MemTracker4InsertAndReplaceExec values (1,1,1), (2,2,2), (3,3,3)") - require.Equal(t, "expensive_query during bootstrap phase", oom.tracker) + require.Equal(t, "expensive_query during bootstrap phase", oom.GetTracker()) tk.Session().GetSessionVars().MemQuotaQuery = -1 } @@ -140,27 +150,33 @@ func TestMemTracker4DeleteExec(t *testing.T) { // delete from single table log.SetLevel(zap.InfoLevel) tk.MustExec("insert into MemTracker4DeleteExec1 values(1,1,1), (2,2,2), (3,3,3), (4,4,4), (5,5,5)") - oom.tracker = "" + + oom.SetTracker("") + tk.MustExec("delete from MemTracker4DeleteExec1") - require.Equal(t, "", oom.tracker) + require.Equal(t, "", oom.GetTracker()) tk.MustExec("insert into MemTracker4DeleteExec1 values (1,1,1), (2,2,2), (3,3,3)") tk.Session().GetSessionVars().MemQuotaQuery = 1 tk.MustExec("delete from MemTracker4DeleteExec1") - require.Equal(t, "expensive_query during bootstrap phase", oom.tracker) + require.Equal(t, "expensive_query during bootstrap phase", oom.GetTracker()) // delete from multiple table tk.Session().GetSessionVars().MemQuotaQuery = 100000 tk.MustExec("insert into MemTracker4DeleteExec1 values(1,1,1)") tk.MustExec("insert into MemTracker4DeleteExec2 values(1,1,1)") - oom.tracker = "" + + oom.SetTracker("") + tk.MustExec("delete MemTracker4DeleteExec1, MemTracker4DeleteExec2 from MemTracker4DeleteExec1 join MemTracker4DeleteExec2 on MemTracker4DeleteExec1.a=MemTracker4DeleteExec2.a") - require.Equal(t, "", oom.tracker) + require.Equal(t, "", oom.GetTracker()) tk.MustExec("insert into MemTracker4DeleteExec1 values(1,1,1)") tk.MustExec("insert into MemTracker4DeleteExec2 values(1,1,1)") - oom.tracker = "" + + oom.SetTracker("") + tk.Session().GetSessionVars().MemQuotaQuery = 10000 tk.MustExec("delete MemTracker4DeleteExec1, MemTracker4DeleteExec2 from MemTracker4DeleteExec1 join MemTracker4DeleteExec2 on MemTracker4DeleteExec1.a=MemTracker4DeleteExec2.a") - require.Equal(t, "memory exceeds quota, rateLimitAction delegate to fallback action", oom.tracker) + require.Equal(t, "memory exceeds quota, rateLimitAction delegate to fallback action", oom.GetTracker()) } var oom *oomCapture @@ -179,6 +195,18 @@ type oomCapture struct { mu sync.Mutex } +func (h *oomCapture) SetTracker(tracker string) { + h.mu.Lock() + defer h.mu.Unlock() + h.tracker = tracker +} + +func (h *oomCapture) GetTracker() string { + h.mu.Lock() + defer h.mu.Unlock() + return h.tracker +} + func (h *oomCapture) Write(entry zapcore.Entry, fields []zapcore.Field) error { if entry.Message == "memory exceeds quota" { err, _ := fields[0].Interface.(error) diff --git a/executor/partition_table_test.go b/executor/partition_table_test.go index e742e3a057e79..89e4311aaee09 100644 --- a/executor/partition_table_test.go +++ b/executor/partition_table_test.go @@ -21,6 +21,7 @@ import ( "time" . "github.com/pingcap/check" + "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/sessionctx/variable" @@ -413,7 +414,7 @@ func (s *partitionTableSuite) TestBatchGetandPointGetwithHashPartition(c *C) { // select a from t where a={x}; // the result is {x} x := rand.Intn(100) + 1 queryHash := fmt.Sprintf("select a from thash where a=%v", x) - queryRegular := fmt.Sprintf("select a from thash where a=%v", x) + queryRegular := fmt.Sprintf("select a from tregular where a=%v", x) c.Assert(tk.HasPlan(queryHash, "Point_Get"), IsTrue) // check if PointGet is used tk.MustQuery(queryHash).Check(tk.MustQuery(queryRegular).Rows()) } @@ -1726,6 +1727,36 @@ func (s *partitionTableSuite) TestAddDropPartitions(c *C) { tk.MustPartition(`select * from t where a < 20`, "p1,p2,p3").Sort().Check(testkit.Rows("12", "15", "7")) } +func (s *partitionTableSuite) TestMPPQueryExplainInfo(c *C) { + if israce.RaceEnabled { + c.Skip("exhaustive types test, skip race test") + } + + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("create database tiflash_partition_test") + tk.MustExec("use tiflash_partition_test") + tk.MustExec("set @@tidb_partition_prune_mode = 'dynamic'") + + tk.MustExec(`create table t(a int) partition by range(a) ( + partition p0 values less than (5), + partition p1 values less than (10), + partition p2 values less than (15))`) + tb := testGetTableByName(c, tk.Se, "tiflash_partition_test", "t") + for _, partition := range tb.Meta().GetPartitionInfo().Definitions { + err := domain.GetDomain(tk.Se).DDL().UpdateTableReplicaInfo(tk.Se, partition.ID, true) + c.Assert(err, IsNil) + } + err := domain.GetDomain(tk.Se).DDL().UpdateTableReplicaInfo(tk.Se, tb.Meta().ID, true) + c.Assert(err, IsNil) + tk.MustExec(`insert into t values (2), (7), (12)`) + tk.MustExec("set tidb_enforce_mpp=1") + tk.MustPartition(`select * from t where a < 3`, "p0").Sort().Check(testkit.Rows("2")) + tk.MustPartition(`select * from t where a < 8`, "p0,p1").Sort().Check(testkit.Rows("2", "7")) + tk.MustPartition(`select * from t where a < 20`, "all").Sort().Check(testkit.Rows("12", "2", "7")) + tk.MustPartition(`select * from t where a < 5 union all select * from t where a > 10`, "p0").Sort().Check(testkit.Rows("12", "2")) + tk.MustPartition(`select * from t where a < 5 union all select * from t where a > 10`, "p2").Sort().Check(testkit.Rows("12", "2")) +} + func (s *partitionTableSuite) PartitionPruningInTransaction(c *C) { if israce.RaceEnabled { c.Skip("exhaustive types test, skip race test") @@ -2881,7 +2912,7 @@ type testOutput struct { func (s *testSuiteWithData) verifyPartitionResult(tk *testkit.TestKit, input []string, output []testOutput) { for i, tt := range input { - var isSelect bool = false + var isSelect = false if strings.HasPrefix(strings.ToLower(tt), "select ") { isSelect = true } diff --git a/executor/pipelined_window.go b/executor/pipelined_window.go index 8e120376402be..7e8f6a0ed5c5e 100644 --- a/executor/pipelined_window.go +++ b/executor/pipelined_window.go @@ -179,7 +179,7 @@ func (e *PipelinedWindowExec) getRowsInPartition(ctx context.Context) (err error var drained, samePartition bool drained, err = e.fetchChild(ctx) if err != nil { - err = errors.Trace(err) + return errors.Trace(err) } // we return immediately to use a combination of true newPartition but 0 in e.rowToConsume to indicate the data source is drained, if drained { diff --git a/executor/plan_replayer.go b/executor/plan_replayer.go index 17af9558f38d4..ab3261e6ca6c0 100644 --- a/executor/plan_replayer.go +++ b/executor/plan_replayer.go @@ -16,163 +16,630 @@ package executor import ( "archive/zip" + "bytes" "context" - "crypto/md5" // #nosec G501 - "encoding/hex" + "crypto/rand" + "encoding/base64" + "encoding/json" "fmt" - "math/rand" "os" + "path/filepath" + "strings" "time" + "github.com/BurntSushi/toml" "github.com/pingcap/errors" + "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/statistics/handle" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/printer" + "github.com/pingcap/tidb/util/sqlexec" + "go.uber.org/zap" ) -const replayerPath string = "/tmp/replayer" - -// TTL of plan replayer files -const remainedInterval float64 = 3 - -// PlanReplayerInfo saves the information of plan replayer operation. -type PlanReplayerInfo interface { - // Process dose the export/import work for reproducing sql queries. - Process() (string, error) -} +var _ Executor = &PlanReplayerSingleExec{} +var _ Executor = &PlanReplayerLoadExec{} // PlanReplayerSingleExec represents a plan replayer executor. type PlanReplayerSingleExec struct { baseExecutor - info *PlanReplayerSingleInfo -} - -// PlanReplayerSingleInfo saves the information of plan replayer operation. -type PlanReplayerSingleInfo struct { ExecStmt ast.StmtNode Analyze bool - Load bool - File string - Ctx sessionctx.Context -} -type fileInfo struct { - StartTime time.Time - Token [16]byte + endFlag bool } -type fileList struct { - FileInfo map[string]fileInfo - TokenMap map[[16]byte]string +type tableNamePair struct { + DBName string + TableName string } -// planReplayerVarKeyType is a dummy type to avoid naming collision in context. -type planReplayerVarKeyType int - -// String defines a Stringer function for debugging and pretty printing. -func (k planReplayerVarKeyType) String() string { - return "plan_replayer_var" +type tableNameExtractor struct { + curDB string + names map[tableNamePair]struct{} } -// planReplayerFileListType is a dummy type to avoid naming collision in context. -type planReplayerFileListType int - -// String defines a Stringer function for debugging and pretty printing. -func (k planReplayerFileListType) String() string { - return "plan_replayer_file_list" +func (tne *tableNameExtractor) Enter(in ast.Node) (ast.Node, bool) { + if _, ok := in.(*ast.TableName); ok { + return in, true + } + return in, false } -// PlanReplayerVarKey is a variable key for plan replayer. -const PlanReplayerVarKey planReplayerVarKeyType = 0 - -// PlanReplayerFileList is a variable key for plan replayer's file list. -const PlanReplayerFileList planReplayerFileListType = 0 +func (tne *tableNameExtractor) Leave(in ast.Node) (ast.Node, bool) { + if t, ok := in.(*ast.TableName); ok { + tp := tableNamePair{DBName: t.Schema.L, TableName: t.Name.L} + if tp.DBName == "" { + tp.DBName = tne.curDB + } + if _, ok := tne.names[tp]; !ok { + tne.names[tp] = struct{}{} + } + } + return in, true +} // Next implements the Executor Next interface. func (e *PlanReplayerSingleExec) Next(ctx context.Context, req *chunk.Chunk) error { req.GrowAndReset(e.maxChunkSize) - if e.info.ExecStmt == nil { + if e.endFlag { + return nil + } + if e.ExecStmt == nil { return errors.New("plan replayer: sql is empty") } - val := e.ctx.Value(PlanReplayerVarKey) - if val != nil { - e.ctx.SetValue(PlanReplayerVarKey, nil) - return errors.New("plan replayer: previous plan replayer option isn't closed normally") + res, err := e.dumpSingle(domain.GetPlanReplayerDirName()) + if err != nil { + return err } - e.ctx.SetValue(PlanReplayerVarKey, e.info) + req.AppendString(0, res) + e.endFlag = true return nil } -// Close implements the Executor Close interface. -func (e *PlanReplayerSingleExec) Close() error { +// dumpSingle will dump the information about a single sql. +// The files will be organized into the following format: +// |-meta.txt +// |-schema.sql +// |-stats +// | |-stats1.json +// | |-stats2.json +// | |-.... +// |-config.toml +// |-variables.toml +// |-bindings.sql +// |-sqls.sql +// |_explain +// |-explain.txt +// +func (e *PlanReplayerSingleExec) dumpSingle(path string) (string, error) { + // Create path + err := os.MkdirAll(path, os.ModePerm) + if err != nil { + return "", errors.AddStack(err) + } + + // Generate key and create zip file + time := time.Now().UnixNano() + b := make([]byte, 16) + _, err = rand.Read(b) + if err != nil { + return "", err + } + key := base64.URLEncoding.EncodeToString(b) + fileName := fmt.Sprintf("replayer_single_%v_%v.zip", key, time) + zf, err := os.Create(filepath.Join(path, fileName)) + if err != nil { + return "", errors.AddStack(err) + } + + // Create zip writer + zw := zip.NewWriter(zf) + defer func() { + err := zw.Close() + if err != nil { + logutil.BgLogger().Warn("Closing zip writer failed", zap.Error(err)) + } + err = zf.Close() + if err != nil { + logutil.BgLogger().Warn("Closing zip file failed", zap.Error(err)) + } + }() + + // Dump config + if err = dumpConfig(zw); err != nil { + return "", err + } + + // Dump meta + if err = dumpMeta(zw); err != nil { + return "", err + } + + // Retrieve current DB + sessionVars := e.ctx.GetSessionVars() + dbName := model.NewCIStr(sessionVars.CurrentDB) + do := domain.GetDomain(e.ctx) + + // Retrieve all tables + pairs, err := extractTableNames(e.ExecStmt, dbName.L) + if err != nil { + return "", errors.AddStack(errors.New(fmt.Sprintf("plan replayer: invalid SQL text, err: %v", err))) + } + + // Dump Schema + if err = dumpSchemas(e.ctx, zw, pairs); err != nil { + return "", err + } + + // Dump stats + if err = dumpStats(zw, pairs, do); err != nil { + return "", err + } + + // Dump variables + if err = dumpVariables(e.ctx, zw); err != nil { + return "", err + } + + // Dump sql + sql, err := zw.Create("sqls.sql") + if err != nil { + return "", nil + } + _, err = sql.Write([]byte(e.ExecStmt.Text())) + if err != nil { + return "", err + } + + // Dump session bindings + if err = dumpSessionBindings(e.ctx, zw); err != nil { + return "", err + } + + // Dump global bindings + if err = dumpGlobalBindings(e.ctx, zw); err != nil { + return "", err + } + + // Dump explain + if err = dumpExplain(e.ctx, zw, e.ExecStmt.Text(), e.Analyze); err != nil { + return "", err + } + + return fileName, nil +} + +func dumpConfig(zw *zip.Writer) error { + cf, err := zw.Create("config.toml") + if err != nil { + return errors.AddStack(err) + } + if err := toml.NewEncoder(cf).Encode(config.GetGlobalConfig()); err != nil { + return errors.AddStack(err) + } return nil } -// Open implements the Executor Open interface. -func (e *PlanReplayerSingleExec) Open(ctx context.Context) error { +func dumpMeta(zw *zip.Writer) error { + mt, err := zw.Create("meta.txt") + if err != nil { + return errors.AddStack(err) + } + _, err = mt.Write([]byte(printer.GetTiDBInfo())) + if err != nil { + return errors.AddStack(err) + } return nil } -// Process dose the export/import work for reproducing sql queries. -func (e *PlanReplayerSingleInfo) Process() (string, error) { - // TODO: plan replayer load will be developed later - if e.Load { - return "", nil +func dumpSchemas(ctx sessionctx.Context, zw *zip.Writer, pairs map[tableNamePair]struct{}) error { + for pair := range pairs { + err := getShowCreateTable(pair, zw, ctx) + if err != nil { + return err + } } - return e.dumpSingle() + return nil } -func (e *PlanReplayerSingleInfo) dumpSingle() (string, error) { - // Create path - err := os.MkdirAll(replayerPath, os.ModePerm) +func dumpStats(zw *zip.Writer, pairs map[tableNamePair]struct{}, do *domain.Domain) error { + for pair := range pairs { + jsonTbl, err := getStatsForTable(do, pair) + if err != nil { + return err + } + statsFw, err := zw.Create(fmt.Sprintf("stats/%v.%v.json", pair.DBName, pair.TableName)) + if err != nil { + return errors.AddStack(err) + } + data, err := json.Marshal(jsonTbl) + if err != nil { + return errors.AddStack(err) + } + _, err = statsFw.Write(data) + if err != nil { + return errors.AddStack(err) + } + } + return nil +} + +func dumpVariables(ctx sessionctx.Context, zw *zip.Writer) error { + varMap := make(map[string]string) + recordSets, err := ctx.(sqlexec.SQLExecutor).Execute(context.Background(), "show variables") if err != nil { - return "", errors.New("plan replayer: cannot create plan replayer path") + return err } + sRows, err := resultSetToStringSlice(context.Background(), recordSets[0]) + if err != nil { + return err + } + vf, err := zw.Create("variables.toml") + if err != nil { + return errors.AddStack(err) + } + for _, row := range sRows { + varMap[row[0]] = row[1] + } + if err := toml.NewEncoder(vf).Encode(varMap); err != nil { + return errors.AddStack(err) + } + if len(recordSets) > 0 { + if err := recordSets[0].Close(); err != nil { + return err + } + } + return nil +} - // Create zip file - startTime := time.Now() - fileName := fmt.Sprintf("replayer_single_%v.zip", startTime.UnixNano()) - zf, err := os.Create(replayerPath + "/" + fileName) +func dumpSessionBindings(ctx sessionctx.Context, zw *zip.Writer) error { + recordSets, err := ctx.(sqlexec.SQLExecutor).Execute(context.Background(), "show bindings") + if err != nil { + return err + } + sRows, err := resultSetToStringSlice(context.Background(), recordSets[0]) if err != nil { - return "", errors.New("plan replayer: cannot create zip file") + return err + } + bf, err := zw.Create("session_bindings.sql") + if err != nil { + return errors.AddStack(err) + } + for _, row := range sRows { + fmt.Fprintf(bf, "%s\n", strings.Join(row, "\t")) + } + if len(recordSets) > 0 { + if err := recordSets[0].Close(); err != nil { + return err + } + } + return nil +} + +func dumpGlobalBindings(ctx sessionctx.Context, zw *zip.Writer) error { + recordSets, err := ctx.(sqlexec.SQLExecutor).Execute(context.Background(), "show global bindings") + if err != nil { + return err + } + sRows, err := resultSetToStringSlice(context.Background(), recordSets[0]) + if err != nil { + return err + } + bf, err := zw.Create("global_bindings.sql") + if err != nil { + return errors.AddStack(err) + } + for _, row := range sRows { + fmt.Fprintf(bf, "%s\n", strings.Join(row, "\t")) + } + if len(recordSets) > 0 { + if err := recordSets[0].Close(); err != nil { + return err + } } - val := e.Ctx.Value(PlanReplayerFileList) - if val == nil { - e.Ctx.SetValue(PlanReplayerFileList, fileList{FileInfo: make(map[string]fileInfo), TokenMap: make(map[[16]byte]string)}) + return nil +} + +func dumpExplain(ctx sessionctx.Context, zw *zip.Writer, sql string, isAnalyze bool) error { + var recordSets []sqlexec.RecordSet + var err error + if isAnalyze { + // Explain analyze + recordSets, err = ctx.(sqlexec.SQLExecutor).Execute(context.Background(), fmt.Sprintf("explain analyze %s", sql)) + if err != nil { + return err + } } else { - // Clean outdated files - Flist := val.(fileList).FileInfo - TList := val.(fileList).TokenMap - for k, v := range Flist { - if time.Since(v.StartTime).Minutes() > remainedInterval { - err := os.Remove(replayerPath + "/" + k) + // Explain + recordSets, err = ctx.(sqlexec.SQLExecutor).Execute(context.Background(), fmt.Sprintf("explain %s", sql)) + if err != nil { + return err + } + } + sRows, err := resultSetToStringSlice(context.Background(), recordSets[0]) + if err != nil { + return err + } + fw, err := zw.Create("explain.txt") + if err != nil { + return errors.AddStack(err) + } + for _, row := range sRows { + fmt.Fprintf(fw, "%s\n", strings.Join(row, "\t")) + } + if len(recordSets) > 0 { + if err := recordSets[0].Close(); err != nil { + return err + } + } + return nil +} + +func extractTableNames(ExecStmt ast.StmtNode, curDB string) (map[tableNamePair]struct{}, error) { + extractor := &tableNameExtractor{ + curDB: curDB, + names: make(map[tableNamePair]struct{}), + } + ExecStmt.Accept(extractor) + return extractor.names, nil +} + +func getStatsForTable(do *domain.Domain, pair tableNamePair) (*handle.JSONTable, error) { + is := do.InfoSchema() + h := do.StatsHandle() + tbl, err := is.TableByName(model.NewCIStr(pair.DBName), model.NewCIStr(pair.TableName)) + if err != nil { + return nil, err + } + js, err := h.DumpStatsToJSON(pair.DBName, tbl.Meta(), nil) + return js, err +} + +func getShowCreateTable(pair tableNamePair, zw *zip.Writer, ctx sessionctx.Context) error { + recordSets, err := ctx.(sqlexec.SQLExecutor).Execute(context.Background(), fmt.Sprintf("show create table `%v`.`%v`", pair.DBName, pair.TableName)) + if err != nil { + return err + } + sRows, err := resultSetToStringSlice(context.Background(), recordSets[0]) + if err != nil { + return err + } + fw, err := zw.Create(fmt.Sprintf("schema/%v.%v.schema.txt", pair.DBName, pair.TableName)) + if err != nil { + return errors.AddStack(err) + } + if len(sRows) == 0 || len(sRows[0]) != 2 { + return errors.New(fmt.Sprintf("plan replayer: get create table %v.%v failed", pair.DBName, pair.TableName)) + } + fmt.Fprintf(fw, "create database `%v`; use `%v`;", pair.DBName, pair.DBName) + fmt.Fprintf(fw, "%s", sRows[0][1]) + if len(recordSets) > 0 { + if err := recordSets[0].Close(); err != nil { + return err + } + } + return nil +} + +func resultSetToStringSlice(ctx context.Context, rs sqlexec.RecordSet) ([][]string, error) { + rows, err := getRows(ctx, rs) + if err != nil { + return nil, err + } + err = rs.Close() + if err != nil { + return nil, err + } + sRows := make([][]string, len(rows)) + for i, row := range rows { + iRow := make([]string, row.Len()) + for j := 0; j < row.Len(); j++ { + if row.IsNull(j) { + iRow[j] = "<nil>" + } else { + d := row.GetDatum(j, &rs.Fields()[j].Column.FieldType) + iRow[j], err = d.ToString() if err != nil { - logutil.BgLogger().Warn(fmt.Sprintf("Cleaning outdated file %s failed.", k)) + return nil, err } - delete(Flist, k) - delete(TList, v.Token) } } + sRows[i] = iRow } - // Generate Token - token := md5.Sum([]byte(fmt.Sprintf("%s%d", fileName, rand.Int63()))) // #nosec G401 G404 - e.Ctx.Value(PlanReplayerFileList).(fileList).FileInfo[fileName] = fileInfo{StartTime: startTime, Token: token} - e.Ctx.Value(PlanReplayerFileList).(fileList).TokenMap[token] = fileName + return sRows, nil +} - // Create zip writer - zw := zip.NewWriter(zf) - defer func() { - err := zw.Close() +func getRows(ctx context.Context, rs sqlexec.RecordSet) ([]chunk.Row, error) { + if rs == nil { + return nil, nil + } + var rows []chunk.Row + req := rs.NewChunk(nil) + // Must reuse `req` for imitating server.(*clientConn).writeChunks + for { + err := rs.Next(ctx, req) if err != nil { - logutil.BgLogger().Warn("Closing zip writer failed.") + return nil, err } - err = zf.Close() - if err != nil { - logutil.BgLogger().Warn("Closing zip file failed.") + if req.NumRows() == 0 { + break } - }() - // TODO: DUMP PLAN REPLAYER FILES IN ZIP WRITER - return hex.EncodeToString(token[:]), nil + iter := chunk.NewIterator4Chunk(req.CopyConstruct()) + for row := iter.Begin(); row != iter.End(); row = iter.Next() { + rows = append(rows, row) + } + } + return rows, nil +} + +// PlanReplayerLoadExec represents a plan replayer load executor. +type PlanReplayerLoadExec struct { + baseExecutor + info *PlanReplayerLoadInfo +} + +// PlanReplayerLoadInfo contains file path and session context. +type PlanReplayerLoadInfo struct { + Path string + Ctx sessionctx.Context +} + +type planReplayerLoadKeyType int + +func (k planReplayerLoadKeyType) String() string { + return "plan_replayer_load_var" +} + +// PlanReplayerLoadVarKey is a variable key for plan replayer load. +const PlanReplayerLoadVarKey planReplayerLoadKeyType = 0 + +// Next implements the Executor Next interface. +func (e *PlanReplayerLoadExec) Next(ctx context.Context, req *chunk.Chunk) error { + req.GrowAndReset(e.maxChunkSize) + if len(e.info.Path) == 0 { + return errors.New("plan replayer: file path is empty") + } + val := e.ctx.Value(PlanReplayerLoadVarKey) + if val != nil { + e.ctx.SetValue(PlanReplayerLoadVarKey, nil) + return errors.New("plan replayer: previous plan replayer load option isn't closed normally, please try again") + } + e.ctx.SetValue(PlanReplayerLoadVarKey, e.info) + return nil +} + +func loadVariables(ctx sessionctx.Context, z *zip.Reader) error { + for _, zipFile := range z.File { + if strings.Compare(zipFile.Name, "variables.toml") == 0 { + varMap := make(map[string]string) + v, err := zipFile.Open() + if err != nil { + return errors.AddStack(err) + } + defer v.Close() + _, err = toml.DecodeReader(v, &varMap) + if err != nil { + return errors.AddStack(err) + } + vars := ctx.GetSessionVars() + for name, value := range varMap { + sysVar := variable.GetSysVar(name) + if sysVar == nil { + return variable.ErrUnknownSystemVar.GenWithStackByArgs(name) + } + sVal, err := sysVar.Validate(vars, value, variable.ScopeSession) + if err != nil { + logutil.BgLogger().Debug(fmt.Sprintf("skip variable %s:%s", name, value), zap.Error(err)) + continue + } + err = vars.SetSystemVar(name, sVal) + if err != nil { + return err + } + } + } + } + return nil +} + +func createSchemaAndTables(ctx sessionctx.Context, f *zip.File) error { + r, err := f.Open() + if err != nil { + return errors.AddStack(err) + } + defer r.Close() + buf := new(bytes.Buffer) + _, err = buf.ReadFrom(r) + if err != nil { + return errors.AddStack(err) + } + sqls := strings.Split(buf.String(), ";") + if len(sqls) != 3 { + return errors.New("plan replayer: create schema and tables failed") + } + c := context.Background() + // create database + _, err = ctx.(sqlexec.SQLExecutor).Execute(c, sqls[0]) + logutil.BgLogger().Debug("plan replayer: skip error", zap.Error(err)) + // use database + _, err = ctx.(sqlexec.SQLExecutor).Execute(c, sqls[1]) + if err != nil { + return err + } + // create table + _, err = ctx.(sqlexec.SQLExecutor).Execute(c, sqls[2]) + if err != nil { + return err + } + return nil +} + +func loadStats(ctx sessionctx.Context, f *zip.File) error { + jsonTbl := &handle.JSONTable{} + r, err := f.Open() + if err != nil { + return errors.AddStack(err) + } + defer r.Close() + buf := new(bytes.Buffer) + _, err = buf.ReadFrom(r) + if err != nil { + return errors.AddStack(err) + } + if err := json.Unmarshal(buf.Bytes(), jsonTbl); err != nil { + return errors.AddStack(err) + } + do := domain.GetDomain(ctx) + h := do.StatsHandle() + if h == nil { + return errors.New("plan replayer: hanlde is nil") + } + return h.LoadStatsFromJSON(ctx.GetInfoSchema().(infoschema.InfoSchema), jsonTbl) +} + +// Update updates the data of the corresponding table. +func (e *PlanReplayerLoadInfo) Update(data []byte) error { + b := bytes.NewReader(data) + z, err := zip.NewReader(b, int64(len(data))) + if err != nil { + return errors.AddStack(err) + } + + // load variable + err = loadVariables(e.Ctx, z) + if err != nil { + return err + } + + // build schema and table + for _, zipFile := range z.File { + path := strings.Split(zipFile.Name, "/") + if len(path) == 2 && strings.Compare(path[0], "schema") == 0 { + err = createSchemaAndTables(e.Ctx, zipFile) + if err != nil { + return err + } + } + } + + // load stats + for _, zipFile := range z.File { + path := strings.Split(zipFile.Name, "/") + if len(path) == 2 && strings.Compare(path[0], "stats") == 0 { + err = loadStats(e.Ctx, zipFile) + if err != nil { + return err + } + } + } + return nil } diff --git a/executor/point_get.go b/executor/point_get.go index 6b6a5248e19df..45f3fa76e263f 100644 --- a/executor/point_get.go +++ b/executor/point_get.go @@ -43,7 +43,7 @@ import ( ) func (b *executorBuilder) buildPointGet(p *plannercore.PointGetPlan) Executor { - if err := b.validCanReadTemporaryTable(p.TblInfo); err != nil { + if err := b.validCanReadTemporaryOrCacheTable(p.TblInfo); err != nil { b.err = err return nil } @@ -58,6 +58,10 @@ func (b *executorBuilder) buildPointGet(p *plannercore.PointGetPlan) Executor { readReplicaScope: b.readReplicaScope, isStaleness: b.isStaleness, } + + if p.TblInfo.TableCacheStatusType == model.TableCacheStatusEnable { + e.cacheTable = b.getCacheTable(p.TblInfo, startTS) + } e.base().initCap = 1 e.base().maxChunkSize = 1 e.Init(p, startTS) @@ -96,7 +100,8 @@ type PointGetExecutor struct { // virtualColumnRetFieldTypes records the RetFieldTypes of virtual columns. virtualColumnRetFieldTypes []*types.FieldType - stats *runtimeStatsWithSnapshot + stats *runtimeStatsWithSnapshot + cacheTable kv.MemBuffer } // Init set fields needed for PointGetExecutor reuse, this does NOT change baseExecutor field @@ -150,6 +155,9 @@ func (e *PointGetExecutor) Open(context.Context) error { } else { e.snapshot = e.ctx.GetSnapshotWithTS(snapshotTS) } + if e.cacheTable != nil { + e.snapshot = cacheTableSnapshot{e.snapshot, e.cacheTable} + } if err := e.verifyTxnScope(); err != nil { return err } @@ -182,7 +190,7 @@ func (e *PointGetExecutor) Open(context.Context) error { panic("point get replica option fail") } }) - setResourceGroupTagForTxn(e.ctx.GetSessionVars().StmtCtx, e.snapshot) + setResourceGroupTaggerForTxn(e.ctx.GetSessionVars().StmtCtx, e.snapshot) return nil } diff --git a/executor/prepared.go b/executor/prepared.go index 69f277312ba5a..82a030e76b6c1 100644 --- a/executor/prepared.go +++ b/executor/prepared.go @@ -117,18 +117,23 @@ func (e *PrepareExec) Next(ctx context.Context, req *chunk.Chunk) error { return nil } } + charset, collation := vars.GetCharsetInfo() var ( stmts []ast.StmtNode err error ) if sqlParser, ok := e.ctx.(sqlexec.SQLParser); ok { // FIXME: ok... yet another parse API, may need some api interface clean. - stmts, _, err = sqlParser.ParseSQL(ctx, e.sqlText, vars.GetParseParams()...) + stmts, _, err = sqlParser.ParseSQL(ctx, e.sqlText, + parser.CharsetConnection(charset), + parser.CollationConnection(collation)) } else { p := parser.New() p.SetParserConfig(vars.BuildParserConfig()) var warns []error - stmts, warns, err = p.ParseSQL(e.sqlText, vars.GetParseParams()...) + stmts, warns, err = p.ParseSQL(e.sqlText, + parser.CharsetConnection(charset), + parser.CollationConnection(collation)) for _, warn := range warns { e.ctx.GetSessionVars().StmtCtx.AppendWarning(util.SyntaxWarn(warn)) } @@ -309,8 +314,9 @@ func (e *DeallocateExec) Next(ctx context.Context, req *chunk.Chunk) error { prepared := preparedObj.PreparedAst delete(vars.PreparedStmtNameToID, e.Name) if plannercore.PreparedPlanCacheEnabled() { + bindSQL := planner.GetBindSQL4PlanCache(e.ctx, prepared.Stmt) e.ctx.PreparedPlanCache().Delete(plannercore.NewPSTMTPlanCacheKey( - vars, id, prepared.SchemaVersion, + vars, id, prepared.SchemaVersion, bindSQL, )) } vars.RemovePreparedStmt(id) diff --git a/executor/prepared_test.go b/executor/prepared_test.go index d69a753b12ae2..e24178b9817b2 100644 --- a/executor/prepared_test.go +++ b/executor/prepared_test.go @@ -17,47 +17,56 @@ package executor_test import ( "crypto/tls" "fmt" + "strconv" "strings" "sync/atomic" + "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/parser/auth" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/session" - txninfo "github.com/pingcap/tidb/session/txninfo" + "github.com/pingcap/tidb/session/txninfo" "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/testkit/testdata" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/israce" - "github.com/pingcap/tidb/util/testkit" + "github.com/stretchr/testify/require" ) -func (s *testSuite1) TestPreparedNameResolver(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestPreparedNameResolver(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t (id int, KEY id (id))") tk.MustExec("prepare stmt from 'select * from t limit ? offset ?'") _, err := tk.Exec("prepare stmt from 'select b from t'") - c.Assert(err.Error(), Equals, "[planner:1054]Unknown column 'b' in 'field list'") + require.EqualError(t, err, "[planner:1054]Unknown column 'b' in 'field list'") _, err = tk.Exec("prepare stmt from '(select * FROM t) union all (select * FROM t) order by a limit ?'") - c.Assert(err.Error(), Equals, "[planner:1054]Unknown column 'a' in 'order clause'") + require.EqualError(t, err, "[planner:1054]Unknown column 'a' in 'order clause'") } // a 'create table' DDL statement should be accepted if it has no parameters. -func (s *testSuite1) TestPreparedDDL(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestPreparedDDL(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("prepare stmt from 'create table t (id int, KEY id (id))'") } // TestUnsupportedStmtForPrepare is related to https://github.com/pingcap/tidb/issues/17412 -func (s *testSuite1) TestUnsupportedStmtForPrepare(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestUnsupportedStmtForPrepare(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec(`prepare stmt0 from "create table t0(a int primary key)"`) tk.MustGetErrCode(`prepare stmt1 from "execute stmt0"`, mysql.ErrUnsupportedPs) @@ -65,8 +74,10 @@ func (s *testSuite1) TestUnsupportedStmtForPrepare(c *C) { tk.MustGetErrCode(`prepare stmt4 from "prepare stmt3 from 'create table t1(a int, b int)'"`, mysql.ErrUnsupportedPs) } -func (s *testSuite1) TestIgnorePlanCache(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIgnorePlanCache(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") @@ -77,59 +88,7 @@ func (s *testSuite1) TestIgnorePlanCache(c *C) { tk.MustExec("prepare stmt from 'select /*+ IGNORE_PLAN_CACHE() */ * from t where id=?'") tk.MustExec("set @ignore_plan_doma = 1") tk.MustExec("execute stmt using @ignore_plan_doma") - c.Assert(tk.Se.GetSessionVars().StmtCtx.UseCache, IsFalse) -} - -func (s *testSerialSuite) TestPrepareStmtAfterIsolationReadChange(c *C) { - if israce.RaceEnabled { - c.Skip("race test for this case takes too long time") - } - tk := testkit.NewTestKitWithInit(c, s.store) - tk.Se.Auth(&auth.UserIdentity{Username: "root", Hostname: "localhost", CurrentUser: true, AuthUsername: "root", AuthHostname: "%"}, nil, []byte("012345678901234567890")) - - orgEnable := plannercore.PreparedPlanCacheEnabled() - defer func() { - plannercore.SetPreparedPlanCache(orgEnable) - }() - plannercore.SetPreparedPlanCache(false) // requires plan cache disabled - - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a int)") - // create virtual tiflash replica. - dom := domain.GetDomain(tk.Se) - is := dom.InfoSchema() - db, exists := is.SchemaByName(model.NewCIStr("test")) - c.Assert(exists, IsTrue) - for _, tblInfo := range db.Tables { - if tblInfo.Name.L == "t" { - tblInfo.TiFlashReplica = &model.TiFlashReplicaInfo{ - Count: 1, - Available: true, - } - } - } - - tk.MustExec("set @@session.tidb_isolation_read_engines='tikv'") - tk.MustExec("set @@tidb_enable_collect_execution_info=0;") - tk.MustExec("prepare stmt from \"select * from t\"") - tk.MustQuery("execute stmt") - tkProcess := tk.Se.ShowProcess() - ps := []*util.ProcessInfo{tkProcess} - tk.Se.SetSessionManager(&mockSessionManager1{PS: ps}) - rows := tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)).Rows() - c.Assert(rows[len(rows)-1][2], Equals, "cop[tikv]") - - tk.MustExec("set @@session.tidb_isolation_read_engines='tiflash'") - tk.MustExec("execute stmt") - tkProcess = tk.Se.ShowProcess() - ps = []*util.ProcessInfo{tkProcess} - tk.Se.SetSessionManager(&mockSessionManager1{PS: ps}) - rows = tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)).Rows() - c.Assert(rows[len(rows)-1][2], Equals, "cop[tiflash]") - - c.Assert(len(tk.Se.GetSessionVars().PreparedStmts), Equals, 1) - c.Assert(tk.Se.GetSessionVars().PreparedStmts[1].(*plannercore.CachedPrepareStmt).NormalizedSQL, Equals, "select * from `t`") - c.Assert(tk.Se.GetSessionVars().PreparedStmts[1].(*plannercore.CachedPrepareStmt).NormalizedPlan, Equals, "") + require.False(t, tk.Session().GetSessionVars().StmtCtx.UseCache) } type mockSessionManager2 struct { @@ -156,6 +115,7 @@ func (sm *mockSessionManager2) GetProcessInfo(id uint64) (pi *util.ProcessInfo, } return } + func (sm *mockSessionManager2) Kill(connectionID uint64, query bool) { atomic.StoreInt32(&sm.killed, 1) atomic.StoreUint32(&sm.se.GetSessionVars().Killed, 1) @@ -166,25 +126,19 @@ func (sm *mockSessionManager2) ServerID() uint64 { return 1 } -var _ = SerialSuites(&testSuite12{&baseTestSuite{}}) - -type testSuite12 struct { - *baseTestSuite -} - -func (s *testSuite12) TestPreparedStmtWithHint(c *C) { +func TestPreparedStmtWithHint(t *testing.T) { // see https://github.com/pingcap/tidb/issues/18535 store, dom, err := newStoreWithBootstrap() - c.Assert(err, IsNil) + require.NoError(t, err) defer func() { - store.Close() + require.NoError(t, store.Close()) dom.Close() }() se, err := session.CreateSession4Test(store) - c.Assert(err, IsNil) - tk := testkit.NewTestKit(c, store) - tk.Se = se + require.NoError(t, err) + tk := testkit.NewTestKit(t, store) + tk.SetSession(se) sm := &mockSessionManager2{ se: se, @@ -193,25 +147,239 @@ func (s *testSuite12) TestPreparedStmtWithHint(c *C) { go dom.ExpensiveQueryHandle().SetSessionManager(sm).Run() tk.MustExec("prepare stmt from \"select /*+ max_execution_time(100) */ sleep(10)\"") tk.MustQuery("execute stmt").Check(testkit.Rows("1")) - c.Check(atomic.LoadInt32(&sm.killed), Equals, int32(1)) + require.Equal(t, int32(1), atomic.LoadInt32(&sm.killed)) +} + +func TestIssue29850(t *testing.T) { + store, dom, err := newStoreWithBootstrap() + require.NoError(t, err) + defer func() { + require.NoError(t, store.Close()) + dom.Close() + }() + + orgEnable := plannercore.PreparedPlanCacheEnabled() + defer func() { + plannercore.SetPreparedPlanCache(orgEnable) + }() + plannercore.SetPreparedPlanCache(true) + tk := testkit.NewTestKit(t, store) + + tk.MustExec(`set tidb_enable_clustered_index=on`) + tk.MustExec("set @@tidb_enable_collect_execution_info=0") + tk.MustExec(`use test`) + tk.MustExec(`CREATE TABLE customer ( + c_id int(11) NOT NULL, + c_d_id int(11) NOT NULL, + c_first varchar(16) DEFAULT NULL, + c_w_id int(11) NOT NULL, + c_last varchar(16) DEFAULT NULL, + c_credit char(2) DEFAULT NULL, + c_discount decimal(4,4) DEFAULT NULL, + PRIMARY KEY (c_w_id,c_d_id,c_id), + KEY idx_customer (c_w_id,c_d_id,c_last,c_first))`) + tk.MustExec(`CREATE TABLE warehouse ( + w_id int(11) NOT NULL, + w_tax decimal(4,4) DEFAULT NULL, + PRIMARY KEY (w_id))`) + tk.MustExec(`prepare stmt from 'SELECT c_discount, c_last, c_credit, w_tax + FROM customer, warehouse + WHERE w_id = ? AND c_w_id = w_id AND c_d_id = ? AND c_id = ?'`) + tk.MustExec(`set @w_id=1262`) + tk.MustExec(`set @c_d_id=7`) + tk.MustExec(`set @c_id=1549`) + tk.MustQuery(`execute stmt using @w_id, @c_d_id, @c_id`).Check(testkit.Rows()) + tkProcess := tk.Session().ShowProcess() + ps := []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)).Check(testkit.Rows( // can use PointGet + `Projection_7 0.00 root test.customer.c_discount, test.customer.c_last, test.customer.c_credit, test.warehouse.w_tax`, + `└─MergeJoin_8 0.00 root inner join, left key:test.customer.c_w_id, right key:test.warehouse.w_id`, + ` ├─Point_Get_34(Build) 1.00 root table:warehouse handle:1262`, + ` └─Point_Get_33(Probe) 1.00 root table:customer, clustered index:PRIMARY(c_w_id, c_d_id, c_id) `)) + tk.MustQuery(`execute stmt using @w_id, @c_d_id, @c_id`).Check(testkit.Rows()) + tk.MustQuery(`select @@last_plan_from_cache`).Check(testkit.Rows("1")) // can use the cached plan + + tk.MustExec(`create table t (a int primary key)`) + tk.MustExec(`insert into t values (1), (2)`) + tk.MustExec(`prepare stmt from 'select * from t where a>=? and a<=?'`) + tk.MustExec(`set @a1=1, @a2=2`) + tk.MustQuery(`execute stmt using @a1, @a1`).Check(testkit.Rows("1")) + tkProcess = tk.Session().ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)).Check(testkit.Rows( // cannot use PointGet since it contains a range condition + `Selection_7 1.00 root ge(test.t.a, 1), le(test.t.a, 1)`, + `└─TableReader_6 1.00 root data:TableRangeScan_5`, + ` └─TableRangeScan_5 1.00 cop[tikv] table:t range:[1,1], keep order:false, stats:pseudo`)) + tk.MustQuery(`execute stmt using @a1, @a2`).Check(testkit.Rows("1", "2")) + tk.MustQuery(`select @@last_plan_from_cache`).Check(testkit.Rows("1")) + + tk.MustExec(`prepare stmt from 'select * from t where a=? or a=?'`) + tk.MustQuery(`execute stmt using @a1, @a1`).Check(testkit.Rows("1")) + tkProcess = tk.Session().ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)).Check(testkit.Rows( // cannot use PointGet since it contains a or condition + `Selection_7 1.00 root or(eq(test.t.a, 1), eq(test.t.a, 1))`, + `└─TableReader_6 1.00 root data:TableRangeScan_5`, + ` └─TableRangeScan_5 1.00 cop[tikv] table:t range:[1,1], keep order:false, stats:pseudo`)) + tk.MustQuery(`execute stmt using @a1, @a2`).Check(testkit.Rows("1", "2")) +} + +func TestIssue28064(t *testing.T) { + store, dom, err := newStoreWithBootstrap() + require.NoError(t, err) + orgEnable := plannercore.PreparedPlanCacheEnabled() + defer func() { + plannercore.SetPreparedPlanCache(orgEnable) + }() + plannercore.SetPreparedPlanCache(true) + tk := testkit.NewTestKit(t, store) + defer func() { + dom.Close() + require.NoError(t, store.Close()) + }() + tk.MustExec("use test") + tk.MustExec("drop table if exists t28064") + tk.MustExec("CREATE TABLE `t28064` (" + + "`a` decimal(10,0) DEFAULT NULL," + + "`b` decimal(10,0) DEFAULT NULL," + + "`c` decimal(10,0) DEFAULT NULL," + + "`d` decimal(10,0) DEFAULT NULL," + + "KEY `iabc` (`a`,`b`,`c`));") + tk.MustExec("set @a='123', @b='234', @c='345';") + tk.MustExec("set @@tidb_enable_collect_execution_info=0;") + tk.MustExec("prepare stmt1 from 'select * from t28064 use index (iabc) where a = ? and b = ? and c = ?';") + + tk.MustExec("execute stmt1 using @a, @b, @c;") + tkProcess := tk.Session().ShowProcess() + ps := []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + rows := tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)) + rows.Check(testkit.Rows("Selection_8 0.00 root eq(test.t28064.a, 123), eq(test.t28064.b, 234), eq(test.t28064.c, 345)", + "└─IndexLookUp_7 0.00 root ", + " ├─IndexRangeScan_5(Build) 0.00 cop[tikv] table:t28064, index:iabc(a, b, c) range:[123 234 345,123 234 345], keep order:false, stats:pseudo", + " └─TableRowIDScan_6(Probe) 0.00 cop[tikv] table:t28064 keep order:false, stats:pseudo")) + + tk.MustExec("execute stmt1 using @a, @b, @c;") + rows = tk.MustQuery("select @@last_plan_from_cache") + rows.Check(testkit.Rows("1")) + + tk.MustExec("execute stmt1 using @a, @b, @c;") + rows = tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)) + rows.Check(testkit.Rows("Selection_8 0.00 root eq(test.t28064.a, 123), eq(test.t28064.b, 234), eq(test.t28064.c, 345)", + "└─IndexLookUp_7 0.00 root ", + " ├─IndexRangeScan_5(Build) 0.00 cop[tikv] table:t28064, index:iabc(a, b, c) range:[123 234 345,123 234 345], keep order:false, stats:pseudo", + " └─TableRowIDScan_6(Probe) 0.00 cop[tikv] table:t28064 keep order:false, stats:pseudo")) } -func (s *testSerialSuite) TestPlanCacheClusterIndex(c *C) { +func TestPreparePlanCache4Blacklist(t *testing.T) { store, dom, err := newStoreWithBootstrap() - c.Assert(err, IsNil) - tk := testkit.NewTestKit(c, store) + require.NoError(t, err) + orgEnable := plannercore.PreparedPlanCacheEnabled() + defer func() { + plannercore.SetPreparedPlanCache(orgEnable) + }() + plannercore.SetPreparedPlanCache(true) + tk := testkit.NewTestKit(t, store) defer func() { dom.Close() - store.Close() + require.NoError(t, store.Close()) }() + + tk.MustExec("use test") + tk.MustExec("set @@tidb_enable_collect_execution_info=0;") + + // test the blacklist of optimization rules + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a int);") + tk.MustExec("prepare stmt from 'select min(a) from t;';") + tk.MustExec("execute stmt;") + tkProcess := tk.Session().ShowProcess() + ps := []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + res := tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)) + require.Contains(t, res.Rows()[1][0], "TopN") + + res = tk.MustQuery("explain format = 'brief' select min(a) from t") + require.Contains(t, res.Rows()[1][0], "TopN") + + tk.MustExec("INSERT INTO mysql.opt_rule_blacklist VALUES('max_min_eliminate');") + tk.MustExec("ADMIN reload opt_rule_blacklist;") + + tk.MustExec("execute stmt;") + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + tk.MustExec("execute stmt;") + tkProcess = tk.Session().ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + res = tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)) + // Plans that have been cached will not be affected by the blacklist. + require.Contains(t, res.Rows()[1][0], "TopN") + + res = tk.MustQuery("explain format = 'brief' select min(a) from t") + require.Contains(t, res.Rows()[0][0], "StreamAgg") + + // test the blacklist of Expression Pushdown + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a int);") + tk.MustExec("prepare stmt from 'SELECT * FROM t WHERE a < 2 and a > 2;';") + tk.MustExec("execute stmt;") + tkProcess = tk.Session().ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + res = tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)) + require.Equal(t, 3, len(res.Rows())) + require.Contains(t, res.Rows()[1][0], "Selection") + require.Equal(t, "gt(test.t.a, 2), lt(test.t.a, 2)", res.Rows()[1][4]) + + res = tk.MustQuery("explain format = 'brief' SELECT * FROM t WHERE a < 2 and a > 2;") + require.Equal(t, 3, len(res.Rows())) + require.Equal(t, "gt(test.t.a, 2), lt(test.t.a, 2)", res.Rows()[1][4]) + + tk.MustExec("INSERT INTO mysql.expr_pushdown_blacklist VALUES('<','tikv','');") + tk.MustExec("ADMIN reload expr_pushdown_blacklist;") + + tk.MustExec("execute stmt;") + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + tk.MustExec("execute stmt;") + tkProcess = tk.Session().ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + res = tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)) + // The expressions can still be pushed down to tikv. + require.Equal(t, 3, len(res.Rows())) + require.Contains(t, res.Rows()[1][0], "Selection") + require.Equal(t, "gt(test.t.a, 2), lt(test.t.a, 2)", res.Rows()[1][4]) + + res = tk.MustQuery("explain format = 'brief' SELECT * FROM t WHERE a < 2 and a > 2;") + require.Equal(t, 4, len(res.Rows())) + require.Contains(t, res.Rows()[0][0], "Selection") + require.Equal(t, "lt(test.t.a, 2)", res.Rows()[0][4]) + require.Contains(t, res.Rows()[2][0], "Selection") + require.Equal(t, "gt(test.t.a, 2)", res.Rows()[2][4]) + + tk.MustExec("DELETE FROM mysql.expr_pushdown_blacklist;") + tk.MustExec("ADMIN reload expr_pushdown_blacklist;") +} + +func TestPlanCacheClusterIndex(t *testing.T) { + store, dom, err := newStoreWithBootstrap() + require.NoError(t, err) orgEnable := plannercore.PreparedPlanCacheEnabled() defer func() { plannercore.SetPreparedPlanCache(orgEnable) }() plannercore.SetPreparedPlanCache(true) + tk := testkit.NewTestKit(t, store) + defer func() { + dom.Close() + require.NoError(t, store.Close()) + }() tk.MustExec("use test") tk.MustExec("drop table if exists t1") - tk.Se.GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeOn + tk.Session().GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeOn tk.MustExec("set @@tidb_enable_collect_execution_info=0;") tk.MustExec("create table t1(a varchar(20), b varchar(20), c varchar(20), primary key(a, b))") tk.MustExec("insert into t1 values('1','1','111'),('2','2','222'),('3','3','333')") @@ -229,12 +397,11 @@ func (s *testSerialSuite) TestPlanCacheClusterIndex(c *C) { tk.MustExec("set @v1 = '3'") tk.MustExec("set @v2 = '2'") tk.MustQuery("execute stmt1 using @v1,@v2").Check(testkit.Rows("3 3 333")) - tkProcess := tk.Se.ShowProcess() + tkProcess := tk.Session().ShowProcess() ps := []*util.ProcessInfo{tkProcess} - tk.Se.SetSessionManager(&mockSessionManager1{PS: ps}) + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) rows := tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)).Rows() - c.Assert(strings.Index(rows[len(rows)-1][4].(string), `range:("3" "2","3" +inf]`), Equals, 0) - + require.Equal(t, 0, strings.Index(rows[len(rows)-1][4].(string), `range:("3" "2","3" +inf]`)) // For point get tk.MustExec(`prepare stmt2 from "select * from t1 where t1.a = ? and t1.b = ?"`) tk.MustExec("set @v1 = '1'") @@ -248,12 +415,11 @@ func (s *testSerialSuite) TestPlanCacheClusterIndex(c *C) { tk.MustExec("set @v1 = '3'") tk.MustExec("set @v2 = '3'") tk.MustQuery("execute stmt2 using @v1,@v2").Check(testkit.Rows("3 3 333")) - tkProcess = tk.Se.ShowProcess() + tkProcess = tk.Session().ShowProcess() ps = []*util.ProcessInfo{tkProcess} - tk.Se.SetSessionManager(&mockSessionManager1{PS: ps}) + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) rows = tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)).Rows() - c.Assert(strings.Index(rows[len(rows)-1][0].(string), `Point_Get`), Equals, 0) - + require.Equal(t, 0, strings.Index(rows[len(rows)-1][0].(string), `Point_Get`)) // For CBO point get and batch point get // case 1: tk.MustExec(`drop table if exists ta, tb`) @@ -277,11 +443,11 @@ func (s *testSerialSuite) TestPlanCacheClusterIndex(c *C) { tk.MustQuery(`execute stmt1 using @v1`).Check(testkit.Rows("a 1 1 1")) tk.MustQuery(`execute stmt1 using @v2`).Check(testkit.Rows("b 2 2 2")) tk.MustQuery(`execute stmt1 using @v2`).Check(testkit.Rows("b 2 2 2")) - tkProcess = tk.Se.ShowProcess() + tkProcess = tk.Session().ShowProcess() ps = []*util.ProcessInfo{tkProcess} - tk.Se.SetSessionManager(&mockSessionManager1{PS: ps}) + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) rows = tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)).Rows() - c.Assert(strings.Contains(rows[3][0].(string), `TableRangeScan`), IsTrue) + require.True(t, strings.Contains(rows[3][0].(string), `TableRangeScan`)) // case 3: tk.MustExec(`drop table if exists ta, tb`) @@ -298,7 +464,7 @@ func (s *testSerialSuite) TestPlanCacheClusterIndex(c *C) { tk.MustQuery(`execute stmt2 using @v2, @v2, @v3, @v3`).Check(testkit.Rows("b b 2 2 2", "c c 3 3 3")) // For issue 19002 - tk.Se.GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeOn + tk.Session().GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeOn tk.MustExec(`drop table if exists t1`) tk.MustExec(`create table t1(a int, b int, c int, primary key(a, b))`) tk.MustExec(`insert into t1 values(1,1,111),(2,2,222),(3,3,333)`) @@ -318,19 +484,21 @@ func (s *testSerialSuite) TestPlanCacheClusterIndex(c *C) { tk.MustQuery(`select @@last_plan_from_cache`).Check(testkit.Rows("1")) } -func (s *testPrepareSuite) TestPlanCacheWithDifferentVariableTypes(c *C) { +func TestPlanCacheWithDifferentVariableTypes(t *testing.T) { store, dom, err := newStoreWithBootstrap() - c.Assert(err, IsNil) - tk := testkit.NewTestKit(c, store) - defer func() { - dom.Close() - store.Close() - }() + require.NoError(t, err) orgEnable := plannercore.PreparedPlanCacheEnabled() defer func() { plannercore.SetPreparedPlanCache(orgEnable) }() plannercore.SetPreparedPlanCache(true) + tk := testkit.NewTestKit(t, store) + defer func() { + dom.Close() + require.NoError(t, store.Close()) + }() + require.NoError(t, err) + tk.MustExec("use test") tk.MustExec("drop table if exists t1, t2") tk.MustExec("set @@tidb_enable_collect_execution_info=0;") @@ -362,10 +530,10 @@ func (s *testPrepareSuite) TestPlanCacheWithDifferentVariableTypes(c *C) { Result []string } } - s.testData.GetTestCases(c, &input, &output) + prepareMergeSuiteData.GetTestCases(t, &input, &output) for i, tt := range input { tk.MustExec(tt.PrepareStmt) - s.testData.OnRecord(func() { + testdata.OnRecord(func() { output[i].PrepareStmt = tt.PrepareStmt output[i].Executes = make([]struct { SQL string @@ -378,7 +546,7 @@ func (s *testPrepareSuite) TestPlanCacheWithDifferentVariableTypes(c *C) { Result []string }, len(tt.Executes)) }) - c.Assert(output[i].PrepareStmt, Equals, tt.PrepareStmt) + require.Equal(t, tt.PrepareStmt, output[i].PrepareStmt) for j, exec := range tt.Executes { for _, v := range exec.Vars { tk.MustExec(fmt.Sprintf(`set @%s = %s`, v.Name, v.Value)) @@ -386,40 +554,40 @@ func (s *testPrepareSuite) TestPlanCacheWithDifferentVariableTypes(c *C) { res := tk.MustQuery(exec.ExecuteSQL) lastPlanUseCache := tk.MustQuery("select @@last_plan_from_cache").Rows()[0][0] tk.MustQuery(exec.ExecuteSQL) - tkProcess := tk.Se.ShowProcess() + tkProcess := tk.Session().ShowProcess() ps := []*util.ProcessInfo{tkProcess} - tk.Se.SetSessionManager(&mockSessionManager1{PS: ps}) + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) plan := tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)) - s.testData.OnRecord(func() { + testdata.OnRecord(func() { output[i].Executes[j].SQL = exec.ExecuteSQL - output[i].Executes[j].Plan = s.testData.ConvertRowsToStrings(plan.Rows()) + output[i].Executes[j].Plan = testdata.ConvertRowsToStrings(plan.Rows()) output[i].Executes[j].Vars = exec.Vars output[i].Executes[j].LastPlanUseCache = lastPlanUseCache.(string) - output[i].Executes[j].Result = s.testData.ConvertRowsToStrings(res.Rows()) + output[i].Executes[j].Result = testdata.ConvertRowsToStrings(res.Rows()) }) - c.Assert(output[i].Executes[j].SQL, Equals, exec.ExecuteSQL) + + require.Equal(t, exec.ExecuteSQL, output[i].Executes[j].SQL) plan.Check(testkit.Rows(output[i].Executes[j].Plan...)) - c.Assert(output[i].Executes[j].Vars, DeepEquals, exec.Vars) - c.Assert(output[i].Executes[j].LastPlanUseCache, Equals, lastPlanUseCache.(string)) + require.Equal(t, exec.Vars, output[i].Executes[j].Vars) + require.Equal(t, lastPlanUseCache.(string), output[i].Executes[j].LastPlanUseCache) res.Check(testkit.Rows(output[i].Executes[j].Result...)) } } } -func (s *testPrepareSuite) TestPlanCacheXXX(c *C) { +func TestPlanCacheOperators(t *testing.T) { store, dom, err := newStoreWithBootstrap() - c.Assert(err, IsNil) - tk := testkit.NewTestKit(c, store) - defer func() { - dom.Close() - store.Close() - }() + require.NoError(t, err) orgEnable := plannercore.PreparedPlanCacheEnabled() defer func() { plannercore.SetPreparedPlanCache(orgEnable) }() plannercore.SetPreparedPlanCache(true) - + tk := testkit.NewTestKit(t, store) + defer func() { + dom.Close() + require.NoError(t, store.Close()) + }() type ExecCase struct { Parameters []string UseCache bool @@ -432,6 +600,212 @@ func (s *testPrepareSuite) TestPlanCacheXXX(c *C) { cases := []PrepCase{ {"use test", nil}, + // cases for TableReader on PK + {"create table t (a int, b int, primary key(a))", nil}, + {"insert into t values (1,1), (2,2), (3,3), (4,4), (5,5), (6,null)", nil}, + {"select a from t where a=?", []ExecCase{ + {[]string{"1"}, false}, + {[]string{"2"}, true}, + {[]string{"3"}, true}, + }}, + {"select a from t where a in (?,?,?)", []ExecCase{ + {[]string{"1", "1", "1"}, false}, + {[]string{"2", "3", "4"}, true}, + {[]string{"3", "5", "7"}, true}, + }}, + {"select a from t where a>? and a<?", []ExecCase{ + {[]string{"5", "1"}, false}, + {[]string{"1", "4"}, true}, + {[]string{"3", "9"}, true}, + }}, + {"drop table t", nil}, + + // cases for IndexReader on UK + {"create table t (a int, b int, unique key(a))", nil}, + {"insert into t values (1,1), (2,2), (3,3), (4,4), (5,5), (6,null)", nil}, + {"select a from t where a=?", []ExecCase{ + {[]string{"1"}, false}, + {[]string{"2"}, true}, + {[]string{"3"}, true}, + }}, + {"select a from t where a in (?,?,?)", []ExecCase{ + {[]string{"1", "1", "1"}, false}, + {[]string{"2", "3", "4"}, true}, + {[]string{"3", "5", "7"}, true}, + }}, + {"select a from t where a>? and a<?", []ExecCase{ + {[]string{"5", "1"}, false}, + {[]string{"1", "4"}, true}, + {[]string{"3", "9"}, true}, + }}, + {"drop table t", nil}, + + // cases for IndexReader on Index + {"create table t (a int, b int, key(a))", nil}, + {"insert into t values (1,1), (2,2), (3,3), (4,4), (5,5), (6,null)", nil}, + {"select a from t where a=?", []ExecCase{ + {[]string{"1"}, false}, + {[]string{"2"}, true}, + {[]string{"3"}, true}, + }}, + {"select a from t where a in (?,?,?)", []ExecCase{ + {[]string{"1", "1", "1"}, false}, + {[]string{"2", "3", "4"}, true}, + {[]string{"3", "5", "7"}, true}, + }}, + {"select a from t where a>? and a<?", []ExecCase{ + {[]string{"5", "1"}, false}, + {[]string{"1", "4"}, true}, + {[]string{"3", "9"}, true}, + }}, + {"drop table t", nil}, + + // cases for IndexLookUp on UK + {"create table t (a int, b int, unique key(a))", nil}, + {"insert into t values (1,1), (2,2), (3,3), (4,4), (5,5), (6,null)", nil}, + {"select * from t where a=?", []ExecCase{ + {[]string{"1"}, false}, + {[]string{"2"}, true}, + {[]string{"3"}, true}, + }}, + {"select * from t where a in (?,?,?)", []ExecCase{ + {[]string{"1", "1", "1"}, false}, + {[]string{"2", "3", "4"}, true}, + {[]string{"3", "5", "7"}, true}, + }}, + {"select * from t where a>? and a<?", []ExecCase{ + {[]string{"5", "1"}, false}, + {[]string{"1", "4"}, true}, + {[]string{"3", "9"}, true}, + }}, + {"drop table t", nil}, + + // cases for IndexLookUp on Index + {"create table t (a int, b int, key(a))", nil}, + {"insert into t values (1,1), (2,2), (3,3), (4,4), (5,5), (6,null)", nil}, + {"select * from t where a=?", []ExecCase{ + {[]string{"1"}, false}, + {[]string{"2"}, true}, + {[]string{"3"}, true}, + }}, + {"select * from t where a in (?,?,?)", []ExecCase{ + {[]string{"1", "1", "1"}, false}, + {[]string{"2", "3", "4"}, true}, + {[]string{"3", "5", "7"}, true}, + }}, + {"select * from t where a>? and a<?", []ExecCase{ + {[]string{"5", "1"}, false}, + {[]string{"1", "4"}, true}, + {[]string{"3", "9"}, true}, + }}, + {"drop table t", nil}, + + // cases for HashJoin + {"create table t (a int, b int, key(a))", nil}, + {"insert into t values (1,1), (2,2), (3,3), (4,4), (5,5), (6,null)", nil}, + {"select /*+ HASH_JOIN(t1, t2) */ * from t t1, t t2 where t1.a=t2.a and t1.b>?", []ExecCase{ + {[]string{"1"}, false}, + {[]string{"3"}, true}, + {[]string{"5"}, true}, + }}, + {"select /*+ HASH_JOIN(t1, t2) */ * from t t1, t t2 where t1.a=t2.a and t2.b>?", []ExecCase{ + {[]string{"1"}, false}, + {[]string{"3"}, true}, + {[]string{"5"}, true}, + }}, + {"select /*+ HASH_JOIN(t1, t2) */ * from t t1, t t2 where t1.a=t2.a and t1.b>? and t2.b<?", []ExecCase{ + {[]string{"1", "10"}, false}, + {[]string{"3", "5"}, true}, + {[]string{"5", "3"}, true}, + }}, + + // cases for MergeJoin + {"select /*+ MERGE_JOIN(t1, t2) */ * from t t1, t t2 where t1.a=t2.a and t1.b>?", []ExecCase{ + {[]string{"1"}, false}, + {[]string{"3"}, true}, + {[]string{"5"}, true}, + }}, + {"select /*+ MERGE_JOIN(t1, t2) */ * from t t1, t t2 where t1.a=t2.a and t2.b>?", []ExecCase{ + {[]string{"1"}, false}, + {[]string{"3"}, true}, + {[]string{"5"}, true}, + }}, + {"select /*+ MERGE_JOIN(t1, t2) */ * from t t1, t t2 where t1.a=t2.a and t1.b>? and t2.b<?", []ExecCase{ + {[]string{"1", "10"}, false}, + {[]string{"3", "5"}, true}, + {[]string{"5", "3"}, true}, + }}, + + // cases for IndexJoin + {"select /*+ INL_JOIN(t1, t2) */ * from t t1, t t2 where t1.a=t2.a and t1.b>?", []ExecCase{ + {[]string{"1"}, false}, + {[]string{"3"}, true}, + {[]string{"5"}, true}, + }}, + {"select /*+ INL_JOIN(t1, t2) */ * from t t1, t t2 where t1.a=t2.a and t2.b>?", []ExecCase{ + {[]string{"1"}, false}, + {[]string{"3"}, true}, + {[]string{"5"}, true}, + }}, + {"select /*+ INL_JOIN(t1, t2) */ * from t t1, t t2 where t1.a=t2.a and t1.b>? and t2.b<?", []ExecCase{ + {[]string{"1", "10"}, false}, + {[]string{"3", "5"}, true}, + {[]string{"5", "3"}, true}, + }}, + + // cases for NestedLoopJoin (Apply) + {"select * from t t1 where t1.b>? and t1.a > (select min(t2.a) from t t2 where t2.b < t1.b)", []ExecCase{ + {[]string{"1"}, false}, + {[]string{"3"}, false}, // plans with sub-queries cannot be cached, but the result must be correct + {[]string{"5"}, false}, + }}, + {"select * from t t1 where t1.a > (select min(t2.a) from t t2 where t2.b < t1.b+?)", []ExecCase{ + {[]string{"1"}, false}, + {[]string{"3"}, false}, + {[]string{"5"}, false}, + }}, + {"select * from t t1 where t1.b>? and t1.a > (select min(t2.a) from t t2 where t2.b < t1.b+?)", []ExecCase{ + {[]string{"1", "1"}, false}, + {[]string{"3", "2"}, false}, + {[]string{"5", "3"}, false}, + }}, + {"drop table t", nil}, + + // cases for Window + {"create table t (name varchar(50), y int, sale decimal(14,2))", nil}, + {"insert into t values ('Bob',2016,2.4), ('Bob',2017,3.2), ('Bob',2018,2.1), ('Alice',2016,1.4), ('Alice',2017,2), ('Alice',2018,3.3), ('John',2016,4), ('John',2017,2.1), ('John',2018,5)", nil}, + {"select *, sum(sale) over (partition by y order by sale) total from t where sale>? order by y", []ExecCase{ + {[]string{"0.1"}, false}, + {[]string{"0.5"}, true}, + {[]string{"1.5"}, true}, + {[]string{"3.5"}, true}, + }}, + {"select *, sum(sale) over (partition by y order by sale+? rows 2 preceding) total from t order by y", []ExecCase{ + {[]string{"0.1"}, false}, + {[]string{"0.5"}, true}, + {[]string{"1.5"}, true}, + {[]string{"3.5"}, true}, + }}, + {"select *, rank() over (partition by y order by sale+? rows 2 preceding) total from t order by y", []ExecCase{ + {[]string{"0.1"}, false}, + {[]string{"0.5"}, true}, + {[]string{"1.5"}, true}, + {[]string{"3.5"}, true}, + }}, + {"select *, first_value(sale) over (partition by y order by sale+? rows 2 preceding) total from t order by y", []ExecCase{ + {[]string{"0.1"}, false}, + {[]string{"0.5"}, true}, + {[]string{"1.5"}, true}, + {[]string{"3.5"}, true}, + }}, + {"select *, first_value(sale) over (partition by y order by sale rows ? preceding) total from t order by y", []ExecCase{ + {[]string{"1"}, false}, // window plans with parameters in frame cannot be cached + {[]string{"2"}, false}, + {[]string{"3"}, false}, + {[]string{"4"}, false}, + }}, + {"drop table t", nil}, + // cases for Limit {"create table t (a int)", nil}, {"insert into t values (1), (1), (2), (2), (3), (4), (5), (6), (7), (8), (9), (0), (0)", nil}, @@ -527,15 +901,10 @@ func (s *testPrepareSuite) TestPlanCacheXXX(c *C) { // execute this statement and check whether it uses a cached plan results := tk.MustQuery("execute stmt " + usingStmt).Sort().Rows() - useCache := "0" - if execCase.UseCache { - useCache = "1" - } - tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows(useCache)) // check whether the result is correct tmp := strings.Split(prepCase.PrepStmt, "?") - c.Assert(len(tmp), Equals, len(execCase.Parameters)+1) + require.Equal(t, len(execCase.Parameters)+1, len(tmp)) query := "" for i := range tmp { query += tmp[i] @@ -548,19 +917,19 @@ func (s *testPrepareSuite) TestPlanCacheXXX(c *C) { } } -func (s *testSerialSuite) TestIssue28782(c *C) { +func TestIssue28782(t *testing.T) { store, dom, err := newStoreWithBootstrap() - c.Assert(err, IsNil) - tk := testkit.NewTestKit(c, store) - defer func() { - dom.Close() - store.Close() - }() + require.NoError(t, err) orgEnable := plannercore.PreparedPlanCacheEnabled() defer func() { plannercore.SetPreparedPlanCache(orgEnable) }() plannercore.SetPreparedPlanCache(true) + tk := testkit.NewTestKit(t, store) + defer func() { + dom.Close() + require.NoError(t, store.Close()) + }() tk.MustExec("use test") tk.MustExec("set @@tidb_enable_collect_execution_info=0;") tk.MustExec("prepare stmt from 'SELECT IF(?, 1, 0);';") @@ -573,19 +942,100 @@ func (s *testSerialSuite) TestIssue28782(c *C) { tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) } -func (s *testSerialSuite) TestIssue28087And28162(c *C) { +func TestIssue29101(t *testing.T) { store, dom, err := newStoreWithBootstrap() - c.Assert(err, IsNil) - tk := testkit.NewTestKit(c, store) + require.NoError(t, err) + orgEnable := plannercore.PreparedPlanCacheEnabled() + defer func() { + plannercore.SetPreparedPlanCache(orgEnable) + }() + plannercore.SetPreparedPlanCache(true) + tk := testkit.NewTestKit(t, store) defer func() { dom.Close() - store.Close() + require.NoError(t, store.Close()) }() + + tk.MustExec(`use test`) + tk.MustExec("set @@tidb_enable_collect_execution_info=0;") + tk.MustExec(`CREATE TABLE customer ( + c_id int(11) NOT NULL, + c_d_id int(11) NOT NULL, + c_w_id int(11) NOT NULL, + c_first varchar(16) DEFAULT NULL, + c_last varchar(16) DEFAULT NULL, + c_credit char(2) DEFAULT NULL, + c_discount decimal(4,4) DEFAULT NULL, + PRIMARY KEY (c_w_id,c_d_id,c_id), + KEY idx_customer (c_w_id,c_d_id,c_last,c_first) + )`) + tk.MustExec(`CREATE TABLE warehouse ( + w_id int(11) NOT NULL, + w_tax decimal(4,4) DEFAULT NULL, + PRIMARY KEY (w_id) + )`) + tk.MustExec(`prepare s1 from 'SELECT /*+ TIDB_INLJ(customer,warehouse) */ c_discount, c_last, c_credit, w_tax FROM customer, warehouse WHERE w_id = ? AND c_w_id = w_id AND c_d_id = ? AND c_id = ?'`) + tk.MustExec(`set @a=936,@b=7,@c=158`) + tk.MustQuery(`execute s1 using @a,@b,@c`).Check(testkit.Rows()) + tkProcess := tk.Session().ShowProcess() + ps := []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)).Check(testkit.Rows( // can use IndexJoin + `Projection_6 1.00 root test.customer.c_discount, test.customer.c_last, test.customer.c_credit, test.warehouse.w_tax`, + `└─IndexJoin_14 1.00 root inner join, inner:TableReader_10, outer key:test.customer.c_w_id, inner key:test.warehouse.w_id, equal cond:eq(test.customer.c_w_id, test.warehouse.w_id)`, + ` ├─Point_Get_33(Build) 1.00 root table:customer, index:PRIMARY(c_w_id, c_d_id, c_id) `, + ` └─TableReader_10(Probe) 0.00 root data:Selection_9`, + ` └─Selection_9 0.00 cop[tikv] eq(test.warehouse.w_id, 936)`, + ` └─TableRangeScan_8 1.00 cop[tikv] table:warehouse range: decided by [test.customer.c_w_id], keep order:false, stats:pseudo`)) + tk.MustQuery(`execute s1 using @a,@b,@c`).Check(testkit.Rows()) + tk.MustQuery(`select @@last_plan_from_cache`).Check(testkit.Rows("1")) // can use the plan-cache + + tk.MustExec(`CREATE TABLE order_line ( + ol_o_id int(11) NOT NULL, + ol_d_id int(11) NOT NULL, + ol_w_id int(11) NOT NULL, + ol_number int(11) NOT NULL, + ol_i_id int(11) NOT NULL, + PRIMARY KEY (ol_w_id,ol_d_id,ol_o_id,ol_number))`) + tk.MustExec(`CREATE TABLE stock ( + s_i_id int(11) NOT NULL, + s_w_id int(11) NOT NULL, + s_quantity int(11) DEFAULT NULL, + PRIMARY KEY (s_w_id,s_i_id))`) + tk.MustExec(`prepare s1 from 'SELECT /*+ TIDB_INLJ(order_line,stock) */ COUNT(DISTINCT (s_i_id)) stock_count FROM order_line, stock WHERE ol_w_id = ? AND ol_d_id = ? AND ol_o_id < ? AND ol_o_id >= ? - 20 AND s_w_id = ? AND s_i_id = ol_i_id AND s_quantity < ?'`) + tk.MustExec(`set @a=391,@b=1,@c=3058,@d=18`) + tk.MustExec(`execute s1 using @a,@b,@c,@c,@a,@d`) + tkProcess = tk.Session().ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)).Check(testkit.Rows( // can use index-join + `StreamAgg_9 1.00 root funcs:count(distinct test.stock.s_i_id)->Column#11`, + `└─IndexJoin_14 0.03 root inner join, inner:IndexLookUp_13, outer key:test.order_line.ol_i_id, inner key:test.stock.s_i_id, equal cond:eq(test.order_line.ol_i_id, test.stock.s_i_id)`, + ` ├─Selection_30(Build) 0.03 root eq(test.order_line.ol_d_id, 1), eq(test.order_line.ol_w_id, 391), ge(test.order_line.ol_o_id, 3038), lt(test.order_line.ol_o_id, 3058)`, + ` │ └─IndexLookUp_29 0.03 root `, + ` │ ├─IndexRangeScan_27(Build) 0.03 cop[tikv] table:order_line, index:PRIMARY(ol_w_id, ol_d_id, ol_o_id, ol_number) range:[391 1 3038,391 1 3058), keep order:false, stats:pseudo`, + ` │ └─TableRowIDScan_28(Probe) 0.03 cop[tikv] table:order_line keep order:false, stats:pseudo`, + ` └─IndexLookUp_13(Probe) 1.00 root `, + ` ├─IndexRangeScan_10(Build) 1.00 cop[tikv] table:stock, index:PRIMARY(s_w_id, s_i_id) range: decided by [eq(test.stock.s_i_id, test.order_line.ol_i_id) eq(test.stock.s_w_id, 391)], keep order:false, stats:pseudo`, + ` └─Selection_12(Probe) 1.00 cop[tikv] lt(test.stock.s_quantity, 18)`, + ` └─TableRowIDScan_11 1.00 cop[tikv] table:stock keep order:false, stats:pseudo`)) + tk.MustExec(`execute s1 using @a,@b,@c,@c,@a,@d`) + tk.MustQuery(`select @@last_plan_from_cache`).Check(testkit.Rows("1")) // can use the plan-cache +} + +func TestIssue28087And28162(t *testing.T) { + store, dom, err := newStoreWithBootstrap() + require.NoError(t, err) orgEnable := plannercore.PreparedPlanCacheEnabled() defer func() { plannercore.SetPreparedPlanCache(orgEnable) }() plannercore.SetPreparedPlanCache(true) + tk := testkit.NewTestKit(t, store) + defer func() { + dom.Close() + require.NoError(t, store.Close()) + }() // issue 28087 tk.MustExec(`use test`) @@ -597,7 +1047,7 @@ func (s *testSerialSuite) TestIssue28087And28162(c *C) { tk.MustQuery(`execute stmt using @a,@b,@c`).Check(testkit.Rows("\x01")) tk.MustExec(`set @a=0x00, @b=0x00, @c=0x01`) tk.MustQuery(`execute stmt using @a,@b,@c`).Check(testkit.Rows("\x00", "\x01")) - tk.MustQuery(`select @@last_plan_from_cache`).Check(testkit.Rows("1")) + tk.MustQuery(`select @@last_plan_from_cache`).Check(testkit.Rows("0")) // issue 28162 tk.MustExec(`drop table if exists IDT_MC21780`) @@ -616,49 +1066,309 @@ func (s *testSerialSuite) TestIssue28087And28162(c *C) { tk.MustQuery(`select @@last_plan_from_cache`).Check(testkit.Rows("1")) } -func (s *testSerialSuite) TestIssue28064(c *C) { +func TestParameterPushDown(t *testing.T) { store, dom, err := newStoreWithBootstrap() - c.Assert(err, IsNil) - tk := testkit.NewTestKit(c, store) + require.NoError(t, err) + orgEnable := plannercore.PreparedPlanCacheEnabled() + defer func() { + plannercore.SetPreparedPlanCache(orgEnable) + }() + plannercore.SetPreparedPlanCache(true) + tk := testkit.NewTestKit(t, store) defer func() { dom.Close() - store.Close() + require.NoError(t, store.Close()) }() + require.NoError(t, err) + tk.MustExec(`use test`) + tk.MustExec(`drop table if exists t`) + tk.MustExec(`create table t (a int, b int, c int, key(a))`) + tk.MustExec(`insert into t values (1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4), (5, 5, 5), (6, 6, 6)`) + tk.MustExec("set @@tidb_enable_collect_execution_info=0;") + tk.MustExec(`set @x1=1,@x5=5,@x10=10,@x20=20`) + + var input []struct { + SQL string + } + var output []struct { + Result []string + Plan []string + FromCache string + } + prepareMergeSuiteData.GetTestCases(t, &input, &output) + + for i, tt := range input { + if strings.HasPrefix(tt.SQL, "execute") { + res := tk.MustQuery(tt.SQL).Sort() + fromCache := tk.MustQuery("select @@last_plan_from_cache") + tk.MustQuery(tt.SQL) + tkProcess := tk.Session().ShowProcess() + ps := []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + plan := tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)) + + testdata.OnRecord(func() { + output[i].Result = testdata.ConvertRowsToStrings(res.Rows()) + output[i].Plan = testdata.ConvertRowsToStrings(plan.Rows()) + output[i].FromCache = fromCache.Rows()[0][0].(string) + }) + + res.Check(testkit.Rows(output[i].Result...)) + plan.Check(testkit.Rows(output[i].Plan...)) + require.Equal(t, fromCache.Rows()[0][0].(string), output[i].FromCache) + } else { + tk.MustExec(tt.SQL) + testdata.OnRecord(func() { + output[i].Result = nil + }) + } + } +} + +func TestPreparePlanCache4Function(t *testing.T) { + store, dom, err := newStoreWithBootstrap() + require.NoError(t, err) orgEnable := plannercore.PreparedPlanCacheEnabled() defer func() { plannercore.SetPreparedPlanCache(orgEnable) }() plannercore.SetPreparedPlanCache(true) + tk := testkit.NewTestKit(t, store) + defer func() { + dom.Close() + require.NoError(t, store.Close()) + }() + tk.MustExec("use test") - tk.MustExec("drop table if exists t28064") - tk.MustExec("CREATE TABLE `t28064` (" + - "`a` decimal(10,0) DEFAULT NULL," + - "`b` decimal(10,0) DEFAULT NULL," + - "`c` decimal(10,0) DEFAULT NULL," + - "`d` decimal(10,0) DEFAULT NULL," + - "KEY `iabc` (`a`,`b`,`c`));") - tk.MustExec("set @a='123', @b='234', @c='345';") tk.MustExec("set @@tidb_enable_collect_execution_info=0;") - tk.MustExec("prepare stmt1 from 'select * from t28064 use index (iabc) where a = ? and b = ? and c = ?';") - tk.MustExec("execute stmt1 using @a, @b, @c;") - tkProcess := tk.Se.ShowProcess() + // Testing for non-deterministic functions + tk.MustExec("prepare stmt from 'select rand()';") + res := tk.MustQuery("execute stmt;") + require.Equal(t, 1, len(res.Rows())) + + res1 := tk.MustQuery("execute stmt;") + require.Equal(t, 1, len(res1.Rows())) + require.NotEqual(t, res.Rows()[0][0], res1.Rows()[0][0]) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + + // Testing for control functions + tk.MustExec("prepare stmt from 'SELECT IFNULL(?,0);';") + tk.MustExec("set @a = 1, @b = null;") + tk.MustQuery("execute stmt using @a;").Check(testkit.Rows("1")) + tk.MustQuery("execute stmt using @b;").Check(testkit.Rows("0")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a int);") + tk.MustExec("prepare stmt from 'select a, case when a = ? then 0 when a <=> ? then 1 else 2 end b from t order by a;';") + tk.MustExec("insert into t values(0), (1), (2), (null);") + tk.MustExec("set @a = 0, @b = 1, @c = 2, @d = null;") + tk.MustQuery("execute stmt using @a, @b;").Check(testkit.Rows("<nil> 2", "0 0", "1 1", "2 2")) + tk.MustQuery("execute stmt using @c, @d;").Check(testkit.Rows("<nil> 1", "0 2", "1 2", "2 0")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) +} + +func TestPreparePlanCache4DifferentSystemVars(t *testing.T) { + store, dom, err := newStoreWithBootstrap() + require.NoError(t, err) + orgEnable := plannercore.PreparedPlanCacheEnabled() + defer func() { + plannercore.SetPreparedPlanCache(orgEnable) + }() + plannercore.SetPreparedPlanCache(true) + tk := testkit.NewTestKit(t, store) + defer func() { + dom.Close() + require.NoError(t, store.Close()) + }() + + tk.MustExec("use test") + tk.MustExec("set @@tidb_enable_collect_execution_info=0;") + + // Testing for 'sql_select_limit' + tk.MustExec("set @@sql_select_limit = 1") + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a int);") + tk.MustExec("insert into t values(0), (1), (null);") + tk.MustExec("prepare stmt from 'select a from t order by a;';") + tk.MustQuery("execute stmt;").Check(testkit.Rows("<nil>")) + + tk.MustExec("set @@sql_select_limit = 2") + tk.MustQuery("execute stmt;").Check(testkit.Rows("<nil>", "0")) + // The 'sql_select_limit' will be stored in the cache key. So if the `sql_select_limit` + // have been changed, the plan cache can not be reused. + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) + + tk.MustExec("set @@sql_select_limit = 18446744073709551615") + tk.MustQuery("execute stmt;").Check(testkit.Rows("<nil>", "0", "1")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) + + // test for 'tidb_enable_index_merge' + tk.MustExec("set @@tidb_enable_index_merge = 1;") + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a int, b int, index idx_a(a), index idx_b(b));") + tk.MustExec("prepare stmt from 'select * from t use index(idx_a, idx_b) where a > 1 or b > 1;';") + tk.MustExec("execute stmt;") + tkProcess := tk.Session().ShowProcess() ps := []*util.ProcessInfo{tkProcess} - tk.Se.SetSessionManager(&mockSessionManager1{PS: ps}) - rows := tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)) - rows.Check(testkit.Rows("Selection_8 0.00 root eq(test.t28064.a, 123), eq(test.t28064.b, 234), eq(test.t28064.c, 345)", - "└─IndexLookUp_7 0.00 root ", - " ├─IndexRangeScan_5(Build) 0.00 cop[tikv] table:t28064, index:iabc(a, b, c) range:[123 234 345,123 234 345], keep order:false, stats:pseudo", - " └─TableRowIDScan_6(Probe) 0.00 cop[tikv] table:t28064 keep order:false, stats:pseudo")) + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + res := tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) + require.Equal(t, 4, len(res.Rows())) + require.Contains(t, res.Rows()[0][0], "IndexMerge") - tk.MustExec("execute stmt1 using @a, @b, @c;") - rows = tk.MustQuery("select @@last_plan_from_cache") - rows.Check(testkit.Rows("1")) + tk.MustExec("set @@tidb_enable_index_merge = 0;") + tk.MustExec("execute stmt;") + tkProcess = tk.Session().ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + res = tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) + require.Equal(t, 4, len(res.Rows())) + require.Contains(t, res.Rows()[0][0], "IndexMerge") + tk.MustExec("execute stmt;") + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) - tk.MustExec("execute stmt1 using @a, @b, @c;") - rows = tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)) - rows.Check(testkit.Rows("Selection_8 0.00 root eq(test.t28064.a, 123), eq(test.t28064.b, 234), eq(test.t28064.c, 345)", - "└─IndexLookUp_7 0.00 root ", - " ├─IndexRangeScan_5(Build) 0.00 cop[tikv] table:t28064, index:iabc(a, b, c) range:[123 234 345,123 234 345], keep order:false, stats:pseudo", - " └─TableRowIDScan_6(Probe) 0.00 cop[tikv] table:t28064 keep order:false, stats:pseudo")) + // test for 'tidb_enable_parallel_apply' + tk.MustExec("set @@tidb_enable_collect_execution_info=1;") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int, b int)") + tk.MustExec("insert into t values (0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (null, null)") + + tk.MustExec("set tidb_enable_parallel_apply=true") + tk.MustExec("prepare stmt from 'select t1.b from t t1 where t1.b > (select max(b) from t t2 where t1.a > t2.a);';") + tk.MustQuery("execute stmt;").Sort().Check(testkit.Rows("1", "2", "3", "4", "5", "6", "7", "8", "9")) + tkProcess = tk.Session().ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + res = tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) + require.Contains(t, res.Rows()[1][0], "Apply") + require.Contains(t, res.Rows()[1][5], "Concurrency") + + tk.MustExec("set tidb_enable_parallel_apply=false") + tk.MustQuery("execute stmt;").Sort().Check(testkit.Rows("1", "2", "3", "4", "5", "6", "7", "8", "9")) + tkProcess = tk.Session().ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + res = tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) + require.Contains(t, res.Rows()[1][0], "Apply") + executionInfo := fmt.Sprintf("%v", res.Rows()[1][4]) + // Do not use the parallel apply. + require.False(t, strings.Contains(executionInfo, "Concurrency")) + tk.MustExec("execute stmt;") + // The subquery plan can not be cached. + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) + + // test for apply cache + tk.MustExec("set @@tidb_enable_collect_execution_info=1;") + tk.MustExec("set tidb_mem_quota_apply_cache=33554432") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int, b int)") + tk.MustExec("insert into t values (0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (null, null)") + + tk.MustExec("prepare stmt from 'select t1.b from t t1 where t1.b > (select max(b) from t t2 where t1.a > t2.a);';") + tk.MustQuery("execute stmt;").Sort().Check(testkit.Rows("1", "2", "3", "4", "5", "6", "7", "8", "9")) + tkProcess = tk.Session().ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + res = tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) + require.Contains(t, res.Rows()[1][0], "Apply") + require.Contains(t, res.Rows()[1][5], "cache:ON") + + tk.MustExec("set tidb_mem_quota_apply_cache=0") + tk.MustQuery("execute stmt;").Sort().Check(testkit.Rows("1", "2", "3", "4", "5", "6", "7", "8", "9")) + tkProcess = tk.Session().ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + res = tk.MustQuery("explain for connection " + strconv.FormatUint(tkProcess.ID, 10)) + require.Contains(t, res.Rows()[1][0], "Apply") + executionInfo = fmt.Sprintf("%v", res.Rows()[1][5]) + // Do not use the apply cache. + require.True(t, strings.Contains(executionInfo, "cache:OFF")) + tk.MustExec("execute stmt;") + // The subquery plan can not be cached. + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) +} + +func TestTemporaryTable4PlanCache(t *testing.T) { + store, dom, err := newStoreWithBootstrap() + require.NoError(t, err) + orgEnable := plannercore.PreparedPlanCacheEnabled() + defer func() { + plannercore.SetPreparedPlanCache(orgEnable) + }() + plannercore.SetPreparedPlanCache(true) + tk := testkit.NewTestKit(t, store) + defer func() { + dom.Close() + require.NoError(t, store.Close()) + }() + tk.MustExec("use test") + tk.MustExec("set @@tidb_enable_collect_execution_info=0;") + tk.MustExec("drop table if exists tmp2") + tk.MustExec("create temporary table tmp2 (a int, b int, key(a), key(b));") + tk.MustExec("prepare stmt from 'select * from tmp2;';") + tk.MustQuery("execute stmt;").Check(testkit.Rows()) + tk.MustQuery("execute stmt;").Check(testkit.Rows()) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) + + tk.MustExec("drop table if exists tmp_t;") + tk.MustExec("create global temporary table tmp_t (id int primary key, a int, b int, index(a)) on commit delete rows") + tk.MustExec("prepare stmt from 'select * from tmp_t;';") + tk.MustQuery("execute stmt;").Check(testkit.Rows()) + tk.MustQuery("execute stmt;").Check(testkit.Rows()) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) + +} + +func TestPrepareStmtAfterIsolationReadChange(t *testing.T) { + if israce.RaceEnabled { + t.Skip("race test for this case takes too long time") + } + store, clean := testkit.CreateMockStore(t) + defer clean() + orgEnable := plannercore.PreparedPlanCacheEnabled() + defer func() { + plannercore.SetPreparedPlanCache(orgEnable) + }() + plannercore.SetPreparedPlanCache(false) // requires plan cache disabled + tk := testkit.NewTestKit(t, store) + tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "localhost", CurrentUser: true, AuthUsername: "root", AuthHostname: "%"}, nil, []byte("012345678901234567890")) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int)") + // create virtual tiflash replica. + dom := domain.GetDomain(tk.Session()) + is := dom.InfoSchema() + db, exists := is.SchemaByName(model.NewCIStr("test")) + require.True(t, exists) + for _, tblInfo := range db.Tables { + if tblInfo.Name.L == "t" { + tblInfo.TiFlashReplica = &model.TiFlashReplicaInfo{ + Count: 1, + Available: true, + } + } + } + + tk.MustExec("set @@session.tidb_isolation_read_engines='tikv'") + tk.MustExec("set @@tidb_enable_collect_execution_info=0;") + tk.MustExec("prepare stmt from \"select * from t\"") + tk.MustQuery("execute stmt") + tkProcess := tk.Session().ShowProcess() + ps := []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + rows := tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)).Rows() + require.Equal(t, "cop[tikv]", rows[len(rows)-1][2]) + + tk.MustExec("set @@session.tidb_isolation_read_engines='tiflash'") + tk.MustExec("execute stmt") + tkProcess = tk.Session().ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Session().SetSessionManager(&mockSessionManager1{PS: ps}) + rows = tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)).Rows() + require.Equal(t, rows[len(rows)-1][2], "cop[tiflash]") + + require.Equal(t, 1, len(tk.Session().GetSessionVars().PreparedStmts)) + require.Equal(t, "select * from `t`", tk.Session().GetSessionVars().PreparedStmts[1].(*plannercore.CachedPrepareStmt).NormalizedSQL) + require.Equal(t, "", tk.Session().GetSessionVars().PreparedStmts[1].(*plannercore.CachedPrepareStmt).NormalizedPlan) } diff --git a/executor/replace.go b/executor/replace.go index cd7a3d44a7bb4..78e0085aa520e 100644 --- a/executor/replace.go +++ b/executor/replace.go @@ -23,12 +23,12 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta/autoid" - "github.com/pingcap/tidb/parser/charset" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/memory" "go.uber.org/zap" @@ -99,11 +99,7 @@ func (e *ReplaceExec) EqualDatumsAsBinary(sc *stmtctx.StatementContext, a []type return false, nil } for i, ai := range a { - collation := ai.Collation() - // We should use binary collation to compare datum, otherwise the result will be incorrect - ai.SetCollation(charset.CollationBin) - v, err := ai.CompareDatum(sc, &b[i]) - ai.SetCollation(collation) + v, err := ai.Compare(sc, &b[i], collate.GetBinaryCollator()) if err != nil { return false, errors.Trace(err) } @@ -226,7 +222,7 @@ func (e *ReplaceExec) exec(ctx context.Context, newRows [][]types.Datum) error { defer snapshot.SetOption(kv.CollectRuntimeStats, nil) } } - setResourceGroupTagForTxn(e.ctx.GetSessionVars().StmtCtx, txn) + setResourceGroupTaggerForTxn(e.ctx.GetSessionVars().StmtCtx, txn) prefetchStart := time.Now() // Use BatchGet to fill cache. // It's an optimization and could be removed without affecting correctness. diff --git a/executor/revoke.go b/executor/revoke.go index ac279e65828b2..5a66cf3e405ee 100644 --- a/executor/revoke.go +++ b/executor/revoke.go @@ -216,7 +216,7 @@ func (e *RevokeExec) revokeGlobalPriv(internalSession sessionctx.Context, priv * if err != nil { return err } - sqlexec.MustFormatSQL(sql, " WHERE User=%? AND Host=%?", user, host) + sqlexec.MustFormatSQL(sql, " WHERE User=%? AND Host=%?", user, strings.ToLower(host)) _, err = internalSession.(sqlexec.SQLExecutor).ExecuteInternal(context.Background(), sql.String()) return err diff --git a/executor/seqtest/prepared_serial_test.go b/executor/seqtest/prepared_test.go similarity index 99% rename from executor/seqtest/prepared_serial_test.go rename to executor/seqtest/prepared_test.go index 1b7ad95a597a3..42fbf72164e54 100644 --- a/executor/seqtest/prepared_serial_test.go +++ b/executor/seqtest/prepared_test.go @@ -168,7 +168,7 @@ func TestPrepared(t *testing.T) { require.NoError(t, err) rs, err = stmt.Exec(ctx) require.NoError(t, err) - req := rs.NewChunk() + req := rs.NewChunk(nil) err = rs.Next(ctx, req) require.NoError(t, err) require.NoError(t, rs.Close()) diff --git a/executor/seqtest/seq_executor_serial_test.go b/executor/seqtest/seq_executor_test.go similarity index 99% rename from executor/seqtest/seq_executor_serial_test.go rename to executor/seqtest/seq_executor_test.go index 2ea152f20a49e..6b0f3de5f6a2c 100644 --- a/executor/seqtest/seq_executor_serial_test.go +++ b/executor/seqtest/seq_executor_test.go @@ -96,7 +96,7 @@ func TestEarlyClose(t *testing.T) { rss, err := tk.Session().Execute(ctx, "select * from earlyclose order by id") require.NoError(t, err) rs := rss[0] - req := rs.NewChunk() + req := rs.NewChunk(nil) require.NoError(t, rs.Next(ctx, req)) require.NoError(t, rs.Close()) } @@ -109,7 +109,7 @@ func TestEarlyClose(t *testing.T) { rss, err := tk.Session().Execute(ctx, "select * from earlyclose") require.NoError(t, err) rs := rss[0] - req := rs.NewChunk() + req := rs.NewChunk(nil) err = rs.Next(ctx, req) require.Error(t, err) require.NoError(t, rs.Close()) @@ -497,7 +497,7 @@ func TestShow(t *testing.T) { tk.MustQuery("show create table t").Check(testutil.RowsWithSep("|", "t CREATE TABLE `t` (\n"+ " `a` int(11) DEFAULT NULL\n"+ - ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin"+"\nPARTITION BY RANGE ( `a` ) (\n PARTITION `p0` VALUES LESS THAN (10),\n PARTITION `p1` VALUES LESS THAN (20),\n PARTITION `p2` VALUES LESS THAN (MAXVALUE)\n)", + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin"+"\nPARTITION BY RANGE (`a`)\n(PARTITION `p0` VALUES LESS THAN (10),\n PARTITION `p1` VALUES LESS THAN (20),\n PARTITION `p2` VALUES LESS THAN (MAXVALUE))", )) tk.MustExec(`drop table if exists t`) @@ -529,8 +529,8 @@ func TestShow(t *testing.T) { tk.MustQuery("show create table t").Check(testutil.RowsWithSep("|", "t CREATE TABLE `t` (\n"+ " `a` int(11) DEFAULT NULL\n"+ - ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin"+"\nPARTITION BY HASH( `a` )\nPARTITIONS 4", - )) + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n"+ + "PARTITION BY HASH (`a`) PARTITIONS 4")) // Test show create table compression type. tk.MustExec(`drop table if exists t1`) @@ -600,8 +600,7 @@ func TestShow(t *testing.T) { for _, sql := range sqls { res := tk.MustQuery(sql) require.NotNil(t, res) - sorted := tk.MustQuery(sql).Sort() - require.NotNil(t, sorted) + sorted := res.Sort() require.Equal(t, sorted, res) } } @@ -665,7 +664,7 @@ func TestIndexDoubleReadClose(t *testing.T) { rs, err := tk.Exec("select * from dist where c_idx between 0 and 100") require.NoError(t, err) - req := rs.NewChunk() + req := rs.NewChunk(nil) err = rs.Next(context.Background(), req) require.NoError(t, err) require.NoError(t, err) @@ -720,7 +719,7 @@ func TestParallelHashAggClose(t *testing.T) { rss, err := tk.Session().Execute(ctx, "select sum(a) from (select cast(t.a as signed) as a, b from t) t group by b;") require.NoError(t, err) rs := rss[0] - req := rs.NewChunk() + req := rs.NewChunk(nil) err = rs.Next(ctx, req) require.EqualError(t, err, "HashAggExec.parallelExec error") } @@ -743,7 +742,7 @@ func TestUnparallelHashAggClose(t *testing.T) { rss, err := tk.Session().Execute(ctx, "select sum(distinct a) from (select cast(t.a as signed) as a, b from t) t group by b;") require.NoError(t, err) rs := rss[0] - req := rs.NewChunk() + req := rs.NewChunk(nil) err = rs.Next(ctx, req) require.EqualError(t, err, "HashAggExec.unparallelExec error") } diff --git a/executor/set.go b/executor/set.go index 8a722fb9c298e..65e21d470cc78 100644 --- a/executor/set.go +++ b/executor/set.go @@ -16,7 +16,9 @@ package executor import ( "context" + "strconv" "strings" + "time" "github.com/pingcap/errors" "github.com/pingcap/tidb/domain" @@ -32,6 +34,7 @@ import ( "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/gcutil" "github.com/pingcap/tidb/util/logutil" + pd "github.com/tikv/pd/client" "go.uber.org/zap" ) @@ -121,6 +124,11 @@ func (e *SetExecutor) setSysVariable(ctx context.Context, name string, v *expres if err != nil { return err } + // Some PD client dynamic options need to be checked first and set here. + err = e.checkPDClientDynamicOption(name, sessionVars) + if err != nil { + return err + } err = plugin.ForeachPlugin(plugin.Audit, func(p *plugin.Plugin) error { auditPlugin := plugin.DeclareAuditManifest(p.Manifest) if auditPlugin.OnGlobalVariableEvent != nil { @@ -196,6 +204,45 @@ func (e *SetExecutor) setSysVariable(ctx context.Context, name string, v *expres return nil } +func (e *SetExecutor) checkPDClientDynamicOption(name string, sessionVars *variable.SessionVars) error { + if name != variable.TiDBTSOClientBatchMaxWaitTime && + name != variable.TiDBEnableTSOFollowerProxy { + return nil + } + var ( + err error + valStr string + ) + valStr, err = sessionVars.GlobalVarsAccessor.GetGlobalSysVar(name) + if err != nil { + return err + } + switch name { + case variable.TiDBTSOClientBatchMaxWaitTime: + var val float64 + val, err = strconv.ParseFloat(valStr, 64) + if err != nil { + return err + } + err = domain.GetDomain(e.ctx).SetPDClientDynamicOption( + pd.MaxTSOBatchWaitInterval, + time.Duration(float64(time.Millisecond)*val), + ) + if err != nil { + return err + } + logutil.BgLogger().Info("set pd client dynamic option", zap.Uint64("conn", sessionVars.ConnectionID), zap.String("name", name), zap.String("val", valStr)) + case variable.TiDBEnableTSOFollowerProxy: + val := variable.TiDBOptOn(valStr) + err = domain.GetDomain(e.ctx).SetPDClientDynamicOption(pd.EnableTSOFollowerProxy, val) + if err != nil { + return err + } + logutil.BgLogger().Info("set pd client dynamic option", zap.Uint64("conn", sessionVars.ConnectionID), zap.String("name", name), zap.String("val", valStr)) + } + return nil +} + func (e *SetExecutor) setCharset(cs, co string, isSetName bool) error { var err error sessionVars := e.ctx.GetSessionVars() diff --git a/executor/set_test.go b/executor/set_test.go index ecb06432c91cd..6b166059e6921 100644 --- a/executor/set_test.go +++ b/executor/set_test.go @@ -366,16 +366,11 @@ func (s *testSerialSuite1) TestSetVar(c *C) { tk.MustExec("set @@tidb_expensive_query_time_threshold=70") tk.MustQuery("select @@tidb_expensive_query_time_threshold;").Check(testkit.Rows("70")) - tk.MustQuery("select @@tidb_store_limit;").Check(testkit.Rows("0")) - tk.MustExec("set @@tidb_store_limit = 100") - tk.MustQuery("select @@tidb_store_limit;").Check(testkit.Rows("100")) - tk.MustQuery("select @@session.tidb_store_limit;").Check(testkit.Rows("100")) tk.MustQuery("select @@global.tidb_store_limit;").Check(testkit.Rows("0")) - tk.MustExec("set @@tidb_store_limit = 0") - + tk.MustExec("set @@global.tidb_store_limit = 100") + tk.MustQuery("select @@global.tidb_store_limit;").Check(testkit.Rows("100")) + tk.MustExec("set @@global.tidb_store_limit = 0") tk.MustExec("set global tidb_store_limit = 100") - tk.MustQuery("select @@tidb_store_limit;").Check(testkit.Rows("100")) - tk.MustQuery("select @@session.tidb_store_limit;").Check(testkit.Rows("100")) tk.MustQuery("select @@global.tidb_store_limit;").Check(testkit.Rows("100")) tk.MustQuery("select @@session.tidb_metric_query_step;").Check(testkit.Rows("60")) @@ -557,6 +552,42 @@ func (s *testSerialSuite1) TestSetVar(c *C) { tk.MustQuery("select @@session.tidb_opt_prefer_range_scan").Check(testkit.Rows("1")) tk.MustExec("set session tidb_opt_prefer_range_scan = 0") tk.MustQuery("select @@session.tidb_opt_prefer_range_scan").Check(testkit.Rows("0")) + + tk.MustQuery("select @@tidb_tso_client_batch_max_wait_time").Check(testkit.Rows("0")) + tk.MustExec("set global tidb_tso_client_batch_max_wait_time = 0.5") + tk.MustQuery("select @@tidb_tso_client_batch_max_wait_time").Check(testkit.Rows("0.5")) + tk.MustExec("set global tidb_tso_client_batch_max_wait_time = 1") + tk.MustQuery("select @@tidb_tso_client_batch_max_wait_time").Check(testkit.Rows("1")) + tk.MustExec("set global tidb_tso_client_batch_max_wait_time = 1.5") + tk.MustQuery("select @@tidb_tso_client_batch_max_wait_time").Check(testkit.Rows("1.5")) + tk.MustExec("set global tidb_tso_client_batch_max_wait_time = 10") + tk.MustQuery("select @@tidb_tso_client_batch_max_wait_time").Check(testkit.Rows("10")) + tk.MustExec("set global tidb_tso_client_batch_max_wait_time = -1") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1292 Truncated incorrect tidb_tso_client_batch_max_wait_time value: '-1'")) + tk.MustQuery("select @@tidb_tso_client_batch_max_wait_time").Check(testkit.Rows("0")) + tk.MustExec("set global tidb_tso_client_batch_max_wait_time = -0.01") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1292 Truncated incorrect tidb_tso_client_batch_max_wait_time value: '-0.01'")) + tk.MustQuery("select @@tidb_tso_client_batch_max_wait_time").Check(testkit.Rows("0")) + tk.MustExec("set global tidb_tso_client_batch_max_wait_time = 10.01") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1292 Truncated incorrect tidb_tso_client_batch_max_wait_time value: '10.01'")) + tk.MustQuery("select @@tidb_tso_client_batch_max_wait_time").Check(testkit.Rows("10")) + tk.MustExec("set global tidb_tso_client_batch_max_wait_time = 10.1") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1292 Truncated incorrect tidb_tso_client_batch_max_wait_time value: '10.1'")) + tk.MustQuery("select @@tidb_tso_client_batch_max_wait_time").Check(testkit.Rows("10")) + c.Assert(tk.ExecToErr("set tidb_tso_client_batch_max_wait_time = 1"), NotNil) + + tk.MustQuery("select @@tidb_enable_tso_follower_proxy").Check(testkit.Rows("0")) + tk.MustExec("set global tidb_enable_tso_follower_proxy = 1") + tk.MustQuery("select @@tidb_enable_tso_follower_proxy").Check(testkit.Rows("1")) + tk.MustExec("set global tidb_enable_tso_follower_proxy = 0") + tk.MustQuery("select @@tidb_enable_tso_follower_proxy").Check(testkit.Rows("0")) + c.Assert(tk.ExecToErr("set tidb_enable_tso_follower_proxy = 1"), NotNil) + + tk.MustQuery("select @@tidb_enable_historical_stats").Check(testkit.Rows("0")) + tk.MustExec("set global tidb_enable_historical_stats = 1") + tk.MustQuery("select @@tidb_enable_historical_stats").Check(testkit.Rows("1")) + tk.MustExec("set global tidb_enable_historical_stats = 0") + tk.MustQuery("select @@tidb_enable_historical_stats").Check(testkit.Rows("0")) } func (s *testSuite5) TestTruncateIncorrectIntSessionVar(c *C) { @@ -933,9 +964,9 @@ func (s *testSuite5) TestValidateSetVar(c *C) { result = tk.MustQuery("select @@tmp_table_size;") result.Check(testkit.Rows("167772161")) - tk.MustExec("set @@tmp_table_size=9223372036854775807") + tk.MustExec("set @@tmp_table_size=18446744073709551615") result = tk.MustQuery("select @@tmp_table_size;") - result.Check(testkit.Rows("9223372036854775807")) + result.Check(testkit.Rows("18446744073709551615")) _, err = tk.Exec("set @@tmp_table_size=18446744073709551616") c.Assert(terror.ErrorEqual(err, variable.ErrWrongTypeForVar), IsTrue) @@ -943,6 +974,32 @@ func (s *testSuite5) TestValidateSetVar(c *C) { _, err = tk.Exec("set @@tmp_table_size='hello'") c.Assert(terror.ErrorEqual(err, variable.ErrWrongTypeForVar), IsTrue) + tk.MustExec("set @@tidb_tmp_table_max_size=-1") + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1292|Truncated incorrect tidb_tmp_table_max_size value: '-1'")) + result = tk.MustQuery("select @@tidb_tmp_table_max_size;") + result.Check(testkit.Rows("1048576")) + + tk.MustExec("set @@tidb_tmp_table_max_size=1048575") + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1292|Truncated incorrect tidb_tmp_table_max_size value: '1048575'")) + result = tk.MustQuery("select @@tidb_tmp_table_max_size;") + result.Check(testkit.Rows("1048576")) + + tk.MustExec("set @@tidb_tmp_table_max_size=167772161") + result = tk.MustQuery("select @@tidb_tmp_table_max_size;") + result.Check(testkit.Rows("167772161")) + + tk.MustExec("set @@tidb_tmp_table_max_size=137438953472") + result = tk.MustQuery("select @@tidb_tmp_table_max_size;") + result.Check(testkit.Rows("137438953472")) + + tk.MustExec("set @@tidb_tmp_table_max_size=137438953473") + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1292|Truncated incorrect tidb_tmp_table_max_size value: '137438953473'")) + result = tk.MustQuery("select @@tidb_tmp_table_max_size;") + result.Check(testkit.Rows("137438953472")) + + _, err = tk.Exec("set @@tidb_tmp_table_max_size='hello'") + c.Assert(terror.ErrorEqual(err, variable.ErrWrongTypeForVar), IsTrue) + tk.MustExec("set @@global.connect_timeout=1") tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1292|Truncated incorrect connect_timeout value: '1'")) result = tk.MustQuery("select @@global.connect_timeout;") @@ -1474,22 +1531,22 @@ func (s *testSerialSuite) TestSetTopSQLVariables(c *C) { tk.MustQuery("select @@global.tidb_top_sql_max_statement_count;").Check(testkit.Rows("20")) c.Assert(variable.TopSQLVariable.MaxStatementCount.Load(), Equals, int64(20)) - tk.MustExec("set @@global.tidb_top_sql_max_collect=20000;") - tk.MustQuery("select @@global.tidb_top_sql_max_collect;").Check(testkit.Rows("20000")) - c.Assert(variable.TopSQLVariable.MaxCollect.Load(), Equals, int64(20000)) + tk.MustExec("set @@global.tidb_top_sql_max_collect=10000;") + tk.MustQuery("select @@global.tidb_top_sql_max_collect;").Check(testkit.Rows("10000")) + c.Assert(variable.TopSQLVariable.MaxCollect.Load(), Equals, int64(10000)) _, err = tk.Exec("set @@global.tidb_top_sql_max_collect='abc';") c.Assert(err.Error(), Equals, "[variable:1232]Incorrect argument type to variable 'tidb_top_sql_max_collect'") tk.MustExec("set @@global.tidb_top_sql_max_collect='-1';") tk.MustQuery(`show warnings`).Check(testkit.Rows("Warning 1292 Truncated incorrect tidb_top_sql_max_collect value: '-1'")) tk.MustQuery("select @@global.tidb_top_sql_max_collect;").Check(testkit.Rows("1")) - tk.MustExec("set @@global.tidb_top_sql_max_collect='500001';") - tk.MustQuery(`show warnings`).Check(testkit.Rows("Warning 1292 Truncated incorrect tidb_top_sql_max_collect value: '500001'")) - tk.MustQuery("select @@global.tidb_top_sql_max_collect;").Check(testkit.Rows("500000")) + tk.MustExec("set @@global.tidb_top_sql_max_collect='10001';") + tk.MustQuery(`show warnings`).Check(testkit.Rows("Warning 1292 Truncated incorrect tidb_top_sql_max_collect value: '10001'")) + tk.MustQuery("select @@global.tidb_top_sql_max_collect;").Check(testkit.Rows("10000")) - tk.MustExec("set @@global.tidb_top_sql_max_collect=20000;") - tk.MustQuery("select @@global.tidb_top_sql_max_collect;").Check(testkit.Rows("20000")) - c.Assert(variable.TopSQLVariable.MaxCollect.Load(), Equals, int64(20000)) + tk.MustExec("set @@global.tidb_top_sql_max_collect=5000;") + tk.MustQuery("select @@global.tidb_top_sql_max_collect;").Check(testkit.Rows("5000")) + c.Assert(variable.TopSQLVariable.MaxCollect.Load(), Equals, int64(5000)) tk.MustExec("set @@global.tidb_top_sql_report_interval_seconds=120;") tk.MustQuery("select @@global.tidb_top_sql_report_interval_seconds;").Check(testkit.Rows("120")) diff --git a/executor/show.go b/executor/show.go index f5e19ef83a4cb..2a4eac148f74e 100644 --- a/executor/show.go +++ b/executor/show.go @@ -196,6 +196,9 @@ func (e *ShowExec) fetchAll(ctx context.Context) error { case ast.ShowStatsHealthy: e.fetchShowStatsHealthy() return nil + case ast.ShowHistogramsInFlight: + e.fetchShowHistogramsInFlight() + return nil case ast.ShowColumnStatsUsage: return e.fetchShowColumnStatsUsage() case ast.ShowPlugins: @@ -517,7 +520,7 @@ func (e *ShowExec) fetchShowColumns(ctx context.Context) error { } checker := privilege.GetPrivilegeManager(e.ctx) activeRoles := e.ctx.GetSessionVars().ActiveRoles - if checker != nil && e.ctx.GetSessionVars().User != nil && !checker.RequestVerification(activeRoles, e.DBName.O, tb.Meta().Name.O, "", mysql.AllPrivMask) { + if checker != nil && e.ctx.GetSessionVars().User != nil && !checker.RequestVerification(activeRoles, e.DBName.O, tb.Meta().Name.O, "", mysql.InsertPriv|mysql.SelectPriv|mysql.UpdatePriv|mysql.ReferencesPriv) { return e.tableAccessDenied("SELECT", tb.Meta().Name.O) } @@ -972,7 +975,7 @@ func ConstructResultOfShowCreateTable(ctx sessionctx.Context, tableInfo *model.T fmt.Fprintf(buf, ` COMMENT '%s'`, format.OutputFormat(idxInfo.Comment)) } if idxInfo.Primary { - if tableInfo.PKIsHandle || tableInfo.IsCommonHandle { + if tableInfo.HasClusteredIndex() { buf.WriteString(" /*T![clustered_index] CLUSTERED */") } else { buf.WriteString(" /*T![clustered_index] NONCLUSTERED */") @@ -1193,9 +1196,12 @@ func (e *ShowExec) fetchShowCreateView() error { func fetchShowCreateTable4View(ctx sessionctx.Context, tb *model.TableInfo, buf *bytes.Buffer) { sqlMode := ctx.GetSessionVars().SQLMode - fmt.Fprintf(buf, "CREATE ALGORITHM=%s ", tb.View.Algorithm.String()) - fmt.Fprintf(buf, "DEFINER=%s@%s ", stringutil.Escape(tb.View.Definer.Username, sqlMode), stringutil.Escape(tb.View.Definer.Hostname, sqlMode)) + if tb.View.Definer.AuthUsername == "" || tb.View.Definer.AuthHostname == "" { + fmt.Fprintf(buf, "DEFINER=%s@%s ", stringutil.Escape(tb.View.Definer.Username, sqlMode), stringutil.Escape(tb.View.Definer.Hostname, sqlMode)) + } else { + fmt.Fprintf(buf, "DEFINER=%s@%s ", stringutil.Escape(tb.View.Definer.AuthUsername, sqlMode), stringutil.Escape(tb.View.Definer.AuthHostname, sqlMode)) + } fmt.Fprintf(buf, "SQL SECURITY %s ", tb.View.Security.String()) fmt.Fprintf(buf, "VIEW %s (", stringutil.Escape(tb.Name.O, sqlMode)) for i, col := range tb.Columns { @@ -1232,58 +1238,54 @@ func appendPartitionInfo(partitionInfo *model.PartitionInfo, buf *bytes.Buffer, if partitionInfo == nil { return } + // Since MySQL 5.1/5.5 is very old and TiDB aims for 5.7/8.0 compatibility, we will not + // include the /*!50100 or /*!50500 comments for TiDB. + // This also solves the issue with comments within comments that would happen for + // PLACEMENT POLICY options. if partitionInfo.Type == model.PartitionTypeHash { - fmt.Fprintf(buf, "\nPARTITION BY HASH( %s )", partitionInfo.Expr) - fmt.Fprintf(buf, "\nPARTITIONS %d", partitionInfo.Num) - return + defaultPartitionDefinitions := true + for i, def := range partitionInfo.Definitions { + if def.Name.O != fmt.Sprintf("p%d", i) { + defaultPartitionDefinitions = false + break + } + if len(def.Comment) > 0 || def.DirectPlacementOpts != nil || def.PlacementPolicyRef != nil { + defaultPartitionDefinitions = false + break + } + } + + if defaultPartitionDefinitions { + fmt.Fprintf(buf, "\nPARTITION BY HASH (%s) PARTITIONS %d", partitionInfo.Expr, partitionInfo.Num) + return + } } - // this if statement takes care of range columns case - if partitionInfo.Columns != nil && partitionInfo.Type == model.PartitionTypeRange { - buf.WriteString("\nPARTITION BY RANGE COLUMNS(") + // this if statement takes care of lists/range columns case + if partitionInfo.Columns != nil { + // partitionInfo.Type == model.PartitionTypeRange || partitionInfo.Type == model.PartitionTypeList + // Notice that MySQL uses two spaces between LIST and COLUMNS... + fmt.Fprintf(buf, "\nPARTITION BY %s COLUMNS(", partitionInfo.Type.String()) for i, col := range partitionInfo.Columns { - buf.WriteString(col.L) + buf.WriteString(stringutil.Escape(col.O, sqlMode)) if i < len(partitionInfo.Columns)-1 { buf.WriteString(",") } } - buf.WriteString(") (\n") - } else if partitionInfo.Type == model.PartitionTypeList { - if len(partitionInfo.Columns) == 0 { - fmt.Fprintf(buf, "\nPARTITION BY %s (%s) (\n", partitionInfo.Type.String(), partitionInfo.Expr) - } else { - colsName := "" - for _, col := range partitionInfo.Columns { - if len(colsName) > 0 { - colsName += "," - } - colsName += col.L - } - fmt.Fprintf(buf, "\nPARTITION BY LIST COLUMNS(%s) (\n", colsName) - } + buf.WriteString(")\n(") } else { - fmt.Fprintf(buf, "\nPARTITION BY %s ( %s ) (\n", partitionInfo.Type.String(), partitionInfo.Expr) + fmt.Fprintf(buf, "\nPARTITION BY %s (%s)\n(", partitionInfo.Type.String(), partitionInfo.Expr) } - if partitionInfo.Type == model.PartitionTypeRange { - for i, def := range partitionInfo.Definitions { - lessThans := strings.Join(def.LessThan, ",") - fmt.Fprintf(buf, " PARTITION `%s` VALUES LESS THAN (%s)", def.Name, lessThans) - if def.DirectPlacementOpts != nil { - // add direct placement info here - appendDirectPlacementInfo(def.DirectPlacementOpts, buf) - } - if def.PlacementPolicyRef != nil { - // add placement ref info here - fmt.Fprintf(buf, " /*T![placement] PLACEMENT POLICY=%s */", stringutil.Escape(def.PlacementPolicyRef.Name.O, sqlMode)) - } - if i < len(partitionInfo.Definitions)-1 { - buf.WriteString(",\n") - } else { - buf.WriteString("\n") - } + + for i, def := range partitionInfo.Definitions { + if i > 0 { + fmt.Fprintf(buf, ",\n ") } - buf.WriteString(")") - } else if partitionInfo.Type == model.PartitionTypeList { - for i, def := range partitionInfo.Definitions { + fmt.Fprintf(buf, "PARTITION %s", stringutil.Escape(def.Name.O, sqlMode)) + // PartitionTypeHash does not have any VALUES definition + if partitionInfo.Type == model.PartitionTypeRange { + lessThans := strings.Join(def.LessThan, ",") + fmt.Fprintf(buf, " VALUES LESS THAN (%s)", lessThans) + } else if partitionInfo.Type == model.PartitionTypeList { values := bytes.NewBuffer(nil) for j, inValues := range def.InValues { if j > 0 { @@ -1297,23 +1299,21 @@ func appendPartitionInfo(partitionInfo *model.PartitionInfo, buf *bytes.Buffer, values.WriteString(strings.Join(inValues, ",")) } } - fmt.Fprintf(buf, " PARTITION `%s` VALUES IN (%s)", def.Name, values.String()) - if def.DirectPlacementOpts != nil { - // add direct placement info here - appendDirectPlacementInfo(def.DirectPlacementOpts, buf) - } - if def.PlacementPolicyRef != nil { - // add placement ref info here - fmt.Fprintf(buf, " /*T![placement] PLACEMENT POLICY=%s */", stringutil.Escape(def.PlacementPolicyRef.Name.O, sqlMode)) - } - if i < len(partitionInfo.Definitions)-1 { - buf.WriteString(",\n") - } else { - buf.WriteString("\n") - } + fmt.Fprintf(buf, " VALUES IN (%s)", values.String()) + } + if len(def.Comment) > 0 { + buf.WriteString(fmt.Sprintf(" COMMENT '%s'", format.OutputFormat(def.Comment))) + } + if def.DirectPlacementOpts != nil { + // add direct placement info here + appendDirectPlacementInfo(def.DirectPlacementOpts, buf) + } + if def.PlacementPolicyRef != nil { + // add placement ref info here + fmt.Fprintf(buf, " /*T![placement] PLACEMENT POLICY=%s */", stringutil.Escape(def.PlacementPolicyRef.Name.O, sqlMode)) } - buf.WriteString(")") } + buf.WriteString(")") } // ConstructResultOfShowCreateDatabase constructs the result for show create database. @@ -1433,7 +1433,7 @@ func (e *ShowExec) fetchShowCreateUser(ctx context.Context) error { exec := e.ctx.(sqlexec.RestrictedSQLExecutor) - stmt, err := exec.ParseWithParams(ctx, `SELECT plugin FROM %n.%n WHERE User=%? AND Host=%?`, mysql.SystemDB, mysql.UserTable, userName, hostName) + stmt, err := exec.ParseWithParams(ctx, `SELECT plugin FROM %n.%n WHERE User=%? AND Host=%?`, mysql.SystemDB, mysql.UserTable, userName, strings.ToLower(hostName)) if err != nil { return errors.Trace(err) } diff --git a/executor/show_placement.go b/executor/show_placement.go index af876c555ed41..d77c0a31000f1 100644 --- a/executor/show_placement.go +++ b/executor/show_placement.go @@ -21,6 +21,7 @@ import ( "sort" "github.com/pingcap/errors" + "github.com/pingcap/tidb/domain/infosync" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/model" @@ -28,7 +29,9 @@ import ( "github.com/pingcap/tidb/privilege" "github.com/pingcap/tidb/store/helper" "github.com/pingcap/tidb/table" + "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types/json" + "github.com/pingcap/tidb/util/codec" "github.com/pingcap/tidb/util/sqlexec" ) @@ -134,7 +137,7 @@ func (e *ShowExec) fetchShowPlacementLabels(ctx context.Context) error { return nil } -func (e *ShowExec) fetchShowPlacementForDB(_ context.Context) (err error) { +func (e *ShowExec) fetchShowPlacementForDB(ctx context.Context) (err error) { checker := privilege.GetPrivilegeManager(e.ctx) if checker != nil && e.ctx.GetSessionVars().User != nil { if !checker.DBIsVisible(e.ctx.GetSessionVars().ActiveRoles, e.DBName.String()) { @@ -153,13 +156,17 @@ func (e *ShowExec) fetchShowPlacementForDB(_ context.Context) (err error) { } if placement != nil { - e.appendRow([]interface{}{"DATABASE " + dbInfo.Name.String(), placement.String()}) + schedule, err := fetchDBScheduled(ctx, nil, dbInfo) + if err != nil { + return err + } + e.appendRow([]interface{}{"DATABASE " + dbInfo.Name.String(), placement.String(), toScheduleStateString(schedule)}) } return nil } -func (e *ShowExec) fetchShowPlacementForTable(_ context.Context) (err error) { +func (e *ShowExec) fetchShowPlacementForTable(ctx context.Context) (err error) { tbl, err := e.getTable() if err != nil { return err @@ -172,14 +179,18 @@ func (e *ShowExec) fetchShowPlacementForTable(_ context.Context) (err error) { } if placement != nil { + schedule, err := fetchTableScheduled(ctx, nil, tblInfo) + if err != nil { + return err + } ident := ast.Ident{Schema: e.Table.DBInfo.Name, Name: tblInfo.Name} - e.appendRow([]interface{}{"TABLE " + ident.String(), placement.String()}) + e.appendRow([]interface{}{"TABLE " + ident.String(), placement.String(), toScheduleStateString(schedule)}) } return nil } -func (e *ShowExec) fetchShowPlacementForPartition(_ context.Context) (err error) { +func (e *ShowExec) fetchShowPlacementForPartition(ctx context.Context) (err error) { tbl, err := e.getTable() if err != nil { return err @@ -191,7 +202,8 @@ func (e *ShowExec) fetchShowPlacementForPartition(_ context.Context) (err error) } var partition *model.PartitionDefinition - for _, par := range tblInfo.Partition.Definitions { + for i := range tblInfo.Partition.Definitions { + par := tblInfo.Partition.Definitions[i] if par.Name.L == e.Partition.L { partition = &par break @@ -213,26 +225,33 @@ func (e *ShowExec) fetchShowPlacementForPartition(_ context.Context) (err error) } if placement != nil { + schedule, err := fetchPartitionScheduled(ctx, nil, partition) + if err != nil { + return err + } tableIndent := ast.Ident{Schema: e.Table.DBInfo.Name, Name: tblInfo.Name} e.appendRow([]interface{}{ fmt.Sprintf("TABLE %s PARTITION %s", tableIndent.String(), partition.Name.String()), placement.String(), + toScheduleStateString(schedule), }) } return nil } -func (e *ShowExec) fetchShowPlacement(_ context.Context) error { +func (e *ShowExec) fetchShowPlacement(ctx context.Context) error { if err := e.fetchAllPlacementPolicies(); err != nil { return err } - if err := e.fetchAllDBPlacements(); err != nil { + scheduled := make(map[int64]bool) + + if err := e.fetchAllDBPlacements(ctx, scheduled); err != nil { return err } - return e.fetchAllTablePlacements() + return e.fetchAllTablePlacements(ctx, scheduled) } func (e *ShowExec) fetchAllPlacementPolicies() error { @@ -241,13 +260,13 @@ func (e *ShowExec) fetchAllPlacementPolicies() error { for _, policy := range policies { name := policy.Name settings := policy.PlacementSettings - e.appendRow([]interface{}{"POLICY " + name.String(), settings.String()}) + e.appendRow([]interface{}{"POLICY " + name.String(), settings.String(), "NULL"}) } return nil } -func (e *ShowExec) fetchAllDBPlacements() error { +func (e *ShowExec) fetchAllDBPlacements(ctx context.Context, scheduleState map[int64]bool) error { checker := privilege.GetPrivilegeManager(e.ctx) activeRoles := e.ctx.GetSessionVars().ActiveRoles @@ -265,14 +284,18 @@ func (e *ShowExec) fetchAllDBPlacements() error { } if placement != nil { - e.appendRow([]interface{}{"DATABASE " + dbInfo.Name.String(), placement.String()}) + schedule, err := fetchDBScheduled(ctx, scheduleState, dbInfo) + if err != nil { + return err + } + e.appendRow([]interface{}{"DATABASE " + dbInfo.Name.String(), placement.String(), toScheduleStateString(schedule)}) } } return nil } -func (e *ShowExec) fetchAllTablePlacements() error { +func (e *ShowExec) fetchAllTablePlacements(ctx context.Context, scheduleState map[int64]bool) error { checker := privilege.GetPrivilegeManager(e.ctx) activeRoles := e.ctx.GetSessionVars().ActiveRoles @@ -299,20 +322,30 @@ func (e *ShowExec) fetchAllTablePlacements() error { } if tblPlacement != nil { - rows = append(rows, []interface{}{"TABLE " + ident.String(), tblPlacement.String()}) + schedule, err := fetchTableScheduled(ctx, scheduleState, tblInfo) + if err != nil { + return err + } + rows = append(rows, []interface{}{"TABLE " + ident.String(), tblPlacement.String(), toScheduleStateString(schedule)}) } if tblInfo.Partition != nil { - for _, partition := range tblInfo.Partition.Definitions { + for i := range tblInfo.Partition.Definitions { + partition := tblInfo.Partition.Definitions[i] partitionPlacement, err := e.getPartitionPlacement(tblPlacement, &partition) if err != nil { return err } if partitionPlacement != nil { + schedule, err := fetchPartitionScheduled(ctx, scheduleState, &partition) + if err != nil { + return err + } rows = append(rows, []interface{}{ fmt.Sprintf("TABLE %s PARTITION %s", ident.String(), partition.Name.String()), partitionPlacement.String(), + toScheduleStateString(schedule), }) } } @@ -387,3 +420,68 @@ func (e *ShowExec) getPolicyPlacement(policyRef *model.PolicyRefInfo) (settings } return policy.PlacementSettings, nil } + +func fetchScheduled(ctx context.Context, scheduleState map[int64]bool, id int64) (bool, error) { + if s, ok := scheduleState[id]; ok { + return s, nil + } + startKey := codec.EncodeBytes(nil, tablecodec.GenTablePrefix(id)) + endKey := codec.EncodeBytes(nil, tablecodec.GenTablePrefix(id+1)) + schedule, err := infosync.GetReplicationState(ctx, startKey, endKey) + if err == nil && scheduleState != nil { + scheduleState[id] = schedule + } + return schedule, err +} + +func fetchPartitionScheduled(ctx context.Context, scheduleState map[int64]bool, part *model.PartitionDefinition) (bool, error) { + return fetchScheduled(ctx, scheduleState, part.ID) +} + +func fetchTableScheduled(ctx context.Context, scheduleState map[int64]bool, table *model.TableInfo) (bool, error) { + schedule, err := fetchScheduled(ctx, scheduleState, table.ID) + if err != nil { + return false, err + } + if !schedule { + return false, nil + } + + if table.GetPartitionInfo() != nil { + for _, part := range table.GetPartitionInfo().Definitions { + schedule, err = fetchScheduled(ctx, scheduleState, part.ID) + if err != nil { + return false, err + } + if !schedule { + break + } + } + } + + return schedule, nil +} + +func fetchDBScheduled(ctx context.Context, scheduleState map[int64]bool, db *model.DBInfo) (bool, error) { + schedule := true + + var err error + for _, table := range db.Tables { + schedule, err = fetchTableScheduled(ctx, scheduleState, table) + if err != nil { + return false, err + } + if !schedule { + break + } + } + + return schedule, nil +} + +func toScheduleStateString(schedule bool) string { + if schedule { + return "SCHEDULED" + } + return "INPROGRESS" +} diff --git a/executor/show_placement_test.go b/executor/show_placement_test.go index d1c1d9a3467a7..f1e4b02c20dfe 100644 --- a/executor/show_placement_test.go +++ b/executor/show_placement_test.go @@ -75,7 +75,7 @@ func (s *testSuite5) TestShowPlacement(c *C) { tk.MustExec("CREATE TABLE t4 (id INT) placement policy pa1 PARTITION BY RANGE (id) (" + "PARTITION p0 VALUES LESS THAN (100) placement policy pa2," + - "PARTITION p1 VALUES LESS THAN (1000) LEADER_CONSTRAINTS=\"[+region=bj]\" FOLLOWER_CONSTRAINTS=\"[+region=sh]\"," + + "PARTITION p1 VALUES LESS THAN (1000) LEADER_CONSTRAINTS=\"[+region=bj]\" FOLLOWER_CONSTRAINTS=\"[+region=sh]\" FOLLOWERS=4," + "PARTITION p2 VALUES LESS THAN (10000)" + ")") defer tk.MustExec("drop table if exists t4") @@ -84,33 +84,33 @@ func (s *testSuite5) TestShowPlacement(c *C) { defer tk.MustExec("drop table if exists db2.t2") tk.MustQuery("show placement").Check(testkit.Rows( - "POLICY pa1 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\"", - "POLICY pa2 LEADER_CONSTRAINTS=\"[+region=us-east-1]\" FOLLOWERS=3 FOLLOWER_CONSTRAINTS=\"[+region=us-east-2]\"", - "POLICY pb1 CONSTRAINTS=\"[+disk=ssd]\" VOTERS=5 VOTER_CONSTRAINTS=\"[+region=bj]\" LEARNERS=3 LEARNER_CONSTRAINTS=\"[+region=sh]\"", - "DATABASE db2 LEADER_CONSTRAINTS=\"[+region=us-east-1]\" FOLLOWERS=3 FOLLOWER_CONSTRAINTS=\"[+region=us-east-2]\"", - "DATABASE db3 LEADER_CONSTRAINTS=\"[+region=hz]\" FOLLOWERS=3", - "TABLE db2.t2 LEADER_CONSTRAINTS=\"[+region=bj]\" FOLLOWERS=2", - "TABLE test.t1 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\"", - "TABLE test.t2 LEADER_CONSTRAINTS=\"[+region=us-east-1]\" FOLLOWERS=2", - "TABLE test.t4 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\"", - "TABLE test.t4 PARTITION p0 LEADER_CONSTRAINTS=\"[+region=us-east-1]\" FOLLOWERS=3 FOLLOWER_CONSTRAINTS=\"[+region=us-east-2]\"", - "TABLE test.t4 PARTITION p1 LEADER_CONSTRAINTS=\"[+region=bj]\" FOLLOWER_CONSTRAINTS=\"[+region=sh]\"", - "TABLE test.t4 PARTITION p2 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\"", + "POLICY pa1 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\" NULL", + "POLICY pa2 LEADER_CONSTRAINTS=\"[+region=us-east-1]\" FOLLOWERS=3 FOLLOWER_CONSTRAINTS=\"[+region=us-east-2]\" NULL", + "POLICY pb1 CONSTRAINTS=\"[+disk=ssd]\" VOTERS=5 VOTER_CONSTRAINTS=\"[+region=bj]\" LEARNERS=3 LEARNER_CONSTRAINTS=\"[+region=sh]\" NULL", + "DATABASE db2 LEADER_CONSTRAINTS=\"[+region=us-east-1]\" FOLLOWERS=3 FOLLOWER_CONSTRAINTS=\"[+region=us-east-2]\" INPROGRESS", + "DATABASE db3 LEADER_CONSTRAINTS=\"[+region=hz]\" FOLLOWERS=3 SCHEDULED", + "TABLE db2.t2 LEADER_CONSTRAINTS=\"[+region=bj]\" FOLLOWERS=2 INPROGRESS", + "TABLE test.t1 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\" INPROGRESS", + "TABLE test.t2 LEADER_CONSTRAINTS=\"[+region=us-east-1]\" FOLLOWERS=2 INPROGRESS", + "TABLE test.t4 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\" INPROGRESS", + "TABLE test.t4 PARTITION p0 LEADER_CONSTRAINTS=\"[+region=us-east-1]\" FOLLOWERS=3 FOLLOWER_CONSTRAINTS=\"[+region=us-east-2]\" INPROGRESS", + "TABLE test.t4 PARTITION p1 LEADER_CONSTRAINTS=\"[+region=bj]\" FOLLOWERS=4 FOLLOWER_CONSTRAINTS=\"[+region=sh]\" INPROGRESS", + "TABLE test.t4 PARTITION p2 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\" INPROGRESS", )) tk.MustQuery("show placement like 'POLICY%'").Check(testkit.Rows( - "POLICY pa1 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\"", - "POLICY pa2 LEADER_CONSTRAINTS=\"[+region=us-east-1]\" FOLLOWERS=3 FOLLOWER_CONSTRAINTS=\"[+region=us-east-2]\"", - "POLICY pb1 CONSTRAINTS=\"[+disk=ssd]\" VOTERS=5 VOTER_CONSTRAINTS=\"[+region=bj]\" LEARNERS=3 LEARNER_CONSTRAINTS=\"[+region=sh]\"", + "POLICY pa1 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\" NULL", + "POLICY pa2 LEADER_CONSTRAINTS=\"[+region=us-east-1]\" FOLLOWERS=3 FOLLOWER_CONSTRAINTS=\"[+region=us-east-2]\" NULL", + "POLICY pb1 CONSTRAINTS=\"[+disk=ssd]\" VOTERS=5 VOTER_CONSTRAINTS=\"[+region=bj]\" LEARNERS=3 LEARNER_CONSTRAINTS=\"[+region=sh]\" NULL", )) tk.MustQuery("show placement like 'POLICY pa%'").Check(testkit.Rows( - "POLICY pa1 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\"", - "POLICY pa2 LEADER_CONSTRAINTS=\"[+region=us-east-1]\" FOLLOWERS=3 FOLLOWER_CONSTRAINTS=\"[+region=us-east-2]\"", + "POLICY pa1 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\" NULL", + "POLICY pa2 LEADER_CONSTRAINTS=\"[+region=us-east-1]\" FOLLOWERS=3 FOLLOWER_CONSTRAINTS=\"[+region=us-east-2]\" NULL", )) tk.MustQuery("show placement where Target='POLICY pb1'").Check(testkit.Rows( - "POLICY pb1 CONSTRAINTS=\"[+disk=ssd]\" VOTERS=5 VOTER_CONSTRAINTS=\"[+region=bj]\" LEARNERS=3 LEARNER_CONSTRAINTS=\"[+region=sh]\"", + "POLICY pb1 CONSTRAINTS=\"[+disk=ssd]\" VOTERS=5 VOTER_CONSTRAINTS=\"[+region=bj]\" LEARNERS=3 LEARNER_CONSTRAINTS=\"[+region=sh]\" NULL", )) } @@ -147,7 +147,7 @@ func (s *testSuite5) TestShowPlacementPrivilege(c *C) { tk.MustExec("create table t2 (id int) LEADER_CONSTRAINTS=\"[+region=us-east-1]\" FOLLOWERS=2") defer tk.MustExec("drop table if exists t2") tk.MustExec("CREATE TABLE t3 (id INT) PARTITION BY RANGE (id) (" + - "PARTITION p1 VALUES LESS THAN (100) LEADER_CONSTRAINTS=\"[+region=bj]\" FOLLOWER_CONSTRAINTS=\"[+region=sh]\"" + + "PARTITION p1 VALUES LESS THAN (100) LEADER_CONSTRAINTS=\"[+region=bj]\" FOLLOWER_CONSTRAINTS=\"[+region=sh]\" FOLLOWERS=4" + ")") defer tk.MustExec("drop table if exists t3") tk.MustExec("create table db2.t1 (id int) LEADER_CONSTRAINTS=\"[+region=bj]\" FOLLOWERS=2") @@ -163,7 +163,7 @@ func (s *testSuite5) TestShowPlacementPrivilege(c *C) { // before grant tk1.MustQuery("show placement").Check(testkit.Rows( - "POLICY p1 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\"", + "POLICY p1 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\" NULL", )) // do some grant @@ -173,11 +173,11 @@ func (s *testSuite5) TestShowPlacementPrivilege(c *C) { // after grant tk1.MustQuery("show placement").Check(testkit.Rows( - "POLICY p1 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\"", - "DATABASE db2 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\"", - "TABLE db2.t1 LEADER_CONSTRAINTS=\"[+region=bj]\" FOLLOWERS=2", - "TABLE test.t1 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\"", - "TABLE test.t3 PARTITION p1 LEADER_CONSTRAINTS=\"[+region=bj]\" FOLLOWER_CONSTRAINTS=\"[+region=sh]\"", + "POLICY p1 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\" NULL", + "DATABASE db2 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\" INPROGRESS", + "TABLE db2.t1 LEADER_CONSTRAINTS=\"[+region=bj]\" FOLLOWERS=2 INPROGRESS", + "TABLE test.t1 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\" INPROGRESS", + "TABLE test.t3 PARTITION p1 LEADER_CONSTRAINTS=\"[+region=bj]\" FOLLOWERS=4 FOLLOWER_CONSTRAINTS=\"[+region=sh]\" INPROGRESS", )) } @@ -204,10 +204,10 @@ func (s *testSuite5) TestShowPlacementForDB(c *C) { tk.MustQuery("show placement for database test").Check(testkit.Rows()) tk.MustQuery("show placement for database db2").Check(testkit.Rows( - "DATABASE db2 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\"", + "DATABASE db2 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\" SCHEDULED", )) tk.MustQuery("show placement for database db3").Check(testkit.Rows( - "DATABASE db3 LEADER_CONSTRAINTS=\"[+region=hz]\" FOLLOWERS=3", + "DATABASE db3 LEADER_CONSTRAINTS=\"[+region=hz]\" FOLLOWERS=3 SCHEDULED", )) } @@ -228,14 +228,14 @@ func (s *testSuite5) TestShowPlacementForTableAndPartition(c *C) { tk.MustExec("create table t1 (id int) placement policy p1") defer tk.MustExec("drop table if exists t1") tk.MustQuery("show placement for table t1").Check(testkit.Rows( - "TABLE test.t1 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\"", + "TABLE test.t1 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\" INPROGRESS", )) // table direct setting tk.MustExec("create table t2 (id int) LEADER_CONSTRAINTS=\"[+region=us-east-1]\" FOLLOWERS=2") defer tk.MustExec("drop table if exists t2") tk.MustQuery("show placement for table t2").Check(testkit.Rows( - "TABLE test.t2 LEADER_CONSTRAINTS=\"[+region=us-east-1]\" FOLLOWERS=2", + "TABLE test.t2 LEADER_CONSTRAINTS=\"[+region=us-east-1]\" FOLLOWERS=2 INPROGRESS", )) // table no placement @@ -246,25 +246,25 @@ func (s *testSuite5) TestShowPlacementForTableAndPartition(c *C) { // table do not display partition placement tk.MustExec("create table t4 (id int) LEADER_CONSTRAINTS=\"[+region=us-east-1]\" FOLLOWERS=2 PARTITION BY RANGE (id) (" + "PARTITION p0 VALUES LESS THAN (100), " + - "PARTITION p1 VALUES LESS THAN (1000) LEADER_CONSTRAINTS=\"[+region=bj]\" FOLLOWER_CONSTRAINTS=\"[+region=sh]\"," + + "PARTITION p1 VALUES LESS THAN (1000) LEADER_CONSTRAINTS=\"[+region=bj]\" FOLLOWER_CONSTRAINTS=\"[+region=sh]\" FOLLOWERS=4," + "PARTITION p2 VALUES LESS THAN (10000) PLACEMENT POLICY p1" + ")") defer tk.MustExec("drop table if exists t4") tk.MustQuery("show placement for table t4").Check(testkit.Rows( - "TABLE test.t4 LEADER_CONSTRAINTS=\"[+region=us-east-1]\" FOLLOWERS=2", + "TABLE test.t4 LEADER_CONSTRAINTS=\"[+region=us-east-1]\" FOLLOWERS=2 INPROGRESS", )) // partition inherent table tk.MustQuery("show placement for table t4 partition p0").Check(testkit.Rows( - "TABLE test.t4 PARTITION p0 LEADER_CONSTRAINTS=\"[+region=us-east-1]\" FOLLOWERS=2", + "TABLE test.t4 PARTITION p0 LEADER_CONSTRAINTS=\"[+region=us-east-1]\" FOLLOWERS=2 INPROGRESS", )) // partition custom placement tk.MustQuery("show placement for table t4 partition p1").Check(testkit.Rows( - "TABLE test.t4 PARTITION p1 LEADER_CONSTRAINTS=\"[+region=bj]\" FOLLOWER_CONSTRAINTS=\"[+region=sh]\"", + "TABLE test.t4 PARTITION p1 LEADER_CONSTRAINTS=\"[+region=bj]\" FOLLOWERS=4 FOLLOWER_CONSTRAINTS=\"[+region=sh]\" INPROGRESS", )) tk.MustQuery("show placement for table t4 partition p2").Check(testkit.Rows( - "TABLE test.t4 PARTITION p2 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\"", + "TABLE test.t4 PARTITION p2 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\" INPROGRESS", )) // partition without placement @@ -279,7 +279,7 @@ func (s *testSuite5) TestShowPlacementForTableAndPartition(c *C) { tk.MustExec("create table db2.t1 (id int) LEADER_CONSTRAINTS=\"[+region=bj]\" FOLLOWERS=2") defer tk.MustExec("drop table if exists db2.t1") tk.MustQuery("show placement for table db2.t1").Check(testkit.Rows( - "TABLE db2.t1 LEADER_CONSTRAINTS=\"[+region=bj]\" FOLLOWERS=2", + "TABLE db2.t1 LEADER_CONSTRAINTS=\"[+region=bj]\" FOLLOWERS=2 INPROGRESS", )) // not exists @@ -341,12 +341,12 @@ func (s *testSuite5) TestShowPlacementForDBPrivilege(c *C) { // do grant tk.MustExec(fmt.Sprintf("grant %s to 'user1'@'%%'", priv)) tk1.MustQuery("show placement for database db2").Check(testkit.Rows( - "DATABASE db2 PRIMARY_REGION=\"r1\" REGIONS=\"r1,r2\" SCHEDULE=\"EVEN\"", + "DATABASE db2 PRIMARY_REGION=\"r1\" REGIONS=\"r1,r2\" SCHEDULE=\"EVEN\" INPROGRESS", )) tk1.MustQuery("show placement").Check(testkit.Rows( - "DATABASE db2 PRIMARY_REGION=\"r1\" REGIONS=\"r1,r2\" SCHEDULE=\"EVEN\"", - "TABLE db2.t1 PRIMARY_REGION=\"r1\" REGIONS=\"r1,r3\" SCHEDULE=\"EVEN\"", + "DATABASE db2 PRIMARY_REGION=\"r1\" REGIONS=\"r1,r2\" SCHEDULE=\"EVEN\" INPROGRESS", + "TABLE db2.t1 PRIMARY_REGION=\"r1\" REGIONS=\"r1,r3\" SCHEDULE=\"EVEN\" INPROGRESS", )) err = tk1.QueryToErr("show placement for database test") @@ -386,7 +386,7 @@ func (s *testSuite5) TestShowPlacementForTableAndPartitionPrivilege(c *C) { // prepare tables tk.MustExec("create table t1 (id int) placement policy p1 PARTITION BY RANGE (id) (" + - "PARTITION p1 VALUES LESS THAN (1000) LEADER_CONSTRAINTS=\"[+region=bj]\" FOLLOWER_CONSTRAINTS=\"[+region=sh]\"" + + "PARTITION p1 VALUES LESS THAN (1000) LEADER_CONSTRAINTS=\"[+region=bj]\" FOLLOWER_CONSTRAINTS=\"[+region=sh]\" FOLLOWERS=4" + ")") defer tk.MustExec("drop table if exists t1") tk.MustExec("create table t2 (id int) LEADER_CONSTRAINTS=\"[+region=us-east-1]\" FOLLOWERS=2") @@ -419,7 +419,7 @@ func (s *testSuite5) TestShowPlacementForTableAndPartitionPrivilege(c *C) { c.Assert(err.Error(), Equals, core.ErrTableaccessDenied.GenWithStackByArgs("SHOW", "user1", "%", "t1").Error()) tk1.MustQuery("show placement").Check(testkit.Rows( - "POLICY p1 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\"", + "POLICY p1 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\" NULL", )) privs := []string{ @@ -436,17 +436,17 @@ func (s *testSuite5) TestShowPlacementForTableAndPartitionPrivilege(c *C) { // do grant tk.MustExec(fmt.Sprintf("grant %s to 'user1'@'%%'", priv)) tk1.MustQuery("show placement").Check(testkit.Rows( - "POLICY p1 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\"", - "TABLE test.t1 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\"", - "TABLE test.t1 PARTITION p1 LEADER_CONSTRAINTS=\"[+region=bj]\" FOLLOWER_CONSTRAINTS=\"[+region=sh]\"", + "POLICY p1 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\" NULL", + "TABLE test.t1 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\" INPROGRESS", + "TABLE test.t1 PARTITION p1 LEADER_CONSTRAINTS=\"[+region=bj]\" FOLLOWERS=4 FOLLOWER_CONSTRAINTS=\"[+region=sh]\" INPROGRESS", )) tk1.MustQuery("show placement for table test.t1").Check(testkit.Rows( - "TABLE test.t1 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\"", + "TABLE test.t1 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\" INPROGRESS", )) tk1.MustQuery("show placement for table test.t1 partition p1").Check(testkit.Rows( - "TABLE test.t1 PARTITION p1 LEADER_CONSTRAINTS=\"[+region=bj]\" FOLLOWER_CONSTRAINTS=\"[+region=sh]\"", + "TABLE test.t1 PARTITION p1 LEADER_CONSTRAINTS=\"[+region=bj]\" FOLLOWERS=4 FOLLOWER_CONSTRAINTS=\"[+region=sh]\" INPROGRESS", )) err = tk1.ExecToErr("show placement for table test.t2") @@ -464,7 +464,7 @@ func (s *testSuite5) TestShowPlacementForTableAndPartitionPrivilege(c *C) { c.Assert(err.Error(), Equals, core.ErrTableaccessDenied.GenWithStackByArgs("SHOW", "user1", "%", "t1").Error()) tk1.MustQuery("show placement").Check(testkit.Rows( - "POLICY p1 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\"", + "POLICY p1 PRIMARY_REGION=\"cn-east-1\" REGIONS=\"cn-east-1,cn-east-2\" SCHEDULE=\"EVEN\" NULL", )) } } diff --git a/executor/show_stats.go b/executor/show_stats.go index 9ea89810a649e..6cfdbc70daa8c 100644 --- a/executor/show_stats.go +++ b/executor/show_stats.go @@ -443,11 +443,15 @@ func (e *ShowExec) appendTableForStatsHealthy(dbName, tblName, partitionName str }) } +func (e *ShowExec) fetchShowHistogramsInFlight() { + e.appendRow([]interface{}{statistics.HistogramNeededColumns.Length()}) +} + func (e *ShowExec) fetchShowAnalyzeStatus() { rows := dataForAnalyzeStatusHelper(e.baseExecutor.ctx) for _, row := range rows { - for i, val := range row { - e.result.AppendDatum(i, &val) + for i := range row { + e.result.AppendDatum(i, &row[i]) } } } @@ -498,14 +502,10 @@ func (e *ShowExec) fetchShowColumnStatsUsage() error { pi := tbl.GetPartitionInfo() if pi == nil || e.ctx.GetSessionVars().UseDynamicPartitionPrune() { appendTableForColumnStatsUsage(db.Name.O, tbl, pi != nil, nil) - if pi != nil { - for _, def := range pi.Definitions { - appendTableForColumnStatsUsage(db.Name.O, tbl, false, &def) - } - } - } else { - for _, def := range pi.Definitions { - appendTableForColumnStatsUsage(db.Name.O, tbl, false, &def) + } + if pi != nil { + for i := range pi.Definitions { + appendTableForColumnStatsUsage(db.Name.O, tbl, false, &pi.Definitions[i]) } } } diff --git a/executor/show_stats_test.go b/executor/show_stats_test.go index 986b69e8b35da..f48fe9988649d 100644 --- a/executor/show_stats_test.go +++ b/executor/show_stats_test.go @@ -16,66 +16,72 @@ package executor_test import ( "fmt" + "testing" "time" - . "github.com/pingcap/check" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/statistics" - "github.com/pingcap/tidb/util/testkit" + "github.com/pingcap/tidb/testkit" + "github.com/stretchr/testify/require" ) -type testShowStatsSuite struct { - *baseTestSuite -} +func TestShowStatsMeta(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() -func (s *testShowStatsSuite) TestShowStatsMeta(c *C) { - tk := testkit.NewTestKit(c, s.store) + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t, t1") tk.MustExec("create table t (a int, b int)") tk.MustExec("create table t1 (a int, b int)") tk.MustExec("analyze table t, t1") result := tk.MustQuery("show stats_meta") - c.Assert(len(result.Rows()), Equals, 2) - c.Assert(result.Rows()[0][1], Equals, "t") - c.Assert(result.Rows()[1][1], Equals, "t1") + require.Len(t, result.Rows(), 2) + require.Equal(t, "t", result.Rows()[0][1]) + require.Equal(t, "t1", result.Rows()[1][1]) result = tk.MustQuery("show stats_meta where table_name = 't'") - c.Assert(len(result.Rows()), Equals, 1) - c.Assert(result.Rows()[0][1], Equals, "t") + require.Len(t, result.Rows(), 1) + require.Equal(t, "t", result.Rows()[0][1]) } -func (s *testShowStatsSuite) TestShowStatsHistograms(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestShowStatsHistograms(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t (a int, b int)") tk.MustExec("analyze table t") result := tk.MustQuery("show stats_histograms") - c.Assert(len(result.Rows()), Equals, 0) + require.Len(t, result.Rows(), 0) tk.MustExec("insert into t values(1,1)") tk.MustExec("analyze table t") result = tk.MustQuery("show stats_histograms").Sort() - c.Assert(len(result.Rows()), Equals, 2) - c.Assert(result.Rows()[0][3], Equals, "a") - c.Assert(result.Rows()[1][3], Equals, "b") + require.Len(t, result.Rows(), 2) + require.Equal(t, "a", result.Rows()[0][3]) + require.Equal(t, "b", result.Rows()[1][3]) result = tk.MustQuery("show stats_histograms where column_name = 'a'") - c.Assert(len(result.Rows()), Equals, 1) - c.Assert(result.Rows()[0][3], Equals, "a") + require.Len(t, result.Rows(), 1) + require.Equal(t, "a", result.Rows()[0][3]) tk.MustExec("drop table t") tk.MustExec("create table t(a int, b int, c int, index idx_b(b), index idx_c_a(c, a))") tk.MustExec("insert into t values(1,null,1),(2,null,2),(3,3,3),(4,null,4),(null,null,null)") res := tk.MustQuery("show stats_histograms where table_name = 't'") - c.Assert(len(res.Rows()), Equals, 0) + require.Len(t, res.Rows(), 0) tk.MustExec("analyze table t index idx_b") res = tk.MustQuery("show stats_histograms where table_name = 't' and column_name = 'idx_b'") - c.Assert(len(res.Rows()), Equals, 1) + require.Len(t, res.Rows(), 1) } -func (s *testShowStatsSuite) TestShowStatsBuckets(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestShowStatsBuckets(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") // Simple behavior testing. Version=1 is enough. @@ -117,8 +123,11 @@ func (s *testShowStatsSuite) TestShowStatsBuckets(c *C) { result.Check(testkit.Rows("test t idx 1 0 1 1 (2020-01-01 00:00:00, 1) (2020-01-01 00:00:00, 1) 0")) } -func (s *testShowStatsSuite) TestShowStatsHasNullValue(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestShowStatsHasNullValue(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t (a int, index idx(a))") @@ -143,44 +152,47 @@ func (s *testShowStatsSuite) TestShowStatsHasNullValue(c *C) { tk.MustExec("create table t(a int, b int, c int, index idx_b(b), index idx_c_a(c, a))") tk.MustExec("insert into t values(1,null,1),(2,null,2),(3,3,3),(4,null,4),(null,null,null)") res := tk.MustQuery("show stats_histograms where table_name = 't'") - c.Assert(len(res.Rows()), Equals, 0) + require.Len(t, res.Rows(), 0) tk.MustExec("analyze table t index idx_b") res = tk.MustQuery("show stats_histograms where table_name = 't' and column_name = 'idx_b'") - c.Assert(len(res.Rows()), Equals, 1) - c.Assert(res.Rows()[0][7], Equals, "4") + require.Len(t, res.Rows(), 1) + require.Equal(t, "4", res.Rows()[0][7]) res = tk.MustQuery("show stats_histograms where table_name = 't' and column_name = 'b'") - c.Assert(len(res.Rows()), Equals, 0) + require.Len(t, res.Rows(), 0) tk.MustExec("analyze table t index idx_c_a") res = tk.MustQuery("show stats_histograms where table_name = 't' and column_name = 'idx_c_a'") - c.Assert(len(res.Rows()), Equals, 1) - c.Assert(res.Rows()[0][7], Equals, "0") + require.Len(t, res.Rows(), 1) + require.Equal(t, "0", res.Rows()[0][7]) res = tk.MustQuery("show stats_histograms where table_name = 't' and column_name = 'c'") - c.Assert(len(res.Rows()), Equals, 0) + require.Len(t, res.Rows(), 0) res = tk.MustQuery("show stats_histograms where table_name = 't' and column_name = 'a'") - c.Assert(len(res.Rows()), Equals, 0) + require.Len(t, res.Rows(), 0) tk.MustExec("truncate table t") tk.MustExec("insert into t values(1,null,1),(2,null,2),(3,3,3),(4,null,4),(null,null,null)") res = tk.MustQuery("show stats_histograms where table_name = 't'") - c.Assert(len(res.Rows()), Equals, 0) + require.Len(t, res.Rows(), 0) tk.MustExec("analyze table t index") res = tk.MustQuery("show stats_histograms where table_name = 't'").Sort() - c.Assert(len(res.Rows()), Equals, 2) - c.Assert(res.Rows()[0][7], Equals, "4") - c.Assert(res.Rows()[1][7], Equals, "0") + require.Len(t, res.Rows(), 2) + require.Equal(t, "4", res.Rows()[0][7]) + require.Equal(t, "0", res.Rows()[1][7]) tk.MustExec("truncate table t") tk.MustExec("insert into t values(1,null,1),(2,null,2),(3,3,3),(4,null,4),(null,null,null)") tk.MustExec("analyze table t") res = tk.MustQuery("show stats_histograms where table_name = 't'").Sort() - c.Assert(len(res.Rows()), Equals, 5) - c.Assert(res.Rows()[0][7], Equals, "1") - c.Assert(res.Rows()[1][7], Equals, "4") - c.Assert(res.Rows()[2][7], Equals, "1") - c.Assert(res.Rows()[3][7], Equals, "4") - c.Assert(res.Rows()[4][7], Equals, "0") + require.Len(t, res.Rows(), 5) + require.Equal(t, "1", res.Rows()[0][7]) + require.Equal(t, "4", res.Rows()[1][7]) + require.Equal(t, "1", res.Rows()[2][7]) + require.Equal(t, "4", res.Rows()[3][7]) + require.Equal(t, "0", res.Rows()[4][7]) } -func (s *testShowStatsSuite) TestShowPartitionStats(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestShowPartitionStats(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) testkit.WithPruneMode(tk, variable.Static, func() { tk.MustExec("set @@session.tidb_enable_table_partition=1") // Version2 is tested in TestGlobalStatsData1/2/3 and TestAnalyzeGlobalStatsWithOpts. @@ -194,19 +206,19 @@ func (s *testShowStatsSuite) TestShowPartitionStats(c *C) { 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") + require.Len(t, result.Rows(), 1) + require.Equal(t, "test", result.Rows()[0][0]) + require.Equal(t, "t", result.Rows()[0][1]) + require.Equal(t, "p0", result.Rows()[0][2]) result = tk.MustQuery("show stats_histograms").Sort() - c.Assert(len(result.Rows()), Equals, 3) - 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, "b") - c.Assert(result.Rows()[2][2], Equals, "p0") - c.Assert(result.Rows()[2][3], Equals, "idx") + require.Len(t, result.Rows(), 3) + require.Equal(t, "p0", result.Rows()[0][2]) + require.Equal(t, "a", result.Rows()[0][3]) + require.Equal(t, "p0", result.Rows()[1][2]) + require.Equal(t, "b", result.Rows()[1][3]) + require.Equal(t, "p0", result.Rows()[2][2]) + require.Equal(t, "idx", result.Rows()[2][3]) result = tk.MustQuery("show stats_buckets").Sort() result.Check(testkit.Rows("test t p0 a 0 0 1 1 1 1 0", "test t p0 b 0 0 1 1 1 1 0", "test t p0 idx 1 0 1 1 1 1 0")) @@ -216,55 +228,11 @@ func (s *testShowStatsSuite) TestShowPartitionStats(c *C) { }) } -func (s *testShowStatsSuite) TestShowAnalyzeStatus(c *C) { - tk := testkit.NewTestKit(c, s.store) - statistics.ClearHistoryJobs() - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t (a int, b int, primary key(a), index idx(b))") - tk.MustExec(`insert into t values (1, 1), (2, 2)`) - - tk.MustExec("set @@tidb_analyze_version=2") - tk.MustExec("analyze table t") - result := tk.MustQuery("show analyze status").Sort() - 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, "") - c.Assert(result.Rows()[0][3], Equals, "analyze table") - c.Assert(result.Rows()[0][4], Equals, "2") - c.Assert(result.Rows()[0][5], NotNil) - c.Assert(result.Rows()[0][6], NotNil) - c.Assert(result.Rows()[0][7], Equals, "finished") - - statistics.ClearHistoryJobs() - - tk.MustExec("set @@tidb_analyze_version=1") - tk.MustExec("analyze table t") - result = tk.MustQuery("show analyze status").Sort() - c.Assert(len(result.Rows()), Equals, 2) - c.Assert(result.Rows()[0][0], Equals, "test") - c.Assert(result.Rows()[0][1], Equals, "t") - c.Assert(result.Rows()[0][2], Equals, "") - c.Assert(result.Rows()[0][3], Equals, "analyze columns") - c.Assert(result.Rows()[0][4], Equals, "2") - c.Assert(result.Rows()[0][5], NotNil) - c.Assert(result.Rows()[0][6], NotNil) - c.Assert(result.Rows()[0][7], Equals, "finished") - - c.Assert(len(result.Rows()), Equals, 2) - c.Assert(result.Rows()[1][0], Equals, "test") - c.Assert(result.Rows()[1][1], Equals, "t") - c.Assert(result.Rows()[1][2], Equals, "") - c.Assert(result.Rows()[1][3], Equals, "analyze index idx") - c.Assert(result.Rows()[1][4], Equals, "2") - c.Assert(result.Rows()[1][5], NotNil) - c.Assert(result.Rows()[1][6], NotNil) - c.Assert(result.Rows()[1][7], Equals, "finished") -} +func TestShowStatusSnapshot(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() -func (s *testShowStatsSuite) TestShowStatusSnapshot(c *C) { - tk := testkit.NewTestKit(c, s.store) + tk := testkit.NewTestKit(t, store) tk.MustExec("drop database if exists test;") tk.MustExec("create database test;") tk.MustExec("use test;") @@ -285,12 +253,15 @@ func (s *testShowStatsSuite) TestShowStatusSnapshot(c *C) { tk.MustQuery("show table status;").Check(testkit.Rows()) tk.MustExec("set @@tidb_snapshot = '" + snapshotTime.Format("2006-01-02 15:04:05.999999") + "'") result := tk.MustQuery("show table status;") - c.Check(result.Rows()[0][0], Matches, "t") + require.Equal(t, "t", result.Rows()[0][0]) } -func (s *testShowStatsSuite) TestShowStatsExtended(c *C) { - tk := testkit.NewTestKit(c, s.store) - s.domain.StatsHandle().Clear() +func TestShowStatsExtended(t *testing.T) { + store, dom, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + dom.StatsHandle().Clear() tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t (a int, b int, c int)") @@ -304,7 +275,7 @@ func (s *testShowStatsSuite) TestShowStatsExtended(c *C) { "s2 0", )) result := tk.MustQuery("show stats_extended where db_name = 'test' and table_name = 't'") - c.Assert(len(result.Rows()), Equals, 0) + require.Len(t, result.Rows(), 0) tk.MustExec("analyze table t") tk.MustQuery("select name, status from mysql.stats_extended where name like 's%'").Sort().Check(testkit.Rows( @@ -312,20 +283,21 @@ func (s *testShowStatsSuite) TestShowStatsExtended(c *C) { "s2 1", )) result = tk.MustQuery("show stats_extended where db_name = 'test' and table_name = 't'").Sort() - c.Assert(len(result.Rows()), Equals, 2) - c.Assert(result.Rows()[0][0], Equals, "test") - c.Assert(result.Rows()[0][1], Equals, "t") - c.Assert(result.Rows()[0][2], Equals, "s1") - c.Assert(result.Rows()[0][3], Equals, "[a,b]") - c.Assert(result.Rows()[0][4], Equals, "correlation") - c.Assert(result.Rows()[0][5], Equals, "1.000000") - c.Assert(result.Rows()[1][0], Equals, "test") - c.Assert(result.Rows()[1][1], Equals, "t") - c.Assert(result.Rows()[1][2], Equals, "s2") - c.Assert(result.Rows()[1][3], Equals, "[a,c]") - c.Assert(result.Rows()[1][4], Equals, "correlation") - c.Assert(result.Rows()[1][5], Equals, "-1.000000") - c.Assert(result.Rows()[1][6], Equals, result.Rows()[0][6]) + require.Len(t, result.Rows(), 2) + require.Equal(t, "test", result.Rows()[0][0]) + require.Equal(t, "t", result.Rows()[0][1]) + require.Equal(t, "s1", result.Rows()[0][2]) + require.Equal(t, "[a,b]", result.Rows()[0][3]) + require.Equal(t, "correlation", result.Rows()[0][4]) + require.Equal(t, "1.000000", result.Rows()[0][5]) + + require.Equal(t, "test", result.Rows()[1][0]) + require.Equal(t, "t", result.Rows()[1][1]) + require.Equal(t, "s2", result.Rows()[1][2]) + require.Equal(t, "[a,c]", result.Rows()[1][3]) + require.Equal(t, "correlation", result.Rows()[1][4]) + require.Equal(t, "-1.000000", result.Rows()[1][5]) + require.Equal(t, result.Rows()[1][6], result.Rows()[0][6]) tk.MustExec("alter table t drop stats_extended s1") tk.MustExec("alter table t drop stats_extended s2") @@ -333,24 +305,27 @@ func (s *testShowStatsSuite) TestShowStatsExtended(c *C) { "s1 2", "s2 2", )) - s.domain.StatsHandle().Update(s.domain.InfoSchema()) + dom.StatsHandle().Update(dom.InfoSchema()) result = tk.MustQuery("show stats_extended where db_name = 'test' and table_name = 't'") - c.Assert(len(result.Rows()), Equals, 0) + require.Len(t, result.Rows(), 0) } -func (s *testShowStatsSuite) TestShowColumnStatsUsage(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestShowColumnStatsUsage(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t1, t2") tk.MustExec("create table t1 (a int, b int, index idx_a_b(a, b))") tk.MustExec("create table t2 (a int, b int) partition by range(a) (partition p0 values less than (10), partition p1 values less than (20), partition p2 values less than maxvalue)") - dom := domain.GetDomain(tk.Se) + dom := domain.GetDomain(tk.Session()) is := dom.InfoSchema() t1, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) - c.Assert(err, IsNil) + require.NoError(t, err) t2, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t2")) - c.Assert(err, IsNil) + require.NoError(t, err) tk.MustExec(fmt.Sprintf("insert into mysql.column_stats_usage values (%d, %d, null, '2021-10-20 08:00:00')", t1.Meta().ID, t1.Meta().Columns[0].ID)) tk.MustExec(fmt.Sprintf("insert into mysql.column_stats_usage values (%d, %d, '2021-10-20 09:00:00', null)", t2.Meta().ID, t2.Meta().Columns[0].ID)) p0 := t2.Meta().GetPartitionInfo().Definitions[0] @@ -358,12 +333,75 @@ func (s *testShowStatsSuite) TestShowColumnStatsUsage(c *C) { result := tk.MustQuery("show column_stats_usage where db_name = 'test' and table_name = 't1'").Sort() rows := result.Rows() - c.Assert(len(rows), Equals, 1) - c.Assert(rows[0], DeepEquals, []interface{}{"test", "t1", "", t1.Meta().Columns[0].Name.O, "<nil>", "2021-10-20 08:00:00"}) + require.Len(t, rows, 1) + require.Equal(t, rows[0], []interface{}{"test", "t1", "", t1.Meta().Columns[0].Name.O, "<nil>", "2021-10-20 08:00:00"}) result = tk.MustQuery("show column_stats_usage where db_name = 'test' and table_name = 't2'").Sort() rows = result.Rows() - c.Assert(len(rows), Equals, 2) - c.Assert(rows[0], DeepEquals, []interface{}{"test", "t2", "global", t1.Meta().Columns[0].Name.O, "2021-10-20 09:00:00", "<nil>"}) - c.Assert(rows[1], DeepEquals, []interface{}{"test", "t2", p0.Name.O, t1.Meta().Columns[0].Name.O, "2021-10-20 09:00:00", "<nil>"}) + + require.Len(t, rows, 2) + require.Equal(t, rows[0], []interface{}{"test", "t2", "global", t1.Meta().Columns[0].Name.O, "2021-10-20 09:00:00", "<nil>"}) + require.Equal(t, rows[1], []interface{}{"test", "t2", p0.Name.O, t1.Meta().Columns[0].Name.O, "2021-10-20 09:00:00", "<nil>"}) +} + +func TestShowHistogramsInFlight(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + result := tk.MustQuery("show histograms_in_flight") + rows := result.Rows() + require.Equal(t, len(rows), 1) + require.Equal(t, rows[0][0], "0") +} + +func TestShowAnalyzeStatus(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + statistics.ClearHistoryJobs() + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int, b int, primary key(a), index idx(b))") + tk.MustExec(`insert into t values (1, 1), (2, 2)`) + + tk.MustExec("set @@tidb_analyze_version=2") + tk.MustExec("analyze table t") + result := tk.MustQuery("show analyze status").Sort() + require.Len(t, result.Rows(), 1) + require.Equal(t, "test", result.Rows()[0][0]) + require.Equal(t, "t", result.Rows()[0][1]) + require.Equal(t, "", result.Rows()[0][2]) + require.Equal(t, "analyze table", result.Rows()[0][3]) + require.Equal(t, "2", result.Rows()[0][4]) + require.NotNil(t, result.Rows()[0][5]) + require.NotNil(t, result.Rows()[0][6]) + require.Equal(t, "finished", result.Rows()[0][7]) + + statistics.ClearHistoryJobs() + + tk.MustExec("set @@tidb_analyze_version=1") + tk.MustExec("analyze table t") + result = tk.MustQuery("show analyze status").Sort() + require.Len(t, result.Rows(), 2) + require.Equal(t, "test", result.Rows()[0][0]) + require.Equal(t, "t", result.Rows()[0][1]) + require.Equal(t, "", result.Rows()[0][2]) + require.Equal(t, "analyze columns", result.Rows()[0][3]) + require.Equal(t, "2", result.Rows()[0][4]) + require.NotNil(t, result.Rows()[0][5]) + require.NotNil(t, result.Rows()[0][6]) + require.Equal(t, "finished", result.Rows()[0][7]) + + require.Len(t, result.Rows(), 2) + require.Equal(t, "test", result.Rows()[1][0]) + require.Equal(t, "t", result.Rows()[1][1]) + require.Equal(t, "", result.Rows()[1][2]) + require.Equal(t, "analyze index idx", result.Rows()[1][3]) + require.Equal(t, "2", result.Rows()[1][4]) + require.NotNil(t, result.Rows()[1][5]) + require.NotNil(t, result.Rows()[1][6]) + require.Equal(t, "finished", result.Rows()[1][7]) } diff --git a/executor/show_test.go b/executor/show_test.go index f0b1e5da316b2..34db4d54ae962 100644 --- a/executor/show_test.go +++ b/executor/show_test.go @@ -149,19 +149,35 @@ func (s *testSuite5) TestShowWarningsForExprPushdown(c *C) { tk.MustExec("use test") testSQL := `create table if not exists show_warnings_expr_pushdown (a int, value date)` tk.MustExec(testSQL) - tk.MustExec("explain select * from show_warnings_expr_pushdown where date_add(value, interval 1 day) = '2020-01-01'") + + // create tiflash replica + { + is := domain.GetDomain(tk.Se).InfoSchema() + db, exists := is.SchemaByName(model.NewCIStr("test")) + c.Assert(exists, IsTrue) + for _, tblInfo := range db.Tables { + if tblInfo.Name.L == "show_warnings_expr_pushdown" { + tblInfo.TiFlashReplica = &model.TiFlashReplicaInfo{ + Count: 1, + Available: true, + } + } + } + } + tk.MustExec("set tidb_allow_mpp=0") + tk.MustExec("explain select * from show_warnings_expr_pushdown t where md5(value) = '2020-01-01'") c.Assert(tk.Se.GetSessionVars().StmtCtx.WarningCount(), Equals, uint16(1)) - tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1105|Scalar function 'date_add'(signature: AddDateDatetimeInt, return type: datetime(6)) can not be pushed to tikv")) - tk.MustExec("explain select max(date_add(value, interval 1 day)) from show_warnings_expr_pushdown group by a") + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1105|Scalar function 'md5'(signature: MD5, return type: var_string(32)) is not supported to push down to tiflash now.")) + tk.MustExec("explain select max(md5(value)) from show_warnings_expr_pushdown group by a") c.Assert(tk.Se.GetSessionVars().StmtCtx.WarningCount(), Equals, uint16(2)) - tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1105|Scalar function 'date_add'(signature: AddDateDatetimeInt, return type: datetime(6)) can not be pushed to tikv", "Warning|1105|Aggregation can not be pushed to tikv because arguments of AggFunc `max` contains unsupported exprs")) - tk.MustExec("explain select max(a) from show_warnings_expr_pushdown group by date_add(value, interval 1 day)") + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1105|Scalar function 'md5'(signature: MD5, return type: var_string(32)) is not supported to push down to tiflash now.", "Warning|1105|Aggregation can not be pushed to tiflash because arguments of AggFunc `max` contains unsupported exprs")) + tk.MustExec("explain select max(a) from show_warnings_expr_pushdown group by md5(value)") c.Assert(tk.Se.GetSessionVars().StmtCtx.WarningCount(), Equals, uint16(2)) - tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1105|Scalar function 'date_add'(signature: AddDateDatetimeInt, return type: datetime(6)) can not be pushed to tikv", "Warning|1105|Aggregation can not be pushed to tikv because groupByItems contain unsupported exprs")) + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1105|Scalar function 'md5'(signature: MD5, return type: var_string(32)) is not supported to push down to tiflash now.", "Warning|1105|Aggregation can not be pushed to tiflash because groupByItems contain unsupported exprs")) tk.MustExec("set tidb_opt_distinct_agg_push_down=0") tk.MustExec("explain select max(distinct a) from show_warnings_expr_pushdown group by value") - c.Assert(tk.Se.GetSessionVars().StmtCtx.WarningCount(), Equals, uint16(1)) - tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1105|Aggregation can not be pushed to storage layer in non-mpp mode because it contains agg function with distinct")) + c.Assert(tk.Se.GetSessionVars().StmtCtx.WarningCount(), Equals, uint16(0)) + // tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1105|Aggregation can not be pushed to storage layer in non-mpp mode because it contains agg function with distinct")) } func (s *testSuite5) TestShowGrantsPrivilege(c *C) { @@ -596,6 +612,17 @@ func (s *testSuite5) TestShowOpenTables(c *C) { tk.MustQuery("show open tables") tk.MustQuery("show open tables in test") } +func (s *testSuite5) TestShowCreateViewDefiner(c *C) { + tk := testkit.NewTestKit(c, s.store) + se, err := session.CreateSession4Test(s.store) + c.Assert(err, IsNil) + c.Assert(se.Auth(&auth.UserIdentity{Username: "root", Hostname: "%", AuthUsername: "root", AuthHostname: "%"}, nil, nil), IsTrue) + tk.Se = se + tk.MustExec("use test") + tk.MustExec("create or replace view v1 as select 1") + tk.MustQuery("show create view v1").Check(testutil.RowsWithSep("|", "v1|CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`%` SQL SECURITY DEFINER VIEW `v1` (`1`) AS SELECT 1 AS `1`|utf8mb4|utf8mb4_bin")) + tk.MustExec("drop view v1") +} func (s *testSuite5) TestShowCreateTable(c *C) { tk := testkit.NewTestKit(c, s.store) @@ -749,20 +776,19 @@ func (s *testSuite5) TestShowCreateTable(c *C) { " KEY `IDX_RoundId` (`ROUND_ID`),\n"+ " KEY `IDX_UserId_EndTime` (`USER_ID`,`END_TIME`)\n"+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=505488\n"+ - "PARTITION BY RANGE ( MONTH(`end_time`) ) (\n"+ - " PARTITION `p1` VALUES LESS THAN (2),\n"+ - " PARTITION `p2` VALUES LESS THAN (3),\n"+ - " PARTITION `p3` VALUES LESS THAN (4),\n"+ - " PARTITION `p4` VALUES LESS THAN (5),\n"+ - " PARTITION `p5` VALUES LESS THAN (6),\n"+ - " PARTITION `p6` VALUES LESS THAN (7),\n"+ - " PARTITION `p7` VALUES LESS THAN (8),\n"+ - " PARTITION `p8` VALUES LESS THAN (9),\n"+ - " PARTITION `p9` VALUES LESS THAN (10),\n"+ - " PARTITION `p10` VALUES LESS THAN (11),\n"+ - " PARTITION `p11` VALUES LESS THAN (12),\n"+ - " PARTITION `p12` VALUES LESS THAN (MAXVALUE)\n"+ - ")")) + "PARTITION BY RANGE (MONTH(`end_time`))\n"+ + "(PARTITION `p1` VALUES LESS THAN (2),\n"+ + " PARTITION `p2` VALUES LESS THAN (3),\n"+ + " PARTITION `p3` VALUES LESS THAN (4),\n"+ + " PARTITION `p4` VALUES LESS THAN (5),\n"+ + " PARTITION `p5` VALUES LESS THAN (6),\n"+ + " PARTITION `p6` VALUES LESS THAN (7),\n"+ + " PARTITION `p7` VALUES LESS THAN (8),\n"+ + " PARTITION `p8` VALUES LESS THAN (9),\n"+ + " PARTITION `p9` VALUES LESS THAN (10),\n"+ + " PARTITION `p10` VALUES LESS THAN (11),\n"+ + " PARTITION `p11` VALUES LESS THAN (12),\n"+ + " PARTITION `p12` VALUES LESS THAN (MAXVALUE))")) // for issue #11831 tk.MustExec("create table ttt4(a varchar(123) default null collate utf8mb4_unicode_ci)engine=innodb default charset=utf8mb4 collate=utf8mb4_unicode_ci;") @@ -905,12 +931,11 @@ func (s *testSuite5) TestShowCreateTable(c *C) { " `name` varchar(10) DEFAULT NULL,\n"+ " UNIQUE KEY `idx` (`id`)\n"+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n"+ - "PARTITION BY LIST (`id`) (\n"+ - " PARTITION `p0` VALUES IN (3,5,6,9,17),\n"+ - " PARTITION `p1` VALUES IN (1,2,10,11,19,20),\n"+ - " PARTITION `p2` VALUES IN (4,12,13,14,18),\n"+ - " PARTITION `p3` VALUES IN (7,8,15,16,NULL)\n"+ - ")")) + "PARTITION BY LIST (`id`)\n"+ + "(PARTITION `p0` VALUES IN (3,5,6,9,17),\n"+ + " PARTITION `p1` VALUES IN (1,2,10,11,19,20),\n"+ + " PARTITION `p2` VALUES IN (4,12,13,14,18),\n"+ + " PARTITION `p3` VALUES IN (7,8,15,16,NULL))")) // Test show list column partition table tk.MustExec(`DROP TABLE IF EXISTS t`) tk.MustExec(`create table t (id int, name varchar(10), unique index idx (id)) partition by list columns (id) ( @@ -925,12 +950,11 @@ func (s *testSuite5) TestShowCreateTable(c *C) { " `name` varchar(10) DEFAULT NULL,\n"+ " UNIQUE KEY `idx` (`id`)\n"+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n"+ - "PARTITION BY LIST COLUMNS(id) (\n"+ - " PARTITION `p0` VALUES IN (3,5,6,9,17),\n"+ - " PARTITION `p1` VALUES IN (1,2,10,11,19,20),\n"+ - " PARTITION `p2` VALUES IN (4,12,13,14,18),\n"+ - " PARTITION `p3` VALUES IN (7,8,15,16,NULL)\n"+ - ")")) + "PARTITION BY LIST COLUMNS(`id`)\n"+ + "(PARTITION `p0` VALUES IN (3,5,6,9,17),\n"+ + " PARTITION `p1` VALUES IN (1,2,10,11,19,20),\n"+ + " PARTITION `p2` VALUES IN (4,12,13,14,18),\n"+ + " PARTITION `p3` VALUES IN (7,8,15,16,NULL))")) tk.MustExec(`DROP TABLE IF EXISTS t`) tk.MustExec(`create table t (id int, name varchar(10), unique index idx (id, name)) partition by list columns (id, name) ( partition p0 values in ((3, '1'), (5, '5')), @@ -941,10 +965,9 @@ func (s *testSuite5) TestShowCreateTable(c *C) { " `name` varchar(10) DEFAULT NULL,\n"+ " UNIQUE KEY `idx` (`id`,`name`)\n"+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n"+ - "PARTITION BY LIST COLUMNS(id,name) (\n"+ - " PARTITION `p0` VALUES IN ((3,\"1\"),(5,\"5\")),\n"+ - " PARTITION `p1` VALUES IN ((1,\"1\"))\n"+ - ")")) + "PARTITION BY LIST COLUMNS(`id`,`name`)\n"+ + "(PARTITION `p0` VALUES IN ((3,\"1\"),(5,\"5\")),\n"+ + " PARTITION `p1` VALUES IN ((1,\"1\")))")) tk.MustExec(`DROP TABLE IF EXISTS t`) tk.MustExec(`create table t (id int primary key, v varchar(255) not null, key idx_v (v) comment 'foo\'bar')`) tk.MustQuery(`show create table t`).Check(testutil.RowsWithSep("|", @@ -954,9 +977,33 @@ func (s *testSuite5) TestShowCreateTable(c *C) { " PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,\n"+ " KEY `idx_v` (`v`) COMMENT 'foo''bar'\n"+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) + + // For issue #29922 + tk.MustExec("CREATE TABLE `thash` (\n `id` bigint unsigned NOT NULL,\n `data` varchar(255) DEFAULT NULL,\n PRIMARY KEY (`id`)\n)\nPARTITION BY HASH (`id`)\n(PARTITION pEven COMMENT = \"Even ids\",\n PARTITION pOdd COMMENT = \"Odd ids\");") + tk.MustQuery("show create table `thash`").Check(testutil.RowsWithSep("|", ""+ + "thash CREATE TABLE `thash` (\n"+ + " `id` bigint(20) unsigned NOT NULL,\n"+ + " `data` varchar(255) DEFAULT NULL,\n"+ + " PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */\n"+ + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n"+ + "PARTITION BY HASH (`id`)\n"+ + "(PARTITION `pEven` COMMENT 'Even ids',\n"+ + " PARTITION `pOdd` COMMENT 'Odd ids')", + )) + // empty edge case + tk.MustExec("drop table if exists `thash`") + tk.MustExec("CREATE TABLE `thash` (\n `id` bigint unsigned NOT NULL,\n `data` varchar(255) DEFAULT NULL,\n PRIMARY KEY (`id`)\n)\nPARTITION BY HASH (`id`);") + tk.MustQuery("show create table `thash`").Check(testutil.RowsWithSep("|", ""+ + "thash CREATE TABLE `thash` (\n"+ + " `id` bigint(20) unsigned NOT NULL,\n"+ + " `data` varchar(255) DEFAULT NULL,\n"+ + " PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */\n"+ + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n"+ + "PARTITION BY HASH (`id`) PARTITIONS 1", + )) } -func (s *testAutoRandomSuite) TestShowCreateTablePlacement(c *C) { +func (s *testSuite5) TestShowCreateTablePlacement(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") defer tk.MustExec(`DROP TABLE IF EXISTS t`) @@ -979,6 +1026,7 @@ func (s *testAutoRandomSuite) TestShowCreateTablePlacement(c *C) { tk.MustExec("create placement policy x " + "FOLLOWERS=2 " + "CONSTRAINTS=\"[+disk=ssd]\" ") + defer tk.MustExec(`DROP PLACEMENT POLICY IF EXISTS x`) tk.MustExec("create table t(a int)" + "PLACEMENT POLICY=\"x\"") tk.MustQuery(`show create table t`).Check(testutil.RowsWithSep("|", @@ -998,6 +1046,133 @@ func (s *testAutoRandomSuite) TestShowCreateTablePlacement(c *C) { ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin "+ "/*T![placement] PLACEMENT POLICY=`x` */", )) + + // Partitioned tables + tk.MustExec(`DROP TABLE IF EXISTS t`) + tk.MustExec("set @old_list_part = @@tidb_enable_list_partition") + defer tk.MustExec("set @@tidb_enable_list_partition = @old_list_part") + tk.MustExec("set tidb_enable_list_partition = 1") + tk.MustExec("create table t(a int, b varchar(255))" + + "/*T![placement] PLACEMENT POLICY=\"x\" */" + + "PARTITION BY LIST (a)\n" + + "(PARTITION pLow VALUES in (1,2,3,5,8) COMMENT 'a comment' placement policy 'x'," + + " PARTITION pMid VALUES in (9) COMMENT 'another comment'," + + "partition pMax values IN (10,11,12) PRIMARY_REGION = 'us-west-1' REGIONS = 'us-west-1,us-west-2')") + tk.MustQuery(`show create table t`).Check(testutil.RowsWithSep("|", ""+ + "t CREATE TABLE `t` (\n"+ + " `a` int(11) DEFAULT NULL,\n"+ + " `b` varchar(255) DEFAULT NULL\n"+ + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PLACEMENT POLICY=`x` */\n"+ + "PARTITION BY LIST (`a`)\n"+ + "(PARTITION `pLow` VALUES IN (1,2,3,5,8) COMMENT 'a comment' /*T![placement] PLACEMENT POLICY=`x` */,\n"+ + " PARTITION `pMid` VALUES IN (9) COMMENT 'another comment',\n"+ + " PARTITION `pMax` VALUES IN (10,11,12) /*T![placement] PRIMARY_REGION=\"us-west-1\" REGIONS=\"us-west-1,us-west-2\" */)", + )) + + tk.MustExec(`DROP TABLE IF EXISTS t`) + tk.MustExec("create table t(a int, b varchar(255))" + + "PARTITION BY LIST COLUMNS (b)\n" + + "(PARTITION pLow VALUES in ('1','2','3','5','8') COMMENT 'a comment' placement policy 'x'," + + "partition pMax values IN ('10','11','12') PRIMARY_REGION = 'us-west-1' REGIONS = 'us-west-1,us-west-2')") + tk.MustQuery(`show create table t`).Check(testutil.RowsWithSep("|", ""+ + "t CREATE TABLE `t` (\n"+ + " `a` int(11) DEFAULT NULL,\n"+ + " `b` varchar(255) DEFAULT NULL\n"+ + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n"+ + "PARTITION BY LIST COLUMNS(`b`)\n"+ + "(PARTITION `pLow` VALUES IN (\"1\",\"2\",\"3\",\"5\",\"8\") COMMENT 'a comment' /*T![placement] PLACEMENT POLICY=`x` */,\n"+ + " PARTITION `pMax` VALUES IN (\"10\",\"11\",\"12\") /*T![placement] PRIMARY_REGION=\"us-west-1\" REGIONS=\"us-west-1,us-west-2\" */)", + )) + + tk.MustExec(`DROP TABLE IF EXISTS t`) + tk.MustExec("create table t(a int, b varchar(255))" + + "PARTITION BY LIST COLUMNS (a,b)\n" + + "(PARTITION pLow VALUES in ((1,'1'),(2,'2'),(3,'3'),(5,'5'),(8,'8')) COMMENT 'a comment' placement policy 'x'," + + "partition pMax values IN ((10,'10'),(11,'11'),(12,'12')) PRIMARY_REGION = 'us-west-1' REGIONS = 'us-west-1,us-west-2')") + tk.MustQuery(`show create table t`).Check(testutil.RowsWithSep("|", ""+ + "t CREATE TABLE `t` (\n"+ + " `a` int(11) DEFAULT NULL,\n"+ + " `b` varchar(255) DEFAULT NULL\n"+ + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n"+ + "PARTITION BY LIST COLUMNS(`a`,`b`)\n"+ + "(PARTITION `pLow` VALUES IN ((1,\"1\"),(2,\"2\"),(3,\"3\"),(5,\"5\"),(8,\"8\")) COMMENT 'a comment' /*T![placement] PLACEMENT POLICY=`x` */,\n"+ + " PARTITION `pMax` VALUES IN ((10,\"10\"),(11,\"11\"),(12,\"12\")) /*T![placement] PRIMARY_REGION=\"us-west-1\" REGIONS=\"us-west-1,us-west-2\" */)", + )) + + tk.MustExec(`DROP TABLE IF EXISTS t`) + tk.MustExec("create table t(a int, b varchar(255))" + + "PARTITION BY RANGE (a)\n" + + "(PARTITION pLow VALUES less than (1000000) COMMENT 'a comment' placement policy 'x'," + + "partition pMax values LESS THAN (MAXVALUE) PRIMARY_REGION = 'us-west-1' REGIONS = 'us-west-1,us-west-2')") + tk.MustQuery(`show create table t`).Check(testutil.RowsWithSep("|", ""+ + "t CREATE TABLE `t` (\n"+ + " `a` int(11) DEFAULT NULL,\n"+ + " `b` varchar(255) DEFAULT NULL\n"+ + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n"+ + "PARTITION BY RANGE (`a`)\n"+ + "(PARTITION `pLow` VALUES LESS THAN (1000000) COMMENT 'a comment' /*T![placement] PLACEMENT POLICY=`x` */,\n"+ + " PARTITION `pMax` VALUES LESS THAN (MAXVALUE) /*T![placement] PRIMARY_REGION=\"us-west-1\" REGIONS=\"us-west-1,us-west-2\" */)", + )) + + tk.MustExec(`DROP TABLE IF EXISTS t`) + tk.MustExec("create table t(a int, b varchar(255))" + + "PARTITION BY RANGE COLUMNS (b)\n" + + "(PARTITION pLow VALUES less than ('1000000') COMMENT 'a comment' placement policy 'x'," + + "partition pMax values LESS THAN (MAXVALUE) PRIMARY_REGION = 'us-west-1' REGIONS = 'us-west-1,us-west-2')") + tk.MustQuery(`show create table t`).Check(testutil.RowsWithSep("|", ""+ + "t CREATE TABLE `t` (\n"+ + " `a` int(11) DEFAULT NULL,\n"+ + " `b` varchar(255) DEFAULT NULL\n"+ + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n"+ + "PARTITION BY RANGE COLUMNS(`b`)\n"+ + "(PARTITION `pLow` VALUES LESS THAN (\"1000000\") COMMENT 'a comment' /*T![placement] PLACEMENT POLICY=`x` */,\n"+ + " PARTITION `pMax` VALUES LESS THAN (MAXVALUE) /*T![placement] PRIMARY_REGION=\"us-west-1\" REGIONS=\"us-west-1,us-west-2\" */)", + )) + + tk.MustExec(`DROP TABLE IF EXISTS t`) + // RANGE COLUMNS with multiple columns is not supported! + tk.MustExec("create table t(a int, b varchar(255))" + + "/*T![placement] PLACEMENT POLICY=\"x\" */" + + "PARTITION BY RANGE COLUMNS (a,b)\n" + + "(PARTITION pLow VALUES less than (1000000,'1000000') COMMENT 'a comment' placement policy 'x'," + + " PARTITION pMidLow VALUES less than (1000000,MAXVALUE) COMMENT 'another comment' placement policy 'x'," + + " PARTITION pMadMax VALUES less than (MAXVALUE,'1000000') COMMENT ='Not a comment' placement policy 'x'," + + "partition pMax values LESS THAN (MAXVALUE, MAXVALUE) PRIMARY_REGION = 'us-west-1' REGIONS = 'us-west-1,us-west-2')") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 8200 Unsupported partition type RANGE, treat as normal table")) + tk.MustQuery(`show create table t`).Check(testutil.RowsWithSep("|", ""+ + "t CREATE TABLE `t` (\n"+ + " `a` int(11) DEFAULT NULL,\n"+ + " `b` varchar(255) DEFAULT NULL\n"+ + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PLACEMENT POLICY=`x` */", + )) + + tk.MustExec(`DROP TABLE IF EXISTS t`) + tk.MustExec("create table t(a int, b varchar(255))" + + "/*T![placement] PLACEMENT POLICY=\"x\" */" + + "PARTITION BY HASH (a) PARTITIONS 2") + tk.MustQuery(`show create table t`).Check(testutil.RowsWithSep("|", ""+ + "t CREATE TABLE `t` (\n"+ + " `a` int(11) DEFAULT NULL,\n"+ + " `b` varchar(255) DEFAULT NULL\n"+ + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![placement] PLACEMENT POLICY=`x` */\n"+ + "PARTITION BY HASH (`a`) PARTITIONS 2", + )) + + tk.MustExec(`DROP TABLE IF EXISTS t`) + tk.MustExec("create table t(a int, b varchar(255))" + + "PARTITION BY HASH (a)\n" + + "(PARTITION pLow COMMENT 'a comment' placement policy 'x'," + + "partition pMax PRIMARY_REGION = 'us-west-1' REGIONS = 'us-west-1,us-west-2')") + tk.MustQuery(`show create table t`).Check(testutil.RowsWithSep("|", ""+ + "t CREATE TABLE `t` (\n"+ + " `a` int(11) DEFAULT NULL,\n"+ + " `b` varchar(255) DEFAULT NULL\n"+ + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n"+ + "PARTITION BY HASH (`a`)\n"+ + "(PARTITION `pLow` COMMENT 'a comment' /*T![placement] PLACEMENT POLICY=`x` */,\n"+ + " PARTITION `pMax` /*T![placement] PRIMARY_REGION=\"us-west-1\" REGIONS=\"us-west-1,us-west-2\" */)", + )) + tk.MustExec(`DROP TABLE t`) } func (s *testAutoRandomSuite) TestShowCreateTableAutoRandom(c *C) { @@ -1219,7 +1394,7 @@ func (s *testSuite5) TestShowBuiltin(c *C) { res := tk.MustQuery("show builtins;") c.Assert(res, NotNil) rows := res.Rows() - const builtinFuncNum = 273 + const builtinFuncNum = 274 c.Assert(builtinFuncNum, Equals, len(rows)) c.Assert("abs", Equals, rows[0][0].(string)) c.Assert("yearweek", Equals, rows[builtinFuncNum-1][0].(string)) diff --git a/executor/shuffle.go b/executor/shuffle.go index a71e388c02bac..9143afd032f10 100644 --- a/executor/shuffle.go +++ b/executor/shuffle.go @@ -142,17 +142,29 @@ func (e *ShuffleExec) Close() error { if !e.prepared { for _, w := range e.workers { for _, r := range w.receivers { - close(r.inputHolderCh) - close(r.inputCh) + if r.inputHolderCh != nil { + close(r.inputHolderCh) + } + if r.inputCh != nil { + close(r.inputCh) + } } - close(w.outputHolderCh) + if w.outputHolderCh != nil { + close(w.outputHolderCh) + } + } + if e.outputCh != nil { + close(e.outputCh) } - close(e.outputCh) } - close(e.finishCh) + if e.finishCh != nil { + close(e.finishCh) + } for _, w := range e.workers { for _, r := range w.receivers { - for range r.inputCh { + if r.inputCh != nil { + for range r.inputCh { + } } } // close child executor of each worker @@ -160,7 +172,9 @@ func (e *ShuffleExec) Close() error { firstErr = err } } - for range e.outputCh { // workers exit before `e.outputCh` is closed. + if e.outputCh != nil { + for range e.outputCh { // workers exit before `e.outputCh` is closed. + } } e.executed = false diff --git a/executor/shuffle_test.go b/executor/shuffle_test.go index 0059c67429bb3..92f96cf74654c 100644 --- a/executor/shuffle_test.go +++ b/executor/shuffle_test.go @@ -15,20 +15,17 @@ package executor import ( - . "github.com/pingcap/check" + "testing" + "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/mock" + "github.com/stretchr/testify/require" ) -var _ = SerialSuites(&testPartitionSuite{}) - -type testPartitionSuite struct { -} - -func (s *testPartitionSuite) TestPartitionRangeSplitter(c *C) { +func TestPartitionRangeSplitter(t *testing.T) { ctx := mock.NewContext() concurrency := 2 @@ -60,9 +57,9 @@ func (s *testPartitionSuite) TestPartitionRangeSplitter(c *C) { splitter := buildPartitionRangeSplitter(ctx, concurrency, byItems) obtained, err := splitter.split(ctx, input, obtained) - c.Assert(err, IsNil) - c.Assert(len(obtained), Equals, len(expected)) + require.NoError(t, err) + require.Len(t, obtained, len(expected)) for i := 0; i < len(obtained); i++ { - c.Assert(obtained[i], Equals, expected[i]) + require.Equal(t, expected[i], obtained[i]) } } diff --git a/executor/simple.go b/executor/simple.go index a8deba10eef10..82e941eca143f 100644 --- a/executor/simple.go +++ b/executor/simple.go @@ -661,6 +661,12 @@ func (e *SimpleExec) executeRevokeRole(ctx context.Context, s *ast.RevokeRoleStm return errors.Trace(err) } sql := new(strings.Builder) + // when an active role of current user is revoked, + // it should be removed from activeRoles + activeRoles, curUser, curHost := e.ctx.GetSessionVars().ActiveRoles, "", "" + if user := e.ctx.GetSessionVars().User; user != nil { + curUser, curHost = user.AuthUsername, user.AuthHostname + } for _, user := range s.Users { exists, err := userExists(ctx, e.ctx, user.Username, user.Hostname) if err != nil { @@ -693,11 +699,29 @@ func (e *SimpleExec) executeRevokeRole(ctx context.Context, s *ast.RevokeRoleStm } return ErrCannotUser.GenWithStackByArgs("REVOKE ROLE", role.String()) } + + // delete from activeRoles + if curUser == user.Username && curHost == user.Hostname { + for i := 0; i < len(activeRoles); i++ { + if activeRoles[i].Username == role.Username && activeRoles[i].Hostname == role.Hostname { + activeRoles = append(activeRoles[:i], activeRoles[i+1:]...) + break + } + } + } } } if _, err := sqlExecutor.ExecuteInternal(context.TODO(), "commit"); err != nil { return err } + checker := privilege.GetPrivilegeManager(e.ctx) + if checker == nil { + return errors.New("miss privilege checker") + } + if ok, roleName := checker.ActiveRoles(e.ctx, activeRoles); !ok { + u := e.ctx.GetSessionVars().User + return ErrRoleNotGranted.GenWithStackByArgs(roleName, u.String()) + } return domain.GetDomain(e.ctx).NotifyUpdatePrivilege() } @@ -789,6 +813,13 @@ func (e *SimpleExec) executeCreateUser(ctx context.Context, s *ast.CreateUserStm if spec.AuthOpt != nil && spec.AuthOpt.AuthPlugin != "" { authPlugin = spec.AuthOpt.AuthPlugin } + + switch authPlugin { + case mysql.AuthNativePassword, mysql.AuthCachingSha2Password, mysql.AuthSocket: + default: + return ErrPluginIsNotLoaded.GenWithStackByArgs(spec.AuthOpt.AuthPlugin) + } + hostName := strings.ToLower(spec.User.Hostname) if s.IsCreateRole { sqlexec.MustFormatSQL(sql, `(%?, %?, %?, %?, %?)`, hostName, spec.User.Username, pwd, authPlugin, "Y") @@ -917,20 +948,28 @@ func (e *SimpleExec) executeAlterUser(ctx context.Context, s *ast.AlterUserStmt) continue } - authplugin, err := e.userAuthPlugin(spec.User.Username, spec.User.Hostname) - if err != nil { - return err - } - if spec.AuthOpt != nil { - spec.AuthOpt.AuthPlugin = authplugin - } exec := e.ctx.(sqlexec.RestrictedSQLExecutor) if spec.AuthOpt != nil { + if spec.AuthOpt.AuthPlugin == "" { + authplugin, err := e.userAuthPlugin(spec.User.Username, spec.User.Hostname) + if err != nil { + return err + } + spec.AuthOpt.AuthPlugin = authplugin + } + switch spec.AuthOpt.AuthPlugin { + case mysql.AuthNativePassword, mysql.AuthCachingSha2Password, mysql.AuthSocket, "": + default: + return ErrPluginIsNotLoaded.GenWithStackByArgs(spec.AuthOpt.AuthPlugin) + } pwd, ok := spec.EncodedPassword() if !ok { return errors.Trace(ErrPasswordFormat) } - stmt, err := exec.ParseWithParams(ctx, `UPDATE %n.%n SET authentication_string=%? WHERE Host=%? and User=%?;`, mysql.SystemDB, mysql.UserTable, pwd, spec.User.Hostname, spec.User.Username) + stmt, err := exec.ParseWithParams(ctx, + `UPDATE %n.%n SET authentication_string=%?, plugin=%? WHERE Host=%? and User=%?;`, + mysql.SystemDB, mysql.UserTable, pwd, spec.AuthOpt.AuthPlugin, strings.ToLower(spec.User.Hostname), spec.User.Username, + ) if err != nil { return err } @@ -1143,7 +1182,7 @@ func renameUserHostInSystemTable(sqlExecutor sqlexec.SQLExecutor, tableName, use sqlexec.MustFormatSQL(sql, `UPDATE %n.%n SET %n = %?, %n = %? WHERE %n = %? and %n = %?;`, mysql.SystemDB, tableName, usernameColumn, users.NewUser.Username, hostColumn, strings.ToLower(users.NewUser.Hostname), - usernameColumn, users.OldUser.Username, hostColumn, users.OldUser.Hostname) + usernameColumn, users.OldUser.Username, hostColumn, strings.ToLower(users.OldUser.Hostname)) _, err := sqlExecutor.ExecuteInternal(context.TODO(), sql.String()) return err } @@ -1210,7 +1249,7 @@ func (e *SimpleExec) executeDropUser(ctx context.Context, s *ast.DropUserStmt) e // begin a transaction to delete a user. sql.Reset() - sqlexec.MustFormatSQL(sql, `DELETE FROM %n.%n WHERE Host = %? and User = %?;`, mysql.SystemDB, mysql.UserTable, user.Hostname, user.Username) + sqlexec.MustFormatSQL(sql, `DELETE FROM %n.%n WHERE Host = %? and User = %?;`, mysql.SystemDB, mysql.UserTable, strings.ToLower(user.Hostname), user.Username) if _, err = sqlExecutor.ExecuteInternal(context.TODO(), sql.String()); err != nil { failedUsers = append(failedUsers, user.String()) break @@ -1281,6 +1320,16 @@ func (e *SimpleExec) executeDropUser(ctx context.Context, s *ast.DropUserStmt) e break } + // delete from activeRoles + if s.IsDropRole { + for i := 0; i < len(activeRoles); i++ { + if activeRoles[i].Username == user.Username && activeRoles[i].Hostname == user.Hostname { + activeRoles = append(activeRoles[:i], activeRoles[i+1:]...) + break + } + } + } + //TODO: need delete columns_priv once we implement columns_priv functionality. } @@ -1288,6 +1337,13 @@ func (e *SimpleExec) executeDropUser(ctx context.Context, s *ast.DropUserStmt) e if _, err := sqlExecutor.ExecuteInternal(context.TODO(), "commit"); err != nil { return err } + if s.IsDropRole { + // apply new activeRoles + if ok, roleName := checker.ActiveRoles(e.ctx, activeRoles); !ok { + u := e.ctx.GetSessionVars().User + return ErrRoleNotGranted.GenWithStackByArgs(roleName, u.String()) + } + } } else { if _, err := sqlExecutor.ExecuteInternal(context.TODO(), "rollback"); err != nil { return err @@ -1302,7 +1358,7 @@ func (e *SimpleExec) executeDropUser(ctx context.Context, s *ast.DropUserStmt) e func userExists(ctx context.Context, sctx sessionctx.Context, name string, host string) (bool, error) { exec := sctx.(sqlexec.RestrictedSQLExecutor) - stmt, err := exec.ParseWithParams(ctx, `SELECT * FROM %n.%n WHERE User=%? AND Host=%?;`, mysql.SystemDB, mysql.UserTable, name, host) + stmt, err := exec.ParseWithParams(ctx, `SELECT * FROM %n.%n WHERE User=%? AND Host=%?;`, mysql.SystemDB, mysql.UserTable, name, strings.ToLower(host)) if err != nil { return false, err } @@ -1316,12 +1372,12 @@ func userExists(ctx context.Context, sctx sessionctx.Context, name string, host // use the same internal executor to read within the same transaction, otherwise same as userExists func userExistsInternal(sqlExecutor sqlexec.SQLExecutor, name string, host string) (bool, error) { sql := new(strings.Builder) - sqlexec.MustFormatSQL(sql, `SELECT * FROM %n.%n WHERE User=%? AND Host=%?;`, mysql.SystemDB, mysql.UserTable, name, host) + sqlexec.MustFormatSQL(sql, `SELECT * FROM %n.%n WHERE User=%? AND Host=%?;`, mysql.SystemDB, mysql.UserTable, name, strings.ToLower(host)) recordSet, err := sqlExecutor.ExecuteInternal(context.TODO(), sql.String()) if err != nil { return false, err } - req := recordSet.NewChunk() + req := recordSet.NewChunk(nil) err = recordSet.Next(context.TODO(), req) var rows int = 0 if err == nil { @@ -1373,15 +1429,19 @@ func (e *SimpleExec) executeSetPwd(ctx context.Context, s *ast.SetPwdStmt) error return err } var pwd string - if authplugin == mysql.AuthCachingSha2Password { + switch authplugin { + case mysql.AuthCachingSha2Password: pwd = auth.NewSha2Password(s.Password) - } else { + case mysql.AuthSocket: + e.ctx.GetSessionVars().StmtCtx.AppendNote(ErrSetPasswordAuthPlugin.GenWithStackByArgs(u, h)) + pwd = "" + default: pwd = auth.EncodePassword(s.Password) } // update mysql.user exec := e.ctx.(sqlexec.RestrictedSQLExecutor) - stmt, err := exec.ParseWithParams(ctx, `UPDATE %n.%n SET authentication_string=%? WHERE User=%? AND Host=%?;`, mysql.SystemDB, mysql.UserTable, pwd, u, h) + stmt, err := exec.ParseWithParams(ctx, `UPDATE %n.%n SET authentication_string=%? WHERE User=%? AND Host=%?;`, mysql.SystemDB, mysql.UserTable, pwd, u, strings.ToLower(h)) if err != nil { return err } @@ -1497,12 +1557,6 @@ func (e *SimpleExec) executeFlush(s *ast.FlushStmt) error { return errors.New("FLUSH TABLES WITH READ LOCK is not supported. Please use @@tidb_snapshot") } case ast.FlushPrivileges: - // If skip-grant-table is configured, do not flush privileges. - // Because LoadPrivilegeLoop does not run and the privilege Handle is nil, - // Call dom.PrivilegeHandle().Update would panic. - if config.GetGlobalConfig().Security.SkipGrantTable { - return nil - } dom := domain.GetDomain(e.ctx) return dom.NotifyUpdatePrivilege() case ast.FlushTiDBPlugin: diff --git a/executor/simple_test.go b/executor/simple_test.go index 6ea03734aadb9..b8dc034076ec7 100644 --- a/executor/simple_test.go +++ b/executor/simple_test.go @@ -387,7 +387,7 @@ func (s *testSuite7) TestUser(c *C) { tk.MustExec(dropUserSQL) // Test alter user. - createUserSQL = `CREATE USER 'test1'@'localhost' IDENTIFIED BY '123', 'test2'@'localhost' IDENTIFIED BY '123', 'test3'@'localhost' IDENTIFIED BY '123';` + createUserSQL = `CREATE USER 'test1'@'localhost' IDENTIFIED BY '123', 'test2'@'localhost' IDENTIFIED BY '123', 'test3'@'localhost' IDENTIFIED BY '123', 'test4'@'localhost' IDENTIFIED BY '123';` tk.MustExec(createUserSQL) alterUserSQL := `ALTER USER 'test1'@'localhost' IDENTIFIED BY '111';` tk.MustExec(alterUserSQL) @@ -399,6 +399,10 @@ func (s *testSuite7) TestUser(c *C) { tk.MustGetErrCode(alterUserSQL, mysql.ErrCannotUser) result = tk.MustQuery(`SELECT authentication_string FROM mysql.User WHERE User="test1" and Host="localhost"`) result.Check(testkit.Rows(auth.EncodePassword("222"))) + alterUserSQL = `ALTER USER 'test4'@'localhost' IDENTIFIED WITH 'auth_socket';` + tk.MustExec(alterUserSQL) + result = tk.MustQuery(`SELECT plugin FROM mysql.User WHERE User="test4" and Host="localhost"`) + result.Check(testkit.Rows("auth_socket")) alterUserSQL = `ALTER USER IF EXISTS 'test2'@'localhost' IDENTIFIED BY '222', 'test_not_exist'@'localhost' IDENTIFIED BY '1';` tk.MustExec(alterUserSQL) @@ -496,6 +500,35 @@ func (s *testSuite7) TestUser(c *C) { tk.MustExec(renameUserSQL) querySQL = `select user,host from mysql.user where user = 'userD';` tk.MustQuery(querySQL).Check(testkit.Rows("userD demo.com")) + + createUserSQL = `create user foo@localhost identified with 'foobar';` + _, err = tk.Exec(createUserSQL) + c.Check(terror.ErrorEqual(err, executor.ErrPluginIsNotLoaded), IsTrue, Commentf("err %v", err)) + + tk.MustExec(`create user joan;`) + tk.MustExec(`create user sally;`) + tk.MustExec(`create role engineering;`) + tk.MustExec(`create role consultants;`) + tk.MustExec(`create role qa;`) + tk.MustExec(`grant engineering to joan;`) + tk.MustExec(`grant engineering to sally;`) + tk.MustExec(`grant engineering, consultants to joan, sally;`) + tk.MustExec(`grant qa to consultants;`) + tk.MustExec("CREATE ROLE `engineering`@`US`;") + tk.MustExec("create role `engineering`@`INDIA`;") + _, err = tk.Exec("grant `engineering`@`US` TO `engineering`@`INDIA`;") + c.Check(err, IsNil) + + tk.MustQuery("select user,host from mysql.user where user='engineering' and host = 'india'"). + Check(testkit.Rows("engineering india")) + tk.MustQuery("select user,host from mysql.user where user='engineering' and host = 'us'"). + Check(testkit.Rows("engineering us")) + + tk.MustExec("drop role engineering@INDIA;") + tk.MustExec("drop role engineering@US;") + + tk.MustQuery("select user from mysql.user where user='engineering' and host = 'india'").Check(testkit.Rows()) + tk.MustQuery("select user from mysql.user where user='engineering' and host = 'us'").Check(testkit.Rows()) } func (s *testSuite3) TestSetPwd(c *C) { @@ -511,6 +544,11 @@ func (s *testSuite3) TestSetPwd(c *C) { result = tk.MustQuery(`SELECT authentication_string FROM mysql.User WHERE User="testpwd" and Host="localhost"`) result.Check(testkit.Rows(auth.EncodePassword("password"))) + tk.MustExec(`CREATE USER 'testpwdsock'@'localhost' IDENTIFIED WITH 'auth_socket';`) + tk.MustExec(`SET PASSWORD FOR 'testpwdsock'@'localhost' = 'password';`) + result = tk.MustQuery("show warnings") + result.Check(testkit.Rows("Note 1699 SET PASSWORD has no significance for user 'testpwdsock'@'localhost' as authentication plugin does not support it.")) + // set password setPwdSQL := `SET PASSWORD = 'pwd'` // Session user is empty. @@ -921,3 +959,32 @@ func (s *testSuite3) TestSetCurrentUserPwd(c *C) { result := tk.MustQuery(`SELECT authentication_string FROM mysql.User WHERE User="issue28534"`) result.Check(testkit.Rows(auth.EncodePassword("43582eussi"))) } + +func (s *testSuite3) TestShowGrantsAfterDropRole(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("CREATE USER u29473") + defer tk.MustExec("DROP USER IF EXISTS u29473") + + tk.MustExec("CREATE ROLE r29473") + tk.MustExec("GRANT r29473 TO u29473") + tk.MustExec("GRANT CREATE USER ON *.* TO u29473") + + tk.Se.Auth(&auth.UserIdentity{Username: "u29473", Hostname: "%"}, nil, nil) + tk.MustExec("SET ROLE r29473") + tk.MustExec("DROP ROLE r29473") + tk.MustQuery("SHOW GRANTS").Check(testkit.Rows("GRANT CREATE USER ON *.* TO 'u29473'@'%'")) +} + +func (s *testSuite3) TestDropRoleAfterRevoke(c *C) { + // issue 29781 + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test;") + tk.Se.Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil) + + tk.MustExec("create role r1, r2, r3;") + defer tk.MustExec("drop role if exists r1, r2, r3;") + tk.MustExec("grant r1,r2,r3 to current_user();") + tk.MustExec("set role all;") + tk.MustExec("revoke r1, r3 from root;") + tk.MustExec("drop role r1;") +} diff --git a/executor/slow_query.go b/executor/slow_query.go index bf52d25874df5..de5888f27d0de 100755 --- a/executor/slow_query.go +++ b/executor/slow_query.go @@ -264,7 +264,7 @@ func getOneLine(reader *bufio.Reader) ([]byte, error) { var tempLine []byte for isPrefix { tempLine, isPrefix, err = reader.ReadLine() - resByte = append(resByte, tempLine...) + resByte = append(resByte, tempLine...) // nozero // Use the max value of max_allowed_packet to check the single line length. if len(resByte) > int(variable.MaxOfMaxAllowedPacket) { return resByte, errors.Errorf("single line length exceeds limit: %v", variable.MaxOfMaxAllowedPacket) @@ -738,7 +738,7 @@ func getColumnValueFactoryByName(sctx sessionctx.Context, colName string, column return true, nil }, nil case variable.SlowLogPrepared, variable.SlowLogSucc, variable.SlowLogPlanFromCache, variable.SlowLogPlanFromBinding, - variable.SlowLogIsInternalStr: + variable.SlowLogIsInternalStr, variable.SlowLogIsExplicitTxn, variable.SlowLogIsWriteCacheTable: return func(row []types.Datum, value string, tz *time.Location, checker *slowLogChecker) (valid bool, err error) { v, err := strconv.ParseBool(value) if err != nil { @@ -1050,7 +1050,7 @@ func readLastLines(ctx context.Context, file *os.File, endCursor int64) ([]strin if err != nil { return nil, 0, err } - lines = append(chars, lines...) + lines = append(chars, lines...) // nozero // find first '\n' or '\r' for i := 0; i < len(chars); i++ { diff --git a/executor/slow_query_test.go b/executor/slow_query_test.go index 3086d5617c125..9828263402ac1 100644 --- a/executor/slow_query_test.go +++ b/executor/slow_query_test.go @@ -54,7 +54,7 @@ func parseLog(retriever *slowQueryRetriever, sctx sessionctx.Context, reader *bu } func newSlowQueryRetriever() (*slowQueryRetriever, error) { - newISBuilder, err := infoschema.NewBuilder(nil).InitWithDBInfos(nil, nil, nil, 0) + newISBuilder, err := infoschema.NewBuilder(nil, nil, nil).InitWithDBInfos(nil, nil, nil, 0) if err != nil { return nil, err } @@ -134,6 +134,7 @@ func (s *testExecSuite) TestParseSlowLogFile(c *C) { # Plan_from_cache: true # Plan_from_binding: true # Succ: false +# IsExplicitTxn: true # Plan_digest: 60e9378c746d9a2be1c791047e008967cf252eb6de9167ad3aa6098fa2d523f4 # Prev_stmt: update t set i = 1; use test; @@ -160,7 +161,7 @@ select * from t;` `0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0.38,0.021,0,0,0,1,637,0,10,10,10,10,100,,,1,42a1c8aae6f133e934d4bf0147491709a8812ea05ff8819ec522780fe657b772,t1:1,t2:2,` + `0.1,0.2,0.03,127.0.0.1:20160,0.05,0.6,0.8,0.0.0.0:20160,70724,65536,0,0,0,0,0,` + `Cop_backoff_regionMiss_total_times: 200 Cop_backoff_regionMiss_total_time: 0.2 Cop_backoff_regionMiss_max_time: 0.2 Cop_backoff_regionMiss_max_addr: 127.0.0.1 Cop_backoff_regionMiss_avg_time: 0.2 Cop_backoff_regionMiss_p90_time: 0.2 Cop_backoff_rpcPD_total_times: 200 Cop_backoff_rpcPD_total_time: 0.2 Cop_backoff_rpcPD_max_time: 0.2 Cop_backoff_rpcPD_max_addr: 127.0.0.1 Cop_backoff_rpcPD_avg_time: 0.2 Cop_backoff_rpcPD_p90_time: 0.2 Cop_backoff_rpcTiKV_total_times: 200 Cop_backoff_rpcTiKV_total_time: 0.2 Cop_backoff_rpcTiKV_max_time: 0.2 Cop_backoff_rpcTiKV_max_addr: 127.0.0.1 Cop_backoff_rpcTiKV_avg_time: 0.2 Cop_backoff_rpcTiKV_p90_time: 0.2,` + - `0,0,1,1,,60e9378c746d9a2be1c791047e008967cf252eb6de9167ad3aa6098fa2d523f4,` + + `0,0,1,0,1,1,,60e9378c746d9a2be1c791047e008967cf252eb6de9167ad3aa6098fa2d523f4,` + `update t set i = 1;,select * from t;` c.Assert(expectRecordString, Equals, recordString) @@ -183,7 +184,7 @@ select * from t;` `0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0.38,0.021,0,0,0,1,637,0,10,10,10,10,100,,,1,42a1c8aae6f133e934d4bf0147491709a8812ea05ff8819ec522780fe657b772,t1:1,t2:2,` + `0.1,0.2,0.03,127.0.0.1:20160,0.05,0.6,0.8,0.0.0.0:20160,70724,65536,0,0,0,0,0,` + `Cop_backoff_regionMiss_total_times: 200 Cop_backoff_regionMiss_total_time: 0.2 Cop_backoff_regionMiss_max_time: 0.2 Cop_backoff_regionMiss_max_addr: 127.0.0.1 Cop_backoff_regionMiss_avg_time: 0.2 Cop_backoff_regionMiss_p90_time: 0.2 Cop_backoff_rpcPD_total_times: 200 Cop_backoff_rpcPD_total_time: 0.2 Cop_backoff_rpcPD_max_time: 0.2 Cop_backoff_rpcPD_max_addr: 127.0.0.1 Cop_backoff_rpcPD_avg_time: 0.2 Cop_backoff_rpcPD_p90_time: 0.2 Cop_backoff_rpcTiKV_total_times: 200 Cop_backoff_rpcTiKV_total_time: 0.2 Cop_backoff_rpcTiKV_max_time: 0.2 Cop_backoff_rpcTiKV_max_addr: 127.0.0.1 Cop_backoff_rpcTiKV_avg_time: 0.2 Cop_backoff_rpcTiKV_p90_time: 0.2,` + - `0,0,1,1,,60e9378c746d9a2be1c791047e008967cf252eb6de9167ad3aa6098fa2d523f4,` + + `0,0,1,0,1,1,,60e9378c746d9a2be1c791047e008967cf252eb6de9167ad3aa6098fa2d523f4,` + `update t set i = 1;,select * from t;` c.Assert(expectRecordString, Equals, recordString) @@ -451,7 +452,7 @@ select 7;` sctx.GetSessionVars().TimeZone = loc sctx.GetSessionVars().SlowQueryFile = fileName3 for i, cas := range cases { - extractor := &plannercore.SlowQueryExtractor{Enable: (len(cas.startTime) > 0 && len(cas.endTime) > 0)} + extractor := &plannercore.SlowQueryExtractor{Enable: len(cas.startTime) > 0 && len(cas.endTime) > 0} if extractor.Enable { startTime, err := ParseTime(cas.startTime) c.Assert(err, IsNil) @@ -485,8 +486,6 @@ select 7;` } func TestSplitbyColon(t *testing.T) { - t.Parallel() - cases := []struct { line string fields []string @@ -623,7 +622,7 @@ select 9;` sctx.GetSessionVars().TimeZone = loc sctx.GetSessionVars().SlowQueryFile = fileName3 for i, cas := range cases { - extractor := &plannercore.SlowQueryExtractor{Enable: (len(cas.startTime) > 0 && len(cas.endTime) > 0), Desc: true} + extractor := &plannercore.SlowQueryExtractor{Enable: len(cas.startTime) > 0 && len(cas.endTime) > 0, Desc: true} if extractor.Enable { startTime, err := ParseTime(cas.startTime) c.Assert(err, IsNil) diff --git a/executor/stale_txn_test.go b/executor/stale_txn_test.go index 2e69a0d5ed8e8..03edfbb6b7ae1 100644 --- a/executor/stale_txn_test.go +++ b/executor/stale_txn_test.go @@ -576,10 +576,13 @@ func (s *testStaleTxnSerialSuite) TestSetTransactionReadOnlyAsOf(c *C) { } func (s *testStaleTxnSerialSuite) TestValidateReadOnlyInStalenessTransaction(c *C) { + errMsg1 := ".*only support read-only statement during read-only staleness transactions.*" + errMsg2 := ".*select lock hasn't been supported in stale read yet.*" testcases := []struct { name string sql string isValidate bool + errMsg string }{ { name: "select statement", @@ -595,6 +598,7 @@ func (s *testStaleTxnSerialSuite) TestValidateReadOnlyInStalenessTransaction(c * name: "explain analyze insert statement", sql: `explain analyze insert into t (id) values (1);`, isValidate: false, + errMsg: errMsg1, }, { name: "explain analyze select statement", @@ -605,6 +609,7 @@ func (s *testStaleTxnSerialSuite) TestValidateReadOnlyInStalenessTransaction(c * name: "execute insert statement", sql: `EXECUTE stmt1;`, isValidate: false, + errMsg: errMsg1, }, { name: "execute select statement", @@ -625,16 +630,19 @@ func (s *testStaleTxnSerialSuite) TestValidateReadOnlyInStalenessTransaction(c * name: "insert", sql: `insert into t (id) values (1);`, isValidate: false, + errMsg: errMsg1, }, { name: "delete", sql: `delete from t where id =1`, isValidate: false, + errMsg: errMsg1, }, { name: "update", sql: "update t set id =2 where id =1", isValidate: false, + errMsg: errMsg1, }, { name: "point get", @@ -660,41 +668,49 @@ func (s *testStaleTxnSerialSuite) TestValidateReadOnlyInStalenessTransaction(c * name: "select for update", sql: "select * from t where id = 1 for update", isValidate: false, + errMsg: errMsg2, }, { name: "select lock in share mode", sql: "select * from t where id = 1 lock in share mode", - isValidate: true, + isValidate: false, + errMsg: errMsg2, }, { name: "select for update union statement", sql: "select * from t for update union select * from t;", isValidate: false, + errMsg: errMsg1, }, { name: "replace statement", sql: "replace into t(id) values (1)", isValidate: false, + errMsg: errMsg1, }, { name: "load data statement", sql: "LOAD DATA LOCAL INFILE '/mn/asa.csv' INTO TABLE t FIELDS TERMINATED BY x'2c' ENCLOSED BY b'100010' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (id);", isValidate: false, + errMsg: errMsg1, }, { name: "update multi tables", sql: "update t,t1 set t.id = 1,t1.id = 2 where t.1 = 2 and t1.id = 3;", isValidate: false, + errMsg: errMsg1, }, { name: "delete multi tables", sql: "delete t from t1 where t.id = t1.id", isValidate: false, + errMsg: errMsg1, }, { name: "insert select", sql: "insert into t select * from t1;", isValidate: false, + errMsg: errMsg1, }, } tk := testkit.NewTestKit(c, s.store) @@ -720,7 +736,7 @@ func (s *testStaleTxnSerialSuite) TestValidateReadOnlyInStalenessTransaction(c * } else { err := tk.ExecToErr(testcase.sql) c.Assert(err, NotNil) - c.Assert(err.Error(), Matches, `.*only support read-only statement during read-only staleness transactions.*`) + c.Assert(err.Error(), Matches, testcase.errMsg) } tk.MustExec("commit") tk.MustExec("set transaction read only as of timestamp NOW(3);") @@ -729,8 +745,9 @@ func (s *testStaleTxnSerialSuite) TestValidateReadOnlyInStalenessTransaction(c * } else { err := tk.ExecToErr(testcase.sql) c.Assert(err, NotNil) - c.Assert(err.Error(), Matches, `.*only support read-only statement during read-only staleness transactions.*`) + c.Assert(err.Error(), Matches, testcase.errMsg) } + // clean the status tk.MustExec("set transaction read only as of timestamp ''") } } @@ -1181,3 +1198,50 @@ func (s *testStaleTxnSerialSuite) TestStaleReadCompatibility(c *C) { c.Assert(tk.MustQuery("select * from t;").Rows(), HasLen, 3) c.Assert(failpoint.Disable("github.com/pingcap/tidb/expression/injectNow"), IsNil) } + +func (s *testStaleTxnSerialSuite) TestStaleReadNoExtraTSORequest(c *C) { + tk := testkit.NewTestKit(c, s.store) + // For mocktikv, safe point is not initialized, we manually insert it for snapshot to use. + safePointName := "tikv_gc_safe_point" + safePointValue := "20160102-15:04:05 -0700" + safePointComment := "All versions after safe point can be accessed. (DO NOT EDIT)" + updateSafePoint := fmt.Sprintf(`INSERT INTO mysql.tidb VALUES ('%[1]s', '%[2]s', '%[3]s') + ON DUPLICATE KEY + UPDATE variable_value = '%[2]s', comment = '%[3]s'`, safePointName, safePointValue, safePointComment) + tk.MustExec(updateSafePoint) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (id int);") + time.Sleep(3 * time.Second) + // statement stale read + c.Assert(failpoint.Enable("github.com/pingcap/tidb/session/assertTSONotRequest", `return(true)`), IsNil) + tk.MustQuery("select * from t as of timestamp NOW() - INTERVAL 2 SECOND") + failpoint.Disable("github.com/pingcap/tidb/session/assertTSONotRequest") + + // set and statement stale read + tk.MustExec("set transaction read only as of timestamp NOW() - INTERVAL 2 SECOND") + c.Assert(failpoint.Enable("github.com/pingcap/tidb/session/assertTSONotRequest", `return(true)`), IsNil) + tk.MustQuery("select * from t") + failpoint.Disable("github.com/pingcap/tidb/session/assertTSONotRequest") + + // stale read transaction + c.Assert(failpoint.Enable("github.com/pingcap/tidb/session/assertTSONotRequest", `return(true)`), IsNil) + tk.MustExec("start transaction read only as of timestamp NOW() - INTERVAL 2 SECOND") + tk.MustQuery("select * from t") + tk.MustExec("commit") + failpoint.Disable("github.com/pingcap/tidb/session/assertTSONotRequest") + + // set and stale read transaction + tk.MustExec("set transaction read only as of timestamp NOW() - INTERVAL 2 SECOND") + c.Assert(failpoint.Enable("github.com/pingcap/tidb/session/assertTSONotRequest", `return(true)`), IsNil) + tk.MustExec("begin") + tk.MustQuery("select * from t") + tk.MustExec("commit") + failpoint.Disable("github.com/pingcap/tidb/session/assertTSONotRequest") + + // use tidb_read_staleness + tk.MustExec(`set @@tidb_read_staleness='-1'`) + c.Assert(failpoint.Enable("github.com/pingcap/tidb/session/assertTSONotRequest", `return(true)`), IsNil) + tk.MustQuery("select * from t") + failpoint.Disable("github.com/pingcap/tidb/session/assertTSONotRequest") +} diff --git a/executor/table_reader.go b/executor/table_reader.go index 150afa3942f1a..958b8cc442061 100644 --- a/executor/table_reader.go +++ b/executor/table_reader.go @@ -179,6 +179,7 @@ func (e *TableReaderExecutor) Open(ctx context.Context) error { // Treat temporary table as dummy table, avoid sending distsql request to TiKV. // Calculate the kv ranges here, UnionScan rely on this kv ranges. + // cached table and temporary table are similar if e.table.Meta() != nil && e.table.Meta().TempTableType != model.TempTableNone { kvReq, err := e.buildKVReq(ctx, firstPartRanges) if err != nil { diff --git a/executor/temporary_table_serial_test.go b/executor/temporary_table_test.go similarity index 100% rename from executor/temporary_table_serial_test.go rename to executor/temporary_table_test.go diff --git a/executor/testdata/executor_suite_in.json b/executor/testdata/executor_suite_in.json index cd8fa234c0117..c8d609cdf8e31 100644 --- a/executor/testdata/executor_suite_in.json +++ b/executor/testdata/executor_suite_in.json @@ -40,6 +40,25 @@ "SELECT * FROM t1 NATURAL LEFT JOIN t2 WHERE not(t1.a <=> t2.a)" ] }, + { + "name": "TestUsingAndNaturalJoinSchema", + "cases": [ + "select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) natural join (t3 natural join t4);", + "select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) join (t3 natural join t4) using (b);", + "select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) join (t3 natural join t4) using (c);", + "select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) join (t3 natural join t4) using (c,b);", + "select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) left outer join (t3 natural join t4) using (b);", + "select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) left outer join (t3 natural join t4) using (c);", + "select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) left outer join (t3 natural join t4) using (c,b);", + "select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) right outer join (t3 natural join t4) using (b);", + "select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) right outer join (t3 natural join t4) using (c);", + "select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) right outer join (t3 natural join t4) using (c,b);", + "select * from (t1 natural join t2) natural join (t3 natural join t4);", + "select * from (t1 natural join t2) join (t3 natural join t4) using (b);", + "select * from (t1 natural join t2) left outer join (t3 natural join t4) using (b);", + "select * from (t1 natural join t2) right outer join (t3 natural join t4) using (c,b);" + ] + }, { "name": "TestIndexScanWithYearCol", "cases": [ diff --git a/executor/testdata/executor_suite_out.json b/executor/testdata/executor_suite_out.json index eab098751f2ba..d2ad1621f6049 100644 --- a/executor/testdata/executor_suite_out.json +++ b/executor/testdata/executor_suite_out.json @@ -519,6 +519,121 @@ } ] }, + { + "Name": "TestUsingAndNaturalJoinSchema", + "Cases": [ + { + "SQL": "select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) natural join (t3 natural join t4);", + "Res": [ + "3 1 2 1 1 3 11 3", + "3 1 2 1 1 3 2 3" + ] + }, + { + "SQL": "select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) join (t3 natural join t4) using (b);", + "Res": [ + "10 1 2 1 1 3 11 3", + "10 1 2 1 1 3 2 3", + "3 1 2 1 1 3 11 3", + "3 1 2 1 1 3 2 3" + ] + }, + { + "SQL": "select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) join (t3 natural join t4) using (c);", + "Res": [ + "3 1 2 1 1 3 11 3", + "3 1 2 1 1 3 2 3" + ] + }, + { + "SQL": "select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) join (t3 natural join t4) using (c,b);", + "Res": [ + "3 1 2 1 1 3 11 3", + "3 1 2 1 1 3 2 3" + ] + }, + { + "SQL": "select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) left outer join (t3 natural join t4) using (b);", + "Res": [ + "10 1 2 1 1 3 11 3", + "10 1 2 1 1 3 2 3", + "3 1 2 1 1 3 11 3", + "3 1 2 1 1 3 2 3" + ] + }, + { + "SQL": "select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) left outer join (t3 natural join t4) using (c);", + "Res": [ + "10 1 2 1 <nil> <nil> <nil> <nil>", + "3 1 2 1 1 3 11 3", + "3 1 2 1 1 3 2 3" + ] + }, + { + "SQL": "select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) left outer join (t3 natural join t4) using (c,b);", + "Res": [ + "10 1 2 1 <nil> <nil> <nil> <nil>", + "3 1 2 1 1 3 11 3", + "3 1 2 1 1 3 2 3" + ] + }, + { + "SQL": "select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) right outer join (t3 natural join t4) using (b);", + "Res": [ + "10 1 2 1 1 3 11 3", + "10 1 2 1 1 3 2 3", + "3 1 2 1 1 3 11 3", + "3 1 2 1 1 3 2 3" + ] + }, + { + "SQL": "select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) right outer join (t3 natural join t4) using (c);", + "Res": [ + "3 1 2 1 1 3 11 3", + "3 1 2 1 1 3 2 3" + ] + }, + { + "SQL": "select t1.*, t2.*, t3.*, t4.* from (t1 natural join t2) right outer join (t3 natural join t4) using (c,b);", + "Res": [ + "3 1 2 1 1 3 11 3", + "3 1 2 1 1 3 2 3" + ] + }, + { + "SQL": "select * from (t1 natural join t2) natural join (t3 natural join t4);", + "Res": [ + "1 3 2 11", + "1 3 2 2" + ] + }, + { + "SQL": "select * from (t1 natural join t2) join (t3 natural join t4) using (b);", + "Res": [ + "1 10 2 3 11", + "1 10 2 3 2", + "1 3 2 3 11", + "1 3 2 3 2" + ] + }, + { + "SQL": "select * from (t1 natural join t2) left outer join (t3 natural join t4) using (b);", + "Res": [ + "1 10 2 3 11", + "1 10 2 3 2", + "1 3 2 3 11", + "1 3 2 3 2" + ] + }, + { + "SQL": "select * from (t1 natural join t2) right outer join (t3 natural join t4) using (c,b);", + "Res": [ + "3 1 11 2", + "3 1 2 2" + ] + } + ] + }, { "Name": "TestIndexScanWithYearCol", "Cases": [ diff --git a/executor/testdata/prepare_suite_in.json b/executor/testdata/prepare_suite_in.json index 952ca2af3ad9f..d3455f436dd8a 100644 --- a/executor/testdata/prepare_suite_in.json +++ b/executor/testdata/prepare_suite_in.json @@ -280,5 +280,64 @@ ] } ] + }, + { + "name": "TestParameterPushDown", + "cases": [ + { + "SQL": "prepare s1 from 'select a from t use index(a) where a+0>?'; -- IndexReader + pushed-down Selection with parameters" + }, + { + "SQL": "execute s1 using @x1" + }, + { + "SQL": "execute s1 using @x5" + }, + { + "SQL": "prepare s1 from 'select * from t where b>?'; -- TableReader + pushed-down Selection with parameters" + }, + { + "SQL": "execute s1 using @x1" + }, + { + "SQL": "execute s1 using @x5" + }, + { + "SQL": "prepare s1 from 'select * from t use index(a) where a+0>? and b>?'; -- IndexLookup + pushed-down Selection with parameters" + }, + { + "SQL": "execute s1 using @x1,@x1" + }, + { + "SQL": "execute s1 using @x5,@x5" + }, + { + "SQL": "prepare s1 from 'select * from t limit ?'; -- pushed-down Limit with parameters" + }, + { + "SQL": "execute s1 using @x10" + }, + { + "SQL": "execute s1 using @x20" + }, + { + "SQL": "prepare s1 from 'select * from t order by b limit ?'; -- pushed-down TopN with parameters" + }, + { + "SQL": "execute s1 using @x1" + }, + { + "SQL": "execute s1 using @x5" + }, + { + "SQL": "prepare s1 from 'select b, sum(c+?) from t group by b'; -- pushed-down Agg with parameters" + }, + { + "SQL": "execute s1 using @x1" + }, + { + "SQL": "execute s1 using @x5" + } + ] } ] diff --git a/executor/testdata/prepare_suite_out.json b/executor/testdata/prepare_suite_out.json index 5938097eb925e..dafdd1114bbfd 100644 --- a/executor/testdata/prepare_suite_out.json +++ b/executor/testdata/prepare_suite_out.json @@ -137,11 +137,9 @@ } ], "Plan": [ - "Projection_4 8000.00 root test.t1.a", - "└─Selection_12 8000.00 root eq(cast(test.t1.b, double BINARY), 0)", - " └─IndexReader_11 8000.00 root index:Selection_10", - " └─Selection_10 8000.00 cop[tikv] eq(cast(test.t1.b, double BINARY), 0)", - " └─IndexFullScan_9 10000.00 cop[tikv] table:t1, index:b(b, a) keep order:false, stats:pseudo" + "Projection_4 10.00 root test.t1.a", + "└─IndexReader_6 10.00 root index:IndexRangeScan_5", + " └─IndexRangeScan_5 10.00 cop[tikv] table:t1, index:b(b, a) range:[0,0], keep order:false, stats:pseudo" ], "LastPlanUseCache": "0", "Result": null @@ -210,15 +208,13 @@ } ], "Plan": [ - "HashJoin_38 63744383.74 root inner join, equal:[eq(test.t1.b, test.t2.b) eq(test.t1.a, test.t2.a)]", - "├─Selection_64(Build) 7984.01 root eq(cast(test.t2.b, double BINARY), 0), not(isnull(test.t2.a)), not(isnull(test.t2.b))", - "│ └─TableReader_63 7984.01 root data:Selection_62", - "│ └─Selection_62 7984.01 cop[tikv] eq(cast(test.t2.b, double BINARY), 0), not(isnull(test.t2.a)), not(isnull(test.t2.b))", - "│ └─TableFullScan_61 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─Selection_55(Probe) 7984.01 root eq(cast(test.t1.b, double BINARY), 0), not(isnull(test.t1.a)), not(isnull(test.t1.b))", - " └─TableReader_54 7984.01 root data:Selection_53", - " └─Selection_53 7984.01 cop[tikv] eq(cast(test.t1.b, double BINARY), 0), not(isnull(test.t1.a)), not(isnull(test.t1.b))", - " └─TableFullScan_52 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "HashJoin_36 124.88 root inner join, equal:[eq(test.t1.a, test.t2.a)]", + "├─IndexLookUp_57(Build) 99.90 root ", + "│ ├─IndexRangeScan_55(Build) 99.90 cop[tikv] table:t2, index:b(b, a) range:[0 -inf,0 +inf], keep order:false, stats:pseudo", + "│ └─TableRowIDScan_56(Probe) 99.90 cop[tikv] table:t2 keep order:false, stats:pseudo", + "└─IndexLookUp_51(Probe) 99.90 root ", + " ├─IndexRangeScan_49(Build) 99.90 cop[tikv] table:t1, index:b(b, a) range:[0 -inf,0 +inf], keep order:false, stats:pseudo", + " └─TableRowIDScan_50(Probe) 99.90 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "LastPlanUseCache": "0", "Result": null @@ -1072,5 +1068,226 @@ ] } ] + }, + { + "Name": "TestParameterPushDown", + "Cases": [ + { + "Result": null, + "Plan": null, + "FromCache": "" + }, + { + "Result": [ + "2", + "3", + "4", + "5", + "6" + ], + "Plan": [ + "Selection_8 8000.00 root gt(plus(test.t.a, 0), 1)", + "└─IndexReader_7 8000.00 root index:Selection_6", + " └─Selection_6 8000.00 cop[tikv] gt(plus(test.t.a, 0), 1)", + " └─IndexFullScan_5 10000.00 cop[tikv] table:t, index:a(a) keep order:false, stats:pseudo" + ], + "FromCache": "0" + }, + { + "Result": [ + "6" + ], + "Plan": [ + "Selection_8 8000.00 root gt(plus(test.t.a, 0), 5)", + "└─IndexReader_7 8000.00 root index:Selection_6", + " └─Selection_6 8000.00 cop[tikv] gt(plus(test.t.a, 0), 5)", + " └─IndexFullScan_5 10000.00 cop[tikv] table:t, index:a(a) keep order:false, stats:pseudo" + ], + "FromCache": "1" + }, + { + "Result": null, + "Plan": null, + "FromCache": "" + }, + { + "Result": [ + "2 2 2", + "3 3 3", + "4 4 4", + "5 5 5", + "6 6 6" + ], + "Plan": [ + "Selection_8 3333.33 root gt(test.t.b, 1)", + "└─TableReader_7 3333.33 root data:Selection_6", + " └─Selection_6 3333.33 cop[tikv] gt(test.t.b, 1)", + " └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "FromCache": "0" + }, + { + "Result": [ + "6 6 6" + ], + "Plan": [ + "Selection_8 3333.33 root gt(test.t.b, 5)", + "└─TableReader_7 3333.33 root data:Selection_6", + " └─Selection_6 3333.33 cop[tikv] gt(test.t.b, 5)", + " └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "FromCache": "1" + }, + { + "Result": null, + "Plan": null, + "FromCache": "" + }, + { + "Result": [ + "2 2 2", + "3 3 3", + "4 4 4", + "5 5 5", + "6 6 6" + ], + "Plan": [ + "Selection_10 2666.67 root gt(plus(test.t.a, 0), 1), gt(test.t.b, 1)", + "└─IndexLookUp_9 2666.67 root ", + " ├─Selection_7(Build) 8000.00 cop[tikv] gt(plus(test.t.a, 0), 1)", + " │ └─IndexFullScan_5 10000.00 cop[tikv] table:t, index:a(a) keep order:false, stats:pseudo", + " └─Selection_8(Probe) 2666.67 cop[tikv] gt(test.t.b, 1)", + " └─TableRowIDScan_6 8000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "FromCache": "0" + }, + { + "Result": [ + "6 6 6" + ], + "Plan": [ + "Selection_10 2666.67 root gt(plus(test.t.a, 0), 5), gt(test.t.b, 5)", + "└─IndexLookUp_9 2666.67 root ", + " ├─Selection_7(Build) 8000.00 cop[tikv] gt(plus(test.t.a, 0), 5)", + " │ └─IndexFullScan_5 10000.00 cop[tikv] table:t, index:a(a) keep order:false, stats:pseudo", + " └─Selection_8(Probe) 2666.67 cop[tikv] gt(test.t.b, 5)", + " └─TableRowIDScan_6 8000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "FromCache": "1" + }, + { + "Result": null, + "Plan": null, + "FromCache": "" + }, + { + "Result": [ + "1 1 1", + "2 2 2", + "3 3 3", + "4 4 4", + "5 5 5", + "6 6 6" + ], + "Plan": [ + "Limit_7 10.00 root offset:0, count:10", + "└─TableReader_11 10.00 root data:Limit_10", + " └─Limit_10 10.00 cop[tikv] offset:0, count:10", + " └─TableFullScan_9 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "FromCache": "0" + }, + { + "Result": [ + "1 1 1", + "2 2 2", + "3 3 3", + "4 4 4", + "5 5 5", + "6 6 6" + ], + "Plan": [ + "Limit_7 20.00 root offset:0, count:20", + "└─TableReader_11 20.00 root data:Limit_10", + " └─Limit_10 20.00 cop[tikv] offset:0, count:20", + " └─TableFullScan_9 20.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "FromCache": "0" + }, + { + "Result": null, + "Plan": null, + "FromCache": "" + }, + { + "Result": [ + "1 1 1" + ], + "Plan": [ + "TopN_7 1.00 root test.t.b, offset:0, count:1", + "└─TableReader_14 1.00 root data:TopN_13", + " └─TopN_13 1.00 cop[tikv] test.t.b, offset:0, count:1", + " └─TableFullScan_12 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "FromCache": "0" + }, + { + "Result": [ + "1 1 1", + "2 2 2", + "3 3 3", + "4 4 4", + "5 5 5" + ], + "Plan": [ + "TopN_7 5.00 root test.t.b, offset:0, count:5", + "└─TableReader_14 5.00 root data:TopN_13", + " └─TopN_13 5.00 cop[tikv] test.t.b, offset:0, count:5", + " └─TableFullScan_12 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "FromCache": "0" + }, + { + "Result": null, + "Plan": null, + "FromCache": "" + }, + { + "Result": [ + "1 2", + "2 3", + "3 4", + "4 5", + "5 6", + "6 7" + ], + "Plan": [ + "Projection_4 8000.00 root test.t.b, Column#5", + "└─HashAgg_9 8000.00 root group by:test.t.b, funcs:sum(Column#6)->Column#5, funcs:firstrow(test.t.b)->test.t.b", + " └─TableReader_10 8000.00 root data:HashAgg_5", + " └─HashAgg_5 8000.00 cop[tikv] group by:test.t.b, funcs:sum(plus(test.t.c, 1))->Column#6", + " └─TableFullScan_8 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "FromCache": "0" + }, + { + "Result": [ + "1 6", + "2 7", + "3 8", + "4 9", + "5 10", + "6 11" + ], + "Plan": [ + "Projection_4 8000.00 root test.t.b, Column#5", + "└─HashAgg_9 8000.00 root group by:test.t.b, funcs:sum(Column#6)->Column#5, funcs:firstrow(test.t.b)->test.t.b", + " └─TableReader_10 8000.00 root data:HashAgg_5", + " └─HashAgg_5 8000.00 cop[tikv] group by:test.t.b, funcs:sum(plus(test.t.c, 5))->Column#6", + " └─TableFullScan_8 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ], + "FromCache": "1" + } + ] } ] diff --git a/executor/tiflash_test.go b/executor/tiflash_test.go index 5bc9503cc29ff..10d51bb1a27d7 100644 --- a/executor/tiflash_test.go +++ b/executor/tiflash_test.go @@ -37,6 +37,7 @@ import ( "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/store/mockstore/unistore" + "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/israce" "github.com/pingcap/tidb/util/kvcache" "github.com/pingcap/tidb/util/testkit" @@ -84,6 +85,22 @@ func (s *tiflashTestSuite) TearDownSuite(c *C) { c.Assert(s.store.Close(), IsNil) } +func (s *tiflashTestSuite) TestNonsupportCharsetTable(c *C) { + collate.SetCharsetFeatEnabledForTest(true) + defer collate.SetCharsetFeatEnabledForTest(false) + 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 char(10) charset gbk collate gbk_bin)") + err := tk.ExecToErr("alter table t set tiflash replica 1") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[ddl:8200]Unsupported ALTER table replica for table contain gbk charset") + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a char(10) charset utf8)") + tk.MustExec("alter table t set tiflash replica 1") +} + func (s *tiflashTestSuite) TestReadPartitionTable(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") @@ -773,6 +790,48 @@ func (s *tiflashTestSuite) TestUnionWithEmptyDualTable(c *C) { tk.MustQuery("select count(*) from (select a , b from t union all select a , c from t1 where false) tt").Check(testkit.Rows("1")) } +func (s *tiflashTestSuite) TestAvgOverflow(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + // avg int + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a decimal(1,0))") + tk.MustExec("alter table t set tiflash replica 1") + tb := testGetTableByName(c, tk.Se, "test", "t") + err := domain.GetDomain(tk.Se).DDL().UpdateTableReplicaInfo(tk.Se, tb.Meta().ID, true) + c.Assert(err, IsNil) + tk.MustExec("insert into t values(9)") + for i := 0; i < 16; i++ { + tk.MustExec("insert into t select * from t") + } + tk.MustExec("set @@session.tidb_isolation_read_engines=\"tiflash\"") + tk.MustExec("set @@session.tidb_enforce_mpp=ON") + tk.MustQuery("select avg(a) from t group by a").Check(testkit.Rows("9.0000")) + tk.MustExec("drop table if exists t") + + // avg decimal + tk.MustExec("drop table if exists td;") + tk.MustExec("create table td (col_bigint bigint(20), col_smallint smallint(6));") + tk.MustExec("alter table td set tiflash replica 1") + tb = testGetTableByName(c, tk.Se, "test", "td") + err = domain.GetDomain(tk.Se).DDL().UpdateTableReplicaInfo(tk.Se, tb.Meta().ID, true) + c.Assert(err, IsNil) + tk.MustExec("insert into td values (null, 22876);") + tk.MustExec("insert into td values (9220557287087669248, 32767);") + tk.MustExec("insert into td values (28030, 32767);") + tk.MustExec("insert into td values (-3309864251140603904,32767);") + tk.MustExec("insert into td values (4,0);") + tk.MustExec("insert into td values (null,0);") + tk.MustExec("insert into td values (4,-23828);") + tk.MustExec("insert into td values (54720,32767);") + tk.MustExec("insert into td values (0,29815);") + tk.MustExec("insert into td values (10017,-32661);") + tk.MustExec("set @@session.tidb_isolation_read_engines=\"tiflash\"") + tk.MustExec("set @@session.tidb_enforce_mpp=ON") + tk.MustQuery(" SELECT AVG( col_bigint / col_smallint) AS field1 FROM td;").Sort().Check(testkit.Rows("25769363061037.62077260")) + tk.MustExec("drop table if exists td;") +} + func (s *tiflashTestSuite) TestMppApply(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") diff --git a/executor/trace.go b/executor/trace.go index 3cc03ec48166e..ac97ce9e987be 100644 --- a/executor/trace.go +++ b/executor/trace.go @@ -15,15 +15,23 @@ package executor import ( + "archive/zip" "context" + "crypto/rand" + "encoding/base64" "encoding/json" "fmt" + "os" + "path/filepath" "sort" + "strings" "time" "github.com/opentracing/basictracer-go" "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" + "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" @@ -51,6 +59,10 @@ type TraceExec struct { builder *executorBuilder format string + + // optimizerTrace indicates 'trace plan statement' + optimizerTrace bool + optimizerTraceTarget string } // Next executes real query and collects span later. @@ -71,6 +83,13 @@ func (e *TraceExec) Next(ctx context.Context, req *chunk.Chunk) error { e.ctx.GetSessionVars().StmtCtx = stmtCtx }() + if e.optimizerTrace { + if e.optimizerTraceTarget == core.TracePlanTargetEstimation { + return e.nextOptimizerCEPlanTrace(ctx, e.ctx, req) + } + return e.nextOptimizerPlanTrace(ctx, e.ctx, req) + } + switch e.format { case core.TraceFormatLog: return e.nextTraceLog(ctx, se, req) @@ -79,6 +98,84 @@ func (e *TraceExec) Next(ctx context.Context, req *chunk.Chunk) error { } } +func (e *TraceExec) nextOptimizerCEPlanTrace(ctx context.Context, se sessionctx.Context, req *chunk.Chunk) error { + stmtCtx := se.GetSessionVars().StmtCtx + origin := stmtCtx.EnableOptimizerCETrace + stmtCtx.EnableOptimizerCETrace = true + defer func() { + stmtCtx.EnableOptimizerCETrace = origin + }() + + _, _, err := core.OptimizeAstNode(ctx, se, e.stmtNode, se.GetInfoSchema().(infoschema.InfoSchema)) + if err != nil { + return err + } + + writer := strings.Builder{} + jsonEncoder := json.NewEncoder(&writer) + // If we do not set this to false, ">", "<", "&"... will be escaped to "\u003c","\u003e", "\u0026"... + jsonEncoder.SetEscapeHTML(false) + err = jsonEncoder.Encode(stmtCtx.OptimizerCETrace) + if err != nil { + return errors.AddStack(err) + } + res := []byte(writer.String()) + + req.AppendBytes(0, res) + e.exhausted = true + return nil +} + +func (e *TraceExec) nextOptimizerPlanTrace(ctx context.Context, se sessionctx.Context, req *chunk.Chunk) error { + zf, fileName, err := generateOptimizerTraceFile() + if err != nil { + return err + } + zw := zip.NewWriter(zf) + defer func() { + err := zw.Close() + if err != nil { + logutil.BgLogger().Warn("Closing zip writer failed", zap.Error(err)) + } + err = zf.Close() + if err != nil { + logutil.BgLogger().Warn("Closing zip file failed", zap.Error(err)) + } + }() + traceZW, err := zw.Create("trace.json") + if err != nil { + return errors.AddStack(err) + } + stmtCtx := se.GetSessionVars().StmtCtx + origin := stmtCtx.EnableOptimizeTrace + stmtCtx.EnableOptimizeTrace = true + defer func() { + stmtCtx.EnableOptimizeTrace = origin + }() + _, _, err = core.OptimizeAstNode(ctx, se, e.stmtNode, se.GetInfoSchema().(infoschema.InfoSchema)) + if err != nil { + return err + } + + writer := strings.Builder{} + jsonEncoder := json.NewEncoder(&writer) + // If we do not set this to false, ">", "<", "&"... will be escaped to "\u003c","\u003e", "\u0026"... + jsonEncoder.SetEscapeHTML(false) + err = jsonEncoder.Encode(se.GetSessionVars().StmtCtx.LogicalOptimizeTrace) + if err != nil { + return errors.AddStack(err) + } + res := []byte(writer.String()) + + _, err = traceZW.Write(res) + if err != nil { + return errors.AddStack(err) + } + req.AppendString(0, fileName) + e.exhausted = true + return nil +} + func (e *TraceExec) nextTraceLog(ctx context.Context, se sqlexec.SQLExecutor, req *chunk.Chunk) error { recorder := basictracer.NewInMemoryRecorder() tracer := basictracer.New(recorder) @@ -163,7 +260,7 @@ func (e *TraceExec) executeChild(ctx context.Context, se sqlexec.SQLExecutor) { } func drainRecordSet(ctx context.Context, sctx sessionctx.Context, rs sqlexec.RecordSet) { - req := rs.NewChunk() + req := rs.NewChunk(nil) var rowCount int for { err := rs.Next(ctx, req) @@ -252,3 +349,26 @@ func generateLogResult(allSpans []basictracer.RawSpan, chk *chunk.Chunk) { } } } + +func generateOptimizerTraceFile() (*os.File, string, error) { + dirPath := domain.GetOptimizerTraceDirName() + // Create path + err := os.MkdirAll(dirPath, os.ModePerm) + if err != nil { + return nil, "", errors.AddStack(err) + } + // Generate key and create zip file + time := time.Now().UnixNano() + b := make([]byte, 16) + _, err = rand.Read(b) + if err != nil { + return nil, "", errors.AddStack(err) + } + key := base64.URLEncoding.EncodeToString(b) + fileName := fmt.Sprintf("optimizer_trace_%v_%v.zip", key, time) + zf, err := os.Create(filepath.Join(dirPath, fileName)) + if err != nil { + return nil, "", errors.AddStack(err) + } + return zf, fileName, nil +} diff --git a/executor/trace_test.go b/executor/trace_test.go index c360ee82f0856..0771151c63e2a 100644 --- a/executor/trace_test.go +++ b/executor/trace_test.go @@ -66,3 +66,13 @@ func rowsOrdered(rows [][]interface{}) bool { } return true } + +func (s *testSuite1) TestTracePlanStmt(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("create table tp123(id int);") + rows := tk.MustQuery("trace plan select * from tp123").Rows() + c.Assert(rows, HasLen, 1) + c.Assert(rows[0], HasLen, 1) + c.Assert(rows[0][0].(string), Matches, ".*zip") +} diff --git a/executor/union_scan.go b/executor/union_scan.go index e08e90249375c..86b696a8ee988 100644 --- a/executor/union_scan.go +++ b/executor/union_scan.go @@ -28,6 +28,7 @@ import ( "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/collate" ) // UnionScanExec merges the rows from dirty table and the rows from distsql request. @@ -56,6 +57,10 @@ type UnionScanExec struct { // virtualColumnIndex records all the indices of virtual columns and sort them in definition // to make sure we can compute the virtual column in right order. virtualColumnIndex []int + + // cacheTable not nil means it's reading from cached table. + cacheTable kv.MemBuffer + collators []collate.Collator } // Open implements the Executor Open interface. @@ -98,6 +103,8 @@ func (us *UnionScanExec) open(ctx context.Context) error { us.addedRows, err = buildMemIndexReader(us, x).getMemRows() case *IndexLookUpExecutor: us.addedRows, err = buildMemIndexLookUpReader(us, x).getMemRows() + case *IndexMergeReaderExecutor: + us.addedRows, err = buildMemIndexMergeReader(us, x).getMemRows() default: err = fmt.Errorf("unexpected union scan children:%T", reader) } @@ -202,6 +209,10 @@ func (us *UnionScanExec) getOneRow(ctx context.Context) ([]types.Datum, error) { } func (us *UnionScanExec) getSnapshotRow(ctx context.Context) ([]types.Datum, error) { + if us.cacheTable != nil { + // From cache table, so the snapshot is nil + return nil, nil + } if us.cursor4SnapshotRows < len(us.snapshotRows) { return us.snapshotRows[us.cursor4SnapshotRows], nil } @@ -266,7 +277,7 @@ func (us *UnionScanExec) compare(a, b []types.Datum) (int, error) { for _, colOff := range us.usedIndex { aColumn := a[colOff] bColumn := b[colOff] - cmp, err := aColumn.CompareDatum(sc, &bColumn) + cmp, err := aColumn.Compare(sc, &bColumn, us.collators[colOff]) if err != nil { return 0, err } @@ -274,5 +285,5 @@ func (us *UnionScanExec) compare(a, b []types.Datum) (int, error) { return cmp, nil } } - return us.belowHandleCols.Compare(a, b) + return us.belowHandleCols.Compare(a, b, us.collators) } diff --git a/executor/union_scan_test.go b/executor/union_scan_test.go index 5e0727458230e..6133010ec29da 100644 --- a/executor/union_scan_test.go +++ b/executor/union_scan_test.go @@ -16,13 +16,16 @@ package executor_test import ( "fmt" + "testing" - . "github.com/pingcap/check" - "github.com/pingcap/tidb/util/testkit" + "github.com/pingcap/tidb/testkit" + "github.com/stretchr/testify/require" ) -func (s *testSuite7) TestDirtyTransaction(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestDirtyTransaction(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("set @@session.tidb_executor_concurrency = 4;") tk.MustExec("set @@session.tidb_hash_join_concurrency = 5;") tk.MustExec("set @@session.tidb_distsql_scan_concurrency = 15;") @@ -149,8 +152,10 @@ func (s *testSuite7) TestDirtyTransaction(c *C) { tk.MustExec("commit;") } -func (s *testSuite7) TestUnionScanWithCastCondition(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestUnionScanWithCastCondition(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("create table ta (a varchar(20))") tk.MustExec("insert ta values ('1'), ('2')") @@ -162,8 +167,10 @@ func (s *testSuite7) TestUnionScanWithCastCondition(c *C) { tk.MustExec("rollback") } -func (s *testSuite7) TestUnionScanForMemBufferReader(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestUnionScanForMemBufferReader(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t (a int,b int, index idx(b))") @@ -214,8 +221,8 @@ func (s *testSuite7) TestUnionScanForMemBufferReader(c *C) { tk.MustExec("insert t values (1,1),(2,2)") tk.MustExec("begin") _, err := tk.Exec("update t set b=b+1") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '2' for key 'idx'") + require.NotNil(t, err) + require.EqualError(t, err, "[kv:1062]Duplicate entry '2' for key 'idx'") // update with unchange index column. tk.MustExec("update t set a=a+1") tk.MustQuery("select * from t use index (idx)").Check(testkit.Rows("2 1", "3 2")) @@ -298,8 +305,10 @@ func (s *testSuite7) TestUnionScanForMemBufferReader(c *C) { tk.MustExec("admin check table t1;") } -func (s *testSuite7) TestForUpdateUntouchedIndex(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestForUpdateUntouchedIndex(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") @@ -330,14 +339,16 @@ func (s *testSuite7) TestForUpdateUntouchedIndex(c *C) { tk.MustExec("create table t (a int,b int, unique index(a))") tk.MustExec("begin") _, err := tk.Exec("insert into t values (1, 1), (2, 2), (1, 3) on duplicate key update a = a + 1;") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '2' for key 'a'") + require.NotNil(t, err) + require.EqualError(t, err, "[kv:1062]Duplicate entry '2' for key 'a'") tk.MustExec("commit") tk.MustExec("admin check table t") } -func (s *testSuite7) TestUpdateScanningHandles(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestUpdateScanningHandles(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t;") tk.MustExec("create table t(a int primary key, b int);") @@ -363,13 +374,15 @@ func (s *testSuite7) TestUpdateScanningHandles(c *C) { tk.MustExec("insert into t values (1, 1);") tk.MustExec("update /*+ INL_JOIN(t1) */ t t1, (select a, b from t) t2 set t1.b = t2.b where t1.a = t2.a + 1000;") result := tk.MustQuery("select a, a-b from t where a > 1000 and a - b != 1000;") - c.Assert(result.Rows(), HasLen, 0) + require.Len(t, result.Rows(), 0) tk.MustExec("rollback;") } // See https://github.com/pingcap/tidb/issues/19136 -func (s *testSuite7) TestForApplyAndUnionScan(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestForApplyAndUnionScan(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") diff --git a/executor/update.go b/executor/update.go index 03a9979878ab1..7df144b28196c 100644 --- a/executor/update.go +++ b/executor/update.go @@ -274,7 +274,7 @@ func (e *UpdateExec) updateRows(ctx context.Context) (int, error) { if variable.TopSQLEnabled() { txn, err := e.ctx.Txn(true) if err == nil { - txn.SetOption(kv.ResourceGroupTag, e.ctx.GetSessionVars().StmtCtx.GetResourceGroupTag()) + txn.SetOption(kv.ResourceGroupTagger, e.ctx.GetSessionVars().StmtCtx.GetResourceGroupTagger()) } } for rowIdx := 0; rowIdx < chk.NumRows(); rowIdx++ { diff --git a/executor/utils_test.go b/executor/utils_test.go index 2cc64849ca922..3c8a32de25cc5 100644 --- a/executor/utils_test.go +++ b/executor/utils_test.go @@ -15,11 +15,13 @@ package executor import ( - . "github.com/pingcap/check" + "testing" + "github.com/pingcap/errors" + "github.com/stretchr/testify/require" ) -func (s *pkgTestSuite) TestBatchRetrieverHelper(c *C) { +func TestBatchRetrieverHelper(t *testing.T) { rangeStarts := make([]int, 0) rangeEnds := make([]int, 0) collect := func(start, end int) error { @@ -30,9 +32,9 @@ func (s *pkgTestSuite) TestBatchRetrieverHelper(c *C) { r := &batchRetrieverHelper{} err := r.nextBatch(collect) - c.Assert(err, IsNil) - c.Assert(rangeStarts, DeepEquals, []int{}) - c.Assert(rangeEnds, DeepEquals, []int{}) + require.NoError(t, err) + require.Equal(t, rangeStarts, []int{}) + require.Equal(t, rangeEnds, []int{}) r = &batchRetrieverHelper{ retrieved: true, @@ -40,9 +42,9 @@ func (s *pkgTestSuite) TestBatchRetrieverHelper(c *C) { totalRows: 10, } err = r.nextBatch(collect) - c.Assert(err, IsNil) - c.Assert(rangeStarts, DeepEquals, []int{}) - c.Assert(rangeEnds, DeepEquals, []int{}) + require.NoError(t, err) + require.Equal(t, rangeStarts, []int{}) + require.Equal(t, rangeEnds, []int{}) r = &batchRetrieverHelper{ batchSize: 3, @@ -51,8 +53,8 @@ func (s *pkgTestSuite) TestBatchRetrieverHelper(c *C) { err = r.nextBatch(func(start, end int) error { return errors.New("some error") }) - c.Assert(err, NotNil) - c.Assert(r.retrieved, IsTrue) + require.Error(t, err) + require.True(t, r.retrieved) r = &batchRetrieverHelper{ batchSize: 3, @@ -60,10 +62,10 @@ func (s *pkgTestSuite) TestBatchRetrieverHelper(c *C) { } for !r.retrieved { err = r.nextBatch(collect) - c.Assert(err, IsNil) + require.NoError(t, err) } - c.Assert(rangeStarts, DeepEquals, []int{0, 3, 6, 9}) - c.Assert(rangeEnds, DeepEquals, []int{3, 6, 9, 10}) + require.Equal(t, rangeStarts, []int{0, 3, 6, 9}) + require.Equal(t, rangeEnds, []int{3, 6, 9, 10}) rangeStarts = rangeStarts[:0] rangeEnds = rangeEnds[:0] @@ -73,10 +75,10 @@ func (s *pkgTestSuite) TestBatchRetrieverHelper(c *C) { } for !r.retrieved { err = r.nextBatch(collect) - c.Assert(err, IsNil) + require.NoError(t, err) } - c.Assert(rangeStarts, DeepEquals, []int{0, 3, 6}) - c.Assert(rangeEnds, DeepEquals, []int{3, 6, 9}) + require.Equal(t, rangeStarts, []int{0, 3, 6}) + require.Equal(t, rangeEnds, []int{3, 6, 9}) rangeStarts = rangeStarts[:0] rangeEnds = rangeEnds[:0] @@ -86,8 +88,8 @@ func (s *pkgTestSuite) TestBatchRetrieverHelper(c *C) { } for !r.retrieved { err = r.nextBatch(collect) - c.Assert(err, IsNil) + require.NoError(t, err) } - c.Assert(rangeStarts, DeepEquals, []int{0}) - c.Assert(rangeEnds, DeepEquals, []int{10}) + require.Equal(t, rangeStarts, []int{0}) + require.Equal(t, rangeEnds, []int{10}) } diff --git a/executor/window_test.go b/executor/window_test.go index 6cbe826abff97..97ce36b4f3258 100644 --- a/executor/window_test.go +++ b/executor/window_test.go @@ -471,3 +471,23 @@ func (s *testSuite7) TestIssue24264(c *C) { "8297270320597030697", "<nil>")) } + +func (s *testSuite7) TestIssue29947(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec(`drop table if exists t_tir89b, t_vejdy`) + + tk.MustExec("CREATE TABLE `t_tir89b` (`c_3pcik` int(11) DEFAULT NULL,`c_0b6nxb` text DEFAULT NULL,`c_qytrlc` double NOT NULL,`c_sroc_c` int(11) DEFAULT NULL,PRIMARY KEY (`c_qytrlc`) /*T![clustered_index] NONCLUSTERED */ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;") + + tk.MustExec(`INSERT INTO t_tir89b VALUES (66,'cjd1o',87.77,NULL),(134217728,'d_unpd',76.66,NULL),(50,'_13gs',1.46,32),(49,'xclvsc',64.7,48),(7,'1an13',70.86,7),(29,NULL,6.26,6),(8,'hc485b',47.44,2),(84,'d_nlmd',99.3,76),(14,'lbny1c',61.1,47),(45,'9r5bid',25.37,95),(49,'jbz5r',72.99,49),(18,'uode3d',7.21,992),(-8945040,'ftrtib',47.47,20),(29,'algrj',6.28,24),(96,NULL,67.83,24),(5,'s1gfz',89.18,78),(74,'ggqbl',83.89,68),(61,'5n1q7',26.92,6),(10,'4gflb',33.84,28),(48,'xoe0cd',84.71,77),(6,'xkh6i',53.83,19),(5,NULL,89.1,46),(49,'4q6nx',31.5,384),(1,'pgs1',66.8,77),(19,'lltflc',33.49,63),(87,'vd4htc',39.92,-5367008),(47,NULL,28.3,10),(29,'15jqfc',100.11,64),(45,'ii6pm',52.41,61),(0,NULL,85.27,19),(104,'ikpxnb',40.66,955),(40,'gzryzd',36.23,42),(18,'7UPNE',84.27,14),(32,NULL,84.8,53),(51,'2c5lfb',18.98,74),(97,NULL,22.89,6),(70,'guyzyc',96.29,89),(34,'dvdoqb',53.82,1),(94,'6eop6b',81.77,90),(42,'p7vsnd',62.54,NULL);`) + + tk.MustExec("CREATE TABLE `t_vejdy` (`c_iovir` int(11) NOT NULL,`c_r_mw3d` double DEFAULT NULL,`c_uxhghb` int(11) DEFAULT NULL,`c_rb7otb` int(11) NOT NULL,`c_dplyac` int(11) DEFAULT NULL,`c_lmcqed` double DEFAULT NULL,`c_ayaoed` text DEFAULT NULL,`c__zbqr` int(11) DEFAULT NULL,PRIMARY KEY (`c_iovir`,`c_rb7otb`) /*T![clustered_index] NONCLUSTERED */,KEY `t_e1ejcd` (`c_uxhghb`),KEY `t_o6ui_b` (`c_iovir`,`c_r_mw3d`,`c_uxhghb`,`c_rb7otb`,`c_dplyac`,`c_lmcqed`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;") + + tk.MustExec(`INSERT INTO t_vejdy VALUES (49,100.11,68,57,44,17.93,NULL,84),(38,56.91,78,30,0,53.28,'cjd1o',2),(6,NULL,NULL,88,81,93.47,'0jftkb',54),(73,91.51,31,82,3,38.12,'buesob',40),(7,26.73,7,78,9,NULL,'fd5kgd',49),(80,70.57,4,47,43,25.59,'glpoq',44),(79,94.16,15,0,0,79.55,'0ok94d',56),(58,NULL,50,69,2,65.46,'sm6rj',29),(41472,6.51,70,1080,100,43.18,'fofk4c',43),(0,6.2,57,97,2,56.17,'zqpzq',56),(72,76.66,97,88,95,75.47,'hikxqb',34),(27,1.11,134217728,57,25,NULL,'4gflb',0),(64,NULL,47,69,6,72.5,'w7jmhd',45),(-134217679,88.74,33,82,85,59.89,NULL,26),(59,97.98,37,28,33,61.1,'xioxdd',45),(6,47.31,0,0,-19,38.77,'uxmdlc',17),(82,28.62,36,70,39,11.79,'zzi8cc',2),(33,37.3,55,86,69,60.56,'mn_xx',0),(7,NULL,80,0,17,59.79,'5n1q7',97),(88,50.81,15,30,63,25.37,'ordwed',29),(48,4.32,90,48,38,84.62,'lclx',32),(10,NULL,95,75,1,21.64,NULL,85),(62,NULL,0,30,10,NULL,'7bacud',5),(50,38.81,6,0,6,64.28,'gpibn',57),(1,46.8,21,32,46,33.38,NULL,6),(29,NULL,38,7,91,31.5,'pdzdl',24),(54,6.26,1,85,22,75.63,'gl4_7',29),(1,90.37,63,63,6,61.2,'wvw23b',86),(47,NULL,82,73,0,95.79,'uipcf',NULL),(46,48.1,37,6,1,52.33,'gthpic',0),(41,75.1,7,44,5,84.16,'fe_e5',58),(43,87.71,81,32,28,91.98,'9e5nvc',66),(20,58.21,88,75,92,43.64,'kagroc',66),(91,52.75,22,14,80,NULL,'\'_YN6MD\'',6),(72,94.83,0,49,5,57.82,NULL,23),(7,100.11,0,92,13,6.28,NULL,0);`) + + tk.MustExec("begin") + tk.MustExec("delete from t_tir89b where t_tir89b.c_3pcik >= t_tir89b.c_sroc_c;") + result := tk.MustQuery("select * from (select count(*) over (partition by ref_0.c_0b6nxb order by ref_0.c_3pcik) as c0 from t_tir89b as ref_0) as subq_0 where subq_0.c0 <> 1;") + result.Check(testkit.Rows("2", "3")) + tk.MustExec("commit") +} diff --git a/executor/write.go b/executor/write.go index f8e0c2c19c1b3..9b690d1141382 100644 --- a/executor/write.go +++ b/executor/write.go @@ -25,13 +25,13 @@ import ( "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta/autoid" "github.com/pingcap/tidb/parser/ast" - "github.com/pingcap/tidb/parser/charset" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/memory" ) @@ -94,11 +94,8 @@ func updateRecord(ctx context.Context, sctx sessionctx.Context, h kv.Handle, old // 3. Compare datum, then handle some flags. for i, col := range t.Cols() { - collation := newData[i].Collation() // We should use binary collation to compare datum, otherwise the result will be incorrect. - newData[i].SetCollation(charset.CollationBin) - cmp, err := newData[i].CompareDatum(sc, &oldData[i]) - newData[i].SetCollation(collation) + cmp, err := newData[i].Compare(sc, &oldData[i], collate.GetBinaryCollator()) if err != nil { return false, err } diff --git a/executor/write_concurrent_test.go b/executor/write_concurrent_test.go index 58e7f37ef4777..141cec3da472d 100644 --- a/executor/write_concurrent_test.go +++ b/executor/write_concurrent_test.go @@ -24,8 +24,6 @@ import ( ) func TestBatchInsertWithOnDuplicate(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() diff --git a/executor/write_test.go b/executor/write_test.go index 5fe78511237da..11e402f446631 100644 --- a/executor/write_test.go +++ b/executor/write_test.go @@ -19,12 +19,12 @@ import ( "errors" "fmt" "strconv" - "sync" + "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/executor" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/planner/core" @@ -35,89 +35,88 @@ import ( "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" + "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/mock" - "github.com/pingcap/tidb/util/testkit" "github.com/pingcap/tidb/util/testutil" + "github.com/stretchr/testify/require" ) -type testBypassSuite struct{} - -func (s *testBypassSuite) SetUpSuite(c *C) { -} - -func (s *testSuite) TestInsert(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestInsert(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") testSQL := `drop table if exists insert_test;create table insert_test (id int PRIMARY KEY AUTO_INCREMENT, c1 int, c2 int, c3 int default 1);` tk.MustExec(testSQL) testSQL = `insert insert_test (c1) values (1),(2),(NULL);` tk.MustExec(testSQL) - tk.CheckLastMessage("Records: 3 Duplicates: 0 Warnings: 0") + require.Equal(t, tk.Session().LastMessage(), "Records: 3 Duplicates: 0 Warnings: 0") errInsertSelectSQL := `insert insert_test (c1) values ();` tk.MustExec("begin") _, err := tk.Exec(errInsertSelectSQL) - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("rollback") errInsertSelectSQL = `insert insert_test (c1, c2) values (1,2),(1);` tk.MustExec("begin") _, err = tk.Exec(errInsertSelectSQL) - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("rollback") errInsertSelectSQL = `insert insert_test (xxx) values (3);` tk.MustExec("begin") _, err = tk.Exec(errInsertSelectSQL) - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("rollback") errInsertSelectSQL = `insert insert_test_xxx (c1) values ();` tk.MustExec("begin") _, err = tk.Exec(errInsertSelectSQL) - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("rollback") insertSetSQL := `insert insert_test set c1 = 3;` tk.MustExec(insertSetSQL) - tk.CheckLastMessage("") + require.Empty(t, tk.Session().LastMessage()) errInsertSelectSQL = `insert insert_test set c1 = 4, c1 = 5;` tk.MustExec("begin") _, err = tk.Exec(errInsertSelectSQL) - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("rollback") errInsertSelectSQL = `insert insert_test set xxx = 6;` tk.MustExec("begin") _, err = tk.Exec(errInsertSelectSQL) - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("rollback") insertSelectSQL := `create table insert_test_1 (id int, c1 int);` tk.MustExec(insertSelectSQL) insertSelectSQL = `insert insert_test_1 select id, c1 from insert_test;` tk.MustExec(insertSelectSQL) - tk.CheckLastMessage("Records: 4 Duplicates: 0 Warnings: 0") + require.Equal(t, tk.Session().LastMessage(), "Records: 4 Duplicates: 0 Warnings: 0") insertSelectSQL = `create table insert_test_2 (id int, c1 int);` tk.MustExec(insertSelectSQL) insertSelectSQL = `insert insert_test_1 select id, c1 from insert_test union select id * 10, c1 * 10 from insert_test;` tk.MustExec(insertSelectSQL) - tk.CheckLastMessage("Records: 8 Duplicates: 0 Warnings: 0") + require.Equal(t, tk.Session().LastMessage(), "Records: 8 Duplicates: 0 Warnings: 0") errInsertSelectSQL = `insert insert_test_1 select c1 from insert_test;` tk.MustExec("begin") _, err = tk.Exec(errInsertSelectSQL) - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("rollback") errInsertSelectSQL = `insert insert_test_1 values(default, default, default, default, default)` tk.MustExec("begin") _, err = tk.Exec(errInsertSelectSQL) - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("rollback") // Updating column is PK handle. @@ -127,22 +126,22 @@ func (s *testSuite) TestInsert(c *C) { r.Check(testkit.Rows(rowStr)) insertSQL := `insert into insert_test (id, c3) values (1, 2) on duplicate key update id=values(id), c2=10;` tk.MustExec(insertSQL) - tk.CheckLastMessage("") + require.Empty(t, tk.Session().LastMessage()) r = tk.MustQuery("select * from insert_test where id = 1;") rowStr = fmt.Sprintf("%v %v %v %v", "1", "1", "10", "1") r.Check(testkit.Rows(rowStr)) insertSQL = `insert into insert_test (id, c2) values (1, 1) on duplicate key update insert_test.c2=10;` tk.MustExec(insertSQL) - tk.CheckLastMessage("") + require.Empty(t, tk.Session().LastMessage()) _, err = tk.Exec(`insert into insert_test (id, c2) values(1, 1) on duplicate key update t.c2 = 10`) - c.Assert(err, NotNil) + require.Error(t, err) // for on duplicate key insertSQL = `INSERT INTO insert_test (id, c3) VALUES (1, 2) ON DUPLICATE KEY UPDATE c3=values(c3)+c3+3;` tk.MustExec(insertSQL) - tk.CheckLastMessage("") + require.Empty(t, tk.Session().LastMessage()) r = tk.MustQuery("select * from insert_test where id = 1;") rowStr = fmt.Sprintf("%v %v %v %v", "1", "1", "10", "6") r.Check(testkit.Rows(rowStr)) @@ -150,21 +149,21 @@ func (s *testSuite) TestInsert(c *C) { // for on duplicate key with ignore insertSQL = `INSERT IGNORE INTO insert_test (id, c3) VALUES (1, 2) ON DUPLICATE KEY UPDATE c3=values(c3)+c3+3;` tk.MustExec(insertSQL) - tk.CheckLastMessage("") + require.Empty(t, tk.Session().LastMessage()) r = tk.MustQuery("select * from insert_test where id = 1;") rowStr = fmt.Sprintf("%v %v %v %v", "1", "1", "10", "11") r.Check(testkit.Rows(rowStr)) tk.MustExec("create table insert_err (id int, c1 varchar(8))") _, err = tk.Exec("insert insert_err values (1, 'abcdabcdabcd')") - c.Assert(types.ErrDataTooLong.Equal(err), IsTrue) + require.True(t, types.ErrDataTooLong.Equal(err)) _, err = tk.Exec("insert insert_err values (1, '你好,世界')") - c.Assert(err, IsNil) + require.NoError(t, err) tk.MustExec("create table TEST1 (ID INT NOT NULL, VALUE INT DEFAULT NULL, PRIMARY KEY (ID))") _, err = tk.Exec("INSERT INTO TEST1(id,value) VALUE(3,3) on DUPLICATE KEY UPDATE VALUE=4") - c.Assert(err, IsNil) - tk.CheckLastMessage("") + require.NoError(t, err) + require.Empty(t, tk.Session().LastMessage()) tk.MustExec("create table t (id int)") tk.MustExec("insert into t values(1)") @@ -176,21 +175,21 @@ func (s *testSuite) TestInsert(c *C) { tk.MustExec("drop table if exists t") tk.MustExec("create table t(c decimal(5, 5))") _, err = tk.Exec("insert into t value(0)") - c.Assert(err, IsNil) + require.NoError(t, err) _, err = tk.Exec("insert into t value(1)") - c.Assert(types.ErrWarnDataOutOfRange.Equal(err), IsTrue) + require.True(t, types.ErrWarnDataOutOfRange.Equal(err)) tk.MustExec("drop table if exists t") tk.MustExec("create table t(c binary(255))") _, err = tk.Exec("insert into t value(1)") - c.Assert(err, IsNil) + require.NoError(t, err) r = tk.MustQuery("select length(c) from t;") r.Check(testkit.Rows("255")) tk.MustExec("drop table if exists t") tk.MustExec("create table t(c varbinary(255))") _, err = tk.Exec("insert into t value(1)") - c.Assert(err, IsNil) + require.NoError(t, err) r = tk.MustQuery("select length(c) from t;") r.Check(testkit.Rows("1")) @@ -200,7 +199,7 @@ func (s *testSuite) TestInsert(c *C) { tk.MustExec("set @origin_time_zone = @@time_zone") tk.MustExec("set @@time_zone = '+08:00'") _, err = tk.Exec("insert into t value(Unix_timestamp('2002-10-27 01:00'))") - c.Assert(err, IsNil) + require.NoError(t, err) r = tk.MustQuery("select * from t;") r.Check(testkit.Rows("1035651600")) tk.MustExec("set @@time_zone = @origin_time_zone") @@ -208,10 +207,9 @@ func (s *testSuite) TestInsert(c *C) { // issue 3832 tk.MustExec("create table t1 (b char(0));") _, err = tk.Exec(`insert into t1 values ("");`) - c.Assert(err, IsNil) + require.NoError(t, err) // issue 3895 - tk = testkit.NewTestKit(c, s.store) tk.MustExec("USE test;") tk.MustExec("DROP TABLE IF EXISTS t;") tk.MustExec("CREATE TABLE t(a DECIMAL(4,2));") @@ -226,7 +224,7 @@ func (s *testSuite) TestInsert(c *C) { tk.MustExec("DROP TABLE IF EXISTS t;") tk.MustExec("CREATE TABLE t(a datetime);") _, err = tk.Exec("INSERT INTO t VALUES('2017-00-00')") - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("set sql_mode = ''") tk.MustExec("INSERT INTO t VALUES('2017-00-00')") r = tk.MustQuery("SELECT * FROM t;") @@ -251,7 +249,7 @@ func (s *testSuite) TestInsert(c *C) { tk.MustExec("create table t(a bigint unsigned);") tk.MustExec(" set @orig_sql_mode = @@sql_mode; set @@sql_mode = 'strict_all_tables';") _, err = tk.Exec("insert into t value (-1);") - c.Assert(types.ErrWarnDataOutOfRange.Equal(err), IsTrue) + require.True(t, types.ErrWarnDataOutOfRange.Equal(err)) tk.MustExec("set @@sql_mode = '';") tk.MustExec("insert into t value (-1);") // TODO: the following warning messages are not consistent with MySQL, fix them in the future PRs @@ -278,7 +276,7 @@ func (s *testSuite) TestInsert(c *C) { tk.MustExec("insert into t value(20070219173709.055870), (20070219173709.055), (20070219173709.055870123)") tk.MustQuery("select * from t").Check(testkit.Rows("17:37:09.055870", "17:37:09.055000", "17:37:09.055870")) _, err = tk.Exec("insert into t value(-20070219173709.055870)") - c.Assert(err.Error(), Equals, "[table:1292]Incorrect time value: '-20070219173709.055870' for column 'a' at row 1") + require.EqualError(t, err, "[table:1292]Incorrect time value: '-20070219173709.055870' for column 'a' at row 1") tk.MustExec("drop table if exists t") tk.MustExec("set @@sql_mode=''") @@ -306,16 +304,16 @@ func (s *testSuite) TestInsert(c *C) { tk.MustExec("create view v as select * from t") _, err = tk.Exec("insert into v values(1,2)") - c.Assert(err.Error(), Equals, "insert into view v is not supported now.") + require.EqualError(t, err, "insert into view v is not supported now.") _, err = tk.Exec("replace into v values(1,2)") - c.Assert(err.Error(), Equals, "replace into view v is not supported now.") + require.EqualError(t, err, "replace into view v is not supported now.") tk.MustExec("drop view v") tk.MustExec("create sequence seq") _, err = tk.Exec("insert into seq values()") - c.Assert(err.Error(), Equals, "insert into sequence seq is not supported now.") + require.EqualError(t, err, "insert into sequence seq is not supported now.") _, err = tk.Exec("replace into seq values()") - c.Assert(err.Error(), Equals, "replace into sequence seq is not supported now.") + require.EqualError(t, err, "replace into sequence seq is not supported now.") tk.MustExec("drop sequence seq") // issue 22851 @@ -323,14 +321,16 @@ func (s *testSuite) TestInsert(c *C) { tk.MustExec("create table t(name varchar(255), b int, c int, primary key(name(2)))") tk.MustExec("insert into t(name, b) values(\"cha\", 3)") _, err = tk.Exec("insert into t(name, b) values(\"chb\", 3)") - c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry 'ch' for key 'PRIMARY'") + require.EqualError(t, err, "[kv:1062]Duplicate entry 'ch' for key 'PRIMARY'") tk.MustExec("insert into t(name, b) values(\"测试\", 3)") _, err = tk.Exec("insert into t(name, b) values(\"测试\", 3)") - c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '测试' for key 'PRIMARY'") + require.EqualError(t, err, "[kv:1062]Duplicate entry '测试' for key 'PRIMARY'") } -func (s *testSuiteP2) TestMultiBatch(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestMultiBatch(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t,t0") tk.MustExec("create table t0 (i int)") @@ -341,8 +341,10 @@ func (s *testSuiteP2) TestMultiBatch(c *C) { tk.MustExec("admin check table t") } -func (s *testSuite4) TestInsertAutoInc(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestInsertAutoInc(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") createSQL := `drop table if exists insert_autoinc_test; create table insert_autoinc_test (id int primary key auto_increment, c1 int);` tk.MustExec(createSQL) @@ -450,7 +452,7 @@ func (s *testSuite4) TestInsertAutoInc(c *C) { insertSQL = `insert into insert_autoinc_test(id, c1) values (0, 5)` _, err := tk.Exec(insertSQL) // ERROR 1062 (23000): Duplicate entry '0' for key 'PRIMARY' - c.Assert(err, NotNil) + require.Error(t, err) insertSQL = `insert into insert_autoinc_test(c1) values (6)` tk.MustExec(insertSQL) r = tk.MustQuery("select * from insert_autoinc_test;") @@ -474,36 +476,38 @@ func (s *testSuite4) TestInsertAutoInc(c *C) { r.Check(testkit.Rows(rowStr4, rowStr1, rowStr2, rowStr3, rowStr5, rowStr6, rowStr7, rowStr8)) } -func (s *testSuite4) TestInsertIgnore(c *C) { +func TestInsertIgnore(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() var cfg kv.InjectionConfig - tk := testkit.NewTestKit(c, kv.NewInjectedStore(s.store, &cfg)) + tk := testkit.NewTestKit(t, kv.NewInjectedStore(store, &cfg)) tk.MustExec("use test") testSQL := `drop table if exists t; create table t (id int PRIMARY KEY AUTO_INCREMENT, c1 int unique key);` tk.MustExec(testSQL) testSQL = `insert into t values (1, 2);` tk.MustExec(testSQL) - tk.CheckLastMessage("") + require.Empty(t, tk.Session().LastMessage()) r := tk.MustQuery("select * from t;") rowStr := fmt.Sprintf("%v %v", "1", "2") r.Check(testkit.Rows(rowStr)) tk.MustExec("insert ignore into t values (1, 3), (2, 3)") - tk.CheckLastMessage("Records: 2 Duplicates: 1 Warnings: 1") + require.Equal(t, tk.Session().LastMessage(), "Records: 2 Duplicates: 1 Warnings: 1") r = tk.MustQuery("select * from t;") rowStr1 := fmt.Sprintf("%v %v", "2", "3") r.Check(testkit.Rows(rowStr, rowStr1)) tk.MustExec("insert ignore into t values (3, 4), (3, 4)") - tk.CheckLastMessage("Records: 2 Duplicates: 1 Warnings: 1") + require.Equal(t, tk.Session().LastMessage(), "Records: 2 Duplicates: 1 Warnings: 1") r = tk.MustQuery("select * from t;") rowStr2 := fmt.Sprintf("%v %v", "3", "4") r.Check(testkit.Rows(rowStr, rowStr1, rowStr2)) tk.MustExec("begin") tk.MustExec("insert ignore into t values (4, 4), (4, 5), (4, 6)") - tk.CheckLastMessage("Records: 3 Duplicates: 2 Warnings: 2") + require.Equal(t, tk.Session().LastMessage(), "Records: 3 Duplicates: 2 Warnings: 2") r = tk.MustQuery("select * from t;") rowStr3 := fmt.Sprintf("%v %v", "4", "5") r.Check(testkit.Rows(rowStr, rowStr1, rowStr2, rowStr3)) @@ -511,7 +515,7 @@ func (s *testSuite4) TestInsertIgnore(c *C) { cfg.SetGetError(errors.New("foo")) _, err := tk.Exec("insert ignore into t values (1, 3)") - c.Assert(err, NotNil) + require.Error(t, err) cfg.SetGetError(nil) // for issue 4268 @@ -520,14 +524,14 @@ func (s *testSuite4) TestInsertIgnore(c *C) { tk.MustExec(testSQL) testSQL = "insert ignore into t select '1a';" _, err = tk.Exec(testSQL) - c.Assert(err, IsNil) - tk.CheckLastMessage("Records: 1 Duplicates: 0 Warnings: 1") + require.NoError(t, err) + require.Equal(t, tk.Session().LastMessage(), "Records: 1 Duplicates: 0 Warnings: 1") r = tk.MustQuery("SHOW WARNINGS") r.Check(testkit.Rows("Warning 1292 Truncated incorrect DOUBLE value: '1a'")) testSQL = "insert ignore into t values ('1a')" _, err = tk.Exec(testSQL) - c.Assert(err, IsNil) - tk.CheckLastMessage("") + require.NoError(t, err) + require.Empty(t, tk.Session().LastMessage()) r = tk.MustQuery("SHOW WARNINGS") r.Check(testkit.Rows("Warning 1292 Truncated incorrect DOUBLE value: '1a'")) @@ -537,10 +541,10 @@ func (s *testSuite4) TestInsertIgnore(c *C) { tk.MustExec(testSQL) testSQL = "insert ignore into t values (1,1);" tk.MustExec(testSQL) - tk.CheckLastMessage("") + require.Empty(t, tk.Session().LastMessage()) _, err = tk.Exec(testSQL) - tk.CheckLastMessage("") - c.Assert(err, IsNil) + require.Empty(t, tk.Session().LastMessage()) + require.NoError(t, err) r = tk.MustQuery("SHOW WARNINGS") r.Check(testkit.Rows("Warning 1062 Duplicate entry '1' for key 'PRIMARY'")) @@ -582,7 +586,7 @@ commit;` tk.MustExec(testSQL) testSQL = `insert ignore into badnull values (null)` tk.MustExec(testSQL) - tk.CheckLastMessage("") + require.Empty(t, tk.Session().LastMessage()) tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1048 Column 'i' cannot be null")) testSQL = `select * from badnull` tk.MustQuery(testSQL).Check(testkit.Rows("0")) @@ -592,16 +596,18 @@ commit;` tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1526 Table has no partition for value 3")) } -func (s *testSuite8) TestInsertOnDup(c *C) { +func TestInsertOnDup(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() var cfg kv.InjectionConfig - tk := testkit.NewTestKit(c, kv.NewInjectedStore(s.store, &cfg)) + tk := testkit.NewTestKit(t, kv.NewInjectedStore(store, &cfg)) tk.MustExec("use test") testSQL := `drop table if exists t; create table t (i int unique key);` tk.MustExec(testSQL) testSQL = `insert into t values (1),(2);` tk.MustExec(testSQL) - tk.CheckLastMessage("Records: 2 Duplicates: 0 Warnings: 0") + require.Equal(t, tk.Session().LastMessage(), "Records: 2 Duplicates: 0 Warnings: 0") r := tk.MustQuery("select * from t;") rowStr1 := fmt.Sprintf("%v", "1") @@ -609,12 +615,12 @@ func (s *testSuite8) TestInsertOnDup(c *C) { r.Check(testkit.Rows(rowStr1, rowStr2)) tk.MustExec("insert into t values (1), (2) on duplicate key update i = values(i)") - tk.CheckLastMessage("Records: 2 Duplicates: 0 Warnings: 0") + require.Equal(t, tk.Session().LastMessage(), "Records: 2 Duplicates: 0 Warnings: 0") r = tk.MustQuery("select * from t;") r.Check(testkit.Rows(rowStr1, rowStr2)) tk.MustExec("insert into t values (2), (3) on duplicate key update i = 3") - tk.CheckLastMessage("Records: 2 Duplicates: 1 Warnings: 0") + require.Equal(t, tk.Session().LastMessage(), "Records: 2 Duplicates: 1 Warnings: 0") r = tk.MustQuery("select * from t;") rowStr3 := fmt.Sprintf("%v", "3") r.Check(testkit.Rows(rowStr1, rowStr3)) @@ -624,14 +630,14 @@ func (s *testSuite8) TestInsertOnDup(c *C) { tk.MustExec(testSQL) testSQL = `insert into t values (-1, 1);` tk.MustExec(testSQL) - tk.CheckLastMessage("") + require.Empty(t, tk.Session().LastMessage()) r = tk.MustQuery("select * from t;") rowStr1 = fmt.Sprintf("%v %v", "-1", "1") r.Check(testkit.Rows(rowStr1)) tk.MustExec("insert into t values (1, 1) on duplicate key update j = values(j)") - tk.CheckLastMessage("") + require.Empty(t, tk.Session().LastMessage()) r = tk.MustQuery("select * from t;") r.Check(testkit.Rows(rowStr1)) @@ -696,13 +702,13 @@ commit;` f2 VARCHAR(5) NOT NULL UNIQUE); INSERT t1 (f2) VALUES ('test') ON DUPLICATE KEY UPDATE f1 = LAST_INSERT_ID(f1);` tk.MustExec(testSQL) - tk.CheckLastMessage("") + require.Empty(t, tk.Session().LastMessage()) testSQL = `SELECT LAST_INSERT_ID();` r = tk.MustQuery(testSQL) r.Check(testkit.Rows("1")) testSQL = `INSERT t1 (f2) VALUES ('test') ON DUPLICATE KEY UPDATE f1 = LAST_INSERT_ID(f1);` tk.MustExec(testSQL) - tk.CheckLastMessage("") + require.Empty(t, tk.Session().LastMessage()) testSQL = `SELECT LAST_INSERT_ID();` r = tk.MustQuery(testSQL) r.Check(testkit.Rows("1")) @@ -712,19 +718,19 @@ commit;` f2 VARCHAR(5) NOT NULL UNIQUE); INSERT t1 (f2) VALUES ('test') ON DUPLICATE KEY UPDATE f1 = LAST_INSERT_ID(f1);` tk.MustExec(testSQL) - tk.CheckLastMessage("") + require.Empty(t, tk.Session().LastMessage()) testSQL = `SELECT LAST_INSERT_ID();` r = tk.MustQuery(testSQL) r.Check(testkit.Rows("1")) testSQL = `INSERT t1 (f2) VALUES ('test') ON DUPLICATE KEY UPDATE f1 = LAST_INSERT_ID(f1);` tk.MustExec(testSQL) - tk.CheckLastMessage("") + require.Empty(t, tk.Session().LastMessage()) testSQL = `SELECT LAST_INSERT_ID();` r = tk.MustQuery(testSQL) r.Check(testkit.Rows("1")) testSQL = `INSERT t1 (f2) VALUES ('test') ON DUPLICATE KEY UPDATE f1 = 2;` tk.MustExec(testSQL) - tk.CheckLastMessage("") + require.Empty(t, tk.Session().LastMessage()) testSQL = `SELECT LAST_INSERT_ID();` r = tk.MustQuery(testSQL) r.Check(testkit.Rows("1")) @@ -733,21 +739,21 @@ commit;` CREATE TABLE t1 (f1 INT); INSERT t1 VALUES (1) ON DUPLICATE KEY UPDATE f1 = 1;` tk.MustExec(testSQL) - tk.CheckLastMessage("") + require.Empty(t, tk.Session().LastMessage()) tk.MustQuery(`SELECT * FROM t1;`).Check(testkit.Rows("1")) testSQL = `DROP TABLE IF EXISTS t1; CREATE TABLE t1 (f1 INT PRIMARY KEY, f2 INT NOT NULL UNIQUE); INSERT t1 VALUES (1, 1);` tk.MustExec(testSQL) - tk.CheckLastMessage("") + require.Empty(t, tk.Session().LastMessage()) tk.MustExec(`INSERT t1 VALUES (1, 1), (1, 1) ON DUPLICATE KEY UPDATE f1 = 2, f2 = 2;`) - tk.CheckLastMessage("Records: 2 Duplicates: 1 Warnings: 0") + require.Equal(t, tk.Session().LastMessage(), "Records: 2 Duplicates: 1 Warnings: 0") tk.MustQuery(`SELECT * FROM t1 order by f1;`).Check(testkit.Rows("1 1", "2 2")) _, err := tk.Exec(`INSERT t1 VALUES (1, 1) ON DUPLICATE KEY UPDATE f2 = null;`) - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec(`INSERT IGNORE t1 VALUES (1, 1) ON DUPLICATE KEY UPDATE f2 = null;`) - tk.CheckLastMessage("") + require.Empty(t, tk.Session().LastMessage()) tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1048 Column 'f2' cannot be null")) tk.MustQuery(`SELECT * FROM t1 order by f1;`).Check(testkit.Rows("1 0", "2 2")) @@ -757,24 +763,26 @@ commit;` tk.MustQuery(`SELECT * FROM t1 order by f1;`).Check(testkit.Rows("1 0", "2 2")) } -func (s *testSuite4) TestInsertIgnoreOnDup(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestInsertIgnoreOnDup(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") testSQL := `drop table if exists t; create table t (i int not null primary key, j int unique key);` tk.MustExec(testSQL) testSQL = `insert into t values (1, 1), (2, 2);` tk.MustExec(testSQL) - tk.CheckLastMessage("Records: 2 Duplicates: 0 Warnings: 0") + require.Equal(t, tk.Session().LastMessage(), "Records: 2 Duplicates: 0 Warnings: 0") testSQL = `insert ignore into t values(1, 1) on duplicate key update i = 2;` tk.MustExec(testSQL) - tk.CheckLastMessage("") + require.Empty(t, tk.Session().LastMessage()) testSQL = `select * from t;` r := tk.MustQuery(testSQL) r.Check(testkit.Rows("1 1", "2 2")) testSQL = `insert ignore into t values(1, 1) on duplicate key update j = 2;` tk.MustExec(testSQL) - tk.CheckLastMessage("") + require.Empty(t, tk.Session().LastMessage()) testSQL = `select * from t;` r = tk.MustQuery(testSQL) r.Check(testkit.Rows("1 1", "2 2")) @@ -809,8 +817,10 @@ func (s *testSuite4) TestInsertIgnoreOnDup(c *C) { tk.MustQuery("select * from t6").Check(testkit.Rows("100 10 1000")) } -func (s *testSuite4) TestInsertSetWithDefault(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestInsertSetWithDefault(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") // Assign `DEFAULT` in `INSERT ... SET ...` statement tk.MustExec("drop table if exists t1, t2;") @@ -856,8 +866,10 @@ func (s *testSuite4) TestInsertSetWithDefault(c *C) { tk.MustExec("drop table t1, t2") } -func (s *testSuite4) TestInsertOnDupUpdateDefault(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestInsertOnDupUpdateDefault(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") // Assign `DEFAULT` in `INSERT ... ON DUPLICATE KEY UPDATE ...` statement tk.MustExec("drop table if exists t1, t2;") @@ -895,78 +907,80 @@ func (s *testSuite4) TestInsertOnDupUpdateDefault(c *C) { tk.MustExec("insert into t values (22, 'gold witch'), (24, 'gray singer'), (21, 'silver sight');") tk.MustExec("begin;") err := tk.ExecToErr("insert into t values (21,'black warlock'), (22, 'dark sloth'), (21, 'cyan song') on duplicate key update c_int = c_int + 1, c_string = concat(c_int, ':', c_string);") - c.Assert(kv.ErrKeyExists.Equal(err), IsTrue) + require.True(t, kv.ErrKeyExists.Equal(err)) tk.MustExec("commit;") tk.MustQuery("select * from t order by c_int;").Check(testutil.RowsWithSep("|", "21|silver sight", "22|gold witch", "24|gray singer")) tk.MustExec("drop table t;") } -func (s *testSuite4) TestReplace(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestReplace(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") testSQL := `drop table if exists replace_test; create table replace_test (id int PRIMARY KEY AUTO_INCREMENT, c1 int, c2 int, c3 int default 1);` tk.MustExec(testSQL) testSQL = `replace replace_test (c1) values (1),(2),(NULL);` tk.MustExec(testSQL) - tk.CheckLastMessage("Records: 3 Duplicates: 0 Warnings: 0") + require.Equal(t, tk.Session().LastMessage(), "Records: 3 Duplicates: 0 Warnings: 0") errReplaceSQL := `replace replace_test (c1) values ();` tk.MustExec("begin") _, err := tk.Exec(errReplaceSQL) - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("rollback") errReplaceSQL = `replace replace_test (c1, c2) values (1,2),(1);` tk.MustExec("begin") _, err = tk.Exec(errReplaceSQL) - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("rollback") errReplaceSQL = `replace replace_test (xxx) values (3);` tk.MustExec("begin") _, err = tk.Exec(errReplaceSQL) - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("rollback") errReplaceSQL = `replace replace_test_xxx (c1) values ();` tk.MustExec("begin") _, err = tk.Exec(errReplaceSQL) - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("rollback") replaceSetSQL := `replace replace_test set c1 = 3;` tk.MustExec(replaceSetSQL) - tk.CheckLastMessage("") + require.Empty(t, tk.Session().LastMessage()) errReplaceSetSQL := `replace replace_test set c1 = 4, c1 = 5;` tk.MustExec("begin") _, err = tk.Exec(errReplaceSetSQL) - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("rollback") errReplaceSetSQL = `replace replace_test set xxx = 6;` tk.MustExec("begin") _, err = tk.Exec(errReplaceSetSQL) - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("rollback") replaceSelectSQL := `create table replace_test_1 (id int, c1 int);` tk.MustExec(replaceSelectSQL) replaceSelectSQL = `replace replace_test_1 select id, c1 from replace_test;` tk.MustExec(replaceSelectSQL) - tk.CheckLastMessage("Records: 4 Duplicates: 0 Warnings: 0") + require.Equal(t, tk.Session().LastMessage(), "Records: 4 Duplicates: 0 Warnings: 0") replaceSelectSQL = `create table replace_test_2 (id int, c1 int);` tk.MustExec(replaceSelectSQL) replaceSelectSQL = `replace replace_test_1 select id, c1 from replace_test union select id * 10, c1 * 10 from replace_test;` tk.MustExec(replaceSelectSQL) - tk.CheckLastMessage("Records: 8 Duplicates: 0 Warnings: 0") + require.Equal(t, tk.Session().LastMessage(), "Records: 8 Duplicates: 0 Warnings: 0") errReplaceSelectSQL := `replace replace_test_1 select c1 from replace_test;` tk.MustExec("begin") _, err = tk.Exec(errReplaceSelectSQL) - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("rollback") replaceUniqueIndexSQL := `create table replace_test_3 (c1 int, c2 int, UNIQUE INDEX (c2));` @@ -975,20 +989,20 @@ func (s *testSuite4) TestReplace(c *C) { tk.MustExec(replaceUniqueIndexSQL) replaceUniqueIndexSQL = `replace into replace_test_3 set c2=1;` tk.MustExec(replaceUniqueIndexSQL) - c.Assert(int64(tk.Se.AffectedRows()), Equals, int64(1)) - tk.CheckLastMessage("") + require.Equal(t, int64(1), int64(tk.Session().AffectedRows())) + require.Empty(t, tk.Session().LastMessage()) replaceUniqueIndexSQL = `replace into replace_test_3 set c1=1, c2=1;` tk.MustExec(replaceUniqueIndexSQL) - c.Assert(int64(tk.Se.AffectedRows()), Equals, int64(2)) - tk.CheckLastMessage("") + require.Equal(t, int64(2), int64(tk.Session().AffectedRows())) + require.Empty(t, tk.Session().LastMessage()) replaceUniqueIndexSQL = `replace into replace_test_3 set c2=NULL;` tk.MustExec(replaceUniqueIndexSQL) replaceUniqueIndexSQL = `replace into replace_test_3 set c2=NULL;` tk.MustExec(replaceUniqueIndexSQL) - c.Assert(int64(tk.Se.AffectedRows()), Equals, int64(1)) - tk.CheckLastMessage("") + require.Equal(t, int64(1), int64(tk.Session().AffectedRows())) + require.Empty(t, tk.Session().LastMessage()) replaceUniqueIndexSQL = `create table replace_test_4 (c1 int, c2 int, c3 int, UNIQUE INDEX (c1, c2));` tk.MustExec(replaceUniqueIndexSQL) @@ -996,8 +1010,8 @@ func (s *testSuite4) TestReplace(c *C) { tk.MustExec(replaceUniqueIndexSQL) replaceUniqueIndexSQL = `replace into replace_test_4 set c2=NULL;` tk.MustExec(replaceUniqueIndexSQL) - c.Assert(int64(tk.Se.AffectedRows()), Equals, int64(1)) - tk.CheckLastMessage("") + require.Equal(t, int64(1), int64(tk.Session().AffectedRows())) + require.Empty(t, tk.Session().LastMessage()) replacePrimaryKeySQL := `create table replace_test_5 (c1 int, c2 int, c3 int, PRIMARY KEY (c1, c2));` tk.MustExec(replacePrimaryKeySQL) @@ -1005,18 +1019,18 @@ func (s *testSuite4) TestReplace(c *C) { tk.MustExec(replacePrimaryKeySQL) replacePrimaryKeySQL = `replace into replace_test_5 set c1=1, c2=2;` tk.MustExec(replacePrimaryKeySQL) - c.Assert(int64(tk.Se.AffectedRows()), Equals, int64(1)) - tk.CheckLastMessage("") + require.Equal(t, int64(1), int64(tk.Session().AffectedRows())) + require.Empty(t, tk.Session().LastMessage()) // For Issue989 issue989SQL := `CREATE TABLE tIssue989 (a int, b int, PRIMARY KEY(a), UNIQUE KEY(b));` tk.MustExec(issue989SQL) issue989SQL = `insert into tIssue989 (a, b) values (1, 2);` tk.MustExec(issue989SQL) - tk.CheckLastMessage("") + require.Empty(t, tk.Session().LastMessage()) issue989SQL = `replace into tIssue989(a, b) values (111, 2);` tk.MustExec(issue989SQL) - tk.CheckLastMessage("") + require.Empty(t, tk.Session().LastMessage()) r := tk.MustQuery("select * from tIssue989;") r.Check(testkit.Rows("111 2")) @@ -1029,8 +1043,8 @@ func (s *testSuite4) TestReplace(c *C) { tk.MustExec(issue1012SQL) issue1012SQL = `replace into tIssue1012(a, b) values (1, 1);` tk.MustExec(issue1012SQL) - c.Assert(int64(tk.Se.AffectedRows()), Equals, int64(3)) - tk.CheckLastMessage("") + require.Equal(t, int64(3), int64(tk.Session().AffectedRows())) + require.Empty(t, tk.Session().LastMessage()) r = tk.MustQuery("select * from tIssue1012;") r.Check(testkit.Rows("1 1")) @@ -1039,17 +1053,17 @@ func (s *testSuite4) TestReplace(c *C) { tk.MustExec(`create table t1(a int primary key, b int);`) tk.MustExec(`insert into t1 values(1,1),(2,2),(3,3),(4,4),(5,5);`) tk.MustExec(`replace into t1 values(1,1);`) - c.Assert(int64(tk.Se.AffectedRows()), Equals, int64(1)) - tk.CheckLastMessage("") + require.Equal(t, int64(1), int64(tk.Session().AffectedRows())) + require.Empty(t, tk.Session().LastMessage()) tk.MustExec(`replace into t1 values(1,1),(2,2);`) - c.Assert(int64(tk.Se.AffectedRows()), Equals, int64(2)) - tk.CheckLastMessage("Records: 2 Duplicates: 0 Warnings: 0") + require.Equal(t, int64(2), int64(tk.Session().AffectedRows())) + require.Equal(t, tk.Session().LastMessage(), "Records: 2 Duplicates: 0 Warnings: 0") tk.MustExec(`replace into t1 values(4,14),(5,15),(6,16),(7,17),(8,18)`) - c.Assert(int64(tk.Se.AffectedRows()), Equals, int64(7)) - tk.CheckLastMessage("Records: 5 Duplicates: 2 Warnings: 0") + require.Equal(t, int64(7), int64(tk.Session().AffectedRows())) + require.Equal(t, tk.Session().LastMessage(), "Records: 5 Duplicates: 2 Warnings: 0") tk.MustExec(`replace into t1 select * from (select 1, 2) as tmp;`) - c.Assert(int64(tk.Se.AffectedRows()), Equals, int64(2)) - tk.CheckLastMessage("Records: 1 Duplicates: 1 Warnings: 0") + require.Equal(t, int64(2), int64(tk.Session().AffectedRows())) + require.Equal(t, tk.Session().LastMessage(), "Records: 1 Duplicates: 1 Warnings: 0") // Assign `DEFAULT` in `REPLACE` statement tk.MustExec("drop table if exists t1, t2;") @@ -1082,8 +1096,10 @@ func (s *testSuite4) TestReplace(c *C) { tk.MustExec("drop table t1, t2") } -func (s *testSuite2) TestGeneratedColumnForInsert(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestGeneratedColumnForInsert(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") // test cases for default behavior @@ -1131,8 +1147,10 @@ func (s *testSuite2) TestGeneratedColumnForInsert(c *C) { tk.MustQuery(`select * from t1`).Check(testkit.Rows("1000 9.9")) } -func (s *testSuite4) TestPartitionedTableReplace(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestPartitionedTableReplace(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") testSQL := `drop table if exists replace_test; create table replace_test (id int PRIMARY KEY AUTO_INCREMENT, c1 int, c2 int, c3 int default 1) @@ -1144,46 +1162,46 @@ func (s *testSuite4) TestPartitionedTableReplace(c *C) { tk.MustExec(testSQL) testSQL = `replace replace_test (c1) values (1),(2),(NULL);` tk.MustExec(testSQL) - tk.CheckLastMessage("Records: 3 Duplicates: 0 Warnings: 0") + require.Equal(t, tk.Session().LastMessage(), "Records: 3 Duplicates: 0 Warnings: 0") errReplaceSQL := `replace replace_test (c1) values ();` tk.MustExec("begin") _, err := tk.Exec(errReplaceSQL) - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("rollback") errReplaceSQL = `replace replace_test (c1, c2) values (1,2),(1);` tk.MustExec("begin") _, err = tk.Exec(errReplaceSQL) - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("rollback") errReplaceSQL = `replace replace_test (xxx) values (3);` tk.MustExec("begin") _, err = tk.Exec(errReplaceSQL) - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("rollback") errReplaceSQL = `replace replace_test_xxx (c1) values ();` tk.MustExec("begin") _, err = tk.Exec(errReplaceSQL) - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("rollback") replaceSetSQL := `replace replace_test set c1 = 3;` tk.MustExec(replaceSetSQL) - tk.CheckLastMessage("") + require.Empty(t, tk.Session().LastMessage()) errReplaceSetSQL := `replace replace_test set c1 = 4, c1 = 5;` tk.MustExec("begin") _, err = tk.Exec(errReplaceSetSQL) - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("rollback") errReplaceSetSQL = `replace replace_test set xxx = 6;` tk.MustExec("begin") _, err = tk.Exec(errReplaceSetSQL) - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("rollback") tk.MustExec(`drop table if exists replace_test_1`) @@ -1194,7 +1212,7 @@ func (s *testSuite4) TestPartitionedTableReplace(c *C) { PARTITION p3 VALUES LESS THAN (10), PARTITION p4 VALUES LESS THAN (100))`) tk.MustExec(`replace replace_test_1 select id, c1 from replace_test;`) - tk.CheckLastMessage("Records: 4 Duplicates: 0 Warnings: 0") + require.Equal(t, tk.Session().LastMessage(), "Records: 4 Duplicates: 0 Warnings: 0") tk.MustExec(`drop table if exists replace_test_2`) tk.MustExec(`create table replace_test_2 (id int, c1 int) partition by range (id) ( @@ -1203,12 +1221,12 @@ func (s *testSuite4) TestPartitionedTableReplace(c *C) { PARTITION p2 VALUES LESS THAN (100), PARTITION p3 VALUES LESS THAN (300))`) tk.MustExec(`replace replace_test_1 select id, c1 from replace_test union select id * 10, c1 * 10 from replace_test;`) - tk.CheckLastMessage("Records: 8 Duplicates: 0 Warnings: 0") + require.Equal(t, tk.Session().LastMessage(), "Records: 8 Duplicates: 0 Warnings: 0") errReplaceSelectSQL := `replace replace_test_1 select c1 from replace_test;` tk.MustExec("begin") _, err = tk.Exec(errReplaceSelectSQL) - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("rollback") tk.MustExec(`drop table if exists replace_test_3`) @@ -1221,19 +1239,19 @@ func (s *testSuite4) TestPartitionedTableReplace(c *C) { tk.MustExec(replaceUniqueIndexSQL) replaceUniqueIndexSQL = `replace into replace_test_3 set c2=8;` tk.MustExec(replaceUniqueIndexSQL) - c.Assert(int64(tk.Se.AffectedRows()), Equals, int64(1)) - tk.CheckLastMessage("") + require.Equal(t, int64(1), int64(tk.Session().AffectedRows())) + require.Empty(t, tk.Session().LastMessage()) replaceUniqueIndexSQL = `replace into replace_test_3 set c1=8, c2=8;` tk.MustExec(replaceUniqueIndexSQL) - c.Assert(int64(tk.Se.AffectedRows()), Equals, int64(2)) - tk.CheckLastMessage("") + require.Equal(t, int64(2), int64(tk.Session().AffectedRows())) + require.Empty(t, tk.Session().LastMessage()) replaceUniqueIndexSQL = `replace into replace_test_3 set c2=NULL;` tk.MustExec(replaceUniqueIndexSQL) replaceUniqueIndexSQL = `replace into replace_test_3 set c2=NULL;` tk.MustExec(replaceUniqueIndexSQL) - c.Assert(int64(tk.Se.AffectedRows()), Equals, int64(1)) - tk.CheckLastMessage("") + require.Equal(t, int64(1), int64(tk.Session().AffectedRows())) + require.Empty(t, tk.Session().LastMessage()) replaceUniqueIndexSQL = `create table replace_test_4 (c1 int, c2 int, c3 int, UNIQUE INDEX (c1, c2)) partition by range (c1) ( PARTITION p0 VALUES LESS THAN (4), @@ -1245,7 +1263,7 @@ func (s *testSuite4) TestPartitionedTableReplace(c *C) { tk.MustExec(replaceUniqueIndexSQL) replaceUniqueIndexSQL = `replace into replace_test_4 set c2=NULL;` tk.MustExec(replaceUniqueIndexSQL) - c.Assert(int64(tk.Se.AffectedRows()), Equals, int64(1)) + require.Equal(t, int64(1), int64(tk.Session().AffectedRows())) replacePrimaryKeySQL := `create table replace_test_5 (c1 int, c2 int, c3 int, PRIMARY KEY (c1, c2)) partition by range (c2) ( PARTITION p0 VALUES LESS THAN (4), @@ -1256,7 +1274,7 @@ func (s *testSuite4) TestPartitionedTableReplace(c *C) { tk.MustExec(replacePrimaryKeySQL) replacePrimaryKeySQL = `replace into replace_test_5 set c1=1, c2=2;` tk.MustExec(replacePrimaryKeySQL) - c.Assert(int64(tk.Se.AffectedRows()), Equals, int64(1)) + require.Equal(t, int64(1), int64(tk.Session().AffectedRows())) issue989SQL := `CREATE TABLE tIssue989 (a int, b int, KEY(a), UNIQUE KEY(b)) partition by range (b) ( PARTITION p1 VALUES LESS THAN (100), @@ -1270,8 +1288,10 @@ func (s *testSuite4) TestPartitionedTableReplace(c *C) { r.Check(testkit.Rows("111 2")) } -func (s *testSuite4) TestHashPartitionedTableReplace(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestHashPartitionedTableReplace(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("set @@session.tidb_enable_table_partition = '1';") tk.MustExec("drop table if exists replace_test;") @@ -1285,37 +1305,37 @@ func (s *testSuite4) TestHashPartitionedTableReplace(c *C) { errReplaceSQL := `replace replace_test (c1) values ();` tk.MustExec("begin") _, err := tk.Exec(errReplaceSQL) - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("rollback") errReplaceSQL = `replace replace_test (c1, c2) values (1,2),(1);` tk.MustExec("begin") _, err = tk.Exec(errReplaceSQL) - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("rollback") errReplaceSQL = `replace replace_test (xxx) values (3);` tk.MustExec("begin") _, err = tk.Exec(errReplaceSQL) - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("rollback") errReplaceSQL = `replace replace_test_xxx (c1) values ();` tk.MustExec("begin") _, err = tk.Exec(errReplaceSQL) - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("rollback") errReplaceSetSQL := `replace replace_test set c1 = 4, c1 = 5;` tk.MustExec("begin") _, err = tk.Exec(errReplaceSetSQL) - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("rollback") errReplaceSetSQL = `replace replace_test set xxx = 6;` tk.MustExec("begin") _, err = tk.Exec(errReplaceSetSQL) - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("rollback") tk.MustExec(`replace replace_test set c1 = 3;`) @@ -1336,7 +1356,7 @@ func (s *testSuite4) TestHashPartitionedTableReplace(c *C) { errReplaceSelectSQL := `replace replace_test_1 select c1 from replace_test;` tk.MustExec("begin") _, err = tk.Exec(errReplaceSelectSQL) - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("rollback") tk.MustExec(`drop table if exists replace_test_3`) @@ -1345,13 +1365,13 @@ func (s *testSuite4) TestHashPartitionedTableReplace(c *C) { tk.MustExec(`replace into replace_test_3 set c2=8;`) tk.MustExec(`replace into replace_test_3 set c2=8;`) - c.Assert(int64(tk.Se.AffectedRows()), Equals, int64(1)) + require.Equal(t, int64(1), int64(tk.Session().AffectedRows())) tk.MustExec(`replace into replace_test_3 set c1=8, c2=8;`) - c.Assert(int64(tk.Se.AffectedRows()), Equals, int64(2)) + require.Equal(t, int64(2), int64(tk.Session().AffectedRows())) tk.MustExec(`replace into replace_test_3 set c2=NULL;`) tk.MustExec(`replace into replace_test_3 set c2=NULL;`) - c.Assert(int64(tk.Se.AffectedRows()), Equals, int64(1)) + require.Equal(t, int64(1), int64(tk.Session().AffectedRows())) for i := 0; i < 100; i++ { sql := fmt.Sprintf("replace into replace_test_3 set c2=%d;", i) @@ -1367,7 +1387,7 @@ func (s *testSuite4) TestHashPartitionedTableReplace(c *C) { tk.MustExec(replaceUniqueIndexSQL) replaceUniqueIndexSQL = `replace into replace_test_4 set c2=NULL;` tk.MustExec(replaceUniqueIndexSQL) - c.Assert(int64(tk.Se.AffectedRows()), Equals, int64(1)) + require.Equal(t, int64(1), int64(tk.Session().AffectedRows())) replacePrimaryKeySQL := `create table replace_test_5 (c1 int, c2 int, c3 int, PRIMARY KEY (c1, c2)) partition by hash (c2) partitions 9;` tk.MustExec(replacePrimaryKeySQL) @@ -1375,7 +1395,7 @@ func (s *testSuite4) TestHashPartitionedTableReplace(c *C) { tk.MustExec(replacePrimaryKeySQL) replacePrimaryKeySQL = `replace into replace_test_5 set c1=1, c2=2;` tk.MustExec(replacePrimaryKeySQL) - c.Assert(int64(tk.Se.AffectedRows()), Equals, int64(1)) + require.Equal(t, int64(1), int64(tk.Session().AffectedRows())) issue989SQL := `CREATE TABLE tIssue989 (a int, b int, KEY(a), UNIQUE KEY(b)) partition by hash (b) partitions 10;` tk.MustExec(issue989SQL) @@ -1387,269 +1407,10 @@ func (s *testSuite4) TestHashPartitionedTableReplace(c *C) { r.Check(testkit.Rows("111 2")) } -func (s *testSuite8) TestUpdate(c *C) { - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - s.fillData(tk, "update_test") - - updateStr := `UPDATE update_test SET name = "abc" where id > 0;` - tk.MustExec(updateStr) - tk.CheckExecResult(2, 0) - tk.CheckLastMessage("Rows matched: 2 Changed: 2 Warnings: 0") - - // select data - tk.MustExec("begin") - r := tk.MustQuery(`SELECT * from update_test limit 2;`) - r.Check(testkit.Rows("1 abc", "2 abc")) - tk.MustExec("commit") - - tk.MustExec(`UPDATE update_test SET name = "foo"`) - tk.CheckExecResult(2, 0) - tk.CheckLastMessage("Rows matched: 2 Changed: 2 Warnings: 0") - - // table option is auto-increment - tk.MustExec("begin") - tk.MustExec("drop table if exists update_test;") - tk.MustExec("commit") - tk.MustExec("begin") - tk.MustExec("create table update_test(id int not null auto_increment, name varchar(255), primary key(id))") - tk.MustExec("insert into update_test(name) values ('aa')") - tk.MustExec("update update_test set id = 8 where name = 'aa'") - tk.CheckLastMessage("Rows matched: 1 Changed: 1 Warnings: 0") - tk.MustExec("insert into update_test(name) values ('bb')") - tk.MustExec("commit") - tk.MustExec("begin") - r = tk.MustQuery("select * from update_test;") - r.Check(testkit.Rows("8 aa", "9 bb")) - tk.MustExec("commit") - - tk.MustExec("begin") - tk.MustExec("drop table if exists update_test;") - tk.MustExec("commit") - tk.MustExec("begin") - tk.MustExec("create table update_test(id int not null auto_increment, name varchar(255), index(id))") - tk.MustExec("insert into update_test(name) values ('aa')") - _, err := tk.Exec("update update_test set id = null where name = 'aa'") - c.Assert(err, NotNil) - c.Assert(err.Error(), DeepEquals, "[table:1048]Column 'id' cannot be null") - - tk.MustExec("drop table update_test") - tk.MustExec("create table update_test(id int)") - tk.MustExec("begin") - tk.MustExec("insert into update_test(id) values (1)") - tk.MustExec("update update_test set id = 2 where id = 1 limit 1") - tk.CheckLastMessage("Rows matched: 1 Changed: 1 Warnings: 0") - r = tk.MustQuery("select * from update_test;") - r.Check(testkit.Rows("2")) - tk.MustExec("commit") - - // Test that in a transaction, when a constraint failed in an update statement, the record is not inserted. - tk.MustExec("create table update_unique (id int primary key, name int unique)") - tk.MustExec("insert update_unique values (1, 1), (2, 2);") - tk.MustExec("begin") - _, err = tk.Exec("update update_unique set name = 1 where id = 2") - c.Assert(err, NotNil) - tk.MustExec("commit") - tk.MustQuery("select * from update_unique").Check(testkit.Rows("1 1", "2 2")) - - // test update ignore for pimary key - tk.MustExec("drop table if exists t;") - tk.MustExec("create table t(a bigint, primary key (a));") - tk.MustExec("insert into t values (1)") - tk.MustExec("insert into t values (2)") - _, err = tk.Exec("update ignore t set a = 1 where a = 2;") - c.Assert(err, IsNil) - tk.CheckLastMessage("Rows matched: 1 Changed: 0 Warnings: 1") - r = tk.MustQuery("SHOW WARNINGS;") - r.Check(testkit.Rows("Warning 1062 Duplicate entry '1' for key 'PRIMARY'")) - tk.MustQuery("select * from t").Check(testkit.Rows("1", "2")) - - // test update ignore for truncate as warning - _, err = tk.Exec("update ignore t set a = 1 where a = (select '2a')") - c.Assert(err, IsNil) - r = tk.MustQuery("SHOW WARNINGS;") - r.Check(testkit.Rows("Warning 1292 Truncated incorrect DOUBLE value: '2a'", "Warning 1292 Truncated incorrect DOUBLE value: '2a'", "Warning 1062 Duplicate entry '1' for key 'PRIMARY'")) - - tk.MustExec("update ignore t set a = 42 where a = 2;") - tk.MustQuery("select * from t").Check(testkit.Rows("1", "42")) - - // test update ignore for unique key - tk.MustExec("drop table if exists t;") - tk.MustExec("create table t(a bigint, unique key I_uniq (a));") - tk.MustExec("insert into t values (1)") - tk.MustExec("insert into t values (2)") - _, err = tk.Exec("update ignore t set a = 1 where a = 2;") - c.Assert(err, IsNil) - tk.CheckLastMessage("Rows matched: 1 Changed: 0 Warnings: 1") - r = tk.MustQuery("SHOW WARNINGS;") - r.Check(testkit.Rows("Warning 1062 Duplicate entry '1' for key 'I_uniq'")) - tk.MustQuery("select * from t").Check(testkit.Rows("1", "2")) - - // test issue21965 - tk.MustExec("drop table if exists t;") - tk.MustExec("set @@session.tidb_enable_list_partition = ON") - tk.MustExec("create table t (a int) partition by list (a) (partition p0 values in (0,1));") - tk.MustExec("insert ignore into t values (1);") - tk.MustExec("update ignore t set a=2 where a=1;") - tk.CheckLastMessage("Rows matched: 1 Changed: 0 Warnings: 0") - tk.MustExec("drop table if exists t;") - tk.MustExec("create table t (a int key) partition by list (a) (partition p0 values in (0,1));") - tk.MustExec("insert ignore into t values (1);") - tk.MustExec("update ignore t set a=2 where a=1;") - tk.CheckLastMessage("Rows matched: 1 Changed: 0 Warnings: 0") - - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(id integer auto_increment, t1 datetime, t2 datetime, primary key (id))") - tk.MustExec("insert into t(t1, t2) values('2000-10-01 01:01:01', '2017-01-01 10:10:10')") - tk.MustQuery("select * from t").Check(testkit.Rows("1 2000-10-01 01:01:01 2017-01-01 10:10:10")) - tk.MustExec("update t set t1 = '2017-10-01 10:10:11', t2 = date_add(t1, INTERVAL 10 MINUTE) where id = 1") - tk.CheckLastMessage("Rows matched: 1 Changed: 1 Warnings: 0") - tk.MustQuery("select * from t").Check(testkit.Rows("1 2017-10-01 10:10:11 2000-10-01 01:11:01")) - - // for issue #5132 - tk.MustExec("CREATE TABLE `tt1` (" + - "`a` int(11) NOT NULL," + - "`b` varchar(32) DEFAULT NULL," + - "`c` varchar(32) DEFAULT NULL," + - "PRIMARY KEY (`a`)," + - "UNIQUE KEY `b_idx` (`b`)" + - ") ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;") - tk.MustExec("insert into tt1 values(1, 'a', 'a');") - tk.MustExec("insert into tt1 values(2, 'd', 'b');") - r = tk.MustQuery("select * from tt1;") - r.Check(testkit.Rows("1 a a", "2 d b")) - tk.MustExec("update tt1 set a=5 where c='b';") - tk.CheckLastMessage("Rows matched: 1 Changed: 1 Warnings: 0") - r = tk.MustQuery("select * from tt1;") - r.Check(testkit.Rows("1 a a", "5 d b")) - - // Automatic Updating for TIMESTAMP - tk.MustExec("CREATE TABLE `tsup` (" + - "`a` int," + - "`ts` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP," + - "KEY `idx` (`ts`)" + - ");") - tk.MustExec("set @orig_sql_mode=@@sql_mode; set @@sql_mode='';") - tk.MustExec("insert into tsup values(1, '0000-00-00 00:00:00');") - tk.MustExec("update tsup set a=5;") - tk.CheckLastMessage("Rows matched: 1 Changed: 1 Warnings: 0") - r1 := tk.MustQuery("select ts from tsup use index (idx);") - r2 := tk.MustQuery("select ts from tsup;") - r1.Check(r2.Rows()) - tk.MustExec("update tsup set ts='2019-01-01';") - tk.MustQuery("select ts from tsup;").Check(testkit.Rows("2019-01-01 00:00:00")) - tk.MustExec("set @@sql_mode=@orig_sql_mode;") - - // issue 5532 - tk.MustExec("create table decimals (a decimal(20, 0) not null)") - tk.MustExec("insert into decimals values (201)") - // A warning rather than data truncated error. - tk.MustExec("update decimals set a = a + 1.23;") - tk.CheckLastMessage("Rows matched: 1 Changed: 1 Warnings: 1") - tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1292 Truncated incorrect DECIMAL value: '202.23'")) - r = tk.MustQuery("select * from decimals") - r.Check(testkit.Rows("202")) - - tk.MustExec("drop table t") - tk.MustExec("CREATE TABLE `t` ( `c1` year DEFAULT NULL, `c2` year DEFAULT NULL, `c3` date DEFAULT NULL, `c4` datetime DEFAULT NULL, KEY `idx` (`c1`,`c2`))") - _, err = tk.Exec("UPDATE t SET c2=16777215 WHERE c1>= -8388608 AND c1 < -9 ORDER BY c1 LIMIT 2") - c.Assert(err, IsNil) - - tk.MustGetErrCode("update (select * from t) t set c1 = 1111111", mysql.ErrNonUpdatableTable) - - // test update ignore for bad null error - tk.MustExec("drop table if exists t;") - tk.MustExec(`create table t (i int not null default 10)`) - tk.MustExec("insert into t values (1)") - tk.MustExec("update ignore t set i = null;") - tk.CheckLastMessage("Rows matched: 1 Changed: 1 Warnings: 1") - r = tk.MustQuery("SHOW WARNINGS;") - r.Check(testkit.Rows("Warning 1048 Column 'i' cannot be null")) - tk.MustQuery("select * from t").Check(testkit.Rows("0")) - - // issue 7237, update subquery table should be forbidden - tk.MustExec("drop table t") - tk.MustExec("create table t (k int, v int)") - _, err = tk.Exec("update t, (select * from t) as b set b.k = t.k") - c.Assert(err.Error(), Equals, "[planner:1288]The target table b of the UPDATE is not updatable") - tk.MustExec("update t, (select * from t) as b set t.k = b.k") - - // issue 8045 - tk.MustExec("drop table if exists t1") - tk.MustExec(`CREATE TABLE t1 (c1 float)`) - tk.MustExec("INSERT INTO t1 SET c1 = 1") - tk.MustExec("UPDATE t1 SET c1 = 1.2 WHERE c1=1;") - tk.CheckLastMessage("Rows matched: 1 Changed: 1 Warnings: 0") - - // issue 8119 - tk.MustExec("drop table if exists t;") - tk.MustExec("create table t (c1 float(1,1));") - tk.MustExec("insert into t values (0.0);") - _, err = tk.Exec("update t set c1 = 2.0;") - c.Assert(types.ErrWarnDataOutOfRange.Equal(err), IsTrue) - - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a datetime not null, b datetime)") - tk.MustExec("insert into t value('1999-12-12', '1999-12-13')") - tk.MustExec("set @orig_sql_mode=@@sql_mode; set @@sql_mode='';") - tk.MustQuery("select * from t").Check(testkit.Rows("1999-12-12 00:00:00 1999-12-13 00:00:00")) - tk.MustExec("update t set a = ''") - tk.MustQuery("select * from t").Check(testkit.Rows("0000-00-00 00:00:00 1999-12-13 00:00:00")) - tk.MustExec("update t set b = ''") - tk.MustQuery("select * from t").Check(testkit.Rows("0000-00-00 00:00:00 0000-00-00 00:00:00")) - tk.MustExec("set @@sql_mode=@orig_sql_mode;") - - tk.MustExec("create view v as select * from t") - _, err = tk.Exec("update v set a = '2000-11-11'") - c.Assert(err.Error(), Equals, core.ErrViewInvalid.GenWithStackByArgs("test", "v").Error()) - tk.MustExec("drop view v") - - tk.MustExec("create sequence seq") - tk.MustGetErrCode("update seq set minvalue=1", mysql.ErrBadField) - tk.MustExec("drop sequence seq") - - tk.MustExec("drop table if exists t1, t2") - tk.MustExec("create table t1(a int, b int, c int, d int, e int, index idx(a))") - tk.MustExec("create table t2(a int, b int, c int)") - tk.MustExec("update t1 join t2 on t1.a=t2.a set t1.a=1 where t2.b=1 and t2.c=2") - - // Assign `DEFAULT` in `UPDATE` statement - tk.MustExec("drop table if exists t1, t2;") - tk.MustExec("create table t1 (a int default 1, b int default 2);") - tk.MustExec("insert into t1 values (10, 10), (20, 20);") - tk.MustExec("update t1 set a=default where b=10;") - tk.MustQuery("select * from t1;").Check(testkit.Rows("1 10", "20 20")) - tk.MustExec("update t1 set a=30, b=default where a=20;") - tk.MustQuery("select * from t1;").Check(testkit.Rows("1 10", "30 2")) - tk.MustExec("update t1 set a=default, b=default where a=30;") - tk.MustQuery("select * from t1;").Check(testkit.Rows("1 10", "1 2")) - tk.MustExec("insert into t1 values (40, 40)") - tk.MustExec("update t1 set a=default, b=default") - tk.MustQuery("select * from t1;").Check(testkit.Rows("1 2", "1 2", "1 2")) - tk.MustExec("update t1 set a=default(b), b=default(a)") - tk.MustQuery("select * from t1;").Check(testkit.Rows("2 1", "2 1", "2 1")) - // With generated columns - tk.MustExec("create table t2 (a int default 1, b int generated always as (-a) virtual, c int generated always as (-a) stored);") - tk.MustExec("insert into t2 values (10, default, default), (20, default, default)") - tk.MustExec("update t2 set b=default;") - tk.MustQuery("select * from t2;").Check(testkit.Rows("10 -10 -10", "20 -20 -20")) - tk.MustExec("update t2 set a=30, b=default where a=10;") - tk.MustQuery("select * from t2;").Check(testkit.Rows("30 -30 -30", "20 -20 -20")) - tk.MustExec("update t2 set c=default, a=40 where c=-20;") - tk.MustQuery("select * from t2;").Check(testkit.Rows("30 -30 -30", "40 -40 -40")) - tk.MustExec("update t2 set a=default, b=default, c=default where b=-30;") - tk.MustQuery("select * from t2;").Check(testkit.Rows("1 -1 -1", "40 -40 -40")) - tk.MustExec("update t2 set a=default(a), b=default, c=default;") - tk.MustQuery("select * from t2;").Check(testkit.Rows("1 -1 -1", "1 -1 -1")) - tk.MustGetErrCode("update t2 set b=default(a);", mysql.ErrBadGeneratedColumn) - tk.MustGetErrCode("update t2 set a=default(b), b=default(b);", mysql.ErrBadGeneratedColumn) - tk.MustGetErrCode("update t2 set a=default(a), c=default(c);", mysql.ErrBadGeneratedColumn) - tk.MustGetErrCode("update t2 set a=default(a), c=default(a);", mysql.ErrBadGeneratedColumn) - tk.MustExec("drop table t1, t2") -} - -func (s *testSuite4) TestPartitionedTableUpdate(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestPartitionedTableUpdate(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec(`create table t (id int not null default 1, name varchar(255)) @@ -1667,21 +1428,21 @@ func (s *testSuite4) TestPartitionedTableUpdate(c *C) { // update non partition column tk.MustExec(`UPDATE t SET name = "abc" where id > 0;`) tk.CheckExecResult(2, 0) - tk.CheckLastMessage("Rows matched: 2 Changed: 2 Warnings: 0") + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 2 Changed: 2 Warnings: 0") r := tk.MustQuery(`SELECT * from t order by id limit 2;`) r.Check(testkit.Rows("1 abc", "7 abc")) // update partition column tk.MustExec(`update t set id = id + 1`) tk.CheckExecResult(2, 0) - tk.CheckLastMessage("Rows matched: 2 Changed: 2 Warnings: 0") + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 2 Changed: 2 Warnings: 0") r = tk.MustQuery(`SELECT * from t order by id limit 2;`) r.Check(testkit.Rows("2 abc", "8 abc")) // update partition column, old and new record locates on different partitions tk.MustExec(`update t set id = 20 where id = 8`) tk.CheckExecResult(1, 0) - tk.CheckLastMessage("Rows matched: 1 Changed: 1 Warnings: 0") + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 1 Changed: 1 Warnings: 0") r = tk.MustQuery(`SELECT * from t order by id limit 2;`) r.Check(testkit.Rows("2 abc", "20 abc")) @@ -1696,14 +1457,13 @@ func (s *testSuite4) TestPartitionedTableUpdate(c *C) { tk.MustExec("insert into t(name) values ('aa')") tk.MustExec("update t set id = 8 where name = 'aa'") - tk.CheckLastMessage("Rows matched: 1 Changed: 1 Warnings: 0") + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 1 Changed: 1 Warnings: 0") tk.MustExec("insert into t(name) values ('bb')") r = tk.MustQuery("select * from t;") r.Check(testkit.Rows("8 aa", "9 bb")) _, err := tk.Exec("update t set id = null where name = 'aa'") - c.Assert(err, NotNil) - c.Assert(err.Error(), DeepEquals, "[table:1048]Column 'id' cannot be null") + require.EqualError(t, err, "[table:1048]Column 'id' cannot be null") // Test that in a transaction, when a constraint failed in an update statement, the record is not inserted. tk.MustExec("drop table if exists t;") @@ -1715,7 +1475,7 @@ func (s *testSuite4) TestPartitionedTableUpdate(c *C) { PARTITION p3 VALUES LESS THAN (21))`) tk.MustExec("insert t values (1, 1), (2, 2);") _, err = tk.Exec("update t set name = 1 where id = 2") - c.Assert(err, NotNil) + require.Error(t, err) tk.MustQuery("select * from t").Check(testkit.Rows("1 1", "2 2")) // test update ignore for pimary key @@ -1727,15 +1487,15 @@ func (s *testSuite4) TestPartitionedTableUpdate(c *C) { tk.MustExec("insert into t values (5)") tk.MustExec("insert into t values (7)") _, err = tk.Exec("update ignore t set a = 5 where a = 7;") - c.Assert(err, IsNil) - tk.CheckLastMessage("Rows matched: 1 Changed: 0 Warnings: 1") + require.NoError(t, err) + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 1 Changed: 0 Warnings: 1") r = tk.MustQuery("SHOW WARNINGS;") r.Check(testkit.Rows("Warning 1062 Duplicate entry '5' for key 'PRIMARY'")) tk.MustQuery("select * from t order by a").Check(testkit.Rows("5", "7")) // test update ignore for truncate as warning _, err = tk.Exec("update ignore t set a = 1 where a = (select '2a')") - c.Assert(err, IsNil) + require.NoError(t, err) r = tk.MustQuery("SHOW WARNINGS;") r.Check(testkit.Rows("Warning 1292 Truncated incorrect DOUBLE value: '2a'", "Warning 1292 Truncated incorrect DOUBLE value: '2a'")) @@ -1748,16 +1508,18 @@ func (s *testSuite4) TestPartitionedTableUpdate(c *C) { tk.MustExec("insert into t values (5)") tk.MustExec("insert into t values (7)") _, err = tk.Exec("update ignore t set a = 5 where a = 7;") - c.Assert(err, IsNil) - tk.CheckLastMessage("Rows matched: 1 Changed: 0 Warnings: 1") + require.NoError(t, err) + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 1 Changed: 0 Warnings: 1") r = tk.MustQuery("SHOW WARNINGS;") r.Check(testkit.Rows("Warning 1062 Duplicate entry '5' for key 'I_uniq'")) tk.MustQuery("select * from t order by a").Check(testkit.Rows("5", "7")) } // TestUpdateCastOnlyModifiedValues for issue #4514. -func (s *testSuite4) TestUpdateCastOnlyModifiedValues(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestUpdateCastOnlyModifiedValues(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("create table update_modified (col_1 int, col_2 enum('a', 'b'))") tk.MustExec("set SQL_MODE=''") @@ -1766,15 +1528,15 @@ func (s *testSuite4) TestUpdateCastOnlyModifiedValues(c *C) { r.Check(testkit.Rows("0 ")) tk.MustExec("set SQL_MODE=STRICT_ALL_TABLES") tk.MustExec("update update_modified set col_1 = 1") - tk.CheckLastMessage("Rows matched: 1 Changed: 1 Warnings: 0") + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 1 Changed: 1 Warnings: 0") r = tk.MustQuery("SELECT * FROM update_modified") r.Check(testkit.Rows("1 ")) _, err := tk.Exec("update update_modified set col_1 = 2, col_2 = 'c'") - c.Assert(err, NotNil) + require.Error(t, err) r = tk.MustQuery("SELECT * FROM update_modified") r.Check(testkit.Rows("1 ")) tk.MustExec("update update_modified set col_1 = 3, col_2 = 'a'") - tk.CheckLastMessage("Rows matched: 1 Changed: 1 Warnings: 0") + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 1 Changed: 1 Warnings: 0") r = tk.MustQuery("SELECT * FROM update_modified") r.Check(testkit.Rows("3 a")) @@ -1782,16 +1544,16 @@ func (s *testSuite4) TestUpdateCastOnlyModifiedValues(c *C) { tk.MustExec(`CREATE TABLE update_with_diff_type (a int, b JSON)`) tk.MustExec(`INSERT INTO update_with_diff_type VALUES(3, '{"a": "测试"}')`) tk.MustExec(`UPDATE update_with_diff_type SET a = '300'`) - tk.CheckLastMessage("Rows matched: 1 Changed: 1 Warnings: 0") + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 1 Changed: 1 Warnings: 0") r = tk.MustQuery("SELECT a FROM update_with_diff_type") r.Check(testkit.Rows("300")) tk.MustExec(`UPDATE update_with_diff_type SET b = '{"a": "\\u6d4b\\u8bd5"}'`) - tk.CheckLastMessage("Rows matched: 1 Changed: 0 Warnings: 0") + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 1 Changed: 0 Warnings: 0") r = tk.MustQuery("SELECT b FROM update_with_diff_type") r.Check(testkit.Rows(`{"a": "测试"}`)) } -func (s *testSuite4) fillMultiTableForUpdate(tk *testkit.TestKit) { +func fillMultiTableForUpdate(tk *testkit.TestKit) { // Create and fill table items tk.MustExec("CREATE TABLE items (id int, price TEXT);") tk.MustExec(`insert into items values (11, "items_price_11"), (12, "items_price_12"), (13, "items_price_13");`) @@ -1802,13 +1564,15 @@ func (s *testSuite4) fillMultiTableForUpdate(tk *testkit.TestKit) { tk.CheckExecResult(3, 0) } -func (s *testSuite4) TestMultipleTableUpdate(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestMultipleTableUpdate(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") - s.fillMultiTableForUpdate(tk) + fillMultiTableForUpdate(tk) tk.MustExec(`UPDATE items, month SET items.price=month.mprice WHERE items.id=month.mid;`) - tk.CheckLastMessage("Rows matched: 2 Changed: 2 Warnings: 0") + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 2 Changed: 2 Warnings: 0") tk.MustExec("begin") r := tk.MustQuery("SELECT * FROM items") r.Check(testkit.Rows("11 month_price_11", "12 items_price_12", "13 month_price_13")) @@ -1816,7 +1580,7 @@ func (s *testSuite4) TestMultipleTableUpdate(c *C) { // Single-table syntax but with multiple tables tk.MustExec(`UPDATE items join month on items.id=month.mid SET items.price=month.mid;`) - tk.CheckLastMessage("Rows matched: 2 Changed: 2 Warnings: 0") + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 2 Changed: 2 Warnings: 0") tk.MustExec("begin") r = tk.MustQuery("SELECT * FROM items") r.Check(testkit.Rows("11 11", "12 items_price_12", "13 13")) @@ -1824,7 +1588,7 @@ func (s *testSuite4) TestMultipleTableUpdate(c *C) { // JoinTable with alias table name. tk.MustExec(`UPDATE items T0 join month T1 on T0.id=T1.mid SET T0.price=T1.mprice;`) - tk.CheckLastMessage("Rows matched: 2 Changed: 2 Warnings: 0") + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 2 Changed: 2 Warnings: 0") tk.MustExec("begin") r = tk.MustQuery("SELECT * FROM items") r.Check(testkit.Rows("11 month_price_11", "12 items_price_12", "13 month_price_13")) @@ -1839,7 +1603,7 @@ func (s *testSuite4) TestMultipleTableUpdate(c *C) { insert into t2 values ("a"), ("b"); update t1, t2 set t1.c = 10, t2.c = "abc";` tk.MustExec(testSQL) - tk.CheckLastMessage("Rows matched: 4 Changed: 4 Warnings: 0") + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 4 Changed: 4 Warnings: 0") // fix https://github.com/pingcap/tidb/issues/376 testSQL = `DROP TABLE IF EXISTS t1, t2; @@ -1849,7 +1613,7 @@ func (s *testSuite4) TestMultipleTableUpdate(c *C) { insert into t2 values (1), (2); update t1, t2 set t1.c1 = 10, t2.c2 = 2 where t2.c2 = 1;` tk.MustExec(testSQL) - tk.CheckLastMessage("Rows matched: 3 Changed: 3 Warnings: 0") + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 3 Changed: 3 Warnings: 0") r = tk.MustQuery("select * from t1") r.Check(testkit.Rows("10", "10")) @@ -1858,18 +1622,20 @@ func (s *testSuite4) TestMultipleTableUpdate(c *C) { tk.MustExec("drop table if exists t, t") tk.MustExec("create table t (a int, b int)") tk.MustExec("insert into t values(1, 1), (2, 2), (3, 3)") - tk.CheckLastMessage("Records: 3 Duplicates: 0 Warnings: 0") + require.Equal(t, tk.Session().LastMessage(), "Records: 3 Duplicates: 0 Warnings: 0") tk.MustExec("update t m, t n set m.a = m.a + 1") - tk.CheckLastMessage("Rows matched: 3 Changed: 3 Warnings: 0") + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 3 Changed: 3 Warnings: 0") tk.MustQuery("select * from t").Check(testkit.Rows("2 1", "3 2", "4 3")) tk.MustExec("update t m, t n set n.a = n.a - 1, n.b = n.b + 1") - tk.CheckLastMessage("Rows matched: 3 Changed: 3 Warnings: 0") + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 3 Changed: 3 Warnings: 0") tk.MustQuery("select * from t").Check(testkit.Rows("1 2", "2 3", "3 4")) } -func (s *testSuite) TestDelete(c *C) { - tk := testkit.NewTestKit(c, s.store) - s.fillData(tk, "delete_test") +func TestDelete(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + fillData(tk, "delete_test") tk.MustExec(`update delete_test set name = "abc" where id = 2;`) tk.CheckExecResult(1, 0) @@ -1894,9 +1660,9 @@ func (s *testSuite) TestDelete(c *C) { // Test delete ignore tk.MustExec("insert into delete_test values (2, 'abc')") _, err := tk.Exec("delete from delete_test where id = (select '2a')") - c.Assert(err, NotNil) + require.Error(t, err) _, err = tk.Exec("delete ignore from delete_test where id = (select '2a')") - c.Assert(err, IsNil) + require.NoError(t, err) tk.CheckExecResult(1, 0) r := tk.MustQuery("SHOW WARNINGS;") r.Check(testkit.Rows("Warning 1292 Truncated incorrect DOUBLE value: '2a'", "Warning 1292 Truncated incorrect DOUBLE value: '2a'")) @@ -1906,16 +1672,16 @@ func (s *testSuite) TestDelete(c *C) { tk.MustExec("create view v as select * from delete_test") _, err = tk.Exec("delete from v where name = 'aaa'") - c.Assert(err.Error(), Equals, core.ErrViewInvalid.GenWithStackByArgs("test", "v").Error()) + require.EqualError(t, err, core.ErrViewInvalid.GenWithStackByArgs("test", "v").Error()) tk.MustExec("drop view v") tk.MustExec("create sequence seq") _, err = tk.Exec("delete from seq") - c.Assert(err.Error(), Equals, "delete sequence seq is not supported now.") + require.EqualError(t, err, "delete sequence seq is not supported now.") tk.MustExec("drop sequence seq") } -func (s *testSuite4) TestPartitionedTableDelete(c *C) { +func TestPartitionedTableDelete(t *testing.T) { createTable := `CREATE TABLE test.t (id int not null default 1, name varchar(255), index(id)) PARTITION BY RANGE ( id ) ( PARTITION p0 VALUES LESS THAN (6), @@ -1923,7 +1689,9 @@ func (s *testSuite4) TestPartitionedTableDelete(c *C) { PARTITION p2 VALUES LESS THAN (16), PARTITION p3 VALUES LESS THAN (21))` - tk := testkit.NewTestKit(c, s.store) + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec(createTable) @@ -1945,9 +1713,9 @@ func (s *testSuite4) TestPartitionedTableDelete(c *C) { // Test delete ignore tk.MustExec("insert into t values (2, 'abc')") _, err := tk.Exec("delete from t where id = (select '2a')") - c.Assert(err, NotNil) + require.Error(t, err) _, err = tk.Exec("delete ignore from t where id = (select '2a')") - c.Assert(err, IsNil) + require.NoError(t, err) tk.CheckExecResult(1, 0) r := tk.MustQuery("SHOW WARNINGS;") r.Check(testkit.Rows("Warning 1292 Truncated incorrect DOUBLE value: '2a'", "Warning 1292 Truncated incorrect DOUBLE value: '2a'")) @@ -1968,7 +1736,7 @@ func (s *testSuite4) TestPartitionedTableDelete(c *C) { tk.MustExec(`drop table t1;`) } -func (s *testSuite4) fillDataMultiTable(tk *testkit.TestKit) { +func fillDataMultiTable(tk *testkit.TestKit) { tk.MustExec("use test") tk.MustExec("drop table if exists t1, t2, t3") // Create and fill table t1 @@ -1985,20 +1753,24 @@ func (s *testSuite4) fillDataMultiTable(tk *testkit.TestKit) { tk.CheckExecResult(3, 0) } -func (s *testSuite4) TestMultiTableDelete(c *C) { - tk := testkit.NewTestKit(c, s.store) - s.fillDataMultiTable(tk) +func TestMultiTableDelete(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + fillDataMultiTable(tk) tk.MustExec(`delete t1, t2 from t1 inner join t2 inner join t3 where t1.id=t2.id and t2.id=t3.id;`) tk.CheckExecResult(2, 0) // Select data r := tk.MustQuery("select * from t3") - c.Assert(r.Rows(), HasLen, 3) + require.Len(t, r.Rows(), 3) } -func (s *testSuite4) TestQualifiedDelete(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestQualifiedDelete(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t1") tk.MustExec("drop table if exists t2") @@ -2015,8 +1787,7 @@ func (s *testSuite4) TestQualifiedDelete(c *C) { tk.CheckExecResult(1, 0) r := tk.MustQuery("select * from t1") - c.Assert(r.Rows(), HasLen, 0) - + require.Len(t, r.Rows(), 0) tk.MustExec("insert into t1 values (1, 3)") tk.MustExec("delete from t1 as a where a.c1 = 1") tk.CheckExecResult(1, 0) @@ -2031,26 +1802,28 @@ func (s *testSuite4) TestQualifiedDelete(c *C) { tk.CheckExecResult(2, 0) _, err := tk.Exec("delete t1, t2 from t1 as a join t2 as b where a.c2 = b.c1") - c.Assert(err, NotNil) + require.Error(t, err) } -func (s *testSuite8) TestLoadDataMissingColumn(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestLoadDataMissingColumn(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") createSQL := `create table load_data_missing (id int, t timestamp not null)` tk.MustExec(createSQL) tk.MustExec("load data local infile '/tmp/nonexistence.csv' ignore into table load_data_missing") - ctx := tk.Se.(sessionctx.Context) + ctx := tk.Session().(sessionctx.Context) ld, ok := ctx.Value(executor.LoadDataVarKey).(*executor.LoadDataInfo) - c.Assert(ok, IsTrue) + require.True(t, ok) defer ctx.SetValue(executor.LoadDataVarKey, nil) - c.Assert(ld, NotNil) + require.NotNil(t, ld) deleteSQL := "delete from load_data_missing" selectSQL := "select id, hour(t), minute(t) from load_data_missing;" _, reachLimit, err := ld.InsertData(context.Background(), nil, nil) - c.Assert(err, IsNil) - c.Assert(reachLimit, IsFalse) + require.NoError(t, err) + require.False(t, reachLimit) r := tk.MustQuery(selectSQL) r.Check(nil) @@ -2060,7 +1833,7 @@ func (s *testSuite8) TestLoadDataMissingColumn(c *C) { tests := []testCase{ {nil, []byte("12\n"), []string{fmt.Sprintf("12|%v|%v", timeHour, timeMinute)}, nil, "Records: 1 Deleted: 0 Skipped: 0 Warnings: 0"}, } - checkCases(tests, ld, c, tk, ctx, selectSQL, deleteSQL) + checkCases(tests, ld, t, tk, ctx, selectSQL, deleteSQL) tk.MustExec("alter table load_data_missing add column t2 timestamp null") curTime = types.CurrentTime(mysql.TypeTimestamp) @@ -2070,22 +1843,23 @@ func (s *testSuite8) TestLoadDataMissingColumn(c *C) { tests = []testCase{ {nil, []byte("12\n"), []string{fmt.Sprintf("12|%v|%v|<nil>", timeHour, timeMinute)}, nil, "Records: 1 Deleted: 0 Skipped: 0 Warnings: 0"}, } - checkCases(tests, ld, c, tk, ctx, selectSQL, deleteSQL) - + checkCases(tests, ld, t, tk, ctx, selectSQL, deleteSQL) } -func (s *testSuite4) TestIssue18681(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue18681(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") createSQL := `drop table if exists load_data_test; create table load_data_test (a bit(1),b bit(1),c bit(1),d bit(1));` tk.MustExec(createSQL) tk.MustExec("load data local infile '/tmp/nonexistence.csv' ignore into table load_data_test") - ctx := tk.Se.(sessionctx.Context) + ctx := tk.Session().(sessionctx.Context) ld, ok := ctx.Value(executor.LoadDataVarKey).(*executor.LoadDataInfo) - c.Assert(ok, IsTrue) + require.True(t, ok) defer ctx.SetValue(executor.LoadDataVarKey, nil) - c.Assert(ld, NotNil) + require.NotNil(t, ld) deleteSQL := "delete from load_data_test" selectSQL := "select bin(a), bin(b), bin(c), bin(d) from load_data_test;" @@ -2102,29 +1876,31 @@ func (s *testSuite4) TestIssue18681(c *C) { tests := []testCase{ {nil, []byte("true\tfalse\t0\t1\n"), []string{"1|0|0|1"}, nil, "Records: 1 Deleted: 0 Skipped: 0 Warnings: 0"}, } - checkCases(tests, ld, c, tk, ctx, selectSQL, deleteSQL) - c.Assert(sc.WarningCount(), Equals, uint16(0)) + checkCases(tests, ld, t, tk, ctx, selectSQL, deleteSQL) + require.Equal(t, uint16(0), sc.WarningCount()) } -func (s *testSuite4) TestLoadData(c *C) { +func TestLoadData(t *testing.T) { trivialMsg := "Records: 1 Deleted: 0 Skipped: 0 Warnings: 0" - tk := testkit.NewTestKit(c, s.store) + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") createSQL := `drop table if exists load_data_test; create table load_data_test (id int PRIMARY KEY AUTO_INCREMENT, c1 int, c2 varchar(255) default "def", c3 int);` _, err := tk.Exec("load data local infile '/tmp/nonexistence.csv' into table load_data_test") - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec(createSQL) _, err = tk.Exec("load data infile '/tmp/nonexistence.csv' into table load_data_test") - c.Assert(err, NotNil) + require.Error(t, err) _, err = tk.Exec("load data local infile '/tmp/nonexistence.csv' replace into table load_data_test") - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("load data local infile '/tmp/nonexistence.csv' ignore into table load_data_test") - ctx := tk.Se.(sessionctx.Context) + ctx := tk.Session().(sessionctx.Context) ld, ok := ctx.Value(executor.LoadDataVarKey).(*executor.LoadDataInfo) - c.Assert(ok, IsTrue) + require.True(t, ok) defer ctx.SetValue(executor.LoadDataVarKey, nil) - c.Assert(ld, NotNil) + require.NotNil(t, ld) deleteSQL := "delete from load_data_test" selectSQL := "select * from load_data_test;" @@ -2132,10 +1908,10 @@ func (s *testSuite4) TestLoadData(c *C) { ctx.GetSessionVars().StmtCtx.DupKeyAsWarning = true ctx.GetSessionVars().StmtCtx.BadNullAsWarning = true _, reachLimit, err := ld.InsertData(context.Background(), nil, nil) - c.Assert(err, IsNil) - c.Assert(reachLimit, IsFalse) + require.NoError(t, err) + require.False(t, reachLimit) err = ld.CheckAndInsertOneBatch(context.Background(), ld.GetRows(), ld.GetCurBatchCnt()) - c.Assert(err, IsNil) + require.NoError(t, err) ld.SetMaxRowsInBatch(20000) r := tk.MustQuery(selectSQL) r.Check(nil) @@ -2169,7 +1945,7 @@ func (s *testSuite4) TestLoadData(c *C) { // data1 != nil, data2 != nil, InsertData returns data isn't nil {[]byte("\t2\t3"), []byte("\t4\t5"), nil, []byte("\t2\t3\t4\t5"), "Records: 0 Deleted: 0 Skipped: 0 Warnings: 0"}, } - checkCases(tests, ld, c, tk, ctx, selectSQL, deleteSQL) + checkCases(tests, ld, t, tk, ctx, selectSQL, deleteSQL) // lines starting symbol is "" and terminated symbol length is 2, InsertData returns data is nil ld.LinesInfo.Terminated = "||" @@ -2185,7 +1961,7 @@ func (s *testSuite4) TestLoadData(c *C) { []string{"4|2|3|4", "5|22|33|<nil>", "6|222|<nil>|<nil>"}, nil, "Records: 3 Deleted: 0 Skipped: 0 Warnings: 0"}, {[]byte("6\t2\t3"), []byte("4\t5||"), []string{"6|2|34|5"}, nil, trivialMsg}, } - checkCases(tests, ld, c, tk, ctx, selectSQL, deleteSQL) + checkCases(tests, ld, t, tk, ctx, selectSQL, deleteSQL) // fields and lines aren't default, InsertData returns data is nil ld.FieldsInfo.Terminated = "\\" @@ -2238,7 +2014,7 @@ func (s *testSuite4) TestLoadData(c *C) { []string{"1|2|3|4", "2|22|33|<nil>"}, []byte("#^"), "Records: 2 Deleted: 0 Skipped: 0 Warnings: 0"}, {[]byte("xx1\\2\\3"), []byte("\\4\\5|!#^"), nil, []byte("#^"), "Records: 0 Deleted: 0 Skipped: 0 Warnings: 0"}, } - checkCases(tests, ld, c, tk, ctx, selectSQL, deleteSQL) + checkCases(tests, ld, t, tk, ctx, selectSQL, deleteSQL) // lines starting symbol is the same as terminated symbol, InsertData returns data is nil ld.LinesInfo.Terminated = "xxx" @@ -2273,7 +2049,7 @@ func (s *testSuite4) TestLoadData(c *C) { {[]byte("xxx10\\2\\3\\4\\5x"), []byte("xx11\\22\\33xxxxxx12\\222xxx"), []string{"10|2|3|4", "40|<nil>|<nil>|<nil>"}, []byte("xxx"), "Records: 2 Deleted: 0 Skipped: 0 Warnings: 1"}, } - checkCases(tests, ld, c, tk, ctx, selectSQL, deleteSQL) + checkCases(tests, ld, t, tk, ctx, selectSQL, deleteSQL) // test line terminator in field quoter ld.LinesInfo.Terminated = "\n" @@ -2281,7 +2057,7 @@ func (s *testSuite4) TestLoadData(c *C) { tests = []testCase{ {[]byte("xxx1\\1\\\"2\n\"\\3\nxxx4\\4\\\"5\n5\"\\6"), nil, []string{"1|1|2\n|3", "4|4|5\n5|6"}, nil, "Records: 2 Deleted: 0 Skipped: 0 Warnings: 0"}, } - checkCases(tests, ld, c, tk, ctx, selectSQL, deleteSQL) + checkCases(tests, ld, t, tk, ctx, selectSQL, deleteSQL) ld.LinesInfo.Terminated = "#\n" ld.FieldsInfo.Terminated = "#" @@ -2290,7 +2066,7 @@ func (s *testSuite4) TestLoadData(c *C) { {[]byte("xxx1#2#3#4#\nnxxx2#3#4#5#\n"), nil, []string{"1|2|3|4", "2|3|4|5"}, nil, "Records: 2 Deleted: 0 Skipped: 0 Warnings: 0"}, {[]byte("xxx1#2#\"3#\"#\"4\n\"#\nxxx2#3#\"#4#\n\"#5#\n"), nil, []string{"1|2|3#|4", "2|3|#4#\n|5"}, nil, "Records: 2 Deleted: 0 Skipped: 0 Warnings: 0"}, } - checkCases(tests, ld, c, tk, ctx, selectSQL, deleteSQL) + checkCases(tests, ld, t, tk, ctx, selectSQL, deleteSQL) ld.LinesInfo.Terminated = "#" ld.FieldsInfo.Terminated = "##" @@ -2300,20 +2076,22 @@ func (s *testSuite4) TestLoadData(c *C) { {[]byte("1##2##3##4#2##3##4##5#"), nil, []string{"1|2|3|4", "2|3|4|5"}, nil, "Records: 2 Deleted: 0 Skipped: 0 Warnings: 0"}, {[]byte("1##2##\"3##\"##\"4\n\"#2##3##\"##4#\"##5#"), nil, []string{"1|2|3##|4", "2|3|##4#|5"}, nil, "Records: 2 Deleted: 0 Skipped: 0 Warnings: 0"}, } - checkCases(tests, ld, c, tk, ctx, selectSQL, deleteSQL) + checkCases(tests, ld, t, tk, ctx, selectSQL, deleteSQL) } -func (s *testSuite4) TestLoadDataEscape(c *C) { +func TestLoadDataEscape(t *testing.T) { trivialMsg := "Records: 1 Deleted: 0 Skipped: 0 Warnings: 0" - tk := testkit.NewTestKit(c, s.store) + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test; drop table if exists load_data_test;") tk.MustExec("CREATE TABLE load_data_test (id INT NOT NULL PRIMARY KEY, value TEXT NOT NULL) CHARACTER SET utf8") tk.MustExec("load data local infile '/tmp/nonexistence.csv' into table load_data_test") - ctx := tk.Se.(sessionctx.Context) + ctx := tk.Session().(sessionctx.Context) ld, ok := ctx.Value(executor.LoadDataVarKey).(*executor.LoadDataInfo) - c.Assert(ok, IsTrue) + require.True(t, ok) defer ctx.SetValue(executor.LoadDataVarKey, nil) - c.Assert(ld, NotNil) + require.NotNil(t, ld) // test escape tests := []testCase{ // data1 = nil, data2 != nil @@ -2329,21 +2107,44 @@ func (s *testSuite4) TestLoadDataEscape(c *C) { } deleteSQL := "delete from load_data_test" selectSQL := "select * from load_data_test;" - checkCases(tests, ld, c, tk, ctx, selectSQL, deleteSQL) + checkCases(tests, ld, t, tk, ctx, selectSQL, deleteSQL) +} + +func TestLoadDataWithLongContent(t *testing.T) { + e := &executor.LoadDataInfo{ + FieldsInfo: &ast.FieldsClause{Terminated: ",", Escaped: '\\', Enclosed: '"'}, + LinesInfo: &ast.LinesClause{Terminated: "\n"}, + } + tests := []struct { + content string + inQuoter bool + expectedIndex int + }{ + {"123,123\n123,123", false, 7}, + {"123123\\n123123", false, -1}, + {"123123\n123123", true, -1}, + {"123123\n123123\"\n", true, 14}, + } + + for _, tt := range tests { + require.Equal(t, tt.expectedIndex, e.IndexOfTerminator([]byte(tt.content), tt.inQuoter)) + } } // TestLoadDataSpecifiedColumns reuse TestLoadDataEscape's test case :-) -func (s *testSuite4) TestLoadDataSpecifiedColumns(c *C) { +func TestLoadDataSpecifiedColumns(t *testing.T) { trivialMsg := "Records: 1 Deleted: 0 Skipped: 0 Warnings: 0" - tk := testkit.NewTestKit(c, s.store) + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test; drop table if exists load_data_test;") tk.MustExec(`create table load_data_test (id int PRIMARY KEY AUTO_INCREMENT, c1 int, c2 varchar(255) default "def", c3 int default 0);`) tk.MustExec("load data local infile '/tmp/nonexistence.csv' into table load_data_test (c1, c2)") - ctx := tk.Se.(sessionctx.Context) + ctx := tk.Session().(sessionctx.Context) ld, ok := ctx.Value(executor.LoadDataVarKey).(*executor.LoadDataInfo) - c.Assert(ok, IsTrue) + require.True(t, ok) defer ctx.SetValue(executor.LoadDataVarKey, nil) - c.Assert(ld, NotNil) + require.NotNil(t, ld) // test tests := []testCase{ // data1 = nil, data2 != nil @@ -2357,75 +2158,83 @@ func (s *testSuite4) TestLoadDataSpecifiedColumns(c *C) { } deleteSQL := "delete from load_data_test" selectSQL := "select * from load_data_test;" - checkCases(tests, ld, c, tk, ctx, selectSQL, deleteSQL) + checkCases(tests, ld, t, tk, ctx, selectSQL, deleteSQL) } -func (s *testSuite4) TestLoadDataIgnoreLines(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestLoadDataIgnoreLines(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test; drop table if exists load_data_test;") tk.MustExec("CREATE TABLE load_data_test (id INT NOT NULL PRIMARY KEY, value TEXT NOT NULL) CHARACTER SET utf8") tk.MustExec("load data local infile '/tmp/nonexistence.csv' into table load_data_test ignore 1 lines") - ctx := tk.Se.(sessionctx.Context) + ctx := tk.Session().(sessionctx.Context) ld, ok := ctx.Value(executor.LoadDataVarKey).(*executor.LoadDataInfo) - c.Assert(ok, IsTrue) + require.True(t, ok) defer ctx.SetValue(executor.LoadDataVarKey, nil) - c.Assert(ld, NotNil) + require.NotNil(t, ld) tests := []testCase{ {nil, []byte("1\tline1\n2\tline2\n"), []string{"2|line2"}, nil, "Records: 1 Deleted: 0 Skipped: 0 Warnings: 0"}, {nil, []byte("1\tline1\n2\tline2\n3\tline3\n"), []string{"2|line2", "3|line3"}, nil, "Records: 2 Deleted: 0 Skipped: 0 Warnings: 0"}, } deleteSQL := "delete from load_data_test" selectSQL := "select * from load_data_test;" - checkCases(tests, ld, c, tk, ctx, selectSQL, deleteSQL) + checkCases(tests, ld, t, tk, ctx, selectSQL, deleteSQL) } // TestLoadDataOverflowBigintUnsigned related to issue 6360 -func (s *testSuite4) TestLoadDataOverflowBigintUnsigned(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestLoadDataOverflowBigintUnsigned(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test; drop table if exists load_data_test;") tk.MustExec("CREATE TABLE load_data_test (a bigint unsigned);") tk.MustExec("load data local infile '/tmp/nonexistence.csv' into table load_data_test") - ctx := tk.Se.(sessionctx.Context) + ctx := tk.Session().(sessionctx.Context) ld, ok := ctx.Value(executor.LoadDataVarKey).(*executor.LoadDataInfo) - c.Assert(ok, IsTrue) + require.True(t, ok) defer ctx.SetValue(executor.LoadDataVarKey, nil) - c.Assert(ld, NotNil) + require.NotNil(t, ld) tests := []testCase{ {nil, []byte("-1\n-18446744073709551615\n-18446744073709551616\n"), []string{"0", "0", "0"}, nil, "Records: 3 Deleted: 0 Skipped: 0 Warnings: 3"}, {nil, []byte("-9223372036854775809\n18446744073709551616\n"), []string{"0", "18446744073709551615"}, nil, "Records: 2 Deleted: 0 Skipped: 0 Warnings: 2"}, } deleteSQL := "delete from load_data_test" selectSQL := "select * from load_data_test;" - checkCases(tests, ld, c, tk, ctx, selectSQL, deleteSQL) + checkCases(tests, ld, t, tk, ctx, selectSQL, deleteSQL) } -func (s *testSuite4) TestLoadDataIntoPartitionedTable(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestLoadDataIntoPartitionedTable(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("create table range_t (a int, b int) partition by range (a) ( " + "partition p0 values less than (4)," + "partition p1 values less than (7)," + "partition p2 values less than (11))") tk.MustExec("load data local infile '/tmp/nonexistence.csv' into table range_t fields terminated by ','") - ctx := tk.Se.(sessionctx.Context) + ctx := tk.Session().(sessionctx.Context) ld := ctx.Value(executor.LoadDataVarKey).(*executor.LoadDataInfo) - c.Assert(ctx.NewTxn(context.Background()), IsNil) + require.Nil(t, ctx.NewTxn(context.Background())) _, _, err := ld.InsertData(context.Background(), nil, []byte("1,2\n3,4\n5,6\n7,8\n9,10\n")) - c.Assert(err, IsNil) + require.NoError(t, err) err = ld.CheckAndInsertOneBatch(context.Background(), ld.GetRows(), ld.GetCurBatchCnt()) - c.Assert(err, IsNil) + require.NoError(t, err) ld.SetMaxRowsInBatch(20000) ld.SetMessage() ctx.StmtCommit() txn, err := ctx.Txn(true) - c.Assert(err, IsNil) + require.NoError(t, err) err = txn.Commit(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) } -func (s *testSuite4) TestNullDefault(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestNullDefault(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test; drop table if exists test_null_default;") tk.MustExec("set timestamp = 1234") tk.MustExec("set time_zone = '+08:00'") @@ -2436,8 +2245,10 @@ func (s *testSuite4) TestNullDefault(c *C) { tk.MustQuery("select * from test_null_default").Check(testkit.Rows("<nil>", "1970-01-01 08:20:34")) } -func (s *testSuite4) TestNotNullDefault(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestNotNullDefault(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test; drop table if exists t1,t2;") defer tk.MustExec("drop table t1,t2") tk.MustExec("create table t1 (a int not null default null default 1);") @@ -2445,28 +2256,28 @@ func (s *testSuite4) TestNotNullDefault(c *C) { tk.MustExec("alter table t2 change column a a int not null default null default 1;") } -func (s *testBypassSuite) TestLatch(c *C) { +func TestLatch(t *testing.T) { store, err := mockstore.NewMockStore( // Small latch slot size to make conflicts. mockstore.WithTxnLocalLatches(64), ) - c.Assert(err, IsNil) + require.NoError(t, err) defer func() { err := store.Close() - c.Assert(err, IsNil) + require.NoError(t, err) }() dom, err1 := session.BootstrapSession(store) - c.Assert(err1, IsNil) + require.Nil(t, err1) defer dom.Close() - tk1 := testkit.NewTestKit(c, store) + tk1 := testkit.NewTestKit(t, store) tk1.MustExec("use test") tk1.MustExec("drop table if exists t") tk1.MustExec("create table t (id int)") tk1.MustExec("set @@tidb_disable_txn_auto_retry = true") - tk2 := testkit.NewTestKit(c, store) + tk2 := testkit.NewTestKit(t, store) tk2.MustExec("use test") tk1.MustExec("set @@tidb_disable_txn_auto_retry = true") @@ -2496,7 +2307,7 @@ func (s *testBypassSuite) TestLatch(c *C) { tk1.MustExec("update t set id = id + 1") tk2.MustExec("update t set id = id + 1") _, err = tk1.Exec("commit") - c.Assert(kv.ErrWriteConflictInTiDB.Equal(err), IsTrue) + require.True(t, kv.ErrWriteConflictInTiDB.Equal(err)) tk1.MustExec("set @@tidb_disable_txn_auto_retry = 0") tk1.MustExec("update t set id = id + 1") @@ -2505,8 +2316,10 @@ func (s *testBypassSuite) TestLatch(c *C) { } // TestIssue4067 Test issue https://github.com/pingcap/tidb/issues/4067 -func (s *testSuite7) TestIssue4067(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue4067(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t1, t2") tk.MustExec("create table t1(id int)") @@ -2519,8 +2332,10 @@ func (s *testSuite7) TestIssue4067(c *C) { tk.MustQuery("select * from t1").Check(nil) } -func (s *testSuite7) TestInsertCalculatedValue(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestInsertCalculatedValue(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") @@ -2603,8 +2418,13 @@ func (s *testSuite7) TestInsertCalculatedValue(c *C) { tk.MustExec("drop table if exists t") tk.MustExec("create table t (a json not null, b int)") + // TODO: MySQL reports 3156 instead of ErrTruncatedWrongValueForField. + tk.MustGetErrCode("insert into t value (a,a->'$')", mysql.ErrTruncatedWrongValueForField) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a json not null, b varchar(10))") tk.MustExec("insert into t value (a,a->'$')") - tk.MustQuery("select * from t").Check(testkit.Rows("null 0")) + tk.MustQuery("select * from t").Check(testkit.Rows("null null")) tk.MustExec("drop table if exists t") tk.MustExec("create table t(a json, b int, c int as (a->'$.a'))") @@ -2635,44 +2455,50 @@ func (s *testSuite7) TestInsertCalculatedValue(c *C) { tk.MustQuery("select * from t").Check(testkit.Rows("4 0 2")) } -func (s *testSuite7) TestDataTooLongErrMsg(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestDataTooLongErrMsg(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("create table t(a varchar(2));") _, err := tk.Exec("insert into t values('123');") - c.Assert(types.ErrDataTooLong.Equal(err), IsTrue) - c.Assert(err.Error(), Equals, "[types:1406]Data too long for column 'a' at row 1") + require.True(t, types.ErrDataTooLong.Equal(err)) + require.EqualError(t, err, "[types:1406]Data too long for column 'a' at row 1") tk.MustExec("insert into t values('12')") _, err = tk.Exec("update t set a = '123' where a = '12';") - c.Assert(types.ErrDataTooLong.Equal(err), IsTrue) - c.Assert(err.Error(), Equals, "[types:1406]Data too long for column 'a' at row 1") + require.True(t, types.ErrDataTooLong.Equal(err)) + require.EqualError(t, err, "[types:1406]Data too long for column 'a' at row 1") } -func (s *testSuite7) TestUpdateSelect(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestUpdateSelect(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("create table msg (id varchar(8), b int, status int, primary key (id, b))") tk.MustExec("insert msg values ('abc', 1, 1)") tk.MustExec("create table detail (id varchar(8), start varchar(8), status int, index idx_start(start))") tk.MustExec("insert detail values ('abc', '123', 2)") tk.MustExec("UPDATE msg SET msg.status = (SELECT detail.status FROM detail WHERE msg.id = detail.id)") - tk.CheckLastMessage("Rows matched: 1 Changed: 1 Warnings: 0") + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 1 Changed: 1 Warnings: 0") tk.MustExec("admin check table msg") } -func (s *testSuite7) TestUpdateDelete(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestUpdateDelete(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("CREATE TABLE ttt (id bigint(20) NOT NULL, host varchar(30) NOT NULL, PRIMARY KEY (id), UNIQUE KEY i_host (host));") tk.MustExec("insert into ttt values (8,8),(9,9);") tk.MustExec("begin") tk.MustExec("update ttt set id = 0, host='9' where id = 9 limit 1;") - tk.CheckLastMessage("Rows matched: 1 Changed: 1 Warnings: 0") + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 1 Changed: 1 Warnings: 0") tk.MustExec("delete from ttt where id = 0 limit 1;") tk.MustQuery("select * from ttt use index (i_host) order by host;").Check(testkit.Rows("8 8")) tk.MustExec("update ttt set id = 0, host='8' where id = 8 limit 1;") - tk.CheckLastMessage("Rows matched: 1 Changed: 1 Warnings: 0") + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 1 Changed: 1 Warnings: 0") tk.MustExec("delete from ttt where id = 0 limit 1;") tk.MustQuery("select * from ttt use index (i_host) order by host;").Check(testkit.Rows()) tk.MustExec("commit") @@ -2680,78 +2506,82 @@ func (s *testSuite7) TestUpdateDelete(c *C) { tk.MustExec("drop table ttt") } -func (s *testSuite7) TestUpdateAffectRowCnt(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestUpdateAffectRowCnt(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("create table a(id int auto_increment, a int default null, primary key(id))") tk.MustExec("insert into a values (1, 1001), (2, 1001), (10001, 1), (3, 1)") tk.MustExec("update a set id = id*10 where a = 1001") - ctx := tk.Se.(sessionctx.Context) - c.Assert(ctx.GetSessionVars().StmtCtx.AffectedRows(), Equals, uint64(2)) - tk.CheckLastMessage("Rows matched: 2 Changed: 2 Warnings: 0") + ctx := tk.Session().(sessionctx.Context) + require.Equal(t, uint64(2), ctx.GetSessionVars().StmtCtx.AffectedRows()) + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 2 Changed: 2 Warnings: 0") tk.MustExec("drop table a") tk.MustExec("create table a ( a bigint, b bigint)") tk.MustExec("insert into a values (1, 1001), (2, 1001), (10001, 1), (3, 1)") tk.MustExec("update a set a = a*10 where b = 1001") - ctx = tk.Se.(sessionctx.Context) - c.Assert(ctx.GetSessionVars().StmtCtx.AffectedRows(), Equals, uint64(2)) - tk.CheckLastMessage("Rows matched: 2 Changed: 2 Warnings: 0") + ctx = tk.Session().(sessionctx.Context) + require.Equal(t, uint64(2), ctx.GetSessionVars().StmtCtx.AffectedRows()) + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 2 Changed: 2 Warnings: 0") } -func (s *testSuite7) TestReplaceLog(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestReplaceLog(t *testing.T) { + store, domain, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec(`create table testLog (a int not null primary key, b int unique key);`) // Make some dangling index. - s.ctx = mock.NewContext() - s.ctx.Store = s.store - is := s.domain.InfoSchema() + ctx := mock.NewContext() + ctx.Store = store + is := domain.InfoSchema() dbName := model.NewCIStr("test") tblName := model.NewCIStr("testLog") tbl, err := is.TableByName(dbName, tblName) - c.Assert(err, IsNil) + require.NoError(t, err) tblInfo := tbl.Meta() idxInfo := tblInfo.FindIndexByName("b") indexOpr := tables.NewIndex(tblInfo.ID, tblInfo, idxInfo) - txn, err := s.store.Begin() - c.Assert(err, IsNil) - _, err = indexOpr.Create(s.ctx, txn, types.MakeDatums(1), kv.IntHandle(1), nil) - c.Assert(err, IsNil) + txn, err := store.Begin() + require.NoError(t, err) + _, err = indexOpr.Create(ctx, txn, types.MakeDatums(1), kv.IntHandle(1), nil) + require.NoError(t, err) err = txn.Commit(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) _, err = tk.Exec(`replace into testLog values (0, 0), (1, 1);`) - c.Assert(err, NotNil) - expErr := errors.New(`can not be duplicated row, due to old row not found. handle 1 not found`) - c.Assert(expErr.Error() == err.Error(), IsTrue, Commentf("obtained error: (%s)\nexpected error: (%s)", err.Error(), expErr.Error())) - + require.Error(t, err) + require.EqualError(t, err, `can not be duplicated row, due to old row not found. handle 1 not found`) tk.MustQuery(`admin cleanup index testLog b;`).Check(testkit.Rows("1")) } // TestRebaseIfNeeded is for issue 7422. // There is no need to do the rebase when updating a record if the auto-increment ID not changed. // This could make the auto ID increasing speed slower. -func (s *testSuite7) TestRebaseIfNeeded(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestRebaseIfNeeded(t *testing.T) { + store, domain, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec(`create table t (a int not null primary key auto_increment, b int unique key);`) tk.MustExec(`insert into t (b) values (1);`) - s.ctx = mock.NewContext() - s.ctx.Store = s.store - tbl, err := s.domain.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) - c.Assert(s.ctx.NewTxn(context.Background()), IsNil) + ctx := mock.NewContext() + ctx.Store = store + tbl, err := domain.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + require.Nil(t, ctx.NewTxn(context.Background())) // AddRecord directly here will skip to rebase the auto ID in the insert statement, // which could simulate another TiDB adds a large auto ID. - _, err = tbl.AddRecord(s.ctx, types.MakeDatums(30001, 2)) - c.Assert(err, IsNil) - txn, err := s.ctx.Txn(true) - c.Assert(err, IsNil) - c.Assert(txn.Commit(context.Background()), IsNil) + _, err = tbl.AddRecord(ctx, types.MakeDatums(30001, 2)) + require.NoError(t, err) + txn, err := ctx.Txn(true) + require.NoError(t, err) + require.Nil(t, txn.Commit(context.Background())) tk.MustExec(`update t set b = 3 where a = 30001;`) tk.MustExec(`insert into t (b) values (4);`) @@ -2766,8 +2596,10 @@ func (s *testSuite7) TestRebaseIfNeeded(c *C) { tk.MustQuery(`select a from t where b = 6;`).Check(testkit.Rows("30003")) } -func (s *testSuite7) TestDeferConstraintCheckForDelete(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestDeferConstraintCheckForDelete(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("set tidb_constraint_check_in_place = 0") tk.MustExec("set @@tidb_txn_mode = 'optimistic'") tk.MustExec("use test") @@ -2779,7 +2611,7 @@ func (s *testSuite7) TestDeferConstraintCheckForDelete(c *C) { tk.MustExec("insert into t1 values(1, 3)") tk.MustExec("delete from t1 where j = 3") _, err := tk.Exec("commit") - c.Assert(err.Error(), Equals, "previous statement: delete from t1 where j = 3: [kv:1062]Duplicate entry '1' for key 'PRIMARY'") + require.EqualError(t, err, "previous statement: delete from t1 where j = 3: [kv:1062]Duplicate entry '1' for key 'PRIMARY'") tk.MustExec("rollback") tk.MustExec("create table t2(i int, j int, unique index idx(i))") @@ -2788,7 +2620,7 @@ func (s *testSuite7) TestDeferConstraintCheckForDelete(c *C) { tk.MustExec("insert into t2 values(1, 3)") tk.MustExec("delete from t2 where j = 3") _, err = tk.Exec("commit") - c.Assert(err.Error(), Equals, "previous statement: delete from t2 where j = 3: [kv:1062]Duplicate entry '1' for key 'idx'") + require.EqualError(t, err, "previous statement: delete from t2 where j = 3: [kv:1062]Duplicate entry '1' for key 'idx'") tk.MustExec("admin check table t2") tk.MustExec("create table t3(i int, j int, primary key(i))") @@ -2816,21 +2648,23 @@ func (s *testSuite7) TestDeferConstraintCheckForDelete(c *C) { tk.MustQuery("select * from t5").Check(testkit.Rows("1 4")) } -func (s *testSuite7) TestDeferConstraintCheckForInsert(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestDeferConstraintCheckForInsert(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec(`use test`) tk.MustExec(`drop table if exists t;create table t (a int primary key, b int);`) tk.MustExec(`insert into t values (1,2),(2,2)`) _, err := tk.Exec("update t set a=a+1 where b=2") - c.Assert(err, NotNil) + require.Error(t, err) 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) + require.Error(t, err) tk.MustExec(`update t set i = 2 where i = 1;`) tk.MustExec(`commit;`) tk.MustQuery(`select * from t;`).Check(testkit.Rows("2")) @@ -2839,9 +2673,9 @@ func (s *testSuite7) TestDeferConstraintCheckForInsert(c *C) { tk.MustExec("replace into t values (1),(2)") tk.MustExec("begin") _, err = tk.Exec("update t set i = 2 where i = 1") - c.Assert(err, NotNil) + require.Error(t, err) _, err = tk.Exec("insert into t values (1) on duplicate key update i = i + 1") - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("rollback") tk.MustExec(`drop table t; create table t (id int primary key, v int unique);`) @@ -2850,16 +2684,16 @@ func (s *testSuite7) TestDeferConstraintCheckForInsert(c *C) { tk.MustExec(`set @@autocommit = 0;`) _, err = tk.Exec("insert into t values (3, 1)") - c.Assert(err, NotNil) + require.Error(t, err) _, err = tk.Exec("insert into t values (1, 3)") - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("commit") tk.MustExec(`set tidb_constraint_check_in_place = 0;`) tk.MustExec("insert into t values (3, 1)") tk.MustExec("insert into t values (1, 3)") _, err = tk.Exec("commit") - c.Assert(err, NotNil) + require.Error(t, err) // Cover the temporary table. for val := range []int{0, 1} { @@ -2870,12 +2704,12 @@ func (s *testSuite7) TestDeferConstraintCheckForInsert(c *C) { tk.MustExec("begin") tk.MustExec("insert into t values (1, 1)") _, err = tk.Exec(`insert into t values (1, 3)`) - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("insert into t values (2, 2)") _, err = tk.Exec("update t set a = a + 1 where a = 1") - c.Assert(err, NotNil) + require.Error(t, err) _, err = tk.Exec("insert into t values (1, 3) on duplicated key update a = a + 1") - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("commit") tk.MustExec("drop table t") @@ -2883,12 +2717,12 @@ func (s *testSuite7) TestDeferConstraintCheckForInsert(c *C) { tk.MustExec("begin") tk.MustExec("insert into t values (1, 1)") _, err = tk.Exec(`insert into t values (3, 1)`) - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("insert into t values (2, 2)") _, err = tk.Exec("update t set b = b + 1 where a = 1") - c.Assert(err, NotNil) + require.Error(t, err) _, err = tk.Exec("insert into t values (3, 1) on duplicated key update b = b + 1") - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("commit") // cases for temporary table @@ -2897,22 +2731,22 @@ func (s *testSuite7) TestDeferConstraintCheckForInsert(c *C) { tk.MustExec("begin") tk.MustExec("insert into tl values (1, 1)") _, err = tk.Exec(`insert into tl values (1, 3)`) - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("insert into tl values (2, 2)") _, err = tk.Exec("update tl set a = a + 1 where a = 1") - c.Assert(err, NotNil) + require.Error(t, err) _, err = tk.Exec("insert into tl values (1, 3) on duplicated key update a = a + 1") - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("commit") tk.MustExec("begin") tk.MustQuery("select * from tl").Check(testkit.Rows("1 1", "2 2")) _, err = tk.Exec(`insert into tl values (1, 3)`) - c.Assert(err, NotNil) + require.Error(t, err) _, err = tk.Exec("update tl set a = a + 1 where a = 1") - c.Assert(err, NotNil) + require.Error(t, err) _, err = tk.Exec("insert into tl values (1, 3) on duplicated key update a = a + 1") - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("rollback") tk.MustExec("drop table tl") @@ -2920,29 +2754,34 @@ func (s *testSuite7) TestDeferConstraintCheckForInsert(c *C) { tk.MustExec("begin") tk.MustExec("insert into tl values (1, 1)") _, err = tk.Exec(`insert into tl values (3, 1)`) - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("insert into tl values (2, 2)") _, err = tk.Exec("update tl set b = b + 1 where a = 1") - c.Assert(err, NotNil) + require.Error(t, err) _, err = tk.Exec("insert into tl values (3, 1) on duplicated key update b = b + 1") - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("commit") tk.MustExec("begin") tk.MustQuery("select * from tl").Check(testkit.Rows("1 1", "2 2")) _, err = tk.Exec(`insert into tl values (3, 1)`) - c.Assert(err, NotNil) + require.Error(t, err) _, err = tk.Exec("update tl set b = b + 1 where a = 1") - c.Assert(err, NotNil) + require.Error(t, err) _, err = tk.Exec("insert into tl values (3, 1) on duplicated key update b = b + 1") - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec("rollback") } } -func (s *testSuite7) TestPessimisticDeleteYourWrites(c *C) { - session1 := testkit.NewTestKitWithInit(c, s.store) - session2 := testkit.NewTestKitWithInit(c, s.store) +func TestPessimisticDeleteYourWrites(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + session1 := testkit.NewTestKit(t, store) + session1.MustExec("use test") + session2 := testkit.NewTestKit(t, store) + session2.MustExec("use test") session1.MustExec("drop table if exists x;") session1.MustExec("create table x (id int primary key, c int);") @@ -2954,37 +2793,42 @@ func (s *testSuite7) TestPessimisticDeleteYourWrites(c *C) { session1.MustExec("insert into x select 1, 1") session1.MustExec("delete from x where id = 1") session2.MustExec("begin;") - var wg sync.WaitGroup - wg.Add(1) - go func() { + var wg util.WaitGroupWrapper + wg.Run(func() { session2.MustExec("insert into x select 1, 2") - wg.Done() - }() + }) session1.MustExec("commit;") wg.Wait() session2.MustExec("commit;") session2.MustQuery("select * from x").Check(testkit.Rows("1 2")) } -func (s *testSuite7) TestDefEnumInsert(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestDefEnumInsert(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("create table test (id int, prescription_type enum('a','b','c','d','e','f') NOT NULL, primary key(id));") tk.MustExec("insert into test (id) values (1)") tk.MustQuery("select prescription_type from test").Check(testkit.Rows("a")) } -func (s *testSuite7) TestIssue11059(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestIssue11059(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec("create table t (pk int primary key, uk int unique, v int)") tk.MustExec("insert into t values (2, 11, 215)") tk.MustExec("insert into t values (3, 7, 2111)") _, err := tk.Exec("update t set pk = 2 where uk = 7") - c.Assert(err, NotNil) + require.Error(t, err) } -func (s *testSuite7) TestSetWithRefGenCol(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestSetWithRefGenCol(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec(`create table t (i int, j int as (i+1) not null);`) tk.MustExec(`insert into t set i = j + 1;`) @@ -3015,7 +2859,7 @@ func (s *testSuite7) TestSetWithRefGenCol(c *C) { tk.MustExec(`insert into t2 set i = j + 9`) tk.MustQuery("select * from t2").Check(testkit.Rows("10 9")) _, err := tk.Exec(`insert into t2 set j = i + 1`) - c.Assert(err, NotNil) + require.Error(t, err) tk.MustExec(`insert into t2 set i = j + 100`) tk.MustQuery("select * from t2").Check(testkit.Rows("10 9", "101 100")) @@ -3023,11 +2867,13 @@ func (s *testSuite7) TestSetWithRefGenCol(c *C) { tk.MustExec(`insert into t3 set i = j + 100`) tk.MustQuery("select * from t3").Check(testkit.Rows("<nil> <nil>")) _, err = tk.Exec(`insert into t3 set j = i + 1`) - c.Assert(err, NotNil) + require.Error(t, err) } -func (s *testSuite7) TestSetWithCurrentTimestampAndNow(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestSetWithCurrentTimestampAndNow(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec(`drop table if exists tbl;`) tk.MustExec(`create table t1(c1 timestamp default current_timestamp, c2 int, c3 timestamp default current_timestamp);`) @@ -3038,8 +2884,10 @@ func (s *testSuite7) TestSetWithCurrentTimestampAndNow(c *C) { tk.MustQuery("select c1 = c3 from t1").Check(testkit.Rows("1", "1")) } -func (s *testSuite7) TestApplyWithPointAndBatchPointGet(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestApplyWithPointAndBatchPointGet(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec(`drop table if exists t;`) tk.MustExec(`create table t ( c_int int, c_str varchar(40),c_datetime datetime, c_timestamp timestamp, @@ -3079,8 +2927,10 @@ from t order by c_str;`).Check(testkit.Rows("10")) from t order by c_str;`).Check(testkit.Rows("10")) } -func (s *testSuite4) TestWriteListPartitionTable(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestWriteListPartitionTable(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("set @@session.tidb_enable_list_partition = ON") tk.MustExec("drop table if exists t") @@ -3110,9 +2960,9 @@ func (s *testSuite4) TestWriteListPartitionTable(c *C) { // Test insert error tk.MustExec("insert into t values (1, 'a')") _, err := tk.Exec("insert into t values (1, 'd')") - c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '1' for key 'idx'") + require.EqualError(t, err, "[kv:1062]Duplicate entry '1' for key 'idx'") _, err = tk.Exec("insert into t values (100, 'd')") - c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value 100") + require.EqualError(t, err, "[table:1526]Table has no partition for value 100") tk.MustExec("admin check table t;") // Test select partition @@ -3127,8 +2977,10 @@ func (s *testSuite4) TestWriteListPartitionTable(c *C) { tk.MustQuery("select * from t order by id").Check(testkit.Rows("1 a", "2 b")) } -func (s *testSuite4) TestWriteListColumnsPartitionTable(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestWriteListColumnsPartitionTable(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("set @@session.tidb_enable_list_partition = ON") tk.MustExec("drop table if exists t") @@ -3158,9 +3010,9 @@ func (s *testSuite4) TestWriteListColumnsPartitionTable(c *C) { // Test insert error tk.MustExec("insert into t values (1, 'a')") _, err := tk.Exec("insert into t values (1, 'd')") - c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '1' for key 'idx'") + require.EqualError(t, err, "[kv:1062]Duplicate entry '1' for key 'idx'") _, err = tk.Exec("insert into t values (100, 'd')") - c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value from column_list") + require.EqualError(t, err, "[table:1526]Table has no partition for value from column_list") tk.MustExec("admin check table t;") // Test select partition @@ -3176,8 +3028,10 @@ func (s *testSuite4) TestWriteListColumnsPartitionTable(c *C) { } // TestWriteListPartitionTable1 test for write list partition when the partition expression is simple. -func (s *testSuite4) TestWriteListPartitionTable1(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestWriteListPartitionTable1(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("set @@session.tidb_enable_list_partition = ON") tk.MustExec("drop table if exists t") @@ -3191,7 +3045,7 @@ func (s *testSuite4) TestWriteListPartitionTable1(c *C) { // Test add unique index failed. tk.MustExec("insert into t values (1, 'a'),(1,'b')") _, err := tk.Exec("alter table t add unique index idx (id)") - c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '1' for key 'idx'") + require.EqualError(t, err, "[kv:1062]Duplicate entry '1' for key 'idx'") // Test add unique index success. tk.MustExec("delete from t where name='b'") tk.MustExec("alter table t add unique index idx (id)") @@ -3216,7 +3070,7 @@ func (s *testSuite4) TestWriteListPartitionTable1(c *C) { tk.MustQuery("select * from t partition(p3) order by id").Check(testkit.Rows()) // Test insert on duplicate error _, err = tk.Exec("insert into t values (3, 'a'), (11,'x') on duplicate key update id=id+1") - c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '4' for key 'idx'") + require.EqualError(t, err, "[kv:1062]Duplicate entry '4' for key 'idx'") tk.MustQuery("select * from t order by id").Check(testkit.Rows("1 x", "3 x", "4 e", "5 g")) // Test insert ignore with duplicate tk.MustExec("insert ignore into t values (1, 'b'), (5,'a'),(null,'y')") @@ -3231,7 +3085,7 @@ func (s *testSuite4) TestWriteListPartitionTable1(c *C) { tk.MustQuery("select * from t partition(p3) order by id").Check(testkit.Rows("<nil> y", "15 a")) // Test insert meet no partition error. _, err = tk.Exec("insert into t values (100, 'd')") - c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value 100") + require.EqualError(t, err, "[table:1526]Table has no partition for value 100") // --------------------------Test update--------------------------- // Test update 1 partition. @@ -3245,7 +3099,7 @@ func (s *testSuite4) TestWriteListPartitionTable1(c *C) { tk.MustQuery("select * from t order by id").Check(testkit.Rows("1 y", "2 y", "3 c")) // Test update meet duplicate error. _, err = tk.Exec("update t set id=2 where id = 1") - c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '2' for key 'idx'") + require.EqualError(t, err, "[kv:1062]Duplicate entry '2' for key 'idx'") tk.MustQuery("select * from t order by id").Check(testkit.Rows("1 y", "2 y", "3 c")) // Test update multi-partitions @@ -3257,11 +3111,11 @@ func (s *testSuite4) TestWriteListPartitionTable1(c *C) { tk.MustQuery("select * from t order by id").Check(testkit.Rows("3 a", "10 a", "20 a")) // Test update meet duplicate error. _, err = tk.Exec("update t set id=id+17 where id in (3,10)") - c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '20' for key 'idx'") + require.EqualError(t, err, "[kv:1062]Duplicate entry '20' for key 'idx'") tk.MustQuery("select * from t order by id").Check(testkit.Rows("3 a", "10 a", "20 a")) // Test update meet no partition error. _, err = tk.Exec("update t set id=id*2 where id in (3,20)") - c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value 40") + require.EqualError(t, err, "[table:1526]Table has no partition for value 40") tk.MustQuery("select * from t order by id").Check(testkit.Rows("3 a", "10 a", "20 a")) // --------------------------Test replace--------------------------- @@ -3280,7 +3134,7 @@ func (s *testSuite4) TestWriteListPartitionTable1(c *C) { tk.MustQuery("select * from t order by id").Check(testkit.Rows("1 x", "2 b", "3 c", "4 d", "7 x")) // Test replace meet no partition error. _, err = tk.Exec("replace into t values (10,'x'),(50,'x')") - c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value 50") + require.EqualError(t, err, "[table:1526]Table has no partition for value 50") tk.MustQuery("select * from t order by id").Check(testkit.Rows("1 x", "2 b", "3 c", "4 d", "7 x")) // --------------------------Test delete--------------------------- @@ -3301,8 +3155,10 @@ func (s *testSuite4) TestWriteListPartitionTable1(c *C) { } // TestWriteListPartitionTable2 test for write list partition when the partition expression is complicated and contain generated column. -func (s *testSuite4) TestWriteListPartitionTable2(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestWriteListPartitionTable2(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("set @@session.tidb_enable_list_partition = ON") tk.MustExec("drop table if exists t") @@ -3317,7 +3173,7 @@ func (s *testSuite4) TestWriteListPartitionTable2(c *C) { // Test add unique index failed. tk.MustExec("insert into t (id,name) values (1, 'a'),(1,'b')") _, err := tk.Exec("alter table t add unique index idx (id,b)") - c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '1-2' for key 'idx'") + require.EqualError(t, err, "[kv:1062]Duplicate entry '1-2' for key 'idx'") // Test add unique index success. tk.MustExec("delete from t where name='b'") tk.MustExec("alter table t add unique index idx (id,b)") @@ -3342,7 +3198,7 @@ func (s *testSuite4) TestWriteListPartitionTable2(c *C) { tk.MustQuery("select id,name from t partition(p3) order by id").Check(testkit.Rows()) // Test insert on duplicate error _, err = tk.Exec("insert into t (id,name) values (3, 'a'), (11,'x') on duplicate key update id=id+1") - c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '4-2' for key 'idx'") + require.EqualError(t, err, "[kv:1062]Duplicate entry '4-2' for key 'idx'") tk.MustQuery("select id,name from t order by id").Check(testkit.Rows("1 x", "3 x", "4 e", "5 g")) // Test insert ignore with duplicate tk.MustExec("insert ignore into t (id,name) values (1, 'b'), (5,'a'),(null,'y')") @@ -3357,7 +3213,7 @@ func (s *testSuite4) TestWriteListPartitionTable2(c *C) { tk.MustQuery("select id,name from t partition(p3) order by id").Check(testkit.Rows("<nil> y", "15 a")) // Test insert meet no partition error. _, err = tk.Exec("insert into t (id,name) values (100, 'd')") - c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value 100") + require.EqualError(t, err, "[table:1526]Table has no partition for value 100") // --------------------------Test update--------------------------- // Test update 1 partition. @@ -3371,7 +3227,7 @@ func (s *testSuite4) TestWriteListPartitionTable2(c *C) { tk.MustQuery("select id,name from t order by id").Check(testkit.Rows("1 y", "2 y", "3 c")) // Test update meet duplicate error. _, err = tk.Exec("update t set id=2 where id = 1") - c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '2-2' for key 'idx'") + require.EqualError(t, err, "[kv:1062]Duplicate entry '2-2' for key 'idx'") tk.MustQuery("select id,name from t order by id").Check(testkit.Rows("1 y", "2 y", "3 c")) // Test update multi-partitions @@ -3383,11 +3239,11 @@ func (s *testSuite4) TestWriteListPartitionTable2(c *C) { tk.MustQuery("select id,name from t order by id").Check(testkit.Rows("3 a", "10 a", "20 a")) // Test update meet duplicate error. _, err = tk.Exec("update t set id=id+17 where id in (3,10)") - c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '20-2' for key 'idx'") + require.EqualError(t, err, "[kv:1062]Duplicate entry '20-2' for key 'idx'") tk.MustQuery("select id,name from t order by id").Check(testkit.Rows("3 a", "10 a", "20 a")) // Test update meet no partition error. _, err = tk.Exec("update t set id=id*2 where id in (3,20)") - c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value 40") + require.EqualError(t, err, "[table:1526]Table has no partition for value 40") tk.MustQuery("select id,name from t order by id").Check(testkit.Rows("3 a", "10 a", "20 a")) // --------------------------Test replace--------------------------- @@ -3406,7 +3262,7 @@ func (s *testSuite4) TestWriteListPartitionTable2(c *C) { tk.MustQuery("select id,name from t order by id").Check(testkit.Rows("1 x", "2 b", "3 c", "4 d", "7 x")) // Test replace meet no partition error. _, err = tk.Exec("replace into t (id,name) values (10,'x'),(50,'x')") - c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value 50") + require.EqualError(t, err, "[table:1526]Table has no partition for value 50") tk.MustQuery("select id,name from t order by id").Check(testkit.Rows("1 x", "2 b", "3 c", "4 d", "7 x")) // --------------------------Test delete--------------------------- @@ -3426,8 +3282,10 @@ func (s *testSuite4) TestWriteListPartitionTable2(c *C) { tk.MustQuery("select id,name from t").Check(testkit.Rows()) } -func (s *testSuite4) TestWriteListColumnsPartitionTable1(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestWriteListColumnsPartitionTable1(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("set @@session.tidb_enable_list_partition = ON") @@ -3442,7 +3300,7 @@ func (s *testSuite4) TestWriteListColumnsPartitionTable1(c *C) { // Test add unique index failed. tk.MustExec("insert into t values (1, 'a'),(1,'b')") _, err := tk.Exec("alter table t add unique index idx (id)") - c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '1' for key 'idx'") + require.EqualError(t, err, "[kv:1062]Duplicate entry '1' for key 'idx'") // Test add unique index success. tk.MustExec("delete from t where name='b'") tk.MustExec("alter table t add unique index idx (id)") @@ -3467,7 +3325,7 @@ func (s *testSuite4) TestWriteListColumnsPartitionTable1(c *C) { tk.MustQuery("select * from t partition(p3) order by id").Check(testkit.Rows()) // Test insert on duplicate error _, err = tk.Exec("insert into t values (3, 'a'), (11,'x') on duplicate key update id=id+1") - c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '4' for key 'idx'") + require.EqualError(t, err, "[kv:1062]Duplicate entry '4' for key 'idx'") tk.MustQuery("select * from t order by id").Check(testkit.Rows("1 x", "3 x", "4 e", "5 g")) // Test insert ignore with duplicate tk.MustExec("insert ignore into t values (1, 'b'), (5,'a'),(null,'y')") @@ -3482,7 +3340,7 @@ func (s *testSuite4) TestWriteListColumnsPartitionTable1(c *C) { tk.MustQuery("select * from t partition(p3) order by id").Check(testkit.Rows("<nil> y", "15 a")) // Test insert meet no partition error. _, err = tk.Exec("insert into t values (100, 'd')") - c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value from column_list") + require.EqualError(t, err, "[table:1526]Table has no partition for value from column_list") // --------------------------Test update--------------------------- // Test update 1 partition. @@ -3496,7 +3354,7 @@ func (s *testSuite4) TestWriteListColumnsPartitionTable1(c *C) { tk.MustQuery("select * from t order by id").Check(testkit.Rows("1 y", "2 y", "3 c")) // Test update meet duplicate error. _, err = tk.Exec("update t set id=2 where id = 1") - c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '2' for key 'idx'") + require.EqualError(t, err, "[kv:1062]Duplicate entry '2' for key 'idx'") tk.MustQuery("select * from t order by id").Check(testkit.Rows("1 y", "2 y", "3 c")) // Test update multi-partitions @@ -3508,11 +3366,11 @@ func (s *testSuite4) TestWriteListColumnsPartitionTable1(c *C) { tk.MustQuery("select * from t order by id").Check(testkit.Rows("3 a", "10 a", "20 a")) // Test update meet duplicate error. _, err = tk.Exec("update t set id=id+17 where id in (3,10)") - c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '20' for key 'idx'") + require.EqualError(t, err, "[kv:1062]Duplicate entry '20' for key 'idx'") tk.MustQuery("select * from t order by id").Check(testkit.Rows("3 a", "10 a", "20 a")) // Test update meet no partition error. _, err = tk.Exec("update t set id=id*2 where id in (3,20)") - c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value from column_list") + require.EqualError(t, err, "[table:1526]Table has no partition for value from column_list") tk.MustQuery("select * from t order by id").Check(testkit.Rows("3 a", "10 a", "20 a")) // --------------------------Test replace--------------------------- @@ -3531,7 +3389,7 @@ func (s *testSuite4) TestWriteListColumnsPartitionTable1(c *C) { tk.MustQuery("select * from t order by id").Check(testkit.Rows("1 x", "2 b", "3 c", "4 d", "7 x")) // Test replace meet no partition error. _, err = tk.Exec("replace into t values (10,'x'),(100,'x')") - c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value from column_list") + require.EqualError(t, err, "[table:1526]Table has no partition for value from column_list") tk.MustQuery("select * from t order by id").Check(testkit.Rows("1 x", "2 b", "3 c", "4 d", "7 x")) // --------------------------Test delete--------------------------- @@ -3552,8 +3410,10 @@ func (s *testSuite4) TestWriteListColumnsPartitionTable1(c *C) { } // TestWriteListColumnsPartitionTable2 test for write list partition when the partition by multi-columns. -func (s *testSuite4) TestWriteListColumnsPartitionTable2(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestWriteListColumnsPartitionTable2(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("set @@session.tidb_enable_list_partition = ON") tk.MustExec("drop table if exists t") @@ -3567,7 +3427,7 @@ func (s *testSuite4) TestWriteListColumnsPartitionTable2(c *C) { // Test add unique index failed. tk.MustExec("insert into t values ('w', 1, 1),('w', 1, 2)") _, err := tk.Exec("alter table t add unique index idx (location,id)") - c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry 'w-1' for key 'idx'") + require.EqualError(t, err, "[kv:1062]Duplicate entry 'w-1' for key 'idx'") // Test add unique index success. tk.MustExec("delete from t where a=2") tk.MustExec("alter table t add unique index idx (location,id)") @@ -3594,7 +3454,7 @@ func (s *testSuite4) TestWriteListColumnsPartitionTable2(c *C) { // Test insert on duplicate error tk.MustExec("insert into t values ('w', 2, 2), ('w', 1, 1)") _, err = tk.Exec("insert into t values ('w', 2, 3) on duplicate key update id=1") - c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry 'w-1' for key 'idx'") + require.EqualError(t, err, "[kv:1062]Duplicate entry 'w-1' for key 'idx'") tk.MustQuery("select * from t partition(p_west) order by id").Check(testkit.Rows("w 1 1", "w 2 2")) // Test insert ignore with duplicate tk.MustExec("insert ignore into t values ('w', 2, 2), ('w', 3, 3), ('n', 10, 10)") @@ -3607,13 +3467,13 @@ func (s *testSuite4) TestWriteListColumnsPartitionTable2(c *C) { tk.MustQuery("select * from t partition(p_south) order by id").Check(testkit.Rows("s 13 2", "s 14 14")) // Test insert meet no partition error. _, err = tk.Exec("insert into t values ('w', 5, 5)") - c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value from column_list") + require.EqualError(t, err, "[table:1526]Table has no partition for value from column_list") _, err = tk.Exec("insert into t values ('s', 5, 5)") - c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value from column_list") + require.EqualError(t, err, "[table:1526]Table has no partition for value from column_list") _, err = tk.Exec("insert into t values ('s', 100, 5)") - c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value from column_list") + require.EqualError(t, err, "[table:1526]Table has no partition for value from column_list") _, err = tk.Exec("insert into t values ('x', 1, 5)") - c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value from column_list") + require.EqualError(t, err, "[table:1526]Table has no partition for value from column_list") // --------------------------Test update--------------------------- // Test update 1 partition. @@ -3631,7 +3491,7 @@ func (s *testSuite4) TestWriteListColumnsPartitionTable2(c *C) { tk.MustQuery("select * from t partition(p_west) order by id,a").Check(testkit.Rows("w 1 5", "w 2 5", "w 3 6")) // Test update meet duplicate error. _, err = tk.Exec("update t set id=id+1 where location='w' and id<2") - c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry 'w-2' for key 'idx'") + require.EqualError(t, err, "[kv:1062]Duplicate entry 'w-2' for key 'idx'") tk.MustQuery("select * from t partition(p_west) order by id,a").Check(testkit.Rows("w 1 5", "w 2 5", "w 3 6")) // Test update multi-partitions @@ -3649,11 +3509,11 @@ func (s *testSuite4) TestWriteListColumnsPartitionTable2(c *C) { tk.MustQuery("select * from t order by id").Check(testkit.Rows("w 1 4", "w 2 4", "e 8 9", "n 11 15")) // Test update meet duplicate error. _, err = tk.Exec("update t set id=id+1 where location='w' and id in (1,2)") - c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry 'w-2' for key 'idx'") + require.EqualError(t, err, "[kv:1062]Duplicate entry 'w-2' for key 'idx'") tk.MustQuery("select * from t order by id").Check(testkit.Rows("w 1 4", "w 2 4", "e 8 9", "n 11 15")) // Test update meet no partition error. _, err = tk.Exec("update t set id=id+3 where location='w' and id in (1,2)") - c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value from column_list") + require.EqualError(t, err, "[table:1526]Table has no partition for value from column_list") tk.MustQuery("select * from t order by id").Check(testkit.Rows("w 1 4", "w 2 4", "e 8 9", "n 11 15")) // Test update that move from partition 1 to partition 2. // TODO: fix this @@ -3674,13 +3534,13 @@ func (s *testSuite4) TestWriteListColumnsPartitionTable2(c *C) { tk.MustQuery("select * from t order by id").Check(testkit.Rows("w 1 2", "e 5 5", "n 9 9", "n 10 10")) // Test replace meet no partition error. _, err = tk.Exec("replace into t values ('w', 5, 5)") - c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value from column_list") + require.EqualError(t, err, "[table:1526]Table has no partition for value from column_list") _, err = tk.Exec("replace into t values ('s', 5, 5)") - c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value from column_list") + require.EqualError(t, err, "[table:1526]Table has no partition for value from column_list") _, err = tk.Exec("replace into t values ('s', 100, 5)") - c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value from column_list") + require.EqualError(t, err, "[table:1526]Table has no partition for value from column_list") _, err = tk.Exec("replace into t values ('x', 1, 5)") - c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value from column_list") + require.EqualError(t, err, "[table:1526]Table has no partition for value from column_list") // --------------------------Test delete--------------------------- // Test delete 1 partition. @@ -3701,18 +3561,22 @@ func (s *testSuite4) TestWriteListColumnsPartitionTable2(c *C) { } // TestWriteListColumnsPartitionTable2 test for write list partition when the partition by multi-columns. -func (s *testSuite4) TestWriteListPartitionTableIssue21437(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestWriteListPartitionTableIssue21437(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("set @@session.tidb_enable_list_partition = ON") tk.MustExec("drop table if exists t") tk.MustExec(`create table t (a int) partition by list (a%10) (partition p0 values in (0,1));`) _, err := tk.Exec("replace into t values (null)") - c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value NULL") + require.EqualError(t, err, "[table:1526]Table has no partition for value NULL") } -func (s *testSuite4) TestListPartitionWithAutoRandom(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestListPartitionWithAutoRandom(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("set @@session.tidb_enable_list_partition = ON") tk.MustExec("drop table if exists t") @@ -3734,8 +3598,10 @@ func (s *testSuite4) TestListPartitionWithAutoRandom(c *C) { tk.MustQuery("select b from t where a=1").Check(testkit.Rows("4")) } -func (s *testSuite4) TestListPartitionWithAutoIncrement(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestListPartitionWithAutoIncrement(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("set @@session.tidb_enable_list_partition = ON") tk.MustExec("drop table if exists t") @@ -3757,8 +3623,10 @@ func (s *testSuite4) TestListPartitionWithAutoIncrement(c *C) { tk.MustQuery("select b from t where a=1").Check(testkit.Rows("4")) } -func (s *testSuite4) TestListPartitionWithGeneratedColumn(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestListPartitionWithGeneratedColumn(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("set @@session.tidb_enable_list_partition = ON") // Test for generated column with bigint type. @@ -3795,15 +3663,17 @@ func (s *testSuite4) TestListPartitionWithGeneratedColumn(c *C) { // Test for insert meet no partition error _, err := tk.Exec("insert into t (a) values (11)") - c.Assert(table.ErrNoPartitionForGivenValue.Equal(err), IsTrue) + require.True(t, table.ErrNoPartitionForGivenValue.Equal(err)) // Test for update meet no partition error _, err = tk.Exec("update t set a=a+10 where a = 2") - c.Assert(table.ErrNoPartitionForGivenValue.Equal(err), IsTrue) + require.True(t, table.ErrNoPartitionForGivenValue.Equal(err)) } } -func (s *testSuite4) TestListPartitionWithGeneratedColumn1(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestListPartitionWithGeneratedColumn1(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("set @@session.tidb_enable_list_partition = ON") // Test for generated column with year type. @@ -3836,11 +3706,10 @@ func (s *testSuite4) TestListPartitionWithGeneratedColumn1(c *C) { // Test for insert meet no partition error _, err := tk.Exec("insert into t (a) values (11)") - c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value 2011") + require.EqualError(t, err, "[table:1526]Table has no partition for value 2011") // Test for update meet no partition error _, err = tk.Exec("update t set a=a+10 where a = 2") - c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value 2012") - + require.EqualError(t, err, "[table:1526]Table has no partition for value 2012") tk.MustExec("delete from t") // Test for insert @@ -3863,15 +3732,17 @@ func (s *testSuite4) TestListPartitionWithGeneratedColumn1(c *C) { // Test for insert meet no partition error _, err = tk.Exec("insert into t (a) values (2011)") - c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value 2011") + require.EqualError(t, err, "[table:1526]Table has no partition for value 2011") // Test for update meet no partition error _, err = tk.Exec("update t set a=a+10 where a = 2002") - c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value 2012") + require.EqualError(t, err, "[table:1526]Table has no partition for value 2012") } } -func (s *testSuite4) TestListPartitionWithGeneratedColumn2(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestListPartitionWithGeneratedColumn2(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("set @@session.tidb_enable_list_partition = ON") tableDefs := []string{ @@ -3912,8 +3783,10 @@ func (s *testSuite4) TestListPartitionWithGeneratedColumn2(c *C) { } } -func (s *testSuite4) TestListColumnsPartitionWithGeneratedColumn(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestListColumnsPartitionWithGeneratedColumn(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("set @@session.tidb_enable_list_partition = ON") // Test for generated column with substr expression. @@ -3936,8 +3809,345 @@ func (s *testSuite4) TestListColumnsPartitionWithGeneratedColumn(c *C) { } } -func (s *testSerialSuite2) TestListColumnsPartitionWithGlobalIndex(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestIssue22496(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t12") + tk.MustExec("create table t12(d decimal(15,2));") + _, err := tk.Exec("insert into t12 values('1,9999.00')") + require.Error(t, err) + tk.MustExec("set sql_mode=''") + tk.MustExec("insert into t12 values('1,999.00');") + tk.MustQuery("SELECT * FROM t12;").Check(testkit.Rows("1.00")) + tk.MustExec("drop table t12") +} + +func TestEqualDatumsAsBinary(t *testing.T) { + tests := []struct { + a []interface{} + b []interface{} + same bool + }{ + // Positive cases + {[]interface{}{1}, []interface{}{1}, true}, + {[]interface{}{1, "aa"}, []interface{}{1, "aa"}, true}, + {[]interface{}{1, "aa", 1}, []interface{}{1, "aa", 1}, true}, + + // negative cases + {[]interface{}{1}, []interface{}{2}, false}, + {[]interface{}{1, "a"}, []interface{}{1, "aaaaaa"}, false}, + {[]interface{}{1, "aa", 3}, []interface{}{1, "aa", 2}, false}, + + // Corner cases + {[]interface{}{}, []interface{}{}, true}, + {[]interface{}{nil}, []interface{}{nil}, true}, + {[]interface{}{}, []interface{}{1}, false}, + {[]interface{}{1}, []interface{}{1, 1}, false}, + {[]interface{}{nil}, []interface{}{1}, false}, + } + for _, tt := range tests { + testEqualDatumsAsBinary(t, tt.a, tt.b, tt.same) + } +} + +func TestIssue21232(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t, t1") + tk.MustExec("create table t(a varchar(1), index idx(a))") + tk.MustExec("create table t1(a varchar(5), index idx(a))") + tk.MustExec("insert into t values('a'), ('b')") + tk.MustExec("insert into t1 values('a'), ('bbbbb')") + tk.MustExec("update /*+ INL_JOIN(t) */ t, t1 set t.a='a' where t.a=t1.a") + tk.MustQuery("show warnings").Check(testkit.Rows()) + tk.MustQuery("select * from t").Check(testkit.Rows("a", "b")) + tk.MustExec("update /*+ INL_HASH_JOIN(t) */ t, t1 set t.a='a' where t.a=t1.a") + tk.MustQuery("show warnings").Check(testkit.Rows()) + tk.MustQuery("select * from t").Check(testkit.Rows("a", "b")) + tk.MustExec("update /*+ INL_MERGE_JOIN(t) */ t, t1 set t.a='a' where t.a=t1.a") + tk.MustQuery("show warnings").Check(testkit.Rows()) + tk.MustQuery("select * from t").Check(testkit.Rows("a", "b")) +} + +func testEqualDatumsAsBinary(t *testing.T, a []interface{}, b []interface{}, same bool) { + sc := new(stmtctx.StatementContext) + re := new(executor.ReplaceExec) + sc.IgnoreTruncate = true + res, err := re.EqualDatumsAsBinary(sc, types.MakeDatums(a...), types.MakeDatums(b...)) + require.NoError(t, err) + require.Equal(t, same, res, "a: %v, b: %v", a, b) +} + +func TestUpdate(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + fillData(tk, "update_test") + + updateStr := `UPDATE update_test SET name = "abc" where id > 0;` + tk.MustExec(updateStr) + tk.CheckExecResult(2, 0) + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 2 Changed: 2 Warnings: 0") + + // select data + tk.MustExec("begin") + r := tk.MustQuery(`SELECT * from update_test limit 2;`) + r.Check(testkit.Rows("1 abc", "2 abc")) + tk.MustExec("commit") + + tk.MustExec(`UPDATE update_test SET name = "foo"`) + tk.CheckExecResult(2, 0) + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 2 Changed: 2 Warnings: 0") + + // table option is auto-increment + tk.MustExec("begin") + tk.MustExec("drop table if exists update_test;") + tk.MustExec("commit") + tk.MustExec("begin") + tk.MustExec("create table update_test(id int not null auto_increment, name varchar(255), primary key(id))") + tk.MustExec("insert into update_test(name) values ('aa')") + tk.MustExec("update update_test set id = 8 where name = 'aa'") + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 1 Changed: 1 Warnings: 0") + tk.MustExec("insert into update_test(name) values ('bb')") + tk.MustExec("commit") + tk.MustExec("begin") + r = tk.MustQuery("select * from update_test;") + r.Check(testkit.Rows("8 aa", "9 bb")) + tk.MustExec("commit") + + tk.MustExec("begin") + tk.MustExec("drop table if exists update_test;") + tk.MustExec("commit") + tk.MustExec("begin") + tk.MustExec("create table update_test(id int not null auto_increment, name varchar(255), index(id))") + tk.MustExec("insert into update_test(name) values ('aa')") + _, err := tk.Exec("update update_test set id = null where name = 'aa'") + require.EqualError(t, err, "[table:1048]Column 'id' cannot be null") + + tk.MustExec("drop table update_test") + tk.MustExec("create table update_test(id int)") + tk.MustExec("begin") + tk.MustExec("insert into update_test(id) values (1)") + tk.MustExec("update update_test set id = 2 where id = 1 limit 1") + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 1 Changed: 1 Warnings: 0") + r = tk.MustQuery("select * from update_test;") + r.Check(testkit.Rows("2")) + tk.MustExec("commit") + + // Test that in a transaction, when a constraint failed in an update statement, the record is not inserted. + tk.MustExec("create table update_unique (id int primary key, name int unique)") + tk.MustExec("insert update_unique values (1, 1), (2, 2);") + tk.MustExec("begin") + _, err = tk.Exec("update update_unique set name = 1 where id = 2") + require.Error(t, err) + tk.MustExec("commit") + tk.MustQuery("select * from update_unique").Check(testkit.Rows("1 1", "2 2")) + + // test update ignore for pimary key + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a bigint, primary key (a));") + tk.MustExec("insert into t values (1)") + tk.MustExec("insert into t values (2)") + _, err = tk.Exec("update ignore t set a = 1 where a = 2;") + require.NoError(t, err) + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 1 Changed: 0 Warnings: 1") + r = tk.MustQuery("SHOW WARNINGS;") + r.Check(testkit.Rows("Warning 1062 Duplicate entry '1' for key 'PRIMARY'")) + tk.MustQuery("select * from t").Check(testkit.Rows("1", "2")) + + // test update ignore for truncate as warning + _, err = tk.Exec("update ignore t set a = 1 where a = (select '2a')") + require.NoError(t, err) + r = tk.MustQuery("SHOW WARNINGS;") + r.Check(testkit.Rows("Warning 1292 Truncated incorrect DOUBLE value: '2a'", "Warning 1292 Truncated incorrect DOUBLE value: '2a'", "Warning 1062 Duplicate entry '1' for key 'PRIMARY'")) + + tk.MustExec("update ignore t set a = 42 where a = 2;") + tk.MustQuery("select * from t").Check(testkit.Rows("1", "42")) + + // test update ignore for unique key + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a bigint, unique key I_uniq (a));") + tk.MustExec("insert into t values (1)") + tk.MustExec("insert into t values (2)") + _, err = tk.Exec("update ignore t set a = 1 where a = 2;") + require.NoError(t, err) + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 1 Changed: 0 Warnings: 1") + r = tk.MustQuery("SHOW WARNINGS;") + r.Check(testkit.Rows("Warning 1062 Duplicate entry '1' for key 'I_uniq'")) + tk.MustQuery("select * from t").Check(testkit.Rows("1", "2")) + + // test issue21965 + tk.MustExec("drop table if exists t;") + tk.MustExec("set @@session.tidb_enable_list_partition = ON") + tk.MustExec("create table t (a int) partition by list (a) (partition p0 values in (0,1));") + tk.MustExec("insert ignore into t values (1);") + tk.MustExec("update ignore t set a=2 where a=1;") + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 1 Changed: 0 Warnings: 0") + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int key) partition by list (a) (partition p0 values in (0,1));") + tk.MustExec("insert ignore into t values (1);") + tk.MustExec("update ignore t set a=2 where a=1;") + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 1 Changed: 0 Warnings: 0") + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(id integer auto_increment, t1 datetime, t2 datetime, primary key (id))") + tk.MustExec("insert into t(t1, t2) values('2000-10-01 01:01:01', '2017-01-01 10:10:10')") + tk.MustQuery("select * from t").Check(testkit.Rows("1 2000-10-01 01:01:01 2017-01-01 10:10:10")) + tk.MustExec("update t set t1 = '2017-10-01 10:10:11', t2 = date_add(t1, INTERVAL 10 MINUTE) where id = 1") + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 1 Changed: 1 Warnings: 0") + tk.MustQuery("select * from t").Check(testkit.Rows("1 2017-10-01 10:10:11 2000-10-01 01:11:01")) + + // for issue #5132 + tk.MustExec("CREATE TABLE `tt1` (" + + "`a` int(11) NOT NULL," + + "`b` varchar(32) DEFAULT NULL," + + "`c` varchar(32) DEFAULT NULL," + + "PRIMARY KEY (`a`)," + + "UNIQUE KEY `b_idx` (`b`)" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;") + tk.MustExec("insert into tt1 values(1, 'a', 'a');") + tk.MustExec("insert into tt1 values(2, 'd', 'b');") + r = tk.MustQuery("select * from tt1;") + r.Check(testkit.Rows("1 a a", "2 d b")) + tk.MustExec("update tt1 set a=5 where c='b';") + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 1 Changed: 1 Warnings: 0") + r = tk.MustQuery("select * from tt1;") + r.Check(testkit.Rows("1 a a", "5 d b")) + + // Automatic Updating for TIMESTAMP + tk.MustExec("CREATE TABLE `tsup` (" + + "`a` int," + + "`ts` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP," + + "KEY `idx` (`ts`)" + + ");") + tk.MustExec("set @orig_sql_mode=@@sql_mode; set @@sql_mode='';") + tk.MustExec("insert into tsup values(1, '0000-00-00 00:00:00');") + tk.MustExec("update tsup set a=5;") + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 1 Changed: 1 Warnings: 0") + r1 := tk.MustQuery("select ts from tsup use index (idx);") + r2 := tk.MustQuery("select ts from tsup;") + r1.Check(r2.Rows()) + tk.MustExec("update tsup set ts='2019-01-01';") + tk.MustQuery("select ts from tsup;").Check(testkit.Rows("2019-01-01 00:00:00")) + tk.MustExec("set @@sql_mode=@orig_sql_mode;") + + // issue 5532 + tk.MustExec("create table decimals (a decimal(20, 0) not null)") + tk.MustExec("insert into decimals values (201)") + // A warning rather than data truncated error. + tk.MustExec("update decimals set a = a + 1.23;") + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 1 Changed: 1 Warnings: 1") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1292 Truncated incorrect DECIMAL value: '202.23'")) + r = tk.MustQuery("select * from decimals") + r.Check(testkit.Rows("202")) + + tk.MustExec("drop table t") + tk.MustExec("CREATE TABLE `t` ( `c1` year DEFAULT NULL, `c2` year DEFAULT NULL, `c3` date DEFAULT NULL, `c4` datetime DEFAULT NULL, KEY `idx` (`c1`,`c2`))") + _, err = tk.Exec("UPDATE t SET c2=16777215 WHERE c1>= -8388608 AND c1 < -9 ORDER BY c1 LIMIT 2") + require.NoError(t, err) + + tk.MustGetErrCode("update (select * from t) t set c1 = 1111111", mysql.ErrNonUpdatableTable) + + // test update ignore for bad null error + tk.MustExec("drop table if exists t;") + tk.MustExec(`create table t (i int not null default 10)`) + tk.MustExec("insert into t values (1)") + tk.MustExec("update ignore t set i = null;") + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 1 Changed: 1 Warnings: 1") + r = tk.MustQuery("SHOW WARNINGS;") + r.Check(testkit.Rows("Warning 1048 Column 'i' cannot be null")) + tk.MustQuery("select * from t").Check(testkit.Rows("0")) + + // issue 7237, update subquery table should be forbidden + tk.MustExec("drop table t") + tk.MustExec("create table t (k int, v int)") + _, err = tk.Exec("update t, (select * from t) as b set b.k = t.k") + require.EqualError(t, err, "[planner:1288]The target table b of the UPDATE is not updatable") + tk.MustExec("update t, (select * from t) as b set t.k = b.k") + + // issue 8045 + tk.MustExec("drop table if exists t1") + tk.MustExec(`CREATE TABLE t1 (c1 float)`) + tk.MustExec("INSERT INTO t1 SET c1 = 1") + tk.MustExec("UPDATE t1 SET c1 = 1.2 WHERE c1=1;") + require.Equal(t, tk.Session().LastMessage(), "Rows matched: 1 Changed: 1 Warnings: 0") + + // issue 8119 + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (c1 float(1,1));") + tk.MustExec("insert into t values (0.0);") + _, err = tk.Exec("update t set c1 = 2.0;") + require.True(t, types.ErrWarnDataOutOfRange.Equal(err)) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a datetime not null, b datetime)") + tk.MustExec("insert into t value('1999-12-12', '1999-12-13')") + tk.MustExec("set @orig_sql_mode=@@sql_mode; set @@sql_mode='';") + tk.MustQuery("select * from t").Check(testkit.Rows("1999-12-12 00:00:00 1999-12-13 00:00:00")) + tk.MustExec("update t set a = ''") + tk.MustQuery("select * from t").Check(testkit.Rows("0000-00-00 00:00:00 1999-12-13 00:00:00")) + tk.MustExec("update t set b = ''") + tk.MustQuery("select * from t").Check(testkit.Rows("0000-00-00 00:00:00 0000-00-00 00:00:00")) + tk.MustExec("set @@sql_mode=@orig_sql_mode;") + + tk.MustExec("create view v as select * from t") + _, err = tk.Exec("update v set a = '2000-11-11'") + require.EqualError(t, err, core.ErrViewInvalid.GenWithStackByArgs("test", "v").Error()) + tk.MustExec("drop view v") + + tk.MustExec("create sequence seq") + tk.MustGetErrCode("update seq set minvalue=1", mysql.ErrBadField) + tk.MustExec("drop sequence seq") + + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("create table t1(a int, b int, c int, d int, e int, index idx(a))") + tk.MustExec("create table t2(a int, b int, c int)") + tk.MustExec("update t1 join t2 on t1.a=t2.a set t1.a=1 where t2.b=1 and t2.c=2") + + // Assign `DEFAULT` in `UPDATE` statement + tk.MustExec("drop table if exists t1, t2;") + tk.MustExec("create table t1 (a int default 1, b int default 2);") + tk.MustExec("insert into t1 values (10, 10), (20, 20);") + tk.MustExec("update t1 set a=default where b=10;") + tk.MustQuery("select * from t1;").Check(testkit.Rows("1 10", "20 20")) + tk.MustExec("update t1 set a=30, b=default where a=20;") + tk.MustQuery("select * from t1;").Check(testkit.Rows("1 10", "30 2")) + tk.MustExec("update t1 set a=default, b=default where a=30;") + tk.MustQuery("select * from t1;").Check(testkit.Rows("1 10", "1 2")) + tk.MustExec("insert into t1 values (40, 40)") + tk.MustExec("update t1 set a=default, b=default") + tk.MustQuery("select * from t1;").Check(testkit.Rows("1 2", "1 2", "1 2")) + tk.MustExec("update t1 set a=default(b), b=default(a)") + tk.MustQuery("select * from t1;").Check(testkit.Rows("2 1", "2 1", "2 1")) + // With generated columns + tk.MustExec("create table t2 (a int default 1, b int generated always as (-a) virtual, c int generated always as (-a) stored);") + tk.MustExec("insert into t2 values (10, default, default), (20, default, default)") + tk.MustExec("update t2 set b=default;") + tk.MustQuery("select * from t2;").Check(testkit.Rows("10 -10 -10", "20 -20 -20")) + tk.MustExec("update t2 set a=30, b=default where a=10;") + tk.MustQuery("select * from t2;").Check(testkit.Rows("30 -30 -30", "20 -20 -20")) + tk.MustExec("update t2 set c=default, a=40 where c=-20;") + tk.MustQuery("select * from t2;").Check(testkit.Rows("30 -30 -30", "40 -40 -40")) + tk.MustExec("update t2 set a=default, b=default, c=default where b=-30;") + tk.MustQuery("select * from t2;").Check(testkit.Rows("1 -1 -1", "40 -40 -40")) + tk.MustExec("update t2 set a=default(a), b=default, c=default;") + tk.MustQuery("select * from t2;").Check(testkit.Rows("1 -1 -1", "1 -1 -1")) + tk.MustGetErrCode("update t2 set b=default(a);", mysql.ErrBadGeneratedColumn) + tk.MustGetErrCode("update t2 set a=default(b), b=default(b);", mysql.ErrBadGeneratedColumn) + tk.MustGetErrCode("update t2 set a=default(a), c=default(c);", mysql.ErrBadGeneratedColumn) + tk.MustGetErrCode("update t2 set a=default(a), c=default(a);", mysql.ErrBadGeneratedColumn) + tk.MustExec("drop table t1, t2") +} + +func TestListColumnsPartitionWithGlobalIndex(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("set @@session.tidb_enable_list_partition = ON") // Test generated column with global index @@ -3968,7 +4178,7 @@ func (s *testSerialSuite2) TestListColumnsPartitionWithGlobalIndex(c *C) { tk.MustQuery("select * from t where a = 'bbb' order by a").Check(testkit.Rows("bbb b")) // Test insert meet duplicate error. _, err := tk.Exec("insert into t (a) values ('abc')") - c.Assert(err, NotNil) + require.Error(t, err) // Test insert on duplicate update tk.MustExec("insert into t (a) values ('abc') on duplicate key update a='bbc'") tk.MustQuery("select a from t order by a").Check(testkit.Rows("acd", "bbb", "bbc")) @@ -3979,11 +4189,13 @@ func (s *testSerialSuite2) TestListColumnsPartitionWithGlobalIndex(c *C) { } } -func (s *testSerialSuite) TestIssue20724(c *C) { +func TestIssue20724(t *testing.T) { collate.SetNewCollationEnabledForTest(true) defer collate.SetNewCollationEnabledForTest(false) - tk := testkit.NewTestKitWithInit(c, s.store) + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t1") tk.MustExec("create table t1(a varchar(10) collate utf8mb4_general_ci)") @@ -3993,14 +4205,16 @@ func (s *testSerialSuite) TestIssue20724(c *C) { tk.MustExec("drop table t1") } -func (s *testSerialSuite) TestIssue20840(c *C) { +func TestIssue20840(t *testing.T) { collate.SetNewCollationEnabledForTest(true) defer collate.SetNewCollationEnabledForTest(false) - tk := testkit.NewTestKitWithInit(c, s.store) + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t1") - tk.Se.GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeIntOnly + tk.Session().GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeIntOnly tk.MustExec("create table t1 (i varchar(20) unique key) collate=utf8mb4_general_ci") tk.MustExec("insert into t1 values ('a')") tk.MustExec("replace into t1 values ('A')") @@ -4008,11 +4222,13 @@ func (s *testSerialSuite) TestIssue20840(c *C) { tk.MustExec("drop table t1") } -func (s *testSerialSuite) TestIssueInsertPrefixIndexForNonUTF8Collation(c *C) { +func TestIssueInsertPrefixIndexForNonUTF8Collation(t *testing.T) { collate.SetNewCollationEnabledForTest(true) defer collate.SetNewCollationEnabledForTest(false) - tk := testkit.NewTestKitWithInit(c, s.store) + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t1, t2, t3") tk.MustExec("create table t1 ( c_int int, c_str varchar(40) character set ascii collate ascii_bin, primary key(c_int, c_str(8)) clustered , unique key(c_str))") @@ -4026,72 +4242,3 @@ func (s *testSerialSuite) TestIssueInsertPrefixIndexForNonUTF8Collation(c *C) { tk.MustExec("insert into t3 select 'abc '") tk.MustGetErrCode("insert into t3 select 'abc d'", 1062) } - -func (s *testSerialSuite) TestIssue22496(c *C) { - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t12") - tk.MustExec("create table t12(d decimal(15,2));") - _, err := tk.Exec("insert into t12 values('1,9999.00')") - c.Assert(err, NotNil) - tk.MustExec("set sql_mode=''") - tk.MustExec("insert into t12 values('1,999.00');") - tk.MustQuery("SELECT * FROM t12;").Check(testkit.Rows("1.00")) - tk.MustExec("drop table t12") -} - -func (s *testSuite) TestEqualDatumsAsBinary(c *C) { - tests := []struct { - a []interface{} - b []interface{} - same bool - }{ - // Positive cases - {[]interface{}{1}, []interface{}{1}, true}, - {[]interface{}{1, "aa"}, []interface{}{1, "aa"}, true}, - {[]interface{}{1, "aa", 1}, []interface{}{1, "aa", 1}, true}, - - // negative cases - {[]interface{}{1}, []interface{}{2}, false}, - {[]interface{}{1, "a"}, []interface{}{1, "aaaaaa"}, false}, - {[]interface{}{1, "aa", 3}, []interface{}{1, "aa", 2}, false}, - - // Corner cases - {[]interface{}{}, []interface{}{}, true}, - {[]interface{}{nil}, []interface{}{nil}, true}, - {[]interface{}{}, []interface{}{1}, false}, - {[]interface{}{1}, []interface{}{1, 1}, false}, - {[]interface{}{nil}, []interface{}{1}, false}, - } - for _, tt := range tests { - testEqualDatumsAsBinary(c, tt.a, tt.b, tt.same) - } -} - -func (s *testSuite) TestIssue21232(c *C) { - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t, t1") - tk.MustExec("create table t(a varchar(1), index idx(a))") - tk.MustExec("create table t1(a varchar(5), index idx(a))") - tk.MustExec("insert into t values('a'), ('b')") - tk.MustExec("insert into t1 values('a'), ('bbbbb')") - tk.MustExec("update /*+ INL_JOIN(t) */ t, t1 set t.a='a' where t.a=t1.a") - tk.MustQuery("show warnings").Check(testkit.Rows()) - tk.MustQuery("select * from t").Check(testkit.Rows("a", "b")) - tk.MustExec("update /*+ INL_HASH_JOIN(t) */ t, t1 set t.a='a' where t.a=t1.a") - tk.MustQuery("show warnings").Check(testkit.Rows()) - tk.MustQuery("select * from t").Check(testkit.Rows("a", "b")) - tk.MustExec("update /*+ INL_MERGE_JOIN(t) */ t, t1 set t.a='a' where t.a=t1.a") - tk.MustQuery("show warnings").Check(testkit.Rows()) - tk.MustQuery("select * from t").Check(testkit.Rows("a", "b")) -} - -func testEqualDatumsAsBinary(c *C, a []interface{}, b []interface{}, same bool) { - sc := new(stmtctx.StatementContext) - re := new(executor.ReplaceExec) - sc.IgnoreTruncate = true - res, err := re.EqualDatumsAsBinary(sc, types.MakeDatums(a...), types.MakeDatums(b...)) - c.Assert(err, IsNil) - c.Assert(res, Equals, same, Commentf("a: %v, b: %v", a, b)) -} diff --git a/expression/aggregation/agg_to_pb_test.go b/expression/aggregation/agg_to_pb_test.go index 3ab6b90e460ea..9aa886e2d70ea 100644 --- a/expression/aggregation/agg_to_pb_test.go +++ b/expression/aggregation/agg_to_pb_test.go @@ -36,7 +36,6 @@ func genColumn(tp byte, id int64) *expression.Column { } func TestAggFunc2Pb(t *testing.T) { - t.Parallel() ctx := mock.NewContext() client := new(mock.Client) diff --git a/expression/aggregation/aggregation.go b/expression/aggregation/aggregation.go index f8d90906e8fb5..84380552d7f71 100644 --- a/expression/aggregation/aggregation.go +++ b/expression/aggregation/aggregation.go @@ -22,9 +22,11 @@ import ( "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tipb/go-tipb" ) @@ -67,9 +69,9 @@ func NewDistAggFunc(expr *tipb.Expr, fieldTps []*types.FieldType, sc *stmtctx.St case tipb.ExprType_GroupConcat: return &concatFunction{aggFunction: newAggFunc(ast.AggFuncGroupConcat, args, false)}, nil case tipb.ExprType_Max: - return &maxMinFunction{aggFunction: newAggFunc(ast.AggFuncMax, args, false), isMax: true}, nil + return &maxMinFunction{aggFunction: newAggFunc(ast.AggFuncMax, args, false), isMax: true, ctor: collate.GetCollator(args[0].GetType().Collate)}, nil case tipb.ExprType_Min: - return &maxMinFunction{aggFunction: newAggFunc(ast.AggFuncMin, args, false)}, nil + return &maxMinFunction{aggFunction: newAggFunc(ast.AggFuncMin, args, false), ctor: collate.GetCollator(args[0].GetType().Collate)}, nil case tipb.ExprType_First: return &firstRowFunction{aggFunction: newAggFunc(ast.AggFuncFirstRow, args, false)}, nil case tipb.ExprType_Agg_BitOr: @@ -214,6 +216,11 @@ func CheckAggPushDown(aggFunc *AggFuncDesc, storeType kv.StoreType) bool { // CheckAggPushFlash checks whether an agg function can be pushed to flash storage. func CheckAggPushFlash(aggFunc *AggFuncDesc) bool { + for _, arg := range aggFunc.Args { + if arg.GetType().Tp == mysql.TypeDuration { + return false + } + } switch aggFunc.Name { case ast.AggFuncSum, ast.AggFuncCount, ast.AggFuncMin, ast.AggFuncMax, ast.AggFuncAvg, ast.AggFuncFirstRow, ast.AggFuncApproxCountDistinct, ast.AggFuncGroupConcat: return true diff --git a/expression/aggregation/aggregation_test.go b/expression/aggregation/aggregation_test.go index 8868c3d045ec5..9d32685af5a64 100644 --- a/expression/aggregation/aggregation_test.go +++ b/expression/aggregation/aggregation_test.go @@ -50,7 +50,6 @@ func createAggFuncSuite() (s *mockAggFuncSuite) { } func TestAvg(t *testing.T) { - t.Parallel() s := createAggFuncSuite() col := &expression.Column{ Index: 0, @@ -95,7 +94,6 @@ func TestAvg(t *testing.T) { } func TestAvgFinalMode(t *testing.T) { - t.Parallel() s := createAggFuncSuite() rows := make([][]types.Datum, 0, 100) for i := 1; i <= 100; i++ { @@ -126,7 +124,6 @@ func TestAvgFinalMode(t *testing.T) { } func TestSum(t *testing.T) { - t.Parallel() s := createAggFuncSuite() col := &expression.Column{ Index: 0, @@ -169,7 +166,6 @@ func TestSum(t *testing.T) { } func TestBitAnd(t *testing.T) { - t.Parallel() s := createAggFuncSuite() col := &expression.Column{ Index: 0, @@ -249,7 +245,6 @@ func TestBitAnd(t *testing.T) { } func TestBitOr(t *testing.T) { - t.Parallel() s := createAggFuncSuite() col := &expression.Column{ Index: 0, @@ -337,7 +332,6 @@ func TestBitOr(t *testing.T) { } func TestBitXor(t *testing.T) { - t.Parallel() s := createAggFuncSuite() col := &expression.Column{ Index: 0, @@ -417,7 +411,6 @@ func TestBitXor(t *testing.T) { } func TestCount(t *testing.T) { - t.Parallel() s := createAggFuncSuite() col := &expression.Column{ Index: 0, @@ -459,7 +452,6 @@ func TestCount(t *testing.T) { } func TestConcat(t *testing.T) { - t.Parallel() s := createAggFuncSuite() col := &expression.Column{ Index: 0, @@ -517,7 +509,6 @@ func TestConcat(t *testing.T) { } func TestFirstRow(t *testing.T) { - t.Parallel() s := createAggFuncSuite() col := &expression.Column{ Index: 0, @@ -546,7 +537,6 @@ func TestFirstRow(t *testing.T) { } func TestMaxMin(t *testing.T) { - t.Parallel() s := createAggFuncSuite() col := &expression.Column{ Index: 0, diff --git a/expression/aggregation/base_func.go b/expression/aggregation/base_func.go index d737ff2278a1d..1c639eeb4f14d 100644 --- a/expression/aggregation/base_func.go +++ b/expression/aggregation/base_func.go @@ -43,7 +43,7 @@ type baseFuncDesc struct { func newBaseFuncDesc(ctx sessionctx.Context, name string, args []expression.Expression) (baseFuncDesc, error) { b := baseFuncDesc{Name: strings.ToLower(name), Args: args} - err := b.typeInfer(ctx) + err := b.TypeInfer(ctx) return b, err } @@ -84,8 +84,8 @@ func (a *baseFuncDesc) String() string { return buffer.String() } -// typeInfer infers the arguments and return types of an function. -func (a *baseFuncDesc) typeInfer(ctx sessionctx.Context) error { +// TypeInfer infers the arguments and return types of an function. +func (a *baseFuncDesc) TypeInfer(ctx sessionctx.Context) error { switch a.Name { case ast.AggFuncCount: a.typeInfer4Count(ctx) @@ -207,6 +207,14 @@ func (a *baseFuncDesc) typeInfer4Sum(ctx sessionctx.Context) { types.SetBinChsClnFlag(a.RetTp) } +// TypeInfer4AvgSum infers the type of sum from avg, which should extend the precision of decimal +// compatible with mysql. +func (a *baseFuncDesc) TypeInfer4AvgSum(avgRetType *types.FieldType) { + if avgRetType.Tp == mysql.TypeNewDecimal { + a.RetTp.Flen = mathutil.Min(mysql.MaxDecimalWidth, a.RetTp.Flen+22) + } +} + // typeInfer4Avg should returns a "decimal", otherwise it returns a "double". // Because child returns integer or decimal type. func (a *baseFuncDesc) typeInfer4Avg(ctx sessionctx.Context) { @@ -246,6 +254,12 @@ func (a *baseFuncDesc) typeInfer4GroupConcat(ctx sessionctx.Context) { a.RetTp.Flen, a.RetTp.Decimal = mysql.MaxBlobWidth, 0 // TODO: a.Args[i] = expression.WrapWithCastAsString(ctx, a.Args[i]) + for i := 0; i < len(a.Args)-1; i++ { + if tp := a.Args[i].GetType(); tp.Tp == mysql.TypeNewDecimal { + a.Args[i] = expression.BuildCastFunction(ctx, a.Args[i], tp) + } + } + } func (a *baseFuncDesc) typeInfer4MaxMin(ctx sessionctx.Context) { @@ -370,18 +384,6 @@ var noNeedCastAggFuncs = map[string]struct{}{ ast.AggFuncJsonObjectAgg: {}, } -// WrapCastAsDecimalForAggArgs wraps the args of some specific aggregate functions -// with a cast as decimal function. See issue #19426 -func (a *baseFuncDesc) WrapCastAsDecimalForAggArgs(ctx sessionctx.Context) { - if a.Name == ast.AggFuncGroupConcat { - for i := 0; i < len(a.Args)-1; i++ { - if tp := a.Args[i].GetType(); tp.Tp == mysql.TypeNewDecimal { - a.Args[i] = expression.BuildCastFunction(ctx, a.Args[i], tp) - } - } - } -} - // WrapCastForAggArgs wraps the args of an aggregate function with a cast function. func (a *baseFuncDesc) WrapCastForAggArgs(ctx sessionctx.Context) { if len(a.Args) == 0 { diff --git a/expression/aggregation/descriptor.go b/expression/aggregation/descriptor.go index 1d5381f6c973d..30f020e7dfdf2 100644 --- a/expression/aggregation/descriptor.go +++ b/expression/aggregation/descriptor.go @@ -28,6 +28,7 @@ import ( "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/collate" ) // AggFuncDesc describes an aggregation function signature, only used in planner. @@ -230,9 +231,9 @@ func (a *AggFuncDesc) GetAggFunc(ctx sessionctx.Context) Aggregation { } return &concatFunction{aggFunction: aggFunc, maxLen: maxLen} case ast.AggFuncMax: - return &maxMinFunction{aggFunction: aggFunc, isMax: true} + return &maxMinFunction{aggFunction: aggFunc, isMax: true, ctor: collate.GetCollator(a.Args[0].GetType().Collate)} case ast.AggFuncMin: - return &maxMinFunction{aggFunction: aggFunc, isMax: false} + return &maxMinFunction{aggFunction: aggFunc, isMax: false, ctor: collate.GetCollator(a.Args[0].GetType().Collate)} case ast.AggFuncFirstRow: return &firstRowFunction{aggFunction: aggFunc} case ast.AggFuncBitOr: diff --git a/expression/aggregation/max_min.go b/expression/aggregation/max_min.go index be25c7160a188..10f312d275023 100644 --- a/expression/aggregation/max_min.go +++ b/expression/aggregation/max_min.go @@ -18,11 +18,13 @@ import ( "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/collate" ) type maxMinFunction struct { aggFunction isMax bool + ctor collate.Collator } // GetResult implements Aggregation interface. @@ -49,7 +51,7 @@ func (mmf *maxMinFunction) Update(evalCtx *AggEvaluateContext, sc *stmtctx.State return nil } var c int - c, err = evalCtx.Value.CompareDatum(sc, &value) + c, err = evalCtx.Value.Compare(sc, &value, mmf.ctor) if err != nil { return err } diff --git a/expression/aggregation/util_test.go b/expression/aggregation/util_test.go index 3b48271d51feb..3ac3720ffb714 100644 --- a/expression/aggregation/util_test.go +++ b/expression/aggregation/util_test.go @@ -24,7 +24,6 @@ import ( ) func TestDistinct(t *testing.T) { - t.Parallel() sc := &stmtctx.StatementContext{TimeZone: time.Local} dc := createDistinctChecker(sc) testCases := []struct { diff --git a/expression/bench_test.go b/expression/bench_test.go index c2e29765e0ccc..5bb0977841f1f 100644 --- a/expression/bench_test.go +++ b/expression/bench_test.go @@ -23,11 +23,11 @@ import ( "net" "reflect" "strings" + "sync" "testing" "time" "github.com/google/uuid" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/auth" "github.com/pingcap/tidb/parser/charset" @@ -41,6 +41,7 @@ import ( "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/math" "github.com/pingcap/tidb/util/mock" + "github.com/stretchr/testify/require" ) type benchHelper struct { @@ -218,8 +219,26 @@ type defaultRandGen struct { *rand.Rand } +type lockedSource struct { + lk sync.Mutex + src rand.Source +} + +func (r *lockedSource) Int63() (n int64) { + r.lk.Lock() + n = r.src.Int63() + r.lk.Unlock() + return +} + +func (r *lockedSource) Seed(seed int64) { + r.lk.Lock() + r.src.Seed(seed) + r.lk.Unlock() +} + func newDefaultRandGen() *defaultRandGen { - return &defaultRandGen{rand.New(rand.NewSource(int64(rand.Uint64())))} + return &defaultRandGen{rand.New(&lockedSource{src: rand.NewSource(int64(rand.Uint64()))})} } type defaultGener struct { @@ -1098,68 +1117,68 @@ func genVecExprBenchCase(ctx sessionctx.Context, funcName string, testCase vecEx // testVectorizedEvalOneVec is used to verify that the vectorized // expression is evaluated correctly during projection -func testVectorizedEvalOneVec(c *C, vecExprCases vecExprBenchCases) { +func testVectorizedEvalOneVec(t *testing.T, vecExprCases vecExprBenchCases) { ctx := mock.NewContext() for funcName, testCases := range vecExprCases { for _, testCase := range testCases { expr, fts, input, output := genVecExprBenchCase(ctx, funcName, testCase) - commentf := func(row int) CommentInterface { - return Commentf("func: %v, case %+v, row: %v, rowData: %v", funcName, testCase, row, input.GetRow(row).GetDatumRow(fts)) + commentf := func(row int) string { + return fmt.Sprintf("func: %v, case %+v, row: %v, rowData: %v", funcName, testCase, row, input.GetRow(row).GetDatumRow(fts)) } output2 := output.CopyConstruct() - c.Assert(evalOneVec(ctx, expr, input, output, 0), IsNil, Commentf("func: %v, case: %+v", funcName, testCase)) + require.NoErrorf(t, evalOneVec(ctx, expr, input, output, 0), "func: %v, case: %+v", funcName, testCase) it := chunk.NewIterator4Chunk(input) - c.Assert(evalOneColumn(ctx, expr, it, output2, 0), IsNil, Commentf("func: %v, case: %+v", funcName, testCase)) + require.NoErrorf(t, evalOneColumn(ctx, expr, it, output2, 0), "func: %v, case: %+v", funcName, testCase) c1, c2 := output.Column(0), output2.Column(0) switch expr.GetType().EvalType() { case types.ETInt: for i := 0; i < input.NumRows(); i++ { - c.Assert(c1.IsNull(i), Equals, c2.IsNull(i), commentf(i)) + require.Equal(t, c1.IsNull(i), c2.IsNull(i), commentf(i)) if !c1.IsNull(i) { - c.Assert(c1.GetInt64(i), Equals, c2.GetInt64(i), commentf(i)) + require.Equal(t, c1.GetInt64(i), c2.GetInt64(i), commentf(i)) } } case types.ETReal: for i := 0; i < input.NumRows(); i++ { - c.Assert(c1.IsNull(i), Equals, c2.IsNull(i), commentf(i)) + require.Equal(t, c1.IsNull(i), c2.IsNull(i), commentf(i)) if !c1.IsNull(i) { - c.Assert(c1.GetFloat64(i), Equals, c2.GetFloat64(i), commentf(i)) + require.Equal(t, c1.GetFloat64(i), c2.GetFloat64(i), commentf(i)) } } case types.ETDecimal: for i := 0; i < input.NumRows(); i++ { - c.Assert(c1.IsNull(i), Equals, c2.IsNull(i), commentf(i)) + require.Equal(t, c1.IsNull(i), c2.IsNull(i), commentf(i)) if !c1.IsNull(i) { - c.Assert(c1.GetDecimal(i), DeepEquals, c2.GetDecimal(i), commentf(i)) + require.Equal(t, c1.GetDecimal(i), c2.GetDecimal(i), commentf(i)) } } case types.ETDatetime, types.ETTimestamp: for i := 0; i < input.NumRows(); i++ { - c.Assert(c1.IsNull(i), Equals, c2.IsNull(i), commentf(i)) + require.Equal(t, c1.IsNull(i), c2.IsNull(i), commentf(i)) if !c1.IsNull(i) { - c.Assert(c1.GetTime(i), DeepEquals, c2.GetTime(i), commentf(i)) + require.Equal(t, c1.GetTime(i), c2.GetTime(i), commentf(i)) } } case types.ETDuration: for i := 0; i < input.NumRows(); i++ { - c.Assert(c1.IsNull(i), Equals, c2.IsNull(i), commentf(i)) + require.Equal(t, c1.IsNull(i), c2.IsNull(i), commentf(i)) if !c1.IsNull(i) { - c.Assert(c1.GetDuration(i, 0), Equals, c2.GetDuration(i, 0), commentf(i)) + require.Equal(t, c1.GetDuration(i, 0), c2.GetDuration(i, 0), commentf(i)) } } case types.ETJson: for i := 0; i < input.NumRows(); i++ { - c.Assert(c1.IsNull(i), Equals, c2.IsNull(i), commentf(i)) + require.Equal(t, c1.IsNull(i), c2.IsNull(i), commentf(i)) if !c1.IsNull(i) { - c.Assert(c1.GetJSON(i), DeepEquals, c2.GetJSON(i), commentf(i)) + require.Equal(t, c1.GetJSON(i), c2.GetJSON(i), commentf(i)) } } case types.ETString: for i := 0; i < input.NumRows(); i++ { - c.Assert(c1.IsNull(i), Equals, c2.IsNull(i), commentf(i)) + require.Equal(t, c1.IsNull(i), c2.IsNull(i), commentf(i)) if !c1.IsNull(i) { - c.Assert(c1.GetString(i), Equals, c2.GetString(i), commentf(i)) + require.Equal(t, c1.GetString(i), c2.GetString(i), commentf(i)) } } } @@ -1299,7 +1318,7 @@ func removeTestOptions(args []string) []string { // testVectorizedBuiltinFunc is used to verify that the vectorized // expression is evaluated correctly -func testVectorizedBuiltinFunc(c *C, vecExprCases vecExprBenchCases) { +func testVectorizedBuiltinFunc(t *testing.T, vecExprCases vecExprBenchCases) { testFunc := make(map[string]bool) argList := removeTestOptions(flag.Args()) testAll := len(argList) == 0 @@ -1310,7 +1329,7 @@ func testVectorizedBuiltinFunc(c *C, vecExprCases vecExprBenchCases) { for _, testCase := range testCases { ctx := mock.NewContext() err := ctx.GetSessionVars().SetSystemVar(variable.BlockEncryptionMode, testCase.aesModes) - c.Assert(err, IsNil) + require.NoError(t, err) if funcName == ast.CurrentUser || funcName == ast.User { ctx.GetSessionVars().User = &auth.UserIdentity{ Username: "tidb", @@ -1346,9 +1365,9 @@ func testVectorizedBuiltinFunc(c *C, vecExprCases vecExprBenchCases) { continue } // do not forget to implement the vectorized method. - c.Assert(baseFunc.vectorized(), IsTrue, Commentf("func: %v, case: %+v", baseFuncName, testCase)) - commentf := func(row int) CommentInterface { - return Commentf("func: %v, case %+v, row: %v, rowData: %v", baseFuncName, testCase, row, input.GetRow(row).GetDatumRow(fts)) + require.Truef(t, baseFunc.vectorized(), "func: %v, case: %+v", baseFuncName, testCase) + commentf := func(row int) string { + return fmt.Sprintf("func: %v, case %+v, row: %v, rowData: %v", baseFuncName, testCase, row, input.GetRow(row).GetDatumRow(fts)) } it := chunk.NewIterator4Chunk(input) i := 0 @@ -1356,125 +1375,125 @@ func testVectorizedBuiltinFunc(c *C, vecExprCases vecExprBenchCases) { switch testCase.retEvalType { case types.ETInt: err := baseFunc.vecEvalInt(input, output) - c.Assert(err, IsNil, Commentf("func: %v, case: %+v", baseFuncName, testCase)) + require.NoErrorf(t, err, "func: %v, case: %+v", baseFuncName, testCase) // do not forget to call ResizeXXX/ReserveXXX - c.Assert(getColumnLen(output, testCase.retEvalType), Equals, input.NumRows()) + require.Equal(t, input.NumRows(), getColumnLen(output, testCase.retEvalType)) vecWarnCnt = ctx.GetSessionVars().StmtCtx.WarningCount() i64s := output.Int64s() for row := it.Begin(); row != it.End(); row = it.Next() { val, isNull, err := baseFunc.evalInt(row) - c.Assert(err, IsNil, commentf(i)) - c.Assert(isNull, Equals, output.IsNull(i), commentf(i)) + require.NoErrorf(t, err, commentf(i)) + require.Equal(t, output.IsNull(i), isNull, commentf(i)) if !isNull { - c.Assert(val, Equals, i64s[i], commentf(i)) + require.Equal(t, i64s[i], val, commentf(i)) } i++ } case types.ETReal: err := baseFunc.vecEvalReal(input, output) - c.Assert(err, IsNil, Commentf("func: %v, case: %+v", baseFuncName, testCase)) + require.NoErrorf(t, err, "func: %v, case: %+v", baseFuncName, testCase) // do not forget to call ResizeXXX/ReserveXXX - c.Assert(getColumnLen(output, testCase.retEvalType), Equals, input.NumRows()) + require.Equal(t, input.NumRows(), getColumnLen(output, testCase.retEvalType)) vecWarnCnt = ctx.GetSessionVars().StmtCtx.WarningCount() f64s := output.Float64s() for row := it.Begin(); row != it.End(); row = it.Next() { val, isNull, err := baseFunc.evalReal(row) - c.Assert(err, IsNil, commentf(i)) - c.Assert(isNull, Equals, output.IsNull(i), commentf(i)) + require.NoErrorf(t, err, commentf(i)) + require.Equal(t, output.IsNull(i), isNull, commentf(i)) if !isNull { - c.Assert(val, Equals, f64s[i], commentf(i)) + require.Equal(t, f64s[i], val, commentf(i)) } i++ } case types.ETDecimal: err := baseFunc.vecEvalDecimal(input, output) - c.Assert(err, IsNil, Commentf("func: %v, case: %+v", baseFuncName, testCase)) + require.NoErrorf(t, err, "func: %v, case: %+v", baseFuncName, testCase) // do not forget to call ResizeXXX/ReserveXXX - c.Assert(getColumnLen(output, testCase.retEvalType), Equals, input.NumRows()) + require.Equal(t, input.NumRows(), getColumnLen(output, testCase.retEvalType)) vecWarnCnt = ctx.GetSessionVars().StmtCtx.WarningCount() d64s := output.Decimals() for row := it.Begin(); row != it.End(); row = it.Next() { val, isNull, err := baseFunc.evalDecimal(row) - c.Assert(err, IsNil, commentf(i)) - c.Assert(isNull, Equals, output.IsNull(i), commentf(i)) + require.NoErrorf(t, err, commentf(i)) + require.Equal(t, output.IsNull(i), isNull, commentf(i)) if !isNull { - c.Assert(*val, Equals, d64s[i], commentf(i)) + require.Equal(t, d64s[i], *val, commentf(i)) } i++ } case types.ETDatetime, types.ETTimestamp: err := baseFunc.vecEvalTime(input, output) - c.Assert(err, IsNil, Commentf("func: %v, case: %+v", baseFuncName, testCase)) + require.NoErrorf(t, err, "func: %v, case: %+v", baseFuncName, testCase) // do not forget to call ResizeXXX/ReserveXXX - c.Assert(getColumnLen(output, testCase.retEvalType), Equals, input.NumRows()) + require.Equal(t, input.NumRows(), getColumnLen(output, testCase.retEvalType)) vecWarnCnt = ctx.GetSessionVars().StmtCtx.WarningCount() t64s := output.Times() for row := it.Begin(); row != it.End(); row = it.Next() { val, isNull, err := baseFunc.evalTime(row) - c.Assert(err, IsNil, commentf(i)) - c.Assert(isNull, Equals, output.IsNull(i), commentf(i)) + require.NoErrorf(t, err, commentf(i)) + require.Equal(t, output.IsNull(i), isNull, commentf(i)) if !isNull { - c.Assert(val, Equals, t64s[i], commentf(i)) + require.Equal(t, t64s[i], val, commentf(i)) } i++ } case types.ETDuration: err := baseFunc.vecEvalDuration(input, output) - c.Assert(err, IsNil, Commentf("func: %v, case: %+v", baseFuncName, testCase)) + require.NoErrorf(t, err, "func: %v, case: %+v", baseFuncName, testCase) // do not forget to call ResizeXXX/ReserveXXX - c.Assert(getColumnLen(output, testCase.retEvalType), Equals, input.NumRows()) + require.Equal(t, input.NumRows(), getColumnLen(output, testCase.retEvalType)) vecWarnCnt = ctx.GetSessionVars().StmtCtx.WarningCount() d64s := output.GoDurations() for row := it.Begin(); row != it.End(); row = it.Next() { val, isNull, err := baseFunc.evalDuration(row) - c.Assert(err, IsNil, commentf(i)) - c.Assert(isNull, Equals, output.IsNull(i), commentf(i)) + require.NoErrorf(t, err, commentf(i)) + require.Equal(t, output.IsNull(i), isNull, commentf(i)) if !isNull { - c.Assert(val.Duration, Equals, d64s[i], commentf(i)) + require.Equal(t, d64s[i], val.Duration, commentf(i)) } i++ } case types.ETJson: err := baseFunc.vecEvalJSON(input, output) - c.Assert(err, IsNil, Commentf("func: %v, case: %+v", baseFuncName, testCase)) + require.NoErrorf(t, err, "func: %v, case: %+v", baseFuncName, testCase) // do not forget to call ResizeXXX/ReserveXXX - c.Assert(getColumnLen(output, testCase.retEvalType), Equals, input.NumRows()) + require.Equal(t, input.NumRows(), getColumnLen(output, testCase.retEvalType)) vecWarnCnt = ctx.GetSessionVars().StmtCtx.WarningCount() for row := it.Begin(); row != it.End(); row = it.Next() { val, isNull, err := baseFunc.evalJSON(row) - c.Assert(err, IsNil, commentf(i)) - c.Assert(isNull, Equals, output.IsNull(i), commentf(i)) + require.NoErrorf(t, err, commentf(i)) + require.Equal(t, output.IsNull(i), isNull, commentf(i)) if !isNull { cmp := json.CompareBinary(val, output.GetJSON(i)) - c.Assert(cmp, Equals, 0, commentf(i)) + require.Zero(t, cmp, commentf(i)) } i++ } case types.ETString: err := baseFunc.vecEvalString(input, output) - c.Assert(err, IsNil, Commentf("func: %v, case: %+v", baseFuncName, testCase)) + require.NoErrorf(t, err, "func: %v, case: %+v", baseFuncName, testCase) // do not forget to call ResizeXXX/ReserveXXX - c.Assert(getColumnLen(output, testCase.retEvalType), Equals, input.NumRows()) + require.Equal(t, input.NumRows(), getColumnLen(output, testCase.retEvalType)) vecWarnCnt = ctx.GetSessionVars().StmtCtx.WarningCount() for row := it.Begin(); row != it.End(); row = it.Next() { val, isNull, err := baseFunc.evalString(row) - c.Assert(err, IsNil, commentf(i)) - c.Assert(isNull, Equals, output.IsNull(i), commentf(i)) + require.NoErrorf(t, err, commentf(i)) + require.Equal(t, output.IsNull(i), isNull, commentf(i)) if !isNull { - c.Assert(val, Equals, output.GetString(i), commentf(i)) + require.Equal(t, output.GetString(i), val, commentf(i)) } i++ } default: - c.Fatal(fmt.Sprintf("evalType=%v is not supported", testCase.retEvalType)) + t.Fatal(fmt.Sprintf("evalType=%v is not supported", testCase.retEvalType)) } // check warnings totalWarns := ctx.GetSessionVars().StmtCtx.WarningCount() - c.Assert(2*vecWarnCnt, Equals, totalWarns) + require.Equal(t, totalWarns, 2*vecWarnCnt) warns := ctx.GetSessionVars().StmtCtx.GetWarnings() for i := 0; i < int(vecWarnCnt); i++ { - c.Assert(terror.ErrorEqual(warns[i].Err, warns[i+int(vecWarnCnt)].Err), IsTrue) + require.True(t, terror.ErrorEqual(warns[i].Err, warns[i+int(vecWarnCnt)].Err)) } } } @@ -1482,12 +1501,12 @@ func testVectorizedBuiltinFunc(c *C, vecExprCases vecExprBenchCases) { // testVectorizedBuiltinFuncForRand is used to verify that the vectorized // expression is evaluated correctly -func testVectorizedBuiltinFuncForRand(c *C, vecExprCases vecExprBenchCases) { +func testVectorizedBuiltinFuncForRand(t *testing.T, vecExprCases vecExprBenchCases) { for funcName, testCases := range vecExprCases { - c.Assert(strings.EqualFold("rand", funcName), Equals, true) + require.True(t, strings.EqualFold("rand", funcName)) for _, testCase := range testCases { - c.Assert(len(testCase.childrenTypes), Equals, 0) + require.Len(t, testCase.childrenTypes, 0) ctx := mock.NewContext() baseFunc, _, input, output := genVecBuiltinFuncBenchCase(ctx, funcName, testCase) @@ -1495,20 +1514,20 @@ func testVectorizedBuiltinFuncForRand(c *C, vecExprCases vecExprBenchCases) { tmp := strings.Split(baseFuncName, ".") baseFuncName = tmp[len(tmp)-1] // do not forget to implement the vectorized method. - c.Assert(baseFunc.vectorized(), IsTrue, Commentf("func: %v", baseFuncName)) + require.Truef(t, baseFunc.vectorized(), "func: %v", baseFuncName) switch testCase.retEvalType { case types.ETReal: err := baseFunc.vecEvalReal(input, output) - c.Assert(err, IsNil) + require.NoError(t, err) // do not forget to call ResizeXXX/ReserveXXX - c.Assert(getColumnLen(output, testCase.retEvalType), Equals, input.NumRows()) + require.Equal(t, input.NumRows(), getColumnLen(output, testCase.retEvalType)) // check result res := output.Float64s() for _, v := range res { - c.Assert((0 <= v) && (v < 1), Equals, true) + require.True(t, (0 <= v) && (v < 1)) } default: - c.Fatal(fmt.Sprintf("evalType=%v is not supported", testCase.retEvalType)) + t.Fatal(fmt.Sprintf("evalType=%v is not supported", testCase.retEvalType)) } } } @@ -1795,27 +1814,6 @@ func generateRandomSel() []int { return sel } -func (s *testVectorizeSuite2) TestVecEvalBool(c *C) { - ctx := mock.NewContext() - eTypes := []types.EvalType{types.ETReal, types.ETDecimal, types.ETString, types.ETTimestamp, types.ETDatetime, types.ETDuration} - for numCols := 1; numCols <= 5; numCols++ { - for round := 0; round < 16; round++ { - exprs, input := genVecEvalBool(numCols, nil, eTypes) - selected, nulls, err := VecEvalBool(ctx, exprs, input, nil, nil) - c.Assert(err, IsNil) - it := chunk.NewIterator4Chunk(input) - i := 0 - for row := it.Begin(); row != it.End(); row = it.Next() { - ok, null, err := EvalBool(ctx, exprs, row) - c.Assert(err, IsNil) - c.Assert(null, Equals, nulls[i]) - c.Assert(ok, Equals, selected[i]) - i++ - } - } - } -} - func BenchmarkVecEvalBool(b *testing.B) { ctx := mock.NewContext() selected := make([]bool, 0, 1024) @@ -1869,27 +1867,6 @@ func BenchmarkVecEvalBool(b *testing.B) { } } -func (s *testVectorizeSuite2) TestRowBasedFilterAndVectorizedFilter(c *C) { - ctx := mock.NewContext() - eTypes := []types.EvalType{types.ETInt, types.ETReal, types.ETDecimal, types.ETString, types.ETTimestamp, types.ETDatetime, types.ETDuration} - for numCols := 1; numCols <= 5; numCols++ { - for round := 0; round < 16; round++ { - exprs, input := genVecEvalBool(numCols, nil, eTypes) - it := chunk.NewIterator4Chunk(input) - isNull := make([]bool, it.Len()) - selected, nulls, err := rowBasedFilter(ctx, exprs, it, nil, isNull) - c.Assert(err, IsNil) - selected2, nulls2, err2 := vectorizedFilter(ctx, exprs, it, nil, isNull) - c.Assert(err2, IsNil) - length := it.Len() - for i := 0; i < length; i++ { - c.Assert(nulls2[i], Equals, nulls[i]) - c.Assert(selected2[i], Equals, selected[i]) - } - } - } -} - func BenchmarkRowBasedFilterAndVectorizedFilter(b *testing.B) { ctx := mock.NewContext() selected := make([]bool, 0, 1024) @@ -1966,64 +1943,6 @@ func BenchmarkRowBasedFilterAndVectorizedFilter(b *testing.B) { }) } -func (s *testVectorizeSuite2) TestVectorizedFilterConsiderNull(c *C) { - ctx := mock.NewContext() - dafaultEnableVectorizedExpressionVar := ctx.GetSessionVars().EnableVectorizedExpression - eTypes := []types.EvalType{types.ETInt, types.ETReal, types.ETDecimal, types.ETString, types.ETTimestamp, types.ETDatetime, types.ETDuration} - for numCols := 1; numCols <= 5; numCols++ { - for round := 0; round < 16; round++ { - exprs, input := genVecEvalBool(numCols, nil, eTypes) - it := chunk.NewIterator4Chunk(input) - isNull := make([]bool, it.Len()) - ctx.GetSessionVars().EnableVectorizedExpression = false - selected, nulls, err := VectorizedFilterConsiderNull(ctx, exprs, it, nil, isNull) - c.Assert(err, IsNil) - ctx.GetSessionVars().EnableVectorizedExpression = true - selected2, nulls2, err2 := VectorizedFilterConsiderNull(ctx, exprs, it, nil, isNull) - c.Assert(err2, IsNil) - length := it.Len() - for i := 0; i < length; i++ { - c.Assert(nulls2[i], Equals, nulls[i]) - c.Assert(selected2[i], Equals, selected[i]) - } - - // add test which sel is not nil - randomSel := generateRandomSel() - input.SetSel(randomSel) - it2 := chunk.NewIterator4Chunk(input) - isNull = isNull[:0] - ctx.GetSessionVars().EnableVectorizedExpression = false - selected3, nulls, err := VectorizedFilterConsiderNull(ctx, exprs, it2, nil, isNull) - c.Assert(err, IsNil) - ctx.GetSessionVars().EnableVectorizedExpression = true - selected4, nulls2, err2 := VectorizedFilterConsiderNull(ctx, exprs, it2, nil, isNull) - c.Assert(err2, IsNil) - for i := 0; i < length; i++ { - c.Assert(nulls2[i], Equals, nulls[i]) - c.Assert(selected4[i], Equals, selected3[i]) - } - - unselected := make([]bool, length) - // unselected[i] == false means that the i-th row is selected - for i := 0; i < length; i++ { - unselected[i] = true - } - for _, idx := range randomSel { - unselected[idx] = false - } - for i := range selected2 { - if selected2[i] && unselected[i] { - selected2[i] = false - } - } - for i := 0; i < length; i++ { - c.Assert(selected2[i], Equals, selected4[i]) - } - } - } - ctx.GetSessionVars().EnableVectorizedExpression = dafaultEnableVectorizedExpressionVar -} - func TestBenchDaily(t *testing.T) { benchdaily.Run( BenchmarkCastIntAsIntRow, diff --git a/expression/builtin.go b/expression/builtin.go index 2ec8672c5cce1..1b67239613498 100644 --- a/expression/builtin.go +++ b/expression/builtin.go @@ -140,6 +140,7 @@ func newBaseBuiltinFuncWithTp(ctx sessionctx.Context, funcName string, args []Ex args[i] = WrapWithCastAsDecimal(ctx, args[i]) case types.ETString: args[i] = WrapWithCastAsString(ctx, args[i]) + args[i] = HandleBinaryLiteral(ctx, args[i], ec, funcName) case types.ETDatetime: args[i] = WrapWithCastAsTime(ctx, args[i], types.NewFieldType(mysql.TypeDatetime)) case types.ETTimestamp: @@ -771,6 +772,7 @@ var funcs = map[string]functionClass{ ast.IsIPv4Mapped: &isIPv4MappedFunctionClass{baseFunctionClass{ast.IsIPv4Mapped, 1, 1}}, ast.IsIPv6: &isIPv6FunctionClass{baseFunctionClass{ast.IsIPv6, 1, 1}}, ast.IsUsedLock: &isUsedLockFunctionClass{baseFunctionClass{ast.IsUsedLock, 1, 1}}, + ast.IsUUID: &isUUIDFunctionClass{baseFunctionClass{ast.IsUUID, 1, 1}}, ast.MasterPosWait: &masterPosWaitFunctionClass{baseFunctionClass{ast.MasterPosWait, 2, 4}}, ast.NameConst: &nameConstFunctionClass{baseFunctionClass{ast.NameConst, 2, 2}}, ast.ReleaseAllLocks: &releaseAllLocksFunctionClass{baseFunctionClass{ast.ReleaseAllLocks, 0, 0}}, diff --git a/expression/builtin_arithmetic.go b/expression/builtin_arithmetic.go index c0d2e3fd44aa6..6c82a938206ce 100644 --- a/expression/builtin_arithmetic.go +++ b/expression/builtin_arithmetic.go @@ -88,7 +88,13 @@ func numericContextResultType(ft *types.FieldType) types.EvalType { // setFlenDecimal4RealOrDecimal is called to set proper `Flen` and `Decimal` of return // type according to the two input parameter's types. -func setFlenDecimal4RealOrDecimal(retTp, a, b *types.FieldType, isReal bool, isMultiply bool) { +func setFlenDecimal4RealOrDecimal(ctx sessionctx.Context, retTp *types.FieldType, arg0, arg1 Expression, isReal bool, isMultiply bool) { + a, b := arg0.GetType(), arg1.GetType() + if MaybeOverOptimized4PlanCache(ctx, []Expression{arg0, arg1}) { + // set length and decimal to unspecified if arguments depend on parameters + retTp.Flen, retTp.Decimal = types.UnspecifiedLength, types.UnspecifiedLength + return + } if a.Decimal != types.UnspecifiedLength && b.Decimal != types.UnspecifiedLength { retTp.Decimal = a.Decimal + b.Decimal if !isMultiply { @@ -164,7 +170,7 @@ func (c *arithmeticPlusFunctionClass) getFunction(ctx sessionctx.Context, args [ if err != nil { return nil, err } - setFlenDecimal4RealOrDecimal(bf.tp, args[0].GetType(), args[1].GetType(), true, false) + setFlenDecimal4RealOrDecimal(ctx, bf.tp, args[0], args[1], true, false) sig := &builtinArithmeticPlusRealSig{bf} sig.setPbCode(tipb.ScalarFuncSig_PlusReal) return sig, nil @@ -173,7 +179,7 @@ func (c *arithmeticPlusFunctionClass) getFunction(ctx sessionctx.Context, args [ if err != nil { return nil, err } - setFlenDecimal4RealOrDecimal(bf.tp, args[0].GetType(), args[1].GetType(), false, false) + setFlenDecimal4RealOrDecimal(ctx, bf.tp, args[0], args[1], false, false) sig := &builtinArithmeticPlusDecimalSig{bf} sig.setPbCode(tipb.ScalarFuncSig_PlusDecimal) return sig, nil @@ -316,7 +322,7 @@ func (c *arithmeticMinusFunctionClass) getFunction(ctx sessionctx.Context, args if err != nil { return nil, err } - setFlenDecimal4RealOrDecimal(bf.tp, args[0].GetType(), args[1].GetType(), true, false) + setFlenDecimal4RealOrDecimal(ctx, bf.tp, args[0], args[1], true, false) sig := &builtinArithmeticMinusRealSig{bf} sig.setPbCode(tipb.ScalarFuncSig_MinusReal) return sig, nil @@ -325,7 +331,7 @@ func (c *arithmeticMinusFunctionClass) getFunction(ctx sessionctx.Context, args if err != nil { return nil, err } - setFlenDecimal4RealOrDecimal(bf.tp, args[0].GetType(), args[1].GetType(), false, false) + setFlenDecimal4RealOrDecimal(ctx, bf.tp, args[0], args[1], false, false) sig := &builtinArithmeticMinusDecimalSig{bf} sig.setPbCode(tipb.ScalarFuncSig_MinusDecimal) return sig, nil @@ -502,7 +508,7 @@ func (c *arithmeticMultiplyFunctionClass) getFunction(ctx sessionctx.Context, ar if err != nil { return nil, err } - setFlenDecimal4RealOrDecimal(bf.tp, args[0].GetType(), args[1].GetType(), true, true) + setFlenDecimal4RealOrDecimal(ctx, bf.tp, args[0], args[1], true, true) sig := &builtinArithmeticMultiplyRealSig{bf} sig.setPbCode(tipb.ScalarFuncSig_MultiplyReal) return sig, nil @@ -511,7 +517,7 @@ func (c *arithmeticMultiplyFunctionClass) getFunction(ctx sessionctx.Context, ar if err != nil { return nil, err } - setFlenDecimal4RealOrDecimal(bf.tp, args[0].GetType(), args[1].GetType(), false, true) + setFlenDecimal4RealOrDecimal(ctx, bf.tp, args[0], args[1], false, true) sig := &builtinArithmeticMultiplyDecimalSig{bf} sig.setPbCode(tipb.ScalarFuncSig_MultiplyDecimal) return sig, nil diff --git a/expression/builtin_arithmetic_test.go b/expression/builtin_arithmetic_test.go index 817be99e2f683..196caaf535efe 100644 --- a/expression/builtin_arithmetic_test.go +++ b/expression/builtin_arithmetic_test.go @@ -16,18 +16,20 @@ package expression import ( "math" + "testing" "time" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/testkit/trequire" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" - "github.com/pingcap/tidb/util/testutil" + "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tipb/go-tipb" + "github.com/stretchr/testify/require" ) -func (s *testEvaluatorSuite) TestSetFlenDecimal4RealOrDecimal(c *C) { +func TestSetFlenDecimal4RealOrDecimal(t *testing.T) { ret := &types.FieldType{} a := &types.FieldType{ Decimal: 1, @@ -37,27 +39,27 @@ func (s *testEvaluatorSuite) TestSetFlenDecimal4RealOrDecimal(c *C) { Decimal: 0, Flen: 2, } - setFlenDecimal4RealOrDecimal(ret, a, b, true, false) - c.Assert(ret.Decimal, Equals, 1) - c.Assert(ret.Flen, Equals, 6) + setFlenDecimal4RealOrDecimal(mock.NewContext(), ret, &Constant{RetType: a}, &Constant{RetType: b}, true, false) + require.Equal(t, 1, ret.Decimal) + require.Equal(t, 6, ret.Flen) b.Flen = 65 - setFlenDecimal4RealOrDecimal(ret, a, b, true, false) - c.Assert(ret.Decimal, Equals, 1) - c.Assert(ret.Flen, Equals, mysql.MaxRealWidth) - setFlenDecimal4RealOrDecimal(ret, a, b, false, false) - c.Assert(ret.Decimal, Equals, 1) - c.Assert(ret.Flen, Equals, mysql.MaxDecimalWidth) + setFlenDecimal4RealOrDecimal(mock.NewContext(), ret, &Constant{RetType: a}, &Constant{RetType: b}, true, false) + require.Equal(t, 1, ret.Decimal) + require.Equal(t, mysql.MaxRealWidth, ret.Flen) + setFlenDecimal4RealOrDecimal(mock.NewContext(), ret, &Constant{RetType: a}, &Constant{RetType: b}, false, false) + require.Equal(t, 1, ret.Decimal) + require.Equal(t, mysql.MaxDecimalWidth, ret.Flen) b.Flen = types.UnspecifiedLength - setFlenDecimal4RealOrDecimal(ret, a, b, true, false) - c.Assert(ret.Decimal, Equals, 1) - c.Assert(ret.Flen, Equals, types.UnspecifiedLength) + setFlenDecimal4RealOrDecimal(mock.NewContext(), ret, &Constant{RetType: a}, &Constant{RetType: b}, true, false) + require.Equal(t, 1, ret.Decimal) + require.Equal(t, types.UnspecifiedLength, ret.Flen) b.Decimal = types.UnspecifiedLength - setFlenDecimal4RealOrDecimal(ret, a, b, true, false) - c.Assert(ret.Decimal, Equals, types.UnspecifiedLength) - c.Assert(ret.Flen, Equals, types.UnspecifiedLength) + setFlenDecimal4RealOrDecimal(mock.NewContext(), ret, &Constant{RetType: a}, &Constant{RetType: b}, true, false) + require.Equal(t, types.UnspecifiedLength, ret.Decimal) + require.Equal(t, types.UnspecifiedLength, ret.Flen) ret = &types.FieldType{} a = &types.FieldType{ @@ -68,202 +70,205 @@ func (s *testEvaluatorSuite) TestSetFlenDecimal4RealOrDecimal(c *C) { Decimal: 0, Flen: 2, } - setFlenDecimal4RealOrDecimal(ret, a, b, true, true) - c.Assert(ret.Decimal, Equals, 1) - c.Assert(ret.Flen, Equals, 8) + setFlenDecimal4RealOrDecimal(mock.NewContext(), ret, &Constant{RetType: a}, &Constant{RetType: b}, true, true) + require.Equal(t, 1, ret.Decimal) + require.Equal(t, 8, ret.Flen) b.Flen = 65 - setFlenDecimal4RealOrDecimal(ret, a, b, true, true) - c.Assert(ret.Decimal, Equals, 1) - c.Assert(ret.Flen, Equals, mysql.MaxRealWidth) - setFlenDecimal4RealOrDecimal(ret, a, b, false, true) - c.Assert(ret.Decimal, Equals, 1) - c.Assert(ret.Flen, Equals, mysql.MaxDecimalWidth) + setFlenDecimal4RealOrDecimal(mock.NewContext(), ret, &Constant{RetType: a}, &Constant{RetType: b}, true, true) + require.Equal(t, 1, ret.Decimal) + require.Equal(t, mysql.MaxRealWidth, ret.Flen) + setFlenDecimal4RealOrDecimal(mock.NewContext(), ret, &Constant{RetType: a}, &Constant{RetType: b}, false, true) + require.Equal(t, 1, ret.Decimal) + require.Equal(t, mysql.MaxDecimalWidth, ret.Flen) b.Flen = types.UnspecifiedLength - setFlenDecimal4RealOrDecimal(ret, a, b, true, true) - c.Assert(ret.Decimal, Equals, 1) - c.Assert(ret.Flen, Equals, types.UnspecifiedLength) + setFlenDecimal4RealOrDecimal(mock.NewContext(), ret, &Constant{RetType: a}, &Constant{RetType: b}, true, true) + require.Equal(t, 1, ret.Decimal) + require.Equal(t, types.UnspecifiedLength, ret.Flen) b.Decimal = types.UnspecifiedLength - setFlenDecimal4RealOrDecimal(ret, a, b, true, true) - c.Assert(ret.Decimal, Equals, types.UnspecifiedLength) - c.Assert(ret.Flen, Equals, types.UnspecifiedLength) + setFlenDecimal4RealOrDecimal(mock.NewContext(), ret, &Constant{RetType: a}, &Constant{RetType: b}, true, true) + require.Equal(t, types.UnspecifiedLength, ret.Decimal) + require.Equal(t, types.UnspecifiedLength, ret.Flen) } -func (s *testEvaluatorSuite) TestArithmeticPlus(c *C) { +func TestArithmeticPlus(t *testing.T) { + ctx := createContext(t) // case: 1 args := []interface{}{int64(12), int64(1)} - bf, err := funcs[ast.Plus].getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(args...))) - c.Assert(err, IsNil) - c.Assert(bf, NotNil) + bf, err := funcs[ast.Plus].getFunction(ctx, datumsToConstants(types.MakeDatums(args...))) + require.NoError(t, err) + require.NotNil(t, bf) intSig, ok := bf.(*builtinArithmeticPlusIntSig) - c.Assert(ok, IsTrue) - c.Assert(intSig, NotNil) + require.True(t, ok) + require.NotNil(t, intSig) intResult, isNull, err := intSig.evalInt(chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(isNull, IsFalse) - c.Assert(intResult, Equals, int64(13)) + require.NoError(t, err) + require.False(t, isNull) + require.Equal(t, int64(13), intResult) // case 2 - args = []interface{}{float64(1.01001), float64(-0.01)} + args = []interface{}{1.01001, -0.01} - bf, err = funcs[ast.Plus].getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(args...))) - c.Assert(err, IsNil) - c.Assert(bf, NotNil) + bf, err = funcs[ast.Plus].getFunction(ctx, datumsToConstants(types.MakeDatums(args...))) + require.NoError(t, err) + require.NotNil(t, bf) realSig, ok := bf.(*builtinArithmeticPlusRealSig) - c.Assert(ok, IsTrue) - c.Assert(realSig, NotNil) + require.True(t, ok) + require.NotNil(t, realSig) realResult, isNull, err := realSig.evalReal(chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(isNull, IsFalse) - c.Assert(realResult, Equals, float64(1.00001)) + require.NoError(t, err) + require.False(t, isNull) + require.Equal(t, 1.00001, realResult) // case 3 - args = []interface{}{nil, float64(-0.11101)} + args = []interface{}{nil, -0.11101} - bf, err = funcs[ast.Plus].getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(args...))) - c.Assert(err, IsNil) - c.Assert(bf, NotNil) + bf, err = funcs[ast.Plus].getFunction(ctx, datumsToConstants(types.MakeDatums(args...))) + require.NoError(t, err) + require.NotNil(t, bf) realSig, ok = bf.(*builtinArithmeticPlusRealSig) - c.Assert(ok, IsTrue) - c.Assert(realSig, NotNil) + require.True(t, ok) + require.NotNil(t, realSig) realResult, isNull, err = realSig.evalReal(chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(isNull, IsTrue) - c.Assert(realResult, Equals, float64(0)) + require.NoError(t, err) + require.True(t, isNull) + require.Equal(t, float64(0), realResult) // case 4 args = []interface{}{nil, nil} - bf, err = funcs[ast.Plus].getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(args...))) - c.Assert(err, IsNil) - c.Assert(bf, NotNil) + bf, err = funcs[ast.Plus].getFunction(ctx, datumsToConstants(types.MakeDatums(args...))) + require.NoError(t, err) + require.NotNil(t, bf) realSig, ok = bf.(*builtinArithmeticPlusRealSig) - c.Assert(ok, IsTrue) - c.Assert(realSig, NotNil) + require.True(t, ok) + require.NotNil(t, realSig) realResult, isNull, err = realSig.evalReal(chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(isNull, IsTrue) - c.Assert(realResult, Equals, float64(0)) + require.NoError(t, err) + require.True(t, isNull) + require.Equal(t, float64(0), realResult) // case 5 hexStr, err := types.ParseHexStr("0x20000000000000") - c.Assert(err, IsNil) + require.NoError(t, err) args = []interface{}{hexStr, int64(1)} - bf, err = funcs[ast.Plus].getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(args...))) - c.Assert(err, IsNil) - c.Assert(bf, NotNil) + bf, err = funcs[ast.Plus].getFunction(ctx, datumsToConstants(types.MakeDatums(args...))) + require.NoError(t, err) + require.NotNil(t, bf) intSig, ok = bf.(*builtinArithmeticPlusIntSig) - c.Assert(ok, IsTrue) - c.Assert(intSig, NotNil) + require.True(t, ok) + require.NotNil(t, intSig) intResult, _, err = intSig.evalInt(chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(intResult, Equals, int64(9007199254740993)) + require.NoError(t, err) + require.Equal(t, int64(9007199254740993), intResult) bitStr, err := types.NewBitLiteral("0b00011") - c.Assert(err, IsNil) + require.NoError(t, err) args = []interface{}{bitStr, int64(1)} - bf, err = funcs[ast.Plus].getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(args...))) - c.Assert(err, IsNil) - c.Assert(bf, NotNil) + bf, err = funcs[ast.Plus].getFunction(ctx, datumsToConstants(types.MakeDatums(args...))) + require.NoError(t, err) + require.NotNil(t, bf) //check the result type is int intSig, ok = bf.(*builtinArithmeticPlusIntSig) - c.Assert(ok, IsTrue) - c.Assert(intSig, NotNil) + require.True(t, ok) + require.NotNil(t, intSig) intResult, _, err = intSig.evalInt(chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(intResult, Equals, int64(4)) + require.NoError(t, err) + require.Equal(t, int64(4), intResult) } -func (s *testEvaluatorSuite) TestArithmeticMinus(c *C) { +func TestArithmeticMinus(t *testing.T) { + ctx := createContext(t) // case: 1 args := []interface{}{int64(12), int64(1)} - bf, err := funcs[ast.Minus].getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(args...))) - c.Assert(err, IsNil) - c.Assert(bf, NotNil) + bf, err := funcs[ast.Minus].getFunction(ctx, datumsToConstants(types.MakeDatums(args...))) + require.NoError(t, err) + require.NotNil(t, bf) intSig, ok := bf.(*builtinArithmeticMinusIntSig) - c.Assert(ok, IsTrue) - c.Assert(intSig, NotNil) + require.True(t, ok) + require.NotNil(t, intSig) intResult, isNull, err := intSig.evalInt(chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(isNull, IsFalse) - c.Assert(intResult, Equals, int64(11)) + require.NoError(t, err) + require.False(t, isNull) + require.Equal(t, int64(11), intResult) // case 2 - args = []interface{}{float64(1.01001), float64(-0.01)} + args = []interface{}{1.01001, -0.01} - bf, err = funcs[ast.Minus].getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(args...))) - c.Assert(err, IsNil) - c.Assert(bf, NotNil) + bf, err = funcs[ast.Minus].getFunction(ctx, datumsToConstants(types.MakeDatums(args...))) + require.NoError(t, err) + require.NotNil(t, bf) realSig, ok := bf.(*builtinArithmeticMinusRealSig) - c.Assert(ok, IsTrue) - c.Assert(realSig, NotNil) + require.True(t, ok) + require.NotNil(t, realSig) realResult, isNull, err := realSig.evalReal(chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(isNull, IsFalse) - c.Assert(realResult, Equals, float64(1.02001)) + require.NoError(t, err) + require.False(t, isNull) + require.Equal(t, 1.02001, realResult) // case 3 - args = []interface{}{nil, float64(-0.11101)} + args = []interface{}{nil, -0.11101} - bf, err = funcs[ast.Minus].getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(args...))) - c.Assert(err, IsNil) - c.Assert(bf, NotNil) + bf, err = funcs[ast.Minus].getFunction(ctx, datumsToConstants(types.MakeDatums(args...))) + require.NoError(t, err) + require.NotNil(t, bf) realSig, ok = bf.(*builtinArithmeticMinusRealSig) - c.Assert(ok, IsTrue) - c.Assert(realSig, NotNil) + require.True(t, ok) + require.NotNil(t, realSig) realResult, isNull, err = realSig.evalReal(chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(isNull, IsTrue) - c.Assert(realResult, Equals, float64(0)) + require.NoError(t, err) + require.True(t, isNull) + require.Equal(t, float64(0), realResult) // case 4 - args = []interface{}{float64(1.01), nil} + args = []interface{}{1.01, nil} - bf, err = funcs[ast.Minus].getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(args...))) - c.Assert(err, IsNil) - c.Assert(bf, NotNil) + bf, err = funcs[ast.Minus].getFunction(ctx, datumsToConstants(types.MakeDatums(args...))) + require.NoError(t, err) + require.NotNil(t, bf) realSig, ok = bf.(*builtinArithmeticMinusRealSig) - c.Assert(ok, IsTrue) - c.Assert(realSig, NotNil) + require.True(t, ok) + require.NotNil(t, realSig) realResult, isNull, err = realSig.evalReal(chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(isNull, IsTrue) - c.Assert(realResult, Equals, float64(0)) + require.NoError(t, err) + require.True(t, isNull) + require.Equal(t, float64(0), realResult) // case 5 args = []interface{}{nil, nil} - bf, err = funcs[ast.Minus].getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(args...))) - c.Assert(err, IsNil) - c.Assert(bf, NotNil) + bf, err = funcs[ast.Minus].getFunction(ctx, datumsToConstants(types.MakeDatums(args...))) + require.NoError(t, err) + require.NotNil(t, bf) realSig, ok = bf.(*builtinArithmeticMinusRealSig) - c.Assert(ok, IsTrue) - c.Assert(realSig, NotNil) + require.True(t, ok) + require.NotNil(t, realSig) realResult, isNull, err = realSig.evalReal(chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(isNull, IsTrue) - c.Assert(realResult, Equals, float64(0)) + require.NoError(t, err) + require.True(t, isNull) + require.Equal(t, float64(0), realResult) } -func (s *testEvaluatorSuite) TestArithmeticMultiply(c *C) { +func TestArithmeticMultiply(t *testing.T) { + ctx := createContext(t) testCases := []struct { args []interface{} expect []interface{} @@ -275,11 +280,11 @@ func (s *testEvaluatorSuite) TestArithmeticMultiply(c *C) { }, { args: []interface{}{int64(-1), int64(math.MinInt64)}, - expect: []interface{}{nil, "*BIGINT value is out of range in '\\(-1 \\* -9223372036854775808\\)'"}, + expect: []interface{}{nil, "BIGINT value is out of range in '\\(-1 \\* -9223372036854775808\\)'$"}, }, { args: []interface{}{int64(math.MinInt64), int64(-1)}, - expect: []interface{}{nil, "*BIGINT value is out of range in '\\(-9223372036854775808 \\* -1\\)'"}, + expect: []interface{}{nil, "BIGINT value is out of range in '\\(-9223372036854775808 \\* -1\\)'$"}, }, { args: []interface{}{uint64(11), uint64(11)}, @@ -290,11 +295,11 @@ func (s *testEvaluatorSuite) TestArithmeticMultiply(c *C) { expect: []interface{}{float64(121), nil}, }, { - args: []interface{}{nil, float64(-0.11101)}, + args: []interface{}{nil, -0.11101}, expect: []interface{}{nil, nil}, }, { - args: []interface{}{float64(1.01), nil}, + args: []interface{}{1.01, nil}, expect: []interface{}{nil, nil}, }, { @@ -304,30 +309,33 @@ func (s *testEvaluatorSuite) TestArithmeticMultiply(c *C) { } for _, tc := range testCases { - sig, err := funcs[ast.Mul].getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(tc.args...))) - c.Assert(err, IsNil) - c.Assert(sig, NotNil) + sig, err := funcs[ast.Mul].getFunction(ctx, datumsToConstants(types.MakeDatums(tc.args...))) + require.NoError(t, err) + require.NotNil(t, sig) val, err := evalBuiltinFunc(sig, chunk.Row{}) if tc.expect[1] == nil { - c.Assert(err, IsNil) - c.Assert(val, testutil.DatumEquals, types.NewDatum(tc.expect[0])) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(tc.expect[0]), val) } else { - c.Assert(err, ErrorMatches, tc.expect[1]) + require.Error(t, err) + require.Regexp(t, tc.expect[1], err.Error()) } } } -func (s *testEvaluatorSuite) TestArithmeticDivide(c *C) { +func TestArithmeticDivide(t *testing.T) { + ctx := createContext(t) + testCases := []struct { args []interface{} expect interface{} }{ { - args: []interface{}{float64(11.1111111), float64(11.1)}, - expect: float64(1.001001), + args: []interface{}{11.1111111, 11.1}, + expect: 1.001001, }, { - args: []interface{}{float64(11.1111111), float64(0)}, + args: []interface{}{11.1111111, float64(0)}, expect: nil, }, { @@ -336,7 +344,7 @@ func (s *testEvaluatorSuite) TestArithmeticDivide(c *C) { }, { args: []interface{}{int64(11), int64(2)}, - expect: float64(5.5), + expect: 5.5, }, { args: []interface{}{int64(11), int64(0)}, @@ -348,18 +356,18 @@ func (s *testEvaluatorSuite) TestArithmeticDivide(c *C) { }, { args: []interface{}{uint64(11), uint64(2)}, - expect: float64(5.5), + expect: 5.5, }, { args: []interface{}{uint64(11), uint64(0)}, expect: nil, }, { - args: []interface{}{nil, float64(-0.11101)}, + args: []interface{}{nil, -0.11101}, expect: nil, }, { - args: []interface{}{float64(1.01), nil}, + args: []interface{}{1.01, nil}, expect: nil, }, { @@ -369,22 +377,23 @@ func (s *testEvaluatorSuite) TestArithmeticDivide(c *C) { } for _, tc := range testCases { - sig, err := funcs[ast.Div].getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(tc.args...))) - c.Assert(err, IsNil) - c.Assert(sig, NotNil) + sig, err := funcs[ast.Div].getFunction(ctx, datumsToConstants(types.MakeDatums(tc.args...))) + require.NoError(t, err) + require.NotNil(t, sig) switch sig.(type) { case *builtinArithmeticIntDivideIntSig: - c.Assert(sig.PbCode(), Equals, tipb.ScalarFuncSig_IntDivideInt) + require.Equal(t, tipb.ScalarFuncSig_IntDivideInt, sig.PbCode()) case *builtinArithmeticIntDivideDecimalSig: - c.Assert(sig.PbCode(), Equals, tipb.ScalarFuncSig_IntDivideDecimal) + require.Equal(t, tipb.ScalarFuncSig_IntDivideDecimal, sig.PbCode()) } val, err := evalBuiltinFunc(sig, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(val, testutil.DatumEquals, types.NewDatum(tc.expect)) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(tc.expect), val) } } -func (s *testEvaluatorSuite) TestArithmeticIntDivide(c *C) { +func TestArithmeticIntDivide(t *testing.T) { + ctx := createContext(t) testCases := []struct { args []interface{} expect []interface{} @@ -430,27 +439,27 @@ func (s *testEvaluatorSuite) TestArithmeticIntDivide(c *C) { expect: []interface{}{nil, nil}, }, { - args: []interface{}{float64(11.01), float64(1.1)}, + args: []interface{}{11.01, 1.1}, expect: []interface{}{int64(10), nil}, }, { - args: []interface{}{float64(-11.01), float64(1.1)}, + args: []interface{}{-11.01, 1.1}, expect: []interface{}{int64(-10), nil}, }, { - args: []interface{}{float64(11.01), float64(-1.1)}, + args: []interface{}{11.01, -1.1}, expect: []interface{}{int64(-10), nil}, }, { - args: []interface{}{float64(-11.01), float64(-1.1)}, + args: []interface{}{-11.01, -1.1}, expect: []interface{}{int64(10), nil}, }, { - args: []interface{}{nil, float64(-0.11101)}, + args: []interface{}{nil, -0.11101}, expect: []interface{}{nil, nil}, }, { - args: []interface{}{float64(1.01), nil}, + args: []interface{}{1.01, nil}, expect: []interface{}{nil, nil}, }, { @@ -466,12 +475,12 @@ func (s *testEvaluatorSuite) TestArithmeticIntDivide(c *C) { expect: []interface{}{nil, nil}, }, { - args: []interface{}{float64(123456789100000.0), float64(-0.00001)}, - expect: []interface{}{nil, "*BIGINT value is out of range in '\\(123456789100000 DIV -0.00001\\)'"}, + args: []interface{}{123456789100000.0, -0.00001}, + expect: []interface{}{nil, ".*BIGINT value is out of range in '\\(123456789100000 DIV -0.00001\\)'"}, }, { args: []interface{}{int64(-9223372036854775808), float64(-1)}, - expect: []interface{}{nil, "*BIGINT value is out of range in '\\(-9223372036854775808 DIV -1\\)'"}, + expect: []interface{}{nil, ".*BIGINT value is out of range in '\\(-9223372036854775808 DIV -1\\)'"}, }, { args: []interface{}{uint64(1), float64(-2)}, @@ -479,25 +488,27 @@ func (s *testEvaluatorSuite) TestArithmeticIntDivide(c *C) { }, { args: []interface{}{uint64(1), float64(-1)}, - expect: []interface{}{nil, "*BIGINT UNSIGNED value is out of range in '\\(1 DIV -1\\)'"}, + expect: []interface{}{nil, ".*BIGINT UNSIGNED value is out of range in '\\(1 DIV -1\\)'"}, }, } for _, tc := range testCases { - sig, err := funcs[ast.IntDiv].getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(tc.args...))) - c.Assert(err, IsNil) - c.Assert(sig, NotNil) + sig, err := funcs[ast.IntDiv].getFunction(ctx, datumsToConstants(types.MakeDatums(tc.args...))) + require.NoError(t, err) + require.NotNil(t, sig) val, err := evalBuiltinFunc(sig, chunk.Row{}) if tc.expect[1] == nil { - c.Assert(err, IsNil) - c.Assert(val, testutil.DatumEquals, types.NewDatum(tc.expect[0])) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(tc.expect[0]), val) } else { - c.Assert(err, ErrorMatches, tc.expect[1]) + require.Error(t, err) + require.Regexp(t, tc.expect[1], err.Error()) } } } -func (s *testEvaluatorSuite) TestArithmeticMod(c *C) { +func TestArithmeticMod(t *testing.T) { + ctx := createContext(t) testCases := []struct { args []interface{} expect interface{} @@ -571,27 +582,27 @@ func (s *testEvaluatorSuite) TestArithmeticMod(c *C) { expect: nil, }, { - args: []interface{}{int64(1), float64(1.1)}, + args: []interface{}{int64(1), 1.1}, expect: float64(1), }, { - args: []interface{}{int64(-1), float64(1.1)}, + args: []interface{}{int64(-1), 1.1}, expect: float64(-1), }, { - args: []interface{}{int64(1), float64(-1.1)}, + args: []interface{}{int64(1), -1.1}, expect: float64(1), }, { - args: []interface{}{int64(-1), float64(-1.1)}, + args: []interface{}{int64(-1), -1.1}, expect: float64(-1), }, { - args: []interface{}{nil, float64(-0.11101)}, + args: []interface{}{nil, -0.11101}, expect: nil, }, { - args: []interface{}{float64(1.01), nil}, + args: []interface{}{1.01, nil}, expect: nil, }, { @@ -625,30 +636,31 @@ func (s *testEvaluatorSuite) TestArithmeticMod(c *C) { } for _, tc := range testCases { - sig, err := funcs[ast.Mod].getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(tc.args...))) - c.Assert(err, IsNil) - c.Assert(sig, NotNil) + sig, err := funcs[ast.Mod].getFunction(ctx, datumsToConstants(types.MakeDatums(tc.args...))) + require.NoError(t, err) + require.NotNil(t, sig) val, err := evalBuiltinFunc(sig, chunk.Row{}) switch sig.(type) { case *builtinArithmeticModRealSig: - c.Assert(sig.PbCode(), Equals, tipb.ScalarFuncSig_ModReal) + require.Equal(t, tipb.ScalarFuncSig_ModReal, sig.PbCode()) case *builtinArithmeticModIntUnsignedUnsignedSig: - c.Assert(sig.PbCode(), Equals, tipb.ScalarFuncSig_ModIntUnsignedUnsigned) + require.Equal(t, tipb.ScalarFuncSig_ModIntUnsignedUnsigned, sig.PbCode()) case *builtinArithmeticModIntUnsignedSignedSig: - c.Assert(sig.PbCode(), Equals, tipb.ScalarFuncSig_ModIntUnsignedSigned) + require.Equal(t, tipb.ScalarFuncSig_ModIntUnsignedSigned, sig.PbCode()) case *builtinArithmeticModIntSignedUnsignedSig: - c.Assert(sig.PbCode(), Equals, tipb.ScalarFuncSig_ModIntSignedUnsigned) + require.Equal(t, tipb.ScalarFuncSig_ModIntSignedUnsigned, sig.PbCode()) case *builtinArithmeticModIntSignedSignedSig: - c.Assert(sig.PbCode(), Equals, tipb.ScalarFuncSig_ModIntSignedSigned) + require.Equal(t, tipb.ScalarFuncSig_ModIntSignedSigned, sig.PbCode()) case *builtinArithmeticModDecimalSig: - c.Assert(sig.PbCode(), Equals, tipb.ScalarFuncSig_ModDecimal) + require.Equal(t, tipb.ScalarFuncSig_ModDecimal, sig.PbCode()) } - c.Assert(err, IsNil) - c.Assert(val, testutil.DatumEquals, types.NewDatum(tc.expect)) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(tc.expect), val) } } -func (s *testEvaluatorSuite) TestDecimalErrOverflow(c *C) { +func TestDecimalErrOverflow(t *testing.T) { + ctx := createContext(t) testCases := []struct { args []float64 opd string @@ -682,12 +694,11 @@ func (s *testEvaluatorSuite) TestDecimalErrOverflow(c *C) { } for _, tc := range testCases { dec1, dec2 := types.NewDecFromFloatForTest(tc.args[0]), types.NewDecFromFloatForTest(tc.args[1]) - bf, err := funcs[tc.opd].getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(dec1, dec2))) - c.Assert(err, IsNil) - c.Assert(bf, NotNil) - c.Assert(bf.PbCode(), Equals, tc.sig) + bf, err := funcs[tc.opd].getFunction(ctx, datumsToConstants(types.MakeDatums(dec1, dec2))) + require.NoError(t, err) + require.NotNil(t, bf) + require.Equal(t, tc.sig, bf.PbCode()) _, err = evalBuiltinFunc(bf, chunk.Row{}) - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, tc.errStr) + require.EqualError(t, err, tc.errStr) } } diff --git a/expression/builtin_arithmetic_vec_test.go b/expression/builtin_arithmetic_vec_test.go index 8fe9926a34989..fa6cf5d73b1ae 100644 --- a/expression/builtin_arithmetic_vec_test.go +++ b/expression/builtin_arithmetic_vec_test.go @@ -18,12 +18,12 @@ import ( "math" "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/mock" + "github.com/stretchr/testify/require" ) var vecBuiltinArithmeticCases = map[string][]vecExprBenchCase{ @@ -182,11 +182,11 @@ var vecBuiltinArithmeticCases = map[string][]vecExprBenchCase{ ast.NE: {}, } -func (s *testEvaluatorSuite) TestVectorizedBuiltinArithmeticFunc(c *C) { - testVectorizedBuiltinFunc(c, vecBuiltinArithmeticCases) +func TestVectorizedBuiltinArithmeticFunc(t *testing.T) { + testVectorizedBuiltinFunc(t, vecBuiltinArithmeticCases) } -func (s *testEvaluatorSuite) TestVectorizedDecimalErrOverflow(c *C) { +func TestVectorizedDecimalErrOverflow(t *testing.T) { ctx := mock.NewContext() testCases := []struct { args []float64 @@ -212,18 +212,17 @@ func (s *testEvaluatorSuite) TestVectorizedDecimalErrOverflow(c *C) { input := chunk.New(fts, 1, 1) dec1, dec2 := new(types.MyDecimal), new(types.MyDecimal) err := dec1.FromFloat64(tt.args[0]) - c.Assert(err, IsNil) + require.NoError(t, err) err = dec2.FromFloat64(tt.args[1]) - c.Assert(err, IsNil) + require.NoError(t, err) input.AppendMyDecimal(0, dec1) input.AppendMyDecimal(1, dec2) cols := []Expression{&Column{Index: 0, RetType: fts[0]}, &Column{Index: 1, RetType: fts[1]}} baseFunc, err := funcs[tt.funcName].getFunction(ctx, cols) - c.Assert(err, IsNil) + require.NoError(t, err) result := chunk.NewColumn(eType2FieldType(types.ETDecimal), 1) err = baseFunc.vecEvalDecimal(input, result) - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, tt.errStr) + require.EqualError(t, err, tt.errStr) } } diff --git a/expression/builtin_cast.go b/expression/builtin_cast.go index b155370d64462..ebf1903a569ba 100644 --- a/expression/builtin_cast.go +++ b/expression/builtin_cast.go @@ -285,6 +285,11 @@ func (c *castAsStringFunctionClass) getFunction(ctx sessionctx.Context, args []E } bf.tp = c.tp if args[0].GetType().Hybrid() || IsBinaryLiteral(args[0]) { + // When cast from binary to some other charsets, we should check if the binary is valid or not. + // so we build a from_binary function to do this check. + ft := args[0].GetType().Clone() + ft.Charset, ft.Collate = c.tp.Charset, c.tp.Collate + bf.args[0] = BuildFromBinaryFunction(ctx, args[0], ft) sig = &builtinCastStringAsStringSig{bf} sig.setPbCode(tipb.ScalarFuncSig_CastStringAsString) return sig, nil @@ -292,6 +297,9 @@ func (c *castAsStringFunctionClass) getFunction(ctx sessionctx.Context, args []E argTp := args[0].GetType().EvalType() switch argTp { case types.ETInt: + if bf.tp.Flen == types.UnspecifiedLength { + bf.tp.Flen = args[0].GetType().Flen + } sig = &builtinCastIntAsStringSig{bf} sig.setPbCode(tipb.ScalarFuncSig_CastIntAsString) case types.ETReal: @@ -1915,23 +1923,23 @@ func WrapWithCastAsString(ctx sessionctx.Context, expr Expression) Expression { return expr } argLen := exprTp.Flen - // If expr is decimal, we should take the decimal point and negative sign - // into consideration, so we set `expr.GetType().Flen + 2` as the `argLen`. + // If expr is decimal, we should take the decimal point ,negative sign and the leading zero(0.xxx) + // into consideration, so we set `expr.GetType().Flen + 3` as the `argLen`. // Since the length of float and double is not accurate, we do not handle // them. if exprTp.Tp == mysql.TypeNewDecimal && argLen != int(types.UnspecifiedFsp) { - argLen += 2 + argLen += 3 } if exprTp.EvalType() == types.ETInt { argLen = mysql.MaxIntWidth } - // because we can't control the length of cast(float as char) for now, we can't determine the argLen + // Because we can't control the length of cast(float as char) for now, we can't determine the argLen. if exprTp.Tp == mysql.TypeFloat || exprTp.Tp == mysql.TypeDouble { argLen = -1 } tp := types.NewFieldType(mysql.TypeVarString) if expr.Coercibility() == CoercibilityExplicit { - tp.Charset, tp.Collate = expr.CharsetAndCollation(ctx) + tp.Charset, tp.Collate = expr.CharsetAndCollation() } else { tp.Charset, tp.Collate = ctx.GetSessionVars().GetCharsetInfo() } diff --git a/expression/builtin_cast_test.go b/expression/builtin_cast_test.go index 7f006b25d690a..0d60f9d8b6e3d 100644 --- a/expression/builtin_cast_test.go +++ b/expression/builtin_cast_test.go @@ -18,9 +18,9 @@ import ( "fmt" "math" "strconv" + "testing" "time" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/charset" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" @@ -28,10 +28,13 @@ import ( "github.com/pingcap/tidb/types/json" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/mock" + "github.com/stretchr/testify/require" ) -func (s *testEvaluatorSuite) TestCastXXX(c *C) { - ctx, sc := s.ctx, s.ctx.GetSessionVars().StmtCtx +func TestCastFunctions(t *testing.T) { + ctx := createContext(t) + + sc := ctx.GetSessionVars().StmtCtx // Test `cast as char[(N)]` and `cast as binary[(N)]`. originIgnoreTruncate := sc.IgnoreTruncate @@ -51,16 +54,16 @@ func (s *testEvaluatorSuite) TestCastXXX(c *C) { tp.Charset = charset.CharsetUTF8 f := BuildCastFunction(ctx, &Constant{Value: types.NewDatum("你好world"), RetType: tp}, tp) res, err := f.Eval(chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(res.GetString(), Equals, "你好wor") + require.NoError(t, err) + require.Equal(t, "你好wor", res.GetString()) // cast(str as char(N)), N > len([]rune(str)). // cast("a" as char(5)) f = BuildCastFunction(ctx, &Constant{Value: types.NewDatum("a"), RetType: types.NewFieldType(mysql.TypeString)}, tp) res, err = f.Eval(chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(len(res.GetString()), Equals, 1) - c.Assert(res.GetString(), Equals, "a") + require.NoError(t, err) + require.Equal(t, 1, len(res.GetString())) + require.Equal(t, "a", res.GetString()) // cast(str as binary(N)), N < len(str). // cast("你好world" as binary(5)) @@ -70,27 +73,27 @@ func (s *testEvaluatorSuite) TestCastXXX(c *C) { tp.Collate = charset.CollationBin f = BuildCastFunction(ctx, &Constant{Value: types.NewDatum(str), RetType: types.NewFieldType(mysql.TypeString)}, tp) res, err = f.Eval(chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(res.GetString(), Equals, str[:5]) + require.NoError(t, err) + require.Equal(t, str[:5], res.GetString()) // cast(str as binary(N)), N > len([]byte(str)). // cast("a" as binary(5)) f = BuildCastFunction(ctx, &Constant{Value: types.NewDatum("a"), RetType: types.NewFieldType(mysql.TypeString)}, tp) res, err = f.Eval(chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(len(res.GetString()), Equals, 5) - c.Assert(res.GetString(), Equals, string([]byte{'a', 0x00, 0x00, 0x00, 0x00})) + require.NoError(t, err) + require.Equal(t, 5, len(res.GetString())) + require.Equal(t, string([]byte{'a', 0x00, 0x00, 0x00, 0x00}), res.GetString()) // cast(str as binary(N)), N > len([]byte(str)). // cast("a" as binary(4294967295)) tp.Flen = 4294967295 f = BuildCastFunction(ctx, &Constant{Value: types.NewDatum("a"), RetType: types.NewFieldType(mysql.TypeString)}, tp) res, err = f.Eval(chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(res.IsNull(), IsTrue) + require.NoError(t, err) + require.True(t, res.IsNull()) warnings := sc.GetWarnings() lastWarn := warnings[len(warnings)-1] - c.Assert(terror.ErrorEqual(errWarnAllowedPacketOverflowed, lastWarn.Err), IsTrue, Commentf("err %v", lastWarn.Err)) + require.Truef(t, terror.ErrorEqual(errWarnAllowedPacketOverflowed, lastWarn.Err), "err %v", lastWarn.Err) origSc := sc oldInSelectStmt := sc.InSelectStmt @@ -110,104 +113,104 @@ func (s *testEvaluatorSuite) TestCastXXX(c *C) { } f = BuildCastFunction(ctx, &Constant{Value: types.NewDatum("18446744073709551616"), RetType: types.NewFieldType(mysql.TypeString)}, tp1) res, err = f.Eval(chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(res.GetUint64() == math.MaxUint64, IsTrue) + require.NoError(t, err) + require.True(t, res.GetUint64() == math.MaxUint64) warnings = sc.GetWarnings() lastWarn = warnings[len(warnings)-1] - c.Assert(terror.ErrorEqual(types.ErrTruncatedWrongVal, lastWarn.Err), IsTrue, Commentf("err %v", lastWarn.Err)) + require.Truef(t, terror.ErrorEqual(types.ErrTruncatedWrongVal, lastWarn.Err), "err %v", lastWarn.Err) originFlag := tp1.Flag tp1.Flag |= mysql.UnsignedFlag f = BuildCastFunction(ctx, &Constant{Value: types.NewDatum("-1"), RetType: types.NewFieldType(mysql.TypeString)}, tp1) res, err = f.Eval(chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(res.GetUint64() == 18446744073709551615, IsTrue) + require.NoError(t, err) + require.True(t, res.GetUint64() == 18446744073709551615) warnings = sc.GetWarnings() lastWarn = warnings[len(warnings)-1] - c.Assert(terror.ErrorEqual(types.ErrCastNegIntAsUnsigned, lastWarn.Err), IsTrue, Commentf("err %v", lastWarn.Err)) + require.Truef(t, terror.ErrorEqual(types.ErrCastNegIntAsUnsigned, lastWarn.Err), "err %v", lastWarn.Err) tp1.Flag = originFlag previousWarnings := len(sc.GetWarnings()) f = BuildCastFunction(ctx, &Constant{Value: types.NewDatum("-1"), RetType: types.NewFieldType(mysql.TypeString)}, tp1) res, err = f.Eval(chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(res.GetInt64() == -1, IsTrue) - c.Assert(len(sc.GetWarnings()) == previousWarnings, IsTrue) + require.NoError(t, err) + require.True(t, res.GetInt64() == -1) + require.True(t, len(sc.GetWarnings()) == previousWarnings) f = BuildCastFunction(ctx, &Constant{Value: types.NewDatum("-18446744073709551616"), RetType: types.NewFieldType(mysql.TypeString)}, tp1) res, err = f.Eval(chunk.Row{}) - c.Assert(err, IsNil) - t := math.MinInt64 + require.NoError(t, err) + limit := math.MinInt64 // 9223372036854775808 - c.Assert(res.GetUint64() == uint64(t), IsTrue) + require.True(t, res.GetUint64() == uint64(limit)) warnings = sc.GetWarnings() lastWarn = warnings[len(warnings)-1] - c.Assert(terror.ErrorEqual(types.ErrTruncatedWrongVal, lastWarn.Err), IsTrue, Commentf("err %v", lastWarn.Err)) + require.Truef(t, terror.ErrorEqual(types.ErrTruncatedWrongVal, lastWarn.Err), "err %v", lastWarn.Err) // cast('125e342.83' as unsigned) f = BuildCastFunction(ctx, &Constant{Value: types.NewDatum("125e342.83"), RetType: types.NewFieldType(mysql.TypeString)}, tp1) res, err = f.Eval(chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(res.GetUint64() == 125, IsTrue) + require.NoError(t, err) + require.True(t, res.GetUint64() == 125) warnings = sc.GetWarnings() lastWarn = warnings[len(warnings)-1] - c.Assert(terror.ErrorEqual(types.ErrTruncatedWrongVal, lastWarn.Err), IsTrue, Commentf("err %v", lastWarn.Err)) + require.Truef(t, terror.ErrorEqual(types.ErrTruncatedWrongVal, lastWarn.Err), "err %v", lastWarn.Err) // cast('1e9223372036854775807' as unsigned) f = BuildCastFunction(ctx, &Constant{Value: types.NewDatum("1e9223372036854775807"), RetType: types.NewFieldType(mysql.TypeString)}, tp1) res, err = f.Eval(chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(res.GetUint64() == 1, IsTrue) + require.NoError(t, err) + require.True(t, res.GetUint64() == 1) warnings = sc.GetWarnings() lastWarn = warnings[len(warnings)-1] - c.Assert(terror.ErrorEqual(types.ErrTruncatedWrongVal, lastWarn.Err), IsTrue, Commentf("err %v", lastWarn.Err)) + require.Truef(t, terror.ErrorEqual(types.ErrTruncatedWrongVal, lastWarn.Err), "err %v", lastWarn.Err) // cast('18446744073709551616' as signed); mask := ^mysql.UnsignedFlag tp1.Flag &= mask f = BuildCastFunction(ctx, &Constant{Value: types.NewDatum("18446744073709551616"), RetType: types.NewFieldType(mysql.TypeString)}, tp1) res, err = f.Eval(chunk.Row{}) - c.Assert(err, IsNil) - c.Check(res.GetInt64(), Equals, int64(-1)) + require.NoError(t, err) + require.Equal(t, int64(-1), res.GetInt64()) warnings = sc.GetWarnings() lastWarn = warnings[len(warnings)-1] - c.Assert(terror.ErrorEqual(types.ErrTruncatedWrongVal, lastWarn.Err), IsTrue, Commentf("err %v", lastWarn.Err)) + require.Truef(t, terror.ErrorEqual(types.ErrTruncatedWrongVal, lastWarn.Err), "err %v", lastWarn.Err) // cast('18446744073709551614' as signed); f = BuildCastFunction(ctx, &Constant{Value: types.NewDatum("18446744073709551614"), RetType: types.NewFieldType(mysql.TypeString)}, tp1) res, err = f.Eval(chunk.Row{}) - c.Assert(err, IsNil) - c.Check(res.GetInt64(), Equals, int64(-2)) + require.NoError(t, err) + require.Equal(t, int64(-2), res.GetInt64()) warnings = sc.GetWarnings() lastWarn = warnings[len(warnings)-1] - c.Assert(terror.ErrorEqual(types.ErrCastAsSignedOverflow, lastWarn.Err), IsTrue, Commentf("err %v", lastWarn.Err)) + require.Truef(t, terror.ErrorEqual(types.ErrCastAsSignedOverflow, lastWarn.Err), "err %v", lastWarn.Err) // cast('125e342.83' as signed) f = BuildCastFunction(ctx, &Constant{Value: types.NewDatum("125e342.83"), RetType: types.NewFieldType(mysql.TypeString)}, tp1) res, err = f.Eval(chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(res.GetInt64() == 125, IsTrue) + require.NoError(t, err) + require.True(t, res.GetInt64() == 125) warnings = sc.GetWarnings() lastWarn = warnings[len(warnings)-1] - c.Assert(terror.ErrorEqual(types.ErrTruncatedWrongVal, lastWarn.Err), IsTrue, Commentf("err %v", lastWarn.Err)) + require.Truef(t, terror.ErrorEqual(types.ErrTruncatedWrongVal, lastWarn.Err), "err %v", lastWarn.Err) // cast('1e9223372036854775807' as signed) f = BuildCastFunction(ctx, &Constant{Value: types.NewDatum("1e9223372036854775807"), RetType: types.NewFieldType(mysql.TypeString)}, tp1) res, err = f.Eval(chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(res.GetInt64() == 1, IsTrue) + require.NoError(t, err) + require.True(t, res.GetInt64() == 1) warnings = sc.GetWarnings() lastWarn = warnings[len(warnings)-1] - c.Assert(terror.ErrorEqual(types.ErrTruncatedWrongVal, lastWarn.Err), IsTrue, Commentf("err %v", lastWarn.Err)) + require.Truef(t, terror.ErrorEqual(types.ErrTruncatedWrongVal, lastWarn.Err), "err %v", lastWarn.Err) // create table t1(s1 time); // insert into t1 values('11:11:11'); @@ -222,15 +225,15 @@ func (s *testEvaluatorSuite) TestCastXXX(c *C) { } f = BuildCastFunction(ctx, &Constant{Value: timeDatum, RetType: types.NewFieldType(mysql.TypeDatetime)}, ft) res, err = f.Eval(chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) resDecimal := new(types.MyDecimal) err = resDecimal.FromString([]byte("99999.99")) - c.Assert(err, IsNil) - c.Assert(res.GetMysqlDecimal().Compare(resDecimal), Equals, 0) + require.NoError(t, err) + require.Equal(t, 0, res.GetMysqlDecimal().Compare(resDecimal)) warnings = sc.GetWarnings() lastWarn = warnings[len(warnings)-1] - c.Assert(terror.ErrorEqual(types.ErrOverflow, lastWarn.Err), IsTrue, Commentf("err %v", lastWarn.Err)) + require.Truef(t, terror.ErrorEqual(types.ErrOverflow, lastWarn.Err), "err %v", lastWarn.Err) sc = origSc // create table tt(a bigint unsigned); @@ -248,16 +251,16 @@ func (s *testEvaluatorSuite) TestCastXXX(c *C) { rt.Flag = mysql.BinaryFlag | mysql.UnsignedFlag f = BuildCastFunction(ctx, &Constant{Value: types.NewUintDatum(18446744073709551615), RetType: rt}, ft) res, err = f.Eval(chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) u, err := res.GetMysqlDecimal().ToUint() - c.Assert(err, IsNil) - c.Assert(u == 18446744073709551615, IsTrue) + require.NoError(t, err) + require.True(t, u == 18446744073709551615) // cast(bad_string as decimal) for _, s := range []string{"hello", ""} { f = BuildCastFunction(ctx, &Constant{Value: types.NewDatum(s), RetType: types.NewFieldType(mysql.TypeNewDecimal)}, tp) res, err = f.Eval(chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) } // cast(1234 as char(0)) @@ -265,9 +268,9 @@ func (s *testEvaluatorSuite) TestCastXXX(c *C) { tp.Charset = charset.CharsetUTF8 f = BuildCastFunction(ctx, &Constant{Value: types.NewDatum(1234), RetType: types.NewFieldType(mysql.TypeString)}, tp) res, err = f.Eval(chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(len(res.GetString()), Equals, 0) - c.Assert(res.GetString(), Equals, "") + require.NoError(t, err) + require.Equal(t, 0, len(res.GetString())) + require.Equal(t, "", res.GetString()) } var ( @@ -305,8 +308,10 @@ var ( jsonDuration = types.NewDatum(json.CreateBinary(duration.String())) ) -func (s *testEvaluatorSuite) TestCastFuncSig(c *C) { - ctx, sc := s.ctx, s.ctx.GetSessionVars().StmtCtx +func TestCastFuncSig(t *testing.T) { + ctx := createContext(t) + + sc := ctx.GetSessionVars().StmtCtx originIgnoreTruncate := sc.IgnoreTruncate originTZ := sc.TimeZone sc.IgnoreTruncate = true @@ -356,10 +361,10 @@ func (s *testEvaluatorSuite) TestCastFuncSig(c *C) { chunk.MutRowFromDatums([]types.Datum{durationDatum}), }, } - for i, t := range castToDecCases { - args := []Expression{t.before} + for i, c := range castToDecCases { + args := []Expression{c.before} b, err := newBaseBuiltinFunc(ctx, "", args, 0) - c.Assert(err, IsNil) + require.NoError(t, err) decFunc := newBaseBuiltinCastFunc(b, false) decFunc.tp = types.NewFieldType(mysql.TypeNewDecimal) switch i { @@ -376,10 +381,10 @@ func (s *testEvaluatorSuite) TestCastFuncSig(c *C) { case 5: sig = &builtinCastDecimalAsDecimalSig{decFunc} } - res, isNull, err := sig.evalDecimal(t.row.ToRow()) - c.Assert(isNull, Equals, false) - c.Assert(err, IsNil) - c.Assert(res.Compare(t.after), Equals, 0) + res, isNull, err := sig.evalDecimal(c.row.ToRow()) + require.Equal(t, false, isNull) + require.NoError(t, err) + require.Equal(t, 0, res.Compare(c.after)) } durationColumn.RetType.Decimal = 1 @@ -440,12 +445,12 @@ func (s *testEvaluatorSuite) TestCastFuncSig(c *C) { }, } - for i, t := range castToDecCases2 { - args := []Expression{t.before} + for i, c := range castToDecCases2 { + args := []Expression{c.before} tp := types.NewFieldType(mysql.TypeNewDecimal) - tp.Flen, tp.Decimal = t.flen, t.decimal + tp.Flen, tp.Decimal = c.flen, c.decimal b, err := newBaseBuiltinFunc(ctx, "", args, 0) - c.Assert(err, IsNil) + require.NoError(t, err) decFunc := newBaseBuiltinCastFunc(b, false) decFunc.tp = tp switch i { @@ -462,10 +467,10 @@ func (s *testEvaluatorSuite) TestCastFuncSig(c *C) { case 5: sig = &builtinCastDecimalAsDecimalSig{decFunc} } - res, isNull, err := sig.evalDecimal(t.row.ToRow()) - c.Assert(isNull, Equals, false) - c.Assert(err, IsNil) - c.Assert(res.ToString(), DeepEquals, t.after.ToString()) + res, isNull, err := sig.evalDecimal(c.row.ToRow()) + require.Equal(t, false, isNull) + require.NoError(t, err) + require.Equal(t, c.after.ToString(), res.ToString()) } durationColumn.RetType.Decimal = 0 @@ -512,10 +517,10 @@ func (s *testEvaluatorSuite) TestCastFuncSig(c *C) { chunk.MutRowFromDatums([]types.Datum{jsonInt}), }, } - for i, t := range castToIntCases { - args := []Expression{t.before} + for i, c := range castToIntCases { + args := []Expression{c.before} b, err := newBaseBuiltinFunc(ctx, "", args, 0) - c.Assert(err, IsNil) + require.NoError(t, err) intFunc := newBaseBuiltinCastFunc(b, false) switch i { case 0: @@ -531,10 +536,10 @@ func (s *testEvaluatorSuite) TestCastFuncSig(c *C) { case 5: sig = &builtinCastJSONAsIntSig{intFunc} } - res, isNull, err := sig.evalInt(t.row.ToRow()) - c.Assert(isNull, Equals, false) - c.Assert(err, IsNil) - c.Assert(res, Equals, t.after) + res, isNull, err := sig.evalInt(c.row.ToRow()) + require.False(t, isNull) + require.NoError(t, err) + require.Equal(t, c.after, res) } // Test cast as real. @@ -580,10 +585,10 @@ func (s *testEvaluatorSuite) TestCastFuncSig(c *C) { chunk.MutRowFromDatums([]types.Datum{jsonInt}), }, } - for i, t := range castToRealCases { - args := []Expression{t.before} + for i, c := range castToRealCases { + args := []Expression{c.before} b, err := newBaseBuiltinFunc(ctx, "", args, 0) - c.Assert(err, IsNil) + require.NoError(t, err) realFunc := newBaseBuiltinCastFunc(b, false) switch i { case 0: @@ -599,10 +604,10 @@ func (s *testEvaluatorSuite) TestCastFuncSig(c *C) { case 5: sig = &builtinCastJSONAsRealSig{realFunc} } - res, isNull, err := sig.evalReal(t.row.ToRow()) - c.Assert(isNull, Equals, false) - c.Assert(err, IsNil) - c.Assert(res, Equals, t.after) + res, isNull, err := sig.evalReal(c.row.ToRow()) + require.False(t, isNull) + require.NoError(t, err) + require.Equal(t, c.after, res) } // Test cast as string. @@ -654,12 +659,12 @@ func (s *testEvaluatorSuite) TestCastFuncSig(c *C) { chunk.MutRowFromDatums([]types.Datum{types.NewStringDatum("1234")}), }, } - for i, t := range castToStringCases { + for i, c := range castToStringCases { tp := types.NewFieldType(mysql.TypeVarString) tp.Charset = charset.CharsetBin - args := []Expression{t.before} + args := []Expression{c.before} stringFunc, err := newBaseBuiltinFunc(ctx, "", args, 0) - c.Assert(err, IsNil) + require.NoError(t, err) stringFunc.tp = tp switch i { case 0: @@ -677,10 +682,10 @@ func (s *testEvaluatorSuite) TestCastFuncSig(c *C) { case 6: sig = &builtinCastStringAsStringSig{stringFunc} } - res, isNull, err := sig.evalString(t.row.ToRow()) - c.Assert(isNull, Equals, false) - c.Assert(err, IsNil) - c.Assert(res, Equals, t.after) + res, isNull, err := sig.evalString(c.row.ToRow()) + require.False(t, isNull) + require.NoError(t, err) + require.Equal(t, c.after, res) } // Test cast as string. @@ -733,12 +738,12 @@ func (s *testEvaluatorSuite) TestCastFuncSig(c *C) { chunk.MutRowFromDatums([]types.Datum{types.NewStringDatum("你好world")}), }, } - for i, t := range castToStringCases2 { - args := []Expression{t.before} + for i, c := range castToStringCases2 { + args := []Expression{c.before} tp := types.NewFieldType(mysql.TypeVarString) - tp.Flen, tp.Charset = t.flen, charset.CharsetBin + tp.Flen, tp.Charset = c.flen, charset.CharsetBin stringFunc, err := newBaseBuiltinFunc(ctx, "", args, 0) - c.Assert(err, IsNil) + require.NoError(t, err) stringFunc.tp = tp switch i { case 0: @@ -755,10 +760,10 @@ func (s *testEvaluatorSuite) TestCastFuncSig(c *C) { stringFunc.tp.Charset = charset.CharsetUTF8 sig = &builtinCastStringAsStringSig{stringFunc} } - res, isNull, err := sig.evalString(t.row.ToRow()) - c.Assert(isNull, Equals, false) - c.Assert(err, IsNil) - c.Assert(res, Equals, t.after) + res, isNull, err := sig.evalString(c.row.ToRow()) + require.False(t, isNull) + require.NoError(t, err) + require.Equal(t, c.after, res) } castToTimeCases := []struct { @@ -809,12 +814,12 @@ func (s *testEvaluatorSuite) TestCastFuncSig(c *C) { chunk.MutRowFromDatums([]types.Datum{timeDatum}), }, } - for i, t := range castToTimeCases { - args := []Expression{t.before} + for i, c := range castToTimeCases { + args := []Expression{c.before} tp := types.NewFieldType(mysql.TypeDatetime) tp.Decimal = int(types.DefaultFsp) timeFunc, err := newBaseBuiltinFunc(ctx, "", args, 0) - c.Assert(err, IsNil) + require.NoError(t, err) timeFunc.tp = tp switch i { case 0: @@ -832,10 +837,10 @@ func (s *testEvaluatorSuite) TestCastFuncSig(c *C) { case 6: sig = &builtinCastTimeAsTimeSig{timeFunc} } - res, isNull, err := sig.evalTime(t.row.ToRow()) - c.Assert(err, IsNil) - c.Assert(isNull, Equals, false) - c.Assert(res.String(), Equals, t.after.String()) + res, isNull, err := sig.evalTime(c.row.ToRow()) + require.NoError(t, err) + require.False(t, isNull) + require.Equal(t, c.after.String(), res.String()) } castToTimeCases2 := []struct { @@ -894,12 +899,12 @@ func (s *testEvaluatorSuite) TestCastFuncSig(c *C) { chunk.MutRowFromDatums([]types.Datum{timeDatum}), }, } - for i, t := range castToTimeCases2 { - args := []Expression{t.before} - tp := types.NewFieldType(t.tp) - tp.Decimal = int(t.fsp) + for i, c := range castToTimeCases2 { + args := []Expression{c.before} + tp := types.NewFieldType(c.tp) + tp.Decimal = int(c.fsp) timeFunc, err := newBaseBuiltinFunc(ctx, "", args, 0) - c.Assert(err, IsNil) + require.NoError(t, err) timeFunc.tp = tp switch i { case 0: @@ -915,17 +920,17 @@ func (s *testEvaluatorSuite) TestCastFuncSig(c *C) { case 5: sig = &builtinCastTimeAsTimeSig{timeFunc} } - res, isNull, err := sig.evalTime(t.row.ToRow()) - c.Assert(isNull, Equals, false) - c.Assert(err, IsNil) - resAfter := t.after.String() - if t.fsp > 0 { + res, isNull, err := sig.evalTime(c.row.ToRow()) + require.Equal(t, false, isNull) + require.NoError(t, err) + resAfter := c.after.String() + if c.fsp > 0 { resAfter += "." - for i := 0; i < int(t.fsp); i++ { + for i := 0; i < int(c.fsp); i++ { resAfter += "0" } } - c.Assert(res.String(), Equals, resAfter) + require.Equal(t, resAfter, res.String()) } castToDurationCases := []struct { @@ -976,12 +981,12 @@ func (s *testEvaluatorSuite) TestCastFuncSig(c *C) { chunk.MutRowFromDatums([]types.Datum{durationDatum}), }, } - for i, t := range castToDurationCases { - args := []Expression{t.before} + for i, c := range castToDurationCases { + args := []Expression{c.before} tp := types.NewFieldType(mysql.TypeDuration) tp.Decimal = int(types.DefaultFsp) durationFunc, err := newBaseBuiltinFunc(ctx, "", args, 0) - c.Assert(err, IsNil) + require.NoError(t, err) durationFunc.tp = tp switch i { case 0: @@ -999,10 +1004,10 @@ func (s *testEvaluatorSuite) TestCastFuncSig(c *C) { case 6: sig = &builtinCastDurationAsDurationSig{durationFunc} } - res, isNull, err := sig.evalDuration(t.row.ToRow()) - c.Assert(isNull, Equals, false) - c.Assert(err, IsNil) - c.Assert(res.String(), Equals, t.after.String()) + res, isNull, err := sig.evalDuration(c.row.ToRow()) + require.False(t, isNull) + require.NoError(t, err) + require.Equal(t, c.after.String(), res.String()) } castToDurationCases2 := []struct { @@ -1054,12 +1059,12 @@ func (s *testEvaluatorSuite) TestCastFuncSig(c *C) { 6, }, } - for i, t := range castToDurationCases2 { - args := []Expression{t.before} + for i, c := range castToDurationCases2 { + args := []Expression{c.before} tp := types.NewFieldType(mysql.TypeDuration) - tp.Decimal = t.fsp + tp.Decimal = c.fsp durationFunc, err := newBaseBuiltinFunc(ctx, "", args, 0) - c.Assert(err, IsNil) + require.NoError(t, err) durationFunc.tp = tp switch i { case 0: @@ -1075,44 +1080,45 @@ func (s *testEvaluatorSuite) TestCastFuncSig(c *C) { case 5: sig = &builtinCastDurationAsDurationSig{durationFunc} } - res, isNull, err := sig.evalDuration(t.row.ToRow()) - c.Assert(isNull, Equals, false) - c.Assert(err, IsNil) - resAfter := t.after.String() - if t.fsp > 0 { + res, isNull, err := sig.evalDuration(c.row.ToRow()) + require.False(t, isNull) + require.NoError(t, err) + resAfter := c.after.String() + if c.fsp > 0 { resAfter += "." - for j := 0; j < t.fsp; j++ { + for j := 0; j < c.fsp; j++ { resAfter += "0" } } - c.Assert(res.String(), Equals, resAfter) + require.Equal(t, resAfter, res.String()) } // null case args := []Expression{&Column{RetType: types.NewFieldType(mysql.TypeDouble), Index: 0}} row := chunk.MutRowFromDatums([]types.Datum{types.NewDatum(nil)}) bf, err := newBaseBuiltinFunc(ctx, "", args, 0) - c.Assert(err, IsNil) + require.NoError(t, err) bf.tp = types.NewFieldType(mysql.TypeVarString) sig = &builtinCastRealAsStringSig{bf} sRes, isNull, err := sig.evalString(row.ToRow()) - c.Assert(sRes, Equals, "") - c.Assert(isNull, Equals, true) - c.Assert(err, IsNil) + require.Equal(t, "", sRes) + require.Equal(t, true, isNull) + require.NoError(t, err) // test hybridType case. args = []Expression{&Constant{Value: types.NewDatum(types.Enum{Name: "a", Value: 0}), RetType: types.NewFieldType(mysql.TypeEnum)}} b, err := newBaseBuiltinFunc(ctx, "", args, 0) - c.Assert(err, IsNil) + require.NoError(t, err) sig = &builtinCastStringAsIntSig{newBaseBuiltinCastFunc(b, false)} iRes, isNull, err := sig.evalInt(chunk.Row{}) - c.Assert(isNull, Equals, false) - c.Assert(err, IsNil) - c.Assert(iRes, Equals, int64(0)) + require.Equal(t, false, isNull) + require.NoError(t, err) + require.Equal(t, int64(0), iRes) } -func (s *testEvaluatorSuite) TestCastJSONAsDecimalSig(c *C) { - ctx, sc := s.ctx, s.ctx.GetSessionVars().StmtCtx +func TestCastJSONAsDecimalSig(t *testing.T) { + ctx := createContext(t) + sc := ctx.GetSessionVars().StmtCtx originIgnoreTruncate := sc.IgnoreTruncate sc.IgnoreTruncate = true defer func() { @@ -1121,7 +1127,7 @@ func (s *testEvaluatorSuite) TestCastJSONAsDecimalSig(c *C) { col := &Column{RetType: types.NewFieldType(mysql.TypeJSON), Index: 0} b, err := newBaseBuiltinFunc(ctx, "", []Expression{col}, 0) - c.Assert(err, IsNil) + require.NoError(t, err) decFunc := newBaseBuiltinCastFunc(b, false) decFunc.tp = types.NewFieldType(mysql.TypeNewDecimal) decFunc.tp.Flen = 60 @@ -1146,18 +1152,18 @@ func (s *testEvaluatorSuite) TestCastJSONAsDecimalSig(c *C) { } for _, tt := range tests { j, err := json.ParseBinaryFromString(tt.In) - c.Assert(err, IsNil) + require.NoError(t, err) row := chunk.MutRowFromDatums([]types.Datum{types.NewDatum(j)}) res, isNull, err := sig.evalDecimal(row.ToRow()) - c.Assert(isNull, Equals, false) - c.Assert(err, IsNil) - c.Assert(res.Compare(tt.Out), Equals, 0) + require.Equal(t, false, isNull) + require.NoError(t, err) + require.Equal(t, 0, res.Compare(tt.Out)) } } // TestWrapWithCastAsTypesClasses tests WrapWithCastAsInt/Real/String/Decimal. -func (s *testEvaluatorSuite) TestWrapWithCastAsTypesClasses(c *C) { - ctx := s.ctx +func TestWrapWithCastAsTypesClasses(t *testing.T) { + ctx := createContext(t) durationColumn0 := &Column{RetType: types.NewFieldType(mysql.TypeDuration), Index: 0} durationColumn0.RetType.Decimal = int(types.DefaultFsp) @@ -1232,74 +1238,75 @@ func (s *testEvaluatorSuite) TestWrapWithCastAsTypesClasses(c *C) { 97, 97, types.NewDecFromInt(0x61), "a", }, } - for i, t := range cases { + for i, c := range cases { // Test wrapping with CastAsInt. - intExpr := WrapWithCastAsInt(ctx, t.expr) - c.Assert(intExpr.GetType().EvalType(), Equals, types.ETInt) - intRes, isNull, err := intExpr.EvalInt(ctx, t.row.ToRow()) - c.Assert(err, IsNil, Commentf("cast[%v]: %#v", i, t)) - c.Assert(isNull, Equals, false) - c.Assert(intRes, Equals, t.intRes) + intExpr := WrapWithCastAsInt(ctx, c.expr) + require.Equal(t, types.ETInt, intExpr.GetType().EvalType()) + intRes, isNull, err := intExpr.EvalInt(ctx, c.row.ToRow()) + require.NoErrorf(t, err, "cast[%v]: %#v", i, t) + require.Equal(t, false, isNull) + require.Equal(t, c.intRes, intRes) // Test wrapping with CastAsReal. - realExpr := WrapWithCastAsReal(ctx, t.expr) - c.Assert(realExpr.GetType().EvalType(), Equals, types.ETReal) - realRes, isNull, err := realExpr.EvalReal(ctx, t.row.ToRow()) - c.Assert(err, IsNil) - c.Assert(isNull, Equals, false) - c.Assert(realRes, Equals, t.realRes, Commentf("cast[%v]: %#v", i, t)) + realExpr := WrapWithCastAsReal(ctx, c.expr) + require.Equal(t, types.ETReal, realExpr.GetType().EvalType()) + realRes, isNull, err := realExpr.EvalReal(ctx, c.row.ToRow()) + require.NoError(t, err) + require.Equal(t, false, isNull) + require.Equalf(t, c.realRes, realRes, "cast[%v]: %#v", i, t) // Test wrapping with CastAsDecimal. - decExpr := WrapWithCastAsDecimal(ctx, t.expr) - c.Assert(decExpr.GetType().EvalType(), Equals, types.ETDecimal) - decRes, isNull, err := decExpr.EvalDecimal(ctx, t.row.ToRow()) - c.Assert(err, IsNil, Commentf("case[%v]: %#v\n", i, t)) - c.Assert(isNull, Equals, false) - c.Assert(decRes.Compare(t.decRes), Equals, 0, Commentf("case[%v]: %#v\n", i, t)) + decExpr := WrapWithCastAsDecimal(ctx, c.expr) + require.Equal(t, types.ETDecimal, decExpr.GetType().EvalType()) + decRes, isNull, err := decExpr.EvalDecimal(ctx, c.row.ToRow()) + require.NoError(t, err, "case[%v]: %#v\n", i, t) + require.Equal(t, false, isNull) + require.Equalf(t, 0, decRes.Compare(c.decRes), "case[%v]: %#v\n", i, t) // Test wrapping with CastAsString. - strExpr := WrapWithCastAsString(ctx, t.expr) - c.Assert(strExpr.GetType().EvalType().IsStringKind(), IsTrue) - strRes, isNull, err := strExpr.EvalString(ctx, t.row.ToRow()) - c.Assert(err, IsNil) - c.Assert(isNull, Equals, false) - c.Assert(strRes, Equals, t.stringRes) + strExpr := WrapWithCastAsString(ctx, c.expr) + require.True(t, strExpr.GetType().EvalType().IsStringKind()) + strRes, isNull, err := strExpr.EvalString(ctx, c.row.ToRow()) + require.NoError(t, err) + require.Equal(t, false, isNull) + require.Equal(t, c.stringRes, strRes) } unsignedIntExpr := &Column{RetType: &types.FieldType{Tp: mysql.TypeLonglong, Flag: mysql.UnsignedFlag, Flen: mysql.MaxIntWidth, Decimal: 0}, Index: 0} // test cast unsigned int as string. strExpr := WrapWithCastAsString(ctx, unsignedIntExpr) - c.Assert(strExpr.GetType().EvalType().IsStringKind(), IsTrue) + require.True(t, strExpr.GetType().EvalType().IsStringKind()) strRes, isNull, err := strExpr.EvalString(ctx, chunk.MutRowFromDatums([]types.Datum{types.NewUintDatum(math.MaxUint64)}).ToRow()) - c.Assert(err, IsNil) - c.Assert(strRes, Equals, strconv.FormatUint(math.MaxUint64, 10)) - c.Assert(isNull, Equals, false) + require.NoError(t, err) + require.Equal(t, strconv.FormatUint(math.MaxUint64, 10), strRes) + require.Equal(t, false, isNull) strRes, isNull, err = strExpr.EvalString(ctx, chunk.MutRowFromDatums([]types.Datum{types.NewUintDatum(1234)}).ToRow()) - c.Assert(err, IsNil) - c.Assert(isNull, Equals, false) - c.Assert(strRes, Equals, strconv.FormatUint(uint64(1234), 10)) + require.NoError(t, err) + require.Equal(t, false, isNull) + require.Equal(t, strconv.FormatUint(uint64(1234), 10), strRes) // test cast unsigned int as decimal. decExpr := WrapWithCastAsDecimal(ctx, unsignedIntExpr) - c.Assert(decExpr.GetType().EvalType(), Equals, types.ETDecimal) + require.Equal(t, types.ETDecimal, decExpr.GetType().EvalType()) decRes, isNull, err := decExpr.EvalDecimal(ctx, chunk.MutRowFromDatums([]types.Datum{types.NewUintDatum(uint64(1234))}).ToRow()) - c.Assert(err, IsNil) - c.Assert(isNull, Equals, false) - c.Assert(decRes.Compare(types.NewDecFromUint(uint64(1234))), Equals, 0) + require.NoError(t, err) + require.Equal(t, false, isNull) + require.Equal(t, 0, decRes.Compare(types.NewDecFromUint(uint64(1234)))) // test cast unsigned int as Time. timeExpr := WrapWithCastAsTime(ctx, unsignedIntExpr, types.NewFieldType(mysql.TypeDatetime)) - c.Assert(timeExpr.GetType().Tp, Equals, mysql.TypeDatetime) + require.Equal(t, mysql.TypeDatetime, timeExpr.GetType().Tp) timeRes, isNull, err := timeExpr.EvalTime(ctx, chunk.MutRowFromDatums([]types.Datum{types.NewUintDatum(uint64(curTimeInt))}).ToRow()) - c.Assert(err, IsNil) - c.Assert(isNull, Equals, false) - c.Assert(timeRes.Compare(tm), Equals, 0) + require.NoError(t, err) + require.Equal(t, false, isNull) + require.Equal(t, 0, timeRes.Compare(tm)) } -func (s *testEvaluatorSuite) TestWrapWithCastAsTime(c *C) { - sc := s.ctx.GetSessionVars().StmtCtx +func TestWrapWithCastAsTime(t *testing.T) { + ctx := createContext(t) + sc := ctx.GetSessionVars().StmtCtx save := sc.TimeZone sc.TimeZone = time.UTC defer func() { @@ -1341,17 +1348,19 @@ func (s *testEvaluatorSuite) TestWrapWithCastAsTime(c *C) { tm, }, } - for d, t := range cases { - expr := WrapWithCastAsTime(s.ctx, t.expr, t.tp) - res, isNull, err := expr.EvalTime(s.ctx, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(isNull, Equals, false) - c.Assert(res.Type(), Equals, t.tp.Tp) - c.Assert(res.Compare(t.res), Equals, 0, Commentf("case %d res = %s, expect = %s", d, res, t.res)) + for d, c := range cases { + expr := WrapWithCastAsTime(ctx, c.expr, c.tp) + res, isNull, err := expr.EvalTime(ctx, chunk.Row{}) + require.NoError(t, err) + require.Equal(t, false, isNull) + require.Equal(t, c.tp.Tp, res.Type()) + require.Zerof(t, res.Compare(c.res), "case %d res = %s, expect = %s", d, res, c.res) } } -func (s *testEvaluatorSuite) TestWrapWithCastAsDuration(c *C) { +func TestWrapWithCastAsDuration(t *testing.T) { + ctx := createContext(t) + cases := []struct { expr Expression }{ @@ -1374,56 +1383,88 @@ func (s *testEvaluatorSuite) TestWrapWithCastAsDuration(c *C) { &Constant{RetType: types.NewFieldType(mysql.TypeDuration), Value: durationDatum}, }, } - for _, t := range cases { - expr := WrapWithCastAsDuration(s.ctx, t.expr) - res, isNull, err := expr.EvalDuration(s.ctx, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(isNull, Equals, false) - c.Assert(res.Compare(duration), Equals, 0) + for _, c := range cases { + expr := WrapWithCastAsDuration(ctx, c.expr) + res, isNull, err := expr.EvalDuration(ctx, chunk.Row{}) + require.NoError(t, err) + require.Equal(t, false, isNull) + require.Zero(t, res.Compare(duration)) } } -func (s *testEvaluatorSuite) TestWrapWithCastAsJSON(c *C) { +func TestWrapWithCastAsString(t *testing.T) { + ctx := createContext(t) + + cases := []struct { + expr Expression + err bool + ret string + }{ + { + &Constant{RetType: types.NewFieldTypeWithCollation(mysql.TypeVarString, charset.CollationBin, 1), Value: types.NewBinaryLiteralDatum([]byte{0x91})}, + true, + "", + }, + { + &Constant{RetType: types.NewFieldTypeWithCollation(mysql.TypeVarString, charset.CollationBin, 1), Value: types.NewBinaryLiteralDatum([]byte{0x61})}, + false, + "a", + }, + } + for _, c := range cases { + expr := BuildCastFunction(ctx, c.expr, types.NewFieldType(mysql.TypeVarString)) + res, _, err := expr.EvalString(ctx, chunk.Row{}) + if c.err { + require.Error(t, err) + } else { + require.Equal(t, c.ret, res) + } + } +} + +func TestWrapWithCastAsJSON(t *testing.T) { + ctx := createContext(t) + input := &Column{RetType: &types.FieldType{Tp: mysql.TypeJSON}} - expr := WrapWithCastAsJSON(s.ctx, input) + expr := WrapWithCastAsJSON(ctx, input) output, ok := expr.(*Column) - c.Assert(ok, IsTrue) - c.Assert(output, Equals, input) + require.True(t, ok) + require.Equal(t, input, output) } -func (s *testEvaluatorSuite) TestCastIntAsIntVec(c *C) { +func TestCastIntAsIntVec(t *testing.T) { cast, input, result := genCastIntAsInt() - c.Assert(cast.vecEvalInt(input, result), IsNil) + require.NoError(t, cast.vecEvalInt(input, result)) i64s := result.Int64s() it := chunk.NewIterator4Chunk(input) i := 0 for row := it.Begin(); row != it.End(); row = it.Next() { v, _, err := cast.evalInt(row) - c.Assert(err, IsNil) - c.Assert(v, Equals, i64s[i]) + require.NoError(t, err) + require.Equal(t, i64s[i], v) i++ } cast.inUnion = true cast.getRetTp().Flag |= mysql.UnsignedFlag - c.Assert(cast.vecEvalInt(input, result), IsNil) + require.NoError(t, cast.vecEvalInt(input, result)) i64s = result.Int64s() it = chunk.NewIterator4Chunk(input) i = 0 for row := it.Begin(); row != it.End(); row = it.Next() { v, _, err := cast.evalInt(row) - c.Assert(err, IsNil) - c.Assert(v, Equals, i64s[i]) + require.NoError(t, err) + require.Equal(t, i64s[i], v) i++ } } // for issue https://github.com/pingcap/tidb/issues/16825 -func (s *testEvaluatorSuite) TestCastStringAsDecimalSigWithUnsignedFlagInUnion(c *C) { +func TestCastStringAsDecimalSigWithUnsignedFlagInUnion(t *testing.T) { col := &Column{RetType: types.NewFieldType(mysql.TypeString), Index: 0} b, err := newBaseBuiltinFunc(mock.NewContext(), "", []Expression{col}, 0) - c.Assert(err, IsNil) + require.NoError(t, err) // set `inUnion` to `true` decFunc := newBaseBuiltinCastFunc(b, true) decFunc.tp = types.NewFieldType(mysql.TypeNewDecimal) @@ -1447,10 +1488,10 @@ func (s *testEvaluatorSuite) TestCastStringAsDecimalSigWithUnsignedFlagInUnion(c }, } - for _, t := range cases { - res, isNull, err := cast.evalDecimal(t.row.ToRow()) - c.Assert(isNull, Equals, false) - c.Assert(err, IsNil) - c.Assert(res.Compare(t.res), Equals, 0) + for _, c := range cases { + res, isNull, err := cast.evalDecimal(c.row.ToRow()) + require.Equal(t, false, isNull) + require.NoError(t, err) + require.Equal(t, 0, res.Compare(c.res)) } } diff --git a/expression/builtin_cast_vec_test.go b/expression/builtin_cast_vec_test.go index 63f80f36dfd1f..5e647be3777dd 100644 --- a/expression/builtin_cast_vec_test.go +++ b/expression/builtin_cast_vec_test.go @@ -21,13 +21,13 @@ import ( "testing" "time" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/mock" + "github.com/stretchr/testify/require" ) var vecBuiltinCastCases = map[string][]vecExprBenchCase{ @@ -149,15 +149,15 @@ func (g *datetimeJSONGener) gen() interface{} { return json.CreateBinary(d.String()) } -func (s *testEvaluatorSuite) TestVectorizedBuiltinCastEvalOneVec(c *C) { - testVectorizedEvalOneVec(c, vecBuiltinCastCases) +func TestVectorizedBuiltinCastEvalOneVec(t *testing.T) { + testVectorizedEvalOneVec(t, vecBuiltinCastCases) } -func (s *testEvaluatorSuite) TestVectorizedBuiltinCastFunc(c *C) { - testVectorizedBuiltinFunc(c, vecBuiltinCastCases) +func TestVectorizedBuiltinCastFunc(t *testing.T) { + testVectorizedBuiltinFunc(t, vecBuiltinCastCases) } -func (s *testEvaluatorSuite) TestVectorizedCastRealAsTime(c *C) { +func TestVectorizedCastRealAsTime(t *testing.T) { col := &Column{RetType: types.NewFieldType(mysql.TypeDouble), Index: 0} baseFunc, err := newBaseBuiltinFunc(mock.NewContext(), "", []Expression{col}, 0) if err != nil { @@ -171,16 +171,16 @@ func (s *testEvaluatorSuite) TestVectorizedCastRealAsTime(c *C) { for _, input := range inputs { result := chunk.NewColumn(types.NewFieldType(mysql.TypeDatetime), input.NumRows()) - c.Assert(cast.vecEvalTime(input, result), IsNil) + require.NoError(t, cast.vecEvalTime(input, result)) for i := 0; i < input.NumRows(); i++ { res, isNull, err := cast.evalTime(input.GetRow(i)) - c.Assert(err, IsNil) + require.NoError(t, err) if isNull { - c.Assert(result.IsNull(i), IsTrue) + require.True(t, result.IsNull(i)) continue } - c.Assert(result.IsNull(i), IsFalse) - c.Assert(result.GetTime(i).Compare(res), Equals, 0) + require.False(t, result.IsNull(i)) + require.Zero(t, result.GetTime(i).Compare(res)) } } } @@ -199,7 +199,7 @@ func genCastRealAsTime() *chunk.Chunk { } // for issue https://github.com/pingcap/tidb/issues/16825 -func (s *testEvaluatorSuite) TestVectorizedCastStringAsDecimalWithUnsignedFlagInUnion(c *C) { +func TestVectorizedCastStringAsDecimalWithUnsignedFlagInUnion(t *testing.T) { col := &Column{RetType: types.NewFieldType(mysql.TypeString), Index: 0} baseFunc, err := newBaseBuiltinFunc(mock.NewContext(), "", []Expression{col}, 0) if err != nil { @@ -219,12 +219,12 @@ func (s *testEvaluatorSuite) TestVectorizedCastStringAsDecimalWithUnsignedFlagIn for _, input := range inputs { result := chunk.NewColumn(types.NewFieldType(mysql.TypeNewDecimal), input.NumRows()) - c.Assert(cast.vecEvalDecimal(input, result), IsNil) + require.NoError(t, cast.vecEvalDecimal(input, result)) for i := 0; i < input.NumRows(); i++ { res, isNull, err := cast.evalDecimal(input.GetRow(i)) - c.Assert(isNull, IsFalse) - c.Assert(err, IsNil) - c.Assert(result.GetDecimal(i).Compare(res), Equals, 0) + require.False(t, isNull) + require.NoError(t, err) + require.Zero(t, result.GetDecimal(i).Compare(res)) } } } diff --git a/expression/builtin_compare.go b/expression/builtin_compare.go index 07c20e9f0acd9..609ee26dc09e1 100644 --- a/expression/builtin_compare.go +++ b/expression/builtin_compare.go @@ -26,6 +26,7 @@ import ( "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tipb/go-tipb" ) @@ -49,12 +50,16 @@ var ( _ builtinFunc = &builtinGreatestRealSig{} _ builtinFunc = &builtinGreatestDecimalSig{} _ builtinFunc = &builtinGreatestStringSig{} + _ builtinFunc = &builtinGreatestDurationSig{} _ builtinFunc = &builtinGreatestTimeSig{} + _ builtinFunc = &builtinGreatestCmpStringAsTimeSig{} _ builtinFunc = &builtinLeastIntSig{} _ builtinFunc = &builtinLeastRealSig{} _ builtinFunc = &builtinLeastDecimalSig{} _ builtinFunc = &builtinLeastStringSig{} _ builtinFunc = &builtinLeastTimeSig{} + _ builtinFunc = &builtinLeastDurationSig{} + _ builtinFunc = &builtinLeastCmpStringAsTimeSig{} _ builtinFunc = &builtinIntervalIntSig{} _ builtinFunc = &builtinIntervalRealSig{} @@ -412,7 +417,7 @@ func ResolveType4Between(args [3]Expression) types.EvalType { } // resolveType4Extremum gets compare type for GREATEST and LEAST and BETWEEN (mainly for datetime). -func resolveType4Extremum(args []Expression) types.EvalType { +func resolveType4Extremum(args []Expression) (_ types.EvalType, cmpStringAsDatetime bool) { aggType := aggregateType(args) var temporalItem *types.FieldType @@ -429,10 +434,11 @@ func resolveType4Extremum(args []Expression) types.EvalType { if !types.IsTypeTemporal(aggType.Tp) && temporalItem != nil { aggType.Tp = temporalItem.Tp + cmpStringAsDatetime = true } // TODO: String charset, collation checking are needed. } - return aggType.EvalType() + return aggType.EvalType(), cmpStringAsDatetime } // unsupportedJSONComparison reports warnings while there is a JSON type in least/greatest function's arguments @@ -454,12 +460,9 @@ func (c *greatestFunctionClass) getFunction(ctx sessionctx.Context, args []Expre if err = c.verifyArgs(args); err != nil { return nil, err } - tp := resolveType4Extremum(args) - cmpAsDatetime := false - if tp == types.ETDatetime || tp == types.ETTimestamp { - cmpAsDatetime = true - tp = types.ETString - } else if tp == types.ETDuration { + tp, cmpStringAsDatetime := resolveType4Extremum(args) + if cmpStringAsDatetime { + // Args are temporal and string mixed, we cast all args as string and parse it to temporal mannualy to compare. tp = types.ETString } else if tp == types.ETJson { unsupportedJSONComparison(ctx, args) @@ -473,11 +476,16 @@ func (c *greatestFunctionClass) getFunction(ctx sessionctx.Context, args []Expre if err != nil { return nil, err } - if cmpAsDatetime { - tp = types.ETDatetime - } switch tp { case types.ETInt: + // adjust unsigned flag + greastInitUnsignedFlag := false + if isEqualsInitUnsignedFlag(greastInitUnsignedFlag, args) { + bf.tp.Flag &= ^mysql.UnsignedFlag + } else { + bf.tp.Flag |= mysql.UnsignedFlag + } + sig = &builtinGreatestIntSig{bf} sig.setPbCode(tipb.ScalarFuncSig_GreatestInt) case types.ETReal: @@ -487,8 +495,16 @@ func (c *greatestFunctionClass) getFunction(ctx sessionctx.Context, args []Expre sig = &builtinGreatestDecimalSig{bf} sig.setPbCode(tipb.ScalarFuncSig_GreatestDecimal) case types.ETString: - sig = &builtinGreatestStringSig{bf} - sig.setPbCode(tipb.ScalarFuncSig_GreatestString) + if cmpStringAsDatetime { + sig = &builtinGreatestCmpStringAsTimeSig{bf} + sig.setPbCode(tipb.ScalarFuncSig_GreatestCmpStringAsTime) + } else { + sig = &builtinGreatestStringSig{bf} + sig.setPbCode(tipb.ScalarFuncSig_GreatestString) + } + case types.ETDuration: + sig = &builtinGreatestDurationSig{bf} + sig.setPbCode(tipb.ScalarFuncSig_GreatestDuration) case types.ETDatetime, types.ETTimestamp: sig = &builtinGreatestTimeSig{bf} sig.setPbCode(tipb.ScalarFuncSig_GreatestTime) @@ -630,23 +646,19 @@ func (b *builtinGreatestStringSig) evalString(row chunk.Row) (max string, isNull return } -type builtinGreatestTimeSig struct { +type builtinGreatestCmpStringAsTimeSig struct { baseBuiltinFunc } -func (b *builtinGreatestTimeSig) Clone() builtinFunc { - newSig := &builtinGreatestTimeSig{} +func (b *builtinGreatestCmpStringAsTimeSig) Clone() builtinFunc { + newSig := &builtinGreatestCmpStringAsTimeSig{} newSig.cloneFrom(&b.baseBuiltinFunc) return newSig } -// evalString evals a builtinGreatestTimeSig. +// evalString evals a builtinGreatestCmpStringAsTimeSig. // See http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#function_greatest -func (b *builtinGreatestTimeSig) evalString(row chunk.Row) (res string, isNull bool, err error) { - var ( - strRes string - timeRes types.Time - ) +func (b *builtinGreatestCmpStringAsTimeSig) evalString(row chunk.Row) (strRes string, isNull bool, err error) { sc := b.ctx.GetSessionVars().StmtCtx for i := 0; i < len(b.args); i++ { v, isNull, err := b.args[i].EvalString(b.ctx, row) @@ -665,14 +677,52 @@ func (b *builtinGreatestTimeSig) evalString(row chunk.Row) (res string, isNull b if i == 0 || strings.Compare(v, strRes) > 0 { strRes = v } - if i == 0 || t.Compare(timeRes) > 0 { - timeRes = t + } + return strRes, false, nil +} + +type builtinGreatestTimeSig struct { + baseBuiltinFunc +} + +func (b *builtinGreatestTimeSig) Clone() builtinFunc { + newSig := &builtinGreatestTimeSig{} + newSig.cloneFrom(&b.baseBuiltinFunc) + return newSig +} + +func (b *builtinGreatestTimeSig) evalTime(row chunk.Row) (res types.Time, isNull bool, err error) { + for i := 0; i < len(b.args); i++ { + v, isNull, err := b.args[i].EvalTime(b.ctx, row) + if isNull || err != nil { + return types.ZeroTime, true, err + } + if i == 0 || v.Compare(res) > 0 { + res = v } } - if timeRes.IsZero() { - res = strRes - } else { - res = timeRes.String() + return res, false, nil +} + +type builtinGreatestDurationSig struct { + baseBuiltinFunc +} + +func (b *builtinGreatestDurationSig) Clone() builtinFunc { + newSig := &builtinGreatestDurationSig{} + newSig.cloneFrom(&b.baseBuiltinFunc) + return newSig +} + +func (b *builtinGreatestDurationSig) evalDuration(row chunk.Row) (res types.Duration, isNull bool, err error) { + for i := 0; i < len(b.args); i++ { + v, isNull, err := b.args[i].EvalDuration(b.ctx, row) + if isNull || err != nil { + return types.Duration{}, true, err + } + if i == 0 || v.Compare(res) > 0 { + res = v + } } return res, false, nil } @@ -685,12 +735,9 @@ func (c *leastFunctionClass) getFunction(ctx sessionctx.Context, args []Expressi if err = c.verifyArgs(args); err != nil { return nil, err } - tp := resolveType4Extremum(args) - cmpAsDatetime := false - if tp == types.ETDatetime || tp == types.ETTimestamp { - cmpAsDatetime = true - tp = types.ETString - } else if tp == types.ETDuration { + tp, cmpStringAsDatetime := resolveType4Extremum(args) + if cmpStringAsDatetime { + // Args are temporal and string mixed, we cast all args as string and parse it to temporal mannualy to compare. tp = types.ETString } else if tp == types.ETJson { unsupportedJSONComparison(ctx, args) @@ -704,11 +751,16 @@ func (c *leastFunctionClass) getFunction(ctx sessionctx.Context, args []Expressi if err != nil { return nil, err } - if cmpAsDatetime { - tp = types.ETDatetime - } switch tp { case types.ETInt: + // adjust unsigned flag + leastInitUnsignedFlag := true + if isEqualsInitUnsignedFlag(leastInitUnsignedFlag, args) { + bf.tp.Flag |= mysql.UnsignedFlag + } else { + bf.tp.Flag &= ^mysql.UnsignedFlag + } + sig = &builtinLeastIntSig{bf} sig.setPbCode(tipb.ScalarFuncSig_LeastInt) case types.ETReal: @@ -718,8 +770,16 @@ func (c *leastFunctionClass) getFunction(ctx sessionctx.Context, args []Expressi sig = &builtinLeastDecimalSig{bf} sig.setPbCode(tipb.ScalarFuncSig_LeastDecimal) case types.ETString: - sig = &builtinLeastStringSig{bf} - sig.setPbCode(tipb.ScalarFuncSig_LeastString) + if cmpStringAsDatetime { + sig = &builtinLeastCmpStringAsTimeSig{bf} + sig.setPbCode(tipb.ScalarFuncSig_LeastCmpStringAsTime) + } else { + sig = &builtinLeastStringSig{bf} + sig.setPbCode(tipb.ScalarFuncSig_LeastString) + } + case types.ETDuration: + sig = &builtinLeastDurationSig{bf} + sig.setPbCode(tipb.ScalarFuncSig_LeastDuration) case types.ETDatetime, types.ETTimestamp: sig = &builtinLeastTimeSig{bf} sig.setPbCode(tipb.ScalarFuncSig_LeastTime) @@ -848,24 +908,19 @@ func (b *builtinLeastStringSig) evalString(row chunk.Row) (min string, isNull bo return } -type builtinLeastTimeSig struct { +type builtinLeastCmpStringAsTimeSig struct { baseBuiltinFunc } -func (b *builtinLeastTimeSig) Clone() builtinFunc { - newSig := &builtinLeastTimeSig{} +func (b *builtinLeastCmpStringAsTimeSig) Clone() builtinFunc { + newSig := &builtinLeastCmpStringAsTimeSig{} newSig.cloneFrom(&b.baseBuiltinFunc) return newSig } -// evalString evals a builtinLeastTimeSig. +// evalString evals a builtinLeastCmpStringAsTimeSig. // See http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#functionleast -func (b *builtinLeastTimeSig) evalString(row chunk.Row) (res string, isNull bool, err error) { - var ( - // timeRes will be converted to a strRes only when the arguments is a valid datetime value. - strRes string // Record the strRes of each arguments. - timeRes types.Time // Record the time representation of a valid arguments. - ) +func (b *builtinLeastCmpStringAsTimeSig) evalString(row chunk.Row) (strRes string, isNull bool, err error) { sc := b.ctx.GetSessionVars().StmtCtx for i := 0; i < len(b.args); i++ { v, isNull, err := b.args[i].EvalString(b.ctx, row) @@ -883,15 +938,53 @@ func (b *builtinLeastTimeSig) evalString(row chunk.Row) (res string, isNull bool if i == 0 || strings.Compare(v, strRes) < 0 { strRes = v } - if i == 0 || t.Compare(timeRes) < 0 { - timeRes = t + } + + return strRes, false, nil +} + +type builtinLeastTimeSig struct { + baseBuiltinFunc +} + +func (b *builtinLeastTimeSig) Clone() builtinFunc { + newSig := &builtinLeastTimeSig{} + newSig.cloneFrom(&b.baseBuiltinFunc) + return newSig +} + +func (b *builtinLeastTimeSig) evalTime(row chunk.Row) (res types.Time, isNull bool, err error) { + for i := 0; i < len(b.args); i++ { + v, isNull, err := b.args[i].EvalTime(b.ctx, row) + if isNull || err != nil { + return types.ZeroTime, true, err + } + if i == 0 || v.Compare(res) < 0 { + res = v } } + return res, false, nil +} - if timeRes.IsZero() { - res = strRes - } else { - res = timeRes.String() +type builtinLeastDurationSig struct { + baseBuiltinFunc +} + +func (b *builtinLeastDurationSig) Clone() builtinFunc { + newSig := &builtinLeastDurationSig{} + newSig.cloneFrom(&b.baseBuiltinFunc) + return newSig +} + +func (b *builtinLeastDurationSig) evalDuration(row chunk.Row) (res types.Duration, isNull bool, err error) { + for i := 0; i < len(b.args); i++ { + v, isNull, err := b.args[i].EvalDuration(b.ctx, row) + if isNull || err != nil { + return types.Duration{}, true, err + } + if i == 0 || v.Compare(res) < 0 { + res = v + } } return res, false, nil } @@ -1302,7 +1395,7 @@ func RefineComparedConstant(ctx sessionctx.Context, targetFieldType types.FieldT } return con, false } - c, err := intDatum.CompareDatum(sc, &con.Value) + c, err := intDatum.Compare(sc, &con.Value, collate.GetBinaryCollator()) if err != nil { return con, false } @@ -1368,17 +1461,31 @@ func RefineComparedConstant(ctx sessionctx.Context, targetFieldType types.FieldT // refineArgs will rewrite the arguments if the compare expression is `int column <cmp> non-int constant` or // `non-int constant <cmp> int column`. E.g., `a < 1.1` will be rewritten to `a < 2`. It also handles comparing year type // with int constant if the int constant falls into a sensible year representation. +// This refine operation depends on the values of these args, but these values can change when using plan-cache. +// So we have to skip this operation or mark the plan as over-optimized when using plan-cache. func (c *compareFunctionClass) refineArgs(ctx sessionctx.Context, args []Expression) []Expression { - if MaybeOverOptimized4PlanCache(ctx, args) { - return args - } arg0Type, arg1Type := args[0].GetType(), args[1].GetType() arg0IsInt := arg0Type.EvalType() == types.ETInt arg1IsInt := arg1Type.EvalType() == types.ETInt + arg0IsString := arg0Type.EvalType() == types.ETString + arg1IsString := arg1Type.EvalType() == types.ETString arg0, arg0IsCon := args[0].(*Constant) arg1, arg1IsCon := args[1].(*Constant) isExceptional, finalArg0, finalArg1 := false, args[0], args[1] isPositiveInfinite, isNegativeInfinite := false, false + if MaybeOverOptimized4PlanCache(ctx, args) { + // To keep the result be compatible with MySQL, refine `int non-constant <cmp> str constant` + // here and skip this refine operation in all other cases for safety. + if (arg0IsInt && !arg0IsCon && arg1IsString && arg1IsCon) || (arg1IsInt && !arg1IsCon && arg0IsString && arg0IsCon) { + ctx.GetSessionVars().StmtCtx.SkipPlanCache = true + RemoveMutableConst(ctx, args) + } else { + return args + } + } else if ctx.GetSessionVars().StmtCtx.SkipPlanCache { + // We should remove the mutable constant for correctness, because its value may be changed. + RemoveMutableConst(ctx, args) + } // int non-constant [cmp] non-int constant if arg0IsInt && !arg0IsCon && !arg1IsInt && arg1IsCon { arg1, isExceptional = RefineComparedConstant(ctx, *arg0Type, arg1, c.op) @@ -2789,3 +2896,15 @@ func CompareJSON(sctx sessionctx.Context, lhsArg, rhsArg Expression, lhsRow, rhs } return int64(json.CompareBinary(arg0, arg1)), false, nil } + +// isEqualsInitUnsignedFlag can adjust unsigned flag for greatest/least function. +// For greatest, returns unsigned result if there is at least one argument is unsigned. +// For least, returns signed result if there is at least one argument is signed. +func isEqualsInitUnsignedFlag(initUnsigned bool, args []Expression) bool { + for _, arg := range args { + if initUnsigned != mysql.HasUnsignedFlag(arg.GetType().Flag) { + return false + } + } + return true +} diff --git a/expression/builtin_compare_test.go b/expression/builtin_compare_test.go index eb5c0f11db03b..edc4b7e7ad056 100644 --- a/expression/builtin_compare_test.go +++ b/expression/builtin_compare_test.go @@ -15,9 +15,9 @@ package expression import ( + "testing" "time" - . "github.com/pingcap/check" "github.com/pingcap/errors" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/model" @@ -25,9 +25,12 @@ import ( "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" "github.com/pingcap/tidb/util/chunk" + "github.com/stretchr/testify/require" ) -func (s *testEvaluatorSuite) TestCompareFunctionWithRefine(c *C) { +func TestCompareFunctionWithRefine(t *testing.T) { + ctx := createContext(t) + tblInfo := newTestTableBuilder("").add("a", mysql.TypeLong, mysql.NotNullFlag).build() tests := []struct { exprStr string @@ -69,17 +72,19 @@ func (s *testEvaluatorSuite) TestCompareFunctionWithRefine(c *C) { {"-123456789123456789123456789.12345 < a", "1"}, {"'aaaa'=a", "eq(0, a)"}, } - cols, names, err := ColumnInfos2ColumnsAndNames(s.ctx, model.NewCIStr(""), tblInfo.Name, tblInfo.Cols(), tblInfo) - c.Assert(err, IsNil) + cols, names, err := ColumnInfos2ColumnsAndNames(ctx, model.NewCIStr(""), tblInfo.Name, tblInfo.Cols(), tblInfo) + require.NoError(t, err) schema := NewSchema(cols...) - for _, t := range tests { - f, err := ParseSimpleExprsWithNames(s.ctx, t.exprStr, schema, names) - c.Assert(err, IsNil) - c.Assert(f[0].String(), Equals, t.result) + for _, test := range tests { + f, err := ParseSimpleExprsWithNames(ctx, test.exprStr, schema, names) + require.NoError(t, err) + require.Equal(t, test.result, f[0].String()) } } -func (s *testEvaluatorSuite) TestCompare(c *C) { +func TestCompare(t *testing.T) { + ctx := createContext(t) + intVal, uintVal, realVal, stringVal, decimalVal := 1, uint64(1), 1.1, "123", types.NewDecFromFloatForTest(123.123) timeVal := types.NewTime(types.FromGoTime(time.Now()), mysql.TypeDatetime, 6) durationVal := types.Duration{Duration: 12*time.Hour + 1*time.Minute + 1*time.Second} @@ -133,36 +138,38 @@ func (s *testEvaluatorSuite) TestCompare(c *C) { {jsonVal, jsonVal, ast.NullEQ, mysql.TypeJSON, 1}, } - for _, t := range tests { - bf, err := funcs[t.funcName].getFunction(s.ctx, s.primitiveValsToConstants([]interface{}{t.arg0, t.arg1})) - c.Assert(err, IsNil) + for _, test := range tests { + bf, err := funcs[test.funcName].getFunction(ctx, primitiveValsToConstants(ctx, []interface{}{test.arg0, test.arg1})) + require.NoError(t, err) args := bf.getArgs() - c.Assert(args[0].GetType().Tp, Equals, t.tp) - c.Assert(args[1].GetType().Tp, Equals, t.tp) + require.Equal(t, test.tp, args[0].GetType().Tp) + require.Equal(t, test.tp, args[1].GetType().Tp) res, isNil, err := bf.evalInt(chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(isNil, IsFalse) - c.Assert(res, Equals, t.expected) + require.NoError(t, err) + require.False(t, isNil) + require.Equal(t, test.expected, res) } // test <non-const decimal expression> <cmp> <const string expression> decimalCol, stringCon := &Column{RetType: types.NewFieldType(mysql.TypeNewDecimal)}, &Constant{RetType: types.NewFieldType(mysql.TypeVarchar)} - bf, err := funcs[ast.LT].getFunction(s.ctx, []Expression{decimalCol, stringCon}) - c.Assert(err, IsNil) + bf, err := funcs[ast.LT].getFunction(ctx, []Expression{decimalCol, stringCon}) + require.NoError(t, err) args := bf.getArgs() - c.Assert(args[0].GetType().Tp, Equals, mysql.TypeNewDecimal) - c.Assert(args[1].GetType().Tp, Equals, mysql.TypeNewDecimal) + require.Equal(t, mysql.TypeNewDecimal, args[0].GetType().Tp) + require.Equal(t, mysql.TypeNewDecimal, args[1].GetType().Tp) // test <time column> <cmp> <non-time const> timeCol := &Column{RetType: types.NewFieldType(mysql.TypeDatetime)} - bf, err = funcs[ast.LT].getFunction(s.ctx, []Expression{timeCol, stringCon}) - c.Assert(err, IsNil) + bf, err = funcs[ast.LT].getFunction(ctx, []Expression{timeCol, stringCon}) + require.NoError(t, err) args = bf.getArgs() - c.Assert(args[0].GetType().Tp, Equals, mysql.TypeDatetime) - c.Assert(args[1].GetType().Tp, Equals, mysql.TypeDatetime) + require.Equal(t, mysql.TypeDatetime, args[0].GetType().Tp) + require.Equal(t, mysql.TypeDatetime, args[1].GetType().Tp) } -func (s *testEvaluatorSuite) TestCoalesce(c *C) { +func TestCoalesce(t *testing.T) { + ctx := createContext(t) + cases := []struct { args []interface{} expected interface{} @@ -173,7 +180,7 @@ func (s *testEvaluatorSuite) TestCoalesce(c *C) { {[]interface{}{nil, nil}, nil, true, false}, {[]interface{}{nil, nil, nil}, nil, true, false}, {[]interface{}{nil, 1}, int64(1), false, false}, - {[]interface{}{nil, 1.1}, float64(1.1), false, false}, + {[]interface{}{nil, 1.1}, 1.1, false, false}, {[]interface{}{1, 1.1}, float64(1), false, false}, {[]interface{}{nil, types.NewDecFromFloatForTest(123.456)}, types.NewDecFromFloatForTest(123.456), false, false}, {[]interface{}{1, types.NewDecFromFloatForTest(123.456)}, types.NewDecFromInt(1), false, false}, @@ -183,37 +190,39 @@ func (s *testEvaluatorSuite) TestCoalesce(c *C) { {[]interface{}{tm, dt}, tm, false, false}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.Coalesce, s.primitiveValsToConstants(t.args)...) - c.Assert(err, IsNil) + for _, test := range cases { + f, err := newFunctionForTest(ctx, ast.Coalesce, primitiveValsToConstants(ctx, test.args)...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if test.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if test.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetValue(), DeepEquals, t.expected) + require.Equal(t, test.expected, d.GetValue()) } } } - _, err := funcs[ast.Length].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.Length].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestIntervalFunc(c *C) { - sc := s.ctx.GetSessionVars().StmtCtx +func TestIntervalFunc(t *testing.T) { + ctx := createContext(t) + + sc := ctx.GetSessionVars().StmtCtx origin := sc.IgnoreTruncate sc.IgnoreTruncate = true defer func() { sc.IgnoreTruncate = origin }() - for _, t := range []struct { + for _, test := range []struct { args []types.Datum ret int64 getErr bool @@ -245,36 +254,47 @@ func (s *testEvaluatorSuite) TestIntervalFunc(c *C) { {types.MakeDatums("9007199254740992", "9007199254740993"), 1, false}, } { fc := funcs[ast.Interval] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(t.args)) - c.Assert(err, IsNil) - if t.getErr { + f, err := fc.getFunction(ctx, datumsToConstants(test.args)) + require.NoError(t, err) + if test.getErr { v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, NotNil) - c.Assert(v.GetInt64(), Equals, t.ret) + require.Error(t, err) + require.Equal(t, test.ret, v.GetInt64()) continue } v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.GetInt64(), Equals, t.ret) + require.NoError(t, err) + require.Equal(t, test.ret, v.GetInt64()) } } // greatest/least function is compatible with MySQL 8.0 -func (s *testEvaluatorSuite) TestGreatestLeastFunc(c *C) { - sc := s.ctx.GetSessionVars().StmtCtx +func TestGreatestLeastFunc(t *testing.T) { + ctx := createContext(t) + sc := ctx.GetSessionVars().StmtCtx originIgnoreTruncate := sc.IgnoreTruncate sc.IgnoreTruncate = true + decG := &types.MyDecimal{} + decL := &types.MyDecimal{} defer func() { sc.IgnoreTruncate = originIgnoreTruncate }() - for _, t := range []struct { + for _, test := range []struct { args []interface{} expectedGreatest interface{} expectedLeast interface{} isNil bool getErr bool }{ + { + []interface{}{int64(-9223372036854775808), uint64(9223372036854775809)}, + decG.FromUint(9223372036854775809), decL.FromInt(-9223372036854775808), false, false, + }, + { + []interface{}{uint64(9223372036854775808), uint64(9223372036854775809)}, + uint64(9223372036854775809), uint64(9223372036854775808), false, false, + }, { []interface{}{1, 2, 3, 4}, int64(4), int64(1), false, false, @@ -297,11 +317,11 @@ func (s *testEvaluatorSuite) TestGreatestLeastFunc(c *C) { }, { []interface{}{tm, "invalid_time_1", "invalid_time_2", tmWithFsp}, - curTimeWithFspString, curTimeString, false, false, + "invalid_time_2", curTimeString, false, false, }, { []interface{}{tm, "invalid_time_2", "invalid_time_1", tmWithFsp}, - curTimeWithFspString, curTimeString, false, false, + "invalid_time_2", curTimeString, false, false, }, { []interface{}{tm, "invalid_time", nil, tmWithFsp}, @@ -313,7 +333,7 @@ func (s *testEvaluatorSuite) TestGreatestLeastFunc(c *C) { }, { []interface{}{duration, duration}, - "12:59:59", "12:59:59", false, false, + duration, duration, false, false, }, { []interface{}{"123", nil, "123"}, @@ -332,36 +352,36 @@ func (s *testEvaluatorSuite) TestGreatestLeastFunc(c *C) { "905969664", "1990-06-16 17:22:56.005534", false, false, }, } { - f0, err := newFunctionForTest(s.ctx, ast.Greatest, s.primitiveValsToConstants(t.args)...) - c.Assert(err, IsNil) + f0, err := newFunctionForTest(ctx, ast.Greatest, primitiveValsToConstants(ctx, test.args)...) + require.NoError(t, err) d, err := f0.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if test.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if test.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetValue(), DeepEquals, t.expectedGreatest) + require.Equal(t, test.expectedGreatest, d.GetValue()) } } - f1, err := newFunctionForTest(s.ctx, ast.Least, s.primitiveValsToConstants(t.args)...) - c.Assert(err, IsNil) + f1, err := newFunctionForTest(ctx, ast.Least, primitiveValsToConstants(ctx, test.args)...) + require.NoError(t, err) d, err = f1.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if test.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if test.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetValue(), DeepEquals, t.expectedLeast) + require.Equal(t, test.expectedLeast, d.GetValue()) } } } - _, err := funcs[ast.Greatest].getFunction(s.ctx, []Expression{NewZero(), NewOne()}) - c.Assert(err, IsNil) - _, err = funcs[ast.Least].getFunction(s.ctx, []Expression{NewZero(), NewOne()}) - c.Assert(err, IsNil) + _, err := funcs[ast.Greatest].getFunction(ctx, []Expression{NewZero(), NewOne()}) + require.NoError(t, err) + _, err = funcs[ast.Least].getFunction(ctx, []Expression{NewZero(), NewOne()}) + require.NoError(t, err) } diff --git a/expression/builtin_compare_vec.go b/expression/builtin_compare_vec.go index c6ef244f18ab5..e3bf42864fd94 100644 --- a/expression/builtin_compare_vec.go +++ b/expression/builtin_compare_vec.go @@ -629,11 +629,11 @@ func vecCompareInt(isUnsigned0, isUnsigned1 bool, largs, rargs, result *chunk.Co } } -func (b *builtinGreatestTimeSig) vectorized() bool { +func (b *builtinGreatestCmpStringAsTimeSig) vectorized() bool { return true } -func (b *builtinGreatestTimeSig) vecEvalString(input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinGreatestCmpStringAsTimeSig) vecEvalString(input *chunk.Chunk, result *chunk.Column) error { sc := b.ctx.GetSessionVars().StmtCtx n := input.NumRows() @@ -714,11 +714,11 @@ func (b *builtinGreatestRealSig) vecEvalReal(input *chunk.Chunk, result *chunk.C return nil } -func (b *builtinLeastTimeSig) vectorized() bool { +func (b *builtinLeastCmpStringAsTimeSig) vectorized() bool { return true } -func (b *builtinLeastTimeSig) vecEvalString(input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinLeastCmpStringAsTimeSig) vecEvalString(input *chunk.Chunk, result *chunk.Column) error { sc := b.ctx.GetSessionVars().StmtCtx n := input.NumRows() @@ -815,3 +815,131 @@ func (b *builtinGreatestStringSig) vecEvalString(input *chunk.Chunk, result *chu } return nil } + +func (b *builtinGreatestTimeSig) vectorized() bool { + return true +} + +func (b *builtinGreatestTimeSig) vecEvalTime(input *chunk.Chunk, result *chunk.Column) error { + n := input.NumRows() + buf, err := b.bufAllocator.get() + if err != nil { + return err + } + defer b.bufAllocator.put(buf) + + result.ResizeTime(n, false) + for argIdx := 0; argIdx < len(b.args); argIdx++ { + if err := b.args[argIdx].VecEvalTime(b.ctx, input, buf); err != nil { + return err + } + result.MergeNulls(buf) + resTimes := result.Times() + argTimes := buf.Times() + for rowIdx := 0; rowIdx < n; rowIdx++ { + if result.IsNull(rowIdx) { + continue + } + if argIdx == 0 || argTimes[rowIdx].Compare(resTimes[rowIdx]) > 0 { + resTimes[rowIdx] = argTimes[rowIdx] + } + } + } + return nil +} + +func (b *builtinLeastTimeSig) vectorized() bool { + return true +} + +func (b *builtinLeastTimeSig) vecEvalTime(input *chunk.Chunk, result *chunk.Column) error { + n := input.NumRows() + buf, err := b.bufAllocator.get() + if err != nil { + return err + } + defer b.bufAllocator.put(buf) + + result.ResizeTime(n, false) + for argIdx := 0; argIdx < len(b.args); argIdx++ { + if err := b.args[argIdx].VecEvalTime(b.ctx, input, buf); err != nil { + return err + } + result.MergeNulls(buf) + resTimes := result.Times() + argTimes := buf.Times() + for rowIdx := 0; rowIdx < n; rowIdx++ { + if result.IsNull(rowIdx) { + continue + } + if argIdx == 0 || argTimes[rowIdx].Compare(resTimes[rowIdx]) < 0 { + resTimes[rowIdx] = argTimes[rowIdx] + } + } + } + return nil +} + +func (b *builtinGreatestDurationSig) vectorized() bool { + return true +} + +func (b *builtinGreatestDurationSig) vecEvalDuration(input *chunk.Chunk, result *chunk.Column) error { + n := input.NumRows() + buf, err := b.bufAllocator.get() + if err != nil { + return err + } + defer b.bufAllocator.put(buf) + + result.ResizeGoDuration(n, false) + for argIdx := 0; argIdx < len(b.args); argIdx++ { + if err := b.args[argIdx].VecEvalDuration(b.ctx, input, buf); err != nil { + return err + } + result.MergeNulls(buf) + resDurations := result.GoDurations() + argDurations := buf.GoDurations() + for rowIdx := 0; rowIdx < n; rowIdx++ { + if result.IsNull(rowIdx) { + continue + } + if argIdx == 0 || argDurations[rowIdx] > resDurations[rowIdx] { + resDurations[rowIdx] = argDurations[rowIdx] + } + } + } + return nil +} + +func (b *builtinLeastDurationSig) vectorized() bool { + return true +} + +func (b *builtinLeastDurationSig) vecEvalDuration(input *chunk.Chunk, result *chunk.Column) error { + n := input.NumRows() + buf, err := b.bufAllocator.get() + if err != nil { + return err + } + defer b.bufAllocator.put(buf) + + result.ResizeGoDuration(n, false) + for argIdx := 0; argIdx < len(b.args); argIdx++ { + if err := b.args[argIdx].VecEvalDuration(b.ctx, input, buf); err != nil { + return err + } + result.MergeNulls(buf) + resDurations := result.GoDurations() + argDurations := buf.GoDurations() + for rowIdx := 0; rowIdx < n; rowIdx++ { + if result.IsNull(rowIdx) { + continue + } + if argIdx == 0 || argDurations[rowIdx] < resDurations[rowIdx] { + resDurations[rowIdx] = argDurations[rowIdx] + } + } + } + return nil +} diff --git a/expression/builtin_compare_vec_generated_test.go b/expression/builtin_compare_vec_generated_test.go index d0bb5b2075710..247111e3be448 100644 --- a/expression/builtin_compare_vec_generated_test.go +++ b/expression/builtin_compare_vec_generated_test.go @@ -19,7 +19,6 @@ package expression import ( "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/types" ) @@ -155,12 +154,12 @@ var vecGeneratedBuiltinCompareCases = map[string][]vecExprBenchCase{ }, } -func (s *testEvaluatorSuite) TestVectorizedGeneratedBuiltinCompareEvalOneVec(c *C) { - testVectorizedEvalOneVec(c, vecGeneratedBuiltinCompareCases) +func TestVectorizedGeneratedBuiltinCompareEvalOneVec(t *testing.T) { + testVectorizedEvalOneVec(t, vecGeneratedBuiltinCompareCases) } -func (s *testEvaluatorSuite) TestVectorizedGeneratedBuiltinCompareFunc(c *C) { - testVectorizedBuiltinFunc(c, vecGeneratedBuiltinCompareCases) +func TestVectorizedGeneratedBuiltinCompareFunc(t *testing.T) { + testVectorizedBuiltinFunc(t, vecGeneratedBuiltinCompareCases) } func BenchmarkVectorizedGeneratedBuiltinCompareEvalOneVec(b *testing.B) { diff --git a/expression/builtin_compare_vec_test.go b/expression/builtin_compare_vec_test.go index ceab622d3b028..01ca60f5d12d8 100644 --- a/expression/builtin_compare_vec_test.go +++ b/expression/builtin_compare_vec_test.go @@ -17,7 +17,6 @@ package expression import ( "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/types" @@ -127,15 +126,16 @@ var vecBuiltinCompareCases = map[string][]vecExprBenchCase{ {retEvalType: types.ETReal, childrenTypes: []types.EvalType{types.ETReal, types.ETReal, types.ETReal}}, {retEvalType: types.ETString, childrenTypes: []types.EvalType{types.ETString, types.ETString}}, {retEvalType: types.ETString, childrenTypes: []types.EvalType{types.ETString, types.ETString, types.ETString}}, - {retEvalType: types.ETString, childrenTypes: []types.EvalType{types.ETDatetime, types.ETDatetime}}, - {retEvalType: types.ETString, childrenTypes: []types.EvalType{types.ETDatetime, types.ETDatetime, types.ETDatetime}}, + {retEvalType: types.ETDatetime, childrenTypes: []types.EvalType{types.ETDatetime, types.ETDatetime}}, + {retEvalType: types.ETDatetime, childrenTypes: []types.EvalType{types.ETDatetime, types.ETDatetime, types.ETDatetime}}, + {retEvalType: types.ETDuration, childrenTypes: []types.EvalType{types.ETDuration, types.ETDuration, types.ETDuration}}, }, ast.Least: { {retEvalType: types.ETDecimal, childrenTypes: []types.EvalType{types.ETDecimal, types.ETDecimal, types.ETDecimal}}, {retEvalType: types.ETInt, childrenTypes: []types.EvalType{types.ETInt, types.ETInt, types.ETInt}}, {retEvalType: types.ETReal, childrenTypes: []types.EvalType{types.ETReal, types.ETReal, types.ETReal}}, {retEvalType: types.ETString, childrenTypes: []types.EvalType{types.ETString, types.ETString}}, - {retEvalType: types.ETString, childrenTypes: []types.EvalType{types.ETDatetime, types.ETDatetime, types.ETDatetime}}, + {retEvalType: types.ETDatetime, childrenTypes: []types.EvalType{types.ETDatetime, types.ETDatetime, types.ETDatetime}}, {retEvalType: types.ETString, childrenTypes: []types.EvalType{types.ETString, types.ETString, types.ETString}}, }, ast.Interval: { @@ -150,12 +150,12 @@ var vecBuiltinCompareCases = map[string][]vecExprBenchCase{ }, } -func (s *testEvaluatorSuite) TestVectorizedBuiltinCompareEvalOneVec(c *C) { - testVectorizedEvalOneVec(c, vecBuiltinCompareCases) +func TestVectorizedBuiltinCompareEvalOneVec(t *testing.T) { + testVectorizedEvalOneVec(t, vecBuiltinCompareCases) } -func (s *testEvaluatorSuite) TestVectorizedBuiltinCompareFunc(c *C) { - testVectorizedBuiltinFunc(c, vecBuiltinCompareCases) +func TestVectorizedBuiltinCompareFunc(t *testing.T) { + testVectorizedBuiltinFunc(t, vecBuiltinCompareCases) } func BenchmarkVectorizedBuiltinCompareEvalOneVec(b *testing.B) { diff --git a/expression/builtin_control.go b/expression/builtin_control.go index e9b39bf36ab5c..6ea2c119176c7 100644 --- a/expression/builtin_control.go +++ b/expression/builtin_control.go @@ -237,6 +237,14 @@ func (c *caseWhenFunctionClass) getFunction(ctx sessionctx.Context, args []Expre return nil, err } bf.tp = fieldTp + if fieldTp.Tp == mysql.TypeEnum || fieldTp.Tp == mysql.TypeSet { + switch tp { + case types.ETInt: + fieldTp.Tp = mysql.TypeLonglong + case types.ETString: + fieldTp.Tp = mysql.TypeVarchar + } + } switch tp { case types.ETInt: diff --git a/expression/builtin_control_test.go b/expression/builtin_control_test.go index 3eece486feec6..c888e7f4e8dc6 100644 --- a/expression/builtin_control_test.go +++ b/expression/builtin_control_test.go @@ -16,16 +16,18 @@ package expression import ( "errors" + "testing" "time" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/testkit/trequire" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" - "github.com/pingcap/tidb/util/testutil" + "github.com/stretchr/testify/require" ) -func (s *testEvaluatorSuite) TestCaseWhen(c *C) { +func TestCaseWhen(t *testing.T) { + ctx := createContext(t) tbl := []struct { Arg []interface{} Ret interface{} @@ -43,21 +45,22 @@ func (s *testEvaluatorSuite) TestCaseWhen(c *C) { {[]interface{}{0.0, 1, 0.1, 2}, 2}, } fc := funcs[ast.Case] - for _, t := range tbl { - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(t.Arg...))) - c.Assert(err, IsNil) + for _, tt := range tbl { + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(tt.Arg...))) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d, testutil.DatumEquals, types.NewDatum(t.Ret)) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(tt.Ret), d) } - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(errors.New("can't convert string to bool"), 1, true))) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(errors.New("can't convert string to bool"), 1, true))) + require.NoError(t, err) _, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, NotNil) + require.Error(t, err) } -func (s *testEvaluatorSuite) TestIf(c *C) { - stmtCtx := s.ctx.GetSessionVars().StmtCtx +func TestIf(t *testing.T) { + ctx := createContext(t) + stmtCtx := ctx.GetSessionVars().StmtCtx origin := stmtCtx.IgnoreTruncate stmtCtx.IgnoreTruncate = true defer func() { @@ -88,22 +91,23 @@ func (s *testEvaluatorSuite) TestIf(c *C) { } fc := funcs[ast.If] - for _, t := range tbl { - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(t.Arg1, t.Arg2, t.Arg3))) - c.Assert(err, IsNil) + for _, tt := range tbl { + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(tt.Arg1, tt.Arg2, tt.Arg3))) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d, testutil.DatumEquals, types.NewDatum(t.Ret)) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(tt.Ret), d) } - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(errors.New("must error"), 1, 2))) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(errors.New("must error"), 1, 2))) + require.NoError(t, err) _, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, NotNil) - _, err = fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(1, 2))) - c.Assert(err, NotNil) + require.Error(t, err) + _, err = fc.getFunction(ctx, datumsToConstants(types.MakeDatums(1, 2))) + require.Error(t, err) } -func (s *testEvaluatorSuite) TestIfNull(c *C) { +func TestIfNull(t *testing.T) { + ctx := createContext(t) tbl := []struct { arg1 interface{} arg2 interface{} @@ -124,25 +128,25 @@ func (s *testEvaluatorSuite) TestIfNull(c *C) { {errors.New(""), nil, "", true, true}, } - for _, t := range tbl { - f, err := newFunctionForTest(s.ctx, ast.Ifnull, s.primitiveValsToConstants([]interface{}{t.arg1, t.arg2})...) - c.Assert(err, IsNil) + for _, tt := range tbl { + f, err := newFunctionForTest(ctx, ast.Ifnull, primitiveValsToConstants(ctx, []interface{}{tt.arg1, tt.arg2})...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if tt.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if tt.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetValue(), DeepEquals, t.expected) + require.Equal(t, tt.expected, d.GetValue()) } } } - _, err := funcs[ast.Ifnull].getFunction(s.ctx, []Expression{NewZero(), NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.Ifnull].getFunction(ctx, []Expression{NewZero(), NewZero()}) + require.NoError(t, err) - _, err = funcs[ast.Ifnull].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, NotNil) + _, err = funcs[ast.Ifnull].getFunction(ctx, []Expression{NewZero()}) + require.Error(t, err) } diff --git a/expression/builtin_control_vec_generated_test.go b/expression/builtin_control_vec_generated_test.go index 878ed6458b76e..99317242be271 100644 --- a/expression/builtin_control_vec_generated_test.go +++ b/expression/builtin_control_vec_generated_test.go @@ -20,7 +20,6 @@ import ( "math/rand" "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/types" ) @@ -114,12 +113,12 @@ var vecBuiltinControlCases = map[string][]vecExprBenchCase{ }, } -func (s *testEvaluatorSuite) TestVectorizedBuiltinControlEvalOneVecGenerated(c *C) { - testVectorizedEvalOneVec(c, vecBuiltinControlCases) +func TestVectorizedBuiltinControlEvalOneVecGenerated(t *testing.T) { + testVectorizedEvalOneVec(t, vecBuiltinControlCases) } -func (s *testEvaluatorSuite) TestVectorizedBuiltinControlFuncGenerated(c *C) { - testVectorizedBuiltinFunc(c, vecBuiltinControlCases) +func TestVectorizedBuiltinControlFuncGenerated(t *testing.T) { + testVectorizedBuiltinFunc(t, vecBuiltinControlCases) } func BenchmarkVectorizedBuiltinControlEvalOneVecGenerated(b *testing.B) { diff --git a/expression/builtin_convert_charset.go b/expression/builtin_convert_charset.go new file mode 100644 index 0000000000000..fc709cc7c61f0 --- /dev/null +++ b/expression/builtin_convert_charset.go @@ -0,0 +1,283 @@ +// Copyright 2021 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, +// 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. + +package expression + +import ( + "fmt" + "unicode/utf8" + + "github.com/pingcap/tidb/errno" + "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/parser/charset" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/dbterror" + "github.com/pingcap/tipb/go-tipb" +) + +var ( + _ functionClass = &tidbToBinaryFunctionClass{} + _ functionClass = &tidbFromBinaryFunctionClass{} + + _ builtinFunc = &builtinInternalToBinarySig{} + _ builtinFunc = &builtinInternalFromBinarySig{} +) + +var ( + // errCannotConvertString returns when the string can not convert to other charset. + errCannotConvertString = dbterror.ClassExpression.NewStd(errno.ErrCannotConvertString) +) + +// InternalFuncToBinary accepts a string and returns another string encoded in a given charset. +const InternalFuncToBinary = "to_binary" + +// InternalFuncFromBinary accepts a string and returns another string decode in a given charset. +const InternalFuncFromBinary = "from_binary" + +type tidbToBinaryFunctionClass struct { + baseFunctionClass +} + +func (c *tidbToBinaryFunctionClass) getFunction(ctx sessionctx.Context, args []Expression) (builtinFunc, error) { + if err := c.verifyArgs(args); err != nil { + return nil, c.verifyArgs(args) + } + argTp := args[0].GetType().EvalType() + var sig builtinFunc + switch argTp { + case types.ETString: + bf, err := newBaseBuiltinFuncWithTp(ctx, c.funcName, args, types.ETString, types.ETString) + if err != nil { + return nil, err + } + bf.tp = args[0].GetType().Clone() + bf.tp.Tp = mysql.TypeVarString + bf.tp.Charset, bf.tp.Collate = charset.CharsetBin, charset.CollationBin + sig = &builtinInternalToBinarySig{bf} + sig.setPbCode(tipb.ScalarFuncSig_ToBinary) + default: + return nil, fmt.Errorf("unexpected argTp: %d", argTp) + } + return sig, nil +} + +type builtinInternalToBinarySig struct { + baseBuiltinFunc +} + +func (b *builtinInternalToBinarySig) Clone() builtinFunc { + newSig := &builtinInternalToBinarySig{} + newSig.cloneFrom(&b.baseBuiltinFunc) + return newSig +} + +func (b *builtinInternalToBinarySig) evalString(row chunk.Row) (res string, isNull bool, err error) { + val, isNull, err := b.args[0].EvalString(b.ctx, row) + if isNull || err != nil { + return res, isNull, err + } + tp := b.args[0].GetType() + enc := charset.NewEncoding(tp.Charset) + res, err = enc.EncodeString(val) + return res, false, err +} + +func (b *builtinInternalToBinarySig) vectorized() bool { + return true +} + +func (b *builtinInternalToBinarySig) vecEvalString(input *chunk.Chunk, result *chunk.Column) error { + n := input.NumRows() + buf, err := b.bufAllocator.get() + if err != nil { + return err + } + defer b.bufAllocator.put(buf) + if err := b.args[0].VecEvalString(b.ctx, input, buf); err != nil { + return err + } + enc := charset.NewEncoding(b.args[0].GetType().Charset) + result.ReserveString(n) + var encodedBuf []byte + for i := 0; i < n; i++ { + if buf.IsNull(i) { + result.AppendNull() + continue + } + strBytes, err := enc.Encode(encodedBuf, buf.GetBytes(i)) + if err != nil { + return err + } + result.AppendBytes(strBytes) + } + return nil +} + +type tidbFromBinaryFunctionClass struct { + baseFunctionClass + + tp *types.FieldType +} + +func (c *tidbFromBinaryFunctionClass) getFunction(ctx sessionctx.Context, args []Expression) (builtinFunc, error) { + if err := c.verifyArgs(args); err != nil { + return nil, c.verifyArgs(args) + } + argTp := args[0].GetType().EvalType() + var sig builtinFunc + switch argTp { + case types.ETString: + bf, err := newBaseBuiltinFuncWithTp(ctx, c.funcName, args, types.ETString, types.ETString) + if err != nil { + return nil, err + } + bf.tp = c.tp + sig = &builtinInternalFromBinarySig{bf} + sig.setPbCode(tipb.ScalarFuncSig_FromBinary) + default: + return nil, fmt.Errorf("unexpected argTp: %d", argTp) + } + return sig, nil +} + +type builtinInternalFromBinarySig struct { + baseBuiltinFunc +} + +func (b *builtinInternalFromBinarySig) Clone() builtinFunc { + newSig := &builtinInternalFromBinarySig{} + newSig.cloneFrom(&b.baseBuiltinFunc) + return newSig +} + +func (b *builtinInternalFromBinarySig) evalString(row chunk.Row) (res string, isNull bool, err error) { + val, isNull, err := b.args[0].EvalString(b.ctx, row) + if isNull || err != nil { + return val, isNull, err + } + transferString := b.getTransferFunc() + tBytes, err := transferString([]byte(val)) + return string(tBytes), false, err +} + +func (b *builtinInternalFromBinarySig) vectorized() bool { + return true +} + +func (b *builtinInternalFromBinarySig) vecEvalString(input *chunk.Chunk, result *chunk.Column) error { + n := input.NumRows() + buf, err := b.bufAllocator.get() + if err != nil { + return err + } + defer b.bufAllocator.put(buf) + if err := b.args[0].VecEvalString(b.ctx, input, buf); err != nil { + return err + } + transferString := b.getTransferFunc() + result.ReserveString(n) + for i := 0; i < n; i++ { + if buf.IsNull(i) { + result.AppendNull() + continue + } + str, err := transferString(buf.GetBytes(i)) + if err != nil { + return err + } + result.AppendBytes(str) + } + return nil +} + +func (b *builtinInternalFromBinarySig) getTransferFunc() func([]byte) ([]byte, error) { + var transferString func([]byte) ([]byte, error) + if b.tp.Charset == charset.CharsetUTF8MB4 || b.tp.Charset == charset.CharsetUTF8 { + transferString = func(s []byte) ([]byte, error) { + if !utf8.Valid(s) { + return nil, errCannotConvertString.GenWithStackByArgs(fmt.Sprintf("%X", s), charset.CharsetBin, b.tp.Charset) + } + return s, nil + } + } else { + enc := charset.NewEncoding(b.tp.Charset) + var buf []byte + transferString = func(s []byte) ([]byte, error) { + str, err := enc.Decode(buf, s) + if err != nil { + return nil, errCannotConvertString.GenWithStackByArgs(fmt.Sprintf("%X", s), charset.CharsetBin, b.tp.Charset) + } + return str, nil + } + } + return transferString +} + +// BuildToBinaryFunction builds to_binary function. +func BuildToBinaryFunction(ctx sessionctx.Context, expr Expression) (res Expression) { + fc := &tidbToBinaryFunctionClass{baseFunctionClass{InternalFuncToBinary, 1, 1}} + f, err := fc.getFunction(ctx, []Expression{expr}) + if err != nil { + return expr + } + res = &ScalarFunction{ + FuncName: model.NewCIStr(InternalFuncToBinary), + RetType: f.getRetTp(), + Function: f, + } + return FoldConstant(res) +} + +// BuildFromBinaryFunction builds from_binary function. +func BuildFromBinaryFunction(ctx sessionctx.Context, expr Expression, tp *types.FieldType) (res Expression) { + fc := &tidbFromBinaryFunctionClass{baseFunctionClass{InternalFuncFromBinary, 1, 1}, tp} + f, err := fc.getFunction(ctx, []Expression{expr}) + if err != nil { + return expr + } + res = &ScalarFunction{ + FuncName: model.NewCIStr(InternalFuncFromBinary), + RetType: tp, + Function: f, + } + return FoldConstant(res) +} + +// HandleBinaryLiteral wraps `expr` with to_binary or from_binary sig. +func HandleBinaryLiteral(ctx sessionctx.Context, expr Expression, ec *ExprCollation, funcName string) Expression { + switch funcName { + case ast.Concat, ast.ConcatWS, ast.Lower, ast.Lcase, ast.Reverse, ast.Upper, ast.Ucase, ast.Quote, ast.Coalesce, + ast.Left, ast.Right, ast.Repeat, ast.Trim, ast.LTrim, ast.RTrim, ast.Substr, ast.SubstringIndex, ast.Replace, + ast.Substring, ast.Mid, ast.Translate, ast.InsertFunc, ast.Lpad, ast.Rpad, ast.Elt, ast.ExportSet, ast.MakeSet, + ast.FindInSet, ast.Regexp, ast.Field, ast.Locate, ast.Instr, ast.Position, ast.GE, ast.LE, ast.GT, ast.LT, ast.EQ, + ast.NE, ast.NullEQ, ast.Strcmp, ast.If, ast.Ifnull, ast.Like, ast.In, ast.DateFormat, ast.TimeFormat: + if ec.Charset == charset.CharsetBin && expr.GetType().Charset != charset.CharsetBin { + return BuildToBinaryFunction(ctx, expr) + } else if ec.Charset != charset.CharsetBin && expr.GetType().Charset == charset.CharsetBin { + ft := expr.GetType().Clone() + ft.Charset, ft.Collate = ec.Charset, ec.Collation + return BuildFromBinaryFunction(ctx, expr, ft) + } + case ast.Hex, ast.Length, ast.OctetLength, ast.ASCII, ast.ToBase64, ast.AesEncrypt, ast.AesDecrypt, ast.Decode, ast.Encode, + ast.PasswordFunc, ast.MD5, ast.SHA, ast.SHA1, ast.SHA2, ast.Compress: + if _, err := charset.GetDefaultCollationLegacy(expr.GetType().Charset); err != nil { + return BuildToBinaryFunction(ctx, expr) + } + } + return expr +} diff --git a/expression/builtin_encryption.go b/expression/builtin_encryption.go index 90270aad7d847..134b2c417591c 100644 --- a/expression/builtin_encryption.go +++ b/expression/builtin_encryption.go @@ -528,7 +528,7 @@ func (b *builtinPasswordSig) Clone() builtinFunc { func (b *builtinPasswordSig) evalString(row chunk.Row) (d string, isNull bool, err error) { pass, isNull, err := b.args[0].EvalString(b.ctx, row) if isNull || err != nil { - return "", err != nil, err + return "", isNull, err } if len(pass) == 0 { @@ -724,6 +724,7 @@ func (b *builtinSHA2Sig) evalString(row chunk.Row) (string, bool, error) { if isNull || err != nil { return "", isNull, err } + var hasher hash.Hash switch int(hashLength) { case SHA0, SHA256: diff --git a/expression/builtin_encryption_test.go b/expression/builtin_encryption_test.go index 0109c3f0667cc..2dec9405f03db 100644 --- a/expression/builtin_encryption_test.go +++ b/expression/builtin_encryption_test.go @@ -17,67 +17,89 @@ package expression import ( "encoding/hex" "strings" + "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/charset" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" + "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/collate" "github.com/pingcap/tidb/util/hack" + "github.com/stretchr/testify/require" ) var cryptTests = []struct { + chs string origin interface{} password interface{} crypt interface{} }{ - {"", "", ""}, - {"pingcap", "1234567890123456", "2C35B5A4ADF391"}, - {"pingcap", "asdfjasfwefjfjkj", "351CC412605905"}, - {"pingcap123", "123456789012345678901234", "7698723DC6DFE7724221"}, - {"pingcap#%$%^", "*^%YTu1234567", "8634B9C55FF55E5B6328F449"}, - {"pingcap", "", "4A77B524BD2C5C"}, - {"分布式データベース", "pass1234@#$%%^^&", "80CADC8D328B3026D04FB285F36FED04BBCA0CC685BF78B1E687CE"}, - {"分布式データベース", "分布式7782734adgwy1242", "0E24CFEF272EE32B6E0BFBDB89F29FB43B4B30DAA95C3F914444BC"}, - {"pingcap", "密匙", "CE5C02A5010010"}, - {"pingcap数据库", "数据库passwd12345667", "36D5F90D3834E30E396BE3226E3B4ED3"}, - {"数据库5667", 123.435, "B22196D0569386237AE12F8AAB"}, - {nil, "数据库passwd12345667", nil}, + {mysql.DefaultCollationName, "", "", ""}, + {mysql.DefaultCollationName, "pingcap", "1234567890123456", "2C35B5A4ADF391"}, + {mysql.DefaultCollationName, "pingcap", "asdfjasfwefjfjkj", "351CC412605905"}, + {mysql.DefaultCollationName, "pingcap123", "123456789012345678901234", "7698723DC6DFE7724221"}, + {mysql.DefaultCollationName, "pingcap#%$%^", "*^%YTu1234567", "8634B9C55FF55E5B6328F449"}, + {mysql.DefaultCollationName, "pingcap", "", "4A77B524BD2C5C"}, + {mysql.DefaultCollationName, "分布式データベース", "pass1234@#$%%^^&", "80CADC8D328B3026D04FB285F36FED04BBCA0CC685BF78B1E687CE"}, + {mysql.DefaultCollationName, "分布式データベース", "分布式7782734adgwy1242", "0E24CFEF272EE32B6E0BFBDB89F29FB43B4B30DAA95C3F914444BC"}, + {mysql.DefaultCollationName, "pingcap", "密匙", "CE5C02A5010010"}, + {"gbk", "pingcap", "密匙", "E407AC6F691ADE"}, + {mysql.DefaultCollationName, "pingcap数据库", "数据库passwd12345667", "36D5F90D3834E30E396BE3226E3B4ED3"}, + {"gbk", "pingcap数据库", "数据库passwd12345667", "B4BDBD6EC8346379F42836E2E0"}, + {mysql.DefaultCollationName, "数据库5667", 123.435, "B22196D0569386237AE12F8AAB"}, + {"gbk", "数据库5667", 123.435, "79E22979BD860EF58229"}, + {mysql.DefaultCollationName, nil, "数据库passwd12345667", nil}, } -func (s *testEvaluatorSuite) TestSQLDecode(c *C) { - fc := funcs[ast.Decode] +func TestSQLDecode(t *testing.T) { + ctx := createContext(t) for _, tt := range cryptTests { - str := types.NewDatum(tt.origin) - password := types.NewDatum(tt.password) - - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{str, password})) - c.Assert(err, IsNil) - crypt, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(toHex(crypt), DeepEquals, types.NewDatum(tt.crypt)) + err := ctx.GetSessionVars().SetSystemVar(variable.CharacterSetConnection, tt.chs) + require.NoError(t, err) + err = ctx.GetSessionVars().SetSystemVar(variable.CollationConnection, tt.chs) + require.NoError(t, err) + f, err := newFunctionForTest(ctx, ast.Decode, primitiveValsToConstants(ctx, []interface{}{tt.origin, tt.password})...) + require.NoError(t, err) + d, err := f.Eval(chunk.Row{}) + require.NoError(t, err) + if !d.IsNull() { + d = toHex(d) + } + require.Equal(t, types.NewDatum(tt.crypt), d) } - s.testNullInput(c, ast.Decode) + testNullInput(t, ctx, ast.Decode) } -func (s *testEvaluatorSuite) TestSQLEncode(c *C) { - fc := funcs[ast.Encode] +func TestSQLEncode(t *testing.T) { + ctx := createContext(t) for _, test := range cryptTests { - password := types.NewDatum(test.password) - cryptStr := fromHex(test.crypt) - - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{cryptStr, password})) - c.Assert(err, IsNil) - str, err := evalBuiltinFunc(f, chunk.Row{}) - - c.Assert(err, IsNil) - c.Assert(str, DeepEquals, types.NewDatum(test.origin)) + err := ctx.GetSessionVars().SetSystemVar(variable.CharacterSetConnection, test.chs) + require.NoError(t, err) + err = ctx.GetSessionVars().SetSystemVar(variable.CollationConnection, test.chs) + require.NoError(t, err) + var h []byte + if test.crypt != nil { + h, _ = hex.DecodeString(test.crypt.(string)) + } else { + h = nil + } + f, err := newFunctionForTest(ctx, ast.Encode, primitiveValsToConstants(ctx, []interface{}{h, test.password})...) + require.NoError(t, err) + d, err := f.Eval(chunk.Row{}) + require.NoError(t, err) + if test.origin != nil { + result, err := charset.NewEncoding(test.chs).EncodeString(test.origin.(string)) + require.NoError(t, err) + require.Equal(t, types.NewCollationStringDatum(result, test.chs), d) + } else { + result := types.NewDatum(test.origin) + require.Equal(t, result.GetBytes(), d.GetBytes()) + } } - s.testNullInput(c, ast.Encode) + testNullInput(t, ctx, ast.Encode) } var aesTests = []struct { @@ -118,93 +140,178 @@ var aesTests = []struct { {"aes-256-cfb", "pingcap", []interface{}{"1234567890123456", "12345678901234561234567890123456"}, "2E70FCAC0C0834"}, } -func (s *testEvaluatorSuite) TestAESEncrypt(c *C) { +func TestAESEncrypt(t *testing.T) { + ctx := createContext(t) + fc := funcs[ast.AesEncrypt] for _, tt := range aesTests { - err := variable.SetSessionSystemVar(s.ctx.GetSessionVars(), variable.BlockEncryptionMode, tt.mode) - c.Assert(err, IsNil) + err := variable.SetSessionSystemVar(ctx.GetSessionVars(), variable.BlockEncryptionMode, tt.mode) + require.NoError(t, err) args := []types.Datum{types.NewDatum(tt.origin)} for _, param := range tt.params { args = append(args, types.NewDatum(param)) } - f, err := fc.getFunction(s.ctx, s.datumsToConstants(args)) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(args)) + require.NoError(t, err) crypt, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(toHex(crypt), DeepEquals, types.NewDatum(tt.crypt)) + require.NoError(t, err) + require.Equal(t, types.NewDatum(tt.crypt), toHex(crypt)) + } + err := variable.SetSessionSystemVar(ctx.GetSessionVars(), variable.BlockEncryptionMode, "aes-128-ecb") + require.NoError(t, err) + testNullInput(t, ctx, ast.AesEncrypt) + testAmbiguousInput(t, ctx, ast.AesEncrypt) + + // Test GBK String + gbkStr, _ := charset.NewEncoding("gbk").EncodeString("你好") + gbkTests := []struct { + mode string + chs string + origin interface{} + params []interface{} + crypt string + }{ + // test for ecb + {"aes-128-ecb", "utf8mb4", "你好", []interface{}{"123"}, "CEBD80EEC6423BEAFA1BB30FD7625CBC"}, + {"aes-128-ecb", "gbk", gbkStr, []interface{}{"123"}, "6AFA9D7BA2C1AED1603E804F75BB0127"}, + {"aes-128-ecb", "utf8mb4", "123", []interface{}{"你好"}, "E03F6D9C1C86B82F5620EE0AA9BD2F6A"}, + {"aes-128-ecb", "gbk", "123", []interface{}{"你好"}, "31A2D26529F0E6A38D406379ABD26FA5"}, + {"aes-128-ecb", "utf8mb4", "你好", []interface{}{"你好"}, "3E2D8211DAE17143F22C2C5969A35263"}, + {"aes-128-ecb", "gbk", gbkStr, []interface{}{"你好"}, "84982910338160D037615D283AD413DE"}, + // test for cbc + {"aes-128-cbc", "utf8mb4", "你好", []interface{}{"123", "1234567890123456"}, "B95509A516ACED59C3DF4EC41C538D83"}, + {"aes-128-cbc", "gbk", gbkStr, []interface{}{"123", "1234567890123456"}, "D4322D091B5DDE0DEB35B1749DA2483C"}, + {"aes-128-cbc", "utf8mb4", "123", []interface{}{"你好", "1234567890123456"}, "E19E86A9E78E523267AFF36261AD117D"}, + {"aes-128-cbc", "gbk", "123", []interface{}{"你好", "1234567890123456"}, "5A2F8F2C1841CC4E1D1640F1EA2A1A23"}, + {"aes-128-cbc", "utf8mb4", "你好", []interface{}{"你好", "1234567890123456"}, "B73637C73302C909EA63274C07883E71"}, + {"aes-128-cbc", "gbk", gbkStr, []interface{}{"你好", "1234567890123456"}, "61E13E9B00F2E757F4E925D3268227A0"}, + } + + for _, tt := range gbkTests { + err := ctx.GetSessionVars().SetSystemVar(variable.CharacterSetConnection, tt.chs) + require.NoError(t, err) + err = variable.SetSessionSystemVar(ctx.GetSessionVars(), variable.BlockEncryptionMode, tt.mode) + require.NoError(t, err) + + args := datumsToConstants([]types.Datum{types.NewDatum(tt.origin)}) + args = append(args, primitiveValsToConstants(ctx, tt.params)...) + f, err := fc.getFunction(ctx, args) + + require.NoError(t, err) + crypt, err := evalBuiltinFunc(f, chunk.Row{}) + require.NoError(t, err) + require.Equal(t, types.NewDatum(tt.crypt), toHex(crypt)) } - err := variable.SetSessionSystemVar(s.ctx.GetSessionVars(), variable.BlockEncryptionMode, "aes-128-ecb") - c.Assert(err, IsNil) - s.testNullInput(c, ast.AesEncrypt) - s.testAmbiguousInput(c, ast.AesEncrypt) } -func (s *testEvaluatorSuite) TestAESDecrypt(c *C) { +func TestAESDecrypt(t *testing.T) { + ctx := createContext(t) + fc := funcs[ast.AesDecrypt] for _, tt := range aesTests { - err := variable.SetSessionSystemVar(s.ctx.GetSessionVars(), variable.BlockEncryptionMode, tt.mode) - c.Assert(err, IsNil) + err := variable.SetSessionSystemVar(ctx.GetSessionVars(), variable.BlockEncryptionMode, tt.mode) + require.NoError(t, err) args := []types.Datum{fromHex(tt.crypt)} for _, param := range tt.params { args = append(args, types.NewDatum(param)) } - f, err := fc.getFunction(s.ctx, s.datumsToConstants(args)) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(args)) + require.NoError(t, err) str, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) if tt.origin == nil { - c.Assert(str.IsNull(), IsTrue) + require.True(t, str.IsNull()) continue } - c.Assert(str, DeepEquals, types.NewCollationStringDatum(tt.origin.(string), charset.CollationBin, collate.DefaultLen)) + require.Equal(t, types.NewCollationStringDatum(tt.origin.(string), charset.CollationBin), str) + } + err := variable.SetSessionSystemVar(ctx.GetSessionVars(), variable.BlockEncryptionMode, "aes-128-ecb") + require.NoError(t, err) + testNullInput(t, ctx, ast.AesDecrypt) + testAmbiguousInput(t, ctx, ast.AesDecrypt) + + // Test GBK String + gbkStr, _ := charset.NewEncoding("gbk").EncodeString("你好") + gbkTests := []struct { + mode string + chs string + origin interface{} + params []interface{} + crypt string + }{ + // test for ecb + {"aes-128-ecb", "utf8mb4", "你好", []interface{}{"123"}, "CEBD80EEC6423BEAFA1BB30FD7625CBC"}, + {"aes-128-ecb", "gbk", gbkStr, []interface{}{"123"}, "6AFA9D7BA2C1AED1603E804F75BB0127"}, + {"aes-128-ecb", "utf8mb4", "123", []interface{}{"你好"}, "E03F6D9C1C86B82F5620EE0AA9BD2F6A"}, + {"aes-128-ecb", "gbk", "123", []interface{}{"你好"}, "31A2D26529F0E6A38D406379ABD26FA5"}, + {"aes-128-ecb", "utf8mb4", "你好", []interface{}{"你好"}, "3E2D8211DAE17143F22C2C5969A35263"}, + {"aes-128-ecb", "gbk", gbkStr, []interface{}{"你好"}, "84982910338160D037615D283AD413DE"}, + // test for cbc + {"aes-128-cbc", "utf8mb4", "你好", []interface{}{"123", "1234567890123456"}, "B95509A516ACED59C3DF4EC41C538D83"}, + {"aes-128-cbc", "gbk", gbkStr, []interface{}{"123", "1234567890123456"}, "D4322D091B5DDE0DEB35B1749DA2483C"}, + {"aes-128-cbc", "utf8mb4", "123", []interface{}{"你好", "1234567890123456"}, "E19E86A9E78E523267AFF36261AD117D"}, + {"aes-128-cbc", "gbk", "123", []interface{}{"你好", "1234567890123456"}, "5A2F8F2C1841CC4E1D1640F1EA2A1A23"}, + {"aes-128-cbc", "utf8mb4", "你好", []interface{}{"你好", "1234567890123456"}, "B73637C73302C909EA63274C07883E71"}, + {"aes-128-cbc", "gbk", gbkStr, []interface{}{"你好", "1234567890123456"}, "61E13E9B00F2E757F4E925D3268227A0"}, + } + + for _, tt := range gbkTests { + err := ctx.GetSessionVars().SetSystemVar(variable.CharacterSetConnection, tt.chs) + require.NoError(t, err) + err = variable.SetSessionSystemVar(ctx.GetSessionVars(), variable.BlockEncryptionMode, tt.mode) + require.NoError(t, err) + // Set charset and collate except first argument + args := datumsToConstants([]types.Datum{fromHex(tt.crypt)}) + args = append(args, primitiveValsToConstants(ctx, tt.params)...) + f, err := fc.getFunction(ctx, args) + require.NoError(t, err) + str, err := evalBuiltinFunc(f, chunk.Row{}) + require.NoError(t, err) + require.Equal(t, types.NewCollationStringDatum(tt.origin.(string), charset.CollationBin), str) } - err := variable.SetSessionSystemVar(s.ctx.GetSessionVars(), variable.BlockEncryptionMode, "aes-128-ecb") - c.Assert(err, IsNil) - s.testNullInput(c, ast.AesDecrypt) - s.testAmbiguousInput(c, ast.AesDecrypt) } -func (s *testEvaluatorSuite) testNullInput(c *C, fnName string) { - err := variable.SetSessionSystemVar(s.ctx.GetSessionVars(), variable.BlockEncryptionMode, "aes-128-ecb") - c.Assert(err, IsNil) +func testNullInput(t *testing.T, ctx sessionctx.Context, fnName string) { + err := variable.SetSessionSystemVar(ctx.GetSessionVars(), variable.BlockEncryptionMode, "aes-128-ecb") + require.NoError(t, err) fc := funcs[fnName] arg := types.NewStringDatum("str") var argNull types.Datum - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{arg, argNull})) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{arg, argNull})) + require.NoError(t, err) crypt, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(crypt.IsNull(), IsTrue) + require.NoError(t, err) + require.True(t, crypt.IsNull()) - f, err = fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{argNull, arg})) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants([]types.Datum{argNull, arg})) + require.NoError(t, err) crypt, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(crypt.IsNull(), IsTrue) + require.NoError(t, err) + require.True(t, crypt.IsNull()) } -func (s *testEvaluatorSuite) testAmbiguousInput(c *C, fnName string) { +func testAmbiguousInput(t *testing.T, ctx sessionctx.Context, fnName string) { fc := funcs[fnName] arg := types.NewStringDatum("str") // test for modes that require init_vector - err := variable.SetSessionSystemVar(s.ctx.GetSessionVars(), variable.BlockEncryptionMode, ("aes-128-cbc")) - c.Assert(err, IsNil) - _, err = fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{arg, arg})) - c.Assert(err, NotNil) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{arg, arg, types.NewStringDatum("iv < 16 bytes")})) - c.Assert(err, IsNil) + err := variable.SetSessionSystemVar(ctx.GetSessionVars(), variable.BlockEncryptionMode, "aes-128-cbc") + require.NoError(t, err) + _, err = fc.getFunction(ctx, datumsToConstants([]types.Datum{arg, arg})) + require.Error(t, err) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{arg, arg, types.NewStringDatum("iv < 16 bytes")})) + require.NoError(t, err) _, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, NotNil) + require.Error(t, err) // test for modes that do not require init_vector - err = variable.SetSessionSystemVar(s.ctx.GetSessionVars(), variable.BlockEncryptionMode, "aes-128-ecb") - c.Assert(err, IsNil) - f, err = fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{arg, arg, arg})) - c.Assert(err, IsNil) + err = variable.SetSessionSystemVar(ctx.GetSessionVars(), variable.BlockEncryptionMode, "aes-128-ecb") + require.NoError(t, err) + f, err = fc.getFunction(ctx, datumsToConstants([]types.Datum{arg, arg, arg})) + require.NoError(t, err) _, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - warnings := s.ctx.GetSessionVars().StmtCtx.GetWarnings() - c.Assert(len(warnings), GreaterEqual, 1) + require.NoError(t, err) + warnings := ctx.GetSessionVars().StmtCtx.GetWarnings() + require.GreaterOrEqual(t, len(warnings), 1) } func toHex(d types.Datum) (h types.Datum) { @@ -227,139 +334,189 @@ func fromHex(str interface{}) (d types.Datum) { return d } -var sha1Tests = []struct { - origin interface{} - crypt string -}{ - {"test", "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3"}, - {"c4pt0r", "034923dcabf099fc4c8917c0ab91ffcd4c2578a6"}, - {"pingcap", "73bf9ef43a44f42e2ea2894d62f0917af149a006"}, - {"foobar", "8843d7f92416211de9ebb963ff4ce28125932878"}, - {1024, "128351137a9c47206c4507dcf2e6fbeeca3a9079"}, - {123.45, "22f8b438ad7e89300b51d88684f3f0b9fa1d7a32"}, -} +func TestSha1Hash(t *testing.T) { + ctx := createContext(t) + sha1Tests := []struct { + chs string + origin interface{} + crypt string + }{ + {mysql.DefaultCollationName, "test", "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3"}, + {mysql.DefaultCollationName, "c4pt0r", "034923dcabf099fc4c8917c0ab91ffcd4c2578a6"}, + {mysql.DefaultCollationName, "pingcap", "73bf9ef43a44f42e2ea2894d62f0917af149a006"}, + {mysql.DefaultCollationName, "foobar", "8843d7f92416211de9ebb963ff4ce28125932878"}, + {mysql.DefaultCollationName, 1024, "128351137a9c47206c4507dcf2e6fbeeca3a9079"}, + {mysql.DefaultCollationName, 123.45, "22f8b438ad7e89300b51d88684f3f0b9fa1d7a32"}, + {"gbk", 123.45, "22f8b438ad7e89300b51d88684f3f0b9fa1d7a32"}, + {"gbk", "一二三", "30cda4eed59a2ff592f2881f39d42fed6e10cad8"}, + {"gbk", "一二三123", "1e24acbf708cd889c1d5be90abc1f14eaf14d0b4"}, + {"gbk", "", "da39a3ee5e6b4b0d3255bfef95601890afd80709"}, + } -func (s *testEvaluatorSuite) TestSha1Hash(c *C) { fc := funcs[ast.SHA] for _, tt := range sha1Tests { - in := types.NewDatum(tt.origin) - f, _ := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{in})) + err := ctx.GetSessionVars().SetSystemVar(variable.CharacterSetConnection, tt.chs) + require.NoError(t, err) + f, _ := fc.getFunction(ctx, primitiveValsToConstants(ctx, []interface{}{tt.origin})) crypt, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) res, err := crypt.ToString() - c.Assert(err, IsNil) - c.Assert(res, Equals, tt.crypt) + require.NoError(t, err) + require.Equal(t, tt.crypt, res) } // test NULL input for sha var argNull types.Datum - f, _ := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{argNull})) + f, _ := fc.getFunction(ctx, datumsToConstants([]types.Datum{argNull})) crypt, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(crypt.IsNull(), IsTrue) + require.NoError(t, err) + require.True(t, crypt.IsNull()) } -var sha2Tests = []struct { - origin interface{} - hashLength interface{} - crypt interface{} - validCase bool -}{ - {"pingcap", 0, "2871823be240f8ecd1d72f24c99eaa2e58af18b4b8ba99a4fc2823ba5c43930a", true}, - {"pingcap", 224, "cd036dc9bec69e758401379c522454ea24a6327b48724b449b40c6b7", true}, - {"pingcap", 256, "2871823be240f8ecd1d72f24c99eaa2e58af18b4b8ba99a4fc2823ba5c43930a", true}, - {"pingcap", 384, "c50955b6b0c7b9919740d956849eedcb0f0f90bf8a34e8c1f4e071e3773f53bd6f8f16c04425ff728bed04de1b63db51", true}, - {"pingcap", 512, "ea903c574370774c4844a83b7122105a106e04211673810e1baae7c2ae7aba2cf07465e02f6c413126111ef74a417232683ce7ba210052e63c15fc82204aad80", true}, - {13572468, 0, "1c91ab1c162fd0cae60a5bb9880f3e7d5a133a65b6057a644b26973d9c55dcfe", true}, - {13572468, 224, "8ad67735bbf49576219f364f4640d595357a440358d15bf6815a16e4", true}, - {13572468, 256, "1c91ab1c162fd0cae60a5bb9880f3e7d5a133a65b6057a644b26973d9c55dcfe", true}, - {13572468.123, 384, "3b4ee302435dc1e15251efd9f3982b1ca6fe4ac778d3260b7bbf3bea613849677eda830239420e448e4c6dc7c2649d89", true}, - {13572468.123, 512, "4820aa3f2760836557dc1f2d44a0ba7596333fdb60c8a1909481862f4ab0921c00abb23d57b7e67a970363cc3fcb78b25b6a0d45cdcac0e87aa0c96bc51f7f96", true}, - {nil, 224, nil, false}, - {"pingcap", nil, nil, false}, - {"pingcap", 123, nil, false}, -} +func TestSha2Hash(t *testing.T) { + ctx := createContext(t) + sha2Tests := []struct { + chs string + origin interface{} + hashLength interface{} + crypt interface{} + validCase bool + }{ + {mysql.DefaultCollationName, "pingcap", 0, "2871823be240f8ecd1d72f24c99eaa2e58af18b4b8ba99a4fc2823ba5c43930a", true}, + {mysql.DefaultCollationName, "pingcap", 224, "cd036dc9bec69e758401379c522454ea24a6327b48724b449b40c6b7", true}, + {mysql.DefaultCollationName, "pingcap", 256, "2871823be240f8ecd1d72f24c99eaa2e58af18b4b8ba99a4fc2823ba5c43930a", true}, + {mysql.DefaultCollationName, "pingcap", 384, "c50955b6b0c7b9919740d956849eedcb0f0f90bf8a34e8c1f4e071e3773f53bd6f8f16c04425ff728bed04de1b63db51", true}, + {mysql.DefaultCollationName, "pingcap", 512, "ea903c574370774c4844a83b7122105a106e04211673810e1baae7c2ae7aba2cf07465e02f6c413126111ef74a417232683ce7ba210052e63c15fc82204aad80", true}, + {mysql.DefaultCollationName, 13572468, 0, "1c91ab1c162fd0cae60a5bb9880f3e7d5a133a65b6057a644b26973d9c55dcfe", true}, + {mysql.DefaultCollationName, 13572468, 224, "8ad67735bbf49576219f364f4640d595357a440358d15bf6815a16e4", true}, + {mysql.DefaultCollationName, 13572468, 256, "1c91ab1c162fd0cae60a5bb9880f3e7d5a133a65b6057a644b26973d9c55dcfe", true}, + {mysql.DefaultCollationName, 13572468.123, 384, "3b4ee302435dc1e15251efd9f3982b1ca6fe4ac778d3260b7bbf3bea613849677eda830239420e448e4c6dc7c2649d89", true}, + {mysql.DefaultCollationName, 13572468.123, 512, "4820aa3f2760836557dc1f2d44a0ba7596333fdb60c8a1909481862f4ab0921c00abb23d57b7e67a970363cc3fcb78b25b6a0d45cdcac0e87aa0c96bc51f7f96", true}, + {mysql.DefaultCollationName, nil, 224, nil, false}, + {mysql.DefaultCollationName, "pingcap", nil, nil, false}, + {mysql.DefaultCollationName, "pingcap", 123, nil, false}, + {"gbk", "pingcap", 0, "2871823be240f8ecd1d72f24c99eaa2e58af18b4b8ba99a4fc2823ba5c43930a", true}, + {"gbk", "pingcap", 224, "cd036dc9bec69e758401379c522454ea24a6327b48724b449b40c6b7", true}, + {"gbk", "pingcap", 256, "2871823be240f8ecd1d72f24c99eaa2e58af18b4b8ba99a4fc2823ba5c43930a", true}, + {"gbk", "pingcap", 384, "c50955b6b0c7b9919740d956849eedcb0f0f90bf8a34e8c1f4e071e3773f53bd6f8f16c04425ff728bed04de1b63db51", true}, + {"gbk", "pingcap", 512, "ea903c574370774c4844a83b7122105a106e04211673810e1baae7c2ae7aba2cf07465e02f6c413126111ef74a417232683ce7ba210052e63c15fc82204aad80", true}, + {"gbk", 13572468, 0, "1c91ab1c162fd0cae60a5bb9880f3e7d5a133a65b6057a644b26973d9c55dcfe", true}, + {"gbk", 13572468, 224, "8ad67735bbf49576219f364f4640d595357a440358d15bf6815a16e4", true}, + {"gbk", 13572468, 256, "1c91ab1c162fd0cae60a5bb9880f3e7d5a133a65b6057a644b26973d9c55dcfe", true}, + {"gbk", 13572468.123, 384, "3b4ee302435dc1e15251efd9f3982b1ca6fe4ac778d3260b7bbf3bea613849677eda830239420e448e4c6dc7c2649d89", true}, + {"gbk", 13572468.123, 512, "4820aa3f2760836557dc1f2d44a0ba7596333fdb60c8a1909481862f4ab0921c00abb23d57b7e67a970363cc3fcb78b25b6a0d45cdcac0e87aa0c96bc51f7f96", true}, + {"gbk", nil, 224, nil, false}, + {"gbk", "pingcap", nil, nil, false}, + {"gbk", "pingcap", 123, nil, false}, + {"gbk", "一二三", 0, "b6c1ae1f8d8a07426ddb13fca5124fb0b9f1f0ef1cca6730615099cf198ca8af", true}, + {"gbk", "一二三", 224, "2362f577783f6cd6cc10b0308f946f479fef868a39d6339b5d74cc6d", true}, + {"gbk", "一二三", 256, "b6c1ae1f8d8a07426ddb13fca5124fb0b9f1f0ef1cca6730615099cf198ca8af", true}, + {"gbk", "一二三", 384, "54e75070f1faab03e7ce808ca2824ed4614ad1d58ee1409d8c1e4fd72ecab12c92ac3a2f919721c2aa09b23e5f3cc8aa", true}, + {"gbk", "一二三", 512, "54fae3d0bb68bb4645af4a97a01fee1a6e3ecf7850f1ba41a994a46d23b60082262d00d9c635ff7ed02203e4806794dfa57c3654b3a4549bfb77ef1ddeab0224", true}, + {"gbk", "一二三123", 0, "de059637dd572c2e21df1dd6d04512ad3a34f71964f14338e966356a091c0e7e", true}, + {"gbk", "一二三123", 224, "a192909220fea1b74bcea87740f7550a2c03cf4f92d4c78ccedc9e3f", true}, + {"gbk", "一二三123", 256, "de059637dd572c2e21df1dd6d04512ad3a34f71964f14338e966356a091c0e7e", true}, + {"gbk", "一二三123", 384, "a487131f07fd46f66d7300be3c10bdae255e3296334a239240b28d32f038983331b276bd717363673e54733b594e7781", true}, + {"gbk", "一二三123", 512, "9336a0844a5a1dc656d02ded28bf768cef9c39b47bd7292c75fc0d27fcb509ca765d24d502e5906e8afe1803fd5ea325e3d855a0206df6bc08fef5e7e34b0082", true}, + {"gbk", "", 0, "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", true}, + {"gbk", "", 224, "d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f", true}, + {"gbk", "", 256, "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", true}, + {"gbk", "", 384, "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b", true}, + {"gbk", "", 512, "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e", true}, + } -func (s *testEvaluatorSuite) TestSha2Hash(c *C) { fc := funcs[ast.SHA2] for _, tt := range sha2Tests { - str := types.NewDatum(tt.origin) - hashLength := types.NewDatum(tt.hashLength) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{str, hashLength})) - c.Assert(err, IsNil) + err := ctx.GetSessionVars().SetSystemVar(variable.CharacterSetConnection, tt.chs) + require.NoError(t, err) + f, err := fc.getFunction(ctx, primitiveValsToConstants(ctx, []interface{}{tt.origin, tt.hashLength})) + require.NoError(t, err) crypt, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) if tt.validCase { res, err := crypt.ToString() - c.Assert(err, IsNil) - c.Assert(res, Equals, tt.crypt) + require.NoError(t, err) + require.Equal(t, tt.crypt, res) } else { - c.Assert(crypt.IsNull(), IsTrue) + require.True(t, crypt.IsNull()) } } } -func (s *testEvaluatorSuite) TestMD5Hash(c *C) { +func TestMD5Hash(t *testing.T) { + ctx := createContext(t) + cases := []struct { args interface{} expected string + charset string isNil bool getErr bool }{ - {"", "d41d8cd98f00b204e9800998ecf8427e", false, false}, - {"a", "0cc175b9c0f1b6a831c399e269772661", false, false}, - {"ab", "187ef4436122d1cc2f40dc2b92f0eba0", false, false}, - {"abc", "900150983cd24fb0d6963f7d28e17f72", false, false}, - {123, "202cb962ac59075b964b07152d234b70", false, false}, - {"123", "202cb962ac59075b964b07152d234b70", false, false}, - {123.123, "46ddc40585caa8abc07c460b3485781e", false, false}, - {nil, "", true, false}, + {"", "d41d8cd98f00b204e9800998ecf8427e", "", false, false}, + {"a", "0cc175b9c0f1b6a831c399e269772661", "", false, false}, + {"ab", "187ef4436122d1cc2f40dc2b92f0eba0", "", false, false}, + {"abc", "900150983cd24fb0d6963f7d28e17f72", "", false, false}, + {"abc", "900150983cd24fb0d6963f7d28e17f72", "gbk", false, false}, + {123, "202cb962ac59075b964b07152d234b70", "", false, false}, + {"123", "202cb962ac59075b964b07152d234b70", "", false, false}, + {"123", "202cb962ac59075b964b07152d234b70", "gbk", false, false}, + {123.123, "46ddc40585caa8abc07c460b3485781e", "", false, false}, + {"一二三", "8093a32450075324682d01456d6e3919", "", false, false}, + {"一二三", "a45d4af7b243e7f393fa09bed72ac73e", "gbk", false, false}, + {"ㅂ123", "0e85d0f68c104b65a15d727e26705596", "", false, false}, + {"ㅂ123", "", "gbk", false, true}, + {nil, "", "", true, false}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.MD5, s.primitiveValsToConstants([]interface{}{t.args})...) - c.Assert(err, IsNil) + for _, c := range cases { + err := ctx.GetSessionVars().SetSystemVar(variable.CharacterSetConnection, c.charset) + require.NoError(t, err) + f, err := newFunctionForTest(ctx, ast.MD5, primitiveValsToConstants(ctx, []interface{}{c.args})...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetString(), Equals, t.expected) + require.Equal(t, c.expected, d.GetString()) } } } - _, err := funcs[ast.MD5].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.MD5].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestRandomBytes(c *C) { +func TestRandomBytes(t *testing.T) { + ctx := createContext(t) + fc := funcs[ast.RandomBytes] - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{types.NewDatum(32)})) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{types.NewDatum(32)})) + require.NoError(t, err) out, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(len(out.GetBytes()), Equals, 32) + require.NoError(t, err) + require.Equal(t, 32, len(out.GetBytes())) - f, err = fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{types.NewDatum(1025)})) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants([]types.Datum{types.NewDatum(1025)})) + require.NoError(t, err) _, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, NotNil) - f, err = fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{types.NewDatum(-32)})) - c.Assert(err, IsNil) + require.Error(t, err) + f, err = fc.getFunction(ctx, datumsToConstants([]types.Datum{types.NewDatum(-32)})) + require.NoError(t, err) _, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, NotNil) - f, err = fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{types.NewDatum(0)})) - c.Assert(err, IsNil) + require.Error(t, err) + f, err = fc.getFunction(ctx, datumsToConstants([]types.Datum{types.NewDatum(0)})) + require.NoError(t, err) _, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, NotNil) + require.Error(t, err) - f, err = fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{types.NewDatum(nil)})) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants([]types.Datum{types.NewDatum(nil)})) + require.NoError(t, err) out, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(len(out.GetBytes()), Equals, 0) + require.NoError(t, err) + require.Equal(t, 0, len(out.GetBytes())) } func decodeHex(str string) []byte { @@ -370,32 +527,40 @@ func decodeHex(str string) []byte { return ret } -func (s *testEvaluatorSuite) TestCompress(c *C) { +func TestCompress(t *testing.T) { + ctx := createContext(t) + fc := funcs[ast.Compress] tests := []struct { + chs string in interface{} expect interface{} }{ - {"hello world", string(decodeHex("0B000000789CCA48CDC9C95728CF2FCA4901040000FFFF1A0B045D"))}, - {"", ""}, - {nil, nil}, + {"", "hello world", string(decodeHex("0B000000789CCA48CDC9C95728CF2FCA4901040000FFFF1A0B045D"))}, + {"", "", ""}, + {"", nil, nil}, + {"utf8mb4", "hello world", string(decodeHex("0B000000789CCA48CDC9C95728CF2FCA4901040000FFFF1A0B045D"))}, + {"gbk", "hello world", string(decodeHex("0B000000789CCA48CDC9C95728CF2FCA4901040000FFFF1A0B045D"))}, + {"utf8mb4", "你好", string(decodeHex("06000000789C7AB277C1D3A57B01010000FFFF10450489"))}, + {"gbk", "你好", string(decodeHex("04000000789C3AF278D76140000000FFFF07F40325"))}, } - - fc := funcs[ast.Compress] for _, test := range tests { - arg := types.NewDatum(test.in) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{arg})) - c.Assert(err, IsNil, Commentf("%v", test)) + err := ctx.GetSessionVars().SetSystemVar(variable.CharacterSetConnection, test.chs) + require.NoErrorf(t, err, "%v", test) + arg := primitiveValsToConstants(ctx, []interface{}{test.in}) + f, err := fc.getFunction(ctx, arg) + require.NoErrorf(t, err, "%v", test) out, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil, Commentf("%v", test)) + require.NoErrorf(t, err, "%v", test) if test.expect == nil { - c.Assert(out.IsNull(), IsTrue, Commentf("%v", test)) + require.Truef(t, out.IsNull(), "%v", test) continue } - c.Assert(out, DeepEquals, types.NewCollationStringDatum(test.expect.(string), charset.CollationBin, collate.DefaultLen), Commentf("%v", test)) + require.Equalf(t, types.NewCollationStringDatum(test.expect.(string), charset.CollationBin), out, "%v", test) } } -func (s *testEvaluatorSuite) TestUncompress(c *C) { +func TestUncompress(t *testing.T) { + ctx := createContext(t) tests := []struct { in interface{} expect interface{} @@ -417,19 +582,20 @@ func (s *testEvaluatorSuite) TestUncompress(c *C) { fc := funcs[ast.Uncompress] for _, test := range tests { arg := types.NewDatum(test.in) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{arg})) - c.Assert(err, IsNil, Commentf("%v", test)) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{arg})) + require.NoErrorf(t, err, "%v", test) out, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil, Commentf("%v", test)) + require.NoErrorf(t, err, "%v", test) if test.expect == nil { - c.Assert(out.IsNull(), IsTrue, Commentf("%v", test)) + require.Truef(t, out.IsNull(), "%v", test) continue } - c.Assert(out, DeepEquals, types.NewCollationStringDatum(test.expect.(string), charset.CollationBin, collate.DefaultLen), Commentf("%v", test)) + require.Equalf(t, types.NewCollationStringDatum(test.expect.(string), charset.CollationBin), out, "%v", test) } } -func (s *testEvaluatorSuite) TestUncompressLength(c *C) { +func TestUncompressLength(t *testing.T) { + ctx := createContext(t) tests := []struct { in interface{} expect interface{} @@ -450,55 +616,67 @@ func (s *testEvaluatorSuite) TestUncompressLength(c *C) { fc := funcs[ast.UncompressedLength] for _, test := range tests { arg := types.NewDatum(test.in) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{arg})) - c.Assert(err, IsNil, Commentf("%v", test)) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{arg})) + require.NoErrorf(t, err, "%v", test) out, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil, Commentf("%v", test)) - c.Assert(out, DeepEquals, types.NewDatum(test.expect), Commentf("%v", test)) + require.NoErrorf(t, err, "%v", test) + require.Equalf(t, types.NewDatum(test.expect), out, "%v", test) } } -func (s *testEvaluatorSuite) TestPassword(c *C) { +func TestPassword(t *testing.T) { + ctx := createContext(t) cases := []struct { args interface{} expected string + charset string isNil bool getErr bool getWarn bool }{ - {nil, "", false, false, false}, - {"", "", false, false, false}, - {"abc", "*0D3CED9BEC10A777AEC23CCC353A8C08A633045E", false, false, true}, - {123, "*23AE809DDACAF96AF0FD78ED04B6A265E05AA257", false, false, true}, - {1.23, "*A589EEBA8D3F9E1A34A7EE518FAC4566BFAD5BB6", false, false, true}, - {types.NewDecFromFloatForTest(123.123), "*B15B84262DB34BFB2C817A45A55C405DC7C52BB1", false, false, true}, + {nil, "", "", false, false, false}, + {"", "", "", false, false, false}, + {"abc", "*0D3CED9BEC10A777AEC23CCC353A8C08A633045E", "", false, false, true}, + {"abc", "*0D3CED9BEC10A777AEC23CCC353A8C08A633045E", "gbk", false, false, true}, + {123, "*23AE809DDACAF96AF0FD78ED04B6A265E05AA257", "", false, false, true}, + {1.23, "*A589EEBA8D3F9E1A34A7EE518FAC4566BFAD5BB6", "", false, false, true}, + {"一二三四", "*D207780722F22B23C254CAC0580D3B6738C19E18", "", false, false, true}, + {"一二三四", "*48E0460AD45CF66AC6B8C18CB8B4BC8A403D935B", "gbk", false, false, true}, + {"ㅂ123", "", "gbk", false, true, false}, + {types.NewDecFromFloatForTest(123.123), "*B15B84262DB34BFB2C817A45A55C405DC7C52BB1", "", false, false, true}, } - warnCount := len(s.ctx.GetSessionVars().StmtCtx.GetWarnings()) - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.PasswordFunc, s.primitiveValsToConstants([]interface{}{t.args})...) - c.Assert(err, IsNil) + warnCount := len(ctx.GetSessionVars().StmtCtx.GetWarnings()) + for _, c := range cases { + err := ctx.GetSessionVars().SetSystemVar(variable.CharacterSetConnection, c.charset) + require.NoError(t, err) + f, err := newFunctionForTest(ctx, ast.PasswordFunc, primitiveValsToConstants(ctx, []interface{}{c.args})...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + if c.getErr { + require.Error(t, err) + continue + } + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetString(), Equals, t.expected) + require.Equal(t, c.expected, d.GetString()) } - warnings := s.ctx.GetSessionVars().StmtCtx.GetWarnings() - if t.getWarn { - c.Assert(len(warnings), Equals, warnCount+1) + warnings := ctx.GetSessionVars().StmtCtx.GetWarnings() + if c.getWarn { + require.Equal(t, warnCount+1, len(warnings)) lastWarn := warnings[len(warnings)-1] - c.Assert(terror.ErrorEqual(errDeprecatedSyntaxNoReplacement, lastWarn.Err), IsTrue, Commentf("err %v", lastWarn.Err)) + require.Truef(t, terror.ErrorEqual(errDeprecatedSyntaxNoReplacement, lastWarn.Err), "err %v", lastWarn.Err) warnCount = len(warnings) } else { - c.Assert(len(warnings), Equals, warnCount) + require.Equal(t, warnCount, len(warnings)) } } - _, err := funcs[ast.PasswordFunc].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.PasswordFunc].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) } diff --git a/expression/builtin_encryption_vec.go b/expression/builtin_encryption_vec.go index 3a7341bae142f..4433463429127 100644 --- a/expression/builtin_encryption_vec.go +++ b/expression/builtin_encryption_vec.go @@ -33,7 +33,6 @@ import ( "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/encrypt" - "github.com/pingcap/tidb/util/hack" ) func (b *builtinAesDecryptSig) vectorized() bool { @@ -422,14 +421,15 @@ func (b *builtinMD5Sig) vecEvalString(input *chunk.Chunk, result *chunk.Column) return err } result.ReserveString(n) + digest := md5.New() // #nosec G401 for i := 0; i < n; i++ { if buf.IsNull(i) { result.AppendNull() continue } - cryptByte := buf.GetBytes(i) - _, err := digest.Write(cryptByte) + cryptBytes := buf.GetBytes(i) + _, err = digest.Write(cryptBytes) if err != nil { return err } @@ -562,14 +562,14 @@ func (b *builtinCompressSig) vecEvalString(input *chunk.Chunk, result *chunk.Col continue } - str := buf.GetString(i) + strBytes := buf.GetBytes(i) // According to doc: Empty strings are stored as empty strings. - if len(str) == 0 { + if len(strBytes) == 0 { result.AppendString("") } - compressed, err := deflate(hack.Slice(str)) + compressed, err := deflate(strBytes) if err != nil { result.AppendNull() continue @@ -587,7 +587,7 @@ func (b *builtinCompressSig) vecEvalString(input *chunk.Chunk, result *chunk.Col defer deallocateByteSlice(buffer) buffer = buffer[:resultLength] - binary.LittleEndian.PutUint32(buffer, uint32(len(str))) + binary.LittleEndian.PutUint32(buffer, uint32(len(strBytes))) copy(buffer[4:], compressed) if shouldAppendSuffix { @@ -686,16 +686,18 @@ func (b *builtinPasswordSig) vecEvalString(input *chunk.Chunk, result *chunk.Col result.AppendString("") continue } - pass := buf.GetString(i) - if len(pass) == 0 { + + passBytes := buf.GetBytes(i) + if len(passBytes) == 0 { result.AppendString("") continue } + // We should append a warning here because function "PASSWORD" is deprecated since MySQL 5.7.6. // See https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#function_password b.ctx.GetSessionVars().StmtCtx.AppendWarning(errDeprecatedSyntaxNoReplacement.GenWithStackByArgs("PASSWORD")) - result.AppendString(auth.EncodePassword(pass)) + result.AppendString(auth.EncodePasswordBytes(passBytes)) } return nil } diff --git a/expression/builtin_encryption_vec_test.go b/expression/builtin_encryption_vec_test.go index 4e2e81d6f279d..c7cb9d7f58a11 100644 --- a/expression/builtin_encryption_vec_test.go +++ b/expression/builtin_encryption_vec_test.go @@ -17,7 +17,6 @@ package expression import ( "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/types" ) @@ -75,8 +74,8 @@ var vecBuiltinEncryptionCases = map[string][]vecExprBenchCase{ }, } -func (s *testEvaluatorSuite) TestVectorizedBuiltinEncryptionFunc(c *C) { - testVectorizedBuiltinFunc(c, vecBuiltinEncryptionCases) +func TestVectorizedBuiltinEncryptionFunc(t *testing.T) { + testVectorizedBuiltinFunc(t, vecBuiltinEncryptionCases) } func BenchmarkVectorizedBuiltinEncryptionFunc(b *testing.B) { diff --git a/expression/builtin_info.go b/expression/builtin_info.go index 66c166c0d785f..22018213ef9e7 100644 --- a/expression/builtin_info.go +++ b/expression/builtin_info.go @@ -190,7 +190,7 @@ func (b *builtinCurrentUserSig) evalString(row chunk.Row) (string, bool, error) if data == nil || data.User == nil { return "", true, errors.Errorf("Missing session variable when eval builtin") } - return data.User.AuthIdentityString(), false, nil + return data.User.String(), false, nil } type currentRoleFunctionClass struct { @@ -278,8 +278,7 @@ func (b *builtinUserSig) evalString(row chunk.Row) (string, bool, error) { 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.LoginString(), false, nil } type connectionIDFunctionClass struct { @@ -747,7 +746,7 @@ func (b *builtinTiDBDecodeKeySig) Clone() builtinFunc { return newSig } -// evalInt evals a builtinTiDBIsDDLOwnerSig. +// evalInt evals a builtinTiDBDecodeKeySig. func (b *builtinTiDBDecodeKeySig) evalString(row chunk.Row) (string, bool, error) { s, isNull, err := b.args[0].EvalString(b.ctx, row) if isNull || err != nil { diff --git a/expression/builtin_info_test.go b/expression/builtin_info_test.go index 90ee0a269270d..c6b730882c2e9 100644 --- a/expression/builtin_info_test.go +++ b/expression/builtin_info_test.go @@ -16,98 +16,99 @@ package expression import ( "math" + "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/auth" "github.com/pingcap/tidb/parser/charset" "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/testkit/trequire" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/printer" - "github.com/pingcap/tidb/util/testutil" + "github.com/stretchr/testify/require" ) -func (s *testEvaluatorSuite) TestDatabase(c *C) { +func TestDatabase(t *testing.T) { fc := funcs[ast.Database] ctx := mock.NewContext() f, err := fc.getFunction(ctx, nil) - c.Assert(err, IsNil) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + require.Equal(t, types.KindNull, d.Kind()) ctx.GetSessionVars().CurrentDB = "test" d, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d.GetString(), Equals, "test") - c.Assert(f.Clone().PbCode(), Equals, f.PbCode()) + require.NoError(t, err) + require.Equal(t, "test", d.GetString()) + require.Equal(t, f.PbCode(), f.Clone().PbCode()) // Test case for schema(). fc = funcs[ast.Schema] - c.Assert(fc, NotNil) + require.NotNil(t, fc) f, err = fc.getFunction(ctx, nil) - c.Assert(err, IsNil) + require.NoError(t, err) d, err = evalBuiltinFunc(f, chunk.MutRowFromDatums(types.MakeDatums()).ToRow()) - c.Assert(err, IsNil) - c.Assert(d.GetString(), Equals, "test") - c.Assert(f.Clone().PbCode(), Equals, f.PbCode()) + require.NoError(t, err) + require.Equal(t, "test", d.GetString()) + require.Equal(t, f.PbCode(), f.Clone().PbCode()) } -func (s *testEvaluatorSuite) TestFoundRows(c *C) { +func TestFoundRows(t *testing.T) { ctx := mock.NewContext() sessionVars := ctx.GetSessionVars() sessionVars.LastFoundRows = 2 fc := funcs[ast.FoundRows] f, err := fc.getFunction(ctx, nil) - c.Assert(err, IsNil) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d.GetUint64(), Equals, uint64(2)) + require.NoError(t, err) + require.Equal(t, uint64(2), d.GetUint64()) } -func (s *testEvaluatorSuite) TestUser(c *C) { +func TestUser(t *testing.T) { ctx := mock.NewContext() sessionVars := ctx.GetSessionVars() sessionVars.User = &auth.UserIdentity{Username: "root", Hostname: "localhost"} fc := funcs[ast.User] f, err := fc.getFunction(ctx, nil) - c.Assert(err, IsNil) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d.GetString(), Equals, "root@localhost") - c.Assert(f.Clone().PbCode(), Equals, f.PbCode()) + require.NoError(t, err) + require.Equal(t, "root@localhost", d.GetString()) + require.Equal(t, f.PbCode(), f.Clone().PbCode()) } -func (s *testEvaluatorSuite) TestCurrentUser(c *C) { +func TestCurrentUser(t *testing.T) { ctx := mock.NewContext() sessionVars := ctx.GetSessionVars() sessionVars.User = &auth.UserIdentity{Username: "root", Hostname: "localhost", AuthUsername: "root", AuthHostname: "localhost"} fc := funcs[ast.CurrentUser] f, err := fc.getFunction(ctx, nil) - c.Assert(err, IsNil) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d.GetString(), Equals, "root@localhost") - c.Assert(f.Clone().PbCode(), Equals, f.PbCode()) + require.NoError(t, err) + require.Equal(t, "root@localhost", d.GetString()) + require.Equal(t, f.PbCode(), f.Clone().PbCode()) } -func (s *testEvaluatorSuite) TestCurrentRole(c *C) { +func TestCurrentRole(t *testing.T) { ctx := mock.NewContext() fc := funcs[ast.CurrentRole] f, err := fc.getFunction(ctx, nil) - c.Assert(err, IsNil) + require.NoError(t, err) // empty roles var d types.Datum d, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d.GetString(), Equals, "NONE") - c.Assert(f.Clone().PbCode(), Equals, f.PbCode()) + require.NoError(t, err) + require.Equal(t, "NONE", d.GetString()) + require.Equal(t, f.PbCode(), f.Clone().PbCode()) // add roles sessionVars := ctx.GetSessionVars() @@ -116,36 +117,38 @@ func (s *testEvaluatorSuite) TestCurrentRole(c *C) { sessionVars.ActiveRoles = append(sessionVars.ActiveRoles, &auth.RoleIdentity{Username: "r_2", Hostname: "localhost"}) d, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d.GetString(), Equals, "`r_1`@`%`,`r_2`@`localhost`") - c.Assert(f.Clone().PbCode(), Equals, f.PbCode()) + require.NoError(t, err) + require.Equal(t, "`r_1`@`%`,`r_2`@`localhost`", d.GetString()) + require.Equal(t, f.PbCode(), f.Clone().PbCode()) } -func (s *testEvaluatorSuite) TestConnectionID(c *C) { +func TestConnectionID(t *testing.T) { ctx := mock.NewContext() sessionVars := ctx.GetSessionVars() sessionVars.ConnectionID = uint64(1) fc := funcs[ast.ConnectionID] f, err := fc.getFunction(ctx, nil) - c.Assert(err, IsNil) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d.GetUint64(), Equals, uint64(1)) - c.Assert(f.Clone().PbCode(), Equals, f.PbCode()) + require.NoError(t, err) + require.Equal(t, uint64(1), d.GetUint64()) + require.Equal(t, f.PbCode(), f.Clone().PbCode()) } -func (s *testEvaluatorSuite) TestVersion(c *C) { +func TestVersion(t *testing.T) { + ctx := createContext(t) fc := funcs[ast.Version] - f, err := fc.getFunction(s.ctx, nil) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, nil) + require.NoError(t, err) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.GetString(), Equals, mysql.ServerVersion) - c.Assert(f.Clone().PbCode(), Equals, f.PbCode()) + require.NoError(t, err) + require.Equal(t, mysql.ServerVersion, v.GetString()) + require.Equal(t, f.PbCode(), f.Clone().PbCode()) } -func (s *testEvaluatorSuite) TestBenchMark(c *C) { +func TestBenchMark(t *testing.T) { + ctx := createContext(t) cases := []struct { LoopCount int Expression interface{} @@ -164,77 +167,83 @@ func (s *testEvaluatorSuite) TestBenchMark(c *C) { {3, json.CreateBinary("[1]"), 0, false}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.Benchmark, s.primitiveValsToConstants([]interface{}{ - t.LoopCount, - t.Expression, + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.Benchmark, primitiveValsToConstants(ctx, []interface{}{ + c.LoopCount, + c.Expression, })...) - c.Assert(err, IsNil) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - c.Assert(err, IsNil) - if t.IsNil { - c.Assert(d.IsNull(), IsTrue) + require.NoError(t, err) + if c.IsNil { + require.True(t, d.IsNull()) } else { - c.Assert(d.GetInt64(), Equals, t.Expected) + require.Equal(t, c.Expected, d.GetInt64()) } // test clone b1 := f.Clone().(*ScalarFunction).Function.(*builtinBenchmarkSig) - c.Assert(b1.constLoopCount, Equals, int64(t.LoopCount)) + require.Equal(t, int64(c.LoopCount), b1.constLoopCount) } } -func (s *testEvaluatorSuite) TestCharset(c *C) { +func TestCharset(t *testing.T) { + ctx := createContext(t) fc := funcs[ast.Charset] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(nil))) - c.Assert(f, IsNil) - c.Assert(err, ErrorMatches, "*FUNCTION CHARSET does not exist") + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(nil))) + require.Nil(t, f) + require.Error(t, err) + require.Regexp(t, "FUNCTION CHARSET does not exist$", err.Error()) } -func (s *testEvaluatorSuite) TestCoercibility(c *C) { +func TestCoercibility(t *testing.T) { + ctx := createContext(t) fc := funcs[ast.Coercibility] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(nil))) - c.Assert(f, NotNil) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(nil))) + require.NotNil(t, f) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestCollation(c *C) { +func TestCollation(t *testing.T) { + ctx := createContext(t) fc := funcs[ast.Collation] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(nil))) - c.Assert(f, NotNil) - c.Assert(err, IsNil) - c.Assert(f.getRetTp().Flen, Equals, 64) + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(nil))) + require.NotNil(t, f) + require.NoError(t, err) + require.Equal(t, 64, f.getRetTp().Flen) } -func (s *testEvaluatorSuite) TestRowCount(c *C) { +func TestRowCount(t *testing.T) { ctx := mock.NewContext() sessionVars := ctx.GetSessionVars() sessionVars.StmtCtx.PrevAffectedRows = 10 f, err := funcs[ast.RowCount].getFunction(ctx, nil) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + require.NoError(t, err) + require.NotNil(t, f) sig, ok := f.(*builtinRowCountSig) - c.Assert(ok, IsTrue) - c.Assert(sig, NotNil) + require.True(t, ok) + require.NotNil(t, sig) intResult, isNull, err := sig.evalInt(chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(isNull, IsFalse) - c.Assert(intResult, Equals, int64(10)) - c.Assert(f.Clone().PbCode(), Equals, f.PbCode()) + require.NoError(t, err) + require.False(t, isNull) + require.Equal(t, int64(10), intResult) + require.Equal(t, f.PbCode(), f.Clone().PbCode()) } // TestTiDBVersion for tidb_server(). -func (s *testEvaluatorSuite) TestTiDBVersion(c *C) { - f, err := newFunctionForTest(s.ctx, ast.TiDBVersion, s.primitiveValsToConstants([]interface{}{})...) - c.Assert(err, IsNil) +func TestTiDBVersion(t *testing.T) { + ctx := createContext(t) + f, err := newFunctionForTest(ctx, ast.TiDBVersion, primitiveValsToConstants(ctx, []interface{}{})...) + require.NoError(t, err) v, err := f.Eval(chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.GetString(), Equals, printer.GetTiDBInfo()) + require.NoError(t, err) + require.Equal(t, printer.GetTiDBInfo(), v.GetString()) } -func (s *testEvaluatorSuite) TestLastInsertID(c *C) { +func TestLastInsertID(t *testing.T) { + ctx := createContext(t) maxUint64 := uint64(math.MaxUint64) cases := []struct { insertID uint64 @@ -251,45 +260,46 @@ func (s *testEvaluatorSuite) TestLastInsertID(c *C) { {math.MaxUint64, nil, math.MaxUint64, false, false}, } - for _, t := range cases { + for _, c := range cases { var ( f Expression err error ) - if t.insertID > 0 { - s.ctx.GetSessionVars().StmtCtx.PrevLastInsertID = t.insertID + if c.insertID > 0 { + ctx.GetSessionVars().StmtCtx.PrevLastInsertID = c.insertID } - if t.args != nil { - f, err = newFunctionForTest(s.ctx, ast.LastInsertId, s.primitiveValsToConstants([]interface{}{t.args})...) + if c.args != nil { + f, err = newFunctionForTest(ctx, ast.LastInsertId, primitiveValsToConstants(ctx, []interface{}{c.args})...) } else { - f, err = newFunctionForTest(s.ctx, ast.LastInsertId) + f, err = newFunctionForTest(ctx, ast.LastInsertId) } tp := f.GetType() - c.Assert(err, IsNil) - c.Assert(tp.Tp, Equals, mysql.TypeLonglong) - c.Assert(tp.Charset, Equals, charset.CharsetBin) - c.Assert(tp.Collate, Equals, charset.CollationBin) - c.Assert(tp.Flag&mysql.BinaryFlag, Equals, mysql.BinaryFlag) - c.Assert(tp.Flen, Equals, mysql.MaxIntWidth) + require.NoError(t, err) + require.Equal(t, mysql.TypeLonglong, tp.Tp) + require.Equal(t, charset.CharsetBin, tp.Charset) + require.Equal(t, charset.CollationBin, tp.Collate) + require.Equal(t, mysql.BinaryFlag, tp.Flag&mysql.BinaryFlag) + require.Equal(t, mysql.MaxIntWidth, tp.Flen) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetUint64(), Equals, t.expected) + require.Equal(t, c.expected, d.GetUint64()) } } } - _, err := funcs[ast.LastInsertId].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.LastInsertId].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestFormatBytes(c *C) { +func TestFormatBytes(t *testing.T) { + ctx := createContext(t) tbl := []struct { Arg interface{} Ret interface{} @@ -307,17 +317,18 @@ func (s *testEvaluatorSuite) TestFormatBytes(c *C) { } Dtbl := tblToDtbl(tbl) - for _, t := range Dtbl { + for _, tt := range Dtbl { fc := funcs[ast.FormatBytes] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(t["Arg"])) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(tt["Arg"])) + require.NoError(t, err) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["Ret"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, tt["Ret"][0], v) } } -func (s *testEvaluatorSuite) TestFormatNanoTime(c *C) { +func TestFormatNanoTime(t *testing.T) { + ctx := createContext(t) tbl := []struct { Arg interface{} Ret interface{} @@ -335,12 +346,12 @@ func (s *testEvaluatorSuite) TestFormatNanoTime(c *C) { } Dtbl := tblToDtbl(tbl) - for _, t := range Dtbl { + for _, tt := range Dtbl { fc := funcs[ast.FormatNanoTime] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(t["Arg"])) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(tt["Arg"])) + require.NoError(t, err) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["Ret"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, tt["Ret"][0], v) } } diff --git a/expression/builtin_info_vec.go b/expression/builtin_info_vec.go index 20c6af4de9e4b..c4343f669e60b 100644 --- a/expression/builtin_info_vec.go +++ b/expression/builtin_info_vec.go @@ -114,7 +114,7 @@ func (b *builtinCurrentUserSig) vecEvalString(input *chunk.Chunk, result *chunk. return errors.Errorf("Missing session variable when eval builtin") } for i := 0; i < n; i++ { - result.AppendString(data.User.AuthIdentityString()) + result.AppendString(data.User.String()) } return nil } @@ -168,7 +168,7 @@ func (b *builtinUserSig) vecEvalString(input *chunk.Chunk, result *chunk.Column) result.ReserveString(n) for i := 0; i < n; i++ { - result.AppendString(data.User.String()) + result.AppendString(data.User.LoginString()) } return nil } diff --git a/expression/builtin_info_vec_test.go b/expression/builtin_info_vec_test.go index 99bcff6d86c38..d4671b6a4a69d 100644 --- a/expression/builtin_info_vec_test.go +++ b/expression/builtin_info_vec_test.go @@ -19,7 +19,6 @@ import ( "math/rand" "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/mysql" @@ -110,8 +109,8 @@ var vecBuiltinInfoCases = map[string][]vecExprBenchCase{ }, } -func (s *testEvaluatorSuite) TestVectorizedBuiltinInfoFunc(c *C) { - testVectorizedBuiltinFunc(c, vecBuiltinInfoCases) +func TestVectorizedBuiltinInfoFunc(t *testing.T) { + testVectorizedBuiltinFunc(t, vecBuiltinInfoCases) } func BenchmarkVectorizedBuiltinInfoFunc(b *testing.B) { diff --git a/expression/builtin_json_test.go b/expression/builtin_json_test.go index 331bd8d012a1c..add185d57cc9a 100644 --- a/expression/builtin_json_test.go +++ b/expression/builtin_json_test.go @@ -15,17 +15,21 @@ package expression import ( - . "github.com/pingcap/check" + "fmt" + "testing" + "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" + "github.com/pingcap/tidb/testkit/trequire" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" "github.com/pingcap/tidb/util/chunk" - "github.com/pingcap/tidb/util/testutil" + "github.com/stretchr/testify/require" ) -func (s *testEvaluatorSuite) TestJSONType(c *C) { +func TestJSONType(t *testing.T) { + ctx := createContext(t) fc := funcs[ast.JSONType] tbl := []struct { Input interface{} @@ -40,16 +44,17 @@ func (s *testEvaluatorSuite) TestJSONType(c *C) { {`{}`, `OBJECT`}, } dtbl := tblToDtbl(tbl) - for _, t := range dtbl { - f, err := fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + for _, tt := range dtbl { + f, err := fc.getFunction(ctx, datumsToConstants(tt["Input"])) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d, testutil.DatumEquals, t["Expected"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, tt["Expected"][0], d) } } -func (s *testEvaluatorSuite) TestJSONQuote(c *C) { +func TestJSONQuote(t *testing.T) { + ctx := createContext(t) fc := funcs[ast.JSONQuote] tbl := []struct { Input interface{} @@ -68,16 +73,17 @@ func (s *testEvaluatorSuite) TestJSONQuote(c *C) { {`1\u2232\u22322`, `"1\\u2232\\u22322"`}, } dtbl := tblToDtbl(tbl) - for _, t := range dtbl { - f, err := fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + for _, tt := range dtbl { + f, err := fc.getFunction(ctx, datumsToConstants(tt["Input"])) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d, testutil.DatumEquals, t["Expected"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, tt["Expected"][0], d) } } -func (s *testEvaluatorSuite) TestJSONUnquote(c *C) { +func TestJSONUnquote(t *testing.T) { + ctx := createContext(t) fc := funcs[ast.JSONUnquote] tbl := []struct { Input string @@ -100,22 +106,24 @@ func (s *testEvaluatorSuite) TestJSONUnquote(c *C) { {`""a""`, `""a""`, json.ErrInvalidJSONText.GenWithStackByArgs("The document root must not be followed by other values.")}, {`"""a"""`, `"""a"""`, json.ErrInvalidJSONText.GenWithStackByArgs("The document root must not be followed by other values.")}, } - for _, t := range tbl { + for _, tt := range tbl { var d types.Datum - d.SetString(t.Input, mysql.DefaultCollationName) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{d})) - c.Assert(err, IsNil) + d.SetString(tt.Input, mysql.DefaultCollationName) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{d})) + require.NoError(t, err) d, err = evalBuiltinFunc(f, chunk.Row{}) - if t.Error == nil { - c.Assert(d.GetString(), Equals, t.Result) - c.Assert(err, IsNil) + if tt.Error == nil { + require.Equal(t, tt.Result, d.GetString()) + require.NoError(t, err) } else { - c.Assert(err, ErrorMatches, ".*The document root must not be followed by other values.*") + require.Error(t, err) + require.Contains(t, err.Error(), "The document root must not be followed by other values") } } } -func (s *testEvaluatorSuite) TestJSONExtract(c *C) { +func TestJSONExtract(t *testing.T) { + ctx := createContext(t) fc := funcs[ast.JSONExtract] jstr := `{"a": [{"aa": [{"aaa": 1}]}], "aaa": 2}` tbl := []struct { @@ -127,32 +135,33 @@ func (s *testEvaluatorSuite) TestJSONExtract(c *C) { {[]interface{}{jstr, `$.a[0].aa[0].aaa`, `$.aaa`}, `[1, 2]`, true}, {[]interface{}{jstr, `$.a[0].aa[0].aaa`, `$InvalidPath`}, nil, false}, } - for _, t := range tbl { - args := types.MakeDatums(t.Input...) - f, err := fc.getFunction(s.ctx, s.datumsToConstants(args)) - c.Assert(err, IsNil) + for _, tt := range tbl { + args := types.MakeDatums(tt.Input...) + f, err := fc.getFunction(ctx, datumsToConstants(args)) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - if t.Success { - c.Assert(err, IsNil) - switch x := t.Expected.(type) { + if tt.Success { + require.NoError(t, err) + switch x := tt.Expected.(type) { case string: var j1 json.BinaryJSON j1, err = json.ParseBinaryFromString(x) - c.Assert(err, IsNil) + require.NoError(t, err) j2 := d.GetMysqlJSON() var cmp int cmp = json.CompareBinary(j1, j2) - c.Assert(err, IsNil) - c.Assert(cmp, Equals, 0) + require.NoError(t, err) + require.Equal(t, 0, cmp) } } else { - c.Assert(err, NotNil) + require.Error(t, err) } } } // TestJSONSetInsertReplace tests grammar of json_{set,insert,replace}. -func (s *testEvaluatorSuite) TestJSONSetInsertReplace(c *C) { +func TestJSONSetInsertReplace(t *testing.T) { + ctx := createContext(t) tbl := []struct { fc functionClass Input []interface{} @@ -172,32 +181,33 @@ func (s *testEvaluatorSuite) TestJSONSetInsertReplace(c *C) { var err error var f builtinFunc var d types.Datum - for _, t := range tbl { - args := types.MakeDatums(t.Input...) - f, err = t.fc.getFunction(s.ctx, s.datumsToConstants(args)) - if t.BuildSuccess { - c.Assert(err, IsNil) + for _, tt := range tbl { + args := types.MakeDatums(tt.Input...) + f, err = tt.fc.getFunction(ctx, datumsToConstants(args)) + if tt.BuildSuccess { + require.NoError(t, err) d, err = evalBuiltinFunc(f, chunk.Row{}) - if t.Success { - c.Assert(err, IsNil) - switch x := t.Expected.(type) { + if tt.Success { + require.NoError(t, err) + switch x := tt.Expected.(type) { case string: var j1 json.BinaryJSON j1, err = json.ParseBinaryFromString(x) - c.Assert(err, IsNil) + require.NoError(t, err) j2 := d.GetMysqlJSON() var cmp int cmp = json.CompareBinary(j1, j2) - c.Assert(cmp, Equals, 0) + require.Equal(t, 0, cmp) } continue } } - c.Assert(err, NotNil) + require.Error(t, err) } } -func (s *testEvaluatorSuite) TestJSONMerge(c *C) { +func TestJSONMerge(t *testing.T) { + ctx := createContext(t) fc := funcs[ast.JSONMerge] tbl := []struct { Input []interface{} @@ -207,27 +217,28 @@ func (s *testEvaluatorSuite) TestJSONMerge(c *C) { {[]interface{}{`{}`, `[]`}, `[{}]`}, {[]interface{}{`{}`, `[]`, `3`, `"4"`}, `[{}, 3, "4"]`}, } - for _, t := range tbl { - args := types.MakeDatums(t.Input...) - f, err := fc.getFunction(s.ctx, s.datumsToConstants(args)) - c.Assert(err, IsNil) + for _, tt := range tbl { + args := types.MakeDatums(tt.Input...) + f, err := fc.getFunction(ctx, datumsToConstants(args)) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) - switch x := t.Expected.(type) { + switch x := tt.Expected.(type) { case string: j1, err := json.ParseBinaryFromString(x) - c.Assert(err, IsNil) + require.NoError(t, err) j2 := d.GetMysqlJSON() cmp := json.CompareBinary(j1, j2) - c.Assert(cmp, Equals, 0, Commentf("got %v expect %v", j1.String(), j2.String())) + require.Zerof(t, cmp, "got %v expect %v", j1.String(), j2.String()) case nil: - c.Assert(d.IsNull(), IsTrue) + require.True(t, d.IsNull()) } } } -func (s *testEvaluatorSuite) TestJSONMergePreserve(c *C) { +func TestJSONMergePreserve(t *testing.T) { + ctx := createContext(t) fc := funcs[ast.JSONMergePreserve] tbl := []struct { Input []interface{} @@ -237,27 +248,28 @@ func (s *testEvaluatorSuite) TestJSONMergePreserve(c *C) { {[]interface{}{`{}`, `[]`}, `[{}]`}, {[]interface{}{`{}`, `[]`, `3`, `"4"`}, `[{}, 3, "4"]`}, } - for _, t := range tbl { - args := types.MakeDatums(t.Input...) - f, err := fc.getFunction(s.ctx, s.datumsToConstants(args)) - c.Assert(err, IsNil) + for _, tt := range tbl { + args := types.MakeDatums(tt.Input...) + f, err := fc.getFunction(ctx, datumsToConstants(args)) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) - switch x := t.Expected.(type) { + switch x := tt.Expected.(type) { case string: j1, err := json.ParseBinaryFromString(x) - c.Assert(err, IsNil) + require.NoError(t, err) j2 := d.GetMysqlJSON() cmp := json.CompareBinary(j1, j2) - c.Assert(cmp, Equals, 0, Commentf("got %v expect %v", j1.String(), j2.String())) + require.Zerof(t, cmp, "got %v expect %v", j1.String(), j2.String()) case nil: - c.Assert(d.IsNull(), IsTrue) + require.True(t, d.IsNull()) } } } -func (s *testEvaluatorSuite) TestJSONArray(c *C) { +func TestJSONArray(t *testing.T) { + ctx := createContext(t) fc := funcs[ast.JSONArray] tbl := []struct { Input []interface{} @@ -266,22 +278,23 @@ func (s *testEvaluatorSuite) TestJSONArray(c *C) { {[]interface{}{1}, `[1]`}, {[]interface{}{nil, "a", 3, `{"a": "b"}`}, `[null, "a", 3, "{\"a\": \"b\"}"]`}, } - for _, t := range tbl { - args := types.MakeDatums(t.Input...) - f, err := fc.getFunction(s.ctx, s.datumsToConstants(args)) - c.Assert(err, IsNil) + for _, tt := range tbl { + args := types.MakeDatums(tt.Input...) + f, err := fc.getFunction(ctx, datumsToConstants(args)) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) - j1, err := json.ParseBinaryFromString(t.Expected) - c.Assert(err, IsNil) + j1, err := json.ParseBinaryFromString(tt.Expected) + require.NoError(t, err) j2 := d.GetMysqlJSON() cmp := json.CompareBinary(j1, j2) - c.Assert(cmp, Equals, 0) + require.Equal(t, 0, cmp) } } -func (s *testEvaluatorSuite) TestJSONObject(c *C) { +func TestJSONObject(t *testing.T) { + ctx := createContext(t) fc := funcs[ast.JSONObject] tbl := []struct { Input []interface{} @@ -299,32 +312,33 @@ func (s *testEvaluatorSuite) TestJSONObject(c *C) { var err error var f builtinFunc var d types.Datum - for _, t := range tbl { - args := types.MakeDatums(t.Input...) - f, err = fc.getFunction(s.ctx, s.datumsToConstants(args)) - if t.BuildSuccess { - c.Assert(err, IsNil) + for _, tt := range tbl { + args := types.MakeDatums(tt.Input...) + f, err = fc.getFunction(ctx, datumsToConstants(args)) + if tt.BuildSuccess { + require.NoError(t, err) d, err = evalBuiltinFunc(f, chunk.Row{}) - if t.Success { - c.Assert(err, IsNil) - switch x := t.Expected.(type) { + if tt.Success { + require.NoError(t, err) + switch x := tt.Expected.(type) { case string: var j1 json.BinaryJSON j1, err = json.ParseBinaryFromString(x) - c.Assert(err, IsNil) + require.NoError(t, err) j2 := d.GetMysqlJSON() var cmp int cmp = json.CompareBinary(j1, j2) - c.Assert(cmp, Equals, 0) + require.Equal(t, 0, cmp) } continue } } - c.Assert(err, NotNil) + require.Error(t, err) } } -func (s *testEvaluatorSuite) TestJSONRemove(c *C) { +func TestJSONRemove(t *testing.T) { + ctx := createContext(t) fc := funcs[ast.JSONRemove] tbl := []struct { Input []interface{} @@ -349,31 +363,32 @@ func (s *testEvaluatorSuite) TestJSONRemove(c *C) { {[]interface{}{`{"a": [1, 2, {"aa": "xx"}]}`, "$.b"}, `{"a": [1, 2, {"aa": "xx"}]}`, true}, {[]interface{}{`{"a": [1, 2, {"aa": "xx"}]}`, "$.a[3]", "$.b"}, `{"a": [1, 2, {"aa": "xx"}]}`, true}, } - for _, t := range tbl { - args := types.MakeDatums(t.Input...) - f, err := fc.getFunction(s.ctx, s.datumsToConstants(args)) - c.Assert(err, IsNil) + for _, tt := range tbl { + args := types.MakeDatums(tt.Input...) + f, err := fc.getFunction(ctx, datumsToConstants(args)) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - if t.Success { - c.Assert(err, IsNil) - switch x := t.Expected.(type) { + if tt.Success { + require.NoError(t, err) + switch x := tt.Expected.(type) { case string: var j1 json.BinaryJSON j1, err = json.ParseBinaryFromString(x) - c.Assert(err, IsNil) + require.NoError(t, err) j2 := d.GetMysqlJSON() var cmp int cmp = json.CompareBinary(j1, j2) - c.Assert(cmp, Equals, 0, Commentf("got %v expect %v", j2.Value, j1.Value)) + require.Zerof(t, cmp, "got %v expect %v", j2.Value, j1.Value) } } else { - c.Assert(err, NotNil) + require.Error(t, err) } } } -func (s *testEvaluatorSuite) TestJSONContains(c *C) { +func TestJSONContains(t *testing.T) { + ctx := createContext(t) fc := funcs[ast.JSONContains] tbl := []struct { input []interface{} @@ -420,20 +435,20 @@ func (s *testEvaluatorSuite) TestJSONContains(c *C) { {[]interface{}{`[1,2,[1,3]]`, `a:1`}, 1, json.ErrInvalidJSONText}, {[]interface{}{`a:1`, `1`}, 1, json.ErrInvalidJSONText}, } - for _, t := range tbl { - args := types.MakeDatums(t.input...) - f, err := fc.getFunction(s.ctx, s.datumsToConstants(args)) - c.Assert(err, IsNil) + for _, tt := range tbl { + args := types.MakeDatums(tt.input...) + f, err := fc.getFunction(ctx, datumsToConstants(args)) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - if t.err == nil { - c.Assert(err, IsNil) - if t.expected == nil { - c.Assert(d.IsNull(), IsTrue) + if tt.err == nil { + require.NoError(t, err) + if tt.expected == nil { + require.True(t, d.IsNull()) } else { - c.Assert(d.GetInt64(), Equals, int64(t.expected.(int))) + require.Equal(t, int64(tt.expected.(int)), d.GetInt64()) } } else { - c.Assert(t.err.(*terror.Error).Equal(err), IsTrue) + require.True(t, tt.err.(*terror.Error).Equal(err)) } } // For issue 9957: test 'argument 1 and 2 as valid json object' @@ -447,12 +462,13 @@ func (s *testEvaluatorSuite) TestJSONContains(c *C) { {"", 0.05}, } for _, cs := range cases { - _, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(cs.arg1, cs.arg2))) - c.Assert(json.ErrInvalidJSONData.Equal(err), IsTrue) + _, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(cs.arg1, cs.arg2))) + require.True(t, json.ErrInvalidJSONData.Equal(err)) } } -func (s *testEvaluatorSuite) TestJSONContainsPath(c *C) { +func TestJSONContainsPath(t *testing.T) { + ctx := createContext(t) fc := funcs[ast.JSONContainsPath] jsonString := `{"a": 1, "b": 2, "c": {"d": 4}}` invalidJSON := `{"a": 1` @@ -492,25 +508,26 @@ func (s *testEvaluatorSuite) TestJSONContainsPath(c *C) { {[]interface{}{jsonString, "aLl", "$.a", "$.e"}, 0, true}, {[]interface{}{jsonString, "test", "$.a"}, nil, false}, } - for _, t := range tbl { - args := types.MakeDatums(t.input...) - f, err := fc.getFunction(s.ctx, s.datumsToConstants(args)) - c.Assert(err, IsNil) + for _, tt := range tbl { + args := types.MakeDatums(tt.input...) + f, err := fc.getFunction(ctx, datumsToConstants(args)) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - if t.success { - c.Assert(err, IsNil) - if t.expected == nil { - c.Assert(d.IsNull(), IsTrue) + if tt.success { + require.NoError(t, err) + if tt.expected == nil { + require.True(t, d.IsNull()) } else { - c.Assert(d.GetInt64(), Equals, int64(t.expected.(int))) + require.Equal(t, int64(tt.expected.(int)), d.GetInt64()) } } else { - c.Assert(err, NotNil) + require.Error(t, err) } } } -func (s *testEvaluatorSuite) TestJSONLength(c *C) { +func TestJSONLength(t *testing.T) { + ctx := createContext(t) fc := funcs[ast.JSONLength] tbl := []struct { input []interface{} @@ -562,26 +579,27 @@ func (s *testEvaluatorSuite) TestJSONLength(c *C) { {[]interface{}{`{"a": [1, 2, {"aa": "xx"}]}`, "$.a[3]"}, nil, true}, {[]interface{}{`{"a": [1, 2, {"aa": "xx"}]}`, "$.a[2].b"}, nil, true}, } - for _, t := range tbl { - args := types.MakeDatums(t.input...) - f, err := fc.getFunction(s.ctx, s.datumsToConstants(args)) - c.Assert(err, IsNil) + for _, tt := range tbl { + args := types.MakeDatums(tt.input...) + f, err := fc.getFunction(ctx, datumsToConstants(args)) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - if t.success { - c.Assert(err, IsNil) + if tt.success { + require.NoError(t, err) - if t.expected == nil { - c.Assert(d.IsNull(), IsTrue) + if tt.expected == nil { + require.True(t, d.IsNull()) } else { - c.Assert(d.GetInt64(), Equals, int64(t.expected.(int))) + require.Equal(t, int64(tt.expected.(int)), d.GetInt64()) } } else { - c.Assert(err, NotNil) + require.Error(t, err) } } } -func (s *testEvaluatorSuite) TestJSONKeys(c *C) { +func TestJSONKeys(t *testing.T) { + ctx := createContext(t) fc := funcs[ast.JSONKeys] tbl := []struct { input []interface{} @@ -626,32 +644,33 @@ func (s *testEvaluatorSuite) TestJSONKeys(c *C) { {[]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) + for _, tt := range tbl { + args := types.MakeDatums(tt.input...) + f, err := fc.getFunction(ctx, datumsToConstants(args)) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - if t.success { - c.Assert(err, IsNil) - switch x := t.expected.(type) { + if tt.success { + require.NoError(t, err) + switch x := tt.expected.(type) { case string: var j1 json.BinaryJSON j1, err = json.ParseBinaryFromString(x) - c.Assert(err, IsNil) + require.NoError(t, err) j2 := d.GetMysqlJSON() var cmp int cmp = json.CompareBinary(j1, j2) - c.Assert(cmp, Equals, 0) + require.Equal(t, 0, cmp) case nil: - c.Assert(d.IsNull(), IsTrue) + require.True(t, d.IsNull()) } } else { - c.Assert(err, NotNil) + require.Error(t, err) } } } -func (s *testEvaluatorSuite) TestJSONDepth(c *C) { +func TestJSONDepth(t *testing.T) { + ctx := createContext(t) fc := funcs[ast.JSONDepth] tbl := []struct { input []interface{} @@ -690,28 +709,29 @@ func (s *testEvaluatorSuite) TestJSONDepth(c *C) { // Tests non-json {[]interface{}{`a`}, nil, false}, } - for _, t := range tbl { - args := types.MakeDatums(t.input...) - f, err := fc.getFunction(s.ctx, s.datumsToConstants(args)) - c.Assert(err, IsNil) + for _, tt := range tbl { + args := types.MakeDatums(tt.input...) + f, err := fc.getFunction(ctx, datumsToConstants(args)) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - if t.success { - c.Assert(err, IsNil) + if tt.success { + require.NoError(t, err) - if t.expected == nil { - c.Assert(d.IsNull(), IsTrue) + if tt.expected == nil { + require.True(t, d.IsNull()) } else { - c.Assert(d.GetInt64(), Equals, int64(t.expected.(int))) + require.Equal(t, int64(tt.expected.(int)), d.GetInt64()) } } else { - c.Assert(err, NotNil) + require.Error(t, err) } } } -func (s *testEvaluatorSuite) TestJSONArrayAppend(c *C) { +func TestJSONArrayAppend(t *testing.T) { + ctx := createContext(t) sampleJSON, err := json.ParseBinaryFromString(`{"b": 2}`) - c.Assert(err, IsNil) + require.NoError(t, err) fc := funcs[ast.JSONArrayAppend] tbl := []struct { input []interface{} @@ -752,42 +772,43 @@ func (s *testEvaluatorSuite) TestJSONArrayAppend(c *C) { {[]interface{}{`[1,2,3, {"a":[4,5,6]}]`, `$`, 7, `$[3].b`, 8}, `[1, 2, 3, {"a": [4, 5, 6]}, 7]`, nil}, } - for i, t := range tbl { - args := types.MakeDatums(t.input...) - s.ctx.GetSessionVars().StmtCtx.SetWarnings(nil) - f, err := fc.getFunction(s.ctx, s.datumsToConstants(args)) - // No error should return in getFunction if t.err is nil. + for i, tt := range tbl { + args := types.MakeDatums(tt.input...) + ctx.GetSessionVars().StmtCtx.SetWarnings(nil) + f, err := fc.getFunction(ctx, datumsToConstants(args)) + // No error should return in getFunction if tt.err is nil. if err != nil { - c.Assert(t.err, NotNil) - c.Assert(t.err.Equal(err), Equals, true) + require.Error(t, tt.err) + require.True(t, tt.err.Equal(err)) continue } - c.Assert(f, NotNil) + require.NotNil(t, f) d, err := evalBuiltinFunc(f, chunk.Row{}) - comment := Commentf("case:%v \n input:%v \n output: %s \n expected: %v \n warnings: %v \n expected error %v", i, t.input, d.GetMysqlJSON(), t.expected, s.ctx.GetSessionVars().StmtCtx.GetWarnings(), t.err) + comment := fmt.Sprintf("case:%v \n input:%v \n output: %s \n expected: %v \n warnings: %v \n expected error %v", i, tt.input, d.GetMysqlJSON(), tt.expected, ctx.GetSessionVars().StmtCtx.GetWarnings(), tt.err) - if t.err != nil { - c.Assert(t.err.Equal(err), Equals, true, comment) + if tt.err != nil { + require.True(t, tt.err.Equal(err), comment) continue } - c.Assert(err, IsNil, comment) - c.Assert(int(s.ctx.GetSessionVars().StmtCtx.WarningCount()), Equals, 0, comment) + require.NoError(t, err, comment) + require.Equal(t, 0, int(ctx.GetSessionVars().StmtCtx.WarningCount()), comment) - if t.expected == nil { - c.Assert(d.IsNull(), IsTrue, comment) + if tt.expected == nil { + require.True(t, d.IsNull(), comment) continue } - j1, err := json.ParseBinaryFromString(t.expected.(string)) + j1, err := json.ParseBinaryFromString(tt.expected.(string)) - c.Assert(err, IsNil, comment) - c.Assert(json.CompareBinary(j1, d.GetMysqlJSON()), Equals, 0, comment) + require.NoError(t, err, comment) + require.Equal(t, 0, json.CompareBinary(j1, d.GetMysqlJSON()), comment) } } -func (s *testEvaluatorSuite) TestJSONSearch(c *C) { +func TestJSONSearch(t *testing.T) { + ctx := createContext(t) fc := funcs[ast.JSONSearch] jsonString := `["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}]` jsonString2 := `["abc", [{"k": "10"}, "def"], {"x":"ab%d"}, {"y":"abcd"}]` @@ -837,31 +858,32 @@ func (s *testEvaluatorSuite) TestJSONSearch(c *C) { {[]interface{}{jsonString, `all`, `abc`, nil, `$xx`}, nil, false}, // wrong path {[]interface{}{jsonString, nil, `abc`}, nil, true}, } - for _, t := range tbl { - args := types.MakeDatums(t.input...) - f, err := fc.getFunction(s.ctx, s.datumsToConstants(args)) - c.Assert(err, IsNil) + for _, tt := range tbl { + args := types.MakeDatums(tt.input...) + f, err := fc.getFunction(ctx, datumsToConstants(args)) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - if t.success { - c.Assert(err, IsNil) - switch x := t.expected.(type) { + if tt.success { + require.NoError(t, err) + switch x := tt.expected.(type) { case string: var j1, j2 json.BinaryJSON j1, err = json.ParseBinaryFromString(x) - c.Assert(err, IsNil) + require.NoError(t, err) j2 = d.GetMysqlJSON() cmp := json.CompareBinary(j1, j2) - c.Assert(cmp, Equals, 0) + require.Equal(t, 0, cmp) case nil: - c.Assert(d.IsNull(), IsTrue) + require.True(t, d.IsNull()) } } else { - c.Assert(err, NotNil) + require.Error(t, err) } } } -func (s *testEvaluatorSuite) TestJSONArrayInsert(c *C) { +func TestJSONArrayInsert(t *testing.T) { + ctx := createContext(t) fc := funcs[ast.JSONArrayInsert] tbl := []struct { input []interface{} @@ -901,39 +923,40 @@ func (s *testEvaluatorSuite) TestJSONArrayInsert(c *C) { // More test cases {[]interface{}{`["a", {"b": [1, 2]}, [3, 4]]`, `$[0]`, `x`, `$[0]`, `y`}, `["y", "x", "a", {"b": [1, 2]}, [3, 4]]`, true, nil}, } - for _, t := range tbl { - args := types.MakeDatums(t.input...) - f, err := fc.getFunction(s.ctx, s.datumsToConstants(args)) + for _, tt := range tbl { + args := types.MakeDatums(tt.input...) + f, err := fc.getFunction(ctx, datumsToConstants(args)) // Parameter count error if err != nil { - c.Assert(t.err, NotNil) - c.Assert(t.err.Equal(err), Equals, true) + require.Error(t, tt.err) + require.True(t, tt.err.Equal(err)) continue } d, err := evalBuiltinFunc(f, chunk.Row{}) - if t.success { - c.Assert(err, IsNil) - switch x := t.expected.(type) { + if tt.success { + require.NoError(t, err) + switch x := tt.expected.(type) { case string: var j1, j2 json.BinaryJSON j1, err = json.ParseBinaryFromString(x) - c.Assert(err, IsNil) + require.NoError(t, err) j2 = d.GetMysqlJSON() var cmp int cmp = json.CompareBinary(j1, j2) - c.Assert(cmp, Equals, 0) + require.Equal(t, 0, cmp) case nil: - c.Assert(d.IsNull(), IsTrue) + require.True(t, d.IsNull()) } } else { - c.Assert(t.err.Equal(err), Equals, true) + require.True(t, tt.err.Equal(err)) } } } -func (s *testEvaluatorSuite) TestJSONValid(c *C) { +func TestJSONValid(t *testing.T) { + ctx := createContext(t) fc := funcs[ast.JSONValid] tbl := []struct { Input interface{} @@ -954,16 +977,17 @@ func (s *testEvaluatorSuite) TestJSONValid(c *C) { {nil, nil}, } dtbl := tblToDtbl(tbl) - for _, t := range dtbl { - f, err := fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + for _, tt := range dtbl { + f, err := fc.getFunction(ctx, datumsToConstants(tt["Input"])) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d, testutil.DatumEquals, t["Expected"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, tt["Expected"][0], d) } } -func (s *testEvaluatorSuite) TestJSONStorageSize(c *C) { +func TestJSONStorageSize(t *testing.T) { + ctx := createContext(t) fc := funcs[ast.JSONStorageSize] tbl := []struct { input []interface{} @@ -986,26 +1010,27 @@ func (s *testEvaluatorSuite) TestJSONStorageSize(c *C) { {[]interface{}{`[{"a":1]`}, 0, false}, {[]interface{}{`[{a":1]`}, 0, false}, } - for _, t := range tbl { - args := types.MakeDatums(t.input...) - f, err := fc.getFunction(s.ctx, s.datumsToConstants(args)) - c.Assert(err, IsNil) + for _, tt := range tbl { + args := types.MakeDatums(tt.input...) + f, err := fc.getFunction(ctx, datumsToConstants(args)) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - if t.success { - c.Assert(err, IsNil) + if tt.success { + require.NoError(t, err) - if t.expected == nil { - c.Assert(d.IsNull(), IsTrue) + if tt.expected == nil { + require.True(t, d.IsNull()) } else { - c.Assert(d.GetInt64(), Equals, int64(t.expected.(int))) + require.Equal(t, int64(tt.expected.(int)), d.GetInt64()) } } else { - c.Assert(err, NotNil) + require.Error(t, err) } } } -func (s *testEvaluatorSuite) TestJSONPretty(c *C) { +func TestJSONPretty(t *testing.T) { + ctx := createContext(t) fc := funcs[ast.JSONPretty] tbl := []struct { input []interface{} @@ -1059,26 +1084,27 @@ func (s *testEvaluatorSuite) TestJSONPretty(c *C) { {[]interface{}{`{1}`}, nil, false}, {[]interface{}{`[1,3,4,5]]`}, nil, false}, } - for _, t := range tbl { - args := types.MakeDatums(t.input...) - f, err := fc.getFunction(s.ctx, s.datumsToConstants(args)) - c.Assert(err, IsNil) + for _, tt := range tbl { + args := types.MakeDatums(tt.input...) + f, err := fc.getFunction(ctx, datumsToConstants(args)) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - if t.success { - c.Assert(err, IsNil) + if tt.success { + require.NoError(t, err) - if t.expected == nil { - c.Assert(d.IsNull(), IsTrue) + if tt.expected == nil { + require.True(t, d.IsNull()) } else { - c.Assert(d.GetString(), Equals, t.expected.(string)) + require.Equal(t, tt.expected.(string), d.GetString()) } } else { - c.Assert(err, NotNil) + require.Error(t, err) } } } -func (s *testEvaluatorSuite) TestJSONMergePatch(c *C) { +func TestJSONMergePatch(t *testing.T) { + ctx := createContext(t) fc := funcs[ast.JSONMergePatch] tbl := []struct { input []interface{} @@ -1148,23 +1174,23 @@ func (s *testEvaluatorSuite) TestJSONMergePatch(c *C) { {[]interface{}{`{{"a":1}`, `[1]`, `null`}, nil, false}, {[]interface{}{`{"a":1}`, `jjj`, `null`}, nil, false}, } - for _, t := range tbl { - args := types.MakeDatums(t.input...) - f, err := fc.getFunction(s.ctx, s.datumsToConstants(args)) - c.Assert(err, IsNil) + for _, tt := range tbl { + args := types.MakeDatums(tt.input...) + f, err := fc.getFunction(ctx, datumsToConstants(args)) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - if t.success { - c.Assert(err, IsNil) + if tt.success { + require.NoError(t, err) - if t.expected == nil { - c.Assert(d.IsNull(), IsTrue) + if tt.expected == nil { + require.True(t, d.IsNull()) } else { - j, e := json.ParseBinaryFromString(t.expected.(string)) - c.Assert(e, IsNil) - c.Assert(d.GetMysqlJSON().String(), Equals, j.String()) + j, e := json.ParseBinaryFromString(tt.expected.(string)) + require.NoError(t, e) + require.Equal(t, j.String(), d.GetMysqlJSON().String()) } } else { - c.Assert(err, NotNil) + require.Error(t, err) } } } diff --git a/expression/builtin_json_vec_test.go b/expression/builtin_json_vec_test.go index 98f3b6bbe5b3c..be67199440f00 100644 --- a/expression/builtin_json_vec_test.go +++ b/expression/builtin_json_vec_test.go @@ -17,7 +17,6 @@ package expression import ( "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/types" ) @@ -141,8 +140,8 @@ var vecBuiltinJSONCases = map[string][]vecExprBenchCase{ }, } -func (s *testVectorizeSuite2) TestVectorizedBuiltinJSONFunc(c *C) { - testVectorizedBuiltinFunc(c, vecBuiltinJSONCases) +func TestVectorizedBuiltinJSONFunc(t *testing.T) { + testVectorizedBuiltinFunc(t, vecBuiltinJSONCases) } func BenchmarkVectorizedBuiltinJSONFunc(b *testing.B) { diff --git a/expression/builtin_like_serial_test.go b/expression/builtin_like_serial_test.go new file mode 100644 index 0000000000000..4c63c4ac04c48 --- /dev/null +++ b/expression/builtin_like_serial_test.go @@ -0,0 +1,89 @@ +// Copyright 2021 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, +// 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. + +package expression + +import ( + "fmt" + "testing" + + "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/testkit/trequire" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/collate" + "github.com/stretchr/testify/require" +) + +func TestCILike(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + ctx := createContext(t) + tests := []struct { + input string + pattern string + generalMatch int + unicodeMatch int + }{ + {"a", "", 0, 0}, + {"a", "a", 1, 1}, + {"a", "á", 1, 1}, + {"a", "b", 0, 0}, + {"aA", "Aa", 1, 1}, + {"áAb", `Aa%`, 1, 1}, + {"áAb", `%ab%`, 1, 1}, + {"áAb", `%ab`, 1, 1}, + {"ÀAb", "aA_", 1, 1}, + {"áééá", "a_%a", 1, 1}, + {"áééá", "a%_a", 1, 1}, + {"áéá", "a_%a", 1, 1}, + {"áéá", "a%_a", 1, 1}, + {"áá", "a_%a", 0, 0}, + {"áá", "a%_a", 0, 0}, + {"áééáííí", "a_%a%", 1, 1}, + + // performs matching on a per-character basis + // https://dev.mysql.com/doc/refman/5.7/en/string-comparison-functions.html#operator_like + {"ß", "s%", 1, 0}, + {"ß", "%s", 1, 0}, + {"ß", "ss", 0, 0}, + {"ß", "s", 1, 0}, + {"ss", "%ß%", 1, 0}, + {"ß", "_", 1, 1}, + {"ß", "__", 0, 0}, + } + for _, tt := range tests { + comment := fmt.Sprintf(`for input = "%s", pattern = "%s"`, tt.input, tt.pattern) + fc := funcs[ast.Like] + inputs := datumsToConstants(types.MakeDatums(tt.input, tt.pattern, 0)) + f, err := fc.getFunction(ctx, inputs) + require.NoError(t, err, comment) + f.setCollator(collate.GetCollator("utf8mb4_general_ci")) + r, err := evalBuiltinFunc(f, chunk.Row{}) + require.NoError(t, err, comment) + trequire.DatumEqual(t, types.NewDatum(tt.generalMatch), r, comment) + } + + for _, tt := range tests { + comment := fmt.Sprintf(`for input = "%s", pattern = "%s"`, tt.input, tt.pattern) + fc := funcs[ast.Like] + inputs := datumsToConstants(types.MakeDatums(tt.input, tt.pattern, 0)) + f, err := fc.getFunction(ctx, inputs) + require.NoError(t, err, comment) + f.setCollator(collate.GetCollator("utf8mb4_unicode_ci")) + r, err := evalBuiltinFunc(f, chunk.Row{}) + require.NoError(t, err, comment) + trequire.DatumEqual(t, types.NewDatum(tt.unicodeMatch), r, comment) + } +} diff --git a/expression/builtin_like_test.go b/expression/builtin_like_test.go index 1c9b98ade614c..853e099d1d343 100644 --- a/expression/builtin_like_test.go +++ b/expression/builtin_like_test.go @@ -15,16 +15,19 @@ package expression import ( - . "github.com/pingcap/check" + "fmt" + "testing" + "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/terror" + "github.com/pingcap/tidb/testkit/trequire" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" - "github.com/pingcap/tidb/util/collate" - "github.com/pingcap/tidb/util/testutil" + "github.com/stretchr/testify/require" ) -func (s *testEvaluatorSuite) TestLike(c *C) { +func TestLike(t *testing.T) { + ctx := createContext(t) tests := []struct { input string pattern string @@ -47,78 +50,18 @@ func (s *testEvaluatorSuite) TestLike(c *C) { } for _, tt := range tests { - commentf := Commentf(`for input = "%s", pattern = "%s"`, tt.input, tt.pattern) + comment := fmt.Sprintf(`for input = "%s", pattern = "%s"`, tt.input, tt.pattern) fc := funcs[ast.Like] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(tt.input, tt.pattern, int('\\')))) - c.Assert(err, IsNil, commentf) + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(tt.input, tt.pattern, int('\\')))) + require.NoError(t, err, comment) r, err := evalBuiltinFuncConcurrent(f, chunk.Row{}) - c.Assert(err, IsNil, commentf) - c.Assert(r, testutil.DatumEquals, types.NewDatum(tt.match), commentf) - } -} - -func (s *testEvaluatorSerialSuites) TestCILike(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - tests := []struct { - input string - pattern string - generalMatch int - unicodeMatch int - }{ - {"a", "", 0, 0}, - {"a", "a", 1, 1}, - {"a", "á", 1, 1}, - {"a", "b", 0, 0}, - {"aA", "Aa", 1, 1}, - {"áAb", `Aa%`, 1, 1}, - {"áAb", `%ab%`, 1, 1}, - {"áAb", `%ab`, 1, 1}, - {"ÀAb", "aA_", 1, 1}, - {"áééá", "a_%a", 1, 1}, - {"áééá", "a%_a", 1, 1}, - {"áéá", "a_%a", 1, 1}, - {"áéá", "a%_a", 1, 1}, - {"áá", "a_%a", 0, 0}, - {"áá", "a%_a", 0, 0}, - {"áééáííí", "a_%a%", 1, 1}, - - // performs matching on a per-character basis - // https://dev.mysql.com/doc/refman/5.7/en/string-comparison-functions.html#operator_like - {"ß", "s%", 1, 0}, - {"ß", "%s", 1, 0}, - {"ß", "ss", 0, 0}, - {"ß", "s", 1, 0}, - {"ss", "%ß%", 1, 0}, - {"ß", "_", 1, 1}, - {"ß", "__", 0, 0}, - } - for _, tt := range tests { - commentf := Commentf(`for input = "%s", pattern = "%s"`, tt.input, tt.pattern) - fc := funcs[ast.Like] - inputs := s.datumsToConstants(types.MakeDatums(tt.input, tt.pattern, 0)) - f, err := fc.getFunction(s.ctx, inputs) - c.Assert(err, IsNil, commentf) - f.setCollator(collate.GetCollator("utf8mb4_general_ci")) - r, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil, commentf) - c.Assert(r, testutil.DatumEquals, types.NewDatum(tt.generalMatch), commentf) - } - - for _, tt := range tests { - commentf := Commentf(`for input = "%s", pattern = "%s"`, tt.input, tt.pattern) - fc := funcs[ast.Like] - inputs := s.datumsToConstants(types.MakeDatums(tt.input, tt.pattern, 0)) - f, err := fc.getFunction(s.ctx, inputs) - c.Assert(err, IsNil, commentf) - f.setCollator(collate.GetCollator("utf8mb4_unicode_ci")) - r, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil, commentf) - c.Assert(r, testutil.DatumEquals, types.NewDatum(tt.unicodeMatch), commentf) + require.NoError(t, err, comment) + trequire.DatumEqual(t, types.NewDatum(tt.match), r, comment) } } -func (s *testEvaluatorSuite) TestRegexp(c *C) { +func TestRegexp(t *testing.T) { + ctx := createContext(t) tests := []struct { pattern string input string @@ -141,14 +84,14 @@ func (s *testEvaluatorSuite) TestRegexp(c *C) { } for _, tt := range tests { fc := funcs[ast.Regexp] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(tt.input, tt.pattern))) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(tt.input, tt.pattern))) + require.NoError(t, err) match, err := evalBuiltinFunc(f, chunk.Row{}) if tt.err == nil { - c.Assert(err, IsNil) - c.Assert(match, testutil.DatumEquals, types.NewDatum(tt.match), Commentf("%v", tt)) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(tt.match), match, fmt.Sprintf("%v", tt)) } else { - c.Assert(terror.ErrorEqual(err, tt.err), IsTrue) + require.True(t, terror.ErrorEqual(err, tt.err)) } } } diff --git a/expression/builtin_like_vec_test.go b/expression/builtin_like_vec_test.go index be069c13daf57..6a9f00efc9503 100644 --- a/expression/builtin_like_vec_test.go +++ b/expression/builtin_like_vec_test.go @@ -17,7 +17,6 @@ package expression import ( "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/types" ) @@ -33,8 +32,8 @@ var vecBuiltinLikeCases = map[string][]vecExprBenchCase{ }, } -func (s *testEvaluatorSuite) TestVectorizedBuiltinLikeFunc(c *C) { - testVectorizedBuiltinFunc(c, vecBuiltinLikeCases) +func TestVectorizedBuiltinLikeFunc(t *testing.T) { + testVectorizedBuiltinFunc(t, vecBuiltinLikeCases) } func BenchmarkVectorizedBuiltinLikeFunc(b *testing.B) { diff --git a/expression/builtin_math.go b/expression/builtin_math.go index d179ddcfc0bc8..54fae95639142 100644 --- a/expression/builtin_math.go +++ b/expression/builtin_math.go @@ -24,7 +24,6 @@ import ( "math" "strconv" "strings" - "sync" "github.com/cznic/mathutil" "github.com/pingcap/tidb/parser/ast" @@ -32,6 +31,7 @@ import ( "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" + utilMath "github.com/pingcap/tidb/util/math" "github.com/pingcap/tipb/go-tipb" ) @@ -273,14 +273,17 @@ func (c *roundFunctionClass) getFunction(ctx sessionctx.Context, args []Expressi bf.tp.Flag |= mysql.UnsignedFlag } - bf.tp.Flen = argFieldTp.Flen - bf.tp.Decimal = calculateDecimal4RoundAndTruncate(ctx, args, argTp) - if bf.tp.Decimal != types.UnspecifiedLength { - if argFieldTp.Decimal != types.UnspecifiedLength { - decimalDelta := bf.tp.Decimal - argFieldTp.Decimal - bf.tp.Flen += mathutil.Max(decimalDelta, 0) - } else { - bf.tp.Flen = argFieldTp.Flen + bf.tp.Decimal + // ETInt or ETReal is set correctly by newBaseBuiltinFuncWithTp, only need to handle ETDecimal. + if argTp == types.ETDecimal { + bf.tp.Flen = argFieldTp.Flen + bf.tp.Decimal = calculateDecimal4RoundAndTruncate(ctx, args, argTp) + if bf.tp.Decimal != types.UnspecifiedLength { + if argFieldTp.Decimal != types.UnspecifiedLength { + decimalDelta := bf.tp.Decimal - argFieldTp.Decimal + bf.tp.Flen += mathutil.Max(decimalDelta, 0) + } else { + bf.tp.Flen = argFieldTp.Flen + bf.tp.Decimal + } } } @@ -487,8 +490,10 @@ func (c *ceilFunctionClass) getFunction(ctx sessionctx.Context, args []Expressio return nil, err } setFlag4FloorAndCeil(bf.tp, args[0]) - argFieldTp := args[0].GetType() - bf.tp.Flen, bf.tp.Decimal = argFieldTp.Flen, 0 + // ETInt or ETReal is set correctly by newBaseBuiltinFuncWithTp, only need to handle ETDecimal. + if retTp == types.ETDecimal { + bf.tp.Flen, bf.tp.Decimal = args[0].GetType().Flen, 0 + } switch argTp { case types.ETInt: @@ -675,7 +680,11 @@ func (c *floorFunctionClass) getFunction(ctx sessionctx.Context, args []Expressi return nil, err } setFlag4FloorAndCeil(bf.tp, args[0]) - bf.tp.Flen, bf.tp.Decimal = args[0].GetType().Flen, 0 + + // ETInt or ETReal is set correctly by newBaseBuiltinFuncWithTp, only need to handle ETDecimal. + if retTp == types.ETDecimal { + bf.tp.Flen, bf.tp.Decimal = args[0].GetType().Flen, 0 + } switch argTp { case types.ETInt: if retTp == types.ETInt { @@ -1014,7 +1023,7 @@ func (c *randFunctionClass) getFunction(ctx sessionctx.Context, args []Expressio } bt := bf if len(args) == 0 { - sig = &builtinRandSig{bt, &sync.Mutex{}, NewWithTime()} + sig = &builtinRandSig{bt, ctx.GetSessionVars().Rng} sig.setPbCode(tipb.ScalarFuncSig_Rand) } else if _, isConstant := args[0].(*Constant); isConstant { // According to MySQL manual: @@ -1030,7 +1039,7 @@ func (c *randFunctionClass) getFunction(ctx sessionctx.Context, args []Expressio // The behavior same as MySQL. seed = 0 } - sig = &builtinRandSig{bt, &sync.Mutex{}, NewWithSeed(seed)} + sig = &builtinRandSig{bt, utilMath.NewWithSeed(seed)} sig.setPbCode(tipb.ScalarFuncSig_Rand) } else { sig = &builtinRandWithSeedFirstGenSig{bt} @@ -1041,12 +1050,11 @@ func (c *randFunctionClass) getFunction(ctx sessionctx.Context, args []Expressio type builtinRandSig struct { baseBuiltinFunc - mu *sync.Mutex - mysqlRng *MysqlRng + mysqlRng *utilMath.MysqlRng } func (b *builtinRandSig) Clone() builtinFunc { - newSig := &builtinRandSig{mysqlRng: b.mysqlRng, mu: b.mu} + newSig := &builtinRandSig{mysqlRng: b.mysqlRng} newSig.cloneFrom(&b.baseBuiltinFunc) return newSig } @@ -1054,9 +1062,7 @@ func (b *builtinRandSig) Clone() builtinFunc { // evalReal evals RAND(). // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_rand func (b *builtinRandSig) evalReal(row chunk.Row) (float64, bool, error) { - b.mu.Lock() res := b.mysqlRng.Gen() - b.mu.Unlock() return res, false, nil } @@ -1080,11 +1086,11 @@ func (b *builtinRandWithSeedFirstGenSig) evalReal(row chunk.Row) (float64, bool, // b.args[0] is promised to be a non-constant(such as a column name) in // builtinRandWithSeedFirstGenSig, the seed is initialized with the value for each // invocation of RAND(). - var rng *MysqlRng + var rng *utilMath.MysqlRng if !isNull { - rng = NewWithSeed(seed) + rng = utilMath.NewWithSeed(seed) } else { - rng = NewWithSeed(0) + rng = utilMath.NewWithSeed(0) } return rng.Gen(), false, nil } @@ -1898,9 +1904,11 @@ func (c *truncateFunctionClass) getFunction(ctx sessionctx.Context, args []Expre if err != nil { return nil, err } - - bf.tp.Decimal = calculateDecimal4RoundAndTruncate(ctx, args, argTp) - bf.tp.Flen = args[0].GetType().Flen - args[0].GetType().Decimal + bf.tp.Decimal + // ETInt or ETReal is set correctly by newBaseBuiltinFuncWithTp, only need to handle ETDecimal. + if argTp == types.ETDecimal { + bf.tp.Decimal = calculateDecimal4RoundAndTruncate(ctx, args, argTp) + bf.tp.Flen = args[0].GetType().Flen - args[0].GetType().Decimal + bf.tp.Decimal + } bf.tp.Flag |= args[0].GetType().Flag var sig builtinFunc diff --git a/expression/builtin_math_test.go b/expression/builtin_math_test.go index 8454ce2dfc4a6..898693d14b394 100644 --- a/expression/builtin_math_test.go +++ b/expression/builtin_math_test.go @@ -17,19 +17,22 @@ package expression import ( "math" "runtime" + "testing" "time" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/charset" "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/testkit/trequire" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" - "github.com/pingcap/tidb/util/testutil" + utilMath "github.com/pingcap/tidb/util/math" "github.com/pingcap/tipb/go-tipb" + "github.com/stretchr/testify/require" ) -func (s *testEvaluatorSuite) TestAbs(c *C) { +func TestAbs(t *testing.T) { + ctx := createContext(t) tbl := []struct { Arg interface{} Ret interface{} @@ -44,18 +47,19 @@ func (s *testEvaluatorSuite) TestAbs(c *C) { Dtbl := tblToDtbl(tbl) - for _, t := range Dtbl { + for _, tt := range Dtbl { fc := funcs[ast.Abs] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(t["Arg"])) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(tt["Arg"])) + require.NoError(t, err) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["Ret"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, tt["Ret"][0], v) } } -func (s *testEvaluatorSuite) TestCeil(c *C) { - sc := s.ctx.GetSessionVars().StmtCtx +func TestCeil(t *testing.T) { + ctx := createContext(t) + sc := ctx.GetSessionVars().StmtCtx tmpIT := sc.IgnoreTruncate sc.IgnoreTruncate = true defer func() { @@ -92,25 +96,25 @@ func (s *testEvaluatorSuite) TestCeil(c *C) { runCasesOn := func(funcName string, cases []testCase, exps []Expression) { for _, test := range cases { - f, err := newFunctionForTest(s.ctx, funcName, s.primitiveValsToConstants([]interface{}{test.arg})...) - c.Assert(err, IsNil) + f, err := newFunctionForTest(ctx, funcName, primitiveValsToConstants(ctx, []interface{}{test.arg})...) + require.NoError(t, err) result, err := f.Eval(chunk.Row{}) if test.getErr { - c.Assert(err, NotNil) + require.Error(t, err) } else { - c.Assert(err, IsNil) + require.NoError(t, err) if test.isNil { - c.Assert(result.Kind(), Equals, types.KindNull) + require.Equal(t, types.KindNull, result.Kind()) } else { - c.Assert(result, testutil.DatumEquals, types.NewDatum(test.expect)) + trequire.DatumEqual(t, types.NewDatum(test.expect), result) } } } for _, exp := range exps { - _, err := funcs[funcName].getFunction(s.ctx, []Expression{exp}) - c.Assert(err, IsNil) + _, err := funcs[funcName].getFunction(ctx, []Expression{exp}) + require.NoError(t, err) } } @@ -118,7 +122,8 @@ func (s *testEvaluatorSuite) TestCeil(c *C) { runCasesOn(ast.Ceiling, cases, expressions) } -func (s *testEvaluatorSuite) TestExp(c *C) { +func TestExp(t *testing.T) { + ctx := createContext(t) tests := []struct { args interface{} expect float64 @@ -141,35 +146,36 @@ func (s *testEvaluatorSuite) TestExp(c *C) { } for _, test := range tests { - preWarningCnt := s.ctx.GetSessionVars().StmtCtx.WarningCount() - f, err := newFunctionForTest(s.ctx, ast.Exp, s.primitiveValsToConstants([]interface{}{test.args})...) - c.Assert(err, IsNil) + preWarningCnt := ctx.GetSessionVars().StmtCtx.WarningCount() + f, err := newFunctionForTest(ctx, ast.Exp, primitiveValsToConstants(ctx, []interface{}{test.args})...) + require.NoError(t, err) result, err := f.Eval(chunk.Row{}) if test.getWarning { if test.errMsg != "" { - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, test.errMsg) + require.Error(t, err) + require.Equal(t, test.errMsg, err.Error()) } else { - c.Assert(err, IsNil) - c.Assert(s.ctx.GetSessionVars().StmtCtx.WarningCount(), Equals, preWarningCnt+1) + require.NoError(t, err) + require.Equal(t, preWarningCnt+1, ctx.GetSessionVars().StmtCtx.WarningCount()) } } else { - c.Assert(err, IsNil) + require.NoError(t, err) if test.isNil { - c.Assert(result.Kind(), Equals, types.KindNull) + require.Equal(t, types.KindNull, result.Kind()) } else { - c.Assert(result.GetFloat64(), Equals, test.expect) + require.Equal(t, test.expect, result.GetFloat64()) } } } - _, err := funcs[ast.Exp].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.Exp].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestFloor(c *C) { - sc := s.ctx.GetSessionVars().StmtCtx +func TestFloor(t *testing.T) { + ctx := createContext(t) + sc := ctx.GetSessionVars().StmtCtx tmpIT := sc.IgnoreTruncate sc.IgnoreTruncate = true defer func() { @@ -206,18 +212,18 @@ func (s *testEvaluatorSuite) TestFloor(c *C) { {genDuration(0, 12, 34), float64(1234), false, false}, {genTime(2017, 7, 19), float64(20170719000000), false, false}, } { - f, err := newFunctionForTest(s.ctx, ast.Floor, s.primitiveValsToConstants([]interface{}{test.arg})...) - c.Assert(err, IsNil) + f, err := newFunctionForTest(ctx, ast.Floor, primitiveValsToConstants(ctx, []interface{}{test.arg})...) + require.NoError(t, err) result, err := f.Eval(chunk.Row{}) if test.getErr { - c.Assert(err, NotNil) + require.Error(t, err) } else { - c.Assert(err, IsNil) + require.NoError(t, err) if test.isNil { - c.Assert(result.Kind(), Equals, types.KindNull) + require.Equal(t, types.KindNull, result.Kind()) } else { - c.Assert(result, testutil.DatumEquals, types.NewDatum(test.expect)) + trequire.DatumEqual(t, types.NewDatum(test.expect), result) } } } @@ -232,12 +238,13 @@ func (s *testEvaluatorSuite) TestFloor(c *C) { RetType: types.NewFieldType(mysql.TypeFloat), }, } { - _, err := funcs[ast.Floor].getFunction(s.ctx, []Expression{exp}) - c.Assert(err, IsNil) + _, err := funcs[ast.Floor].getFunction(ctx, []Expression{exp}) + require.NoError(t, err) } } -func (s *testEvaluatorSuite) TestLog(c *C) { +func TestLog(t *testing.T) { + ctx := createContext(t) tests := []struct { args []interface{} expect float64 @@ -259,27 +266,28 @@ func (s *testEvaluatorSuite) TestLog(c *C) { } for _, test := range tests { - preWarningCnt := s.ctx.GetSessionVars().StmtCtx.WarningCount() - f, err := newFunctionForTest(s.ctx, ast.Log, s.primitiveValsToConstants(test.args)...) - c.Assert(err, IsNil) + preWarningCnt := ctx.GetSessionVars().StmtCtx.WarningCount() + f, err := newFunctionForTest(ctx, ast.Log, primitiveValsToConstants(ctx, test.args)...) + require.NoError(t, err) result, err := f.Eval(chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) if test.warningCount > 0 { - c.Assert(s.ctx.GetSessionVars().StmtCtx.WarningCount(), Equals, preWarningCnt+test.warningCount) + require.Equal(t, preWarningCnt+test.warningCount, ctx.GetSessionVars().StmtCtx.WarningCount()) } if test.isNil { - c.Assert(result.Kind(), Equals, types.KindNull) + require.Equal(t, types.KindNull, result.Kind()) } else { - c.Assert(result.GetFloat64(), Equals, test.expect) + require.Equal(t, test.expect, result.GetFloat64()) } } - _, err := funcs[ast.Log].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.Log].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestLog2(c *C) { +func TestLog2(t *testing.T) { + ctx := createContext(t) tests := []struct { args interface{} expect float64 @@ -296,27 +304,28 @@ func (s *testEvaluatorSuite) TestLog2(c *C) { } for _, test := range tests { - preWarningCnt := s.ctx.GetSessionVars().StmtCtx.WarningCount() - f, err := newFunctionForTest(s.ctx, ast.Log2, s.primitiveValsToConstants([]interface{}{test.args})...) - c.Assert(err, IsNil) + preWarningCnt := ctx.GetSessionVars().StmtCtx.WarningCount() + f, err := newFunctionForTest(ctx, ast.Log2, primitiveValsToConstants(ctx, []interface{}{test.args})...) + require.NoError(t, err) result, err := f.Eval(chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) if test.warningCount > 0 { - c.Assert(s.ctx.GetSessionVars().StmtCtx.WarningCount(), Equals, preWarningCnt+test.warningCount) + require.Equal(t, preWarningCnt+test.warningCount, ctx.GetSessionVars().StmtCtx.WarningCount()) } if test.isNil { - c.Assert(result.Kind(), Equals, types.KindNull) + require.Equal(t, types.KindNull, result.Kind()) } else { - c.Assert(result.GetFloat64(), Equals, test.expect) + require.Equal(t, test.expect, result.GetFloat64()) } } - _, err := funcs[ast.Log2].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.Log2].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestLog10(c *C) { +func TestLog10(t *testing.T) { + ctx := createContext(t) tests := []struct { args interface{} expect float64 @@ -333,47 +342,49 @@ func (s *testEvaluatorSuite) TestLog10(c *C) { } for _, test := range tests { - preWarningCnt := s.ctx.GetSessionVars().StmtCtx.WarningCount() - f, err := newFunctionForTest(s.ctx, ast.Log10, s.primitiveValsToConstants([]interface{}{test.args})...) - c.Assert(err, IsNil) + preWarningCnt := ctx.GetSessionVars().StmtCtx.WarningCount() + f, err := newFunctionForTest(ctx, ast.Log10, primitiveValsToConstants(ctx, []interface{}{test.args})...) + require.NoError(t, err) result, err := f.Eval(chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) if test.warningCount > 0 { - c.Assert(s.ctx.GetSessionVars().StmtCtx.WarningCount(), Equals, preWarningCnt+test.warningCount) + require.Equal(t, preWarningCnt+test.warningCount, ctx.GetSessionVars().StmtCtx.WarningCount()) } if test.isNil { - c.Assert(result.Kind(), Equals, types.KindNull) + require.Equal(t, types.KindNull, result.Kind()) } else { - c.Assert(result.GetFloat64(), Equals, test.expect) + require.Equal(t, test.expect, result.GetFloat64()) } } - _, err := funcs[ast.Log10].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.Log10].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestRand(c *C) { +func TestRand(t *testing.T) { + ctx := createContext(t) fc := funcs[ast.Rand] - f, err := fc.getFunction(s.ctx, nil) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, nil) + require.NoError(t, err) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.GetFloat64(), Less, float64(1)) - c.Assert(v.GetFloat64(), GreaterEqual, float64(0)) + require.NoError(t, err) + require.Less(t, v.GetFloat64(), float64(1)) + require.GreaterOrEqual(t, v.GetFloat64(), float64(0)) // issue 3211 - f2, err := fc.getFunction(s.ctx, []Expression{&Constant{Value: types.NewIntDatum(20160101), RetType: types.NewFieldType(mysql.TypeLonglong)}}) - c.Assert(err, IsNil) - randGen := NewWithSeed(20160101) + f2, err := fc.getFunction(ctx, []Expression{&Constant{Value: types.NewIntDatum(20160101), RetType: types.NewFieldType(mysql.TypeLonglong)}}) + require.NoError(t, err) + randGen := utilMath.NewWithSeed(20160101) for i := 0; i < 3; i++ { v, err = evalBuiltinFunc(f2, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.GetFloat64(), Equals, randGen.Gen()) + require.NoError(t, err) + require.Equal(t, randGen.Gen(), v.GetFloat64()) } } -func (s *testEvaluatorSuite) TestPow(c *C) { +func TestPow(t *testing.T) { + ctx := createContext(t) tbl := []struct { Arg []interface{} Ret float64 @@ -386,13 +397,13 @@ func (s *testEvaluatorSuite) TestPow(c *C) { Dtbl := tblToDtbl(tbl) - for _, t := range Dtbl { + for _, tt := range Dtbl { fc := funcs[ast.Pow] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(t["Arg"])) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(tt["Arg"])) + require.NoError(t, err) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["Ret"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, tt["Ret"][0], v) } errTbl := []struct { @@ -404,22 +415,23 @@ func (s *testEvaluatorSuite) TestPow(c *C) { } errDtbl := tblToDtbl(errTbl) - for i, t := range errDtbl { + for i, tt := range errDtbl { fc := funcs[ast.Pow] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(t["Arg"])) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(tt["Arg"])) + require.NoError(t, err) _, err = evalBuiltinFunc(f, chunk.Row{}) if i == 2 { - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[types:1690]DOUBLE value is out of range in 'pow(10, 700)'") + require.Error(t, err) + require.Equal(t, "[types:1690]DOUBLE value is out of range in 'pow(10, 700)'", err.Error()) } else { - c.Assert(err, IsNil) + require.NoError(t, err) } } - c.Assert(int(s.ctx.GetSessionVars().StmtCtx.WarningCount()), Equals, 3) + require.Equal(t, 3, int(ctx.GetSessionVars().StmtCtx.WarningCount())) } -func (s *testEvaluatorSuite) TestRound(c *C) { +func TestRound(t *testing.T) { + ctx := createContext(t) newDec := types.NewDecFromStringForTest tbl := []struct { Arg []interface{} @@ -448,31 +460,32 @@ func (s *testEvaluatorSuite) TestRound(c *C) { Dtbl := tblToDtbl(tbl) - for _, t := range Dtbl { + for _, tt := range Dtbl { fc := funcs[ast.Round] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(t["Arg"])) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(tt["Arg"])) + require.NoError(t, err) switch f.(type) { case *builtinRoundWithFracIntSig: - c.Assert(f.PbCode(), Equals, tipb.ScalarFuncSig_RoundWithFracInt) + require.Equal(t, tipb.ScalarFuncSig_RoundWithFracInt, f.PbCode()) case *builtinRoundWithFracDecSig: - c.Assert(f.PbCode(), Equals, tipb.ScalarFuncSig_RoundWithFracDec) + require.Equal(t, tipb.ScalarFuncSig_RoundWithFracDec, f.PbCode()) case *builtinRoundWithFracRealSig: - c.Assert(f.PbCode(), Equals, tipb.ScalarFuncSig_RoundWithFracReal) + require.Equal(t, tipb.ScalarFuncSig_RoundWithFracReal, f.PbCode()) case *builtinRoundIntSig: - c.Assert(f.PbCode(), Equals, tipb.ScalarFuncSig_RoundInt) + require.Equal(t, tipb.ScalarFuncSig_RoundInt, f.PbCode()) case *builtinRoundDecSig: - c.Assert(f.PbCode(), Equals, tipb.ScalarFuncSig_RoundDec) + require.Equal(t, tipb.ScalarFuncSig_RoundDec, f.PbCode()) case *builtinRoundRealSig: - c.Assert(f.PbCode(), Equals, tipb.ScalarFuncSig_RoundReal) + require.Equal(t, tipb.ScalarFuncSig_RoundReal, f.PbCode()) } v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["Ret"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, tt["Ret"][0], v) } } -func (s *testEvaluatorSuite) TestTruncate(c *C) { +func TestTruncate(t *testing.T) { + ctx := createContext(t) newDec := types.NewDecFromStringForTest tbl := []struct { Arg []interface{} @@ -504,18 +517,19 @@ func (s *testEvaluatorSuite) TestTruncate(c *C) { Dtbl := tblToDtbl(tbl) - for _, t := range Dtbl { + for _, tt := range Dtbl { fc := funcs[ast.Truncate] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(t["Arg"])) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + f, err := fc.getFunction(ctx, datumsToConstants(tt["Arg"])) + require.NoError(t, err) + require.NotNil(t, f) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["Ret"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, tt["Ret"][0], v) } } -func (s *testEvaluatorSuite) TestCRC32(c *C) { +func TestCRC32(t *testing.T) { + ctx := createContext(t) tbl := []struct { Arg []interface{} Ret interface{} @@ -531,17 +545,18 @@ func (s *testEvaluatorSuite) TestCRC32(c *C) { Dtbl := tblToDtbl(tbl) - for _, t := range Dtbl { + for _, tt := range Dtbl { fc := funcs[ast.CRC32] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(t["Arg"])) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(tt["Arg"])) + require.NoError(t, err) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["Ret"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, tt["Ret"][0], v) } } -func (s *testEvaluatorSuite) TestConv(c *C) { +func TestConv(t *testing.T) { + ctx := createContext(t) cases := []struct { args []interface{} expected interface{} @@ -564,24 +579,24 @@ func (s *testEvaluatorSuite) TestConv(c *C) { {[]interface{}{"a6a", 1, 8}, "0", true, false}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.Conv, s.primitiveValsToConstants(t.args)...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.Conv, primitiveValsToConstants(ctx, c.args)...) + require.NoError(t, err) tp := f.GetType() - c.Assert(tp.Tp, Equals, mysql.TypeVarString) - c.Assert(tp.Charset, Equals, charset.CharsetUTF8MB4) - c.Assert(tp.Collate, Equals, charset.CollationUTF8MB4) - c.Assert(tp.Flag, Equals, uint(0)) + require.Equal(t, mysql.TypeVarString, tp.Tp) + require.Equal(t, charset.CharsetUTF8MB4, tp.Charset) + require.Equal(t, charset.CollationUTF8MB4, tp.Collate) + require.Equal(t, uint(0), tp.Flag) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetString(), Equals, t.expected) + require.Equal(t, c.expected, d.GetString()) } } } @@ -595,24 +610,25 @@ func (s *testEvaluatorSuite) TestConv(c *C) { {"+12azD", 16, "12a"}, {"+", 12, ""}, } - for _, t := range v { - r := getValidPrefix(t.s, t.base) - c.Assert(r, Equals, t.ret) + for _, tt := range v { + r := getValidPrefix(tt.s, tt.base) + require.Equal(t, tt.ret, r) } - _, err := funcs[ast.Conv].getFunction(s.ctx, []Expression{NewZero(), NewZero(), NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.Conv].getFunction(ctx, []Expression{NewZero(), NewZero(), NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestSign(c *C) { - sc := s.ctx.GetSessionVars().StmtCtx +func TestSign(t *testing.T) { + ctx := createContext(t) + sc := ctx.GetSessionVars().StmtCtx tmpIT := sc.IgnoreTruncate sc.IgnoreTruncate = true defer func() { sc.IgnoreTruncate = tmpIT }() - for _, t := range []struct { + for _, tt := range []struct { num []interface{} ret interface{} }{ @@ -630,16 +646,17 @@ func (s *testEvaluatorSuite) TestSign(c *C) { {[]interface{}{uint64(9223372036854775808)}, int64(1)}, } { fc := funcs[ast.Sign] - f, err := fc.getFunction(s.ctx, s.primitiveValsToConstants(t.num)) - c.Assert(err, IsNil, Commentf("%v", t)) + f, err := fc.getFunction(ctx, primitiveValsToConstants(ctx, tt.num)) + require.NoError(t, err) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil, Commentf("%v", t)) - c.Assert(v, testutil.DatumEquals, types.NewDatum(t.ret), Commentf("%v", t)) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(tt.ret), v) } } -func (s *testEvaluatorSuite) TestDegrees(c *C) { - sc := s.ctx.GetSessionVars().StmtCtx +func TestDegrees(t *testing.T) { + ctx := createContext(t) + sc := ctx.GetSessionVars().StmtCtx sc.IgnoreTruncate = false cases := []struct { args interface{} @@ -659,28 +676,29 @@ func (s *testEvaluatorSuite) TestDegrees(c *C) { {"+1abc", 57.29577951308232, false, true}, } - for _, t := range cases { - preWarningCnt := s.ctx.GetSessionVars().StmtCtx.WarningCount() - f, err := newFunctionForTest(s.ctx, ast.Degrees, s.primitiveValsToConstants([]interface{}{t.args})...) - c.Assert(err, IsNil) + for _, c := range cases { + preWarningCnt := ctx.GetSessionVars().StmtCtx.WarningCount() + f, err := newFunctionForTest(ctx, ast.Degrees, primitiveValsToConstants(ctx, []interface{}{c.args})...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getWarning { - c.Assert(err, IsNil) - c.Assert(s.ctx.GetSessionVars().StmtCtx.WarningCount(), Equals, preWarningCnt+1) + if c.getWarning { + require.NoError(t, err) + require.Equal(t, preWarningCnt+1, ctx.GetSessionVars().StmtCtx.WarningCount()) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetFloat64(), Equals, t.expected) + require.Equal(t, c.expected, d.GetFloat64()) } } } - _, err := funcs[ast.Degrees].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.Degrees].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestSqrt(c *C) { +func TestSqrt(t *testing.T) { + ctx := createContext(t) tbl := []struct { Arg []interface{} Ret interface{} @@ -693,26 +711,28 @@ func (s *testEvaluatorSuite) TestSqrt(c *C) { {[]interface{}{"-16"}, nil}, } - for _, t := range tbl { + for _, tt := range tbl { fc := funcs[ast.Sqrt] - f, err := fc.getFunction(s.ctx, s.primitiveValsToConstants(t.Arg)) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, primitiveValsToConstants(ctx, tt.Arg)) + require.NoError(t, err) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, types.NewDatum(t.Ret), Commentf("%v", t)) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(tt.Ret), v) } } -func (s *testEvaluatorSuite) TestPi(c *C) { - f, err := funcs[ast.PI].getFunction(s.ctx, nil) - c.Assert(err, IsNil) +func TestPi(t *testing.T) { + ctx := createContext(t) + f, err := funcs[ast.PI].getFunction(ctx, nil) + require.NoError(t, err) pi, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(pi, testutil.DatumEquals, types.NewDatum(math.Pi)) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(math.Pi), pi) } -func (s *testEvaluatorSuite) TestRadians(c *C) { +func TestRadians(t *testing.T) { + ctx := createContext(t) tbl := []struct { Arg interface{} Ret interface{} @@ -725,26 +745,27 @@ func (s *testEvaluatorSuite) TestRadians(c *C) { } Dtbl := tblToDtbl(tbl) - for _, t := range Dtbl { + for _, tt := range Dtbl { fc := funcs[ast.Radians] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(t["Arg"])) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + f, err := fc.getFunction(ctx, datumsToConstants(tt["Arg"])) + require.NoError(t, err) + require.NotNil(t, f) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["Ret"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, tt["Ret"][0], v) } invalidArg := "notNum" fc := funcs[ast.Radians] - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{types.NewDatum(invalidArg)})) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{types.NewDatum(invalidArg)})) + require.NoError(t, err) _, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(int(s.ctx.GetSessionVars().StmtCtx.WarningCount()), Equals, 1) + require.NoError(t, err) + require.Equal(t, 1, int(ctx.GetSessionVars().StmtCtx.WarningCount())) } -func (s *testEvaluatorSuite) TestSin(c *C) { +func TestSin(t *testing.T) { + ctx := createContext(t) cases := []struct { args interface{} expected float64 @@ -753,41 +774,42 @@ func (s *testEvaluatorSuite) TestSin(c *C) { }{ {nil, 0, true, false}, {int64(0), float64(0), false, false}, - {math.Pi, float64(math.Sin(math.Pi)), false, false}, // Pie ==> 0 - {-math.Pi, float64(math.Sin(-math.Pi)), false, false}, - {math.Pi / 2, float64(math.Sin(math.Pi / 2)), false, false}, // Pie/2 ==> 1 - {-math.Pi / 2, float64(math.Sin(-math.Pi / 2)), false, false}, - {math.Pi / 6, float64(math.Sin(math.Pi / 6)), false, false}, // Pie/6(30 degrees) ==> 0.5 - {-math.Pi / 6, float64(math.Sin(-math.Pi / 6)), false, false}, - {math.Pi * 2, float64(math.Sin(math.Pi * 2)), false, false}, + {math.Pi, math.Sin(math.Pi), false, false}, // Pie ==> 0 + {-math.Pi, math.Sin(-math.Pi), false, false}, + {math.Pi / 2, math.Sin(math.Pi / 2), false, false}, // Pie/2 ==> 1 + {-math.Pi / 2, math.Sin(-math.Pi / 2), false, false}, + {math.Pi / 6, math.Sin(math.Pi / 6), false, false}, // Pie/6(30 degrees) ==> 0.5 + {-math.Pi / 6, math.Sin(-math.Pi / 6), false, false}, + {math.Pi * 2, math.Sin(math.Pi * 2), false, false}, {"adfsdfgs", 0, false, true}, {"0.000", 0, false, false}, } - for _, t := range cases { - preWarningCnt := s.ctx.GetSessionVars().StmtCtx.WarningCount() - f, err := newFunctionForTest(s.ctx, ast.Sin, s.primitiveValsToConstants([]interface{}{t.args})...) - c.Assert(err, IsNil) + for _, c := range cases { + preWarningCnt := ctx.GetSessionVars().StmtCtx.WarningCount() + f, err := newFunctionForTest(ctx, ast.Sin, primitiveValsToConstants(ctx, []interface{}{c.args})...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getWarning { - c.Assert(err, IsNil) - c.Assert(s.ctx.GetSessionVars().StmtCtx.WarningCount(), Equals, preWarningCnt+1) + if c.getWarning { + require.NoError(t, err) + require.Equal(t, preWarningCnt+1, ctx.GetSessionVars().StmtCtx.WarningCount()) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetFloat64(), Equals, t.expected) + require.Equal(t, c.expected, d.GetFloat64()) } } } - _, err := funcs[ast.Sin].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.Sin].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestCos(c *C) { +func TestCos(t *testing.T) { + ctx := createContext(t) cases := []struct { args interface{} expected float64 @@ -798,36 +820,37 @@ func (s *testEvaluatorSuite) TestCos(c *C) { {int64(0), float64(1), false, false}, {math.Pi, float64(-1), false, false}, // cos pi equals -1 {-math.Pi, float64(-1), false, false}, - {math.Pi / 2, float64(math.Cos(math.Pi / 2)), false, false}, // Pi/2 is some near 0 (6.123233995736766e-17) but not 0. Even in math it is 0. - {-math.Pi / 2, float64(math.Cos(-math.Pi / 2)), false, false}, + {math.Pi / 2, math.Cos(math.Pi / 2), false, false}, // Pi/2 is some near 0 (6.123233995736766e-17) but not 0. Even in math it is 0. + {-math.Pi / 2, math.Cos(-math.Pi / 2), false, false}, {"0.000", float64(1), false, false}, // string value case {"sdfgsfsdf", float64(0), false, true}, } - for _, t := range cases { - preWarningCnt := s.ctx.GetSessionVars().StmtCtx.WarningCount() - f, err := newFunctionForTest(s.ctx, ast.Cos, s.primitiveValsToConstants([]interface{}{t.args})...) - c.Assert(err, IsNil) + for _, c := range cases { + preWarningCnt := ctx.GetSessionVars().StmtCtx.WarningCount() + f, err := newFunctionForTest(ctx, ast.Cos, primitiveValsToConstants(ctx, []interface{}{c.args})...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getWarning { - c.Assert(err, IsNil) - c.Assert(s.ctx.GetSessionVars().StmtCtx.WarningCount(), Equals, preWarningCnt+1) + if c.getWarning { + require.NoError(t, err) + require.Equal(t, preWarningCnt+1, ctx.GetSessionVars().StmtCtx.WarningCount()) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetFloat64(), Equals, t.expected) + require.Equal(t, c.expected, d.GetFloat64()) } } } - _, err := funcs[ast.Cos].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.Cos].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestAcos(c *C) { +func TestAcos(t *testing.T) { + ctx := createContext(t) tests := []struct { args interface{} expect float64 @@ -843,29 +866,30 @@ func (s *testEvaluatorSuite) TestAcos(c *C) { } for _, test := range tests { - preWarningCnt := s.ctx.GetSessionVars().StmtCtx.WarningCount() - f, err := newFunctionForTest(s.ctx, ast.Acos, s.primitiveValsToConstants([]interface{}{test.args})...) - c.Assert(err, IsNil) + preWarningCnt := ctx.GetSessionVars().StmtCtx.WarningCount() + f, err := newFunctionForTest(ctx, ast.Acos, primitiveValsToConstants(ctx, []interface{}{test.args})...) + require.NoError(t, err) result, err := f.Eval(chunk.Row{}) if test.getWarning { - c.Assert(err, IsNil) - c.Assert(s.ctx.GetSessionVars().StmtCtx.WarningCount(), Equals, preWarningCnt+1) + require.NoError(t, err) + require.Equal(t, preWarningCnt+1, ctx.GetSessionVars().StmtCtx.WarningCount()) } else { - c.Assert(err, IsNil) + require.NoError(t, err) if test.isNil { - c.Assert(result.Kind(), Equals, types.KindNull) + require.Equal(t, types.KindNull, result.Kind()) } else { - c.Assert(result.GetFloat64(), Equals, test.expect) + require.Equal(t, test.expect, result.GetFloat64()) } } } - _, err := funcs[ast.Acos].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.Acos].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestAsin(c *C) { +func TestAsin(t *testing.T) { + ctx := createContext(t) tests := []struct { args interface{} expect float64 @@ -881,29 +905,30 @@ func (s *testEvaluatorSuite) TestAsin(c *C) { } for _, test := range tests { - preWarningCnt := s.ctx.GetSessionVars().StmtCtx.WarningCount() - f, err := newFunctionForTest(s.ctx, ast.Asin, s.primitiveValsToConstants([]interface{}{test.args})...) - c.Assert(err, IsNil) + preWarningCnt := ctx.GetSessionVars().StmtCtx.WarningCount() + f, err := newFunctionForTest(ctx, ast.Asin, primitiveValsToConstants(ctx, []interface{}{test.args})...) + require.NoError(t, err) result, err := f.Eval(chunk.Row{}) if test.getWarning { - c.Assert(err, IsNil) - c.Assert(s.ctx.GetSessionVars().StmtCtx.WarningCount(), Equals, preWarningCnt+1) + require.NoError(t, err) + require.Equal(t, preWarningCnt+1, ctx.GetSessionVars().StmtCtx.WarningCount()) } else { - c.Assert(err, IsNil) + require.NoError(t, err) if test.isNil { - c.Assert(result.Kind(), Equals, types.KindNull) + require.Equal(t, types.KindNull, result.Kind()) } else { - c.Assert(result.GetFloat64(), Equals, test.expect) + require.Equal(t, test.expect, result.GetFloat64()) } } } - _, err := funcs[ast.Asin].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.Asin].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestAtan(c *C) { +func TestAtan(t *testing.T) { + ctx := createContext(t) tests := []struct { args []interface{} expect float64 @@ -919,29 +944,30 @@ func (s *testEvaluatorSuite) TestAtan(c *C) { } for _, test := range tests { - preWarningCnt := s.ctx.GetSessionVars().StmtCtx.WarningCount() - f, err := newFunctionForTest(s.ctx, ast.Atan, s.primitiveValsToConstants(test.args)...) - c.Assert(err, IsNil) + preWarningCnt := ctx.GetSessionVars().StmtCtx.WarningCount() + f, err := newFunctionForTest(ctx, ast.Atan, primitiveValsToConstants(ctx, test.args)...) + require.NoError(t, err) result, err := f.Eval(chunk.Row{}) if test.getWarning { - c.Assert(err, IsNil) - c.Assert(s.ctx.GetSessionVars().StmtCtx.WarningCount(), Equals, preWarningCnt+1) + require.NoError(t, err) + require.Equal(t, preWarningCnt+1, ctx.GetSessionVars().StmtCtx.WarningCount()) } else { - c.Assert(err, IsNil) + require.NoError(t, err) if test.isNil { - c.Assert(result.Kind(), Equals, types.KindNull) + require.Equal(t, types.KindNull, result.Kind()) } else { - c.Assert(result.GetFloat64(), Equals, test.expect) + require.Equal(t, test.expect, result.GetFloat64()) } } } - _, err := funcs[ast.Atan].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.Atan].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestTan(c *C) { +func TestTan(t *testing.T) { + ctx := createContext(t) cases := []struct { args interface{} expected float64 @@ -957,30 +983,31 @@ func (s *testEvaluatorSuite) TestTan(c *C) { {"sdfgsdfg", 0, false, true}, } - for _, t := range cases { - preWarningCnt := s.ctx.GetSessionVars().StmtCtx.WarningCount() - f, err := newFunctionForTest(s.ctx, ast.Tan, s.primitiveValsToConstants([]interface{}{t.args})...) - c.Assert(err, IsNil) + for _, c := range cases { + preWarningCnt := ctx.GetSessionVars().StmtCtx.WarningCount() + f, err := newFunctionForTest(ctx, ast.Tan, primitiveValsToConstants(ctx, []interface{}{c.args})...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getWarning { - c.Assert(err, IsNil) - c.Assert(s.ctx.GetSessionVars().StmtCtx.WarningCount(), Equals, preWarningCnt+1) + if c.getWarning { + require.NoError(t, err) + require.Equal(t, preWarningCnt+1, ctx.GetSessionVars().StmtCtx.WarningCount()) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetFloat64(), Equals, t.expected) + require.Equal(t, c.expected, d.GetFloat64()) } } } - _, err := funcs[ast.Tan].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.Tan].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestCot(c *C) { +func TestCot(t *testing.T) { + ctx := createContext(t) tests := []struct { args interface{} expect float64 @@ -999,25 +1026,25 @@ func (s *testEvaluatorSuite) TestCot(c *C) { } for _, test := range tests { - f, err := newFunctionForTest(s.ctx, ast.Cot, s.primitiveValsToConstants([]interface{}{test.args})...) - c.Assert(err, IsNil) + f, err := newFunctionForTest(ctx, ast.Cot, primitiveValsToConstants(ctx, []interface{}{test.args})...) + require.NoError(t, err) result, err := f.Eval(chunk.Row{}) if test.getErr { - c.Assert(err, NotNil) + require.Error(t, err) if test.errMsg != "" { - c.Assert(err.Error(), Equals, test.errMsg) + require.Equal(t, test.errMsg, err.Error()) } } else { - c.Assert(err, IsNil) + require.NoError(t, err) if test.isNil { - c.Assert(result.Kind(), Equals, types.KindNull) + require.Equal(t, types.KindNull, result.Kind()) } else { - c.Assert(result.GetFloat64(), Equals, test.expect) + require.Equal(t, test.expect, result.GetFloat64()) } } } - _, err := funcs[ast.Cot].getFunction(s.ctx, []Expression{NewOne()}) - c.Assert(err, IsNil) + _, err := funcs[ast.Cot].getFunction(ctx, []Expression{NewOne()}) + require.NoError(t, err) } diff --git a/expression/builtin_math_vec.go b/expression/builtin_math_vec.go index de1b6886d51cc..13b6a701d5d8e 100644 --- a/expression/builtin_math_vec.go +++ b/expression/builtin_math_vec.go @@ -20,6 +20,8 @@ import ( "math" "strconv" + utilMath "github.com/pingcap/tidb/util/math" + "github.com/cznic/mathutil" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/types" @@ -709,11 +711,9 @@ func (b *builtinRandSig) vecEvalReal(input *chunk.Chunk, result *chunk.Column) e n := input.NumRows() result.ResizeFloat64(n, false) f64s := result.Float64s() - b.mu.Lock() for i := range f64s { f64s[i] = b.mysqlRng.Gen() } - b.mu.Unlock() return nil } @@ -738,9 +738,9 @@ func (b *builtinRandWithSeedFirstGenSig) vecEvalReal(input *chunk.Chunk, result for i := 0; i < n; i++ { // When the seed is null we need to use 0 as the seed. // The behavior same as MySQL. - rng := NewWithSeed(0) + rng := utilMath.NewWithSeed(0) if !buf.IsNull(i) { - rng = NewWithSeed(i64s[i]) + rng = utilMath.NewWithSeed(i64s[i]) } f64s[i] = rng.Gen() } diff --git a/expression/builtin_math_vec_test.go b/expression/builtin_math_vec_test.go index 2f63befe69717..a03bc4524f47f 100644 --- a/expression/builtin_math_vec_test.go +++ b/expression/builtin_math_vec_test.go @@ -17,7 +17,6 @@ package expression import ( "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/types" @@ -136,16 +135,16 @@ var vecBuiltinMathCases1 = map[string][]vecExprBenchCase{ }, } -func (s *testEvaluatorSuite) TestVectorizedBuiltinMathEvalOneVec(c *C) { - testVectorizedEvalOneVec(c, vecBuiltinMathCases) +func TestVectorizedBuiltinMathEvalOneVec(t *testing.T) { + testVectorizedEvalOneVec(t, vecBuiltinMathCases) } -func (s *testEvaluatorSuite) TestVectorizedBuiltinMathFunc(c *C) { - testVectorizedBuiltinFunc(c, vecBuiltinMathCases) +func TestVectorizedBuiltinMathFunc(t *testing.T) { + testVectorizedBuiltinFunc(t, vecBuiltinMathCases) } -func (s *testEvaluatorSuite) TestVectorizedBuiltinMathFuncForRand(c *C) { - testVectorizedBuiltinFuncForRand(c, vecBuiltinMathCases1) +func TestVectorizedBuiltinMathFuncForRand(t *testing.T) { + testVectorizedBuiltinFuncForRand(t, vecBuiltinMathCases1) } func BenchmarkVectorizedBuiltinMathEvalOneVec(b *testing.B) { diff --git a/expression/builtin_miscellaneous.go b/expression/builtin_miscellaneous.go index ca9803ea97b9f..82b43d192c84c 100644 --- a/expression/builtin_miscellaneous.go +++ b/expression/builtin_miscellaneous.go @@ -57,6 +57,7 @@ var ( _ functionClass = &vitessHashFunctionClass{} _ functionClass = &uuidToBinFunctionClass{} _ functionClass = &binToUUIDFunctionClass{} + _ functionClass = &isUUIDFunctionClass{} ) var ( @@ -78,6 +79,7 @@ var ( _ builtinFunc = &builtinIsIPv4CompatSig{} _ builtinFunc = &builtinIsIPv4MappedSig{} _ builtinFunc = &builtinIsIPv6Sig{} + _ builtinFunc = &builtinIsUUIDSig{} _ builtinFunc = &builtinUUIDSig{} _ builtinFunc = &builtinVitessHashSig{} _ builtinFunc = &builtinUUIDToBinSig{} @@ -862,6 +864,47 @@ func (c *isUsedLockFunctionClass) getFunction(ctx sessionctx.Context, args []Exp return nil, errFunctionNotExists.GenWithStackByArgs("FUNCTION", "IS_USED_LOCK") } +type isUUIDFunctionClass struct { + baseFunctionClass +} + +func (c *isUUIDFunctionClass) getFunction(ctx sessionctx.Context, args []Expression) (builtinFunc, error) { + if err := c.verifyArgs(args); err != nil { + return nil, err + } + bf, err := newBaseBuiltinFuncWithTp(ctx, c.funcName, args, types.ETInt, types.ETString) + if err != nil { + return nil, err + } + bf.tp.Flen = 1 + sig := &builtinIsUUIDSig{bf} + sig.setPbCode(tipb.ScalarFuncSig_IsUUID) + return sig, nil +} + +type builtinIsUUIDSig struct { + baseBuiltinFunc +} + +func (b *builtinIsUUIDSig) Clone() builtinFunc { + newSig := &builtinIsUUIDSig{} + newSig.cloneFrom(&b.baseBuiltinFunc) + return newSig +} + +// evalInt evals a builtinIsUUIDSig. +// See https://dev.mysql.com/doc/refman/8.0/en/miscellaneous-functions.html#function_is-uuid +func (b *builtinIsUUIDSig) evalInt(row chunk.Row) (int64, bool, error) { + val, isNull, err := b.args[0].EvalString(b.ctx, row) + if err != nil || isNull { + return 0, isNull, err + } + if _, err = uuid.Parse(val); err != nil { + return 0, false, nil + } + return 1, false, nil +} + type masterPosWaitFunctionClass struct { baseFunctionClass } diff --git a/expression/builtin_miscellaneous_test.go b/expression/builtin_miscellaneous_test.go index 74f5fea43fd02..f125c1b023df3 100644 --- a/expression/builtin_miscellaneous_test.go +++ b/expression/builtin_miscellaneous_test.go @@ -17,17 +17,19 @@ package expression import ( "math" "strings" + "testing" "time" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/testkit/trequire" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" - "github.com/pingcap/tidb/util/testutil" + "github.com/stretchr/testify/require" ) -func (s *testEvaluatorSuite) TestInetAton(c *C) { +func TestInetAton(t *testing.T) { + ctx := createContext(t) tbl := []struct { Input interface{} Expected interface{} @@ -49,16 +51,17 @@ func (s *testEvaluatorSuite) TestInetAton(c *C) { dtbl := tblToDtbl(tbl) fc := funcs[ast.InetAton] - for _, t := range dtbl { - f, err := fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + for _, tt := range dtbl { + f, err := fc.getFunction(ctx, datumsToConstants(tt["Input"])) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d, testutil.DatumEquals, t["Expected"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, tt["Expected"][0], d) } } -func (s *testEvaluatorSuite) TestIsIPv4(c *C) { +func TestIsIPv4(t *testing.T) { + ctx := createContext(t) tests := []struct { ip string expect interface{} @@ -78,46 +81,83 @@ func (s *testEvaluatorSuite) TestIsIPv4(c *C) { fc := funcs[ast.IsIPv4] for _, test := range tests { ip := types.NewStringDatum(test.ip) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{ip})) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{ip})) + require.NoError(t, err) result, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(result, testutil.DatumEquals, types.NewDatum(test.expect)) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(test.expect), result) } // test NULL input for is_ipv4 var argNull types.Datum - f, _ := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{argNull})) + f, _ := fc.getFunction(ctx, datumsToConstants([]types.Datum{argNull})) r, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(r, testutil.DatumEquals, types.NewDatum(0)) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(0), r) } -func (s *testEvaluatorSuite) TestUUID(c *C) { - f, err := newFunctionForTest(s.ctx, ast.UUID) - c.Assert(err, IsNil) +func TestIsUUID(t *testing.T) { + ctx := createContext(t) + tests := []struct { + uuid string + expect interface{} + }{ + {"6ccd780c-baba-1026-9564-5b8c656024db", 1}, + {"6CCD780C-BABA-1026-9564-5B8C656024DB", 1}, + {"6ccd780cbaba102695645b8c656024db", 1}, + {"{6ccd780c-baba-1026-9564-5b8c656024db}", 1}, + {"6ccd780c-baba-1026-9564-5b8c6560", 0}, + {"6CCD780C-BABA-1026-9564-5B8C656024DQ", 0}, + // This is a bug in google/uuid#60 + {"{99a9ad03-5298-11ec-8f5c-00ff90147ac3*", 1}, + // This is a format google/uuid support, while mysql doesn't + {"urn:uuid:99a9ad03-5298-11ec-8f5c-00ff90147ac3", 1}, + } + + fc := funcs[ast.IsUUID] + for _, test := range tests { + uuid := types.NewStringDatum(test.uuid) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{uuid})) + require.NoError(t, err) + result, err := evalBuiltinFunc(f, chunk.Row{}) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(test.expect), result) + } + + var argNull types.Datum + f, _ := fc.getFunction(ctx, datumsToConstants([]types.Datum{argNull})) + r, err := evalBuiltinFunc(f, chunk.Row{}) + require.NoError(t, err) + require.True(t, r.IsNull()) +} + +func TestUUID(t *testing.T) { + ctx := createContext(t) + f, err := newFunctionForTest(ctx, ast.UUID) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) parts := strings.Split(d.GetString(), "-") - c.Assert(len(parts), Equals, 5) + require.Equal(t, 5, len(parts)) for i, p := range parts { switch i { case 0: - c.Assert(len(p), Equals, 8) + require.Equal(t, 8, len(p)) case 1: - c.Assert(len(p), Equals, 4) + require.Equal(t, 4, len(p)) case 2: - c.Assert(len(p), Equals, 4) + require.Equal(t, 4, len(p)) case 3: - c.Assert(len(p), Equals, 4) + require.Equal(t, 4, len(p)) case 4: - c.Assert(len(p), Equals, 12) + require.Equal(t, 12, len(p)) } } - _, err = funcs[ast.UUID].getFunction(s.ctx, s.datumsToConstants(nil)) - c.Assert(err, IsNil) + _, err = funcs[ast.UUID].getFunction(ctx, datumsToConstants(nil)) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestAnyValue(c *C) { +func TestAnyValue(t *testing.T) { + ctx := createContext(t) tbl := []struct { arg interface{} ret interface{} @@ -128,17 +168,18 @@ func (s *testEvaluatorSuite) TestAnyValue(c *C) { {3.1415926, 3.1415926}, {"Hello, World", "Hello, World"}, } - for _, t := range tbl { + for _, tt := range tbl { fc := funcs[ast.AnyValue] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(t.arg))) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(tt.arg))) + require.NoError(t, err) r, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(r, testutil.DatumEquals, types.NewDatum(t.ret)) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(tt.ret), r) } } -func (s *testEvaluatorSuite) TestIsIPv6(c *C) { +func TestIsIPv6(t *testing.T) { + ctx := createContext(t) tests := []struct { ip string expect interface{} @@ -152,21 +193,22 @@ func (s *testEvaluatorSuite) TestIsIPv6(c *C) { fc := funcs[ast.IsIPv6] for _, test := range tests { ip := types.NewStringDatum(test.ip) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{ip})) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{ip})) + require.NoError(t, err) result, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(result, testutil.DatumEquals, types.NewDatum(test.expect)) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(test.expect), result) } // test NULL input for is_ipv6 var argNull types.Datum - f, _ := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{argNull})) + f, _ := fc.getFunction(ctx, datumsToConstants([]types.Datum{argNull})) r, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(r, testutil.DatumEquals, types.NewDatum(0)) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(0), r) } -func (s *testEvaluatorSuite) TestInetNtoa(c *C) { +func TestInetNtoa(t *testing.T) { + ctx := createContext(t) tests := []struct { ip int expect interface{} @@ -181,21 +223,22 @@ func (s *testEvaluatorSuite) TestInetNtoa(c *C) { fc := funcs[ast.InetNtoa] for _, test := range tests { ip := types.NewDatum(test.ip) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{ip})) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{ip})) + require.NoError(t, err) result, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(result, testutil.DatumEquals, types.NewDatum(test.expect)) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(test.expect), result) } var argNull types.Datum - f, _ := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{argNull})) + f, _ := fc.getFunction(ctx, datumsToConstants([]types.Datum{argNull})) r, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(r.IsNull(), IsTrue) + require.NoError(t, err) + require.True(t, r.IsNull()) } -func (s *testEvaluatorSuite) TestInet6NtoA(c *C) { +func TestInet6NtoA(t *testing.T) { + ctx := createContext(t) tests := []struct { ip []byte expect interface{} @@ -218,21 +261,22 @@ func (s *testEvaluatorSuite) TestInet6NtoA(c *C) { fc := funcs[ast.Inet6Ntoa] for _, test := range tests { ip := types.NewDatum(test.ip) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{ip})) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{ip})) + require.NoError(t, err) result, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(result, testutil.DatumEquals, types.NewDatum(test.expect)) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(test.expect), result) } var argNull types.Datum - f, _ := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{argNull})) + f, _ := fc.getFunction(ctx, datumsToConstants([]types.Datum{argNull})) r, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(r.IsNull(), IsTrue) + require.NoError(t, err) + require.True(t, r.IsNull()) } -func (s *testEvaluatorSuite) TestInet6AtoN(c *C) { +func TestInet6AtoN(t *testing.T) { + ctx := createContext(t) tests := []struct { ip string expect interface{} @@ -248,21 +292,22 @@ func (s *testEvaluatorSuite) TestInet6AtoN(c *C) { fc := funcs[ast.Inet6Aton] for _, test := range tests { ip := types.NewDatum(test.ip) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{ip})) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{ip})) + require.NoError(t, err) result, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(result, testutil.DatumEquals, types.NewDatum(test.expect)) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(test.expect), result) } var argNull types.Datum - f, _ := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{argNull})) + f, _ := fc.getFunction(ctx, datumsToConstants([]types.Datum{argNull})) r, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(r.IsNull(), IsTrue) + require.NoError(t, err) + require.True(t, r.IsNull()) } -func (s *testEvaluatorSuite) TestIsIPv4Mapped(c *C) { +func TestIsIPv4Mapped(t *testing.T) { + ctx := createContext(t) tests := []struct { ip []byte expect interface{} @@ -276,21 +321,22 @@ func (s *testEvaluatorSuite) TestIsIPv4Mapped(c *C) { fc := funcs[ast.IsIPv4Mapped] for _, test := range tests { ip := types.NewDatum(test.ip) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{ip})) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{ip})) + require.NoError(t, err) result, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(result, testutil.DatumEquals, types.NewDatum(test.expect)) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(test.expect), result) } var argNull types.Datum - f, _ := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{argNull})) + f, _ := fc.getFunction(ctx, datumsToConstants([]types.Datum{argNull})) r, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(r, testutil.DatumEquals, types.NewDatum(int64(0))) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(int64(0)), r) } -func (s *testEvaluatorSuite) TestIsIPv4Compat(c *C) { +func TestIsIPv4Compat(t *testing.T) { + ctx := createContext(t) tests := []struct { ip []byte expect interface{} @@ -305,21 +351,22 @@ func (s *testEvaluatorSuite) TestIsIPv4Compat(c *C) { fc := funcs[ast.IsIPv4Compat] for _, test := range tests { ip := types.NewDatum(test.ip) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{ip})) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{ip})) + require.NoError(t, err) result, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(result, testutil.DatumEquals, types.NewDatum(test.expect)) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(test.expect), result) } var argNull types.Datum - f, _ := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{argNull})) + f, _ := fc.getFunction(ctx, datumsToConstants([]types.Datum{argNull})) r, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(r, testutil.DatumEquals, types.NewDatum(0)) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(0), r) } -func (s *testEvaluatorSuite) TestNameConst(c *C) { +func TestNameConst(t *testing.T) { + ctx := createContext(t) dec := types.NewDecFromFloatForTest(123.123) tm := types.NewTime(types.FromGoTime(time.Now()), mysql.TypeDatetime, 6) du := types.Duration{Duration: 12*time.Hour + 1*time.Minute + 1*time.Second, Fsp: types.DefaultFsp} @@ -330,38 +377,39 @@ func (s *testEvaluatorSuite) TestNameConst(c *C) { asserts func(d types.Datum) }{ {"test_int", 3, false, func(d types.Datum) { - c.Assert(d.GetInt64(), Equals, int64(3)) + require.Equal(t, int64(3), d.GetInt64()) }}, {"test_float", 3.14159, false, func(d types.Datum) { - c.Assert(d.GetFloat64(), Equals, 3.14159) + require.Equal(t, 3.14159, d.GetFloat64()) }}, {"test_string", "TiDB", false, func(d types.Datum) { - c.Assert(d.GetString(), Equals, "TiDB") + require.Equal(t, "TiDB", d.GetString()) }}, {"test_null", nil, true, func(d types.Datum) { - c.Assert(d.Kind(), Equals, types.KindNull) + require.Equal(t, types.KindNull, d.Kind()) }}, {"test_decimal", dec, false, func(d types.Datum) { - c.Assert(d.GetMysqlDecimal().String(), Equals, dec.String()) + require.Equal(t, dec.String(), d.GetMysqlDecimal().String()) }}, {"test_time", tm, false, func(d types.Datum) { - c.Assert(d.GetMysqlTime().String(), Equals, tm.String()) + require.Equal(t, tm.String(), d.GetMysqlTime().String()) }}, {"test_duration", du, false, func(d types.Datum) { - c.Assert(d.GetMysqlDuration().String(), Equals, du.String()) + require.Equal(t, du.String(), d.GetMysqlDuration().String()) }}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.NameConst, s.primitiveValsToConstants([]interface{}{t.colName, t.arg})...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.NameConst, primitiveValsToConstants(ctx, []interface{}{c.colName, c.arg})...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - c.Assert(err, IsNil) - t.asserts(d) + require.NoError(t, err) + c.asserts(d) } } -func (s *testEvaluatorSuite) TestUUIDToBin(c *C) { +func TestUUIDToBin(t *testing.T) { + ctx := createContext(t) tests := []struct { args []interface{} expect interface{} @@ -435,31 +483,32 @@ func (s *testEvaluatorSuite) TestUUIDToBin(c *C) { } for _, test := range tests { - preWarningCnt := s.ctx.GetSessionVars().StmtCtx.WarningCount() - f, err := newFunctionForTest(s.ctx, ast.UUIDToBin, s.primitiveValsToConstants(test.args)...) - c.Assert(err, IsNil) + preWarningCnt := ctx.GetSessionVars().StmtCtx.WarningCount() + f, err := newFunctionForTest(ctx, ast.UUIDToBin, primitiveValsToConstants(ctx, test.args)...) + require.NoError(t, err) result, err := f.Eval(chunk.Row{}) if test.getError { - c.Assert(err, NotNil) + require.Error(t, err) } else if test.getWarning { - c.Assert(err, IsNil) - c.Assert(s.ctx.GetSessionVars().StmtCtx.WarningCount(), Equals, preWarningCnt+1) + require.NoError(t, err) + require.Equal(t, preWarningCnt+1, ctx.GetSessionVars().StmtCtx.WarningCount()) } else { - c.Assert(err, IsNil) + require.NoError(t, err) if test.isNil { - c.Assert(result.Kind(), Equals, types.KindNull) + require.Equal(t, types.KindNull, result.Kind()) } else { - c.Assert(result, testutil.DatumEquals, types.NewDatum(test.expect)) + trequire.DatumEqual(t, types.NewDatum(test.expect), result) } } } - _, err := funcs[ast.UUIDToBin].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.UUIDToBin].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestBinToUUID(c *C) { +func TestBinToUUID(t *testing.T) { + ctx := createContext(t) tests := []struct { args []interface{} expect string @@ -505,26 +554,26 @@ func (s *testEvaluatorSuite) TestBinToUUID(c *C) { } for _, test := range tests { - preWarningCnt := s.ctx.GetSessionVars().StmtCtx.WarningCount() - f, err := newFunctionForTest(s.ctx, ast.BinToUUID, s.primitiveValsToConstants(test.args)...) - c.Assert(err, IsNil) + preWarningCnt := ctx.GetSessionVars().StmtCtx.WarningCount() + f, err := newFunctionForTest(ctx, ast.BinToUUID, primitiveValsToConstants(ctx, test.args)...) + require.NoError(t, err) result, err := f.Eval(chunk.Row{}) if test.getError { - c.Assert(err, NotNil) + require.Error(t, err) } else if test.getWarning { - c.Assert(err, IsNil) - c.Assert(s.ctx.GetSessionVars().StmtCtx.WarningCount(), Equals, preWarningCnt+1) + require.NoError(t, err) + require.Equal(t, preWarningCnt+1, ctx.GetSessionVars().StmtCtx.WarningCount()) } else { - c.Assert(err, IsNil) + require.NoError(t, err) if test.isNil { - c.Assert(result.Kind(), Equals, types.KindNull) + require.Equal(t, types.KindNull, result.Kind()) } else { - c.Assert(result.GetString(), Equals, test.expect) + require.Equal(t, test.expect, result.GetString()) } } } - _, err := funcs[ast.BinToUUID].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.BinToUUID].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) } diff --git a/expression/builtin_miscellaneous_vec.go b/expression/builtin_miscellaneous_vec.go index 4ffad69ad8660..6e4b16c4cb7dd 100644 --- a/expression/builtin_miscellaneous_vec.go +++ b/expression/builtin_miscellaneous_vec.go @@ -154,6 +154,36 @@ func (b *builtinIsIPv6Sig) vecEvalInt(input *chunk.Chunk, result *chunk.Column) return nil } +func (b *builtinIsUUIDSig) vectorized() bool { + return true +} + +func (b *builtinIsUUIDSig) vecEvalInt(input *chunk.Chunk, result *chunk.Column) error { + n := input.NumRows() + buf, err := b.bufAllocator.get() + if err != nil { + return err + } + defer b.bufAllocator.put(buf) + if err := b.args[0].VecEvalString(b.ctx, input, buf); err != nil { + return err + } + result.ResizeInt64(n, false) + i64s := result.Int64s() + result.MergeNulls(buf) + for i := 0; i < n; i++ { + if result.IsNull(i) { + continue + } + if _, err = uuid.Parse(buf.GetString(i)); err != nil { + i64s[i] = 0 + } else { + i64s[i] = 1 + } + } + return nil +} + func (b *builtinNameConstStringSig) vectorized() bool { return true } diff --git a/expression/builtin_miscellaneous_vec_test.go b/expression/builtin_miscellaneous_vec_test.go index 1a3d25c9f577c..386f7bc423878 100644 --- a/expression/builtin_miscellaneous_vec_test.go +++ b/expression/builtin_miscellaneous_vec_test.go @@ -19,11 +19,11 @@ import ( "testing" "time" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/mock" + "github.com/stretchr/testify/require" ) var vecBuiltinMiscellaneousCases = map[string][]vecExprBenchCase{ @@ -108,14 +108,17 @@ var vecBuiltinMiscellaneousCases = map[string][]vecExprBenchCase{ {retEvalType: types.ETString, childrenTypes: []types.EvalType{types.ETString}, geners: []dataGenerator{&uuidBinGener{newDefaultRandGen()}}}, {retEvalType: types.ETString, childrenTypes: []types.EvalType{types.ETString, types.ETInt}, geners: []dataGenerator{&uuidBinGener{newDefaultRandGen()}}}, }, + ast.IsUUID: { + {retEvalType: types.ETInt, childrenTypes: []types.EvalType{types.ETString}, geners: []dataGenerator{&uuidStrGener{newDefaultRandGen()}}}, + }, } -func (s *testEvaluatorSuite) TestVectorizedBuiltinMiscellaneousEvalOneVec(c *C) { - testVectorizedEvalOneVec(c, vecBuiltinMiscellaneousCases) +func TestVectorizedBuiltinMiscellaneousEvalOneVec(t *testing.T) { + testVectorizedEvalOneVec(t, vecBuiltinMiscellaneousCases) } -func (s *testEvaluatorSuite) TestVectorizedBuiltinMiscellaneousFunc(c *C) { - testVectorizedBuiltinFunc(c, vecBuiltinMiscellaneousCases) +func TestVectorizedBuiltinMiscellaneousFunc(t *testing.T) { + testVectorizedBuiltinFunc(t, vecBuiltinMiscellaneousCases) } func BenchmarkVectorizedBuiltinMiscellaneousEvalOneVec(b *testing.B) { @@ -135,7 +138,7 @@ func (c *counter) add(diff int) int { return c.count } -func (s *testEvaluatorSuite) TestSleepVectorized(c *C) { +func TestSleepVectorized(t *testing.T) { ctx := mock.NewContext() sessVars := ctx.GetSessionVars() @@ -143,7 +146,7 @@ func (s *testEvaluatorSuite) TestSleepVectorized(c *C) { ft := eType2FieldType(types.ETReal) col0 := &Column{RetType: ft, Index: 0} f, err := fc.getFunction(ctx, []Expression{col0}) - c.Assert(err, IsNil) + require.NoError(t, err) input := chunk.NewChunkWithCapacity([]*types.FieldType{ft}, 1024) result := chunk.NewColumn(ft, 1024) warnCnt := counter{} @@ -152,59 +155,59 @@ func (s *testEvaluatorSuite) TestSleepVectorized(c *C) { sessVars.StrictSQLMode = false input.AppendFloat64(0, 1) err = f.vecEvalInt(input, result) - c.Assert(err, IsNil) - c.Assert(result.GetInt64(0), Equals, int64(0)) - c.Assert(sessVars.StmtCtx.WarningCount(), Equals, uint16(warnCnt.add(0))) + require.NoError(t, err) + require.Equal(t, int64(0), result.GetInt64(0)) + require.Equal(t, uint16(warnCnt.add(0)), sessVars.StmtCtx.WarningCount()) input.Reset() input.AppendFloat64(0, -1) err = f.vecEvalInt(input, result) - c.Assert(err, IsNil) - c.Assert(result.GetInt64(0), Equals, int64(0)) - c.Assert(sessVars.StmtCtx.WarningCount(), Equals, uint16(warnCnt.add(1))) + require.NoError(t, err) + require.Equal(t, int64(0), result.GetInt64(0)) + require.Equal(t, uint16(warnCnt.add(1)), sessVars.StmtCtx.WarningCount()) input.Reset() input.AppendNull(0) err = f.vecEvalInt(input, result) - c.Assert(err, IsNil) - c.Assert(result.GetInt64(0), Equals, int64(0)) - c.Assert(sessVars.StmtCtx.WarningCount(), Equals, uint16(warnCnt.add(1))) + require.NoError(t, err) + require.Equal(t, int64(0), result.GetInt64(0)) + require.Equal(t, uint16(warnCnt.add(1)), sessVars.StmtCtx.WarningCount()) input.Reset() input.AppendNull(0) input.AppendFloat64(0, 1) input.AppendFloat64(0, -1) err = f.vecEvalInt(input, result) - c.Assert(err, IsNil) - c.Assert(result.GetInt64(0), Equals, int64(0)) - c.Assert(result.GetInt64(1), Equals, int64(0)) - c.Assert(result.GetInt64(2), Equals, int64(0)) - c.Assert(sessVars.StmtCtx.WarningCount(), Equals, uint16(warnCnt.add(2))) + require.NoError(t, err) + require.Equal(t, int64(0), result.GetInt64(0)) + require.Equal(t, int64(0), result.GetInt64(1)) + require.Equal(t, int64(0), result.GetInt64(2)) + require.Equal(t, uint16(warnCnt.add(2)), sessVars.StmtCtx.WarningCount()) // for error case under the strict model sessVars.StrictSQLMode = true input.Reset() input.AppendNull(0) err = f.vecEvalInt(input, result) - c.Assert(err, NotNil) - c.Assert(result.GetInt64(0), Equals, int64(0)) + require.Error(t, err) + require.Equal(t, int64(0), result.GetInt64(0)) sessVars.StmtCtx.SetWarnings(nil) input.Reset() input.AppendFloat64(0, -2.5) err = f.vecEvalInt(input, result) - c.Assert(err, NotNil) - c.Assert(result.GetInt64(0), Equals, int64(0)) + require.Error(t, err) + require.Equal(t, int64(0), result.GetInt64(0)) // strict model input.Reset() input.AppendFloat64(0, 0.5) start := time.Now() err = f.vecEvalInt(input, result) - c.Assert(err, IsNil) - c.Assert(result.GetInt64(0), Equals, int64(0)) + require.NoError(t, err) + require.Equal(t, int64(0), result.GetInt64(0)) sub := time.Since(start) - c.Assert(sub.Nanoseconds(), GreaterEqual, int64(0.5*1e9)) + require.GreaterOrEqual(t, sub.Nanoseconds(), int64(0.5*1e9)) input.Reset() input.AppendFloat64(0, 0.01) @@ -217,10 +220,10 @@ func (s *testEvaluatorSuite) TestSleepVectorized(c *C) { }() err = f.vecEvalInt(input, result) sub = time.Since(start) - c.Assert(err, IsNil) - c.Assert(result.GetInt64(0), Equals, int64(0)) - c.Assert(result.GetInt64(1), Equals, int64(1)) - c.Assert(result.GetInt64(2), Equals, int64(1)) - c.Assert(sub.Nanoseconds(), LessEqual, int64(2*1e9)) - c.Assert(sub.Nanoseconds(), GreaterEqual, int64(1*1e9)) + require.NoError(t, err) + require.Equal(t, int64(0), result.GetInt64(0)) + require.Equal(t, int64(1), result.GetInt64(1)) + require.Equal(t, int64(1), result.GetInt64(2)) + require.LessOrEqual(t, sub.Nanoseconds(), int64(2*1e9)) + require.GreaterOrEqual(t, sub.Nanoseconds(), int64(1*1e9)) } diff --git a/expression/builtin_op_test.go b/expression/builtin_op_test.go index 88b762b5e3de7..2e05b314d457c 100644 --- a/expression/builtin_op_test.go +++ b/expression/builtin_op_test.go @@ -16,17 +16,19 @@ package expression import ( "math" + "testing" - . "github.com/pingcap/check" "github.com/pingcap/errors" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/testkit/trequire" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" - "github.com/pingcap/tidb/util/testutil" + "github.com/stretchr/testify/require" ) -func (s *testEvaluatorSuite) TestUnary(c *C) { +func TestUnary(t *testing.T) { + ctx := createContext(t) cases := []struct { args interface{} expected interface{} @@ -38,35 +40,36 @@ func (s *testEvaluatorSuite) TestUnary(c *C) { {uint64(9223372036854775808), int64(-9223372036854775808), false, false}, {int64(math.MinInt64), "9223372036854775808", true, false}, // --9223372036854775808 } - sc := s.ctx.GetSessionVars().StmtCtx + sc := ctx.GetSessionVars().StmtCtx origin := sc.InSelectStmt sc.InSelectStmt = true defer func() { sc.InSelectStmt = origin }() - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.UnaryMinus, s.primitiveValsToConstants([]interface{}{t.args})...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.UnaryMinus, primitiveValsToConstants(ctx, []interface{}{c.args})...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if !t.getErr { - c.Assert(err, IsNil) - if !t.overflow { - c.Assert(d.GetValue(), Equals, t.expected) + if !c.getErr { + require.NoError(t, err) + if !c.overflow { + require.Equal(t, c.expected, d.GetValue()) } else { - c.Assert(d.GetMysqlDecimal().String(), Equals, t.expected) + require.Equal(t, c.expected, d.GetMysqlDecimal().String()) } } else { - c.Assert(err, NotNil) + require.Error(t, err) } } - _, err := funcs[ast.UnaryMinus].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.UnaryMinus].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestLogicAnd(c *C) { - sc := s.ctx.GetSessionVars().StmtCtx +func TestLogicAnd(t *testing.T) { + ctx := createContext(t) + sc := ctx.GetSessionVars().StmtCtx origin := sc.IgnoreTruncate defer func() { sc.IgnoreTruncate = origin @@ -103,31 +106,32 @@ func (s *testEvaluatorSuite) TestLogicAnd(c *C) { {[]interface{}{errors.New("must error"), 1}, 0, false, true}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.LogicAnd, s.primitiveValsToConstants(t.args)...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.LogicAnd, primitiveValsToConstants(ctx, c.args)...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetInt64(), Equals, t.expected) + require.Equal(t, c.expected, d.GetInt64()) } } } // Test incorrect parameter count. - _, err := newFunctionForTest(s.ctx, ast.LogicAnd, NewZero()) - c.Assert(err, NotNil) + _, err := newFunctionForTest(ctx, ast.LogicAnd, NewZero()) + require.Error(t, err) - _, err = funcs[ast.LogicAnd].getFunction(s.ctx, []Expression{NewZero(), NewZero()}) - c.Assert(err, IsNil) + _, err = funcs[ast.LogicAnd].getFunction(ctx, []Expression{NewZero(), NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestLeftShift(c *C) { +func TestLeftShift(t *testing.T) { + ctx := createContext(t) cases := []struct { args []interface{} expected uint64 @@ -141,24 +145,25 @@ func (s *testEvaluatorSuite) TestLeftShift(c *C) { {[]interface{}{errors.New("must error"), 1}, 0, false, true}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.LeftShift, s.primitiveValsToConstants(t.args)...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.LeftShift, primitiveValsToConstants(ctx, c.args)...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetUint64(), Equals, t.expected) + require.Equal(t, c.expected, d.GetUint64()) } } } } -func (s *testEvaluatorSuite) TestRightShift(c *C) { +func TestRightShift(t *testing.T) { + ctx := createContext(t) cases := []struct { args []interface{} expected uint64 @@ -172,31 +177,32 @@ func (s *testEvaluatorSuite) TestRightShift(c *C) { {[]interface{}{errors.New("must error"), 1}, 0, false, true}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.RightShift, s.primitiveValsToConstants(t.args)...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.RightShift, primitiveValsToConstants(ctx, c.args)...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetUint64(), Equals, t.expected) + require.Equal(t, c.expected, d.GetUint64()) } } } // Test incorrect parameter count. - _, err := newFunctionForTest(s.ctx, ast.RightShift, NewZero()) - c.Assert(err, NotNil) + _, err := newFunctionForTest(ctx, ast.RightShift, NewZero()) + require.Error(t, err) - _, err = funcs[ast.RightShift].getFunction(s.ctx, []Expression{NewZero(), NewZero()}) - c.Assert(err, IsNil) + _, err = funcs[ast.RightShift].getFunction(ctx, []Expression{NewZero(), NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestBitXor(c *C) { +func TestBitXor(t *testing.T) { + ctx := createContext(t) cases := []struct { args []interface{} expected uint64 @@ -210,32 +216,33 @@ func (s *testEvaluatorSuite) TestBitXor(c *C) { {[]interface{}{errors.New("must error"), 1}, 0, false, true}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.Xor, s.primitiveValsToConstants(t.args)...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.Xor, primitiveValsToConstants(ctx, c.args)...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetUint64(), Equals, t.expected) + require.Equal(t, c.expected, d.GetUint64()) } } } // Test incorrect parameter count. - _, err := newFunctionForTest(s.ctx, ast.Xor, NewZero()) - c.Assert(err, NotNil) + _, err := newFunctionForTest(ctx, ast.Xor, NewZero()) + require.Error(t, err) - _, err = funcs[ast.Xor].getFunction(s.ctx, []Expression{NewZero(), NewZero()}) - c.Assert(err, IsNil) + _, err = funcs[ast.Xor].getFunction(ctx, []Expression{NewZero(), NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestBitOr(c *C) { - sc := s.ctx.GetSessionVars().StmtCtx +func TestBitOr(t *testing.T) { + ctx := createContext(t) + sc := ctx.GetSessionVars().StmtCtx origin := sc.IgnoreTruncate defer func() { sc.IgnoreTruncate = origin @@ -255,32 +262,33 @@ func (s *testEvaluatorSuite) TestBitOr(c *C) { {[]interface{}{errors.New("must error"), 1}, 0, false, true}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.Or, s.primitiveValsToConstants(t.args)...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.Or, primitiveValsToConstants(ctx, c.args)...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetUint64(), Equals, t.expected) + require.Equal(t, c.expected, d.GetUint64()) } } } // Test incorrect parameter count. - _, err := newFunctionForTest(s.ctx, ast.Or, NewZero()) - c.Assert(err, NotNil) + _, err := newFunctionForTest(ctx, ast.Or, NewZero()) + require.Error(t, err) - _, err = funcs[ast.Or].getFunction(s.ctx, []Expression{NewZero(), NewZero()}) - c.Assert(err, IsNil) + _, err = funcs[ast.Or].getFunction(ctx, []Expression{NewZero(), NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestLogicOr(c *C) { - sc := s.ctx.GetSessionVars().StmtCtx +func TestLogicOr(t *testing.T) { + ctx := createContext(t) + sc := ctx.GetSessionVars().StmtCtx origin := sc.IgnoreTruncate defer func() { sc.IgnoreTruncate = origin @@ -321,31 +329,32 @@ func (s *testEvaluatorSuite) TestLogicOr(c *C) { {[]interface{}{errors.New("must error"), 1}, 0, false, true}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.LogicOr, s.primitiveValsToConstants(t.args)...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.LogicOr, primitiveValsToConstants(ctx, c.args)...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetInt64(), Equals, t.expected) + require.Equal(t, c.expected, d.GetInt64()) } } } // Test incorrect parameter count. - _, err := newFunctionForTest(s.ctx, ast.LogicOr, NewZero()) - c.Assert(err, NotNil) + _, err := newFunctionForTest(ctx, ast.LogicOr, NewZero()) + require.Error(t, err) - _, err = funcs[ast.LogicOr].getFunction(s.ctx, []Expression{NewZero(), NewZero()}) - c.Assert(err, IsNil) + _, err = funcs[ast.LogicOr].getFunction(ctx, []Expression{NewZero(), NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestBitAnd(c *C) { +func TestBitAnd(t *testing.T) { + ctx := createContext(t) cases := []struct { args []interface{} expected int64 @@ -359,32 +368,33 @@ func (s *testEvaluatorSuite) TestBitAnd(c *C) { {[]interface{}{errors.New("must error"), 1}, 0, false, true}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.And, s.primitiveValsToConstants(t.args)...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.And, primitiveValsToConstants(ctx, c.args)...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetInt64(), Equals, t.expected) + require.Equal(t, c.expected, d.GetInt64()) } } } // Test incorrect parameter count. - _, err := newFunctionForTest(s.ctx, ast.And, NewZero()) - c.Assert(err, NotNil) + _, err := newFunctionForTest(ctx, ast.And, NewZero()) + require.Error(t, err) - _, err = funcs[ast.And].getFunction(s.ctx, []Expression{NewZero(), NewZero()}) - c.Assert(err, IsNil) + _, err = funcs[ast.And].getFunction(ctx, []Expression{NewZero(), NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestBitNeg(c *C) { - sc := s.ctx.GetSessionVars().StmtCtx +func TestBitNeg(t *testing.T) { + ctx := createContext(t) + sc := ctx.GetSessionVars().StmtCtx origin := sc.IgnoreTruncate defer func() { sc.IgnoreTruncate = origin @@ -404,32 +414,33 @@ func (s *testEvaluatorSuite) TestBitNeg(c *C) { {[]interface{}{errors.New("must error")}, 0, false, true}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.BitNeg, s.primitiveValsToConstants(t.args)...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.BitNeg, primitiveValsToConstants(ctx, c.args)...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetUint64(), Equals, t.expected) + require.Equal(t, c.expected, d.GetUint64()) } } } // Test incorrect parameter count. - _, err := newFunctionForTest(s.ctx, ast.BitNeg, NewZero(), NewZero()) - c.Assert(err, NotNil) + _, err := newFunctionForTest(ctx, ast.BitNeg, NewZero(), NewZero()) + require.Error(t, err) - _, err = funcs[ast.BitNeg].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err = funcs[ast.BitNeg].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestUnaryNot(c *C) { - sc := s.ctx.GetSessionVars().StmtCtx +func TestUnaryNot(t *testing.T) { + ctx := createContext(t) + sc := ctx.GetSessionVars().StmtCtx origin := sc.IgnoreTruncate defer func() { sc.IgnoreTruncate = origin @@ -455,32 +466,33 @@ func (s *testEvaluatorSuite) TestUnaryNot(c *C) { {[]interface{}{errors.New("must error")}, 0, false, true}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.UnaryNot, s.primitiveValsToConstants(t.args)...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.UnaryNot, primitiveValsToConstants(ctx, c.args)...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetInt64(), Equals, t.expected) + require.Equal(t, c.expected, d.GetInt64()) } } } // Test incorrect parameter count. - _, err := newFunctionForTest(s.ctx, ast.UnaryNot, NewZero(), NewZero()) - c.Assert(err, NotNil) + _, err := newFunctionForTest(ctx, ast.UnaryNot, NewZero(), NewZero()) + require.Error(t, err) - _, err = funcs[ast.UnaryNot].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err = funcs[ast.UnaryNot].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestIsTrueOrFalse(c *C) { - sc := s.ctx.GetSessionVars().StmtCtx +func TestIsTrueOrFalse(t *testing.T) { + ctx := createContext(t) + sc := ctx.GetSessionVars().StmtCtx origin := sc.IgnoreTruncate defer func() { sc.IgnoreTruncate = origin @@ -565,28 +577,29 @@ func (s *testEvaluatorSuite) TestIsTrueOrFalse(c *C) { } for _, tc := range testCases { - isTrueSig, err := funcs[ast.IsTruthWithoutNull].getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(tc.args...))) - c.Assert(err, IsNil) - c.Assert(isTrueSig, NotNil) + isTrueSig, err := funcs[ast.IsTruthWithoutNull].getFunction(ctx, datumsToConstants(types.MakeDatums(tc.args...))) + require.NoError(t, err) + require.NotNil(t, isTrueSig) isTrue, err := evalBuiltinFunc(isTrueSig, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(isTrue, testutil.DatumEquals, types.NewDatum(tc.isTrue)) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(tc.isTrue), isTrue) } for _, tc := range testCases { - isFalseSig, err := funcs[ast.IsFalsity].getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(tc.args...))) - c.Assert(err, IsNil) - c.Assert(isFalseSig, NotNil) + isFalseSig, err := funcs[ast.IsFalsity].getFunction(ctx, datumsToConstants(types.MakeDatums(tc.args...))) + require.NoError(t, err) + require.NotNil(t, isFalseSig) isFalse, err := evalBuiltinFunc(isFalseSig, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(isFalse, testutil.DatumEquals, types.NewDatum(tc.isFalse)) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(tc.isFalse), isFalse) } } -func (s *testEvaluatorSuite) TestLogicXor(c *C) { - sc := s.ctx.GetSessionVars().StmtCtx +func TestLogicXor(t *testing.T) { + ctx := createContext(t) + sc := ctx.GetSessionVars().StmtCtx origin := sc.IgnoreTruncate defer func() { sc.IgnoreTruncate = origin @@ -624,26 +637,26 @@ func (s *testEvaluatorSuite) TestLogicXor(c *C) { {[]interface{}{errors.New("must error"), 1}, 0, false, true}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.LogicXor, s.primitiveValsToConstants(t.args)...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.LogicXor, primitiveValsToConstants(ctx, c.args)...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetInt64(), Equals, t.expected) + require.Equal(t, c.expected, d.GetInt64()) } } } // Test incorrect parameter count. - _, err := newFunctionForTest(s.ctx, ast.LogicXor, NewZero()) - c.Assert(err, NotNil) + _, err := newFunctionForTest(ctx, ast.LogicXor, NewZero()) + require.Error(t, err) - _, err = funcs[ast.LogicXor].getFunction(s.ctx, []Expression{NewZero(), NewZero()}) - c.Assert(err, IsNil) + _, err = funcs[ast.LogicXor].getFunction(ctx, []Expression{NewZero(), NewZero()}) + require.NoError(t, err) } diff --git a/expression/builtin_op_vec_test.go b/expression/builtin_op_vec_test.go index a9ded212ba867..01b4ff2d0cc52 100644 --- a/expression/builtin_op_vec_test.go +++ b/expression/builtin_op_vec_test.go @@ -18,12 +18,12 @@ import ( "math" "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/mock" + "github.com/stretchr/testify/require" ) var vecBuiltinOpCases = map[string][]vecExprBenchCase{ @@ -152,44 +152,44 @@ func makeBinaryLogicOpDataGeners() []dataGenerator { makeGivenValsOrDefaultGener(arg1s, types.ETInt)} } -func (s *testEvaluatorSuite) TestVectorizedBuiltinOpFunc(c *C) { - testVectorizedBuiltinFunc(c, vecBuiltinOpCases) +func TestVectorizedBuiltinOpFunc(t *testing.T) { + testVectorizedBuiltinFunc(t, vecBuiltinOpCases) } func BenchmarkVectorizedBuiltinOpFunc(b *testing.B) { benchmarkVectorizedBuiltinFunc(b, vecBuiltinOpCases) } -func (s *testEvaluatorSuite) TestBuiltinUnaryMinusIntSig(c *C) { +func TestBuiltinUnaryMinusIntSig(t *testing.T) { ctx := mock.NewContext() ft := eType2FieldType(types.ETInt) col0 := &Column{RetType: ft, Index: 0} f, err := funcs[ast.UnaryMinus].getFunction(ctx, []Expression{col0}) - c.Assert(err, IsNil) + require.NoError(t, err) input := chunk.NewChunkWithCapacity([]*types.FieldType{ft}, 1024) result := chunk.NewColumn(ft, 1024) - c.Assert(mysql.HasUnsignedFlag(col0.GetType().Flag), IsFalse) + require.False(t, mysql.HasUnsignedFlag(col0.GetType().Flag)) input.AppendInt64(0, 233333) - c.Assert(f.vecEvalInt(input, result), IsNil) - c.Assert(result.GetInt64(0), Equals, int64(-233333)) + require.Nil(t, f.vecEvalInt(input, result)) + require.Equal(t, int64(-233333), result.GetInt64(0)) input.Reset() input.AppendInt64(0, math.MinInt64) - c.Assert(f.vecEvalInt(input, result), NotNil) + require.NotNil(t, f.vecEvalInt(input, result)) input.Column(0).SetNull(0, true) - c.Assert(f.vecEvalInt(input, result), IsNil) - c.Assert(result.IsNull(0), IsTrue) + require.NoError(t, f.vecEvalInt(input, result)) + require.True(t, result.IsNull(0)) col0.GetType().Flag |= mysql.UnsignedFlag - c.Assert(mysql.HasUnsignedFlag(col0.GetType().Flag), IsTrue) + require.True(t, mysql.HasUnsignedFlag(col0.GetType().Flag)) input.Reset() input.AppendUint64(0, 233333) - c.Assert(f.vecEvalInt(input, result), IsNil) - c.Assert(result.GetInt64(0), Equals, int64(-233333)) + require.NoError(t, f.vecEvalInt(input, result)) + require.Equal(t, int64(-233333), result.GetInt64(0)) input.Reset() input.AppendUint64(0, -(math.MinInt64)+1) - c.Assert(f.vecEvalInt(input, result), NotNil) + require.NotNil(t, f.vecEvalInt(input, result)) input.Column(0).SetNull(0, true) - c.Assert(f.vecEvalInt(input, result), IsNil) - c.Assert(result.IsNull(0), IsTrue) + require.NoError(t, f.vecEvalInt(input, result)) + require.True(t, result.IsNull(0)) } diff --git a/expression/builtin_other_serial_test.go b/expression/builtin_other_serial_test.go new file mode 100644 index 0000000000000..7bfa10d547a30 --- /dev/null +++ b/expression/builtin_other_serial_test.go @@ -0,0 +1,101 @@ +// Copyright 2021 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, +// 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. + +package expression + +import ( + "math" + "testing" + "time" + + "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/types/json" + "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/collate" + "github.com/pingcap/tidb/util/hack" + "github.com/stretchr/testify/require" +) + +func TestInFunc(t *testing.T) { + ctx := createContext(t) + fc := funcs[ast.In] + decimal1 := types.NewDecFromFloatForTest(123.121) + decimal2 := types.NewDecFromFloatForTest(123.122) + decimal3 := types.NewDecFromFloatForTest(123.123) + decimal4 := types.NewDecFromFloatForTest(123.124) + time1 := types.NewTime(types.FromGoTime(time.Date(2017, 1, 1, 1, 1, 1, 1, time.UTC)), mysql.TypeDatetime, 6) + time2 := types.NewTime(types.FromGoTime(time.Date(2017, 1, 2, 1, 1, 1, 1, time.UTC)), mysql.TypeDatetime, 6) + time3 := types.NewTime(types.FromGoTime(time.Date(2017, 1, 3, 1, 1, 1, 1, time.UTC)), mysql.TypeDatetime, 6) + time4 := types.NewTime(types.FromGoTime(time.Date(2017, 1, 4, 1, 1, 1, 1, time.UTC)), mysql.TypeDatetime, 6) + duration1 := types.Duration{Duration: 12*time.Hour + 1*time.Minute + 1*time.Second} + duration2 := types.Duration{Duration: 12*time.Hour + 1*time.Minute} + duration3 := types.Duration{Duration: 12*time.Hour + 1*time.Second} + duration4 := types.Duration{Duration: 12 * time.Hour} + json1 := json.CreateBinary("123") + json2 := json.CreateBinary("123.1") + json3 := json.CreateBinary("123.2") + json4 := json.CreateBinary("123.3") + testCases := []struct { + args []interface{} + res interface{} + }{ + {[]interface{}{1, 1, 2, 3}, int64(1)}, + {[]interface{}{1, 0, 2, 3}, int64(0)}, + {[]interface{}{1, nil, 2, 3}, nil}, + {[]interface{}{nil, nil, 2, 3}, nil}, + {[]interface{}{uint64(0), 0, 2, 3}, int64(1)}, + {[]interface{}{uint64(math.MaxUint64), uint64(math.MaxUint64), 2, 3}, int64(1)}, + {[]interface{}{-1, uint64(math.MaxUint64), 2, 3}, int64(0)}, + {[]interface{}{uint64(math.MaxUint64), -1, 2, 3}, int64(0)}, + {[]interface{}{1, 0, 2, 3}, int64(0)}, + {[]interface{}{1.1, 1.2, 1.3}, int64(0)}, + {[]interface{}{1.1, 1.1, 1.2, 1.3}, int64(1)}, + {[]interface{}{decimal1, decimal2, decimal3, decimal4}, int64(0)}, + {[]interface{}{decimal1, decimal2, decimal3, decimal1}, int64(1)}, + {[]interface{}{"1.1", "1.1", "1.2", "1.3"}, int64(1)}, + {[]interface{}{"1.1", hack.Slice("1.1"), "1.2", "1.3"}, int64(1)}, + {[]interface{}{hack.Slice("1.1"), "1.1", "1.2", "1.3"}, int64(1)}, + {[]interface{}{time1, time2, time3, time1}, int64(1)}, + {[]interface{}{time1, time2, time3, time4}, int64(0)}, + {[]interface{}{duration1, duration2, duration3, duration4}, int64(0)}, + {[]interface{}{duration1, duration2, duration1, duration4}, int64(1)}, + {[]interface{}{json1, json2, json3, json4}, int64(0)}, + {[]interface{}{json1, json1, json3, json4}, int64(1)}, + } + for _, tc := range testCases { + fn, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(tc.args...))) + require.NoError(t, err) + d, err := evalBuiltinFunc(fn, chunk.MutRowFromDatums(types.MakeDatums(tc.args...)).ToRow()) + require.NoError(t, err) + require.Equalf(t, tc.res, d.GetValue(), "%v", types.MakeDatums(tc.args)) + } + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + strD1 := types.NewCollationStringDatum("a", "utf8_general_ci") + strD2 := types.NewCollationStringDatum("Á", "utf8_general_ci") + fn, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{strD1, strD2})) + require.NoError(t, err) + d, isNull, err := fn.evalInt(chunk.Row{}) + require.False(t, isNull) + require.NoError(t, err) + require.Equalf(t, int64(1), d, "%v, %v", strD1, strD2) + chk1 := chunk.NewChunkWithCapacity(nil, 1) + chk1.SetNumVirtualRows(1) + chk2 := chunk.NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeTiny)}, 1) + err = fn.vecEvalInt(chk1, chk2.Column(0)) + require.NoError(t, err) + require.Equal(t, int64(1), chk2.Column(0).GetInt64(0)) +} diff --git a/expression/builtin_other_test.go b/expression/builtin_other_test.go index fe3bdd7801d23..e9f3bec61bc22 100644 --- a/expression/builtin_other_test.go +++ b/expression/builtin_other_test.go @@ -16,21 +16,21 @@ package expression import ( "math" + "testing" "time" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/types/json" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/collate" - "github.com/pingcap/tidb/util/hack" + "github.com/stretchr/testify/require" ) -func (s *testEvaluatorSuite) TestBitCount(c *C) { - stmtCtx := s.ctx.GetSessionVars().StmtCtx +func TestBitCount(t *testing.T) { + ctx := createContext(t) + stmtCtx := ctx.GetSessionVars().StmtCtx origin := stmtCtx.IgnoreTruncate stmtCtx.IgnoreTruncate = true defer func() { @@ -57,100 +57,32 @@ func (s *testEvaluatorSuite) TestBitCount(c *C) { } for _, test := range bitCountCases { in := types.NewDatum(test.origin) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{in})) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{in})) + require.NoError(t, err) + require.NotNil(t, f) count, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) if count.IsNull() { - c.Assert(test.count, IsNil) + require.Nil(t, test.count) continue } sc := new(stmtctx.StatementContext) sc.IgnoreTruncate = true res, err := count.ToInt64(sc) - c.Assert(err, IsNil) - c.Assert(res, Equals, test.count) + require.NoError(t, err) + require.Equal(t, test.count, res) } } -func (s *testEvaluatorSuite) TestInFunc(c *C) { - fc := funcs[ast.In] - decimal1 := types.NewDecFromFloatForTest(123.121) - decimal2 := types.NewDecFromFloatForTest(123.122) - decimal3 := types.NewDecFromFloatForTest(123.123) - decimal4 := types.NewDecFromFloatForTest(123.124) - time1 := types.NewTime(types.FromGoTime(time.Date(2017, 1, 1, 1, 1, 1, 1, time.UTC)), mysql.TypeDatetime, 6) - time2 := types.NewTime(types.FromGoTime(time.Date(2017, 1, 2, 1, 1, 1, 1, time.UTC)), mysql.TypeDatetime, 6) - time3 := types.NewTime(types.FromGoTime(time.Date(2017, 1, 3, 1, 1, 1, 1, time.UTC)), mysql.TypeDatetime, 6) - time4 := types.NewTime(types.FromGoTime(time.Date(2017, 1, 4, 1, 1, 1, 1, time.UTC)), mysql.TypeDatetime, 6) - duration1 := types.Duration{Duration: 12*time.Hour + 1*time.Minute + 1*time.Second} - duration2 := types.Duration{Duration: 12*time.Hour + 1*time.Minute} - duration3 := types.Duration{Duration: 12*time.Hour + 1*time.Second} - duration4 := types.Duration{Duration: 12 * time.Hour} - json1 := json.CreateBinary("123") - json2 := json.CreateBinary("123.1") - json3 := json.CreateBinary("123.2") - json4 := json.CreateBinary("123.3") - testCases := []struct { - args []interface{} - res interface{} - }{ - {[]interface{}{1, 1, 2, 3}, int64(1)}, - {[]interface{}{1, 0, 2, 3}, int64(0)}, - {[]interface{}{1, nil, 2, 3}, nil}, - {[]interface{}{nil, nil, 2, 3}, nil}, - {[]interface{}{uint64(0), 0, 2, 3}, int64(1)}, - {[]interface{}{uint64(math.MaxUint64), uint64(math.MaxUint64), 2, 3}, int64(1)}, - {[]interface{}{-1, uint64(math.MaxUint64), 2, 3}, int64(0)}, - {[]interface{}{uint64(math.MaxUint64), -1, 2, 3}, int64(0)}, - {[]interface{}{1, 0, 2, 3}, int64(0)}, - {[]interface{}{1.1, 1.2, 1.3}, int64(0)}, - {[]interface{}{1.1, 1.1, 1.2, 1.3}, int64(1)}, - {[]interface{}{decimal1, decimal2, decimal3, decimal4}, int64(0)}, - {[]interface{}{decimal1, decimal2, decimal3, decimal1}, int64(1)}, - {[]interface{}{"1.1", "1.1", "1.2", "1.3"}, int64(1)}, - {[]interface{}{"1.1", hack.Slice("1.1"), "1.2", "1.3"}, int64(1)}, - {[]interface{}{hack.Slice("1.1"), "1.1", "1.2", "1.3"}, int64(1)}, - {[]interface{}{time1, time2, time3, time1}, int64(1)}, - {[]interface{}{time1, time2, time3, time4}, int64(0)}, - {[]interface{}{duration1, duration2, duration3, duration4}, int64(0)}, - {[]interface{}{duration1, duration2, duration1, duration4}, int64(1)}, - {[]interface{}{json1, json2, json3, json4}, int64(0)}, - {[]interface{}{json1, json1, json3, json4}, int64(1)}, - } - for _, tc := range testCases { - fn, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(tc.args...))) - c.Assert(err, IsNil) - d, err := evalBuiltinFunc(fn, chunk.MutRowFromDatums(types.MakeDatums(tc.args...)).ToRow()) - c.Assert(err, IsNil) - c.Assert(d.GetValue(), Equals, tc.res, Commentf("%v", types.MakeDatums(tc.args))) - } - collate.SetNewCollationEnabledForTest(true) - strD1 := types.NewCollationStringDatum("a", "utf8_general_ci", 0) - strD2 := types.NewCollationStringDatum("Á", "utf8_general_ci", 0) - fn, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{strD1, strD2})) - c.Assert(err, IsNil) - d, isNull, err := fn.evalInt(chunk.Row{}) - c.Assert(isNull, IsFalse) - c.Assert(err, IsNil) - c.Assert(d, Equals, int64(1), Commentf("%v, %v", strD1, strD2)) - chk1 := chunk.NewChunkWithCapacity(nil, 1) - chk1.SetNumVirtualRows(1) - chk2 := chunk.NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeTiny)}, 1) - err = fn.vecEvalInt(chk1, chk2.Column(0)) - c.Assert(err, IsNil) - c.Assert(chk2.Column(0).GetInt64(0), Equals, int64(1)) - collate.SetNewCollationEnabledForTest(false) -} - -func (s *testEvaluatorSuite) TestRowFunc(c *C) { +func TestRowFunc(t *testing.T) { + ctx := createContext(t) fc := funcs[ast.RowFunc] - _, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums([]interface{}{"1", 1.2, true, 120}...))) - c.Assert(err, IsNil) + _, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums([]interface{}{"1", 1.2, true, 120}...))) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestSetVar(c *C) { +func TestSetVar(t *testing.T) { + ctx := createContext(t) fc := funcs[ast.SetVar] dec := types.NewDecFromInt(5) timeDec := types.NewTime(types.FromGoTime(time.Now()), mysql.TypeTimestamp, 0) @@ -169,22 +101,23 @@ func (s *testEvaluatorSuite) TestSetVar(c *C) { {[]interface{}{"g", timeDec}, timeDec}, } for _, tc := range testCases { - fn, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(tc.args...))) - c.Assert(err, IsNil) + fn, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(tc.args...))) + require.NoError(t, err) d, err := evalBuiltinFunc(fn, chunk.MutRowFromDatums(types.MakeDatums(tc.args...)).ToRow()) - c.Assert(err, IsNil) - c.Assert(d.GetValue(), Equals, tc.res) + require.NoError(t, err) + require.Equal(t, tc.res, d.GetValue()) if tc.args[1] != nil { key, ok := tc.args[0].(string) - c.Assert(ok, Equals, true) - sessionVar, ok := s.ctx.GetSessionVars().Users[key] - c.Assert(ok, Equals, true) - c.Assert(sessionVar.GetValue(), Equals, tc.res) + require.Equal(t, true, ok) + sessionVar, ok := ctx.GetSessionVars().Users[key] + require.Equal(t, true, ok) + require.Equal(t, tc.res, sessionVar.GetValue()) } } } -func (s *testEvaluatorSuite) TestGetVar(c *C) { +func TestGetVar(t *testing.T) { + ctx := createContext(t) dec := types.NewDecFromInt(5) timeDec := types.NewTime(types.FromGoTime(time.Now()), mysql.TypeTimestamp, 0) sessionVars := []struct { @@ -200,7 +133,7 @@ func (s *testEvaluatorSuite) TestGetVar(c *C) { {"h", timeDec}, } for _, kv := range sessionVars { - s.ctx.GetSessionVars().Users[kv.key] = types.NewDatum(kv.val) + ctx.GetSessionVars().Users[kv.key] = types.NewDatum(kv.val) var tp *types.FieldType if _, ok := kv.val.(types.Time); ok { tp = types.NewFieldType(mysql.TypeDatetime) @@ -208,7 +141,7 @@ func (s *testEvaluatorSuite) TestGetVar(c *C) { tp = types.NewFieldType(mysql.TypeVarString) } types.DefaultParamTypeForValue(kv.val, tp) - s.ctx.GetSessionVars().UserVarTypes[kv.key] = tp + ctx.GetSessionVars().UserVarTypes[kv.key] = tp } testCases := []struct { @@ -225,46 +158,49 @@ func (s *testEvaluatorSuite) TestGetVar(c *C) { {[]interface{}{"h"}, timeDec.String()}, } for _, tc := range testCases { - tp, ok := s.ctx.GetSessionVars().UserVarTypes[tc.args[0].(string)] + tp, ok := ctx.GetSessionVars().UserVarTypes[tc.args[0].(string)] if !ok { tp = types.NewFieldType(mysql.TypeVarString) } - fn, err := BuildGetVarFunction(s.ctx, s.datumsToConstants(types.MakeDatums(tc.args...))[0], tp) - c.Assert(err, IsNil) + fn, err := BuildGetVarFunction(ctx, datumsToConstants(types.MakeDatums(tc.args...))[0], tp) + require.NoError(t, err) d, err := fn.Eval(chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d.GetValue(), Equals, tc.res) + require.NoError(t, err) + require.Equal(t, tc.res, d.GetValue()) } } -func (s *testEvaluatorSuite) TestValues(c *C) { +func TestValues(t *testing.T) { + ctx := createContext(t) fc := &valuesFunctionClass{baseFunctionClass{ast.Values, 0, 0}, 1, types.NewFieldType(mysql.TypeVarchar)} - _, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(""))) - c.Assert(err, ErrorMatches, "*Incorrect parameter count in the call to native function 'values'") + _, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(""))) + require.Error(t, err) + require.Regexp(t, "Incorrect parameter count in the call to native function 'values'$", err.Error()) - sig, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums())) - c.Assert(err, IsNil) + sig, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums())) + require.NoError(t, err) ret, err := evalBuiltinFunc(sig, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(ret.IsNull(), IsTrue) + require.NoError(t, err) + require.True(t, ret.IsNull()) - s.ctx.GetSessionVars().CurrInsertValues = chunk.MutRowFromDatums(types.MakeDatums("1")).ToRow() + ctx.GetSessionVars().CurrInsertValues = chunk.MutRowFromDatums(types.MakeDatums("1")).ToRow() ret, err = evalBuiltinFunc(sig, chunk.Row{}) - c.Assert(err, NotNil) - c.Assert(err.Error(), Matches, "Session current insert values len.*") + require.Error(t, err) + require.Regexp(t, "^Session current insert values len", err.Error()) currInsertValues := types.MakeDatums("1", "2") - s.ctx.GetSessionVars().CurrInsertValues = chunk.MutRowFromDatums(currInsertValues).ToRow() + ctx.GetSessionVars().CurrInsertValues = chunk.MutRowFromDatums(currInsertValues).ToRow() ret, err = evalBuiltinFunc(sig, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) - cmp, err := ret.CompareDatum(nil, &currInsertValues[1]) - c.Assert(err, IsNil) - c.Assert(cmp, Equals, 0) + cmp, err := ret.Compare(nil, &currInsertValues[1], collate.GetBinaryCollator()) + require.NoError(t, err) + require.Equal(t, 0, cmp) } -func (s *testEvaluatorSuite) TestSetVarFromColumn(c *C) { +func TestSetVarFromColumn(t *testing.T) { + ctx := createContext(t) // Construct arguments. argVarName := &Constant{ Value: types.NewStringDatum("a"), @@ -277,12 +213,12 @@ func (s *testEvaluatorSuite) TestSetVarFromColumn(c *C) { // Construct SetVar function. funcSetVar, err := NewFunction( - s.ctx, + ctx, ast.SetVar, &types.FieldType{Tp: mysql.TypeVarString, Flen: 20}, []Expression{argVarName, argCol}..., ) - c.Assert(err, IsNil) + require.NoError(t, err) // Construct input and output Chunks. inputChunk := chunk.NewChunkWithCapacity([]*types.FieldType{argCol.RetType}, 1) @@ -290,19 +226,19 @@ func (s *testEvaluatorSuite) TestSetVarFromColumn(c *C) { outputChunk := chunk.NewChunkWithCapacity([]*types.FieldType{argCol.RetType}, 1) // Evaluate the SetVar function. - err = evalOneCell(s.ctx, funcSetVar, inputChunk.GetRow(0), outputChunk, 0) - c.Assert(err, IsNil) - c.Assert(outputChunk.GetRow(0).GetString(0), Equals, "a") + err = evalOneCell(ctx, funcSetVar, inputChunk.GetRow(0), outputChunk, 0) + require.NoError(t, err) + require.Equal(t, "a", outputChunk.GetRow(0).GetString(0)) // Change the content of the underlying Chunk. inputChunk.Reset() inputChunk.AppendString(0, "b") // Check whether the user variable changed. - sessionVars := s.ctx.GetSessionVars() + sessionVars := ctx.GetSessionVars() sessionVars.UsersLock.RLock() defer sessionVars.UsersLock.RUnlock() sessionVar, ok := sessionVars.Users["a"] - c.Assert(ok, Equals, true) - c.Assert(sessionVar.GetString(), Equals, "a") + require.Equal(t, true, ok) + require.Equal(t, "a", sessionVar.GetString()) } diff --git a/expression/builtin_other_vec.go b/expression/builtin_other_vec.go index f2019651f3934..7db227f2574e4 100644 --- a/expression/builtin_other_vec.go +++ b/expression/builtin_other_vec.go @@ -20,7 +20,6 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" - "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/stringutil" ) @@ -190,7 +189,7 @@ func (b *builtinSetStringVarSig) vecEvalString(input *chunk.Chunk, result *chunk } varName := strings.ToLower(buf0.GetString(i)) res := buf1.GetString(i) - sessionVars.Users[varName] = types.NewCollationStringDatum(stringutil.Copy(res), collation, collate.DefaultLen) + sessionVars.Users[varName] = types.NewCollationStringDatum(stringutil.Copy(res), collation) result.AppendString(res) } return nil diff --git a/expression/builtin_other_vec_generated_test.go b/expression/builtin_other_vec_generated_test.go index 7bebf2b86f7d5..2c571519086ce 100644 --- a/expression/builtin_other_vec_generated_test.go +++ b/expression/builtin_other_vec_generated_test.go @@ -22,7 +22,6 @@ import ( "testing" "time" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/types" @@ -283,12 +282,12 @@ var vecBuiltinOtherGeneratedCases = map[string][]vecExprBenchCase{ }, } -func (s *testEvaluatorSuite) TestVectorizedBuiltinOtherEvalOneVecGenerated(c *C) { - testVectorizedEvalOneVec(c, vecBuiltinOtherGeneratedCases) +func TestVectorizedBuiltinOtherEvalOneVecGenerated(t *testing.T) { + testVectorizedEvalOneVec(t, vecBuiltinOtherGeneratedCases) } -func (s *testEvaluatorSuite) TestVectorizedBuiltinOtherFuncGenerated(c *C) { - testVectorizedBuiltinFunc(c, vecBuiltinOtherGeneratedCases) +func TestVectorizedBuiltinOtherFuncGenerated(t *testing.T) { + testVectorizedBuiltinFunc(t, vecBuiltinOtherGeneratedCases) } func BenchmarkVectorizedBuiltinOtherEvalOneVecGenerated(b *testing.B) { diff --git a/expression/builtin_other_vec_test.go b/expression/builtin_other_vec_test.go index 0caa36eb73f08..4527838c4e981 100644 --- a/expression/builtin_other_vec_test.go +++ b/expression/builtin_other_vec_test.go @@ -19,11 +19,11 @@ import ( "math/rand" "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/mock" + "github.com/stretchr/testify/require" ) func dateTimeFromString(s string) types.Time { @@ -54,37 +54,37 @@ var vecBuiltinOtherCases = map[string][]vecExprBenchCase{ }, } -func (s *testEvaluatorSuite) TestVectorizedBuiltinOtherFunc(c *C) { - testVectorizedBuiltinFunc(c, vecBuiltinOtherCases) +func TestVectorizedBuiltinOtherFunc(t *testing.T) { + testVectorizedBuiltinFunc(t, vecBuiltinOtherCases) } func BenchmarkVectorizedBuiltinOtherFunc(b *testing.B) { benchmarkVectorizedBuiltinFunc(b, vecBuiltinOtherCases) } -func (s *testEvaluatorSuite) TestInDecimal(c *C) { +func TestInDecimal(t *testing.T) { ctx := mock.NewContext() ft := eType2FieldType(types.ETDecimal) col0 := &Column{RetType: ft, Index: 0} col1 := &Column{RetType: ft, Index: 1} inFunc, err := funcs[ast.In].getFunction(ctx, []Expression{col0, col1}) - c.Assert(err, IsNil) + require.NoError(t, err) input := chunk.NewChunkWithCapacity([]*types.FieldType{ft, ft}, 1024) for i := 0; i < 1024; i++ { d0 := new(types.MyDecimal) d1 := new(types.MyDecimal) v := fmt.Sprintf("%d.%d", rand.Intn(1000), rand.Int31()) - c.Assert(d0.FromString([]byte(v)), IsNil) + require.Nil(t, d0.FromString([]byte(v))) v += "00" - c.Assert(d1.FromString([]byte(v)), IsNil) + require.Nil(t, d1.FromString([]byte(v))) input.Column(0).AppendMyDecimal(d0) input.Column(1).AppendMyDecimal(d1) - c.Assert(input.Column(0).GetDecimal(i).GetDigitsFrac(), Not(Equals), input.Column(1).GetDecimal(i).GetDigitsFrac()) + require.NotEqual(t, input.Column(0).GetDecimal(i).GetDigitsFrac(), input.Column(1).GetDecimal(i).GetDigitsFrac()) } result := chunk.NewColumn(ft, 1024) - c.Assert(inFunc.vecEvalInt(input, result), IsNil) + require.Nil(t, inFunc.vecEvalInt(input, result)) for i := 0; i < 1024; i++ { - c.Assert(result.GetInt64(0), Equals, int64(1)) + require.Equal(t, int64(1), result.GetInt64(0)) } } diff --git a/expression/builtin_regexp_vec_const_test.go b/expression/builtin_regexp_vec_const_test.go index af21b54a0deb8..7362d148c35dd 100644 --- a/expression/builtin_regexp_vec_const_test.go +++ b/expression/builtin_regexp_vec_const_test.go @@ -15,14 +15,15 @@ package expression import ( + "fmt" "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/mock" + "github.com/stretchr/testify/require" ) func genVecBuiltinRegexpBenchCaseForConstants() (baseFunc builtinFunc, childrenFieldTypes []*types.FieldType, input *chunk.Chunk, output *chunk.Column) { @@ -59,23 +60,23 @@ func genVecBuiltinRegexpBenchCaseForConstants() (baseFunc builtinFunc, childrenF return } -func (s *testEvaluatorSuite) TestVectorizedBuiltinRegexpForConstants(c *C) { +func TestVectorizedBuiltinRegexpForConstants(t *testing.T) { bf, childrenFieldTypes, input, output := genVecBuiltinRegexpBenchCaseForConstants() err := bf.vecEvalInt(input, output) - c.Assert(err, IsNil) + require.NoError(t, err) i64s := output.Int64s() it := chunk.NewIterator4Chunk(input) i := 0 - commentf := func(row int) CommentInterface { - return Commentf("func: builtinRegexpUTF8Sig, row: %v, rowData: %v", row, input.GetRow(row).GetDatumRow(childrenFieldTypes)) + commentf := func(row int) string { + return fmt.Sprintf("func: builtinRegexpUTF8Sig, row: %v, rowData: %v", row, input.GetRow(row).GetDatumRow(childrenFieldTypes)) } for row := it.Begin(); row != it.End(); row = it.Next() { val, isNull, err := bf.evalInt(row) - c.Assert(err, IsNil) - c.Assert(isNull, Equals, output.IsNull(i), commentf(i)) + require.NoError(t, err) + require.Equal(t, output.IsNull(i), isNull, commentf(i)) if !isNull { - c.Assert(val, Equals, i64s[i], commentf(i)) + require.Equal(t, i64s[i], val, commentf(i)) } i++ } diff --git a/expression/builtin_string.go b/expression/builtin_string.go index 693f8c588170b..9ac2eb370d380 100644 --- a/expression/builtin_string.go +++ b/expression/builtin_string.go @@ -222,15 +222,6 @@ func (b *builtinLengthSig) evalInt(row chunk.Row) (int64, bool, error) { if isNull || err != nil { return 0, isNull, err } - - argTp := b.args[0].GetType() - if !types.IsBinaryStr(argTp) { - dBytes, err := charset.NewEncoding(argTp.Charset).EncodeString(val) - if err == nil { - return int64(len(dBytes)), false, nil - } - } - return int64(len([]byte(val))), false, nil } @@ -298,7 +289,7 @@ func (c *concatFunctionClass) getFunction(ctx sessionctx.Context, args []Express if argType.Flen < 0 { bf.tp.Flen = mysql.MaxBlobWidth - logutil.BgLogger().Warn("unexpected `Flen` value(-1) in CONCAT's args", zap.Int("arg's index", i)) + logutil.BgLogger().Debug("unexpected `Flen` value(-1) in CONCAT's args", zap.Int("arg's index", i)) } bf.tp.Flen += argType.Flen } @@ -374,7 +365,7 @@ func (c *concatWSFunctionClass) getFunction(ctx sessionctx.Context, args []Expre if i != 0 { if argType.Flen < 0 { bf.tp.Flen = mysql.MaxBlobWidth - logutil.BgLogger().Warn("unexpected `Flen` value(-1) in CONCAT_WS's args", zap.Int("arg's index", i)) + logutil.BgLogger().Debug("unexpected `Flen` value(-1) in CONCAT_WS's args", zap.Int("arg's index", i)) } bf.tp.Flen += argType.Flen } @@ -1111,6 +1102,13 @@ func (c *convertFunctionClass) getFunction(ctx sessionctx.Context, args []Expres if err != nil { return nil, errUnknownCharacterSet.GenWithStackByArgs(transcodingName) } + // convert function should always derive to CoercibilityImplicit + bf.SetCoercibility(CoercibilityImplicit) + if bf.tp.Charset == charset.CharsetASCII { + bf.SetRepertoire(ASCII) + } else { + bf.SetRepertoire(UNICODE) + } // Result will be a binary string if converts charset to BINARY. // See https://dev.mysql.com/doc/refman/5.7/en/charset-binary-set.html if types.IsBinaryStr(bf.tp) { @@ -1152,9 +1150,18 @@ func (b *builtinConvertSig) evalString(row chunk.Row) (string, bool, error) { if encoding == nil { return "", true, errUnknownCharacterSet.GenWithStackByArgs(b.tp.Charset) } - - target, _, err := transform.String(encoding.NewDecoder(), expr) - return target, err != nil, err + // if expr is binary string and convert meet error, we should return NULL. + if types.IsBinaryStr(b.args[0].GetType()) { + exprInternal, _, err := transform.String(encoding.NewDecoder(), expr) + return exprInternal, err != nil, nil + } + if types.IsBinaryStr(b.tp) { + enc := charset.NewEncoding(b.args[0].GetType().Charset) + expr, err = enc.EncodeString(expr) + return expr, false, err + } + enc := charset.NewEncoding(b.tp.Charset) + return string(enc.EncodeInternal(nil, []byte(expr))), false, nil } type substringFunctionClass struct { @@ -1635,7 +1642,7 @@ func (c *hexFunctionClass) getFunction(ctx sessionctx.Context, args []Expression argFieldTp := args[0].GetType() // Use UTF8MB4 as default. bf.tp.Flen = argFieldTp.Flen * 4 * 2 - sig := &builtinHexStrArgSig{bf, charset.NewEncoding(argFieldTp.Charset)} + sig := &builtinHexStrArgSig{bf} sig.setPbCode(tipb.ScalarFuncSig_HexStrArg) return sig, nil case types.ETInt, types.ETReal, types.ETDecimal: @@ -1655,15 +1662,11 @@ func (c *hexFunctionClass) getFunction(ctx sessionctx.Context, args []Expression type builtinHexStrArgSig struct { baseBuiltinFunc - encoding *charset.Encoding } func (b *builtinHexStrArgSig) Clone() builtinFunc { newSig := &builtinHexStrArgSig{} newSig.cloneFrom(&b.baseBuiltinFunc) - if b.encoding != nil { - newSig.encoding = charset.NewEncoding(b.encoding.Name()) - } return newSig } @@ -1674,12 +1677,7 @@ func (b *builtinHexStrArgSig) evalString(row chunk.Row) (string, bool, error) { if isNull || err != nil { return d, isNull, err } - dBytes := hack.Slice(d) - dBytes, err = b.encoding.Encode(nil, dBytes) - if err != nil { - return d, false, err - } - return strings.ToUpper(hex.EncodeToString(dBytes)), false, nil + return strings.ToUpper(hex.EncodeToString(hack.Slice(d))), false, nil } type builtinHexIntArgSig struct { @@ -2329,8 +2327,12 @@ func (b *builtinBitLengthSig) evalInt(row chunk.Row) (int64, bool, error) { if isNull || err != nil { return 0, isNull, err } - - return int64(len(val) * 8), false, nil + argTp := b.args[0].GetType() + dBytes, err := charset.NewEncoding(argTp.Charset).Encode(nil, hack.Slice(val)) + if err != nil { + return 0, isNull, err + } + return int64(len(dBytes) * 8), false, nil } type charFunctionClass struct { @@ -2417,8 +2419,14 @@ func (b *builtinCharSig) evalString(row chunk.Row) (string, bool, error) { } bigints = append(bigints, val) } - result := string(b.convertToBytes(bigints)) - return result, false, nil + + dBytes := b.convertToBytes(bigints) + resultBytes, err := charset.NewEncoding(b.tp.Charset).Decode(nil, dBytes) + if err != nil { + b.ctx.GetSessionVars().StmtCtx.AppendWarning(err) + return "", true, nil + } + return string(resultBytes), false, nil } type charLengthFunctionClass struct { @@ -2885,14 +2893,21 @@ func (b *builtinOrdSig) evalInt(row chunk.Row) (int64, bool, error) { return 0, isNull, err } - ord, err := chooseOrdFunc(b.args[0].GetType().Charset) + charSet := b.args[0].GetType().Charset + ord, err := chooseOrdFunc(charSet) if err != nil { return 0, false, err } - return ord(str), false, nil + + enc := charset.NewEncoding(charSet) + leftMost, err := enc.EncodeFirstChar(nil, hack.Slice(str)) + if err != nil { + return 0, false, err + } + return ord(leftMost), false, nil } -func chooseOrdFunc(charSet string) (func(string) int64, error) { +func chooseOrdFunc(charSet string) (func([]byte) int64, error) { // use utf8 by default if charSet == "" { charSet = charset.CharsetUTF8 @@ -2904,22 +2919,17 @@ func chooseOrdFunc(charSet string) (func(string) int64, error) { if desc.Maxlen == 1 { return ordSingleByte, nil } - return ordUtf8, nil + return ordOthers, nil } -func ordSingleByte(str string) int64 { - if len(str) == 0 { +func ordSingleByte(src []byte) int64 { + if len(src) == 0 { return 0 } - return int64(str[0]) + return int64(src[0]) } -func ordUtf8(str string) int64 { - if len(str) == 0 { - return 0 - } - _, size := utf8.DecodeRuneInString(str) - leftMost := str[:size] +func ordOthers(leftMost []byte) int64 { var result int64 var factor int64 = 1 for i := len(leftMost) - 1; i >= 0; i-- { @@ -3656,7 +3666,7 @@ func (c *insertFunctionClass) getFunction(ctx sessionctx.Context, args []Express return nil, errors.Trace(err) } - if types.IsBinaryStr(args[0].GetType()) { + if types.IsBinaryStr(bf.tp) { sig = &builtinInsertSig{bf, maxAllowedPacket} sig.setPbCode(tipb.ScalarFuncSig_Insert) } else { diff --git a/expression/builtin_string_serial_test.go b/expression/builtin_string_serial_test.go new file mode 100644 index 0000000000000..fccf1c9e42f6e --- /dev/null +++ b/expression/builtin_string_serial_test.go @@ -0,0 +1,101 @@ +// Copyright 2021 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, +// 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. + +package expression + +import ( + "testing" + + "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/collate" + "github.com/stretchr/testify/require" +) + +func TestCIWeightString(t *testing.T) { + ctx := createContext(t) + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + + type weightStringTest struct { + str string + padding string + length int + expect interface{} + } + + checkResult := func(collation string, tests []weightStringTest) { + fc := funcs[ast.WeightString] + for _, test := range tests { + str := types.NewCollationStringDatum(test.str, collation) + var f builtinFunc + var err error + if test.padding == "NONE" { + f, err = fc.getFunction(ctx, datumsToConstants([]types.Datum{str})) + } else { + padding := types.NewDatum(test.padding) + length := types.NewDatum(test.length) + f, err = fc.getFunction(ctx, datumsToConstants([]types.Datum{str, padding, length})) + } + require.NoError(t, err) + result, err := evalBuiltinFunc(f, chunk.Row{}) + require.NoError(t, err) + if result.IsNull() { + require.Nil(t, test.expect) + continue + } + res, err := result.ToString() + require.NoError(t, err) + require.Equal(t, test.expect, res) + } + } + + generalTests := []weightStringTest{ + {"aAÁàãăâ", "NONE", 0, "\x00A\x00A\x00A\x00A\x00A\x00A\x00A"}, + {"中", "NONE", 0, "\x4E\x2D"}, + {"a", "CHAR", 5, "\x00A"}, + {"a ", "CHAR", 5, "\x00A"}, + {"中", "CHAR", 5, "\x4E\x2D"}, + {"中 ", "CHAR", 5, "\x4E\x2D"}, + {"a", "BINARY", 1, "a"}, + {"ab", "BINARY", 1, "a"}, + {"a", "BINARY", 5, "a\x00\x00\x00\x00"}, + {"a ", "BINARY", 5, "a \x00\x00\x00"}, + {"中", "BINARY", 1, "\xe4"}, + {"中", "BINARY", 2, "\xe4\xb8"}, + {"中", "BINARY", 3, "中"}, + {"中", "BINARY", 5, "中\x00\x00"}, + } + + unicodeTests := []weightStringTest{ + {"aAÁàãăâ", "NONE", 0, "\x0e3\x0e3\x0e3\x0e3\x0e3\x0e3\x0e3"}, + {"中", "NONE", 0, "\xfb\x40\xce\x2d"}, + {"a", "CHAR", 5, "\x0e3"}, + {"a ", "CHAR", 5, "\x0e3"}, + {"中", "CHAR", 5, "\xfb\x40\xce\x2d"}, + {"中 ", "CHAR", 5, "\xfb\x40\xce\x2d"}, + {"a", "BINARY", 1, "a"}, + {"ab", "BINARY", 1, "a"}, + {"a", "BINARY", 5, "a\x00\x00\x00\x00"}, + {"a ", "BINARY", 5, "a \x00\x00\x00"}, + {"中", "BINARY", 1, "\xe4"}, + {"中", "BINARY", 2, "\xe4\xb8"}, + {"中", "BINARY", 3, "中"}, + {"中", "BINARY", 5, "中\x00\x00"}, + } + + checkResult("utf8mb4_general_ci", generalTests) + checkResult("utf8mb4_unicode_ci", unicodeTests) +} diff --git a/expression/builtin_string_test.go b/expression/builtin_string_test.go index 2c542ad301cd4..475ba5b53bb74 100644 --- a/expression/builtin_string_test.go +++ b/expression/builtin_string_test.go @@ -18,10 +18,9 @@ import ( "fmt" "strconv" "strings" + "testing" "time" - "unicode/utf8" - . "github.com/pingcap/check" "github.com/pingcap/errors" "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/parser/ast" @@ -30,14 +29,16 @@ import ( "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/testkit/trequire" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/mock" - "github.com/pingcap/tidb/util/testutil" + "github.com/stretchr/testify/require" ) -func (s *testEvaluatorSuite) TestLengthAndOctetLength(c *C) { +func TestLengthAndOctetLength(t *testing.T) { + ctx := createContext(t) cases := []struct { args interface{} expected int64 @@ -59,25 +60,25 @@ func (s *testEvaluatorSuite) TestLengthAndOctetLength(c *C) { lengthMethods := []string{ast.Length, ast.OctetLength} for _, lengthMethod := range lengthMethods { - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, lengthMethod, s.primitiveValsToConstants([]interface{}{t.args})...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, lengthMethod, primitiveValsToConstants(ctx, []interface{}{c.args})...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetInt64(), Equals, t.expected) + require.Equal(t, c.expected, d.GetInt64()) } } } } - _, err := funcs[ast.Length].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.Length].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) // Test GBK String tbl := []struct { @@ -91,18 +92,21 @@ func (s *testEvaluatorSuite) TestLengthAndOctetLength(c *C) { {"一二三!", "gbk", 7}, {"一二三!", "", 10}, } - for _, t := range tbl { - err := s.ctx.GetSessionVars().SetSystemVar(variable.CharacterSetConnection, t.chs) - c.Assert(err, IsNil) - f, err := newFunctionForTest(s.ctx, ast.Length, s.primitiveValsToConstants([]interface{}{t.input})...) - c.Assert(err, IsNil) - d, err := f.Eval(chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d.GetInt64(), Equals, t.result) + for _, lengthMethod := range lengthMethods { + for _, c := range tbl { + err := ctx.GetSessionVars().SetSystemVar(variable.CharacterSetConnection, c.chs) + require.NoError(t, err) + f, err := newFunctionForTest(ctx, lengthMethod, primitiveValsToConstants(ctx, []interface{}{c.input})...) + require.NoError(t, err) + d, err := f.Eval(chunk.Row{}) + require.NoError(t, err) + require.Equal(t, c.result, d.GetInt64()) + } } } -func (s *testEvaluatorSuite) TestASCII(c *C) { +func TestASCII(t *testing.T) { + ctx := createContext(t) cases := []struct { args interface{} expected int64 @@ -118,27 +122,51 @@ func (s *testEvaluatorSuite) TestASCII(c *C) { {"", 0, false, false}, {"你好", 228, false, false}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.ASCII, s.primitiveValsToConstants([]interface{}{t.args})...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.ASCII, primitiveValsToConstants(ctx, []interface{}{c.args})...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetInt64(), Equals, t.expected) + require.Equal(t, c.expected, d.GetInt64()) } } } - _, err := funcs[ast.Length].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.Length].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) + + // Test GBK String + tbl := []struct { + input string + chs string + result int64 + }{ + {"abc", "gbk", 97}, + {"你好", "gbk", 196}, + {"你好", "", 228}, + {"世界", "gbk", 202}, + {"世界", "", 228}, + } + + for _, c := range tbl { + err := ctx.GetSessionVars().SetSystemVar(variable.CharacterSetConnection, c.chs) + require.NoError(t, err) + f, err := newFunctionForTest(ctx, ast.ASCII, primitiveValsToConstants(ctx, []interface{}{c.input})...) + require.NoError(t, err) + d, err := f.Eval(chunk.Row{}) + require.NoError(t, err) + require.Equal(t, c.result, d.GetInt64()) + } } -func (s *testEvaluatorSuite) TestConcat(c *C) { +func TestConcat(t *testing.T) { + ctx := createContext(t) cases := []struct { args []interface{} isNil bool @@ -176,24 +204,25 @@ func (s *testEvaluatorSuite) TestConcat(c *C) { }, } fcName := ast.Concat - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, fcName, s.primitiveValsToConstants(t.args)...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, fcName, primitiveValsToConstants(ctx, c.args)...) + require.NoError(t, err) v, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(v.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, v.Kind()) } else { - c.Assert(v.GetString(), Equals, t.res) + require.Equal(t, c.res, v.GetString()) } } } } -func (s *testEvaluatorSuite) TestConcatSig(c *C) { +func TestConcatSig(t *testing.T) { + ctx := createContext(t) colTypes := []*types.FieldType{ {Tp: mysql.TypeVarchar}, {Tp: mysql.TypeVarchar}, @@ -203,7 +232,7 @@ func (s *testEvaluatorSuite) TestConcatSig(c *C) { &Column{Index: 0, RetType: colTypes[0]}, &Column{Index: 1, RetType: colTypes[1]}, } - base := baseBuiltinFunc{args: args, ctx: s.ctx, tp: resultType} + base := baseBuiltinFunc{args: args, ctx: ctx, tp: resultType} concat := &builtinConcatSig{base, 5} cases := []struct { @@ -217,27 +246,28 @@ func (s *testEvaluatorSuite) TestConcatSig(c *C) { {[]interface{}{"中文", "a"}, 2, ""}, } - for _, t := range cases { + for _, c := range cases { input := chunk.NewChunkWithCapacity(colTypes, 10) - input.AppendString(0, t.args[0].(string)) - input.AppendString(1, t.args[1].(string)) + input.AppendString(0, c.args[0].(string)) + input.AppendString(1, c.args[1].(string)) res, isNull, err := concat.evalString(input.GetRow(0)) - c.Assert(res, Equals, t.res) - c.Assert(err, IsNil) - if t.warnings == 0 { - c.Assert(isNull, IsFalse) + require.Equal(t, c.res, res) + require.NoError(t, err) + if c.warnings == 0 { + require.False(t, isNull) } else { - c.Assert(isNull, IsTrue) - warnings := s.ctx.GetSessionVars().StmtCtx.GetWarnings() - c.Assert(warnings, HasLen, t.warnings) + require.True(t, isNull) + warnings := ctx.GetSessionVars().StmtCtx.GetWarnings() + require.Len(t, warnings, c.warnings) lastWarn := warnings[len(warnings)-1] - c.Assert(terror.ErrorEqual(errWarnAllowedPacketOverflowed, lastWarn.Err), IsTrue) + require.True(t, terror.ErrorEqual(errWarnAllowedPacketOverflowed, lastWarn.Err)) } } } -func (s *testEvaluatorSuite) TestConcatWS(c *C) { +func TestConcatWS(t *testing.T) { + ctx := createContext(t) cases := []struct { args []interface{} isNil bool @@ -285,30 +315,31 @@ func (s *testEvaluatorSuite) TestConcatWS(c *C) { fcName := ast.ConcatWS // ERROR 1582 (42000): Incorrect parameter count in the call to native function 'concat_ws' - _, err := newFunctionForTest(s.ctx, fcName, s.primitiveValsToConstants([]interface{}{nil})...) - c.Assert(err, NotNil) + _, err := newFunctionForTest(ctx, fcName, primitiveValsToConstants(ctx, []interface{}{nil})...) + require.Error(t, err) - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, fcName, s.primitiveValsToConstants(t.args)...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, fcName, primitiveValsToConstants(ctx, c.args)...) + require.NoError(t, err) val, err1 := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err1, NotNil) + if c.getErr { + require.NotNil(t, err1) } else { - c.Assert(err1, IsNil) - if t.isNil { - c.Assert(val.Kind(), Equals, types.KindNull) + require.Nil(t, err1) + if c.isNil { + require.Equal(t, types.KindNull, val.Kind()) } else { - c.Assert(val.GetString(), Equals, t.expected) + require.Equal(t, c.expected, val.GetString()) } } } - _, err = funcs[ast.ConcatWS].getFunction(s.ctx, s.primitiveValsToConstants([]interface{}{nil, nil})) - c.Assert(err, IsNil) + _, err = funcs[ast.ConcatWS].getFunction(ctx, primitiveValsToConstants(ctx, []interface{}{nil, nil})) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestConcatWSSig(c *C) { +func TestConcatWSSig(t *testing.T) { + ctx := createContext(t) colTypes := []*types.FieldType{ {Tp: mysql.TypeVarchar}, {Tp: mysql.TypeVarchar}, @@ -320,7 +351,7 @@ func (s *testEvaluatorSuite) TestConcatWSSig(c *C) { &Column{Index: 1, RetType: colTypes[1]}, &Column{Index: 2, RetType: colTypes[2]}, } - base := baseBuiltinFunc{args: args, ctx: s.ctx, tp: resultType} + base := baseBuiltinFunc{args: args, ctx: ctx, tp: resultType} concat := &builtinConcatWSSig{base, 6} cases := []struct { @@ -334,29 +365,30 @@ func (s *testEvaluatorSuite) TestConcatWSSig(c *C) { {[]interface{}{",", "中文", "a"}, 2, ""}, } - for _, t := range cases { + for _, c := range cases { input := chunk.NewChunkWithCapacity(colTypes, 10) - input.AppendString(0, t.args[0].(string)) - input.AppendString(1, t.args[1].(string)) - input.AppendString(2, t.args[2].(string)) + input.AppendString(0, c.args[0].(string)) + input.AppendString(1, c.args[1].(string)) + input.AppendString(2, c.args[2].(string)) res, isNull, err := concat.evalString(input.GetRow(0)) - c.Assert(res, Equals, t.res) - c.Assert(err, IsNil) - if t.warnings == 0 { - c.Assert(isNull, IsFalse) + require.Equal(t, c.res, res) + require.NoError(t, err) + if c.warnings == 0 { + require.False(t, isNull) } else { - c.Assert(isNull, IsTrue) - warnings := s.ctx.GetSessionVars().StmtCtx.GetWarnings() - c.Assert(warnings, HasLen, t.warnings) + require.True(t, isNull) + warnings := ctx.GetSessionVars().StmtCtx.GetWarnings() + require.Len(t, warnings, c.warnings) lastWarn := warnings[len(warnings)-1] - c.Assert(terror.ErrorEqual(errWarnAllowedPacketOverflowed, lastWarn.Err), IsTrue) + require.True(t, terror.ErrorEqual(errWarnAllowedPacketOverflowed, lastWarn.Err)) } } } -func (s *testEvaluatorSuite) TestLeft(c *C) { - stmtCtx := s.ctx.GetSessionVars().StmtCtx +func TestLeft(t *testing.T) { + ctx := createContext(t) + stmtCtx := ctx.GetSessionVars().StmtCtx origin := stmtCtx.IgnoreTruncate stmtCtx.IgnoreTruncate = true defer func() { @@ -384,28 +416,29 @@ func (s *testEvaluatorSuite) TestLeft(c *C) { {[]interface{}{types.NewBinaryLiteralFromUint(0x0102, -1), 1}, false, false, string([]byte{0x01})}, {[]interface{}{errors.New("must err"), 0}, false, true, ""}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.Left, s.primitiveValsToConstants(t.args)...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.Left, primitiveValsToConstants(ctx, c.args)...) + require.NoError(t, err) v, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(v.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, v.Kind()) } else { - c.Assert(v.GetString(), Equals, t.res) + require.Equal(t, c.res, v.GetString()) } } } - _, err := funcs[ast.Left].getFunction(s.ctx, []Expression{varcharCon, int8Con}) - c.Assert(err, IsNil) + _, err := funcs[ast.Left].getFunction(ctx, []Expression{getVarcharCon(), getInt8Con()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestRight(c *C) { - stmtCtx := s.ctx.GetSessionVars().StmtCtx +func TestRight(t *testing.T) { + ctx := createContext(t) + stmtCtx := ctx.GetSessionVars().StmtCtx origin := stmtCtx.IgnoreTruncate stmtCtx.IgnoreTruncate = true defer func() { @@ -433,79 +466,81 @@ func (s *testEvaluatorSuite) TestRight(c *C) { {[]interface{}{types.NewBinaryLiteralFromUint(0x0102, -1), 1}, false, false, string([]byte{0x02})}, {[]interface{}{errors.New("must err"), 0}, false, true, ""}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.Right, s.primitiveValsToConstants(t.args)...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.Right, primitiveValsToConstants(ctx, c.args)...) + require.NoError(t, err) v, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(v.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, v.Kind()) } else { - c.Assert(v.GetString(), Equals, t.res) + require.Equal(t, c.res, v.GetString()) } } } - _, err := funcs[ast.Right].getFunction(s.ctx, []Expression{varcharCon, int8Con}) - c.Assert(err, IsNil) + _, err := funcs[ast.Right].getFunction(ctx, []Expression{getVarcharCon(), getInt8Con()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestRepeat(c *C) { +func TestRepeat(t *testing.T) { + ctx := createContext(t) args := []interface{}{"a", int64(2)} fc := funcs[ast.Repeat] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(args...))) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(args...))) + require.NoError(t, err) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.GetString(), Equals, "aa") + require.NoError(t, err) + require.Equal(t, "aa", v.GetString()) args = []interface{}{"a", uint64(2)} - f, err = fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(args...))) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(types.MakeDatums(args...))) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.GetString(), Equals, "aa") + require.NoError(t, err) + require.Equal(t, "aa", v.GetString()) args = []interface{}{"a", uint64(16777217)} - f, err = fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(args...))) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(types.MakeDatums(args...))) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.IsNull(), IsTrue) + require.NoError(t, err) + require.True(t, v.IsNull()) args = []interface{}{"a", uint64(16777216)} - f, err = fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(args...))) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(types.MakeDatums(args...))) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.IsNull(), IsFalse) + require.NoError(t, err) + require.False(t, v.IsNull()) args = []interface{}{"a", int64(-1)} - f, err = fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(args...))) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(types.MakeDatums(args...))) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.GetString(), Equals, "") + require.NoError(t, err) + require.Equal(t, "", v.GetString()) args = []interface{}{"a", int64(0)} - f, err = fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(args...))) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(types.MakeDatums(args...))) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.GetString(), Equals, "") + require.NoError(t, err) + require.Equal(t, "", v.GetString()) args = []interface{}{"a", uint64(0)} - f, err = fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(args...))) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(types.MakeDatums(args...))) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.GetString(), Equals, "") + require.NoError(t, err) + require.Equal(t, "", v.GetString()) } -func (s *testEvaluatorSuite) TestRepeatSig(c *C) { +func TestRepeatSig(t *testing.T) { + ctx := createContext(t) colTypes := []*types.FieldType{ {Tp: mysql.TypeVarchar}, {Tp: mysql.TypeLonglong}, @@ -515,7 +550,7 @@ func (s *testEvaluatorSuite) TestRepeatSig(c *C) { &Column{Index: 0, RetType: colTypes[0]}, &Column{Index: 1, RetType: colTypes[1]}, } - base := baseBuiltinFunc{args: args, ctx: s.ctx, tp: resultType} + base := baseBuiltinFunc{args: args, ctx: ctx, tp: resultType} repeat := &builtinRepeatSig{base, 1000} cases := []struct { @@ -529,28 +564,29 @@ func (s *testEvaluatorSuite) TestRepeatSig(c *C) { {[]interface{}{"毅", int64(334)}, 2, ""}, } - for _, t := range cases { + for _, c := range cases { input := chunk.NewChunkWithCapacity(colTypes, 10) - input.AppendString(0, t.args[0].(string)) - input.AppendInt64(1, t.args[1].(int64)) + input.AppendString(0, c.args[0].(string)) + input.AppendInt64(1, c.args[1].(int64)) res, isNull, err := repeat.evalString(input.GetRow(0)) - c.Assert(res, Equals, t.res) - c.Assert(err, IsNil) - if t.warning == 0 { - c.Assert(isNull, IsFalse) + require.Equal(t, c.res, res) + require.NoError(t, err) + if c.warning == 0 { + require.False(t, isNull) } else { - c.Assert(isNull, IsTrue) - c.Assert(err, IsNil) - warnings := s.ctx.GetSessionVars().StmtCtx.GetWarnings() - c.Assert(len(warnings), Equals, t.warning) + require.True(t, isNull) + require.NoError(t, err) + warnings := ctx.GetSessionVars().StmtCtx.GetWarnings() + require.Len(t, warnings, c.warning) lastWarn := warnings[len(warnings)-1] - c.Assert(terror.ErrorEqual(errWarnAllowedPacketOverflowed, lastWarn.Err), IsTrue) + require.True(t, terror.ErrorEqual(errWarnAllowedPacketOverflowed, lastWarn.Err)) } } } -func (s *testEvaluatorSuite) TestLower(c *C) { +func TestLower(t *testing.T) { + ctx := createContext(t) cases := []struct { args []interface{} isNil bool @@ -566,24 +602,24 @@ func (s *testEvaluatorSuite) TestLower(c *C) { {[]interface{}{"ABCテストDEF"}, false, false, "abcテストdef"}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.Lower, s.primitiveValsToConstants(t.args)...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.Lower, primitiveValsToConstants(ctx, c.args)...) + require.NoError(t, err) v, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(v.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, v.Kind()) } else { - c.Assert(v.GetString(), Equals, t.res) + require.Equal(t, c.res, v.GetString()) } } } - _, err := funcs[ast.Lower].getFunction(s.ctx, []Expression{varcharCon}) - c.Assert(err, IsNil) + _, err := funcs[ast.Lower].getFunction(ctx, []Expression{getVarcharCon()}) + require.NoError(t, err) // Test GBK String tbl := []struct { @@ -596,18 +632,19 @@ func (s *testEvaluatorSuite) TestLower(c *C) { {"àáèéêìíòóùúüāēěīńňōūǎǐǒǔǖǘǚǜⅪⅫ", "gbk", "àáèéêìíòóùúüāēěīńňōūǎǐǒǔǖǘǚǜⅪⅫ"}, {"àáèéêìíòóùúüāēěīńňōūǎǐǒǔǖǘǚǜⅪⅫ", "", "àáèéêìíòóùúüāēěīńňōūǎǐǒǔǖǘǚǜⅺⅻ"}, } - for _, t := range tbl { - err := s.ctx.GetSessionVars().SetSystemVar(variable.CharacterSetConnection, t.chs) - c.Assert(err, IsNil) - f, err := newFunctionForTest(s.ctx, ast.Lower, s.primitiveValsToConstants([]interface{}{t.input})...) - c.Assert(err, IsNil) + for _, c := range tbl { + err := ctx.GetSessionVars().SetSystemVar(variable.CharacterSetConnection, c.chs) + require.NoError(t, err) + f, err := newFunctionForTest(ctx, ast.Lower, primitiveValsToConstants(ctx, []interface{}{c.input})...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d.GetString(), Equals, t.result) + require.NoError(t, err) + require.Equal(t, c.result, d.GetString()) } } -func (s *testEvaluatorSuite) TestUpper(c *C) { +func TestUpper(t *testing.T) { + ctx := createContext(t) cases := []struct { args []interface{} isNil bool @@ -623,24 +660,24 @@ func (s *testEvaluatorSuite) TestUpper(c *C) { {[]interface{}{"abcテストdef"}, false, false, "ABCテストDEF"}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.Upper, s.primitiveValsToConstants(t.args)...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.Upper, primitiveValsToConstants(ctx, c.args)...) + require.NoError(t, err) v, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(v.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, v.Kind()) } else { - c.Assert(v.GetString(), Equals, strings.ToUpper(t.res)) + require.Equal(t, strings.ToUpper(c.res), v.GetString()) } } } - _, err := funcs[ast.Upper].getFunction(s.ctx, []Expression{varcharCon}) - c.Assert(err, IsNil) + _, err := funcs[ast.Upper].getFunction(ctx, []Expression{getVarcharCon()}) + require.NoError(t, err) // Test GBK String tbl := []struct { @@ -654,24 +691,25 @@ func (s *testEvaluatorSuite) TestUpper(c *C) { {"àáèéêìíòóùúüāēěīńňōūǎǐǒǔǖǘǚǜⅪⅫ", "gbk", "àáèéêìíòóùúüāēěīńňōūǎǐǒǔǖǘǚǜⅪⅫ"}, {"àáèéêìíòóùúüāēěīńňōūǎǐǒǔǖǘǚǜⅪⅫ", "", "ÀÁÈÉÊÌÍÒÓÙÚÜĀĒĚĪŃŇŌŪǍǏǑǓǕǗǙǛⅪⅫ"}, } - for _, t := range tbl { - err := s.ctx.GetSessionVars().SetSystemVar(variable.CharacterSetConnection, t.chs) - c.Assert(err, IsNil) - f, err := newFunctionForTest(s.ctx, ast.Upper, s.primitiveValsToConstants([]interface{}{t.input})...) - c.Assert(err, IsNil) + for _, c := range tbl { + err := ctx.GetSessionVars().SetSystemVar(variable.CharacterSetConnection, c.chs) + require.NoError(t, err) + f, err := newFunctionForTest(ctx, ast.Upper, primitiveValsToConstants(ctx, []interface{}{c.input})...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d.GetString(), Equals, t.result) + require.NoError(t, err) + require.Equal(t, c.result, d.GetString()) } } -func (s *testEvaluatorSuite) TestReverse(c *C) { +func TestReverse(t *testing.T) { + ctx := createContext(t) fc := funcs[ast.Reverse] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(nil))) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(nil))) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + require.Equal(t, types.KindNull, d.Kind()) tbl := []struct { Input interface{} @@ -685,17 +723,18 @@ func (s *testEvaluatorSuite) TestReverse(c *C) { dtbl := tblToDtbl(tbl) - for _, t := range dtbl { - f, err = fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + for _, c := range dtbl { + f, err = fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) + require.NotNil(t, f) d, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d, testutil.DatumEquals, t["Expect"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["Expect"][0], d) } } -func (s *testEvaluatorSuite) TestStrcmp(c *C) { +func TestStrcmp(t *testing.T) { + ctx := createContext(t) cases := []struct { args []interface{} isNil bool @@ -718,24 +757,25 @@ func (s *testEvaluatorSuite) TestStrcmp(c *C) { {[]interface{}{nil, nil}, true, false, 0}, {[]interface{}{"123", errors.New("must err")}, false, true, 0}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.Strcmp, s.primitiveValsToConstants(t.args)...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.Strcmp, primitiveValsToConstants(ctx, c.args)...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetInt64(), Equals, t.res) + require.Equal(t, c.res, d.GetInt64()) } } } } -func (s *testEvaluatorSuite) TestReplace(c *C) { +func TestReplace(t *testing.T) { + ctx := createContext(t) cases := []struct { args []interface{} isNil bool @@ -754,28 +794,29 @@ func (s *testEvaluatorSuite) TestReplace(c *C) { {[]interface{}{"a", "b", nil}, true, false, "", 1}, {[]interface{}{errors.New("must err"), "a", "b"}, false, true, "", -1}, } - for i, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.Replace, s.primitiveValsToConstants(t.args)...) - c.Assert(err, IsNil, Commentf("test %v", i)) - c.Assert(f.GetType().Flen, Equals, t.flen, Commentf("test %v", i)) + for i, c := range cases { + f, err := newFunctionForTest(ctx, ast.Replace, primitiveValsToConstants(ctx, c.args)...) + require.NoError(t, err) + require.Equalf(t, c.flen, f.GetType().Flen, "test %v", i) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil, Commentf("test %v", i)) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil, Commentf("test %v", i)) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull, Commentf("test %v", i)) + require.NoError(t, err) + if c.isNil { + require.Equalf(t, types.KindNull, d.Kind(), "test %v", i) } else { - c.Assert(d.GetString(), Equals, t.res, Commentf("test %v", i)) + require.Equalf(t, c.res, d.GetString(), "test %v", i) } } } - _, err := funcs[ast.Replace].getFunction(s.ctx, []Expression{NewZero(), NewZero(), NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.Replace].getFunction(ctx, []Expression{NewZero(), NewZero(), NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestSubstring(c *C) { +func TestSubstring(t *testing.T) { + ctx := createContext(t) cases := []struct { args []interface{} isNil bool @@ -799,30 +840,31 @@ func (s *testEvaluatorSuite) TestSubstring(c *C) { {[]interface{}{"Sakila", 2, nil}, true, false, ""}, {[]interface{}{errors.New("must error"), 2, 3}, false, true, ""}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.Substring, s.primitiveValsToConstants(t.args)...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.Substring, primitiveValsToConstants(ctx, c.args)...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetString(), Equals, t.res) + require.Equal(t, c.res, d.GetString()) } } } - _, err := funcs[ast.Substring].getFunction(s.ctx, []Expression{NewZero(), NewZero(), NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.Substring].getFunction(ctx, []Expression{NewZero(), NewZero(), NewZero()}) + require.NoError(t, err) - _, err = funcs[ast.Substring].getFunction(s.ctx, []Expression{NewZero(), NewZero()}) - c.Assert(err, IsNil) + _, err = funcs[ast.Substring].getFunction(ctx, []Expression{NewZero(), NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestConvert(c *C) { +func TestConvert(t *testing.T) { + ctx := createContext(t) tbl := []struct { str interface{} cs string @@ -838,20 +880,20 @@ func (s *testEvaluatorSuite) TestConvert(c *C) { } for _, v := range tbl { fc := funcs[ast.Convert] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(v.str, v.cs))) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(v.str, v.cs))) + require.NoError(t, err) + require.NotNil(t, f) retType := f.getRetTp() - c.Assert(retType.Charset, Equals, strings.ToLower(v.cs)) + require.Equal(t, strings.ToLower(v.cs), retType.Charset) collate, err := charset.GetDefaultCollation(strings.ToLower(v.cs)) - c.Assert(err, IsNil) - c.Assert(retType.Collate, Equals, collate) - c.Assert(mysql.HasBinaryFlag(retType.Flag), Equals, v.hasBinaryFlag) + require.NoError(t, err) + require.Equal(t, collate, retType.Collate) + require.Equal(t, v.hasBinaryFlag, mysql.HasBinaryFlag(retType.Flag)) r, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(r.Kind(), Equals, types.KindString) - c.Assert(r.GetString(), Equals, v.result) + require.NoError(t, err) + require.Equal(t, types.KindString, r.Kind()) + require.Equal(t, v.result, r.GetString()) } // Test case for getFunction() error @@ -865,23 +907,24 @@ func (s *testEvaluatorSuite) TestConvert(c *C) { } for _, v := range errTbl { fc := funcs[ast.Convert] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(v.str, v.cs))) - c.Assert(err.Error(), Equals, v.err) - c.Assert(f, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(v.str, v.cs))) + require.Equal(t, v.err, err.Error()) + require.Nil(t, f) } // Test wrong charset while evaluating. fc := funcs[ast.Convert] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums("haha", "utf8"))) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums("haha", "utf8"))) + require.NoError(t, err) + require.NotNil(t, f) wrongFunction := f.(*builtinConvertSig) wrongFunction.tp.Charset = "wrongcharset" _, err = evalBuiltinFunc(wrongFunction, chunk.Row{}) - c.Assert(err.Error(), Equals, "[expression:1115]Unknown character set: 'wrongcharset'") + require.Equal(t, "[expression:1115]Unknown character set: 'wrongcharset'", err.Error()) } -func (s *testEvaluatorSuite) TestSubstringIndex(c *C) { +func TestSubstringIndex(t *testing.T) { + ctx := createContext(t) cases := []struct { args []interface{} isNil bool @@ -907,28 +950,29 @@ func (s *testEvaluatorSuite) TestSubstringIndex(c *C) { {[]interface{}{"www.pingcap.com", ".", nil}, true, false, ""}, {[]interface{}{errors.New("must error"), ".", 1}, false, true, ""}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.SubstringIndex, s.primitiveValsToConstants(t.args)...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.SubstringIndex, primitiveValsToConstants(ctx, c.args)...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetString(), Equals, t.res) + require.Equal(t, c.res, d.GetString()) } } } - _, err := funcs[ast.SubstringIndex].getFunction(s.ctx, []Expression{NewZero(), NewZero(), NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.SubstringIndex].getFunction(ctx, []Expression{NewZero(), NewZero(), NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestSpace(c *C) { - stmtCtx := s.ctx.GetSessionVars().StmtCtx +func TestSpace(t *testing.T) { + ctx := createContext(t) + stmtCtx := ctx.GetSessionVars().StmtCtx origin := stmtCtx.IgnoreTruncate stmtCtx.IgnoreTruncate = true defer func() { @@ -952,27 +996,28 @@ func (s *testEvaluatorSuite) TestSpace(c *C) { {nil, true, false, ""}, {errors.New("must error"), false, true, ""}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.Space, s.primitiveValsToConstants([]interface{}{t.arg})...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.Space, primitiveValsToConstants(ctx, []interface{}{c.arg})...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetString(), Equals, t.res) + require.Equal(t, c.res, d.GetString()) } } } - _, err := funcs[ast.Space].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.Space].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestSpaceSig(c *C) { +func TestSpaceSig(t *testing.T) { + ctx := createContext(t) colTypes := []*types.FieldType{ {Tp: mysql.TypeLonglong}, } @@ -980,26 +1025,27 @@ func (s *testEvaluatorSuite) TestSpaceSig(c *C) { args := []Expression{ &Column{Index: 0, RetType: colTypes[0]}, } - base := baseBuiltinFunc{args: args, ctx: s.ctx, tp: resultType} + base := baseBuiltinFunc{args: args, ctx: ctx, tp: resultType} space := &builtinSpaceSig{base, 1000} input := chunk.NewChunkWithCapacity(colTypes, 10) input.AppendInt64(0, 6) input.AppendInt64(0, 1001) res, isNull, err := space.evalString(input.GetRow(0)) - c.Assert(res, Equals, " ") - c.Assert(isNull, IsFalse) - c.Assert(err, IsNil) + require.Equal(t, " ", res) + require.False(t, isNull) + require.NoError(t, err) res, isNull, err = space.evalString(input.GetRow(1)) - c.Assert(res, Equals, "") - c.Assert(isNull, IsTrue) - c.Assert(err, IsNil) - warnings := s.ctx.GetSessionVars().StmtCtx.GetWarnings() - c.Assert(len(warnings), Equals, 1) + require.Equal(t, "", res) + require.True(t, isNull) + require.NoError(t, err) + warnings := ctx.GetSessionVars().StmtCtx.GetWarnings() + require.Equal(t, 1, len(warnings)) lastWarn := warnings[len(warnings)-1] - c.Assert(terror.ErrorEqual(errWarnAllowedPacketOverflowed, lastWarn.Err), IsTrue, Commentf("err %v", lastWarn.Err)) + require.True(t, terror.ErrorEqual(errWarnAllowedPacketOverflowed, lastWarn.Err)) } -func (s *testEvaluatorSuite) TestLocate(c *C) { +func TestLocate(t *testing.T) { + ctx := createContext(t) // 1. Test LOCATE without binary input. tbl := []struct { Args []interface{} @@ -1037,13 +1083,13 @@ func (s *testEvaluatorSuite) TestLocate(c *C) { } Dtbl := tblToDtbl(tbl) instr := funcs[ast.Locate] - for i, t := range Dtbl { - f, err := instr.getFunction(s.ctx, s.datumsToConstants(t["Args"])) - c.Assert(err, IsNil) + for i, c := range Dtbl { + f, err := instr.getFunction(ctx, datumsToConstants(c["Args"])) + require.NoError(t, err) got, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(f, NotNil) - c.Assert(got, DeepEquals, t["Want"][0], Commentf("[%d]: args: %v", i, t["Args"])) + require.NoError(t, err) + require.NotNil(t, f) + require.Equalf(t, c["Want"][0], got, "[%d]: args: %v", i, c["Args"]) } // 2. Test LOCATE with binary input tbl2 := []struct { @@ -1057,20 +1103,21 @@ func (s *testEvaluatorSuite) TestLocate(c *C) { {[]interface{}{"bAr", []byte("foobarbAr"), 5}, 7}, } Dtbl2 := tblToDtbl(tbl2) - for i, t := range Dtbl2 { - exprs := s.datumsToConstants(t["Args"]) + for i, c := range Dtbl2 { + exprs := datumsToConstants(c["Args"]) types.SetBinChsClnFlag(exprs[0].GetType()) types.SetBinChsClnFlag(exprs[1].GetType()) - f, err := instr.getFunction(s.ctx, exprs) - c.Assert(err, IsNil) + f, err := instr.getFunction(ctx, exprs) + require.NoError(t, err) got, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(f, NotNil) - c.Assert(got, DeepEquals, t["Want"][0], Commentf("[%d]: args: %v", i, t["Args"])) + require.NoError(t, err) + require.NotNil(t, f) + require.Equalf(t, c["Want"][0], got, "[%d]: args: %v", i, c["Args"]) } } -func (s *testEvaluatorSuite) TestTrim(c *C) { +func TestTrim(t *testing.T) { + ctx := createContext(t) cases := []struct { args []interface{} isNil bool @@ -1095,33 +1142,34 @@ func (s *testEvaluatorSuite) TestTrim(c *C) { {[]interface{}{"bar", nil, int(ast.TrimLeading)}, true, false, ""}, {[]interface{}{errors.New("must error")}, false, true, ""}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.Trim, s.primitiveValsToConstants(t.args)...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.Trim, primitiveValsToConstants(ctx, c.args)...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetString(), Equals, t.res) + require.Equal(t, c.res, d.GetString()) } } } - _, err := funcs[ast.Trim].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.Trim].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) - _, err = funcs[ast.Trim].getFunction(s.ctx, []Expression{NewZero(), NewZero()}) - c.Assert(err, IsNil) + _, err = funcs[ast.Trim].getFunction(ctx, []Expression{NewZero(), NewZero()}) + require.NoError(t, err) - _, err = funcs[ast.Trim].getFunction(s.ctx, []Expression{NewZero(), NewZero(), NewZero()}) - c.Assert(err, IsNil) + _, err = funcs[ast.Trim].getFunction(ctx, []Expression{NewZero(), NewZero(), NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestLTrim(c *C) { +func TestLTrim(t *testing.T) { + ctx := createContext(t) cases := []struct { arg interface{} isNil bool @@ -1142,27 +1190,28 @@ func (s *testEvaluatorSuite) TestLTrim(c *C) { {nil, true, false, ""}, {errors.New("must error"), false, true, ""}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.LTrim, s.primitiveValsToConstants([]interface{}{t.arg})...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.LTrim, primitiveValsToConstants(ctx, []interface{}{c.arg})...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetString(), Equals, t.res) + require.Equal(t, c.res, d.GetString()) } } } - _, err := funcs[ast.LTrim].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.LTrim].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestRTrim(c *C) { +func TestRTrim(t *testing.T) { + ctx := createContext(t) cases := []struct { arg interface{} isNil bool @@ -1181,27 +1230,28 @@ func (s *testEvaluatorSuite) TestRTrim(c *C) { {nil, true, false, ""}, {errors.New("must error"), false, true, ""}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.RTrim, s.primitiveValsToConstants([]interface{}{t.arg})...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.RTrim, primitiveValsToConstants(ctx, []interface{}{c.arg})...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetString(), Equals, t.res) + require.Equal(t, c.res, d.GetString()) } } } - _, err := funcs[ast.RTrim].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.RTrim].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestHexFunc(c *C) { +func TestHexFunc(t *testing.T) { + ctx := createContext(t) cases := []struct { arg interface{} isNil bool @@ -1221,18 +1271,18 @@ func (s *testEvaluatorSuite) TestHexFunc(c *C) { {nil, true, false, ""}, {errors.New("must err"), false, true, ""}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.Hex, s.primitiveValsToConstants([]interface{}{t.arg})...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.Hex, primitiveValsToConstants(ctx, []interface{}{c.arg})...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetString(), Equals, t.res) + require.Equal(t, c.res, d.GetString()) } } } @@ -1248,29 +1298,30 @@ func (s *testEvaluatorSuite) TestHexFunc(c *C) { {"一忒(๑•ㅂ•)و✧", "", "E4B880E5BF9228E0B991E280A2E38582E280A229D988E29CA7", 0}, {"一忒(๑•ㅂ•)و✧", "gbk", "", errno.ErrInvalidCharacterString}, } - for _, t := range strCases { - err := s.ctx.GetSessionVars().SetSystemVar(variable.CharacterSetConnection, t.chs) - c.Assert(err, IsNil) - f, err := newFunctionForTest(s.ctx, ast.Hex, s.primitiveValsToConstants([]interface{}{t.arg})...) - c.Assert(err, IsNil) + for _, c := range strCases { + err := ctx.GetSessionVars().SetSystemVar(variable.CharacterSetConnection, c.chs) + require.NoError(t, err) + f, err := newFunctionForTest(ctx, ast.Hex, primitiveValsToConstants(ctx, []interface{}{c.arg})...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.errCode != 0 { - c.Assert(err, NotNil) - c.Assert(strings.Contains(err.Error(), strconv.Itoa(t.errCode)), IsTrue) + if c.errCode != 0 { + require.Error(t, err) + require.True(t, strings.Contains(err.Error(), strconv.Itoa(c.errCode))) } else { - c.Assert(err, IsNil) - c.Assert(d.GetString(), Equals, t.res) + require.NoError(t, err) + require.Equal(t, c.res, d.GetString()) } } - _, err := funcs[ast.Hex].getFunction(s.ctx, []Expression{int8Con}) - c.Assert(err, IsNil) + _, err := funcs[ast.Hex].getFunction(ctx, []Expression{getInt8Con()}) + require.NoError(t, err) - _, err = funcs[ast.Hex].getFunction(s.ctx, []Expression{varcharCon}) - c.Assert(err, IsNil) + _, err = funcs[ast.Hex].getFunction(ctx, []Expression{getVarcharCon()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestUnhexFunc(c *C) { +func TestUnhexFunc(t *testing.T) { + ctx := createContext(t) cases := []struct { arg interface{} isNil bool @@ -1289,60 +1340,70 @@ func (s *testEvaluatorSuite) TestUnhexFunc(c *C) { {nil, true, false, ""}, {errors.New("must error"), false, true, ""}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.Unhex, s.primitiveValsToConstants([]interface{}{t.arg})...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.Unhex, primitiveValsToConstants(ctx, []interface{}{c.arg})...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetString(), Equals, t.res) + require.Equal(t, c.res, d.GetString()) } } } - _, err := funcs[ast.Unhex].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.Unhex].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestBitLength(c *C) { +func TestBitLength(t *testing.T) { + ctx := createContext(t) cases := []struct { args interface{} + chs string expected int64 isNil bool getErr bool }{ - {"hi", 16, false, false}, - {"你好", 48, false, false}, - {"", 0, false, false}, - } - - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.BitLength, s.primitiveValsToConstants([]interface{}{t.args})...) - c.Assert(err, IsNil) + {"hi", "", 16, false, false}, + {"你好", "", 48, false, false}, + {"", "", 0, false, false}, + {"abc", "gbk", 24, false, false}, + {"一二三", "gbk", 48, false, false}, + {"一二三", "", 72, false, false}, + {"一二三!", "gbk", 56, false, false}, + {"一二三!", "", 80, false, false}, + } + + for _, c := range cases { + err := ctx.GetSessionVars().SetSystemVar(variable.CharacterSetConnection, c.chs) + require.NoError(t, err) + f, err := newFunctionForTest(ctx, ast.BitLength, primitiveValsToConstants(ctx, []interface{}{c.args})...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetInt64(), Equals, t.expected) + require.Equal(t, c.expected, d.GetInt64()) } } } - _, err := funcs[ast.BitLength].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.BitLength].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestChar(c *C) { - stmtCtx := s.ctx.GetSessionVars().StmtCtx +func TestChar(t *testing.T) { + ctx := createContext(t) + stmtCtx := ctx.GetSessionVars().StmtCtx origin := stmtCtx.IgnoreTruncate stmtCtx.IgnoreTruncate = true defer func() { @@ -1350,37 +1411,41 @@ func (s *testEvaluatorSuite) TestChar(c *C) { }() tbl := []struct { - str string - iNum int64 - fNum float64 - result string + str string + iNum int64 + fNum float64 + charset interface{} + result interface{} + warnings int }{ - {"65", 66, 67.5, "ABD"}, // float - {"65", 16740, 67.5, "AAdD"}, // large num - {"65", -1, 67.5, "A\xff\xff\xff\xffD"}, // nagtive int - {"a", -1, 67.5, "\x00\xff\xff\xff\xffD"}, // invalid 'a' + {"65", 66, 67.5, "utf8", "ABD", 0}, // float + {"65", 16740, 67.5, "utf8", "AAdD", 0}, // large num + {"65", -1, 67.5, nil, "A\xff\xff\xff\xffD", 0}, // nagtive int + {"a", -1, 67.5, nil, "\x00\xff\xff\xff\xffD", 0}, // invalid 'a' + // TODO: Uncomment it when issue #29685 be closed + // {"65", -1, 67.5, "utf8", nil, 1}, // with utf8, return nil + // {"a", -1, 67.5, "utf8", nil, 2}, // with utf8, return nil + // TODO: Uncomment it when gbk be added into charsetInfos + // {"1234567", 1234567, 1234567, "gbk", "謬謬謬", 0}, // test char for gbk + // {"123456789", 123456789, 123456789, "gbk", nil, 3}, // invalid 123456789 in gbk } for _, v := range tbl { - for _, char := range []interface{}{"utf8", nil} { - fc := funcs[ast.CharFunc] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(v.str, v.iNum, v.fNum, char))) - c.Assert(err, IsNil) - c.Assert(f, NotNil) - r, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil, Commentf("err: %v", err)) - c.Assert(r, testutil.DatumEquals, types.NewDatum(v.result)) + fc := funcs[ast.CharFunc] + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(v.str, v.iNum, v.fNum, v.charset))) + require.NoError(t, err) + require.NotNil(t, f) + r, err := evalBuiltinFunc(f, chunk.Row{}) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(v.result), r) + if v.warnings != 0 { + warnings := ctx.GetSessionVars().StmtCtx.GetWarnings() + require.Equal(t, v.warnings, len(warnings)) } } - - fc := funcs[ast.CharFunc] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums("65", 66, nil))) - c.Assert(err, IsNil) - r, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(r, testutil.DatumEquals, types.NewDatum("AB")) } -func (s *testEvaluatorSuite) TestCharLength(c *C) { +func TestCharLength(t *testing.T) { + ctx := createContext(t) tbl := []struct { input interface{} result interface{} @@ -1393,11 +1458,11 @@ func (s *testEvaluatorSuite) TestCharLength(c *C) { } for _, v := range tbl { fc := funcs[ast.CharLength] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(v.input))) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(v.input))) + require.NoError(t, err) r, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(r, testutil.DatumEquals, types.NewDatum(v.result)) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(v.result), r) } // Test binary string @@ -1413,23 +1478,24 @@ func (s *testEvaluatorSuite) TestCharLength(c *C) { } for _, v := range tbl { fc := funcs[ast.CharLength] - arg := s.datumsToConstants(types.MakeDatums(v.input)) + arg := datumsToConstants(types.MakeDatums(v.input)) tp := arg[0].GetType() tp.Tp = mysql.TypeVarString tp.Charset = charset.CharsetBin tp.Collate = charset.CollationBin tp.Flen = types.UnspecifiedLength tp.Flag = mysql.BinaryFlag - f, err := fc.getFunction(s.ctx, arg) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, arg) + require.NoError(t, err) r, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(r, testutil.DatumEquals, types.NewDatum(v.result)) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(v.result), r) } } -func (s *testEvaluatorSuite) TestFindInSet(c *C) { - for _, t := range []struct { +func TestFindInSet(t *testing.T) { + ctx := createContext(t) + for _, c := range []struct { str interface{} strlst interface{} ret interface{} @@ -1447,16 +1513,17 @@ func (s *testEvaluatorSuite) TestFindInSet(c *C) { {nil, "bar", nil}, } { fc := funcs[ast.FindInSet] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(t.str, t.strlst))) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(c.str, c.strlst))) + require.NoError(t, err) r, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(r, testutil.DatumEquals, types.NewDatum(t.ret), Commentf("FindInSet(%s, %s)", t.str, t.strlst)) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(c.ret), r, fmt.Sprintf("FindInSet(%s, %s)", c.str, c.strlst)) } } -func (s *testEvaluatorSuite) TestField(c *C) { - stmtCtx := s.ctx.GetSessionVars().StmtCtx +func TestField(t *testing.T) { + ctx := createContext(t) + stmtCtx := ctx.GetSessionVars().StmtCtx origin := stmtCtx.IgnoreTruncate stmtCtx.IgnoreTruncate = true defer func() { @@ -1478,18 +1545,19 @@ func (s *testEvaluatorSuite) TestField(c *C) { {[]interface{}{1.10, 0, 11e-1}, int64(2)}, {[]interface{}{"abc", 0, 1, 11.1, 1.1}, int64(1)}, } - for _, t := range tbl { + for _, c := range tbl { fc := funcs[ast.Field] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(t.argLst...))) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(c.argLst...))) + require.NoError(t, err) + require.NotNil(t, f) r, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(r, testutil.DatumEquals, types.NewDatum(t.ret)) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(c.ret), r) } } -func (s *testEvaluatorSuite) TestLpad(c *C) { +func TestLpad(t *testing.T) { + ctx := createContext(t) tests := []struct { str string len int64 @@ -1510,21 +1578,22 @@ func (s *testEvaluatorSuite) TestLpad(c *C) { str := types.NewStringDatum(test.str) length := types.NewIntDatum(test.len) padStr := types.NewStringDatum(test.padStr) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{str, length, padStr})) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{str, length, padStr})) + require.NoError(t, err) + require.NotNil(t, f) result, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) if test.expect == nil { - c.Assert(result.Kind(), Equals, types.KindNull) + require.Equal(t, types.KindNull, result.Kind()) } else { expect, _ := test.expect.(string) - c.Assert(result.GetString(), Equals, expect) + require.Equal(t, expect, result.GetString()) } } } -func (s *testEvaluatorSuite) TestRpad(c *C) { +func TestRpad(t *testing.T) { + ctx := createContext(t) tests := []struct { str string len int64 @@ -1545,21 +1614,22 @@ func (s *testEvaluatorSuite) TestRpad(c *C) { str := types.NewStringDatum(test.str) length := types.NewIntDatum(test.len) padStr := types.NewStringDatum(test.padStr) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{str, length, padStr})) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{str, length, padStr})) + require.NoError(t, err) + require.NotNil(t, f) result, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) if test.expect == nil { - c.Assert(result.Kind(), Equals, types.KindNull) + require.Equal(t, types.KindNull, result.Kind()) } else { expect, _ := test.expect.(string) - c.Assert(result.GetString(), Equals, expect) + require.Equal(t, expect, result.GetString()) } } } -func (s *testEvaluatorSuite) TestRpadSig(c *C) { +func TestRpadSig(t *testing.T) { + ctx := createContext(t) colTypes := []*types.FieldType{ {Tp: mysql.TypeVarchar}, {Tp: mysql.TypeLonglong}, @@ -1573,7 +1643,7 @@ func (s *testEvaluatorSuite) TestRpadSig(c *C) { &Column{Index: 2, RetType: colTypes[2]}, } - base := baseBuiltinFunc{args: args, ctx: s.ctx, tp: resultType} + base := baseBuiltinFunc{args: args, ctx: ctx, tp: resultType} rpad := &builtinRpadUTF8Sig{base, 1000} input := chunk.NewChunkWithCapacity(colTypes, 10) @@ -1585,22 +1655,23 @@ func (s *testEvaluatorSuite) TestRpadSig(c *C) { input.AppendString(2, "123") res, isNull, err := rpad.evalString(input.GetRow(0)) - c.Assert(res, Equals, "abc123") - c.Assert(isNull, IsFalse) - c.Assert(err, IsNil) + require.Equal(t, "abc123", res) + require.False(t, isNull) + require.NoError(t, err) res, isNull, err = rpad.evalString(input.GetRow(1)) - c.Assert(res, Equals, "") - c.Assert(isNull, IsTrue) - c.Assert(err, IsNil) + require.Equal(t, "", res) + require.True(t, isNull) + require.NoError(t, err) - warnings := s.ctx.GetSessionVars().StmtCtx.GetWarnings() - c.Assert(len(warnings), Equals, 1) + warnings := ctx.GetSessionVars().StmtCtx.GetWarnings() + require.Equal(t, 1, len(warnings)) lastWarn := warnings[len(warnings)-1] - c.Assert(terror.ErrorEqual(errWarnAllowedPacketOverflowed, lastWarn.Err), IsTrue, Commentf("err %v", lastWarn.Err)) + require.Truef(t, terror.ErrorEqual(errWarnAllowedPacketOverflowed, lastWarn.Err), "err %v", lastWarn.Err) } -func (s *testEvaluatorSuite) TestInsertBinarySig(c *C) { +func TestInsertBinarySig(t *testing.T) { + ctx := createContext(t) colTypes := []*types.FieldType{ {Tp: mysql.TypeVarchar}, {Tp: mysql.TypeLonglong}, @@ -1616,7 +1687,7 @@ func (s *testEvaluatorSuite) TestInsertBinarySig(c *C) { &Column{Index: 3, RetType: colTypes[3]}, } - base := baseBuiltinFunc{args: args, ctx: s.ctx, tp: resultType} + base := baseBuiltinFunc{args: args, ctx: ctx, tp: resultType} insert := &builtinInsertSig{base, 3} input := chunk.NewChunkWithCapacity(colTypes, 2) @@ -1650,47 +1721,48 @@ func (s *testEvaluatorSuite) TestInsertBinarySig(c *C) { input.AppendNull(3) res, isNull, err := insert.evalString(input.GetRow(0)) - c.Assert(res, Equals, "abd") - c.Assert(isNull, IsFalse) - c.Assert(err, IsNil) + require.Equal(t, "abd", res) + require.False(t, isNull) + require.NoError(t, err) res, isNull, err = insert.evalString(input.GetRow(1)) - c.Assert(res, Equals, "") - c.Assert(isNull, IsTrue) - c.Assert(err, IsNil) + require.Equal(t, "", res) + require.True(t, isNull) + require.NoError(t, err) res, isNull, err = insert.evalString(input.GetRow(2)) - c.Assert(res, Equals, "abc") - c.Assert(isNull, IsFalse) - c.Assert(err, IsNil) + require.Equal(t, "abc", res) + require.False(t, isNull) + require.NoError(t, err) res, isNull, err = insert.evalString(input.GetRow(3)) - c.Assert(res, Equals, "") - c.Assert(isNull, IsTrue) - c.Assert(err, IsNil) + require.Equal(t, "", res) + require.True(t, isNull) + require.NoError(t, err) res, isNull, err = insert.evalString(input.GetRow(4)) - c.Assert(res, Equals, "") - c.Assert(isNull, IsTrue) - c.Assert(err, IsNil) + require.Equal(t, "", res) + require.True(t, isNull) + require.NoError(t, err) res, isNull, err = insert.evalString(input.GetRow(5)) - c.Assert(res, Equals, "") - c.Assert(isNull, IsTrue) - c.Assert(err, IsNil) + require.Equal(t, "", res) + require.True(t, isNull) + require.NoError(t, err) res, isNull, err = insert.evalString(input.GetRow(6)) - c.Assert(res, Equals, "") - c.Assert(isNull, IsTrue) - c.Assert(err, IsNil) + require.Equal(t, "", res) + require.True(t, isNull) + require.NoError(t, err) - warnings := s.ctx.GetSessionVars().StmtCtx.GetWarnings() - c.Assert(len(warnings), Equals, 1) + warnings := ctx.GetSessionVars().StmtCtx.GetWarnings() + require.Equal(t, 1, len(warnings)) lastWarn := warnings[len(warnings)-1] - c.Assert(terror.ErrorEqual(errWarnAllowedPacketOverflowed, lastWarn.Err), IsTrue, Commentf("err %v", lastWarn.Err)) + require.Truef(t, terror.ErrorEqual(errWarnAllowedPacketOverflowed, lastWarn.Err), "err %v", lastWarn.Err) } -func (s *testEvaluatorSuite) TestInstr(c *C) { +func TestInstr(t *testing.T) { + ctx := createContext(t) tbl := []struct { Args []interface{} Want interface{} @@ -1724,17 +1796,18 @@ func (s *testEvaluatorSuite) TestInstr(c *C) { Dtbl := tblToDtbl(tbl) instr := funcs[ast.Instr] - for i, t := range Dtbl { - f, err := instr.getFunction(s.ctx, s.datumsToConstants(t["Args"])) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + for i, c := range Dtbl { + f, err := instr.getFunction(ctx, datumsToConstants(c["Args"])) + require.NoError(t, err) + require.NotNil(t, f) got, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(got, DeepEquals, t["Want"][0], Commentf("[%d]: args: %v", i, t["Args"])) + require.NoError(t, err) + require.Equalf(t, c["Want"][0], got, "[%d]: args: %v", i, c["Args"]) } } -func (s *testEvaluatorSuite) TestLoadFile(c *C) { +func TestLoadFile(t *testing.T) { + ctx := createContext(t) cases := []struct { arg interface{} isNil bool @@ -1746,26 +1819,27 @@ func (s *testEvaluatorSuite) TestLoadFile(c *C) { {"tidb.sql", true, false, ""}, {nil, true, false, ""}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.LoadFile, s.primitiveValsToConstants([]interface{}{t.arg})...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.LoadFile, primitiveValsToConstants(ctx, []interface{}{c.arg})...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetString(), Equals, t.res) + require.Equal(t, c.res, d.GetString()) } } } - _, err := funcs[ast.LoadFile].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.LoadFile].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestMakeSet(c *C) { +func TestMakeSet(t *testing.T) { + ctx := createContext(t) tbl := []struct { argList []interface{} ret interface{} @@ -1779,18 +1853,19 @@ func (s *testEvaluatorSuite) TestMakeSet(c *C) { {[]interface{}{-1, "hello", "nice", "abc", "world"}, "hello,nice,abc,world"}, } - for _, t := range tbl { + for _, c := range tbl { fc := funcs[ast.MakeSet] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(t.argList...))) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(c.argList...))) + require.NoError(t, err) + require.NotNil(t, f) r, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(r, testutil.DatumEquals, types.NewDatum(t.ret)) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(c.ret), r) } } -func (s *testEvaluatorSuite) TestOct(c *C) { +func TestOct(t *testing.T) { + ctx := createContext(t) octTests := []struct { origin interface{} ret string @@ -1822,23 +1897,24 @@ func (s *testEvaluatorSuite) TestOct(c *C) { fc := funcs[ast.Oct] for _, tt := range octTests { in := types.NewDatum(tt.origin) - f, _ := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{in})) - c.Assert(f, NotNil) + f, _ := fc.getFunction(ctx, datumsToConstants([]types.Datum{in})) + require.NotNil(t, f) r, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) res, err := r.ToString() - c.Assert(err, IsNil) - c.Assert(res, Equals, tt.ret, Commentf("select oct(%v);", tt.origin)) + require.NoError(t, err) + require.Equalf(t, tt.ret, res, "select oct(%v);", tt.origin) } // tt NULL input for sha var argNull types.Datum - f, _ := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{argNull})) + f, _ := fc.getFunction(ctx, datumsToConstants([]types.Datum{argNull})) r, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(r.IsNull(), IsTrue) + require.NoError(t, err) + require.True(t, r.IsNull()) } -func (s *testEvaluatorSuite) TestFormat(c *C) { +func TestFormat(t *testing.T) { + ctx := createContext(t) formatTests := []struct { number interface{} precision interface{} @@ -1910,63 +1986,64 @@ func (s *testEvaluatorSuite) TestFormat(c *C) { fc := funcs[ast.Format] for _, tt := range formatTests { - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(tt.number, tt.precision, tt.locale))) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(tt.number, tt.precision, tt.locale))) + require.NoError(t, err) + require.NotNil(t, f) r, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(r, testutil.DatumEquals, types.NewDatum(tt.ret)) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(tt.ret), r) } - origConfig := s.ctx.GetSessionVars().StmtCtx.TruncateAsWarning - s.ctx.GetSessionVars().StmtCtx.TruncateAsWarning = true + origConfig := ctx.GetSessionVars().StmtCtx.TruncateAsWarning + ctx.GetSessionVars().StmtCtx.TruncateAsWarning = true for _, tt := range formatTests1 { - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(tt.number, tt.precision))) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(tt.number, tt.precision))) + require.NoError(t, err) + require.NotNil(t, f) r, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(r, testutil.DatumEquals, types.NewDatum(tt.ret), Commentf("test %v", tt)) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(tt.ret), r, fmt.Sprintf("test %v", tt)) if tt.warnings > 0 { - warnings := s.ctx.GetSessionVars().StmtCtx.GetWarnings() - c.Assert(len(warnings), Equals, tt.warnings, Commentf("test %v", tt)) + warnings := ctx.GetSessionVars().StmtCtx.GetWarnings() + require.Lenf(t, warnings, tt.warnings, "test %v", tt) for i := 0; i < tt.warnings; i++ { - c.Assert(terror.ErrorEqual(types.ErrTruncatedWrongVal, warnings[i].Err), IsTrue, Commentf("test %v", tt)) + require.Truef(t, terror.ErrorEqual(types.ErrTruncatedWrongVal, warnings[i].Err), "test %v", tt) } - s.ctx.GetSessionVars().StmtCtx.SetWarnings([]stmtctx.SQLWarn{}) + ctx.GetSessionVars().StmtCtx.SetWarnings([]stmtctx.SQLWarn{}) } } - s.ctx.GetSessionVars().StmtCtx.TruncateAsWarning = origConfig + ctx.GetSessionVars().StmtCtx.TruncateAsWarning = origConfig - f2, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(formatTests2.number, formatTests2.precision, formatTests2.locale))) - c.Assert(err, IsNil) - c.Assert(f2, NotNil) + f2, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(formatTests2.number, formatTests2.precision, formatTests2.locale))) + require.NoError(t, err) + require.NotNil(t, f2) r2, err := evalBuiltinFunc(f2, chunk.Row{}) - c.Assert(types.NewDatum(err), testutil.DatumEquals, types.NewDatum(errors.New("not implemented"))) - c.Assert(r2, testutil.DatumEquals, types.NewDatum(formatTests2.ret)) + trequire.DatumEqual(t, types.NewDatum(errors.New("not implemented")), types.NewDatum(err)) + trequire.DatumEqual(t, types.NewDatum(formatTests2.ret), r2) - f3, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(formatTests3.number, formatTests3.precision, formatTests3.locale))) - c.Assert(err, IsNil) - c.Assert(f3, NotNil) + f3, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(formatTests3.number, formatTests3.precision, formatTests3.locale))) + require.NoError(t, err) + require.NotNil(t, f3) r3, err := evalBuiltinFunc(f3, chunk.Row{}) - c.Assert(types.NewDatum(err), testutil.DatumEquals, types.NewDatum(errors.New("not support for the specific locale"))) - c.Assert(r3, testutil.DatumEquals, types.NewDatum(formatTests3.ret)) + trequire.DatumEqual(t, types.NewDatum(errors.New("not support for the specific locale")), types.NewDatum(err)) + trequire.DatumEqual(t, types.NewDatum(formatTests3.ret), r3) - f4, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(formatTests4.number, formatTests4.precision, formatTests4.locale))) - c.Assert(err, IsNil) - c.Assert(f4, NotNil) + f4, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(formatTests4.number, formatTests4.precision, formatTests4.locale))) + require.NoError(t, err) + require.NotNil(t, f4) r4, err := evalBuiltinFunc(f4, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(r4, testutil.DatumEquals, types.NewDatum(formatTests4.ret)) - warnings := s.ctx.GetSessionVars().StmtCtx.GetWarnings() - c.Assert(len(warnings), Equals, 3) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(formatTests4.ret), r4) + warnings := ctx.GetSessionVars().StmtCtx.GetWarnings() + require.Equal(t, 3, len(warnings)) for i := 0; i < 3; i++ { - c.Assert(terror.ErrorEqual(errUnknownLocale, warnings[i].Err), IsTrue) + require.True(t, terror.ErrorEqual(errUnknownLocale, warnings[i].Err)) } - s.ctx.GetSessionVars().StmtCtx.SetWarnings([]stmtctx.SQLWarn{}) + ctx.GetSessionVars().StmtCtx.SetWarnings([]stmtctx.SQLWarn{}) } -func (s *testEvaluatorSuite) TestFromBase64(c *C) { +func TestFromBase64(t *testing.T) { + ctx := createContext(t) tests := []struct { args interface{} expect interface{} @@ -1996,21 +2073,22 @@ func (s *testEvaluatorSuite) TestFromBase64(c *C) { } fc := funcs[ast.FromBase64] for _, test := range tests { - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(test.args))) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(test.args))) + require.NoError(t, err) + require.NotNil(t, f) result, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) if test.expect == nil { - c.Assert(result.Kind(), Equals, types.KindNull) + require.Equal(t, types.KindNull, result.Kind()) } else { expect, _ := test.expect.(string) - c.Assert(result.GetString(), Equals, expect) + require.Equal(t, expect, result.GetString()) } } } -func (s *testEvaluatorSuite) TestFromBase64Sig(c *C) { +func TestFromBase64Sig(t *testing.T) { + ctx := createContext(t) colTypes := []*types.FieldType{ {Tp: mysql.TypeVarchar}, } @@ -2043,26 +2121,27 @@ func (s *testEvaluatorSuite) TestFromBase64Sig(c *C) { for _, test := range tests { resultType := &types.FieldType{Tp: mysql.TypeVarchar, Flen: mysql.MaxBlobWidth} - base := baseBuiltinFunc{args: args, ctx: s.ctx, tp: resultType} + base := baseBuiltinFunc{args: args, ctx: ctx, tp: resultType} fromBase64 := &builtinFromBase64Sig{base, test.maxAllowPacket} input := chunk.NewChunkWithCapacity(colTypes, 1) input.AppendString(0, test.args) res, isNull, err := fromBase64.evalString(input.GetRow(0)) - c.Assert(err, IsNil) - c.Assert(isNull, Equals, test.isNil) + require.NoError(t, err) + require.Equal(t, test.isNil, isNull) if isNull { - warnings := s.ctx.GetSessionVars().StmtCtx.GetWarnings() - c.Assert(len(warnings), Equals, 1) + warnings := ctx.GetSessionVars().StmtCtx.GetWarnings() + require.Equal(t, 1, len(warnings)) lastWarn := warnings[len(warnings)-1] - c.Assert(terror.ErrorEqual(errWarnAllowedPacketOverflowed, lastWarn.Err), IsTrue) - s.ctx.GetSessionVars().StmtCtx.SetWarnings([]stmtctx.SQLWarn{}) + require.True(t, terror.ErrorEqual(errWarnAllowedPacketOverflowed, lastWarn.Err)) + ctx.GetSessionVars().StmtCtx.SetWarnings([]stmtctx.SQLWarn{}) } - c.Assert(res, Equals, test.expect) + require.Equal(t, test.expect, res) } } -func (s *testEvaluatorSuite) TestInsert(c *C) { +func TestInsert(t *testing.T) { + ctx := createContext(t) tests := []struct { args []interface{} expect interface{} @@ -2093,61 +2172,73 @@ func (s *testEvaluatorSuite) TestInsert(c *C) { } fc := funcs[ast.InsertFunc] for _, test := range tests { - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(test.args...))) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(test.args...))) + require.NoError(t, err) + require.NotNil(t, f) result, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) if test.expect == nil { - c.Assert(result.Kind(), Equals, types.KindNull) + require.Equal(t, types.KindNull, result.Kind()) } else { expect, _ := test.expect.(string) - c.Assert(result.GetString(), Equals, expect) + require.Equal(t, expect, result.GetString()) } } } -func (s *testEvaluatorSuite) TestOrd(c *C) { +func TestOrd(t *testing.T) { + // TODO: Remove this and enable test parallel after new charset enabled + collate.SetCharsetFeatEnabledForTest(true) + defer collate.SetCharsetFeatEnabledForTest(false) + ctx := createContext(t) cases := []struct { args interface{} expected int64 + chs string isNil bool getErr bool }{ - {"2", 50, false, false}, - {2, 50, false, false}, - {"23", 50, false, false}, - {23, 50, false, false}, - {2.3, 50, false, false}, - {nil, 0, true, false}, - {"", 0, false, false}, - {"你好", 14990752, false, false}, - {"にほん", 14909867, false, false}, - {"한국", 15570332, false, false}, - {"👍", 4036989325, false, false}, - {"א", 55184, false, false}, - } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.Ord, s.primitiveValsToConstants([]interface{}{t.args})...) - c.Assert(err, IsNil) + {"2", 50, "", false, false}, + {2, 50, "", false, false}, + {"23", 50, "", false, false}, + {23, 50, "", false, false}, + {2.3, 50, "", false, false}, + {nil, 0, "", true, false}, + {"", 0, "", false, false}, + {"你好", 14990752, "", false, false}, + {"にほん", 14909867, "", false, false}, + {"한국", 15570332, "", false, false}, + {"👍", 4036989325, "", false, false}, + {"א", 55184, "", false, false}, + {"abc", 97, "gbk", false, false}, + {"一二三", 53947, "gbk", false, false}, + {"àáèé", 43172, "gbk", false, false}, + {"数据库", 51965, "gbk", false, false}, + } + for _, c := range cases { + err := ctx.GetSessionVars().SetSystemVar(variable.CharacterSetConnection, c.chs) + require.NoError(t, err) + f, err := newFunctionForTest(ctx, ast.Ord, primitiveValsToConstants(ctx, []interface{}{c.args})...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetInt64(), Equals, t.expected) + require.Equal(t, c.expected, d.GetInt64()) } } } - _, err := funcs[ast.Ord].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.Ord].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestElt(c *C) { +func TestElt(t *testing.T) { + ctx := createContext(t) tbl := []struct { argLst []interface{} ret interface{} @@ -2159,17 +2250,18 @@ func (s *testEvaluatorSuite) TestElt(c *C) { {[]interface{}{3, 2, 3, 11, 1}, "11"}, {[]interface{}{1.1, "2.1", "3.1", "11.1", "1.1"}, "2.1"}, } - for _, t := range tbl { + for _, c := range tbl { fc := funcs[ast.Elt] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(t.argLst...))) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(c.argLst...))) + require.NoError(t, err) r, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(r, testutil.DatumEquals, types.NewDatum(t.ret)) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(c.ret), r) } } -func (s *testEvaluatorSuite) TestExportSet(c *C) { +func TestExportSet(t *testing.T) { + ctx := createContext(t) estd := []struct { argLst []interface{} res string @@ -2186,19 +2278,19 @@ func (s *testEvaluatorSuite) TestExportSet(c *C) { {[]interface{}{7, "Y", "N", 6, 133}, "Y6Y6Y6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N6N"}, } fc := funcs[ast.ExportSet] - for _, t := range estd { - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(t.argLst...))) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + for _, c := range estd { + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(c.argLst...))) + require.NoError(t, err) + require.NotNil(t, f) exportSetRes, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) res, err := exportSetRes.ToString() - c.Assert(err, IsNil) - c.Assert(res, Equals, t.res) + require.NoError(t, err) + require.Equal(t, c.res, res) } } -func (s *testEvaluatorSuite) TestBin(c *C) { +func TestBin(t *testing.T) { tbl := []struct { Input interface{} Expected interface{} @@ -2219,17 +2311,18 @@ func (s *testEvaluatorSuite) TestBin(c *C) { dtbl := tblToDtbl(tbl) ctx := mock.NewContext() ctx.GetSessionVars().StmtCtx.IgnoreTruncate = true - for _, t := range dtbl { - f, err := fc.getFunction(ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + for _, c := range dtbl { + f, err := fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) + require.NotNil(t, f) r, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(r, testutil.DatumEquals, types.NewDatum(t["Expected"][0])) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(c["Expected"][0]), r) } } -func (s *testEvaluatorSuite) TestQuote(c *C) { +func TestQuote(t *testing.T) { + ctx := createContext(t) tbl := []struct { arg interface{} ret interface{} @@ -2246,18 +2339,19 @@ func (s *testEvaluatorSuite) TestQuote(c *C) { {nil, "NULL"}, } - for _, t := range tbl { + for _, c := range tbl { fc := funcs[ast.Quote] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(t.arg))) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(c.arg))) + require.NoError(t, err) + require.NotNil(t, f) r, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(r, testutil.DatumEquals, types.NewDatum(t.ret)) + require.NoError(t, err) + trequire.DatumEqual(t, types.NewDatum(c.ret), r) } } -func (s *testEvaluatorSuite) TestToBase64(c *C) { +func TestToBase64(t *testing.T) { + ctx := createContext(t) tests := []struct { args interface{} expect string @@ -2307,26 +2401,49 @@ func (s *testEvaluatorSuite) TestToBase64(c *C) { } for _, test := range tests { - f, err := newFunctionForTest(s.ctx, ast.ToBase64, s.primitiveValsToConstants([]interface{}{test.args})...) - c.Assert(err, IsNil) + f, err := newFunctionForTest(ctx, ast.ToBase64, primitiveValsToConstants(ctx, []interface{}{test.args})...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) if test.getErr { - c.Assert(err, NotNil) + require.Error(t, err) } else { - c.Assert(err, IsNil) + require.NoError(t, err) if test.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetString(), Equals, test.expect) + require.Equal(t, test.expect, d.GetString()) } } } - _, err := funcs[ast.ToBase64].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.ToBase64].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) + + // Test GBK String + tbl := []struct { + input string + chs string + result string + }{ + {"abc", "gbk", "YWJj"}, + {"一二三", "gbk", "0ru2/sj9"}, + {"一二三", "", "5LiA5LqM5LiJ"}, + {"一二三!", "gbk", "0ru2/sj9IQ=="}, + {"一二三!", "", "5LiA5LqM5LiJIQ=="}, + } + for _, c := range tbl { + err := ctx.GetSessionVars().SetSystemVar(variable.CharacterSetConnection, c.chs) + require.NoError(t, err) + f, err := newFunctionForTest(ctx, ast.ToBase64, primitiveValsToConstants(ctx, []interface{}{c.input})...) + require.NoError(t, err) + d, err := f.Eval(chunk.Row{}) + require.NoError(t, err) + require.Equal(t, c.result, d.GetString()) + } } -func (s *testEvaluatorSuite) TestToBase64Sig(c *C) { +func TestToBase64Sig(t *testing.T) { + ctx := createContext(t) colTypes := []*types.FieldType{ {Tp: mysql.TypeVarchar}, } @@ -2371,30 +2488,31 @@ func (s *testEvaluatorSuite) TestToBase64Sig(c *C) { for _, test := range tests { resultType := &types.FieldType{Tp: mysql.TypeVarchar, Flen: base64NeededEncodedLength(len(test.args))} - base := baseBuiltinFunc{args: args, ctx: s.ctx, tp: resultType} + base := baseBuiltinFunc{args: args, ctx: ctx, tp: resultType} toBase64 := &builtinToBase64Sig{base, test.maxAllowPacket} input := chunk.NewChunkWithCapacity(colTypes, 1) input.AppendString(0, test.args) res, isNull, err := toBase64.evalString(input.GetRow(0)) - c.Assert(err, IsNil) + require.NoError(t, err) if test.isNil { - c.Assert(isNull, IsTrue) + require.True(t, isNull) - warnings := s.ctx.GetSessionVars().StmtCtx.GetWarnings() - c.Assert(len(warnings), Equals, 1) + warnings := ctx.GetSessionVars().StmtCtx.GetWarnings() + require.Equal(t, 1, len(warnings)) lastWarn := warnings[len(warnings)-1] - c.Assert(terror.ErrorEqual(errWarnAllowedPacketOverflowed, lastWarn.Err), IsTrue) - s.ctx.GetSessionVars().StmtCtx.SetWarnings([]stmtctx.SQLWarn{}) + require.True(t, terror.ErrorEqual(errWarnAllowedPacketOverflowed, lastWarn.Err)) + ctx.GetSessionVars().StmtCtx.SetWarnings([]stmtctx.SQLWarn{}) } else { - c.Assert(isNull, IsFalse) + require.False(t, isNull) } - c.Assert(res, Equals, test.expect) + require.Equal(t, test.expect, res) } } -func (s *testEvaluatorSuite) TestStringRight(c *C) { +func TestStringRight(t *testing.T) { + ctx := createContext(t) fc := funcs[ast.Right] tests := []struct { str interface{} @@ -2412,20 +2530,21 @@ func (s *testEvaluatorSuite) TestStringRight(c *C) { for _, test := range tests { str := types.NewDatum(test.str) length := types.NewDatum(test.length) - f, _ := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{str, length})) + f, _ := fc.getFunction(ctx, datumsToConstants([]types.Datum{str, length})) result, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) if result.IsNull() { - c.Assert(test.expect, IsNil) + require.Nil(t, test.expect) continue } res, err := result.ToString() - c.Assert(err, IsNil) - c.Assert(res, Equals, test.expect) + require.NoError(t, err) + require.Equal(t, test.expect, res) } } -func (s *testEvaluatorSuite) TestWeightString(c *C) { +func TestWeightString(t *testing.T) { + ctx := createContext(t) fc := funcs[ast.WeightString] tests := []struct { expr interface{} @@ -2465,114 +2584,40 @@ func (s *testEvaluatorSuite) TestWeightString(c *C) { var f builtinFunc var err error if test.padding == "NONE" { - f, err = fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{str})) + f, err = fc.getFunction(ctx, datumsToConstants([]types.Datum{str})) } else { padding := types.NewDatum(test.padding) length := types.NewDatum(test.length) - f, err = fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{str, padding, length})) + f, err = fc.getFunction(ctx, datumsToConstants([]types.Datum{str, padding, length})) } - c.Assert(err, IsNil) + require.NoError(t, err) // Reset warnings. - s.ctx.GetSessionVars().StmtCtx.ResetForRetry() + ctx.GetSessionVars().StmtCtx.ResetForRetry() result, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) if result.IsNull() { - c.Assert(test.expect, IsNil) + require.Nil(t, test.expect) continue } res, err := result.ToString() - c.Assert(err, IsNil) - c.Assert(res, Equals, test.expect) + require.NoError(t, err) + require.Equal(t, test.expect, res) if test.expr == nil { continue } strExpr := fmt.Sprintf("%v", test.expr) if test.padding == "BINARY" && test.length < len(strExpr) { expectWarn := fmt.Sprintf("[expression:1292]Truncated incorrect BINARY(%d) value: '%s'", test.length, strExpr) - obtainedWarns := s.ctx.GetSessionVars().StmtCtx.GetWarnings() - c.Assert(len(obtainedWarns), Equals, 1) - c.Assert(obtainedWarns[0].Level, Equals, "Warning") - c.Assert(obtainedWarns[0].Err.Error(), Equals, expectWarn) - } - } -} - -func (s *testEvaluatorSerialSuites) TestCIWeightString(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - - type weightStringTest struct { - str string - padding string - length int - expect interface{} - } - - checkResult := func(collation string, tests []weightStringTest) { - fc := funcs[ast.WeightString] - for _, test := range tests { - str := types.NewCollationStringDatum(test.str, collation, utf8.RuneCountInString(test.str)) - var f builtinFunc - var err error - if test.padding == "NONE" { - f, err = fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{str})) - } else { - padding := types.NewDatum(test.padding) - length := types.NewDatum(test.length) - f, err = fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{str, padding, length})) - } - c.Assert(err, IsNil) - result, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - if result.IsNull() { - c.Assert(test.expect, IsNil) - continue - } - res, err := result.ToString() - c.Assert(err, IsNil) - c.Assert(res, Equals, test.expect) + obtainedWarns := ctx.GetSessionVars().StmtCtx.GetWarnings() + require.Equal(t, 1, len(obtainedWarns)) + require.Equal(t, "Warning", obtainedWarns[0].Level) + require.Equal(t, expectWarn, obtainedWarns[0].Err.Error()) } } - - generalTests := []weightStringTest{ - {"aAÁàãăâ", "NONE", 0, "\x00A\x00A\x00A\x00A\x00A\x00A\x00A"}, - {"中", "NONE", 0, "\x4E\x2D"}, - {"a", "CHAR", 5, "\x00A"}, - {"a ", "CHAR", 5, "\x00A"}, - {"中", "CHAR", 5, "\x4E\x2D"}, - {"中 ", "CHAR", 5, "\x4E\x2D"}, - {"a", "BINARY", 1, "a"}, - {"ab", "BINARY", 1, "a"}, - {"a", "BINARY", 5, "a\x00\x00\x00\x00"}, - {"a ", "BINARY", 5, "a \x00\x00\x00"}, - {"中", "BINARY", 1, "\xe4"}, - {"中", "BINARY", 2, "\xe4\xb8"}, - {"中", "BINARY", 3, "中"}, - {"中", "BINARY", 5, "中\x00\x00"}, - } - - unicodeTests := []weightStringTest{ - {"aAÁàãăâ", "NONE", 0, "\x0e3\x0e3\x0e3\x0e3\x0e3\x0e3\x0e3"}, - {"中", "NONE", 0, "\xfb\x40\xce\x2d"}, - {"a", "CHAR", 5, "\x0e3"}, - {"a ", "CHAR", 5, "\x0e3"}, - {"中", "CHAR", 5, "\xfb\x40\xce\x2d"}, - {"中 ", "CHAR", 5, "\xfb\x40\xce\x2d"}, - {"a", "BINARY", 1, "a"}, - {"ab", "BINARY", 1, "a"}, - {"a", "BINARY", 5, "a\x00\x00\x00\x00"}, - {"a ", "BINARY", 5, "a \x00\x00\x00"}, - {"中", "BINARY", 1, "\xe4"}, - {"中", "BINARY", 2, "\xe4\xb8"}, - {"中", "BINARY", 3, "中"}, - {"中", "BINARY", 5, "中\x00\x00"}, - } - - checkResult("utf8mb4_general_ci", generalTests) - checkResult("utf8mb4_unicode_ci", unicodeTests) } -func (s *testEvaluatorSuite) TestTranslate(c *C) { +func TestTranslate(t *testing.T) { + ctx := createContext(t) cases := []struct { args []interface{} isNil bool @@ -2601,18 +2646,18 @@ func (s *testEvaluatorSuite) TestTranslate(c *C) { {[]interface{}{[]byte{255, 255}, []byte{255, 255}, []byte{254, 253}}, false, false, string([]byte{254, 254})}, {[]interface{}{[]byte{255, 254, 253, 252, 251}, []byte{253, 252, 251}, []byte{254, 253}}, false, false, string([]byte{255, 254, 254, 253})}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.Translate, s.primitiveValsToConstants(t.args)...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.Translate, primitiveValsToConstants(ctx, c.args)...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.isErr { - c.Assert(err, NotNil) + if c.isErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetString(), Equals, t.res) + require.Equal(t, c.res, d.GetString()) } } } diff --git a/expression/builtin_string_vec.go b/expression/builtin_string_vec.go index 6b91c1c2f77c9..62c123faf07bd 100644 --- a/expression/builtin_string_vec.go +++ b/expression/builtin_string_vec.go @@ -447,7 +447,6 @@ func (b *builtinHexStrArgSig) vecEvalString(input *chunk.Chunk, result *chunk.Co return err } defer b.bufAllocator.put(buf0) - var encodedBuf []byte if err := b.args[0].VecEvalString(b.ctx, input, buf0); err != nil { return err } @@ -457,13 +456,7 @@ func (b *builtinHexStrArgSig) vecEvalString(input *chunk.Chunk, result *chunk.Co result.AppendNull() continue } - buf0Bytes := buf0.GetBytes(i) - encodedBuf, err = b.encoding.Encode(encodedBuf, buf0Bytes) - if err != nil { - return err - } - buf0Bytes = encodedBuf - result.AppendString(strings.ToUpper(hex.EncodeToString(buf0Bytes))) + result.AppendString(strings.ToUpper(hex.EncodeToString(buf0.GetBytes(i)))) } return nil } @@ -692,6 +685,14 @@ func (b *builtinConvertSig) vecEvalString(input *chunk.Chunk, result *chunk.Colu if encoding == nil { return errUnknownCharacterSet.GenWithStackByArgs(b.tp.Charset) } + decoder := encoding.NewDecoder() + isBinaryStr := types.IsBinaryStr(b.args[0].GetType()) + isRetBinary := types.IsBinaryStr(b.tp) + enc := charset.NewEncoding(b.tp.Charset) + if isRetBinary { + enc = charset.NewEncoding(b.args[0].GetType().Charset) + } + result.ReserveString(n) for i := 0; i < n; i++ { if expr.IsNull(i) { @@ -699,11 +700,24 @@ func (b *builtinConvertSig) vecEvalString(input *chunk.Chunk, result *chunk.Colu continue } exprI := expr.GetString(i) - target, _, err := transform.String(encoding.NewDecoder(), exprI) - if err != nil { - return err + if isBinaryStr { + target, _, err := transform.String(decoder, exprI) + if err != nil { + result.AppendNull() + continue + } + result.AppendString(target) + } else { + if isRetBinary { + str, err := enc.EncodeString(exprI) + if err != nil { + return err + } + result.AppendString(str) + continue + } + result.AppendString(string(enc.EncodeInternal(nil, []byte(exprI)))) } - result.AppendString(target) } return nil } @@ -889,7 +903,6 @@ func (b *builtinASCIISig) vecEvalInt(input *chunk.Chunk, result *chunk.Column) e if err = b.args[0].VecEvalString(b.ctx, input, buf); err != nil { return err } - result.ResizeInt64(n, false) result.MergeNulls(buf) i64s := result.Int64s() @@ -2055,11 +2068,15 @@ func (b *builtinOrdSig) vecEvalInt(input *chunk.Chunk, result *chunk.Column) err return err } - ord, err := chooseOrdFunc(b.args[0].GetType().Charset) + charSet := b.args[0].GetType().Charset + ord, err := chooseOrdFunc(charSet) if err != nil { return err } + enc := charset.NewEncoding(charSet) + var encodedBuf []byte + result.ResizeInt64(n, false) result.MergeNulls(buf) i64s := result.Int64s() @@ -2067,8 +2084,12 @@ func (b *builtinOrdSig) vecEvalInt(input *chunk.Chunk, result *chunk.Column) err if result.IsNull(i) { continue } - str := buf.GetString(i) - i64s[i] = ord(str) + str := buf.GetBytes(i) + encoded, err := enc.EncodeFirstChar(encodedBuf, str) + if err != nil { + return err + } + i64s[i] = ord(encoded) } return nil } @@ -2127,10 +2148,6 @@ func (b *builtinLengthSig) vecEvalInt(input *chunk.Chunk, result *chunk.Column) return err } - argTp := b.args[0].GetType() - enc := charset.NewEncoding(argTp.Charset) - isBinaryStr := types.IsBinaryStr(argTp) - result.ResizeInt64(n, false) result.MergeNulls(buf) i64s := result.Int64s() @@ -2139,13 +2156,6 @@ func (b *builtinLengthSig) vecEvalInt(input *chunk.Chunk, result *chunk.Column) continue } str := buf.GetBytes(i) - if !isBinaryStr { - dBytes, err := enc.Encode(nil, str) - if err == nil { - i64s[i] = int64(len(dBytes)) - continue - } - } i64s[i] = int64(len(str)) } return nil @@ -2221,6 +2231,9 @@ func (b *builtinBitLengthSig) vecEvalInt(input *chunk.Chunk, result *chunk.Colum return err } + argTp := b.args[0].GetType() + enc := charset.NewEncoding(argTp.Charset) + result.ResizeInt64(n, false) result.MergeNulls(buf) i64s := result.Int64s() @@ -2229,7 +2242,11 @@ func (b *builtinBitLengthSig) vecEvalInt(input *chunk.Chunk, result *chunk.Colum continue } str := buf.GetBytes(i) - i64s[i] = int64(len(str) * 8) + dBytes, err := enc.Encode(nil, str) + if err != nil { + return err + } + i64s[i] = int64(len(dBytes) * 8) } return nil } @@ -2264,6 +2281,8 @@ func (b *builtinCharSig) vecEvalString(input *chunk.Chunk, result *chunk.Column) for i := 0; i < l-1; i++ { bufint[i] = buf[i].Int64s() } + var resultBytes []byte + enc := charset.NewEncoding(b.tp.Charset) for i := 0; i < n; i++ { bigints = bigints[0:0] for j := 0; j < l-1; j++ { @@ -2272,8 +2291,15 @@ func (b *builtinCharSig) vecEvalString(input *chunk.Chunk, result *chunk.Column) } bigints = append(bigints, bufint[j][i]) } - tempString := string(b.convertToBytes(bigints)) - result.AppendString(tempString) + dBytes := b.convertToBytes(bigints) + + resultBytes, err := enc.Decode(resultBytes, dBytes) + if err != nil { + b.ctx.GetSessionVars().StmtCtx.AppendWarning(err) + result.AppendNull() + continue + } + result.AppendString(string(resultBytes)) } return nil } @@ -2423,7 +2449,6 @@ func (b *builtinToBase64Sig) vecEvalString(input *chunk.Chunk, result *chunk.Col if err := b.args[0].VecEvalString(b.ctx, input, buf); err != nil { return err } - result.ReserveString(n) for i := 0; i < n; i++ { if buf.IsNull(i) { diff --git a/expression/builtin_string_vec_generated_test.go b/expression/builtin_string_vec_generated_test.go index 830a77a5913d7..010f657c378d1 100644 --- a/expression/builtin_string_vec_generated_test.go +++ b/expression/builtin_string_vec_generated_test.go @@ -19,7 +19,6 @@ package expression import ( "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/types" ) @@ -35,12 +34,12 @@ var vecGeneratedBuiltinStringCases = map[string][]vecExprBenchCase{ }, } -func (s *testEvaluatorSuite) TestVectorizedGeneratedBuiltinStringEvalOneVec(c *C) { - testVectorizedEvalOneVec(c, vecGeneratedBuiltinStringCases) +func TestVectorizedGeneratedBuiltinStringEvalOneVec(t *testing.T) { + testVectorizedEvalOneVec(t, vecGeneratedBuiltinStringCases) } -func (s *testEvaluatorSuite) TestVectorizedGeneratedBuiltinStringFunc(c *C) { - testVectorizedBuiltinFunc(c, vecGeneratedBuiltinStringCases) +func TestVectorizedGeneratedBuiltinStringFunc(t *testing.T) { + testVectorizedBuiltinFunc(t, vecGeneratedBuiltinStringCases) } func BenchmarkVectorizedGeneratedBuiltinStringEvalOneVec(b *testing.B) { diff --git a/expression/builtin_string_vec_test.go b/expression/builtin_string_vec_test.go index 59b5200522531..13bfb384e10ea 100644 --- a/expression/builtin_string_vec_test.go +++ b/expression/builtin_string_vec_test.go @@ -18,7 +18,6 @@ import ( "math/rand" "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/charset" "github.com/pingcap/tidb/parser/mysql" @@ -331,6 +330,12 @@ var vecBuiltinStringCases = map[string][]vecExprBenchCase{ geners: []dataGenerator{&charInt64Gener{}, &charInt64Gener{}, &charInt64Gener{}, nil}, constants: []*Constant{nil, nil, nil, {Value: types.NewDatum("ascii"), RetType: types.NewFieldType(mysql.TypeString)}}, }, + { + retEvalType: types.ETString, + childrenTypes: []types.EvalType{types.ETInt, types.ETInt, types.ETInt, types.ETString}, + geners: []dataGenerator{&charInt64Gener{}, nil, &charInt64Gener{}, nil}, + constants: []*Constant{nil, nil, nil, {Value: types.NewDatum("ascii"), RetType: types.NewFieldType(mysql.TypeString)}}, + }, }, ast.FindInSet: { {retEvalType: types.ETInt, childrenTypes: []types.EvalType{types.ETString, types.ETString}}, @@ -529,12 +534,12 @@ var vecBuiltinStringCases2 = map[string][]vecExprBenchCase{ }, } -func (s *testVectorizeSuite1) TestVectorizedBuiltinStringEvalOneVec(c *C) { - testVectorizedEvalOneVec(c, vecBuiltinStringCases) +func TestVectorizedBuiltinStringEvalOneVec(t *testing.T) { + testVectorizedEvalOneVec(t, vecBuiltinStringCases) } -func (s *testVectorizeSuite1) TestVectorizedBuiltinStringFunc(c *C) { - testVectorizedBuiltinFunc(c, vecBuiltinStringCases) +func TestVectorizedBuiltinStringFunc(t *testing.T) { + testVectorizedBuiltinFunc(t, vecBuiltinStringCases) } func BenchmarkVectorizedBuiltinStringEvalOneVec(b *testing.B) { @@ -545,12 +550,12 @@ func BenchmarkVectorizedBuiltinStringFunc(b *testing.B) { benchmarkVectorizedBuiltinFunc(b, vecBuiltinStringCases) } -func (s *testVectorizeSuite1) TestVectorizedBuiltinStringEvalOneVec2(c *C) { - testVectorizedEvalOneVec(c, vecBuiltinStringCases2) +func TestVectorizedBuiltinStringEvalOneVec2(t *testing.T) { + testVectorizedEvalOneVec(t, vecBuiltinStringCases2) } -func (s *testVectorizeSuite1) TestVectorizedBuiltinStringFunc2(c *C) { - testVectorizedBuiltinFunc(c, vecBuiltinStringCases2) +func TestVectorizedBuiltinStringFunc2(t *testing.T) { + testVectorizedBuiltinFunc(t, vecBuiltinStringCases2) } func BenchmarkVectorizedBuiltinStringEvalOneVec2(b *testing.B) { diff --git a/expression/builtin_test.go b/expression/builtin_test.go index 6a9d4adf75122..d5b59c359b700 100644 --- a/expression/builtin_test.go +++ b/expression/builtin_test.go @@ -17,8 +17,8 @@ package expression import ( "reflect" "sync" + "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/charset" "github.com/pingcap/tidb/parser/model" @@ -26,6 +26,7 @@ import ( "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" + "github.com/stretchr/testify/require" ) func evalBuiltinFuncConcurrent(f builtinFunc, row chunk.Row) (d types.Datum, err error) { @@ -85,7 +86,7 @@ func evalBuiltinFunc(f builtinFunc, row chunk.Row) (d types.Datum, err error) { return } -// tblToDtbl is a util function for test. +// tblToDtbl is a utility function for test. func tblToDtbl(i interface{}) []map[string][]types.Datum { l := reflect.ValueOf(i).Len() tbl := make([]map[string][]types.Datum, l) @@ -120,43 +121,45 @@ func makeDatums(i interface{}) []types.Datum { return types.MakeDatums(i) } -func (s *testEvaluatorSuite) TestIsNullFunc(c *C) { +func TestIsNullFunc(t *testing.T) { + ctx := createContext(t) fc := funcs[ast.IsNull] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(1))) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(1))) + require.NoError(t, err) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.GetInt64(), Equals, int64(0)) + require.NoError(t, err) + require.Equal(t, int64(0), v.GetInt64()) - f, err = fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(nil))) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(types.MakeDatums(nil))) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.GetInt64(), Equals, int64(1)) + require.NoError(t, err) + require.Equal(t, int64(1), v.GetInt64()) } -func (s *testEvaluatorSuite) TestLock(c *C) { +func TestLock(t *testing.T) { + ctx := createContext(t) lock := funcs[ast.GetLock] - f, err := lock.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(nil, 1))) - c.Assert(err, IsNil) + f, err := lock.getFunction(ctx, datumsToConstants(types.MakeDatums(nil, 1))) + require.NoError(t, err) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.GetInt64(), Equals, int64(1)) + require.NoError(t, err) + require.Equal(t, int64(1), v.GetInt64()) releaseLock := funcs[ast.ReleaseLock] - f, err = releaseLock.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(1))) - c.Assert(err, IsNil) + f, err = releaseLock.getFunction(ctx, datumsToConstants(types.MakeDatums(1))) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.GetInt64(), Equals, int64(1)) + require.NoError(t, err) + require.Equal(t, int64(1), v.GetInt64()) } -func (s *testEvaluatorSuite) TestDisplayName(c *C) { - c.Assert(GetDisplayName(ast.EQ), Equals, "=") - c.Assert(GetDisplayName(ast.NullEQ), Equals, "<=>") - c.Assert(GetDisplayName(ast.IsTruthWithoutNull), Equals, "IS TRUE") - c.Assert(GetDisplayName("abs"), Equals, "abs") - c.Assert(GetDisplayName("other_unknown_func"), Equals, "other_unknown_func") +func TestDisplayName(t *testing.T) { + require.Equal(t, "=", GetDisplayName(ast.EQ)) + require.Equal(t, "<=>", GetDisplayName(ast.NullEQ)) + require.Equal(t, "IS TRUE", GetDisplayName(ast.IsTruthWithoutNull)) + require.Equal(t, "abs", GetDisplayName("abs")) + require.Equal(t, "other_unknown_func", GetDisplayName("other_unknown_func")) } // newFunctionForTest creates a new ScalarFunction using funcName and arguments, @@ -185,3 +188,11 @@ var ( // MySQL varchar. varcharCon = &Constant{RetType: &types.FieldType{Tp: mysql.TypeVarchar, Charset: charset.CharsetUTF8, Collate: charset.CollationUTF8}} ) + +func getInt8Con() Expression { + return int8Con.Clone() +} + +func getVarcharCon() Expression { + return varcharCon.Clone() +} diff --git a/expression/builtin_time.go b/expression/builtin_time.go index e715f4e41d065..0c87fe8ec299c 100644 --- a/expression/builtin_time.go +++ b/expression/builtin_time.go @@ -300,7 +300,7 @@ func (b *builtinDateSig) evalTime(row chunk.Row) (types.Time, bool, error) { return types.ZeroTime, true, handleInvalidTimeError(b.ctx, err) } - if expr.IsZero() { + if expr.IsZero() && b.ctx.GetSessionVars().SQLMode.HasNoZeroDateMode() { return types.ZeroTime, true, handleInvalidTimeError(b.ctx, types.ErrWrongValue.GenWithStackByArgs(types.DateTimeStr, expr.String())) } @@ -4856,7 +4856,7 @@ func (b *builtinUnixTimestampIntSig) evalIntWithCtx(ctx sessionctx.Context, row } tz := ctx.GetSessionVars().Location() - t, err := val.GoTime(tz) + t, err := val.AdjustedGoTime(tz) if err != nil { return 0, false, nil } @@ -5666,7 +5666,7 @@ func (c *convertTzFunctionClass) getFunction(ctx sessionctx.Context, args []Expr return nil, err } // tzRegex holds the regex to check whether a string is a time zone. - tzRegex, err := regexp.Compile(`(^(\+|-)(0?[0-9]|1[0-2]):[0-5]?\d$)|(^\+13:00$)`) + tzRegex, err := regexp.Compile(`(^[-+](0?[0-9]|1[0-3]):[0-5]?\d$)|(^\+14:00?$)`) if err != nil { return nil, err } @@ -5725,33 +5725,40 @@ func (b *builtinConvertTzSig) convertTz(dt types.Time, fromTzStr, toTzStr string fromTzMatched := b.timezoneRegex.MatchString(fromTzStr) toTzMatched := b.timezoneRegex.MatchString(toTzStr) - if !fromTzMatched && !toTzMatched { - fromTz, err := time.LoadLocation(fromTzStr) - if err != nil { - return types.ZeroTime, true, nil - } + var fromTz, toTz *time.Location + var err error - toTz, err := time.LoadLocation(toTzStr) - if err != nil { - return types.ZeroTime, true, nil + if fromTzMatched { + fromTz = time.FixedZone(fromTzStr, timeZone2int(fromTzStr)) + } else { + if strings.EqualFold(fromTzStr, "SYSTEM") { + fromTzStr = "Local" } - - t, err := dt.GoTime(fromTz) + fromTz, err = time.LoadLocation(fromTzStr) if err != nil { return types.ZeroTime, true, nil } + } - return types.NewTime(types.FromGoTime(t.In(toTz)), mysql.TypeDatetime, int8(b.tp.Decimal)), false, nil + t, err := dt.GoTime(fromTz) + if err != nil { + return types.ZeroTime, true, nil } - if fromTzMatched && toTzMatched { - t, err := dt.GoTime(time.Local) + t = t.In(time.UTC) + + if toTzMatched { + toTz = time.FixedZone(toTzStr, timeZone2int(toTzStr)) + } else { + if strings.EqualFold(toTzStr, "SYSTEM") { + toTzStr = "Local" + } + toTz, err = time.LoadLocation(toTzStr) if err != nil { return types.ZeroTime, true, nil } - - return types.NewTime(types.FromGoTime(t.Add(timeZone2Duration(toTzStr)-timeZone2Duration(fromTzStr))), mysql.TypeDatetime, int8(b.tp.Decimal)), false, nil } - return types.ZeroTime, true, nil + + return types.NewTime(types.FromGoTime(t.In(toTz)), mysql.TypeDatetime, int8(b.tp.Decimal)), false, nil } type makeDateFunctionClass struct { @@ -6707,7 +6714,20 @@ func (c *timestampAddFunctionClass) getFunction(ctx sessionctx.Context, args []E if err != nil { return nil, err } - bf.tp = &types.FieldType{Tp: mysql.TypeString, Flen: mysql.MaxDatetimeWidthNoFsp, Decimal: types.UnspecifiedLength} + flen := mysql.MaxDatetimeWidthNoFsp + con, ok := args[0].(*Constant) + if !ok { + return nil, errors.New("should not happened") + } + unit, null, err := con.EvalString(ctx, chunk.Row{}) + if null || err != nil { + return nil, errors.New("should not happened") + } + if unit == ast.TimeUnitMicrosecond.String() { + flen = mysql.MaxDatetimeWidthWithFsp + } + + bf.tp.Flen = flen sig := &builtinTimestampAddSig{bf} sig.setPbCode(tipb.ScalarFuncSig_TimestampAdd) return sig, nil @@ -7181,11 +7201,21 @@ func CalAppropriateTime(minTime, maxTime, minSafeTime time.Time) time.Time { // 2. If t2 < t, we will use t2 as the result, // and with it, a read request won't fail because it's bigger than the latest SafeTS. func calAppropriateTime(minTime, maxTime, minSafeTime time.Time) time.Time { - if minSafeTime.Before(minTime) { - return minTime - } else if minSafeTime.After(maxTime) { - return maxTime - } + if minSafeTime.Before(minTime) || minSafeTime.After(maxTime) { + logutil.BgLogger().Warn("calAppropriateTime", + zap.Time("minTime", minTime), + zap.Time("maxTime", maxTime), + zap.Time("minSafeTime", minSafeTime)) + if minSafeTime.Before(minTime) { + return minTime + } else if minSafeTime.After(maxTime) { + return maxTime + } + } + logutil.BgLogger().Debug("calAppropriateTime", + zap.Time("minTime", minTime), + zap.Time("maxTime", maxTime), + zap.Time("minSafeTime", minSafeTime)) return minSafeTime } diff --git a/expression/builtin_time_test.go b/expression/builtin_time_test.go index d77c619ae382b..425fa976ae587 100644 --- a/expression/builtin_time_test.go +++ b/expression/builtin_time_test.go @@ -18,9 +18,9 @@ import ( "fmt" "math" "strings" + "testing" "time" - . "github.com/pingcap/check" "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/parser/ast" @@ -30,15 +30,17 @@ import ( "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/testkit/trequire" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/mock" - "github.com/pingcap/tidb/util/testutil" "github.com/pingcap/tidb/util/timeutil" + "github.com/stretchr/testify/require" "github.com/tikv/client-go/v2/oracle" ) -func (s *testEvaluatorSuite) TestDate(c *C) { +func TestDate(t *testing.T) { + ctx := createContext(t) tblDate := []struct { Input interface{} Expect interface{} @@ -99,13 +101,13 @@ func (s *testEvaluatorSuite) TestDate(c *C) { {"2011T12T13", nil}, } dtblDate := tblToDtbl(tblDate) - for _, t := range dtblDate { + for _, c := range dtblDate { fc := funcs[ast.Date] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["Expect"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["Expect"][0], v) } // test year, month and day @@ -129,84 +131,84 @@ func (s *testEvaluatorSuite) TestDate(c *C) { } dtbl := tblToDtbl(tbl) - for ith, t := range dtbl { + for ith, c := range dtbl { fc := funcs[ast.Year] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["Year"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["Year"][0], v) fc = funcs[ast.Month] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["Month"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["Month"][0], v) fc = funcs[ast.MonthName] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["MonthName"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["MonthName"][0], v) fc = funcs[ast.DayOfMonth] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["DayOfMonth"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["DayOfMonth"][0], v) fc = funcs[ast.DayOfWeek] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["DayOfWeek"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["DayOfWeek"][0], v) fc = funcs[ast.DayOfYear] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["DayOfYear"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["DayOfYear"][0], v) fc = funcs[ast.Weekday] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + f, err = fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) + require.NotNil(t, f) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["WeekDay"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["WeekDay"][0], v) fc = funcs[ast.DayName] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["DayName"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["DayName"][0], v) fc = funcs[ast.Week] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["Week"][0], Commentf("no.%d", ith)) + require.NoError(t, err) + trequire.DatumEqual(t, c["Week"][0], v, fmt.Sprintf("no.%d", ith)) fc = funcs[ast.WeekOfYear] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["WeekOfYear"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["WeekOfYear"][0], v) fc = funcs[ast.YearWeek] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["YearWeek"][0], Commentf("no.%d", ith)) + require.NoError(t, err) + trequire.DatumEqual(t, c["YearWeek"][0], v, fmt.Sprintf("no.%d", ith)) } // test nil @@ -230,84 +232,84 @@ func (s *testEvaluatorSuite) TestDate(c *C) { } dtblNil := tblToDtbl(tblNil) - for _, t := range dtblNil { + for _, c := range dtblNil { fc := funcs[ast.Year] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["Year"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["Year"][0], v) fc = funcs[ast.Month] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["Month"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["Month"][0], v) fc = funcs[ast.MonthName] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["MonthName"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["MonthName"][0], v) fc = funcs[ast.DayOfMonth] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["DayOfMonth"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["DayOfMonth"][0], v) fc = funcs[ast.DayOfWeek] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["DayOfWeek"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["DayOfWeek"][0], v) fc = funcs[ast.DayOfYear] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["DayOfYear"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["DayOfYear"][0], v) fc = funcs[ast.Weekday] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + f, err = fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) + require.NotNil(t, f) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["WeekDay"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["WeekDay"][0], v) fc = funcs[ast.DayName] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["DayName"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["DayName"][0], v) fc = funcs[ast.Week] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["Week"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["Week"][0], v) fc = funcs[ast.WeekOfYear] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["WeekOfYear"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["WeekOfYear"][0], v) fc = funcs[ast.YearWeek] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["YearWeek"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["YearWeek"][0], v) } // test nil with 'NO_ZERO_DATE' set in sql_mode @@ -331,91 +333,92 @@ func (s *testEvaluatorSuite) TestDate(c *C) { } dtblNil = tblToDtbl(tblNil) - err := s.ctx.GetSessionVars().SetSystemVar("sql_mode", "NO_ZERO_DATE") - c.Assert(err, IsNil) - for _, t := range dtblNil { + err := ctx.GetSessionVars().SetSystemVar("sql_mode", "NO_ZERO_DATE") + require.NoError(t, err) + for _, c := range dtblNil { fc := funcs[ast.Year] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["Year"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["Year"][0], v) fc = funcs[ast.Month] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["Month"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["Month"][0], v) fc = funcs[ast.MonthName] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["MonthName"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["MonthName"][0], v) fc = funcs[ast.DayOfMonth] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["DayOfMonth"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["DayOfMonth"][0], v) fc = funcs[ast.DayOfWeek] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["DayOfWeek"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["DayOfWeek"][0], v) fc = funcs[ast.DayOfYear] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["DayOfYear"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["DayOfYear"][0], v) fc = funcs[ast.Weekday] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + f, err = fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) + require.NotNil(t, f) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["WeekDay"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["WeekDay"][0], v) fc = funcs[ast.DayName] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["DayName"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["DayName"][0], v) fc = funcs[ast.Week] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["Week"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["Week"][0], v) fc = funcs[ast.WeekOfYear] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["WeekOfYear"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["WeekOfYear"][0], v) fc = funcs[ast.YearWeek] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["YearWeek"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["YearWeek"][0], v) } } -func (s *testEvaluatorSuite) TestMonthName(c *C) { - sc := s.ctx.GetSessionVars().StmtCtx +func TestMonthName(t *testing.T) { + ctx := createContext(t) + sc := ctx.GetSessionVars().StmtCtx sc.IgnoreZeroInDate = true cases := []struct { args interface{} @@ -429,28 +432,29 @@ func (s *testEvaluatorSuite) TestMonthName(c *C) { {"0000-00-00 00:00:00.000000", "", true, false}, {"0000-00-00 00:00:11.000000", "", true, false}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.MonthName, s.primitiveValsToConstants([]interface{}{t.args})...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.MonthName, primitiveValsToConstants(ctx, []interface{}{c.args})...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetString(), Equals, t.expected) + require.Equal(t, c.expected, d.GetString()) } } } - _, err := funcs[ast.MonthName].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.MonthName].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestDayName(c *C) { - sc := s.ctx.GetSessionVars().StmtCtx +func TestDayName(t *testing.T) { + ctx := createContext(t) + sc := ctx.GetSessionVars().StmtCtx sc.IgnoreZeroInDate = true cases := []struct { args interface{} @@ -466,28 +470,29 @@ func (s *testEvaluatorSuite) TestDayName(c *C) { {"0000-00-00 00:00:00.000000", "", true, false}, {"0000-00-00 00:00:11.000000", "", true, false}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.DayName, s.primitiveValsToConstants([]interface{}{t.args})...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.DayName, primitiveValsToConstants(ctx, []interface{}{c.args})...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetString(), Equals, t.expected) + require.Equal(t, c.expected, d.GetString()) } } } - _, err := funcs[ast.DayName].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.DayName].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestDayOfWeek(c *C) { - sc := s.ctx.GetSessionVars().StmtCtx +func TestDayOfWeek(t *testing.T) { + ctx := createContext(t) + sc := ctx.GetSessionVars().StmtCtx sc.IgnoreZeroInDate = true cases := []struct { args interface{} @@ -501,28 +506,29 @@ func (s *testEvaluatorSuite) TestDayOfWeek(c *C) { {"2017-00-00 12:12:12", 1, true, false}, {"0000-00-00 12:12:12", 1, true, false}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.DayOfWeek, s.primitiveValsToConstants([]interface{}{t.args})...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.DayOfWeek, primitiveValsToConstants(ctx, []interface{}{c.args})...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetInt64(), Equals, t.expected) + require.Equal(t, c.expected, d.GetInt64()) } } } - _, err := funcs[ast.DayOfWeek].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.DayOfWeek].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestDayOfMonth(c *C) { - sc := s.ctx.GetSessionVars().StmtCtx +func TestDayOfMonth(t *testing.T) { + ctx := createContext(t) + sc := ctx.GetSessionVars().StmtCtx sc.IgnoreZeroInDate = true cases := []struct { args interface{} @@ -536,28 +542,29 @@ func (s *testEvaluatorSuite) TestDayOfMonth(c *C) { {"2017-00-00 12:12:12", 0, false, false}, {"0000-00-00 12:12:12", 0, false, false}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.DayOfMonth, s.primitiveValsToConstants([]interface{}{t.args})...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.DayOfMonth, primitiveValsToConstants(ctx, []interface{}{c.args})...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetInt64(), Equals, t.expected) + require.Equal(t, c.expected, d.GetInt64()) } } } - _, err := funcs[ast.DayOfMonth].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.DayOfMonth].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestDayOfYear(c *C) { - sc := s.ctx.GetSessionVars().StmtCtx +func TestDayOfYear(t *testing.T) { + ctx := createContext(t) + sc := ctx.GetSessionVars().StmtCtx sc.IgnoreZeroInDate = true cases := []struct { args interface{} @@ -571,36 +578,37 @@ func (s *testEvaluatorSuite) TestDayOfYear(c *C) { {"2017-00-00 12:12:12", 0, true, false}, {"0000-00-00 12:12:12", 0, true, false}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.DayOfYear, s.primitiveValsToConstants([]interface{}{t.args})...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.DayOfYear, primitiveValsToConstants(ctx, []interface{}{c.args})...) + require.NoError(t, err) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetInt64(), Equals, t.expected) + require.Equal(t, c.expected, d.GetInt64()) } } } - _, err := funcs[ast.DayOfYear].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.DayOfYear].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestDateFormat(c *C) { +func TestDateFormat(t *testing.T) { + ctx := createContext(t) // Test case for https://github.com/pingcap/tidb/issues/2908 // SELECT DATE_FORMAT(null,'%Y-%M-%D') args := []types.Datum{types.NewDatum(nil), types.NewStringDatum("%Y-%M-%D")} fc := funcs[ast.DateFormat] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(args)) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(args)) + require.NoError(t, err) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.IsNull(), Equals, true) + require.NoError(t, err) + require.Equal(t, true, v.IsNull()) tblDate := []struct { Input []string @@ -625,18 +633,19 @@ func (s *testEvaluatorSuite) TestDateFormat(c *C) { `Oct October 10 10 1st 01 1 275 0 00 00 AM 12:00:00 AM 00:00:00 00 000000 40 2012 2012 12 %`}, } dtblDate := tblToDtbl(tblDate) - for i, t := range dtblDate { + for i, c := range dtblDate { fc := funcs[ast.DateFormat] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["Expect"][0], Commentf(`no.%d \nobtain:%v \nexpect:%v\n`, i, - v.GetValue(), t["Expect"][0].GetValue())) + require.NoError(t, err) + comment := fmt.Sprintf("no.%d\nobtain:%v\nexpect:%v\n", i, v.GetValue(), c["Expect"][0].GetValue()) + trequire.DatumEqual(t, c["Expect"][0], v, comment) } } -func (s *testEvaluatorSuite) TestClock(c *C) { +func TestClock(t *testing.T) { + ctx := createContext(t) // test hour, minute, second, micro second tbl := []struct { @@ -653,121 +662,122 @@ func (s *testEvaluatorSuite) TestClock(c *C) { } dtbl := tblToDtbl(tbl) - for _, t := range dtbl { + for _, c := range dtbl { fc := funcs[ast.Hour] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["Hour"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["Hour"][0], v) fc = funcs[ast.Minute] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["Minute"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["Minute"][0], v) fc = funcs[ast.Second] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["Second"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["Second"][0], v) fc = funcs[ast.MicroSecond] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["MicroSecond"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["MicroSecond"][0], v) fc = funcs[ast.Time] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["Time"][0]) + require.NoError(t, err) + trequire.DatumEqual(t, c["Time"][0], v) } // nil fc := funcs[ast.Hour] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(nil))) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(nil))) + require.NoError(t, err) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.Kind(), Equals, types.KindNull) + require.NoError(t, err) + require.Equal(t, types.KindNull, v.Kind()) fc = funcs[ast.Minute] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(nil))) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(types.MakeDatums(nil))) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.Kind(), Equals, types.KindNull) + require.NoError(t, err) + require.Equal(t, types.KindNull, v.Kind()) fc = funcs[ast.Second] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(nil))) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(types.MakeDatums(nil))) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.Kind(), Equals, types.KindNull) + require.NoError(t, err) + require.Equal(t, types.KindNull, v.Kind()) fc = funcs[ast.MicroSecond] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(nil))) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(types.MakeDatums(nil))) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.Kind(), Equals, types.KindNull) + require.NoError(t, err) + require.Equal(t, types.KindNull, v.Kind()) fc = funcs[ast.Time] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(nil))) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(types.MakeDatums(nil))) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.Kind(), Equals, types.KindNull) + require.NoError(t, err) + require.Equal(t, types.KindNull, v.Kind()) // test error errTbl := []string{ "2011-11-11 10:10:10.11.12", } - for _, t := range errTbl { - td := types.MakeDatums(t) + for _, c := range errTbl { + td := types.MakeDatums(c) fc := funcs[ast.Hour] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(td)) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(td)) + require.NoError(t, err) _, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) fc = funcs[ast.Minute] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(td)) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(td)) + require.NoError(t, err) _, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) fc = funcs[ast.Second] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(td)) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(td)) + require.NoError(t, err) _, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) fc = funcs[ast.MicroSecond] - f, err = fc.getFunction(s.ctx, s.datumsToConstants(td)) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(td)) + require.NoError(t, err) _, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) fc = funcs[ast.Time] - preWarningCnt := s.ctx.GetSessionVars().StmtCtx.WarningCount() - f, err = fc.getFunction(s.ctx, s.datumsToConstants(td)) - c.Assert(err, IsNil) + preWarningCnt := ctx.GetSessionVars().StmtCtx.WarningCount() + f, err = fc.getFunction(ctx, datumsToConstants(td)) + require.NoError(t, err) _, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(s.ctx.GetSessionVars().StmtCtx.WarningCount(), Equals, preWarningCnt+1) + require.NoError(t, err) + require.Equal(t, preWarningCnt+1, ctx.GetSessionVars().StmtCtx.WarningCount()) } } -func (s *testEvaluatorSuite) TestTime(c *C) { +func TestTime(t *testing.T) { + ctx := createContext(t) cases := []struct { args interface{} expected string @@ -782,40 +792,41 @@ func (s *testEvaluatorSuite) TestTime(c *C) { {"-838:59:59.000000", "-838:59:59.000000", false, false, 17}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.Time, s.primitiveValsToConstants([]interface{}{t.args})...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.Time, primitiveValsToConstants(ctx, []interface{}{c.args})...) + require.NoError(t, err) tp := f.GetType() - c.Assert(tp.Tp, Equals, mysql.TypeDuration) - c.Assert(tp.Charset, Equals, charset.CharsetBin) - c.Assert(tp.Collate, Equals, charset.CollationBin) - c.Assert(tp.Flag&mysql.BinaryFlag, Equals, mysql.BinaryFlag) - c.Assert(tp.Flen, Equals, t.flen) + require.Equal(t, mysql.TypeDuration, tp.Tp) + require.Equal(t, charset.CharsetBin, tp.Charset) + require.Equal(t, charset.CollationBin, tp.Collate) + require.Equal(t, mysql.BinaryFlag, tp.Flag&mysql.BinaryFlag) + require.Equal(t, c.flen, tp.Flen) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetMysqlDuration().String(), Equals, t.expected) + require.Equal(t, c.expected, d.GetMysqlDuration().String()) } } } - _, err := funcs[ast.Time].getFunction(s.ctx, []Expression{NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.Time].getFunction(ctx, []Expression{NewZero()}) + require.NoError(t, err) } func resetStmtContext(ctx sessionctx.Context) { ctx.GetSessionVars().StmtCtx.ResetStmtCache() } -func (s *testEvaluatorSuite) TestNowAndUTCTimestamp(c *C) { - gotime := func(t types.Time, l *time.Location) time.Time { - tt, err := t.GoTime(l) - c.Assert(err, IsNil) +func TestNowAndUTCTimestamp(t *testing.T) { + ctx := createContext(t) + gotime := func(typ types.Time, l *time.Location) time.Time { + tt, err := typ.GoTime(l) + require.NoError(t, err) return tt } @@ -826,58 +837,58 @@ func (s *testEvaluatorSuite) TestNowAndUTCTimestamp(c *C) { {funcs[ast.Now], time.Now}, {funcs[ast.UTCTimestamp], func() time.Time { return time.Now().UTC() }}, } { - f, err := x.fc.getFunction(s.ctx, s.datumsToConstants(nil)) - c.Assert(err, IsNil) - resetStmtContext(s.ctx) + f, err := x.fc.getFunction(ctx, datumsToConstants(nil)) + require.NoError(t, err) + resetStmtContext(ctx) v, err := evalBuiltinFunc(f, chunk.Row{}) ts := x.now() - c.Assert(err, IsNil) - t := v.GetMysqlTime() + require.NoError(t, err) + mt := v.GetMysqlTime() // we canot use a constant value to check timestamp funcs, so here // just to check the fractional seconds part and the time delta. - c.Assert(strings.Contains(t.String(), "."), IsFalse) - c.Assert(ts.Sub(gotime(t, ts.Location())), LessEqual, 3*time.Second) + require.False(t, strings.Contains(mt.String(), ".")) + require.LessOrEqual(t, ts.Sub(gotime(mt, ts.Location())), 3*time.Second) - f, err = x.fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(6))) - c.Assert(err, IsNil) - resetStmtContext(s.ctx) + f, err = x.fc.getFunction(ctx, datumsToConstants(types.MakeDatums(6))) + require.NoError(t, err) + resetStmtContext(ctx) v, err = evalBuiltinFunc(f, chunk.Row{}) ts = x.now() - c.Assert(err, IsNil) - t = v.GetMysqlTime() - c.Assert(strings.Contains(t.String(), "."), IsTrue) - c.Assert(ts.Sub(gotime(t, ts.Location())), LessEqual, 3*time.Second) + require.NoError(t, err) + mt = v.GetMysqlTime() + require.True(t, strings.Contains(mt.String(), ".")) + require.LessOrEqual(t, ts.Sub(gotime(mt, ts.Location())), 3*time.Second) - resetStmtContext(s.ctx) - _, err = x.fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(8))) - c.Assert(err, NotNil) + resetStmtContext(ctx) + _, err = x.fc.getFunction(ctx, datumsToConstants(types.MakeDatums(8))) + require.Error(t, err) - resetStmtContext(s.ctx) - _, err = x.fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(-2))) - c.Assert(err, NotNil) + resetStmtContext(ctx) + _, err = x.fc.getFunction(ctx, datumsToConstants(types.MakeDatums(-2))) + require.Error(t, err) } // Test that "timestamp" and "time_zone" variable may affect the result of Now() builtin function. - err := variable.SetSessionSystemVar(s.ctx.GetSessionVars(), "time_zone", "+00:00") - c.Assert(err, IsNil) - err = variable.SetSessionSystemVar(s.ctx.GetSessionVars(), "timestamp", "1234") - c.Assert(err, IsNil) + err := variable.SetSessionSystemVar(ctx.GetSessionVars(), "time_zone", "+00:00") + require.NoError(t, err) + err = variable.SetSessionSystemVar(ctx.GetSessionVars(), "timestamp", "1234") + require.NoError(t, err) fc := funcs[ast.Now] - resetStmtContext(s.ctx) - f, err := fc.getFunction(s.ctx, s.datumsToConstants(nil)) - c.Assert(err, IsNil) + resetStmtContext(ctx) + f, err := fc.getFunction(ctx, datumsToConstants(nil)) + require.NoError(t, err) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) result, err := v.ToString() - c.Assert(err, IsNil) - c.Assert(result, Equals, "1970-01-01 00:20:34") - err = variable.SetSessionSystemVar(s.ctx.GetSessionVars(), "timestamp", "0") - c.Assert(err, IsNil) - err = variable.SetSessionSystemVar(s.ctx.GetSessionVars(), "time_zone", "system") - c.Assert(err, IsNil) + require.NoError(t, err) + require.Equal(t, "1970-01-01 00:20:34", result) + err = variable.SetSessionSystemVar(ctx.GetSessionVars(), "timestamp", "0") + require.NoError(t, err) + err = variable.SetSessionSystemVar(ctx.GetSessionVars(), "time_zone", "system") + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestIsDuration(c *C) { +func TestIsDuration(t *testing.T) { tbl := []struct { Input string expect bool @@ -892,13 +903,14 @@ func (s *testEvaluatorSuite) TestIsDuration(c *C) { {"07-12-31 23:59:59.999999", false}, {"2007-12-31 23:59:59.999999", false}, } - for _, t := range tbl { - result := isDuration(t.Input) - c.Assert(result, Equals, t.expect) + for _, c := range tbl { + result := isDuration(c.Input) + require.Equal(t, c.expect, result) } } -func (s *testEvaluatorSuite) TestAddTimeSig(c *C) { +func TestAddTimeSig(t *testing.T) { + ctx := createContext(t) tbl := []struct { Input string InputDuration string @@ -917,25 +929,25 @@ func (s *testEvaluatorSuite) TestAddTimeSig(c *C) { {"xxcvadfgasd", "1", ""}, } fc := funcs[ast.AddTime] - for _, t := range tbl { - tmpInput := types.NewStringDatum(t.Input) - tmpInputDuration := types.NewStringDatum(t.InputDuration) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{tmpInput, tmpInputDuration})) - c.Assert(err, IsNil) + for _, c := range tbl { + tmpInput := types.NewStringDatum(c.Input) + tmpInputDuration := types.NewStringDatum(c.InputDuration) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{tmpInput, tmpInputDuration})) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) result, _ := d.ToString() - c.Assert(result, Equals, t.expect) + require.Equal(t, c.expect, result) } // This is a test for issue 7334 du := newDateArithmeticalUtil() - resetStmtContext(s.ctx) - now, _, err := evalNowWithFsp(s.ctx, 0) - c.Assert(err, IsNil) - res, _, err := du.add(s.ctx, now, "1", "MICROSECOND") - c.Assert(err, IsNil) - c.Assert(res.Fsp(), Equals, int8(6)) + resetStmtContext(ctx) + now, _, err := evalNowWithFsp(ctx, 0) + require.NoError(t, err) + res, _, err := du.add(ctx, now, "1", "MICROSECOND") + require.NoError(t, err) + require.Equal(t, int8(6), res.Fsp()) tbl = []struct { Input string @@ -948,17 +960,17 @@ func (s *testEvaluatorSuite) TestAddTimeSig(c *C) { {"110:00:00", "1 02:00:00", "136:00:00"}, {"-110:00:00", "1 02:00:00", "-84:00:00"}, } - for _, t := range tbl { - dur, err := types.ParseDuration(s.ctx.GetSessionVars().StmtCtx, t.Input, types.GetFsp(t.Input)) - c.Assert(err, IsNil) + for _, c := range tbl { + dur, err := types.ParseDuration(ctx.GetSessionVars().StmtCtx, c.Input, types.GetFsp(c.Input)) + require.NoError(t, err) tmpInput := types.NewDurationDatum(dur) - tmpInputDuration := types.NewStringDatum(t.InputDuration) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{tmpInput, tmpInputDuration})) - c.Assert(err, IsNil) + tmpInputDuration := types.NewStringDatum(c.InputDuration) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{tmpInput, tmpInputDuration})) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) result, _ := d.ToString() - c.Assert(result, Equals, t.expect) + require.Equal(t, c.expect, result) } tbll := []struct { @@ -969,15 +981,15 @@ func (s *testEvaluatorSuite) TestAddTimeSig(c *C) { {20171010123456, 1, "2017-10-10 12:34:57"}, {123456, 1, "12:34:57"}, } - for _, t := range tbll { - tmpInput := types.NewIntDatum(t.Input) - tmpInputDuration := types.NewIntDatum(t.InputDuration) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{tmpInput, tmpInputDuration})) - c.Assert(err, IsNil) + for _, c := range tbll { + tmpInput := types.NewIntDatum(c.Input) + tmpInputDuration := types.NewIntDatum(c.InputDuration) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{tmpInput, tmpInputDuration})) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) result, _ := d.ToString() - c.Assert(result, Equals, t.expect) + require.Equal(t, c.expect, result) } tblWarning := []struct { @@ -995,24 +1007,25 @@ func (s *testEvaluatorSuite) TestAddTimeSig(c *C) { {"1", "xxcvadfgasd", types.ErrTruncatedWrongVal}, {"xxcvadfgasd", "1", types.ErrTruncatedWrongVal}, } - beforeWarnCnt := int(s.ctx.GetSessionVars().StmtCtx.WarningCount()) - for i, t := range tblWarning { - tmpInput := types.NewDatum(t.Input) - tmpInputDuration := types.NewDatum(t.InputDuration) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{tmpInput, tmpInputDuration})) - c.Assert(err, IsNil) + beforeWarnCnt := int(ctx.GetSessionVars().StmtCtx.WarningCount()) + for i, c := range tblWarning { + tmpInput := types.NewDatum(c.Input) + tmpInputDuration := types.NewDatum(c.InputDuration) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{tmpInput, tmpInputDuration})) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) result, _ := d.ToString() - c.Assert(result, Equals, "") - c.Assert(d.IsNull(), Equals, true) - warnings := s.ctx.GetSessionVars().StmtCtx.GetWarnings() - c.Assert(len(warnings), Equals, i+1+beforeWarnCnt) - c.Assert(terror.ErrorEqual(t.warning, warnings[i].Err), IsTrue, Commentf("err %v", warnings[i].Err)) + require.Equal(t, "", result) + require.Equal(t, true, d.IsNull()) + warnings := ctx.GetSessionVars().StmtCtx.GetWarnings() + require.Equal(t, i+1+beforeWarnCnt, len(warnings)) + require.Truef(t, terror.ErrorEqual(c.warning, warnings[i].Err), "err %v", warnings[i].Err) } } -func (s *testEvaluatorSuite) TestSubTimeSig(c *C) { +func TestSubTimeSig(t *testing.T) { + ctx := createContext(t) tbl := []struct { Input string InputDuration string @@ -1026,15 +1039,15 @@ func (s *testEvaluatorSuite) TestSubTimeSig(c *C) { {"xxcvadfgasd", "1", ""}, } fc := funcs[ast.SubTime] - for _, t := range tbl { - tmpInput := types.NewStringDatum(t.Input) - tmpInputDuration := types.NewStringDatum(t.InputDuration) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{tmpInput, tmpInputDuration})) - c.Assert(err, IsNil) + for _, c := range tbl { + tmpInput := types.NewStringDatum(c.Input) + tmpInputDuration := types.NewStringDatum(c.InputDuration) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{tmpInput, tmpInputDuration})) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) result, _ := d.ToString() - c.Assert(result, Equals, t.expect) + require.Equal(t, c.expect, result) } tbl = []struct { @@ -1046,17 +1059,17 @@ func (s *testEvaluatorSuite) TestSubTimeSig(c *C) { {"23:59:59", "00:00:01", "23:59:58"}, {"235959", "00:00:01", "23:59:58"}, } - for _, t := range tbl { - dur, err := types.ParseDuration(s.ctx.GetSessionVars().StmtCtx, t.Input, types.GetFsp(t.Input)) - c.Assert(err, IsNil) + for _, c := range tbl { + dur, err := types.ParseDuration(ctx.GetSessionVars().StmtCtx, c.Input, types.GetFsp(c.Input)) + require.NoError(t, err) tmpInput := types.NewDurationDatum(dur) - tmpInputDuration := types.NewStringDatum(t.InputDuration) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{tmpInput, tmpInputDuration})) - c.Assert(err, IsNil) + tmpInputDuration := types.NewStringDatum(c.InputDuration) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{tmpInput, tmpInputDuration})) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) result, _ := d.ToString() - c.Assert(result, Equals, t.expect) + require.Equal(t, c.expect, result) } tbll := []struct { Input int64 @@ -1066,15 +1079,15 @@ func (s *testEvaluatorSuite) TestSubTimeSig(c *C) { {20171010123456, 1, "2017-10-10 12:34:55"}, {123456, 1, "12:34:55"}, } - for _, t := range tbll { - tmpInput := types.NewIntDatum(t.Input) - tmpInputDuration := types.NewIntDatum(t.InputDuration) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{tmpInput, tmpInputDuration})) - c.Assert(err, IsNil) + for _, c := range tbll { + tmpInput := types.NewIntDatum(c.Input) + tmpInputDuration := types.NewIntDatum(c.InputDuration) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{tmpInput, tmpInputDuration})) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) result, _ := d.ToString() - c.Assert(result, Equals, t.expect) + require.Equal(t, c.expect, result) } tblWarning := []struct { @@ -1092,50 +1105,49 @@ func (s *testEvaluatorSuite) TestSubTimeSig(c *C) { {"1", "xxcvadfgasd", types.ErrTruncatedWrongVal}, {"xxcvadfgasd", "1", types.ErrTruncatedWrongVal}, } - beforeWarnCnt := int(s.ctx.GetSessionVars().StmtCtx.WarningCount()) - for i, t := range tblWarning { - tmpInput := types.NewDatum(t.Input) - tmpInputDuration := types.NewDatum(t.InputDuration) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{tmpInput, tmpInputDuration})) - c.Assert(err, IsNil) + beforeWarnCnt := int(ctx.GetSessionVars().StmtCtx.WarningCount()) + for i, c := range tblWarning { + tmpInput := types.NewDatum(c.Input) + tmpInputDuration := types.NewDatum(c.InputDuration) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{tmpInput, tmpInputDuration})) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) result, _ := d.ToString() - c.Assert(result, Equals, "") - c.Assert(d.IsNull(), Equals, true) - warnings := s.ctx.GetSessionVars().StmtCtx.GetWarnings() - c.Assert(len(warnings), Equals, i+1+beforeWarnCnt) - c.Assert(terror.ErrorEqual(t.warning, warnings[i].Err), IsTrue, Commentf("err %v", warnings[i].Err)) + require.Equal(t, "", result) + require.Equal(t, true, d.IsNull()) + warnings := ctx.GetSessionVars().StmtCtx.GetWarnings() + require.Equal(t, i+1+beforeWarnCnt, len(warnings)) + require.Truef(t, terror.ErrorEqual(c.warning, warnings[i].Err), "err %v", warnings[i].Err) } } -func (s *testEvaluatorSuite) TestSysDate(c *C) { +func TestSysDate(t *testing.T) { fc := funcs[ast.Sysdate] - ctx := mock.NewContext() ctx.GetSessionVars().StmtCtx.TimeZone = timeutil.SystemLocation() timezones := []string{"1234", "0"} for _, timezone := range timezones { // sysdate() result is not affected by "timestamp" session variable. err := variable.SetSessionSystemVar(ctx.GetSessionVars(), "timestamp", timezone) - c.Assert(err, IsNil) - f, err := fc.getFunction(ctx, s.datumsToConstants(nil)) - c.Assert(err, IsNil) - resetStmtContext(s.ctx) + require.NoError(t, err) + f, err := fc.getFunction(ctx, datumsToConstants(nil)) + require.NoError(t, err) + resetStmtContext(ctx) v, err := evalBuiltinFunc(f, chunk.Row{}) last := time.Now() - c.Assert(err, IsNil) + require.NoError(t, err) n := v.GetMysqlTime() - c.Assert(n.String(), GreaterEqual, last.Format(types.TimeFormat)) + require.GreaterOrEqual(t, n.String(), last.Format(types.TimeFormat)) baseFunc, _, input, output := genVecBuiltinFuncBenchCase(ctx, ast.Sysdate, vecExprBenchCase{retEvalType: types.ETDatetime}) - resetStmtContext(s.ctx) + resetStmtContext(ctx) err = baseFunc.vecEvalTime(input, output) - c.Assert(err, IsNil) + require.NoError(t, err) last = time.Now() times := output.Times() for i := 0; i < 1024; i++ { - c.Assert(times[i].String(), GreaterEqual, last.Format(types.TimeFormat)) + require.GreaterOrEqual(t, times[i].String(), last.Format(types.TimeFormat)) } baseFunc, _, input, output = genVecBuiltinFuncBenchCase(ctx, ast.Sysdate, @@ -1144,27 +1156,27 @@ func (s *testEvaluatorSuite) TestSysDate(c *C) { childrenTypes: []types.EvalType{types.ETInt}, geners: []dataGenerator{newRangeInt64Gener(0, 7)}, }) - resetStmtContext(s.ctx) + resetStmtContext(ctx) loc := ctx.GetSessionVars().Location() startTm := time.Now().In(loc) err = baseFunc.vecEvalTime(input, output) - c.Assert(err, IsNil) + require.NoError(t, err) for i := 0; i < 1024; i++ { - c.Assert(times[i].String(), GreaterEqual, startTm.Format(types.TimeFormat)) + require.GreaterOrEqual(t, times[i].String(), startTm.Format(types.TimeFormat)) } } last := time.Now() - f, err := fc.getFunction(ctx, s.datumsToConstants(types.MakeDatums(6))) - c.Assert(err, IsNil) - resetStmtContext(s.ctx) + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(6))) + require.NoError(t, err) + resetStmtContext(ctx) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) n := v.GetMysqlTime() - c.Assert(n.String(), GreaterEqual, last.Format(types.TimeFormat)) + require.GreaterOrEqual(t, n.String(), last.Format(types.TimeFormat)) - _, err = fc.getFunction(ctx, s.datumsToConstants(types.MakeDatums(-2))) - c.Assert(err, NotNil) + _, err = fc.getFunction(ctx, datumsToConstants(types.MakeDatums(-2))) + require.Error(t, err) } func convertToTimeWithFsp(sc *stmtctx.StatementContext, arg types.Datum, tp byte, fsp int8) (d types.Datum, err error) { @@ -1214,7 +1226,8 @@ func builtinDateFormat(ctx sessionctx.Context, args []types.Datum) (d types.Datu return } -func (s *testEvaluatorSuite) TestFromUnixTime(c *C) { +func TestFromUnixTime(t *testing.T) { + ctx := createContext(t) tbl := []struct { isDecimal bool integralPart int64 @@ -1232,115 +1245,118 @@ func (s *testEvaluatorSuite) TestFromUnixTime(c *C) { {true, 1451606400, 999999000, 1451606400.999999, `%Y %D %M %h:%i:%s %x`, "2016-01-01 00:00:00.999999"}, {true, 1451606400, 999999900, 1451606400.9999999, `%Y %D %M %h:%i:%s %x`, "2016-01-01 00:00:01.000000"}, } - sc := s.ctx.GetSessionVars().StmtCtx + sc := ctx.GetSessionVars().StmtCtx originTZ := sc.TimeZone sc.TimeZone = time.UTC defer func() { sc.TimeZone = originTZ }() fc := funcs[ast.FromUnixTime] - for _, t := range tbl { + for _, c := range tbl { var timestamp types.Datum - if !t.isDecimal { - timestamp.SetInt64(t.integralPart) + if !c.isDecimal { + timestamp.SetInt64(c.integralPart) } else { - timestamp.SetFloat64(t.decimal) + timestamp.SetFloat64(c.decimal) } // result of from_unixtime() is dependent on specific time zone. - if len(t.format) == 0 { - constants := s.datumsToConstants([]types.Datum{timestamp}) - if !t.isDecimal { + if len(c.format) == 0 { + constants := datumsToConstants([]types.Datum{timestamp}) + if !c.isDecimal { constants[0].GetType().Decimal = 0 } - f, err := fc.getFunction(s.ctx, constants) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, constants) + require.NoError(t, err) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) ans := v.GetMysqlTime() - c.Assert(ans.String(), Equals, t.expect, Commentf("%+v", t)) + require.Equalf(t, c.expect, ans.String(), "%+v", t) } else { - format := types.NewStringDatum(t.format) - constants := s.datumsToConstants([]types.Datum{timestamp, format}) - if !t.isDecimal { + format := types.NewStringDatum(c.format) + constants := datumsToConstants([]types.Datum{timestamp, format}) + if !c.isDecimal { constants[0].GetType().Decimal = 0 } - f, err := fc.getFunction(s.ctx, constants) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, constants) + require.NoError(t, err) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - result, err := builtinDateFormat(s.ctx, []types.Datum{types.NewStringDatum(t.expect), format}) - c.Assert(err, IsNil) - c.Assert(v.GetString(), Equals, result.GetString(), Commentf("%+v", t)) + require.NoError(t, err) + result, err := builtinDateFormat(ctx, []types.Datum{types.NewStringDatum(c.expect), format}) + require.NoError(t, err) + require.Equalf(t, result.GetString(), v.GetString(), "%+v", t) } } - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(-12345))) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(-12345))) + require.NoError(t, err) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.Kind(), Equals, types.KindNull) + require.NoError(t, err) + require.Equal(t, types.KindNull, v.Kind()) - f, err = fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(math.MaxInt32+1))) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(types.MakeDatums(math.MaxInt32+1))) + require.NoError(t, err) _, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.Kind(), Equals, types.KindNull) + require.NoError(t, err) + require.Equal(t, types.KindNull, v.Kind()) } -func (s *testEvaluatorSuite) TestCurrentDate(c *C) { +func TestCurrentDate(t *testing.T) { + ctx := createContext(t) last := time.Now() fc := funcs[ast.CurrentDate] - f, err := fc.getFunction(mock.NewContext(), s.datumsToConstants(nil)) - c.Assert(err, IsNil) - resetStmtContext(s.ctx) + f, err := fc.getFunction(mock.NewContext(), datumsToConstants(nil)) + require.NoError(t, err) + resetStmtContext(ctx) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) n := v.GetMysqlTime() - c.Assert(n.String(), GreaterEqual, last.Format(types.DateFormat)) + require.GreaterOrEqual(t, n.String(), last.Format(types.DateFormat)) } -func (s *testEvaluatorSuite) TestCurrentTime(c *C) { +func TestCurrentTime(t *testing.T) { + ctx := createContext(t) tfStr := "15:04:05" last := time.Now() fc := funcs[ast.CurrentTime] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(nil))) - c.Assert(err, IsNil) - resetStmtContext(s.ctx) + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(nil))) + require.NoError(t, err) + resetStmtContext(ctx) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) n := v.GetMysqlDuration() - c.Assert(n.String(), HasLen, 8) - c.Assert(n.String(), GreaterEqual, last.Format(tfStr)) + require.Len(t, n.String(), 8) + require.GreaterOrEqual(t, n.String(), last.Format(tfStr)) - f, err = fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(3))) - c.Assert(err, IsNil) - resetStmtContext(s.ctx) + f, err = fc.getFunction(ctx, datumsToConstants(types.MakeDatums(3))) + require.NoError(t, err) + resetStmtContext(ctx) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) n = v.GetMysqlDuration() - c.Assert(n.String(), HasLen, 12) - c.Assert(n.String(), GreaterEqual, last.Format(tfStr)) + require.Len(t, n.String(), 12) + require.GreaterOrEqual(t, n.String(), last.Format(tfStr)) - f, err = fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(6))) - c.Assert(err, IsNil) - resetStmtContext(s.ctx) + f, err = fc.getFunction(ctx, datumsToConstants(types.MakeDatums(6))) + require.NoError(t, err) + resetStmtContext(ctx) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) n = v.GetMysqlDuration() - c.Assert(n.String(), HasLen, 15) - c.Assert(n.String(), GreaterEqual, last.Format(tfStr)) + require.Len(t, n.String(), 15) + require.GreaterOrEqual(t, n.String(), last.Format(tfStr)) - _, err = fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(-1))) - c.Assert(err, NotNil) + _, err = fc.getFunction(ctx, datumsToConstants(types.MakeDatums(-1))) + require.Error(t, err) - _, err = fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(7))) - c.Assert(err, NotNil) + _, err = fc.getFunction(ctx, datumsToConstants(types.MakeDatums(7))) + require.Error(t, err) } -func (s *testEvaluatorSuite) TestUTCTime(c *C) { +func TestUTCTime(t *testing.T) { + ctx := createContext(t) last := time.Now().UTC() tfStr := "00:00:00" fc := funcs[ast.UTCTime] @@ -1352,47 +1368,48 @@ func (s *testEvaluatorSuite) TestUTCTime(c *C) { }{{0, 8, false}, {3, 12, false}, {6, 15, false}, {-1, 0, true}, {7, 0, true}} for _, test := range tests { - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(test.param))) + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(test.param))) if test.error { - c.Assert(err, NotNil) + require.Error(t, err) continue } - c.Assert(err, IsNil) - resetStmtContext(s.ctx) + require.NoError(t, err) + resetStmtContext(ctx) v, err := evalBuiltinFunc(f, chunk.Row{}) if test.expect > 0 { - c.Assert(err, IsNil) + require.NoError(t, err) n := v.GetMysqlDuration() - c.Assert(n.String(), HasLen, test.expect) - c.Assert(n.String(), GreaterEqual, last.Format(tfStr)) + require.Len(t, n.String(), test.expect) + require.GreaterOrEqual(t, n.String(), last.Format(tfStr)) } else { - c.Assert(err, NotNil) + require.Error(t, err) } } - f, err := fc.getFunction(s.ctx, make([]Expression, 0)) - c.Assert(err, IsNil) - resetStmtContext(s.ctx) + f, err := fc.getFunction(ctx, make([]Expression, 0)) + require.NoError(t, err) + resetStmtContext(ctx) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) n := v.GetMysqlDuration() - c.Assert(n.String(), HasLen, 8) - c.Assert(n.String(), GreaterEqual, last.Format(tfStr)) + require.Len(t, n.String(), 8) + require.GreaterOrEqual(t, n.String(), last.Format(tfStr)) } -func (s *testEvaluatorSuite) TestUTCDate(c *C) { +func TestUTCDate(t *testing.T) { last := time.Now().UTC() fc := funcs[ast.UTCDate] - f, err := fc.getFunction(mock.NewContext(), s.datumsToConstants(nil)) - c.Assert(err, IsNil) + f, err := fc.getFunction(mock.NewContext(), datumsToConstants(nil)) + require.NoError(t, err) resetStmtContext(mock.NewContext()) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) n := v.GetMysqlTime() - c.Assert(n.String(), GreaterEqual, last.Format(types.DateFormat)) + require.GreaterOrEqual(t, n.String(), last.Format(types.DateFormat)) } -func (s *testEvaluatorSuite) TestStrToDate(c *C) { +func TestStrToDate(t *testing.T) { + ctx := createContext(t) // If you want to add test cases for `strToDate` but not the builtin function, // adding cases in `types.format_test.go` `TestStrToDate` maybe more clear and easier tests := []struct { @@ -1414,6 +1431,7 @@ func (s *testEvaluatorSuite) TestStrToDate(c *C) { {"15-01-2001 1:59:58.", "%d-%m-%Y %H:%i:%s.%f", true, types.KindMysqlTime, time.Date(2001, 1, 15, 1, 59, 58, 000000000, time.Local)}, {"15-01-2001 1:9:8.999", "%d-%m-%Y %H:%i:%s.%f", true, types.KindMysqlTime, time.Date(2001, 1, 15, 1, 9, 8, 999000000, time.Local)}, {"15-01-2001 1:9:8.999", "%d-%m-%Y %H:%i:%S.%f", true, types.KindMysqlTime, time.Date(2001, 1, 15, 1, 9, 8, 999000000, time.Local)}, + {"2003-01-02 10:11:12.0012", "%Y-%m-%d %H:%i:%S.%f", true, types.KindMysqlTime, time.Date(2003, 1, 2, 10, 11, 12, 1200000, time.Local)}, {"2003-01-02 10:11:12 PM", "%Y-%m-%d %H:%i:%S %p", false, types.KindMysqlTime, time.Time{}}, {"10:20:10AM", "%H:%i:%S%p", false, types.KindMysqlTime, time.Time{}}, // test %@(skip alpha), %#(skip number), %.(skip punct) @@ -1438,32 +1456,33 @@ func (s *testEvaluatorSuite) TestStrToDate(c *C) { for _, test := range tests { date := types.NewStringDatum(test.Date) format := types.NewStringDatum(test.Format) - c.Logf("input: %s, format: %s", test.Date, test.Format) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{date, format})) - c.Assert(err, IsNil) + t.Logf("input: %s, format: %s", test.Date, test.Format) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{date, format})) + require.NoError(t, err) result, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) if !test.Success { - c.Assert(err, IsNil) - c.Assert(result.IsNull(), IsTrue) + require.NoError(t, err) + require.True(t, result.IsNull()) continue } - c.Assert(result.Kind(), Equals, test.Kind) + require.Equal(t, test.Kind, result.Kind()) switch test.Kind { case types.KindMysqlTime: value := result.GetMysqlTime() t1, _ := value.GoTime(time.Local) - c.Assert(t1, Equals, test.Expect) + require.Equal(t, test.Expect, t1) case types.KindMysqlDuration: value := result.GetMysqlDuration() timeExpect := test.Expect.Sub(time.Date(0, 0, 0, 0, 0, 0, 0, time.Local)) - c.Assert(value.Duration, Equals, timeExpect) + require.Equal(t, timeExpect, value.Duration) } } } -func (s *testEvaluatorSuite) TestFromDays(c *C) { - stmtCtx := s.ctx.GetSessionVars().StmtCtx +func TestFromDays(t *testing.T) { + ctx := createContext(t) + stmtCtx := ctx.GetSessionVars().StmtCtx origin := stmtCtx.IgnoreTruncate stmtCtx.IgnoreTruncate = true defer func() { @@ -1492,13 +1511,13 @@ func (s *testEvaluatorSuite) TestFromDays(c *C) { for _, test := range tests { t1 := types.NewIntDatum(test.day) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{t1})) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{t1})) + require.NoError(t, err) + require.NotNil(t, f) result, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(result.GetMysqlTime().String(), Equals, test.expect) + require.NoError(t, err) + require.Equal(t, test.expect, result.GetMysqlTime().String()) } stringTests := []struct { @@ -1513,16 +1532,17 @@ func (s *testEvaluatorSuite) TestFromDays(c *C) { for _, test := range stringTests { t1 := types.NewStringDatum(test.day) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{t1})) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{t1})) + require.NoError(t, err) result, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(result.GetMysqlTime().String(), Equals, test.expect) + require.NoError(t, err) + require.Equal(t, test.expect, result.GetMysqlTime().String()) } } -func (s *testEvaluatorSuite) TestDateDiff(c *C) { +func TestDateDiff(t *testing.T) { + ctx := createContext(t) // Test cases from https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_datediff tests := []struct { t1 string @@ -1541,12 +1561,12 @@ func (s *testEvaluatorSuite) TestDateDiff(c *C) { t1 := types.NewStringDatum(test.t1) t2 := types.NewStringDatum(test.t2) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{t1, t2})) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{t1, t2})) + require.NoError(t, err) result, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(result.GetInt64(), Equals, test.expect) + require.NoError(t, err) + require.Equal(t, test.expect, result.GetInt64()) } // Test invalid time format. @@ -1566,16 +1586,17 @@ func (s *testEvaluatorSuite) TestDateDiff(c *C) { t1 := types.NewStringDatum(test.t1) t2 := types.NewStringDatum(test.t2) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{t1, t2})) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{t1, t2})) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d.IsNull(), IsTrue) + require.NoError(t, err) + require.True(t, d.IsNull()) } } -func (s *testEvaluatorSuite) TestTimeDiff(c *C) { - sc := s.ctx.GetSessionVars().StmtCtx +func TestTimeDiff(t *testing.T) { + ctx := createContext(t) + sc := ctx.GetSessionVars().StmtCtx sc.IgnoreZeroInDate = true // Test cases from https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_timediff tests := []struct { @@ -1594,35 +1615,36 @@ func (s *testEvaluatorSuite) TestTimeDiff(c *C) { {[]interface{}{"2016-12-00 12:00:00", ""}, "", true, 0, 10, true}, } - for _, t := range tests { - preWarningCnt := s.ctx.GetSessionVars().StmtCtx.WarningCount() - f, err := newFunctionForTest(s.ctx, ast.TimeDiff, s.primitiveValsToConstants(t.args)...) - c.Assert(err, IsNil) + for _, c := range tests { + preWarningCnt := ctx.GetSessionVars().StmtCtx.WarningCount() + f, err := newFunctionForTest(ctx, ast.TimeDiff, primitiveValsToConstants(ctx, c.args)...) + require.NoError(t, err) tp := f.GetType() - c.Assert(tp.Tp, Equals, mysql.TypeDuration) - c.Assert(tp.Charset, Equals, charset.CharsetBin) - c.Assert(tp.Collate, Equals, charset.CollationBin) - c.Assert(tp.Flag, Equals, mysql.BinaryFlag) - c.Assert(tp.Flen, Equals, t.flen) + require.Equal(t, mysql.TypeDuration, tp.Tp) + require.Equal(t, charset.CharsetBin, tp.Charset) + require.Equal(t, charset.CollationBin, tp.Collate) + require.Equal(t, mysql.BinaryFlag, tp.Flag) + require.Equal(t, c.flen, tp.Flen) d, err := f.Eval(chunk.Row{}) - if t.getWarning { - c.Assert(err, IsNil) - c.Assert(s.ctx.GetSessionVars().StmtCtx.WarningCount(), Equals, preWarningCnt+1) + if c.getWarning { + require.NoError(t, err) + require.Equal(t, preWarningCnt+1, ctx.GetSessionVars().StmtCtx.WarningCount()) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetMysqlDuration().String(), Equals, t.expectStr) - c.Assert(d.GetMysqlDuration().Fsp, Equals, t.fsp) + require.Equal(t, c.expectStr, d.GetMysqlDuration().String()) + require.Equal(t, c.fsp, d.GetMysqlDuration().Fsp) } } } - _, err := funcs[ast.TimeDiff].getFunction(s.ctx, []Expression{NewZero(), NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.TimeDiff].getFunction(ctx, []Expression{NewZero(), NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestWeek(c *C) { +func TestWeek(t *testing.T) { + ctx := createContext(t) // Test cases from https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_week tests := []struct { t string @@ -1637,15 +1659,16 @@ func (s *testEvaluatorSuite) TestWeek(c *C) { for _, test := range tests { arg1 := types.NewStringDatum(test.t) arg2 := types.NewIntDatum(test.mode) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{arg1, arg2})) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{arg1, arg2})) + require.NoError(t, err) result, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(result.GetInt64(), Equals, test.expect) + require.NoError(t, err) + require.Equal(t, test.expect, result.GetInt64()) } } -func (s *testEvaluatorSuite) TestWeekWithoutModeSig(c *C) { +func TestWeekWithoutModeSig(t *testing.T) { + ctx := createContext(t) tests := []struct { t string expect int64 @@ -1660,22 +1683,23 @@ func (s *testEvaluatorSuite) TestWeekWithoutModeSig(c *C) { fc := funcs[ast.Week] for i, test := range tests { arg1 := types.NewStringDatum(test.t) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{arg1})) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{arg1})) + require.NoError(t, err) result, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(result.GetInt64(), Equals, test.expect) + require.NoError(t, err) + require.Equal(t, test.expect, result.GetInt64()) if i == 1 { - err = s.ctx.GetSessionVars().SetSystemVar("default_week_format", "6") - c.Assert(err, IsNil) + err = ctx.GetSessionVars().SetSystemVar("default_week_format", "6") + require.NoError(t, err) } else if i == 3 { - err = s.ctx.GetSessionVars().SetSystemVar("default_week_format", "") - c.Assert(err, IsNil) + err = ctx.GetSessionVars().SetSystemVar("default_week_format", "") + require.NoError(t, err) } } } -func (s *testEvaluatorSuite) TestYearWeek(c *C) { - sc := s.ctx.GetSessionVars().StmtCtx +func TestYearWeek(t *testing.T) { + ctx := createContext(t) + sc := ctx.GetSessionVars().StmtCtx sc.IgnoreZeroInDate = true // Test cases from https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_yearweek tests := []struct { @@ -1690,21 +1714,22 @@ func (s *testEvaluatorSuite) TestYearWeek(c *C) { for _, test := range tests { arg1 := types.NewStringDatum(test.t) arg2 := types.NewIntDatum(test.mode) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{arg1, arg2})) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{arg1, arg2})) + require.NoError(t, err) result, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(result.GetInt64(), Equals, test.expect) + require.NoError(t, err) + require.Equal(t, test.expect, result.GetInt64()) } - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums("2016-00-05"))) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums("2016-00-05"))) + require.NoError(t, err) result, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(result.IsNull(), IsTrue) + require.NoError(t, err) + require.True(t, result.IsNull()) } -func (s *testEvaluatorSuite) TestTimestampDiff(c *C) { +func TestTimestampDiff(t *testing.T) { + ctx := createContext(t) tests := []struct { unit string t1 string @@ -1723,76 +1748,77 @@ func (s *testEvaluatorSuite) TestTimestampDiff(c *C) { types.NewStringDatum(test.t1), types.NewStringDatum(test.t2), } - resetStmtContext(s.ctx) - f, err := fc.getFunction(s.ctx, s.datumsToConstants(args)) - c.Assert(err, IsNil) + resetStmtContext(ctx) + f, err := fc.getFunction(ctx, datumsToConstants(args)) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d.GetInt64(), Equals, test.expect) + require.NoError(t, err) + require.Equal(t, test.expect, d.GetInt64()) } - sc := s.ctx.GetSessionVars().StmtCtx + sc := ctx.GetSessionVars().StmtCtx sc.IgnoreTruncate = true sc.IgnoreZeroInDate = true - resetStmtContext(s.ctx) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{types.NewStringDatum("DAY"), + resetStmtContext(ctx) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{types.NewStringDatum("DAY"), types.NewStringDatum("2017-01-00"), types.NewStringDatum("2017-01-01")})) - c.Assert(err, IsNil) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + require.Equal(t, types.KindNull, d.Kind()) - resetStmtContext(s.ctx) - f, err = fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{types.NewStringDatum("DAY"), + resetStmtContext(ctx) + f, err = fc.getFunction(ctx, datumsToConstants([]types.Datum{types.NewStringDatum("DAY"), {}, types.NewStringDatum("2017-01-01")})) - c.Assert(err, IsNil) + require.NoError(t, err) d, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d.IsNull(), IsTrue) + require.NoError(t, err) + require.True(t, d.IsNull()) } -func (s *testEvaluatorSuite) TestUnixTimestamp(c *C) { +func TestUnixTimestamp(t *testing.T) { + ctx := createContext(t) // Test UNIX_TIMESTAMP(). fc := funcs[ast.UnixTimestamp] - f, err := fc.getFunction(s.ctx, nil) - c.Assert(err, IsNil) - resetStmtContext(s.ctx) + f, err := fc.getFunction(ctx, nil) + require.NoError(t, err) + resetStmtContext(ctx) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d.GetInt64()-time.Now().Unix(), GreaterEqual, int64(-1)) - c.Assert(d.GetInt64()-time.Now().Unix(), LessEqual, int64(1)) + require.NoError(t, err) + require.GreaterOrEqual(t, d.GetInt64()-time.Now().Unix(), int64(-1)) + require.LessOrEqual(t, d.GetInt64()-time.Now().Unix(), int64(1)) // https://github.com/pingcap/tidb/issues/2496 // Test UNIX_TIMESTAMP(NOW()). - resetStmtContext(s.ctx) - now, isNull, err := evalNowWithFsp(s.ctx, 0) - c.Assert(err, IsNil) - c.Assert(isNull, IsFalse) + resetStmtContext(ctx) + now, isNull, err := evalNowWithFsp(ctx, 0) + require.NoError(t, err) + require.False(t, isNull) n := types.Datum{} n.SetMysqlTime(now) args := []types.Datum{n} - f, err = fc.getFunction(s.ctx, s.datumsToConstants(args)) - c.Assert(err, IsNil) - resetStmtContext(s.ctx) + f, err = fc.getFunction(ctx, datumsToConstants(args)) + require.NoError(t, err) + resetStmtContext(ctx) d, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) val, _ := d.GetMysqlDecimal().ToInt() - c.Assert(val-time.Now().Unix(), GreaterEqual, int64(-1)) - c.Assert(val-time.Now().Unix(), LessEqual, int64(1)) + require.GreaterOrEqual(t, val-time.Now().Unix(), int64(-1)) + require.LessOrEqual(t, val-time.Now().Unix(), int64(1)) // https://github.com/pingcap/tidb/issues/2852 // Test UNIX_TIMESTAMP(NULL). args = []types.Datum{types.NewDatum(nil)} - resetStmtContext(s.ctx) - f, err = fc.getFunction(s.ctx, s.datumsToConstants(args)) - c.Assert(err, IsNil) + resetStmtContext(ctx) + f, err = fc.getFunction(ctx, datumsToConstants(args)) + require.NoError(t, err) d, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d.IsNull(), Equals, true) + require.NoError(t, err) + require.Equal(t, true, d.IsNull()) // Set the time_zone variable, because UnixTimestamp() result depends on it. - s.ctx.GetSessionVars().TimeZone = time.UTC - s.ctx.GetSessionVars().StmtCtx.IgnoreZeroInDate = true + ctx.GetSessionVars().TimeZone = time.UTC + ctx.GetSessionVars().StmtCtx.IgnoreZeroInDate = true tests := []struct { inputDecimal int input types.Datum @@ -1826,21 +1852,22 @@ func (s *testEvaluatorSuite) TestUnixTimestamp(c *C) { } for _, test := range tests { - expr := s.datumsToConstants([]types.Datum{test.input}) + expr := datumsToConstants([]types.Datum{test.input}) expr[0].GetType().Decimal = test.inputDecimal - resetStmtContext(s.ctx) - f, err := fc.getFunction(s.ctx, expr) - c.Assert(err, IsNil, Commentf("%+v", test)) + resetStmtContext(ctx) + f, err := fc.getFunction(ctx, expr) + require.NoErrorf(t, err, "%+v", test) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil, Commentf("%+v", test)) - c.Assert(d.Kind(), Equals, test.expectKind, Commentf("%+v", test)) + require.NoErrorf(t, err, "%+v", test) + require.Equalf(t, test.expectKind, d.Kind(), "%+v", test) str, err := d.ToString() - c.Assert(err, IsNil, Commentf("%+v", test)) - c.Assert(str, Equals, test.expect, Commentf("%+v", test)) + require.NoErrorf(t, err, "%+v", test) + require.Equalf(t, test.expect, str, "%+v", test) } } -func (s *testEvaluatorSuite) TestDateArithFuncs(c *C) { +func TestDateArithFuncs(t *testing.T) { + ctx := createContext(t) date := []string{"2016-12-31", "2017-01-01"} fcAdd := funcs[ast.DateAdd] fcSub := funcs[ast.DateSub] @@ -1863,29 +1890,29 @@ func (s *testEvaluatorSuite) TestDateArithFuncs(c *C) { } for _, test := range tests { args := types.MakeDatums(test.inputDate, test.inputDecimal, "DAY") - f, err := test.fc.getFunction(s.ctx, s.datumsToConstants(args)) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + f, err := test.fc.getFunction(ctx, datumsToConstants(args)) + require.NoError(t, err) + require.NotNil(t, f) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.GetMysqlTime().String(), Equals, test.expect) + require.NoError(t, err) + require.Equal(t, test.expect, v.GetMysqlTime().String()) } args := types.MakeDatums(date[0], nil, "DAY") - f, err := fcAdd.getFunction(s.ctx, s.datumsToConstants(args)) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + f, err := fcAdd.getFunction(ctx, datumsToConstants(args)) + require.NoError(t, err) + require.NotNil(t, f) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.IsNull(), IsTrue) + require.NoError(t, err) + require.True(t, v.IsNull()) args = types.MakeDatums(date[1], nil, "DAY") - f, err = fcSub.getFunction(s.ctx, s.datumsToConstants(args)) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + f, err = fcSub.getFunction(ctx, datumsToConstants(args)) + require.NoError(t, err) + require.NotNil(t, f) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.IsNull(), IsTrue) + require.NoError(t, err) + require.True(t, v.IsNull()) testMonths := []struct { input string @@ -1905,12 +1932,12 @@ func (s *testEvaluatorSuite) TestDateArithFuncs(c *C) { for _, test := range testMonths { args = types.MakeDatums(test.input, test.months, "MONTH") - f, err = fcAdd.getFunction(s.ctx, s.datumsToConstants(args)) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + f, err = fcAdd.getFunction(ctx, datumsToConstants(args)) + require.NoError(t, err) + require.NotNil(t, f) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.GetMysqlTime().String(), Equals, test.expected) + require.NoError(t, err) + require.Equal(t, test.expected, v.GetMysqlTime().String()) } testYears := []struct { @@ -1928,12 +1955,12 @@ func (s *testEvaluatorSuite) TestDateArithFuncs(c *C) { for _, test := range testYears { args = types.MakeDatums(test.input, test.year, "YEAR") - f, err = fcAdd.getFunction(s.ctx, s.datumsToConstants(args)) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + f, err = fcAdd.getFunction(ctx, datumsToConstants(args)) + require.NoError(t, err) + require.NotNil(t, f) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.GetMysqlTime().String(), Equals, test.expected) + require.NoError(t, err) + require.Equal(t, test.expected, v.GetMysqlTime().String()) } testOverflowYears := []struct { @@ -1946,22 +1973,22 @@ func (s *testEvaluatorSuite) TestDateArithFuncs(c *C) { for _, test := range testOverflowYears { args = types.MakeDatums(test.input, test.year, "YEAR") - f, err = fcAdd.getFunction(s.ctx, s.datumsToConstants(args)) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + f, err = fcAdd.getFunction(ctx, datumsToConstants(args)) + require.NoError(t, err) + require.NotNil(t, f) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.IsNull(), IsTrue) + require.NoError(t, err) + require.True(t, v.IsNull()) } for _, test := range testOverflowYears { args = types.MakeDatums(test.input, test.year, "YEAR") - f, err = fcSub.getFunction(s.ctx, s.datumsToConstants(args)) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + f, err = fcSub.getFunction(ctx, datumsToConstants(args)) + require.NoError(t, err) + require.NotNil(t, f) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.IsNull(), IsTrue) + require.NoError(t, err) + require.True(t, v.IsNull()) } testDurations := []struct { @@ -2063,19 +2090,20 @@ func (s *testEvaluatorSuite) TestDateArithFuncs(c *C) { } for _, tt := range testDurations { dur, _, ok, err := types.StrToDuration(nil, tt.dur, tt.fsp) - c.Assert(err, IsNil) - c.Assert(ok, IsTrue) + require.NoError(t, err) + require.True(t, ok) args = types.MakeDatums(dur, tt.format, tt.unit) - f, err = tt.fc.getFunction(s.ctx, s.datumsToConstants(args)) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + f, err = tt.fc.getFunction(ctx, datumsToConstants(args)) + require.NoError(t, err) + require.NotNil(t, f) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.GetMysqlDuration().String(), Equals, tt.expected) + require.NoError(t, err) + require.Equal(t, tt.expected, v.GetMysqlDuration().String()) } } -func (s *testEvaluatorSuite) TestTimestamp(c *C) { +func TestTimestamp(t *testing.T) { + ctx := createContext(t) tests := []struct { t []types.Datum expect string @@ -2108,25 +2136,26 @@ func (s *testEvaluatorSuite) TestTimestamp(c *C) { } fc := funcs[ast.Timestamp] for _, test := range tests { - resetStmtContext(s.ctx) - f, err := fc.getFunction(s.ctx, s.datumsToConstants(test.t)) - c.Assert(err, IsNil) + resetStmtContext(ctx) + f, err := fc.getFunction(ctx, datumsToConstants(test.t)) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) result, _ := d.ToString() - c.Assert(result, Equals, test.expect) + require.Equal(t, test.expect, result) } nilDatum := types.NewDatum(nil) - resetStmtContext(s.ctx) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{nilDatum})) - c.Assert(err, IsNil) + resetStmtContext(ctx) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{nilDatum})) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + require.Equal(t, types.KindNull, d.Kind()) } -func (s *testEvaluatorSuite) TestMakeDate(c *C) { +func TestMakeDate(t *testing.T) { + ctx := createContext(t) cases := []struct { args []interface{} expected string @@ -2153,33 +2182,34 @@ func (s *testEvaluatorSuite) TestMakeDate(c *C) { {[]interface{}{errors.New("must error"), errors.New("must error")}, "", false, true}, } - for _, t := range cases { - f, err := newFunctionForTest(s.ctx, ast.MakeDate, s.primitiveValsToConstants(t.args)...) - c.Assert(err, IsNil) + for _, c := range cases { + f, err := newFunctionForTest(ctx, ast.MakeDate, primitiveValsToConstants(ctx, c.args)...) + require.NoError(t, err) tp := f.GetType() - c.Assert(tp.Tp, Equals, mysql.TypeDate) - c.Assert(tp.Charset, Equals, charset.CharsetBin) - c.Assert(tp.Collate, Equals, charset.CollationBin) - c.Assert(tp.Flag, Equals, mysql.BinaryFlag) - c.Assert(tp.Flen, Equals, mysql.MaxDateWidth) + require.Equal(t, mysql.TypeDate, tp.Tp) + require.Equal(t, charset.CharsetBin, tp.Charset) + require.Equal(t, charset.CollationBin, tp.Collate) + require.Equal(t, mysql.BinaryFlag, tp.Flag) + require.Equal(t, mysql.MaxDateWidth, tp.Flen) d, err := f.Eval(chunk.Row{}) - if t.getErr { - c.Assert(err, NotNil) + if c.getErr { + require.Error(t, err) } else { - c.Assert(err, IsNil) - if t.isNil { - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + if c.isNil { + require.Equal(t, types.KindNull, d.Kind()) } else { - c.Assert(d.GetMysqlTime().String(), Equals, t.expected) + require.Equal(t, c.expected, d.GetMysqlTime().String()) } } } - _, err := funcs[ast.MakeDate].getFunction(s.ctx, []Expression{NewZero(), NewZero()}) - c.Assert(err, IsNil) + _, err := funcs[ast.MakeDate].getFunction(ctx, []Expression{NewZero(), NewZero()}) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestMakeTime(c *C) { +func TestMakeTime(t *testing.T) { + ctx := createContext(t) tbl := []struct { Args []interface{} Want interface{} @@ -2237,17 +2267,17 @@ func (s *testEvaluatorSuite) TestMakeTime(c *C) { Dtbl := tblToDtbl(tbl) maketime := funcs[ast.MakeTime] - for idx, t := range Dtbl { - f, err := maketime.getFunction(s.ctx, s.datumsToConstants(t["Args"])) - c.Assert(err, IsNil) + for idx, c := range Dtbl { + f, err := maketime.getFunction(ctx, datumsToConstants(c["Args"])) + require.NoError(t, err) got, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - if t["Want"][0].Kind() == types.KindNull { - c.Assert(got.Kind(), Equals, types.KindNull, Commentf("[%v] - args:%v", idx, t["Args"])) + require.NoError(t, err) + if c["Want"][0].Kind() == types.KindNull { + require.Equalf(t, types.KindNull, got.Kind(), "[%v] - args:%v", idx, c["Args"]) } else { - want, err := t["Want"][0].ToString() - c.Assert(err, IsNil) - c.Assert(got.GetMysqlDuration().String(), Equals, want, Commentf("[%v] - args:%v", idx, t["Args"])) + want, err := c["Want"][0].ToString() + require.NoError(t, err) + require.Equalf(t, want, got.GetMysqlDuration().String(), "[%v] - args:%v", idx, c["Args"]) } } @@ -2259,14 +2289,14 @@ func (s *testEvaluatorSuite) TestMakeTime(c *C) { Collate: charset.CollationBin, Flen: mysql.MaxIntWidth, } - f := BuildCastFunction(s.ctx, &Constant{Value: types.NewDatum("-1"), RetType: types.NewFieldType(mysql.TypeString)}, tp1) + f := BuildCastFunction(ctx, &Constant{Value: types.NewDatum("-1"), RetType: types.NewFieldType(mysql.TypeString)}, tp1) res, err := f.Eval(chunk.Row{}) - c.Assert(err, IsNil) - f1, err := maketime.getFunction(s.ctx, s.datumsToConstants([]types.Datum{res, makeDatums(0)[0], makeDatums(0)[0]})) - c.Assert(err, IsNil) + require.NoError(t, err) + f1, err := maketime.getFunction(ctx, datumsToConstants([]types.Datum{res, makeDatums(0)[0], makeDatums(0)[0]})) + require.NoError(t, err) got, err := evalBuiltinFunc(f1, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(got.GetMysqlDuration().String(), Equals, "838:59:59") + require.NoError(t, err) + require.Equal(t, "838:59:59", got.GetMysqlDuration().String()) tbl = []struct { Args []interface{} @@ -2277,19 +2307,20 @@ func (s *testEvaluatorSuite) TestMakeTime(c *C) { } Dtbl = tblToDtbl(tbl) maketime = funcs[ast.MakeTime] - for idx, t := range Dtbl { - f, err := maketime.getFunction(s.ctx, s.datumsToConstants(t["Args"])) - c.Assert(err, IsNil) + for idx, c := range Dtbl { + f, err := maketime.getFunction(ctx, datumsToConstants(c["Args"])) + require.NoError(t, err) got, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - want, err := t["Want"][0].ToString() - c.Assert(err, IsNil) - c.Assert(got.GetMysqlDuration().String(), Equals, want, Commentf("[%v] - args:%v", idx, t["Args"])) + require.NoError(t, err) + want, err := c["Want"][0].ToString() + require.NoError(t, err) + require.Equalf(t, want, got.GetMysqlDuration().String(), "[%v] - args:%v", idx, c["Args"]) } } -func (s *testEvaluatorSuite) TestQuarter(c *C) { - sc := s.ctx.GetSessionVars().StmtCtx +func TestQuarter(t *testing.T) { + ctx := createContext(t) + sc := ctx.GetSessionVars().StmtCtx sc.IgnoreZeroInDate = true tests := []struct { t string @@ -2311,24 +2342,25 @@ func (s *testEvaluatorSuite) TestQuarter(c *C) { fc := funcs["quarter"] for _, test := range tests { arg := types.NewStringDatum(test.t) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{arg})) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{arg})) + require.NoError(t, err) + require.NotNil(t, f) result, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(result.GetInt64(), Equals, test.expect) + require.NoError(t, err) + require.Equal(t, test.expect, result.GetInt64()) } // test invalid input argInvalid := types.NewStringDatum("2008-13-01") - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{argInvalid})) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{argInvalid})) + require.NoError(t, err) result, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(result.IsNull(), IsTrue) + require.NoError(t, err) + require.True(t, result.IsNull()) } -func (s *testEvaluatorSuite) TestGetFormat(c *C) { +func TestGetFormat(t *testing.T) { + ctx := createContext(t) tests := []struct { unit string location string @@ -2355,18 +2387,19 @@ func (s *testEvaluatorSuite) TestGetFormat(c *C) { fc := funcs[ast.GetFormat] for _, test := range tests { - t := []types.Datum{types.NewStringDatum(test.unit), types.NewStringDatum(test.location)} - f, err := fc.getFunction(s.ctx, s.datumsToConstants(t)) - c.Assert(err, IsNil) + dat := []types.Datum{types.NewStringDatum(test.unit), types.NewStringDatum(test.location)} + f, err := fc.getFunction(ctx, datumsToConstants(dat)) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) result, _ := d.ToString() - c.Assert(result, Equals, test.expect) + require.Equal(t, test.expect, result) } } -func (s *testEvaluatorSuite) TestToSeconds(c *C) { - sc := s.ctx.GetSessionVars().StmtCtx +func TestToSeconds(t *testing.T) { + ctx := createContext(t) + sc := ctx.GetSessionVars().StmtCtx sc.IgnoreZeroInDate = true tests := []struct { param interface{} @@ -2381,12 +2414,12 @@ func (s *testEvaluatorSuite) TestToSeconds(c *C) { fc := funcs[ast.ToSeconds] for _, test := range tests { - t := []types.Datum{types.NewDatum(test.param)} - f, err := fc.getFunction(s.ctx, s.datumsToConstants(t)) - c.Assert(err, IsNil) + dat := []types.Datum{types.NewDatum(test.param)} + f, err := fc.getFunction(ctx, datumsToConstants(dat)) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d.GetInt64(), Equals, test.expect) + require.NoError(t, err) + require.Equal(t, test.expect, d.GetInt64()) } testsNull := []interface{}{ @@ -2396,17 +2429,18 @@ func (s *testEvaluatorSuite) TestToSeconds(c *C) { 123456789} for _, i := range testsNull { - t := []types.Datum{types.NewDatum(i)} - f, err := fc.getFunction(s.ctx, s.datumsToConstants(t)) - c.Assert(err, IsNil) + dat := []types.Datum{types.NewDatum(i)} + f, err := fc.getFunction(ctx, datumsToConstants(dat)) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d.IsNull(), IsTrue) + require.NoError(t, err) + require.True(t, d.IsNull()) } } -func (s *testEvaluatorSuite) TestToDays(c *C) { - sc := s.ctx.GetSessionVars().StmtCtx +func TestToDays(t *testing.T) { + ctx := createContext(t) + sc := ctx.GetSessionVars().StmtCtx sc.IgnoreZeroInDate = true tests := []struct { param interface{} @@ -2422,12 +2456,12 @@ func (s *testEvaluatorSuite) TestToDays(c *C) { fc := funcs[ast.ToDays] for _, test := range tests { - t := []types.Datum{types.NewDatum(test.param)} - f, err := fc.getFunction(s.ctx, s.datumsToConstants(t)) - c.Assert(err, IsNil) + dat := []types.Datum{types.NewDatum(test.param)} + f, err := fc.getFunction(ctx, datumsToConstants(dat)) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d.GetInt64(), Equals, test.expect) + require.NoError(t, err) + require.Equal(t, test.expect, d.GetInt64()) } testsNull := []interface{}{ @@ -2437,16 +2471,17 @@ func (s *testEvaluatorSuite) TestToDays(c *C) { 123456789} for _, i := range testsNull { - t := []types.Datum{types.NewDatum(i)} - f, err := fc.getFunction(s.ctx, s.datumsToConstants(t)) - c.Assert(err, IsNil) + dat := []types.Datum{types.NewDatum(i)} + f, err := fc.getFunction(ctx, datumsToConstants(dat)) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d.IsNull(), IsTrue) + require.NoError(t, err) + require.True(t, d.IsNull()) } } -func (s *testEvaluatorSuite) TestTimestampAdd(c *C) { +func TestTimestampAdd(t *testing.T) { + ctx := createContext(t) tests := []struct { unit string interval int64 @@ -2461,17 +2496,18 @@ func (s *testEvaluatorSuite) TestTimestampAdd(c *C) { fc := funcs[ast.TimestampAdd] for _, test := range tests { - t := []types.Datum{types.NewStringDatum(test.unit), types.NewIntDatum(test.interval), types.NewDatum(test.date)} - f, err := fc.getFunction(s.ctx, s.datumsToConstants(t)) - c.Assert(err, IsNil) + dat := []types.Datum{types.NewStringDatum(test.unit), types.NewIntDatum(test.interval), types.NewDatum(test.date)} + f, err := fc.getFunction(ctx, datumsToConstants(dat)) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) result, _ := d.ToString() - c.Assert(result, Equals, test.expect) + require.Equal(t, test.expect, result) } } -func (s *testEvaluatorSuite) TestPeriodAdd(c *C) { +func TestPeriodAdd(t *testing.T) { + ctx := createContext(t) tests := []struct { Period int64 Months int64 @@ -2491,30 +2527,31 @@ func (s *testEvaluatorSuite) TestPeriodAdd(c *C) { for _, test := range tests { period := types.NewIntDatum(test.Period) months := types.NewIntDatum(test.Months) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{period, months})) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{period, months})) + require.NoError(t, err) + require.NotNil(t, f) result, err := evalBuiltinFunc(f, chunk.Row{}) if !test.Success { - c.Assert(result.IsNull(), IsTrue) + require.True(t, result.IsNull()) continue } - c.Assert(err, IsNil) - c.Assert(result.Kind(), Equals, types.KindInt64) + require.NoError(t, err) + require.Equal(t, types.KindInt64, result.Kind()) value := result.GetInt64() - c.Assert(value, Equals, test.Expect) + require.Equal(t, test.Expect, value) } } -func (s *testEvaluatorSuite) TestTimeFormat(c *C) { +func TestTimeFormat(t *testing.T) { + ctx := createContext(t) // SELECT TIME_FORMAT(null,'%H %k %h %I %l') args := []types.Datum{types.NewDatum(nil), types.NewStringDatum(`%H %k %h %I %l`)} fc := funcs[ast.TimeFormat] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(args)) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(args)) + require.NoError(t, err) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.IsNull(), Equals, true) + require.NoError(t, err) + require.Equal(t, true, v.IsNull()) tblDate := []struct { Input []string @@ -2532,27 +2569,28 @@ func (s *testEvaluatorSuite) TestTimeFormat(c *C) { "19 30 10"}, } dtblDate := tblToDtbl(tblDate) - for i, t := range dtblDate { + for i, c := range dtblDate { fc := funcs[ast.TimeFormat] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(c["Input"])) + require.NoError(t, err) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, t["Expect"][0], Commentf(`no.%d \nobtain:%v \nexpect:%v\n`, i, - v.GetValue(), t["Expect"][0].GetValue())) + require.NoError(t, err) + comment := fmt.Sprintf("no.%d\nobtain:%v\nexpect:%v\n", i, v.GetValue(), c["Expect"][0].GetValue()) + trequire.DatumEqual(t, c["Expect"][0], v, comment) } } -func (s *testEvaluatorSuite) TestTimeToSec(c *C) { +func TestTimeToSec(t *testing.T) { + ctx := createContext(t) fc := funcs[ast.TimeToSec] // test nil nilDatum := types.NewDatum(nil) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{nilDatum})) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{nilDatum})) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + require.Equal(t, types.KindNull, d.Kind()) // TODO: Some test cases are commented out due to #4340, #4341. tests := []struct { @@ -2577,17 +2615,19 @@ func (s *testEvaluatorSuite) TestTimeToSec(c *C) { // {types.NewIntDatum(171222020005), 7205}, } for _, test := range tests { - expr := s.datumsToConstants([]types.Datum{test.input}) - f, err := fc.getFunction(s.ctx, expr) - c.Assert(err, IsNil, Commentf("%+v", test)) + comment := fmt.Sprintf("%+v", test) + expr := datumsToConstants([]types.Datum{test.input}) + f, err := fc.getFunction(ctx, expr) + require.NoError(t, err, comment) result, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil, Commentf("%+v", test)) - c.Assert(result.GetInt64(), Equals, test.expect, Commentf("%+v", test)) + require.NoError(t, err, comment) + require.Equal(t, test.expect, result.GetInt64(), comment) } } -func (s *testEvaluatorSuite) TestSecToTime(c *C) { - stmtCtx := s.ctx.GetSessionVars().StmtCtx +func TestSecToTime(t *testing.T) { + ctx := createContext(t) + stmtCtx := ctx.GetSessionVars().StmtCtx origin := stmtCtx.IgnoreTruncate stmtCtx.IgnoreTruncate = true defer func() { @@ -2598,11 +2638,11 @@ func (s *testEvaluatorSuite) TestSecToTime(c *C) { // test nil nilDatum := types.NewDatum(nil) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{nilDatum})) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{nilDatum})) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d.Kind(), Equals, types.KindNull) + require.NoError(t, err) + require.Equal(t, types.KindNull, d.Kind()) tests := []struct { inputDecimal int @@ -2622,18 +2662,24 @@ func (s *testEvaluatorSuite) TestSecToTime(c *C) { {0, types.NewStringDatum("abc"), "00:00:00.000000"}, } for _, test := range tests { - expr := s.datumsToConstants([]types.Datum{test.input}) + comment := fmt.Sprintf("%+v", test) + expr := datumsToConstants([]types.Datum{test.input}) expr[0].GetType().Decimal = test.inputDecimal - f, err := fc.getFunction(s.ctx, expr) - c.Assert(err, IsNil, Commentf("%+v", test)) + f, err := fc.getFunction(ctx, expr) + require.NoError(t, err, comment) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil, Commentf("%+v", test)) + require.NoError(t, err, comment) result, _ := d.ToString() - c.Assert(result, Equals, test.expect, Commentf("%+v", test)) + require.Equal(t, test.expect, result, comment) } } -func (s *testEvaluatorSuite) TestConvertTz(c *C) { +func TestConvertTz(t *testing.T) { + ctx := createContext(t) + loc1, _ := time.LoadLocation("Europe/Tallinn") + loc2, _ := time.LoadLocation("Local") + t1, _ := time.ParseInLocation("2006-01-02 15:04:00", "2021-10-22 10:00:00", loc1) + t2, _ := time.ParseInLocation("2006-01-02 15:04:00", "2021-10-22 10:00:00", loc2) tests := []struct { t interface{} fromTz interface{} @@ -2647,11 +2693,11 @@ func (s *testEvaluatorSuite) TestConvertTz(c *C) { {"2004-01-01 12:00:00", "GMT", "MET", true, "2004-01-01 13:00:00"}, {"2004-01-01 12:00:00", "-01:00", "-12:00", true, "2004-01-01 01:00:00"}, {"2004-01-01 12:00:00", "-00:00", "+13:00", true, "2004-01-02 01:00:00"}, - {"2004-01-01 12:00:00", "-00:00", "-13:00", true, ""}, + {"2004-01-01 12:00:00", "-00:00", "-13:00", true, "2003-12-31 23:00:00"}, {"2004-01-01 12:00:00", "-00:00", "-12:88", true, ""}, {"2004-01-01 12:00:00", "+10:82", "GMT", true, ""}, - {"2004-01-01 12:00:00", "+00:00", "GMT", true, ""}, - {"2004-01-01 12:00:00", "GMT", "+00:00", true, ""}, + {"2004-01-01 12:00:00", "+00:00", "GMT", true, "2004-01-01 12:00:00"}, + {"2004-01-01 12:00:00", "GMT", "+00:00", true, "2004-01-01 12:00:00"}, {20040101, "+00:00", "+10:32", true, "2004-01-01 10:32:00"}, {3.14159, "+00:00", "+10:32", true, ""}, {"2004-01-01 12:00:00", "", "GMT", true, ""}, @@ -2663,28 +2709,48 @@ func (s *testEvaluatorSuite) TestConvertTz(c *C) { {nil, "GMT", "+00:00", true, ""}, {"2004-01-01 12:00:00", nil, "+00:00", true, ""}, {"2004-01-01 12:00:00", "GMT", nil, true, ""}, + {"2004-01-01 12:00:00", "GMT", "+10:00", true, "2004-01-01 22:00:00"}, + {"2004-01-01 12:00:00", "+00:00", "MET", true, "2004-01-01 13:00:00"}, + {"2004-01-01 12:00:00", "+00:00", "+14:00", true, "2004-01-02 02:00:00"}, + {"2021-10-31 02:59:59", "+02:00", "Europe/Amsterdam", true, "2021-10-31 02:59:59"}, + {"2021-10-31 03:00:00", "+01:00", "Europe/Amsterdam", true, "2021-10-31 03:00:00"}, + {"2021-10-31 02:00:00", "+02:00", "Europe/Amsterdam", true, "2021-10-31 02:00:00"}, + {"2021-10-31 02:59:59", "+02:00", "Europe/Amsterdam", true, "2021-10-31 02:59:59"}, + {"2021-10-31 03:00:00", "+02:00", "Europe/Amsterdam", true, "2021-10-31 02:00:00"}, + {"2021-10-31 02:30:00", "+01:00", "Europe/Amsterdam", true, "2021-10-31 02:30:00"}, + {"2021-10-31 03:00:00", "+01:00", "Europe/Amsterdam", true, "2021-10-31 03:00:00"}, + // Europe/Amsterdam during DST transition +02:00 -> +01:00, Summer to normal time, + // will be interpreted as +01:00, normal time. + {"2021-10-31 02:00:00", "Europe/Amsterdam", "+02:00", true, "2021-10-31 03:00:00"}, + {"2021-10-31 02:59:59", "Europe/Amsterdam", "+02:00", true, "2021-10-31 03:59:59"}, + {"2021-10-31 02:00:00", "Europe/Amsterdam", "+01:00", true, "2021-10-31 02:00:00"}, + {"2021-10-31 03:00:00", "Europe/Amsterdam", "+01:00", true, "2021-10-31 03:00:00"}, + {"2021-03-28 02:30:00", "Europe/Amsterdam", "UTC", true, ""}, + {"2021-10-22 10:00:00", "Europe/Tallinn", "SYSTEM", true, t1.In(loc2).Format("2006-01-02 15:04:00")}, + {"2021-10-22 10:00:00", "SYSTEM", "Europe/Tallinn", true, t2.In(loc1).Format("2006-01-02 15:04:00")}, } fc := funcs[ast.ConvertTz] for _, test := range tests { - f, err := fc.getFunction(s.ctx, - s.datumsToConstants( + f, err := fc.getFunction(ctx, + datumsToConstants( []types.Datum{ types.NewDatum(test.t), types.NewDatum(test.fromTz), types.NewDatum(test.toTz)})) - c.Assert(err, IsNil) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) if test.Success { - c.Assert(err, IsNil) + require.NoError(t, err) } else { - c.Assert(err, NotNil) + require.Error(t, err) } result, _ := d.ToString() - c.Assert(result, Equals, test.expect, Commentf("convert_tz(\"%v\", \"%s\", \"%s\")", test.t, test.fromTz, test.toTz)) + require.Equalf(t, test.expect, result, "convert_tz(\"%v\", \"%s\", \"%s\")", test.t, test.fromTz, test.toTz) } } -func (s *testEvaluatorSuite) TestPeriodDiff(c *C) { +func TestPeriodDiff(t *testing.T) { + ctx := createContext(t) tests := []struct { Period1 int64 Period2 int64 @@ -2715,48 +2781,49 @@ func (s *testEvaluatorSuite) TestPeriodDiff(c *C) { for _, test := range tests { period1 := types.NewIntDatum(test.Period1) period2 := types.NewIntDatum(test.Period2) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{period1, period2})) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{period1, period2})) + require.NoError(t, err) + require.NotNil(t, f) result, err := evalBuiltinFunc(f, chunk.Row{}) if !test.Success { - c.Assert(result.IsNull(), IsTrue) + require.True(t, result.IsNull()) continue } - c.Assert(err, IsNil) - c.Assert(result.Kind(), Equals, types.KindInt64) + require.NoError(t, err) + require.Equal(t, types.KindInt64, result.Kind()) value := result.GetInt64() - c.Assert(value, Equals, test.Expect) + require.Equal(t, test.Expect, value) } for _, test := range tests2 { period1 := types.NewIntDatum(test.Period1) period2 := types.NewIntDatum(test.Period2) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{period1, period2})) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{period1, period2})) + require.NoError(t, err) + require.NotNil(t, f) _, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[expression:1210]Incorrect arguments to period_diff") + require.Error(t, err) + require.Equal(t, "[expression:1210]Incorrect arguments to period_diff", err.Error()) } // nil args := []types.Datum{types.NewDatum(nil), types.NewIntDatum(0)} - f, err := fc.getFunction(s.ctx, s.datumsToConstants(args)) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(args)) + require.NoError(t, err) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.Kind(), Equals, types.KindNull) + require.NoError(t, err) + require.Equal(t, types.KindNull, v.Kind()) args = []types.Datum{types.NewIntDatum(0), types.NewDatum(nil)} - f, err = fc.getFunction(s.ctx, s.datumsToConstants(args)) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(args)) + require.NoError(t, err) v, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.Kind(), Equals, types.KindNull) + require.NoError(t, err) + require.Equal(t, types.KindNull, v.Kind()) } -func (s *testEvaluatorSuite) TestLastDay(c *C) { +func TestLastDay(t *testing.T) { + ctx := createContext(t) tests := []struct { param interface{} expect string @@ -2769,17 +2836,17 @@ func (s *testEvaluatorSuite) TestLastDay(c *C) { fc := funcs[ast.LastDay] for _, test := range tests { - t := []types.Datum{types.NewDatum(test.param)} - f, err := fc.getFunction(s.ctx, s.datumsToConstants(t)) - c.Assert(err, IsNil) + dat := []types.Datum{types.NewDatum(test.param)} + f, err := fc.getFunction(ctx, datumsToConstants(dat)) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) result, _ := d.ToString() - c.Assert(result, Equals, test.expect) + require.Equal(t, test.expect, result) } var timeData types.Time - timeData.StrToDate(s.ctx.GetSessionVars().StmtCtx, "202010", "%Y%m") + timeData.StrToDate(ctx.GetSessionVars().StmtCtx, "202010", "%Y%m") testsNull := []struct { param interface{} isNilNoZeroDate bool @@ -2796,22 +2863,23 @@ func (s *testEvaluatorSuite) TestLastDay(c *C) { } for _, i := range testsNull { - t := []types.Datum{types.NewDatum(i.param)} - f, err := fc.getFunction(s.ctx, s.datumsToConstants(t)) - c.Assert(err, IsNil) + dat := []types.Datum{types.NewDatum(i.param)} + f, err := fc.getFunction(ctx, datumsToConstants(dat)) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d.IsNull() == i.isNilNoZeroDate, IsTrue) - s.ctx.GetSessionVars().SQLMode &= ^mysql.ModeNoZeroDate + require.NoError(t, err) + require.True(t, d.IsNull() == i.isNilNoZeroDate) + ctx.GetSessionVars().SQLMode &= ^mysql.ModeNoZeroDate d, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d.IsNull() == i.isNil, IsTrue) - s.ctx.GetSessionVars().SQLMode |= mysql.ModeNoZeroDate + require.NoError(t, err) + require.True(t, d.IsNull() == i.isNil) + ctx.GetSessionVars().SQLMode |= mysql.ModeNoZeroDate } } -func (s *testEvaluatorSuite) TestWithTimeZone(c *C) { - sv := s.ctx.GetSessionVars() +func TestWithTimeZone(t *testing.T) { + ctx := createContext(t) + sv := ctx.GetSessionVars() originTZ := sv.Location() sv.TimeZone, _ = time.LoadLocation("Asia/Tokyo") defer func() { @@ -2841,20 +2909,21 @@ func (s *testEvaluatorSuite) TestWithTimeZone(c *C) { {ast.Curtime, nil, durationToGoTime}, } - for _, t := range tests { + for _, c := range tests { now := time.Now().In(sv.TimeZone) - f, err := funcs[t.method].getFunction(s.ctx, s.datumsToConstants(t.Input)) - c.Assert(err, IsNil) - resetStmtContext(s.ctx) + f, err := funcs[c.method].getFunction(ctx, datumsToConstants(c.Input)) + require.NoError(t, err) + resetStmtContext(ctx) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - result := t.convertToTime(d, sv.TimeZone) - c.Assert(result.Sub(now), LessEqual, 2*time.Second) + require.NoError(t, err) + result := c.convertToTime(d, sv.TimeZone) + require.LessOrEqual(t, result.Sub(now), 2*time.Second) } } -func (s *testEvaluatorSuite) TestTidbParseTso(c *C) { - s.ctx.GetSessionVars().TimeZone = time.UTC +func TestTidbParseTso(t *testing.T) { + ctx := createContext(t) + ctx.GetSessionVars().TimeZone = time.UTC tests := []struct { param interface{} expect string @@ -2866,13 +2935,13 @@ func (s *testEvaluatorSuite) TestTidbParseTso(c *C) { fc := funcs[ast.TiDBParseTso] for _, test := range tests { - t := []types.Datum{types.NewDatum(test.param)} - f, err := fc.getFunction(s.ctx, s.datumsToConstants(t)) - c.Assert(err, IsNil) + dat := []types.Datum{types.NewDatum(test.param)} + f, err := fc.getFunction(ctx, datumsToConstants(dat)) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) result, _ := d.ToString() - c.Assert(result, Equals, test.expect) + require.Equal(t, test.expect, result) } testsNull := []interface{}{ @@ -2881,25 +2950,26 @@ func (s *testEvaluatorSuite) TestTidbParseTso(c *C) { "-1"} for _, i := range testsNull { - t := []types.Datum{types.NewDatum(i)} - f, err := fc.getFunction(s.ctx, s.datumsToConstants(t)) - c.Assert(err, IsNil) + dat := []types.Datum{types.NewDatum(i)} + f, err := fc.getFunction(ctx, datumsToConstants(dat)) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d.IsNull(), IsTrue) + require.NoError(t, err) + require.True(t, d.IsNull()) } } -func (s *testEvaluatorSuite) TestTiDBBoundedStaleness(c *C) { +func TestTiDBBoundedStaleness(t *testing.T) { + ctx := createContext(t) t1, err := time.Parse(types.TimeFormat, "2015-09-21 09:53:04") - c.Assert(err, IsNil) + require.NoError(t, err) // time.Parse uses UTC time zone by default, we need to change it to Local manually. t1 = t1.Local() t1Str := t1.Format(types.TimeFormat) t2 := time.Now() t2Str := t2.Format(types.TimeFormat) timeZone := time.Local - s.ctx.GetSessionVars().TimeZone = timeZone + ctx.GetSessionVars().TimeZone = timeZone tests := []struct { leftTime interface{} rightTime interface{} @@ -2943,51 +3013,49 @@ func (s *testEvaluatorSuite) TestTiDBBoundedStaleness(c *C) { fc := funcs[ast.TiDBBoundedStaleness] for _, test := range tests { - c.Assert(failpoint.Enable("github.com/pingcap/tidb/expression/injectSafeTS", - fmt.Sprintf("return(%v)", test.injectSafeTS)), IsNil) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{types.NewDatum(test.leftTime), types.NewDatum(test.rightTime)})) - c.Assert(err, IsNil) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/injectSafeTS", fmt.Sprintf("return(%v)", test.injectSafeTS))) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{types.NewDatum(test.leftTime), types.NewDatum(test.rightTime)})) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) if test.isNull { - c.Assert(d.IsNull(), IsTrue) + require.True(t, d.IsNull()) } else { goTime, err := d.GetMysqlTime().GoTime(timeZone) - c.Assert(err, IsNil) - c.Assert(goTime.Format(types.TimeFormat), Equals, test.expect.Format(types.TimeFormat)) + require.NoError(t, err) + require.Equal(t, test.expect.Format(types.TimeFormat), goTime.Format(types.TimeFormat)) } - resetStmtContext(s.ctx) + resetStmtContext(ctx) } // Test whether it's deterministic. safeTime1 := t2.Add(-1 * time.Second) safeTS1 := oracle.GoTimeToTS(safeTime1) - c.Assert(failpoint.Enable("github.com/pingcap/tidb/expression/injectSafeTS", - fmt.Sprintf("return(%v)", safeTS1)), IsNil) - f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{types.NewDatum(t1Str), types.NewDatum(t2Str)})) - c.Assert(err, IsNil) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/injectSafeTS", fmt.Sprintf("return(%v)", safeTS1))) + f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{types.NewDatum(t1Str), types.NewDatum(t2Str)})) + require.NoError(t, err) d, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) goTime, err := d.GetMysqlTime().GoTime(timeZone) - c.Assert(err, IsNil) + require.NoError(t, err) resultTime := goTime.Format(types.TimeFormat) - c.Assert(resultTime, Equals, safeTime1.Format(types.TimeFormat)) + require.Equal(t, safeTime1.Format(types.TimeFormat), resultTime) // SafeTS updated. safeTime2 := t2.Add(1 * time.Second) safeTS2 := oracle.GoTimeToTS(safeTime2) - c.Assert(failpoint.Enable("github.com/pingcap/tidb/expression/injectSafeTS", - fmt.Sprintf("return(%v)", safeTS2)), IsNil) - f, err = fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{types.NewDatum(t1Str), types.NewDatum(t2Str)})) - c.Assert(err, IsNil) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/injectSafeTS", fmt.Sprintf("return(%v)", safeTS2))) + f, err = fc.getFunction(ctx, datumsToConstants([]types.Datum{types.NewDatum(t1Str), types.NewDatum(t2Str)})) + require.NoError(t, err) d, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) // Still safeTime1 - c.Assert(resultTime, Equals, safeTime1.Format(types.TimeFormat)) - resetStmtContext(s.ctx) - failpoint.Disable("github.com/pingcap/tidb/expression/injectSafeTS") + require.Equal(t, safeTime1.Format(types.TimeFormat), resultTime) + resetStmtContext(ctx) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/expression/injectSafeTS")) } -func (s *testEvaluatorSuite) TestGetIntervalFromDecimal(c *C) { +func TestGetIntervalFromDecimal(t *testing.T) { + ctx := createContext(t) du := baseDateArithmetical{} tests := []struct { @@ -3005,9 +3073,11 @@ func (s *testEvaluatorSuite) TestGetIntervalFromDecimal(c *C) { } for _, test := range tests { - interval, isNull, err := du.getIntervalFromDecimal(s.ctx, s.datumsToConstants([]types.Datum{types.NewDatum("CURRENT DATE"), types.NewDecimalDatum(newMyDecimal(c, test.param))}), chunk.Row{}, test.unit) - c.Assert(isNull, IsFalse) - c.Assert(err, IsNil) - c.Assert(interval, Equals, test.expect) + dat := new(types.MyDecimal) + require.NoError(t, dat.FromString([]byte(test.param))) + interval, isNull, err := du.getIntervalFromDecimal(ctx, datumsToConstants([]types.Datum{types.NewDatum("CURRENT DATE"), types.NewDecimalDatum(dat)}), chunk.Row{}, test.unit) + require.False(t, isNull) + require.NoError(t, err) + require.Equal(t, test.expect, interval) } } diff --git a/expression/builtin_time_vec.go b/expression/builtin_time_vec.go index eb3745be2d64a..13a0135d267b5 100644 --- a/expression/builtin_time_vec.go +++ b/expression/builtin_time_vec.go @@ -119,7 +119,7 @@ func (b *builtinDateSig) vecEvalTime(input *chunk.Chunk, result *chunk.Column) e if result.IsNull(i) { continue } - if times[i].IsZero() { + if times[i].IsZero() && b.ctx.GetSessionVars().SQLMode.HasNoZeroDateMode() { if err := handleInvalidTimeError(b.ctx, types.ErrWrongValue.GenWithStackByArgs(types.DateTimeStr, times[i].String())); err != nil { return err } @@ -965,12 +965,11 @@ func (b *builtinMicroSecondSig) vecEvalInt(input *chunk.Chunk, result *chunk.Col result.ResizeInt64(n, false) result.MergeNulls(buf) i64s := result.Int64s() - ds := buf.GoDurations() for i := 0; i < n; i++ { if result.IsNull(i) { continue } - i64s[i] = int64((ds[i] % time.Second) / time.Microsecond) + i64s[i] = int64(buf.GetDuration(i, int(types.UnspecifiedFsp)).MicroSecond()) } return nil } @@ -2391,7 +2390,7 @@ func (b *builtinUnixTimestampIntSig) vecEvalInt(input *chunk.Chunk, result *chun continue } - t, err := buf.GetTime(i).GoTime(getTimeZone(b.ctx)) + t, err := buf.GetTime(i).AdjustedGoTime(getTimeZone(b.ctx)) if err != nil { i64s[i] = 0 continue diff --git a/expression/builtin_time_vec_generated_test.go b/expression/builtin_time_vec_generated_test.go index d8027e5971763..cd8d2c0571ba8 100644 --- a/expression/builtin_time_vec_generated_test.go +++ b/expression/builtin_time_vec_generated_test.go @@ -20,7 +20,6 @@ import ( "math" "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/types" @@ -6724,12 +6723,12 @@ var vecBuiltinTimeGeneratedCases = map[string][]vecExprBenchCase{ }, } -func (s *testVectorizeSuite1) TestVectorizedBuiltinTimeEvalOneVecGenerated(c *C) { - testVectorizedEvalOneVec(c, vecBuiltinTimeGeneratedCases) +func TestVectorizedBuiltinTimeEvalOneVecGenerated(t *testing.T) { + testVectorizedEvalOneVec(t, vecBuiltinTimeGeneratedCases) } -func (s *testVectorizeSuite1) TestVectorizedBuiltinTimeFuncGenerated(c *C) { - testVectorizedBuiltinFunc(c, vecBuiltinTimeGeneratedCases) +func TestVectorizedBuiltinTimeFuncGenerated(t *testing.T) { + testVectorizedBuiltinFunc(t, vecBuiltinTimeGeneratedCases) } func BenchmarkVectorizedBuiltinTimeEvalOneVecGenerated(b *testing.B) { diff --git a/expression/builtin_time_vec_test.go b/expression/builtin_time_vec_test.go index becce36259f56..158fcbcc55ed2 100644 --- a/expression/builtin_time_vec_test.go +++ b/expression/builtin_time_vec_test.go @@ -19,12 +19,12 @@ import ( "math/rand" "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/mock" + "github.com/stretchr/testify/require" ) type periodGener struct { @@ -572,12 +572,12 @@ var vecBuiltinTimeCases = map[string][]vecExprBenchCase{ }, } -func (s *testVectorizeSuite2) TestVectorizedBuiltinTimeEvalOneVec(c *C) { - testVectorizedEvalOneVec(c, vecBuiltinTimeCases) +func TestVectorizedBuiltinTimeEvalOneVec(t *testing.T) { + testVectorizedEvalOneVec(t, vecBuiltinTimeCases) } -func (s *testVectorizeSuite2) TestVectorizedBuiltinTimeFunc(c *C) { - testVectorizedBuiltinFunc(c, vecBuiltinTimeCases) +func TestVectorizedBuiltinTimeFunc(t *testing.T) { + testVectorizedBuiltinFunc(t, vecBuiltinTimeCases) } func BenchmarkVectorizedBuiltinTimeEvalOneVec(b *testing.B) { @@ -588,7 +588,7 @@ func BenchmarkVectorizedBuiltinTimeFunc(b *testing.B) { benchmarkVectorizedBuiltinFunc(b, vecBuiltinTimeCases) } -func (s *testEvaluatorSuite) TestVecMonth(c *C) { +func TestVecMonth(t *testing.T) { ctx := mock.NewContext() ctx.GetSessionVars().SQLMode |= mysql.ModeNoZeroDate ctx.GetSessionVars().StmtCtx.TruncateAsWarning = true @@ -599,11 +599,11 @@ func (s *testEvaluatorSuite) TestVecMonth(c *C) { input.AppendTime(0, types.ZeroDate) f, _, _, result := genVecBuiltinFuncBenchCase(ctx, ast.Month, vecExprBenchCase{retEvalType: types.ETInt, childrenTypes: []types.EvalType{types.ETDatetime}}) - c.Assert(ctx.GetSessionVars().StrictSQLMode, IsTrue) - c.Assert(f.vecEvalInt(input, result), IsNil) - c.Assert(len(ctx.GetSessionVars().StmtCtx.GetWarnings()), Equals, 0) + require.True(t, ctx.GetSessionVars().StrictSQLMode) + require.NoError(t, f.vecEvalInt(input, result)) + require.Equal(t, 0, len(ctx.GetSessionVars().StmtCtx.GetWarnings())) ctx.GetSessionVars().StmtCtx.InInsertStmt = true ctx.GetSessionVars().StmtCtx.TruncateAsWarning = false - c.Assert(f.vecEvalInt(input, result), IsNil) + require.NoError(t, f.vecEvalInt(input, result)) } diff --git a/expression/builtin_vectorized_test.go b/expression/builtin_vectorized_test.go index 377110f22dd89..1e5ae340995e3 100644 --- a/expression/builtin_vectorized_test.go +++ b/expression/builtin_vectorized_test.go @@ -21,13 +21,13 @@ import ( "testing" "time" - . "github.com/pingcap/check" "github.com/pingcap/errors" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/mock" + "github.com/stretchr/testify/require" ) type mockVecPlusIntBuiltinFunc struct { @@ -99,24 +99,24 @@ func genMockVecPlusIntBuiltinFunc() (*mockVecPlusIntBuiltinFunc, *chunk.Chunk, * return plus, input, buf } -func (s *testEvaluatorSuite) TestMockVecPlusInt(c *C) { +func TestMockVecPlusInt(t *testing.T) { plus, input, buf := genMockVecPlusIntBuiltinFunc() plus.enableAlloc = false - c.Assert(plus.vecEvalInt(input, buf), IsNil) + require.NoError(t, plus.vecEvalInt(input, buf)) for i := 0; i < 1024; i++ { - c.Assert(buf.IsNull(i), IsFalse) - c.Assert(buf.GetInt64(i), Equals, int64(i*2)) + require.False(t, buf.IsNull(i)) + require.Equal(t, int64(i*2), buf.GetInt64(i)) } plus.enableAlloc = true - c.Assert(plus.vecEvalInt(input, buf), IsNil) + require.NoError(t, plus.vecEvalInt(input, buf)) for i := 0; i < 1024; i++ { - c.Assert(buf.IsNull(i), IsFalse) - c.Assert(buf.GetInt64(i), Equals, int64(i*2)) + require.False(t, buf.IsNull(i)) + require.Equal(t, int64(i*2), buf.GetInt64(i)) } } -func (s *testVectorizeSuite2) TestMockVecPlusIntParallel(c *C) { +func TestMockVecPlusIntParallel(t *testing.T) { plus, input, buf := genMockVecPlusIntBuiltinFunc() plus.enableAlloc = true // it's concurrency-safe if enableAlloc is true var wg sync.WaitGroup @@ -126,10 +126,10 @@ func (s *testVectorizeSuite2) TestMockVecPlusIntParallel(c *C) { defer wg.Done() result := buf.CopyConstruct(nil) for i := 0; i < 10; i++ { - c.Assert(plus.vecEvalInt(input, result), IsNil) + require.NoError(t, plus.vecEvalInt(input, result)) for i := 0; i < 1024; i++ { - c.Assert(result.IsNull(i), IsFalse) - c.Assert(result.GetInt64(i), Equals, int64(i*2)) + require.False(t, result.IsNull(i)) + require.Equal(t, int64(i*2), result.GetInt64(i)) } } }() @@ -470,7 +470,7 @@ func genMockRowDouble(eType types.EvalType, enableVec bool) (builtinFunc, *chunk return rowDouble, input, buf, nil } -func (s *testEvaluatorSuite) checkVecEval(c *C, eType types.EvalType, sel []int, result *chunk.Column) { +func checkVecEval(t *testing.T, eType types.EvalType, sel []int, result *chunk.Column) { if sel == nil { for i := 0; i < 1024; i++ { sel = append(sel, i) @@ -479,55 +479,55 @@ func (s *testEvaluatorSuite) checkVecEval(c *C, eType types.EvalType, sel []int, switch eType { case types.ETInt: i64s := result.Int64s() - c.Assert(len(i64s), Equals, len(sel)) + require.Equal(t, len(sel), len(i64s)) for i, j := range sel { - c.Assert(i64s[i], Equals, int64(j*2)) + require.Equal(t, int64(j*2), i64s[i]) } case types.ETReal: f64s := result.Float64s() - c.Assert(len(f64s), Equals, len(sel)) + require.Equal(t, len(sel), len(f64s)) for i, j := range sel { - c.Assert(f64s[i], Equals, float64(j*2)) + require.Equal(t, float64(j*2), f64s[i]) } case types.ETDecimal: ds := result.Decimals() - c.Assert(len(ds), Equals, len(sel)) + require.Equal(t, len(sel), len(ds)) for i, j := range sel { dec := new(types.MyDecimal) - c.Assert(dec.FromFloat64(float64(j)), IsNil) + require.NoError(t, dec.FromFloat64(float64(j))) rst := new(types.MyDecimal) - c.Assert(types.DecimalAdd(dec, dec, rst), IsNil) - c.Assert(rst.Compare(&ds[i]), Equals, 0) + require.NoError(t, types.DecimalAdd(dec, dec, rst)) + require.Equal(t, 0, rst.Compare(&ds[i])) } case types.ETDuration: ds := result.GoDurations() - c.Assert(len(ds), Equals, len(sel)) + require.Equal(t, len(sel), len(ds)) for i, j := range sel { - c.Assert(ds[i], Equals, time.Duration(j+j)) + require.Equal(t, time.Duration(j+j), ds[i]) } case types.ETDatetime: ds := result.Times() - c.Assert(len(ds), Equals, len(sel)) + require.Equal(t, len(sel), len(ds)) for i, j := range sel { gt := types.FromDate(j, 0, 0, 0, 0, 0, 0) - t := types.NewTime(gt, convertETType(eType), 0) - d, err := t.ConvertToDuration() - c.Assert(err, IsNil) - v, err := t.Add(mock.NewContext().GetSessionVars().StmtCtx, d) - c.Assert(err, IsNil) - c.Assert(v.Compare(ds[i]), Equals, 0) + tt := types.NewTime(gt, convertETType(eType), 0) + d, err := tt.ConvertToDuration() + require.NoError(t, err) + v, err := tt.Add(mock.NewContext().GetSessionVars().StmtCtx, d) + require.NoError(t, err) + require.Equal(t, 0, v.Compare(ds[i])) } case types.ETJson: for i, j := range sel { path, err := json.ParseJSONPathExpr("$.key") - c.Assert(err, IsNil) + require.NoError(t, err) ret, ok := result.GetJSON(i).Extract([]json.PathExpression{path}) - c.Assert(ok, IsTrue) - c.Assert(ret.GetInt64(), Equals, int64(j*2)) + require.True(t, ok) + require.Equal(t, int64(j*2), ret.GetInt64()) } case types.ETString: for i, j := range sel { - c.Assert(result.GetString(i), Equals, fmt.Sprintf("%v%v", j, j)) + require.Equal(t, fmt.Sprintf("%v%v", j, j), result.GetString(i)) } } } @@ -552,13 +552,13 @@ func vecEvalType(f builtinFunc, eType types.EvalType, input *chunk.Chunk, result panic("not implement") } -func (s *testEvaluatorSuite) TestDoubleRow2Vec(c *C) { +func TestDoubleRow2Vec(t *testing.T) { eTypes := []types.EvalType{types.ETInt, types.ETReal, types.ETDecimal, types.ETDuration, types.ETString, types.ETDatetime, types.ETJson} for _, eType := range eTypes { rowDouble, input, result, err := genMockRowDouble(eType, false) - c.Assert(err, IsNil) - c.Assert(vecEvalType(rowDouble, eType, input, result), IsNil) - s.checkVecEval(c, eType, nil, result) + require.NoError(t, err) + require.NoError(t, vecEvalType(rowDouble, eType, input, result)) + checkVecEval(t, eType, nil, result) sel := []int{0} for { @@ -570,52 +570,52 @@ func (s *testEvaluatorSuite) TestDoubleRow2Vec(c *C) { sel = append(sel, end+rand.Intn(gap-1)+1) } input.SetSel(sel) - c.Assert(vecEvalType(rowDouble, eType, input, result), IsNil) + require.NoError(t, vecEvalType(rowDouble, eType, input, result)) - s.checkVecEval(c, eType, sel, result) + checkVecEval(t, eType, sel, result) } } -func (s *testEvaluatorSuite) TestDoubleVec2Row(c *C) { +func TestDoubleVec2Row(t *testing.T) { eTypes := []types.EvalType{types.ETInt, types.ETReal, types.ETDecimal, types.ETDuration, types.ETString, types.ETDatetime, types.ETJson} for _, eType := range eTypes { rowDouble, input, result, err := genMockRowDouble(eType, true) result.Reset(eType) - c.Assert(err, IsNil) + require.NoError(t, err) it := chunk.NewIterator4Chunk(input) for row := it.Begin(); row != it.End(); row = it.Next() { switch eType { case types.ETInt: v, _, err := rowDouble.evalInt(row) - c.Assert(err, IsNil) + require.NoError(t, err) result.AppendInt64(v) case types.ETReal: v, _, err := rowDouble.evalReal(row) - c.Assert(err, IsNil) + require.NoError(t, err) result.AppendFloat64(v) case types.ETDecimal: v, _, err := rowDouble.evalDecimal(row) - c.Assert(err, IsNil) + require.NoError(t, err) result.AppendMyDecimal(v) case types.ETDuration: v, _, err := rowDouble.evalDuration(row) - c.Assert(err, IsNil) + require.NoError(t, err) result.AppendDuration(v) case types.ETString: v, _, err := rowDouble.evalString(row) - c.Assert(err, IsNil) + require.NoError(t, err) result.AppendString(v) case types.ETDatetime: v, _, err := rowDouble.evalTime(row) - c.Assert(err, IsNil) + require.NoError(t, err) result.AppendTime(v) case types.ETJson: v, _, err := rowDouble.evalJSON(row) - c.Assert(err, IsNil) + require.NoError(t, err) result.AppendJSON(v) } } - s.checkVecEval(c, eType, nil, result) + checkVecEval(t, eType, nil, result) } } @@ -758,21 +758,21 @@ func BenchmarkMockDoubleVec(b *testing.B) { } } -func (s *testEvaluatorSuite) TestVectorizedCheck(c *C) { +func TestVectorizedCheck(t *testing.T) { con := &Constant{} - c.Assert(con.Vectorized(), IsTrue) + require.True(t, con.Vectorized()) col := &Column{} - c.Assert(col.Vectorized(), IsTrue) + require.True(t, col.Vectorized()) cor := CorrelatedColumn{Column: *col} - c.Assert(cor.Vectorized(), IsTrue) + require.True(t, cor.Vectorized()) vecF, _, _, _ := genMockRowDouble(types.ETInt, true) sf := &ScalarFunction{Function: vecF} - c.Assert(sf.Vectorized(), IsTrue) + require.True(t, sf.Vectorized()) rowF, _, _, _ := genMockRowDouble(types.ETInt, false) sf = &ScalarFunction{Function: rowF} - c.Assert(sf.Vectorized(), IsFalse) + require.False(t, sf.Vectorized()) } func genFloat32Col() (*Column, *chunk.Chunk, *chunk.Column) { @@ -786,16 +786,16 @@ func genFloat32Col() (*Column, *chunk.Chunk, *chunk.Column) { return col, chk, result } -func (s *testEvaluatorSuite) TestFloat32ColVec(c *C) { +func TestFloat32ColVec(t *testing.T) { col, chk, result := genFloat32Col() ctx := mock.NewContext() - c.Assert(col.VecEvalReal(ctx, chk, result), IsNil) + require.NoError(t, col.VecEvalReal(ctx, chk, result)) it := chunk.NewIterator4Chunk(chk) i := 0 for row := it.Begin(); row != it.End(); row = it.Next() { v, _, err := col.EvalReal(ctx, row) - c.Assert(err, IsNil) - c.Assert(v, Equals, result.GetFloat64(i)) + require.NoError(t, err) + require.Equal(t, result.GetFloat64(i), v) i++ } @@ -806,16 +806,116 @@ func (s *testEvaluatorSuite) TestFloat32ColVec(c *C) { sel = append(sel, i) } chk.SetSel(sel) - c.Assert(col.VecEvalReal(ctx, chk, result), IsNil) + require.NoError(t, col.VecEvalReal(ctx, chk, result)) i = 0 for row := it.Begin(); row != it.End(); row = it.Next() { v, _, err := col.EvalReal(ctx, row) - c.Assert(err, IsNil) - c.Assert(v, Equals, result.GetFloat64(i)) + require.NoError(t, err) + require.Equal(t, result.GetFloat64(i), v) i++ } - c.Assert(col.VecEvalReal(ctx, chk, result), IsNil) + require.NoError(t, col.VecEvalReal(ctx, chk, result)) +} + +func TestVecEvalBool(t *testing.T) { + ctx := mock.NewContext() + eTypes := []types.EvalType{types.ETReal, types.ETDecimal, types.ETString, types.ETTimestamp, types.ETDatetime, types.ETDuration} + for numCols := 1; numCols <= 5; numCols++ { + for round := 0; round < 16; round++ { + exprs, input := genVecEvalBool(numCols, nil, eTypes) + selected, nulls, err := VecEvalBool(ctx, exprs, input, nil, nil) + require.NoError(t, err) + it := chunk.NewIterator4Chunk(input) + i := 0 + for row := it.Begin(); row != it.End(); row = it.Next() { + ok, null, err := EvalBool(ctx, exprs, row) + require.NoError(t, err) + require.Equal(t, nulls[i], null) + require.Equal(t, selected[i], ok) + i++ + } + } + } +} + +func TestRowBasedFilterAndVectorizedFilter(t *testing.T) { + ctx := mock.NewContext() + eTypes := []types.EvalType{types.ETInt, types.ETReal, types.ETDecimal, types.ETString, types.ETTimestamp, types.ETDatetime, types.ETDuration} + for numCols := 1; numCols <= 5; numCols++ { + for round := 0; round < 16; round++ { + exprs, input := genVecEvalBool(numCols, nil, eTypes) + it := chunk.NewIterator4Chunk(input) + isNull := make([]bool, it.Len()) + selected, nulls, err := rowBasedFilter(ctx, exprs, it, nil, isNull) + require.NoError(t, err) + selected2, nulls2, err2 := vectorizedFilter(ctx, exprs, it, nil, isNull) + require.NoError(t, err2) + length := it.Len() + for i := 0; i < length; i++ { + require.Equal(t, nulls[i], nulls2[i]) + require.Equal(t, selected[i], selected2[i]) + } + } + } +} + +func TestVectorizedFilterConsiderNull(t *testing.T) { + ctx := mock.NewContext() + dafaultEnableVectorizedExpressionVar := ctx.GetSessionVars().EnableVectorizedExpression + eTypes := []types.EvalType{types.ETInt, types.ETReal, types.ETDecimal, types.ETString, types.ETTimestamp, types.ETDatetime, types.ETDuration} + for numCols := 1; numCols <= 5; numCols++ { + for round := 0; round < 16; round++ { + exprs, input := genVecEvalBool(numCols, nil, eTypes) + it := chunk.NewIterator4Chunk(input) + isNull := make([]bool, it.Len()) + ctx.GetSessionVars().EnableVectorizedExpression = false + selected, nulls, err := VectorizedFilterConsiderNull(ctx, exprs, it, nil, isNull) + require.NoError(t, err) + ctx.GetSessionVars().EnableVectorizedExpression = true + selected2, nulls2, err2 := VectorizedFilterConsiderNull(ctx, exprs, it, nil, isNull) + require.NoError(t, err2) + length := it.Len() + for i := 0; i < length; i++ { + require.Equal(t, nulls[i], nulls2[i]) + require.Equal(t, selected[i], selected2[i]) + } + + // add test which sel is not nil + randomSel := generateRandomSel() + input.SetSel(randomSel) + it2 := chunk.NewIterator4Chunk(input) + isNull = isNull[:0] + ctx.GetSessionVars().EnableVectorizedExpression = false + selected3, nulls, err := VectorizedFilterConsiderNull(ctx, exprs, it2, nil, isNull) + require.NoError(t, err) + ctx.GetSessionVars().EnableVectorizedExpression = true + selected4, nulls2, err2 := VectorizedFilterConsiderNull(ctx, exprs, it2, nil, isNull) + require.NoError(t, err2) + for i := 0; i < length; i++ { + require.Equal(t, nulls[i], nulls2[i]) + require.Equal(t, selected3[i], selected4[i]) + } + + unselected := make([]bool, length) + // unselected[i] == false means that the i-th row is selected + for i := 0; i < length; i++ { + unselected[i] = true + } + for _, idx := range randomSel { + unselected[idx] = false + } + for i := range selected2 { + if selected2[i] && unselected[i] { + selected2[i] = false + } + } + for i := 0; i < length; i++ { + require.Equal(t, selected4[i], selected2[i]) + } + } + } + ctx.GetSessionVars().EnableVectorizedExpression = dafaultEnableVectorizedExpressionVar } func BenchmarkFloat32ColRow(b *testing.B) { diff --git a/expression/collation.go b/expression/collation.go index 1ce5f4b25c5a7..80a2720c8cfe4 100644 --- a/expression/collation.go +++ b/expression/collation.go @@ -40,7 +40,6 @@ type collationInfo struct { charset string collation string - flen int } func (c *collationInfo) HasCoercibility() bool { @@ -69,18 +68,7 @@ func (c *collationInfo) SetCharsetAndCollation(chs, coll string) { c.charset, c.collation = chs, coll } -func (c *collationInfo) CharsetAndCollation(ctx sessionctx.Context) (string, string) { - if c.charset != "" || c.collation != "" { - return c.charset, c.collation - } - - if ctx != nil && ctx.GetSessionVars() != nil { - c.charset, c.collation = ctx.GetSessionVars().GetCharsetInfo() - } - if c.charset == "" || c.collation == "" { - c.charset, c.collation = charset.GetDefaultCharsetAndCollate() - } - c.flen = types.UnspecifiedLength +func (c *collationInfo) CharsetAndCollation() (string, string) { return c.charset, c.collation } @@ -101,10 +89,10 @@ type CollationInfo interface { // SetRepertoire sets a specified repertoire for this expression. SetRepertoire(r Repertoire) - // CharsetAndCollation ... - CharsetAndCollation(ctx sessionctx.Context) (string, string) + // CharsetAndCollation gets charset and collation. + CharsetAndCollation() (string, string) - // SetCharsetAndCollation ... + // SetCharsetAndCollation sets charset and collation. SetCharsetAndCollation(chs, coll string) } @@ -257,8 +245,8 @@ func deriveCollation(ctx sessionctx.Context, funcName string, args []Expression, case ast.Database, ast.User, ast.CurrentUser, ast.Version, ast.CurrentRole, ast.TiDBVersion: chs, coll := charset.GetDefaultCharsetAndCollate() return &ExprCollation{CoercibilitySysconst, UNICODE, chs, coll}, nil - case ast.Format: - // Format function should return ASCII repertoire, MySQL's doc says it depend on character_set_connection, but it not ture from its source code. + case ast.Format, ast.Space, ast.ToBase64, ast.UUID, ast.Hex, ast.MD5, ast.SHA, ast.SHA2: + // should return ASCII repertoire, MySQL's doc says it depends on character_set_connection, but it not true from its source code. ec = &ExprCollation{Coer: CoercibilityCoercible, Repe: ASCII} ec.Charset, ec.Collation = ctx.GetSessionVars().GetCharsetInfo() return ec, nil @@ -313,7 +301,8 @@ func safeConvert(ctx sessionctx.Context, ec *ExprCollation, args ...Expression) continue } - if arg.Repertoire() == ASCII { + // If value has ASCII repertoire, or it is binary string, just skip it. + if arg.Repertoire() == ASCII || types.IsBinaryStr(arg.GetType()) { continue } @@ -339,12 +328,7 @@ func safeConvert(ctx sessionctx.Context, ec *ExprCollation, args ...Expression) func isValidString(str string, dstChs string) bool { switch dstChs { case charset.CharsetASCII: - for _, c := range str { - if c >= 0x80 { - return false - } - } - return true + return charset.StringValidatorASCII{}.Validate(str) == -1 case charset.CharsetLatin1: // For backward compatibility, we do not block SQL like select '啊' = convert('a' using latin1) collate latin1_bin; return true @@ -355,9 +339,7 @@ func isValidString(str string, dstChs string) bool { // Convert to binary is always safe. return true default: - e, _ := charset.Lookup(dstChs) - _, err := e.NewEncoder().String(str) - return err == nil + return charset.StringValidatorOther{Charset: dstChs}.Validate(str) == -1 } } diff --git a/expression/collation_serial_test.go b/expression/collation_serial_test.go new file mode 100644 index 0000000000000..538f3c4f9c0c6 --- /dev/null +++ b/expression/collation_serial_test.go @@ -0,0 +1,76 @@ +// Copyright 2021 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, +// 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. + +package expression + +import ( + "testing" + + "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/collate" + "github.com/pingcap/tidb/util/mock" + "github.com/stretchr/testify/require" +) + +func TestCompareString(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + + require.Equal(t, 0, types.CompareString("a", "A", "utf8_general_ci")) + require.Equal(t, 0, types.CompareString("À", "A", "utf8_general_ci")) + require.Equal(t, 0, types.CompareString("😜", "😃", "utf8_general_ci")) + require.Equal(t, 0, types.CompareString("a ", "a ", "utf8_general_ci")) + require.Equal(t, 0, types.CompareString("ß", "s", "utf8_general_ci")) + require.NotEqual(t, 0, types.CompareString("ß", "ss", "utf8_general_ci")) + + require.Equal(t, 0, types.CompareString("a", "A", "utf8_unicode_ci")) + require.Equal(t, 0, types.CompareString("À", "A", "utf8_unicode_ci")) + require.Equal(t, 0, types.CompareString("😜", "😃", "utf8_unicode_ci")) + require.Equal(t, 0, types.CompareString("a ", "a ", "utf8_unicode_ci")) + require.NotEqual(t, 0, types.CompareString("ß", "s", "utf8_unicode_ci")) + require.Equal(t, 0, types.CompareString("ß", "ss", "utf8_unicode_ci")) + + require.NotEqual(t, 0, types.CompareString("a", "A", "binary")) + require.NotEqual(t, 0, types.CompareString("À", "A", "binary")) + require.NotEqual(t, 0, types.CompareString("😜", "😃", "binary")) + require.NotEqual(t, 0, types.CompareString("a ", "a ", "binary")) + + ctx := mock.NewContext() + ft := types.NewFieldType(mysql.TypeVarString) + col1 := &Column{ + RetType: ft, + Index: 0, + } + col2 := &Column{ + RetType: ft, + Index: 1, + } + chk := chunk.NewChunkWithCapacity([]*types.FieldType{ft, ft}, 4) + chk.Column(0).AppendString("a") + chk.Column(1).AppendString("A") + chk.Column(0).AppendString("À") + chk.Column(1).AppendString("A") + chk.Column(0).AppendString("😜") + chk.Column(1).AppendString("😃") + chk.Column(0).AppendString("a ") + chk.Column(1).AppendString("a ") + for i := 0; i < 4; i++ { + v, isNull, err := CompareStringWithCollationInfo(ctx, col1, col2, chk.GetRow(0), chk.GetRow(0), "utf8_general_ci") + require.NoError(t, err) + require.False(t, isNull) + require.Equal(t, int64(0), v) + } +} diff --git a/expression/collation_test.go b/expression/collation_test.go index d010820409f60..c7ff95961cef4 100644 --- a/expression/collation_test.go +++ b/expression/collation_test.go @@ -17,71 +17,15 @@ package expression import ( "testing" - . "github.com/pingcap/check" + "github.com/stretchr/testify/require" + "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/charset" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/chunk" - "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/mock" - "github.com/stretchr/testify/require" ) -var _ = SerialSuites(&testCollationSuites{}) - -type testCollationSuites struct{} - -func (s *testCollationSuites) TestCompareString(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - - c.Assert(types.CompareString("a", "A", "utf8_general_ci"), Equals, 0) - c.Assert(types.CompareString("À", "A", "utf8_general_ci"), Equals, 0) - c.Assert(types.CompareString("😜", "😃", "utf8_general_ci"), Equals, 0) - c.Assert(types.CompareString("a ", "a ", "utf8_general_ci"), Equals, 0) - c.Assert(types.CompareString("ß", "s", "utf8_general_ci"), Equals, 0) - c.Assert(types.CompareString("ß", "ss", "utf8_general_ci"), Not(Equals), 0) - - c.Assert(types.CompareString("a", "A", "utf8_unicode_ci"), Equals, 0) - c.Assert(types.CompareString("À", "A", "utf8_unicode_ci"), Equals, 0) - c.Assert(types.CompareString("😜", "😃", "utf8_unicode_ci"), Equals, 0) - c.Assert(types.CompareString("a ", "a ", "utf8_unicode_ci"), Equals, 0) - c.Assert(types.CompareString("ß", "s", "utf8_unicode_ci"), Not(Equals), 0) - c.Assert(types.CompareString("ß", "ss", "utf8_unicode_ci"), Equals, 0) - - c.Assert(types.CompareString("a", "A", "binary"), Not(Equals), 0) - c.Assert(types.CompareString("À", "A", "binary"), Not(Equals), 0) - c.Assert(types.CompareString("😜", "😃", "binary"), Not(Equals), 0) - c.Assert(types.CompareString("a ", "a ", "binary"), Not(Equals), 0) - - ctx := mock.NewContext() - ft := types.NewFieldType(mysql.TypeVarString) - col1 := &Column{ - RetType: ft, - Index: 0, - } - col2 := &Column{ - RetType: ft, - Index: 1, - } - chk := chunk.NewChunkWithCapacity([]*types.FieldType{ft, ft}, 4) - chk.Column(0).AppendString("a") - chk.Column(1).AppendString("A") - chk.Column(0).AppendString("À") - chk.Column(1).AppendString("A") - chk.Column(0).AppendString("😜") - chk.Column(1).AppendString("😃") - chk.Column(0).AppendString("a ") - chk.Column(1).AppendString("a ") - for i := 0; i < 4; i++ { - v, isNull, err := CompareStringWithCollationInfo(ctx, col1, col2, chk.GetRow(0), chk.GetRow(0), "utf8_general_ci") - c.Assert(err, IsNil) - c.Assert(isNull, IsFalse) - c.Assert(v, Equals, int64(0)) - } -} - func newExpression(coercibility Coercibility, repertoire Repertoire, chs, coll string) Expression { constant := &Constant{RetType: &types.FieldType{Tp: mysql.TypeString, Charset: chs, Collate: coll}} constant.SetCoercibility(coercibility) @@ -485,7 +429,7 @@ func TestDeriveCollation(t *testing.T) { &ExprCollation{CoercibilityNumeric, ASCII, charset.CharsetBin, charset.CollationBin}, }, { - []string{ast.Format}, + []string{ast.Format, ast.SHA2}, []Expression{ newColInt(CoercibilityNumeric), newColInt(CoercibilityNumeric), @@ -495,6 +439,16 @@ func TestDeriveCollation(t *testing.T) { false, &ExprCollation{CoercibilityCoercible, ASCII, charset.CharsetUTF8MB4, charset.CollationUTF8MB4}, }, + { + []string{ast.Space, ast.ToBase64, ast.UUID, ast.Hex, ast.MD5, ast.SHA}, + []Expression{ + newColInt(CoercibilityNumeric), + }, + []types.EvalType{types.ETInt}, + types.ETString, + false, + &ExprCollation{CoercibilityCoercible, ASCII, charset.CharsetUTF8MB4, charset.CollationUTF8MB4}, + }, { []string{ast.GE, ast.LE, ast.GT, ast.LT, ast.EQ, ast.NE, ast.NullEQ, ast.Strcmp}, []Expression{ @@ -518,7 +472,7 @@ func TestDeriveCollation(t *testing.T) { nil, }, { - []string{ast.Bin, ast.FromBase64, ast.Hex, ast.Oct, ast.Space, ast.ToBase64, ast.Unhex, ast.WeightString}, + []string{ast.Bin, ast.FromBase64, ast.Oct, ast.Unhex, ast.WeightString}, []Expression{ newColString(charset.CharsetLatin1, charset.CollationLatin1), }, diff --git a/expression/column_test.go b/expression/column_test.go index 2cb328b62a1b0..f6fa04e784110 100644 --- a/expression/column_test.go +++ b/expression/column_test.go @@ -16,98 +16,100 @@ package expression import ( "fmt" + "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/mock" + "github.com/stretchr/testify/require" ) -func (s *testEvaluatorSuite) TestColumn(c *C) { +func TestColumn(t *testing.T) { + ctx := mock.NewContext() col := &Column{RetType: types.NewFieldType(mysql.TypeLonglong), UniqueID: 1} - c.Assert(col.Equal(nil, col), IsTrue) - c.Assert(col.Equal(nil, &Column{}), IsFalse) - c.Assert(col.IsCorrelated(), IsFalse) - c.Assert(col.Equal(nil, col.Decorrelate(nil)), IsTrue) + require.True(t, col.Equal(nil, col)) + require.False(t, col.Equal(nil, &Column{})) + require.False(t, col.IsCorrelated()) + require.True(t, col.Equal(nil, col.Decorrelate(nil))) marshal, err := col.MarshalJSON() - c.Assert(err, IsNil) - c.Assert(marshal, DeepEquals, []byte{0x22, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x23, 0x31, 0x22}) + require.NoError(t, err) + require.EqualValues(t, []byte{0x22, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x23, 0x31, 0x22}, marshal) intDatum := types.NewIntDatum(1) corCol := &CorrelatedColumn{Column: *col, Data: &intDatum} invalidCorCol := &CorrelatedColumn{Column: Column{}} schema := NewSchema(&Column{UniqueID: 1}) - c.Assert(corCol.Equal(nil, corCol), IsTrue) - c.Assert(corCol.Equal(nil, invalidCorCol), IsFalse) - c.Assert(corCol.IsCorrelated(), IsTrue) - c.Assert(corCol.ConstItem(nil), IsFalse) - c.Assert(corCol.Decorrelate(schema).Equal(nil, col), IsTrue) - c.Assert(invalidCorCol.Decorrelate(schema).Equal(nil, invalidCorCol), IsTrue) + require.True(t, corCol.Equal(nil, corCol)) + require.False(t, corCol.Equal(nil, invalidCorCol)) + require.True(t, corCol.IsCorrelated()) + require.False(t, corCol.ConstItem(nil)) + require.True(t, corCol.Decorrelate(schema).Equal(nil, col)) + require.True(t, invalidCorCol.Decorrelate(schema).Equal(nil, invalidCorCol)) intCorCol := &CorrelatedColumn{Column: Column{RetType: types.NewFieldType(mysql.TypeLonglong)}, Data: &intDatum} - intVal, isNull, err := intCorCol.EvalInt(s.ctx, chunk.Row{}) - c.Assert(intVal, Equals, int64(1)) - c.Assert(isNull, IsFalse) - c.Assert(err, IsNil) + intVal, isNull, err := intCorCol.EvalInt(ctx, chunk.Row{}) + require.Equal(t, int64(1), intVal) + require.False(t, isNull) + require.NoError(t, err) realDatum := types.NewFloat64Datum(1.2) realCorCol := &CorrelatedColumn{Column: Column{RetType: types.NewFieldType(mysql.TypeDouble)}, Data: &realDatum} - realVal, isNull, err := realCorCol.EvalReal(s.ctx, chunk.Row{}) - c.Assert(realVal, Equals, float64(1.2)) - c.Assert(isNull, IsFalse) - c.Assert(err, IsNil) + realVal, isNull, err := realCorCol.EvalReal(ctx, chunk.Row{}) + require.Equal(t, float64(1.2), realVal) + require.False(t, isNull) + require.NoError(t, err) decimalDatum := types.NewDecimalDatum(types.NewDecFromStringForTest("1.2")) decimalCorCol := &CorrelatedColumn{Column: Column{RetType: types.NewFieldType(mysql.TypeNewDecimal)}, Data: &decimalDatum} - decVal, isNull, err := decimalCorCol.EvalDecimal(s.ctx, chunk.Row{}) - c.Assert(decVal.Compare(types.NewDecFromStringForTest("1.2")), Equals, 0) - c.Assert(isNull, IsFalse) - c.Assert(err, IsNil) + decVal, isNull, err := decimalCorCol.EvalDecimal(ctx, chunk.Row{}) + require.Zero(t, decVal.Compare(types.NewDecFromStringForTest("1.2"))) + require.False(t, isNull) + require.NoError(t, err) stringDatum := types.NewStringDatum("abc") stringCorCol := &CorrelatedColumn{Column: Column{RetType: types.NewFieldType(mysql.TypeVarchar)}, Data: &stringDatum} - strVal, isNull, err := stringCorCol.EvalString(s.ctx, chunk.Row{}) - c.Assert(strVal, Equals, "abc") - c.Assert(isNull, IsFalse) - c.Assert(err, IsNil) + strVal, isNull, err := stringCorCol.EvalString(ctx, chunk.Row{}) + require.Equal(t, "abc", strVal) + require.False(t, isNull) + require.NoError(t, err) durationCorCol := &CorrelatedColumn{Column: Column{RetType: types.NewFieldType(mysql.TypeDuration)}, Data: &durationDatum} - durationVal, isNull, err := durationCorCol.EvalDuration(s.ctx, chunk.Row{}) - c.Assert(durationVal.Compare(duration), Equals, 0) - c.Assert(isNull, IsFalse) - c.Assert(err, IsNil) + durationVal, isNull, err := durationCorCol.EvalDuration(ctx, chunk.Row{}) + require.Zero(t, durationVal.Compare(duration)) + require.False(t, isNull) + require.NoError(t, err) timeDatum := types.NewTimeDatum(tm) timeCorCol := &CorrelatedColumn{Column: Column{RetType: types.NewFieldType(mysql.TypeDatetime)}, Data: &timeDatum} - timeVal, isNull, err := timeCorCol.EvalTime(s.ctx, chunk.Row{}) - c.Assert(timeVal.Compare(tm), Equals, 0) - c.Assert(isNull, IsFalse) - c.Assert(err, IsNil) + timeVal, isNull, err := timeCorCol.EvalTime(ctx, chunk.Row{}) + require.Zero(t, timeVal.Compare(tm)) + require.False(t, isNull) + require.NoError(t, err) } -func (s *testEvaluatorSuite) TestColumnHashCode(c *C) { +func TestColumnHashCode(t *testing.T) { col1 := &Column{ UniqueID: 12, } - c.Assert(col1.HashCode(nil), DeepEquals, []byte{0x1, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc}) + require.EqualValues(t, []byte{0x1, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc}, col1.HashCode(nil)) col2 := &Column{ UniqueID: 2, } - c.Assert(col2.HashCode(nil), DeepEquals, []byte{0x1, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2}) + require.EqualValues(t, []byte{0x1, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2}, col2.HashCode(nil)) } -func (s *testEvaluatorSuite) TestColumn2Expr(c *C) { +func TestColumn2Expr(t *testing.T) { cols := make([]*Column, 0, 5) for i := 0; i < 5; i++ { cols = append(cols, &Column{UniqueID: int64(i)}) @@ -115,23 +117,23 @@ func (s *testEvaluatorSuite) TestColumn2Expr(c *C) { exprs := Column2Exprs(cols) for i := range exprs { - c.Assert(exprs[i].Equal(nil, cols[i]), IsTrue) + require.True(t, exprs[i].Equal(nil, cols[i])) } } -func (s *testEvaluatorSuite) TestColInfo2Col(c *C) { +func TestColInfo2Col(t *testing.T) { col0, col1 := &Column{ID: 0}, &Column{ID: 1} cols := []*Column{col0, col1} colInfo := &model.ColumnInfo{ID: 0} res := ColInfo2Col(cols, colInfo) - c.Assert(res.Equal(nil, col1), IsTrue) + require.True(t, res.Equal(nil, col1)) colInfo.ID = 3 res = ColInfo2Col(cols, colInfo) - c.Assert(res, IsNil) + require.Nil(t, res) } -func (s *testEvaluatorSuite) TestIndexInfo2Cols(c *C) { +func TestIndexInfo2Cols(t *testing.T) { col0 := &Column{UniqueID: 0, ID: 0, RetType: types.NewFieldType(mysql.TypeLonglong)} col1 := &Column{UniqueID: 1, ID: 1, RetType: types.NewFieldType(mysql.TypeLonglong)} colInfo0 := &model.ColumnInfo{ID: 0, Name: model.NewCIStr("0")} @@ -142,26 +144,26 @@ func (s *testEvaluatorSuite) TestIndexInfo2Cols(c *C) { cols := []*Column{col0} colInfos := []*model.ColumnInfo{colInfo0} resCols, lengths := IndexInfo2PrefixCols(colInfos, cols, indexInfo) - c.Assert(len(resCols), Equals, 1) - c.Assert(len(lengths), Equals, 1) - c.Assert(resCols[0].Equal(nil, col0), IsTrue) + require.Len(t, resCols, 1) + require.Len(t, lengths, 1) + require.True(t, resCols[0].Equal(nil, col0)) cols = []*Column{col1} colInfos = []*model.ColumnInfo{colInfo1} resCols, lengths = IndexInfo2PrefixCols(colInfos, cols, indexInfo) - c.Assert(len(resCols), Equals, 0) - c.Assert(len(lengths), Equals, 0) + require.Len(t, resCols, 0) + require.Len(t, lengths, 0) cols = []*Column{col0, col1} colInfos = []*model.ColumnInfo{colInfo0, colInfo1} resCols, lengths = IndexInfo2PrefixCols(colInfos, cols, indexInfo) - c.Assert(len(resCols), Equals, 2) - c.Assert(len(lengths), Equals, 2) - c.Assert(resCols[0].Equal(nil, col0), IsTrue) - c.Assert(resCols[1].Equal(nil, col1), IsTrue) + require.Len(t, resCols, 2) + require.Len(t, lengths, 2) + require.True(t, resCols[0].Equal(nil, col0)) + require.True(t, resCols[1].Equal(nil, col1)) } -func (s *testEvaluatorSuite) TestColHybird(c *C) { +func TestColHybird(t *testing.T) { ctx := mock.NewContext() // bit @@ -170,26 +172,26 @@ func (s *testEvaluatorSuite) TestColHybird(c *C) { input := chunk.New([]*types.FieldType{ft}, 1024, 1024) for i := 0; i < 1024; i++ { num, err := types.ParseBitStr(fmt.Sprintf("0b%b", i)) - c.Assert(err, IsNil) + require.NoError(t, err) input.AppendBytes(0, num) } result := chunk.NewColumn(types.NewFieldType(mysql.TypeLonglong), 1024) - c.Assert(col.VecEvalInt(ctx, input, result), IsNil) + require.Nil(t, col.VecEvalInt(ctx, input, result)) it := chunk.NewIterator4Chunk(input) for row, i := it.Begin(), 0; row != it.End(); row, i = it.Next(), i+1 { v, _, err := col.EvalInt(ctx, row) - c.Assert(err, IsNil) - c.Assert(v, Equals, result.GetInt64(i)) + require.NoError(t, err) + require.Equal(t, result.GetInt64(i), v) } // use a container which has the different field type with bit result = chunk.NewColumn(types.NewFieldType(mysql.TypeString), 1024) - c.Assert(col.VecEvalInt(ctx, input, result), IsNil) + require.Nil(t, col.VecEvalInt(ctx, input, result)) for row, i := it.Begin(), 0; row != it.End(); row, i = it.Next(), i+1 { v, _, err := col.EvalInt(ctx, row) - c.Assert(err, IsNil) - c.Assert(v, Equals, result.GetInt64(i)) + require.NoError(t, err) + require.Equal(t, result.GetInt64(i), v) } // enum @@ -200,13 +202,13 @@ func (s *testEvaluatorSuite) TestColHybird(c *C) { input.AppendEnum(0, types.Enum{Name: fmt.Sprintf("%v", i), Value: uint64(i)}) } result = chunk.NewColumn(types.NewFieldType(mysql.TypeString), 1024) - c.Assert(col.VecEvalString(ctx, input, result), IsNil) + require.Nil(t, col.VecEvalString(ctx, input, result)) it = chunk.NewIterator4Chunk(input) for row, i := it.Begin(), 0; row != it.End(); row, i = it.Next(), i+1 { v, _, err := col.EvalString(ctx, row) - c.Assert(err, IsNil) - c.Assert(v, Equals, result.GetString(i)) + require.NoError(t, err) + require.Equal(t, result.GetString(i), v) } // set @@ -217,12 +219,12 @@ func (s *testEvaluatorSuite) TestColHybird(c *C) { input.AppendSet(0, types.Set{Name: fmt.Sprintf("%v", i), Value: uint64(i)}) } result = chunk.NewColumn(types.NewFieldType(mysql.TypeString), 1024) - c.Assert(col.VecEvalString(ctx, input, result), IsNil) + require.Nil(t, col.VecEvalString(ctx, input, result)) it = chunk.NewIterator4Chunk(input) for row, i := it.Begin(), 0; row != it.End(); row, i = it.Next(), i+1 { v, _, err := col.EvalString(ctx, row) - c.Assert(err, IsNil) - c.Assert(v, Equals, result.GetString(i)) + require.NoError(t, err) + require.Equal(t, result.GetString(i), v) } } diff --git a/expression/constant.go b/expression/constant.go index 3cb0b5a6905a1..1e5c50a709e9c 100644 --- a/expression/constant.go +++ b/expression/constant.go @@ -25,6 +25,7 @@ import ( "github.com/pingcap/tidb/types/json" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/util/collate" ) // NewOne stands for a number 1. @@ -345,7 +346,7 @@ func (c *Constant) Equal(ctx sessionctx.Context, b Expression) bool { if err1 != nil || err2 != nil { return false } - con, err := c.Value.CompareDatum(ctx.GetSessionVars().StmtCtx, &y.Value) + con, err := c.Value.Compare(ctx.GetSessionVars().StmtCtx, &y.Value, collate.GetBinaryCollator()) if err != nil || con != 0 { return false } @@ -389,10 +390,7 @@ func (c *Constant) HashCode(sc *stmtctx.StatementContext) []byte { terror.Log(err) } c.hashcode = append(c.hashcode, constantFlag) - c.hashcode, err = codec.EncodeValue(sc, c.hashcode, c.Value) - if err != nil { - terror.Log(err) - } + c.hashcode = codec.HashCode(c.hashcode, c.Value) return c.hashcode } diff --git a/expression/constant_fold.go b/expression/constant_fold.go index f08a5c45abf60..d7cbaf5d8edd6 100644 --- a/expression/constant_fold.go +++ b/expression/constant_fold.go @@ -143,7 +143,7 @@ func caseWhenHandler(expr *ScalarFunction) (Expression, bool) { foldedExpr.GetType().Decimal = expr.GetType().Decimal return foldedExpr, isDeferredConst } - return BuildCastFunction(expr.GetCtx(), foldedExpr, foldedExpr.GetType()), isDeferredConst + return foldedExpr, isDeferredConst } return expr, isDeferredConst } diff --git a/expression/constant_fold_test.go b/expression/constant_fold_test.go index cbdd966804bfa..7ce440f33f2cd 100644 --- a/expression/constant_fold_test.go +++ b/expression/constant_fold_test.go @@ -15,12 +15,16 @@ package expression_test import ( - . "github.com/pingcap/check" - "github.com/pingcap/tidb/util/testkit" + "testing" + + "github.com/pingcap/tidb/testkit" ) -func (s *testIntegrationSuite) TestFoldIfNull(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestFoldIfNull(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec(`use test;`) tk.MustExec(`drop table if exists t;`) tk.MustExec(`create table t(a bigint, b bigint);`) diff --git a/expression/constant_propagation.go b/expression/constant_propagation.go index e9a63b05ad10a..5e7374604ac1d 100644 --- a/expression/constant_propagation.go +++ b/expression/constant_propagation.go @@ -21,6 +21,7 @@ import ( "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/disjointset" "github.com/pingcap/tidb/util/logutil" "go.uber.org/zap" @@ -59,7 +60,8 @@ func (s *basePropConstSolver) tryToUpdateEQList(col *Column, con *Constant) (boo id := s.getColID(col) oldCon := s.eqList[id] if oldCon != nil { - return false, !oldCon.Equal(s.ctx, con) + res, err := oldCon.Value.Compare(s.ctx.GetSessionVars().StmtCtx, &con.Value, collate.GetCollator(col.GetType().Collate)) + return false, res != 0 || err != nil } s.eqList[id] = con return true, false @@ -152,7 +154,7 @@ func tryToReplaceCond(ctx sessionctx.Context, src *Column, tgt *Column, cond Exp } for idx, expr := range sf.GetArgs() { if src.Equal(nil, expr) { - _, coll := cond.CharsetAndCollation(ctx) + _, coll := cond.CharsetAndCollation() if tgt.GetType().Collate != coll { continue } @@ -349,6 +351,7 @@ func (s *propConstSolver) solve(conditions []Expression) []Expression { s.propagateConstantEQ() s.propagateColumnEQ() s.conditions = propagateConstantDNF(s.ctx, s.conditions) + s.conditions = RemoveDupExprs(s.ctx, s.conditions) return s.conditions } diff --git a/expression/constant_propagation_test.go b/expression/constant_propagation_test.go index 56c6a89351943..6ff6d31a6faad 100644 --- a/expression/constant_propagation_test.go +++ b/expression/constant_propagation_test.go @@ -15,41 +15,18 @@ package expression_test import ( - . "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/testutil" -) - -var _ = Suite(&testSuite{}) - -type testSuite struct { - store kv.Storage - dom *domain.Domain - ctx sessionctx.Context - testData testutil.TestData -} + "testing" -func (s *testSuite) SetUpSuite(c *C) { - var err error - s.store, s.dom, err = newStoreWithBootstrap() - c.Assert(err, IsNil) - s.ctx = mock.NewContext() - s.testData, err = testutil.LoadTestSuiteData("testdata", "expression_suite") - c.Assert(err, IsNil) -} + "github.com/pingcap/tidb/expression" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/testkit/testdata" +) -func (s *testSuite) TearDownSuite(c *C) { - c.Assert(s.testData.GenerateOutputIfNeeded(), IsNil) - s.dom.Close() - s.store.Close() -} +func TestOuterJoinPropConst(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() -func (s *testSuite) TestOuterJoinPropConst(c *C) { - tk := testkit.NewTestKit(c, s.store) + tk := testkit.NewTestKit(t, 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);") @@ -60,11 +37,13 @@ func (s *testSuite) TestOuterJoinPropConst(c *C) { SQL string Result []string } - s.testData.GetTestCases(c, &input, &output) + + expressionSuiteData := expression.GetExpressionSuiteData() + expressionSuiteData.GetTestCases(t, &input, &output) for i, tt := range input { - s.testData.OnRecord(func() { + testdata.OnRecord(func() { output[i].SQL = tt - output[i].Result = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + output[i].Result = testdata.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) }) tk.MustQuery(tt).Check(testkit.Rows(output[i].Result...)) } diff --git a/expression/constant_test.go b/expression/constant_test.go index 1d3d68fd9ceb9..3b01be365121a 100644 --- a/expression/constant_test.go +++ b/expression/constant_test.go @@ -18,9 +18,11 @@ import ( "fmt" "sort" "strings" + "testing" "time" - . "github.com/pingcap/check" + "github.com/stretchr/testify/require" + "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/types" @@ -29,10 +31,6 @@ import ( "github.com/pingcap/tidb/util/mock" ) -var _ = Suite(&testExpressionSuite{}) - -type testExpressionSuite struct{} - func newColumn(id int) *Column { return newColumnWithType(id, types.NewFieldType(mysql.TypeLonglong)) } @@ -51,12 +49,22 @@ func newLonglong(value int64) *Constant { } } +func newString(value string, collation string) *Constant { + return &Constant{ + Value: types.NewStringDatum(value), + RetType: types.NewFieldTypeWithCollation(mysql.TypeVarchar, collation, 255), + } +} + func newFunction(funcName string, args ...Expression) Expression { - typeLong := types.NewFieldType(mysql.TypeLonglong) - return NewFunctionInternal(mock.NewContext(), funcName, typeLong, args...) + return newFunctionWithType(funcName, types.NewFieldType(mysql.TypeLonglong), args...) +} + +func newFunctionWithType(funcName string, tp *types.FieldType, args ...Expression) Expression { + return NewFunctionInternal(mock.NewContext(), funcName, tp, args...) } -func (*testExpressionSuite) TestConstantPropagation(c *C) { +func TestConstantPropagation(t *testing.T) { tests := []struct { solver []PropagateConstantSolver conditions []Expression @@ -177,12 +185,12 @@ func (*testExpressionSuite) TestConstantPropagation(c *C) { result = append(result, v.String()) } sort.Strings(result) - c.Assert(strings.Join(result, ", "), Equals, tt.result, Commentf("different for expr %s", tt.conditions)) + require.Equalf(t, tt.result, strings.Join(result, ", "), "different for expr %s", tt.conditions) } } } -func (*testExpressionSuite) TestConstantFolding(c *C) { +func TestConstantFolding(t *testing.T) { tests := []struct { condition Expression result string @@ -214,11 +222,67 @@ func (*testExpressionSuite) TestConstantFolding(c *C) { } for _, tt := range tests { newConds := FoldConstant(tt.condition) - c.Assert(newConds.String(), Equals, tt.result, Commentf("different for expr %s", tt.condition)) + require.Equalf(t, tt.result, newConds.String(), "different for expr %s", tt.condition) + } +} + +func TestConstantFoldingCharsetConvert(t *testing.T) { + tests := []struct { + condition Expression + result string + }{ + { + condition: newFunction(ast.Length, newFunctionWithType( + InternalFuncToBinary, types.NewFieldType(mysql.TypeVarchar), + newString("中文", "gbk_bin"))), + result: "4", + }, + { + condition: newFunction(ast.Length, newFunctionWithType( + InternalFuncToBinary, types.NewFieldType(mysql.TypeVarchar), + newString("中文", "utf8mb4_bin"))), + result: "6", + }, + { + condition: newFunction(ast.Concat, newFunctionWithType( + InternalFuncFromBinary, types.NewFieldType(mysql.TypeVarchar), + newString("中文", "binary"))), + result: "中文", + }, + { + condition: newFunction(ast.Concat, + newFunctionWithType( + InternalFuncFromBinary, types.NewFieldTypeWithCollation(mysql.TypeVarchar, "gbk_bin", -1), + newString("\xd2\xbb", "binary")), + newString("中文", "gbk_bin"), + ), + result: "一中文", + }, + { + condition: newFunction(ast.Concat, + newString("中文", "gbk_bin"), + newFunctionWithType( + InternalFuncFromBinary, types.NewFieldTypeWithCollation(mysql.TypeVarchar, "gbk_bin", -1), + newString("\xd2\xbb", "binary")), + ), + result: "中文一", + }, + // The result is binary charset, so gbk constant will convert to binary which is \xd6\xd0\xce\xc4. + { + condition: newFunction(ast.Concat, + newString("中文", "gbk_bin"), + newString("\xd2\xbb", "binary"), + ), + result: "\xd6\xd0\xce\xc4\xd2\xbb", + }, + } + for _, tt := range tests { + newConds := FoldConstant(tt.condition) + require.Equalf(t, tt.result, newConds.String(), "different for expr %s", tt.condition) } } -func (*testExpressionSuite) TestDeferredParamNotNull(c *C) { +func TestDeferredParamNotNull(t *testing.T) { ctx := mock.NewContext() testTime := time.Now() ctx.GetSessionVars().PreparedParams = []types.Datum{ @@ -248,118 +312,118 @@ func (*testExpressionSuite) TestDeferredParamNotNull(c *C) { cstBit := &Constant{ParamMarker: &ParamMarker{ctx: ctx, order: 10}, RetType: newBinaryLiteralFieldType()} cstEnum := &Constant{ParamMarker: &ParamMarker{ctx: ctx, order: 11}, RetType: newEnumFieldType()} - c.Assert(mysql.TypeVarString, Equals, cstJSON.GetType().Tp) - c.Assert(mysql.TypeNewDecimal, Equals, cstDec.GetType().Tp) - c.Assert(mysql.TypeLonglong, Equals, cstInt.GetType().Tp) - c.Assert(mysql.TypeLonglong, Equals, cstUint.GetType().Tp) - c.Assert(mysql.TypeTimestamp, Equals, cstTime.GetType().Tp) - c.Assert(mysql.TypeDuration, Equals, cstDuration.GetType().Tp) - c.Assert(mysql.TypeBlob, Equals, cstBytes.GetType().Tp) - c.Assert(mysql.TypeVarString, Equals, cstBinary.GetType().Tp) - c.Assert(mysql.TypeVarString, Equals, cstBit.GetType().Tp) - c.Assert(mysql.TypeFloat, Equals, cstFloat32.GetType().Tp) - c.Assert(mysql.TypeDouble, Equals, cstFloat64.GetType().Tp) - c.Assert(mysql.TypeEnum, Equals, cstEnum.GetType().Tp) + require.Equal(t, mysql.TypeVarString, cstJSON.GetType().Tp) + require.Equal(t, mysql.TypeNewDecimal, cstDec.GetType().Tp) + require.Equal(t, mysql.TypeLonglong, cstInt.GetType().Tp) + require.Equal(t, mysql.TypeLonglong, cstUint.GetType().Tp) + require.Equal(t, mysql.TypeTimestamp, cstTime.GetType().Tp) + require.Equal(t, mysql.TypeDuration, cstDuration.GetType().Tp) + require.Equal(t, mysql.TypeBlob, cstBytes.GetType().Tp) + require.Equal(t, mysql.TypeVarString, cstBinary.GetType().Tp) + require.Equal(t, mysql.TypeVarString, cstBit.GetType().Tp) + require.Equal(t, mysql.TypeFloat, cstFloat32.GetType().Tp) + require.Equal(t, mysql.TypeDouble, cstFloat64.GetType().Tp) + require.Equal(t, mysql.TypeEnum, cstEnum.GetType().Tp) d, _, err := cstInt.EvalInt(ctx, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(d, Equals, int64(1)) + require.NoError(t, err) + require.Equal(t, int64(1), d) r, _, err := cstFloat64.EvalReal(ctx, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(r, Equals, float64(2.1)) + require.NoError(t, err) + require.Equal(t, float64(2.1), r) de, _, err := cstDec.EvalDecimal(ctx, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(de.String(), Equals, "20170118123950.123") + require.NoError(t, err) + require.Equal(t, "20170118123950.123", de.String()) s, _, err := cstBytes.EvalString(ctx, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(s, Equals, "b") - t, _, err := cstTime.EvalTime(ctx, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(t.Compare(ctx.GetSessionVars().PreparedParams[2].GetMysqlTime()), Equals, 0) + require.NoError(t, err) + require.Equal(t, "b", s) + evalTime, _, err := cstTime.EvalTime(ctx, chunk.Row{}) + require.NoError(t, err) + require.Equal(t, 0, evalTime.Compare(ctx.GetSessionVars().PreparedParams[2].GetMysqlTime())) dur, _, err := cstDuration.EvalDuration(ctx, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(dur.Duration, Equals, types.ZeroDuration.Duration) - json, _, err := cstJSON.EvalJSON(ctx, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(json, NotNil) + require.NoError(t, err) + require.Equal(t, types.ZeroDuration.Duration, dur.Duration) + evalJSON, _, err := cstJSON.EvalJSON(ctx, chunk.Row{}) + require.NoError(t, err) + require.NotNil(t, evalJSON) } -func (*testExpressionSuite) TestDeferredExprNotNull(c *C) { +func TestDeferredExprNotNull(t *testing.T) { m := &MockExpr{} ctx := mock.NewContext() cst := &Constant{DeferredExpr: m, RetType: newIntFieldType()} m.i, m.err = nil, fmt.Errorf("ERROR") _, _, err := cst.EvalInt(ctx, chunk.Row{}) - c.Assert(err, NotNil) + require.Error(t, err) _, _, err = cst.EvalReal(ctx, chunk.Row{}) - c.Assert(err, NotNil) + require.Error(t, err) _, _, err = cst.EvalDecimal(ctx, chunk.Row{}) - c.Assert(err, NotNil) + require.Error(t, err) _, _, err = cst.EvalString(ctx, chunk.Row{}) - c.Assert(err, NotNil) + require.Error(t, err) _, _, err = cst.EvalTime(ctx, chunk.Row{}) - c.Assert(err, NotNil) + require.Error(t, err) _, _, err = cst.EvalDuration(ctx, chunk.Row{}) - c.Assert(err, NotNil) + require.Error(t, err) _, _, err = cst.EvalJSON(ctx, chunk.Row{}) - c.Assert(err, NotNil) + require.Error(t, err) m.i, m.err = nil, nil _, isNull, err := cst.EvalInt(ctx, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(isNull, IsTrue) + require.NoError(t, err) + require.True(t, isNull) _, isNull, err = cst.EvalReal(ctx, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(isNull, IsTrue) + require.NoError(t, err) + require.True(t, isNull) _, isNull, err = cst.EvalDecimal(ctx, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(isNull, IsTrue) + require.NoError(t, err) + require.True(t, isNull) _, isNull, err = cst.EvalString(ctx, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(isNull, IsTrue) + require.NoError(t, err) + require.True(t, isNull) _, isNull, err = cst.EvalTime(ctx, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(isNull, IsTrue) + require.NoError(t, err) + require.True(t, isNull) _, isNull, err = cst.EvalDuration(ctx, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(isNull, IsTrue) + require.NoError(t, err) + require.True(t, isNull) _, isNull, err = cst.EvalJSON(ctx, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(isNull, IsTrue) + require.NoError(t, err) + require.True(t, isNull) m.i = int64(2333) xInt, _, _ := cst.EvalInt(ctx, chunk.Row{}) - c.Assert(xInt, Equals, int64(2333)) + require.Equal(t, int64(2333), xInt) m.i = float64(123.45) xFlo, _, _ := cst.EvalReal(ctx, chunk.Row{}) - c.Assert(xFlo, Equals, float64(123.45)) + require.Equal(t, float64(123.45), xFlo) m.i = "abc" xStr, _, _ := cst.EvalString(ctx, chunk.Row{}) - c.Assert(xStr, Equals, "abc") + require.Equal(t, "abc", xStr) m.i = &types.MyDecimal{} xDec, _, _ := cst.EvalDecimal(ctx, chunk.Row{}) - c.Assert(xDec.Compare(m.i.(*types.MyDecimal)), Equals, 0) + require.Equal(t, 0, xDec.Compare(m.i.(*types.MyDecimal))) m.i = types.ZeroTime xTim, _, _ := cst.EvalTime(ctx, chunk.Row{}) - c.Assert(xTim.Compare(m.i.(types.Time)), Equals, 0) + require.Equal(t, 0, xTim.Compare(m.i.(types.Time))) m.i = types.Duration{} xDur, _, _ := cst.EvalDuration(ctx, chunk.Row{}) - c.Assert(xDur.Compare(m.i.(types.Duration)), Equals, 0) + require.Equal(t, 0, xDur.Compare(m.i.(types.Duration))) m.i = json.BinaryJSON{} xJsn, _, _ := cst.EvalJSON(ctx, chunk.Row{}) - c.Assert(m.i.(json.BinaryJSON).String(), Equals, xJsn.String()) + require.Equal(t, xJsn.String(), m.i.(json.BinaryJSON).String()) cln := cst.Clone().(*Constant) - c.Assert(cln.DeferredExpr, Equals, cst.DeferredExpr) + require.Equal(t, cst.DeferredExpr, cln.DeferredExpr) } -func (*testExpressionSuite) TestVectorizedConstant(c *C) { +func TestVectorizedConstant(t *testing.T) { // fixed-length type with/without Sel for _, cst := range []*Constant{ {RetType: newIntFieldType(), Value: types.NewIntDatum(2333)}, @@ -370,20 +434,20 @@ func (*testExpressionSuite) TestVectorizedConstant(c *C) { } col := chunk.NewColumn(newIntFieldType(), 1024) ctx := mock.NewContext() - c.Assert(cst.VecEvalInt(ctx, chk, col), IsNil) + require.Nil(t, cst.VecEvalInt(ctx, chk, col)) i64s := col.Int64s() - c.Assert(len(i64s), Equals, 1024) + require.Equal(t, 1024, len(i64s)) for _, v := range i64s { - c.Assert(v, Equals, int64(2333)) + require.Equal(t, int64(2333), v) } // fixed-length type with Sel sel := []int{2, 3, 5, 7, 11, 13, 17, 19, 23, 29} chk.SetSel(sel) - c.Assert(cst.VecEvalInt(ctx, chk, col), IsNil) + require.Nil(t, cst.VecEvalInt(ctx, chk, col)) i64s = col.Int64s() for i := range sel { - c.Assert(i64s[i], Equals, int64(2333)) + require.Equal(t, int64(2333), i64s[i]) } } @@ -399,22 +463,22 @@ func (*testExpressionSuite) TestVectorizedConstant(c *C) { chk.SetSel(nil) col := chunk.NewColumn(newStringFieldType(), 1024) ctx := mock.NewContext() - c.Assert(cst.VecEvalString(ctx, chk, col), IsNil) + require.Nil(t, cst.VecEvalString(ctx, chk, col)) for i := 0; i < 1024; i++ { - c.Assert(col.GetString(i), Equals, "hello") + require.Equal(t, "hello", col.GetString(i)) } // var-length type with Sel sel := []int{2, 3, 5, 7, 11, 13, 17, 19, 23, 29} chk.SetSel(sel) - c.Assert(cst.VecEvalString(ctx, chk, col), IsNil) + require.Nil(t, cst.VecEvalString(ctx, chk, col)) for i := range sel { - c.Assert(col.GetString(i), Equals, "hello") + require.Equal(t, "hello", col.GetString(i)) } } } -func (*testExpressionSuite) TestGetTypeThreadSafe(c *C) { +func TestGetTypeThreadSafe(t *testing.T) { ctx := mock.NewContext() ctx.GetSessionVars().PreparedParams = []types.Datum{ types.NewIntDatum(1), @@ -422,5 +486,5 @@ func (*testExpressionSuite) TestGetTypeThreadSafe(c *C) { con := &Constant{ParamMarker: &ParamMarker{ctx: ctx, order: 0}, RetType: newStringFieldType()} ft1 := con.GetType() ft2 := con.GetType() - c.Assert(ft1, Not(Equals), ft2) + require.NotSame(t, ft1, ft2) } diff --git a/expression/distsql_builtin.go b/expression/distsql_builtin.go index 99693677091bc..47dd46f87b39f 100644 --- a/expression/distsql_builtin.go +++ b/expression/distsql_builtin.go @@ -21,7 +21,6 @@ import ( "time" "github.com/pingcap/errors" - "github.com/pingcap/tidb/parser/charset" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/sessionctx" @@ -29,6 +28,7 @@ import ( "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tipb/go-tipb" ) @@ -41,7 +41,7 @@ func PbTypeToFieldType(tp *tipb.FieldType) *types.FieldType { Flen: int(tp.Flen), Decimal: int(tp.Decimal), Charset: tp.Charset, - Collate: protoToCollation(tp.Collate), + Collate: collate.ProtoToCollation(tp.Collate), Elems: tp.Elems, } } @@ -965,11 +965,7 @@ func getSignatureByPB(ctx sessionctx.Context, sigCode tipb.ScalarFuncSig, tp *ti case tipb.ScalarFuncSig_HexIntArg: f = &builtinHexIntArgSig{base} case tipb.ScalarFuncSig_HexStrArg: - chs, args := "utf-8", base.getArgs() - if len(args) == 1 { - chs, _ = args[0].CharsetAndCollation(ctx) - } - f = &builtinHexStrArgSig{base, charset.NewEncoding(chs)} + f = &builtinHexStrArgSig{base} case tipb.ScalarFuncSig_InsertUTF8: f = &builtinInsertUTF8Sig{base, maxAllowedPacket} case tipb.ScalarFuncSig_Insert: @@ -1054,6 +1050,10 @@ func getSignatureByPB(ctx sessionctx.Context, sigCode tipb.ScalarFuncSig, tp *ti f = &builtinUnHexSig{base} case tipb.ScalarFuncSig_Upper: f = &builtinUpperSig{base} + case tipb.ScalarFuncSig_ToBinary: + f = &builtinInternalToBinarySig{base} + case tipb.ScalarFuncSig_FromBinary: + f = &builtinInternalFromBinarySig{base} default: e = errFunctionNotExists.GenWithStackByArgs("FUNCTION", sigCode) @@ -1217,7 +1217,7 @@ func convertUint(val []byte) (*Constant, error) { func convertString(val []byte, tp *tipb.FieldType) (*Constant, error) { var d types.Datum - d.SetBytesAsString(val, protoToCollation(tp.Collate), uint32(tp.Flen)) + d.SetBytesAsString(val, collate.ProtoToCollation(tp.Collate), uint32(tp.Flen)) return &Constant{Value: d, RetType: types.NewFieldType(mysql.TypeVarString)}, nil } diff --git a/expression/distsql_builtin_serial_test.go b/expression/distsql_builtin_serial_test.go new file mode 100644 index 0000000000000..cc8b09ad17a31 --- /dev/null +++ b/expression/distsql_builtin_serial_test.go @@ -0,0 +1,81 @@ +// Copyright 2021 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, +// 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. + +package expression + +import ( + "testing" + + "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/sessionctx/stmtctx" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/collate" + "github.com/pingcap/tipb/go-tipb" + "github.com/stretchr/testify/require" +) + +func TestPBToExprWithNewCollation(t *testing.T) { + sc := new(stmtctx.StatementContext) + fieldTps := make([]*types.FieldType, 1) + + cases := []struct { + name string + expName string + id int32 + pbID int32 + }{ + {"utf8_general_ci", "utf8_general_ci", 33, 33}, + {"UTF8MB4_BIN", "utf8mb4_bin", 46, 46}, + {"utf8mb4_bin", "utf8mb4_bin", 46, 46}, + {"utf8mb4_general_ci", "utf8mb4_general_ci", 45, 45}, + {"", "utf8mb4_bin", 46, 46}, + {"some_error_collation", "utf8mb4_bin", 46, 46}, + {"utf8_unicode_ci", "utf8_unicode_ci", 192, 192}, + {"utf8mb4_unicode_ci", "utf8mb4_unicode_ci", 224, 224}, + {"utf8mb4_zh_pinyin_tidb_as_cs", "utf8mb4_zh_pinyin_tidb_as_cs", 2048, 2048}, + } + + for _, cs := range cases { + ft := types.NewFieldType(mysql.TypeString) + ft.Collate = cs.name + expr := new(tipb.Expr) + expr.Tp = tipb.ExprType_String + expr.FieldType = toPBFieldType(ft) + require.Equal(t, cs.pbID, expr.FieldType.Collate) + + e, err := PBToExpr(expr, fieldTps, sc) + require.NoError(t, err) + cons, ok := e.(*Constant) + require.True(t, ok) + require.Equal(t, cs.expName, cons.Value.Collation()) + } + + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + + for _, cs := range cases { + ft := types.NewFieldType(mysql.TypeString) + ft.Collate = cs.name + expr := new(tipb.Expr) + expr.Tp = tipb.ExprType_String + expr.FieldType = toPBFieldType(ft) + require.Equal(t, -cs.pbID, expr.FieldType.Collate) + + e, err := PBToExpr(expr, fieldTps, sc) + require.NoError(t, err) + cons, ok := e.(*Constant) + require.True(t, ok) + require.Equal(t, cs.expName, cons.Value.Collation()) + } +} diff --git a/expression/distsql_builtin_test.go b/expression/distsql_builtin_test.go index 61f499d31f1b4..6865eef4273f6 100644 --- a/expression/distsql_builtin_test.go +++ b/expression/distsql_builtin_test.go @@ -15,9 +15,9 @@ package expression import ( + "testing" "time" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/charset" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" @@ -27,96 +27,20 @@ import ( "github.com/pingcap/tidb/util/codec" "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tipb/go-tipb" + "github.com/stretchr/testify/require" ) -var _ = Suite(&testEvalSuite{}) -var _ = SerialSuites(&testEvalSerialSuite{}) - -type testEvalSuite struct { - colID int64 -} - -type testEvalSerialSuite struct { -} - -func (s *testEvalSerialSuite) TestPBToExprWithNewCollation(c *C) { - sc := new(stmtctx.StatementContext) - fieldTps := make([]*types.FieldType, 1) - - cases := []struct { - name string - expName string - id int32 - pbID int32 - }{ - {"utf8_general_ci", "utf8_general_ci", 33, 33}, - {"UTF8MB4_BIN", "utf8mb4_bin", 46, 46}, - {"utf8mb4_bin", "utf8mb4_bin", 46, 46}, - {"utf8mb4_general_ci", "utf8mb4_general_ci", 45, 45}, - {"", "utf8mb4_bin", 46, 46}, - {"some_error_collation", "utf8mb4_bin", 46, 46}, - {"utf8_unicode_ci", "utf8_unicode_ci", 192, 192}, - {"utf8mb4_unicode_ci", "utf8mb4_unicode_ci", 224, 224}, - {"utf8mb4_zh_pinyin_tidb_as_cs", "utf8mb4_zh_pinyin_tidb_as_cs", 2048, 2048}, - } - - for _, cs := range cases { - ft := types.NewFieldType(mysql.TypeString) - ft.Collate = cs.name - expr := new(tipb.Expr) - expr.Tp = tipb.ExprType_String - expr.FieldType = toPBFieldType(ft) - c.Assert(expr.FieldType.Collate, Equals, cs.pbID) - - e, err := PBToExpr(expr, fieldTps, sc) - c.Assert(err, IsNil) - cons, ok := e.(*Constant) - c.Assert(ok, IsTrue) - c.Assert(cons.Value.Collation(), Equals, cs.expName) - } - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - - for _, cs := range cases { - ft := types.NewFieldType(mysql.TypeString) - ft.Collate = cs.name - expr := new(tipb.Expr) - expr.Tp = tipb.ExprType_String - expr.FieldType = toPBFieldType(ft) - c.Assert(expr.FieldType.Collate, Equals, -cs.pbID) - - e, err := PBToExpr(expr, fieldTps, sc) - c.Assert(err, IsNil) - cons, ok := e.(*Constant) - c.Assert(ok, IsTrue) - c.Assert(cons.Value.Collation(), Equals, cs.expName) - } -} - -func (s *testEvalSuite) SetUpSuite(c *C) { - s.colID = 0 -} - -func (s *testEvalSuite) allocColID() int64 { - s.colID++ - return s.colID -} - -func (s *testEvalSuite) TearDownTest(c *C) { - s.colID = 0 -} - -func (s *testEvalSuite) TestPBToExpr(c *C) { +func TestPBToExpr(t *testing.T) { sc := new(stmtctx.StatementContext) fieldTps := make([]*types.FieldType, 1) ds := []types.Datum{types.NewIntDatum(1), types.NewUintDatum(1), types.NewFloat64Datum(1), - types.NewDecimalDatum(newMyDecimal(c, "1")), types.NewDurationDatum(newDuration(time.Second))} + types.NewDecimalDatum(newMyDecimal(t, "1")), types.NewDurationDatum(newDuration(time.Second))} for _, d := range ds { - expr := datumExpr(c, d) + expr := datumExpr(t, d) expr.Val = expr.Val[:len(expr.Val)/2] _, err := PBToExpr(expr, fieldTps, sc) - c.Assert(err, NotNil) + require.Error(t, err) } expr := &tipb.Expr{ @@ -128,7 +52,7 @@ func (s *testEvalSuite) TestPBToExpr(c *C) { }, } _, err := PBToExpr(expr, fieldTps, sc) - c.Assert(err, IsNil) + require.NoError(t, err) val := make([]byte, 0, 32) val = codec.EncodeInt(val, 1) @@ -142,7 +66,7 @@ func (s *testEvalSuite) TestPBToExpr(c *C) { }, } _, err = PBToExpr(expr, fieldTps, sc) - c.Assert(err, NotNil) + require.Error(t, err) expr = &tipb.Expr{ Tp: tipb.ExprType_ScalarFunc, @@ -156,11 +80,11 @@ func (s *testEvalSuite) TestPBToExpr(c *C) { FieldType: ToPBFieldType(newIntFieldType()), } _, err = PBToExpr(expr, fieldTps, sc) - c.Assert(err, NotNil) + require.Error(t, err) } // TestEval test expr.Eval(). -func (s *testEvalSuite) TestEval(c *C) { +func TestEval(t *testing.T) { row := chunk.MutRowFromDatums([]types.Datum{types.NewDatum(100)}).ToRow() fieldTps := make([]*types.FieldType, 1) fieldTps[0] = types.NewFieldType(mysql.TypeLonglong) @@ -170,39 +94,39 @@ func (s *testEvalSuite) TestEval(c *C) { }{ // Datums. { - datumExpr(c, types.NewFloat32Datum(1.1)), + datumExpr(t, types.NewFloat32Datum(1.1)), types.NewFloat32Datum(1.1), }, { - datumExpr(c, types.NewFloat64Datum(1.1)), + datumExpr(t, types.NewFloat64Datum(1.1)), types.NewFloat64Datum(1.1), }, { - datumExpr(c, types.NewIntDatum(1)), + datumExpr(t, types.NewIntDatum(1)), types.NewIntDatum(1), }, { - datumExpr(c, types.NewUintDatum(1)), + datumExpr(t, types.NewUintDatum(1)), types.NewUintDatum(1), }, { - datumExpr(c, types.NewBytesDatum([]byte("abc"))), + datumExpr(t, types.NewBytesDatum([]byte("abc"))), types.NewBytesDatum([]byte("abc")), }, { - datumExpr(c, types.NewStringDatum("abc")), + datumExpr(t, types.NewStringDatum("abc")), types.NewStringDatum("abc"), }, { - datumExpr(c, types.Datum{}), + datumExpr(t, types.Datum{}), types.Datum{}, }, { - datumExpr(c, types.NewDurationDatum(types.Duration{Duration: time.Hour})), + datumExpr(t, types.NewDurationDatum(types.Duration{Duration: time.Hour})), types.NewDurationDatum(types.Duration{Duration: time.Hour}), }, { - datumExpr(c, types.NewDecimalDatum(types.NewDecFromFloatForTest(1.1))), + datumExpr(t, types.NewDecimalDatum(types.NewDecFromFloatForTest(1.1))), types.NewDecimalDatum(types.NewDecFromFloatForTest(1.1)), }, // Columns. @@ -214,595 +138,595 @@ func (s *testEvalSuite) TestEval(c *C) { { scalarFunctionExpr(tipb.ScalarFuncSig_JsonDepthSig, toPBFieldType(newIntFieldType()), - jsonDatumExpr(c, `true`), + jsonDatumExpr(t, `true`), ), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_JsonDepthSig, toPBFieldType(newIntFieldType()), - jsonDatumExpr(c, `[10, {"a": 20}]`), + jsonDatumExpr(t, `[10, {"a": 20}]`), ), types.NewIntDatum(3), }, { scalarFunctionExpr(tipb.ScalarFuncSig_JsonStorageSizeSig, toPBFieldType(newIntFieldType()), - jsonDatumExpr(c, `[{"a":{"a":1},"b":2}]`), + jsonDatumExpr(t, `[{"a":{"a":1},"b":2}]`), ), types.NewIntDatum(25), }, { scalarFunctionExpr(tipb.ScalarFuncSig_JsonSearchSig, toPBFieldType(newJSONFieldType()), - jsonDatumExpr(c, `["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}]`), - datumExpr(c, types.NewBytesDatum([]byte(`all`))), - datumExpr(c, types.NewBytesDatum([]byte(`10`))), - datumExpr(c, types.NewBytesDatum([]byte(`\`))), - datumExpr(c, types.NewBytesDatum([]byte(`$**.k`))), + jsonDatumExpr(t, `["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}]`), + datumExpr(t, types.NewBytesDatum([]byte(`all`))), + datumExpr(t, types.NewBytesDatum([]byte(`10`))), + datumExpr(t, types.NewBytesDatum([]byte(`\`))), + datumExpr(t, types.NewBytesDatum([]byte(`$**.k`))), ), - newJSONDatum(c, `"$[1][0].k"`), + newJSONDatum(t, `"$[1][0].k"`), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CastIntAsInt, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntDatum(2333))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewIntDatum(2333))), types.NewIntDatum(2333), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CastRealAsInt, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewFloat64Datum(2333))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewFloat64Datum(2333))), types.NewIntDatum(2333), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CastStringAsInt, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewStringDatum("2333"))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewStringDatum("2333"))), types.NewIntDatum(2333), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CastDecimalAsInt, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDecimalDatum(newMyDecimal(c, "2333")))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewDecimalDatum(newMyDecimal(t, "2333")))), types.NewIntDatum(2333), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CastIntAsReal, - toPBFieldType(newRealFieldType()), datumExpr(c, types.NewIntDatum(2333))), + toPBFieldType(newRealFieldType()), datumExpr(t, types.NewIntDatum(2333))), types.NewFloat64Datum(2333), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CastRealAsReal, - toPBFieldType(newRealFieldType()), datumExpr(c, types.NewFloat64Datum(2333))), + toPBFieldType(newRealFieldType()), datumExpr(t, types.NewFloat64Datum(2333))), types.NewFloat64Datum(2333), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CastStringAsReal, - toPBFieldType(newRealFieldType()), datumExpr(c, types.NewStringDatum("2333"))), + toPBFieldType(newRealFieldType()), datumExpr(t, types.NewStringDatum("2333"))), types.NewFloat64Datum(2333), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CastDecimalAsReal, - toPBFieldType(newRealFieldType()), datumExpr(c, types.NewDecimalDatum(newMyDecimal(c, "2333")))), + toPBFieldType(newRealFieldType()), datumExpr(t, types.NewDecimalDatum(newMyDecimal(t, "2333")))), types.NewFloat64Datum(2333), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CastStringAsString, - toPBFieldType(newStringFieldType()), datumExpr(c, types.NewStringDatum("2333"))), + toPBFieldType(newStringFieldType()), datumExpr(t, types.NewStringDatum("2333"))), types.NewStringDatum("2333"), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CastIntAsString, - toPBFieldType(newStringFieldType()), datumExpr(c, types.NewIntDatum(2333))), + toPBFieldType(newStringFieldType()), datumExpr(t, types.NewIntDatum(2333))), types.NewStringDatum("2333"), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CastRealAsString, - toPBFieldType(newStringFieldType()), datumExpr(c, types.NewFloat64Datum(2333))), + toPBFieldType(newStringFieldType()), datumExpr(t, types.NewFloat64Datum(2333))), types.NewStringDatum("2333"), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CastDecimalAsString, - toPBFieldType(newStringFieldType()), datumExpr(c, types.NewDecimalDatum(newMyDecimal(c, "2333")))), + toPBFieldType(newStringFieldType()), datumExpr(t, types.NewDecimalDatum(newMyDecimal(t, "2333")))), types.NewStringDatum("2333"), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CastDecimalAsDecimal, - toPBFieldType(newDecimalFieldType()), datumExpr(c, types.NewDecimalDatum(newMyDecimal(c, "2333")))), - types.NewDecimalDatum(newMyDecimal(c, "2333")), + toPBFieldType(newDecimalFieldType()), datumExpr(t, types.NewDecimalDatum(newMyDecimal(t, "2333")))), + types.NewDecimalDatum(newMyDecimal(t, "2333")), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CastIntAsDecimal, - toPBFieldType(newDecimalFieldType()), datumExpr(c, types.NewIntDatum(2333))), - types.NewDecimalDatum(newMyDecimal(c, "2333")), + toPBFieldType(newDecimalFieldType()), datumExpr(t, types.NewIntDatum(2333))), + types.NewDecimalDatum(newMyDecimal(t, "2333")), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CastRealAsDecimal, - toPBFieldType(newDecimalFieldType()), datumExpr(c, types.NewFloat64Datum(2333))), - types.NewDecimalDatum(newMyDecimal(c, "2333")), + toPBFieldType(newDecimalFieldType()), datumExpr(t, types.NewFloat64Datum(2333))), + types.NewDecimalDatum(newMyDecimal(t, "2333")), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CastStringAsDecimal, - toPBFieldType(newDecimalFieldType()), datumExpr(c, types.NewStringDatum("2333"))), - types.NewDecimalDatum(newMyDecimal(c, "2333")), + toPBFieldType(newDecimalFieldType()), datumExpr(t, types.NewStringDatum("2333"))), + types.NewDecimalDatum(newMyDecimal(t, "2333")), }, { scalarFunctionExpr(tipb.ScalarFuncSig_GEInt, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntDatum(2)), datumExpr(c, types.NewIntDatum(1))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewIntDatum(2)), datumExpr(t, types.NewIntDatum(1))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_LEInt, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntDatum(1)), datumExpr(c, types.NewIntDatum(2))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewIntDatum(1)), datumExpr(t, types.NewIntDatum(2))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_NEInt, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntDatum(1)), datumExpr(c, types.NewIntDatum(2))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewIntDatum(1)), datumExpr(t, types.NewIntDatum(2))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_NullEQInt, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDatum(nil)), datumExpr(c, types.NewDatum(nil))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewDatum(nil)), datumExpr(t, types.NewDatum(nil))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_GEReal, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewFloat64Datum(2)), datumExpr(c, types.NewFloat64Datum(1))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewFloat64Datum(2)), datumExpr(t, types.NewFloat64Datum(1))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_LEReal, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewFloat64Datum(1)), datumExpr(c, types.NewFloat64Datum(2))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewFloat64Datum(1)), datumExpr(t, types.NewFloat64Datum(2))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_LTReal, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewFloat64Datum(1)), datumExpr(c, types.NewFloat64Datum(2))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewFloat64Datum(1)), datumExpr(t, types.NewFloat64Datum(2))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_EQReal, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewFloat64Datum(1)), datumExpr(c, types.NewFloat64Datum(1))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewFloat64Datum(1)), datumExpr(t, types.NewFloat64Datum(1))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_NEReal, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewFloat64Datum(1)), datumExpr(c, types.NewFloat64Datum(2))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewFloat64Datum(1)), datumExpr(t, types.NewFloat64Datum(2))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_NullEQReal, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDatum(nil)), datumExpr(c, types.NewDatum(nil))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewDatum(nil)), datumExpr(t, types.NewDatum(nil))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_GEDecimal, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDecimalDatum(newMyDecimal(c, "2"))), datumExpr(c, types.NewDecimalDatum(newMyDecimal(c, "1")))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewDecimalDatum(newMyDecimal(t, "2"))), datumExpr(t, types.NewDecimalDatum(newMyDecimal(t, "1")))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_LEDecimal, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDecimalDatum(newMyDecimal(c, "1"))), datumExpr(c, types.NewDecimalDatum(newMyDecimal(c, "2")))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewDecimalDatum(newMyDecimal(t, "1"))), datumExpr(t, types.NewDecimalDatum(newMyDecimal(t, "2")))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_LTDecimal, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDecimalDatum(newMyDecimal(c, "1"))), datumExpr(c, types.NewDecimalDatum(newMyDecimal(c, "2")))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewDecimalDatum(newMyDecimal(t, "1"))), datumExpr(t, types.NewDecimalDatum(newMyDecimal(t, "2")))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_EQDecimal, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDecimalDatum(newMyDecimal(c, "1"))), datumExpr(c, types.NewDecimalDatum(newMyDecimal(c, "1")))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewDecimalDatum(newMyDecimal(t, "1"))), datumExpr(t, types.NewDecimalDatum(newMyDecimal(t, "1")))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_NEDecimal, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDecimalDatum(newMyDecimal(c, "1"))), datumExpr(c, types.NewDecimalDatum(newMyDecimal(c, "2")))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewDecimalDatum(newMyDecimal(t, "1"))), datumExpr(t, types.NewDecimalDatum(newMyDecimal(t, "2")))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_NullEQDecimal, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDatum(nil)), datumExpr(c, types.NewDatum(nil))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewDatum(nil)), datumExpr(t, types.NewDatum(nil))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_GEDuration, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDurationDatum(newDuration(time.Second*2))), datumExpr(c, types.NewDurationDatum(newDuration(time.Second)))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewDurationDatum(newDuration(time.Second*2))), datumExpr(t, types.NewDurationDatum(newDuration(time.Second)))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_GTDuration, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDurationDatum(newDuration(time.Second*2))), datumExpr(c, types.NewDurationDatum(newDuration(time.Second)))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewDurationDatum(newDuration(time.Second*2))), datumExpr(t, types.NewDurationDatum(newDuration(time.Second)))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_EQDuration, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDurationDatum(newDuration(time.Second))), datumExpr(c, types.NewDurationDatum(newDuration(time.Second)))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewDurationDatum(newDuration(time.Second))), datumExpr(t, types.NewDurationDatum(newDuration(time.Second)))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_LEDuration, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDurationDatum(newDuration(time.Second))), datumExpr(c, types.NewDurationDatum(newDuration(time.Second*2)))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewDurationDatum(newDuration(time.Second))), datumExpr(t, types.NewDurationDatum(newDuration(time.Second*2)))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_NEDuration, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDurationDatum(newDuration(time.Second))), datumExpr(c, types.NewDurationDatum(newDuration(time.Second*2)))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewDurationDatum(newDuration(time.Second))), datumExpr(t, types.NewDurationDatum(newDuration(time.Second*2)))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_NullEQDuration, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDatum(nil)), datumExpr(c, types.NewDatum(nil))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewDatum(nil)), datumExpr(t, types.NewDatum(nil))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_GEString, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewStringDatum("1")), datumExpr(c, types.NewStringDatum("1"))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewStringDatum("1")), datumExpr(t, types.NewStringDatum("1"))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_LEString, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewStringDatum("1")), datumExpr(c, types.NewStringDatum("1"))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewStringDatum("1")), datumExpr(t, types.NewStringDatum("1"))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_NEString, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewStringDatum("2")), datumExpr(c, types.NewStringDatum("1"))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewStringDatum("2")), datumExpr(t, types.NewStringDatum("1"))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_NullEQString, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDatum(nil)), datumExpr(c, types.NewDatum(nil))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewDatum(nil)), datumExpr(t, types.NewDatum(nil))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_GTJson, - toPBFieldType(newIntFieldType()), jsonDatumExpr(c, "[2]"), jsonDatumExpr(c, "[1]")), + toPBFieldType(newIntFieldType()), jsonDatumExpr(t, "[2]"), jsonDatumExpr(t, "[1]")), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_GEJson, - toPBFieldType(newIntFieldType()), jsonDatumExpr(c, "[2]"), jsonDatumExpr(c, "[1]")), + toPBFieldType(newIntFieldType()), jsonDatumExpr(t, "[2]"), jsonDatumExpr(t, "[1]")), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_LTJson, - toPBFieldType(newIntFieldType()), jsonDatumExpr(c, "[1]"), jsonDatumExpr(c, "[2]")), + toPBFieldType(newIntFieldType()), jsonDatumExpr(t, "[1]"), jsonDatumExpr(t, "[2]")), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_LEJson, - toPBFieldType(newIntFieldType()), jsonDatumExpr(c, "[1]"), jsonDatumExpr(c, "[2]")), + toPBFieldType(newIntFieldType()), jsonDatumExpr(t, "[1]"), jsonDatumExpr(t, "[2]")), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_EQJson, - toPBFieldType(newIntFieldType()), jsonDatumExpr(c, "[1]"), jsonDatumExpr(c, "[1]")), + toPBFieldType(newIntFieldType()), jsonDatumExpr(t, "[1]"), jsonDatumExpr(t, "[1]")), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_NEJson, - toPBFieldType(newIntFieldType()), jsonDatumExpr(c, "[1]"), jsonDatumExpr(c, "[2]")), + toPBFieldType(newIntFieldType()), jsonDatumExpr(t, "[1]"), jsonDatumExpr(t, "[2]")), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_NullEQJson, - toPBFieldType(newIntFieldType()), jsonDatumExpr(c, "[1]"), jsonDatumExpr(c, "[1]")), + toPBFieldType(newIntFieldType()), jsonDatumExpr(t, "[1]"), jsonDatumExpr(t, "[1]")), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_DecimalIsNull, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDatum(nil))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewDatum(nil))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_DurationIsNull, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDatum(nil))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewDatum(nil))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_RealIsNull, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDatum(nil))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewDatum(nil))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_LeftShift, - ToPBFieldType(newIntFieldType()), datumExpr(c, types.NewDatum(1)), datumExpr(c, types.NewIntDatum(1))), + ToPBFieldType(newIntFieldType()), datumExpr(t, types.NewDatum(1)), datumExpr(t, types.NewIntDatum(1))), types.NewIntDatum(2), }, { scalarFunctionExpr(tipb.ScalarFuncSig_AbsInt, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntDatum(-1))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewIntDatum(-1))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_AbsUInt, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewUintDatum(1))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewUintDatum(1))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_AbsReal, - toPBFieldType(newRealFieldType()), datumExpr(c, types.NewFloat64Datum(-1.23))), + toPBFieldType(newRealFieldType()), datumExpr(t, types.NewFloat64Datum(-1.23))), types.NewFloat64Datum(1.23), }, { scalarFunctionExpr(tipb.ScalarFuncSig_AbsDecimal, - toPBFieldType(newDecimalFieldType()), datumExpr(c, types.NewDecimalDatum(newMyDecimal(c, "-1.23")))), - types.NewDecimalDatum(newMyDecimal(c, "1.23")), + toPBFieldType(newDecimalFieldType()), datumExpr(t, types.NewDecimalDatum(newMyDecimal(t, "-1.23")))), + types.NewDecimalDatum(newMyDecimal(t, "1.23")), }, { scalarFunctionExpr(tipb.ScalarFuncSig_LogicalAnd, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntDatum(1)), datumExpr(c, types.NewIntDatum(1))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewIntDatum(1)), datumExpr(t, types.NewIntDatum(1))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_LogicalOr, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntDatum(1)), datumExpr(c, types.NewIntDatum(0))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewIntDatum(1)), datumExpr(t, types.NewIntDatum(0))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_LogicalXor, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntDatum(1)), datumExpr(c, types.NewIntDatum(0))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewIntDatum(1)), datumExpr(t, types.NewIntDatum(0))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_BitAndSig, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntDatum(1)), datumExpr(c, types.NewIntDatum(1))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewIntDatum(1)), datumExpr(t, types.NewIntDatum(1))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_BitOrSig, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntDatum(1)), datumExpr(c, types.NewIntDatum(0))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewIntDatum(1)), datumExpr(t, types.NewIntDatum(0))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_BitXorSig, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntDatum(1)), datumExpr(c, types.NewIntDatum(0))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewIntDatum(1)), datumExpr(t, types.NewIntDatum(0))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_BitNegSig, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntDatum(0))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewIntDatum(0))), types.NewIntDatum(-1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_InReal, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewFloat64Datum(1)), datumExpr(c, types.NewFloat64Datum(1))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewFloat64Datum(1)), datumExpr(t, types.NewFloat64Datum(1))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_InDecimal, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDecimalDatum(newMyDecimal(c, "1"))), datumExpr(c, types.NewDecimalDatum(newMyDecimal(c, "1")))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewDecimalDatum(newMyDecimal(t, "1"))), datumExpr(t, types.NewDecimalDatum(newMyDecimal(t, "1")))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_InString, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewStringDatum("1")), datumExpr(c, types.NewStringDatum("1"))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewStringDatum("1")), datumExpr(t, types.NewStringDatum("1"))), types.NewIntDatum(1), }, // { // scalarFunctionExpr(tipb.ScalarFuncSig_InTime, - // toPBFieldType(newIntFieldType()), datumExpr(c, types.NewTimeDatum(types.ZeroDate)), datumExpr(c, types.NewTimeDatum(types.ZeroDate))), + // toPBFieldType(newIntFieldType()), datumExpr(t, types.NewTimeDatum(types.ZeroDate)), datumExpr(t, types.NewTimeDatum(types.ZeroDate))), // types.NewIntDatum(1), // }, { scalarFunctionExpr(tipb.ScalarFuncSig_InDuration, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDurationDatum(newDuration(time.Second))), datumExpr(c, types.NewDurationDatum(newDuration(time.Second)))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewDurationDatum(newDuration(time.Second))), datumExpr(t, types.NewDurationDatum(newDuration(time.Second)))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_IfNullInt, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDatum(nil)), datumExpr(c, types.NewIntDatum(1))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewDatum(nil)), datumExpr(t, types.NewIntDatum(1))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_IfInt, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntDatum(1)), datumExpr(c, types.NewIntDatum(2))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewIntDatum(1)), datumExpr(t, types.NewIntDatum(2))), types.NewIntDatum(2), }, { scalarFunctionExpr(tipb.ScalarFuncSig_IfNullReal, - toPBFieldType(newRealFieldType()), datumExpr(c, types.NewDatum(nil)), datumExpr(c, types.NewFloat64Datum(1))), + toPBFieldType(newRealFieldType()), datumExpr(t, types.NewDatum(nil)), datumExpr(t, types.NewFloat64Datum(1))), types.NewFloat64Datum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_IfReal, - toPBFieldType(newRealFieldType()), datumExpr(c, types.NewFloat64Datum(1)), datumExpr(c, types.NewFloat64Datum(2))), + toPBFieldType(newRealFieldType()), datumExpr(t, types.NewFloat64Datum(1)), datumExpr(t, types.NewFloat64Datum(2))), types.NewFloat64Datum(2), }, { scalarFunctionExpr(tipb.ScalarFuncSig_IfNullDecimal, - toPBFieldType(newDecimalFieldType()), datumExpr(c, types.NewDatum(nil)), datumExpr(c, types.NewDecimalDatum(newMyDecimal(c, "1")))), - types.NewDecimalDatum(newMyDecimal(c, "1")), + toPBFieldType(newDecimalFieldType()), datumExpr(t, types.NewDatum(nil)), datumExpr(t, types.NewDecimalDatum(newMyDecimal(t, "1")))), + types.NewDecimalDatum(newMyDecimal(t, "1")), }, { scalarFunctionExpr(tipb.ScalarFuncSig_IfDecimal, - toPBFieldType(newDecimalFieldType()), datumExpr(c, types.NewIntDatum(1)), datumExpr(c, types.NewDecimalDatum(newMyDecimal(c, "2")))), - types.NewDecimalDatum(newMyDecimal(c, "2")), + toPBFieldType(newDecimalFieldType()), datumExpr(t, types.NewIntDatum(1)), datumExpr(t, types.NewDecimalDatum(newMyDecimal(t, "2")))), + types.NewDecimalDatum(newMyDecimal(t, "2")), }, { scalarFunctionExpr(tipb.ScalarFuncSig_IfNullString, - toPBFieldType(newStringFieldType()), datumExpr(c, types.NewDatum(nil)), datumExpr(c, types.NewStringDatum("1"))), + toPBFieldType(newStringFieldType()), datumExpr(t, types.NewDatum(nil)), datumExpr(t, types.NewStringDatum("1"))), types.NewStringDatum("1"), }, { scalarFunctionExpr(tipb.ScalarFuncSig_IfString, - toPBFieldType(newStringFieldType()), datumExpr(c, types.NewIntDatum(1)), datumExpr(c, types.NewStringDatum("2"))), + toPBFieldType(newStringFieldType()), datumExpr(t, types.NewIntDatum(1)), datumExpr(t, types.NewStringDatum("2"))), types.NewStringDatum("2"), }, { scalarFunctionExpr(tipb.ScalarFuncSig_IfNullDuration, - toPBFieldType(newDurFieldType()), datumExpr(c, types.NewDatum(nil)), datumExpr(c, types.NewDurationDatum(newDuration(time.Second)))), + toPBFieldType(newDurFieldType()), datumExpr(t, types.NewDatum(nil)), datumExpr(t, types.NewDurationDatum(newDuration(time.Second)))), types.NewDurationDatum(newDuration(time.Second)), }, { scalarFunctionExpr(tipb.ScalarFuncSig_IfDuration, - toPBFieldType(newDurFieldType()), datumExpr(c, types.NewIntDatum(1)), datumExpr(c, types.NewDurationDatum(newDuration(time.Second*2)))), + toPBFieldType(newDurFieldType()), datumExpr(t, types.NewIntDatum(1)), datumExpr(t, types.NewDurationDatum(newDuration(time.Second*2)))), types.NewDurationDatum(newDuration(time.Second * 2)), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CastIntAsDuration, - toPBFieldType(newDurFieldType()), datumExpr(c, types.NewIntDatum(1))), + toPBFieldType(newDurFieldType()), datumExpr(t, types.NewIntDatum(1))), types.NewDurationDatum(newDuration(time.Second * 1)), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CastRealAsDuration, - toPBFieldType(newDurFieldType()), datumExpr(c, types.NewFloat64Datum(1))), + toPBFieldType(newDurFieldType()), datumExpr(t, types.NewFloat64Datum(1))), types.NewDurationDatum(newDuration(time.Second * 1)), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CastDecimalAsDuration, - toPBFieldType(newDurFieldType()), datumExpr(c, types.NewDecimalDatum(newMyDecimal(c, "1")))), + toPBFieldType(newDurFieldType()), datumExpr(t, types.NewDecimalDatum(newMyDecimal(t, "1")))), types.NewDurationDatum(newDuration(time.Second * 1)), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CastDurationAsDuration, - toPBFieldType(newDurFieldType()), datumExpr(c, types.NewDurationDatum(newDuration(time.Second*1)))), + toPBFieldType(newDurFieldType()), datumExpr(t, types.NewDurationDatum(newDuration(time.Second*1)))), types.NewDurationDatum(newDuration(time.Second * 1)), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CastStringAsDuration, - toPBFieldType(newDurFieldType()), datumExpr(c, types.NewStringDatum("1"))), + toPBFieldType(newDurFieldType()), datumExpr(t, types.NewStringDatum("1"))), types.NewDurationDatum(newDuration(time.Second * 1)), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CastTimeAsTime, - toPBFieldType(newDateFieldType()), datumExpr(c, types.NewTimeDatum(newDateTime(c, "2000-01-01")))), - types.NewTimeDatum(newDateTime(c, "2000-01-01")), + toPBFieldType(newDateFieldType()), datumExpr(t, types.NewTimeDatum(newDateTime(t, "2000-01-01")))), + types.NewTimeDatum(newDateTime(t, "2000-01-01")), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CastIntAsTime, - toPBFieldType(newDateFieldType()), datumExpr(c, types.NewIntDatum(20000101))), - types.NewTimeDatum(newDateTime(c, "2000-01-01")), + toPBFieldType(newDateFieldType()), datumExpr(t, types.NewIntDatum(20000101))), + types.NewTimeDatum(newDateTime(t, "2000-01-01")), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CastRealAsTime, - toPBFieldType(newDateFieldType()), datumExpr(c, types.NewFloat64Datum(20000101))), - types.NewTimeDatum(newDateTime(c, "2000-01-01")), + toPBFieldType(newDateFieldType()), datumExpr(t, types.NewFloat64Datum(20000101))), + types.NewTimeDatum(newDateTime(t, "2000-01-01")), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CastDecimalAsTime, - toPBFieldType(newDateFieldType()), datumExpr(c, types.NewDecimalDatum(newMyDecimal(c, "20000101")))), - types.NewTimeDatum(newDateTime(c, "2000-01-01")), + toPBFieldType(newDateFieldType()), datumExpr(t, types.NewDecimalDatum(newMyDecimal(t, "20000101")))), + types.NewTimeDatum(newDateTime(t, "2000-01-01")), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CastStringAsTime, - toPBFieldType(newDateFieldType()), datumExpr(c, types.NewStringDatum("20000101"))), - types.NewTimeDatum(newDateTime(c, "2000-01-01")), + toPBFieldType(newDateFieldType()), datumExpr(t, types.NewStringDatum("20000101"))), + types.NewTimeDatum(newDateTime(t, "2000-01-01")), }, { scalarFunctionExpr(tipb.ScalarFuncSig_PlusInt, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntDatum(1)), datumExpr(c, types.NewIntDatum(2))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewIntDatum(1)), datumExpr(t, types.NewIntDatum(2))), types.NewIntDatum(3), }, { scalarFunctionExpr(tipb.ScalarFuncSig_PlusDecimal, - toPBFieldType(newDecimalFieldType()), datumExpr(c, types.NewDecimalDatum(newMyDecimal(c, "1"))), datumExpr(c, types.NewDecimalDatum(newMyDecimal(c, "2")))), - types.NewDecimalDatum(newMyDecimal(c, "3")), + toPBFieldType(newDecimalFieldType()), datumExpr(t, types.NewDecimalDatum(newMyDecimal(t, "1"))), datumExpr(t, types.NewDecimalDatum(newMyDecimal(t, "2")))), + types.NewDecimalDatum(newMyDecimal(t, "3")), }, { scalarFunctionExpr(tipb.ScalarFuncSig_PlusReal, - toPBFieldType(newRealFieldType()), datumExpr(c, types.NewFloat64Datum(1)), datumExpr(c, types.NewFloat64Datum(2))), + toPBFieldType(newRealFieldType()), datumExpr(t, types.NewFloat64Datum(1)), datumExpr(t, types.NewFloat64Datum(2))), types.NewFloat64Datum(3), }, { scalarFunctionExpr(tipb.ScalarFuncSig_MinusInt, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntDatum(1)), datumExpr(c, types.NewIntDatum(2))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewIntDatum(1)), datumExpr(t, types.NewIntDatum(2))), types.NewIntDatum(-1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_MinusDecimal, - toPBFieldType(newDecimalFieldType()), datumExpr(c, types.NewDecimalDatum(newMyDecimal(c, "1"))), datumExpr(c, types.NewDecimalDatum(newMyDecimal(c, "2")))), - types.NewDecimalDatum(newMyDecimal(c, "-1")), + toPBFieldType(newDecimalFieldType()), datumExpr(t, types.NewDecimalDatum(newMyDecimal(t, "1"))), datumExpr(t, types.NewDecimalDatum(newMyDecimal(t, "2")))), + types.NewDecimalDatum(newMyDecimal(t, "-1")), }, { scalarFunctionExpr(tipb.ScalarFuncSig_MinusReal, - toPBFieldType(newRealFieldType()), datumExpr(c, types.NewFloat64Datum(1)), datumExpr(c, types.NewFloat64Datum(2))), + toPBFieldType(newRealFieldType()), datumExpr(t, types.NewFloat64Datum(1)), datumExpr(t, types.NewFloat64Datum(2))), types.NewFloat64Datum(-1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_MultiplyInt, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntDatum(1)), datumExpr(c, types.NewIntDatum(2))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewIntDatum(1)), datumExpr(t, types.NewIntDatum(2))), types.NewIntDatum(2), }, { scalarFunctionExpr(tipb.ScalarFuncSig_MultiplyDecimal, - toPBFieldType(newDecimalFieldType()), datumExpr(c, types.NewDecimalDatum(newMyDecimal(c, "1"))), datumExpr(c, types.NewDecimalDatum(newMyDecimal(c, "2")))), - types.NewDecimalDatum(newMyDecimal(c, "2")), + toPBFieldType(newDecimalFieldType()), datumExpr(t, types.NewDecimalDatum(newMyDecimal(t, "1"))), datumExpr(t, types.NewDecimalDatum(newMyDecimal(t, "2")))), + types.NewDecimalDatum(newMyDecimal(t, "2")), }, { scalarFunctionExpr(tipb.ScalarFuncSig_MultiplyReal, - toPBFieldType(newRealFieldType()), datumExpr(c, types.NewFloat64Datum(1)), datumExpr(c, types.NewFloat64Datum(2))), + toPBFieldType(newRealFieldType()), datumExpr(t, types.NewFloat64Datum(1)), datumExpr(t, types.NewFloat64Datum(2))), types.NewFloat64Datum(2), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CeilIntToInt, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntDatum(1))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewIntDatum(1))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CeilIntToDec, - toPBFieldType(newDecimalFieldType()), datumExpr(c, types.NewIntDatum(1))), - types.NewDecimalDatum(newMyDecimal(c, "1")), + toPBFieldType(newDecimalFieldType()), datumExpr(t, types.NewIntDatum(1))), + types.NewDecimalDatum(newMyDecimal(t, "1")), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CeilDecToInt, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDecimalDatum(newMyDecimal(c, "1")))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewDecimalDatum(newMyDecimal(t, "1")))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CeilReal, - toPBFieldType(newRealFieldType()), datumExpr(c, types.NewFloat64Datum(1))), + toPBFieldType(newRealFieldType()), datumExpr(t, types.NewFloat64Datum(1))), types.NewFloat64Datum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_FloorIntToInt, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntDatum(1))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewIntDatum(1))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_FloorIntToDec, - toPBFieldType(newDecimalFieldType()), datumExpr(c, types.NewIntDatum(1))), - types.NewDecimalDatum(newMyDecimal(c, "1")), + toPBFieldType(newDecimalFieldType()), datumExpr(t, types.NewIntDatum(1))), + types.NewDecimalDatum(newMyDecimal(t, "1")), }, { scalarFunctionExpr(tipb.ScalarFuncSig_FloorDecToInt, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDecimalDatum(newMyDecimal(c, "1")))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewDecimalDatum(newMyDecimal(t, "1")))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_FloorReal, - toPBFieldType(newRealFieldType()), datumExpr(c, types.NewFloat64Datum(1))), + toPBFieldType(newRealFieldType()), datumExpr(t, types.NewFloat64Datum(1))), types.NewFloat64Datum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CoalesceInt, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntDatum(1))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewIntDatum(1))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CoalesceReal, - toPBFieldType(newRealFieldType()), datumExpr(c, types.NewFloat64Datum(1))), + toPBFieldType(newRealFieldType()), datumExpr(t, types.NewFloat64Datum(1))), types.NewFloat64Datum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CoalesceDecimal, - toPBFieldType(newDecimalFieldType()), datumExpr(c, types.NewDecimalDatum(newMyDecimal(c, "1")))), - types.NewDecimalDatum(newMyDecimal(c, "1")), + toPBFieldType(newDecimalFieldType()), datumExpr(t, types.NewDecimalDatum(newMyDecimal(t, "1")))), + types.NewDecimalDatum(newMyDecimal(t, "1")), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CoalesceString, - toPBFieldType(newStringFieldType()), datumExpr(c, types.NewStringDatum("1"))), + toPBFieldType(newStringFieldType()), datumExpr(t, types.NewStringDatum("1"))), types.NewStringDatum("1"), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CoalesceDuration, - toPBFieldType(newDurFieldType()), datumExpr(c, types.NewDurationDatum(newDuration(time.Second)))), + toPBFieldType(newDurFieldType()), datumExpr(t, types.NewDurationDatum(newDuration(time.Second)))), types.NewDurationDatum(newDuration(time.Second)), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CoalesceTime, - toPBFieldType(newDateFieldType()), datumExpr(c, types.NewTimeDatum(newDateTime(c, "2000-01-01")))), - types.NewTimeDatum(newDateTime(c, "2000-01-01")), + toPBFieldType(newDateFieldType()), datumExpr(t, types.NewTimeDatum(newDateTime(t, "2000-01-01")))), + types.NewTimeDatum(newDateTime(t, "2000-01-01")), }, { scalarFunctionExpr(tipb.ScalarFuncSig_CaseWhenInt, @@ -836,39 +760,39 @@ func (s *testEvalSuite) TestEval(c *C) { }, { scalarFunctionExpr(tipb.ScalarFuncSig_RealIsFalse, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewFloat64Datum(1))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewFloat64Datum(1))), types.NewIntDatum(0), }, { scalarFunctionExpr(tipb.ScalarFuncSig_DecimalIsFalse, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDecimalDatum(newMyDecimal(c, "1")))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewDecimalDatum(newMyDecimal(t, "1")))), types.NewIntDatum(0), }, { scalarFunctionExpr(tipb.ScalarFuncSig_RealIsTrue, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewFloat64Datum(1))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewFloat64Datum(1))), types.NewIntDatum(1), }, { scalarFunctionExpr(tipb.ScalarFuncSig_DecimalIsTrue, - toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDecimalDatum(newMyDecimal(c, "1")))), + toPBFieldType(newIntFieldType()), datumExpr(t, types.NewDecimalDatum(newMyDecimal(t, "1")))), types.NewIntDatum(1), }, } sc := new(stmtctx.StatementContext) for _, tt := range tests { expr, err := PBToExpr(tt.expr, fieldTps, sc) - c.Assert(err, IsNil) + require.NoError(t, err) result, err := expr.Eval(row) - c.Assert(err, IsNil) - c.Assert(result.Kind(), Equals, tt.result.Kind()) - cmp, err := result.CompareDatum(sc, &tt.result) - c.Assert(err, IsNil) - c.Assert(cmp, Equals, 0) + require.NoError(t, err) + require.Equal(t, tt.result.Kind(), result.Kind()) + cmp, err := result.Compare(sc, &tt.result, collate.GetCollator(fieldTps[0].Collate)) + require.NoError(t, err) + require.Equal(t, 0, cmp) } } -func datumExpr(c *C, d types.Datum) *tipb.Expr { +func datumExpr(t *testing.T, d types.Datum) *tipb.Expr { expr := new(tipb.Expr) switch d.Kind() { case types.KindInt64: @@ -897,18 +821,18 @@ func datumExpr(c *C, d types.Datum) *tipb.Expr { expr.Tp = tipb.ExprType_MysqlDecimal var err error expr.Val, err = codec.EncodeDecimal(nil, d.GetMysqlDecimal(), d.Length(), d.Frac()) - c.Assert(err, IsNil) + require.NoError(t, err) case types.KindMysqlJSON: expr.Tp = tipb.ExprType_MysqlJson var err error expr.Val = make([]byte, 0, 1024) expr.Val, err = codec.EncodeValue(nil, expr.Val, d) - c.Assert(err, IsNil) + require.NoError(t, err) case types.KindMysqlTime: expr.Tp = tipb.ExprType_MysqlTime var err error expr.Val, err = codec.EncodeMySQLTime(nil, d.GetMysqlTime(), mysql.TypeUnspecified, nil) - c.Assert(err, IsNil) + require.NoError(t, err) expr.FieldType = ToPBFieldType(newDateFieldType()) default: expr.Tp = tipb.ExprType_Null @@ -916,15 +840,15 @@ func datumExpr(c *C, d types.Datum) *tipb.Expr { return expr } -func newJSONDatum(c *C, s string) (d types.Datum) { +func newJSONDatum(t *testing.T, s string) (d types.Datum) { j, err := json.ParseBinaryFromString(s) - c.Assert(err, IsNil) + require.NoError(t, err) d.SetMysqlJSON(j) return d } -func jsonDatumExpr(c *C, s string) *tipb.Expr { - return datumExpr(c, newJSONDatum(c, s)) +func jsonDatumExpr(t *testing.T, s string) *tipb.Expr { + return datumExpr(t, newJSONDatum(t, s)) } func columnExpr(columnID int64) *tipb.Expr { @@ -942,14 +866,14 @@ func toPBFieldType(ft *types.FieldType) *tipb.FieldType { Flen: int32(ft.Flen), Decimal: int32(ft.Decimal), Charset: ft.Charset, - Collate: collationToProto(ft.Collate), + Collate: collate.CollationToProto(ft.Collate), Elems: ft.Elems, } } -func newMyDecimal(c *C, s string) *types.MyDecimal { +func newMyDecimal(t *testing.T, s string) *types.MyDecimal { d := new(types.MyDecimal) - c.Assert(d.FromString([]byte(s)), IsNil) + require.Nil(t, d.FromString([]byte(s))) return d } @@ -960,10 +884,10 @@ func newDuration(dur time.Duration) types.Duration { } } -func newDateTime(c *C, s string) types.Time { - t, err := types.ParseDate(nil, s) - c.Assert(err, IsNil) - return t +func newDateTime(t *testing.T, s string) types.Time { + tt, err := types.ParseDate(nil, s) + require.NoError(t, err) + return tt } func newDateFieldType() *types.FieldType { diff --git a/expression/errors.go b/expression/errors.go index 0d2714ad683ad..cfadcc6811e02 100644 --- a/expression/errors.go +++ b/expression/errors.go @@ -34,6 +34,8 @@ var ( ErrInvalidArgumentForLogarithm = dbterror.ClassExpression.NewStd(mysql.ErrInvalidArgumentForLogarithm) ErrIncorrectType = dbterror.ClassExpression.NewStd(mysql.ErrIncorrectType) ErrInvalidTableSample = dbterror.ClassExpression.NewStd(mysql.ErrInvalidTableSample) + ErrInternal = dbterror.ClassOptimizer.NewStd(mysql.ErrInternal) + ErrNoDB = dbterror.ClassOptimizer.NewStd(mysql.ErrNoDB) // All the un-exported errors are defined here: errFunctionNotExists = dbterror.ClassExpression.NewStd(mysql.ErrSpDoesNotExist) diff --git a/expression/evaluator_test.go b/expression/evaluator_test.go index 361f7196ed570..50a27f21f8d48 100644 --- a/expression/evaluator_test.go +++ b/expression/evaluator_test.go @@ -20,103 +20,23 @@ import ( "time" . "github.com/pingcap/check" - "github.com/pingcap/failpoint" - "github.com/pingcap/tidb/config" - "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/charset" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" - "github.com/pingcap/tidb/util/mock" - "github.com/pingcap/tidb/util/testleak" - "github.com/pingcap/tidb/util/testutil" - "github.com/pingcap/tidb/util/timeutil" - "github.com/tikv/client-go/v2/tikv" + "github.com/pingcap/tidb/util/collate" + "github.com/stretchr/testify/require" ) -var _ = SerialSuites(&testEvaluatorSerialSuites{}) -var _ = Suite(&testEvaluatorSuite{}) -var _ = Suite(&testVectorizeSuite1{}) -var _ = Suite(&testVectorizeSuite2{}) - func TestT(t *testing.T) { - config.UpdateGlobal(func(conf *config.Config) { - conf.TiKVClient.AsyncCommit.SafeWindow = 0 - conf.TiKVClient.AsyncCommit.AllowedClockDrift = 0 - }) - tikv.EnableFailpoints() - - testleak.BeforeTest() - defer testleak.AfterTestT(t)() - CustomVerboseFlag = true *CustomParallelSuiteFlag = true - - // Some test depends on the values of timeutil.SystemLocation() - // If we don't SetSystemTZ() here, the value would change unpredictable. - // Affectd by the order whether a testsuite runs before or after integration test. - // Note, SetSystemTZ() is a sync.Once operation. - timeutil.SetSystemTZ("system") - - fpname := "github.com/pingcap/tidb/expression/PanicIfPbCodeUnspecified" - err := failpoint.Enable(fpname, "return(true)") - if err != nil { - t.Fatalf("enable global failpoint `%s` failed: %v", fpname, err) - } - TestingT(t) - - err = failpoint.Disable(fpname) - if err != nil { - t.Fatalf("disable global failpoint `%s` failed: %v", fpname, err) - } -} - -type testEvaluatorSuiteBase struct { - *parser.Parser - ctx sessionctx.Context -} - -type testEvaluatorSuite struct { - testEvaluatorSuiteBase -} - -type testVectorizeSuite1 struct { - testEvaluatorSuiteBase } -type testVectorizeSuite2 struct { - testEvaluatorSuiteBase -} - -type testEvaluatorSerialSuites struct { - testEvaluatorSuiteBase -} - -func (s *testEvaluatorSuiteBase) SetUpSuite(c *C) { - s.Parser = parser.New() -} - -func (s *testEvaluatorSuiteBase) TearDownSuite(c *C) { -} - -func (s *testEvaluatorSuiteBase) SetUpTest(c *C) { - s.ctx = mock.NewContext() - s.ctx.GetSessionVars().StmtCtx.TimeZone = time.Local - sc := s.ctx.GetSessionVars().StmtCtx - sc.TruncateAsWarning = true - err := s.ctx.GetSessionVars().SetSystemVar("max_allowed_packet", "67108864") - c.Assert(err, IsNil) - s.ctx.GetSessionVars().PlanColumnID = 0 -} - -func (s *testEvaluatorSuiteBase) TearDownTest(c *C) { - s.ctx.GetSessionVars().StmtCtx.SetWarnings(nil) -} - -func (s *testEvaluatorSuiteBase) kindToFieldType(kind byte) types.FieldType { +func kindToFieldType(kind byte) types.FieldType { ft := types.FieldType{} switch kind { case types.KindNull: @@ -162,10 +82,10 @@ func (s *testEvaluatorSuiteBase) kindToFieldType(kind byte) types.FieldType { return ft } -func (s *testEvaluatorSuiteBase) datumsToConstants(datums []types.Datum) []Expression { +func datumsToConstants(datums []types.Datum) []Expression { constants := make([]Expression, 0, len(datums)) for _, d := range datums { - ft := s.kindToFieldType(d.Kind()) + ft := kindToFieldType(d.Kind()) if types.IsNonBinaryStr(&ft) { ft.Collate = d.Collation() } @@ -175,67 +95,66 @@ func (s *testEvaluatorSuiteBase) datumsToConstants(datums []types.Datum) []Expre return constants } -func (s *testEvaluatorSuiteBase) primitiveValsToConstants(args []interface{}) []Expression { - cons := s.datumsToConstants(types.MakeDatums(args...)) - char, col := s.ctx.GetSessionVars().GetCharsetInfo() +func primitiveValsToConstants(ctx sessionctx.Context, args []interface{}) []Expression { + cons := datumsToConstants(types.MakeDatums(args...)) + char, col := ctx.GetSessionVars().GetCharsetInfo() for i, arg := range args { types.DefaultTypeForValue(arg, cons[i].GetType(), char, col) } return cons } -func (s *testEvaluatorSuite) TestSleep(c *C) { - ctx := mock.NewContext() +func TestSleep(t *testing.T) { + ctx := createContext(t) sessVars := ctx.GetSessionVars() fc := funcs[ast.Sleep] // non-strict model sessVars.StrictSQLMode = false d := make([]types.Datum, 1) - f, err := fc.getFunction(ctx, s.datumsToConstants(d)) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(d)) + require.NoError(t, err) ret, isNull, err := f.evalInt(chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(isNull, IsFalse) - c.Assert(ret, Equals, int64(0)) + require.NoError(t, err) + require.False(t, isNull) + require.Equal(t, int64(0), ret) d[0].SetInt64(-1) - f, err = fc.getFunction(ctx, s.datumsToConstants(d)) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(d)) + require.NoError(t, err) ret, isNull, err = f.evalInt(chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(isNull, IsFalse) - c.Assert(ret, Equals, int64(0)) + require.NoError(t, err) + require.False(t, isNull) + require.Equal(t, int64(0), ret) // for error case under the strict model sessVars.StrictSQLMode = true d[0].SetNull() - _, err = fc.getFunction(ctx, s.datumsToConstants(d)) - c.Assert(err, IsNil) + _, err = fc.getFunction(ctx, datumsToConstants(d)) + require.NoError(t, err) _, isNull, err = f.evalInt(chunk.Row{}) - c.Assert(err, NotNil) - c.Assert(isNull, IsFalse) + require.Error(t, err) + require.False(t, isNull) d[0].SetFloat64(-2.5) - _, err = fc.getFunction(ctx, s.datumsToConstants(d)) - c.Assert(err, IsNil) + _, err = fc.getFunction(ctx, datumsToConstants(d)) + require.NoError(t, err) _, isNull, err = f.evalInt(chunk.Row{}) - c.Assert(err, NotNil) - c.Assert(isNull, IsFalse) + require.Error(t, err) + require.False(t, isNull) // strict model d[0].SetFloat64(0.5) start := time.Now() - f, err = fc.getFunction(ctx, s.datumsToConstants(d)) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(d)) + require.NoError(t, err) ret, isNull, err = f.evalInt(chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(isNull, IsFalse) - c.Assert(ret, Equals, int64(0)) + require.NoError(t, err) + require.False(t, isNull) + require.Equal(t, int64(0), ret) sub := time.Since(start) - c.Assert(sub.Nanoseconds(), GreaterEqual, int64(0.5*1e9)) - + require.GreaterOrEqual(t, sub.Nanoseconds(), int64(0.5*1e9)) d[0].SetFloat64(3) - f, err = fc.getFunction(ctx, s.datumsToConstants(d)) - c.Assert(err, IsNil) + f, err = fc.getFunction(ctx, datumsToConstants(d)) + require.NoError(t, err) start = time.Now() go func() { time.Sleep(1 * time.Second) @@ -243,14 +162,14 @@ func (s *testEvaluatorSuite) TestSleep(c *C) { }() ret, isNull, err = f.evalInt(chunk.Row{}) sub = time.Since(start) - c.Assert(err, IsNil) - c.Assert(isNull, IsFalse) - c.Assert(ret, Equals, int64(1)) - c.Assert(sub.Nanoseconds(), LessEqual, int64(2*1e9)) - c.Assert(sub.Nanoseconds(), GreaterEqual, int64(1*1e9)) + require.NoError(t, err) + require.False(t, isNull) + require.Equal(t, int64(1), ret) + require.LessOrEqual(t, sub.Nanoseconds(), int64(2*1e9)) + require.GreaterOrEqual(t, sub.Nanoseconds(), int64(1*1e9)) } -func (s *testEvaluatorSuite) TestBinopComparison(c *C) { +func TestBinopComparison(t *testing.T) { tbl := []struct { lhs interface{} op string @@ -286,15 +205,16 @@ func (s *testEvaluatorSuite) TestBinopComparison(c *C) { {1, ast.LT, 1, 0}, {1, ast.LE, 1, 1}, } - for _, t := range tbl { - fc := funcs[t.op] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(t.lhs, t.rhs))) - c.Assert(err, IsNil) + ctx := createContext(t) + for _, tt := range tbl { + fc := funcs[tt.op] + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(tt.lhs, tt.rhs))) + require.NoError(t, err) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - val, err := v.ToBool(s.ctx.GetSessionVars().StmtCtx) - c.Assert(err, IsNil) - c.Assert(val, Equals, t.result) + require.NoError(t, err) + val, err := v.ToBool(ctx.GetSessionVars().StmtCtx) + require.NoError(t, err) + require.Equal(t, tt.result, val) } // test nil @@ -317,17 +237,17 @@ func (s *testEvaluatorSuite) TestBinopComparison(c *C) { {nil, ast.GE, 1}, } - for _, t := range nilTbl { - fc := funcs[t.op] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(t.lhs, t.rhs))) - c.Assert(err, IsNil) + for _, tt := range nilTbl { + fc := funcs[tt.op] + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(tt.lhs, tt.rhs))) + require.NoError(t, err) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.Kind(), Equals, types.KindNull) + require.NoError(t, err) + require.Equal(t, types.KindNull, v.Kind()) } } -func (s *testEvaluatorSuite) TestBinopLogic(c *C) { +func TestBinopLogic(t *testing.T) { tbl := []struct { lhs interface{} op string @@ -350,22 +270,23 @@ func (s *testEvaluatorSuite) TestBinopLogic(c *C) { {0, ast.LogicXor, 0, 0}, {0, ast.LogicXor, 1, 1}, } - for _, t := range tbl { - fc := funcs[t.op] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(t.lhs, t.rhs))) - c.Assert(err, IsNil) + ctx := createContext(t) + for _, tt := range tbl { + fc := funcs[tt.op] + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(tt.lhs, tt.rhs))) + require.NoError(t, err) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - switch x := t.ret.(type) { + require.NoError(t, err) + switch x := tt.ret.(type) { case nil: - c.Assert(v.Kind(), Equals, types.KindNull) + require.Equal(t, types.KindNull, v.Kind()) case int: - c.Assert(v, testutil.DatumEquals, types.NewDatum(int64(x))) + require.Equal(t, v, types.NewDatum(int64(x))) } } } -func (s *testEvaluatorSuite) TestBinopBitop(c *C) { +func TestBinopBitop(t *testing.T) { tbl := []struct { lhs interface{} op string @@ -385,23 +306,24 @@ func (s *testEvaluatorSuite) TestBinopBitop(c *C) { {nil, ast.RightShift, 1, nil}, } - for _, t := range tbl { - fc := funcs[t.op] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(t.lhs, t.rhs))) - c.Assert(err, IsNil) + ctx := createContext(t) + for _, tt := range tbl { + fc := funcs[tt.op] + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(tt.lhs, tt.rhs))) + require.NoError(t, err) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) - switch x := t.ret.(type) { + switch x := tt.ret.(type) { case nil: - c.Assert(v.Kind(), Equals, types.KindNull) + require.Equal(t, types.KindNull, v.Kind()) case int: - c.Assert(v, testutil.DatumEquals, types.NewDatum(uint64(x))) + require.Equal(t, v, types.NewDatum(uint64(x))) } } } -func (s *testEvaluatorSuite) TestBinopNumeric(c *C) { +func TestBinopNumeric(t *testing.T) { tbl := []struct { lhs interface{} op string @@ -478,24 +400,25 @@ func (s *testEvaluatorSuite) TestBinopNumeric(c *C) { {types.NewDecFromInt(10), ast.Mod, 0, nil}, } - for _, t := range tbl { - fc := funcs[t.op] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(t.lhs, t.rhs))) - c.Assert(err, IsNil) + ctx := createContext(t) + for _, tt := range tbl { + fc := funcs[tt.op] + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(tt.lhs, tt.rhs))) + require.NoError(t, err) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) switch v.Kind() { case types.KindNull: - c.Assert(t.ret, IsNil) + require.Nil(t, tt.ret) default: // we use float64 as the result type check for all. - sc := s.ctx.GetSessionVars().StmtCtx + sc := ctx.GetSessionVars().StmtCtx f, err := v.ToFloat64(sc) - c.Assert(err, IsNil) - d := types.NewDatum(t.ret) + require.NoError(t, err) + d := types.NewDatum(tt.ret) r, err := d.ToFloat64(sc) - c.Assert(err, IsNil) - c.Assert(r, Equals, f) + require.NoError(t, err) + require.Equal(t, r, f) } } @@ -521,38 +444,30 @@ func (s *testEvaluatorSuite) TestBinopNumeric(c *C) { {types.NewDecFromInt(10), ast.Mod, 0}, } - oldInSelectStmt := s.ctx.GetSessionVars().StmtCtx.InSelectStmt - s.ctx.GetSessionVars().StmtCtx.InSelectStmt = false - oldSQLMode := s.ctx.GetSessionVars().SQLMode - s.ctx.GetSessionVars().SQLMode |= mysql.ModeErrorForDivisionByZero - oldInInsertStmt := s.ctx.GetSessionVars().StmtCtx.InInsertStmt - s.ctx.GetSessionVars().StmtCtx.InInsertStmt = true - for _, t := range testcases { - fc := funcs[t.op] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(t.lhs, t.rhs))) - c.Assert(err, IsNil) + ctx.GetSessionVars().StmtCtx.InSelectStmt = false + ctx.GetSessionVars().SQLMode |= mysql.ModeErrorForDivisionByZero + ctx.GetSessionVars().StmtCtx.InInsertStmt = true + for _, tt := range testcases { + fc := funcs[tt.op] + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(tt.lhs, tt.rhs))) + require.NoError(t, err) _, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, NotNil) + require.Error(t, err) } - oldDividedByZeroAsWarning := s.ctx.GetSessionVars().StmtCtx.DividedByZeroAsWarning - s.ctx.GetSessionVars().StmtCtx.DividedByZeroAsWarning = true - for _, t := range testcases { - fc := funcs[t.op] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(t.lhs, t.rhs))) - c.Assert(err, IsNil) + ctx.GetSessionVars().StmtCtx.DividedByZeroAsWarning = true + for _, tt := range testcases { + fc := funcs[tt.op] + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(tt.lhs, tt.rhs))) + require.NoError(t, err) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.Kind(), Equals, types.KindNull) + require.NoError(t, err) + require.Equal(t, types.KindNull, v.Kind()) } - - s.ctx.GetSessionVars().StmtCtx.InSelectStmt = oldInSelectStmt - s.ctx.GetSessionVars().SQLMode = oldSQLMode - s.ctx.GetSessionVars().StmtCtx.InInsertStmt = oldInInsertStmt - s.ctx.GetSessionVars().StmtCtx.DividedByZeroAsWarning = oldDividedByZeroAsWarning } -func (s *testEvaluatorSuite) TestExtract(c *C) { +func TestExtract(t *testing.T) { + ctx := createContext(t) str := "2011-11-11 10:10:10.123456" tbl := []struct { Unit string @@ -579,25 +494,26 @@ func (s *testEvaluatorSuite) TestExtract(c *C) { {"DAY_HOUR", 1110}, {"YEAR_MONTH", 201111}, } - for _, t := range tbl { + for _, tt := range tbl { fc := funcs[ast.Extract] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(t.Unit, str))) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(tt.Unit, str))) + require.NoError(t, err) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v, testutil.DatumEquals, types.NewDatum(t.Expect)) + require.NoError(t, err) + require.Equal(t, types.NewDatum(tt.Expect), v) } // Test nil fc := funcs[ast.Extract] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums("SECOND", nil))) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums("SECOND", nil))) + require.NoError(t, err) v, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.Kind(), Equals, types.KindNull) + require.NoError(t, err) + require.Equal(t, types.KindNull, v.Kind()) } -func (s *testEvaluatorSuite) TestUnaryOp(c *C) { +func TestUnaryOp(t *testing.T) { + ctx := createContext(t) tbl := []struct { arg interface{} op string @@ -618,7 +534,7 @@ func (s *testEvaluatorSuite) TestUnaryOp(c *C) { // test Minus. {nil, ast.UnaryMinus, nil}, - {float64(1.0), ast.UnaryMinus, float64(-1.0)}, + {1.0, ast.UnaryMinus, -1.0}, {int64(1), ast.UnaryMinus, int64(-1)}, {int64(1), ast.UnaryMinus, int64(-1)}, {uint64(1), ast.UnaryMinus, -int64(1)}, @@ -630,13 +546,13 @@ func (s *testEvaluatorSuite) TestUnaryOp(c *C) { {types.Enum{Name: "a", Value: 1}, ast.UnaryMinus, -1.0}, {types.Set{Name: "a", Value: 1}, ast.UnaryMinus, -1.0}, } - for i, t := range tbl { - fc := funcs[t.op] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(t.arg))) - c.Assert(err, IsNil) + for i, tt := range tbl { + fc := funcs[tt.op] + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(tt.arg))) + require.NoError(t, err) result, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(result, testutil.DatumEquals, types.NewDatum(t.result), Commentf("%d", i)) + require.NoError(t, err) + require.Equal(t, types.NewDatum(tt.result), result, Commentf("%d", i)) } tbl = []struct { @@ -649,36 +565,37 @@ func (s *testEvaluatorSuite) TestUnaryOp(c *C) { {types.NewTime(types.FromGoTime(time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC)), mysql.TypeDatetime, 0), ast.UnaryMinus, types.NewDecFromInt(-20091110230000)}, } - for _, t := range tbl { - fc := funcs[t.op] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(t.arg))) - c.Assert(err, IsNil) - c.Assert(f, NotNil) + for _, tt := range tbl { + fc := funcs[tt.op] + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(tt.arg))) + require.NoError(t, err) + require.NotNil(t, f) result, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) + require.NoError(t, err) - expect := types.NewDatum(t.result) - ret, err := result.CompareDatum(s.ctx.GetSessionVars().StmtCtx, &expect) - c.Assert(err, IsNil) - c.Assert(ret, Equals, 0, Commentf("%v %s", t.arg, t.op)) + expect := types.NewDatum(tt.result) + ret, err := result.Compare(ctx.GetSessionVars().StmtCtx, &expect, collate.GetBinaryCollator()) + require.NoError(t, err) + require.Equal(t, 0, ret, Commentf("%v %s", tt.arg, tt.op)) } } -func (s *testEvaluatorSuite) TestMod(c *C) { +func TestMod(t *testing.T) { + ctx := createContext(t) fc := funcs[ast.Mod] - f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(234, 10))) - c.Assert(err, IsNil) + f, err := fc.getFunction(ctx, datumsToConstants(types.MakeDatums(234, 10))) + require.NoError(t, err) r, err := evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(r, testutil.DatumEquals, types.NewIntDatum(4)) - f, err = fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(29, 9))) - c.Assert(err, IsNil) + require.NoError(t, err) + require.Equal(t, types.NewIntDatum(4), r) + f, err = fc.getFunction(ctx, datumsToConstants(types.MakeDatums(29, 9))) + require.NoError(t, err) r, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(r, testutil.DatumEquals, types.NewIntDatum(2)) - f, err = fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(34.5, 3))) - c.Assert(err, IsNil) + require.NoError(t, err) + require.Equal(t, types.NewIntDatum(2), r) + f, err = fc.getFunction(ctx, datumsToConstants(types.MakeDatums(34.5, 3))) + require.NoError(t, err) r, err = evalBuiltinFunc(f, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(r, testutil.DatumEquals, types.NewDatum(1.5)) + require.NoError(t, err) + require.Equal(t, types.NewDatum(1.5), r) } diff --git a/expression/expr_to_pb.go b/expression/expr_to_pb.go index d34f1b5125809..f6796b4c0517c 100644 --- a/expression/expr_to_pb.go +++ b/expression/expr_to_pb.go @@ -19,14 +19,12 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/parser/charset" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/codec" "github.com/pingcap/tidb/util/collate" - "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tipb/go-tipb" "go.uber.org/zap" @@ -38,15 +36,14 @@ func ExpressionsToPBList(sc *stmtctx.StatementContext, exprs []Expression, clien for _, expr := range exprs { v := pc.ExprToPB(expr) if v == nil { - return nil, dbterror.ClassOptimizer.NewStd(mysql.ErrInternal). - GenWithStack("expression %v cannot be pushed down", expr) + return nil, ErrInternal.GenWithStack("expression %v cannot be pushed down", expr) } pbExpr = append(pbExpr, v) } return } -// PbConverter supplys methods to convert TiDB expressions to TiPB. +// PbConverter supplies methods to convert TiDB expressions to TiPB. type PbConverter struct { client kv.Client sc *stmtctx.StatementContext @@ -159,7 +156,7 @@ func ToPBFieldType(ft *types.FieldType) *tipb.FieldType { Flen: int32(ft.Flen), Decimal: int32(ft.Decimal), Charset: ft.Charset, - Collate: collationToProto(ft.Collate), + Collate: collate.CollationToProto(ft.Collate), Elems: ft.Elems, } } @@ -172,39 +169,11 @@ func FieldTypeFromPB(ft *tipb.FieldType) *types.FieldType { Flen: int(ft.Flen), Decimal: int(ft.Decimal), Charset: ft.Charset, - Collate: protoToCollation(ft.Collate), + Collate: collate.ProtoToCollation(ft.Collate), Elems: ft.Elems, } } -func collationToProto(c string) int32 { - if coll, err := charset.GetCollationByName(c); err == nil { - return collate.RewriteNewCollationIDIfNeeded(int32(coll.ID)) - } - v := collate.RewriteNewCollationIDIfNeeded(int32(mysql.DefaultCollationID)) - logutil.BgLogger().Warn( - "Unable to get collation ID by name, use ID of the default collation instead", - zap.String("name", c), - zap.Int32("default collation ID", v), - zap.String("default collation", mysql.DefaultCollationName), - ) - return v -} - -func protoToCollation(c int32) string { - coll, err := charset.GetCollationByID(int(collate.RestoreCollationIDIfNeeded(c))) - if err == nil { - return coll.Name - } - logutil.BgLogger().Warn( - "Unable to get collation name from ID, use name of the default collation instead", - zap.Int32("id", c), - zap.Int("default collation ID", mysql.DefaultCollationID), - zap.String("default collation", mysql.DefaultCollationName), - ) - return mysql.DefaultCollationName -} - func (pc PbConverter) columnToPBExpr(column *Column) *tipb.Expr { if !pc.client.IsRequestTypeSupported(kv.ReqTypeSelect, int64(tipb.ExprType_ColumnRef)) { return nil @@ -274,7 +243,7 @@ func (pc PbConverter) scalarFuncToPBExpr(expr *ScalarFunction) *tipb.Expr { // put collation information into the RetType enforcedly and push it down to TiKV/MockTiKV tp := *expr.RetType if collate.NewCollationEnabled() { - _, tp.Collate = expr.CharsetAndCollation(expr.GetCtx()) + _, tp.Collate = expr.CharsetAndCollation() } // Construct expression ProtoBuf. diff --git a/expression/expr_to_pb_serial_test.go b/expression/expr_to_pb_serial_test.go new file mode 100644 index 0000000000000..624e5dcb90a23 --- /dev/null +++ b/expression/expr_to_pb_serial_test.go @@ -0,0 +1,233 @@ +// Copyright 2021 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, +// 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. + +package expression + +import ( + "encoding/json" + "fmt" + "strings" + "testing" + + "github.com/gogo/protobuf/proto" + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/parser/charset" + "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/sessionctx/stmtctx" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/collate" + "github.com/pingcap/tidb/util/mock" + "github.com/pingcap/tipb/go-tipb" + "github.com/stretchr/testify/require" +) + +func TestPushCollationDown(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + + fc, err := NewFunction(mock.NewContext(), ast.EQ, types.NewFieldType(mysql.TypeUnspecified), genColumn(mysql.TypeVarchar, 0), genColumn(mysql.TypeVarchar, 1)) + require.NoError(t, err) + client := new(mock.Client) + sc := new(stmtctx.StatementContext) + + tps := []*types.FieldType{types.NewFieldType(mysql.TypeVarchar), types.NewFieldType(mysql.TypeVarchar)} + for _, coll := range []string{charset.CollationBin, charset.CollationLatin1, charset.CollationUTF8, charset.CollationUTF8MB4} { + fc.SetCharsetAndCollation("binary", coll) // only collation matters + pbExpr, err := ExpressionsToPBList(sc, []Expression{fc}, client) + require.NoError(t, err) + expr, err := PBToExpr(pbExpr[0], tps, sc) + require.NoError(t, err) + _, eColl := expr.CharsetAndCollation() + require.Equal(t, coll, eColl) + } +} + +func columnCollation(c *Column, chs, coll string) *Column { + c.RetType.Charset = chs + c.RetType.Collate = coll + return c +} + +func TestNewCollationsEnabled(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + var colExprs []Expression + sc := new(stmtctx.StatementContext) + client := new(mock.Client) + + colExprs = colExprs[:0] + colExprs = append(colExprs, genColumn(mysql.TypeVarchar, 1)) + colExprs = append(colExprs, columnCollation(genColumn(mysql.TypeVarchar, 2), "some_invalid_charset", "some_invalid_collation")) + colExprs = append(colExprs, columnCollation(genColumn(mysql.TypeVarString, 3), "utf8mb4", "utf8mb4_general_ci")) + colExprs = append(colExprs, columnCollation(genColumn(mysql.TypeString, 4), "utf8mb4", "utf8mb4_0900_ai_ci")) + colExprs = append(colExprs, columnCollation(genColumn(mysql.TypeVarchar, 5), "utf8", "utf8_bin")) + colExprs = append(colExprs, columnCollation(genColumn(mysql.TypeVarchar, 6), "utf8", "utf8_unicode_ci")) + colExprs = append(colExprs, columnCollation(genColumn(mysql.TypeVarchar, 7), "utf8mb4", "utf8mb4_zh_pinyin_tidb_as_cs")) + pushed, _ := PushDownExprs(sc, colExprs, client, kv.UnSpecified) + require.Equal(t, len(colExprs), len(pushed)) + pbExprs, err := ExpressionsToPBList(sc, colExprs, client) + require.NoError(t, err) + jsons := []string{ + "{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":15,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-46,\"charset\":\"utf8mb4\"},\"has_distinct\":false}", + "{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":15,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-46,\"charset\":\"some_invalid_charset\"},\"has_distinct\":false}", + "{\"tp\":201,\"val\":\"gAAAAAAAAAM=\",\"sig\":0,\"field_type\":{\"tp\":253,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-45,\"charset\":\"utf8mb4\"},\"has_distinct\":false}", + "{\"tp\":201,\"val\":\"gAAAAAAAAAQ=\",\"sig\":0,\"field_type\":{\"tp\":254,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-255,\"charset\":\"utf8mb4\"},\"has_distinct\":false}", + "{\"tp\":201,\"val\":\"gAAAAAAAAAU=\",\"sig\":0,\"field_type\":{\"tp\":15,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-83,\"charset\":\"utf8\"},\"has_distinct\":false}", + "{\"tp\":201,\"val\":\"gAAAAAAAAAY=\",\"sig\":0,\"field_type\":{\"tp\":15,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-192,\"charset\":\"utf8\"},\"has_distinct\":false}", + "{\"tp\":201,\"val\":\"gAAAAAAAAAc=\",\"sig\":0,\"field_type\":{\"tp\":15,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-2048,\"charset\":\"utf8mb4\"},\"has_distinct\":false}", + } + for i, pbExpr := range pbExprs { + require.NotNil(t, pbExprs) + js, err := json.Marshal(pbExpr) + require.NoError(t, err) + require.Equalf(t, jsons[i], string(js), "%v\n", i) + } + + item := columnCollation(genColumn(mysql.TypeDouble, 0), "utf8mb4", "utf8mb4_0900_ai_ci") + pbByItem := GroupByItemToPB(sc, client, item) + js, err := json.Marshal(pbByItem) + require.NoError(t, err) + require.Equal(t, "{\"expr\":{\"tp\":201,\"val\":\"gAAAAAAAAAA=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-255,\"charset\":\"utf8mb4\"},\"has_distinct\":false},\"desc\":false}", string(js)) +} + +func TestMetadata(t *testing.T) { + sc := new(stmtctx.StatementContext) + client := new(mock.Client) + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/PushDownTestSwitcher", `return("all")`)) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/expression/PushDownTestSwitcher")) + }() + + pc := PbConverter{client: client, sc: sc} + + metadata := new(tipb.InUnionMetadata) + var err error + // InUnion flag is false in `BuildCastFunction` when `ScalarFuncSig_CastStringAsInt` + cast := BuildCastFunction(mock.NewContext(), genColumn(mysql.TypeString, 1), types.NewFieldType(mysql.TypeLonglong)) + require.Equal(t, &tipb.InUnionMetadata{InUnion: false}, cast.(*ScalarFunction).Function.metadata()) + expr := pc.ExprToPB(cast) + require.Equal(t, tipb.ScalarFuncSig_CastStringAsInt, expr.Sig) + require.Greater(t, len(expr.Val), 0) + err = proto.Unmarshal(expr.Val, metadata) + require.NoError(t, err) + require.Equal(t, false, metadata.InUnion) + + // InUnion flag is nil in `BuildCastFunction4Union` when `ScalarFuncSig_CastIntAsString` + castInUnion := BuildCastFunction4Union(mock.NewContext(), genColumn(mysql.TypeLonglong, 1), types.NewFieldType(mysql.TypeString)) + require.Nil(t, castInUnion.(*ScalarFunction).Function.metadata()) + expr = pc.ExprToPB(castInUnion) + require.Equal(t, tipb.ScalarFuncSig_CastIntAsString, expr.Sig) + require.Equal(t, 0, len(expr.Val)) + + // InUnion flag is true in `BuildCastFunction4Union` when `ScalarFuncSig_CastStringAsInt` + castInUnion = BuildCastFunction4Union(mock.NewContext(), genColumn(mysql.TypeString, 1), types.NewFieldType(mysql.TypeLonglong)) + require.Equal(t, &tipb.InUnionMetadata{InUnion: true}, castInUnion.(*ScalarFunction).Function.metadata()) + expr = pc.ExprToPB(castInUnion) + require.Equal(t, tipb.ScalarFuncSig_CastStringAsInt, expr.Sig) + require.Greater(t, len(expr.Val), 0) + err = proto.Unmarshal(expr.Val, metadata) + require.NoError(t, err) + require.Equal(t, true, metadata.InUnion) +} + +func TestPushDownSwitcher(t *testing.T) { + var funcs = make([]Expression, 0) + sc := new(stmtctx.StatementContext) + client := new(mock.Client) + + cases := []struct { + name string + sig tipb.ScalarFuncSig + enable bool + }{ + // Note that so far ScalarFuncSigs here are not be pushed down when the failpoint PushDownTestSwitcher + // is disable, which is the prerequisite to pass this test. + // Need to be replaced with other non pushed down ScalarFuncSigs if they are pushed down one day. + {ast.Sin, tipb.ScalarFuncSig_Sin, true}, + {ast.Cos, tipb.ScalarFuncSig_Cos, false}, + {ast.Tan, tipb.ScalarFuncSig_Tan, true}, + } + var enabled []string + for _, funcName := range cases { + args := []Expression{genColumn(mysql.TypeLong, 1)} + fc, err := NewFunction( + mock.NewContext(), + funcName.name, + types.NewFieldType(mysql.TypeUnspecified), + args..., + ) + require.NoError(t, err) + funcs = append(funcs, fc) + if funcName.enable { + enabled = append(enabled, funcName.name) + } + } + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/PushDownTestSwitcher", `return("all")`)) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/expression/PushDownTestSwitcher")) + }() + + pbExprs, err := ExpressionsToPBList(sc, funcs, client) + require.NoError(t, err) + require.Equal(t, len(cases), len(pbExprs)) + for i, pbExpr := range pbExprs { + require.Equalf(t, cases[i].sig, pbExpr.Sig, "function: %s, sig: %v", cases[i].name, cases[i].sig) + } + + // All disabled + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/PushDownTestSwitcher", `return("")`)) + pc := PbConverter{client: client, sc: sc} + for i := range funcs { + pbExpr := pc.ExprToPB(funcs[i]) + require.Nil(t, pbExpr) + } + + // Partial enabled + fpexpr := fmt.Sprintf(`return("%s")`, strings.Join(enabled, ",")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/PushDownTestSwitcher", fpexpr)) + for i := range funcs { + pbExpr := pc.ExprToPB(funcs[i]) + if !cases[i].enable { + require.Nil(t, pbExpr) + continue + } + require.Equalf(t, cases[i].sig, pbExpr.Sig, "function: %s, sig: %v", cases[i].name, cases[i].sig) + } +} + +func TestPanicIfPbCodeUnspecified(t *testing.T) { + + args := []Expression{genColumn(mysql.TypeLong, 1), genColumn(mysql.TypeLong, 2)} + fc, err := NewFunction( + mock.NewContext(), + ast.And, + types.NewFieldType(mysql.TypeUnspecified), + args..., + ) + require.NoError(t, err) + fn := fc.(*ScalarFunction) + fn.Function.setPbCode(tipb.ScalarFuncSig_Unspecified) + require.Equal(t, tipb.ScalarFuncSig_Unspecified, fn.Function.PbCode()) + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/PanicIfPbCodeUnspecified", "return(true)")) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/expression/PanicIfPbCodeUnspecified")) + }() + pc := PbConverter{client: new(mock.Client), sc: new(stmtctx.StatementContext)} + require.PanicsWithError(t, "unspecified PbCode: *expression.builtinBitAndSig", func() { pc.ExprToPB(fn) }) +} diff --git a/expression/expr_to_pb_test.go b/expression/expr_to_pb_test.go index 0a77859b52c77..414ef26f7ebdb 100644 --- a/expression/expr_to_pb_test.go +++ b/expression/expr_to_pb_test.go @@ -16,27 +16,20 @@ package expression import ( "encoding/json" - "fmt" - "strings" + "testing" - "github.com/gogo/protobuf/proto" - . "github.com/pingcap/check" - "github.com/pingcap/failpoint" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/charset" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tipb/go-tipb" + "github.com/stretchr/testify/require" ) -type dataGen4Expr2PbTest struct { -} - -func (dg *dataGen4Expr2PbTest) genColumn(tp byte, id int64) *Column { +func genColumn(tp byte, id int64) *Column { return &Column{ RetType: types.NewFieldType(tp), ID: id, @@ -44,8 +37,8 @@ func (dg *dataGen4Expr2PbTest) genColumn(tp byte, id int64) *Column { } } -func (s *testEvaluatorSuite) TestConstant2Pb(c *C) { - c.Skip("constant pb has changed") +func TestConstant2Pb(t *testing.T) { + t.Skip("constant pb has changed") var constExprs []Expression sc := new(stmtctx.StatementContext) client := new(mock.Client) @@ -53,61 +46,61 @@ func (s *testEvaluatorSuite) TestConstant2Pb(c *C) { // can be transformed constValue := new(Constant) constValue.Value = types.NewDatum(nil) - c.Assert(constValue.Value.Kind(), Equals, types.KindNull) + require.Equal(t, types.KindNull, constValue.Value.Kind()) constExprs = append(constExprs, constValue) constValue = new(Constant) constValue.Value = types.NewDatum(int64(100)) - c.Assert(constValue.Value.Kind(), Equals, types.KindInt64) + require.Equal(t, types.KindInt64, constValue.Value.Kind()) constExprs = append(constExprs, constValue) constValue = new(Constant) constValue.Value = types.NewDatum(uint64(100)) - c.Assert(constValue.Value.Kind(), Equals, types.KindUint64) + require.Equal(t, types.KindUint64, constValue.Value.Kind()) constExprs = append(constExprs, constValue) constValue = new(Constant) constValue.Value = types.NewDatum("100") - c.Assert(constValue.Value.Kind(), Equals, types.KindString) + require.Equal(t, types.KindString, constValue.Value.Kind()) constExprs = append(constExprs, constValue) constValue = new(Constant) constValue.Value = types.NewDatum([]byte{'1', '2', '4', 'c'}) - c.Assert(constValue.Value.Kind(), Equals, types.KindBytes) + require.Equal(t, types.KindBytes, constValue.Value.Kind()) constExprs = append(constExprs, constValue) constValue = new(Constant) constValue.Value = types.NewDatum(types.NewDecFromInt(110)) - c.Assert(constValue.Value.Kind(), Equals, types.KindMysqlDecimal) + require.Equal(t, types.KindMysqlDecimal, constValue.Value.Kind()) constExprs = append(constExprs, constValue) constValue = new(Constant) constValue.Value = types.NewDatum(types.Duration{}) - c.Assert(constValue.Value.Kind(), Equals, types.KindMysqlDuration) + require.Equal(t, types.KindMysqlDuration, constValue.Value.Kind()) constExprs = append(constExprs, constValue) // can not be transformed constValue = new(Constant) constValue.Value = types.NewDatum(float32(100)) - c.Assert(constValue.Value.Kind(), Equals, types.KindFloat32) + require.Equal(t, types.KindFloat32, constValue.Value.Kind()) constExprs = append(constExprs, constValue) constValue = new(Constant) constValue.Value = types.NewDatum(float64(100)) - c.Assert(constValue.Value.Kind(), Equals, types.KindFloat64) + require.Equal(t, types.KindFloat64, constValue.Value.Kind()) constExprs = append(constExprs, constValue) constValue = new(Constant) constValue.Value = types.NewDatum(types.Enum{Name: "A", Value: 19}) - c.Assert(constValue.Value.Kind(), Equals, types.KindMysqlEnum) + require.Equal(t, types.KindMysqlEnum, constValue.Value.Kind()) constExprs = append(constExprs, constValue) pushed, remained := PushDownExprs(sc, constExprs, client, kv.UnSpecified) - c.Assert(len(pushed), Equals, len(constExprs)-3) - c.Assert(len(remained), Equals, 3) + require.Len(t, pushed, len(constExprs)-3) + require.Len(t, remained, 3) pbExprs, err := ExpressionsToPBList(sc, constExprs, client) - c.Assert(err, IsNil) + require.NoError(t, err) jsons := []string{ "{\"tp\":0,\"sig\":0}", "{\"tp\":1,\"val\":\"gAAAAAAAAGQ=\",\"sig\":0}", @@ -120,64 +113,63 @@ func (s *testEvaluatorSuite) TestConstant2Pb(c *C) { for i, pbExpr := range pbExprs { if i+3 < len(pbExprs) { js, err := json.Marshal(pbExpr) - c.Assert(err, IsNil) - c.Assert(string(js), Equals, jsons[i]) + require.NoError(t, err) + require.Equal(t, jsons[i], string(js)) } else { - c.Assert(pbExpr, IsNil) + require.Nil(t, pbExpr) } } } -func (s *testEvaluatorSuite) TestColumn2Pb(c *C) { +func TestColumn2Pb(t *testing.T) { var colExprs []Expression sc := new(stmtctx.StatementContext) client := new(mock.Client) - dg := new(dataGen4Expr2PbTest) - colExprs = append(colExprs, dg.genColumn(mysql.TypeBit, 1)) - colExprs = append(colExprs, dg.genColumn(mysql.TypeSet, 2)) - colExprs = append(colExprs, dg.genColumn(mysql.TypeGeometry, 4)) - colExprs = append(colExprs, dg.genColumn(mysql.TypeUnspecified, 5)) + colExprs = append(colExprs, genColumn(mysql.TypeBit, 1)) + colExprs = append(colExprs, genColumn(mysql.TypeSet, 2)) + colExprs = append(colExprs, genColumn(mysql.TypeGeometry, 4)) + colExprs = append(colExprs, genColumn(mysql.TypeUnspecified, 5)) pushed, remained := PushDownExprs(sc, colExprs, client, kv.UnSpecified) - c.Assert(len(pushed), Equals, 0) - c.Assert(len(remained), Equals, len(colExprs)) + require.Len(t, pushed, 0) + require.Len(t, remained, len(colExprs)) for _, col := range colExprs { // cannot be pushed down _, err := ExpressionsToPBList(sc, []Expression{col}, client) - c.Assert(err, NotNil) + require.Error(t, err) } colExprs = colExprs[:0] - colExprs = append(colExprs, dg.genColumn(mysql.TypeTiny, 1)) - colExprs = append(colExprs, dg.genColumn(mysql.TypeShort, 2)) - colExprs = append(colExprs, dg.genColumn(mysql.TypeLong, 3)) - colExprs = append(colExprs, dg.genColumn(mysql.TypeFloat, 4)) - colExprs = append(colExprs, dg.genColumn(mysql.TypeDouble, 5)) - colExprs = append(colExprs, dg.genColumn(mysql.TypeNull, 6)) - colExprs = append(colExprs, dg.genColumn(mysql.TypeTimestamp, 7)) - colExprs = append(colExprs, dg.genColumn(mysql.TypeLonglong, 8)) - colExprs = append(colExprs, dg.genColumn(mysql.TypeInt24, 9)) - colExprs = append(colExprs, dg.genColumn(mysql.TypeDate, 10)) - colExprs = append(colExprs, dg.genColumn(mysql.TypeDuration, 11)) - colExprs = append(colExprs, dg.genColumn(mysql.TypeDatetime, 12)) - colExprs = append(colExprs, dg.genColumn(mysql.TypeYear, 13)) - colExprs = append(colExprs, dg.genColumn(mysql.TypeVarchar, 15)) - colExprs = append(colExprs, dg.genColumn(mysql.TypeJSON, 16)) - colExprs = append(colExprs, dg.genColumn(mysql.TypeNewDecimal, 17)) - colExprs = append(colExprs, dg.genColumn(mysql.TypeTinyBlob, 18)) - colExprs = append(colExprs, dg.genColumn(mysql.TypeMediumBlob, 19)) - colExprs = append(colExprs, dg.genColumn(mysql.TypeLongBlob, 20)) - colExprs = append(colExprs, dg.genColumn(mysql.TypeBlob, 21)) - colExprs = append(colExprs, dg.genColumn(mysql.TypeVarString, 22)) - colExprs = append(colExprs, dg.genColumn(mysql.TypeString, 23)) - colExprs = append(colExprs, dg.genColumn(mysql.TypeEnum, 24)) + colExprs = append(colExprs, genColumn(mysql.TypeTiny, 1)) + colExprs = append(colExprs, genColumn(mysql.TypeShort, 2)) + colExprs = append(colExprs, genColumn(mysql.TypeLong, 3)) + colExprs = append(colExprs, genColumn(mysql.TypeFloat, 4)) + colExprs = append(colExprs, genColumn(mysql.TypeDouble, 5)) + colExprs = append(colExprs, genColumn(mysql.TypeNull, 6)) + colExprs = append(colExprs, genColumn(mysql.TypeTimestamp, 7)) + colExprs = append(colExprs, genColumn(mysql.TypeLonglong, 8)) + colExprs = append(colExprs, genColumn(mysql.TypeInt24, 9)) + colExprs = append(colExprs, genColumn(mysql.TypeDate, 10)) + colExprs = append(colExprs, genColumn(mysql.TypeDuration, 11)) + colExprs = append(colExprs, genColumn(mysql.TypeDatetime, 12)) + colExprs = append(colExprs, genColumn(mysql.TypeYear, 13)) + colExprs = append(colExprs, genColumn(mysql.TypeVarchar, 15)) + colExprs = append(colExprs, genColumn(mysql.TypeJSON, 16)) + colExprs = append(colExprs, genColumn(mysql.TypeNewDecimal, 17)) + colExprs = append(colExprs, genColumn(mysql.TypeTinyBlob, 18)) + colExprs = append(colExprs, genColumn(mysql.TypeMediumBlob, 19)) + colExprs = append(colExprs, genColumn(mysql.TypeLongBlob, 20)) + colExprs = append(colExprs, genColumn(mysql.TypeBlob, 21)) + colExprs = append(colExprs, genColumn(mysql.TypeVarString, 22)) + colExprs = append(colExprs, genColumn(mysql.TypeString, 23)) + colExprs = append(colExprs, genColumn(mysql.TypeEnum, 24)) pushed, remained = PushDownExprs(sc, colExprs, client, kv.UnSpecified) - c.Assert(len(pushed), Equals, len(colExprs)) - c.Assert(len(remained), Equals, 0) + require.Len(t, pushed, len(colExprs)) + require.Len(t, remained, 0) pbExprs, err := ExpressionsToPBList(sc, colExprs, client) - c.Assert(err, IsNil) + require.NoError(t, err) jsons := []string{ "{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":1,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}", "{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":2,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}", @@ -204,10 +196,10 @@ func (s *testEvaluatorSuite) TestColumn2Pb(c *C) { "{\"tp\":201,\"val\":\"gAAAAAAAABg=\",\"sig\":0,\"field_type\":{\"tp\":247,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}", } for i, pbExpr := range pbExprs { - c.Assert(pbExprs, NotNil) + require.NotNil(t, pbExprs) js, err := json.Marshal(pbExpr) - c.Assert(err, IsNil) - c.Assert(string(js), Equals, jsons[i], Commentf("%v\n", i)) + require.NoError(t, err) + require.Equalf(t, jsons[i], string(js), "%v\n", i) } for _, expr := range colExprs { @@ -216,30 +208,29 @@ func (s *testEvaluatorSuite) TestColumn2Pb(c *C) { } pushed, remained = PushDownExprs(sc, colExprs, client, kv.UnSpecified) - c.Assert(len(pushed), Equals, len(colExprs)) - c.Assert(len(remained), Equals, 0) + require.Len(t, pushed, len(colExprs)) + require.Len(t, remained, 0) } -func (s *testEvaluatorSuite) TestCompareFunc2Pb(c *C) { +func TestCompareFunc2Pb(t *testing.T) { var compareExprs = make([]Expression, 0) sc := new(stmtctx.StatementContext) client := new(mock.Client) - dg := new(dataGen4Expr2PbTest) funcNames := []string{ast.LT, ast.LE, ast.GT, ast.GE, ast.EQ, ast.NE, ast.NullEQ} for _, funcName := range funcNames { - fc, err := NewFunction(mock.NewContext(), funcName, types.NewFieldType(mysql.TypeUnspecified), dg.genColumn(mysql.TypeLonglong, 1), dg.genColumn(mysql.TypeLonglong, 2)) - c.Assert(err, IsNil) + fc, err := NewFunction(mock.NewContext(), funcName, types.NewFieldType(mysql.TypeUnspecified), genColumn(mysql.TypeLonglong, 1), genColumn(mysql.TypeLonglong, 2)) + require.NoError(t, err) compareExprs = append(compareExprs, fc) } pushed, remained := PushDownExprs(sc, compareExprs, client, kv.UnSpecified) - c.Assert(len(pushed), Equals, len(compareExprs)) - c.Assert(len(remained), Equals, 0) + require.Len(t, pushed, len(compareExprs)) + require.Len(t, remained, 0) pbExprs, err := ExpressionsToPBList(sc, compareExprs, client) - c.Assert(err, IsNil) - c.Assert(len(pbExprs), Equals, len(compareExprs)) + require.NoError(t, err) + require.Len(t, pbExprs, len(compareExprs)) jsons := []string{ "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}],\"sig\":100,\"field_type\":{\"tp\":8,\"flag\":524416,\"flen\":1,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}", "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}],\"sig\":110,\"field_type\":{\"tp\":8,\"flag\":524416,\"flen\":1,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}", @@ -250,14 +241,14 @@ func (s *testEvaluatorSuite) TestCompareFunc2Pb(c *C) { "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}],\"sig\":160,\"field_type\":{\"tp\":8,\"flag\":524416,\"flen\":1,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}", } for i, pbExpr := range pbExprs { - c.Assert(pbExprs, NotNil) + require.NotNil(t, pbExprs) js, err := json.Marshal(pbExpr) - c.Assert(err, IsNil) - c.Assert(string(js), Equals, jsons[i]) + require.NoError(t, err) + require.Equal(t, jsons[i], string(js)) } } -func (s *testEvaluatorSuite) TestLikeFunc2Pb(c *C) { +func TestLikeFunc2Pb(t *testing.T) { var likeFuncs []Expression sc := new(stmtctx.StatementContext) client := new(mock.Client) @@ -275,31 +266,30 @@ func (s *testEvaluatorSuite) TestLikeFunc2Pb(c *C) { ctx := mock.NewContext() retTp = types.NewFieldType(mysql.TypeUnspecified) fc, err := NewFunction(ctx, ast.Like, retTp, args[0], args[1], args[3]) - c.Assert(err, IsNil) + require.NoError(t, err) likeFuncs = append(likeFuncs, fc) fc, err = NewFunction(ctx, ast.Like, retTp, args[0], args[2], args[3]) - c.Assert(err, IsNil) + require.NoError(t, err) likeFuncs = append(likeFuncs, fc) pbExprs, err := ExpressionsToPBList(sc, likeFuncs, client) - c.Assert(err, IsNil) + require.NoError(t, err) results := []string{ `{"tp":10000,"children":[{"tp":5,"val":"c3RyaW5n","sig":0,"field_type":{"tp":254,"flag":1,"flen":-1,"decimal":-1,"collate":83,"charset":"utf8"},"has_distinct":false},{"tp":5,"val":"cGF0dGVybg==","sig":0,"field_type":{"tp":254,"flag":1,"flen":-1,"decimal":-1,"collate":83,"charset":"utf8"},"has_distinct":false},{"tp":10000,"val":"CAA=","children":[{"tp":5,"val":"XA==","sig":0,"field_type":{"tp":254,"flag":1,"flen":-1,"decimal":-1,"collate":83,"charset":"utf8"},"has_distinct":false}],"sig":30,"field_type":{"tp":8,"flag":128,"flen":-1,"decimal":0,"collate":63,"charset":"binary"},"has_distinct":false}],"sig":4310,"field_type":{"tp":8,"flag":524416,"flen":1,"decimal":0,"collate":63,"charset":"binary"},"has_distinct":false}`, `{"tp":10000,"children":[{"tp":5,"val":"c3RyaW5n","sig":0,"field_type":{"tp":254,"flag":1,"flen":-1,"decimal":-1,"collate":83,"charset":"utf8"},"has_distinct":false},{"tp":5,"val":"JWFiYyU=","sig":0,"field_type":{"tp":254,"flag":1,"flen":-1,"decimal":-1,"collate":83,"charset":"utf8"},"has_distinct":false},{"tp":10000,"val":"CAA=","children":[{"tp":5,"val":"XA==","sig":0,"field_type":{"tp":254,"flag":1,"flen":-1,"decimal":-1,"collate":83,"charset":"utf8"},"has_distinct":false}],"sig":30,"field_type":{"tp":8,"flag":128,"flen":-1,"decimal":0,"collate":63,"charset":"binary"},"has_distinct":false}],"sig":4310,"field_type":{"tp":8,"flag":524416,"flen":1,"decimal":0,"collate":63,"charset":"binary"},"has_distinct":false}`, } for i, pbExpr := range pbExprs { js, err := json.Marshal(pbExpr) - c.Assert(err, IsNil) - c.Assert(string(js), Equals, results[i]) + require.NoError(t, err) + require.Equal(t, results[i], string(js)) } } -func (s *testEvaluatorSuite) TestArithmeticalFunc2Pb(c *C) { +func TestArithmeticalFunc2Pb(t *testing.T) { var arithmeticalFuncs = make([]Expression, 0) sc := new(stmtctx.StatementContext) client := new(mock.Client) - dg := new(dataGen4Expr2PbTest) funcNames := []string{ast.Plus, ast.Minus, ast.Mul, ast.Div} for _, funcName := range funcNames { @@ -307,9 +297,9 @@ func (s *testEvaluatorSuite) TestArithmeticalFunc2Pb(c *C) { mock.NewContext(), funcName, types.NewFieldType(mysql.TypeUnspecified), - dg.genColumn(mysql.TypeDouble, 1), - dg.genColumn(mysql.TypeDouble, 2)) - c.Assert(err, IsNil) + genColumn(mysql.TypeDouble, 1), + genColumn(mysql.TypeDouble, 2)) + require.NoError(t, err) arithmeticalFuncs = append(arithmeticalFuncs, fc) } @@ -321,12 +311,12 @@ func (s *testEvaluatorSuite) TestArithmeticalFunc2Pb(c *C) { jsons[ast.Mod] = "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}],\"sig\":215,\"field_type\":{\"tp\":5,\"flag\":128,\"flen\":23,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}" pbExprs, err := ExpressionsToPBList(sc, arithmeticalFuncs, client) - c.Assert(err, IsNil) + require.NoError(t, err) for i, pbExpr := range pbExprs { - c.Assert(pbExpr, NotNil) + require.NotNil(t, pbExpr) js, err := json.Marshal(pbExpr) - c.Assert(err, IsNil) - c.Assert(string(js), Equals, jsons[funcNames[i]], Commentf("%v\n", funcNames[i])) + require.NoError(t, err) + require.Equalf(t, jsons[funcNames[i]], string(js), "%v\n", funcNames[i]) } funcNames = []string{ast.IntDiv} // cannot be pushed down @@ -335,45 +325,44 @@ func (s *testEvaluatorSuite) TestArithmeticalFunc2Pb(c *C) { mock.NewContext(), funcName, types.NewFieldType(mysql.TypeUnspecified), - dg.genColumn(mysql.TypeDouble, 1), - dg.genColumn(mysql.TypeDouble, 2)) - c.Assert(err, IsNil) + genColumn(mysql.TypeDouble, 1), + genColumn(mysql.TypeDouble, 2)) + require.NoError(t, err) _, err = ExpressionsToPBList(sc, []Expression{fc}, client) - c.Assert(err, NotNil) + require.Error(t, err) } } -func (s *testEvaluatorSuite) TestDateFunc2Pb(c *C) { +func TestDateFunc2Pb(t *testing.T) { sc := new(stmtctx.StatementContext) client := new(mock.Client) - dg := new(dataGen4Expr2PbTest) + fc, err := NewFunction( mock.NewContext(), ast.DateFormat, types.NewFieldType(mysql.TypeUnspecified), - dg.genColumn(mysql.TypeDatetime, 1), - dg.genColumn(mysql.TypeString, 2)) - c.Assert(err, IsNil) + genColumn(mysql.TypeDatetime, 1), + genColumn(mysql.TypeString, 2)) + require.NoError(t, err) funcs := []Expression{fc} pbExprs, err := ExpressionsToPBList(sc, funcs, client) - c.Assert(err, IsNil) - c.Assert(pbExprs[0], NotNil) + require.NoError(t, err) + require.NotNil(t, pbExprs[0]) js, err := json.Marshal(pbExprs[0]) - c.Assert(err, IsNil) - c.Assert(string(js), Equals, "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":12,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":254,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":46,\"charset\":\"utf8mb4\"},\"has_distinct\":false}],\"sig\":6001,\"field_type\":{\"tp\":253,\"flag\":0,\"flen\":0,\"decimal\":-1,\"collate\":46,\"charset\":\"utf8mb4\"},\"has_distinct\":false}") + require.NoError(t, err) + require.Equal(t, "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":12,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":254,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":46,\"charset\":\"utf8mb4\"},\"has_distinct\":false}],\"sig\":6001,\"field_type\":{\"tp\":253,\"flag\":0,\"flen\":0,\"decimal\":-1,\"collate\":46,\"charset\":\"utf8mb4\"},\"has_distinct\":false}", string(js)) } -func (s *testEvaluatorSuite) TestLogicalFunc2Pb(c *C) { +func TestLogicalFunc2Pb(t *testing.T) { var logicalFuncs = make([]Expression, 0) sc := new(stmtctx.StatementContext) client := new(mock.Client) - dg := new(dataGen4Expr2PbTest) funcNames := []string{ast.LogicAnd, ast.LogicOr, ast.LogicXor, ast.UnaryNot} for i, funcName := range funcNames { - args := []Expression{dg.genColumn(mysql.TypeTiny, 1)} + args := []Expression{genColumn(mysql.TypeTiny, 1)} if i+1 < len(funcNames) { - args = append(args, dg.genColumn(mysql.TypeTiny, 2)) + args = append(args, genColumn(mysql.TypeTiny, 2)) } fc, err := NewFunction( mock.NewContext(), @@ -381,12 +370,12 @@ func (s *testEvaluatorSuite) TestLogicalFunc2Pb(c *C) { types.NewFieldType(mysql.TypeUnspecified), args..., ) - c.Assert(err, IsNil) + require.NoError(t, err) logicalFuncs = append(logicalFuncs, fc) } pbExprs, err := ExpressionsToPBList(sc, logicalFuncs, client) - c.Assert(err, IsNil) + require.NoError(t, err) jsons := []string{ "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":1,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":1,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}],\"sig\":3101,\"field_type\":{\"tp\":8,\"flag\":524416,\"flen\":1,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}", "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":1,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":1,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}],\"sig\":3102,\"field_type\":{\"tp\":8,\"flag\":524416,\"flen\":1,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}", @@ -395,22 +384,21 @@ func (s *testEvaluatorSuite) TestLogicalFunc2Pb(c *C) { } for i, pbExpr := range pbExprs { js, err := json.Marshal(pbExpr) - c.Assert(err, IsNil) - c.Assert(string(js), Equals, jsons[i]) + require.NoError(t, err) + require.Equal(t, jsons[i], string(js)) } } -func (s *testEvaluatorSuite) TestBitwiseFunc2Pb(c *C) { +func TestBitwiseFunc2Pb(t *testing.T) { var bitwiseFuncs = make([]Expression, 0) sc := new(stmtctx.StatementContext) client := new(mock.Client) - dg := new(dataGen4Expr2PbTest) funcNames := []string{ast.And, ast.Or, ast.Xor, ast.LeftShift, ast.RightShift, ast.BitNeg} for i, funcName := range funcNames { - args := []Expression{dg.genColumn(mysql.TypeLong, 1)} + args := []Expression{genColumn(mysql.TypeLong, 1)} if i+1 < len(funcNames) { - args = append(args, dg.genColumn(mysql.TypeLong, 2)) + args = append(args, genColumn(mysql.TypeLong, 2)) } fc, err := NewFunction( mock.NewContext(), @@ -418,12 +406,12 @@ func (s *testEvaluatorSuite) TestBitwiseFunc2Pb(c *C) { types.NewFieldType(mysql.TypeUnspecified), args..., ) - c.Assert(err, IsNil) + require.NoError(t, err) bitwiseFuncs = append(bitwiseFuncs, fc) } pbExprs, err := ExpressionsToPBList(sc, bitwiseFuncs, client) - c.Assert(err, IsNil) + require.NoError(t, err) jsons := []string{ "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}],\"sig\":3118,\"field_type\":{\"tp\":8,\"flag\":160,\"flen\":20,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}", "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}],\"sig\":3119,\"field_type\":{\"tp\":8,\"flag\":160,\"flen\":20,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}", @@ -434,99 +422,15 @@ func (s *testEvaluatorSuite) TestBitwiseFunc2Pb(c *C) { } for i, pbExpr := range pbExprs { js, err := json.Marshal(pbExpr) - c.Assert(err, IsNil) - c.Assert(string(js), Equals, jsons[i]) - } -} - -func (s *testEvaluatorSerialSuites) TestPanicIfPbCodeUnspecified(c *C) { - dg := new(dataGen4Expr2PbTest) - args := []Expression{dg.genColumn(mysql.TypeLong, 1), dg.genColumn(mysql.TypeLong, 2)} - fc, err := NewFunction( - mock.NewContext(), - ast.And, - types.NewFieldType(mysql.TypeUnspecified), - args..., - ) - c.Assert(err, IsNil) - fn := fc.(*ScalarFunction) - fn.Function.setPbCode(tipb.ScalarFuncSig_Unspecified) - c.Assert(fn.Function.PbCode(), Equals, tipb.ScalarFuncSig_Unspecified) - - pc := PbConverter{client: new(mock.Client), sc: new(stmtctx.StatementContext)} - c.Assert(func() { pc.ExprToPB(fn) }, PanicMatches, "unspecified PbCode: .*") -} - -func (s *testEvaluatorSerialSuites) TestPushDownSwitcher(c *C) { - var funcs = make([]Expression, 0) - sc := new(stmtctx.StatementContext) - client := new(mock.Client) - dg := new(dataGen4Expr2PbTest) - - cases := []struct { - name string - sig tipb.ScalarFuncSig - enable bool - }{ - // Note that so far ScalarFuncSigs here are not be pushed down when the failpoint PushDownTestSwitcher - // is disable, which is the prerequisite to pass this test. - // Need to be replaced with other non pushed down ScalarFuncSigs if they are pushed down one day. - {ast.Sin, tipb.ScalarFuncSig_Sin, true}, - {ast.Cos, tipb.ScalarFuncSig_Cos, false}, - {ast.Tan, tipb.ScalarFuncSig_Tan, true}, - } - var enabled []string - for _, funcName := range cases { - args := []Expression{dg.genColumn(mysql.TypeLong, 1)} - fc, err := NewFunction( - mock.NewContext(), - funcName.name, - types.NewFieldType(mysql.TypeUnspecified), - args..., - ) - c.Assert(err, IsNil) - funcs = append(funcs, fc) - if funcName.enable { - enabled = append(enabled, funcName.name) - } - } - - c.Assert(failpoint.Enable("github.com/pingcap/tidb/expression/PushDownTestSwitcher", `return("all")`), IsNil) - defer func() { c.Assert(failpoint.Disable("github.com/pingcap/tidb/expression/PushDownTestSwitcher"), IsNil) }() - - pbExprs, err := ExpressionsToPBList(sc, funcs, client) - c.Assert(err, IsNil) - c.Assert(len(pbExprs), Equals, len(cases)) - for i, pbExpr := range pbExprs { - c.Assert(pbExpr.Sig, Equals, cases[i].sig, Commentf("function: %s, sig: %v", cases[i].name, cases[i].sig)) - } - - // All disabled - c.Assert(failpoint.Enable("github.com/pingcap/tidb/expression/PushDownTestSwitcher", `return("")`), IsNil) - pc := PbConverter{client: client, sc: sc} - for i := range funcs { - pbExpr := pc.ExprToPB(funcs[i]) - c.Assert(pbExpr, IsNil, Commentf("function: %s, sig: %v", cases[i].name, cases[i].sig)) - } - - // Partial enabled - fpexpr := fmt.Sprintf(`return("%s")`, strings.Join(enabled, ",")) - c.Assert(failpoint.Enable("github.com/pingcap/tidb/expression/PushDownTestSwitcher", fpexpr), IsNil) - for i := range funcs { - pbExpr := pc.ExprToPB(funcs[i]) - if !cases[i].enable { - c.Assert(pbExpr, IsNil, Commentf("function: %s, sig: %v", cases[i].name, cases[i].sig)) - continue - } - c.Assert(pbExpr.Sig, Equals, cases[i].sig, Commentf("function: %s, sig: %v", cases[i].name, cases[i].sig)) + require.NoError(t, err) + require.Equal(t, jsons[i], string(js)) } } -func (s *testEvaluatorSuite) TestControlFunc2Pb(c *C) { +func TestControlFunc2Pb(t *testing.T) { var controlFuncs = make([]Expression, 0) sc := new(stmtctx.StatementContext) client := new(mock.Client) - dg := new(dataGen4Expr2PbTest) funcNames := []string{ ast.Case, @@ -534,10 +438,10 @@ func (s *testEvaluatorSuite) TestControlFunc2Pb(c *C) { ast.Ifnull, } for i, funcName := range funcNames { - args := []Expression{dg.genColumn(mysql.TypeLong, 1)} - args = append(args, dg.genColumn(mysql.TypeLong, 2)) + args := []Expression{genColumn(mysql.TypeLong, 1)} + args = append(args, genColumn(mysql.TypeLong, 2)) if i < 2 { - args = append(args, dg.genColumn(mysql.TypeLong, 3)) + args = append(args, genColumn(mysql.TypeLong, 3)) } fc, err := NewFunction( mock.NewContext(), @@ -545,12 +449,12 @@ func (s *testEvaluatorSuite) TestControlFunc2Pb(c *C) { types.NewFieldType(mysql.TypeUnspecified), args..., ) - c.Assert(err, IsNil) + require.NoError(t, err) controlFuncs = append(controlFuncs, fc) } pbExprs, err := ExpressionsToPBList(sc, controlFuncs, client) - c.Assert(err, IsNil) + require.NoError(t, err) jsons := []string{ "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAM=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}],\"sig\":4208,\"field_type\":{\"tp\":3,\"flag\":128,\"flen\":-1,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}", "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAM=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}],\"sig\":4107,\"field_type\":{\"tp\":3,\"flag\":128,\"flen\":24,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}", @@ -559,16 +463,15 @@ func (s *testEvaluatorSuite) TestControlFunc2Pb(c *C) { } for i, pbExpr := range pbExprs { js, err := json.Marshal(pbExpr) - c.Assert(err, IsNil) - c.Assert(string(js), Equals, jsons[i]) + require.NoError(t, err) + require.Equal(t, jsons[i], string(js)) } } -func (s *testEvaluatorSuite) TestOtherFunc2Pb(c *C) { +func TestOtherFunc2Pb(t *testing.T) { var otherFuncs = make([]Expression, 0) sc := new(stmtctx.StatementContext) client := new(mock.Client) - dg := new(dataGen4Expr2PbTest) funcNames := []string{ast.Coalesce, ast.IsNull} for _, funcName := range funcNames { @@ -576,87 +479,87 @@ func (s *testEvaluatorSuite) TestOtherFunc2Pb(c *C) { mock.NewContext(), funcName, types.NewFieldType(mysql.TypeUnspecified), - dg.genColumn(mysql.TypeLong, 1), + genColumn(mysql.TypeLong, 1), ) - c.Assert(err, IsNil) + require.NoError(t, err) otherFuncs = append(otherFuncs, fc) } pbExprs, err := ExpressionsToPBList(sc, otherFuncs, client) - c.Assert(err, IsNil) + require.NoError(t, err) jsons := map[string]string{ ast.Coalesce: "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}],\"sig\":4201,\"field_type\":{\"tp\":3,\"flag\":128,\"flen\":0,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}", ast.IsNull: "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}],\"sig\":3116,\"field_type\":{\"tp\":8,\"flag\":524416,\"flen\":1,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}", } for i, pbExpr := range pbExprs { js, err := json.Marshal(pbExpr) - c.Assert(err, IsNil) - c.Assert(string(js), Equals, jsons[funcNames[i]]) + require.NoError(t, err) + require.Equal(t, jsons[funcNames[i]], string(js)) } } -func (s *testEvaluatorSuite) TestExprPushDownToFlash(c *C) { +func TestExprPushDownToFlash(t *testing.T) { sc := new(stmtctx.StatementContext) client := new(mock.Client) - dg := new(dataGen4Expr2PbTest) + exprs := make([]Expression, 0) - jsonColumn := dg.genColumn(mysql.TypeJSON, 1) - intColumn := dg.genColumn(mysql.TypeLonglong, 2) - realColumn := dg.genColumn(mysql.TypeDouble, 3) - decimalColumn := dg.genColumn(mysql.TypeNewDecimal, 4) - stringColumn := dg.genColumn(mysql.TypeString, 5) - datetimeColumn := dg.genColumn(mysql.TypeDatetime, 6) - binaryStringColumn := dg.genColumn(mysql.TypeString, 7) + jsonColumn := genColumn(mysql.TypeJSON, 1) + intColumn := genColumn(mysql.TypeLonglong, 2) + realColumn := genColumn(mysql.TypeDouble, 3) + decimalColumn := genColumn(mysql.TypeNewDecimal, 4) + stringColumn := genColumn(mysql.TypeString, 5) + datetimeColumn := genColumn(mysql.TypeDatetime, 6) + binaryStringColumn := genColumn(mysql.TypeString, 7) binaryStringColumn.RetType.Collate = charset.CollationBin - int32Column := dg.genColumn(mysql.TypeLong, 8) - float32Column := dg.genColumn(mysql.TypeFloat, 9) - enumColumn := dg.genColumn(mysql.TypeEnum, 10) + int32Column := genColumn(mysql.TypeLong, 8) + float32Column := genColumn(mysql.TypeFloat, 9) + enumColumn := genColumn(mysql.TypeEnum, 10) function, err := NewFunction(mock.NewContext(), ast.JSONLength, types.NewFieldType(mysql.TypeLonglong), jsonColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) function, err = NewFunction(mock.NewContext(), ast.If, types.NewFieldType(mysql.TypeLonglong), intColumn, intColumn, intColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) function, err = NewFunction(mock.NewContext(), ast.BitNeg, types.NewFieldType(mysql.TypeLonglong), intColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) function, err = NewFunction(mock.NewContext(), ast.Xor, types.NewFieldType(mysql.TypeLonglong), intColumn, intColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // ExtractDatetime: can be pushed function, err = NewFunction(mock.NewContext(), ast.Extract, types.NewFieldType(mysql.TypeLonglong), stringColumn, datetimeColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // CastIntAsInt function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeLonglong), intColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // CastRealAsInt function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeLonglong), realColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // CastDecimalAsInt function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeLonglong), decimalColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // CastStringAsInt function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeLonglong), stringColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // CastTimeAsInt function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeLonglong), datetimeColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) validDecimalType := types.NewFieldType(mysql.TypeNewDecimal) @@ -664,709 +567,599 @@ func (s *testEvaluatorSuite) TestExprPushDownToFlash(c *C) { validDecimalType.Decimal = 2 // CastIntAsDecimal function, err = NewFunction(mock.NewContext(), ast.Cast, validDecimalType, intColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // CastRealAsDecimal function, err = NewFunction(mock.NewContext(), ast.Cast, validDecimalType, realColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // CastDecimalAsDecimal function, err = NewFunction(mock.NewContext(), ast.Cast, validDecimalType, decimalColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // CastStringAsDecimal function, err = NewFunction(mock.NewContext(), ast.Cast, validDecimalType, stringColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // CastTimeAsDecimal function, err = NewFunction(mock.NewContext(), ast.Cast, validDecimalType, datetimeColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // CastIntAsString function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeString), intColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // CastRealAsString function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeString), realColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // CastDecimalAsString function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeString), decimalColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // CastStringAsString function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeString), stringColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // CastIntAsTime function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeDatetime), intColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // CastRealAsTime function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeDatetime), realColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // CastDecimalAsTime function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeDatetime), decimalColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // CastTimeAsTime function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeDatetime), datetimeColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // CastStringAsReal function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeDouble), stringColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // Substring2ArgsUTF8 function, err = NewFunction(mock.NewContext(), ast.Substr, types.NewFieldType(mysql.TypeString), stringColumn, intColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // Substring3ArgsUTF8 function, err = NewFunction(mock.NewContext(), ast.Substr, types.NewFieldType(mysql.TypeString), stringColumn, intColumn, intColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // sqrt function, err = NewFunction(mock.NewContext(), ast.Sqrt, types.NewFieldType(mysql.TypeDouble), realColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // ScalarFuncSig_CeilReal function, err = NewFunction(mock.NewContext(), ast.Ceil, types.NewFieldType(mysql.TypeDouble), realColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // ScalarFuncSig_CeilIntToInt function, err = NewFunction(mock.NewContext(), ast.Ceil, types.NewFieldType(mysql.TypeLonglong), intColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // ScalarFuncSig_CeilDecimalToInt function, err = NewFunction(mock.NewContext(), ast.Ceil, types.NewFieldType(mysql.TypeLonglong), decimalColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // ScalarFuncSig_CeilDecToDec function, err = NewFunction(mock.NewContext(), ast.Ceil, types.NewFieldType(mysql.TypeNewDecimal), decimalColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // ScalarFuncSig_FloorReal function, err = NewFunction(mock.NewContext(), ast.Floor, types.NewFieldType(mysql.TypeDouble), realColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // ScalarFuncSig_FloorIntToInt function, err = NewFunction(mock.NewContext(), ast.Floor, types.NewFieldType(mysql.TypeLonglong), intColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // ScalarFuncSig_FloorDecToInt function, err = NewFunction(mock.NewContext(), ast.Floor, types.NewFieldType(mysql.TypeLonglong), decimalColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // ScalarFuncSig_FloorDecToDec function, err = NewFunction(mock.NewContext(), ast.Floor, types.NewFieldType(mysql.TypeNewDecimal), decimalColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // ScalarFuncSig_Log1Arg function, err = NewFunction(mock.NewContext(), ast.Log, types.NewFieldType(mysql.TypeDouble), realColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // ScalarFuncSig_Log2Args function, err = NewFunction(mock.NewContext(), ast.Log, types.NewFieldType(mysql.TypeDouble), realColumn, realColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // ScalarFuncSig_Log2 function, err = NewFunction(mock.NewContext(), ast.Log2, types.NewFieldType(mysql.TypeDouble), realColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // ScalarFuncSig_Log10 function, err = NewFunction(mock.NewContext(), ast.Log10, types.NewFieldType(mysql.TypeDouble), realColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // ScalarFuncSig_Exp function, err = NewFunction(mock.NewContext(), ast.Exp, types.NewFieldType(mysql.TypeDouble), realColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // ScalarFuncSig_Pow function, err = NewFunction(mock.NewContext(), ast.Pow, types.NewFieldType(mysql.TypeDouble), realColumn, realColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // ScalarFuncSig_Radians function, err = NewFunction(mock.NewContext(), ast.Radians, types.NewFieldType(mysql.TypeDouble), realColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // ScalarFuncSig_Degrees function, err = NewFunction(mock.NewContext(), ast.Degrees, types.NewFieldType(mysql.TypeDouble), realColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // ScalarFuncSig_CRC32 function, err = NewFunction(mock.NewContext(), ast.CRC32, types.NewFieldType(mysql.TypeLonglong), stringColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // ScalarFuncSig_Conv function, err = NewFunction(mock.NewContext(), ast.Conv, types.NewFieldType(mysql.TypeDouble), stringColumn, intColumn, intColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // Replace function, err = NewFunction(mock.NewContext(), ast.Replace, types.NewFieldType(mysql.TypeString), stringColumn, stringColumn, stringColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // InetAton function, err = NewFunction(mock.NewContext(), ast.InetAton, types.NewFieldType(mysql.TypeString), stringColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // InetNtoa function, err = NewFunction(mock.NewContext(), ast.InetNtoa, types.NewFieldType(mysql.TypeLonglong), stringColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // Inet6Aton function, err = NewFunction(mock.NewContext(), ast.Inet6Aton, types.NewFieldType(mysql.TypeString), stringColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // Inet6Ntoa function, err = NewFunction(mock.NewContext(), ast.Inet6Ntoa, types.NewFieldType(mysql.TypeLonglong), stringColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // ScalarFuncSig_RoundReal function, err = NewFunction(mock.NewContext(), ast.Round, types.NewFieldType(mysql.TypeDouble), realColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // ScalarFuncSig_RoundInt function, err = NewFunction(mock.NewContext(), ast.Round, types.NewFieldType(mysql.TypeLonglong), intColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // ScalarFuncSig_RoundDecimal function, err = NewFunction(mock.NewContext(), ast.Round, types.NewFieldType(mysql.TypeNewDecimal), decimalColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // ScalarFuncSig_RoundWithFracReal function, err = NewFunction(mock.NewContext(), ast.Round, types.NewFieldType(mysql.TypeDouble), realColumn, intColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // ScalarFuncSig_RoundWithFracInt function, err = NewFunction(mock.NewContext(), ast.Round, types.NewFieldType(mysql.TypeLonglong), intColumn, intColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // ScalarFuncSig_RoundWithFracDecimal function, err = NewFunction(mock.NewContext(), ast.Round, types.NewFieldType(mysql.TypeNewDecimal), decimalColumn, intColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // concat function, err = NewFunction(mock.NewContext(), ast.Concat, types.NewFieldType(mysql.TypeString), stringColumn, intColumn, realColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // UnixTimestampCurrent function, err = NewFunction(mock.NewContext(), ast.UnixTimestamp, types.NewFieldType(mysql.TypeLonglong)) - c.Assert(err, IsNil) + require.NoError(t, err) _, ok := function.(*Constant) - c.Assert(ok, IsTrue) + require.True(t, ok) // UnixTimestampInt datetimeColumn.RetType.Decimal = 0 function, err = NewFunction(mock.NewContext(), ast.UnixTimestamp, types.NewFieldType(mysql.TypeLonglong), datetimeColumn) - c.Assert(err, IsNil) - c.Assert(function.(*ScalarFunction).Function.PbCode(), Equals, tipb.ScalarFuncSig_UnixTimestampInt) + require.NoError(t, err) + require.Equal(t, tipb.ScalarFuncSig_UnixTimestampInt, function.(*ScalarFunction).Function.PbCode()) exprs = append(exprs, function) // UnixTimestampDecimal datetimeColumn.RetType.Decimal = types.UnspecifiedLength function, err = NewFunction(mock.NewContext(), ast.UnixTimestamp, types.NewFieldType(mysql.TypeNewDecimal), datetimeColumn) - c.Assert(err, IsNil) - c.Assert(function.(*ScalarFunction).Function.PbCode(), Equals, tipb.ScalarFuncSig_UnixTimestampDec) + require.NoError(t, err) + require.Equal(t, tipb.ScalarFuncSig_UnixTimestampDec, function.(*ScalarFunction).Function.PbCode()) exprs = append(exprs, function) // Year function, err = NewFunction(mock.NewContext(), ast.Year, types.NewFieldType(mysql.TypeLonglong), datetimeColumn) - c.Assert(err, IsNil) - c.Assert(function.(*ScalarFunction).Function.PbCode(), Equals, tipb.ScalarFuncSig_Year) + require.NoError(t, err) + require.Equal(t, tipb.ScalarFuncSig_Year, function.(*ScalarFunction).Function.PbCode()) exprs = append(exprs, function) // Day function, err = NewFunction(mock.NewContext(), ast.Day, types.NewFieldType(mysql.TypeLonglong), datetimeColumn) - c.Assert(err, IsNil) - c.Assert(function.(*ScalarFunction).Function.PbCode(), Equals, tipb.ScalarFuncSig_DayOfMonth) + require.NoError(t, err) + require.Equal(t, tipb.ScalarFuncSig_DayOfMonth, function.(*ScalarFunction).Function.PbCode()) exprs = append(exprs, function) // Datediff function, err = NewFunction(mock.NewContext(), ast.DateDiff, types.NewFieldType(mysql.TypeLonglong), datetimeColumn, datetimeColumn) - c.Assert(err, IsNil) - c.Assert(function.(*ScalarFunction).Function.PbCode(), Equals, tipb.ScalarFuncSig_DateDiff) + require.NoError(t, err) + require.Equal(t, tipb.ScalarFuncSig_DateDiff, function.(*ScalarFunction).Function.PbCode()) exprs = append(exprs, function) // Datesub function, err = NewFunction(mock.NewContext(), ast.DateSub, types.NewFieldType(mysql.TypeDatetime), datetimeColumn, intColumn, stringColumn) - c.Assert(err, IsNil) - c.Assert(function.(*ScalarFunction).Function.PbCode(), Equals, tipb.ScalarFuncSig_SubDateDatetimeInt) - exprs = append(exprs, function) - function, err = NewFunction(mock.NewContext(), ast.DateSub, types.NewFieldType(mysql.TypeDatetime), stringColumn, intColumn, stringColumn) - c.Assert(err, IsNil) - c.Assert(function.(*ScalarFunction).Function.PbCode(), Equals, tipb.ScalarFuncSig_SubDateStringInt) + require.NoError(t, err) + require.Equal(t, tipb.ScalarFuncSig_SubDateDatetimeInt, function.(*ScalarFunction).Function.PbCode()) exprs = append(exprs, function) function, err = NewFunction(mock.NewContext(), ast.SubDate, types.NewFieldType(mysql.TypeDatetime), datetimeColumn, intColumn, stringColumn) - c.Assert(err, IsNil) - c.Assert(function.(*ScalarFunction).Function.PbCode(), Equals, tipb.ScalarFuncSig_SubDateDatetimeInt) + require.NoError(t, err) + require.Equal(t, tipb.ScalarFuncSig_SubDateDatetimeInt, function.(*ScalarFunction).Function.PbCode()) exprs = append(exprs, function) // castTimeAsString: function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeString), datetimeColumn) - c.Assert(err, IsNil) - c.Assert(function.(*ScalarFunction).Function.PbCode(), Equals, tipb.ScalarFuncSig_CastTimeAsString) + require.NoError(t, err) + require.Equal(t, tipb.ScalarFuncSig_CastTimeAsString, function.(*ScalarFunction).Function.PbCode()) exprs = append(exprs, function) // concat_ws function, err = NewFunction(mock.NewContext(), ast.ConcatWS, types.NewFieldType(mysql.TypeString), stringColumn, stringColumn, stringColumn) - c.Assert(err, IsNil) - c.Assert(function.(*ScalarFunction).Function.PbCode(), Equals, tipb.ScalarFuncSig_ConcatWS) + require.NoError(t, err) + require.Equal(t, tipb.ScalarFuncSig_ConcatWS, function.(*ScalarFunction).Function.PbCode()) exprs = append(exprs, function) // StrToDateDateTime function, err = NewFunction(mock.NewContext(), ast.StrToDate, types.NewFieldType(mysql.TypeDatetime), stringColumn, stringColumn) - c.Assert(err, IsNil) - c.Assert(function.(*ScalarFunction).Function.PbCode(), Equals, tipb.ScalarFuncSig_StrToDateDatetime) + require.NoError(t, err) + require.Equal(t, tipb.ScalarFuncSig_StrToDateDatetime, function.(*ScalarFunction).Function.PbCode()) exprs = append(exprs, function) // cast Int32 to Int32 function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeLong), int32Column) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // cast float32 to float32 function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeFloat), float32Column) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // upper string function, err = NewFunction(mock.NewContext(), ast.Upper, types.NewFieldType(mysql.TypeString), stringColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // ucase string function, err = NewFunction(mock.NewContext(), ast.Ucase, types.NewFieldType(mysql.TypeString), stringColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // lower string function, err = NewFunction(mock.NewContext(), ast.Lower, types.NewFieldType(mysql.TypeString), stringColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // lcase string function, err = NewFunction(mock.NewContext(), ast.Lcase, types.NewFieldType(mysql.TypeString), stringColumn) - c.Assert(err, IsNil) + require.NoError(t, err) + exprs = append(exprs, function) + + // sysdate + function, err = NewFunction(mock.NewContext(), ast.Sysdate, types.NewFieldType(mysql.TypeDatetime), stringColumn) + require.NoError(t, err) exprs = append(exprs, function) canPush := CanExprsPushDown(sc, exprs, client, kv.TiFlash) - c.Assert(canPush, Equals, true) + require.Equal(t, true, canPush) exprs = exprs[:0] // Substring2Args: can not be pushed function, err = NewFunction(mock.NewContext(), ast.Substr, types.NewFieldType(mysql.TypeString), binaryStringColumn, intColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // Substring3Args: can not be pushed function, err = NewFunction(mock.NewContext(), ast.Substr, types.NewFieldType(mysql.TypeString), binaryStringColumn, intColumn, intColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) function, err = NewFunction(mock.NewContext(), ast.JSONDepth, types.NewFieldType(mysql.TypeLonglong), jsonColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // ExtractDatetimeFromString: can not be pushed function, err = NewFunction(mock.NewContext(), ast.Extract, types.NewFieldType(mysql.TypeLonglong), stringColumn, stringColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // Cast to Int32: not supported function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeLong), stringColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // Cast to Float: not supported function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeFloat), intColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // Cast to invalid Decimal Type: not supported function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeNewDecimal), intColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // cast Int32 to UInt32 unsignedInt32Type := types.NewFieldType(mysql.TypeLong) unsignedInt32Type.Flag = mysql.UnsignedFlag function, err = NewFunction(mock.NewContext(), ast.Cast, unsignedInt32Type, int32Column) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // cast Enum as String : not supported function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeString), enumColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) pushed, remained := PushDownExprs(sc, exprs, client, kv.TiFlash) - c.Assert(len(pushed), Equals, 0) - c.Assert(len(remained), Equals, len(exprs)) + require.Len(t, pushed, 0) + require.Len(t, remained, len(exprs)) pushed, remained = PushDownExprsWithExtraInfo(sc, exprs, client, kv.TiFlash, true) - c.Assert(len(pushed), Equals, 0) - c.Assert(len(remained), Equals, len(exprs)) + require.Len(t, pushed, 0) + require.Len(t, remained, len(exprs)) exprs = exprs[:0] // cast Enum as UInt : supported unsignedInt := types.NewFieldType(mysql.TypeLonglong) unsignedInt.Flag = mysql.UnsignedFlag function, err = NewFunction(mock.NewContext(), ast.Cast, unsignedInt, enumColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // cast Enum as Int : supported function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeLonglong), enumColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // cast Enum as Double : supported function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeDouble), enumColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) // cast Enum as Decimal : supported function, err = NewFunction(mock.NewContext(), ast.Cast, validDecimalType, enumColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) pushed, remained = PushDownExprs(sc, exprs, client, kv.TiFlash) - c.Assert(len(pushed), Equals, len(exprs)) - c.Assert(len(remained), Equals, 0) + require.Len(t, pushed, len(exprs)) + require.Len(t, remained, 0) pushed, remained = PushDownExprsWithExtraInfo(sc, exprs, client, kv.TiFlash, true) - c.Assert(len(pushed), Equals, len(exprs)) - c.Assert(len(remained), Equals, 0) + require.Len(t, pushed, len(exprs)) + require.Len(t, remained, 0) } -func (s *testEvaluatorSuite) TestExprOnlyPushDownToFlash(c *C) { - c.Skip("Skip this unstable test temporarily and bring it back before 2021-07-26") +func TestExprOnlyPushDownToFlash(t *testing.T) { + t.Skip("Skip this unstable test temporarily and bring it back before 2021-07-26") sc := new(stmtctx.StatementContext) client := new(mock.Client) - dg := new(dataGen4Expr2PbTest) + exprs := make([]Expression, 0) - //jsonColumn := dg.genColumn(mysql.TypeJSON, 1) - intColumn := dg.genColumn(mysql.TypeLonglong, 2) - //realColumn := dg.genColumn(mysql.TypeDouble, 3) - decimalColumn := dg.genColumn(mysql.TypeNewDecimal, 4) - stringColumn := dg.genColumn(mysql.TypeString, 5) - datetimeColumn := dg.genColumn(mysql.TypeDatetime, 6) - binaryStringColumn := dg.genColumn(mysql.TypeString, 7) + //jsonColumn := genColumn(mysql.TypeJSON, 1) + intColumn := genColumn(mysql.TypeLonglong, 2) + //realColumn := genColumn(mysql.TypeDouble, 3) + decimalColumn := genColumn(mysql.TypeNewDecimal, 4) + stringColumn := genColumn(mysql.TypeString, 5) + datetimeColumn := genColumn(mysql.TypeDatetime, 6) + binaryStringColumn := genColumn(mysql.TypeString, 7) binaryStringColumn.RetType.Collate = charset.CollationBin function, err := NewFunction(mock.NewContext(), ast.Substr, types.NewFieldType(mysql.TypeString), stringColumn, intColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) function, err = NewFunction(mock.NewContext(), ast.Substring, types.NewFieldType(mysql.TypeString), stringColumn, intColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) function, err = NewFunction(mock.NewContext(), ast.TimestampDiff, types.NewFieldType(mysql.TypeLonglong), stringColumn, datetimeColumn, datetimeColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) function, err = NewFunction(mock.NewContext(), ast.FromUnixTime, types.NewFieldType(mysql.TypeDatetime), decimalColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) function, err = NewFunction(mock.NewContext(), ast.Extract, types.NewFieldType(mysql.TypeLonglong), stringColumn, datetimeColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) pushed, remained := PushDownExprs(sc, exprs, client, kv.UnSpecified) - c.Assert(len(pushed), Equals, len(exprs)) - c.Assert(len(remained), Equals, 0) + require.Len(t, pushed, len(exprs)) + require.Len(t, remained, 0) canPush := CanExprsPushDown(sc, exprs, client, kv.TiFlash) - c.Assert(canPush, Equals, true) + require.Equal(t, true, canPush) canPush = CanExprsPushDown(sc, exprs, client, kv.TiKV) - c.Assert(canPush, Equals, false) + require.Equal(t, false, canPush) pushed, remained = PushDownExprs(sc, exprs, client, kv.TiFlash) - c.Assert(len(pushed), Equals, len(exprs)) - c.Assert(len(remained), Equals, 0) + require.Len(t, pushed, len(exprs)) + require.Len(t, remained, 0) pushed, remained = PushDownExprs(sc, exprs, client, kv.TiKV) - c.Assert(len(pushed), Equals, 0) - c.Assert(len(remained), Equals, len(exprs)) + require.Len(t, pushed, 0) + require.Len(t, remained, len(exprs)) } -func (s *testEvaluatorSuite) TestExprPushDownToTiKV(c *C) { +func TestExprPushDownToTiKV(t *testing.T) { sc := new(stmtctx.StatementContext) client := new(mock.Client) - dg := new(dataGen4Expr2PbTest) + exprs := make([]Expression, 0) - //jsonColumn := dg.genColumn(mysql.TypeJSON, 1) - //intColumn := dg.genColumn(mysql.TypeLonglong, 2) - //realColumn := dg.genColumn(mysql.TypeDouble, 3) - //decimalColumn := dg.genColumn(mysql.TypeNewDecimal, 4) - stringColumn := dg.genColumn(mysql.TypeString, 5) - //datetimeColumn := dg.genColumn(mysql.TypeDatetime, 6) - binaryStringColumn := dg.genColumn(mysql.TypeString, 7) + //jsonColumn := genColumn(mysql.TypeJSON, 1) + //intColumn := genColumn(mysql.TypeLonglong, 2) + //realColumn := genColumn(mysql.TypeDouble, 3) + //decimalColumn := genColumn(mysql.TypeNewDecimal, 4) + stringColumn := genColumn(mysql.TypeString, 5) + //datetimeColumn := genColumn(mysql.TypeDatetime, 6) + binaryStringColumn := genColumn(mysql.TypeString, 7) binaryStringColumn.RetType.Collate = charset.CollationBin function, err := NewFunction(mock.NewContext(), ast.InetAton, types.NewFieldType(mysql.TypeString), stringColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) function, err = NewFunction(mock.NewContext(), ast.InetNtoa, types.NewFieldType(mysql.TypeLonglong), stringColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) function, err = NewFunction(mock.NewContext(), ast.Inet6Aton, types.NewFieldType(mysql.TypeString), stringColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) function, err = NewFunction(mock.NewContext(), ast.Inet6Ntoa, types.NewFieldType(mysql.TypeLonglong), stringColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) function, err = NewFunction(mock.NewContext(), ast.IsIPv4, types.NewFieldType(mysql.TypeString), stringColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) function, err = NewFunction(mock.NewContext(), ast.IsIPv6, types.NewFieldType(mysql.TypeString), stringColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) function, err = NewFunction(mock.NewContext(), ast.IsIPv4Compat, types.NewFieldType(mysql.TypeString), stringColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) function, err = NewFunction(mock.NewContext(), ast.IsIPv4Mapped, types.NewFieldType(mysql.TypeString), stringColumn) - c.Assert(err, IsNil) + require.NoError(t, err) exprs = append(exprs, function) pushed, remained := PushDownExprs(sc, exprs, client, kv.TiKV) - c.Assert(len(pushed), Equals, 0) - c.Assert(len(remained), Equals, len(exprs)) + require.Len(t, pushed, 0) + require.Len(t, remained, len(exprs)) } -func (s *testEvaluatorSuite) TestExprOnlyPushDownToTiKV(c *C) { +func TestExprOnlyPushDownToTiKV(t *testing.T) { sc := new(stmtctx.StatementContext) client := new(mock.Client) - dg := new(dataGen4Expr2PbTest) - function, err := NewFunction(mock.NewContext(), "dayofyear", types.NewFieldType(mysql.TypeLonglong), dg.genColumn(mysql.TypeDatetime, 1)) - c.Assert(err, IsNil) + + function, err := NewFunction(mock.NewContext(), "dayofyear", types.NewFieldType(mysql.TypeLonglong), genColumn(mysql.TypeDatetime, 1)) + require.NoError(t, err) var exprs = make([]Expression, 0) exprs = append(exprs, function) pushed, remained := PushDownExprs(sc, exprs, client, kv.UnSpecified) - c.Assert(len(pushed), Equals, 1) - c.Assert(len(remained), Equals, 0) + require.Len(t, pushed, 1) + require.Len(t, remained, 0) canPush := CanExprsPushDown(sc, exprs, client, kv.TiFlash) - c.Assert(canPush, Equals, false) + require.Equal(t, false, canPush) canPush = CanExprsPushDown(sc, exprs, client, kv.TiKV) - c.Assert(canPush, Equals, true) + require.Equal(t, true, canPush) pushed, remained = PushDownExprs(sc, exprs, client, kv.TiFlash) - c.Assert(len(pushed), Equals, 0) - c.Assert(len(remained), Equals, 1) + require.Len(t, pushed, 0) + require.Len(t, remained, 1) pushed, remained = PushDownExprs(sc, exprs, client, kv.TiKV) - c.Assert(len(pushed), Equals, 1) - c.Assert(len(remained), Equals, 0) + require.Len(t, pushed, 1) + require.Len(t, remained, 0) } -func (s *testEvaluatorSuite) TestGroupByItem2Pb(c *C) { +func TestGroupByItem2Pb(t *testing.T) { sc := new(stmtctx.StatementContext) client := new(mock.Client) - dg := new(dataGen4Expr2PbTest) - item := dg.genColumn(mysql.TypeDouble, 0) + + item := genColumn(mysql.TypeDouble, 0) pbByItem := GroupByItemToPB(sc, client, item) js, err := json.Marshal(pbByItem) - c.Assert(err, IsNil) - c.Assert(string(js), Equals, "{\"expr\":{\"tp\":201,\"val\":\"gAAAAAAAAAA=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false},\"desc\":false}") + require.NoError(t, err) + require.Equal(t, "{\"expr\":{\"tp\":201,\"val\":\"gAAAAAAAAAA=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false},\"desc\":false}", string(js)) - item = dg.genColumn(mysql.TypeDouble, 1) + item = genColumn(mysql.TypeDouble, 1) pbByItem = GroupByItemToPB(sc, client, item) js, err = json.Marshal(pbByItem) - c.Assert(err, IsNil) - c.Assert(string(js), Equals, "{\"expr\":{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false},\"desc\":false}") + require.NoError(t, err) + require.Equal(t, "{\"expr\":{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false},\"desc\":false}", string(js)) } -func (s *testEvaluatorSuite) TestSortByItem2Pb(c *C) { +func TestSortByItem2Pb(t *testing.T) { sc := new(stmtctx.StatementContext) client := new(mock.Client) - dg := new(dataGen4Expr2PbTest) - item := dg.genColumn(mysql.TypeDouble, 0) + + item := genColumn(mysql.TypeDouble, 0) pbByItem := SortByItemToPB(sc, client, item, false) js, err := json.Marshal(pbByItem) - c.Assert(err, IsNil) - c.Assert(string(js), Equals, "{\"expr\":{\"tp\":201,\"val\":\"gAAAAAAAAAA=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false},\"desc\":false}") + require.NoError(t, err) + require.Equal(t, "{\"expr\":{\"tp\":201,\"val\":\"gAAAAAAAAAA=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false},\"desc\":false}", string(js)) - item = dg.genColumn(mysql.TypeDouble, 1) + item = genColumn(mysql.TypeDouble, 1) pbByItem = SortByItemToPB(sc, client, item, false) js, err = json.Marshal(pbByItem) - c.Assert(err, IsNil) - c.Assert(string(js), Equals, "{\"expr\":{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false},\"desc\":false}") + require.NoError(t, err) + require.Equal(t, "{\"expr\":{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false},\"desc\":false}", string(js)) - item = dg.genColumn(mysql.TypeDouble, 1) + item = genColumn(mysql.TypeDouble, 1) pbByItem = SortByItemToPB(sc, client, item, true) js, err = json.Marshal(pbByItem) - c.Assert(err, IsNil) - c.Assert(string(js), Equals, "{\"expr\":{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false},\"desc\":true}") -} - -func (s *testEvaluatorSerialSuites) TestMetadata(c *C) { - sc := new(stmtctx.StatementContext) - client := new(mock.Client) - dg := new(dataGen4Expr2PbTest) - - c.Assert(failpoint.Enable("github.com/pingcap/tidb/expression/PushDownTestSwitcher", `return("all")`), IsNil) - defer func() { c.Assert(failpoint.Disable("github.com/pingcap/tidb/expression/PushDownTestSwitcher"), IsNil) }() - - pc := PbConverter{client: client, sc: sc} - - metadata := new(tipb.InUnionMetadata) - var err error - // InUnion flag is false in `BuildCastFunction` when `ScalarFuncSig_CastStringAsInt` - cast := BuildCastFunction(mock.NewContext(), dg.genColumn(mysql.TypeString, 1), types.NewFieldType(mysql.TypeLonglong)) - c.Assert(cast.(*ScalarFunction).Function.metadata(), DeepEquals, &tipb.InUnionMetadata{InUnion: false}) - expr := pc.ExprToPB(cast) - c.Assert(expr.Sig, Equals, tipb.ScalarFuncSig_CastStringAsInt) - c.Assert(len(expr.Val), Greater, 0) - err = proto.Unmarshal(expr.Val, metadata) - c.Assert(err, IsNil) - c.Assert(metadata.InUnion, Equals, false) - - // InUnion flag is nil in `BuildCastFunction4Union` when `ScalarFuncSig_CastIntAsString` - castInUnion := BuildCastFunction4Union(mock.NewContext(), dg.genColumn(mysql.TypeLonglong, 1), types.NewFieldType(mysql.TypeString)) - c.Assert(castInUnion.(*ScalarFunction).Function.metadata(), IsNil) - expr = pc.ExprToPB(castInUnion) - c.Assert(expr.Sig, Equals, tipb.ScalarFuncSig_CastIntAsString) - c.Assert(len(expr.Val), Equals, 0) - - // InUnion flag is true in `BuildCastFunction4Union` when `ScalarFuncSig_CastStringAsInt` - castInUnion = BuildCastFunction4Union(mock.NewContext(), dg.genColumn(mysql.TypeString, 1), types.NewFieldType(mysql.TypeLonglong)) - c.Assert(castInUnion.(*ScalarFunction).Function.metadata(), DeepEquals, &tipb.InUnionMetadata{InUnion: true}) - expr = pc.ExprToPB(castInUnion) - c.Assert(expr.Sig, Equals, tipb.ScalarFuncSig_CastStringAsInt) - c.Assert(len(expr.Val), Greater, 0) - err = proto.Unmarshal(expr.Val, metadata) - c.Assert(err, IsNil) - c.Assert(metadata.InUnion, Equals, true) -} - -func columnCollation(c *Column, chs, coll string) *Column { - c.RetType.Charset = chs - c.RetType.Collate = coll - return c -} - -func (s *testEvaluatorSerialSuites) TestNewCollationsEnabled(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - var colExprs []Expression - sc := new(stmtctx.StatementContext) - client := new(mock.Client) - dg := new(dataGen4Expr2PbTest) - - colExprs = colExprs[:0] - colExprs = append(colExprs, dg.genColumn(mysql.TypeVarchar, 1)) - colExprs = append(colExprs, columnCollation(dg.genColumn(mysql.TypeVarchar, 2), "some_invalid_charset", "some_invalid_collation")) - colExprs = append(colExprs, columnCollation(dg.genColumn(mysql.TypeVarString, 3), "utf8mb4", "utf8mb4_general_ci")) - colExprs = append(colExprs, columnCollation(dg.genColumn(mysql.TypeString, 4), "utf8mb4", "utf8mb4_0900_ai_ci")) - colExprs = append(colExprs, columnCollation(dg.genColumn(mysql.TypeVarchar, 5), "utf8", "utf8_bin")) - colExprs = append(colExprs, columnCollation(dg.genColumn(mysql.TypeVarchar, 6), "utf8", "utf8_unicode_ci")) - colExprs = append(colExprs, columnCollation(dg.genColumn(mysql.TypeVarchar, 7), "utf8mb4", "utf8mb4_zh_pinyin_tidb_as_cs")) - pushed, _ := PushDownExprs(sc, colExprs, client, kv.UnSpecified) - c.Assert(len(pushed), Equals, len(colExprs)) - pbExprs, err := ExpressionsToPBList(sc, colExprs, client) - c.Assert(err, IsNil) - jsons := []string{ - "{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":15,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-46,\"charset\":\"utf8mb4\"},\"has_distinct\":false}", - "{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":15,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-46,\"charset\":\"some_invalid_charset\"},\"has_distinct\":false}", - "{\"tp\":201,\"val\":\"gAAAAAAAAAM=\",\"sig\":0,\"field_type\":{\"tp\":253,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-45,\"charset\":\"utf8mb4\"},\"has_distinct\":false}", - "{\"tp\":201,\"val\":\"gAAAAAAAAAQ=\",\"sig\":0,\"field_type\":{\"tp\":254,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-255,\"charset\":\"utf8mb4\"},\"has_distinct\":false}", - "{\"tp\":201,\"val\":\"gAAAAAAAAAU=\",\"sig\":0,\"field_type\":{\"tp\":15,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-83,\"charset\":\"utf8\"},\"has_distinct\":false}", - "{\"tp\":201,\"val\":\"gAAAAAAAAAY=\",\"sig\":0,\"field_type\":{\"tp\":15,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-192,\"charset\":\"utf8\"},\"has_distinct\":false}", - "{\"tp\":201,\"val\":\"gAAAAAAAAAc=\",\"sig\":0,\"field_type\":{\"tp\":15,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-2048,\"charset\":\"utf8mb4\"},\"has_distinct\":false}", - } - for i, pbExpr := range pbExprs { - c.Assert(pbExprs, NotNil) - js, err := json.Marshal(pbExpr) - c.Assert(err, IsNil) - c.Assert(string(js), Equals, jsons[i], Commentf("%v\n", i)) - } - - item := columnCollation(dg.genColumn(mysql.TypeDouble, 0), "utf8mb4", "utf8mb4_0900_ai_ci") - pbByItem := GroupByItemToPB(sc, client, item) - js, err := json.Marshal(pbByItem) - c.Assert(err, IsNil) - c.Assert(string(js), Equals, "{\"expr\":{\"tp\":201,\"val\":\"gAAAAAAAAAA=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-255,\"charset\":\"utf8mb4\"},\"has_distinct\":false},\"desc\":false}") -} - -func (s *testEvalSerialSuite) TestPushCollationDown(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - - dg := new(dataGen4Expr2PbTest) - fc, err := NewFunction(mock.NewContext(), ast.EQ, types.NewFieldType(mysql.TypeUnspecified), dg.genColumn(mysql.TypeVarchar, 0), dg.genColumn(mysql.TypeVarchar, 1)) - c.Assert(err, IsNil) - client := new(mock.Client) - sc := new(stmtctx.StatementContext) - - tps := []*types.FieldType{types.NewFieldType(mysql.TypeVarchar), types.NewFieldType(mysql.TypeVarchar)} - for _, coll := range []string{charset.CollationBin, charset.CollationLatin1, charset.CollationUTF8, charset.CollationUTF8MB4} { - fc.SetCharsetAndCollation("binary", coll) // only collation matters - pbExpr, err := ExpressionsToPBList(sc, []Expression{fc}, client) - c.Assert(err, IsNil) - expr, err := PBToExpr(pbExpr[0], tps, sc) - c.Assert(err, IsNil) - _, eColl := expr.CharsetAndCollation(nil) - c.Assert(eColl, Equals, coll) - } + require.NoError(t, err) + require.Equal(t, "{\"expr\":{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false},\"desc\":true}", string(js)) } diff --git a/expression/expression.go b/expression/expression.go index 5c4cdd88cc759..ac0f813269fff 100644 --- a/expression/expression.go +++ b/expression/expression.go @@ -748,6 +748,9 @@ type Assignment struct { // ColName indicates its original column name in table schema. It's used for outputting helping message when executing meets some errors. ColName model.CIStr Expr Expression + // LazyErr is used in statement like `INSERT INTO t1 (a) VALUES (1) ON DUPLICATE KEY UPDATE a= (SELECT b FROM source);`, ErrSubqueryMoreThan1Row + // should be evaluated after the duplicate situation is detected in the executing procedure. + LazyErr error } // VarAssignment represents a variable assignment in Set, such as set global a = 1. @@ -964,6 +967,7 @@ func scalarExprSupportedByTiKV(sf *ScalarFunction) bool { // string functions. ast.Length, ast.BitLength, ast.Concat, ast.ConcatWS /*ast.Locate,*/, ast.Replace, ast.ASCII, ast.Hex, ast.Reverse, ast.LTrim, ast.RTrim /*ast.Left,*/, ast.Strcmp, ast.Space, ast.Elt, ast.Field, + InternalFuncFromBinary, InternalFuncToBinary, // json functions. ast.JSONType, ast.JSONExtract, ast.JSONObject, ast.JSONArray, ast.JSONMerge, ast.JSONSet, @@ -1042,7 +1046,17 @@ func scalarExprSupportedByFlash(function *ScalarFunction) bool { ast.Radians, ast.Degrees, ast.Conv, ast.CRC32, ast.JSONLength, ast.InetNtoa, ast.InetAton, ast.Inet6Ntoa, ast.Inet6Aton, - ast.Coalesce, ast.ASCII, ast.Length, ast.Trim, ast.Position, ast.Format: + ast.Coalesce, ast.ASCII, ast.Length, ast.Trim, ast.Position, ast.Format, + ast.LTrim, ast.RTrim, + ast.Hour, ast.Minute, ast.Second, ast.MicroSecond: + switch function.Function.PbCode() { + case tipb.ScalarFuncSig_InDuration, + tipb.ScalarFuncSig_CoalesceDuration, + tipb.ScalarFuncSig_IfNullDuration, + tipb.ScalarFuncSig_IfDuration, + tipb.ScalarFuncSig_CaseWhenDuration: + return false + } return true case ast.Substr, ast.Substring, ast.Left, ast.Right, ast.CharLength, ast.SubstringIndex: switch function.Function.PbCode() { @@ -1063,8 +1077,8 @@ func scalarExprSupportedByFlash(function *ScalarFunction) bool { tipb.ScalarFuncSig_CastStringAsInt /*, tipb.ScalarFuncSig_CastDurationAsInt, tipb.ScalarFuncSig_CastJsonAsInt*/ : // TiFlash cast only support cast to Int64 or the source type is the same as the target type return (sourceType.Tp == retType.Tp && mysql.HasUnsignedFlag(sourceType.Flag) == mysql.HasUnsignedFlag(retType.Flag)) || retType.Tp == mysql.TypeLonglong - case tipb.ScalarFuncSig_CastIntAsReal, tipb.ScalarFuncSig_CastRealAsReal, tipb.ScalarFuncSig_CastStringAsReal: /*, tipb.ScalarFuncSig_CastDecimalAsReal, - tipb.ScalarFuncSig_CastDurationAsReal, tipb.ScalarFuncSig_CastTimeAsReal, tipb.ScalarFuncSig_CastJsonAsReal*/ + case tipb.ScalarFuncSig_CastIntAsReal, tipb.ScalarFuncSig_CastRealAsReal, tipb.ScalarFuncSig_CastStringAsReal, tipb.ScalarFuncSig_CastTimeAsReal: /*, tipb.ScalarFuncSig_CastDecimalAsReal, + tipb.ScalarFuncSig_CastDurationAsReal, tipb.ScalarFuncSig_CastJsonAsReal*/ // TiFlash cast only support cast to Float64 or the source type is the same as the target type return sourceType.Tp == retType.Tp || retType.Tp == mysql.TypeDouble case tipb.ScalarFuncSig_CastDecimalAsDecimal, tipb.ScalarFuncSig_CastIntAsDecimal, tipb.ScalarFuncSig_CastRealAsDecimal, tipb.ScalarFuncSig_CastTimeAsDecimal, @@ -1080,12 +1094,12 @@ func scalarExprSupportedByFlash(function *ScalarFunction) bool { } case ast.DateAdd, ast.AddDate: switch function.Function.PbCode() { - case tipb.ScalarFuncSig_AddDateDatetimeInt, tipb.ScalarFuncSig_AddDateStringInt, tipb.ScalarFuncSig_AddDateStringReal: + case tipb.ScalarFuncSig_AddDateDatetimeInt: return true } case ast.DateSub, ast.SubDate: switch function.Function.PbCode() { - case tipb.ScalarFuncSig_SubDateDatetimeInt, tipb.ScalarFuncSig_SubDateStringInt: + case tipb.ScalarFuncSig_SubDateDatetimeInt: return true } case ast.UnixTimestamp: @@ -1120,6 +1134,8 @@ func scalarExprSupportedByFlash(function *ScalarFunction) bool { } case ast.Upper, ast.Ucase, ast.Lower, ast.Lcase: return true + case ast.Sysdate: + return true } return false } @@ -1211,7 +1227,7 @@ func canScalarFuncPushDown(scalarFunc *ScalarFunction, pc PbConverter, storeType if storeType == kv.UnSpecified { storageName = "storage layer" } - pc.sc.AppendWarning(errors.New("Scalar function '" + scalarFunc.FuncName.L + "'(signature: " + scalarFunc.Function.PbCode().String() + ", return type: " + scalarFunc.RetType.CompactStr() + ") can not be pushed to " + storageName)) + pc.sc.AppendWarning(errors.New("Scalar function '" + scalarFunc.FuncName.L + "'(signature: " + scalarFunc.Function.PbCode().String() + ", return type: " + scalarFunc.RetType.CompactStr() + ") is not supported to push down to " + storageName + " now.")) } return false } @@ -1237,19 +1253,14 @@ func canScalarFuncPushDown(scalarFunc *ScalarFunction, pc PbConverter, storeType func canExprPushDown(expr Expression, pc PbConverter, storeType kv.StoreType, canEnumPush bool) bool { if storeType == kv.TiFlash { switch expr.GetType().Tp { - case mysql.TypeDuration: + case mysql.TypeEnum, mysql.TypeBit, mysql.TypeSet, mysql.TypeGeometry, mysql.TypeUnspecified: + if expr.GetType().Tp == mysql.TypeEnum && canEnumPush { + break + } if pc.sc.InExplainStmt { - pc.sc.AppendWarning(errors.New("Expr '" + expr.String() + "' can not be pushed to TiFlash because it contains Duration type")) + pc.sc.AppendWarning(errors.New("Expression about '" + expr.String() + "' can not be pushed to TiFlash because it contains unsupported calculation of type '" + types.TypeStr(expr.GetType().Tp) + "'.")) } return false - case mysql.TypeEnum: - if !canEnumPush { - if pc.sc.InExplainStmt { - pc.sc.AppendWarning(errors.New("Expr '" + expr.String() + "' can not be pushed to TiFlash because it contains Enum type")) - } - return false - } - default: } } switch x := expr.(type) { @@ -1376,6 +1387,16 @@ func PropagateType(evalType types.EvalType, args ...Expression) { newCol.(*Column).RetType = col.RetType.Clone() args[0] = newCol } + if col, ok := args[0].(*CorrelatedColumn); ok { + newCol := col.Clone() + newCol.(*CorrelatedColumn).RetType = col.RetType.Clone() + args[0] = newCol + } + if args[0].GetType().Tp == mysql.TypeNewDecimal { + if newDecimal > mysql.MaxDecimalScale { + newDecimal = mysql.MaxDecimalScale + } + } args[0].GetType().Flen, args[0].GetType().Decimal = newFlen, newDecimal } } diff --git a/expression/expression_test.go b/expression/expression_test.go index 62dc305f86120..0ae6cfdddd868 100644 --- a/expression/expression_test.go +++ b/expression/expression_test.go @@ -15,112 +15,112 @@ package expression import ( + "testing" "time" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" - "github.com/pingcap/tidb/util/mock" + "github.com/stretchr/testify/require" ) -func (s *testEvaluatorSuite) TestNewValuesFunc(c *C) { - res := NewValuesFunc(s.ctx, 0, types.NewFieldType(mysql.TypeLonglong)) - c.Assert(res.FuncName.O, Equals, "values") - c.Assert(res.RetType.Tp, Equals, mysql.TypeLonglong) +func TestNewValuesFunc(t *testing.T) { + ctx := createContext(t) + res := NewValuesFunc(ctx, 0, types.NewFieldType(mysql.TypeLonglong)) + require.Equal(t, "values", res.FuncName.O) + require.Equal(t, mysql.TypeLonglong, res.RetType.Tp) _, ok := res.Function.(*builtinValuesIntSig) - c.Assert(ok, IsTrue) + require.True(t, ok) } -func (s *testEvaluatorSuite) TestEvaluateExprWithNull(c *C) { +func TestEvaluateExprWithNull(t *testing.T) { + ctx := createContext(t) tblInfo := newTestTableBuilder("").add("col0", mysql.TypeLonglong, 0).add("col1", mysql.TypeLonglong, 0).build() schema := tableInfoToSchemaForTest(tblInfo) col0 := schema.Columns[0] col1 := schema.Columns[1] schema.Columns = schema.Columns[:1] - innerIfNull, err := newFunctionForTest(s.ctx, ast.Ifnull, col1, NewOne()) - c.Assert(err, IsNil) - outerIfNull, err := newFunctionForTest(s.ctx, ast.Ifnull, col0, innerIfNull) - c.Assert(err, IsNil) - - res := EvaluateExprWithNull(s.ctx, schema, outerIfNull) - c.Assert(res.String(), Equals, "ifnull(Column#1, 1)") + innerIfNull, err := newFunctionForTest(ctx, ast.Ifnull, col1, NewOne()) + require.NoError(t, err) + outerIfNull, err := newFunctionForTest(ctx, ast.Ifnull, col0, innerIfNull) + require.NoError(t, err) + res := EvaluateExprWithNull(ctx, schema, outerIfNull) + require.Equal(t, "ifnull(Column#1, 1)", res.String()) schema.Columns = append(schema.Columns, col1) // ifnull(null, ifnull(null, 1)) - res = EvaluateExprWithNull(s.ctx, schema, outerIfNull) - c.Assert(res.Equal(s.ctx, NewOne()), IsTrue) + res = EvaluateExprWithNull(ctx, schema, outerIfNull) + require.True(t, res.Equal(ctx, NewOne())) } -func (s *testEvaluatorSerialSuites) TestEvaluateExprWithNullAndParameters(c *C) { +func TestEvaluateExprWithNullAndParameters(t *testing.T) { + ctx := createContext(t) tblInfo := newTestTableBuilder("").add("col0", mysql.TypeLonglong, 0).build() schema := tableInfoToSchemaForTest(tblInfo) col0 := schema.Columns[0] - defer func(original bool) { - s.ctx.GetSessionVars().StmtCtx.UseCache = original - }(s.ctx.GetSessionVars().StmtCtx.UseCache) - s.ctx.GetSessionVars().StmtCtx.UseCache = true + ctx.GetSessionVars().StmtCtx.UseCache = true // cases for parameters - ltWithoutParam, err := newFunctionForTest(s.ctx, ast.LT, col0, NewOne()) - c.Assert(err, IsNil) - res := EvaluateExprWithNull(s.ctx, schema, ltWithoutParam) - c.Assert(res.Equal(s.ctx, NewNull()), IsTrue) // the expression is evaluated to null - + ltWithoutParam, err := newFunctionForTest(ctx, ast.LT, col0, NewOne()) + require.NoError(t, err) + res := EvaluateExprWithNull(ctx, schema, ltWithoutParam) + require.True(t, res.Equal(ctx, NewNull())) // the expression is evaluated to null param := NewOne() - param.ParamMarker = &ParamMarker{ctx: s.ctx, order: 0} - s.ctx.GetSessionVars().PreparedParams = append(s.ctx.GetSessionVars().PreparedParams, types.NewIntDatum(10)) - ltWithParam, err := newFunctionForTest(s.ctx, ast.LT, col0, param) - c.Assert(err, IsNil) - res = EvaluateExprWithNull(s.ctx, schema, ltWithParam) + param.ParamMarker = &ParamMarker{ctx: ctx, order: 0} + ctx.GetSessionVars().PreparedParams = append(ctx.GetSessionVars().PreparedParams, types.NewIntDatum(10)) + ltWithParam, err := newFunctionForTest(ctx, ast.LT, col0, param) + require.NoError(t, err) + res = EvaluateExprWithNull(ctx, schema, ltWithParam) _, isScalarFunc := res.(*ScalarFunction) - c.Assert(isScalarFunc, IsTrue) // the expression with parameters is not evaluated + require.True(t, isScalarFunc) // the expression with parameters is not evaluated } -func (s *testEvaluatorSuite) TestConstant(c *C) { +func TestConstant(t *testing.T) { + ctx := createContext(t) sc := &stmtctx.StatementContext{TimeZone: time.Local} - c.Assert(NewZero().IsCorrelated(), IsFalse) - c.Assert(NewZero().ConstItem(sc), IsTrue) - c.Assert(NewZero().Decorrelate(nil).Equal(s.ctx, NewZero()), IsTrue) - c.Assert(NewZero().HashCode(sc), DeepEquals, []byte{0x0, 0x8, 0x0}) - c.Assert(NewZero().Equal(s.ctx, NewOne()), IsFalse) + require.False(t, NewZero().IsCorrelated()) + require.True(t, NewZero().ConstItem(sc)) + require.True(t, NewZero().Decorrelate(nil).Equal(ctx, NewZero())) + require.Equal(t, []byte{0x0, 0x8, 0x0}, NewZero().HashCode(sc)) + require.False(t, NewZero().Equal(ctx, NewOne())) res, err := NewZero().MarshalJSON() - c.Assert(err, IsNil) - c.Assert(res, DeepEquals, []byte{0x22, 0x30, 0x22}) + require.NoError(t, err) + require.Equal(t, []byte{0x22, 0x30, 0x22}, res) } -func (s *testEvaluatorSuite) TestIsBinaryLiteral(c *C) { +func TestIsBinaryLiteral(t *testing.T) { col := &Column{RetType: types.NewFieldType(mysql.TypeEnum)} - c.Assert(IsBinaryLiteral(col), IsFalse) + require.False(t, IsBinaryLiteral(col)) col.RetType.Tp = mysql.TypeSet - c.Assert(IsBinaryLiteral(col), IsFalse) + require.False(t, IsBinaryLiteral(col)) col.RetType.Tp = mysql.TypeBit - c.Assert(IsBinaryLiteral(col), IsFalse) + require.False(t, IsBinaryLiteral(col)) col.RetType.Tp = mysql.TypeDuration - c.Assert(IsBinaryLiteral(col), IsFalse) + require.False(t, IsBinaryLiteral(col)) con := &Constant{RetType: types.NewFieldType(mysql.TypeVarString), Value: types.NewBinaryLiteralDatum([]byte{byte(0), byte(1)})} - c.Assert(IsBinaryLiteral(con), IsTrue) + require.True(t, IsBinaryLiteral(con)) con.Value = types.NewIntDatum(1) - c.Assert(IsBinaryLiteral(con), IsFalse) + require.False(t, IsBinaryLiteral(col)) } -func (s *testEvaluatorSuite) TestConstItem(c *C) { +func TestConstItem(t *testing.T) { + ctx := createContext(t) sf := newFunction(ast.Rand) - c.Assert(sf.ConstItem(s.ctx.GetSessionVars().StmtCtx), Equals, false) + require.False(t, sf.ConstItem(ctx.GetSessionVars().StmtCtx)) sf = newFunction(ast.UUID) - c.Assert(sf.ConstItem(s.ctx.GetSessionVars().StmtCtx), Equals, false) + require.False(t, sf.ConstItem(ctx.GetSessionVars().StmtCtx)) sf = newFunction(ast.GetParam, NewOne()) - c.Assert(sf.ConstItem(s.ctx.GetSessionVars().StmtCtx), Equals, false) + require.False(t, sf.ConstItem(ctx.GetSessionVars().StmtCtx)) sf = newFunction(ast.Abs, NewOne()) - c.Assert(sf.ConstItem(s.ctx.GetSessionVars().StmtCtx), Equals, true) + require.True(t, sf.ConstItem(ctx.GetSessionVars().StmtCtx)) } -func (s *testEvaluatorSuite) TestVectorizable(c *C) { +func TestVectorizable(t *testing.T) { exprs := make([]Expression, 0, 4) sf := newFunction(ast.Rand) column := &Column{ @@ -131,7 +131,7 @@ func (s *testEvaluatorSuite) TestVectorizable(c *C) { exprs = append(exprs, NewOne()) exprs = append(exprs, NewNull()) exprs = append(exprs, column) - c.Assert(Vectorizable(exprs), Equals, true) + require.True(t, Vectorizable(exprs)) column0 := &Column{ UniqueID: 1, @@ -148,12 +148,12 @@ func (s *testEvaluatorSuite) TestVectorizable(c *C) { exprs = exprs[:0] sf = newFunction(ast.SetVar, column0, column1) exprs = append(exprs, sf) - c.Assert(Vectorizable(exprs), Equals, false) + require.False(t, Vectorizable(exprs)) exprs = exprs[:0] sf = newFunction(ast.GetVar, column0) exprs = append(exprs, sf) - c.Assert(Vectorizable(exprs), Equals, false) + require.False(t, Vectorizable(exprs)) exprs = exprs[:0] sf = newFunction(ast.NextVal, column0) @@ -162,7 +162,7 @@ func (s *testEvaluatorSuite) TestVectorizable(c *C) { exprs = append(exprs, sf) sf = newFunction(ast.SetVal, column1, column2) exprs = append(exprs, sf) - c.Assert(Vectorizable(exprs), Equals, false) + require.False(t, Vectorizable(exprs)) } type testTableBuilder struct { @@ -219,8 +219,8 @@ func tableInfoToSchemaForTest(tableInfo *model.TableInfo) *Schema { return schema } -func (s *testEvaluatorSuite) TestEvalExpr(c *C) { - ctx := mock.NewContext() +func TestEvalExpr(t *testing.T) { + ctx := createContext(t) eTypes := []types.EvalType{types.ETInt, types.ETReal, types.ETDecimal, types.ETString, types.ETTimestamp, types.ETDatetime, types.ETDuration} tNames := []string{"int", "real", "decimal", "string", "timestamp", "datetime", "duration"} for i := 0; i < len(tNames); i++ { @@ -231,25 +231,21 @@ func (s *testEvaluatorSuite) TestEvalExpr(c *C) { colBuf := chunk.NewColumn(ft, 1024) colBuf2 := chunk.NewColumn(ft, 1024) var err error - c.Assert(colExpr.Vectorized(), IsTrue) + require.True(t, colExpr.Vectorized()) ctx.GetSessionVars().EnableVectorizedExpression = false err = EvalExpr(ctx, colExpr, colExpr.GetType().EvalType(), input, colBuf) - if err != nil { - c.Fatal(err) - } + require.NoError(t, err) ctx.GetSessionVars().EnableVectorizedExpression = true err = EvalExpr(ctx, colExpr, colExpr.GetType().EvalType(), input, colBuf2) - if err != nil { - c.Fatal(err) - } + require.NoError(t, err) for j := 0; j < 1024; j++ { isNull := colBuf.IsNull(j) isNull2 := colBuf2.IsNull(j) - c.Assert(isNull, Equals, isNull2) + require.Equal(t, isNull2, isNull) if isNull { continue } - c.Assert(string(colBuf.GetRaw(j)), Equals, string(colBuf2.GetRaw(j))) + require.Equal(t, string(colBuf2.GetRaw(j)), string(colBuf.GetRaw(j))) } } } diff --git a/expression/flag_simplify_test.go b/expression/flag_simplify_test.go index a9f23e19ea099..c02cb7a1fa037 100644 --- a/expression/flag_simplify_test.go +++ b/expression/flag_simplify_test.go @@ -15,41 +15,18 @@ package expression_test import ( - . "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/testutil" -) - -var _ = Suite(&testFlagSimplifySuite{}) - -type testFlagSimplifySuite struct { - store kv.Storage - dom *domain.Domain - ctx sessionctx.Context - testData testutil.TestData -} + "testing" -func (s *testFlagSimplifySuite) SetUpSuite(c *C) { - var err error - s.store, s.dom, err = newStoreWithBootstrap() - c.Assert(err, IsNil) - s.ctx = mock.NewContext() - s.testData, err = testutil.LoadTestSuiteData("testdata", "flag_simplify") - c.Assert(err, IsNil) -} + "github.com/pingcap/tidb/expression" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/testkit/testdata" +) -func (s *testFlagSimplifySuite) TearDownSuite(c *C) { - c.Assert(s.testData.GenerateOutputIfNeeded(), IsNil) - s.dom.Close() - s.store.Close() -} +func TestSimplifyExpressionByFlag(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() -func (s *testFlagSimplifySuite) TestSimplifyExpressionByFlag(c *C) { - tk := testkit.NewTestKit(c, s.store) + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t(id int primary key, a bigint unsigned not null, b bigint unsigned)") @@ -59,11 +36,12 @@ func (s *testFlagSimplifySuite) TestSimplifyExpressionByFlag(c *C) { SQL string Plan []string } - s.testData.GetTestCases(c, &input, &output) + flagSimplifyData := expression.GetFlagSimplifyData() + flagSimplifyData.GetTestCases(t, &input, &output) for i, tt := range input { - s.testData.OnRecord(func() { + testdata.OnRecord(func() { output[i].SQL = tt - output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) }) tk.MustQuery(tt).Check(testkit.Rows(output[i].Plan...)) } diff --git a/expression/function_traits_test.go b/expression/function_traits_test.go index 94de0f960f9cf..703739ca10e5f 100644 --- a/expression/function_traits_test.go +++ b/expression/function_traits_test.go @@ -15,11 +15,13 @@ package expression import ( - . "github.com/pingcap/check" + "testing" + "github.com/pingcap/tidb/parser/ast" + "github.com/stretchr/testify/require" ) -func (s *testEvaluatorSuite) TestUnfoldableFuncs(c *C) { +func TestUnfoldableFuncs(t *testing.T) { _, ok := unFoldableFunctions[ast.Sysdate] - c.Assert(ok, IsTrue) + require.True(t, ok) } diff --git a/expression/generator/compare_vec.go b/expression/generator/compare_vec.go index 27315648c78fe..33c3f04800913 100644 --- a/expression/generator/compare_vec.go +++ b/expression/generator/compare_vec.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build ignore // +build ignore package main @@ -296,7 +297,6 @@ func (b *builtin{{ .compare.CompareName }}{{ .type.TypeName }}Sig) vectorized() const builtinCompareVecTestHeader = `import ( "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/types" ) @@ -315,12 +315,12 @@ var builtinCompareVecTestFuncTail = ` }, var builtinCompareVecTestTail = `} -func (s *testEvaluatorSuite) TestVectorizedGeneratedBuiltinCompareEvalOneVec(c *C) { - testVectorizedEvalOneVec(c, vecGeneratedBuiltinCompareCases) +func TestVectorizedGeneratedBuiltinCompareEvalOneVec(t *testing.T) { + testVectorizedEvalOneVec(t, vecGeneratedBuiltinCompareCases) } -func (s *testEvaluatorSuite) TestVectorizedGeneratedBuiltinCompareFunc(c *C) { - testVectorizedBuiltinFunc(c, vecGeneratedBuiltinCompareCases) +func TestVectorizedGeneratedBuiltinCompareFunc(t *testing.T) { + testVectorizedBuiltinFunc(t, vecGeneratedBuiltinCompareCases) } func BenchmarkVectorizedGeneratedBuiltinCompareEvalOneVec(b *testing.B) { diff --git a/expression/generator/control_vec.go b/expression/generator/control_vec.go index 1b4ec708800df..628ec3b2fec1a 100644 --- a/expression/generator/control_vec.go +++ b/expression/generator/control_vec.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build ignore // +build ignore package main @@ -492,7 +493,6 @@ import ( "math/rand" "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/types" ) @@ -541,12 +541,12 @@ var vecBuiltin{{.Category}}Cases = map[string][]vecExprBenchCase{ {{ end }} } -func (s *testEvaluatorSuite) TestVectorizedBuiltin{{.Category}}EvalOneVecGenerated(c *C) { - testVectorizedEvalOneVec(c, vecBuiltinControlCases) +func TestVectorizedBuiltin{{.Category}}EvalOneVecGenerated(t *testing.T) { + testVectorizedEvalOneVec(t, vecBuiltinControlCases) } -func (s *testEvaluatorSuite) TestVectorizedBuiltin{{.Category}}FuncGenerated(c *C) { - testVectorizedBuiltinFunc(c, vecBuiltinControlCases) +func TestVectorizedBuiltin{{.Category}}FuncGenerated(t *testing.T) { + testVectorizedBuiltinFunc(t, vecBuiltinControlCases) } func BenchmarkVectorizedBuiltin{{.Category}}EvalOneVecGenerated(b *testing.B) { diff --git a/expression/generator/other_vec.go b/expression/generator/other_vec.go index 9240d12bf7115..cb784436f4c47 100644 --- a/expression/generator/other_vec.go +++ b/expression/generator/other_vec.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build ignore // +build ignore package main @@ -281,7 +282,6 @@ import ( "testing" "time" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/types" @@ -401,12 +401,12 @@ var vecBuiltin{{ .Category }}GeneratedCases = map[string][]vecExprBenchCase { }, } -func (s *testEvaluatorSuite) TestVectorizedBuiltin{{.Category}}EvalOneVecGenerated(c *C) { - testVectorizedEvalOneVec(c, vecBuiltin{{.Category}}GeneratedCases) +func TestVectorizedBuiltin{{.Category}}EvalOneVecGenerated(t *testing.T) { + testVectorizedEvalOneVec(t, vecBuiltin{{.Category}}GeneratedCases) } -func (s *testEvaluatorSuite) TestVectorizedBuiltin{{.Category}}FuncGenerated(c *C) { - testVectorizedBuiltinFunc(c, vecBuiltin{{.Category}}GeneratedCases) +func TestVectorizedBuiltin{{.Category}}FuncGenerated(t *testing.T) { + testVectorizedBuiltinFunc(t, vecBuiltin{{.Category}}GeneratedCases) } func BenchmarkVectorizedBuiltin{{.Category}}EvalOneVecGenerated(b *testing.B) { diff --git a/expression/generator/string_vec.go b/expression/generator/string_vec.go index 74eb8a224427d..6e1bf90071684 100644 --- a/expression/generator/string_vec.go +++ b/expression/generator/string_vec.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build ignore // +build ignore package main @@ -116,7 +117,6 @@ var builtinStringVecTestTpl = template.Must(template.New("").Parse(` import ( "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/types" ) @@ -129,12 +129,12 @@ var vecGeneratedBuiltinStringCases = map[string][]vecExprBenchCase{ }, } -func (s *testEvaluatorSuite) TestVectorizedGeneratedBuiltinStringEvalOneVec(c *C) { - testVectorizedEvalOneVec(c, vecGeneratedBuiltinStringCases) +func TestVectorizedGeneratedBuiltinStringEvalOneVec(t *testing.T) { + testVectorizedEvalOneVec(t, vecGeneratedBuiltinStringCases) } -func (s *testEvaluatorSuite) TestVectorizedGeneratedBuiltinStringFunc(c *C) { - testVectorizedBuiltinFunc(c, vecGeneratedBuiltinStringCases) +func TestVectorizedGeneratedBuiltinStringFunc(t *testing.T) { + testVectorizedBuiltinFunc(t, vecGeneratedBuiltinStringCases) } func BenchmarkVectorizedGeneratedBuiltinStringEvalOneVec(b *testing.B) { diff --git a/expression/generator/time_vec.go b/expression/generator/time_vec.go index 3177216813789..7933358d33474 100644 --- a/expression/generator/time_vec.go +++ b/expression/generator/time_vec.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build ignore // +build ignore package main @@ -660,7 +661,6 @@ import ( "math" "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/types" @@ -797,12 +797,12 @@ var vecBuiltin{{.Category}}GeneratedCases = map[string][]vecExprBenchCase{ {{ end }} } -func (s *testVectorizeSuite1) TestVectorizedBuiltin{{.Category}}EvalOneVecGenerated(c *C) { - testVectorizedEvalOneVec(c, vecBuiltin{{.Category}}GeneratedCases) +func TestVectorizedBuiltin{{.Category}}EvalOneVecGenerated(t *testing.T) { + testVectorizedEvalOneVec(t, vecBuiltin{{.Category}}GeneratedCases) } -func (s *testVectorizeSuite1) TestVectorizedBuiltin{{.Category}}FuncGenerated(c *C) { - testVectorizedBuiltinFunc(c, vecBuiltin{{.Category}}GeneratedCases) +func TestVectorizedBuiltin{{.Category}}FuncGenerated(t *testing.T) { + testVectorizedBuiltinFunc(t, vecBuiltin{{.Category}}GeneratedCases) } func BenchmarkVectorizedBuiltin{{.Category}}EvalOneVecGenerated(b *testing.B) { diff --git a/expression/helper.go b/expression/helper.go index 34b8b21419832..6d1710ccbdba5 100644 --- a/expression/helper.go +++ b/expression/helper.go @@ -24,7 +24,6 @@ import ( "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/types" driver "github.com/pingcap/tidb/types/parser_driver" @@ -57,26 +56,45 @@ func IsValidCurrentTimestampExpr(exprNode ast.ExprNode, fieldType *types.FieldTy return (containsArg && isConsistent) || (!containsArg && !containsFsp) } +// GetTimeCurrentTimestamp is used for generating a timestamp for some special cases: cast null value to timestamp type with not null flag. +func GetTimeCurrentTimestamp(ctx sessionctx.Context, tp byte, fsp int8) (d types.Datum, err error) { + var t types.Time + t, err = getTimeCurrentTimeStamp(ctx, tp, fsp) + if err != nil { + return d, err + } + d.SetMysqlTime(t) + return d, nil +} + +func getTimeCurrentTimeStamp(ctx sessionctx.Context, tp byte, fsp int8) (t types.Time, err error) { + value := types.NewTime(types.ZeroCoreTime, tp, fsp) + defaultTime, err := getStmtTimestamp(ctx) + if err != nil { + return value, err + } + value.SetCoreTime(types.FromGoTime(defaultTime.Truncate(time.Duration(math.Pow10(9-int(fsp))) * time.Nanosecond))) + if tp == mysql.TypeTimestamp || tp == mysql.TypeDatetime { + err = value.ConvertTimeZone(time.Local, ctx.GetSessionVars().Location()) + if err != nil { + return value, err + } + } + return value, nil +} + // GetTimeValue gets the time value with type tp. func GetTimeValue(ctx sessionctx.Context, v interface{}, tp byte, fsp int8) (d types.Datum, err error) { - value := types.NewTime(types.ZeroCoreTime, tp, fsp) + var value types.Time sc := ctx.GetSessionVars().StmtCtx switch x := v.(type) { case string: upperX := strings.ToUpper(x) if upperX == strings.ToUpper(ast.CurrentTimestamp) { - defaultTime, err := getStmtTimestamp(ctx) - if err != nil { + if value, err = getTimeCurrentTimeStamp(ctx, tp, fsp); err != nil { return d, err } - value.SetCoreTime(types.FromGoTime(defaultTime.Truncate(time.Duration(math.Pow10(9-int(fsp))) * time.Nanosecond))) - if tp == mysql.TypeTimestamp || tp == mysql.TypeDatetime { - err = value.ConvertTimeZone(time.Local, ctx.GetSessionVars().Location()) - if err != nil { - return d, err - } - } } else if upperX == types.ZeroDatetimeStr { value, err = types.ParseTimeFromNum(sc, 0, tp, fsp) terror.Log(err) @@ -152,16 +170,10 @@ func getStmtTimestamp(ctx sessionctx.Context) (time.Time, error) { return now, err } - if timestampStr != "" { - timestamp, err := types.StrToInt(sessionVars.StmtCtx, timestampStr, false) - if err != nil { - return time.Time{}, err - } - if timestamp <= 0 { - return now, nil - } - return time.Unix(timestamp, 0), nil + timestamp, err := types.StrToFloat(sessionVars.StmtCtx, timestampStr, false) + if err != nil { + return time.Time{}, err } - stmtCtx := ctx.GetSessionVars().StmtCtx - return stmtCtx.GetOrStoreStmtCache(stmtctx.StmtNowTsCacheKey, time.Now()).(time.Time), nil + seconds, fractionalSeconds := math.Modf(timestamp) + return time.Unix(int64(seconds), int64(fractionalSeconds*float64(time.Second))), nil } diff --git a/expression/helper_test.go b/expression/helper_test.go index b34f9323f81bf..b7e00c221e141 100644 --- a/expression/helper_test.go +++ b/expression/helper_test.go @@ -15,10 +15,13 @@ package expression import ( + "fmt" "strings" + "testing" "time" - . "github.com/pingcap/check" + "github.com/stretchr/testify/require" + "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/charset" "github.com/pingcap/tidb/parser/model" @@ -29,46 +32,59 @@ import ( "github.com/pingcap/tidb/util/mock" ) -func (s *testExpressionSuite) TestGetTimeValue(c *C) { +func TestGetTimeValue(t *testing.T) { ctx := mock.NewContext() v, err := GetTimeValue(ctx, "2012-12-12 00:00:00", mysql.TypeTimestamp, types.MinFsp) - c.Assert(err, IsNil) + require.NoError(t, err) - c.Assert(v.Kind(), Equals, types.KindMysqlTime) + require.Equal(t, types.KindMysqlTime, v.Kind()) timeValue := v.GetMysqlTime() - c.Assert(timeValue.String(), Equals, "2012-12-12 00:00:00") + require.Equal(t, "2012-12-12 00:00:00", timeValue.String()) + sessionVars := ctx.GetSessionVars() - err = variable.SetSessionSystemVar(sessionVars, "timestamp", "") - c.Assert(err, IsNil) + err = variable.SetSessionSystemVar(sessionVars, "timestamp", "default") + require.NoError(t, err) v, err = GetTimeValue(ctx, "2012-12-12 00:00:00", mysql.TypeTimestamp, types.MinFsp) - c.Assert(err, IsNil) + require.NoError(t, err) - c.Assert(v.Kind(), Equals, types.KindMysqlTime) + require.Equal(t, types.KindMysqlTime, v.Kind()) timeValue = v.GetMysqlTime() - c.Assert(timeValue.String(), Equals, "2012-12-12 00:00:00") + require.Equal(t, "2012-12-12 00:00:00", timeValue.String()) err = variable.SetSessionSystemVar(sessionVars, "timestamp", "0") - c.Assert(err, IsNil) + require.NoError(t, err) v, err = GetTimeValue(ctx, "2012-12-12 00:00:00", mysql.TypeTimestamp, types.MinFsp) - c.Assert(err, IsNil) + require.NoError(t, err) - c.Assert(v.Kind(), Equals, types.KindMysqlTime) + require.Equal(t, types.KindMysqlTime, v.Kind()) timeValue = v.GetMysqlTime() - c.Assert(timeValue.String(), Equals, "2012-12-12 00:00:00") + require.Equal(t, "2012-12-12 00:00:00", timeValue.String()) err = variable.SetSessionSystemVar(sessionVars, "timestamp", "") - c.Assert(err, IsNil) + require.Error(t, err, "Incorrect argument type to variable 'timestamp'") v, err = GetTimeValue(ctx, "2012-12-12 00:00:00", mysql.TypeTimestamp, types.MinFsp) - c.Assert(err, IsNil) + require.NoError(t, err) - c.Assert(v.Kind(), Equals, types.KindMysqlTime) + require.Equal(t, types.KindMysqlTime, v.Kind()) timeValue = v.GetMysqlTime() - c.Assert(timeValue.String(), Equals, "2012-12-12 00:00:00") + require.Equal(t, "2012-12-12 00:00:00", timeValue.String()) + + // trigger the stmt context cache. + err = variable.SetSessionSystemVar(sessionVars, "timestamp", "0") + require.NoError(t, err) + + v1, err := GetTimeCurrentTimestamp(ctx, mysql.TypeTimestamp, types.MinFsp) + require.NoError(t, err) + + v2, err := GetTimeCurrentTimestamp(ctx, mysql.TypeTimestamp, types.MinFsp) + require.NoError(t, err) + + require.Equal(t, v1, v2) err = variable.SetSessionSystemVar(sessionVars, "timestamp", "1234") - c.Assert(err, IsNil) + require.NoError(t, err) - tbl := []struct { + tbls := []struct { Expr interface{} Ret interface{} }{ @@ -82,16 +98,16 @@ func (s *testExpressionSuite) TestGetTimeValue(c *C) { // {&ast.UnaryOperationExpr{Op: opcode.Minus, V: ast.NewValueExpr(int64(0))}, "0000-00-00 00:00:00"}, } - for i, t := range tbl { - comment := Commentf("expr: %d", i) - v, err := GetTimeValue(ctx, t.Expr, mysql.TypeTimestamp, types.MinFsp) - c.Assert(err, IsNil) + for i, tbl := range tbls { + comment := fmt.Sprintf("expr: %d", i) + v, err := GetTimeValue(ctx, tbl.Expr, mysql.TypeTimestamp, types.MinFsp) + require.NoError(t, err) switch v.Kind() { case types.KindMysqlTime: - c.Assert(v.GetMysqlTime().String(), DeepEquals, t.Ret, comment) + require.EqualValues(t, tbl.Ret, v.GetMysqlTime().String(), comment) default: - c.Assert(v.GetValue(), DeepEquals, t.Ret, comment) + require.EqualValues(t, tbl.Ret, v.GetValue(), comment) } } @@ -105,13 +121,13 @@ func (s *testExpressionSuite) TestGetTimeValue(c *C) { // {&ast.UnaryOperationExpr{Op: opcode.Minus, V: ast.NewValueExpr(int64(1))}}, } - for _, t := range errTbl { - _, err := GetTimeValue(ctx, t.Expr, mysql.TypeTimestamp, types.MinFsp) - c.Assert(err, NotNil) + for _, tbl := range errTbl { + _, err := GetTimeValue(ctx, tbl.Expr, mysql.TypeTimestamp, types.MinFsp) + require.Error(t, err) } } -func (s *testExpressionSuite) TestIsCurrentTimestampExpr(c *C) { +func TestIsCurrentTimestampExpr(t *testing.T) { buildTimestampFuncCallExpr := func(i int64) *ast.FuncCallExpr { var args []ast.ExprNode if i != 0 { @@ -121,42 +137,44 @@ func (s *testExpressionSuite) TestIsCurrentTimestampExpr(c *C) { } v := IsValidCurrentTimestampExpr(ast.NewValueExpr("abc", charset.CharsetUTF8MB4, charset.CollationUTF8MB4), nil) - c.Assert(v, IsFalse) + require.False(t, v) v = IsValidCurrentTimestampExpr(buildTimestampFuncCallExpr(0), nil) - c.Assert(v, IsTrue) + require.True(t, v) v = IsValidCurrentTimestampExpr(buildTimestampFuncCallExpr(3), &types.FieldType{Decimal: 3}) - c.Assert(v, IsTrue) + require.True(t, v) v = IsValidCurrentTimestampExpr(buildTimestampFuncCallExpr(1), &types.FieldType{Decimal: 3}) - c.Assert(v, IsFalse) + require.False(t, v) v = IsValidCurrentTimestampExpr(buildTimestampFuncCallExpr(0), &types.FieldType{Decimal: 3}) - c.Assert(v, IsFalse) + require.False(t, v) v = IsValidCurrentTimestampExpr(buildTimestampFuncCallExpr(2), &types.FieldType{Decimal: 0}) - c.Assert(v, IsFalse) + require.False(t, v) v = IsValidCurrentTimestampExpr(buildTimestampFuncCallExpr(2), nil) - c.Assert(v, IsFalse) + require.False(t, v) } -func (s *testExpressionSuite) TestCurrentTimestampTimeZone(c *C) { +func TestCurrentTimestampTimeZone(t *testing.T) { ctx := mock.NewContext() sessionVars := ctx.GetSessionVars() err := variable.SetSessionSystemVar(sessionVars, "timestamp", "1234") - c.Assert(err, IsNil) + require.NoError(t, err) err = variable.SetSessionSystemVar(sessionVars, "time_zone", "+00:00") - c.Assert(err, IsNil) + require.NoError(t, err) v, err := GetTimeValue(ctx, ast.CurrentTimestamp, mysql.TypeTimestamp, types.MinFsp) - c.Assert(err, IsNil) - c.Assert(v.GetMysqlTime(), DeepEquals, types.NewTime( + require.NoError(t, err) + require.EqualValues(t, types.NewTime( types.FromDate(1970, 1, 1, 0, 20, 34, 0), - mysql.TypeTimestamp, types.DefaultFsp)) + mysql.TypeTimestamp, types.DefaultFsp), + v.GetMysqlTime()) // CurrentTimestamp from "timestamp" session variable is based on UTC, so change timezone // would get different value. err = variable.SetSessionSystemVar(sessionVars, "time_zone", "+08:00") - c.Assert(err, IsNil) + require.NoError(t, err) v, err = GetTimeValue(ctx, ast.CurrentTimestamp, mysql.TypeTimestamp, types.MinFsp) - c.Assert(err, IsNil) - c.Assert(v.GetMysqlTime(), DeepEquals, types.NewTime( + require.NoError(t, err) + require.EqualValues(t, types.NewTime( types.FromDate(1970, 1, 1, 8, 20, 34, 0), - mysql.TypeTimestamp, types.DefaultFsp)) + mysql.TypeTimestamp, types.DefaultFsp), + v.GetMysqlTime()) } diff --git a/expression/integration_serial_test.go b/expression/integration_serial_test.go new file mode 100644 index 0000000000000..0665f2b2082ba --- /dev/null +++ b/expression/integration_serial_test.go @@ -0,0 +1,4604 @@ +// Copyright 2021 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, +// 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. + +package expression_test + +import ( + "context" + "fmt" + "math" + "strings" + "testing" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/ddl/placement" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/parser/terror" + plannercore "github.com/pingcap/tidb/planner/core" + "github.com/pingcap/tidb/session" + "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/table/tables" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/collate" + "github.com/pingcap/tidb/util/kvcache" + "github.com/pingcap/tidb/util/testutil" + "github.com/stretchr/testify/require" + "github.com/tikv/client-go/v2/oracle" +) + +func TestIssue17727(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + orgEnable := plannercore.PreparedPlanCacheEnabled() + defer func() { + plannercore.SetPreparedPlanCache(orgEnable) + }() + plannercore.SetPreparedPlanCache(true) + var err error + se, err := session.CreateSession4TestWithOpt(store, &session.Opt{ + PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), + }) + tk.SetSession(se) + require.NoError(t, err) + + tk.MustExec("use test;") + tk.MustExec("DROP TABLE IF EXISTS t1;") + tk.MustExec("CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY auto_increment, a timestamp NOT NULL);") + tk.MustExec("INSERT INTO t1 VALUES (null, '2020-05-30 20:30:00');") + tk.MustExec("PREPARE mystmt FROM 'SELECT * FROM t1 WHERE UNIX_TIMESTAMP(a) >= ?';") + tk.MustExec("SET @a=1590868800;") + tk.MustQuery("EXECUTE mystmt USING @a;").Check(testkit.Rows()) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) + + tk.MustExec("SET @a=1590868801;") + tk.MustQuery("EXECUTE mystmt USING @a;").Check(testkit.Rows()) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) + + tk.MustExec("prepare stmt from 'select unix_timestamp(?)';") + tk.MustExec("set @a = '2020-05-30 20:30:00';") + tk.MustQuery("execute stmt using @a;").Check(testkit.Rows("1590841800")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) + + tk.MustExec("set @a = '2020-06-12 13:47:58';") + tk.MustQuery("execute stmt using @a;").Check(testkit.Rows("1591940878")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) +} + +func TestIssue17891(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(id int, value set ('a','b','c') charset utf8mb4 collate utf8mb4_bin default 'a,b ');") + tk.MustExec("drop table t") + tk.MustExec("create table test(id int, value set ('a','b','c') charset utf8mb4 collate utf8mb4_general_ci default 'a,B ,C');") +} + +func TestIssue20268(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("CREATE TABLE `t` ( `a` enum('a','b') DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;") + tk.MustExec("insert into t values('a');") + tk.MustExec("select * from t where a = 'A';") +} + +func TestCollationBasic(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + tk.MustExec("use test") + tk.MustExec("create table t_ci(a varchar(10) collate utf8mb4_general_ci, unique key(a))") + tk.MustExec("insert into t_ci values ('a')") + tk.MustQuery("select * from t_ci").Check(testkit.Rows("a")) + tk.MustQuery("select * from t_ci").Check(testkit.Rows("a")) + tk.MustQuery("select * from t_ci where a='a'").Check(testkit.Rows("a")) + tk.MustQuery("select * from t_ci where a='A'").Check(testkit.Rows("a")) + tk.MustQuery("select * from t_ci where a='a '").Check(testkit.Rows("a")) + tk.MustQuery("select * from t_ci where a='a '").Check(testkit.Rows("a")) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a varchar(10) primary key,b int)") + tk.MustExec("insert into t values ('a', 1), ('b', 3), ('a', 2) on duplicate key update b = b + 1;") + tk.MustExec("set autocommit=0") + tk.MustExec("insert into t values ('a', 1), ('b', 3), ('a', 2) on duplicate key update b = b + 1;") + tk.MustQuery("select * from t").Check(testkit.Rows("a 4", "b 4")) + tk.MustExec("set autocommit=1") + tk.MustQuery("select * from t").Check(testkit.Rows("a 4", "b 4")) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a varchar(10),b int, key tk (a))") + tk.MustExec("insert into t values ('', 1), ('', 3)") + tk.MustExec("set autocommit=0") + tk.MustExec("update t set b = b + 1") + tk.MustQuery("select * from t").Check(testkit.Rows(" 2", " 4")) + tk.MustExec("set autocommit=1") + tk.MustQuery("select * from t").Check(testkit.Rows(" 2", " 4")) + + tk.MustExec("drop table t_ci") + tk.MustExec("create table t_ci(id bigint primary key, a varchar(10) collate utf8mb4_general_ci, unique key(a, id))") + tk.MustExec("insert into t_ci values (1, 'a')") + tk.MustQuery("select a from t_ci").Check(testkit.Rows("a")) + tk.MustQuery("select a from t_ci").Check(testkit.Rows("a")) + tk.MustQuery("select a from t_ci where a='a'").Check(testkit.Rows("a")) + tk.MustQuery("select a from t_ci where a='A'").Check(testkit.Rows("a")) + tk.MustQuery("select a from t_ci where a='a '").Check(testkit.Rows("a")) + tk.MustQuery("select a from t_ci where a='a '").Check(testkit.Rows("a")) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(c set('A', 'B') collate utf8mb4_general_ci);") + tk.MustExec("insert into t values('a');") + tk.MustExec("insert into t values('B');") + tk.MustQuery("select c from t where c = 'a';").Check(testkit.Rows("A")) + tk.MustQuery("select c from t where c = 'A';").Check(testkit.Rows("A")) + tk.MustQuery("select c from t where c = 'b';").Check(testkit.Rows("B")) + tk.MustQuery("select c from t where c = 'B';").Check(testkit.Rows("B")) + + tk.MustExec("drop table if exists t1") + tk.MustExec("CREATE TABLE `t1` (" + + " `COL1` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL," + + " PRIMARY KEY (`COL1`(5)) clustered" + + ")") + tk.MustExec("INSERT INTO `t1` VALUES ('Ȇ');") + tk.MustQuery("select * from t1 where col1 not in (0xc484, 0xe5a4bc, 0xc3b3);").Check(testkit.Rows("Ȇ")) + tk.MustQuery("select * from t1 where col1 >= 0xc484 and col1 <= 0xc3b3;").Check(testkit.Rows("Ȇ")) + + tk.MustQuery("select collation(IF('a' < 'B' collate utf8mb4_general_ci, 'smaller', 'greater' collate utf8mb4_unicode_ci));").Check(testkit.Rows("utf8mb4_unicode_ci")) +} + +func TestWeightString(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + + type testCase struct { + input []string + result []string + resultAsChar1 []string + resultAsChar3 []string + resultAsBinary1 []string + resultAsBinary5 []string + resultExplicitCollateBin []string + } + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (id int, a varchar(20) collate utf8mb4_general_ci)") + cases := testCase{ + input: []string{"aAÁàãăâ", "a", "a ", "中", "中 "}, + result: []string{"\x00A\x00A\x00A\x00A\x00A\x00A\x00A", "\x00A", "\x00A", "\x4E\x2D", "\x4E\x2D"}, + resultAsChar1: []string{"\x00A", "\x00A", "\x00A", "\x4E\x2D", "\x4E\x2D"}, + resultAsChar3: []string{"\x00A\x00A\x00A", "\x00A", "\x00A", "\x4E\x2D", "\x4E\x2D"}, + resultAsBinary1: []string{"a", "a", "a", "\xE4", "\xE4"}, + resultAsBinary5: []string{"aA\xc3\x81\xc3", "a\x00\x00\x00\x00", "a \x00\x00", "中\x00\x00", "中 \x00"}, + resultExplicitCollateBin: []string{"aAÁàãăâ", "a", "a", "中", "中"}, + } + values := make([]string, len(cases.input)) + for i, input := range cases.input { + values[i] = fmt.Sprintf("(%d, '%s')", i, input) + } + tk.MustExec("insert into t values " + strings.Join(values, ",")) + rows := tk.MustQuery("select weight_string(a) from t order by id").Rows() + for i, out := range cases.result { + require.Equal(t, out, rows[i][0].(string)) + } + rows = tk.MustQuery("select weight_string(a as char(1)) from t order by id").Rows() + for i, out := range cases.resultAsChar1 { + require.Equal(t, out, rows[i][0].(string)) + } + rows = tk.MustQuery("select weight_string(a as char(3)) from t order by id").Rows() + for i, out := range cases.resultAsChar3 { + require.Equal(t, out, rows[i][0].(string)) + } + rows = tk.MustQuery("select weight_string(a as binary(1)) from t order by id").Rows() + for i, out := range cases.resultAsBinary1 { + require.Equal(t, out, rows[i][0].(string)) + } + rows = tk.MustQuery("select weight_string(a as binary(5)) from t order by id").Rows() + for i, out := range cases.resultAsBinary5 { + require.Equal(t, out, rows[i][0].(string)) + } + require.Equal(t, "<nil>", tk.MustQuery("select weight_string(NULL);").Rows()[0][0]) + require.Equal(t, "<nil>", tk.MustQuery("select weight_string(7);").Rows()[0][0]) + require.Equal(t, "<nil>", tk.MustQuery("select weight_string(cast(7 as decimal(5)));").Rows()[0][0]) + require.Equal(t, "2019-08-21", tk.MustQuery("select weight_string(cast(20190821 as date));").Rows()[0][0]) + require.Equal(t, "2019-", tk.MustQuery("select weight_string(cast(20190821 as date) as binary(5));").Rows()[0][0]) + require.Equal(t, "<nil>", tk.MustQuery("select weight_string(7.0);").Rows()[0][0]) + require.Equal(t, "7\x00", tk.MustQuery("select weight_string(7 AS BINARY(2));").Rows()[0][0]) + // test explicit collation + require.Equal(t, "\x4E\x2D", tk.MustQuery("select weight_string('中 ' collate utf8mb4_general_ci);").Rows()[0][0]) + require.Equal(t, "中", tk.MustQuery("select weight_string('中 ' collate utf8mb4_bin);").Rows()[0][0]) + require.Equal(t, "\xFB\x40\xCE\x2D", tk.MustQuery("select weight_string('中 ' collate utf8mb4_unicode_ci);").Rows()[0][0]) + require.Equal(t, "utf8mb4_general_ci", tk.MustQuery("select collation(a collate utf8mb4_general_ci) from t order by id").Rows()[0][0]) + require.Equal(t, "utf8mb4_general_ci", tk.MustQuery("select collation('中 ' collate utf8mb4_general_ci);").Rows()[0][0]) + rows = tk.MustQuery("select weight_string(a collate utf8mb4_bin) from t order by id").Rows() + for i, out := range cases.resultExplicitCollateBin { + require.Equal(t, out, rows[i][0].(string)) + } + tk.MustGetErrMsg("select weight_string(a collate utf8_general_ci) from t order by id", "[ddl:1253]COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'utf8mb4'") + tk.MustGetErrMsg("select weight_string('中' collate utf8_bin)", "[ddl:1253]COLLATION 'utf8_bin' is not valid for CHARACTER SET 'utf8mb4'") +} + +func TestCollationCreateIndex(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a varchar(10) collate utf8mb4_general_ci);") + tk.MustExec("insert into t values ('a');") + tk.MustExec("insert into t values ('A');") + tk.MustExec("insert into t values ('b');") + tk.MustExec("insert into t values ('B');") + tk.MustExec("insert into t values ('a');") + tk.MustExec("insert into t values ('A');") + tk.MustExec("insert into t values ('ß');") + tk.MustExec("insert into t values ('sa');") + tk.MustExec("create index idx on t(a);") + tk.MustQuery("select * from t order by a").Check(testkit.Rows("a", "A", "a", "A", "b", "B", "ß", "sa")) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a varchar(10) collate utf8mb4_unicode_ci);") + tk.MustExec("insert into t values ('a');") + tk.MustExec("insert into t values ('A');") + tk.MustExec("insert into t values ('b');") + tk.MustExec("insert into t values ('B');") + tk.MustExec("insert into t values ('a');") + tk.MustExec("insert into t values ('A');") + tk.MustExec("insert into t values ('ß');") + tk.MustExec("insert into t values ('sa');") + tk.MustExec("create index idx on t(a);") + tk.MustQuery("select * from t order by a").Check(testkit.Rows("a", "A", "a", "A", "b", "B", "sa", "ß")) +} + +func TestCollateConstantPropagation(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a char(10) collate utf8mb4_bin, b char(10) collate utf8mb4_general_ci);") + tk.MustExec("insert into t values ('a', 'A');") + tk.MustQuery("select * from t t1, t t2 where t1.a=t2.b and t2.b='a' collate utf8mb4_general_ci;").Check(nil) + tk.MustQuery("select * from t t1, t t2 where t1.a=t2.b and t2.b>='a' collate utf8mb4_general_ci;").Check(nil) + tk.MustExec("drop table t;") + tk.MustExec("create table t (a char(10) collate utf8mb4_general_ci, b char(10) collate utf8mb4_general_ci);") + tk.MustExec("insert into t values ('A', 'a');") + tk.MustQuery("select * from t t1, t t2 where t1.a=t2.b and t2.b='a' collate utf8mb4_bin;").Check(testkit.Rows("A a A a")) + tk.MustQuery("select * from t t1, t t2 where t1.a=t2.b and t2.b>='a' collate utf8mb4_bin;").Check(testkit.Rows("A a A a")) + tk.MustExec("drop table t;") + tk.MustExec("set names utf8mb4") + tk.MustExec("create table t (a char(10) collate utf8mb4_general_ci, b char(10) collate utf8_general_ci);") + tk.MustExec("insert into t values ('a', 'A');") + tk.MustQuery("select * from t t1, t t2 where t1.a=t2.b and t2.b='A'").Check(testkit.Rows("a A a A")) + tk.MustExec("drop table t;") + tk.MustExec("create table t(a char collate utf8_general_ci, b char collate utf8mb4_general_ci, c char collate utf8_bin);") + tk.MustExec("insert into t values ('b', 'B', 'B');") + tk.MustQuery("select * from t t1, t t2 where t1.a=t2.b and t2.b=t2.c;").Check(testkit.Rows("b B B b B B")) + tk.MustExec("drop table t;") + tk.MustExec("create table t(a char collate utf8_bin, b char collate utf8_general_ci);") + tk.MustExec("insert into t values ('a', 'A');") + tk.MustQuery("select * from t t1, t t2 where t1.b=t2.b and t2.b=t1.a collate utf8_general_ci;").Check(testkit.Rows("a A a A")) + tk.MustExec("drop table if exists t1, t2;") + tk.MustExec("set names utf8mb4 collate utf8mb4_general_ci;") + tk.MustExec("create table t1(a char, b varchar(10)) charset utf8mb4 collate utf8mb4_general_ci;") + tk.MustExec("create table t2(a char, b varchar(10)) charset utf8mb4 collate utf8mb4_bin;") + tk.MustExec("insert into t1 values ('A', 'a');") + tk.MustExec("insert into t2 values ('a', 'a')") + tk.MustQuery("select * from t1 left join t2 on t1.a = t2.a where t1.a = 'a';").Check(testkit.Rows("A a <nil> <nil>")) + tk.MustExec("drop table t;") + tk.MustExec("set names utf8mb4 collate utf8mb4_general_ci;") + tk.MustExec("create table t(a char collate utf8mb4_bin, b char collate utf8mb4_general_ci);") + tk.MustExec("insert into t values ('a', 'a');") + tk.MustQuery("select * from t t1, t t2 where t2.b = 'A' and lower(concat(t1.a , '' )) = t2.b;").Check(testkit.Rows("a a a a")) + tk.MustExec("drop table t;") + tk.MustExec("create table t(a char collate utf8_unicode_ci, b char collate utf8mb4_unicode_ci, c char collate utf8_bin);") + tk.MustExec("insert into t values ('b', 'B', 'B');") + tk.MustQuery("select * from t t1, t t2 where t1.a=t2.b and t2.b=t2.c;").Check(testkit.Rows("b B B b B B")) + tk.MustExec("drop table if exists t1, t2;") + tk.MustExec("set names utf8mb4 collate utf8mb4_unicode_ci;") + tk.MustExec("create table t1(a char, b varchar(10)) charset utf8mb4 collate utf8mb4_unicode_ci;") + tk.MustExec("create table t2(a char, b varchar(10)) charset utf8mb4 collate utf8mb4_bin;") + tk.MustExec("insert into t1 values ('A', 'a');") + tk.MustExec("insert into t2 values ('a', 'a')") + tk.MustQuery("select * from t1 left join t2 on t1.a = t2.a where t1.a = 'a';").Check(testkit.Rows("A a <nil> <nil>")) + tk.MustExec("drop table if exists t1, t2;") + tk.MustExec("set names utf8mb4 collate utf8mb4_general_ci;") + tk.MustExec("create table t1(a char, b varchar(10)) charset utf8mb4 collate utf8mb4_general_ci;") + tk.MustExec("create table t2(a char, b varchar(10)) charset utf8mb4 collate utf8mb4_unicode_ci;") + tk.MustExec("insert into t1 values ('ß', 's');") + tk.MustExec("insert into t2 values ('s', 's')") + tk.MustQuery("select * from t1 left join t2 on t1.a = t2.a collate utf8mb4_unicode_ci where t1.a = 's';").Check(testkit.Rows("ß s <nil> <nil>")) + tk.MustExec("drop table if exists t1, t2;") + tk.MustExec("create table t1(a char(10) collate utf8mb4_general_ci, index (a));") + tk.MustExec("create table t2(a char(10) collate utf8_bin, index (a));") + tk.MustExec("insert into t1 values ('a');") + tk.MustExec("insert into t2 values ('A');") + tk.MustExec("set names utf8 collate utf8_general_ci;") + tk.MustQuery("select * from t1, t2 where t1.a=t2.a and t1.a= 'a';").Check(testkit.Rows("a A")) + tk.MustQuery("select * from t1 where a='a' and a = 'A'").Check(testkit.Rows("a")) +} + +func TestMixCollation(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + + tk.MustGetErrMsg(`select 'a' collate utf8mb4_bin = 'a' collate utf8mb4_general_ci;`, "[expression:1267]Illegal mix of collations (utf8mb4_bin,EXPLICIT) and (utf8mb4_general_ci,EXPLICIT) for operation '='") + + tk.MustExec("use test;") + tk.MustExec("drop table if exists t;") + tk.MustExec(`create table t ( + mb4general varchar(10) charset utf8mb4 collate utf8mb4_general_ci, + mb4unicode varchar(10) charset utf8mb4 collate utf8mb4_unicode_ci, + mb4bin varchar(10) charset utf8mb4 collate utf8mb4_bin, + general varchar(10) charset utf8 collate utf8_general_ci, + unicode varchar(10) charset utf8 collate utf8_unicode_ci, + utfbin varchar(10) charset utf8 collate utf8_bin, + bin varchar(10) charset binary collate binary, + latin1_bin varchar(10) charset latin1 collate latin1_bin, + ascii_bin varchar(10) charset ascii collate ascii_bin, + i int + );`) + tk.MustExec("insert into t values ('s', 's', 's', 's', 's', 's', 's', 's', 's', 1);") + tk.MustExec("set names utf8mb4 collate utf8mb4_general_ci;") + + tk.MustQuery("select * from t where mb4unicode = 's' collate utf8mb4_unicode_ci;").Check(testkit.Rows("s s s s s s s s s 1")) + tk.MustQuery(`select * from t t1, t t2 where t1.mb4unicode = t2.mb4general collate utf8mb4_general_ci;`).Check(testkit.Rows("s s s s s s s s s 1 s s s s s s s s s 1")) + tk.MustQuery(`select * from t t1, t t2 where t1.mb4general = t2.mb4unicode collate utf8mb4_general_ci;`).Check(testkit.Rows("s s s s s s s s s 1 s s s s s s s s s 1")) + tk.MustQuery(`select * from t t1, t t2 where t1.mb4general = t2.mb4unicode collate utf8mb4_unicode_ci;`).Check(testkit.Rows("s s s s s s s s s 1 s s s s s s s s s 1")) + tk.MustQuery(`select * from t t1, t t2 where t1.mb4unicode = t2.mb4general collate utf8mb4_unicode_ci;`).Check(testkit.Rows("s s s s s s s s s 1 s s s s s s s s s 1")) + tk.MustQuery(`select * from t where mb4general = mb4bin collate utf8mb4_general_ci;`).Check(testkit.Rows("s s s s s s s s s 1")) + tk.MustQuery(`select * from t where mb4unicode = mb4general collate utf8mb4_unicode_ci;`).Check(testkit.Rows("s s s s s s s s s 1")) + tk.MustQuery(`select * from t where mb4general = mb4unicode collate utf8mb4_unicode_ci;`).Check(testkit.Rows("s s s s s s s s s 1")) + tk.MustQuery(`select * from t where mb4unicode = 's' collate utf8mb4_unicode_ci;`).Check(testkit.Rows("s s s s s s s s s 1")) + tk.MustQuery("select * from t where mb4unicode = mb4bin;").Check(testkit.Rows("s s s s s s s s s 1")) + tk.MustQuery("select * from t where general = mb4unicode;").Check(testkit.Rows("s s s s s s s s s 1")) + tk.MustQuery("select * from t where unicode = mb4unicode;").Check(testkit.Rows("s s s s s s s s s 1")) + tk.MustQuery("select * from t where mb4unicode = mb4unicode;").Check(testkit.Rows("s s s s s s s s s 1")) + + tk.MustQuery("select collation(concat(mb4unicode, mb4general collate utf8mb4_unicode_ci)) from t;").Check(testkit.Rows("utf8mb4_unicode_ci")) + tk.MustQuery("select collation(concat(mb4general, mb4unicode, mb4bin)) from t;").Check(testkit.Rows("utf8mb4_bin")) + tk.MustQuery("select coercibility(concat(mb4general, mb4unicode, mb4bin)) from t;").Check(testkit.Rows("1")) + tk.MustQuery("select collation(concat(mb4unicode, mb4bin, concat(mb4general))) from t;").Check(testkit.Rows("utf8mb4_bin")) + tk.MustQuery("select coercibility(concat(mb4unicode, mb4bin)) from t;").Check(testkit.Rows("2")) + tk.MustQuery("select collation(concat(mb4unicode, mb4bin)) from t;").Check(testkit.Rows("utf8mb4_bin")) + tk.MustQuery("select coercibility(concat(mb4bin, concat(mb4general))) from t;").Check(testkit.Rows("2")) + tk.MustQuery("select collation(concaT(mb4bin, cOncAt(mb4general))) from t;").Check(testkit.Rows("utf8mb4_bin")) + tk.MustQuery("select coercibility(concat(mb4unicode, mb4bin, concat(mb4general))) from t;").Check(testkit.Rows("2")) + tk.MustQuery("select collation(concat(mb4unicode, mb4bin, concat(mb4general))) from t;").Check(testkit.Rows("utf8mb4_bin")) + tk.MustQuery("select coercibility(concat(mb4unicode, mb4general)) from t;").Check(testkit.Rows("1")) + tk.MustQuery("select collation(coalesce(mb4unicode, mb4general)) from t;").Check(testkit.Rows("utf8mb4_bin")) + tk.MustQuery("select coercibility(coalesce(mb4unicode, mb4general)) from t;").Check(testkit.Rows("1")) + tk.MustQuery("select collation(CONCAT(concat(mb4unicode), concat(mb4general))) from t;").Check(testkit.Rows("utf8mb4_bin")) + tk.MustQuery("select coercibility(cONcat(unicode, general)) from t;").Check(testkit.Rows("1")) + tk.MustQuery("select collation(concAt(unicode, general)) from t;").Check(testkit.Rows("utf8_bin")) + tk.MustQuery("select collation(concat(bin, mb4general)) from t;").Check(testkit.Rows("binary")) + tk.MustQuery("select coercibility(concat(bin, mb4general)) from t;").Check(testkit.Rows("2")) + tk.MustQuery("select collation(concat(mb4unicode, ascii_bin)) from t;").Check(testkit.Rows("utf8mb4_unicode_ci")) + tk.MustQuery("select coercibility(concat(mb4unicode, ascii_bin)) from t;").Check(testkit.Rows("2")) + tk.MustQuery("select collation(concat(mb4unicode, mb4unicode)) from t;").Check(testkit.Rows("utf8mb4_unicode_ci")) + tk.MustQuery("select coercibility(concat(mb4unicode, mb4unicode)) from t;").Check(testkit.Rows("2")) + tk.MustQuery("select collation(concat(bin, bin)) from t;").Check(testkit.Rows("binary")) + tk.MustQuery("select coercibility(concat(bin, bin)) from t;").Check(testkit.Rows("2")) + tk.MustQuery("select collation(concat(latin1_bin, ascii_bin)) from t;").Check(testkit.Rows("latin1_bin")) + tk.MustQuery("select coercibility(concat(latin1_bin, ascii_bin)) from t;").Check(testkit.Rows("2")) + tk.MustQuery("select collation(concat(mb4unicode, bin)) from t;").Check(testkit.Rows("binary")) + tk.MustQuery("select coercibility(concat(mb4unicode, bin)) from t;").Check(testkit.Rows("2")) + tk.MustQuery("select collation(mb4general collate utf8mb4_unicode_ci) from t;").Check(testkit.Rows("utf8mb4_unicode_ci")) + tk.MustQuery("select coercibility(mb4general collate utf8mb4_unicode_ci) from t;").Check(testkit.Rows("0")) + tk.MustQuery("select collation(concat(concat(mb4unicode, mb4general), concat(unicode, general))) from t;").Check(testkit.Rows("utf8mb4_bin")) + tk.MustQuery("select coercibility(concat(concat(mb4unicode, mb4general), concat(unicode, general))) from t;").Check(testkit.Rows("1")) + tk.MustQuery("select collation(concat(i, 1)) from t;").Check(testkit.Rows("utf8mb4_general_ci")) + tk.MustQuery("select coercibility(concat(i, 1)) from t;").Check(testkit.Rows("4")) + tk.MustQuery("select collation(concat(i, user())) from t;").Check(testkit.Rows("utf8mb4_bin")) + tk.MustQuery("select coercibility(concat(i, user())) from t;").Check(testkit.Rows("3")) + tk.MustGetErrMsg("select * from t where mb4unicode = mb4general;", "[expression:1267]Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '='") + tk.MustGetErrMsg("select * from t where unicode = general;", "[expression:1267]Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '='") + tk.MustGetErrMsg("select concat(mb4general) = concat(mb4unicode) from t;", "[expression:1267]Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_unicode_ci,IMPLICIT) for operation '='") + tk.MustGetErrMsg("select * from t t1, t t2 where t1.mb4unicode = t2.mb4general;", "[expression:1267]Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '='") + tk.MustGetErrMsg("select field('s', mb4general, mb4unicode, mb4bin) from t;", "[expression:1271]Illegal mix of collations for operation 'field'") + tk.MustGetErrMsg("select concat(mb4unicode, mb4general) = mb4unicode from t;", "[expression:1267]Illegal mix of collations (utf8mb4_bin,NONE) and (utf8mb4_unicode_ci,IMPLICIT) for operation '='") + + tk.MustExec("drop table t;") +} + +func prepare4Join(tk *testkit.TestKit) { + tk.MustExec("USE test") + tk.MustExec("drop table if exists t") + tk.MustExec("drop table if exists t_bin") + tk.MustExec("CREATE TABLE `t` ( `a` int(11) NOT NULL,`b` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL)") + tk.MustExec("CREATE TABLE `t_bin` ( `a` int(11) NOT NULL,`b` varchar(5) CHARACTER SET binary)") + tk.MustExec("insert into t values (1, 'a'), (2, 'À'), (3, 'á'), (4, 'à'), (5, 'b'), (6, 'c'), (7, ' ')") + tk.MustExec("insert into t_bin values (1, 'a'), (2, 'À'), (3, 'á'), (4, 'à'), (5, 'b'), (6, 'c'), (7, ' ')") +} + +func TestCollateHashJoin(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + prepare4Join(tk) + tk.MustQuery("select /*+ TIDB_HJ(t1, t2) */ t1.a, t1.b from t t1, t t2 where t1.b=t2.b order by t1.a").Check( + testkit.Rows("1 a", "1 a", "1 a", "1 a", "2 À", "2 À", "2 À", "2 À", "3 á", "3 á", "3 á", "3 á", "4 à", "4 à", "4 à", "4 à", "5 b", "6 c", "7 ")) + tk.MustQuery("select /*+ TIDB_HJ(t1, t2) */ t1.a, t1.b from t_bin t1, t_bin t2 where t1.b=t2.b order by t1.a").Check( + testkit.Rows("1 a", "2 À", "3 á", "4 à", "5 b", "6 c", "7 ")) + tk.MustQuery("select /*+ TIDB_HJ(t1, t2) */ t1.a, t1.b from t t1, t t2 where t1.b=t2.b and t1.a>3 order by t1.a").Check( + testkit.Rows("4 à", "4 à", "4 à", "4 à", "5 b", "6 c", "7 ")) + tk.MustQuery("select /*+ TIDB_HJ(t1, t2) */ t1.a, t1.b from t_bin t1, t_bin t2 where t1.b=t2.b and t1.a>3 order by t1.a").Check( + testkit.Rows("4 à", "5 b", "6 c", "7 ")) + tk.MustQuery("select /*+ TIDB_HJ(t1, t2) */ t1.a, t1.b from t t1, t t2 where t1.b=t2.b and t1.a>3 order by t1.a").Check( + testkit.Rows("4 à", "4 à", "4 à", "4 à", "5 b", "6 c", "7 ")) + tk.MustQuery("select /*+ TIDB_HJ(t1, t2) */ t1.a, t1.b from t_bin t1, t_bin t2 where t1.b=t2.b and t1.a>3 order by t1.a").Check( + testkit.Rows("4 à", "5 b", "6 c", "7 ")) + tk.MustQuery("select /*+ TIDB_HJ(t1, t2) */ t1.a, t1.b from t t1, t t2 where t1.b=t2.b and t1.a>t2.a order by t1.a").Check( + testkit.Rows("2 À", "3 á", "3 á", "4 à", "4 à", "4 à")) + tk.MustQuery("select /*+ TIDB_HJ(t1, t2) */ t1.a, t1.b from t_bin t1, t_bin t2 where t1.b=t2.b and t1.a>t2.a order by t1.a").Check( + testkit.Rows()) +} + +func TestCollateHashJoin2(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + prepare4Join2(tk) + tk.MustQuery("select /*+ TIDB_HJ(t1, t2) */ * from t1, t2 where t1.v=t2.v order by t1.id").Check( + testkit.Rows("1 a a", "2 À À", "3 á á", "4 à à", "5 b b", "6 c c", "7 ")) +} + +func prepare4Join2(tk *testkit.TestKit) { + tk.MustExec("USE test") + tk.MustExec("drop table if exists t1") + tk.MustExec("drop table if exists t2") + tk.MustExec("create table t1 (id int, v varchar(5) character set binary, key(v))") + tk.MustExec("create table t2 (v varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, key(v))") + tk.MustExec("insert into t1 values (1, 'a'), (2, 'À'), (3, 'á'), (4, 'à'), (5, 'b'), (6, 'c'), (7, ' ')") + tk.MustExec("insert into t2 values ('a'), ('À'), ('á'), ('à'), ('b'), ('c'), (' ')") +} + +func TestCollateMergeJoin(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + prepare4Join(tk) + tk.MustQuery("select /*+ TIDB_SMJ(t1, t2) */ t1.a, t1.b from t t1, t t2 where t1.b=t2.b order by t1.a").Check( + testkit.Rows("1 a", "1 a", "1 a", "1 a", "2 À", "2 À", "2 À", "2 À", "3 á", "3 á", "3 á", "3 á", "4 à", "4 à", "4 à", "4 à", "5 b", "6 c", "7 ")) + tk.MustQuery("select /*+ TIDB_SMJ(t1, t2) */ t1.a, t1.b from t_bin t1, t_bin t2 where t1.b=t2.b order by t1.a").Check( + testkit.Rows("1 a", "2 À", "3 á", "4 à", "5 b", "6 c", "7 ")) + tk.MustQuery("select /*+ TIDB_SMJ(t1, t2) */ t1.a, t1.b from t t1, t t2 where t1.b=t2.b and t1.a>3 order by t1.a").Check( + testkit.Rows("4 à", "4 à", "4 à", "4 à", "5 b", "6 c", "7 ")) + tk.MustQuery("select /*+ TIDB_SMJ(t1, t2) */ t1.a, t1.b from t_bin t1, t_bin t2 where t1.b=t2.b and t1.a>3 order by t1.a").Check( + testkit.Rows("4 à", "5 b", "6 c", "7 ")) + tk.MustQuery("select /*+ TIDB_SMJ(t1, t2) */ t1.a, t1.b from t t1, t t2 where t1.b=t2.b and t1.a>3 order by t1.a").Check( + testkit.Rows("4 à", "4 à", "4 à", "4 à", "5 b", "6 c", "7 ")) + tk.MustQuery("select /*+ TIDB_SMJ(t1, t2) */ t1.a, t1.b from t_bin t1, t_bin t2 where t1.b=t2.b and t1.a>3 order by t1.a").Check( + testkit.Rows("4 à", "5 b", "6 c", "7 ")) + tk.MustQuery("select /*+ TIDB_SMJ(t1, t2) */ t1.a, t1.b from t t1, t t2 where t1.b=t2.b and t1.a>t2.a order by t1.a").Check( + testkit.Rows("2 À", "3 á", "3 á", "4 à", "4 à", "4 à")) + tk.MustQuery("select /*+ TIDB_SMJ(t1, t2) */ t1.a, t1.b from t_bin t1, t_bin t2 where t1.b=t2.b and t1.a>t2.a order by t1.a").Check( + testkit.Rows()) +} + +func TestCollateMergeJoin2(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + prepare4Join2(tk) + tk.MustQuery("select /*+ TIDB_SMJ(t1, t2) */ * from t1, t2 where t1.v=t2.v order by t1.id").Check( + testkit.Rows("1 a a", "2 À À", "3 á á", "4 à à", "5 b b", "6 c c", "7 ")) +} + +func TestCollateIndexMergeJoin(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, b varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, key(a), key(b))") + tk.MustExec("insert into t values ('a', 'x'), ('x', 'À'), ('á', 'x'), ('à', 'à'), ('à', 'x')") + + tk.MustExec("set tidb_enable_index_merge=1") + tk.MustQuery("select /*+ USE_INDEX_MERGE(t, a, b) */ * from t where a = 'a' or b = 'a'").Sort().Check( + testkit.Rows("a x", "x À", "à x", "à à", "á x")) +} + +func TestNewCollationCheckClusterIndexTable(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.Session().GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeOn + tk.MustExec("create table t(name char(255) primary key, b int, c int, index idx(name), unique index uidx(name))") + tk.MustExec("insert into t values(\"aaaa\", 1, 1), (\"bbb\", 2, 2), (\"ccc\", 3, 3)") + tk.MustExec("admin check table t") +} + +func prepare4Collation(tk *testkit.TestKit, hasIndex bool) { + tk.MustExec("USE test") + tk.MustExec("drop table if exists t") + tk.MustExec("drop table if exists t_bin") + idxSQL := ", key(v)" + if !hasIndex { + idxSQL = "" + } + tk.MustExec(fmt.Sprintf("create table t (id int, v varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL %v)", idxSQL)) + tk.MustExec(fmt.Sprintf("create table t_bin (id int, v varchar(5) CHARACTER SET binary %v)", idxSQL)) + tk.MustExec("insert into t values (1, 'a'), (2, 'À'), (3, 'á'), (4, 'à'), (5, 'b'), (6, 'c'), (7, ' ')") + tk.MustExec("insert into t_bin values (1, 'a'), (2, 'À'), (3, 'á'), (4, 'à'), (5, 'b'), (6, 'c'), (7, ' ')") +} + +func TestCollateSelection(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + prepare4Collation(tk, false) + tk.MustQuery("select v from t where v='a' order by id").Check(testkit.Rows("a", "À", "á", "à")) + tk.MustQuery("select v from t_bin where v='a' order by id").Check(testkit.Rows("a")) + tk.MustQuery("select v from t where v<'b' and id<=3").Check(testkit.Rows("a", "À", "á")) + tk.MustQuery("select v from t_bin where v<'b' and id<=3").Check(testkit.Rows("a")) +} + +func TestCollateSort(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + prepare4Collation(tk, false) + tk.MustQuery("select id from t order by v, id").Check(testkit.Rows("7", "1", "2", "3", "4", "5", "6")) + tk.MustQuery("select id from t_bin order by v, id").Check(testkit.Rows("7", "1", "5", "6", "2", "4", "3")) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a char(10) collate utf8mb4_general_ci, key(a))") + tk.MustExec("insert into t values ('a'), ('A'), ('b')") + tk.MustExec("insert into t values ('a'), ('A'), ('b')") + tk.MustExec("insert into t values ('a'), ('A'), ('b')") + tk.MustQuery("select * from t order by a collate utf8mb4_bin").Check(testkit.Rows("A", "A", "A", "a", "a", "a", "b", "b", "b")) + tk.MustQuery("select * from t order by a collate utf8mb4_general_ci").Check(testkit.Rows("a", "A", "a", "A", "a", "A", "b", "b", "b")) + tk.MustQuery("select * from t order by a collate utf8mb4_unicode_ci").Check(testkit.Rows("a", "A", "a", "A", "a", "A", "b", "b", "b")) +} + +func TestCollateHashAgg(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + prepare4Collation(tk, false) + tk.HasPlan("select distinct(v) from t_bin", "HashAgg") + tk.MustQuery("select distinct(v) from t_bin").Sort().Check(testkit.Rows(" ", "a", "b", "c", "À", "à", "á")) + tk.HasPlan("select distinct(v) from t", "HashAgg") + tk.MustQuery("select distinct(v) from t").Sort().Check(testkit.Rows(" ", "a", "b", "c")) + tk.HasPlan("select v, count(*) from t_bin group by v", "HashAgg") + tk.MustQuery("select v, count(*) from t_bin group by v").Sort().Check(testkit.Rows(" 1", "a 1", "b 1", "c 1", "À 1", "à 1", "á 1")) + tk.HasPlan("select v, count(*) from t group by v", "HashAgg") + tk.MustQuery("select v, count(*) from t group by v").Sort().Check(testkit.Rows(" 1", "a 4", "b 1", "c 1")) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a char(10) collate utf8mb4_general_ci, key(a))") + tk.MustExec("insert into t values ('a'), ('A'), ('b')") + tk.MustExec("insert into t values ('a'), ('A'), ('b')") + tk.MustExec("insert into t values ('a'), ('A'), ('b')") + tk.MustExec("insert into t values ('s'), ('ss'), ('ß')") + tk.MustQuery("select count(1) from t group by a collate utf8mb4_bin order by a collate utf8mb4_bin").Check(testkit.Rows("3", "3", "3", "1", "1", "1")) + tk.MustQuery("select count(1) from t group by a collate utf8mb4_unicode_ci order by a collate utf8mb4_unicode_ci").Check(testkit.Rows("6", "3", "1", "2")) + tk.MustQuery("select count(1) from t group by a collate utf8mb4_general_ci order by a collate utf8mb4_general_ci").Check(testkit.Rows("6", "3", "2", "1")) +} + +func TestCollateStreamAgg(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + prepare4Collation(tk, true) + tk.HasPlan("select distinct(v) from t_bin", "StreamAgg") + tk.MustQuery("select distinct(v) from t_bin").Sort().Check(testkit.Rows(" ", "a", "b", "c", "À", "à", "á")) + tk.HasPlan("select distinct(v) from t", "StreamAgg") + tk.MustQuery("select distinct(v) from t").Sort().Check(testkit.Rows(" ", "a", "b", "c")) + tk.HasPlan("select v, count(*) from t_bin group by v", "StreamAgg") + tk.MustQuery("select v, count(*) from t_bin group by v").Sort().Check(testkit.Rows(" 1", "a 1", "b 1", "c 1", "À 1", "à 1", "á 1")) + tk.HasPlan("select v, count(*) from t group by v", "StreamAgg") + tk.MustQuery("select v, count(*) from t group by v").Sort().Check(testkit.Rows(" 1", "a 4", "b 1", "c 1")) +} + +func TestCollateIndexReader(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + prepare4Collation(tk, true) + tk.HasPlan("select v from t where v < 'b' order by v", "IndexReader") + tk.MustQuery("select v from t where v < 'b' order by v").Check(testkit.Rows(" ", "a", "À", "á", "à")) + tk.HasPlan("select v from t where v < 'b' and v > ' ' order by v", "IndexReader") + tk.MustQuery("select v from t where v < 'b' and v > ' ' order by v").Check(testkit.Rows("a", "À", "á", "à")) + tk.HasPlan("select v from t_bin where v < 'b' order by v", "IndexReader") + tk.MustQuery("select v from t_bin where v < 'b' order by v").Sort().Check(testkit.Rows(" ", "a")) + tk.HasPlan("select v from t_bin where v < 'b' and v > ' ' order by v", "IndexReader") + tk.MustQuery("select v from t_bin where v < 'b' and v > ' ' order by v").Sort().Check(testkit.Rows("a")) +} + +func TestCollateIndexLookup(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + prepare4Collation(tk, true) + + tk.HasPlan("select id from t where v < 'b'", "IndexLookUp") + tk.MustQuery("select id from t where v < 'b'").Sort().Check(testkit.Rows("1", "2", "3", "4", "7")) + tk.HasPlan("select id from t where v < 'b' and v > ' '", "IndexLookUp") + tk.MustQuery("select id from t where v < 'b' and v > ' '").Sort().Check(testkit.Rows("1", "2", "3", "4")) + tk.HasPlan("select id from t_bin where v < 'b'", "IndexLookUp") + tk.MustQuery("select id from t_bin where v < 'b'").Sort().Check(testkit.Rows("1", "7")) + tk.HasPlan("select id from t_bin where v < 'b' and v > ' '", "IndexLookUp") + tk.MustQuery("select id from t_bin where v < 'b' and v > ' '").Sort().Check(testkit.Rows("1")) +} + +func TestIssue16668(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists tx") + tk.MustExec("CREATE TABLE `tx` ( `a` int(11) NOT NULL,`b` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL)") + tk.MustExec("insert into tx values (1, 'a'), (2, 'À'), (3, 'á'), (4, 'à'), (5, 'b'), (6, 'c'), (7, ' ')") + tk.MustQuery("select count(distinct(b)) from tx").Check(testkit.Rows("4")) +} + +func TestIssue27091(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists tx") + tk.MustExec("CREATE TABLE `tx` ( `a` int(11) NOT NULL,`b` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, `c` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL)") + tk.MustExec("insert into tx values (1, 'a', 'a'), (2, 'A ', 'a '), (3, 'A', 'A'), (4, 'a ', 'A ')") + tk.MustQuery("select count(distinct b) from tx").Check(testkit.Rows("1")) + tk.MustQuery("select count(distinct c) from tx").Check(testkit.Rows("2")) + tk.MustQuery("select count(distinct b, c) from tx where a < 3").Check(testkit.Rows("1")) + tk.MustQuery("select approx_count_distinct(b) from tx").Check(testkit.Rows("1")) + tk.MustQuery("select approx_count_distinct(c) from tx").Check(testkit.Rows("2")) + tk.MustQuery("select approx_count_distinct(b, c) from tx where a < 3").Check(testkit.Rows("1")) +} + +func TestCollateStringFunction(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + + tk.MustQuery("select field('a', 'b', 'a');").Check(testkit.Rows("2")) + tk.MustQuery("select field('a', 'b', 'A');").Check(testkit.Rows("0")) + tk.MustQuery("select field('a', 'b', 'A' collate utf8mb4_bin);").Check(testkit.Rows("0")) + tk.MustQuery("select field('a', 'b', 'a ' collate utf8mb4_bin);").Check(testkit.Rows("2")) + tk.MustQuery("select field('a', 'b', 'A' collate utf8mb4_unicode_ci);").Check(testkit.Rows("2")) + tk.MustQuery("select field('a', 'b', 'a ' collate utf8mb4_unicode_ci);").Check(testkit.Rows("2")) + tk.MustQuery("select field('a', 'b', 'A' collate utf8mb4_general_ci);").Check(testkit.Rows("2")) + tk.MustQuery("select field('a', 'b', 'a ' collate utf8mb4_general_ci);").Check(testkit.Rows("2")) + + tk.MustExec("USE test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a char(10), b char (10)) collate utf8mb4_general_ci") + tk.MustExec("insert into t values ('a', 'A')") + tk.MustQuery("select field(a, b) from t").Check(testkit.Rows("1")) + + tk.MustQuery("select FIND_IN_SET('a','b,a,c,d');").Check(testkit.Rows("2")) + tk.MustQuery("select FIND_IN_SET('a','b,A,c,d');").Check(testkit.Rows("0")) + tk.MustQuery("select FIND_IN_SET('a','b,A,c,d' collate utf8mb4_bin);").Check(testkit.Rows("0")) + tk.MustQuery("select FIND_IN_SET('a','b,a ,c,d' collate utf8mb4_bin);").Check(testkit.Rows("2")) + tk.MustQuery("select FIND_IN_SET('a','b,A,c,d' collate utf8mb4_general_ci);").Check(testkit.Rows("2")) + tk.MustQuery("select FIND_IN_SET('a','b,a ,c,d' collate utf8mb4_general_ci);").Check(testkit.Rows("2")) + + tk.MustExec("set names utf8mb4 collate utf8mb4_general_ci;") + tk.MustQuery("select collation(cast('a' as char));").Check(testkit.Rows("utf8mb4_general_ci")) + tk.MustQuery("select collation(cast('a' as binary));").Check(testkit.Rows("binary")) + tk.MustQuery("select collation(cast('a' collate utf8mb4_bin as char));").Check(testkit.Rows("utf8mb4_general_ci")) + tk.MustQuery("select collation(cast('a' collate utf8mb4_bin as binary));").Check(testkit.Rows("binary")) + + tk.MustQuery("select FIND_IN_SET('a','b,A,c,d' collate utf8mb4_unicode_ci);").Check(testkit.Rows("2")) + tk.MustQuery("select FIND_IN_SET('a','b,a ,c,d' collate utf8mb4_unicode_ci);").Check(testkit.Rows("2")) + + tk.MustExec("select concat('a' collate utf8mb4_bin, 'b' collate utf8mb4_bin);") + tk.MustGetErrMsg("select concat('a' collate utf8mb4_bin, 'b' collate utf8mb4_general_ci);", "[expression:1267]Illegal mix of collations (utf8mb4_bin,EXPLICIT) and (utf8mb4_general_ci,EXPLICIT) for operation 'concat'") + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a char)") + tk.MustGetErrMsg("select * from t t1 join t t2 on t1.a collate utf8mb4_bin = t2.a collate utf8mb4_general_ci;", "[expression:1267]Illegal mix of collations (utf8mb4_bin,EXPLICIT) and (utf8mb4_general_ci,EXPLICIT) for operation '='") + + tk.MustExec("DROP TABLE IF EXISTS t1;") + tk.MustExec("CREATE TABLE t1 ( a int, p1 VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_bin,p2 VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci , p3 VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin,p4 VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci ,n1 VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_bin,n2 VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci , n3 VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin,n4 VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci );") + tk.MustExec("insert into t1 (a,p1,p2,p3,p4,n1,n2,n3,n4) values(1,' 0aA1!测试テストמבחן ',' 0aA1!测试テストמבחן ',' 0aA1!测试テストמבחן ',' 0aA1!测试テストמבחן ',' 0Aa1!测试テストמבחן ',' 0Aa1!测试テストמבחן ',' 0Aa1!测试テストמבחן ',' 0Aa1!测试テストמבחן ');") + + tk.MustQuery("select INSTR(p1,n1) from t1;").Check(testkit.Rows("0")) + tk.MustQuery("select INSTR(p1,n2) from t1;").Check(testkit.Rows("0")) + tk.MustQuery("select INSTR(p1,n3) from t1;").Check(testkit.Rows("0")) + tk.MustQuery("select INSTR(p1,n4) from t1;").Check(testkit.Rows("0")) + tk.MustQuery("select INSTR(p2,n1) from t1;").Check(testkit.Rows("0")) + tk.MustQuery("select INSTR(p2,n2) from t1;").Check(testkit.Rows("1")) + tk.MustQuery("select INSTR(p2,n3) from t1;").Check(testkit.Rows("0")) + tk.MustQuery("select INSTR(p2,n4) from t1;").Check(testkit.Rows("1")) + tk.MustQuery("select INSTR(p3,n1) from t1;").Check(testkit.Rows("0")) + tk.MustQuery("select INSTR(p3,n2) from t1;").Check(testkit.Rows("0")) + tk.MustQuery("select INSTR(p3,n3) from t1;").Check(testkit.Rows("0")) + tk.MustQuery("select INSTR(p3,n4) from t1;").Check(testkit.Rows("0")) + tk.MustQuery("select INSTR(p4,n1) from t1;").Check(testkit.Rows("0")) + tk.MustQuery("select INSTR(p4,n2) from t1;").Check(testkit.Rows("1")) + tk.MustQuery("select INSTR(p4,n3) from t1;").Check(testkit.Rows("0")) + tk.MustQuery("select INSTR(p4,n4) from t1;").Check(testkit.Rows("1")) + + tk.MustExec("truncate table t1;") + tk.MustExec("insert into t1 (a,p1,p2,p3,p4,n1,n2,n3,n4) values (1,'0aA1!测试テストמבחן ','0aA1!测试テストמבחן ','0aA1!测试テストמבחן ','0aA1!测试テストמבחן ','0Aa1!测试テストמבחן','0Aa1!测试テストמבחן','0Aa1!测试テストמבחן','0Aa1!测试テストמבחן');") + tk.MustExec("insert into t1 (a,p1,p2,p3,p4,n1,n2,n3,n4) values (2,'0aA1!测试テストמבחן','0aA1!测试テストמבחן','0aA1!测试テストמבחן','0aA1!测试テストמבחן','0Aa1!测试テストמבחן','0Aa1!测试テストמבחן','0Aa1!测试テストמבחן','0Aa1!测试テストמבחן');") + tk.MustExec("insert into t1 (a,p1,p2,p3,p4,n1,n2,n3,n4) values (3,'0aA1!测试テストמבחן','0aA1!测试テストמבחן','0aA1!测试テストמבחן','0aA1!测试テストמבחן','0Aa1!测试テストמבחן ','0Aa1!测试テストמבחן ','0Aa1!测试テストמבחן ','0Aa1!测试テストמבחן ');") + + tk.MustQuery("select LOCATE(p1,n1) from t1;").Check(testkit.Rows("0", "0", "0")) + tk.MustQuery("select LOCATE(p1,n2) from t1;").Check(testkit.Rows("0", "0", "0")) + tk.MustQuery("select LOCATE(p1,n3) from t1;").Check(testkit.Rows("0", "0", "0")) + tk.MustQuery("select LOCATE(p1,n4) from t1;").Check(testkit.Rows("0", "1", "1")) + tk.MustQuery("select LOCATE(p2,n1) from t1;").Check(testkit.Rows("0", "0", "0")) + tk.MustQuery("select LOCATE(p2,n2) from t1;").Check(testkit.Rows("0", "1", "1")) + tk.MustQuery("select LOCATE(p2,n3) from t1;").Check(testkit.Rows("0", "0", "0")) + tk.MustQuery("select LOCATE(p2,n4) from t1;").Check(testkit.Rows("0", "1", "1")) + tk.MustQuery("select LOCATE(p3,n1) from t1;").Check(testkit.Rows("0", "0", "0")) + tk.MustQuery("select LOCATE(p3,n2) from t1;").Check(testkit.Rows("0", "0", "0")) + tk.MustQuery("select LOCATE(p3,n3) from t1;").Check(testkit.Rows("0", "0", "0")) + tk.MustQuery("select LOCATE(p3,n4) from t1;").Check(testkit.Rows("0", "0", "0")) + tk.MustQuery("select LOCATE(p4,n1) from t1;").Check(testkit.Rows("0", "1", "1")) + tk.MustQuery("select LOCATE(p4,n2) from t1;").Check(testkit.Rows("0", "1", "1")) + tk.MustQuery("select LOCATE(p4,n3) from t1;").Check(testkit.Rows("0", "0", "0")) + tk.MustQuery("select LOCATE(p4,n4) from t1;").Check(testkit.Rows("0", "1", "1")) + + tk.MustQuery("select locate('S', 's' collate utf8mb4_general_ci);").Check(testkit.Rows("1")) + tk.MustQuery("select locate('S', 'a' collate utf8mb4_general_ci);").Check(testkit.Rows("0")) + // MySQL return 0 here, I believe it is a bug in MySQL since 'ß' == 's' under utf8mb4_general_ci collation. + tk.MustQuery("select locate('ß', 's' collate utf8mb4_general_ci);").Check(testkit.Rows("1")) + tk.MustQuery("select locate('S', 's' collate utf8mb4_unicode_ci);").Check(testkit.Rows("1")) + tk.MustQuery("select locate('S', 'a' collate utf8mb4_unicode_ci);").Check(testkit.Rows("0")) + tk.MustQuery("select locate('ß', 'ss' collate utf8mb4_unicode_ci);").Check(testkit.Rows("1")) + + tk.MustExec("truncate table t1;") + tk.MustExec("insert into t1 (a) values (1);") + tk.MustExec("insert into t1 (a,p1,p2,p3,p4,n1,n2,n3,n4) values (2,'0aA1!测试テストמבחן ','0aA1!测试テストמבחן ','0aA1!测试テストמבחן ','0aA1!测试テストמבחן ','0Aa1!测试テストמבחן','0Aa1!测试テストמבחן','0Aa1!测试テストמבחן','0Aa1!测试テストמבחן');") + tk.MustExec("insert into t1 (a,p1,p2,p3,p4,n1,n2,n3,n4) values (3,'0aA1!测试テストמבחן','0aA1!测试テストמבחן','0aA1!测试テストמבחן','0aA1!测试テストמבחן','0Aa1!测试テストמבחן','0Aa1!测试テストמבחן','0Aa1!测试テストמבחן','0Aa1!测试テストמבחן');") + tk.MustExec("insert into t1 (a,p1,p2,p3,p4,n1,n2,n3,n4) values (4,'0aA1!测试テストמבחן','0aA1!测试テストמבחן','0aA1!测试テストמבחן','0aA1!测试テストמבחן','0Aa1!测试テストמבחן ','0Aa1!测试テストמבחן ','0Aa1!测试テストמבחן ','0Aa1!测试テストמבחן ');") + tk.MustExec("insert into t1 (a,p1,p2,p3,p4,n1,n2,n3,n4) values (5,'0aA1!测试テストמבחן0aA1!测试','0aA1!测试テストמבחן0aA1!测试','0aA1!测试テストמבחן0aA1!测试','0aA1!测试テストמבחן0aA1!测试','0Aa1!测试','0Aa1!测试','0Aa1!测试','0Aa1!测试');") + tk.MustExec("insert into t1 (a,p1,p2,p3,p4,n1,n2,n3,n4) values (6,'0aA1!测试テストמבחן0aA1!测试','0aA1!测试テストמבחן0aA1!测试','0aA1!测试テストמבחן0aA1!测试','0aA1!测试テストמבחן0aA1!测试','0aA1!测试','0aA1!测试','0aA1!测试','0aA1!测试');") + tk.MustExec("insert into t1 (a,p1,p2,p3,p4,n1,n2,n3,n4) values (7,'0aA1!测试テストמבחן ','0aA1!测试テストמבחן ','0aA1!测试テストמבחן ','0aA1!测试テストמבחן ','0aA1!测试テストמבחן','0aA1!测试テストמבחן','0aA1!测试テストמבחן','0aA1!测试テストמבחן');") + tk.MustExec("insert into t1 (a,p1,p2,p3,p4,n1,n2,n3,n4) values (8,'0aA1!测试テストמבחן','0aA1!测试テストמבחן','0aA1!测试テストמבחן','0aA1!测试テストמבחן','0aA1!测试テストמבחן ','0aA1!测试テストמבחן ','0aA1!测试テストמבחן ','0aA1!测试テストמבחן ');") + + tk.MustQuery("select p1 REGEXP n1 from t1;").Check(testkit.Rows("<nil>", "0", "0", "0", "0", "1", "1", "0")) + tk.MustQuery("select p1 REGEXP n2 from t1;").Check(testkit.Rows("<nil>", "0", "0", "0", "0", "1", "1", "0")) + tk.MustQuery("select p1 REGEXP n3 from t1;").Check(testkit.Rows("<nil>", "0", "0", "0", "0", "1", "1", "0")) + tk.MustQuery("select p1 REGEXP n4 from t1;").Check(testkit.Rows("<nil>", "1", "1", "0", "1", "1", "1", "0")) + tk.MustQuery("select p2 REGEXP n1 from t1;").Check(testkit.Rows("<nil>", "0", "0", "0", "0", "1", "1", "0")) + tk.MustQuery("select p2 REGEXP n2 from t1;").Check(testkit.Rows("<nil>", "1", "1", "0", "1", "1", "1", "0")) + tk.MustQuery("select p2 REGEXP n3 from t1;").Check(testkit.Rows("<nil>", "0", "0", "0", "0", "1", "1", "0")) + tk.MustQuery("select p2 REGEXP n4 from t1;").Check(testkit.Rows("<nil>", "1", "1", "0", "1", "1", "1", "0")) + tk.MustQuery("select p3 REGEXP n1 from t1;").Check(testkit.Rows("<nil>", "0", "0", "0", "0", "1", "1", "0")) + tk.MustQuery("select p3 REGEXP n2 from t1;").Check(testkit.Rows("<nil>", "0", "0", "0", "0", "1", "1", "0")) + tk.MustQuery("select p3 REGEXP n3 from t1;").Check(testkit.Rows("<nil>", "0", "0", "0", "0", "1", "1", "0")) + tk.MustQuery("select p3 REGEXP n4 from t1;").Check(testkit.Rows("<nil>", "0", "0", "0", "0", "1", "1", "0")) + tk.MustQuery("select p4 REGEXP n1 from t1;").Check(testkit.Rows("<nil>", "1", "1", "0", "1", "1", "1", "0")) + tk.MustQuery("select p4 REGEXP n2 from t1;").Check(testkit.Rows("<nil>", "1", "1", "0", "1", "1", "1", "0")) + tk.MustQuery("select p4 REGEXP n3 from t1;").Check(testkit.Rows("<nil>", "0", "0", "0", "0", "1", "1", "0")) + tk.MustQuery("select p4 REGEXP n4 from t1;").Check(testkit.Rows("<nil>", "1", "1", "0", "1", "1", "1", "0")) + + tk.MustExec("drop table t1;") +} + +func TestCollateLike(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("set names utf8mb4 collate utf8mb4_general_ci") + tk.MustQuery("select 'a' like 'A'").Check(testkit.Rows("1")) + tk.MustQuery("select 'a' like 'A' collate utf8mb4_general_ci").Check(testkit.Rows("1")) + tk.MustQuery("select 'a' like 'À'").Check(testkit.Rows("1")) + tk.MustQuery("select 'a' like '%À'").Check(testkit.Rows("1")) + tk.MustQuery("select 'a' like '%À '").Check(testkit.Rows("0")) + tk.MustQuery("select 'a' like 'À%'").Check(testkit.Rows("1")) + tk.MustQuery("select 'a' like 'À_'").Check(testkit.Rows("0")) + tk.MustQuery("select 'a' like '%À%'").Check(testkit.Rows("1")) + tk.MustQuery("select 'aaa' like '%ÀAa%'").Check(testkit.Rows("1")) + tk.MustExec("set names utf8mb4 collate utf8mb4_bin") + + tk.MustExec("use test;") + tk.MustExec("drop table if exists t_like;") + tk.MustExec("create table t_like(id int, b varchar(20) collate utf8mb4_general_ci);") + tk.MustExec("insert into t_like values (1, 'aaa'), (2, 'abc'), (3, 'aac');") + tk.MustQuery("select b like 'AaÀ' from t_like order by id;").Check(testkit.Rows("1", "0", "0")) + tk.MustQuery("select b like 'Aa_' from t_like order by id;").Check(testkit.Rows("1", "0", "1")) + tk.MustQuery("select b like '_A_' from t_like order by id;").Check(testkit.Rows("1", "0", "1")) + tk.MustQuery("select b from t_like where b like 'Aa_' order by id;").Check(testkit.Rows("aaa", "aac")) + tk.MustQuery("select b from t_like where b like 'A%' order by id;").Check(testkit.Rows("aaa", "abc", "aac")) + tk.MustQuery("select b from t_like where b like '%A%' order by id;").Check(testkit.Rows("aaa", "abc", "aac")) + tk.MustExec("alter table t_like add index idx_b(b);") + tk.MustQuery("select b from t_like use index(idx_b) where b like 'Aa_' order by id;").Check(testkit.Rows("aaa", "aac")) + tk.MustQuery("select b from t_like use index(idx_b) where b like 'A%' order by id;").Check(testkit.Rows("aaa", "abc", "aac")) + tk.MustQuery("select b from t_like use index(idx_b) where b like '%A%' order by id;").Check(testkit.Rows("aaa", "abc", "aac")) +} + +func TestCollateSubQuery(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + prepare4Collation(tk, false) + tk.MustQuery("select id from t where v in (select v from t_bin) order by id").Check(testkit.Rows("1", "2", "3", "4", "5", "6", "7")) + tk.MustQuery("select id from t_bin where v in (select v from t) order by id").Check(testkit.Rows("1", "2", "3", "4", "5", "6", "7")) + tk.MustQuery("select id from t where v not in (select v from t_bin) order by id").Check(testkit.Rows()) + tk.MustQuery("select id from t_bin where v not in (select v from t) order by id").Check(testkit.Rows()) + tk.MustQuery("select id from t where exists (select 1 from t_bin where t_bin.v=t.v) order by id").Check(testkit.Rows("1", "2", "3", "4", "5", "6", "7")) + tk.MustQuery("select id from t_bin where exists (select 1 from t where t_bin.v=t.v) order by id").Check(testkit.Rows("1", "2", "3", "4", "5", "6", "7")) + tk.MustQuery("select id from t where not exists (select 1 from t_bin where t_bin.v=t.v) order by id").Check(testkit.Rows()) + tk.MustQuery("select id from t_bin where not exists (select 1 from t where t_bin.v=t.v) order by id").Check(testkit.Rows()) +} + +func TestCollateDDL(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("create database t;") + tk.MustExec("use t;") + tk.MustExec("drop database t;") +} + +func TestNewCollationWithClusterIndex(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.Session().GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeOn + tk.MustExec("create table t(d double primary key, a int, name varchar(255), index idx(name(2)), index midx(a, name))") + tk.MustExec("insert into t values(2.11, 1, \"aa\"), (-1, 0, \"abcd\"), (9.99, 0, \"aaaa\")") + tk.MustQuery("select d from t use index(idx) where name=\"aa\"").Check(testkit.Rows("2.11")) +} + +func TestNewCollationBinaryFlag(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a varchar(2) binary, index (a));") + tk.MustExec("insert into t values ('a ');") + tk.MustQuery("select hex(a) from t;").Check(testkit.Rows("6120")) + tk.MustQuery("select hex(a) from t use index (a);").Check(testkit.Rows("6120")) + + showCreateTable := func(createSQL string) string { + tk.MustExec("drop table if exists t;") + tk.MustExec(createSQL) + s := tk.MustQuery("show create table t;").Rows()[0][1].(string) + return s + } + var sct string + // define case = tuple(table_charset, table_collation, column_charset, column_collation) + // case: (nil, nil, nil, nil) + sct = showCreateTable("create table t(a varchar(10) binary);") + require.Contains(t, sct, "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin") + // case: (nil, utf8_general_ci, nil, nil) + sct = showCreateTable("create table t(a varchar(10) binary) collate utf8_general_ci;") + require.Contains(t, sct, "varchar(10) COLLATE utf8_bin") + require.Contains(t, sct, "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci") + // case: (nil, nil, nil, utf8_general_ci) + sct = showCreateTable("create table t(a varchar(10) binary collate utf8_general_ci);") + require.Contains(t, sct, "varchar(10) CHARACTER SET utf8 COLLATE utf8_bin") + // case: (nil, nil, utf8, utf8_general_ci) + sct = showCreateTable("create table t(a varchar(10) binary charset utf8 collate utf8_general_ci);") + require.Contains(t, sct, "varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci") + // case: (utf8, utf8_general_ci, utf8mb4, utf8mb4_unicode_ci) + sct = showCreateTable("create table t(a varchar(10) binary charset utf8mb4 collate utf8mb4_unicode_ci) charset utf8 collate utf8_general_ci;") + require.Contains(t, sct, "varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci") + require.Contains(t, sct, "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci") + // case: (nil, nil, binary, nil) + sct = showCreateTable("create table t(a varchar(10) binary charset binary);") + require.Contains(t, sct, "varbinary(10) DEFAULT NULL") + require.Contains(t, sct, "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin") +} + +func TestIssue17176(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustGetErrMsg("create table t(a enum('a', 'a ')) charset utf8 collate utf8_bin;", "[types:1291]Column 'a' has duplicated value 'a' in ENUM") + tk.MustGetErrMsg("create table t(a enum('a', 'Á')) charset utf8 collate utf8_general_ci;", "[types:1291]Column 'a' has duplicated value 'Á' in ENUM") + tk.MustGetErrMsg("create table t(a enum('a', 'a ')) charset utf8mb4 collate utf8mb4_bin;", "[types:1291]Column 'a' has duplicated value 'a' in ENUM") + tk.MustExec("create table t(a enum('a', 'A')) charset utf8 collate utf8_bin;") + tk.MustExec("drop table t;") + tk.MustExec("create table t3(a enum('a', 'A')) charset utf8mb4 collate utf8mb4_bin;") +} + +func TestIssue18638(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a varchar(10) collate utf8mb4_bin, b varchar(10) collate utf8mb4_general_ci);") + tk.MustExec("insert into t (a, b) values ('a', 'A');") + tk.MustQuery("select * from t t1, t t2 where t1.a = t2.b collate utf8mb4_general_ci;").Check(testkit.Rows("a A a A")) + tk.MustQuery("select * from t t1 left join t t2 on t1.a = t2.b collate utf8mb4_general_ci;").Check(testkit.Rows("a A a A")) +} + +func TestCollationText(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a TINYTEXT collate UTF8MB4_GENERAL_CI, UNIQUE KEY `a`(`a`(10)));") + tk.MustExec("insert into t (a) values ('A');") + tk.MustQuery("select * from t t1 inner join t t2 on t1.a = t2.a where t1.a = 'A';").Check(testkit.Rows("A A")) + tk.MustExec("update t set a = 'B';") + tk.MustExec("admin check table t;") +} + +func TestIssue18662(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a varchar(10) collate utf8mb4_bin, b varchar(10) collate utf8mb4_general_ci);") + tk.MustExec("insert into t (a, b) values ('a', 'A');") + tk.MustQuery("select * from t where field('A', a collate utf8mb4_general_ci, b) > 1;").Check(testkit.Rows()) + tk.MustQuery("select * from t where field('A', a, b collate utf8mb4_general_ci) > 1;").Check(testkit.Rows()) + tk.MustQuery("select * from t where field('A' collate utf8mb4_general_ci, a, b) > 1;").Check(testkit.Rows()) + tk.MustQuery("select * from t where field('A', a, b) > 1;").Check(testkit.Rows("a A")) +} + +func TestIssue19116(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("set names utf8mb4 collate utf8mb4_general_ci;") + tk.MustQuery("select collation(concat(1 collate `binary`));").Check(testkit.Rows("binary")) + tk.MustQuery("select coercibility(concat(1 collate `binary`));").Check(testkit.Rows("0")) + tk.MustQuery("select collation(concat(NULL,NULL));").Check(testkit.Rows("binary")) + tk.MustQuery("select coercibility(concat(NULL,NULL));").Check(testkit.Rows("6")) + tk.MustQuery("select collation(concat(1,1));").Check(testkit.Rows("utf8mb4_general_ci")) + tk.MustQuery("select coercibility(concat(1,1));").Check(testkit.Rows("4")) + tk.MustQuery("select collation(1);").Check(testkit.Rows("binary")) + tk.MustQuery("select coercibility(1);").Check(testkit.Rows("5")) + tk.MustQuery("select coercibility(1=1);").Check(testkit.Rows("5")) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a datetime)") + tk.MustExec("insert into t values ('2020-02-02')") + tk.MustQuery("select collation(concat(unix_timestamp(a))) from t;").Check(testkit.Rows("utf8mb4_general_ci")) + tk.MustQuery("select coercibility(concat(unix_timestamp(a))) from t;").Check(testkit.Rows("4")) +} + +func TestIssue17063(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec(`use test;`) + tk.MustExec(`drop table if exists t;`) + tk.MustExec("create table t(a char, b char) collate utf8mb4_general_ci;") + tk.MustExec(`insert into t values('a', 'b');`) + tk.MustExec(`insert into t values('a', 'B');`) + tk.MustQuery(`select * from t where if(a='x', a, b) = 'b';`).Check(testkit.Rows("a b", "a B")) + tk.MustQuery(`select collation(if(a='x', a, b)) from t;`).Check(testkit.Rows("utf8mb4_general_ci", "utf8mb4_general_ci")) + tk.MustQuery(`select coercibility(if(a='x', a, b)) from t;`).Check(testkit.Rows("2", "2")) + tk.MustQuery(`select collation(lag(b, 1, 'B') over w) from t window w as (order by b);`).Check(testkit.Rows("utf8mb4_general_ci", "utf8mb4_general_ci")) + tk.MustQuery(`select coercibility(lag(b, 1, 'B') over w) from t window w as (order by b);`).Check(testkit.Rows("2", "2")) +} + +func TestIssue11177(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustQuery("SELECT 'lvuleck' BETWEEN '2008-09-16 22:23:50' AND 0;").Check(testkit.Rows("0")) + tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1292 Truncated incorrect DOUBLE value: 'lvuleck'", "Warning 1292 Truncated incorrect DOUBLE value: '2008-09-16 22:23:50'")) + tk.MustQuery("SELECT 'aa' BETWEEN 'bb' AND 0;").Check(testkit.Rows("1")) + tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1292 Truncated incorrect DOUBLE value: 'aa'", "Warning 1292 Truncated incorrect DOUBLE value: 'bb'")) + tk.MustQuery("select 1 between 0 and b'110';").Check(testkit.Rows("1")) + tk.MustQuery("show warnings;").Check(testkit.Rows()) + tk.MustQuery("select 'b' between 'a' and b'110';").Check(testkit.Rows("0")) + tk.MustQuery("show warnings;").Check(testkit.Rows()) +} + +func TestIssue19804(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec(`use test;`) + tk.MustExec(`drop table if exists t;`) + tk.MustExec(`create table t(a set('a', 'b', 'c'));`) + tk.MustGetErrMsg("alter table t change a a set('a', 'b', 'c', 'c');", "[types:1291]Column 'a' has duplicated value 'c' in SET") + tk.MustExec(`drop table if exists t;`) + tk.MustExec(`create table t(a enum('a', 'b', 'c'));`) + tk.MustGetErrMsg("alter table t change a a enum('a', 'b', 'c', 'c');", "[types:1291]Column 'a' has duplicated value 'c' in ENUM") + tk.MustExec(`drop table if exists t;`) + tk.MustExec(`create table t(a set('a', 'b', 'c'));`) + tk.MustExec(`alter table t change a a set('a', 'b', 'c', 'd');`) + tk.MustExec(`insert into t values('d');`) + tk.MustGetErrMsg(`alter table t change a a set('a', 'b', 'c', 'e', 'f');`, "[types:1265]Data truncated for column 'a', value is 'd'") +} + +func TestIssue20209(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec(`use test;`) + tk.MustExec(`set @@character_set_client=utf8mb4;`) + tk.MustExec(`set @@collation_connection=utf8_bin;`) + tk.MustExec("CREATE VIEW tview_1 AS SELECT 'a' AS `id`;") +} + +func TestIssue18949(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec(`use test;`) + tk.MustExec(`drop table if exists t;`) + tk.MustExec(`create table t(a enum('a ', 'b\t', ' c '), b set('a ', 'b\t', ' c '));`) + result := tk.MustQuery("show create table t").Rows()[0][1] + require.Regexp(t, `(?s).*enum\('a','b ',' c'\).*set\('a','b ',' c'\).*`, result) + tk.MustExec(`alter table t change a aa enum('a ', 'b\t', ' c ');`) + result = tk.MustQuery("show create table t").Rows()[0][1] + require.Regexp(t, `(?s).*enum\('a','b ',' c'\).*set\('a','b ',' c'\).*`, result) +} + +func TestClusteredIndexAndNewCollationIndexEncodeDecodeV5(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.Session().GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeOn + tk.MustExec("create table t(a int, b char(10) collate utf8mb4_bin, c char(10) collate utf8mb4_general_ci," + + "d varchar(10) collate utf8mb4_bin, e varchar(10) collate utf8mb4_general_ci, f char(10) collate utf8mb4_unicode_ci, g varchar(10) collate utf8mb4_unicode_ci, " + + "primary key(a, b, c, d, e, f, g), key a(a), unique key ua(a), key b(b), unique key ub(b), key c(c), unique key uc(c)," + + "key d(d), unique key ud(d),key e(e), unique key ue(e), key f(f), key g(g), unique key uf(f), unique key ug(g))") + + tk.MustExec("insert into t values (1, '啊 ', '啊 ', '啊 ', '啊 ', '啊 ', '啊 ')") + // Single Read. + tk.MustQuery("select * from t ").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) + + tk.MustQuery("select * from t use index(a)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) + tk.MustQuery("select * from t use index(ua)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) + tk.MustQuery("select * from t use index(b)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) + tk.MustQuery("select * from t use index(ub)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) + tk.MustQuery("select * from t use index(c)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) + tk.MustQuery("select * from t use index(uc)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) + tk.MustQuery("select * from t use index(d)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) + tk.MustQuery("select * from t use index(ud)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) + tk.MustQuery("select * from t use index(e)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) + tk.MustQuery("select * from t use index(ue)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) + tk.MustQuery("select * from t use index(f)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) + tk.MustQuery("select * from t use index(uf)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) + tk.MustQuery("select * from t use index(g)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) + tk.MustQuery("select * from t use index(ug)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) + + tk.MustExec("alter table t add column h varchar(10) collate utf8mb4_general_ci default '🐸'") + tk.MustExec("alter table t add column i varchar(10) collate utf8mb4_general_ci default '🐸'") + tk.MustExec("alter table t add index h(h)") + tk.MustExec("alter table t add unique index uh(h)") + + tk.MustQuery("select * from t use index(h)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) + tk.MustQuery("select * from t use index(uh)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) + + // Double read. + tk.MustQuery("select * from t use index(a)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) + tk.MustQuery("select * from t use index(ua)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) + tk.MustQuery("select * from t use index(b)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) + tk.MustQuery("select * from t use index(ub)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) + tk.MustQuery("select * from t use index(c)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) + tk.MustQuery("select * from t use index(uc)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) + tk.MustQuery("select * from t use index(d)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) + tk.MustQuery("select * from t use index(ud)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) + tk.MustQuery("select * from t use index(e)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) + tk.MustQuery("select * from t use index(ue)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) + tk.MustExec("admin check table t") + tk.MustExec("admin recover index t a") + tk.MustExec("alter table t add column n char(10) COLLATE utf8mb4_unicode_ci") + tk.MustExec("alter table t add index n(n)") + tk.MustExec("update t set n = '吧';") + tk.MustQuery("select * from t").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸,吧")) + tk.MustQuery("select * from t use index(n)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸,吧")) + tk.MustExec("admin check table t") + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a varchar(255) COLLATE utf8_general_ci primary key clustered, b int) partition by range columns(a) " + + "(partition p0 values less than ('0'), partition p1 values less than MAXVALUE);") + tk.MustExec("alter table t add index b(b);") + tk.MustExec("insert into t values ('0', 1);") + tk.MustQuery("select * from t use index(b);").Check(testkit.Rows("0 1")) + tk.MustQuery("select * from t use index();").Check(testkit.Rows("0 1")) + tk.MustExec("admin check table t") +} + +func TestClusteredIndexAndNewCollation(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.Session().GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeOn + tk.MustExec("CREATE TABLE `t` (" + + "`a` char(10) COLLATE utf8mb4_unicode_ci NOT NULL," + + "`b` char(20) COLLATE utf8mb4_general_ci NOT NULL," + + "`c` int(11) NOT NULL," + + "PRIMARY KEY (`a`,`b`,`c`)," + + "KEY `idx` (`a`))") + + tk.MustExec("begin") + tk.MustExec("insert into t values ('a6', 'b6', 3)") + tk.MustQuery("select * from t").Check(testkit.Rows("a6 b6 3")) + tk.MustQuery("select * from t where a='a6'").Check(testkit.Rows("a6 b6 3")) + tk.MustExec("delete from t") + tk.MustQuery("select * from t").Check(testkit.Rows()) + tk.MustExec("commit") + tk.MustQuery("select * from t").Check(testkit.Rows()) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(`a` char(10) COLLATE utf8mb4_unicode_ci NOT NULL key)") + tk.MustExec("insert into t values ('&');") + tk.MustExec("replace into t values ('&');") + tk.MustQuery("select * from t").Check(testkit.Rows("&")) +} + +func TestIssue20608(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustQuery("select '䇇Հ' collate utf8mb4_bin like '___Հ';").Check(testkit.Rows("0")) +} + +func TestIssue20161(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec(`use test;`) + tk.MustExec(`drop table if exists t;`) + tk.MustExec(`create table t(raw JSON);`) + tk.MustExec(`insert into t(raw) values('["a","ab"]'), ('["a"]'), (null);`) + tk.MustQuery(`SELECT JSON_SEARCH(raw,'one','c') FROM t;`). + Check(testkit.Rows("<nil>", "<nil>", "<nil>")) +} + +func TestCollationIndexJoin(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("create table t1(a int, b char(10), key(b)) collate utf8mb4_general_ci") + tk.MustExec("create table t2(a int, b char(10), key(b)) collate ascii_bin") + tk.MustExec("insert into t1 values (1, 'a')") + tk.MustExec("insert into t2 values (1, 'A')") + + tk.MustQuery("select /*+ inl_join(t1) */ t1.b, t2.b from t1 join t2 where t1.b=t2.b").Check(testkit.Rows("a A")) + tk.MustQuery("select /*+ hash_join(t1) */ t1.b, t2.b from t1 join t2 where t1.b=t2.b").Check(testkit.Rows("a A")) + tk.MustQuery("select /*+ merge_join(t1) */ t1.b, t2.b from t1 join t2 where t1.b=t2.b").Check(testkit.Rows("a A")) + tk.MustQuery("select /*+ inl_hash_join(t1) */ t1.b, t2.b from t1 join t2 where t1.b=t2.b").Check(testkit.Rows("a A")) + tk.MustQuery("select /*+ inl_hash_join(t2) */ t1.b, t2.b from t1 join t2 where t1.b=t2.b").Check(testkit.Rows("a A")) + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1815 Optimizer Hint /*+ INL_HASH_JOIN(t2) */ is inapplicable")) + tk.MustQuery("select /*+ inl_merge_join(t1) */ t1.b, t2.b from t1 join t2 where t1.b=t2.b").Check(testkit.Rows("a A")) + tk.MustQuery("select /*+ inl_merge_join(t2) */ t1.b, t2.b from t1 join t2 where t1.b=t2.b").Check(testkit.Rows("a A")) + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1815 Optimizer Hint /*+ INL_MERGE_JOIN(t2) */ is inapplicable")) + + tk.MustExec("drop table if exists a, b") + tk.MustExec("create table a(i int, k varbinary(40), v int, primary key(i, k) clustered)") + tk.MustExec("create table b(i int, k varchar(40), v int, primary key(i, k) clustered)") + tk.MustExec("insert into a select 3, 'nice mccarthy', 10") + tk.MustQuery("select * from a, b where a.i = b.i and a.k = b.k").Check(testkit.Rows()) + + tk.MustExec("drop table if exists a, b") + tk.MustExec("create table a(i int NOT NULL, k varbinary(40) NOT NULL, v int, key idx1(i, k))") + tk.MustExec("create table b(i int NOT NULL, k varchar(40) NOT NULL, v int, key idx1(i, k))") + tk.MustExec("insert into a select 3, 'nice mccarthy', 10") + tk.MustQuery(" select /*+ inl_join(b) */ b.i from a, b where a.i = b.i and a.k = b.k").Check(testkit.Rows()) +} + +func TestCollationMergeJoin(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("CREATE TABLE `t` (" + + " `col_10` blob DEFAULT NULL," + + " `col_11` decimal(17,5) NOT NULL," + + " `col_13` varchar(381) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'Yr'," + + " PRIMARY KEY (`col_13`,`col_11`) CLUSTERED," + + " KEY `idx_4` (`col_10`(3))" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin") + tk.MustExec("insert into t values ('a', 12523, 'A');") + tk.MustExec("insert into t values ('A', 2, 'a');") + tk.MustExec("insert into t values ('a', 23, 'A');") + tk.MustExec("insert into t values ('a', 23, 'h2');") + tk.MustExec("insert into t values ('a', 23, 'h3');") + tk.MustExec("insert into t values ('a', 23, 'h4');") + tk.MustExec("insert into t values ('a', 23, 'h5');") + tk.MustExec("insert into t values ('a', 23, 'h6');") + tk.MustExec("insert into t values ('a', 23, 'h7');") + tk.MustQuery("select /*+ MERGE_JOIN(t) */ t.* from t where col_13 in ( select col_10 from t where t.col_13 in ( 'a', 'b' ) ) order by col_10 ;").Check( + testkit.Rows("\x41 2.00000 a", "\x61 23.00000 A", "\x61 12523.00000 A")) +} + +func TestIssue20876(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.Session().GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeOn + tk.MustExec("drop table if exists t;") + tk.MustExec("CREATE TABLE `t` (" + + " `a` char(10) COLLATE utf8mb4_unicode_ci NOT NULL," + + " `b` char(20) COLLATE utf8mb4_general_ci NOT NULL," + + " `c` int(11) NOT NULL," + + " PRIMARY KEY (`a`,`b`,`c`)," + + " KEY `idx` (`a`)" + + ")") + tk.MustExec("insert into t values ('#', 'C', 10), ('$', 'c', 20), ('$', 'c', 30), ('a', 'a', 10), ('A', 'A', 30)") + tk.MustExec("analyze table t") + tk.MustQuery("select * from t where a='#';").Check(testkit.Rows("# C 10")) +} + +func TestLikeWithCollation(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + + tk.MustQuery(`select 'a' like 'A' collate utf8mb4_unicode_ci;`).Check(testkit.Rows("1")) + tk.MustGetErrMsg(`select 'a' collate utf8mb4_bin like 'A' collate utf8mb4_unicode_ci;`, "[expression:1267]Illegal mix of collations (utf8mb4_bin,EXPLICIT) and (utf8mb4_unicode_ci,EXPLICIT) for operation 'like'") + tk.MustQuery(`select '😛' collate utf8mb4_general_ci like '😋';`).Check(testkit.Rows("1")) + tk.MustQuery(`select '😛' collate utf8mb4_general_ci = '😋';`).Check(testkit.Rows("1")) + tk.MustQuery(`select '😛' collate utf8mb4_unicode_ci like '😋';`).Check(testkit.Rows("0")) + tk.MustQuery(`select '😛' collate utf8mb4_unicode_ci = '😋';`).Check(testkit.Rows("1")) +} + +func TestCollationUnion(t *testing.T) { + // For issue 19694. + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + + tk.MustQuery("select cast('2010-09-09' as date) a union select '2010-09-09 ' order by a;").Check(testkit.Rows("2010-09-09", "2010-09-09 ")) + res := tk.MustQuery("select cast('2010-09-09' as date) a union select '2010-09-09 ';") + require.Len(t, res.Rows(), 2) + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + res = tk.MustQuery("select cast('2010-09-09' as date) a union select '2010-09-09 ';") + require.Len(t, res.Rows(), 1) +} + +func TestCollationPrefixClusteredIndex(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (k char(20), v int, primary key (k(4)) clustered, key (k)) collate utf8mb4_general_ci;") + tk.MustExec("insert into t values('01233', 1);") + tk.MustExec("create index idx on t(k(2))") + tk.MustQuery("select * from t use index(k_2);").Check(testkit.Rows("01233 1")) + tk.MustQuery("select * from t use index(idx);").Check(testkit.Rows("01233 1")) + tk.MustExec("admin check table t;") +} + +func TestIssue23805(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + + tk.MustExec("CREATE TABLE `tbl_5` (" + + " `col_25` time NOT NULL DEFAULT '05:35:58'," + + " `col_26` blob NOT NULL," + + " `col_27` double NOT NULL," + + " `col_28` char(83) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL," + + " `col_29` timestamp NOT NULL," + + " `col_30` varchar(36) COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'ywzIn'," + + " `col_31` binary(85) DEFAULT 'OIstcXsGmAyc'," + + " `col_32` datetime NOT NULL DEFAULT '2024-08-02 00:00:00'," + + " PRIMARY KEY (`col_26`(3),`col_27`) /*T![clustered_index] CLUSTERED */," + + " UNIQUE KEY `idx_10` (`col_26`(5)));") + tk.MustExec("insert ignore into tbl_5 set col_28 = 'ZmZIdSnq' , col_25 = '18:50:52.00' on duplicate key update col_26 = 'y';\n") +} + +func TestIssue26662(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1;") + tk.MustExec("create table t1(a varchar(36) NOT NULL) ENGINE = InnoDB DEFAULT CHARSET = utf8 COLLATE = utf8_general_ci;") + tk.MustExec("set names utf8;") + tk.MustQuery("select t2.b from (select t1.a as b from t1 union all select t1.a as b from t1) t2 where case when (t2.b is not null) then t2.b else '' end > '1234567';"). + Check(testkit.Rows()) +} + +func TestCollationForBinaryLiteral(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("CREATE TABLE t (`COL1` tinyblob NOT NULL, `COL2` binary(1) NOT NULL, `COL3` bigint(11) NOT NULL, PRIMARY KEY (`COL1`(5),`COL2`,`COL3`) /*T![clustered_index] CLUSTERED */)") + tk.MustExec("insert into t values(0x1E,0xEC,6966939640596047133);") + tk.MustQuery("select * from t where col1 not in (0x1B,0x20) order by col1").Check(testkit.Rows("\x1e \xec 6966939640596047133")) + tk.MustExec("drop table t") +} + +func TestMathBuiltin(t *testing.T) { + t.Skip("it has been broken. Please fix it as soon as possible.") + ctx := context.Background() + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + // for degrees + result := tk.MustQuery("select degrees(0), degrees(1)") + result.Check(testkit.Rows("0 57.29577951308232")) + result = tk.MustQuery("select degrees(2), degrees(5)") + result.Check(testkit.Rows("114.59155902616465 286.4788975654116")) + + // for sin + result = tk.MustQuery("select sin(0), sin(1.5707963267949)") + result.Check(testkit.Rows("0 1")) + result = tk.MustQuery("select sin(1), sin(100)") + result.Check(testkit.Rows("0.8414709848078965 -0.5063656411097588")) + result = tk.MustQuery("select sin('abcd')") + result.Check(testkit.Rows("0")) + + // for cos + result = tk.MustQuery("select cos(0), cos(3.1415926535898)") + result.Check(testkit.Rows("1 -1")) + result = tk.MustQuery("select cos('abcd')") + result.Check(testkit.Rows("1")) + + // for tan + result = tk.MustQuery("select tan(0.00), tan(PI()/4)") + result.Check(testkit.Rows("0 1")) + result = tk.MustQuery("select tan('abcd')") + result.Check(testkit.Rows("0")) + + // for log2 + result = tk.MustQuery("select log2(0.0)") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("select log2(4)") + result.Check(testkit.Rows("2")) + result = tk.MustQuery("select log2('8.0abcd')") + result.Check(testkit.Rows("3")) + result = tk.MustQuery("select log2(-1)") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("select log2(NULL)") + result.Check(testkit.Rows("<nil>")) + + // for log10 + result = tk.MustQuery("select log10(0.0)") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("select log10(100)") + result.Check(testkit.Rows("2")) + result = tk.MustQuery("select log10('1000.0abcd')") + result.Check(testkit.Rows("3")) + result = tk.MustQuery("select log10(-1)") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("select log10(NULL)") + result.Check(testkit.Rows("<nil>")) + + // for log + result = tk.MustQuery("select log(0.0)") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("select log(100)") + result.Check(testkit.Rows("4.605170185988092")) + result = tk.MustQuery("select log('100.0abcd')") + result.Check(testkit.Rows("4.605170185988092")) + result = tk.MustQuery("select log(-1)") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("select log(NULL)") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("select log(NULL, NULL)") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("select log(1, 100)") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("select log(0.5, 0.25)") + result.Check(testkit.Rows("2")) + result = tk.MustQuery("select log(-1, 0.25)") + result.Check(testkit.Rows("<nil>")) + + // for atan + result = tk.MustQuery("select atan(0), atan(-1), atan(1), atan(1,2)") + result.Check(testkit.Rows("0 -0.7853981633974483 0.7853981633974483 0.4636476090008061")) + result = tk.MustQuery("select atan('tidb')") + result.Check(testkit.Rows("0")) + + // for asin + result = tk.MustQuery("select asin(0), asin(-2), asin(2), asin(1)") + result.Check(testkit.Rows("0 <nil> <nil> 1.5707963267948966")) + result = tk.MustQuery("select asin('tidb')") + result.Check(testkit.Rows("0")) + + // for acos + result = tk.MustQuery("select acos(0), acos(-2), acos(2), acos(1)") + result.Check(testkit.Rows("1.5707963267948966 <nil> <nil> 0")) + result = tk.MustQuery("select acos('tidb')") + result.Check(testkit.Rows("1.5707963267948966")) + + // for pi + result = tk.MustQuery("select pi()") + result.Check(testkit.Rows("3.141592653589793")) + + // for floor + result = tk.MustQuery("select floor(0), floor(null), floor(1.23), floor(-1.23), floor(1)") + result.Check(testkit.Rows("0 <nil> 1 -2 1")) + result = tk.MustQuery("select floor('tidb'), floor('1tidb'), floor('tidb1')") + result.Check(testkit.Rows("0 1 0")) + result = tk.MustQuery("SELECT floor(t.c_datetime) FROM (select CAST('2017-07-19 00:00:00' AS DATETIME) AS c_datetime) AS t") + result.Check(testkit.Rows("20170719000000")) + result = tk.MustQuery("SELECT floor(t.c_time) FROM (select CAST('12:34:56' AS TIME) AS c_time) AS t") + result.Check(testkit.Rows("123456")) + result = tk.MustQuery("SELECT floor(t.c_time) FROM (select CAST('00:34:00' AS TIME) AS c_time) AS t") + result.Check(testkit.Rows("3400")) + result = tk.MustQuery("SELECT floor(t.c_time) FROM (select CAST('00:00:00' AS TIME) AS c_time) AS t") + result.Check(testkit.Rows("0")) + result = tk.MustQuery("SELECT floor(t.c_decimal) FROM (SELECT CAST('-10.01' AS DECIMAL(10,2)) AS c_decimal) AS t") + result.Check(testkit.Rows("-11")) + result = tk.MustQuery("SELECT floor(t.c_decimal) FROM (SELECT CAST('-10.01' AS DECIMAL(10,1)) AS c_decimal) AS t") + result.Check(testkit.Rows("-10")) + + // for ceil/ceiling + result = tk.MustQuery("select ceil(0), ceil(null), ceil(1.23), ceil(-1.23), ceil(1)") + result.Check(testkit.Rows("0 <nil> 2 -1 1")) + result = tk.MustQuery("select ceiling(0), ceiling(null), ceiling(1.23), ceiling(-1.23), ceiling(1)") + result.Check(testkit.Rows("0 <nil> 2 -1 1")) + result = tk.MustQuery("select ceil('tidb'), ceil('1tidb'), ceil('tidb1'), ceiling('tidb'), ceiling('1tidb'), ceiling('tidb1')") + result.Check(testkit.Rows("0 1 0 0 1 0")) + result = tk.MustQuery("select ceil(t.c_datetime), ceiling(t.c_datetime) from (select cast('2017-07-20 00:00:00' as datetime) as c_datetime) as t") + result.Check(testkit.Rows("20170720000000 20170720000000")) + result = tk.MustQuery("select ceil(t.c_time), ceiling(t.c_time) from (select cast('12:34:56' as time) as c_time) as t") + result.Check(testkit.Rows("123456 123456")) + result = tk.MustQuery("select ceil(t.c_time), ceiling(t.c_time) from (select cast('00:34:00' as time) as c_time) as t") + result.Check(testkit.Rows("3400 3400")) + result = tk.MustQuery("select ceil(t.c_time), ceiling(t.c_time) from (select cast('00:00:00' as time) as c_time) as t") + result.Check(testkit.Rows("0 0")) + result = tk.MustQuery("select ceil(t.c_decimal), ceiling(t.c_decimal) from (select cast('-10.01' as decimal(10,2)) as c_decimal) as t") + result.Check(testkit.Rows("-10 -10")) + result = tk.MustQuery("select ceil(t.c_decimal), ceiling(t.c_decimal) from (select cast('-10.01' as decimal(10,1)) as c_decimal) as t") + result.Check(testkit.Rows("-10 -10")) + result = tk.MustQuery("select floor(18446744073709551615), ceil(18446744073709551615)") + result.Check(testkit.Rows("18446744073709551615 18446744073709551615")) + result = tk.MustQuery("select floor(18446744073709551615.1233), ceil(18446744073709551615.1233)") + result.Check(testkit.Rows("18446744073709551615 18446744073709551616")) + result = tk.MustQuery("select floor(-18446744073709551617), ceil(-18446744073709551617), floor(-18446744073709551617.11), ceil(-18446744073709551617.11)") + result.Check(testkit.Rows("-18446744073709551617 -18446744073709551617 -18446744073709551618 -18446744073709551617")) + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a decimal(40,20) UNSIGNED);") + tk.MustExec("insert into t values(2.99999999900000000000), (12), (0);") + tk.MustQuery("select a, ceil(a) from t where ceil(a) > 1;").Check(testkit.Rows("2.99999999900000000000 3", "12.00000000000000000000 12")) + tk.MustQuery("select a, ceil(a) from t;").Check(testkit.Rows("2.99999999900000000000 3", "12.00000000000000000000 12", "0.00000000000000000000 0")) + tk.MustQuery("select ceil(-29464);").Check(testkit.Rows("-29464")) + tk.MustQuery("select a, floor(a) from t where floor(a) > 1;").Check(testkit.Rows("2.99999999900000000000 2", "12.00000000000000000000 12")) + tk.MustQuery("select a, floor(a) from t;").Check(testkit.Rows("2.99999999900000000000 2", "12.00000000000000000000 12", "0.00000000000000000000 0")) + tk.MustQuery("select floor(-29464);").Check(testkit.Rows("-29464")) + + tk.MustExec(`drop table if exists t;`) + tk.MustExec(`create table t(a decimal(40,20), b bigint);`) + tk.MustExec(`insert into t values(-2.99999990000000000000, -1);`) + tk.MustQuery(`select floor(a), floor(a), floor(a) from t;`).Check(testkit.Rows(`-3 -3 -3`)) + tk.MustQuery(`select b, floor(b) from t;`).Check(testkit.Rows(`-1 -1`)) + + // for cot + result = tk.MustQuery("select cot(1), cot(-1), cot(NULL)") + result.Check(testkit.Rows("0.6420926159343308 -0.6420926159343308 <nil>")) + result = tk.MustQuery("select cot('1tidb')") + result.Check(testkit.Rows("0.6420926159343308")) + rs, err := tk.Exec("select cot(0)") + require.NoError(t, err) + _, err = session.GetRows4Test(ctx, tk.Session(), rs) + require.Error(t, err) + terr := errors.Cause(err).(*terror.Error) + require.Equal(t, errors.ErrCode(mysql.ErrDataOutOfRange), terr.Code()) + require.NoError(t, rs.Close()) + + // for exp + result = tk.MustQuery("select exp(0), exp(1), exp(-1), exp(1.2), exp(NULL)") + result.Check(testkit.Rows("1 2.718281828459045 0.36787944117144233 3.3201169227365472 <nil>")) + result = tk.MustQuery("select exp('tidb'), exp('1tidb')") + result.Check(testkit.Rows("1 2.718281828459045")) + rs, err = tk.Exec("select exp(1000000)") + require.NoError(t, err) + _, err = session.GetRows4Test(ctx, tk.Session(), rs) + require.Error(t, err) + terr = errors.Cause(err).(*terror.Error) + require.Equal(t, errors.ErrCode(mysql.ErrDataOutOfRange), terr.Code()) + require.NoError(t, rs.Close()) + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a float)") + tk.MustExec("insert into t values(1000000)") + rs, err = tk.Exec("select exp(a) from t") + require.NoError(t, err) + _, err = session.GetRows4Test(ctx, tk.Session(), rs) + require.Error(t, err) + terr = errors.Cause(err).(*terror.Error) + require.Equal(t, errors.ErrCode(mysql.ErrDataOutOfRange), terr.Code()) + require.EqualError(t, err, "[types:1690]DOUBLE value is out of range in 'exp(test.t.a)'") + require.NoError(t, rs.Close()) + + // for conv + result = tk.MustQuery("SELECT CONV('a', 16, 2);") + result.Check(testkit.Rows("1010")) + result = tk.MustQuery("SELECT CONV('6E', 18, 8);") + result.Check(testkit.Rows("172")) + result = tk.MustQuery("SELECT CONV(-17, 10, -18);") + result.Check(testkit.Rows("-H")) + result = tk.MustQuery("SELECT CONV(10+'10'+'10'+X'0a', 10, 10);") + result.Check(testkit.Rows("40")) + result = tk.MustQuery("SELECT CONV('a', 1, 10);") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("SELECT CONV('a', 37, 10);") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("SELECT CONV(0x0020, 2, 2);") + result.Check(testkit.Rows("100000")) + result = tk.MustQuery("SELECT CONV(0b10, 16, 2)") + result.Check(testkit.Rows("10")) + result = tk.MustQuery("SELECT CONV(0b10, 16, 8)") + result.Check(testkit.Rows("2")) + tk.MustExec("drop table if exists bit") + tk.MustExec("create table bit(b bit(10))") + tk.MustExec(`INSERT INTO bit (b) VALUES + (0b0000010101), + (0b0000010101), + (NULL), + (0b0000000001), + (0b0000000000), + (0b1111111111), + (0b1111111111), + (0b1111111111), + (0b0000000000), + (0b0000000000), + (0b0000000000), + (0b0000000000), + (0b0000100000);`) + tk.MustQuery("select conv(b, 2, 2) from `bit`").Check(testkit.Rows( + "10101", + "10101", + "<nil>", + "1", + "0", + "1111111111", + "1111111111", + "1111111111", + "0", + "0", + "0", + "0", + "100000")) + + // for abs + result = tk.MustQuery("SELECT ABS(-1);") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("SELECT ABS('abc');") + result.Check(testkit.Rows("0")) + result = tk.MustQuery("SELECT ABS(18446744073709551615);") + result.Check(testkit.Rows("18446744073709551615")) + result = tk.MustQuery("SELECT ABS(123.4);") + result.Check(testkit.Rows("123.4")) + result = tk.MustQuery("SELECT ABS(-123.4);") + result.Check(testkit.Rows("123.4")) + result = tk.MustQuery("SELECT ABS(1234E-1);") + result.Check(testkit.Rows("123.4")) + result = tk.MustQuery("SELECT ABS(-9223372036854775807);") + result.Check(testkit.Rows("9223372036854775807")) + result = tk.MustQuery("SELECT ABS(NULL);") + result.Check(testkit.Rows("<nil>")) + rs, err = tk.Exec("SELECT ABS(-9223372036854775808);") + require.NoError(t, err) + _, err = session.GetRows4Test(ctx, tk.Session(), rs) + require.Error(t, err) + terr = errors.Cause(err).(*terror.Error) + require.Equal(t, errors.ErrCode(mysql.ErrDataOutOfRange), terr.Code()) + require.NoError(t, rs.Close()) + + // for round + result = tk.MustQuery("SELECT ROUND(2.5), ROUND(-2.5), ROUND(25E-1);") + result.Check(testkit.Rows("3 -3 2")) + result = tk.MustQuery("SELECT ROUND(2.5, NULL), ROUND(NULL, 4), ROUND(NULL, NULL), ROUND(NULL);") + result.Check(testkit.Rows("<nil> <nil> <nil> <nil>")) + result = tk.MustQuery("SELECT ROUND('123.4'), ROUND('123e-2');") + result.Check(testkit.Rows("123 1")) + result = tk.MustQuery("SELECT ROUND(-9223372036854775808);") + result.Check(testkit.Rows("-9223372036854775808")) + result = tk.MustQuery("SELECT ROUND(123.456, 0), ROUND(123.456, 1), ROUND(123.456, 2), ROUND(123.456, 3), ROUND(123.456, 4), ROUND(123.456, -1), ROUND(123.456, -2), ROUND(123.456, -3), ROUND(123.456, -4);") + result.Check(testkit.Rows("123 123.5 123.46 123.456 123.4560 120 100 0 0")) + result = tk.MustQuery("SELECT ROUND(123456E-3, 0), ROUND(123456E-3, 1), ROUND(123456E-3, 2), ROUND(123456E-3, 3), ROUND(123456E-3, 4), ROUND(123456E-3, -1), ROUND(123456E-3, -2), ROUND(123456E-3, -3), ROUND(123456E-3, -4);") + result.Check(testkit.Rows("123 123.5 123.46 123.456 123.456 120 100 0 0")) // TODO: Column 5 should be 123.4560 + result = tk.MustQuery("SELECT ROUND(1e14, 1), ROUND(1e15, 1), ROUND(1e308, 1)") + result.Check(testkit.Rows("100000000000000 1000000000000000 100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")) + result = tk.MustQuery("SELECT ROUND(1e-14, 1), ROUND(1e-15, 1), ROUND(1e-308, 1)") + result.Check(testkit.Rows("0 0 0")) + + // for truncate + result = tk.MustQuery("SELECT truncate(123, -2), truncate(123, 2), truncate(123, 1), truncate(123, -1);") + 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")) + // issue 17181,19390 + tk.MustQuery("select truncate(42, -9223372036854775808);").Check(testkit.Rows("0")) + tk.MustQuery("select truncate(42, 9223372036854775808);").Check(testkit.Rows("42")) + tk.MustQuery("select truncate(42, -2147483648);").Check(testkit.Rows("0")) + tk.MustQuery("select truncate(42, 2147483648);").Check(testkit.Rows("42")) + tk.MustQuery("select truncate(42, 18446744073709551615);").Check(testkit.Rows("42")) + tk.MustQuery("select truncate(42, 4294967295);").Check(testkit.Rows("42")) + tk.MustQuery("select truncate(42, -0);").Check(testkit.Rows("42")) + tk.MustQuery("select truncate(42, -307);").Check(testkit.Rows("0")) + tk.MustQuery("select truncate(42, -308);").Check(testkit.Rows("0")) + tk.MustQuery("select truncate(42, -309);").Check(testkit.Rows("0")) + tk.MustExec(`drop table if exists t;`) + tk.MustExec("create table t (a bigint unsigned);") + tk.MustExec("insert into t values (18446744073709551615), (4294967295), (9223372036854775808), (2147483648);") + tk.MustQuery("select truncate(42, a) from t;").Check(testkit.Rows("42", "42", "42", "42")) + + tk.MustExec(`drop table if exists t;`) + tk.MustExec(`create table t(a date, b datetime, c timestamp, d varchar(20));`) + tk.MustExec(`insert into t select "1234-12-29", "1234-12-29 16:24:13.9912", "2014-12-29 16:19:28", "12.34567";`) + + // NOTE: the actually result is: 12341220 12341229.0 12341200 12341229.00, + // but Datum.ToString() don't format decimal length for float numbers. + result = tk.MustQuery(`select truncate(a, -1), truncate(a, 1), truncate(a, -2), truncate(a, 2) from t;`) + result.Check(testkit.Rows("12341220 12341229 12341200 12341229")) + + // NOTE: the actually result is: 12341229162410 12341229162414.0 12341229162400 12341229162414.00, + // but Datum.ToString() don't format decimal length for float numbers. + result = tk.MustQuery(`select truncate(b, -1), truncate(b, 1), truncate(b, -2), truncate(b, 2) from t;`) + result.Check(testkit.Rows("12341229162410 12341229162414 12341229162400 12341229162414")) + + // NOTE: the actually result is: 20141229161920 20141229161928.0 20141229161900 20141229161928.00, + // but Datum.ToString() don't format decimal length for float numbers. + result = tk.MustQuery(`select truncate(c, -1), truncate(c, 1), truncate(c, -2), truncate(c, 2) from t;`) + result.Check(testkit.Rows("20141229161920 20141229161928 20141229161900 20141229161928")) + + result = tk.MustQuery(`select truncate(d, -1), truncate(d, 1), truncate(d, -2), truncate(d, 2) from t;`) + result.Check(testkit.Rows("10 12.3 0 12.34")) + + result = tk.MustQuery(`select truncate(json_array(), 1), truncate("cascasc", 1);`) + result.Check(testkit.Rows("0 0")) + + // for pow + result = tk.MustQuery("SELECT POW('12', 2), POW(1.2e1, '2.0'), POW(12, 2.0);") + result.Check(testkit.Rows("144 144 144")) + result = tk.MustQuery("SELECT POW(null, 2), POW(2, null), POW(null, null);") + result.Check(testkit.Rows("<nil> <nil> <nil>")) + result = tk.MustQuery("SELECT POW(0, 0);") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("SELECT POW(0, 0.1), POW(0, 0.5), POW(0, 1);") + result.Check(testkit.Rows("0 0 0")) + rs, err = tk.Exec("SELECT POW(0, -1);") + require.NoError(t, err) + _, err = session.GetRows4Test(ctx, tk.Session(), rs) + require.Error(t, err) + terr = errors.Cause(err).(*terror.Error) + require.Equal(t, errors.ErrCode(mysql.ErrDataOutOfRange), terr.Code()) + require.NoError(t, rs.Close()) + + // for sign + result = tk.MustQuery("SELECT SIGN('12'), SIGN(1.2e1), SIGN(12), SIGN(0.0000012);") + result.Check(testkit.Rows("1 1 1 1")) + result = tk.MustQuery("SELECT SIGN('-12'), SIGN(-1.2e1), SIGN(-12), SIGN(-0.0000012);") + result.Check(testkit.Rows("-1 -1 -1 -1")) + result = tk.MustQuery("SELECT SIGN('0'), SIGN('-0'), SIGN(0);") + result.Check(testkit.Rows("0 0 0")) + result = tk.MustQuery("SELECT SIGN(NULL);") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("SELECT SIGN(-9223372036854775808), SIGN(9223372036854775808);") + result.Check(testkit.Rows("-1 1")) + + // for sqrt + result = tk.MustQuery("SELECT SQRT(-10), SQRT(144), SQRT(4.84), SQRT(0.04), SQRT(0);") + result.Check(testkit.Rows("<nil> 12 2.2 0.2 0")) + + // for crc32 + result = tk.MustQuery("SELECT crc32(0), crc32(-0), crc32('0'), crc32('abc'), crc32('ABC'), crc32(NULL), crc32(''), crc32('hello world!')") + result.Check(testkit.Rows("4108050209 4108050209 4108050209 891568578 2743272264 <nil> 0 62177901")) + + // for radians + result = tk.MustQuery("SELECT radians(1.0), radians(pi()), radians(pi()/2), radians(180), radians(1.009);") + result.Check(testkit.Rows("0.017453292519943295 0.05483113556160754 0.02741556778080377 3.141592653589793 0.01761037215262278")) + + // for rand + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int)") + tk.MustExec("insert into t values(1),(2),(3)") + tk.Session().GetSessionVars().MaxChunkSize = 1 + tk.MustQuery("select rand(1) from t").Sort().Check(testkit.Rows("0.1418603212962489", "0.40540353712197724", "0.8716141803857071")) + tk.MustQuery("select rand(a) from t").Check(testkit.Rows("0.40540353712197724", "0.6555866465490187", "0.9057697559760601")) + tk.MustQuery("select rand(1), rand(2), rand(3)").Check(testkit.Rows("0.40540353712197724 0.6555866465490187 0.9057697559760601")) + tk.MustQuery("set @@rand_seed1=10000000,@@rand_seed2=1000000") + tk.MustQuery("select rand()").Check(testkit.Rows("0.028870999839968048")) + tk.MustQuery("select rand(1)").Check(testkit.Rows("0.40540353712197724")) + tk.MustQuery("select rand()").Check(testkit.Rows("0.11641535266900002")) +} + +func TestTimeBuiltin(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + originSQLMode := tk.Session().GetSessionVars().StrictSQLMode + tk.Session().GetSessionVars().StrictSQLMode = true + defer func() { + tk.Session().GetSessionVars().StrictSQLMode = originSQLMode + }() + tk.MustExec("use test") + + // for makeDate + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b double, c datetime, d time, e char(20), f bit(10))") + tk.MustExec(`insert into t values(1, 1.1, "2017-01-01 12:01:01", "12:01:01", "abcdef", 0b10101)`) + result := tk.MustQuery("select makedate(a,a), makedate(b,b), makedate(c,c), makedate(d,d), makedate(e,e), makedate(f,f), makedate(null,null), makedate(a,b) from t") + result.Check(testkit.Rows("2001-01-01 2001-01-01 <nil> <nil> <nil> 2021-01-21 <nil> 2001-01-01")) + + // for date + result = tk.MustQuery(`select date("2019-09-12"), date("2019-09-12 12:12:09"), date("2019-09-12 12:12:09.121212");`) + result.Check(testkit.Rows("2019-09-12 2019-09-12 2019-09-12")) + result = tk.MustQuery(`select date("0000-00-00"), date("0000-00-00 12:12:09"), date("0000-00-00 00:00:00.121212"), date("0000-00-00 00:00:00.000000");`) + result.Check(testkit.Rows("<nil> 0000-00-00 0000-00-00 <nil>")) + result = tk.MustQuery(`select date("aa"), date(12.1), date("");`) + result.Check(testkit.Rows("<nil> <nil> <nil>")) + + // for year + result = tk.MustQuery(`select year("2013-01-09"), year("2013-00-09"), year("000-01-09"), year("1-01-09"), year("20131-01-09"), year(null);`) + result.Check(testkit.Rows("2013 2013 0 2001 <nil> <nil>")) + result = tk.MustQuery(`select year("2013-00-00"), year("2013-00-00 00:00:00"), year("0000-00-00 12:12:12"), year("2017-00-00 12:12:12");`) + result.Check(testkit.Rows("2013 2013 0 2017")) + result = tk.MustQuery(`select year("aa"), year(2013), year(2012.09), year("1-01"), year("-09");`) + result.Check(testkit.Rows("<nil> <nil> <nil> <nil> <nil>")) + tk.MustExec(`drop table if exists t`) + tk.MustExec(`create table t(a bigint)`) + _, err := tk.Exec(`insert into t select year("aa")`) + require.Error(t, err) + require.True(t, terror.ErrorEqual(err, types.ErrWrongValue), "err %v", err) + tk.MustExec(`set sql_mode='STRICT_TRANS_TABLES'`) // without zero date + tk.MustExec(`insert into t select year("0000-00-00 00:00:00")`) + tk.MustExec(`set sql_mode="NO_ZERO_DATE";`) // with zero date + tk.MustExec(`insert into t select year("0000-00-00 00:00:00")`) + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1292|Incorrect datetime value: '0000-00-00 00:00:00.000000'")) + tk.MustExec(`set sql_mode="NO_ZERO_DATE,STRICT_TRANS_TABLES";`) + _, err = tk.Exec(`insert into t select year("0000-00-00 00:00:00");`) + require.Error(t, err) + require.True(t, types.ErrWrongValue.Equal(err), "err %v", err) + + tk.MustExec(`insert into t select 1`) + tk.MustExec(`set sql_mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION";`) + _, err = tk.Exec(`update t set a = year("aa")`) + require.True(t, terror.ErrorEqual(err, types.ErrWrongValue), "err %v", err) + _, err = tk.Exec(`delete from t where a = year("aa")`) + // Only `code` can be used to compare because the error `class` information + // will be lost after expression push-down + require.Equal(t, types.ErrWrongValue.Code(), errors.Cause(err).(*terror.Error).Code(), "err %v", err) + + // for month + result = tk.MustQuery(`select month("2013-01-09"), month("2013-00-09"), month("000-01-09"), month("1-01-09"), month("20131-01-09"), month(null);`) + result.Check(testkit.Rows("1 0 1 1 <nil> <nil>")) + result = tk.MustQuery(`select month("2013-00-00"), month("2013-00-00 00:00:00"), month("0000-00-00 12:12:12"), month("2017-00-00 12:12:12");`) + result.Check(testkit.Rows("0 0 0 0")) + result = tk.MustQuery(`select month("aa"), month(2013), month(2012.09), month("1-01"), month("-09");`) + result.Check(testkit.Rows("<nil> <nil> <nil> <nil> <nil>")) + result = tk.MustQuery(`select month("2013-012-09"), month("2013-0000000012-09"), month("2013-30-09"), month("000-41-09");`) + result.Check(testkit.Rows("12 12 <nil> <nil>")) + tk.MustExec(`drop table if exists t`) + tk.MustExec(`create table t(a bigint)`) + _, err = tk.Exec(`insert into t select month("aa")`) + require.Error(t, err) + require.True(t, terror.ErrorEqual(err, types.ErrWrongValue), "err: %v", err) + tk.MustExec(`insert into t select month("0000-00-00 00:00:00")`) + tk.MustExec(`set sql_mode="NO_ZERO_DATE";`) + tk.MustExec(`insert into t select month("0000-00-00 00:00:00")`) + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1292|Incorrect datetime value: '0000-00-00 00:00:00.000000'")) + tk.MustExec(`set sql_mode="NO_ZERO_DATE,STRICT_TRANS_TABLES";`) + _, err = tk.Exec(`insert into t select month("0000-00-00 00:00:00");`) + require.Error(t, err) + require.True(t, types.ErrWrongValue.Equal(err), "err: %v", err) + tk.MustExec(`insert into t select 1`) + tk.MustExec(`set sql_mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION";`) + tk.MustExec(`insert into t select 1`) + _, err = tk.Exec(`update t set a = month("aa")`) + require.True(t, terror.ErrorEqual(err, types.ErrWrongValue)) + _, err = tk.Exec(`delete from t where a = month("aa")`) + require.Equal(t, types.ErrWrongValue.Code(), errors.Cause(err).(*terror.Error).Code(), "err %v", err) + + // for week + result = tk.MustQuery(`select week("2012-12-22"), week("2012-12-22", -2), week("2012-12-22", 0), week("2012-12-22", 1), week("2012-12-22", 2), week("2012-12-22", 200);`) + result.Check(testkit.Rows("51 51 51 51 51 51")) + result = tk.MustQuery(`select week("2008-02-20"), week("2008-02-20", 0), week("2008-02-20", 1), week("2009-02-20", 2), week("2008-02-20", 3), week("2008-02-20", 4);`) + result.Check(testkit.Rows("7 7 8 7 8 8")) + result = tk.MustQuery(`select week("2008-02-20", 5), week("2008-02-20", 6), week("2009-02-20", 7), week("2008-02-20", 8), week("2008-02-20", 9);`) + result.Check(testkit.Rows("7 8 7 7 8")) + result = tk.MustQuery(`select week("aa", 1), week(null, 2), week(11, 2), week(12.99, 2);`) + result.Check(testkit.Rows("<nil> <nil> <nil> <nil>")) + result = tk.MustQuery(`select week("aa"), week(null), week(11), week(12.99);`) + result.Check(testkit.Rows("<nil> <nil> <nil> <nil>")) + tk.MustExec(`drop table if exists t`) + tk.MustExec(`create table t(a datetime)`) + _, err = tk.Exec(`insert into t select week("aa", 1)`) + require.Error(t, err) + require.True(t, terror.ErrorEqual(err, types.ErrWrongValue)) + tk.MustExec(`insert into t select now()`) + _, err = tk.Exec(`update t set a = week("aa", 1)`) + require.True(t, terror.ErrorEqual(err, types.ErrWrongValue)) + _, err = tk.Exec(`delete from t where a = week("aa", 1)`) + require.True(t, terror.ErrorEqual(err, types.ErrWrongValue)) + + // for weekofyear + result = tk.MustQuery(`select weekofyear("2012-12-22"), weekofyear("2008-02-20"), weekofyear("aa"), weekofyear(null), weekofyear(11), weekofyear(12.99);`) + result.Check(testkit.Rows("51 8 <nil> <nil> <nil> <nil>")) + tk.MustExec(`drop table if exists t`) + tk.MustExec(`create table t(a bigint)`) + _, err = tk.Exec(`insert into t select weekofyear("aa")`) + require.Error(t, err) + require.True(t, terror.ErrorEqual(err, types.ErrWrongValue)) + + tk.MustExec(`insert into t select 1`) + _, err = tk.Exec(`update t set a = weekofyear("aa")`) + require.True(t, terror.ErrorEqual(err, types.ErrWrongValue)) + _, err = tk.Exec(`delete from t where a = weekofyear("aa")`) + require.True(t, terror.ErrorEqual(err, types.ErrWrongValue)) + + // for weekday + result = tk.MustQuery(`select weekday("2012-12-20"), weekday("2012-12-21"), weekday("2012-12-22"), weekday("2012-12-23"), weekday("2012-12-24"), weekday("2012-12-25"), weekday("2012-12-26"), weekday("2012-12-27");`) + result.Check(testkit.Rows("3 4 5 6 0 1 2 3")) + result = tk.MustQuery(`select weekday("2012-12-90"), weekday("0000-00-00"), weekday("aa"), weekday(null), weekday(11), weekday(12.99);`) + result.Check(testkit.Rows("<nil> <nil> <nil> <nil> <nil> <nil>")) + + // for quarter + result = tk.MustQuery(`select quarter("2012-00-20"), quarter("2012-01-21"), quarter("2012-03-22"), quarter("2012-05-23"), quarter("2012-08-24"), quarter("2012-09-25"), quarter("2012-11-26"), quarter("2012-12-27");`) + result.Check(testkit.Rows("0 1 1 2 3 3 4 4")) + result = tk.MustQuery(`select quarter("2012-14-20"), quarter("aa"), quarter(null), quarter(11), quarter(12.99);`) + result.Check(testkit.Rows("<nil> <nil> <nil> <nil> <nil>")) + result = tk.MustQuery(`select quarter("0000-00-00"), quarter("0000-00-00 00:00:00");`) + result.Check(testkit.Rows("<nil> <nil>")) + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", + "Warning|1292|Incorrect datetime value: '0000-00-00 00:00:00.000000'", + "Warning|1292|Incorrect datetime value: '0000-00-00 00:00:00.000000'")) + result = tk.MustQuery(`select quarter(0), quarter(0.0), quarter(0e1), quarter(0.00);`) + result.Check(testkit.Rows("0 0 0 0")) + tk.MustQuery("show warnings").Check(testkit.Rows()) + + // for from_days + result = tk.MustQuery(`select from_days(0), from_days(-199), from_days(1111), from_days(120), from_days(1), from_days(1111111), from_days(9999999), from_days(22222);`) + result.Check(testkit.Rows("0000-00-00 0000-00-00 0003-01-16 0000-00-00 0000-00-00 3042-02-13 0000-00-00 0060-11-03")) + result = tk.MustQuery(`select from_days("2012-14-20"), from_days("111a"), from_days("aa"), from_days(null), from_days("123asf"), from_days(12.99);`) + result.Check(testkit.Rows("0005-07-05 0000-00-00 0000-00-00 <nil> 0000-00-00 0000-00-00")) + + // Fix issue #3923 + result = tk.MustQuery("select timediff(cast('2004-12-30 12:00:00' as time), '12:00:00');") + result.Check(testkit.Rows("00:00:00")) + result = tk.MustQuery("select timediff('12:00:00', cast('2004-12-30 12:00:00' as time));") + result.Check(testkit.Rows("00:00:00")) + result = tk.MustQuery("select timediff(cast('2004-12-30 12:00:00' as time), '2004-12-30 12:00:00');") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("select timediff('2004-12-30 12:00:00', cast('2004-12-30 12:00:00' as time));") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("select timediff(cast('2004-12-30 12:00:01' as datetime), '2004-12-30 12:00:00');") + result.Check(testkit.Rows("00:00:01")) + result = tk.MustQuery("select timediff('2004-12-30 12:00:00', cast('2004-12-30 12:00:01' as datetime));") + result.Check(testkit.Rows("-00:00:01")) + result = tk.MustQuery("select timediff(cast('2004-12-30 12:00:01' as time), '-34 00:00:00');") + result.Check(testkit.Rows("828:00:01")) + result = tk.MustQuery("select timediff('-34 00:00:00', cast('2004-12-30 12:00:01' as time));") + result.Check(testkit.Rows("-828:00:01")) + result = tk.MustQuery("select timediff(cast('2004-12-30 12:00:01' as datetime), cast('2004-12-30 11:00:01' as datetime));") + result.Check(testkit.Rows("01:00:00")) + result = tk.MustQuery("select timediff(cast('2004-12-30 12:00:01' as datetime), '2004-12-30 12:00:00.1');") + result.Check(testkit.Rows("00:00:00.9")) + result = tk.MustQuery("select timediff('2004-12-30 12:00:00.1', cast('2004-12-30 12:00:01' as datetime));") + result.Check(testkit.Rows("-00:00:00.9")) + result = tk.MustQuery("select timediff(cast('2004-12-30 12:00:01' as datetime), '-34 124:00:00');") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("select timediff('-34 124:00:00', cast('2004-12-30 12:00:01' as datetime));") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("select timediff(cast('2004-12-30 12:00:01' as time), '-34 124:00:00');") + result.Check(testkit.Rows("838:59:59")) + result = tk.MustQuery("select timediff('-34 124:00:00', cast('2004-12-30 12:00:01' as time));") + result.Check(testkit.Rows("-838:59:59")) + result = tk.MustQuery("select timediff(cast('2004-12-30' as datetime), '12:00:00');") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("select timediff('12:00:00', cast('2004-12-30' as datetime));") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("select timediff('12:00:00', '-34 12:00:00');") + result.Check(testkit.Rows("838:59:59")) + result = tk.MustQuery("select timediff('12:00:00', '34 12:00:00');") + result.Check(testkit.Rows("-816:00:00")) + result = tk.MustQuery("select timediff('2014-1-2 12:00:00', '-34 12:00:00');") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("select timediff('-34 12:00:00', '2014-1-2 12:00:00');") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("select timediff('2014-1-2 12:00:00', '12:00:00');") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("select timediff('12:00:00', '2014-1-2 12:00:00');") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("select timediff('2014-1-2 12:00:00', '2014-1-1 12:00:00');") + result.Check(testkit.Rows("24:00:00")) + tk.MustQuery("select timediff(cast('10:10:10' as time), cast('10:10:11' as time))").Check(testkit.Rows("-00:00:01")) + + result = tk.MustQuery("select timestampadd(MINUTE, 1, '2003-01-02'), timestampadd(WEEK, 1, '2003-01-02 23:59:59')" + + ", timestampadd(MICROSECOND, 1, 950501);") + result.Check(testkit.Rows("2003-01-02 00:01:00 2003-01-09 23:59:59 1995-05-01 00:00:00.000001")) + result = tk.MustQuery("select timestampadd(day, 2, 950501), timestampadd(MINUTE, 37.5,'2003-01-02'), timestampadd(MINUTE, 37.49,'2003-01-02')," + + " timestampadd(YeAr, 1, '2003-01-02');") + result.Check(testkit.Rows("1995-05-03 00:00:00 2003-01-02 00:38:00 2003-01-02 00:37:00 2004-01-02 00:00:00")) + result = tk.MustQuery("select to_seconds(950501), to_seconds('2009-11-29'), to_seconds('2009-11-29 13:43:32'), to_seconds('09-11-29 13:43:32');") + result.Check(testkit.Rows("62966505600 63426672000 63426721412 63426721412")) + result = tk.MustQuery("select to_days(950501), to_days('2007-10-07'), to_days('2007-10-07 00:00:59'), to_days('0000-01-01')") + result.Check(testkit.Rows("728779 733321 733321 1")) + + result = tk.MustQuery("select last_day('2003-02-05'), last_day('2004-02-05'), last_day('2004-01-01 01:01:01'), last_day(950501);") + result.Check(testkit.Rows("2003-02-28 2004-02-29 2004-01-31 1995-05-31")) + + tk.MustExec("SET SQL_MODE='';") + result = tk.MustQuery("select last_day('0000-00-00');") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("select to_days('0000-00-00');") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("select to_seconds('0000-00-00');") + result.Check(testkit.Rows("<nil>")) + + result = tk.MustQuery("select timestamp('2003-12-31'), timestamp('2003-12-31 12:00:00','12:00:00');") + result.Check(testkit.Rows("2003-12-31 00:00:00 2004-01-01 00:00:00")) + result = tk.MustQuery("select timestamp(20170118123950.123), timestamp(20170118123950.999);") + result.Check(testkit.Rows("2017-01-18 12:39:50.123 2017-01-18 12:39:50.999")) + // Issue https://github.com/pingcap/tidb/issues/20003 + result = tk.MustQuery("select timestamp(0.0001, 0.00001);") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("select timestamp('2003-12-31', '01:01:01.01'), timestamp('2003-12-31 12:34', '01:01:01.01')," + + " timestamp('2008-12-31','00:00:00.0'), timestamp('2008-12-31 00:00:00.000');") + + tk.MustQuery(`select timestampadd(second, 1, cast("2001-01-01" as date))`).Check(testkit.Rows("2001-01-01 00:00:01")) + tk.MustQuery(`select timestampadd(hour, 1, cast("2001-01-01" as date))`).Check(testkit.Rows("2001-01-01 01:00:00")) + tk.MustQuery(`select timestampadd(day, 1, cast("2001-01-01" as date))`).Check(testkit.Rows("2001-01-02")) + tk.MustQuery(`select timestampadd(month, 1, cast("2001-01-01" as date))`).Check(testkit.Rows("2001-02-01")) + tk.MustQuery(`select timestampadd(year, 1, cast("2001-01-01" as date))`).Check(testkit.Rows("2002-01-01")) + tk.MustQuery(`select timestampadd(second, 1, cast("2001-01-01" as datetime))`).Check(testkit.Rows("2001-01-01 00:00:01")) + tk.MustQuery(`select timestampadd(hour, 1, cast("2001-01-01" as datetime))`).Check(testkit.Rows("2001-01-01 01:00:00")) + tk.MustQuery(`select timestampadd(day, 1, cast("2001-01-01" as datetime))`).Check(testkit.Rows("2001-01-02 00:00:00")) + tk.MustQuery(`select timestampadd(month, 1, cast("2001-01-01" as datetime))`).Check(testkit.Rows("2001-02-01 00:00:00")) + tk.MustQuery(`select timestampadd(year, 1, cast("2001-01-01" as datetime))`).Check(testkit.Rows("2002-01-01 00:00:00")) + + result.Check(testkit.Rows("2003-12-31 01:01:01.01 2003-12-31 13:35:01.01 2008-12-31 00:00:00.0 2008-12-31 00:00:00.000")) + result = tk.MustQuery("select timestamp('2003-12-31', 1), timestamp('2003-12-31', -1);") + result.Check(testkit.Rows("2003-12-31 00:00:01 2003-12-30 23:59:59")) + result = tk.MustQuery("select timestamp('2003-12-31', '2000-12-12 01:01:01.01'), timestamp('2003-14-31','01:01:01.01');") + result.Check(testkit.Rows("<nil> <nil>")) + + result = tk.MustQuery("select TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01'), TIMESTAMPDIFF(yEaR,'2002-05-01', " + + "'2001-01-01'), TIMESTAMPDIFF(minute,binary('2003-02-01'),'2003-05-01 12:05:55'), TIMESTAMPDIFF(day," + + "'1995-05-02', 950501);") + result.Check(testkit.Rows("3 -1 128885 -1")) + + result = tk.MustQuery("select datediff('2007-12-31 23:59:59','2007-12-30'), datediff('2010-11-30 23:59:59', " + + "'2010-12-31'), datediff(950501,'2016-01-13'), datediff(950501.9,'2016-01-13'), datediff(binary(950501), '2016-01-13');") + result.Check(testkit.Rows("1 -31 -7562 -7562 -7562")) + result = tk.MustQuery("select datediff('0000-01-01','0001-01-01'), datediff('0001-00-01', '0001-00-01'), datediff('0001-01-00','0001-01-00'), datediff('2017-01-01','2017-01-01');") + result.Check(testkit.Rows("-365 <nil> <nil> 0")) + + // for ADDTIME + result = tk.MustQuery("select addtime('01:01:11', '00:00:01.013'), addtime('01:01:11.00', '00:00:01'), addtime" + + "('2017-01-01 01:01:11.12', '00:00:01'), addtime('2017-01-01 01:01:11.12', '00:00:01.88');") + result.Check(testkit.Rows("01:01:12.013000 01:01:12 2017-01-01 01:01:12.120000 2017-01-01 01:01:13")) + result = tk.MustQuery("select addtime(cast('01:01:11' as time(4)), '00:00:01.013'), addtime(cast('01:01:11.00' " + + "as datetime(3)), '00:00:01')," + " addtime(cast('2017-01-01 01:01:11.12' as date), '00:00:01'), addtime(cast" + + "(cast('2017-01-01 01:01:11.12' as date) as datetime(2)), '00:00:01.88');") + result.Check(testkit.Rows("01:01:12.0130 2001-01-11 00:00:01.000 00:00:01 2017-01-01 00:00:01.88")) + result = tk.MustQuery("select addtime('2017-01-01 01:01:01', 5), addtime('2017-01-01 01:01:01', -5), addtime('2017-01-01 01:01:01', 0.0), addtime('2017-01-01 01:01:01', 1.34);") + result.Check(testkit.Rows("2017-01-01 01:01:06 2017-01-01 01:00:56 2017-01-01 01:01:01 2017-01-01 01:01:02.340000")) + result = tk.MustQuery("select addtime(cast('01:01:11.00' as datetime(3)), cast('00:00:01' as time)), addtime(cast('01:01:11.00' as datetime(3)), cast('00:00:01' as time(5)))") + result.Check(testkit.Rows("2001-01-11 00:00:01.000 2001-01-11 00:00:01.00000")) + result = tk.MustQuery("select addtime(cast('01:01:11.00' as date), cast('00:00:01' as time));") + result.Check(testkit.Rows("00:00:01")) + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a datetime, b timestamp, c time)") + tk.MustExec(`insert into t values("2017-01-01 12:30:31", "2017-01-01 12:30:31", "01:01:01")`) + result = tk.MustQuery("select addtime(a, b), addtime(cast(a as date), b), addtime(b,a), addtime(a,c), addtime(b," + + "c), addtime(c,a), addtime(c,b)" + + " from t;") + result.Check(testkit.Rows("<nil> <nil> <nil> 2017-01-01 13:31:32 2017-01-01 13:31:32 <nil> <nil>")) + result = tk.MustQuery("select addtime('01:01:11', cast('1' as time))") + result.Check(testkit.Rows("01:01:12")) + tk.MustQuery("select addtime(cast(null as char(20)), cast('1' as time))").Check(testkit.Rows("<nil>")) + require.NoError(t, tk.QueryToErr(`select addtime("01:01:11", cast('sdf' as time))`)) + tk.MustQuery(`select addtime("01:01:11", cast(null as char(20)))`).Check(testkit.Rows("<nil>")) + tk.MustQuery(`select addtime(cast(1 as time), cast(1 as time))`).Check(testkit.Rows("00:00:02")) + tk.MustQuery(`select addtime(cast(null as time), cast(1 as time))`).Check(testkit.Rows("<nil>")) + tk.MustQuery(`select addtime(cast(1 as time), cast(null as time))`).Check(testkit.Rows("<nil>")) + + // for SUBTIME + result = tk.MustQuery("select subtime('01:01:11', '00:00:01.013'), subtime('01:01:11.00', '00:00:01'), subtime" + + "('2017-01-01 01:01:11.12', '00:00:01'), subtime('2017-01-01 01:01:11.12', '00:00:01.88');") + result.Check(testkit.Rows("01:01:09.987000 01:01:10 2017-01-01 01:01:10.120000 2017-01-01 01:01:09.240000")) + result = tk.MustQuery("select subtime(cast('01:01:11' as time(4)), '00:00:01.013'), subtime(cast('01:01:11.00' " + + "as datetime(3)), '00:00:01')," + " subtime(cast('2017-01-01 01:01:11.12' as date), '00:00:01'), subtime(cast" + + "(cast('2017-01-01 01:01:11.12' as date) as datetime(2)), '00:00:01.88');") + result.Check(testkit.Rows("01:01:09.9870 2001-01-10 23:59:59.000 -00:00:01 2016-12-31 23:59:58.12")) + result = tk.MustQuery("select subtime('2017-01-01 01:01:01', 5), subtime('2017-01-01 01:01:01', -5), subtime('2017-01-01 01:01:01', 0.0), subtime('2017-01-01 01:01:01', 1.34);") + result.Check(testkit.Rows("2017-01-01 01:00:56 2017-01-01 01:01:06 2017-01-01 01:01:01 2017-01-01 01:00:59.660000")) + result = tk.MustQuery("select subtime('01:01:11', '0:0:1.013'), subtime('01:01:11.00', '0:0:1'), subtime('2017-01-01 01:01:11.12', '0:0:1'), subtime('2017-01-01 01:01:11.12', '0:0:1.120000');") + result.Check(testkit.Rows("01:01:09.987000 01:01:10 2017-01-01 01:01:10.120000 2017-01-01 01:01:10")) + result = tk.MustQuery("select subtime(cast('01:01:11.00' as datetime(3)), cast('00:00:01' as time)), subtime(cast('01:01:11.00' as datetime(3)), cast('00:00:01' as time(5)))") + result.Check(testkit.Rows("2001-01-10 23:59:59.000 2001-01-10 23:59:59.00000")) + result = tk.MustQuery("select subtime(cast('01:01:11.00' as date), cast('00:00:01' as time));") + result.Check(testkit.Rows("-00:00:01")) + result = tk.MustQuery("select subtime(a, b), subtime(cast(a as date), b), subtime(b,a), subtime(a,c), subtime(b," + + "c), subtime(c,a), subtime(c,b) from t;") + result.Check(testkit.Rows("<nil> <nil> <nil> 2017-01-01 11:29:30 2017-01-01 11:29:30 <nil> <nil>")) + tk.MustQuery("select subtime(cast('10:10:10' as time), cast('9:10:10' as time))").Check(testkit.Rows("01:00:00")) + tk.MustQuery("select subtime('10:10:10', cast('9:10:10' as time))").Check(testkit.Rows("01:00:00")) + + // ADDTIME & SUBTIME issue #5966 + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a datetime, b timestamp, c time, d date, e bit(1))") + tk.MustExec(`insert into t values("2017-01-01 12:30:31", "2017-01-01 12:30:31", "01:01:01", "2017-01-01", 0b1)`) + + result = tk.MustQuery("select addtime(a, e), addtime(b, e), addtime(c, e), addtime(d, e) from t") + result.Check(testkit.Rows("<nil> <nil> <nil> <nil>")) + result = tk.MustQuery("select addtime('2017-01-01 01:01:01', 0b1), addtime('2017-01-01', b'1'), addtime('01:01:01', 0b1011)") + result.Check(testkit.Rows("<nil> <nil> <nil>")) + result = tk.MustQuery("select addtime('2017-01-01', 1), addtime('2017-01-01 01:01:01', 1), addtime(cast('2017-01-01' as date), 1)") + result.Check(testkit.Rows("2017-01-01 00:00:01 2017-01-01 01:01:02 00:00:01")) + result = tk.MustQuery("select subtime(a, e), subtime(b, e), subtime(c, e), subtime(d, e) from t") + result.Check(testkit.Rows("<nil> <nil> <nil> <nil>")) + result = tk.MustQuery("select subtime('2017-01-01 01:01:01', 0b1), subtime('2017-01-01', b'1'), subtime('01:01:01', 0b1011)") + result.Check(testkit.Rows("<nil> <nil> <nil>")) + result = tk.MustQuery("select subtime('2017-01-01', 1), subtime('2017-01-01 01:01:01', 1), subtime(cast('2017-01-01' as date), 1)") + result.Check(testkit.Rows("2016-12-31 23:59:59 2017-01-01 01:01:00 -00:00:01")) + + result = tk.MustQuery("select addtime(-32073, 0), addtime(0, -32073);") + result.Check(testkit.Rows("<nil> <nil>")) + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", + "Warning|1292|Truncated incorrect time value: '-32073'", + "Warning|1292|Truncated incorrect time value: '-32073'")) + result = tk.MustQuery("select addtime(-32073, c), addtime(c, -32073) from t;") + result.Check(testkit.Rows("<nil> <nil>")) + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", + "Warning|1292|Truncated incorrect time value: '-32073'", + "Warning|1292|Truncated incorrect time value: '-32073'")) + result = tk.MustQuery("select addtime(a, -32073), addtime(b, -32073), addtime(d, -32073) from t;") + result.Check(testkit.Rows("<nil> <nil> <nil>")) + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", + "Warning|1292|Truncated incorrect time value: '-32073'", + "Warning|1292|Truncated incorrect time value: '-32073'", + "Warning|1292|Truncated incorrect time value: '-32073'")) + + result = tk.MustQuery("select subtime(-32073, 0), subtime(0, -32073);") + result.Check(testkit.Rows("<nil> <nil>")) + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", + "Warning|1292|Truncated incorrect time value: '-32073'", + "Warning|1292|Truncated incorrect time value: '-32073'")) + result = tk.MustQuery("select subtime(-32073, c), subtime(c, -32073) from t;") + result.Check(testkit.Rows("<nil> <nil>")) + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", + "Warning|1292|Truncated incorrect time value: '-32073'", + "Warning|1292|Truncated incorrect time value: '-32073'")) + result = tk.MustQuery("select subtime(a, -32073), subtime(b, -32073), subtime(d, -32073) from t;") + result.Check(testkit.Rows("<nil> <nil> <nil>")) + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", + "Warning|1292|Truncated incorrect time value: '-32073'", + "Warning|1292|Truncated incorrect time value: '-32073'", + "Warning|1292|Truncated incorrect time value: '-32073'")) + + // fixed issue #3986 + tk.MustExec("SET SQL_MODE='NO_ENGINE_SUBSTITUTION';") + tk.MustExec("SET TIME_ZONE='+03:00';") + tk.MustExec("DROP TABLE IF EXISTS t;") + tk.MustExec("CREATE TABLE t (ix TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);") + tk.MustExec("INSERT INTO t VALUES (0), (20030101010160), (20030101016001), (20030101240101), (20030132010101), (20031301010101), (20031200000000), (20030000000000);") + result = tk.MustQuery("SELECT CAST(ix AS SIGNED) FROM t;") + result.Check(testkit.Rows("0", "0", "0", "0", "0", "0", "0", "0")) + + // test time + result = tk.MustQuery("select time('2003-12-31 01:02:03')") + result.Check(testkit.Rows("01:02:03")) + result = tk.MustQuery("select time('2003-12-31 01:02:03.000123')") + result.Check(testkit.Rows("01:02:03.000123")) + result = tk.MustQuery("select time('01:02:03.000123')") + result.Check(testkit.Rows("01:02:03.000123")) + result = tk.MustQuery("select time('01:02:03')") + result.Check(testkit.Rows("01:02:03")) + result = tk.MustQuery("select time('-838:59:59.000000')") + result.Check(testkit.Rows("-838:59:59.000000")) + result = tk.MustQuery("select time('-838:59:59.000001')") + result.Check(testkit.Rows("-838:59:59.000000")) + result = tk.MustQuery("select time('-839:59:59.000000')") + result.Check(testkit.Rows("-838:59:59.000000")) + result = tk.MustQuery("select time('840:59:59.000000')") + result.Check(testkit.Rows("838:59:59.000000")) + // FIXME: #issue 4193 + // result = tk.MustQuery("select time('840:59:60.000000')") + // result.Check(testkit.Rows("<nil>")) + // result = tk.MustQuery("select time('800:59:59.9999999')") + // result.Check(testkit.Rows("801:00:00.000000")) + // result = tk.MustQuery("select time('12003-12-10 01:02:03.000123')") + // result.Check(testkit.Rows("<nil>") + // result = tk.MustQuery("select time('')") + // result.Check(testkit.Rows("<nil>") + // result = tk.MustQuery("select time('2003-12-10-10 01:02:03.000123')") + // result.Check(testkit.Rows("00:20:03") + + // Issue 20995 + result = tk.MustQuery("select time('0.1234567')") + result.Check(testkit.Rows("00:00:00.123457")) + + // for hour + result = tk.MustQuery(`SELECT hour("12:13:14.123456"), hour("12:13:14.000010"), hour("272:59:55"), hour(020005), hour(null), hour("27aaaa2:59:55");`) + result.Check(testkit.Rows("12 12 272 2 <nil> <nil>")) + + // for hour, issue #4340 + result = tk.MustQuery(`SELECT HOUR(20171222020005);`) + result.Check(testkit.Rows("2")) + result = tk.MustQuery(`SELECT HOUR(20171222020005.1);`) + result.Check(testkit.Rows("2")) + result = tk.MustQuery(`SELECT HOUR(20171222020005.1e0);`) + result.Check(testkit.Rows("2")) + result = tk.MustQuery(`SELECT HOUR("20171222020005");`) + result.Check(testkit.Rows("2")) + result = tk.MustQuery(`SELECT HOUR("20171222020005.1");`) + result.Check(testkit.Rows("2")) + result = tk.MustQuery(`select hour(20171222);`) + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery(`select hour(8381222);`) + result.Check(testkit.Rows("838")) + result = tk.MustQuery(`select hour(10000000000);`) + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery(`select hour(10100000000);`) + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery(`select hour(10001000000);`) + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery(`select hour(10101000000);`) + result.Check(testkit.Rows("0")) + + // for minute + result = tk.MustQuery(`SELECT minute("12:13:14.123456"), minute("12:13:14.000010"), minute("272:59:55"), minute(null), minute("27aaaa2:59:55");`) + result.Check(testkit.Rows("13 13 59 <nil> <nil>")) + + // for second + result = tk.MustQuery(`SELECT second("12:13:14.123456"), second("12:13:14.000010"), second("272:59:55"), second(null), second("27aaaa2:59:55");`) + result.Check(testkit.Rows("14 14 55 <nil> <nil>")) + + // for microsecond + result = tk.MustQuery(`SELECT microsecond("12:00:00.123456"), microsecond("12:00:00.000010"), microsecond(null), microsecond("27aaaa2:59:55");`) + result.Check(testkit.Rows("123456 10 <nil> <nil>")) + + // for period_add + result = tk.MustQuery(`SELECT period_add(200807, 2), period_add(200807, -2);`) + result.Check(testkit.Rows("200809 200805")) + result = tk.MustQuery(`SELECT period_add(NULL, 2), period_add(-191, NULL), period_add(NULL, NULL), period_add(12.09, -2), period_add("200207aa", "1aa");`) + result.Check(testkit.Rows("<nil> <nil> <nil> 200010 200208")) + for _, errPeriod := range []string{ + "period_add(0, 20)", "period_add(0, 0)", "period_add(-1, 1)", "period_add(200013, 1)", "period_add(-200012, 1)", "period_add('', '')", + } { + err := tk.QueryToErr(fmt.Sprintf("SELECT %v;", errPeriod)) + require.Error(t, err, "[expression:1210]Incorrect arguments to period_add") + } + + // for period_diff + result = tk.MustQuery(`SELECT period_diff(200807, 200705), period_diff(200807, 200908);`) + result.Check(testkit.Rows("14 -13")) + result = tk.MustQuery(`SELECT period_diff(NULL, 2), period_diff(-191, NULL), period_diff(NULL, NULL), period_diff(12.09, 2), period_diff("12aa", "11aa");`) + result.Check(testkit.Rows("<nil> <nil> <nil> 10 1")) + for _, errPeriod := range []string{ + "period_diff(-00013,1)", "period_diff(00013,1)", "period_diff(0, 0)", "period_diff(200013, 1)", "period_diff(5612, 4513)", "period_diff('', '')", + } { + err := tk.QueryToErr(fmt.Sprintf("SELECT %v;", errPeriod)) + require.Error(t, err, "[expression:1210]Incorrect arguments to period_diff") + } + + // TODO: fix `CAST(xx as duration)` and release the test below: + // result = tk.MustQuery(`SELECT hour("aaa"), hour(123456), hour(1234567);`) + // result = tk.MustQuery(`SELECT minute("aaa"), minute(123456), minute(1234567);`) + // result = tk.MustQuery(`SELECT second("aaa"), second(123456), second(1234567);`) + // result = tk.MustQuery(`SELECT microsecond("aaa"), microsecond(123456), microsecond(1234567);`) + + // for time_format + result = tk.MustQuery("SELECT TIME_FORMAT('150:02:28', '%H:%i:%s %p');") + result.Check(testkit.Rows("150:02:28 AM")) + result = tk.MustQuery("SELECT TIME_FORMAT('bad string', '%H:%i:%s %p');") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("SELECT TIME_FORMAT(null, '%H:%i:%s %p');") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("SELECT TIME_FORMAT(123, '%H:%i:%s %p');") + result.Check(testkit.Rows("00:01:23 AM")) + result = tk.MustQuery("SELECT TIME_FORMAT('24:00:00', '%r');") + result.Check(testkit.Rows("12:00:00 AM")) + result = tk.MustQuery("SELECT TIME_FORMAT('25:00:00', '%r');") + result.Check(testkit.Rows("01:00:00 AM")) + result = tk.MustQuery("SELECT TIME_FORMAT('24:00:00', '%l %p');") + result.Check(testkit.Rows("12 AM")) + + // for date_format + result = tk.MustQuery(`SELECT DATE_FORMAT('2017-06-15', '%W %M %e %Y %r %y');`) + result.Check(testkit.Rows("Thursday June 15 2017 12:00:00 AM 17")) + result = tk.MustQuery(`SELECT DATE_FORMAT(151113102019.12, '%W %M %e %Y %r %y');`) + result.Check(testkit.Rows("Friday November 13 2015 10:20:19 AM 15")) + result = tk.MustQuery(`SELECT DATE_FORMAT('0000-00-00', '%W %M %e %Y %r %y');`) + result.Check(testkit.Rows("<nil>")) + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", + "Warning|1292|Incorrect datetime value: '0000-00-00 00:00:00.000000'")) + result = tk.MustQuery(`SELECT DATE_FORMAT('0', '%W %M %e %Y %r %y'), DATE_FORMAT('0.0', '%W %M %e %Y %r %y'), DATE_FORMAT(0, 0);`) + result.Check(testkit.Rows("<nil> <nil> 0")) + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", + "Warning|1292|Incorrect time value: '0'", + "Warning|1292|Incorrect datetime value: '0.0'")) + result = tk.MustQuery(`SELECT DATE_FORMAT(0, '%W %M %e %Y %r %y'), DATE_FORMAT(0.0, '%W %M %e %Y %r %y');`) + result.Check(testkit.Rows("<nil> <nil>")) + tk.MustQuery("show warnings").Check(testkit.Rows()) + + // for yearweek + result = tk.MustQuery(`select yearweek("2014-12-27"), yearweek("2014-29-27"), yearweek("2014-00-27"), yearweek("2014-12-27 12:38:32"), yearweek("2014-12-27 12:38:32.1111111"), yearweek("2014-12-27 12:90:32"), yearweek("2014-12-27 89:38:32.1111111");`) + result.Check(testkit.Rows("201451 <nil> <nil> 201451 201451 <nil> <nil>")) + result = tk.MustQuery(`select yearweek(12121), yearweek(1.00009), yearweek("aaaaa"), yearweek(""), yearweek(NULL);`) + result.Check(testkit.Rows("<nil> <nil> <nil> <nil> <nil>")) + result = tk.MustQuery(`select yearweek("0000-00-00"), yearweek("2019-01-29", "aa"), yearweek("2011-01-01", null);`) + result.Check(testkit.Rows("<nil> 201904 201052")) + + // for dayOfWeek, dayOfMonth, dayOfYear + result = tk.MustQuery(`select dayOfWeek(null), dayOfWeek("2017-08-12"), dayOfWeek("0000-00-00"), dayOfWeek("2017-00-00"), dayOfWeek("0000-00-00 12:12:12"), dayOfWeek("2017-00-00 12:12:12")`) + result.Check(testkit.Rows("<nil> 7 <nil> <nil> <nil> <nil>")) + result = tk.MustQuery(`select dayOfYear(null), dayOfYear("2017-08-12"), dayOfYear("0000-00-00"), dayOfYear("2017-00-00"), dayOfYear("0000-00-00 12:12:12"), dayOfYear("2017-00-00 12:12:12")`) + result.Check(testkit.Rows("<nil> 224 <nil> <nil> <nil> <nil>")) + result = tk.MustQuery(`select dayOfMonth(null), dayOfMonth("2017-08-12"), dayOfMonth("0000-00-00"), dayOfMonth("2017-00-00"), dayOfMonth("0000-00-00 12:12:12"), dayOfMonth("2017-00-00 12:12:12")`) + result.Check(testkit.Rows("<nil> 12 0 0 0 0")) + + tk.MustExec("set sql_mode = 'NO_ZERO_DATE'") + result = tk.MustQuery(`select dayOfWeek(null), dayOfWeek("2017-08-12"), dayOfWeek("0000-00-00"), dayOfWeek("2017-00-00"), dayOfWeek("0000-00-00 12:12:12"), dayOfWeek("2017-00-00 12:12:12")`) + result.Check(testkit.Rows("<nil> 7 <nil> <nil> <nil> <nil>")) + result = tk.MustQuery(`select dayOfYear(null), dayOfYear("2017-08-12"), dayOfYear("0000-00-00"), dayOfYear("2017-00-00"), dayOfYear("0000-00-00 12:12:12"), dayOfYear("2017-00-00 12:12:12")`) + result.Check(testkit.Rows("<nil> 224 <nil> <nil> <nil> <nil>")) + result = tk.MustQuery(`select dayOfMonth(null), dayOfMonth("2017-08-12"), dayOfMonth("0000-00-00"), dayOfMonth("2017-00-00"), dayOfMonth("0000-00-00 12:12:12"), dayOfMonth("2017-00-00 12:12:12")`) + result.Check(testkit.Rows("<nil> 12 <nil> 0 0 0")) + + tk.MustExec(`drop table if exists t`) + tk.MustExec(`create table t(a bigint)`) + tk.MustExec(`insert into t value(1)`) + tk.MustExec("set sql_mode = 'STRICT_TRANS_TABLES'") + + _, err = tk.Exec("insert into t value(dayOfWeek('0000-00-00'))") + require.True(t, types.ErrWrongValue.Equal(err), "%v", err) + _, err = tk.Exec(`update t set a = dayOfWeek("0000-00-00")`) + require.True(t, types.ErrWrongValue.Equal(err)) + _, err = tk.Exec(`delete from t where a = dayOfWeek(123)`) + require.NoError(t, err) + + tk.MustExec("insert into t value(dayOfMonth('2017-00-00'))") + tk.MustExec("insert into t value(dayOfMonth('0000-00-00'))") + tk.MustExec(`update t set a = dayOfMonth("0000-00-00")`) + tk.MustExec("set sql_mode = 'NO_ZERO_DATE';") + tk.MustExec("insert into t value(dayOfMonth('0000-00-00'))") + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1292|Incorrect datetime value: '0000-00-00 00:00:00.000000'")) + tk.MustExec(`update t set a = dayOfMonth("0000-00-00")`) + tk.MustExec("set sql_mode = 'NO_ZERO_DATE,STRICT_TRANS_TABLES';") + _, err = tk.Exec("insert into t value(dayOfMonth('0000-00-00'))") + require.True(t, types.ErrWrongValue.Equal(err)) + tk.MustExec("insert into t value(0)") + _, err = tk.Exec(`update t set a = dayOfMonth("0000-00-00")`) + require.True(t, types.ErrWrongValue.Equal(err)) + _, err = tk.Exec(`delete from t where a = dayOfMonth(123)`) + require.NoError(t, err) + + _, err = tk.Exec("insert into t value(dayOfYear('0000-00-00'))") + require.True(t, types.ErrWrongValue.Equal(err)) + _, err = tk.Exec(`update t set a = dayOfYear("0000-00-00")`) + require.True(t, types.ErrWrongValue.Equal(err)) + _, err = tk.Exec(`delete from t where a = dayOfYear(123)`) + require.NoError(t, err) + + tk.MustExec("set sql_mode = ''") + + // for unix_timestamp + tk.MustExec("SET time_zone = '+00:00';") + result = tk.MustQuery("SELECT UNIX_TIMESTAMP(151113);") + result.Check(testkit.Rows("1447372800")) + result = tk.MustQuery("SELECT UNIX_TIMESTAMP(20151113);") + result.Check(testkit.Rows("1447372800")) + result = tk.MustQuery("SELECT UNIX_TIMESTAMP(151113102019);") + result.Check(testkit.Rows("1447410019")) + result = tk.MustQuery("SELECT UNIX_TIMESTAMP(151113102019e0);") + result.Check(testkit.Rows("1447410019.000000")) + result = tk.MustQuery("SELECT UNIX_TIMESTAMP(15111310201912e-2);") + result.Check(testkit.Rows("1447410019.120000")) + result = tk.MustQuery("SELECT UNIX_TIMESTAMP(151113102019.12);") + result.Check(testkit.Rows("1447410019.12")) + result = tk.MustQuery("SELECT UNIX_TIMESTAMP(151113102019.1234567);") + result.Check(testkit.Rows("1447410019.123457")) + result = tk.MustQuery("SELECT UNIX_TIMESTAMP(20151113102019);") + result.Check(testkit.Rows("1447410019")) + result = tk.MustQuery("SELECT UNIX_TIMESTAMP('2015-11-13 10:20:19');") + result.Check(testkit.Rows("1447410019")) + result = tk.MustQuery("SELECT UNIX_TIMESTAMP('2015-11-13 10:20:19.012');") + result.Check(testkit.Rows("1447410019.012")) + result = tk.MustQuery("SELECT UNIX_TIMESTAMP('1970-01-01 00:00:00');") + result.Check(testkit.Rows("0")) + result = tk.MustQuery("SELECT UNIX_TIMESTAMP('1969-12-31 23:59:59');") + result.Check(testkit.Rows("0")) + result = tk.MustQuery("SELECT UNIX_TIMESTAMP('1970-13-01 00:00:00');") + // FIXME: MySQL returns 0 here. + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("SELECT UNIX_TIMESTAMP('2038-01-19 03:14:07.999999');") + result.Check(testkit.Rows("2147483647.999999")) + result = tk.MustQuery("SELECT UNIX_TIMESTAMP('2038-01-19 03:14:08');") + result.Check(testkit.Rows("0")) + result = tk.MustQuery("SELECT UNIX_TIMESTAMP(0);") + result.Check(testkit.Rows("0")) + // result = tk.MustQuery("SELECT UNIX_TIMESTAMP(-1);") + // result.Check(testkit.Rows("0")) + // result = tk.MustQuery("SELECT UNIX_TIMESTAMP(12345);") + // result.Check(testkit.Rows("0")) + result = tk.MustQuery("SELECT UNIX_TIMESTAMP('2017-01-01')") + result.Check(testkit.Rows("1483228800")) + // Test different time zone. + tk.MustExec("SET time_zone = '+08:00';") + result = tk.MustQuery("SELECT UNIX_TIMESTAMP('1970-01-01 00:00:00');") + result.Check(testkit.Rows("0")) + result = tk.MustQuery("SELECT UNIX_TIMESTAMP('1970-01-01 08:00:00');") + result.Check(testkit.Rows("0")) + result = tk.MustQuery("SELECT UNIX_TIMESTAMP('2015-11-13 18:20:19.012'), UNIX_TIMESTAMP('2015-11-13 18:20:19.0123');") + result.Check(testkit.Rows("1447410019.012 1447410019.0123")) + result = tk.MustQuery("SELECT UNIX_TIMESTAMP('2038-01-19 11:14:07.999999');") + result.Check(testkit.Rows("2147483647.999999")) + + result = tk.MustQuery("SELECT TIME_FORMAT('bad string', '%H:%i:%s %p');") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("SELECT TIME_FORMAT(null, '%H:%i:%s %p');") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("SELECT TIME_FORMAT(123, '%H:%i:%s %p');") + result.Check(testkit.Rows("00:01:23 AM")) + + // for monthname + tk.MustExec(`drop table if exists t`) + tk.MustExec(`create table t(a varchar(10))`) + tk.MustExec(`insert into t value("abc")`) + tk.MustExec("set sql_mode = 'STRICT_TRANS_TABLES'") + + tk.MustExec("insert into t value(monthname('0000-00-00'))") + tk.MustExec(`update t set a = monthname("0000-00-00")`) + tk.MustExec("set sql_mode = 'NO_ZERO_DATE'") + tk.MustExec("insert into t value(monthname('0000-00-00'))") + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1292|Incorrect datetime value: '0000-00-00 00:00:00.000000'")) + tk.MustExec(`update t set a = monthname("0000-00-00")`) + tk.MustExec("set sql_mode = ''") + tk.MustExec("insert into t value(monthname('0000-00-00'))") + tk.MustExec("set sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_DATE'") + _, err = tk.Exec(`update t set a = monthname("0000-00-00")`) + require.True(t, types.ErrWrongValue.Equal(err)) + _, err = tk.Exec(`delete from t where a = monthname(123)`) + require.NoError(t, err) + result = tk.MustQuery(`select monthname("2017-12-01"), monthname("0000-00-00"), monthname("0000-01-00"), monthname("0000-01-00 00:00:00")`) + result.Check(testkit.Rows("December <nil> January January")) + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1292|Incorrect datetime value: '0000-00-00 00:00:00.000000'")) + + // for dayname + tk.MustExec(`drop table if exists t`) + tk.MustExec(`create table t(a varchar(10))`) + tk.MustExec(`insert into t value("abc")`) + tk.MustExec("set sql_mode = 'STRICT_TRANS_TABLES'") + + _, err = tk.Exec("insert into t value(dayname('0000-00-00'))") + require.True(t, types.ErrWrongValue.Equal(err)) + _, err = tk.Exec(`update t set a = dayname("0000-00-00")`) + require.True(t, types.ErrWrongValue.Equal(err)) + _, err = tk.Exec(`delete from t where a = dayname(123)`) + require.NoError(t, err) + result = tk.MustQuery(`select dayname("2017-12-01"), dayname("0000-00-00"), dayname("0000-01-00"), dayname("0000-01-00 00:00:00")`) + result.Check(testkit.Rows("Friday <nil> <nil> <nil>")) + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", + "Warning|1292|Incorrect datetime value: '0000-00-00 00:00:00.000000'", + "Warning|1292|Incorrect datetime value: '0000-01-00 00:00:00.000000'", + "Warning|1292|Incorrect datetime value: '0000-01-00 00:00:00.000000'")) + // for dayname implicit cast to boolean and real + result = tk.MustQuery(`select 1 from dual where dayname('2016-03-07')`) + result.Check(testkit.Rows()) + result = tk.MustQuery(`select 1 from dual where dayname('2016-03-07') is true`) + result.Check(testkit.Rows()) + result = tk.MustQuery(`select 1 from dual where dayname('2016-03-07') is false`) + result.Check(testkit.Rows("1")) + result = tk.MustQuery(`select 1 from dual where dayname('2016-03-08')`) + result.Check(testkit.Rows("1")) + result = tk.MustQuery(`select 1 from dual where dayname('2016-03-08') is true`) + result.Check(testkit.Rows("1")) + result = tk.MustQuery(`select 1 from dual where dayname('2016-03-08') is false`) + result.Check(testkit.Rows()) + result = tk.MustQuery(`select cast(dayname("2016-03-07") as double), cast(dayname("2016-03-08") as double)`) + result.Check(testkit.Rows("0 1")) + + // for sec_to_time + result = tk.MustQuery("select sec_to_time(NULL)") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("select sec_to_time(2378), sec_to_time(3864000), sec_to_time(-3864000)") + result.Check(testkit.Rows("00:39:38 838:59:59 -838:59:59")) + result = tk.MustQuery("select sec_to_time(86401.4), sec_to_time(-86401.4), sec_to_time(864014e-1), sec_to_time(-864014e-1), sec_to_time('86401.4'), sec_to_time('-86401.4')") + result.Check(testkit.Rows("24:00:01.4 -24:00:01.4 24:00:01.400000 -24:00:01.400000 24:00:01.400000 -24:00:01.400000")) + result = tk.MustQuery("select sec_to_time(86401.54321), sec_to_time(86401.543212345)") + result.Check(testkit.Rows("24:00:01.54321 24:00:01.543212")) + result = tk.MustQuery("select sec_to_time('123.4'), sec_to_time('123.4567891'), sec_to_time('123')") + result.Check(testkit.Rows("00:02:03.400000 00:02:03.456789 00:02:03.000000")) + + // for time_to_sec + result = tk.MustQuery("select time_to_sec(NULL)") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("select time_to_sec('22:23:00'), time_to_sec('00:39:38'), time_to_sec('23:00'), time_to_sec('00:00'), time_to_sec('00:00:00'), time_to_sec('23:59:59')") + result.Check(testkit.Rows("80580 2378 82800 0 0 86399")) + result = tk.MustQuery("select time_to_sec('1:0'), time_to_sec('1:00'), time_to_sec('1:0:0'), time_to_sec('-02:00'), time_to_sec('-02:00:05'), time_to_sec('020005')") + result.Check(testkit.Rows("3600 3600 3600 -7200 -7205 7205")) + result = tk.MustQuery("select time_to_sec('20171222020005'), time_to_sec(020005), time_to_sec(20171222020005), time_to_sec(171222020005)") + result.Check(testkit.Rows("7205 7205 7205 7205")) + + // for str_to_date + result = tk.MustQuery("select str_to_date('01-01-2017', '%d-%m-%Y'), str_to_date('59:20:12 01-01-2017', '%s:%i:%H %d-%m-%Y'), str_to_date('59:20:12', '%s:%i:%H')") + result.Check(testkit.Rows("2017-01-01 2017-01-01 12:20:59 12:20:59")) + result = tk.MustQuery("select str_to_date('aaa01-01-2017', 'aaa%d-%m-%Y'), str_to_date('59:20:12 aaa01-01-2017', '%s:%i:%H aaa%d-%m-%Y'), str_to_date('59:20:12aaa', '%s:%i:%Haaa')") + result.Check(testkit.Rows("2017-01-01 2017-01-01 12:20:59 12:20:59")) + + result = tk.MustQuery("select str_to_date('01-01-2017', '%d'), str_to_date('59', '%d-%Y')") + // TODO: MySQL returns "<nil> <nil>". + result.Check(testkit.Rows("0000-00-01 <nil>")) + result = tk.MustQuery("show warnings") + result.Sort().Check(testutil.RowsWithSep("|", + "Warning|1292|Incorrect datetime value: '0000-00-00 00:00:00'", + "Warning|1292|Truncated incorrect datetime value: '01-01-2017'")) + + result = tk.MustQuery("select str_to_date('2018-6-1', '%Y-%m-%d'), str_to_date('2018-6-1', '%Y-%c-%d'), str_to_date('59:20:1', '%s:%i:%k'), str_to_date('59:20:1', '%s:%i:%l')") + result.Check(testkit.Rows("2018-06-01 2018-06-01 01:20:59 01:20:59")) + + result = tk.MustQuery("select str_to_date('2020-07-04 11:22:33 PM c', '%Y-%m-%d %r')") + result.Check(testkit.Rows("2020-07-04 23:22:33")) + result = tk.MustQuery("show warnings") + result.Check(testutil.RowsWithSep("|", "Warning|1292|Truncated incorrect datetime value: '2020-07-04 11:22:33 PM c'")) + + result = tk.MustQuery("select str_to_date('11:22:33 PM', ' %r')") + result.Check(testkit.Rows("23:22:33")) + result = tk.MustQuery("show warnings") + result.Check(testkit.Rows()) + + // for maketime + tk.MustExec(`drop table if exists t`) + tk.MustExec(`create table t(a double, b float, c decimal(10,4));`) + tk.MustExec(`insert into t value(1.23, 2.34, 3.1415)`) + result = tk.MustQuery("select maketime(1,1,a), maketime(2,2,b), maketime(3,3,c) from t;") + result.Check(testkit.Rows("01:01:01.230000 02:02:02.340000 03:03:03.1415")) + result = tk.MustQuery("select maketime(12, 13, 14), maketime('12', '15', 30.1), maketime(0, 1, 59.1), maketime(0, 1, '59.1'), maketime(0, 1, 59.5)") + result.Check(testkit.Rows("12:13:14 12:15:30.1 00:01:59.1 00:01:59.100000 00:01:59.5")) + result = tk.MustQuery("select maketime(12, 15, 60), maketime(12, 15, '60'), maketime(12, 60, 0), maketime(12, 15, null)") + result.Check(testkit.Rows("<nil> <nil> <nil> <nil>")) + result = tk.MustQuery("select maketime('', '', ''), maketime('h', 'm', 's');") + result.Check(testkit.Rows("00:00:00.000000 00:00:00.000000")) + + // for get_format + result = tk.MustQuery(`select GET_FORMAT(DATE,'USA'), GET_FORMAT(DATE,'JIS'), GET_FORMAT(DATE,'ISO'), GET_FORMAT(DATE,'EUR'), + GET_FORMAT(DATE,'INTERNAL'), GET_FORMAT(DATETIME,'USA') , GET_FORMAT(DATETIME,'JIS'), GET_FORMAT(DATETIME,'ISO'), + GET_FORMAT(DATETIME,'EUR') , GET_FORMAT(DATETIME,'INTERNAL'), GET_FORMAT(TIME,'USA') , GET_FORMAT(TIME,'JIS'), + GET_FORMAT(TIME,'ISO'), GET_FORMAT(TIME,'EUR'), GET_FORMAT(TIME,'INTERNAL')`) + result.Check(testkit.Rows("%m.%d.%Y %Y-%m-%d %Y-%m-%d %d.%m.%Y %Y%m%d %Y-%m-%d %H.%i.%s %Y-%m-%d %H:%i:%s %Y-%m-%d %H:%i:%s %Y-%m-%d %H.%i.%s %Y%m%d%H%i%s %h:%i:%s %p %H:%i:%s %H:%i:%s %H.%i.%s %H%i%s")) + + // for convert_tz + result = tk.MustQuery(`select convert_tz("2004-01-01 12:00:00", "+00:00", "+10:32"), convert_tz("2004-01-01 12:00:00.01", "+00:00", "+10:32"), convert_tz("2004-01-01 12:00:00.01234567", "+00:00", "+10:32");`) + result.Check(testkit.Rows("2004-01-01 22:32:00 2004-01-01 22:32:00.01 2004-01-01 22:32:00.012346")) + result = tk.MustQuery(`select convert_tz(20040101, "+00:00", "+10:32"), convert_tz(20040101.01, "+00:00", "+10:32"), convert_tz(20040101.01234567, "+00:00", "+10:32");`) + result.Check(testkit.Rows("2004-01-01 10:32:00 2004-01-01 10:32:00.00 2004-01-01 10:32:00.000000")) + result = tk.MustQuery(`select convert_tz(NULL, "+00:00", "+10:32"), convert_tz("2004-01-01 12:00:00", NULL, "+10:32"), convert_tz("2004-01-01 12:00:00", "+00:00", NULL);`) + result.Check(testkit.Rows("<nil> <nil> <nil>")) + result = tk.MustQuery(`select convert_tz("a", "+00:00", "+10:32"), convert_tz("2004-01-01 12:00:00", "a", "+10:32"), convert_tz("2004-01-01 12:00:00", "+00:00", "a");`) + result.Check(testkit.Rows("<nil> <nil> <nil>")) + result = tk.MustQuery(`select convert_tz("", "+00:00", "+10:32"), convert_tz("2004-01-01 12:00:00", "", "+10:32"), convert_tz("2004-01-01 12:00:00", "+00:00", "");`) + result.Check(testkit.Rows("<nil> <nil> <nil>")) + result = tk.MustQuery(`select convert_tz("0", "+00:00", "+10:32"), convert_tz("2004-01-01 12:00:00", "0", "+10:32"), convert_tz("2004-01-01 12:00:00", "+00:00", "0");`) + result.Check(testkit.Rows("<nil> <nil> <nil>")) + + // for from_unixtime + tk.MustExec(`set @@session.time_zone = "+08:00"`) + result = tk.MustQuery(`select from_unixtime(20170101), from_unixtime(20170101.9999999), from_unixtime(20170101.999), from_unixtime(20170101.999, "%Y %D %M %h:%i:%s %x"), from_unixtime(20170101.999, "%Y %D %M %h:%i:%s %x")`) + result.Check(testkit.Rows("1970-08-22 18:48:21 1970-08-22 18:48:22.000000 1970-08-22 18:48:21.999 1970 22nd August 06:48:21 1970 1970 22nd August 06:48:21 1970")) + tk.MustExec(`set @@session.time_zone = "+00:00"`) + result = tk.MustQuery(`select from_unixtime(20170101), from_unixtime(20170101.9999999), from_unixtime(20170101.999), from_unixtime(20170101.999, "%Y %D %M %h:%i:%s %x"), from_unixtime(20170101.999, "%Y %D %M %h:%i:%s %x")`) + result.Check(testkit.Rows("1970-08-22 10:48:21 1970-08-22 10:48:22.000000 1970-08-22 10:48:21.999 1970 22nd August 10:48:21 1970 1970 22nd August 10:48:21 1970")) + tk.MustExec(`set @@session.time_zone = @@global.time_zone`) + + // for extract + result = tk.MustQuery(`select extract(day from '800:12:12'), extract(hour from '800:12:12'), extract(month from 20170101), extract(day_second from '2017-01-01 12:12:12')`) + result.Check(testkit.Rows("12 800 1 1121212")) + result = tk.MustQuery("select extract(day_microsecond from '2017-01-01 12:12:12'), extract(day_microsecond from '01 12:12:12'), extract(day_microsecond from '12:12:12'), extract(day_microsecond from '01 00:00:00.89')") + result.Check(testkit.Rows("1121212000000 361212000000 121212000000 240000890000")) + result = tk.MustQuery("select extract(day_second from '2017-01-01 12:12:12'), extract(day_second from '01 12:12:12'), extract(day_second from '12:12:12'), extract(day_second from '01 00:00:00.89')") + result.Check(testkit.Rows("1121212 361212 121212 240000")) + result = tk.MustQuery("select extract(day_minute from '2017-01-01 12:12:12'), extract(day_minute from '01 12:12:12'), extract(day_minute from '12:12:12'), extract(day_minute from '01 00:00:00.89')") + result.Check(testkit.Rows("11212 3612 1212 2400")) + result = tk.MustQuery("select extract(day_hour from '2017-01-01 12:12:12'), extract(day_hour from '01 12:12:12'), extract(day_hour from '12:12:12'), extract(day_hour from '01 00:00:00.89')") + result.Check(testkit.Rows("112 36 12 24")) + result = tk.MustQuery("select extract(day_microsecond from cast('2017-01-01 12:12:12' as datetime)), extract(day_second from cast('2017-01-01 12:12:12' as datetime)), extract(day_minute from cast('2017-01-01 12:12:12' as datetime)), extract(day_hour from cast('2017-01-01 12:12:12' as datetime))") + result.Check(testkit.Rows("1121212000000 1121212 11212 112")) + + // for adddate, subdate + dateArithmeticalTests := []struct { + Date string + Interval string + Unit string + AddResult string + SubResult string + }{ + {"\"2011-11-11\"", "1", "DAY", "2011-11-12", "2011-11-10"}, + {"NULL", "1", "DAY", "<nil>", "<nil>"}, + {"\"2011-11-11\"", "NULL", "DAY", "<nil>", "<nil>"}, + {"\"2011-11-11 10:10:10\"", "1000", "MICROSECOND", "2011-11-11 10:10:10.001000", "2011-11-11 10:10:09.999000"}, + {"\"2011-11-11 10:10:10\"", "\"10\"", "SECOND", "2011-11-11 10:10:20", "2011-11-11 10:10:00"}, + {"\"2011-11-11 10:10:10\"", "\"10\"", "MINUTE", "2011-11-11 10:20:10", "2011-11-11 10:00:10"}, + {"\"2011-11-11 10:10:10\"", "\"10\"", "HOUR", "2011-11-11 20:10:10", "2011-11-11 00:10:10"}, + {"\"2011-11-11 10:10:10\"", "\"11\"", "DAY", "2011-11-22 10:10:10", "2011-10-31 10:10:10"}, + {"\"2011-11-11 10:10:10\"", "\"2\"", "WEEK", "2011-11-25 10:10:10", "2011-10-28 10:10:10"}, + {"\"2011-11-11 10:10:10\"", "\"2\"", "MONTH", "2012-01-11 10:10:10", "2011-09-11 10:10:10"}, + {"\"2011-11-11 10:10:10\"", "\"4\"", "QUARTER", "2012-11-11 10:10:10", "2010-11-11 10:10:10"}, + {"\"2011-11-11 10:10:10\"", "\"2\"", "YEAR", "2013-11-11 10:10:10", "2009-11-11 10:10:10"}, + {"\"2011-11-11 10:10:10\"", "\"10.00100000\"", "SECOND_MICROSECOND", "2011-11-11 10:10:20.100000", "2011-11-11 10:09:59.900000"}, + {"\"2011-11-11 10:10:10\"", "\"10.0010000000\"", "SECOND_MICROSECOND", "2011-11-11 10:10:30", "2011-11-11 10:09:50"}, + {"\"2011-11-11 10:10:10\"", "\"10.0010000010\"", "SECOND_MICROSECOND", "2011-11-11 10:10:30.000010", "2011-11-11 10:09:49.999990"}, + {"\"2011-11-11 10:10:10\"", "\"10:10.100\"", "MINUTE_MICROSECOND", "2011-11-11 10:20:20.100000", "2011-11-11 09:59:59.900000"}, + {"\"2011-11-11 10:10:10\"", "\"10:10\"", "MINUTE_SECOND", "2011-11-11 10:20:20", "2011-11-11 10:00:00"}, + {"\"2011-11-11 10:10:10\"", "\"10:10:10.100\"", "HOUR_MICROSECOND", "2011-11-11 20:20:20.100000", "2011-11-10 23:59:59.900000"}, + {"\"2011-11-11 10:10:10\"", "\"10:10:10\"", "HOUR_SECOND", "2011-11-11 20:20:20", "2011-11-11 00:00:00"}, + {"\"2011-11-11 10:10:10\"", "\"10:10\"", "HOUR_MINUTE", "2011-11-11 20:20:10", "2011-11-11 00:00:10"}, + {"\"2011-11-11 10:10:10\"", "\"11 10:10:10.100\"", "DAY_MICROSECOND", "2011-11-22 20:20:20.100000", "2011-10-30 23:59:59.900000"}, + {"\"2011-11-11 10:10:10\"", "\"11 10:10:10\"", "DAY_SECOND", "2011-11-22 20:20:20", "2011-10-31 00:00:00"}, + {"\"2011-11-11 10:10:10\"", "\"11 10:10\"", "DAY_MINUTE", "2011-11-22 20:20:10", "2011-10-31 00:00:10"}, + {"\"2011-11-11 10:10:10\"", "\"11 10\"", "DAY_HOUR", "2011-11-22 20:10:10", "2011-10-31 00:10:10"}, + {"\"2011-11-11 10:10:10\"", "\"11-1\"", "YEAR_MONTH", "2022-12-11 10:10:10", "2000-10-11 10:10:10"}, + {"\"2011-11-11 10:10:10\"", "\"11-11\"", "YEAR_MONTH", "2023-10-11 10:10:10", "1999-12-11 10:10:10"}, + {"\"2011-11-11 10:10:10\"", "\"20\"", "DAY", "2011-12-01 10:10:10", "2011-10-22 10:10:10"}, + {"\"2011-11-11 10:10:10\"", "19.88", "DAY", "2011-12-01 10:10:10", "2011-10-22 10:10:10"}, + {"\"2011-11-11 10:10:10\"", "\"19.88\"", "DAY", "2011-11-30 10:10:10", "2011-10-23 10:10:10"}, + {"\"2011-11-11 10:10:10\"", "\"prefix19suffix\"", "DAY", "2011-11-30 10:10:10", "2011-10-23 10:10:10"}, + {"\"2011-11-11 10:10:10\"", "\"20-11\"", "DAY", "2011-12-01 10:10:10", "2011-10-22 10:10:10"}, + {"\"2011-11-11 10:10:10\"", "\"20,11\"", "daY", "2011-12-01 10:10:10", "2011-10-22 10:10:10"}, + {"\"2011-11-11 10:10:10\"", "\"1000\"", "dAy", "2014-08-07 10:10:10", "2009-02-14 10:10:10"}, + {"\"2011-11-11 10:10:10\"", "\"true\"", "Day", "2011-11-12 10:10:10", "2011-11-10 10:10:10"}, + {"\"2011-11-11 10:10:10\"", "true", "Day", "2011-11-12 10:10:10", "2011-11-10 10:10:10"}, + {"\"2011-11-11\"", "1", "DAY", "2011-11-12", "2011-11-10"}, + {"\"2011-11-11\"", "10", "HOUR", "2011-11-11 10:00:00", "2011-11-10 14:00:00"}, + {"\"2011-11-11\"", "10", "MINUTE", "2011-11-11 00:10:00", "2011-11-10 23:50:00"}, + {"\"2011-11-11\"", "10", "SECOND", "2011-11-11 00:00:10", "2011-11-10 23:59:50"}, + {"\"2011-11-11\"", "\"10:10\"", "HOUR_MINUTE", "2011-11-11 10:10:00", "2011-11-10 13:50:00"}, + {"\"2011-11-11\"", "\"10:10:10\"", "HOUR_SECOND", "2011-11-11 10:10:10", "2011-11-10 13:49:50"}, + {"\"2011-11-11\"", "\"10:10:10.101010\"", "HOUR_MICROSECOND", "2011-11-11 10:10:10.101010", "2011-11-10 13:49:49.898990"}, + {"\"2011-11-11\"", "\"10:10\"", "MINUTE_SECOND", "2011-11-11 00:10:10", "2011-11-10 23:49:50"}, + {"\"2011-11-11\"", "\"10:10.101010\"", "MINUTE_MICROSECOND", "2011-11-11 00:10:10.101010", "2011-11-10 23:49:49.898990"}, + {"\"2011-11-11\"", "\"10.101010\"", "SECOND_MICROSECOND", "2011-11-11 00:00:10.101010", "2011-11-10 23:59:49.898990"}, + {"\"2011-11-11 00:00:00\"", "1", "DAY", "2011-11-12 00:00:00", "2011-11-10 00:00:00"}, + {"\"2011-11-11 00:00:00\"", "10", "HOUR", "2011-11-11 10:00:00", "2011-11-10 14:00:00"}, + {"\"2011-11-11 00:00:00\"", "10", "MINUTE", "2011-11-11 00:10:00", "2011-11-10 23:50:00"}, + {"\"2011-11-11 00:00:00\"", "10", "SECOND", "2011-11-11 00:00:10", "2011-11-10 23:59:50"}, + + {"\"2011-11-11\"", "\"abc1000\"", "MICROSECOND", "2011-11-11 00:00:00", "2011-11-11 00:00:00"}, + {"\"20111111 10:10:10\"", "\"1\"", "DAY", "<nil>", "<nil>"}, + {"\"2011-11-11\"", "\"10\"", "SECOND_MICROSECOND", "2011-11-11 00:00:00.100000", "2011-11-10 23:59:59.900000"}, + {"\"2011-11-11\"", "\"10.0000\"", "MINUTE_MICROSECOND", "2011-11-11 00:00:10", "2011-11-10 23:59:50"}, + {"\"2011-11-11\"", "\"10:10:10\"", "MINUTE_MICROSECOND", "2011-11-11 00:10:10.100000", "2011-11-10 23:49:49.900000"}, + + {"cast(\"2011-11-11\" as datetime)", "\"10:10:10\"", "MINUTE_MICROSECOND", "2011-11-11 00:10:10.100000", "2011-11-10 23:49:49.900000"}, + {"cast(\"2011-11-11 00:00:00\" as datetime)", "1", "DAY", "2011-11-12 00:00:00", "2011-11-10 00:00:00"}, + {"cast(\"2011-11-11 00:00:00\" as datetime)", "10", "HOUR", "2011-11-11 10:00:00", "2011-11-10 14:00:00"}, + {"cast(\"2011-11-11 00:00:00\" as datetime)", "10", "MINUTE", "2011-11-11 00:10:00", "2011-11-10 23:50:00"}, + {"cast(\"2011-11-11 00:00:00\" as datetime)", "10", "SECOND", "2011-11-11 00:00:10", "2011-11-10 23:59:50"}, + + {"cast(\"2011-11-11 00:00:00\" as datetime)", "\"1\"", "DAY", "2011-11-12 00:00:00", "2011-11-10 00:00:00"}, + {"cast(\"2011-11-11 00:00:00\" as datetime)", "\"10\"", "HOUR", "2011-11-11 10:00:00", "2011-11-10 14:00:00"}, + {"cast(\"2011-11-11 00:00:00\" as datetime)", "\"10\"", "MINUTE", "2011-11-11 00:10:00", "2011-11-10 23:50:00"}, + {"cast(\"2011-11-11 00:00:00\" as datetime)", "\"10\"", "SECOND", "2011-11-11 00:00:10", "2011-11-10 23:59:50"}, + + {"cast(\"2011-11-11\" as date)", "\"10:10:10\"", "MINUTE_MICROSECOND", "2011-11-11 00:10:10.100000", "2011-11-10 23:49:49.900000"}, + {"cast(\"2011-11-11 00:00:00\" as date)", "1", "DAY", "2011-11-12", "2011-11-10"}, + {"cast(\"2011-11-11 00:00:00\" as date)", "10", "HOUR", "2011-11-11 10:00:00", "2011-11-10 14:00:00"}, + {"cast(\"2011-11-11 00:00:00\" as date)", "10", "MINUTE", "2011-11-11 00:10:00", "2011-11-10 23:50:00"}, + {"cast(\"2011-11-11 00:00:00\" as date)", "10", "SECOND", "2011-11-11 00:00:10", "2011-11-10 23:59:50"}, + + {"cast(\"2011-11-11 00:00:00\" as date)", "\"1\"", "DAY", "2011-11-12", "2011-11-10"}, + {"cast(\"2011-11-11 00:00:00\" as date)", "\"10\"", "HOUR", "2011-11-11 10:00:00", "2011-11-10 14:00:00"}, + {"cast(\"2011-11-11 00:00:00\" as date)", "\"10\"", "MINUTE", "2011-11-11 00:10:00", "2011-11-10 23:50:00"}, + {"cast(\"2011-11-11 00:00:00\" as date)", "\"10\"", "SECOND", "2011-11-11 00:00:10", "2011-11-10 23:59:50"}, + + // interval decimal support + {"\"2011-01-01 00:00:00\"", "10.10", "YEAR_MONTH", "2021-11-01 00:00:00", "2000-03-01 00:00:00"}, + {"\"2011-01-01 00:00:00\"", "10.10", "DAY_HOUR", "2011-01-11 10:00:00", "2010-12-21 14:00:00"}, + {"\"2011-01-01 00:00:00\"", "10.10", "HOUR_MINUTE", "2011-01-01 10:10:00", "2010-12-31 13:50:00"}, + {"\"2011-01-01 00:00:00\"", "10.10", "DAY_MINUTE", "2011-01-01 10:10:00", "2010-12-31 13:50:00"}, + {"\"2011-01-01 00:00:00\"", "10.10", "DAY_SECOND", "2011-01-01 00:10:10", "2010-12-31 23:49:50"}, + {"\"2011-01-01 00:00:00\"", "10.10", "HOUR_SECOND", "2011-01-01 00:10:10", "2010-12-31 23:49:50"}, + {"\"2011-01-01 00:00:00\"", "10.10", "MINUTE_SECOND", "2011-01-01 00:10:10", "2010-12-31 23:49:50"}, + {"\"2011-01-01 00:00:00\"", "10.10", "DAY_MICROSECOND", "2011-01-01 00:00:10.100000", "2010-12-31 23:59:49.900000"}, + {"\"2011-01-01 00:00:00\"", "10.10", "HOUR_MICROSECOND", "2011-01-01 00:00:10.100000", "2010-12-31 23:59:49.900000"}, + {"\"2011-01-01 00:00:00\"", "10.10", "MINUTE_MICROSECOND", "2011-01-01 00:00:10.100000", "2010-12-31 23:59:49.900000"}, + {"\"2011-01-01 00:00:00\"", "10.10", "SECOND_MICROSECOND", "2011-01-01 00:00:10.100000", "2010-12-31 23:59:49.900000"}, + {"\"2011-01-01 00:00:00\"", "10.10", "YEAR", "2021-01-01 00:00:00", "2001-01-01 00:00:00"}, + {"\"2011-01-01 00:00:00\"", "10.10", "QUARTER", "2013-07-01 00:00:00", "2008-07-01 00:00:00"}, + {"\"2011-01-01 00:00:00\"", "10.10", "MONTH", "2011-11-01 00:00:00", "2010-03-01 00:00:00"}, + {"\"2011-01-01 00:00:00\"", "10.10", "WEEK", "2011-03-12 00:00:00", "2010-10-23 00:00:00"}, + {"\"2011-01-01 00:00:00\"", "10.10", "DAY", "2011-01-11 00:00:00", "2010-12-22 00:00:00"}, + {"\"2011-01-01 00:00:00\"", "10.10", "HOUR", "2011-01-01 10:00:00", "2010-12-31 14:00:00"}, + {"\"2011-01-01 00:00:00\"", "10.10", "MINUTE", "2011-01-01 00:10:00", "2010-12-31 23:50:00"}, + {"\"2011-01-01 00:00:00\"", "10.10", "SECOND", "2011-01-01 00:00:10.100000", "2010-12-31 23:59:49.900000"}, + {"\"2011-01-01 00:00:00\"", "10.10", "MICROSECOND", "2011-01-01 00:00:00.000010", "2010-12-31 23:59:59.999990"}, + {"\"2011-01-01 00:00:00\"", "10.90", "MICROSECOND", "2011-01-01 00:00:00.000011", "2010-12-31 23:59:59.999989"}, + + {"\"2009-01-01\"", "6/4", "HOUR_MINUTE", "2009-01-04 12:20:00", "2008-12-28 11:40:00"}, + {"\"2009-01-01\"", "6/0", "HOUR_MINUTE", "<nil>", "<nil>"}, + {"\"1970-01-01 12:00:00\"", "CAST(6/4 AS DECIMAL(3,1))", "HOUR_MINUTE", "1970-01-01 13:05:00", "1970-01-01 10:55:00"}, + // for issue #8077 + {"\"2012-01-02\"", "\"prefix8\"", "HOUR", "2012-01-02 08:00:00", "2012-01-01 16:00:00"}, + {"\"2012-01-02\"", "\"prefix8prefix\"", "HOUR", "2012-01-02 08:00:00", "2012-01-01 16:00:00"}, + {"\"2012-01-02\"", "\"8:00\"", "HOUR", "2012-01-02 08:00:00", "2012-01-01 16:00:00"}, + {"\"2012-01-02\"", "\"8:00:00\"", "HOUR", "2012-01-02 08:00:00", "2012-01-01 16:00:00"}, + } + for _, tc := range dateArithmeticalTests { + addDate := fmt.Sprintf("select adddate(%s, interval %s %s);", tc.Date, tc.Interval, tc.Unit) + subDate := fmt.Sprintf("select subdate(%s, interval %s %s);", tc.Date, tc.Interval, tc.Unit) + result = tk.MustQuery(addDate) + result.Check(testkit.Rows(tc.AddResult)) + result = tk.MustQuery(subDate) + result.Check(testkit.Rows(tc.SubResult)) + } + tk.MustQuery(`select subdate(cast("2000-02-01" as datetime), cast(1 as decimal))`).Check(testkit.Rows("2000-01-31 00:00:00")) + tk.MustQuery(`select subdate(cast("2000-02-01" as datetime), cast(null as decimal))`).Check(testkit.Rows("<nil>")) + tk.MustQuery(`select subdate(cast(null as datetime), cast(1 as decimal))`).Check(testkit.Rows("<nil>")) + tk.MustQuery(`select subdate(cast("2000-02-01" as datetime), cast("xxx" as decimal))`).Check(testkit.Rows("2000-02-01 00:00:00")) + tk.MustQuery(`select subdate(cast("xxx" as datetime), cast(1 as decimal))`).Check(testkit.Rows("<nil>")) + tk.MustQuery(`select subdate(cast(20000101 as SIGNED), cast("1" as decimal))`).Check(testkit.Rows("1999-12-31")) + tk.MustQuery(`select subdate(cast(20000101 as SIGNED), cast("xxx" as decimal))`).Check(testkit.Rows("2000-01-01")) + tk.MustQuery(`select subdate(cast("abc" as SIGNED), cast("1" as decimal))`).Check(testkit.Rows("<nil>")) + tk.MustQuery(`select subdate(cast(null as SIGNED), cast("1" as decimal))`).Check(testkit.Rows("<nil>")) + tk.MustQuery(`select subdate(cast(20000101 as SIGNED), cast(null as decimal))`).Check(testkit.Rows("<nil>")) + tk.MustQuery(`select adddate(cast("2000-02-01" as datetime), cast(1 as decimal))`).Check(testkit.Rows("2000-02-02 00:00:00")) + tk.MustQuery(`select adddate(cast("2000-02-01" as datetime), cast(null as decimal))`).Check(testkit.Rows("<nil>")) + tk.MustQuery(`select adddate(cast(null as datetime), cast(1 as decimal))`).Check(testkit.Rows("<nil>")) + tk.MustQuery(`select adddate(cast("2000-02-01" as datetime), cast("xxx" as decimal))`).Check(testkit.Rows("2000-02-01 00:00:00")) + tk.MustQuery(`select adddate(cast("xxx" as datetime), cast(1 as decimal))`).Check(testkit.Rows("<nil>")) + tk.MustQuery(`select adddate(cast("2000-02-01" as datetime), cast(1 as SIGNED))`).Check(testkit.Rows("2000-02-02 00:00:00")) + tk.MustQuery(`select adddate(cast("2000-02-01" as datetime), cast(null as SIGNED))`).Check(testkit.Rows("<nil>")) + tk.MustQuery(`select adddate(cast(null as datetime), cast(1 as SIGNED))`).Check(testkit.Rows("<nil>")) + tk.MustQuery(`select adddate(cast("2000-02-01" as datetime), cast("xxx" as SIGNED))`).Check(testkit.Rows("2000-02-01 00:00:00")) + tk.MustQuery(`select adddate(cast("xxx" as datetime), cast(1 as SIGNED))`).Check(testkit.Rows("<nil>")) + tk.MustQuery(`select adddate(20100101, cast(1 as decimal))`).Check(testkit.Rows("2010-01-02")) + tk.MustQuery(`select adddate(cast('10:10:10' as time), 1)`).Check(testkit.Rows("34:10:10")) + tk.MustQuery(`select adddate(cast('10:10:10' as time), cast(1 as decimal))`).Check(testkit.Rows("34:10:10")) + + // for localtime, localtimestamp + result = tk.MustQuery(`select localtime() = now(), localtime = now(), localtimestamp() = now(), localtimestamp = now()`) + result.Check(testkit.Rows("1 1 1 1")) + + // for current_timestamp, current_timestamp() + result = tk.MustQuery(`select current_timestamp() = now(), current_timestamp = now()`) + result.Check(testkit.Rows("1 1")) + + // for tidb_parse_tso + tk.MustExec("SET time_zone = '+00:00';") + result = tk.MustQuery(`select tidb_parse_tso(404411537129996288)`) + result.Check(testkit.Rows("2018-11-20 09:53:04.877000")) + result = tk.MustQuery(`select tidb_parse_tso("404411537129996288")`) + result.Check(testkit.Rows("2018-11-20 09:53:04.877000")) + result = tk.MustQuery(`select tidb_parse_tso(1)`) + result.Check(testkit.Rows("1970-01-01 00:00:00.000000")) + result = tk.MustQuery(`select tidb_parse_tso(0)`) + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery(`select tidb_parse_tso(-1)`) + result.Check(testkit.Rows("<nil>")) + + // for tidb_bounded_staleness + tk.MustExec("SET time_zone = '+00:00';") + tt := time.Now().UTC() + ts := oracle.GoTimeToTS(tt) + tidbBoundedStalenessTests := []struct { + sql string + injectSafeTS uint64 + expect string + }{ + { + sql: `select tidb_bounded_staleness(DATE_SUB(NOW(), INTERVAL 600 SECOND), DATE_ADD(NOW(), INTERVAL 600 SECOND))`, + injectSafeTS: ts, + expect: tt.Format(types.TimeFSPFormat[:len(types.TimeFSPFormat)-3]), + }, + { + sql: `select tidb_bounded_staleness("2021-04-27 12:00:00.000", "2021-04-27 13:00:00.000")`, + injectSafeTS: func() uint64 { + tt, err := time.Parse("2006-01-02 15:04:05.000", "2021-04-27 13:30:04.877") + require.NoError(t, err) + return oracle.GoTimeToTS(tt) + }(), + expect: "2021-04-27 13:00:00.000", + }, + { + sql: `select tidb_bounded_staleness("2021-04-27 12:00:00.000", "2021-04-27 13:00:00.000")`, + injectSafeTS: func() uint64 { + tt, err := time.Parse("2006-01-02 15:04:05.000", "2021-04-27 11:30:04.877") + require.NoError(t, err) + return oracle.GoTimeToTS(tt) + }(), + expect: "2021-04-27 12:00:00.000", + }, + { + sql: `select tidb_bounded_staleness("2021-04-27 12:00:00.000", "2021-04-27 11:00:00.000")`, + injectSafeTS: 0, + expect: "<nil>", + }, + // Time is too small. + { + sql: `select tidb_bounded_staleness("0020-04-27 12:00:00.000", "2021-04-27 11:00:00.000")`, + injectSafeTS: 0, + expect: "1970-01-01 00:00:00.000", + }, + // Wrong value. + { + sql: `select tidb_bounded_staleness(1, 2)`, + injectSafeTS: 0, + expect: "<nil>", + }, + { + sql: `select tidb_bounded_staleness("invalid_time_1", "invalid_time_2")`, + injectSafeTS: 0, + expect: "<nil>", + }, + } + for _, test := range tidbBoundedStalenessTests { + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/expression/injectSafeTS", + fmt.Sprintf("return(%v)", test.injectSafeTS))) + tk.MustQuery(test.sql).Check(testkit.Rows(test.expect)) + } + failpoint.Disable("github.com/pingcap/tidb/expression/injectSafeTS") + // test whether tidb_bounded_staleness is deterministic + result = tk.MustQuery(`select tidb_bounded_staleness(NOW(), DATE_ADD(NOW(), INTERVAL 600 SECOND)), tidb_bounded_staleness(NOW(), DATE_ADD(NOW(), INTERVAL 600 SECOND))`) + require.Len(t, result.Rows()[0], 2) + require.Equal(t, result.Rows()[0][0], result.Rows()[0][1]) + preResult := result.Rows()[0][0] + time.Sleep(time.Second) + result = tk.MustQuery(`select tidb_bounded_staleness(NOW(), DATE_ADD(NOW(), INTERVAL 600 SECOND)), tidb_bounded_staleness(NOW(), DATE_ADD(NOW(), INTERVAL 600 SECOND))`) + require.Len(t, result.Rows()[0], 2) + require.Equal(t, result.Rows()[0][0], result.Rows()[0][1]) + require.NotEqual(t, preResult, result.Rows()[0][0]) + + // fix issue 10308 + result = tk.MustQuery("select time(\"- -\");") + result.Check(testkit.Rows("00:00:00")) + tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1292 Truncated incorrect time value: '- -'")) + result = tk.MustQuery("select time(\"---1\");") + result.Check(testkit.Rows("00:00:00")) + tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1292 Truncated incorrect time value: '---1'")) + result = tk.MustQuery("select time(\"-- --1\");") + result.Check(testkit.Rows("00:00:00")) + tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1292 Truncated incorrect time value: '-- --1'")) + + // fix issue #15185 + result = tk.MustQuery(`select timestamp(11111.1111)`) + result.Check(testkit.Rows("2001-11-11 00:00:00.0000")) + result = tk.MustQuery(`select timestamp(cast(11111.1111 as decimal(60, 5)))`) + result.Check(testkit.Rows("2001-11-11 00:00:00.00000")) + result = tk.MustQuery(`select timestamp(1021121141105.4324)`) + result.Check(testkit.Rows("0102-11-21 14:11:05.4324")) + result = tk.MustQuery(`select timestamp(cast(1021121141105.4324 as decimal(60, 5)))`) + result.Check(testkit.Rows("0102-11-21 14:11:05.43240")) + result = tk.MustQuery(`select timestamp(21121141105.101)`) + result.Check(testkit.Rows("2002-11-21 14:11:05.101")) + result = tk.MustQuery(`select timestamp(cast(21121141105.101 as decimal(60, 5)))`) + result.Check(testkit.Rows("2002-11-21 14:11:05.10100")) + result = tk.MustQuery(`select timestamp(1121141105.799055)`) + result.Check(testkit.Rows("2000-11-21 14:11:05.799055")) + result = tk.MustQuery(`select timestamp(cast(1121141105.799055 as decimal(60, 5)))`) + result.Check(testkit.Rows("2000-11-21 14:11:05.79906")) + result = tk.MustQuery(`select timestamp(121141105.123)`) + result.Check(testkit.Rows("2000-01-21 14:11:05.123")) + result = tk.MustQuery(`select timestamp(cast(121141105.123 as decimal(60, 5)))`) + result.Check(testkit.Rows("2000-01-21 14:11:05.12300")) + result = tk.MustQuery(`select timestamp(1141105)`) + result.Check(testkit.Rows("0114-11-05 00:00:00")) + result = tk.MustQuery(`select timestamp(cast(1141105 as decimal(60, 5)))`) + result.Check(testkit.Rows("0114-11-05 00:00:00.00000")) + result = tk.MustQuery(`select timestamp(41105.11)`) + result.Check(testkit.Rows("2004-11-05 00:00:00.00")) + result = tk.MustQuery(`select timestamp(cast(41105.11 as decimal(60, 5)))`) + result.Check(testkit.Rows("2004-11-05 00:00:00.00000")) + result = tk.MustQuery(`select timestamp(1105.3)`) + result.Check(testkit.Rows("2000-11-05 00:00:00.0")) + result = tk.MustQuery(`select timestamp(cast(1105.3 as decimal(60, 5)))`) + result.Check(testkit.Rows("2000-11-05 00:00:00.00000")) + result = tk.MustQuery(`select timestamp(105)`) + result.Check(testkit.Rows("2000-01-05 00:00:00")) + result = tk.MustQuery(`select timestamp(cast(105 as decimal(60, 5)))`) + result.Check(testkit.Rows("2000-01-05 00:00:00.00000")) +} + +func TestBuiltin(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + // for is true && is false + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int, b int, index idx_b (b))") + tk.MustExec("insert t values (1, 1)") + tk.MustExec("insert t values (2, 2)") + tk.MustExec("insert t values (3, 2)") + result := tk.MustQuery("select * from t where b is true") + result.Check(testkit.Rows("1 1", "2 2", "3 2")) + result = tk.MustQuery("select all + a from t where a = 1") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("select * from t where a is false") + result.Check(nil) + result = tk.MustQuery("select * from t where a is not true") + result.Check(nil) + result = tk.MustQuery(`select 1 is true, 0 is true, null is true, "aaa" is true, "" is true, -12.00 is true, 0.0 is true, 0.0000001 is true;`) + result.Check(testkit.Rows("1 0 0 0 0 1 0 1")) + result = tk.MustQuery(`select 1 is false, 0 is false, null is false, "aaa" is false, "" is false, -12.00 is false, 0.0 is false, 0.0000001 is false;`) + result.Check(testkit.Rows("0 1 0 1 1 0 1 0")) + // Issue https://github.com/pingcap/tidb/issues/19986 + result = tk.MustQuery("select 1 from dual where sec_to_time(2/10) is true") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("select 1 from dual where sec_to_time(2/10) is false") + result.Check(nil) + // Issue https://github.com/pingcap/tidb/issues/19999 + result = tk.MustQuery("select 1 from dual where timediff((7/'2014-07-07 02:30:02'),'2012-01-16') is true") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("select 1 from dual where timediff((7/'2014-07-07 02:30:02'),'2012-01-16') is false") + result.Check(nil) + // Issue https://github.com/pingcap/tidb/issues/20001 + result = tk.MustQuery("select 1 from dual where time(0.0001) is true") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("select 1 from dual where time(0.0001) is false") + result.Check(nil) + + // for in + result = tk.MustQuery("select * from t where b in (a)") + result.Check(testkit.Rows("1 1", "2 2")) + result = tk.MustQuery("select * from t where b not in (a)") + result.Check(testkit.Rows("3 2")) + + // test cast + result = tk.MustQuery("select cast(1 as decimal(3,2))") + result.Check(testkit.Rows("1.00")) + result = tk.MustQuery("select cast('1991-09-05 11:11:11' as datetime)") + result.Check(testkit.Rows("1991-09-05 11:11:11")) + result = tk.MustQuery("select cast(cast('1991-09-05 11:11:11' as datetime) as char)") + result.Check(testkit.Rows("1991-09-05 11:11:11")) + result = tk.MustQuery("select cast('11:11:11' as time)") + result.Check(testkit.Rows("11:11:11")) + result = tk.MustQuery("select * from t where a > cast(2 as decimal)") + result.Check(testkit.Rows("3 2")) + result = tk.MustQuery("select cast(-1 as unsigned)") + result.Check(testkit.Rows("18446744073709551615")) + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a decimal(3, 1), b double, c datetime, d time, e int)") + tk.MustExec("insert into t value(12.3, 1.23, '2017-01-01 12:12:12', '12:12:12', 123)") + result = tk.MustQuery("select cast(a as json), cast(b as json), cast(c as json), cast(d as json), cast(e as json) from t") + result.Check(testkit.Rows(`12.3 1.23 "2017-01-01 12:12:12.000000" "12:12:12.000000" 123`)) + result = tk.MustQuery(`select cast(10101000000 as time);`) + result.Check(testkit.Rows("00:00:00")) + result = tk.MustQuery(`select cast(10101001000 as time);`) + result.Check(testkit.Rows("00:10:00")) + result = tk.MustQuery(`select cast(10000000000 as time);`) + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery(`select cast(20171222020005 as time);`) + result.Check(testkit.Rows("02:00:05")) + result = tk.MustQuery(`select cast(8380000 as time);`) + result.Check(testkit.Rows("838:00:00")) + result = tk.MustQuery(`select cast(8390000 as time);`) + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery(`select cast(8386000 as time);`) + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery(`select cast(8385960 as time);`) + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery(`select cast(cast('2017-01-01 01:01:11.12' as date) as datetime(2));`) + result.Check(testkit.Rows("2017-01-01 00:00:00.00")) + result = tk.MustQuery(`select cast(20170118.999 as datetime);`) + result.Check(testkit.Rows("2017-01-18 00:00:00")) + tk.MustQuery(`select convert(a2.a, unsigned int) from (select cast('"9223372036854775808"' as json) as a) as a2;`) + + tk.MustExec(`create table tb5(a bigint(64) unsigned, b double);`) + tk.MustExec(`insert into tb5 (a, b) values (9223372036854776000, 9223372036854776000);`) + tk.MustExec(`insert into tb5 (a, b) select * from (select cast(a as json) as a1, b from tb5) as t where t.a1 = t.b;`) + tk.MustExec(`drop table tb5;`) + + tk.MustExec(`create table tb5(a float(53));`) + tk.MustExec(`insert into tb5(a) values (13835058055282163712);`) + tk.MustQuery(`select convert(t.a1, signed int) from (select convert(a, json) as a1 from tb5) as t`) + tk.MustExec(`drop table tb5;`) + + // test builtinCastIntAsIntSig + // Cast MaxUint64 to unsigned should be -1 + tk.MustQuery("select cast(0xffffffffffffffff as signed);").Check(testkit.Rows("-1")) + tk.MustQuery("select cast(0x9999999999999999999999999999999999999999999 as signed);").Check(testkit.Rows("-1")) + tk.MustExec("create table tb5(a bigint);") + tk.MustExec("set sql_mode=''") + tk.MustExec("insert into tb5(a) values (0xfffffffffffffffffffffffff);") + tk.MustQuery("select * from tb5;").Check(testkit.Rows("9223372036854775807")) + tk.MustExec("drop table tb5;") + + tk.MustExec(`create table tb5(a double);`) + tk.MustExec(`insert into test.tb5 (a) values (18446744073709551616);`) + tk.MustExec(`insert into test.tb5 (a) values (184467440737095516160);`) + result = tk.MustQuery(`select cast(a as unsigned) from test.tb5;`) + // Note: MySQL will return 9223372036854775807, and it should be a bug. + result.Check(testkit.Rows("18446744073709551615", "18446744073709551615")) + tk.MustExec(`drop table tb5;`) + + // test builtinCastIntAsDecimalSig + tk.MustExec(`create table tb5(a bigint(64) unsigned, b decimal(64, 10));`) + tk.MustExec(`insert into tb5 (a, b) values (9223372036854775808, 9223372036854775808);`) + tk.MustExec(`insert into tb5 (select * from tb5 where a = b);`) + result = tk.MustQuery(`select * from tb5;`) + result.Check(testkit.Rows("9223372036854775808 9223372036854775808.0000000000", "9223372036854775808 9223372036854775808.0000000000")) + tk.MustExec(`drop table tb5;`) + + // test builtinCastIntAsRealSig + tk.MustExec(`create table tb5(a bigint(64) unsigned, b double(64, 10));`) + tk.MustExec(`insert into tb5 (a, b) values (13835058000000000000, 13835058000000000000);`) + tk.MustExec(`insert into tb5 (select * from tb5 where a = b);`) + result = tk.MustQuery(`select * from tb5;`) + result.Check(testkit.Rows("13835058000000000000 13835058000000000000", "13835058000000000000 13835058000000000000")) + tk.MustExec(`drop table tb5;`) + + // test builtinCastRealAsIntSig + tk.MustExec(`create table tb5(a double, b float);`) + tk.MustExec(`insert into tb5 (a, b) values (184467440737095516160, 184467440737095516160);`) + tk.MustQuery(`select * from tb5 where cast(a as unsigned int)=0;`).Check(testkit.Rows()) + tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1690 constant 1.844674407370955e+20 overflows bigint")) + _ = tk.MustQuery(`select * from tb5 where cast(b as unsigned int)=0;`) + tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1690 constant 1.844674407370955e+20 overflows bigint")) + tk.MustExec(`drop table tb5;`) + tk.MustExec(`create table tb5(a double, b bigint unsigned);`) + tk.MustExec(`insert into tb5 (a, b) values (18446744073709551616, 18446744073709551615);`) + _ = tk.MustQuery(`select * from tb5 where cast(a as unsigned int)=b;`) + // TODO `obtained string = "[18446744073709552000 18446744073709551615]` + // result.Check(testkit.Rows("18446744073709551616 18446744073709551615")) + tk.MustQuery("show warnings;").Check(testkit.Rows()) + tk.MustExec(`drop table tb5;`) + + // test builtinCastJSONAsIntSig + tk.MustExec(`create table tb5(a json, b bigint unsigned);`) + tk.MustExec(`insert into tb5 (a, b) values ('184467440737095516160', 18446744073709551615);`) + _ = tk.MustQuery(`select * from tb5 where cast(a as unsigned int)=b;`) + tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1690 constant 1.844674407370955e+20 overflows bigint")) + _ = tk.MustQuery(`select * from tb5 where cast(b as unsigned int)=0;`) + tk.MustQuery("show warnings;").Check(testkit.Rows()) + tk.MustExec(`drop table tb5;`) + tk.MustExec(`create table tb5(a json, b bigint unsigned);`) + tk.MustExec(`insert into tb5 (a, b) values ('92233720368547758080', 18446744073709551615);`) + _ = tk.MustQuery(`select * from tb5 where cast(a as signed int)=b;`) + tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1690 constant 9.223372036854776e+19 overflows bigint")) + tk.MustExec(`drop table tb5;`) + + // test builtinCastIntAsStringSig + tk.MustExec(`create table tb5(a bigint(64) unsigned,b varchar(50));`) + tk.MustExec(`insert into tb5(a, b) values (9223372036854775808, '9223372036854775808');`) + tk.MustExec(`insert into tb5(select * from tb5 where a = b);`) + result = tk.MustQuery(`select * from tb5;`) + result.Check(testkit.Rows("9223372036854775808 9223372036854775808", "9223372036854775808 9223372036854775808")) + tk.MustExec(`drop table tb5;`) + + // test builtinCastIntAsDecimalSig + tk.MustExec(`drop table if exists tb5`) + tk.MustExec(`create table tb5 (a decimal(65), b bigint(64) unsigned);`) + tk.MustExec(`insert into tb5 (a, b) values (9223372036854775808, 9223372036854775808);`) + result = tk.MustQuery(`select cast(b as decimal(64)) from tb5 union all select b from tb5;`) + result.Check(testkit.Rows("9223372036854775808", "9223372036854775808")) + tk.MustExec(`drop table tb5`) + + // test builtinCastIntAsRealSig + tk.MustExec(`drop table if exists tb5`) + tk.MustExec(`create table tb5 (a bigint(64) unsigned, b double(64, 10));`) + tk.MustExec(`insert into tb5 (a, b) values (9223372036854775808, 9223372036854775808);`) + result = tk.MustQuery(`select a from tb5 where a = b union all select b from tb5;`) + result.Check(testkit.Rows("9223372036854776000", "9223372036854776000")) + tk.MustExec(`drop table tb5`) + + // Test corner cases of cast string as datetime + result = tk.MustQuery(`select cast("170102034" as datetime);`) + result.Check(testkit.Rows("2017-01-02 03:04:00")) + result = tk.MustQuery(`select cast("1701020304" as datetime);`) + result.Check(testkit.Rows("2017-01-02 03:04:00")) + result = tk.MustQuery(`select cast("1701020304." as datetime);`) + result.Check(testkit.Rows("2017-01-02 03:04:00")) + result = tk.MustQuery(`select cast("1701020304.1" as datetime);`) + result.Check(testkit.Rows("2017-01-02 03:04:01")) + result = tk.MustQuery(`select cast("1701020304.111" as datetime);`) + result.Check(testkit.Rows("2017-01-02 03:04:11")) + tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1292 Truncated incorrect datetime value: '1701020304.111'")) + result = tk.MustQuery(`select cast("17011" as datetime);`) + result.Check(testkit.Rows("2017-01-01 00:00:00")) + result = tk.MustQuery(`select cast("150101." as datetime);`) + result.Check(testkit.Rows("2015-01-01 00:00:00")) + result = tk.MustQuery(`select cast("150101.a" as datetime);`) + result.Check(testkit.Rows("2015-01-01 00:00:00")) + tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1292 Truncated incorrect datetime value: '150101.a'")) + result = tk.MustQuery(`select cast("150101.1a" as datetime);`) + result.Check(testkit.Rows("2015-01-01 01:00:00")) + tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1292 Truncated incorrect datetime value: '150101.1a'")) + result = tk.MustQuery(`select cast("150101.1a1" as datetime);`) + result.Check(testkit.Rows("2015-01-01 01:00:00")) + tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1292 Truncated incorrect datetime value: '150101.1a1'")) + result = tk.MustQuery(`select cast("1101010101.111" as datetime);`) + result.Check(testkit.Rows("2011-01-01 01:01:11")) + tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1292 Truncated incorrect datetime value: '1101010101.111'")) + result = tk.MustQuery(`select cast("1101010101.11aaaaa" as datetime);`) + result.Check(testkit.Rows("2011-01-01 01:01:11")) + tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1292 Truncated incorrect datetime value: '1101010101.11aaaaa'")) + result = tk.MustQuery(`select cast("1101010101.a1aaaaa" as datetime);`) + result.Check(testkit.Rows("2011-01-01 01:01:00")) + tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1292 Truncated incorrect datetime value: '1101010101.a1aaaaa'")) + result = tk.MustQuery(`select cast("1101010101.11" as datetime);`) + result.Check(testkit.Rows("2011-01-01 01:01:11")) + tk.MustQuery("select @@warning_count;").Check(testkit.Rows("0")) + result = tk.MustQuery(`select cast("1101010101.111" as datetime);`) + result.Check(testkit.Rows("2011-01-01 01:01:11")) + tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1292 Truncated incorrect datetime value: '1101010101.111'")) + result = tk.MustQuery(`select cast("970101.111" as datetime);`) + result.Check(testkit.Rows("1997-01-01 11:01:00")) + tk.MustQuery("select @@warning_count;").Check(testkit.Rows("0")) + result = tk.MustQuery(`select cast("970101.11111" as datetime);`) + result.Check(testkit.Rows("1997-01-01 11:11:01")) + tk.MustQuery("select @@warning_count;").Check(testkit.Rows("0")) + result = tk.MustQuery(`select cast("970101.111a1" as datetime);`) + result.Check(testkit.Rows("1997-01-01 11:01:00")) + tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1292 Truncated incorrect datetime value: '970101.111a1'")) + + // for ISNULL + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int, b int, c int, d char(10), e datetime, f float, g decimal(10, 3))") + tk.MustExec("insert t values (1, 0, null, null, null, null, null)") + result = tk.MustQuery("select ISNULL(a), ISNULL(b), ISNULL(c), ISNULL(d), ISNULL(e), ISNULL(f), ISNULL(g) from t") + result.Check(testkit.Rows("0 0 1 1 1 1 1")) + + // fix issue #3942 + result = tk.MustQuery("select cast('-24 100:00:00' as time);") + result.Check(testkit.Rows("-676:00:00")) + result = tk.MustQuery("select cast('12:00:00.000000' as datetime);") + result.Check(testkit.Rows("2012-00-00 00:00:00")) + result = tk.MustQuery("select cast('-34 100:00:00' as time);") + result.Check(testkit.Rows("-838:59:59")) + + // fix issue #4324. cast decimal/int/string to time compatibility. + invalidTimes := []string{ + "10009010", + "239010", + "233070", + "23:90:10", + "23:30:70", + "239010.2", + "233070.8", + } + tk.MustExec("DROP TABLE IF EXISTS t;") + tk.MustExec("CREATE TABLE t (ix TIME);") + tk.MustExec("SET SQL_MODE='';") + for _, invalidTime := range invalidTimes { + msg := fmt.Sprintf("Warning 1292 Truncated incorrect time value: '%s'", invalidTime) + result = tk.MustQuery(fmt.Sprintf("select cast('%s' as time);", invalidTime)) + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("show warnings") + result.Check(testkit.Rows(msg)) + _, err := tk.Exec(fmt.Sprintf("insert into t select cast('%s' as time);", invalidTime)) + require.NoError(t, err) + result = tk.MustQuery("show warnings") + result.Check(testkit.Rows(msg)) + } + tk.MustExec("set sql_mode = 'STRICT_TRANS_TABLES'") + for _, invalidTime := range invalidTimes { + msg := fmt.Sprintf("Warning 1292 Truncated incorrect time value: '%s'", invalidTime) + result = tk.MustQuery(fmt.Sprintf("select cast('%s' as time);", invalidTime)) + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("show warnings") + result.Check(testkit.Rows(msg)) + _, err := tk.Exec(fmt.Sprintf("insert into t select cast('%s' as time);", invalidTime)) + require.Error(t, err, fmt.Sprintf("[types:1292]Truncated incorrect time value: '%s'", invalidTime)) + } + + // Fix issue #3691, cast compatibility. + result = tk.MustQuery("select cast('18446744073709551616' as unsigned);") + result.Check(testkit.Rows("18446744073709551615")) + result = tk.MustQuery("select cast('18446744073709551616' as signed);") + result.Check(testkit.Rows("-1")) + result = tk.MustQuery("select cast('9223372036854775808' as signed);") + result.Check(testkit.Rows("-9223372036854775808")) + result = tk.MustQuery("select cast('9223372036854775809' as signed);") + result.Check(testkit.Rows("-9223372036854775807")) + result = tk.MustQuery("select cast('9223372036854775807' as signed);") + result.Check(testkit.Rows("9223372036854775807")) + result = tk.MustQuery("select cast('18446744073709551615' as signed);") + result.Check(testkit.Rows("-1")) + result = tk.MustQuery("select cast('18446744073709551614' as signed);") + result.Check(testkit.Rows("-2")) + result = tk.MustQuery("select cast(18446744073709551615 as unsigned);") + result.Check(testkit.Rows("18446744073709551615")) + result = tk.MustQuery("select cast(18446744073709551616 as unsigned);") + result.Check(testkit.Rows("18446744073709551615")) + result = tk.MustQuery("select cast(18446744073709551616 as signed);") + result.Check(testkit.Rows("9223372036854775807")) + result = tk.MustQuery("select cast(18446744073709551617 as signed);") + result.Check(testkit.Rows("9223372036854775807")) + result = tk.MustQuery("select cast(18446744073709551615 as signed);") + result.Check(testkit.Rows("-1")) + result = tk.MustQuery("select cast(18446744073709551614 as signed);") + result.Check(testkit.Rows("-2")) + result = tk.MustQuery("select cast(-18446744073709551616 as signed);") + result.Check(testkit.Rows("-9223372036854775808")) + result = tk.MustQuery("select cast(18446744073709551614.9 as unsigned);") // Round up + result.Check(testkit.Rows("18446744073709551615")) + result = tk.MustQuery("select cast(18446744073709551614.4 as unsigned);") // Round down + result.Check(testkit.Rows("18446744073709551614")) + result = tk.MustQuery("select cast(-9223372036854775809 as signed);") + result.Check(testkit.Rows("-9223372036854775808")) + result = tk.MustQuery("select cast(-9223372036854775809 as unsigned);") + result.Check(testkit.Rows("0")) + result = tk.MustQuery("select cast(-9223372036854775808 as unsigned);") + result.Check(testkit.Rows("9223372036854775808")) + result = tk.MustQuery("select cast('-9223372036854775809' as unsigned);") + result.Check(testkit.Rows("9223372036854775808")) + result = tk.MustQuery("select cast('-9223372036854775807' as unsigned);") + result.Check(testkit.Rows("9223372036854775809")) + result = tk.MustQuery("select cast('-2' as unsigned);") + result.Check(testkit.Rows("18446744073709551614")) + result = tk.MustQuery("select cast(cast(1-2 as unsigned) as signed integer);") + result.Check(testkit.Rows("-1")) + result = tk.MustQuery("select cast(1 as signed int)") + result.Check(testkit.Rows("1")) + + // test cast as double + result = tk.MustQuery("select cast(1 as double)") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("select cast(cast(12345 as unsigned) as double)") + result.Check(testkit.Rows("12345")) + result = tk.MustQuery("select cast(1.1 as double)") + result.Check(testkit.Rows("1.1")) + result = tk.MustQuery("select cast(-1.1 as double)") + result.Check(testkit.Rows("-1.1")) + result = tk.MustQuery("select cast('123.321' as double)") + result.Check(testkit.Rows("123.321")) + result = tk.MustQuery("select cast('12345678901234567890' as double) = 1.2345678901234567e19") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("select cast(-1 as double)") + result.Check(testkit.Rows("-1")) + result = tk.MustQuery("select cast(null as double)") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("select cast(12345678901234567890 as double) = 1.2345678901234567e19") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("select cast(cast(-1 as unsigned) as double) = 1.8446744073709552e19") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("select cast(1e100 as double) = 1e100") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("select cast(123456789012345678901234567890 as double) = 1.2345678901234568e29") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("select cast(0x12345678 as double)") + result.Check(testkit.Rows("305419896")) + + // test cast as float + result = tk.MustQuery("select cast(1 as float)") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("select cast(cast(12345 as unsigned) as float)") + result.Check(testkit.Rows("12345")) + result = tk.MustQuery("select cast(1.1 as float) = 1.1") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("select cast(-1.1 as float) = -1.1") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("select cast('123.321' as float) =123.321") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("select cast('12345678901234567890' as float) = 1.2345678901234567e19") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("select cast(-1 as float)") + result.Check(testkit.Rows("-1")) + result = tk.MustQuery("select cast(null as float)") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("select cast(12345678901234567890 as float) = 1.2345678901234567e19") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("select cast(cast(-1 as unsigned) as float) = 1.8446744073709552e19") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("select cast(1e100 as float(40)) = 1e100") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("select cast(123456789012345678901234567890 as float(40)) = 1.2345678901234568e29") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("select cast(0x12345678 as float(40)) = 305419896") + result.Check(testkit.Rows("1")) + + // test cast as real + result = tk.MustQuery("select cast(1 as real)") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("select cast(cast(12345 as unsigned) as real)") + result.Check(testkit.Rows("12345")) + result = tk.MustQuery("select cast(1.1 as real) = 1.1") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("select cast(-1.1 as real) = -1.1") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("select cast('123.321' as real) =123.321") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("select cast('12345678901234567890' as real) = 1.2345678901234567e19") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("select cast(-1 as real)") + result.Check(testkit.Rows("-1")) + result = tk.MustQuery("select cast(null as real)") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("select cast(12345678901234567890 as real) = 1.2345678901234567e19") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("select cast(cast(-1 as unsigned) as real) = 1.8446744073709552e19") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("select cast(1e100 as real) = 1e100") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("select cast(123456789012345678901234567890 as real) = 1.2345678901234568e29") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("select cast(0x12345678 as real) = 305419896") + result.Check(testkit.Rows("1")) + + // test cast time as decimal overflow + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1(s1 time);") + tk.MustExec("insert into t1 values('11:11:11');") + result = tk.MustQuery("select cast(s1 as decimal(7, 2)) from t1;") + result.Check(testkit.Rows("99999.99")) + result = tk.MustQuery("select cast(s1 as decimal(8, 2)) from t1;") + result.Check(testkit.Rows("111111.00")) + _, err := tk.Exec("insert into t1 values(cast('111111.00' as decimal(7, 2)));") + require.Error(t, err) + + result = tk.MustQuery(`select CAST(0x8fffffffffffffff as signed) a, + CAST(0xfffffffffffffffe as signed) b, + CAST(0xffffffffffffffff as unsigned) c;`) + result.Check(testkit.Rows("-8070450532247928833 -2 18446744073709551615")) + + result = tk.MustQuery(`select cast("1:2:3" as TIME) = "1:02:03"`) + result.Check(testkit.Rows("0")) + + // fixed issue #3471 + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a time(6));") + tk.MustExec("insert into t value('12:59:59.999999')") + result = tk.MustQuery("select cast(a as signed) from t") + result.Check(testkit.Rows("130000")) + + // fixed issue #3762 + result = tk.MustQuery("select -9223372036854775809;") + result.Check(testkit.Rows("-9223372036854775809")) + result = tk.MustQuery("select --9223372036854775809;") + result.Check(testkit.Rows("9223372036854775809")) + result = tk.MustQuery("select -9223372036854775808;") + result.Check(testkit.Rows("-9223372036854775808")) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a bigint(30));") + _, err = tk.Exec("insert into t values(-9223372036854775809)") + require.Error(t, err) + + // test case decimal precision less than the scale. + _, err = tk.Exec("select cast(12.1 as decimal(3, 4));") + require.Error(t, err) + require.Error(t, err, "[types:1427]For float(M,D), double(M,D) or decimal(M,D), M must be >= D (column '12.1').") + + // test unhex and hex + result = tk.MustQuery("select unhex('4D7953514C')") + result.Check(testkit.Rows("MySQL")) + result = tk.MustQuery("select unhex(hex('string'))") + result.Check(testkit.Rows("string")) + result = tk.MustQuery("select unhex('ggg')") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("select unhex(-1)") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("select hex(unhex('1267'))") + result.Check(testkit.Rows("1267")) + result = tk.MustQuery("select hex(unhex(1267))") + result.Check(testkit.Rows("1267")) + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a binary(8))") + tk.MustExec(`insert into t values('test')`) + result = tk.MustQuery("select hex(a) from t") + result.Check(testkit.Rows("7465737400000000")) + result = tk.MustQuery("select unhex(a) from t") + result.Check(testkit.Rows("<nil>")) + + // select from_unixtime + // NOTE (#17013): make from_unixtime stable in different timezone: the result of from_unixtime + // depends on the local time zone of the test environment, thus the result checking must + // consider the time zone convert. + tz := tk.Session().GetSessionVars().StmtCtx.TimeZone + result = tk.MustQuery("select from_unixtime(1451606400)") + unixTime := time.Unix(1451606400, 0).In(tz).String()[:19] + result.Check(testkit.Rows(unixTime)) + result = tk.MustQuery("select from_unixtime(14516064000/10)") + result.Check(testkit.Rows(fmt.Sprintf("%s.0000", unixTime))) + result = tk.MustQuery("select from_unixtime('14516064000'/10)") + result.Check(testkit.Rows(fmt.Sprintf("%s.000000", unixTime))) + result = tk.MustQuery("select from_unixtime(cast(1451606400 as double))") + result.Check(testkit.Rows(fmt.Sprintf("%s.000000", unixTime))) + result = tk.MustQuery("select from_unixtime(cast(cast(1451606400 as double) as DECIMAL))") + result.Check(testkit.Rows(unixTime)) + result = tk.MustQuery("select from_unixtime(cast(cast(1451606400 as double) as DECIMAL(65,1)))") + result.Check(testkit.Rows(fmt.Sprintf("%s.0", unixTime))) + result = tk.MustQuery("select from_unixtime(1451606400.123456)") + unixTime = time.Unix(1451606400, 123456000).In(tz).String()[:26] + result.Check(testkit.Rows(unixTime)) + result = tk.MustQuery("select from_unixtime(1451606400.1234567)") + unixTime = time.Unix(1451606400, 123456700).In(tz).Round(time.Microsecond).Format("2006-01-02 15:04:05.000000")[:26] + result.Check(testkit.Rows(unixTime)) + result = tk.MustQuery("select from_unixtime(1451606400.999999)") + unixTime = time.Unix(1451606400, 999999000).In(tz).String()[:26] + result.Check(testkit.Rows(unixTime)) + result = tk.MustQuery("select from_unixtime(1511247196661)") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("select from_unixtime('1451606400.123');") + unixTime = time.Unix(1451606400, 0).In(tz).String()[:19] + result.Check(testkit.Rows(fmt.Sprintf("%s.123000", unixTime))) + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a int);") + tk.MustExec("insert into t value(1451606400);") + result = tk.MustQuery("select from_unixtime(a) from t;") + result.Check(testkit.Rows(unixTime)) + + // test strcmp + result = tk.MustQuery("select strcmp('abc', 'def')") + result.Check(testkit.Rows("-1")) + result = tk.MustQuery("select strcmp('abc', 'aba')") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("select strcmp('abc', 'abc')") + result.Check(testkit.Rows("0")) + result = tk.MustQuery("select substr(null, 1, 2)") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("select substr('123', null, 2)") + result.Check(testkit.Rows("<nil>")) + result = tk.MustQuery("select substr('123', 1, null)") + result.Check(testkit.Rows("<nil>")) + + // for case + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a varchar(255), b int)") + tk.MustExec("insert t values ('str1', 1)") + result = tk.MustQuery("select * from t where a = case b when 1 then 'str1' when 2 then 'str2' end") + result.Check(testkit.Rows("str1 1")) + result = tk.MustQuery("select * from t where a = case b when 1 then 'str2' when 2 then 'str3' end") + result.Check(nil) + tk.MustExec("insert t values ('str2', 2)") + result = tk.MustQuery("select * from t where a = case b when 2 then 'str2' when 3 then 'str3' end") + result.Check(testkit.Rows("str2 2")) + tk.MustExec("insert t values ('str3', 3)") + result = tk.MustQuery("select * from t where a = case b when 4 then 'str4' when 5 then 'str5' else 'str3' end") + result.Check(testkit.Rows("str3 3")) + result = tk.MustQuery("select * from t where a = case b when 4 then 'str4' when 5 then 'str5' else 'str6' end") + result.Check(nil) + result = tk.MustQuery("select * from t where a = case when b then 'str3' when 1 then 'str1' else 'str2' end") + result.Check(testkit.Rows("str3 3")) + tk.MustExec("delete from t") + tk.MustExec("insert t values ('str2', 0)") + result = tk.MustQuery("select * from t where a = case when b then 'str3' when 0 then 'str1' else 'str2' end") + result.Check(testkit.Rows("str2 0")) + tk.MustExec("insert t values ('str1', null)") + result = tk.MustQuery("select * from t where a = case b when null then 'str3' when 10 then 'str1' else 'str2' end") + result.Check(testkit.Rows("str2 0")) + result = tk.MustQuery("select * from t where a = case null when b then 'str3' when 10 then 'str1' else 'str2' end") + result.Check(testkit.Rows("str2 0")) + tk.MustExec("insert t values (null, 4)") + result = tk.MustQuery("select * from t where b < case a when null then 0 when 'str2' then 0 else 9 end") + result.Check(testkit.Rows("<nil> 4")) + result = tk.MustQuery("select * from t where b = case when a is null then 4 when a = 'str5' then 7 else 9 end") + result.Check(testkit.Rows("<nil> 4")) + result = tk.MustQuery(`SELECT -Max(+23) * -+Cast(--10 AS SIGNED) * -CASE + WHEN 0 > 85 THEN NULL + WHEN NOT + CASE +55 + WHEN +( +82 ) + -89 * -69 THEN +Count(-88) + WHEN +CASE 57 + WHEN +89 THEN -89 * Count(*) + WHEN 17 THEN NULL + END THEN ( -10 ) + END IS NULL THEN NULL + ELSE 83 + 48 + END AS col0; `) + result.Check(testkit.Rows("-30130")) + + // return type of case when expr should not include NotNullFlag. issue-23036 + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1(c1 int not null)") + tk.MustExec("insert into t1 values(1)") + result = tk.MustQuery("select (case when null then c1 end) is null from t1") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("select (case when null then c1 end) is not null from t1") + result.Check(testkit.Rows("0")) + + // test warnings + tk.MustQuery("select case when b=0 then 1 else 1/b end from t") + tk.MustQuery("show warnings").Check(testkit.Rows()) + tk.MustQuery("select if(b=0, 1, 1/b) from t") + tk.MustQuery("show warnings").Check(testkit.Rows()) + tk.MustQuery("select ifnull(b, b/0) from t") + tk.MustQuery("show warnings").Check(testkit.Rows()) + + tk.MustQuery("select case when 1 then 1 else 1/0 end") + tk.MustQuery("show warnings").Check(testkit.Rows()) + tk.MustQuery(" select if(1,1,1/0)") + tk.MustQuery("show warnings").Check(testkit.Rows()) + tk.MustQuery("select ifnull(1, 1/0)") + tk.MustQuery("show warnings").Check(testkit.Rows()) + + tk.MustExec("delete from t") + tk.MustExec("insert t values ('str2', 0)") + tk.MustQuery("select case when b < 1 then 1 else 1/0 end from t") + tk.MustQuery("show warnings").Check(testkit.Rows()) + tk.MustQuery("select case when b < 1 then 1 when 1/0 then b else 1/0 end from t") + tk.MustQuery("show warnings").Check(testkit.Rows()) + tk.MustQuery("select if(b < 1 , 1, 1/0) from t") + tk.MustQuery("show warnings").Check(testkit.Rows()) + tk.MustQuery("select ifnull(b, 1/0) from t") + tk.MustQuery("show warnings").Check(testkit.Rows()) + tk.MustQuery("select COALESCE(1, b, b/0) from t") + tk.MustQuery("show warnings").Check(testkit.Rows()) + tk.MustQuery("select 0 and b/0 from t") + tk.MustQuery("show warnings").Check(testkit.Rows()) + tk.MustQuery("select 1 or b/0 from t") + tk.MustQuery("show warnings").Check(testkit.Rows()) + + tk.MustQuery("select 1 or 1/0") + tk.MustQuery("show warnings").Check(testkit.Rows()) + tk.MustQuery("select 0 and 1/0") + tk.MustQuery("show warnings").Check(testkit.Rows()) + tk.MustQuery("select COALESCE(1, 1/0)") + tk.MustQuery("show warnings").Check(testkit.Rows()) + tk.MustQuery("select interval(1,0,1,2,1/0)") + tk.MustQuery("show warnings").Check(testkit.Rows()) + + tk.MustQuery("select case 2.0 when 2.0 then 3.0 when 3.0 then 2.0 end").Check(testkit.Rows("3.0")) + tk.MustQuery("select case 2.0 when 3.0 then 2.0 when 4.0 then 3.0 else 5.0 end").Check(testkit.Rows("5.0")) + tk.MustQuery("select case cast('2011-01-01' as date) when cast('2011-01-01' as date) then cast('2011-02-02' as date) end").Check(testkit.Rows("2011-02-02")) + tk.MustQuery("select case cast('2012-01-01' as date) when cast('2011-01-01' as date) then cast('2011-02-02' as date) else cast('2011-03-03' as date) end").Check(testkit.Rows("2011-03-03")) + tk.MustQuery("select case cast('10:10:10' as time) when cast('10:10:10' as time) then cast('11:11:11' as time) end").Check(testkit.Rows("11:11:11")) + tk.MustQuery("select case cast('10:10:13' as time) when cast('10:10:10' as time) then cast('11:11:11' as time) else cast('22:22:22' as time) end").Check(testkit.Rows("22:22:22")) + + // for cast + result = tk.MustQuery("select cast(1234 as char(3))") + result.Check(testkit.Rows("123")) + result = tk.MustQuery("select cast(1234 as char(0))") + result.Check(testkit.Rows("")) + result = tk.MustQuery("show warnings") + result.Check(testkit.Rows("Warning 1406 Data Too Long, field len 0, data len 4")) + result = tk.MustQuery("select CAST( - 8 AS DECIMAL ) * + 52 + 87 < - 86") + result.Check(testkit.Rows("1")) + + // for char + result = tk.MustQuery("select char(97, 100, 256, 89)") + result.Check(testkit.Rows("ad\x01\x00Y")) + result = tk.MustQuery("select char(97, null, 100, 256, 89)") + result.Check(testkit.Rows("ad\x01\x00Y")) + result = tk.MustQuery("select char(97, null, 100, 256, 89 using utf8)") + result.Check(testkit.Rows("ad\x01\x00Y")) + result = tk.MustQuery("select char(97, null, 100, 256, 89 using ascii)") + result.Check(testkit.Rows("ad\x01\x00Y")) + err = tk.ExecToErr("select char(97, null, 100, 256, 89 using tidb)") + require.Error(t, err, "[parser:1115]Unknown character set: 'tidb'") + + // issue 3884 + tk.MustExec("drop table if exists t") + tk.MustExec("CREATE TABLE t (c1 date, c2 datetime, c3 timestamp, c4 time, c5 year);") + tk.MustExec("INSERT INTO t values ('2000-01-01', '2000-01-01 12:12:12', '2000-01-01 12:12:12', '12:12:12', '2000');") + tk.MustExec("INSERT INTO t values ('2000-02-01', '2000-02-01 12:12:12', '2000-02-01 12:12:12', '13:12:12', 2000);") + tk.MustExec("INSERT INTO t values ('2000-03-01', '2000-03-01', '2000-03-01 12:12:12', '1 12:12:12', 2000);") + tk.MustExec("INSERT INTO t SET c1 = '2000-04-01', c2 = '2000-04-01', c3 = '2000-04-01 12:12:12', c4 = '-1 13:12:12', c5 = 2000;") + result = tk.MustQuery("SELECT c4 FROM t where c4 < '-13:12:12';") + result.Check(testkit.Rows("-37:12:12")) + result = tk.MustQuery(`SELECT 1 DIV - - 28 + ( - SUM( - + 25 ) ) * - CASE - 18 WHEN 44 THEN NULL ELSE - 41 + 32 + + - 70 - + COUNT( - 95 ) * 15 END + 92`) + result.Check(testkit.Rows("2442")) + + // for regexp, rlike + // https://github.com/pingcap/tidb/issues/4080 + tk.MustExec(`drop table if exists t;`) + tk.MustExec(`create table t (a char(10), b varchar(10), c binary(10), d varbinary(10));`) + tk.MustExec(`insert into t values ('text','text','text','text');`) + result = tk.MustQuery(`select a regexp 'xt' from t;`) + result.Check(testkit.Rows("1")) + result = tk.MustQuery(`select b regexp 'xt' from t;`) + result.Check(testkit.Rows("1")) + result = tk.MustQuery(`select b regexp binary 'Xt' from t;`) + result.Check(testkit.Rows("0")) + result = tk.MustQuery(`select c regexp 'Xt' from t;`) + result.Check(testkit.Rows("0")) + result = tk.MustQuery(`select d regexp 'Xt' from t;`) + result.Check(testkit.Rows("0")) + result = tk.MustQuery(`select a rlike 'xt' from t;`) + result.Check(testkit.Rows("1")) + result = tk.MustQuery(`select a rlike binary 'Xt' from t;`) + result.Check(testkit.Rows("0")) + result = tk.MustQuery(`select b rlike 'xt' from t;`) + result.Check(testkit.Rows("1")) + result = tk.MustQuery(`select c rlike 'Xt' from t;`) + result.Check(testkit.Rows("0")) + result = tk.MustQuery(`select d rlike 'Xt' from t;`) + result.Check(testkit.Rows("0")) + result = tk.MustQuery(`select 'a' regexp 'A', 'a' regexp binary 'A'`) + result.Check(testkit.Rows("0 0")) + + // testCase is for like and regexp + type testCase struct { + pattern string + val string + result int + } + patternMatching := func(tk *testkit.TestKit, queryOp string, data []testCase) { + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a varchar(255), b int)") + for i, d := range data { + tk.MustExec(fmt.Sprintf("insert into t values('%s', %d)", d.val, i)) + result = tk.MustQuery(fmt.Sprintf("select * from t where a %s '%s'", queryOp, d.pattern)) + if d.result == 1 { + rowStr := fmt.Sprintf("%s %d", d.val, i) + result.Check(testkit.Rows(rowStr)) + } else { + result.Check(nil) + } + tk.MustExec(fmt.Sprintf("delete from t where b = %d", i)) + } + } + // for like + likeTests := []testCase{ + {"a", "a", 1}, + {"a", "b", 0}, + {"aA", "Aa", 0}, + {`aA%`, "aAab", 1}, + {"aA_", "Aaab", 0}, + {"Aa_", "Aab", 1}, + {"", "", 1}, + {"", "a", 0}, + } + patternMatching(tk, "like", likeTests) + // for regexp + likeTests = []testCase{ + {"^$", "a", 0}, + {"a", "a", 1}, + {"a", "b", 0}, + {"aA", "aA", 1}, + {".", "a", 1}, + {"^.$", "ab", 0}, + {"..", "b", 0}, + {".ab", "aab", 1}, + {"ab.", "abcd", 1}, + {".*", "abcd", 1}, + } + patternMatching(tk, "regexp", likeTests) + + // for #9838 + result = tk.MustQuery("select cast(1 as signed) + cast(9223372036854775807 as unsigned);") + result.Check(testkit.Rows("9223372036854775808")) + result = tk.MustQuery("select cast(9223372036854775807 as unsigned) + cast(1 as signed);") + result.Check(testkit.Rows("9223372036854775808")) + err = tk.QueryToErr("select cast(9223372036854775807 as signed) + cast(9223372036854775809 as unsigned);") + require.Error(t, err) + err = tk.QueryToErr("select cast(9223372036854775809 as unsigned) + cast(9223372036854775807 as signed);") + require.Error(t, err) + err = tk.QueryToErr("select cast(-9223372036854775807 as signed) + cast(9223372036854775806 as unsigned);") + require.Error(t, err) + err = tk.QueryToErr("select cast(9223372036854775806 as unsigned) + cast(-9223372036854775807 as signed);") + require.Error(t, err) + + result = tk.MustQuery(`select 1 / '2007' div 1;`) + result.Check(testkit.Rows("0")) +} + +func TestSetVariables(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + _, err := tk.Exec("set sql_mode='adfasdfadsfdasd';") + require.Error(t, err) + _, err = tk.Exec("set @@sql_mode='adfasdfadsfdasd';") + require.Error(t, err) + _, err = tk.Exec("set @@global.sql_mode='adfasdfadsfdasd';") + require.Error(t, err) + _, err = tk.Exec("set @@session.sql_mode='adfasdfadsfdasd';") + require.Error(t, err) + + var r *testkit.Result + _, err = tk.Exec("set @@session.sql_mode=',NO_ZERO_DATE,ANSI,ANSI_QUOTES';") + require.NoError(t, err) + r = tk.MustQuery(`select @@session.sql_mode`) + r.Check(testkit.Rows("NO_ZERO_DATE,REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY,ANSI")) + r = tk.MustQuery(`show variables like 'sql_mode'`) + r.Check(testkit.Rows("sql_mode NO_ZERO_DATE,REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY,ANSI")) + + // for invalid SQL mode. + tk.MustExec("use test") + tk.MustExec("drop table if exists tab0") + tk.MustExec("CREATE TABLE tab0(col1 time)") + _, err = tk.Exec("set sql_mode='STRICT_TRANS_TABLES';") + require.NoError(t, err) + _, err = tk.Exec("INSERT INTO tab0 select cast('999:44:33' as time);") + require.Error(t, err) + require.Error(t, err, "[types:1292]Truncated incorrect time value: '999:44:33'") + _, err = tk.Exec("set sql_mode=' ,';") + require.Error(t, err) + _, err = tk.Exec("INSERT INTO tab0 select cast('999:44:33' as time);") + require.Error(t, err) + require.Error(t, err, "[types:1292]Truncated incorrect time value: '999:44:33'") + + // issue #5478 + _, err = tk.Exec("set session transaction read write;") + require.NoError(t, err) + _, err = tk.Exec("set global transaction read write;") + require.NoError(t, err) + r = tk.MustQuery(`select @@session.tx_read_only, @@global.tx_read_only, @@session.transaction_read_only, @@global.transaction_read_only;`) + r.Check(testkit.Rows("0 0 0 0")) + + _, err = tk.Exec("set session transaction read only;") + require.Error(t, err) + + _, err = tk.Exec("start transaction read only;") + require.Error(t, err) + + _, err = tk.Exec("set tidb_enable_noop_functions=1") + require.NoError(t, err) + + tk.MustExec("set session transaction read only;") + tk.MustExec("start transaction read only;") + + r = tk.MustQuery(`select @@session.tx_read_only, @@global.tx_read_only, @@session.transaction_read_only, @@global.transaction_read_only;`) + r.Check(testkit.Rows("1 0 1 0")) + _, err = tk.Exec("set global transaction read only;") + require.Error(t, err) + tk.MustExec("set global tidb_enable_noop_functions=1;") + tk.MustExec("set global transaction read only;") + r = tk.MustQuery(`select @@session.tx_read_only, @@global.tx_read_only, @@session.transaction_read_only, @@global.transaction_read_only;`) + r.Check(testkit.Rows("1 1 1 1")) + + _, err = tk.Exec("set session transaction read write;") + require.NoError(t, err) + _, err = tk.Exec("set global transaction read write;") + require.NoError(t, err) + r = tk.MustQuery(`select @@session.tx_read_only, @@global.tx_read_only, @@session.transaction_read_only, @@global.transaction_read_only;`) + r.Check(testkit.Rows("0 0 0 0")) + + // reset + tk.MustExec("set tidb_enable_noop_functions=0") + tk.MustExec("set global tidb_enable_noop_functions=1") + + _, err = tk.Exec("set @@global.max_user_connections='';") + require.Error(t, err) + require.Error(t, err, variable.ErrWrongTypeForVar.GenWithStackByArgs("max_user_connections").Error()) + _, err = tk.Exec("set @@global.max_prepared_stmt_count='';") + require.Error(t, err) + require.Error(t, err, variable.ErrWrongTypeForVar.GenWithStackByArgs("max_prepared_stmt_count").Error()) +} + +func TestPreparePlanCache(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + + // Plan cache should now be off by default + require.False(t, plannercore.PreparedPlanCacheEnabled()) + + orgEnable := plannercore.PreparedPlanCacheEnabled() + defer func() { + plannercore.SetPreparedPlanCache(orgEnable) + }() + plannercore.SetPreparedPlanCache(true) + var err error + se, err := session.CreateSession4TestWithOpt(store, &session.Opt{ + PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), + }) + require.NoError(t, err) + tk.SetSession(se) + // Use the example from the docs https://docs.pingcap.com/tidb/stable/sql-prepare-plan-cache + tk.MustExec("use test") + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a int);") + tk.MustExec("prepare stmt from 'select * from t where a = ?';") + tk.MustExec("set @a = 1;") + tk.MustExec("execute stmt using @a;") + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) + tk.MustExec("execute stmt using @a;") + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) +} + +func TestPreparePlanCacheNotForCacheTable(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + + plannercore.SetPreparedPlanCache(true) + require.True(t, plannercore.PreparedPlanCacheEnabled()) + + var err error + se, err := session.CreateSession4TestWithOpt(store, &session.Opt{ + PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), + }) + require.NoError(t, err) + tk.SetSession(se) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a int);") + tk.MustExec("alter table t cache") + + var useCache bool + for i := 0; i < 50; i++ { + tk.MustQuery("select * from t where a = 1") + if tk.HasPlan("select * from t where a = 1", "Union") { + useCache = true + } + } + require.True(t, useCache) + // already read cache after reading first time + tk.MustQuery("explain format = 'brief' select * from t where a = 1").Check(testkit.Rows( + "Projection 10.00 root test.t.a", + "└─UnionScan 10.00 root eq(test.t.a, 1)", + " └─TableReader 10.00 root data:Selection", + " └─Selection 10.00 cop[tikv] eq(test.t.a, 1)", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo")) + + tk.MustExec("prepare stmt from 'select * from t where a = ?';") + tk.MustExec("set @a = 1;") + tk.MustExec("execute stmt using @a;") + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) + tk.MustExec("execute stmt using @a;") + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) +} + +func TestIssue16205(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + orgEnable := plannercore.PreparedPlanCacheEnabled() + defer func() { + plannercore.SetPreparedPlanCache(orgEnable) + }() + plannercore.SetPreparedPlanCache(true) + var err error + se, err := session.CreateSession4TestWithOpt(store, &session.Opt{ + PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), + }) + require.NoError(t, err) + tk.SetSession(se) + + tk.MustExec("use test") + tk.MustExec("prepare stmt from 'select random_bytes(3)'") + rows1 := tk.MustQuery("execute stmt").Rows() + require.Len(t, rows1, 1) + rows2 := tk.MustQuery("execute stmt").Rows() + require.Len(t, rows2, 1) + require.NotEqual(t, rows1[0][0].(string), rows2[0][0].(string)) +} + +func TestRowCountPlanCache(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + orgEnable := plannercore.PreparedPlanCacheEnabled() + defer func() { + plannercore.SetPreparedPlanCache(orgEnable) + }() + plannercore.SetPreparedPlanCache(true) + var err error + se, err := session.CreateSession4TestWithOpt(store, &session.Opt{ + PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), + }) + require.NoError(t, err) + tk.SetSession(se) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int auto_increment primary key)") + tk.MustExec("prepare stmt from 'select row_count()';") + tk.MustExec("insert into t values()") + res := tk.MustQuery("execute stmt").Rows() + require.Len(t, res, 1) + require.Equal(t, "1", res[0][0]) + tk.MustExec("insert into t values(),(),()") + res = tk.MustQuery("execute stmt").Rows() + require.Len(t, res, 1) + require.Equal(t, "3", res[0][0]) +} + +func TestCacheRegexpr(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + orgEnable := plannercore.PreparedPlanCacheEnabled() + defer func() { + plannercore.SetPreparedPlanCache(orgEnable) + }() + plannercore.SetPreparedPlanCache(true) + var err error + se, err := session.CreateSession4TestWithOpt(store, &session.Opt{ + PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), + }) + require.NoError(t, err) + tk.SetSession(se) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1 (a varchar(40))") + tk.MustExec("insert into t1 values ('C1'),('R1')") + tk.MustExec("prepare stmt1 from 'select a from t1 where a rlike ?'") + tk.MustExec("set @a='^C.*'") + tk.MustQuery("execute stmt1 using @a").Check(testkit.Rows("C1")) + tk.MustExec("set @a='^R.*'") + tk.MustQuery("execute stmt1 using @a").Check(testkit.Rows("R1")) +} + +func TestCacheRefineArgs(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + orgEnable := plannercore.PreparedPlanCacheEnabled() + defer func() { + plannercore.SetPreparedPlanCache(orgEnable) + }() + plannercore.SetPreparedPlanCache(true) + var err error + se, err := session.CreateSession4TestWithOpt(store, &session.Opt{ + PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), + }) + require.NoError(t, err) + tk.SetSession(se) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(col_int int)") + tk.MustExec("insert into t values(null)") + tk.MustExec("prepare stmt from 'SELECT ((col_int is true) = ?) AS res FROM t'") + tk.MustExec("set @p0='0.8'") + tk.MustQuery("execute stmt using @p0").Check(testkit.Rows("0")) + tk.MustExec("set @p0='0'") + tk.MustQuery("execute stmt using @p0").Check(testkit.Rows("1")) + + tk.MustExec("prepare stmt from 'SELECT UCASE(?) < col_int from t;';") + tk.MustExec("set @a1 = 'xayh7vrWVNqZtzlJmdJQUwAHnkI8Ec';") + tk.MustQuery("execute stmt using @a1;").Check(testkit.Rows("<nil>")) + + tk.MustExec("delete from t") + tk.MustExec("insert into t values(1)") + tk.MustExec("prepare stmt from 'SELECT col_int < ? FROM t'") + tk.MustExec("set @p0='-184467440737095516167.1'") + tk.MustQuery("execute stmt using @p0").Check(testkit.Rows("0")) +} + +func TestCacheConstEval(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + orgEnable := plannercore.PreparedPlanCacheEnabled() + defer func() { + plannercore.SetPreparedPlanCache(orgEnable) + }() + plannercore.SetPreparedPlanCache(true) + var err error + se, err := session.CreateSession4TestWithOpt(store, &session.Opt{ + PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), + }) + require.NoError(t, err) + tk.SetSession(se) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(col_double double)") + tk.MustExec("insert into t values (1)") + tk.Session().GetSessionVars().EnableVectorizedExpression = false + tk.MustExec("insert into mysql.expr_pushdown_blacklist values('cast', 'tikv,tiflash,tidb', 'for test')") + tk.MustExec("admin reload expr_pushdown_blacklist") + tk.MustExec("prepare stmt from 'SELECT * FROM (SELECT col_double AS c0 FROM t) t WHERE (ABS((REPEAT(?, ?) OR 5617780767323292672)) < LN(EXP(c0)) + (? ^ ?))'") + tk.MustExec("set @a1 = 'JuvkBX7ykVux20zQlkwDK2DFelgn7'") + tk.MustExec("set @a2 = 1") + tk.MustExec("set @a3 = -112990.35179796701") + tk.MustExec("set @a4 = 87997.92704840179") + // Main purpose here is checking no error is reported. 1 is the result when plan cache is disabled, it is + // incompatible with MySQL actually, update the result after fixing it. + tk.MustQuery("execute stmt using @a1, @a2, @a3, @a4").Check(testkit.Rows("1")) + tk.Session().GetSessionVars().EnableVectorizedExpression = true + tk.MustExec("delete from mysql.expr_pushdown_blacklist where name = 'cast' and store_type = 'tikv,tiflash,tidb' and reason = 'for test'") + tk.MustExec("admin reload expr_pushdown_blacklist") +} + +func TestIssue24502(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test;") + tk.MustExec("drop table if exists t0,t1;") + tk.MustExec("create table t0(col1 varchar(255));") + tk.MustExec("create table t1(col1 int(11));") + tk.MustExec(`insert into t0 values("\\9jM\\M");`) + tk.MustExec(`insert into t1 values(0);`) + tk.MustExec(`insert into t1 values(null);`) + tk.MustExec(`insert into t1 values(null);`) + + tk.MustQuery(`select t0.col1, t1.col1 from t0 left join t1 on t0.col1 not like t0.col1;`). + Check(testkit.Rows(`\9jM\M <nil>`, `\9jM\M <nil>`, `\9jM\M 0`)) + + tk.MustQuery(`select 'a' like '\\a'`).Check(testkit.Rows("1")) + tk.MustQuery(`select 'a' like '+a' escape '+'`).Check(testkit.Rows("1")) +} + +func TestIssue17233(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists table_int") + tk.MustExec(`CREATE TABLE table_int ( + id_0 int(16) NOT NULL AUTO_INCREMENT, + col_int_0 int(16) DEFAULT NULL, + PRIMARY KEY (id_0), + KEY fvclc (id_0,col_int_0));`) + tk.MustExec("INSERT INTO table_int VALUES (1,NULL),(2,NULL),(3,65535),(4,1),(5,0),(6,NULL),(7,-1),(8,65535),(9,NULL),(10,65535),(11,-1),(12,0),(13,-1),(14,1),(15,65535),(16,0),(17,1),(18,0),(19,0)") + + tk.MustExec("drop table if exists table_varchar") + tk.MustExec(`CREATE TABLE table_varchar ( + id_2 int(16) NOT NULL AUTO_INCREMENT, + col_varchar_2 varchar(511) DEFAULT NULL, + PRIMARY KEY (id_2));`) + tk.MustExec(`INSERT INTO table_varchar VALUES (1,''),(2,''),(3,''),(4,''),(5,''),(6,''),(7,''),(8,''),(9,''),(10,''),(11,''),(12,'');`) + + tk.MustExec("drop table if exists table_float_varchar") + tk.MustExec(`CREATE TABLE table_int_float_varchar ( + id_6 int(16) NOT NULL AUTO_INCREMENT, + col_int_6 int(16) NOT NULL, + col_float_6 float DEFAULT NULL, + col_varchar_6 varchar(511) DEFAULT NULL, + PRIMARY KEY (id_6,col_int_6) + ) + PARTITION BY RANGE ( col_int_6 ) ( + PARTITION p0 VALUES LESS THAN (1), + PARTITION p2 VALUES LESS THAN (1000), + PARTITION p3 VALUES LESS THAN (10000), + PARTITION p5 VALUES LESS THAN (1000000), + PARTITION p7 VALUES LESS THAN (100000000), + PARTITION p9 VALUES LESS THAN (10000000000), + PARTITION p10 VALUES LESS THAN (100000000000), + PARTITION pn VALUES LESS THAN (MAXVALUE));`) + tk.MustExec(`INSERT INTO table_int_float_varchar VALUES (1,-1,0.1,'0000-00-00 00:00:00'),(2,0,0,NULL),(3,-1,1,NULL),(4,0,NULL,NULL),(7,0,0.5,NULL),(8,0,0,NULL),(10,-1,0,'-1'),(5,1,-0.1,NULL),(6,1,0.1,NULL),(9,65535,0,'1');`) + + tk.MustExec("drop table if exists table_float") + tk.MustExec(`CREATE TABLE table_float ( + id_1 int(16) NOT NULL AUTO_INCREMENT, + col_float_1 float DEFAULT NULL, + PRIMARY KEY (id_1), + KEY zbjus (id_1,col_float_1));`) + tk.MustExec(`INSERT INTO table_float VALUES (1,NULL),(2,-0.1),(3,-1),(4,NULL),(5,-0.1),(6,0),(7,0),(8,-1),(9,NULL),(10,NULL),(11,0.1),(12,-1);`) + + tk.MustExec("drop view if exists view_4") + tk.MustExec(`CREATE DEFINER='root'@'127.0.0.1' VIEW view_4 (col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9, col_10) AS + SELECT /*+ USE_INDEX(table_int fvclc, fvclc)*/ + tmp1.id_6 AS col_1, + tmp1.col_int_6 AS col_2, + tmp1.col_float_6 AS col_3, + tmp1.col_varchar_6 AS col_4, + tmp2.id_2 AS col_5, + tmp2.col_varchar_2 AS col_6, + tmp3.id_0 AS col_7, + tmp3.col_int_0 AS col_8, + tmp4.id_1 AS col_9, + tmp4.col_float_1 AS col_10 + FROM (( + test.table_int_float_varchar AS tmp1 LEFT JOIN + test.table_varchar AS tmp2 ON ((NULL<=tmp2.col_varchar_2)) IS NULL + ) JOIN + test.table_int AS tmp3 ON (1.117853833115198e-03!=tmp1.col_int_6)) + JOIN + test.table_float AS tmp4 ON !((1900370398268920328=0e+00)) WHERE ((''<='{Gm~PcZNb') OR (tmp2.id_2 OR tmp3.col_int_0)) ORDER BY col_1,col_2,col_3,col_4,col_5,col_6,col_7,col_8,col_9,col_10 LIMIT 20580,5;`) + + tk.MustExec("drop view if exists view_10") + tk.MustExec(`CREATE DEFINER='root'@'127.0.0.1' VIEW view_10 (col_1, col_2) AS + SELECT table_int.id_0 AS col_1, + table_int.col_int_0 AS col_2 + FROM test.table_int + WHERE + ((-1e+00=1) OR (0e+00>=table_int.col_int_0)) + ORDER BY col_1,col_2 + LIMIT 5,9;`) + + tk.MustQuery("SELECT col_1 FROM test.view_10").Sort().Check(testkit.Rows("16", "18", "19")) + tk.MustQuery("SELECT col_1 FROM test.view_4").Sort().Check(testkit.Rows("8", "8", "8", "8", "8")) + tk.MustQuery("SELECT view_10.col_1 FROM view_4 JOIN view_10").Check(testkit.Rows("16", "16", "16", "16", "16", "18", "18", "18", "18", "18", "19", "19", "19", "19", "19")) +} + +func TestIssue17989(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b tinyint as(a+1), c int as(b+1));") + tk.MustExec("set sql_mode='';") + tk.MustExec("insert into t(a) values(2000);") + tk.MustExec("create index idx on t(c);") + tk.MustQuery("select c from t;").Check(testkit.Rows("128")) + tk.MustExec("admin check table t") +} + +func TestNullValueRange(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int, index(a))") + tk.MustExec("insert into t values (null, 0), (null, 1), (10, 11), (10, 12)") + tk.MustQuery("select * from t use index(a) where a is null order by b").Check(testkit.Rows("<nil> 0", "<nil> 1")) + tk.MustQuery("select * from t use index(a) where a<=>null order by b").Check(testkit.Rows("<nil> 0", "<nil> 1")) + tk.MustQuery("select * from t use index(a) where a<=>10 order by b").Check(testkit.Rows("10 11", "10 12")) + + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1(a int, b int, c int, unique key(a, b, c))") + tk.MustExec("insert into t1 values (1, null, 1), (1, null, 2), (1, null, 3), (1, null, 4)") + tk.MustExec("insert into t1 values (1, 1, 1), (1, 2, 2), (1, 3, 33), (1, 4, 44)") + tk.MustQuery("select c from t1 where a=1 and b<=>null and c>2 order by c").Check(testkit.Rows("3", "4")) + tk.MustQuery("select c from t1 where a=1 and b is null and c>2 order by c").Check(testkit.Rows("3", "4")) + tk.MustQuery("select c from t1 where a=1 and b is not null and c>2 order by c").Check(testkit.Rows("33", "44")) +} + +func TestIssue18652(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("DROP TABLE IF EXISTS t1") + tk.MustExec("CREATE TABLE t1 ( `pk` int not null primary key auto_increment, `col_smallint_key_signed` smallint , key (`col_smallint_key_signed`))") + tk.MustExec("INSERT INTO `t1` VALUES (1,0),(2,NULL),(3,NULL),(4,0),(5,0),(6,NULL),(7,NULL),(8,0),(9,0),(10,0)") + tk.MustQuery("SELECT * FROM t1 WHERE ( LOG( `col_smallint_key_signed`, -8297584758403770424 ) ) DIV 1").Check(testkit.Rows()) +} + +func TestIssue19045(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t, t1, t2") + tk.MustExec(`CREATE TABLE t ( + id int(11) NOT NULL AUTO_INCREMENT, + a char(10) DEFAULT NULL, + PRIMARY KEY (id) +);`) + tk.MustExec(`CREATE TABLE t1 ( + id int(11) NOT NULL AUTO_INCREMENT, + a char(10) DEFAULT NULL, + b char(10) DEFAULT NULL, + c char(10) DEFAULT NULL, + PRIMARY KEY (id) +);`) + tk.MustExec(`CREATE TABLE t2 ( + id int(11) NOT NULL AUTO_INCREMENT, + a char(10) DEFAULT NULL, + b char(10) DEFAULT NULL, + PRIMARY KEY (id), + UNIQUE KEY b (b) +);`) + tk.MustExec(`insert into t1(a,b,c) values('hs4_0004', "04", "101"), ('a01', "01", "101"),('a011', "02", "101");`) + tk.MustExec(`insert into t2(a,b) values("02","03");`) + tk.MustExec(`insert into t(a) values('101'),('101');`) + tk.MustQuery(`select ( SELECT t1.a FROM t1, t2 WHERE t1.b = t2.a AND t2.b = '03' AND t1.c = a.a) invode from t a ;`).Check(testkit.Rows("a011", "a011")) +} + +// issues 14448, 19383, 17734 +func TestNoopFunctions(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("DROP TABLE IF EXISTS t1") + tk.MustExec("CREATE TABLE t1 (a INT NOT NULL PRIMARY KEY)") + tk.MustExec("INSERT INTO t1 VALUES (1),(2),(3)") + + message := `.* has only noop implementation in tidb now, use tidb_enable_noop_functions to enable these functions` + stmts := []string{ + "SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 1", + "SELECT * FROM t1 LOCK IN SHARE MODE", + "SELECT * FROM t1 GROUP BY a DESC", + "SELECT * FROM t1 GROUP BY a ASC", + "SELECT GET_LOCK('acdc', 10)", + "SELECT RELEASE_LOCK('acdc')", + } + + for _, stmt := range stmts { + // test on + tk.MustExec("SET tidb_enable_noop_functions='ON'") + tk.MustExec(stmt) + // test warning + tk.MustExec("SET tidb_enable_noop_functions='WARN'") + tk.MustExec(stmt) + warn := tk.Session().GetSessionVars().StmtCtx.GetWarnings() + require.Regexp(t, message, warn[0].Err.Error()) + // test off + tk.MustExec("SET tidb_enable_noop_functions='OFF'") + _, err := tk.Exec(stmt) + require.Regexp(t, message, err.Error()) + } + + // These statements return a different error message + // to the above. Test for error, not specifically the message. + // After they execute, we need to reset the values because + // otherwise tidb_enable_noop_functions can't be changed. + + stmts = []string{ + "START TRANSACTION READ ONLY", + "SET TRANSACTION READ ONLY", + "SET tx_read_only = 1", + "SET transaction_read_only = 1", + } + + for _, stmt := range stmts { + // test off + tk.MustExec("SET tidb_enable_noop_functions='OFF'") + _, err := tk.Exec(stmt) + require.Error(t, err) + // test warning + tk.MustExec("SET tidb_enable_noop_functions='WARN'") + tk.MustExec(stmt) + warn := tk.Session().GetSessionVars().StmtCtx.GetWarnings() + require.Len(t, warn, 1) + // test on + tk.MustExec("SET tidb_enable_noop_functions='ON'") + tk.MustExec(stmt) + + // Reset (required for future loop iterations and future tests) + tk.MustExec("SET tx_read_only = 0") + tk.MustExec("SET transaction_read_only = 0") + } +} + +func TestIssue19315(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("drop table if exists t1") + tk.MustExec("CREATE TABLE `t` (`a` bit(10) DEFAULT NULL,`b` int(11) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin") + tk.MustExec("INSERT INTO `t` VALUES (_binary '\\0',1),(_binary '\\0',2),(_binary '\\0',5),(_binary '\\0',4),(_binary '\\0',2),(_binary '\\0 ',4)") + tk.MustExec("CREATE TABLE `t1` (`a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin") + tk.MustExec("INSERT INTO `t1` VALUES (1,1),(1,5),(2,3),(2,4),(3,3)") + err := tk.QueryToErr("select * from t where t.b > (select min(t1.b) from t1 where t1.a > t.a)") + require.NoError(t, err) +} + +func TestIssue18674(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustQuery("select -1.0 % -1.0").Check(testkit.Rows("0.0")) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1(`pk` int primary key,`col_float_key_signed` float ,key (`col_float_key_signed`))") + tk.MustExec("insert into t1 values (0, null), (1, 0), (2, -0), (3, 1), (-1,-1)") + tk.MustQuery("select * from t1 where ( `col_float_key_signed` % `col_float_key_signed`) IS FALSE").Sort().Check(testkit.Rows("-1 -1", "3 1")) + tk.MustQuery("select `col_float_key_signed` , `col_float_key_signed` % `col_float_key_signed` from t1").Sort().Check(testkit.Rows( + "-1 -0", "0 <nil>", "0 <nil>", "1 0", "<nil> <nil>")) + tk.MustQuery("select `col_float_key_signed` , (`col_float_key_signed` % `col_float_key_signed`) IS FALSE from t1").Sort().Check(testkit.Rows( + "-1 1", "0 0", "0 0", "1 1", "<nil> 0")) +} + +func TestJsonObjectCompare(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + tk.MustQuery("select json_object('k', -1) > json_object('k', 2)").Check(testkit.Rows("0")) + tk.MustQuery("select json_object('k', -1) < json_object('k', 2)").Check(testkit.Rows("1")) + + tk.MustExec("drop table if exists tx") + tk.MustExec("create table tx(a double, b int)") + tk.MustExec("insert into tx values (3.0, 3)") + tk.MustQuery("select json_object('k', a) = json_object('k', b) from tx").Check(testkit.Rows("1")) +} + +func TestIssue21290(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1;") + tk.MustExec("create table t1(a date);") + tk.MustExec("insert into t1 values (20100202);") + tk.MustQuery("select a in ('2020-02-02', 20100202) from t1;").Check(testkit.Rows("1")) +} + +// for issue 20128 +func TestIssue20128(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(b enum('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z') DEFAULT NULL, c decimal(40,20));") + tk.MustExec("insert into t values('z', 19.18040000000000000000);") + tk.MustExec("insert into t values('z', 26.18040000000000000000);") + tk.MustExec("insert into t values('z', 25.18040000000000000000);") + tk.MustQuery("select * from t where t.b > t.c;").Check(testkit.Rows("z 19.18040000000000000000", "z 25.18040000000000000000")) + tk.MustQuery("select * from t where t.b < t.c;").Check(testkit.Rows("z 26.18040000000000000000")) +} + +func TestCrossDCQuery(t *testing.T) { + store, dom, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1") + tk.MustExec(`create table t1 (c int primary key, d int,e int,index idx_d(d),index idx_e(e)) +PARTITION BY RANGE (c) ( + PARTITION p0 VALUES LESS THAN (6), + PARTITION p1 VALUES LESS THAN (11) +);`) + defer tk.MustExec("drop table if exists t1") + + tk.MustExec(`insert into t1 (c,d,e) values (1,1,1);`) + tk.MustExec(`insert into t1 (c,d,e) values (2,3,5);`) + tk.MustExec(`insert into t1 (c,d,e) values (3,5,7);`) + + is := dom.InfoSchema() + + tb, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) + require.NoError(t, err) + setBundle := func(parName, dc string) { + pid, err := tables.FindPartitionByName(tb.Meta(), parName) + require.NoError(t, err) + groupID := placement.GroupID(pid) + is.SetBundle(&placement.Bundle{ + ID: groupID, + Rules: []*placement.Rule{ + { + GroupID: groupID, + Role: placement.Leader, + Count: 1, + Constraints: []placement.Constraint{ + { + Key: placement.DCLabelKey, + Op: placement.In, + Values: []string{dc}, + }, + }, + }, + }, + }) + } + setBundle("p0", "sh") + setBundle("p1", "bj") + + testcases := []struct { + name string + txnScope string + zone string + sql string + expectErr error + }{ + // FIXME: block by https://github.com/pingcap/tidb/issues/21872 + //{ + // name: "cross dc read to sh by holding bj, IndexReader", + // txnScope: "bj", + // sql: "select /*+ USE_INDEX(t1, idx_d) */ d from t1 where c < 5 and d < 1;", + // expectErr: fmt.Errorf(".*can not be read by.*"), + //}, + // FIXME: block by https://github.com/pingcap/tidb/issues/21847 + //{ + // name: "cross dc read to sh by holding bj, BatchPointGet", + // txnScope: "bj", + // sql: "select * from t1 where c in (1,2,3,4);", + // expectErr: fmt.Errorf(".*can not be read by.*"), + //}, + { + name: "cross dc read to sh by holding bj, PointGet", + txnScope: "local", + zone: "bj", + sql: "select * from t1 where c = 1", + expectErr: fmt.Errorf(".*can not be read by.*"), + }, + { + name: "cross dc read to sh by holding bj, IndexLookUp", + txnScope: "local", + zone: "bj", + sql: "select * from t1 use index (idx_d) where c < 5 and d < 5;", + expectErr: fmt.Errorf(".*can not be read by.*"), + }, + { + name: "cross dc read to sh by holding bj, IndexMerge", + txnScope: "local", + zone: "bj", + sql: "select /*+ USE_INDEX_MERGE(t1, idx_d, idx_e) */ * from t1 where c <5 and (d =5 or e=5);", + expectErr: fmt.Errorf(".*can not be read by.*"), + }, + { + name: "cross dc read to sh by holding bj, TableReader", + txnScope: "local", + zone: "bj", + sql: "select * from t1 where c < 6", + expectErr: fmt.Errorf(".*can not be read by.*"), + }, + { + name: "cross dc read to global by holding bj", + txnScope: "local", + zone: "bj", + sql: "select * from t1", + expectErr: fmt.Errorf(".*can not be read by.*"), + }, + { + name: "read sh dc by holding sh", + txnScope: "local", + zone: "sh", + sql: "select * from t1 where c < 6", + expectErr: nil, + }, + { + name: "read sh dc by holding global", + txnScope: "global", + zone: "", + sql: "select * from t1 where c < 6", + expectErr: nil, + }, + } + tk.MustExec("set global tidb_enable_local_txn = on;") + for _, testcase := range testcases { + t.Log(testcase.name) + failpoint.Enable("tikvclient/injectTxnScope", + fmt.Sprintf(`return("%v")`, testcase.zone)) + tk.MustExec(fmt.Sprintf("set @@txn_scope='%v'", testcase.txnScope)) + tk.Exec("begin") + res, err := tk.Exec(testcase.sql) + _, resErr := session.GetRows4Test(context.Background(), tk.Session(), res) + var checkErr error + if err != nil { + checkErr = err + } else { + checkErr = resErr + } + if testcase.expectErr != nil { + require.Error(t, checkErr) + require.Regexp(t, ".*can not be read by.*", checkErr.Error()) + } else { + require.NoError(t, checkErr) + } + if res != nil { + res.Close() + } + tk.Exec("commit") + } + failpoint.Disable("tikvclient/injectTxnScope") + tk.MustExec("set global tidb_enable_local_txn = off;") +} + +func TestCollationUnion2(t *testing.T) { + // For issue 22179 + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a varchar(10))") + tk.MustExec("insert into t values('aaaaaaaaa'),('天王盖地虎宝塔镇河妖')") + tk.MustQuery("select * from t").Check(testkit.Rows("aaaaaaaaa", "天王盖地虎宝塔镇河妖")) + + // check the collation of sub query of union statement. + tk.MustQuery("select collation(a) from (select null as a) aaa").Check(testkit.Rows("binary")) + tk.MustQuery("select collation(a) from (select a from t limit 1) aaa").Check(testkit.Rows("utf8mb4_bin")) + + // Reverse sub query of union statement. + tk.MustQuery("select * from (select null as a union all select a from t) aaa order by a").Check(testkit.Rows("<nil>", "aaaaaaaaa", "天王盖地虎宝塔镇河妖")) + tk.MustQuery("select * from (select a from t) aaa union all select null as a order by a").Check(testkit.Rows("<nil>", "aaaaaaaaa", "天王盖地虎宝塔镇河妖")) + tk.MustExec("drop table if exists t") +} + +func TestPartitionPruningRelaxOP(t *testing.T) { + // Discovered while looking at issue 19941 (not completely related) + // relaxOP relax the op > to >= and < to <= + // Sometime we need to relax the condition, for example: + // col < const => f(col) <= const + // datetime < 2020-02-11 16:18:42 => to_days(datetime) <= to_days(2020-02-11) + // We can't say: + // datetime < 2020-02-11 16:18:42 => to_days(datetime) < to_days(2020-02-11) + + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + tk.MustExec("DROP TABLE IF EXISTS t1;") + tk.MustExec(`CREATE TABLE t1 (d date NOT NULL) PARTITION BY RANGE (YEAR(d)) + (PARTITION p2016 VALUES LESS THAN (2017), PARTITION p2017 VALUES LESS THAN (2018), PARTITION p2018 VALUES LESS THAN (2019), + PARTITION p2019 VALUES LESS THAN (2020), PARTITION pmax VALUES LESS THAN MAXVALUE)`) + + tk.MustExec(`INSERT INTO t1 VALUES ('2016-01-01'), ('2016-06-01'), ('2016-09-01'), ('2017-01-01'), + ('2017-06-01'), ('2017-09-01'), ('2018-01-01'), ('2018-06-01'), ('2018-09-01'), ('2018-10-01'), + ('2018-11-01'), ('2018-12-01'), ('2018-12-31'), ('2019-01-01'), ('2019-06-01'), ('2019-09-01'), + ('2020-01-01'), ('2020-06-01'), ('2020-09-01');`) + + tk.MustQuery("SELECT COUNT(*) FROM t1 WHERE d < '2018-01-01'").Check(testkit.Rows("6")) + tk.MustQuery("SELECT COUNT(*) FROM t1 WHERE d > '2018-01-01'").Check(testkit.Rows("12")) +} diff --git a/expression/integration_test.go b/expression/integration_test.go index 8b60ddd1e38cf..79cb81daf90f6 100644 --- a/expression/integration_test.go +++ b/expression/integration_test.go @@ -24,12 +24,10 @@ import ( "sort" "strconv" "strings" + "testing" "time" - . "github.com/pingcap/check" "github.com/pingcap/errors" - "github.com/pingcap/failpoint" - "github.com/pingcap/tidb/ddl/placement" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/expression" @@ -42,69 +40,24 @@ import ( "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/table" - "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/tablecodec" + "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" "github.com/pingcap/tidb/util/codec" - "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/kvcache" - "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/sem" "github.com/pingcap/tidb/util/sqlexec" - "github.com/pingcap/tidb/util/testkit" "github.com/pingcap/tidb/util/testutil" - "github.com/tikv/client-go/v2/oracle" + "github.com/stretchr/testify/require" ) -var _ = Suite(&testIntegrationSuite{}) -var _ = Suite(&testIntegrationSuite2{}) -var _ = SerialSuites(&testIntegrationSerialSuite{}) +func Test19654(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() -type testIntegrationSuiteBase struct { - store kv.Storage - dom *domain.Domain - ctx sessionctx.Context -} - -type testIntegrationSuite struct { - testIntegrationSuiteBase -} - -type testIntegrationSuite2 struct { - testIntegrationSuiteBase -} - -type testIntegrationSerialSuite struct { - testIntegrationSuiteBase -} - -func (s *testIntegrationSuiteBase) 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 *testIntegrationSuiteBase) SetUpSuite(c *C) { - var err error - s.store, s.dom, err = newStoreWithBootstrap() - c.Assert(err, IsNil) - s.ctx = mock.NewContext() -} - -func (s *testIntegrationSuiteBase) TearDownSuite(c *C) { - s.dom.Close() - s.store.Close() -} - -func (s *testIntegrationSuite) Test19654(c *C) { - tk := testkit.NewTestKit(c, s.store) + tk := testkit.NewTestKit(t, store) tk.MustExec("USE test;") // enum vs enum @@ -148,22 +101,28 @@ func (s *testIntegrationSuite) Test19654(c *C) { tk.MustQuery("select /*+ inl_join(t2)*/ * from t1, t2 where t1.b=t2.b;").Check(testkit.Rows("a a")) } -func (s *testIntegrationSuite) Test19387(c *C) { - tk := testkit.NewTestKit(c, s.store) +func Test19387(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("USE test;") tk.MustExec("drop table if exists t;") tk.MustExec("create table t(a decimal(16, 2));") tk.MustExec("select sum(case when 1 then a end) from t group by a;") res := tk.MustQuery("show create table t") - c.Assert(len(res.Rows()), Equals, 1) + require.Len(t, res.Rows(), 1) str := res.Rows()[0][1].(string) - c.Assert(strings.Contains(str, "decimal(16,2)"), IsTrue) + require.Contains(t, str, "decimal(16,2)") } -func (s *testIntegrationSuite) TestFuncREPEAT(c *C) { - tk := testkit.NewTestKit(c, s.store) - defer s.cleanEnv(c) +func TestFuncREPEAT(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("USE test;") tk.MustExec("DROP TABLE IF EXISTS table_string;") tk.MustExec("CREATE TABLE table_string(a CHAR(20), b VARCHAR(20), c TINYTEXT, d TEXT(20), e MEDIUMTEXT, f LONGTEXT, g BIGINT);") @@ -195,9 +154,12 @@ func (s *testIntegrationSuite) TestFuncREPEAT(c *C) { r.Check(testkit.Rows("<nil> <nil> <nil> <nil> <nil> <nil>")) } -func (s *testIntegrationSuite) TestFuncLpadAndRpad(c *C) { - tk := testkit.NewTestKit(c, s.store) - defer s.cleanEnv(c) +func TestFuncLpadAndRpad(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec(`USE test;`) tk.MustExec(`DROP TABLE IF EXISTS t;`) tk.MustExec(`CREATE TABLE t(a BINARY(10), b CHAR(10));`) @@ -216,10 +178,12 @@ func (s *testIntegrationSuite) TestFuncLpadAndRpad(c *C) { result.Check(testkit.Rows("<nil> <nil>")) } -func (s *testIntegrationSuite) TestBuiltinFuncJsonPretty(c *C) { +func TestBuiltinFuncJsonPretty(t *testing.T) { ctx := context.Background() - tk := testkit.NewTestKit(c, s.store) - defer s.cleanEnv(c) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec(`use test;`) tk.MustExec(`drop table if exists t;`) @@ -267,42 +231,43 @@ func (s *testIntegrationSuite) TestBuiltinFuncJsonPretty(c *C) { // invalid json format in varchar rs, _ := tk.Exec("select JSON_PRETTY(t.j),JSON_PRETTY(vc) from t where id = 2;") - _, err := session.GetRows4Test(ctx, tk.Se, rs) + _, err := session.GetRows4Test(ctx, tk.Session(), rs) terr := errors.Cause(err).(*terror.Error) - c.Assert(terr.Code(), Equals, errors.ErrCode(mysql.ErrInvalidJSONText)) + require.Equal(t, errors.ErrCode(mysql.ErrInvalidJSONText), terr.Code()) // invalid json format in one row rs, _ = tk.Exec("select JSON_PRETTY(t.j),JSON_PRETTY(vc) from t where id in (1,2);") - _, err = session.GetRows4Test(ctx, tk.Se, rs) + _, err = session.GetRows4Test(ctx, tk.Session(), rs) terr = errors.Cause(err).(*terror.Error) - c.Assert(terr.Code(), Equals, errors.ErrCode(mysql.ErrInvalidJSONText)) + require.Equal(t, errors.ErrCode(mysql.ErrInvalidJSONText), terr.Code()) // invalid json string rs, _ = tk.Exec(`select JSON_PRETTY("[1,2,3]}");`) - _, err = session.GetRows4Test(ctx, tk.Se, rs) + _, err = session.GetRows4Test(ctx, tk.Session(), rs) terr = errors.Cause(err).(*terror.Error) - c.Assert(terr.Code(), Equals, errors.ErrCode(mysql.ErrInvalidJSONText)) + require.Equal(t, errors.ErrCode(mysql.ErrInvalidJSONText), terr.Code()) } -func (s *testIntegrationSuite) TestMiscellaneousBuiltin(c *C) { +func TestMiscellaneousBuiltin(t *testing.T) { ctx := context.Background() - defer s.cleanEnv(c) + store, clean := testkit.CreateMockStore(t) + defer clean() - tk := testkit.NewTestKit(c, s.store) + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") // for uuid r := tk.MustQuery("select uuid(), uuid(), uuid(), uuid(), uuid(), uuid();") for _, it := range r.Rows() { for _, item := range it { uuid, ok := item.(string) - c.Assert(ok, Equals, true) + require.True(t, ok) list := strings.Split(uuid, "-") - c.Assert(len(list), Equals, 5) - c.Assert(len(list[0]), Equals, 8) - c.Assert(len(list[1]), Equals, 4) - c.Assert(len(list[2]), Equals, 4) - c.Assert(len(list[3]), Equals, 4) - c.Assert(len(list[4]), Equals, 12) + require.Len(t, list, 5) + require.Len(t, list[0], 8) + require.Len(t, list[1], 4) + require.Len(t, list[2], 4) + require.Len(t, list[3], 4) + require.Len(t, list[4], 12) } } tk.MustQuery("select sleep(1);").Check(testkit.Rows("0")) @@ -310,11 +275,11 @@ func (s *testIntegrationSuite) TestMiscellaneousBuiltin(c *C) { tk.MustQuery("select sleep('a');").Check(testkit.Rows("0")) tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1292 Truncated incorrect DOUBLE value: 'a'")) rs, err := tk.Exec("select sleep(-1);") - c.Assert(err, IsNil) - c.Assert(rs, NotNil) - _, err = session.GetRows4Test(ctx, tk.Se, rs) - c.Assert(err, NotNil) - c.Assert(rs.Close(), IsNil) + require.NoError(t, err) + require.NotNil(t, rs) + _, err = session.GetRows4Test(ctx, tk.Session(), rs) + require.Error(t, err) + require.NoError(t, rs.Close()) tk.MustQuery("SELECT INET_ATON('10.0.5.9');").Check(testkit.Rows("167773449")) tk.MustQuery("SELECT INET_NTOA(167773449);").Check(testkit.Rows("10.0.5.9")) @@ -366,9 +331,11 @@ func (s *testIntegrationSuite) TestMiscellaneousBuiltin(c *C) { result.Check(testkit.Rows("1")) } -func (s *testIntegrationSuite) TestConvertToBit(c *C) { - defer s.cleanEnv(c) - tk := testkit.NewTestKit(c, s.store) +func TestConvertToBit(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t, t1") tk.MustExec("create table t (a bit(64))") @@ -410,395 +377,12 @@ func (s *testIntegrationSuite) TestConvertToBit(c *C) { tk.MustQuery("select * from t;").Check(testkit.Rows("\xff\xff", "\xff\xff")) } -func (s *testIntegrationSuite2) TestMathBuiltin(c *C) { - ctx := context.Background() - defer s.cleanEnv(c) - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - - // for degrees - result := tk.MustQuery("select degrees(0), degrees(1)") - result.Check(testkit.Rows("0 57.29577951308232")) - result = tk.MustQuery("select degrees(2), degrees(5)") - result.Check(testkit.Rows("114.59155902616465 286.4788975654116")) - - // for sin - result = tk.MustQuery("select sin(0), sin(1.5707963267949)") - result.Check(testkit.Rows("0 1")) - result = tk.MustQuery("select sin(1), sin(100)") - result.Check(testkit.Rows("0.8414709848078965 -0.5063656411097588")) - result = tk.MustQuery("select sin('abcd')") - result.Check(testkit.Rows("0")) - - // for cos - result = tk.MustQuery("select cos(0), cos(3.1415926535898)") - result.Check(testkit.Rows("1 -1")) - result = tk.MustQuery("select cos('abcd')") - result.Check(testkit.Rows("1")) - - // for tan - result = tk.MustQuery("select tan(0.00), tan(PI()/4)") - result.Check(testkit.Rows("0 1")) - result = tk.MustQuery("select tan('abcd')") - result.Check(testkit.Rows("0")) - - // for log2 - result = tk.MustQuery("select log2(0.0)") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("select log2(4)") - result.Check(testkit.Rows("2")) - result = tk.MustQuery("select log2('8.0abcd')") - result.Check(testkit.Rows("3")) - result = tk.MustQuery("select log2(-1)") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("select log2(NULL)") - result.Check(testkit.Rows("<nil>")) - - // for log10 - result = tk.MustQuery("select log10(0.0)") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("select log10(100)") - result.Check(testkit.Rows("2")) - result = tk.MustQuery("select log10('1000.0abcd')") - result.Check(testkit.Rows("3")) - result = tk.MustQuery("select log10(-1)") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("select log10(NULL)") - result.Check(testkit.Rows("<nil>")) - - // for log - result = tk.MustQuery("select log(0.0)") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("select log(100)") - result.Check(testkit.Rows("4.605170185988092")) - result = tk.MustQuery("select log('100.0abcd')") - result.Check(testkit.Rows("4.605170185988092")) - result = tk.MustQuery("select log(-1)") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("select log(NULL)") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("select log(NULL, NULL)") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("select log(1, 100)") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("select log(0.5, 0.25)") - result.Check(testkit.Rows("2")) - result = tk.MustQuery("select log(-1, 0.25)") - result.Check(testkit.Rows("<nil>")) - - // for atan - result = tk.MustQuery("select atan(0), atan(-1), atan(1), atan(1,2)") - result.Check(testkit.Rows("0 -0.7853981633974483 0.7853981633974483 0.4636476090008061")) - result = tk.MustQuery("select atan('tidb')") - result.Check(testkit.Rows("0")) - - // for asin - result = tk.MustQuery("select asin(0), asin(-2), asin(2), asin(1)") - result.Check(testkit.Rows("0 <nil> <nil> 1.5707963267948966")) - result = tk.MustQuery("select asin('tidb')") - result.Check(testkit.Rows("0")) - - // for acos - result = tk.MustQuery("select acos(0), acos(-2), acos(2), acos(1)") - result.Check(testkit.Rows("1.5707963267948966 <nil> <nil> 0")) - result = tk.MustQuery("select acos('tidb')") - result.Check(testkit.Rows("1.5707963267948966")) - - // for pi - result = tk.MustQuery("select pi()") - result.Check(testkit.Rows("3.141592653589793")) - - // for floor - result = tk.MustQuery("select floor(0), floor(null), floor(1.23), floor(-1.23), floor(1)") - result.Check(testkit.Rows("0 <nil> 1 -2 1")) - result = tk.MustQuery("select floor('tidb'), floor('1tidb'), floor('tidb1')") - result.Check(testkit.Rows("0 1 0")) - result = tk.MustQuery("SELECT floor(t.c_datetime) FROM (select CAST('2017-07-19 00:00:00' AS DATETIME) AS c_datetime) AS t") - result.Check(testkit.Rows("20170719000000")) - result = tk.MustQuery("SELECT floor(t.c_time) FROM (select CAST('12:34:56' AS TIME) AS c_time) AS t") - result.Check(testkit.Rows("123456")) - result = tk.MustQuery("SELECT floor(t.c_time) FROM (select CAST('00:34:00' AS TIME) AS c_time) AS t") - result.Check(testkit.Rows("3400")) - result = tk.MustQuery("SELECT floor(t.c_time) FROM (select CAST('00:00:00' AS TIME) AS c_time) AS t") - result.Check(testkit.Rows("0")) - result = tk.MustQuery("SELECT floor(t.c_decimal) FROM (SELECT CAST('-10.01' AS DECIMAL(10,2)) AS c_decimal) AS t") - result.Check(testkit.Rows("-11")) - result = tk.MustQuery("SELECT floor(t.c_decimal) FROM (SELECT CAST('-10.01' AS DECIMAL(10,1)) AS c_decimal) AS t") - result.Check(testkit.Rows("-10")) - - // for ceil/ceiling - result = tk.MustQuery("select ceil(0), ceil(null), ceil(1.23), ceil(-1.23), ceil(1)") - result.Check(testkit.Rows("0 <nil> 2 -1 1")) - result = tk.MustQuery("select ceiling(0), ceiling(null), ceiling(1.23), ceiling(-1.23), ceiling(1)") - result.Check(testkit.Rows("0 <nil> 2 -1 1")) - result = tk.MustQuery("select ceil('tidb'), ceil('1tidb'), ceil('tidb1'), ceiling('tidb'), ceiling('1tidb'), ceiling('tidb1')") - result.Check(testkit.Rows("0 1 0 0 1 0")) - result = tk.MustQuery("select ceil(t.c_datetime), ceiling(t.c_datetime) from (select cast('2017-07-20 00:00:00' as datetime) as c_datetime) as t") - result.Check(testkit.Rows("20170720000000 20170720000000")) - result = tk.MustQuery("select ceil(t.c_time), ceiling(t.c_time) from (select cast('12:34:56' as time) as c_time) as t") - result.Check(testkit.Rows("123456 123456")) - result = tk.MustQuery("select ceil(t.c_time), ceiling(t.c_time) from (select cast('00:34:00' as time) as c_time) as t") - result.Check(testkit.Rows("3400 3400")) - result = tk.MustQuery("select ceil(t.c_time), ceiling(t.c_time) from (select cast('00:00:00' as time) as c_time) as t") - result.Check(testkit.Rows("0 0")) - result = tk.MustQuery("select ceil(t.c_decimal), ceiling(t.c_decimal) from (select cast('-10.01' as decimal(10,2)) as c_decimal) as t") - result.Check(testkit.Rows("-10 -10")) - result = tk.MustQuery("select ceil(t.c_decimal), ceiling(t.c_decimal) from (select cast('-10.01' as decimal(10,1)) as c_decimal) as t") - result.Check(testkit.Rows("-10 -10")) - result = tk.MustQuery("select floor(18446744073709551615), ceil(18446744073709551615)") - result.Check(testkit.Rows("18446744073709551615 18446744073709551615")) - result = tk.MustQuery("select floor(18446744073709551615.1233), ceil(18446744073709551615.1233)") - result.Check(testkit.Rows("18446744073709551615 18446744073709551616")) - result = tk.MustQuery("select floor(-18446744073709551617), ceil(-18446744073709551617), floor(-18446744073709551617.11), ceil(-18446744073709551617.11)") - result.Check(testkit.Rows("-18446744073709551617 -18446744073709551617 -18446744073709551618 -18446744073709551617")) - tk.MustExec("drop table if exists t;") - tk.MustExec("create table t(a decimal(40,20) UNSIGNED);") - tk.MustExec("insert into t values(2.99999999900000000000), (12), (0);") - tk.MustQuery("select a, ceil(a) from t where ceil(a) > 1;").Check(testkit.Rows("2.99999999900000000000 3", "12.00000000000000000000 12")) - tk.MustQuery("select a, ceil(a) from t;").Check(testkit.Rows("2.99999999900000000000 3", "12.00000000000000000000 12", "0.00000000000000000000 0")) - tk.MustQuery("select ceil(-29464);").Check(testkit.Rows("-29464")) - tk.MustQuery("select a, floor(a) from t where floor(a) > 1;").Check(testkit.Rows("2.99999999900000000000 2", "12.00000000000000000000 12")) - tk.MustQuery("select a, floor(a) from t;").Check(testkit.Rows("2.99999999900000000000 2", "12.00000000000000000000 12", "0.00000000000000000000 0")) - tk.MustQuery("select floor(-29464);").Check(testkit.Rows("-29464")) - - tk.MustExec(`drop table if exists t;`) - tk.MustExec(`create table t(a decimal(40,20), b bigint);`) - tk.MustExec(`insert into t values(-2.99999990000000000000, -1);`) - tk.MustQuery(`select floor(a), floor(a), floor(a) from t;`).Check(testkit.Rows(`-3 -3 -3`)) - tk.MustQuery(`select b, floor(b) from t;`).Check(testkit.Rows(`-1 -1`)) - - // for cot - result = tk.MustQuery("select cot(1), cot(-1), cot(NULL)") - result.Check(testkit.Rows("0.6420926159343308 -0.6420926159343308 <nil>")) - result = tk.MustQuery("select cot('1tidb')") - result.Check(testkit.Rows("0.6420926159343308")) - rs, err := tk.Exec("select cot(0)") - c.Assert(err, IsNil) - _, err = session.GetRows4Test(ctx, tk.Se, rs) - c.Assert(err, NotNil) - terr := errors.Cause(err).(*terror.Error) - c.Assert(terr.Code(), Equals, errors.ErrCode(mysql.ErrDataOutOfRange)) - c.Assert(rs.Close(), IsNil) - - // for exp - result = tk.MustQuery("select exp(0), exp(1), exp(-1), exp(1.2), exp(NULL)") - result.Check(testkit.Rows("1 2.718281828459045 0.36787944117144233 3.3201169227365472 <nil>")) - result = tk.MustQuery("select exp('tidb'), exp('1tidb')") - result.Check(testkit.Rows("1 2.718281828459045")) - rs, err = tk.Exec("select exp(1000000)") - c.Assert(err, IsNil) - _, err = session.GetRows4Test(ctx, tk.Se, rs) - c.Assert(err, NotNil) - terr = errors.Cause(err).(*terror.Error) - c.Assert(terr.Code(), Equals, errors.ErrCode(mysql.ErrDataOutOfRange)) - c.Assert(rs.Close(), IsNil) - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a float)") - tk.MustExec("insert into t values(1000000)") - rs, err = tk.Exec("select exp(a) from t") - c.Assert(err, IsNil) - _, err = session.GetRows4Test(ctx, tk.Se, rs) - c.Assert(err, NotNil) - terr = errors.Cause(err).(*terror.Error) - c.Assert(terr.Code(), Equals, errors.ErrCode(mysql.ErrDataOutOfRange)) - c.Assert(err.Error(), Equals, "[types:1690]DOUBLE value is out of range in 'exp(test.t.a)'") - c.Assert(rs.Close(), IsNil) - - // for conv - result = tk.MustQuery("SELECT CONV('a', 16, 2);") - result.Check(testkit.Rows("1010")) - result = tk.MustQuery("SELECT CONV('6E', 18, 8);") - result.Check(testkit.Rows("172")) - result = tk.MustQuery("SELECT CONV(-17, 10, -18);") - result.Check(testkit.Rows("-H")) - result = tk.MustQuery("SELECT CONV(10+'10'+'10'+X'0a', 10, 10);") - result.Check(testkit.Rows("40")) - result = tk.MustQuery("SELECT CONV('a', 1, 10);") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("SELECT CONV('a', 37, 10);") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("SELECT CONV(0x0020, 2, 2);") - result.Check(testkit.Rows("100000")) - result = tk.MustQuery("SELECT CONV(0b10, 16, 2)") - result.Check(testkit.Rows("10")) - result = tk.MustQuery("SELECT CONV(0b10, 16, 8)") - result.Check(testkit.Rows("2")) - tk.MustExec("drop table if exists bit") - tk.MustExec("create table bit(b bit(10))") - tk.MustExec(`INSERT INTO bit (b) VALUES - (0b0000010101), - (0b0000010101), - (NULL), - (0b0000000001), - (0b0000000000), - (0b1111111111), - (0b1111111111), - (0b1111111111), - (0b0000000000), - (0b0000000000), - (0b0000000000), - (0b0000000000), - (0b0000100000);`) - tk.MustQuery("select conv(b, 2, 2) from `bit`").Check(testkit.Rows( - "10101", - "10101", - "<nil>", - "1", - "0", - "1111111111", - "1111111111", - "1111111111", - "0", - "0", - "0", - "0", - "100000")) - - // for abs - result = tk.MustQuery("SELECT ABS(-1);") - result.Check(testkit.Rows("1")) - result = tk.MustQuery("SELECT ABS('abc');") - result.Check(testkit.Rows("0")) - result = tk.MustQuery("SELECT ABS(18446744073709551615);") - result.Check(testkit.Rows("18446744073709551615")) - result = tk.MustQuery("SELECT ABS(123.4);") - result.Check(testkit.Rows("123.4")) - result = tk.MustQuery("SELECT ABS(-123.4);") - result.Check(testkit.Rows("123.4")) - result = tk.MustQuery("SELECT ABS(1234E-1);") - result.Check(testkit.Rows("123.4")) - result = tk.MustQuery("SELECT ABS(-9223372036854775807);") - result.Check(testkit.Rows("9223372036854775807")) - result = tk.MustQuery("SELECT ABS(NULL);") - result.Check(testkit.Rows("<nil>")) - rs, err = tk.Exec("SELECT ABS(-9223372036854775808);") - c.Assert(err, IsNil) - _, err = session.GetRows4Test(ctx, tk.Se, rs) - c.Assert(err, NotNil) - terr = errors.Cause(err).(*terror.Error) - c.Assert(terr.Code(), Equals, errors.ErrCode(mysql.ErrDataOutOfRange)) - c.Assert(rs.Close(), IsNil) - - // for round - result = tk.MustQuery("SELECT ROUND(2.5), ROUND(-2.5), ROUND(25E-1);") - result.Check(testkit.Rows("3 -3 2")) - result = tk.MustQuery("SELECT ROUND(2.5, NULL), ROUND(NULL, 4), ROUND(NULL, NULL), ROUND(NULL);") - result.Check(testkit.Rows("<nil> <nil> <nil> <nil>")) - result = tk.MustQuery("SELECT ROUND('123.4'), ROUND('123e-2');") - result.Check(testkit.Rows("123 1")) - result = tk.MustQuery("SELECT ROUND(-9223372036854775808);") - result.Check(testkit.Rows("-9223372036854775808")) - result = tk.MustQuery("SELECT ROUND(123.456, 0), ROUND(123.456, 1), ROUND(123.456, 2), ROUND(123.456, 3), ROUND(123.456, 4), ROUND(123.456, -1), ROUND(123.456, -2), ROUND(123.456, -3), ROUND(123.456, -4);") - result.Check(testkit.Rows("123 123.5 123.46 123.456 123.4560 120 100 0 0")) - result = tk.MustQuery("SELECT ROUND(123456E-3, 0), ROUND(123456E-3, 1), ROUND(123456E-3, 2), ROUND(123456E-3, 3), ROUND(123456E-3, 4), ROUND(123456E-3, -1), ROUND(123456E-3, -2), ROUND(123456E-3, -3), ROUND(123456E-3, -4);") - result.Check(testkit.Rows("123 123.5 123.46 123.456 123.456 120 100 0 0")) // TODO: Column 5 should be 123.4560 - result = tk.MustQuery("SELECT ROUND(1e14, 1), ROUND(1e15, 1), ROUND(1e308, 1)") - result.Check(testkit.Rows("100000000000000 1000000000000000 100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")) - result = tk.MustQuery("SELECT ROUND(1e-14, 1), ROUND(1e-15, 1), ROUND(1e-308, 1)") - result.Check(testkit.Rows("0 0 0")) - - // for truncate - result = tk.MustQuery("SELECT truncate(123, -2), truncate(123, 2), truncate(123, 1), truncate(123, -1);") - 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")) - // issue 17181,19390 - tk.MustQuery("select truncate(42, -9223372036854775808);").Check(testkit.Rows("0")) - tk.MustQuery("select truncate(42, 9223372036854775808);").Check(testkit.Rows("42")) - tk.MustQuery("select truncate(42, -2147483648);").Check(testkit.Rows("0")) - tk.MustQuery("select truncate(42, 2147483648);").Check(testkit.Rows("42")) - tk.MustQuery("select truncate(42, 18446744073709551615);").Check(testkit.Rows("42")) - tk.MustQuery("select truncate(42, 4294967295);").Check(testkit.Rows("42")) - tk.MustQuery("select truncate(42, -0);").Check(testkit.Rows("42")) - tk.MustQuery("select truncate(42, -307);").Check(testkit.Rows("0")) - tk.MustQuery("select truncate(42, -308);").Check(testkit.Rows("0")) - tk.MustQuery("select truncate(42, -309);").Check(testkit.Rows("0")) - tk.MustExec(`drop table if exists t;`) - tk.MustExec("create table t (a bigint unsigned);") - tk.MustExec("insert into t values (18446744073709551615), (4294967295), (9223372036854775808), (2147483648);") - tk.MustQuery("select truncate(42, a) from t;").Check(testkit.Rows("42", "42", "42", "42")) - - tk.MustExec(`drop table if exists t;`) - tk.MustExec(`create table t(a date, b datetime, c timestamp, d varchar(20));`) - tk.MustExec(`insert into t select "1234-12-29", "1234-12-29 16:24:13.9912", "2014-12-29 16:19:28", "12.34567";`) - - // NOTE: the actually result is: 12341220 12341229.0 12341200 12341229.00, - // but Datum.ToString() don't format decimal length for float numbers. - result = tk.MustQuery(`select truncate(a, -1), truncate(a, 1), truncate(a, -2), truncate(a, 2) from t;`) - result.Check(testkit.Rows("12341220 12341229 12341200 12341229")) - - // NOTE: the actually result is: 12341229162410 12341229162414.0 12341229162400 12341229162414.00, - // but Datum.ToString() don't format decimal length for float numbers. - result = tk.MustQuery(`select truncate(b, -1), truncate(b, 1), truncate(b, -2), truncate(b, 2) from t;`) - result.Check(testkit.Rows("12341229162410 12341229162414 12341229162400 12341229162414")) - - // NOTE: the actually result is: 20141229161920 20141229161928.0 20141229161900 20141229161928.00, - // but Datum.ToString() don't format decimal length for float numbers. - result = tk.MustQuery(`select truncate(c, -1), truncate(c, 1), truncate(c, -2), truncate(c, 2) from t;`) - result.Check(testkit.Rows("20141229161920 20141229161928 20141229161900 20141229161928")) - - result = tk.MustQuery(`select truncate(d, -1), truncate(d, 1), truncate(d, -2), truncate(d, 2) from t;`) - result.Check(testkit.Rows("10 12.3 0 12.34")) - - result = tk.MustQuery(`select truncate(json_array(), 1), truncate("cascasc", 1);`) - result.Check(testkit.Rows("0 0")) - - // for pow - result = tk.MustQuery("SELECT POW('12', 2), POW(1.2e1, '2.0'), POW(12, 2.0);") - result.Check(testkit.Rows("144 144 144")) - result = tk.MustQuery("SELECT POW(null, 2), POW(2, null), POW(null, null);") - result.Check(testkit.Rows("<nil> <nil> <nil>")) - result = tk.MustQuery("SELECT POW(0, 0);") - result.Check(testkit.Rows("1")) - result = tk.MustQuery("SELECT POW(0, 0.1), POW(0, 0.5), POW(0, 1);") - result.Check(testkit.Rows("0 0 0")) - rs, err = tk.Exec("SELECT POW(0, -1);") - c.Assert(err, IsNil) - _, err = session.GetRows4Test(ctx, tk.Se, rs) - c.Assert(err, NotNil) - terr = errors.Cause(err).(*terror.Error) - c.Assert(terr.Code(), Equals, errors.ErrCode(mysql.ErrDataOutOfRange)) - c.Assert(rs.Close(), IsNil) - - // for sign - result = tk.MustQuery("SELECT SIGN('12'), SIGN(1.2e1), SIGN(12), SIGN(0.0000012);") - result.Check(testkit.Rows("1 1 1 1")) - result = tk.MustQuery("SELECT SIGN('-12'), SIGN(-1.2e1), SIGN(-12), SIGN(-0.0000012);") - result.Check(testkit.Rows("-1 -1 -1 -1")) - result = tk.MustQuery("SELECT SIGN('0'), SIGN('-0'), SIGN(0);") - result.Check(testkit.Rows("0 0 0")) - result = tk.MustQuery("SELECT SIGN(NULL);") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("SELECT SIGN(-9223372036854775808), SIGN(9223372036854775808);") - result.Check(testkit.Rows("-1 1")) - - // for sqrt - result = tk.MustQuery("SELECT SQRT(-10), SQRT(144), SQRT(4.84), SQRT(0.04), SQRT(0);") - result.Check(testkit.Rows("<nil> 12 2.2 0.2 0")) - - // for crc32 - result = tk.MustQuery("SELECT crc32(0), crc32(-0), crc32('0'), crc32('abc'), crc32('ABC'), crc32(NULL), crc32(''), crc32('hello world!')") - result.Check(testkit.Rows("4108050209 4108050209 4108050209 891568578 2743272264 <nil> 0 62177901")) - - // for radians - result = tk.MustQuery("SELECT radians(1.0), radians(pi()), radians(pi()/2), radians(180), radians(1.009);") - result.Check(testkit.Rows("0.017453292519943295 0.05483113556160754 0.02741556778080377 3.141592653589793 0.01761037215262278")) - - // for rand - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a int)") - tk.MustExec("insert into t values(1),(2),(3)") - tk.Se.GetSessionVars().MaxChunkSize = 1 - tk.MustQuery("select rand(1) from t").Sort().Check(testkit.Rows("0.1418603212962489", "0.40540353712197724", "0.8716141803857071")) - tk.MustQuery("select rand(a) from t").Check(testkit.Rows("0.40540353712197724", "0.6555866465490187", "0.9057697559760601")) - tk.MustQuery("select rand(1), rand(2), rand(3)").Check(testkit.Rows("0.40540353712197724 0.6555866465490187 0.9057697559760601")) -} +func TestStringBuiltin(t *testing.T) { + t.Skip("it has been broken. Please fix it as soon as possible.") + store, clean := testkit.CreateMockStore(t) + defer clean() -func (s *testIntegrationSuite2) TestStringBuiltin(c *C) { - defer s.cleanEnv(c) - tk := testkit.NewTestKit(c, s.store) + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") var err error @@ -1171,16 +755,16 @@ func (s *testIntegrationSuite2) TestStringBuiltin(c *C) { result.Check(testkit.Rows("123 中文 中文 中文 中文")) // Charset 866 does not have a default collation configured currently, so this will return error. err = tk.ExecToErr(`select convert("123" using "866");`) - c.Assert(err.Error(), Equals, "[parser:1115]Unknown character set: '866'") + require.Error(t, err, "[parser:1115]Unknown character set: '866'") // Test case in issue #4436. tk.MustExec("drop table if exists t;") tk.MustExec("create table t(a char(20));") err = tk.ExecToErr("select convert(a using a) from t;") - c.Assert(err.Error(), Equals, "[parser:1115]Unknown character set: 'a'") + require.Error(t, err, "[parser:1115]Unknown character set: 'a'") // for insert result = tk.MustQuery(`select insert("中文", 1, 1, cast("aaa" as binary)), insert("ba", -1, 1, "aaa"), insert("ba", 1, 100, "aaa"), insert("ba", 100, 1, "aaa");`) - result.Check(testkit.Rows("aaa文 ba aaa ba")) + result.Check(testkit.Rows("aaa\xb8\xad文 ba aaa ba")) result = tk.MustQuery(`select insert("bb", NULL, 1, "aa"), insert("bb", 1, NULL, "aa"), insert(NULL, 1, 1, "aaa"), insert("bb", 1, 1, NULL);`) result.Check(testkit.Rows("<nil> <nil> <nil> <nil>")) result = tk.MustQuery(`SELECT INSERT("bb", 0, 1, NULL), INSERT("bb", 0, NULL, "aaa");`) @@ -1229,9 +813,11 @@ func (s *testIntegrationSuite2) TestStringBuiltin(c *C) { "-38.04620119 38.04620115 -38.04620119,38.04620115")) } -func (s *testIntegrationSuite2) TestEncryptionBuiltin(c *C) { - defer s.cleanEnv(c) - tk := testkit.NewTestKit(c, s.store) +func TestEncryptionBuiltin(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") ctx := context.Background() @@ -1379,14 +965,14 @@ func (s *testIntegrationSuite2) TestEncryptionBuiltin(c *C) { // for RANDOM_BYTES lengths := []int{0, -5, 1025, 4000} - for _, len := range lengths { - rs, err := tk.Exec(fmt.Sprintf("SELECT RANDOM_BYTES(%d);", len)) - c.Assert(err, IsNil, Commentf("%v", len)) - _, err = session.GetRows4Test(ctx, tk.Se, rs) - c.Assert(err, NotNil, Commentf("%v", len)) + for _, length := range lengths { + rs, err := tk.Exec(fmt.Sprintf("SELECT RANDOM_BYTES(%d);", length)) + require.NoError(t, err, "%v", length) + _, err = session.GetRows4Test(ctx, tk.Session(), rs) + require.Error(t, err, "%v", length) terr := errors.Cause(err).(*terror.Error) - c.Assert(terr.Code(), Equals, errors.ErrCode(mysql.ErrDataOutOfRange), Commentf("%v", len)) - c.Assert(rs.Close(), IsNil) + require.Equal(t, errors.ErrCode(mysql.ErrDataOutOfRange), terr.Code(), "%v", length) + require.NoError(t, rs.Close()) } tk.MustQuery("SELECT RANDOM_BYTES('1');") tk.MustQuery("SELECT RANDOM_BYTES(1024);") @@ -1394,1094 +980,11 @@ func (s *testIntegrationSuite2) TestEncryptionBuiltin(c *C) { result.Check(testkit.Rows("<nil>")) } -func (s *testIntegrationSuite2) TestTimeBuiltin(c *C) { - originSQLMode := s.ctx.GetSessionVars().StrictSQLMode - s.ctx.GetSessionVars().StrictSQLMode = true - defer func() { - s.ctx.GetSessionVars().StrictSQLMode = originSQLMode - s.cleanEnv(c) - }() - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - - // for makeDate - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a int, b double, c datetime, d time, e char(20), f bit(10))") - tk.MustExec(`insert into t values(1, 1.1, "2017-01-01 12:01:01", "12:01:01", "abcdef", 0b10101)`) - result := tk.MustQuery("select makedate(a,a), makedate(b,b), makedate(c,c), makedate(d,d), makedate(e,e), makedate(f,f), makedate(null,null), makedate(a,b) from t") - result.Check(testkit.Rows("2001-01-01 2001-01-01 <nil> <nil> <nil> 2021-01-21 <nil> 2001-01-01")) - - // for date - result = tk.MustQuery(`select date("2019-09-12"), date("2019-09-12 12:12:09"), date("2019-09-12 12:12:09.121212");`) - result.Check(testkit.Rows("2019-09-12 2019-09-12 2019-09-12")) - result = tk.MustQuery(`select date("0000-00-00"), date("0000-00-00 12:12:09"), date("0000-00-00 00:00:00.121212"), date("0000-00-00 00:00:00.000000");`) - result.Check(testkit.Rows("<nil> 0000-00-00 0000-00-00 <nil>")) - result = tk.MustQuery(`select date("aa"), date(12.1), date("");`) - result.Check(testkit.Rows("<nil> <nil> <nil>")) - - // for year - result = tk.MustQuery(`select year("2013-01-09"), year("2013-00-09"), year("000-01-09"), year("1-01-09"), year("20131-01-09"), year(null);`) - result.Check(testkit.Rows("2013 2013 0 2001 <nil> <nil>")) - result = tk.MustQuery(`select year("2013-00-00"), year("2013-00-00 00:00:00"), year("0000-00-00 12:12:12"), year("2017-00-00 12:12:12");`) - result.Check(testkit.Rows("2013 2013 0 2017")) - result = tk.MustQuery(`select year("aa"), year(2013), year(2012.09), year("1-01"), year("-09");`) - result.Check(testkit.Rows("<nil> <nil> <nil> <nil> <nil>")) - tk.MustExec(`drop table if exists t`) - tk.MustExec(`create table t(a bigint)`) - _, err := tk.Exec(`insert into t select year("aa")`) - c.Assert(err, NotNil) - c.Assert(terror.ErrorEqual(err, types.ErrWrongValue), IsTrue, Commentf("err %v", err)) - tk.MustExec(`set sql_mode='STRICT_TRANS_TABLES'`) // without zero date - tk.MustExec(`insert into t select year("0000-00-00 00:00:00")`) - tk.MustExec(`set sql_mode="NO_ZERO_DATE";`) // with zero date - tk.MustExec(`insert into t select year("0000-00-00 00:00:00")`) - tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1292|Incorrect datetime value: '0000-00-00 00:00:00.000000'")) - tk.MustExec(`set sql_mode="NO_ZERO_DATE,STRICT_TRANS_TABLES";`) - _, err = tk.Exec(`insert into t select year("0000-00-00 00:00:00");`) - c.Assert(err, NotNil) - c.Assert(types.ErrWrongValue.Equal(err), IsTrue, Commentf("err %v", err)) - tk.MustExec(`insert into t select 1`) - tk.MustExec(`set sql_mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION";`) - _, err = tk.Exec(`update t set a = year("aa")`) - c.Assert(terror.ErrorEqual(err, types.ErrWrongValue), IsTrue, Commentf("err %v", err)) - _, err = tk.Exec(`delete from t where a = year("aa")`) - // Only `code` can be used to compare because the error `class` information - // will be lost after expression push-down - c.Assert(errors.Cause(err).(*terror.Error).Code(), Equals, types.ErrWrongValue.Code(), Commentf("err %v", err)) - - // for month - result = tk.MustQuery(`select month("2013-01-09"), month("2013-00-09"), month("000-01-09"), month("1-01-09"), month("20131-01-09"), month(null);`) - result.Check(testkit.Rows("1 0 1 1 <nil> <nil>")) - result = tk.MustQuery(`select month("2013-00-00"), month("2013-00-00 00:00:00"), month("0000-00-00 12:12:12"), month("2017-00-00 12:12:12");`) - result.Check(testkit.Rows("0 0 0 0")) - result = tk.MustQuery(`select month("aa"), month(2013), month(2012.09), month("1-01"), month("-09");`) - result.Check(testkit.Rows("<nil> <nil> <nil> <nil> <nil>")) - result = tk.MustQuery(`select month("2013-012-09"), month("2013-0000000012-09"), month("2013-30-09"), month("000-41-09");`) - result.Check(testkit.Rows("12 12 <nil> <nil>")) - tk.MustExec(`drop table if exists t`) - tk.MustExec(`create table t(a bigint)`) - _, err = tk.Exec(`insert into t select month("aa")`) - c.Assert(err, NotNil) - c.Assert(terror.ErrorEqual(err, types.ErrWrongValue), IsTrue, Commentf("err: %v", err)) - tk.MustExec(`insert into t select month("0000-00-00 00:00:00")`) - tk.MustExec(`set sql_mode="NO_ZERO_DATE";`) - tk.MustExec(`insert into t select month("0000-00-00 00:00:00")`) - tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1292|Incorrect datetime value: '0000-00-00 00:00:00.000000'")) - tk.MustExec(`set sql_mode="NO_ZERO_DATE,STRICT_TRANS_TABLES";`) - _, err = tk.Exec(`insert into t select month("0000-00-00 00:00:00");`) - c.Assert(err, NotNil) - c.Assert(types.ErrWrongValue.Equal(err), IsTrue, Commentf("err %v", err)) - tk.MustExec(`insert into t select 1`) - tk.MustExec(`set sql_mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION";`) - tk.MustExec(`insert into t select 1`) - _, err = tk.Exec(`update t set a = month("aa")`) - c.Assert(terror.ErrorEqual(err, types.ErrWrongValue), IsTrue) - _, err = tk.Exec(`delete from t where a = month("aa")`) - c.Assert(errors.Cause(err).(*terror.Error).Code(), Equals, types.ErrWrongValue.Code(), Commentf("err %v", err)) - - // for week - result = tk.MustQuery(`select week("2012-12-22"), week("2012-12-22", -2), week("2012-12-22", 0), week("2012-12-22", 1), week("2012-12-22", 2), week("2012-12-22", 200);`) - result.Check(testkit.Rows("51 51 51 51 51 51")) - result = tk.MustQuery(`select week("2008-02-20"), week("2008-02-20", 0), week("2008-02-20", 1), week("2009-02-20", 2), week("2008-02-20", 3), week("2008-02-20", 4);`) - result.Check(testkit.Rows("7 7 8 7 8 8")) - result = tk.MustQuery(`select week("2008-02-20", 5), week("2008-02-20", 6), week("2009-02-20", 7), week("2008-02-20", 8), week("2008-02-20", 9);`) - result.Check(testkit.Rows("7 8 7 7 8")) - result = tk.MustQuery(`select week("aa", 1), week(null, 2), week(11, 2), week(12.99, 2);`) - result.Check(testkit.Rows("<nil> <nil> <nil> <nil>")) - result = tk.MustQuery(`select week("aa"), week(null), week(11), week(12.99);`) - result.Check(testkit.Rows("<nil> <nil> <nil> <nil>")) - tk.MustExec(`drop table if exists t`) - tk.MustExec(`create table t(a datetime)`) - _, err = tk.Exec(`insert into t select week("aa", 1)`) - c.Assert(err, NotNil) - c.Assert(terror.ErrorEqual(err, types.ErrWrongValue), IsTrue) - tk.MustExec(`insert into t select now()`) - _, err = tk.Exec(`update t set a = week("aa", 1)`) - c.Assert(terror.ErrorEqual(err, types.ErrWrongValue), IsTrue) - _, err = tk.Exec(`delete from t where a = week("aa", 1)`) - c.Assert(terror.ErrorEqual(err, types.ErrWrongValue), IsTrue) - - // for weekofyear - result = tk.MustQuery(`select weekofyear("2012-12-22"), weekofyear("2008-02-20"), weekofyear("aa"), weekofyear(null), weekofyear(11), weekofyear(12.99);`) - result.Check(testkit.Rows("51 8 <nil> <nil> <nil> <nil>")) - tk.MustExec(`drop table if exists t`) - tk.MustExec(`create table t(a bigint)`) - _, err = tk.Exec(`insert into t select weekofyear("aa")`) - c.Assert(err, NotNil) - c.Assert(terror.ErrorEqual(err, types.ErrWrongValue), IsTrue) - tk.MustExec(`insert into t select 1`) - _, err = tk.Exec(`update t set a = weekofyear("aa")`) - c.Assert(terror.ErrorEqual(err, types.ErrWrongValue), IsTrue) - _, err = tk.Exec(`delete from t where a = weekofyear("aa")`) - c.Assert(terror.ErrorEqual(err, types.ErrWrongValue), IsTrue) - - // for weekday - result = tk.MustQuery(`select weekday("2012-12-20"), weekday("2012-12-21"), weekday("2012-12-22"), weekday("2012-12-23"), weekday("2012-12-24"), weekday("2012-12-25"), weekday("2012-12-26"), weekday("2012-12-27");`) - result.Check(testkit.Rows("3 4 5 6 0 1 2 3")) - result = tk.MustQuery(`select weekday("2012-12-90"), weekday("0000-00-00"), weekday("aa"), weekday(null), weekday(11), weekday(12.99);`) - result.Check(testkit.Rows("<nil> <nil> <nil> <nil> <nil> <nil>")) - - // for quarter - result = tk.MustQuery(`select quarter("2012-00-20"), quarter("2012-01-21"), quarter("2012-03-22"), quarter("2012-05-23"), quarter("2012-08-24"), quarter("2012-09-25"), quarter("2012-11-26"), quarter("2012-12-27");`) - result.Check(testkit.Rows("0 1 1 2 3 3 4 4")) - result = tk.MustQuery(`select quarter("2012-14-20"), quarter("aa"), quarter(null), quarter(11), quarter(12.99);`) - result.Check(testkit.Rows("<nil> <nil> <nil> <nil> <nil>")) - result = tk.MustQuery(`select quarter("0000-00-00"), quarter("0000-00-00 00:00:00");`) - result.Check(testkit.Rows("<nil> <nil>")) - tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", - "Warning|1292|Incorrect datetime value: '0000-00-00 00:00:00.000000'", - "Warning|1292|Incorrect datetime value: '0000-00-00 00:00:00.000000'")) - result = tk.MustQuery(`select quarter(0), quarter(0.0), quarter(0e1), quarter(0.00);`) - result.Check(testkit.Rows("0 0 0 0")) - tk.MustQuery("show warnings").Check(testkit.Rows()) - - // for from_days - result = tk.MustQuery(`select from_days(0), from_days(-199), from_days(1111), from_days(120), from_days(1), from_days(1111111), from_days(9999999), from_days(22222);`) - result.Check(testkit.Rows("0000-00-00 0000-00-00 0003-01-16 0000-00-00 0000-00-00 3042-02-13 0000-00-00 0060-11-03")) - result = tk.MustQuery(`select from_days("2012-14-20"), from_days("111a"), from_days("aa"), from_days(null), from_days("123asf"), from_days(12.99);`) - result.Check(testkit.Rows("0005-07-05 0000-00-00 0000-00-00 <nil> 0000-00-00 0000-00-00")) - - // Fix issue #3923 - result = tk.MustQuery("select timediff(cast('2004-12-30 12:00:00' as time), '12:00:00');") - result.Check(testkit.Rows("00:00:00")) - result = tk.MustQuery("select timediff('12:00:00', cast('2004-12-30 12:00:00' as time));") - result.Check(testkit.Rows("00:00:00")) - result = tk.MustQuery("select timediff(cast('2004-12-30 12:00:00' as time), '2004-12-30 12:00:00');") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("select timediff('2004-12-30 12:00:00', cast('2004-12-30 12:00:00' as time));") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("select timediff(cast('2004-12-30 12:00:01' as datetime), '2004-12-30 12:00:00');") - result.Check(testkit.Rows("00:00:01")) - result = tk.MustQuery("select timediff('2004-12-30 12:00:00', cast('2004-12-30 12:00:01' as datetime));") - result.Check(testkit.Rows("-00:00:01")) - result = tk.MustQuery("select timediff(cast('2004-12-30 12:00:01' as time), '-34 00:00:00');") - result.Check(testkit.Rows("828:00:01")) - result = tk.MustQuery("select timediff('-34 00:00:00', cast('2004-12-30 12:00:01' as time));") - result.Check(testkit.Rows("-828:00:01")) - result = tk.MustQuery("select timediff(cast('2004-12-30 12:00:01' as datetime), cast('2004-12-30 11:00:01' as datetime));") - result.Check(testkit.Rows("01:00:00")) - result = tk.MustQuery("select timediff(cast('2004-12-30 12:00:01' as datetime), '2004-12-30 12:00:00.1');") - result.Check(testkit.Rows("00:00:00.9")) - result = tk.MustQuery("select timediff('2004-12-30 12:00:00.1', cast('2004-12-30 12:00:01' as datetime));") - result.Check(testkit.Rows("-00:00:00.9")) - result = tk.MustQuery("select timediff(cast('2004-12-30 12:00:01' as datetime), '-34 124:00:00');") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("select timediff('-34 124:00:00', cast('2004-12-30 12:00:01' as datetime));") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("select timediff(cast('2004-12-30 12:00:01' as time), '-34 124:00:00');") - result.Check(testkit.Rows("838:59:59")) - result = tk.MustQuery("select timediff('-34 124:00:00', cast('2004-12-30 12:00:01' as time));") - result.Check(testkit.Rows("-838:59:59")) - result = tk.MustQuery("select timediff(cast('2004-12-30' as datetime), '12:00:00');") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("select timediff('12:00:00', cast('2004-12-30' as datetime));") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("select timediff('12:00:00', '-34 12:00:00');") - result.Check(testkit.Rows("838:59:59")) - result = tk.MustQuery("select timediff('12:00:00', '34 12:00:00');") - result.Check(testkit.Rows("-816:00:00")) - result = tk.MustQuery("select timediff('2014-1-2 12:00:00', '-34 12:00:00');") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("select timediff('-34 12:00:00', '2014-1-2 12:00:00');") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("select timediff('2014-1-2 12:00:00', '12:00:00');") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("select timediff('12:00:00', '2014-1-2 12:00:00');") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("select timediff('2014-1-2 12:00:00', '2014-1-1 12:00:00');") - result.Check(testkit.Rows("24:00:00")) - tk.MustQuery("select timediff(cast('10:10:10' as time), cast('10:10:11' as time))").Check(testkit.Rows("-00:00:01")) - - result = tk.MustQuery("select timestampadd(MINUTE, 1, '2003-01-02'), timestampadd(WEEK, 1, '2003-01-02 23:59:59')" + - ", timestampadd(MICROSECOND, 1, 950501);") - result.Check(testkit.Rows("2003-01-02 00:01:00 2003-01-09 23:59:59 1995-05-01 00:00:00.000001")) - result = tk.MustQuery("select timestampadd(day, 2, 950501), timestampadd(MINUTE, 37.5,'2003-01-02'), timestampadd(MINUTE, 37.49,'2003-01-02')," + - " timestampadd(YeAr, 1, '2003-01-02');") - result.Check(testkit.Rows("1995-05-03 00:00:00 2003-01-02 00:38:00 2003-01-02 00:37:00 2004-01-02 00:00:00")) - result = tk.MustQuery("select to_seconds(950501), to_seconds('2009-11-29'), to_seconds('2009-11-29 13:43:32'), to_seconds('09-11-29 13:43:32');") - result.Check(testkit.Rows("62966505600 63426672000 63426721412 63426721412")) - result = tk.MustQuery("select to_days(950501), to_days('2007-10-07'), to_days('2007-10-07 00:00:59'), to_days('0000-01-01')") - result.Check(testkit.Rows("728779 733321 733321 1")) - - result = tk.MustQuery("select last_day('2003-02-05'), last_day('2004-02-05'), last_day('2004-01-01 01:01:01'), last_day(950501);") - result.Check(testkit.Rows("2003-02-28 2004-02-29 2004-01-31 1995-05-31")) - - tk.MustExec("SET SQL_MODE='';") - result = tk.MustQuery("select last_day('0000-00-00');") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("select to_days('0000-00-00');") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("select to_seconds('0000-00-00');") - result.Check(testkit.Rows("<nil>")) - - result = tk.MustQuery("select timestamp('2003-12-31'), timestamp('2003-12-31 12:00:00','12:00:00');") - result.Check(testkit.Rows("2003-12-31 00:00:00 2004-01-01 00:00:00")) - result = tk.MustQuery("select timestamp(20170118123950.123), timestamp(20170118123950.999);") - result.Check(testkit.Rows("2017-01-18 12:39:50.123 2017-01-18 12:39:50.999")) - // Issue https://github.com/pingcap/tidb/issues/20003 - result = tk.MustQuery("select timestamp(0.0001, 0.00001);") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("select timestamp('2003-12-31', '01:01:01.01'), timestamp('2003-12-31 12:34', '01:01:01.01')," + - " timestamp('2008-12-31','00:00:00.0'), timestamp('2008-12-31 00:00:00.000');") - - tk.MustQuery(`select timestampadd(second, 1, cast("2001-01-01" as date))`).Check(testkit.Rows("2001-01-01 00:00:01")) - tk.MustQuery(`select timestampadd(hour, 1, cast("2001-01-01" as date))`).Check(testkit.Rows("2001-01-01 01:00:00")) - tk.MustQuery(`select timestampadd(day, 1, cast("2001-01-01" as date))`).Check(testkit.Rows("2001-01-02")) - tk.MustQuery(`select timestampadd(month, 1, cast("2001-01-01" as date))`).Check(testkit.Rows("2001-02-01")) - tk.MustQuery(`select timestampadd(year, 1, cast("2001-01-01" as date))`).Check(testkit.Rows("2002-01-01")) - tk.MustQuery(`select timestampadd(second, 1, cast("2001-01-01" as datetime))`).Check(testkit.Rows("2001-01-01 00:00:01")) - tk.MustQuery(`select timestampadd(hour, 1, cast("2001-01-01" as datetime))`).Check(testkit.Rows("2001-01-01 01:00:00")) - tk.MustQuery(`select timestampadd(day, 1, cast("2001-01-01" as datetime))`).Check(testkit.Rows("2001-01-02 00:00:00")) - tk.MustQuery(`select timestampadd(month, 1, cast("2001-01-01" as datetime))`).Check(testkit.Rows("2001-02-01 00:00:00")) - tk.MustQuery(`select timestampadd(year, 1, cast("2001-01-01" as datetime))`).Check(testkit.Rows("2002-01-01 00:00:00")) - - result.Check(testkit.Rows("2003-12-31 01:01:01.01 2003-12-31 13:35:01.01 2008-12-31 00:00:00.0 2008-12-31 00:00:00.000")) - result = tk.MustQuery("select timestamp('2003-12-31', 1), timestamp('2003-12-31', -1);") - result.Check(testkit.Rows("2003-12-31 00:00:01 2003-12-30 23:59:59")) - result = tk.MustQuery("select timestamp('2003-12-31', '2000-12-12 01:01:01.01'), timestamp('2003-14-31','01:01:01.01');") - result.Check(testkit.Rows("<nil> <nil>")) - - result = tk.MustQuery("select TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01'), TIMESTAMPDIFF(yEaR,'2002-05-01', " + - "'2001-01-01'), TIMESTAMPDIFF(minute,binary('2003-02-01'),'2003-05-01 12:05:55'), TIMESTAMPDIFF(day," + - "'1995-05-02', 950501);") - result.Check(testkit.Rows("3 -1 128885 -1")) - - result = tk.MustQuery("select datediff('2007-12-31 23:59:59','2007-12-30'), datediff('2010-11-30 23:59:59', " + - "'2010-12-31'), datediff(950501,'2016-01-13'), datediff(950501.9,'2016-01-13'), datediff(binary(950501), '2016-01-13');") - result.Check(testkit.Rows("1 -31 -7562 -7562 -7562")) - result = tk.MustQuery("select datediff('0000-01-01','0001-01-01'), datediff('0001-00-01', '0001-00-01'), datediff('0001-01-00','0001-01-00'), datediff('2017-01-01','2017-01-01');") - result.Check(testkit.Rows("-365 <nil> <nil> 0")) - - // for ADDTIME - result = tk.MustQuery("select addtime('01:01:11', '00:00:01.013'), addtime('01:01:11.00', '00:00:01'), addtime" + - "('2017-01-01 01:01:11.12', '00:00:01'), addtime('2017-01-01 01:01:11.12', '00:00:01.88');") - result.Check(testkit.Rows("01:01:12.013000 01:01:12 2017-01-01 01:01:12.120000 2017-01-01 01:01:13")) - result = tk.MustQuery("select addtime(cast('01:01:11' as time(4)), '00:00:01.013'), addtime(cast('01:01:11.00' " + - "as datetime(3)), '00:00:01')," + " addtime(cast('2017-01-01 01:01:11.12' as date), '00:00:01'), addtime(cast" + - "(cast('2017-01-01 01:01:11.12' as date) as datetime(2)), '00:00:01.88');") - result.Check(testkit.Rows("01:01:12.0130 2001-01-11 00:00:01.000 00:00:01 2017-01-01 00:00:01.88")) - result = tk.MustQuery("select addtime('2017-01-01 01:01:01', 5), addtime('2017-01-01 01:01:01', -5), addtime('2017-01-01 01:01:01', 0.0), addtime('2017-01-01 01:01:01', 1.34);") - result.Check(testkit.Rows("2017-01-01 01:01:06 2017-01-01 01:00:56 2017-01-01 01:01:01 2017-01-01 01:01:02.340000")) - result = tk.MustQuery("select addtime(cast('01:01:11.00' as datetime(3)), cast('00:00:01' as time)), addtime(cast('01:01:11.00' as datetime(3)), cast('00:00:01' as time(5)))") - result.Check(testkit.Rows("2001-01-11 00:00:01.000 2001-01-11 00:00:01.00000")) - result = tk.MustQuery("select addtime(cast('01:01:11.00' as date), cast('00:00:01' as time));") - result.Check(testkit.Rows("00:00:01")) - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a datetime, b timestamp, c time)") - tk.MustExec(`insert into t values("2017-01-01 12:30:31", "2017-01-01 12:30:31", "01:01:01")`) - result = tk.MustQuery("select addtime(a, b), addtime(cast(a as date), b), addtime(b,a), addtime(a,c), addtime(b," + - "c), addtime(c,a), addtime(c,b)" + - " from t;") - result.Check(testkit.Rows("<nil> <nil> <nil> 2017-01-01 13:31:32 2017-01-01 13:31:32 <nil> <nil>")) - result = tk.MustQuery("select addtime('01:01:11', cast('1' as time))") - result.Check(testkit.Rows("01:01:12")) - tk.MustQuery("select addtime(cast(null as char(20)), cast('1' as time))").Check(testkit.Rows("<nil>")) - c.Assert(tk.QueryToErr(`select addtime("01:01:11", cast('sdf' as time))`), IsNil) - tk.MustQuery(`select addtime("01:01:11", cast(null as char(20)))`).Check(testkit.Rows("<nil>")) - tk.MustQuery(`select addtime(cast(1 as time), cast(1 as time))`).Check(testkit.Rows("00:00:02")) - tk.MustQuery(`select addtime(cast(null as time), cast(1 as time))`).Check(testkit.Rows("<nil>")) - tk.MustQuery(`select addtime(cast(1 as time), cast(null as time))`).Check(testkit.Rows("<nil>")) - - // for SUBTIME - result = tk.MustQuery("select subtime('01:01:11', '00:00:01.013'), subtime('01:01:11.00', '00:00:01'), subtime" + - "('2017-01-01 01:01:11.12', '00:00:01'), subtime('2017-01-01 01:01:11.12', '00:00:01.88');") - result.Check(testkit.Rows("01:01:09.987000 01:01:10 2017-01-01 01:01:10.120000 2017-01-01 01:01:09.240000")) - result = tk.MustQuery("select subtime(cast('01:01:11' as time(4)), '00:00:01.013'), subtime(cast('01:01:11.00' " + - "as datetime(3)), '00:00:01')," + " subtime(cast('2017-01-01 01:01:11.12' as date), '00:00:01'), subtime(cast" + - "(cast('2017-01-01 01:01:11.12' as date) as datetime(2)), '00:00:01.88');") - result.Check(testkit.Rows("01:01:09.9870 2001-01-10 23:59:59.000 -00:00:01 2016-12-31 23:59:58.12")) - result = tk.MustQuery("select subtime('2017-01-01 01:01:01', 5), subtime('2017-01-01 01:01:01', -5), subtime('2017-01-01 01:01:01', 0.0), subtime('2017-01-01 01:01:01', 1.34);") - result.Check(testkit.Rows("2017-01-01 01:00:56 2017-01-01 01:01:06 2017-01-01 01:01:01 2017-01-01 01:00:59.660000")) - result = tk.MustQuery("select subtime('01:01:11', '0:0:1.013'), subtime('01:01:11.00', '0:0:1'), subtime('2017-01-01 01:01:11.12', '0:0:1'), subtime('2017-01-01 01:01:11.12', '0:0:1.120000');") - result.Check(testkit.Rows("01:01:09.987000 01:01:10 2017-01-01 01:01:10.120000 2017-01-01 01:01:10")) - result = tk.MustQuery("select subtime(cast('01:01:11.00' as datetime(3)), cast('00:00:01' as time)), subtime(cast('01:01:11.00' as datetime(3)), cast('00:00:01' as time(5)))") - result.Check(testkit.Rows("2001-01-10 23:59:59.000 2001-01-10 23:59:59.00000")) - result = tk.MustQuery("select subtime(cast('01:01:11.00' as date), cast('00:00:01' as time));") - result.Check(testkit.Rows("-00:00:01")) - result = tk.MustQuery("select subtime(a, b), subtime(cast(a as date), b), subtime(b,a), subtime(a,c), subtime(b," + - "c), subtime(c,a), subtime(c,b) from t;") - result.Check(testkit.Rows("<nil> <nil> <nil> 2017-01-01 11:29:30 2017-01-01 11:29:30 <nil> <nil>")) - tk.MustQuery("select subtime(cast('10:10:10' as time), cast('9:10:10' as time))").Check(testkit.Rows("01:00:00")) - tk.MustQuery("select subtime('10:10:10', cast('9:10:10' as time))").Check(testkit.Rows("01:00:00")) - - // ADDTIME & SUBTIME issue #5966 - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a datetime, b timestamp, c time, d date, e bit(1))") - tk.MustExec(`insert into t values("2017-01-01 12:30:31", "2017-01-01 12:30:31", "01:01:01", "2017-01-01", 0b1)`) - - result = tk.MustQuery("select addtime(a, e), addtime(b, e), addtime(c, e), addtime(d, e) from t") - result.Check(testkit.Rows("<nil> <nil> <nil> <nil>")) - result = tk.MustQuery("select addtime('2017-01-01 01:01:01', 0b1), addtime('2017-01-01', b'1'), addtime('01:01:01', 0b1011)") - result.Check(testkit.Rows("<nil> <nil> <nil>")) - result = tk.MustQuery("select addtime('2017-01-01', 1), addtime('2017-01-01 01:01:01', 1), addtime(cast('2017-01-01' as date), 1)") - result.Check(testkit.Rows("2017-01-01 00:00:01 2017-01-01 01:01:02 00:00:01")) - result = tk.MustQuery("select subtime(a, e), subtime(b, e), subtime(c, e), subtime(d, e) from t") - result.Check(testkit.Rows("<nil> <nil> <nil> <nil>")) - result = tk.MustQuery("select subtime('2017-01-01 01:01:01', 0b1), subtime('2017-01-01', b'1'), subtime('01:01:01', 0b1011)") - result.Check(testkit.Rows("<nil> <nil> <nil>")) - result = tk.MustQuery("select subtime('2017-01-01', 1), subtime('2017-01-01 01:01:01', 1), subtime(cast('2017-01-01' as date), 1)") - result.Check(testkit.Rows("2016-12-31 23:59:59 2017-01-01 01:01:00 -00:00:01")) - - result = tk.MustQuery("select addtime(-32073, 0), addtime(0, -32073);") - result.Check(testkit.Rows("<nil> <nil>")) - tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", - "Warning|1292|Truncated incorrect time value: '-32073'", - "Warning|1292|Truncated incorrect time value: '-32073'")) - result = tk.MustQuery("select addtime(-32073, c), addtime(c, -32073) from t;") - result.Check(testkit.Rows("<nil> <nil>")) - tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", - "Warning|1292|Truncated incorrect time value: '-32073'", - "Warning|1292|Truncated incorrect time value: '-32073'")) - result = tk.MustQuery("select addtime(a, -32073), addtime(b, -32073), addtime(d, -32073) from t;") - result.Check(testkit.Rows("<nil> <nil> <nil>")) - tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", - "Warning|1292|Truncated incorrect time value: '-32073'", - "Warning|1292|Truncated incorrect time value: '-32073'", - "Warning|1292|Truncated incorrect time value: '-32073'")) - - result = tk.MustQuery("select subtime(-32073, 0), subtime(0, -32073);") - result.Check(testkit.Rows("<nil> <nil>")) - tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", - "Warning|1292|Truncated incorrect time value: '-32073'", - "Warning|1292|Truncated incorrect time value: '-32073'")) - result = tk.MustQuery("select subtime(-32073, c), subtime(c, -32073) from t;") - result.Check(testkit.Rows("<nil> <nil>")) - tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", - "Warning|1292|Truncated incorrect time value: '-32073'", - "Warning|1292|Truncated incorrect time value: '-32073'")) - result = tk.MustQuery("select subtime(a, -32073), subtime(b, -32073), subtime(d, -32073) from t;") - result.Check(testkit.Rows("<nil> <nil> <nil>")) - tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", - "Warning|1292|Truncated incorrect time value: '-32073'", - "Warning|1292|Truncated incorrect time value: '-32073'", - "Warning|1292|Truncated incorrect time value: '-32073'")) - - // fixed issue #3986 - tk.MustExec("SET SQL_MODE='NO_ENGINE_SUBSTITUTION';") - tk.MustExec("SET TIME_ZONE='+03:00';") - tk.MustExec("DROP TABLE IF EXISTS t;") - tk.MustExec("CREATE TABLE t (ix TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);") - tk.MustExec("INSERT INTO t VALUES (0), (20030101010160), (20030101016001), (20030101240101), (20030132010101), (20031301010101), (20031200000000), (20030000000000);") - result = tk.MustQuery("SELECT CAST(ix AS SIGNED) FROM t;") - result.Check(testkit.Rows("0", "0", "0", "0", "0", "0", "0", "0")) - - // test time - result = tk.MustQuery("select time('2003-12-31 01:02:03')") - result.Check(testkit.Rows("01:02:03")) - result = tk.MustQuery("select time('2003-12-31 01:02:03.000123')") - result.Check(testkit.Rows("01:02:03.000123")) - result = tk.MustQuery("select time('01:02:03.000123')") - result.Check(testkit.Rows("01:02:03.000123")) - result = tk.MustQuery("select time('01:02:03')") - result.Check(testkit.Rows("01:02:03")) - result = tk.MustQuery("select time('-838:59:59.000000')") - result.Check(testkit.Rows("-838:59:59.000000")) - result = tk.MustQuery("select time('-838:59:59.000001')") - result.Check(testkit.Rows("-838:59:59.000000")) - result = tk.MustQuery("select time('-839:59:59.000000')") - result.Check(testkit.Rows("-838:59:59.000000")) - result = tk.MustQuery("select time('840:59:59.000000')") - result.Check(testkit.Rows("838:59:59.000000")) - // FIXME: #issue 4193 - // result = tk.MustQuery("select time('840:59:60.000000')") - // result.Check(testkit.Rows("<nil>")) - // result = tk.MustQuery("select time('800:59:59.9999999')") - // result.Check(testkit.Rows("801:00:00.000000")) - // result = tk.MustQuery("select time('12003-12-10 01:02:03.000123')") - // result.Check(testkit.Rows("<nil>") - // result = tk.MustQuery("select time('')") - // result.Check(testkit.Rows("<nil>") - // result = tk.MustQuery("select time('2003-12-10-10 01:02:03.000123')") - // result.Check(testkit.Rows("00:20:03") - - // Issue 20995 - result = tk.MustQuery("select time('0.1234567')") - result.Check(testkit.Rows("00:00:00.123457")) - - // for hour - result = tk.MustQuery(`SELECT hour("12:13:14.123456"), hour("12:13:14.000010"), hour("272:59:55"), hour(020005), hour(null), hour("27aaaa2:59:55");`) - result.Check(testkit.Rows("12 12 272 2 <nil> <nil>")) - - // for hour, issue #4340 - result = tk.MustQuery(`SELECT HOUR(20171222020005);`) - result.Check(testkit.Rows("2")) - result = tk.MustQuery(`SELECT HOUR(20171222020005.1);`) - result.Check(testkit.Rows("2")) - result = tk.MustQuery(`SELECT HOUR(20171222020005.1e0);`) - result.Check(testkit.Rows("2")) - result = tk.MustQuery(`SELECT HOUR("20171222020005");`) - result.Check(testkit.Rows("2")) - result = tk.MustQuery(`SELECT HOUR("20171222020005.1");`) - result.Check(testkit.Rows("2")) - result = tk.MustQuery(`select hour(20171222);`) - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery(`select hour(8381222);`) - result.Check(testkit.Rows("838")) - result = tk.MustQuery(`select hour(10000000000);`) - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery(`select hour(10100000000);`) - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery(`select hour(10001000000);`) - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery(`select hour(10101000000);`) - result.Check(testkit.Rows("0")) - - // for minute - result = tk.MustQuery(`SELECT minute("12:13:14.123456"), minute("12:13:14.000010"), minute("272:59:55"), minute(null), minute("27aaaa2:59:55");`) - result.Check(testkit.Rows("13 13 59 <nil> <nil>")) - - // for second - result = tk.MustQuery(`SELECT second("12:13:14.123456"), second("12:13:14.000010"), second("272:59:55"), second(null), second("27aaaa2:59:55");`) - result.Check(testkit.Rows("14 14 55 <nil> <nil>")) - - // for microsecond - result = tk.MustQuery(`SELECT microsecond("12:00:00.123456"), microsecond("12:00:00.000010"), microsecond(null), microsecond("27aaaa2:59:55");`) - result.Check(testkit.Rows("123456 10 <nil> <nil>")) - - // for period_add - result = tk.MustQuery(`SELECT period_add(200807, 2), period_add(200807, -2);`) - result.Check(testkit.Rows("200809 200805")) - result = tk.MustQuery(`SELECT period_add(NULL, 2), period_add(-191, NULL), period_add(NULL, NULL), period_add(12.09, -2), period_add("200207aa", "1aa");`) - result.Check(testkit.Rows("<nil> <nil> <nil> 200010 200208")) - for _, errPeriod := range []string{ - "period_add(0, 20)", "period_add(0, 0)", "period_add(-1, 1)", "period_add(200013, 1)", "period_add(-200012, 1)", "period_add('', '')", - } { - err := tk.QueryToErr(fmt.Sprintf("SELECT %v;", errPeriod)) - c.Assert(err.Error(), Equals, "[expression:1210]Incorrect arguments to period_add") - } - - // for period_diff - result = tk.MustQuery(`SELECT period_diff(200807, 200705), period_diff(200807, 200908);`) - result.Check(testkit.Rows("14 -13")) - result = tk.MustQuery(`SELECT period_diff(NULL, 2), period_diff(-191, NULL), period_diff(NULL, NULL), period_diff(12.09, 2), period_diff("12aa", "11aa");`) - result.Check(testkit.Rows("<nil> <nil> <nil> 10 1")) - for _, errPeriod := range []string{ - "period_diff(-00013,1)", "period_diff(00013,1)", "period_diff(0, 0)", "period_diff(200013, 1)", "period_diff(5612, 4513)", "period_diff('', '')", - } { - err := tk.QueryToErr(fmt.Sprintf("SELECT %v;", errPeriod)) - c.Assert(err.Error(), Equals, "[expression:1210]Incorrect arguments to period_diff") - } - - // TODO: fix `CAST(xx as duration)` and release the test below: - // result = tk.MustQuery(`SELECT hour("aaa"), hour(123456), hour(1234567);`) - // result = tk.MustQuery(`SELECT minute("aaa"), minute(123456), minute(1234567);`) - // result = tk.MustQuery(`SELECT second("aaa"), second(123456), second(1234567);`) - // result = tk.MustQuery(`SELECT microsecond("aaa"), microsecond(123456), microsecond(1234567);`) - - // for time_format - result = tk.MustQuery("SELECT TIME_FORMAT('150:02:28', '%H:%i:%s %p');") - result.Check(testkit.Rows("150:02:28 AM")) - result = tk.MustQuery("SELECT TIME_FORMAT('bad string', '%H:%i:%s %p');") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("SELECT TIME_FORMAT(null, '%H:%i:%s %p');") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("SELECT TIME_FORMAT(123, '%H:%i:%s %p');") - result.Check(testkit.Rows("00:01:23 AM")) - result = tk.MustQuery("SELECT TIME_FORMAT('24:00:00', '%r');") - result.Check(testkit.Rows("12:00:00 AM")) - result = tk.MustQuery("SELECT TIME_FORMAT('25:00:00', '%r');") - result.Check(testkit.Rows("01:00:00 AM")) - result = tk.MustQuery("SELECT TIME_FORMAT('24:00:00', '%l %p');") - result.Check(testkit.Rows("12 AM")) - - // for date_format - result = tk.MustQuery(`SELECT DATE_FORMAT('2017-06-15', '%W %M %e %Y %r %y');`) - result.Check(testkit.Rows("Thursday June 15 2017 12:00:00 AM 17")) - result = tk.MustQuery(`SELECT DATE_FORMAT(151113102019.12, '%W %M %e %Y %r %y');`) - result.Check(testkit.Rows("Friday November 13 2015 10:20:19 AM 15")) - result = tk.MustQuery(`SELECT DATE_FORMAT('0000-00-00', '%W %M %e %Y %r %y');`) - result.Check(testkit.Rows("<nil>")) - tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", - "Warning|1292|Incorrect datetime value: '0000-00-00 00:00:00.000000'")) - result = tk.MustQuery(`SELECT DATE_FORMAT('0', '%W %M %e %Y %r %y'), DATE_FORMAT('0.0', '%W %M %e %Y %r %y'), DATE_FORMAT(0, 0);`) - result.Check(testkit.Rows("<nil> <nil> 0")) - tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", - "Warning|1292|Incorrect time value: '0'", - "Warning|1292|Incorrect datetime value: '0.0'")) - result = tk.MustQuery(`SELECT DATE_FORMAT(0, '%W %M %e %Y %r %y'), DATE_FORMAT(0.0, '%W %M %e %Y %r %y');`) - result.Check(testkit.Rows("<nil> <nil>")) - tk.MustQuery("show warnings").Check(testkit.Rows()) - - // for yearweek - result = tk.MustQuery(`select yearweek("2014-12-27"), yearweek("2014-29-27"), yearweek("2014-00-27"), yearweek("2014-12-27 12:38:32"), yearweek("2014-12-27 12:38:32.1111111"), yearweek("2014-12-27 12:90:32"), yearweek("2014-12-27 89:38:32.1111111");`) - result.Check(testkit.Rows("201451 <nil> <nil> 201451 201451 <nil> <nil>")) - result = tk.MustQuery(`select yearweek(12121), yearweek(1.00009), yearweek("aaaaa"), yearweek(""), yearweek(NULL);`) - result.Check(testkit.Rows("<nil> <nil> <nil> <nil> <nil>")) - result = tk.MustQuery(`select yearweek("0000-00-00"), yearweek("2019-01-29", "aa"), yearweek("2011-01-01", null);`) - result.Check(testkit.Rows("<nil> 201904 201052")) - - // for dayOfWeek, dayOfMonth, dayOfYear - result = tk.MustQuery(`select dayOfWeek(null), dayOfWeek("2017-08-12"), dayOfWeek("0000-00-00"), dayOfWeek("2017-00-00"), dayOfWeek("0000-00-00 12:12:12"), dayOfWeek("2017-00-00 12:12:12")`) - result.Check(testkit.Rows("<nil> 7 <nil> <nil> <nil> <nil>")) - result = tk.MustQuery(`select dayOfYear(null), dayOfYear("2017-08-12"), dayOfYear("0000-00-00"), dayOfYear("2017-00-00"), dayOfYear("0000-00-00 12:12:12"), dayOfYear("2017-00-00 12:12:12")`) - result.Check(testkit.Rows("<nil> 224 <nil> <nil> <nil> <nil>")) - result = tk.MustQuery(`select dayOfMonth(null), dayOfMonth("2017-08-12"), dayOfMonth("0000-00-00"), dayOfMonth("2017-00-00"), dayOfMonth("0000-00-00 12:12:12"), dayOfMonth("2017-00-00 12:12:12")`) - result.Check(testkit.Rows("<nil> 12 0 0 0 0")) - - tk.MustExec("set sql_mode = 'NO_ZERO_DATE'") - result = tk.MustQuery(`select dayOfWeek(null), dayOfWeek("2017-08-12"), dayOfWeek("0000-00-00"), dayOfWeek("2017-00-00"), dayOfWeek("0000-00-00 12:12:12"), dayOfWeek("2017-00-00 12:12:12")`) - result.Check(testkit.Rows("<nil> 7 <nil> <nil> <nil> <nil>")) - result = tk.MustQuery(`select dayOfYear(null), dayOfYear("2017-08-12"), dayOfYear("0000-00-00"), dayOfYear("2017-00-00"), dayOfYear("0000-00-00 12:12:12"), dayOfYear("2017-00-00 12:12:12")`) - result.Check(testkit.Rows("<nil> 224 <nil> <nil> <nil> <nil>")) - result = tk.MustQuery(`select dayOfMonth(null), dayOfMonth("2017-08-12"), dayOfMonth("0000-00-00"), dayOfMonth("2017-00-00"), dayOfMonth("0000-00-00 12:12:12"), dayOfMonth("2017-00-00 12:12:12")`) - result.Check(testkit.Rows("<nil> 12 <nil> 0 0 0")) - - tk.MustExec(`drop table if exists t`) - tk.MustExec(`create table t(a bigint)`) - tk.MustExec(`insert into t value(1)`) - tk.MustExec("set sql_mode = 'STRICT_TRANS_TABLES'") - - _, err = tk.Exec("insert into t value(dayOfWeek('0000-00-00'))") - c.Assert(types.ErrWrongValue.Equal(err), IsTrue, Commentf("%v", err)) - _, err = tk.Exec(`update t set a = dayOfWeek("0000-00-00")`) - c.Assert(types.ErrWrongValue.Equal(err), IsTrue) - _, err = tk.Exec(`delete from t where a = dayOfWeek(123)`) - c.Assert(err, IsNil) - - tk.MustExec("insert into t value(dayOfMonth('2017-00-00'))") - tk.MustExec("insert into t value(dayOfMonth('0000-00-00'))") - tk.MustExec(`update t set a = dayOfMonth("0000-00-00")`) - tk.MustExec("set sql_mode = 'NO_ZERO_DATE';") - tk.MustExec("insert into t value(dayOfMonth('0000-00-00'))") - tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1292|Incorrect datetime value: '0000-00-00 00:00:00.000000'")) - tk.MustExec(`update t set a = dayOfMonth("0000-00-00")`) - tk.MustExec("set sql_mode = 'NO_ZERO_DATE,STRICT_TRANS_TABLES';") - _, err = tk.Exec("insert into t value(dayOfMonth('0000-00-00'))") - c.Assert(types.ErrWrongValue.Equal(err), IsTrue) - tk.MustExec("insert into t value(0)") - _, err = tk.Exec(`update t set a = dayOfMonth("0000-00-00")`) - c.Assert(types.ErrWrongValue.Equal(err), IsTrue) - _, err = tk.Exec(`delete from t where a = dayOfMonth(123)`) - c.Assert(err, IsNil) - - _, err = tk.Exec("insert into t value(dayOfYear('0000-00-00'))") - c.Assert(types.ErrWrongValue.Equal(err), IsTrue) - _, err = tk.Exec(`update t set a = dayOfYear("0000-00-00")`) - c.Assert(types.ErrWrongValue.Equal(err), IsTrue) - _, err = tk.Exec(`delete from t where a = dayOfYear(123)`) - c.Assert(err, IsNil) - - tk.MustExec("set sql_mode = ''") - - // for unix_timestamp - tk.MustExec("SET time_zone = '+00:00';") - result = tk.MustQuery("SELECT UNIX_TIMESTAMP(151113);") - result.Check(testkit.Rows("1447372800")) - result = tk.MustQuery("SELECT UNIX_TIMESTAMP(20151113);") - result.Check(testkit.Rows("1447372800")) - result = tk.MustQuery("SELECT UNIX_TIMESTAMP(151113102019);") - result.Check(testkit.Rows("1447410019")) - result = tk.MustQuery("SELECT UNIX_TIMESTAMP(151113102019e0);") - result.Check(testkit.Rows("1447410019.000000")) - result = tk.MustQuery("SELECT UNIX_TIMESTAMP(15111310201912e-2);") - result.Check(testkit.Rows("1447410019.120000")) - result = tk.MustQuery("SELECT UNIX_TIMESTAMP(151113102019.12);") - result.Check(testkit.Rows("1447410019.12")) - result = tk.MustQuery("SELECT UNIX_TIMESTAMP(151113102019.1234567);") - result.Check(testkit.Rows("1447410019.123457")) - result = tk.MustQuery("SELECT UNIX_TIMESTAMP(20151113102019);") - result.Check(testkit.Rows("1447410019")) - result = tk.MustQuery("SELECT UNIX_TIMESTAMP('2015-11-13 10:20:19');") - result.Check(testkit.Rows("1447410019")) - result = tk.MustQuery("SELECT UNIX_TIMESTAMP('2015-11-13 10:20:19.012');") - result.Check(testkit.Rows("1447410019.012")) - result = tk.MustQuery("SELECT UNIX_TIMESTAMP('1970-01-01 00:00:00');") - result.Check(testkit.Rows("0")) - result = tk.MustQuery("SELECT UNIX_TIMESTAMP('1969-12-31 23:59:59');") - result.Check(testkit.Rows("0")) - result = tk.MustQuery("SELECT UNIX_TIMESTAMP('1970-13-01 00:00:00');") - // FIXME: MySQL returns 0 here. - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("SELECT UNIX_TIMESTAMP('2038-01-19 03:14:07.999999');") - result.Check(testkit.Rows("2147483647.999999")) - result = tk.MustQuery("SELECT UNIX_TIMESTAMP('2038-01-19 03:14:08');") - result.Check(testkit.Rows("0")) - result = tk.MustQuery("SELECT UNIX_TIMESTAMP(0);") - result.Check(testkit.Rows("0")) - // result = tk.MustQuery("SELECT UNIX_TIMESTAMP(-1);") - // result.Check(testkit.Rows("0")) - // result = tk.MustQuery("SELECT UNIX_TIMESTAMP(12345);") - // result.Check(testkit.Rows("0")) - result = tk.MustQuery("SELECT UNIX_TIMESTAMP('2017-01-01')") - result.Check(testkit.Rows("1483228800")) - // Test different time zone. - tk.MustExec("SET time_zone = '+08:00';") - result = tk.MustQuery("SELECT UNIX_TIMESTAMP('1970-01-01 00:00:00');") - result.Check(testkit.Rows("0")) - result = tk.MustQuery("SELECT UNIX_TIMESTAMP('1970-01-01 08:00:00');") - result.Check(testkit.Rows("0")) - result = tk.MustQuery("SELECT UNIX_TIMESTAMP('2015-11-13 18:20:19.012'), UNIX_TIMESTAMP('2015-11-13 18:20:19.0123');") - result.Check(testkit.Rows("1447410019.012 1447410019.0123")) - result = tk.MustQuery("SELECT UNIX_TIMESTAMP('2038-01-19 11:14:07.999999');") - result.Check(testkit.Rows("2147483647.999999")) - - result = tk.MustQuery("SELECT TIME_FORMAT('bad string', '%H:%i:%s %p');") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("SELECT TIME_FORMAT(null, '%H:%i:%s %p');") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("SELECT TIME_FORMAT(123, '%H:%i:%s %p');") - result.Check(testkit.Rows("00:01:23 AM")) - - // for monthname - tk.MustExec(`drop table if exists t`) - tk.MustExec(`create table t(a varchar(10))`) - tk.MustExec(`insert into t value("abc")`) - tk.MustExec("set sql_mode = 'STRICT_TRANS_TABLES'") - - tk.MustExec("insert into t value(monthname('0000-00-00'))") - tk.MustExec(`update t set a = monthname("0000-00-00")`) - tk.MustExec("set sql_mode = 'NO_ZERO_DATE'") - tk.MustExec("insert into t value(monthname('0000-00-00'))") - tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1292|Incorrect datetime value: '0000-00-00 00:00:00.000000'")) - tk.MustExec(`update t set a = monthname("0000-00-00")`) - tk.MustExec("set sql_mode = ''") - tk.MustExec("insert into t value(monthname('0000-00-00'))") - tk.MustExec("set sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_DATE'") - _, err = tk.Exec(`update t set a = monthname("0000-00-00")`) - c.Assert(types.ErrWrongValue.Equal(err), IsTrue) - _, err = tk.Exec(`delete from t where a = monthname(123)`) - c.Assert(err, IsNil) - result = tk.MustQuery(`select monthname("2017-12-01"), monthname("0000-00-00"), monthname("0000-01-00"), monthname("0000-01-00 00:00:00")`) - result.Check(testkit.Rows("December <nil> January January")) - tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1292|Incorrect datetime value: '0000-00-00 00:00:00.000000'")) - - // for dayname - tk.MustExec(`drop table if exists t`) - tk.MustExec(`create table t(a varchar(10))`) - tk.MustExec(`insert into t value("abc")`) - tk.MustExec("set sql_mode = 'STRICT_TRANS_TABLES'") - - _, err = tk.Exec("insert into t value(dayname('0000-00-00'))") - c.Assert(types.ErrWrongValue.Equal(err), IsTrue) - _, err = tk.Exec(`update t set a = dayname("0000-00-00")`) - c.Assert(types.ErrWrongValue.Equal(err), IsTrue) - _, err = tk.Exec(`delete from t where a = dayname(123)`) - c.Assert(err, IsNil) - result = tk.MustQuery(`select dayname("2017-12-01"), dayname("0000-00-00"), dayname("0000-01-00"), dayname("0000-01-00 00:00:00")`) - result.Check(testkit.Rows("Friday <nil> <nil> <nil>")) - tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", - "Warning|1292|Incorrect datetime value: '0000-00-00 00:00:00.000000'", - "Warning|1292|Incorrect datetime value: '0000-01-00 00:00:00.000000'", - "Warning|1292|Incorrect datetime value: '0000-01-00 00:00:00.000000'")) - // for dayname implicit cast to boolean and real - result = tk.MustQuery(`select 1 from dual where dayname('2016-03-07')`) - result.Check(testkit.Rows()) - result = tk.MustQuery(`select 1 from dual where dayname('2016-03-07') is true`) - result.Check(testkit.Rows()) - result = tk.MustQuery(`select 1 from dual where dayname('2016-03-07') is false`) - result.Check(testkit.Rows("1")) - result = tk.MustQuery(`select 1 from dual where dayname('2016-03-08')`) - result.Check(testkit.Rows("1")) - result = tk.MustQuery(`select 1 from dual where dayname('2016-03-08') is true`) - result.Check(testkit.Rows("1")) - result = tk.MustQuery(`select 1 from dual where dayname('2016-03-08') is false`) - result.Check(testkit.Rows()) - result = tk.MustQuery(`select cast(dayname("2016-03-07") as double), cast(dayname("2016-03-08") as double)`) - result.Check(testkit.Rows("0 1")) - - // for sec_to_time - result = tk.MustQuery("select sec_to_time(NULL)") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("select sec_to_time(2378), sec_to_time(3864000), sec_to_time(-3864000)") - result.Check(testkit.Rows("00:39:38 838:59:59 -838:59:59")) - result = tk.MustQuery("select sec_to_time(86401.4), sec_to_time(-86401.4), sec_to_time(864014e-1), sec_to_time(-864014e-1), sec_to_time('86401.4'), sec_to_time('-86401.4')") - result.Check(testkit.Rows("24:00:01.4 -24:00:01.4 24:00:01.400000 -24:00:01.400000 24:00:01.400000 -24:00:01.400000")) - result = tk.MustQuery("select sec_to_time(86401.54321), sec_to_time(86401.543212345)") - result.Check(testkit.Rows("24:00:01.54321 24:00:01.543212")) - result = tk.MustQuery("select sec_to_time('123.4'), sec_to_time('123.4567891'), sec_to_time('123')") - result.Check(testkit.Rows("00:02:03.400000 00:02:03.456789 00:02:03.000000")) - - // for time_to_sec - result = tk.MustQuery("select time_to_sec(NULL)") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("select time_to_sec('22:23:00'), time_to_sec('00:39:38'), time_to_sec('23:00'), time_to_sec('00:00'), time_to_sec('00:00:00'), time_to_sec('23:59:59')") - result.Check(testkit.Rows("80580 2378 82800 0 0 86399")) - result = tk.MustQuery("select time_to_sec('1:0'), time_to_sec('1:00'), time_to_sec('1:0:0'), time_to_sec('-02:00'), time_to_sec('-02:00:05'), time_to_sec('020005')") - result.Check(testkit.Rows("3600 3600 3600 -7200 -7205 7205")) - result = tk.MustQuery("select time_to_sec('20171222020005'), time_to_sec(020005), time_to_sec(20171222020005), time_to_sec(171222020005)") - result.Check(testkit.Rows("7205 7205 7205 7205")) - - // for str_to_date - result = tk.MustQuery("select str_to_date('01-01-2017', '%d-%m-%Y'), str_to_date('59:20:12 01-01-2017', '%s:%i:%H %d-%m-%Y'), str_to_date('59:20:12', '%s:%i:%H')") - result.Check(testkit.Rows("2017-01-01 2017-01-01 12:20:59 12:20:59")) - result = tk.MustQuery("select str_to_date('aaa01-01-2017', 'aaa%d-%m-%Y'), str_to_date('59:20:12 aaa01-01-2017', '%s:%i:%H aaa%d-%m-%Y'), str_to_date('59:20:12aaa', '%s:%i:%Haaa')") - result.Check(testkit.Rows("2017-01-01 2017-01-01 12:20:59 12:20:59")) - - result = tk.MustQuery("select str_to_date('01-01-2017', '%d'), str_to_date('59', '%d-%Y')") - // TODO: MySQL returns "<nil> <nil>". - result.Check(testkit.Rows("0000-00-01 <nil>")) - result = tk.MustQuery("show warnings") - result.Sort().Check(testutil.RowsWithSep("|", - "Warning|1292|Incorrect datetime value: '0000-00-00 00:00:00'", - "Warning|1292|Truncated incorrect datetime value: '01-01-2017'")) - - result = tk.MustQuery("select str_to_date('2018-6-1', '%Y-%m-%d'), str_to_date('2018-6-1', '%Y-%c-%d'), str_to_date('59:20:1', '%s:%i:%k'), str_to_date('59:20:1', '%s:%i:%l')") - result.Check(testkit.Rows("2018-06-01 2018-06-01 01:20:59 01:20:59")) - - result = tk.MustQuery("select str_to_date('2020-07-04 11:22:33 PM c', '%Y-%m-%d %r')") - result.Check(testkit.Rows("2020-07-04 23:22:33")) - result = tk.MustQuery("show warnings") - result.Check(testutil.RowsWithSep("|", "Warning|1292|Truncated incorrect datetime value: '2020-07-04 11:22:33 PM c'")) - - result = tk.MustQuery("select str_to_date('11:22:33 PM', ' %r')") - result.Check(testkit.Rows("23:22:33")) - result = tk.MustQuery("show warnings") - result.Check(testkit.Rows()) - - // for maketime - tk.MustExec(`drop table if exists t`) - tk.MustExec(`create table t(a double, b float, c decimal(10,4));`) - tk.MustExec(`insert into t value(1.23, 2.34, 3.1415)`) - result = tk.MustQuery("select maketime(1,1,a), maketime(2,2,b), maketime(3,3,c) from t;") - result.Check(testkit.Rows("01:01:01.230000 02:02:02.340000 03:03:03.1415")) - result = tk.MustQuery("select maketime(12, 13, 14), maketime('12', '15', 30.1), maketime(0, 1, 59.1), maketime(0, 1, '59.1'), maketime(0, 1, 59.5)") - result.Check(testkit.Rows("12:13:14 12:15:30.1 00:01:59.1 00:01:59.100000 00:01:59.5")) - result = tk.MustQuery("select maketime(12, 15, 60), maketime(12, 15, '60'), maketime(12, 60, 0), maketime(12, 15, null)") - result.Check(testkit.Rows("<nil> <nil> <nil> <nil>")) - result = tk.MustQuery("select maketime('', '', ''), maketime('h', 'm', 's');") - result.Check(testkit.Rows("00:00:00.000000 00:00:00.000000")) - - // for get_format - result = tk.MustQuery(`select GET_FORMAT(DATE,'USA'), GET_FORMAT(DATE,'JIS'), GET_FORMAT(DATE,'ISO'), GET_FORMAT(DATE,'EUR'), - GET_FORMAT(DATE,'INTERNAL'), GET_FORMAT(DATETIME,'USA') , GET_FORMAT(DATETIME,'JIS'), GET_FORMAT(DATETIME,'ISO'), - GET_FORMAT(DATETIME,'EUR') , GET_FORMAT(DATETIME,'INTERNAL'), GET_FORMAT(TIME,'USA') , GET_FORMAT(TIME,'JIS'), - GET_FORMAT(TIME,'ISO'), GET_FORMAT(TIME,'EUR'), GET_FORMAT(TIME,'INTERNAL')`) - result.Check(testkit.Rows("%m.%d.%Y %Y-%m-%d %Y-%m-%d %d.%m.%Y %Y%m%d %Y-%m-%d %H.%i.%s %Y-%m-%d %H:%i:%s %Y-%m-%d %H:%i:%s %Y-%m-%d %H.%i.%s %Y%m%d%H%i%s %h:%i:%s %p %H:%i:%s %H:%i:%s %H.%i.%s %H%i%s")) - - // for convert_tz - result = tk.MustQuery(`select convert_tz("2004-01-01 12:00:00", "+00:00", "+10:32"), convert_tz("2004-01-01 12:00:00.01", "+00:00", "+10:32"), convert_tz("2004-01-01 12:00:00.01234567", "+00:00", "+10:32");`) - result.Check(testkit.Rows("2004-01-01 22:32:00 2004-01-01 22:32:00.01 2004-01-01 22:32:00.012346")) - result = tk.MustQuery(`select convert_tz(20040101, "+00:00", "+10:32"), convert_tz(20040101.01, "+00:00", "+10:32"), convert_tz(20040101.01234567, "+00:00", "+10:32");`) - result.Check(testkit.Rows("2004-01-01 10:32:00 2004-01-01 10:32:00.00 2004-01-01 10:32:00.000000")) - result = tk.MustQuery(`select convert_tz(NULL, "+00:00", "+10:32"), convert_tz("2004-01-01 12:00:00", NULL, "+10:32"), convert_tz("2004-01-01 12:00:00", "+00:00", NULL);`) - result.Check(testkit.Rows("<nil> <nil> <nil>")) - result = tk.MustQuery(`select convert_tz("a", "+00:00", "+10:32"), convert_tz("2004-01-01 12:00:00", "a", "+10:32"), convert_tz("2004-01-01 12:00:00", "+00:00", "a");`) - result.Check(testkit.Rows("<nil> <nil> <nil>")) - result = tk.MustQuery(`select convert_tz("", "+00:00", "+10:32"), convert_tz("2004-01-01 12:00:00", "", "+10:32"), convert_tz("2004-01-01 12:00:00", "+00:00", "");`) - result.Check(testkit.Rows("<nil> <nil> <nil>")) - result = tk.MustQuery(`select convert_tz("0", "+00:00", "+10:32"), convert_tz("2004-01-01 12:00:00", "0", "+10:32"), convert_tz("2004-01-01 12:00:00", "+00:00", "0");`) - result.Check(testkit.Rows("<nil> <nil> <nil>")) - - // for from_unixtime - tk.MustExec(`set @@session.time_zone = "+08:00"`) - result = tk.MustQuery(`select from_unixtime(20170101), from_unixtime(20170101.9999999), from_unixtime(20170101.999), from_unixtime(20170101.999, "%Y %D %M %h:%i:%s %x"), from_unixtime(20170101.999, "%Y %D %M %h:%i:%s %x")`) - result.Check(testkit.Rows("1970-08-22 18:48:21 1970-08-22 18:48:22.000000 1970-08-22 18:48:21.999 1970 22nd August 06:48:21 1970 1970 22nd August 06:48:21 1970")) - tk.MustExec(`set @@session.time_zone = "+00:00"`) - result = tk.MustQuery(`select from_unixtime(20170101), from_unixtime(20170101.9999999), from_unixtime(20170101.999), from_unixtime(20170101.999, "%Y %D %M %h:%i:%s %x"), from_unixtime(20170101.999, "%Y %D %M %h:%i:%s %x")`) - result.Check(testkit.Rows("1970-08-22 10:48:21 1970-08-22 10:48:22.000000 1970-08-22 10:48:21.999 1970 22nd August 10:48:21 1970 1970 22nd August 10:48:21 1970")) - tk.MustExec(`set @@session.time_zone = @@global.time_zone`) - - // for extract - result = tk.MustQuery(`select extract(day from '800:12:12'), extract(hour from '800:12:12'), extract(month from 20170101), extract(day_second from '2017-01-01 12:12:12')`) - result.Check(testkit.Rows("12 800 1 1121212")) - result = tk.MustQuery("select extract(day_microsecond from '2017-01-01 12:12:12'), extract(day_microsecond from '01 12:12:12'), extract(day_microsecond from '12:12:12'), extract(day_microsecond from '01 00:00:00.89')") - result.Check(testkit.Rows("1121212000000 361212000000 121212000000 240000890000")) - result = tk.MustQuery("select extract(day_second from '2017-01-01 12:12:12'), extract(day_second from '01 12:12:12'), extract(day_second from '12:12:12'), extract(day_second from '01 00:00:00.89')") - result.Check(testkit.Rows("1121212 361212 121212 240000")) - result = tk.MustQuery("select extract(day_minute from '2017-01-01 12:12:12'), extract(day_minute from '01 12:12:12'), extract(day_minute from '12:12:12'), extract(day_minute from '01 00:00:00.89')") - result.Check(testkit.Rows("11212 3612 1212 2400")) - result = tk.MustQuery("select extract(day_hour from '2017-01-01 12:12:12'), extract(day_hour from '01 12:12:12'), extract(day_hour from '12:12:12'), extract(day_hour from '01 00:00:00.89')") - result.Check(testkit.Rows("112 36 12 24")) - result = tk.MustQuery("select extract(day_microsecond from cast('2017-01-01 12:12:12' as datetime)), extract(day_second from cast('2017-01-01 12:12:12' as datetime)), extract(day_minute from cast('2017-01-01 12:12:12' as datetime)), extract(day_hour from cast('2017-01-01 12:12:12' as datetime))") - result.Check(testkit.Rows("1121212000000 1121212 11212 112")) - - // for adddate, subdate - dateArithmeticalTests := []struct { - Date string - Interval string - Unit string - AddResult string - SubResult string - }{ - {"\"2011-11-11\"", "1", "DAY", "2011-11-12", "2011-11-10"}, - {"NULL", "1", "DAY", "<nil>", "<nil>"}, - {"\"2011-11-11\"", "NULL", "DAY", "<nil>", "<nil>"}, - {"\"2011-11-11 10:10:10\"", "1000", "MICROSECOND", "2011-11-11 10:10:10.001000", "2011-11-11 10:10:09.999000"}, - {"\"2011-11-11 10:10:10\"", "\"10\"", "SECOND", "2011-11-11 10:10:20", "2011-11-11 10:10:00"}, - {"\"2011-11-11 10:10:10\"", "\"10\"", "MINUTE", "2011-11-11 10:20:10", "2011-11-11 10:00:10"}, - {"\"2011-11-11 10:10:10\"", "\"10\"", "HOUR", "2011-11-11 20:10:10", "2011-11-11 00:10:10"}, - {"\"2011-11-11 10:10:10\"", "\"11\"", "DAY", "2011-11-22 10:10:10", "2011-10-31 10:10:10"}, - {"\"2011-11-11 10:10:10\"", "\"2\"", "WEEK", "2011-11-25 10:10:10", "2011-10-28 10:10:10"}, - {"\"2011-11-11 10:10:10\"", "\"2\"", "MONTH", "2012-01-11 10:10:10", "2011-09-11 10:10:10"}, - {"\"2011-11-11 10:10:10\"", "\"4\"", "QUARTER", "2012-11-11 10:10:10", "2010-11-11 10:10:10"}, - {"\"2011-11-11 10:10:10\"", "\"2\"", "YEAR", "2013-11-11 10:10:10", "2009-11-11 10:10:10"}, - {"\"2011-11-11 10:10:10\"", "\"10.00100000\"", "SECOND_MICROSECOND", "2011-11-11 10:10:20.100000", "2011-11-11 10:09:59.900000"}, - {"\"2011-11-11 10:10:10\"", "\"10.0010000000\"", "SECOND_MICROSECOND", "2011-11-11 10:10:30", "2011-11-11 10:09:50"}, - {"\"2011-11-11 10:10:10\"", "\"10.0010000010\"", "SECOND_MICROSECOND", "2011-11-11 10:10:30.000010", "2011-11-11 10:09:49.999990"}, - {"\"2011-11-11 10:10:10\"", "\"10:10.100\"", "MINUTE_MICROSECOND", "2011-11-11 10:20:20.100000", "2011-11-11 09:59:59.900000"}, - {"\"2011-11-11 10:10:10\"", "\"10:10\"", "MINUTE_SECOND", "2011-11-11 10:20:20", "2011-11-11 10:00:00"}, - {"\"2011-11-11 10:10:10\"", "\"10:10:10.100\"", "HOUR_MICROSECOND", "2011-11-11 20:20:20.100000", "2011-11-10 23:59:59.900000"}, - {"\"2011-11-11 10:10:10\"", "\"10:10:10\"", "HOUR_SECOND", "2011-11-11 20:20:20", "2011-11-11 00:00:00"}, - {"\"2011-11-11 10:10:10\"", "\"10:10\"", "HOUR_MINUTE", "2011-11-11 20:20:10", "2011-11-11 00:00:10"}, - {"\"2011-11-11 10:10:10\"", "\"11 10:10:10.100\"", "DAY_MICROSECOND", "2011-11-22 20:20:20.100000", "2011-10-30 23:59:59.900000"}, - {"\"2011-11-11 10:10:10\"", "\"11 10:10:10\"", "DAY_SECOND", "2011-11-22 20:20:20", "2011-10-31 00:00:00"}, - {"\"2011-11-11 10:10:10\"", "\"11 10:10\"", "DAY_MINUTE", "2011-11-22 20:20:10", "2011-10-31 00:00:10"}, - {"\"2011-11-11 10:10:10\"", "\"11 10\"", "DAY_HOUR", "2011-11-22 20:10:10", "2011-10-31 00:10:10"}, - {"\"2011-11-11 10:10:10\"", "\"11-1\"", "YEAR_MONTH", "2022-12-11 10:10:10", "2000-10-11 10:10:10"}, - {"\"2011-11-11 10:10:10\"", "\"11-11\"", "YEAR_MONTH", "2023-10-11 10:10:10", "1999-12-11 10:10:10"}, - {"\"2011-11-11 10:10:10\"", "\"20\"", "DAY", "2011-12-01 10:10:10", "2011-10-22 10:10:10"}, - {"\"2011-11-11 10:10:10\"", "19.88", "DAY", "2011-12-01 10:10:10", "2011-10-22 10:10:10"}, - {"\"2011-11-11 10:10:10\"", "\"19.88\"", "DAY", "2011-11-30 10:10:10", "2011-10-23 10:10:10"}, - {"\"2011-11-11 10:10:10\"", "\"prefix19suffix\"", "DAY", "2011-11-30 10:10:10", "2011-10-23 10:10:10"}, - {"\"2011-11-11 10:10:10\"", "\"20-11\"", "DAY", "2011-12-01 10:10:10", "2011-10-22 10:10:10"}, - {"\"2011-11-11 10:10:10\"", "\"20,11\"", "daY", "2011-12-01 10:10:10", "2011-10-22 10:10:10"}, - {"\"2011-11-11 10:10:10\"", "\"1000\"", "dAy", "2014-08-07 10:10:10", "2009-02-14 10:10:10"}, - {"\"2011-11-11 10:10:10\"", "\"true\"", "Day", "2011-11-12 10:10:10", "2011-11-10 10:10:10"}, - {"\"2011-11-11 10:10:10\"", "true", "Day", "2011-11-12 10:10:10", "2011-11-10 10:10:10"}, - {"\"2011-11-11\"", "1", "DAY", "2011-11-12", "2011-11-10"}, - {"\"2011-11-11\"", "10", "HOUR", "2011-11-11 10:00:00", "2011-11-10 14:00:00"}, - {"\"2011-11-11\"", "10", "MINUTE", "2011-11-11 00:10:00", "2011-11-10 23:50:00"}, - {"\"2011-11-11\"", "10", "SECOND", "2011-11-11 00:00:10", "2011-11-10 23:59:50"}, - {"\"2011-11-11\"", "\"10:10\"", "HOUR_MINUTE", "2011-11-11 10:10:00", "2011-11-10 13:50:00"}, - {"\"2011-11-11\"", "\"10:10:10\"", "HOUR_SECOND", "2011-11-11 10:10:10", "2011-11-10 13:49:50"}, - {"\"2011-11-11\"", "\"10:10:10.101010\"", "HOUR_MICROSECOND", "2011-11-11 10:10:10.101010", "2011-11-10 13:49:49.898990"}, - {"\"2011-11-11\"", "\"10:10\"", "MINUTE_SECOND", "2011-11-11 00:10:10", "2011-11-10 23:49:50"}, - {"\"2011-11-11\"", "\"10:10.101010\"", "MINUTE_MICROSECOND", "2011-11-11 00:10:10.101010", "2011-11-10 23:49:49.898990"}, - {"\"2011-11-11\"", "\"10.101010\"", "SECOND_MICROSECOND", "2011-11-11 00:00:10.101010", "2011-11-10 23:59:49.898990"}, - {"\"2011-11-11 00:00:00\"", "1", "DAY", "2011-11-12 00:00:00", "2011-11-10 00:00:00"}, - {"\"2011-11-11 00:00:00\"", "10", "HOUR", "2011-11-11 10:00:00", "2011-11-10 14:00:00"}, - {"\"2011-11-11 00:00:00\"", "10", "MINUTE", "2011-11-11 00:10:00", "2011-11-10 23:50:00"}, - {"\"2011-11-11 00:00:00\"", "10", "SECOND", "2011-11-11 00:00:10", "2011-11-10 23:59:50"}, - - {"\"2011-11-11\"", "\"abc1000\"", "MICROSECOND", "2011-11-11 00:00:00", "2011-11-11 00:00:00"}, - {"\"20111111 10:10:10\"", "\"1\"", "DAY", "<nil>", "<nil>"}, - {"\"2011-11-11\"", "\"10\"", "SECOND_MICROSECOND", "2011-11-11 00:00:00.100000", "2011-11-10 23:59:59.900000"}, - {"\"2011-11-11\"", "\"10.0000\"", "MINUTE_MICROSECOND", "2011-11-11 00:00:10", "2011-11-10 23:59:50"}, - {"\"2011-11-11\"", "\"10:10:10\"", "MINUTE_MICROSECOND", "2011-11-11 00:10:10.100000", "2011-11-10 23:49:49.900000"}, - - {"cast(\"2011-11-11\" as datetime)", "\"10:10:10\"", "MINUTE_MICROSECOND", "2011-11-11 00:10:10.100000", "2011-11-10 23:49:49.900000"}, - {"cast(\"2011-11-11 00:00:00\" as datetime)", "1", "DAY", "2011-11-12 00:00:00", "2011-11-10 00:00:00"}, - {"cast(\"2011-11-11 00:00:00\" as datetime)", "10", "HOUR", "2011-11-11 10:00:00", "2011-11-10 14:00:00"}, - {"cast(\"2011-11-11 00:00:00\" as datetime)", "10", "MINUTE", "2011-11-11 00:10:00", "2011-11-10 23:50:00"}, - {"cast(\"2011-11-11 00:00:00\" as datetime)", "10", "SECOND", "2011-11-11 00:00:10", "2011-11-10 23:59:50"}, - - {"cast(\"2011-11-11 00:00:00\" as datetime)", "\"1\"", "DAY", "2011-11-12 00:00:00", "2011-11-10 00:00:00"}, - {"cast(\"2011-11-11 00:00:00\" as datetime)", "\"10\"", "HOUR", "2011-11-11 10:00:00", "2011-11-10 14:00:00"}, - {"cast(\"2011-11-11 00:00:00\" as datetime)", "\"10\"", "MINUTE", "2011-11-11 00:10:00", "2011-11-10 23:50:00"}, - {"cast(\"2011-11-11 00:00:00\" as datetime)", "\"10\"", "SECOND", "2011-11-11 00:00:10", "2011-11-10 23:59:50"}, - - {"cast(\"2011-11-11\" as date)", "\"10:10:10\"", "MINUTE_MICROSECOND", "2011-11-11 00:10:10.100000", "2011-11-10 23:49:49.900000"}, - {"cast(\"2011-11-11 00:00:00\" as date)", "1", "DAY", "2011-11-12", "2011-11-10"}, - {"cast(\"2011-11-11 00:00:00\" as date)", "10", "HOUR", "2011-11-11 10:00:00", "2011-11-10 14:00:00"}, - {"cast(\"2011-11-11 00:00:00\" as date)", "10", "MINUTE", "2011-11-11 00:10:00", "2011-11-10 23:50:00"}, - {"cast(\"2011-11-11 00:00:00\" as date)", "10", "SECOND", "2011-11-11 00:00:10", "2011-11-10 23:59:50"}, - - {"cast(\"2011-11-11 00:00:00\" as date)", "\"1\"", "DAY", "2011-11-12", "2011-11-10"}, - {"cast(\"2011-11-11 00:00:00\" as date)", "\"10\"", "HOUR", "2011-11-11 10:00:00", "2011-11-10 14:00:00"}, - {"cast(\"2011-11-11 00:00:00\" as date)", "\"10\"", "MINUTE", "2011-11-11 00:10:00", "2011-11-10 23:50:00"}, - {"cast(\"2011-11-11 00:00:00\" as date)", "\"10\"", "SECOND", "2011-11-11 00:00:10", "2011-11-10 23:59:50"}, - - // interval decimal support - {"\"2011-01-01 00:00:00\"", "10.10", "YEAR_MONTH", "2021-11-01 00:00:00", "2000-03-01 00:00:00"}, - {"\"2011-01-01 00:00:00\"", "10.10", "DAY_HOUR", "2011-01-11 10:00:00", "2010-12-21 14:00:00"}, - {"\"2011-01-01 00:00:00\"", "10.10", "HOUR_MINUTE", "2011-01-01 10:10:00", "2010-12-31 13:50:00"}, - {"\"2011-01-01 00:00:00\"", "10.10", "DAY_MINUTE", "2011-01-01 10:10:00", "2010-12-31 13:50:00"}, - {"\"2011-01-01 00:00:00\"", "10.10", "DAY_SECOND", "2011-01-01 00:10:10", "2010-12-31 23:49:50"}, - {"\"2011-01-01 00:00:00\"", "10.10", "HOUR_SECOND", "2011-01-01 00:10:10", "2010-12-31 23:49:50"}, - {"\"2011-01-01 00:00:00\"", "10.10", "MINUTE_SECOND", "2011-01-01 00:10:10", "2010-12-31 23:49:50"}, - {"\"2011-01-01 00:00:00\"", "10.10", "DAY_MICROSECOND", "2011-01-01 00:00:10.100000", "2010-12-31 23:59:49.900000"}, - {"\"2011-01-01 00:00:00\"", "10.10", "HOUR_MICROSECOND", "2011-01-01 00:00:10.100000", "2010-12-31 23:59:49.900000"}, - {"\"2011-01-01 00:00:00\"", "10.10", "MINUTE_MICROSECOND", "2011-01-01 00:00:10.100000", "2010-12-31 23:59:49.900000"}, - {"\"2011-01-01 00:00:00\"", "10.10", "SECOND_MICROSECOND", "2011-01-01 00:00:10.100000", "2010-12-31 23:59:49.900000"}, - {"\"2011-01-01 00:00:00\"", "10.10", "YEAR", "2021-01-01 00:00:00", "2001-01-01 00:00:00"}, - {"\"2011-01-01 00:00:00\"", "10.10", "QUARTER", "2013-07-01 00:00:00", "2008-07-01 00:00:00"}, - {"\"2011-01-01 00:00:00\"", "10.10", "MONTH", "2011-11-01 00:00:00", "2010-03-01 00:00:00"}, - {"\"2011-01-01 00:00:00\"", "10.10", "WEEK", "2011-03-12 00:00:00", "2010-10-23 00:00:00"}, - {"\"2011-01-01 00:00:00\"", "10.10", "DAY", "2011-01-11 00:00:00", "2010-12-22 00:00:00"}, - {"\"2011-01-01 00:00:00\"", "10.10", "HOUR", "2011-01-01 10:00:00", "2010-12-31 14:00:00"}, - {"\"2011-01-01 00:00:00\"", "10.10", "MINUTE", "2011-01-01 00:10:00", "2010-12-31 23:50:00"}, - {"\"2011-01-01 00:00:00\"", "10.10", "SECOND", "2011-01-01 00:00:10.100000", "2010-12-31 23:59:49.900000"}, - {"\"2011-01-01 00:00:00\"", "10.10", "MICROSECOND", "2011-01-01 00:00:00.000010", "2010-12-31 23:59:59.999990"}, - {"\"2011-01-01 00:00:00\"", "10.90", "MICROSECOND", "2011-01-01 00:00:00.000011", "2010-12-31 23:59:59.999989"}, - - {"\"2009-01-01\"", "6/4", "HOUR_MINUTE", "2009-01-04 12:20:00", "2008-12-28 11:40:00"}, - {"\"2009-01-01\"", "6/0", "HOUR_MINUTE", "<nil>", "<nil>"}, - {"\"1970-01-01 12:00:00\"", "CAST(6/4 AS DECIMAL(3,1))", "HOUR_MINUTE", "1970-01-01 13:05:00", "1970-01-01 10:55:00"}, - // for issue #8077 - {"\"2012-01-02\"", "\"prefix8\"", "HOUR", "2012-01-02 08:00:00", "2012-01-01 16:00:00"}, - {"\"2012-01-02\"", "\"prefix8prefix\"", "HOUR", "2012-01-02 08:00:00", "2012-01-01 16:00:00"}, - {"\"2012-01-02\"", "\"8:00\"", "HOUR", "2012-01-02 08:00:00", "2012-01-01 16:00:00"}, - {"\"2012-01-02\"", "\"8:00:00\"", "HOUR", "2012-01-02 08:00:00", "2012-01-01 16:00:00"}, - } - for _, tc := range dateArithmeticalTests { - addDate := fmt.Sprintf("select adddate(%s, interval %s %s);", tc.Date, tc.Interval, tc.Unit) - subDate := fmt.Sprintf("select subdate(%s, interval %s %s);", tc.Date, tc.Interval, tc.Unit) - result = tk.MustQuery(addDate) - result.Check(testkit.Rows(tc.AddResult)) - result = tk.MustQuery(subDate) - result.Check(testkit.Rows(tc.SubResult)) - } - tk.MustQuery(`select subdate(cast("2000-02-01" as datetime), cast(1 as decimal))`).Check(testkit.Rows("2000-01-31 00:00:00")) - tk.MustQuery(`select subdate(cast("2000-02-01" as datetime), cast(null as decimal))`).Check(testkit.Rows("<nil>")) - tk.MustQuery(`select subdate(cast(null as datetime), cast(1 as decimal))`).Check(testkit.Rows("<nil>")) - tk.MustQuery(`select subdate(cast("2000-02-01" as datetime), cast("xxx" as decimal))`).Check(testkit.Rows("2000-02-01 00:00:00")) - tk.MustQuery(`select subdate(cast("xxx" as datetime), cast(1 as decimal))`).Check(testkit.Rows("<nil>")) - tk.MustQuery(`select subdate(cast(20000101 as SIGNED), cast("1" as decimal))`).Check(testkit.Rows("1999-12-31")) - tk.MustQuery(`select subdate(cast(20000101 as SIGNED), cast("xxx" as decimal))`).Check(testkit.Rows("2000-01-01")) - tk.MustQuery(`select subdate(cast("abc" as SIGNED), cast("1" as decimal))`).Check(testkit.Rows("<nil>")) - tk.MustQuery(`select subdate(cast(null as SIGNED), cast("1" as decimal))`).Check(testkit.Rows("<nil>")) - tk.MustQuery(`select subdate(cast(20000101 as SIGNED), cast(null as decimal))`).Check(testkit.Rows("<nil>")) - tk.MustQuery(`select adddate(cast("2000-02-01" as datetime), cast(1 as decimal))`).Check(testkit.Rows("2000-02-02 00:00:00")) - tk.MustQuery(`select adddate(cast("2000-02-01" as datetime), cast(null as decimal))`).Check(testkit.Rows("<nil>")) - tk.MustQuery(`select adddate(cast(null as datetime), cast(1 as decimal))`).Check(testkit.Rows("<nil>")) - tk.MustQuery(`select adddate(cast("2000-02-01" as datetime), cast("xxx" as decimal))`).Check(testkit.Rows("2000-02-01 00:00:00")) - tk.MustQuery(`select adddate(cast("xxx" as datetime), cast(1 as decimal))`).Check(testkit.Rows("<nil>")) - tk.MustQuery(`select adddate(cast("2000-02-01" as datetime), cast(1 as SIGNED))`).Check(testkit.Rows("2000-02-02 00:00:00")) - tk.MustQuery(`select adddate(cast("2000-02-01" as datetime), cast(null as SIGNED))`).Check(testkit.Rows("<nil>")) - tk.MustQuery(`select adddate(cast(null as datetime), cast(1 as SIGNED))`).Check(testkit.Rows("<nil>")) - tk.MustQuery(`select adddate(cast("2000-02-01" as datetime), cast("xxx" as SIGNED))`).Check(testkit.Rows("2000-02-01 00:00:00")) - tk.MustQuery(`select adddate(cast("xxx" as datetime), cast(1 as SIGNED))`).Check(testkit.Rows("<nil>")) - tk.MustQuery(`select adddate(20100101, cast(1 as decimal))`).Check(testkit.Rows("2010-01-02")) - tk.MustQuery(`select adddate(cast('10:10:10' as time), 1)`).Check(testkit.Rows("34:10:10")) - tk.MustQuery(`select adddate(cast('10:10:10' as time), cast(1 as decimal))`).Check(testkit.Rows("34:10:10")) - - // for localtime, localtimestamp - result = tk.MustQuery(`select localtime() = now(), localtime = now(), localtimestamp() = now(), localtimestamp = now()`) - result.Check(testkit.Rows("1 1 1 1")) - - // for current_timestamp, current_timestamp() - result = tk.MustQuery(`select current_timestamp() = now(), current_timestamp = now()`) - result.Check(testkit.Rows("1 1")) - - // for tidb_parse_tso - tk.MustExec("SET time_zone = '+00:00';") - result = tk.MustQuery(`select tidb_parse_tso(404411537129996288)`) - result.Check(testkit.Rows("2018-11-20 09:53:04.877000")) - result = tk.MustQuery(`select tidb_parse_tso("404411537129996288")`) - result.Check(testkit.Rows("2018-11-20 09:53:04.877000")) - result = tk.MustQuery(`select tidb_parse_tso(1)`) - result.Check(testkit.Rows("1970-01-01 00:00:00.000000")) - result = tk.MustQuery(`select tidb_parse_tso(0)`) - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery(`select tidb_parse_tso(-1)`) - result.Check(testkit.Rows("<nil>")) +func TestOpBuiltin(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() - // for tidb_bounded_staleness - tk.MustExec("SET time_zone = '+00:00';") - t := time.Now().UTC() - ts := oracle.GoTimeToTS(t) - tidbBoundedStalenessTests := []struct { - sql string - injectSafeTS uint64 - expect string - }{ - { - sql: `select tidb_bounded_staleness(DATE_SUB(NOW(), INTERVAL 600 SECOND), DATE_ADD(NOW(), INTERVAL 600 SECOND))`, - injectSafeTS: ts, - expect: t.Format(types.TimeFSPFormat[:len(types.TimeFSPFormat)-3]), - }, - { - sql: `select tidb_bounded_staleness("2021-04-27 12:00:00.000", "2021-04-27 13:00:00.000")`, - injectSafeTS: func() uint64 { - t, err := time.Parse("2006-01-02 15:04:05.000", "2021-04-27 13:30:04.877") - c.Assert(err, IsNil) - return oracle.GoTimeToTS(t) - }(), - expect: "2021-04-27 13:00:00.000", - }, - { - sql: `select tidb_bounded_staleness("2021-04-27 12:00:00.000", "2021-04-27 13:00:00.000")`, - injectSafeTS: func() uint64 { - t, err := time.Parse("2006-01-02 15:04:05.000", "2021-04-27 11:30:04.877") - c.Assert(err, IsNil) - return oracle.GoTimeToTS(t) - }(), - expect: "2021-04-27 12:00:00.000", - }, - { - sql: `select tidb_bounded_staleness("2021-04-27 12:00:00.000", "2021-04-27 11:00:00.000")`, - injectSafeTS: 0, - expect: "<nil>", - }, - // Time is too small. - { - sql: `select tidb_bounded_staleness("0020-04-27 12:00:00.000", "2021-04-27 11:00:00.000")`, - injectSafeTS: 0, - expect: "1970-01-01 00:00:00.000", - }, - // Wrong value. - { - sql: `select tidb_bounded_staleness(1, 2)`, - injectSafeTS: 0, - expect: "<nil>", - }, - { - sql: `select tidb_bounded_staleness("invalid_time_1", "invalid_time_2")`, - injectSafeTS: 0, - expect: "<nil>", - }, - } - for _, test := range tidbBoundedStalenessTests { - c.Assert(failpoint.Enable("github.com/pingcap/tidb/expression/injectSafeTS", - fmt.Sprintf("return(%v)", test.injectSafeTS)), IsNil) - result = tk.MustQuery(test.sql) - result.Check(testkit.Rows(test.expect)) - } - failpoint.Disable("github.com/pingcap/tidb/expression/injectSafeTS") - // test whether tidb_bounded_staleness is deterministic - result = tk.MustQuery(`select tidb_bounded_staleness(NOW(), DATE_ADD(NOW(), INTERVAL 600 SECOND)), tidb_bounded_staleness(NOW(), DATE_ADD(NOW(), INTERVAL 600 SECOND))`) - c.Assert(result.Rows()[0], HasLen, 2) - c.Assert(result.Rows()[0][0], Equals, result.Rows()[0][1]) - preResult := result.Rows()[0][0] - time.Sleep(time.Second) - result = tk.MustQuery(`select tidb_bounded_staleness(NOW(), DATE_ADD(NOW(), INTERVAL 600 SECOND)), tidb_bounded_staleness(NOW(), DATE_ADD(NOW(), INTERVAL 600 SECOND))`) - c.Assert(result.Rows()[0], HasLen, 2) - c.Assert(result.Rows()[0][0], Equals, result.Rows()[0][1]) - c.Assert(result.Rows()[0][0], Not(Equals), preResult) - - // fix issue 10308 - result = tk.MustQuery("select time(\"- -\");") - result.Check(testkit.Rows("00:00:00")) - tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1292 Truncated incorrect time value: '- -'")) - result = tk.MustQuery("select time(\"---1\");") - result.Check(testkit.Rows("00:00:00")) - tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1292 Truncated incorrect time value: '---1'")) - result = tk.MustQuery("select time(\"-- --1\");") - result.Check(testkit.Rows("00:00:00")) - tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1292 Truncated incorrect time value: '-- --1'")) - - // fix issue #15185 - result = tk.MustQuery(`select timestamp(11111.1111)`) - result.Check(testkit.Rows("2001-11-11 00:00:00.0000")) - result = tk.MustQuery(`select timestamp(cast(11111.1111 as decimal(60, 5)))`) - result.Check(testkit.Rows("2001-11-11 00:00:00.00000")) - result = tk.MustQuery(`select timestamp(1021121141105.4324)`) - result.Check(testkit.Rows("0102-11-21 14:11:05.4324")) - result = tk.MustQuery(`select timestamp(cast(1021121141105.4324 as decimal(60, 5)))`) - result.Check(testkit.Rows("0102-11-21 14:11:05.43240")) - result = tk.MustQuery(`select timestamp(21121141105.101)`) - result.Check(testkit.Rows("2002-11-21 14:11:05.101")) - result = tk.MustQuery(`select timestamp(cast(21121141105.101 as decimal(60, 5)))`) - result.Check(testkit.Rows("2002-11-21 14:11:05.10100")) - result = tk.MustQuery(`select timestamp(1121141105.799055)`) - result.Check(testkit.Rows("2000-11-21 14:11:05.799055")) - result = tk.MustQuery(`select timestamp(cast(1121141105.799055 as decimal(60, 5)))`) - result.Check(testkit.Rows("2000-11-21 14:11:05.79906")) - result = tk.MustQuery(`select timestamp(121141105.123)`) - result.Check(testkit.Rows("2000-01-21 14:11:05.123")) - result = tk.MustQuery(`select timestamp(cast(121141105.123 as decimal(60, 5)))`) - result.Check(testkit.Rows("2000-01-21 14:11:05.12300")) - result = tk.MustQuery(`select timestamp(1141105)`) - result.Check(testkit.Rows("0114-11-05 00:00:00")) - result = tk.MustQuery(`select timestamp(cast(1141105 as decimal(60, 5)))`) - result.Check(testkit.Rows("0114-11-05 00:00:00.00000")) - result = tk.MustQuery(`select timestamp(41105.11)`) - result.Check(testkit.Rows("2004-11-05 00:00:00.00")) - result = tk.MustQuery(`select timestamp(cast(41105.11 as decimal(60, 5)))`) - result.Check(testkit.Rows("2004-11-05 00:00:00.00000")) - result = tk.MustQuery(`select timestamp(1105.3)`) - result.Check(testkit.Rows("2000-11-05 00:00:00.0")) - result = tk.MustQuery(`select timestamp(cast(1105.3 as decimal(60, 5)))`) - result.Check(testkit.Rows("2000-11-05 00:00:00.00000")) - result = tk.MustQuery(`select timestamp(105)`) - result.Check(testkit.Rows("2000-01-05 00:00:00")) - result = tk.MustQuery(`select timestamp(cast(105 as decimal(60, 5)))`) - result.Check(testkit.Rows("2000-01-05 00:00:00.00000")) -} - -func (s *testIntegrationSuite) TestOpBuiltin(c *C) { - defer s.cleanEnv(c) - tk := testkit.NewTestKit(c, s.store) + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") // for logicAnd @@ -2525,9 +1028,11 @@ func (s *testIntegrationSuite) TestOpBuiltin(c *C) { result.Check(testkit.Rows("-17000000000000000000")) } -func (s *testIntegrationSuite) TestDatetimeOverflow(c *C) { - defer s.cleanEnv(c) - tk := testkit.NewTestKit(c, s.store) +func TestDatetimeOverflow(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("create table t1 (d date)") @@ -2541,7 +1046,7 @@ func (s *testIntegrationSuite) TestDatetimeOverflow(c *C) { for _, sql := range overflowSQLs { _, err := tk.Exec(sql) - c.Assert(err.Error(), Equals, "[types:1441]Datetime function: datetime field overflow") + require.Error(t, err, "[types:1441]Datetime function: datetime field overflow") } tk.MustExec("set sql_mode=''") @@ -2562,775 +1067,12 @@ func (s *testIntegrationSuite) TestDatetimeOverflow(c *C) { tk.MustQuery(`select DATE_SUB('2008-11-23 22:47:31',INTERVAL -266076160 QUARTER);`).Check(testkit.Rows("<nil>")) } -func (s *testIntegrationSuite2) TestBuiltin(c *C) { - defer s.cleanEnv(c) - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") +func TestIssue11648(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() - // for is true && is false - tk.MustExec("drop table if exists t") - tk.MustExec("create table t (a int, b int, index idx_b (b))") - tk.MustExec("insert t values (1, 1)") - tk.MustExec("insert t values (2, 2)") - tk.MustExec("insert t values (3, 2)") - result := tk.MustQuery("select * from t where b is true") - result.Check(testkit.Rows("1 1", "2 2", "3 2")) - result = tk.MustQuery("select all + a from t where a = 1") - result.Check(testkit.Rows("1")) - result = tk.MustQuery("select * from t where a is false") - result.Check(nil) - result = tk.MustQuery("select * from t where a is not true") - result.Check(nil) - result = tk.MustQuery(`select 1 is true, 0 is true, null is true, "aaa" is true, "" is true, -12.00 is true, 0.0 is true, 0.0000001 is true;`) - result.Check(testkit.Rows("1 0 0 0 0 1 0 1")) - result = tk.MustQuery(`select 1 is false, 0 is false, null is false, "aaa" is false, "" is false, -12.00 is false, 0.0 is false, 0.0000001 is false;`) - result.Check(testkit.Rows("0 1 0 1 1 0 1 0")) - // Issue https://github.com/pingcap/tidb/issues/19986 - result = tk.MustQuery("select 1 from dual where sec_to_time(2/10) is true") - result.Check(testkit.Rows("1")) - result = tk.MustQuery("select 1 from dual where sec_to_time(2/10) is false") - result.Check(nil) - // Issue https://github.com/pingcap/tidb/issues/19999 - result = tk.MustQuery("select 1 from dual where timediff((7/'2014-07-07 02:30:02'),'2012-01-16') is true") - result.Check(testkit.Rows("1")) - result = tk.MustQuery("select 1 from dual where timediff((7/'2014-07-07 02:30:02'),'2012-01-16') is false") - result.Check(nil) - // Issue https://github.com/pingcap/tidb/issues/20001 - result = tk.MustQuery("select 1 from dual where time(0.0001) is true") - result.Check(testkit.Rows("1")) - result = tk.MustQuery("select 1 from dual where time(0.0001) is false") - result.Check(nil) - - // for in - result = tk.MustQuery("select * from t where b in (a)") - result.Check(testkit.Rows("1 1", "2 2")) - result = tk.MustQuery("select * from t where b not in (a)") - result.Check(testkit.Rows("3 2")) - - // test cast - result = tk.MustQuery("select cast(1 as decimal(3,2))") - result.Check(testkit.Rows("1.00")) - result = tk.MustQuery("select cast('1991-09-05 11:11:11' as datetime)") - result.Check(testkit.Rows("1991-09-05 11:11:11")) - result = tk.MustQuery("select cast(cast('1991-09-05 11:11:11' as datetime) as char)") - result.Check(testkit.Rows("1991-09-05 11:11:11")) - result = tk.MustQuery("select cast('11:11:11' as time)") - result.Check(testkit.Rows("11:11:11")) - result = tk.MustQuery("select * from t where a > cast(2 as decimal)") - result.Check(testkit.Rows("3 2")) - result = tk.MustQuery("select cast(-1 as unsigned)") - result.Check(testkit.Rows("18446744073709551615")) - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a decimal(3, 1), b double, c datetime, d time, e int)") - tk.MustExec("insert into t value(12.3, 1.23, '2017-01-01 12:12:12', '12:12:12', 123)") - result = tk.MustQuery("select cast(a as json), cast(b as json), cast(c as json), cast(d as json), cast(e as json) from t") - result.Check(testkit.Rows(`12.3 1.23 "2017-01-01 12:12:12.000000" "12:12:12.000000" 123`)) - result = tk.MustQuery(`select cast(10101000000 as time);`) - result.Check(testkit.Rows("00:00:00")) - result = tk.MustQuery(`select cast(10101001000 as time);`) - result.Check(testkit.Rows("00:10:00")) - result = tk.MustQuery(`select cast(10000000000 as time);`) - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery(`select cast(20171222020005 as time);`) - result.Check(testkit.Rows("02:00:05")) - result = tk.MustQuery(`select cast(8380000 as time);`) - result.Check(testkit.Rows("838:00:00")) - result = tk.MustQuery(`select cast(8390000 as time);`) - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery(`select cast(8386000 as time);`) - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery(`select cast(8385960 as time);`) - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery(`select cast(cast('2017-01-01 01:01:11.12' as date) as datetime(2));`) - result.Check(testkit.Rows("2017-01-01 00:00:00.00")) - result = tk.MustQuery(`select cast(20170118.999 as datetime);`) - result.Check(testkit.Rows("2017-01-18 00:00:00")) - tk.MustQuery(`select convert(a2.a, unsigned int) from (select cast('"9223372036854775808"' as json) as a) as a2;`) - - tk.MustExec(`create table tb5(a bigint(64) unsigned, b double);`) - tk.MustExec(`insert into tb5 (a, b) values (9223372036854776000, 9223372036854776000);`) - tk.MustExec(`insert into tb5 (a, b) select * from (select cast(a as json) as a1, b from tb5) as t where t.a1 = t.b;`) - tk.MustExec(`drop table tb5;`) - - tk.MustExec(`create table tb5(a float(53));`) - tk.MustExec(`insert into tb5(a) values (13835058055282163712);`) - tk.MustQuery(`select convert(t.a1, signed int) from (select convert(a, json) as a1 from tb5) as t`) - tk.MustExec(`drop table tb5;`) - - // test builtinCastIntAsIntSig - // Cast MaxUint64 to unsigned should be -1 - tk.MustQuery("select cast(0xffffffffffffffff as signed);").Check(testkit.Rows("-1")) - tk.MustQuery("select cast(0x9999999999999999999999999999999999999999999 as signed);").Check(testkit.Rows("-1")) - tk.MustExec("create table tb5(a bigint);") - tk.MustExec("set sql_mode=''") - tk.MustExec("insert into tb5(a) values (0xfffffffffffffffffffffffff);") - tk.MustQuery("select * from tb5;").Check(testkit.Rows("9223372036854775807")) - tk.MustExec("drop table tb5;") - - tk.MustExec(`create table tb5(a double);`) - tk.MustExec(`insert into test.tb5 (a) values (18446744073709551616);`) - tk.MustExec(`insert into test.tb5 (a) values (184467440737095516160);`) - result = tk.MustQuery(`select cast(a as unsigned) from test.tb5;`) - // Note: MySQL will return 9223372036854775807, and it should be a bug. - result.Check(testkit.Rows("18446744073709551615", "18446744073709551615")) - tk.MustExec(`drop table tb5;`) - - // test builtinCastIntAsDecimalSig - tk.MustExec(`create table tb5(a bigint(64) unsigned, b decimal(64, 10));`) - tk.MustExec(`insert into tb5 (a, b) values (9223372036854775808, 9223372036854775808);`) - tk.MustExec(`insert into tb5 (select * from tb5 where a = b);`) - result = tk.MustQuery(`select * from tb5;`) - result.Check(testkit.Rows("9223372036854775808 9223372036854775808.0000000000", "9223372036854775808 9223372036854775808.0000000000")) - tk.MustExec(`drop table tb5;`) - - // test builtinCastIntAsRealSig - tk.MustExec(`create table tb5(a bigint(64) unsigned, b double(64, 10));`) - tk.MustExec(`insert into tb5 (a, b) values (13835058000000000000, 13835058000000000000);`) - tk.MustExec(`insert into tb5 (select * from tb5 where a = b);`) - result = tk.MustQuery(`select * from tb5;`) - result.Check(testkit.Rows("13835058000000000000 13835058000000000000", "13835058000000000000 13835058000000000000")) - tk.MustExec(`drop table tb5;`) - - // test builtinCastRealAsIntSig - tk.MustExec(`create table tb5(a double, b float);`) - tk.MustExec(`insert into tb5 (a, b) values (184467440737095516160, 184467440737095516160);`) - tk.MustQuery(`select * from tb5 where cast(a as unsigned int)=0;`).Check(testkit.Rows()) - tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1690 constant 1.844674407370955e+20 overflows bigint")) - _ = tk.MustQuery(`select * from tb5 where cast(b as unsigned int)=0;`) - tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1690 constant 1.844674407370955e+20 overflows bigint")) - tk.MustExec(`drop table tb5;`) - tk.MustExec(`create table tb5(a double, b bigint unsigned);`) - tk.MustExec(`insert into tb5 (a, b) values (18446744073709551616, 18446744073709551615);`) - _ = tk.MustQuery(`select * from tb5 where cast(a as unsigned int)=b;`) - // TODO `obtained string = "[18446744073709552000 18446744073709551615]` - // result.Check(testkit.Rows("18446744073709551616 18446744073709551615")) - tk.MustQuery("show warnings;").Check(testkit.Rows()) - tk.MustExec(`drop table tb5;`) - - // test builtinCastJSONAsIntSig - tk.MustExec(`create table tb5(a json, b bigint unsigned);`) - tk.MustExec(`insert into tb5 (a, b) values ('184467440737095516160', 18446744073709551615);`) - _ = tk.MustQuery(`select * from tb5 where cast(a as unsigned int)=b;`) - tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1690 constant 1.844674407370955e+20 overflows bigint")) - _ = tk.MustQuery(`select * from tb5 where cast(b as unsigned int)=0;`) - tk.MustQuery("show warnings;").Check(testkit.Rows()) - tk.MustExec(`drop table tb5;`) - tk.MustExec(`create table tb5(a json, b bigint unsigned);`) - tk.MustExec(`insert into tb5 (a, b) values ('92233720368547758080', 18446744073709551615);`) - _ = tk.MustQuery(`select * from tb5 where cast(a as signed int)=b;`) - tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1690 constant 9.223372036854776e+19 overflows bigint")) - tk.MustExec(`drop table tb5;`) - - // test builtinCastIntAsStringSig - tk.MustExec(`create table tb5(a bigint(64) unsigned,b varchar(50));`) - tk.MustExec(`insert into tb5(a, b) values (9223372036854775808, '9223372036854775808');`) - tk.MustExec(`insert into tb5(select * from tb5 where a = b);`) - result = tk.MustQuery(`select * from tb5;`) - result.Check(testkit.Rows("9223372036854775808 9223372036854775808", "9223372036854775808 9223372036854775808")) - tk.MustExec(`drop table tb5;`) - - // test builtinCastIntAsDecimalSig - tk.MustExec(`drop table if exists tb5`) - tk.MustExec(`create table tb5 (a decimal(65), b bigint(64) unsigned);`) - tk.MustExec(`insert into tb5 (a, b) values (9223372036854775808, 9223372036854775808);`) - result = tk.MustQuery(`select cast(b as decimal(64)) from tb5 union all select b from tb5;`) - result.Check(testkit.Rows("9223372036854775808", "9223372036854775808")) - tk.MustExec(`drop table tb5`) - - // test builtinCastIntAsRealSig - tk.MustExec(`drop table if exists tb5`) - tk.MustExec(`create table tb5 (a bigint(64) unsigned, b double(64, 10));`) - tk.MustExec(`insert into tb5 (a, b) values (9223372036854775808, 9223372036854775808);`) - result = tk.MustQuery(`select a from tb5 where a = b union all select b from tb5;`) - result.Check(testkit.Rows("9223372036854776000", "9223372036854776000")) - tk.MustExec(`drop table tb5`) - - // Test corner cases of cast string as datetime - result = tk.MustQuery(`select cast("170102034" as datetime);`) - result.Check(testkit.Rows("2017-01-02 03:04:00")) - result = tk.MustQuery(`select cast("1701020304" as datetime);`) - result.Check(testkit.Rows("2017-01-02 03:04:00")) - result = tk.MustQuery(`select cast("1701020304." as datetime);`) - result.Check(testkit.Rows("2017-01-02 03:04:00")) - result = tk.MustQuery(`select cast("1701020304.1" as datetime);`) - result.Check(testkit.Rows("2017-01-02 03:04:01")) - result = tk.MustQuery(`select cast("1701020304.111" as datetime);`) - result.Check(testkit.Rows("2017-01-02 03:04:11")) - tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1292 Truncated incorrect datetime value: '1701020304.111'")) - result = tk.MustQuery(`select cast("17011" as datetime);`) - result.Check(testkit.Rows("2017-01-01 00:00:00")) - result = tk.MustQuery(`select cast("150101." as datetime);`) - result.Check(testkit.Rows("2015-01-01 00:00:00")) - result = tk.MustQuery(`select cast("150101.a" as datetime);`) - result.Check(testkit.Rows("2015-01-01 00:00:00")) - tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1292 Truncated incorrect datetime value: '150101.a'")) - result = tk.MustQuery(`select cast("150101.1a" as datetime);`) - result.Check(testkit.Rows("2015-01-01 01:00:00")) - tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1292 Truncated incorrect datetime value: '150101.1a'")) - result = tk.MustQuery(`select cast("150101.1a1" as datetime);`) - result.Check(testkit.Rows("2015-01-01 01:00:00")) - tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1292 Truncated incorrect datetime value: '150101.1a1'")) - result = tk.MustQuery(`select cast("1101010101.111" as datetime);`) - result.Check(testkit.Rows("2011-01-01 01:01:11")) - tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1292 Truncated incorrect datetime value: '1101010101.111'")) - result = tk.MustQuery(`select cast("1101010101.11aaaaa" as datetime);`) - result.Check(testkit.Rows("2011-01-01 01:01:11")) - tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1292 Truncated incorrect datetime value: '1101010101.11aaaaa'")) - result = tk.MustQuery(`select cast("1101010101.a1aaaaa" as datetime);`) - result.Check(testkit.Rows("2011-01-01 01:01:00")) - tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1292 Truncated incorrect datetime value: '1101010101.a1aaaaa'")) - result = tk.MustQuery(`select cast("1101010101.11" as datetime);`) - result.Check(testkit.Rows("2011-01-01 01:01:11")) - tk.MustQuery("select @@warning_count;").Check(testkit.Rows("0")) - result = tk.MustQuery(`select cast("1101010101.111" as datetime);`) - result.Check(testkit.Rows("2011-01-01 01:01:11")) - tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1292 Truncated incorrect datetime value: '1101010101.111'")) - result = tk.MustQuery(`select cast("970101.111" as datetime);`) - result.Check(testkit.Rows("1997-01-01 11:01:00")) - tk.MustQuery("select @@warning_count;").Check(testkit.Rows("0")) - result = tk.MustQuery(`select cast("970101.11111" as datetime);`) - result.Check(testkit.Rows("1997-01-01 11:11:01")) - tk.MustQuery("select @@warning_count;").Check(testkit.Rows("0")) - result = tk.MustQuery(`select cast("970101.111a1" as datetime);`) - result.Check(testkit.Rows("1997-01-01 11:01:00")) - tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1292 Truncated incorrect datetime value: '970101.111a1'")) - - // for ISNULL - tk.MustExec("drop table if exists t") - tk.MustExec("create table t (a int, b int, c int, d char(10), e datetime, f float, g decimal(10, 3))") - tk.MustExec("insert t values (1, 0, null, null, null, null, null)") - result = tk.MustQuery("select ISNULL(a), ISNULL(b), ISNULL(c), ISNULL(d), ISNULL(e), ISNULL(f), ISNULL(g) from t") - result.Check(testkit.Rows("0 0 1 1 1 1 1")) - - // fix issue #3942 - result = tk.MustQuery("select cast('-24 100:00:00' as time);") - result.Check(testkit.Rows("-676:00:00")) - result = tk.MustQuery("select cast('12:00:00.000000' as datetime);") - result.Check(testkit.Rows("2012-00-00 00:00:00")) - result = tk.MustQuery("select cast('-34 100:00:00' as time);") - result.Check(testkit.Rows("-838:59:59")) - - // fix issue #4324. cast decimal/int/string to time compatibility. - invalidTimes := []string{ - "10009010", - "239010", - "233070", - "23:90:10", - "23:30:70", - "239010.2", - "233070.8", - } - tk.MustExec("DROP TABLE IF EXISTS t;") - tk.MustExec("CREATE TABLE t (ix TIME);") - tk.MustExec("SET SQL_MODE='';") - for _, invalidTime := range invalidTimes { - msg := fmt.Sprintf("Warning 1292 Truncated incorrect time value: '%s'", invalidTime) - result = tk.MustQuery(fmt.Sprintf("select cast('%s' as time);", invalidTime)) - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("show warnings") - result.Check(testkit.Rows(msg)) - _, err := tk.Exec(fmt.Sprintf("insert into t select cast('%s' as time);", invalidTime)) - c.Assert(err, IsNil) - result = tk.MustQuery("show warnings") - result.Check(testkit.Rows(msg)) - } - tk.MustExec("set sql_mode = 'STRICT_TRANS_TABLES'") - for _, invalidTime := range invalidTimes { - msg := fmt.Sprintf("Warning 1292 Truncated incorrect time value: '%s'", invalidTime) - result = tk.MustQuery(fmt.Sprintf("select cast('%s' as time);", invalidTime)) - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("show warnings") - result.Check(testkit.Rows(msg)) - _, err := tk.Exec(fmt.Sprintf("insert into t select cast('%s' as time);", invalidTime)) - c.Assert(err.Error(), Equals, fmt.Sprintf("[types:1292]Truncated incorrect time value: '%s'", invalidTime)) - } - - // Fix issue #3691, cast compatibility. - result = tk.MustQuery("select cast('18446744073709551616' as unsigned);") - result.Check(testkit.Rows("18446744073709551615")) - result = tk.MustQuery("select cast('18446744073709551616' as signed);") - result.Check(testkit.Rows("-1")) - result = tk.MustQuery("select cast('9223372036854775808' as signed);") - result.Check(testkit.Rows("-9223372036854775808")) - result = tk.MustQuery("select cast('9223372036854775809' as signed);") - result.Check(testkit.Rows("-9223372036854775807")) - result = tk.MustQuery("select cast('9223372036854775807' as signed);") - result.Check(testkit.Rows("9223372036854775807")) - result = tk.MustQuery("select cast('18446744073709551615' as signed);") - result.Check(testkit.Rows("-1")) - result = tk.MustQuery("select cast('18446744073709551614' as signed);") - result.Check(testkit.Rows("-2")) - result = tk.MustQuery("select cast(18446744073709551615 as unsigned);") - result.Check(testkit.Rows("18446744073709551615")) - result = tk.MustQuery("select cast(18446744073709551616 as unsigned);") - result.Check(testkit.Rows("18446744073709551615")) - result = tk.MustQuery("select cast(18446744073709551616 as signed);") - result.Check(testkit.Rows("9223372036854775807")) - result = tk.MustQuery("select cast(18446744073709551617 as signed);") - result.Check(testkit.Rows("9223372036854775807")) - result = tk.MustQuery("select cast(18446744073709551615 as signed);") - result.Check(testkit.Rows("-1")) - result = tk.MustQuery("select cast(18446744073709551614 as signed);") - result.Check(testkit.Rows("-2")) - result = tk.MustQuery("select cast(-18446744073709551616 as signed);") - result.Check(testkit.Rows("-9223372036854775808")) - result = tk.MustQuery("select cast(18446744073709551614.9 as unsigned);") // Round up - result.Check(testkit.Rows("18446744073709551615")) - result = tk.MustQuery("select cast(18446744073709551614.4 as unsigned);") // Round down - result.Check(testkit.Rows("18446744073709551614")) - result = tk.MustQuery("select cast(-9223372036854775809 as signed);") - result.Check(testkit.Rows("-9223372036854775808")) - result = tk.MustQuery("select cast(-9223372036854775809 as unsigned);") - result.Check(testkit.Rows("0")) - result = tk.MustQuery("select cast(-9223372036854775808 as unsigned);") - result.Check(testkit.Rows("9223372036854775808")) - result = tk.MustQuery("select cast('-9223372036854775809' as unsigned);") - result.Check(testkit.Rows("9223372036854775808")) - result = tk.MustQuery("select cast('-9223372036854775807' as unsigned);") - result.Check(testkit.Rows("9223372036854775809")) - result = tk.MustQuery("select cast('-2' as unsigned);") - result.Check(testkit.Rows("18446744073709551614")) - result = tk.MustQuery("select cast(cast(1-2 as unsigned) as signed integer);") - result.Check(testkit.Rows("-1")) - result = tk.MustQuery("select cast(1 as signed int)") - result.Check(testkit.Rows("1")) - - // test cast as double - result = tk.MustQuery("select cast(1 as double)") - result.Check(testkit.Rows("1")) - result = tk.MustQuery("select cast(cast(12345 as unsigned) as double)") - result.Check(testkit.Rows("12345")) - result = tk.MustQuery("select cast(1.1 as double)") - result.Check(testkit.Rows("1.1")) - result = tk.MustQuery("select cast(-1.1 as double)") - result.Check(testkit.Rows("-1.1")) - result = tk.MustQuery("select cast('123.321' as double)") - result.Check(testkit.Rows("123.321")) - result = tk.MustQuery("select cast('12345678901234567890' as double) = 1.2345678901234567e19") - result.Check(testkit.Rows("1")) - result = tk.MustQuery("select cast(-1 as double)") - result.Check(testkit.Rows("-1")) - result = tk.MustQuery("select cast(null as double)") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("select cast(12345678901234567890 as double) = 1.2345678901234567e19") - result.Check(testkit.Rows("1")) - result = tk.MustQuery("select cast(cast(-1 as unsigned) as double) = 1.8446744073709552e19") - result.Check(testkit.Rows("1")) - result = tk.MustQuery("select cast(1e100 as double) = 1e100") - result.Check(testkit.Rows("1")) - result = tk.MustQuery("select cast(123456789012345678901234567890 as double) = 1.2345678901234568e29") - result.Check(testkit.Rows("1")) - result = tk.MustQuery("select cast(0x12345678 as double)") - result.Check(testkit.Rows("305419896")) - - // test cast as float - result = tk.MustQuery("select cast(1 as float)") - result.Check(testkit.Rows("1")) - result = tk.MustQuery("select cast(cast(12345 as unsigned) as float)") - result.Check(testkit.Rows("12345")) - result = tk.MustQuery("select cast(1.1 as float) = 1.1") - result.Check(testkit.Rows("1")) - result = tk.MustQuery("select cast(-1.1 as float) = -1.1") - result.Check(testkit.Rows("1")) - result = tk.MustQuery("select cast('123.321' as float) =123.321") - result.Check(testkit.Rows("1")) - result = tk.MustQuery("select cast('12345678901234567890' as float) = 1.2345678901234567e19") - result.Check(testkit.Rows("1")) - result = tk.MustQuery("select cast(-1 as float)") - result.Check(testkit.Rows("-1")) - result = tk.MustQuery("select cast(null as float)") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("select cast(12345678901234567890 as float) = 1.2345678901234567e19") - result.Check(testkit.Rows("1")) - result = tk.MustQuery("select cast(cast(-1 as unsigned) as float) = 1.8446744073709552e19") - result.Check(testkit.Rows("1")) - result = tk.MustQuery("select cast(1e100 as float(40)) = 1e100") - result.Check(testkit.Rows("1")) - result = tk.MustQuery("select cast(123456789012345678901234567890 as float(40)) = 1.2345678901234568e29") - result.Check(testkit.Rows("1")) - result = tk.MustQuery("select cast(0x12345678 as float(40)) = 305419896") - result.Check(testkit.Rows("1")) - - // test cast as real - result = tk.MustQuery("select cast(1 as real)") - result.Check(testkit.Rows("1")) - result = tk.MustQuery("select cast(cast(12345 as unsigned) as real)") - result.Check(testkit.Rows("12345")) - result = tk.MustQuery("select cast(1.1 as real) = 1.1") - result.Check(testkit.Rows("1")) - result = tk.MustQuery("select cast(-1.1 as real) = -1.1") - result.Check(testkit.Rows("1")) - result = tk.MustQuery("select cast('123.321' as real) =123.321") - result.Check(testkit.Rows("1")) - result = tk.MustQuery("select cast('12345678901234567890' as real) = 1.2345678901234567e19") - result.Check(testkit.Rows("1")) - result = tk.MustQuery("select cast(-1 as real)") - result.Check(testkit.Rows("-1")) - result = tk.MustQuery("select cast(null as real)") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("select cast(12345678901234567890 as real) = 1.2345678901234567e19") - result.Check(testkit.Rows("1")) - result = tk.MustQuery("select cast(cast(-1 as unsigned) as real) = 1.8446744073709552e19") - result.Check(testkit.Rows("1")) - result = tk.MustQuery("select cast(1e100 as real) = 1e100") - result.Check(testkit.Rows("1")) - result = tk.MustQuery("select cast(123456789012345678901234567890 as real) = 1.2345678901234568e29") - result.Check(testkit.Rows("1")) - result = tk.MustQuery("select cast(0x12345678 as real) = 305419896") - result.Check(testkit.Rows("1")) - - // test cast time as decimal overflow - tk.MustExec("drop table if exists t1") - tk.MustExec("create table t1(s1 time);") - tk.MustExec("insert into t1 values('11:11:11');") - result = tk.MustQuery("select cast(s1 as decimal(7, 2)) from t1;") - result.Check(testkit.Rows("99999.99")) - result = tk.MustQuery("select cast(s1 as decimal(8, 2)) from t1;") - result.Check(testkit.Rows("111111.00")) - _, err := tk.Exec("insert into t1 values(cast('111111.00' as decimal(7, 2)));") - c.Assert(err, NotNil) - - result = tk.MustQuery(`select CAST(0x8fffffffffffffff as signed) a, - CAST(0xfffffffffffffffe as signed) b, - CAST(0xffffffffffffffff as unsigned) c;`) - result.Check(testkit.Rows("-8070450532247928833 -2 18446744073709551615")) - - result = tk.MustQuery(`select cast("1:2:3" as TIME) = "1:02:03"`) - result.Check(testkit.Rows("0")) - - // fixed issue #3471 - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a time(6));") - tk.MustExec("insert into t value('12:59:59.999999')") - result = tk.MustQuery("select cast(a as signed) from t") - result.Check(testkit.Rows("130000")) - - // fixed issue #3762 - result = tk.MustQuery("select -9223372036854775809;") - result.Check(testkit.Rows("-9223372036854775809")) - result = tk.MustQuery("select --9223372036854775809;") - result.Check(testkit.Rows("9223372036854775809")) - result = tk.MustQuery("select -9223372036854775808;") - result.Check(testkit.Rows("-9223372036854775808")) - - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a bigint(30));") - _, err = tk.Exec("insert into t values(-9223372036854775809)") - c.Assert(err, NotNil) - - // test case decimal precision less than the scale. - _, err = tk.Exec("select cast(12.1 as decimal(3, 4));") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[types:1427]For float(M,D), double(M,D) or decimal(M,D), M must be >= D (column '12.1').") - - // test unhex and hex - result = tk.MustQuery("select unhex('4D7953514C')") - result.Check(testkit.Rows("MySQL")) - result = tk.MustQuery("select unhex(hex('string'))") - result.Check(testkit.Rows("string")) - result = tk.MustQuery("select unhex('ggg')") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("select unhex(-1)") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("select hex(unhex('1267'))") - result.Check(testkit.Rows("1267")) - result = tk.MustQuery("select hex(unhex(1267))") - result.Check(testkit.Rows("1267")) - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a binary(8))") - tk.MustExec(`insert into t values('test')`) - result = tk.MustQuery("select hex(a) from t") - result.Check(testkit.Rows("7465737400000000")) - result = tk.MustQuery("select unhex(a) from t") - result.Check(testkit.Rows("<nil>")) - - // select from_unixtime - // NOTE (#17013): make from_unixtime stable in different timezone: the result of from_unixtime - // depends on the local time zone of the test environment, thus the result checking must - // consider the time zone convert. - tz := tk.Se.GetSessionVars().StmtCtx.TimeZone - result = tk.MustQuery("select from_unixtime(1451606400)") - unixTime := time.Unix(1451606400, 0).In(tz).String()[:19] - result.Check(testkit.Rows(unixTime)) - result = tk.MustQuery("select from_unixtime(14516064000/10)") - result.Check(testkit.Rows(fmt.Sprintf("%s.0000", unixTime))) - result = tk.MustQuery("select from_unixtime('14516064000'/10)") - result.Check(testkit.Rows(fmt.Sprintf("%s.000000", unixTime))) - result = tk.MustQuery("select from_unixtime(cast(1451606400 as double))") - result.Check(testkit.Rows(fmt.Sprintf("%s.000000", unixTime))) - result = tk.MustQuery("select from_unixtime(cast(cast(1451606400 as double) as DECIMAL))") - result.Check(testkit.Rows(unixTime)) - result = tk.MustQuery("select from_unixtime(cast(cast(1451606400 as double) as DECIMAL(65,1)))") - result.Check(testkit.Rows(fmt.Sprintf("%s.0", unixTime))) - result = tk.MustQuery("select from_unixtime(1451606400.123456)") - unixTime = time.Unix(1451606400, 123456000).In(tz).String()[:26] - result.Check(testkit.Rows(unixTime)) - result = tk.MustQuery("select from_unixtime(1451606400.1234567)") - unixTime = time.Unix(1451606400, 123456700).In(tz).Round(time.Microsecond).Format("2006-01-02 15:04:05.000000")[:26] - result.Check(testkit.Rows(unixTime)) - result = tk.MustQuery("select from_unixtime(1451606400.999999)") - unixTime = time.Unix(1451606400, 999999000).In(tz).String()[:26] - result.Check(testkit.Rows(unixTime)) - result = tk.MustQuery("select from_unixtime(1511247196661)") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("select from_unixtime('1451606400.123');") - unixTime = time.Unix(1451606400, 0).In(tz).String()[:19] - result.Check(testkit.Rows(fmt.Sprintf("%s.123000", unixTime))) - - tk.MustExec("drop table if exists t;") - tk.MustExec("create table t(a int);") - tk.MustExec("insert into t value(1451606400);") - result = tk.MustQuery("select from_unixtime(a) from t;") - result.Check(testkit.Rows(unixTime)) - - // test strcmp - result = tk.MustQuery("select strcmp('abc', 'def')") - result.Check(testkit.Rows("-1")) - result = tk.MustQuery("select strcmp('abc', 'aba')") - result.Check(testkit.Rows("1")) - result = tk.MustQuery("select strcmp('abc', 'abc')") - result.Check(testkit.Rows("0")) - result = tk.MustQuery("select substr(null, 1, 2)") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("select substr('123', null, 2)") - result.Check(testkit.Rows("<nil>")) - result = tk.MustQuery("select substr('123', 1, null)") - result.Check(testkit.Rows("<nil>")) - - // for case - tk.MustExec("drop table if exists t") - tk.MustExec("create table t (a varchar(255), b int)") - tk.MustExec("insert t values ('str1', 1)") - result = tk.MustQuery("select * from t where a = case b when 1 then 'str1' when 2 then 'str2' end") - result.Check(testkit.Rows("str1 1")) - result = tk.MustQuery("select * from t where a = case b when 1 then 'str2' when 2 then 'str3' end") - result.Check(nil) - tk.MustExec("insert t values ('str2', 2)") - result = tk.MustQuery("select * from t where a = case b when 2 then 'str2' when 3 then 'str3' end") - result.Check(testkit.Rows("str2 2")) - tk.MustExec("insert t values ('str3', 3)") - result = tk.MustQuery("select * from t where a = case b when 4 then 'str4' when 5 then 'str5' else 'str3' end") - result.Check(testkit.Rows("str3 3")) - result = tk.MustQuery("select * from t where a = case b when 4 then 'str4' when 5 then 'str5' else 'str6' end") - result.Check(nil) - result = tk.MustQuery("select * from t where a = case when b then 'str3' when 1 then 'str1' else 'str2' end") - result.Check(testkit.Rows("str3 3")) - tk.MustExec("delete from t") - tk.MustExec("insert t values ('str2', 0)") - result = tk.MustQuery("select * from t where a = case when b then 'str3' when 0 then 'str1' else 'str2' end") - result.Check(testkit.Rows("str2 0")) - tk.MustExec("insert t values ('str1', null)") - result = tk.MustQuery("select * from t where a = case b when null then 'str3' when 10 then 'str1' else 'str2' end") - result.Check(testkit.Rows("str2 0")) - result = tk.MustQuery("select * from t where a = case null when b then 'str3' when 10 then 'str1' else 'str2' end") - result.Check(testkit.Rows("str2 0")) - tk.MustExec("insert t values (null, 4)") - result = tk.MustQuery("select * from t where b < case a when null then 0 when 'str2' then 0 else 9 end") - result.Check(testkit.Rows("<nil> 4")) - result = tk.MustQuery("select * from t where b = case when a is null then 4 when a = 'str5' then 7 else 9 end") - result.Check(testkit.Rows("<nil> 4")) - result = tk.MustQuery(`SELECT -Max(+23) * -+Cast(--10 AS SIGNED) * -CASE - WHEN 0 > 85 THEN NULL - WHEN NOT - CASE +55 - WHEN +( +82 ) + -89 * -69 THEN +Count(-88) - WHEN +CASE 57 - WHEN +89 THEN -89 * Count(*) - WHEN 17 THEN NULL - END THEN ( -10 ) - END IS NULL THEN NULL - ELSE 83 + 48 - END AS col0; `) - result.Check(testkit.Rows("-30130")) - - // return type of case when expr should not include NotNullFlag. issue-23036 - tk.MustExec("drop table if exists t1") - tk.MustExec("create table t1(c1 int not null)") - tk.MustExec("insert into t1 values(1)") - result = tk.MustQuery("select (case when null then c1 end) is null from t1") - result.Check(testkit.Rows("1")) - result = tk.MustQuery("select (case when null then c1 end) is not null from t1") - result.Check(testkit.Rows("0")) - - // test warnings - tk.MustQuery("select case when b=0 then 1 else 1/b end from t") - tk.MustQuery("show warnings").Check(testkit.Rows()) - tk.MustQuery("select if(b=0, 1, 1/b) from t") - tk.MustQuery("show warnings").Check(testkit.Rows()) - tk.MustQuery("select ifnull(b, b/0) from t") - tk.MustQuery("show warnings").Check(testkit.Rows()) - - tk.MustQuery("select case when 1 then 1 else 1/0 end") - tk.MustQuery("show warnings").Check(testkit.Rows()) - tk.MustQuery(" select if(1,1,1/0)") - tk.MustQuery("show warnings").Check(testkit.Rows()) - tk.MustQuery("select ifnull(1, 1/0)") - tk.MustQuery("show warnings").Check(testkit.Rows()) - - tk.MustExec("delete from t") - tk.MustExec("insert t values ('str2', 0)") - tk.MustQuery("select case when b < 1 then 1 else 1/0 end from t") - tk.MustQuery("show warnings").Check(testkit.Rows()) - tk.MustQuery("select case when b < 1 then 1 when 1/0 then b else 1/0 end from t") - tk.MustQuery("show warnings").Check(testkit.Rows()) - tk.MustQuery("select if(b < 1 , 1, 1/0) from t") - tk.MustQuery("show warnings").Check(testkit.Rows()) - tk.MustQuery("select ifnull(b, 1/0) from t") - tk.MustQuery("show warnings").Check(testkit.Rows()) - tk.MustQuery("select COALESCE(1, b, b/0) from t") - tk.MustQuery("show warnings").Check(testkit.Rows()) - tk.MustQuery("select 0 and b/0 from t") - tk.MustQuery("show warnings").Check(testkit.Rows()) - tk.MustQuery("select 1 or b/0 from t") - tk.MustQuery("show warnings").Check(testkit.Rows()) - - tk.MustQuery("select 1 or 1/0") - tk.MustQuery("show warnings").Check(testkit.Rows()) - tk.MustQuery("select 0 and 1/0") - tk.MustQuery("show warnings").Check(testkit.Rows()) - tk.MustQuery("select COALESCE(1, 1/0)") - tk.MustQuery("show warnings").Check(testkit.Rows()) - tk.MustQuery("select interval(1,0,1,2,1/0)") - tk.MustQuery("show warnings").Check(testkit.Rows()) - - tk.MustQuery("select case 2.0 when 2.0 then 3.0 when 3.0 then 2.0 end").Check(testkit.Rows("3.0")) - tk.MustQuery("select case 2.0 when 3.0 then 2.0 when 4.0 then 3.0 else 5.0 end").Check(testkit.Rows("5.0")) - tk.MustQuery("select case cast('2011-01-01' as date) when cast('2011-01-01' as date) then cast('2011-02-02' as date) end").Check(testkit.Rows("2011-02-02")) - tk.MustQuery("select case cast('2012-01-01' as date) when cast('2011-01-01' as date) then cast('2011-02-02' as date) else cast('2011-03-03' as date) end").Check(testkit.Rows("2011-03-03")) - tk.MustQuery("select case cast('10:10:10' as time) when cast('10:10:10' as time) then cast('11:11:11' as time) end").Check(testkit.Rows("11:11:11")) - tk.MustQuery("select case cast('10:10:13' as time) when cast('10:10:10' as time) then cast('11:11:11' as time) else cast('22:22:22' as time) end").Check(testkit.Rows("22:22:22")) - - // for cast - result = tk.MustQuery("select cast(1234 as char(3))") - result.Check(testkit.Rows("123")) - result = tk.MustQuery("select cast(1234 as char(0))") - result.Check(testkit.Rows("")) - result = tk.MustQuery("show warnings") - result.Check(testkit.Rows("Warning 1406 Data Too Long, field len 0, data len 4")) - result = tk.MustQuery("select CAST( - 8 AS DECIMAL ) * + 52 + 87 < - 86") - result.Check(testkit.Rows("1")) - - // for char - result = tk.MustQuery("select char(97, 100, 256, 89)") - result.Check(testkit.Rows("ad\x01\x00Y")) - result = tk.MustQuery("select char(97, null, 100, 256, 89)") - result.Check(testkit.Rows("ad\x01\x00Y")) - result = tk.MustQuery("select char(97, null, 100, 256, 89 using utf8)") - result.Check(testkit.Rows("ad\x01\x00Y")) - result = tk.MustQuery("select char(97, null, 100, 256, 89 using ascii)") - result.Check(testkit.Rows("ad\x01\x00Y")) - err = tk.ExecToErr("select char(97, null, 100, 256, 89 using tidb)") - c.Assert(err.Error(), Equals, "[parser:1115]Unknown character set: 'tidb'") - - // issue 3884 - tk.MustExec("drop table if exists t") - tk.MustExec("CREATE TABLE t (c1 date, c2 datetime, c3 timestamp, c4 time, c5 year);") - tk.MustExec("INSERT INTO t values ('2000-01-01', '2000-01-01 12:12:12', '2000-01-01 12:12:12', '12:12:12', '2000');") - tk.MustExec("INSERT INTO t values ('2000-02-01', '2000-02-01 12:12:12', '2000-02-01 12:12:12', '13:12:12', 2000);") - tk.MustExec("INSERT INTO t values ('2000-03-01', '2000-03-01', '2000-03-01 12:12:12', '1 12:12:12', 2000);") - tk.MustExec("INSERT INTO t SET c1 = '2000-04-01', c2 = '2000-04-01', c3 = '2000-04-01 12:12:12', c4 = '-1 13:12:12', c5 = 2000;") - result = tk.MustQuery("SELECT c4 FROM t where c4 < '-13:12:12';") - result.Check(testkit.Rows("-37:12:12")) - result = tk.MustQuery(`SELECT 1 DIV - - 28 + ( - SUM( - + 25 ) ) * - CASE - 18 WHEN 44 THEN NULL ELSE - 41 + 32 + + - 70 - + COUNT( - 95 ) * 15 END + 92`) - result.Check(testkit.Rows("2442")) - - // for regexp, rlike - // https://github.com/pingcap/tidb/issues/4080 - tk.MustExec(`drop table if exists t;`) - tk.MustExec(`create table t (a char(10), b varchar(10), c binary(10), d varbinary(10));`) - tk.MustExec(`insert into t values ('text','text','text','text');`) - result = tk.MustQuery(`select a regexp 'xt' from t;`) - result.Check(testkit.Rows("1")) - result = tk.MustQuery(`select b regexp 'xt' from t;`) - result.Check(testkit.Rows("1")) - result = tk.MustQuery(`select b regexp binary 'Xt' from t;`) - result.Check(testkit.Rows("0")) - result = tk.MustQuery(`select c regexp 'Xt' from t;`) - result.Check(testkit.Rows("0")) - result = tk.MustQuery(`select d regexp 'Xt' from t;`) - result.Check(testkit.Rows("0")) - result = tk.MustQuery(`select a rlike 'xt' from t;`) - result.Check(testkit.Rows("1")) - result = tk.MustQuery(`select a rlike binary 'Xt' from t;`) - result.Check(testkit.Rows("0")) - result = tk.MustQuery(`select b rlike 'xt' from t;`) - result.Check(testkit.Rows("1")) - result = tk.MustQuery(`select c rlike 'Xt' from t;`) - result.Check(testkit.Rows("0")) - result = tk.MustQuery(`select d rlike 'Xt' from t;`) - result.Check(testkit.Rows("0")) - result = tk.MustQuery(`select 'a' regexp 'A', 'a' regexp binary 'A'`) - result.Check(testkit.Rows("0 0")) - - // testCase is for like and regexp - type testCase struct { - pattern string - val string - result int - } - patternMatching := func(c *C, tk *testkit.TestKit, queryOp string, data []testCase) { - tk.MustExec("drop table if exists t") - tk.MustExec("create table t (a varchar(255), b int)") - for i, d := range data { - tk.MustExec(fmt.Sprintf("insert into t values('%s', %d)", d.val, i)) - result = tk.MustQuery(fmt.Sprintf("select * from t where a %s '%s'", queryOp, d.pattern)) - if d.result == 1 { - rowStr := fmt.Sprintf("%s %d", d.val, i) - result.Check(testkit.Rows(rowStr)) - } else { - result.Check(nil) - } - tk.MustExec(fmt.Sprintf("delete from t where b = %d", i)) - } - } - // for like - likeTests := []testCase{ - {"a", "a", 1}, - {"a", "b", 0}, - {"aA", "Aa", 0}, - {`aA%`, "aAab", 1}, - {"aA_", "Aaab", 0}, - {"Aa_", "Aab", 1}, - {"", "", 1}, - {"", "a", 0}, - } - patternMatching(c, tk, "like", likeTests) - // for regexp - likeTests = []testCase{ - {"^$", "a", 0}, - {"a", "a", 1}, - {"a", "b", 0}, - {"aA", "aA", 1}, - {".", "a", 1}, - {"^.$", "ab", 0}, - {"..", "b", 0}, - {".ab", "aab", 1}, - {"ab.", "abcd", 1}, - {".*", "abcd", 1}, - } - patternMatching(c, tk, "regexp", likeTests) - - // for #9838 - result = tk.MustQuery("select cast(1 as signed) + cast(9223372036854775807 as unsigned);") - result.Check(testkit.Rows("9223372036854775808")) - result = tk.MustQuery("select cast(9223372036854775807 as unsigned) + cast(1 as signed);") - result.Check(testkit.Rows("9223372036854775808")) - err = tk.QueryToErr("select cast(9223372036854775807 as signed) + cast(9223372036854775809 as unsigned);") - c.Assert(err, NotNil) - err = tk.QueryToErr("select cast(9223372036854775809 as unsigned) + cast(9223372036854775807 as signed);") - c.Assert(err, NotNil) - err = tk.QueryToErr("select cast(-9223372036854775807 as signed) + cast(9223372036854775806 as unsigned);") - c.Assert(err, NotNil) - err = tk.QueryToErr("select cast(9223372036854775806 as unsigned) + cast(-9223372036854775807 as signed);") - c.Assert(err, NotNil) - - result = tk.MustQuery(`select 1 / '2007' div 1;`) - result.Check(testkit.Rows("0")) -} - -func (s *testIntegrationSuite2) TestIssue11648(c *C) { - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t (id int NOT NULL DEFAULT 8);") tk.MustExec("SET sql_mode = '';") @@ -3339,9 +1081,11 @@ func (s *testIntegrationSuite2) TestIssue11648(c *C) { tk.MustQuery("select * from t").Check(testkit.Rows("1", "0", "2")) } -func (s *testIntegrationSuite) TestInfoBuiltin(c *C) { - defer s.cleanEnv(c) - tk := testkit.NewTestKit(c, s.store) +func TestInfoBuiltin(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") // for last_insert_id @@ -3400,7 +1144,7 @@ func (s *testIntegrationSuite) TestInfoBuiltin(c *C) { tk.MustExec("use test") // for current_user - sessionVars := tk.Se.GetSessionVars() + sessionVars := tk.Session().GetSessionVars() originUser := sessionVars.User sessionVars.User = &auth.UserIdentity{Username: "root", Hostname: "localhost", AuthUsername: "root", AuthHostname: "127.0.%%"} result = tk.MustQuery("select current_user()") @@ -3454,7 +1198,7 @@ func (s *testIntegrationSuite) TestInfoBuiltin(c *C) { result = tk.MustQuery(`select benchmark(3, benchmark(2, length("abc")))`) result.Check(success) err := tk.ExecToErr(`select benchmark(3, length("a", "b"))`) - c.Assert(err, NotNil) + require.Error(t, err) // Quoted from https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_benchmark // Although the expression can be a subquery, it must return a single column and at most a single row. // For example, BENCHMARK(10, (SELECT * FROM t)) will fail if the table t has more than one column or @@ -3467,26 +1211,28 @@ func (s *testIntegrationSuite) TestInfoBuiltin(c *C) { result.Check(success) // 0 * 2, error; err = tk.ExecToErr(twoColumnQuery) - c.Assert(err, NotNil) + require.Error(t, err) // 1 * 1, success; tk.MustExec("insert t values (1, 2)") result = tk.MustQuery(oneColumnQuery) result.Check(success) // 1 * 2, error; err = tk.ExecToErr(twoColumnQuery) - c.Assert(err, NotNil) + require.Error(t, err) // 2 * 1, error; tk.MustExec("insert t values (3, 4)") err = tk.ExecToErr(oneColumnQuery) - c.Assert(err, NotNil) + require.Error(t, err) // 2 * 2, error. err = tk.ExecToErr(twoColumnQuery) - c.Assert(err, NotNil) + require.Error(t, err) } -func (s *testIntegrationSuite) TestControlBuiltin(c *C) { - defer s.cleanEnv(c) - tk := testkit.NewTestKit(c, s.store) +func TestControlBuiltin(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") // for ifnull @@ -3552,9 +1298,11 @@ func (s *testIntegrationSuite) TestControlBuiltin(c *C) { result.Check(testkit.Rows("-146")) } -func (s *testIntegrationSuite) TestArithmeticBuiltin(c *C) { - defer s.cleanEnv(c) - tk := testkit.NewTestKit(c, s.store) +func TestArithmeticBuiltin(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") ctx := context.Background() @@ -3572,29 +1320,29 @@ func (s *testIntegrationSuite) TestArithmeticBuiltin(c *C) { tk.MustExec("CREATE TABLE t(a BIGINT UNSIGNED, b BIGINT UNSIGNED);") tk.MustExec("INSERT INTO t SELECT 1<<63, 1<<63;") rs, err := tk.Exec("SELECT a+b FROM t;") - c.Assert(err, IsNil) - c.Assert(rs, NotNil) - rows, err := session.GetRows4Test(ctx, tk.Se, rs) - c.Assert(rows, IsNil) - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[types:1690]BIGINT UNSIGNED value is out of range in '(test.t.a + test.t.b)'") - c.Assert(rs.Close(), IsNil) + require.NoError(t, err) + require.NotNil(t, rs) + rows, err := session.GetRows4Test(ctx, tk.Session(), rs) + require.Nil(t, rows) + require.Error(t, err) + require.Error(t, err, "[types:1690]BIGINT UNSIGNED value is out of range in '(test.t.a + test.t.b)'") + require.NoError(t, rs.Close()) rs, err = tk.Exec("select cast(-3 as signed) + cast(2 as unsigned);") - c.Assert(err, IsNil) - c.Assert(rs, NotNil) - rows, err = session.GetRows4Test(ctx, tk.Se, rs) - c.Assert(rows, IsNil) - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[types:1690]BIGINT UNSIGNED value is out of range in '(-3 + 2)'") - c.Assert(rs.Close(), IsNil) + require.NoError(t, err) + require.NotNil(t, rs) + rows, err = session.GetRows4Test(ctx, tk.Session(), rs) + require.Nil(t, rows) + require.Error(t, err) + require.Error(t, err, "[types:1690]BIGINT UNSIGNED value is out of range in '(-3 + 2)'") + require.NoError(t, rs.Close()) rs, err = tk.Exec("select cast(2 as unsigned) + cast(-3 as signed);") - c.Assert(err, IsNil) - c.Assert(rs, NotNil) - rows, err = session.GetRows4Test(ctx, tk.Se, rs) - c.Assert(rows, IsNil) - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[types:1690]BIGINT UNSIGNED value is out of range in '(2 + -3)'") - c.Assert(rs.Close(), IsNil) + require.NoError(t, err) + require.NotNil(t, rs) + rows, err = session.GetRows4Test(ctx, tk.Session(), rs) + require.Nil(t, rows) + require.Error(t, err) + require.Error(t, err, "[types:1690]BIGINT UNSIGNED value is out of range in '(2 + -3)'") + require.NoError(t, rs.Close()) // for minus tk.MustExec("DROP TABLE IF EXISTS t;") @@ -3611,50 +1359,50 @@ func (s *testIntegrationSuite) TestArithmeticBuiltin(c *C) { tk.MustExec("CREATE TABLE t(a BIGINT UNSIGNED, b BIGINT UNSIGNED);") tk.MustExec("INSERT INTO t SELECT 1, 4;") err = tk.QueryToErr("SELECT a-b FROM t;") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[types:1690]BIGINT UNSIGNED value is out of range in '(test.t.a - test.t.b)'") + require.Error(t, err) + require.Error(t, err, "[types:1690]BIGINT UNSIGNED value is out of range in '(test.t.a - test.t.b)'") err = tk.QueryToErr("select cast(1 as unsigned) - cast(4 as unsigned);") - c.Assert(err, NotNil) + require.Error(t, err) // TODO: make error compatible with MySQL, should be BIGINT UNSIGNED value is out of range in '(cast(1 as unsigned) - cast(4 as unsigned)) - c.Assert(err.Error(), Equals, "[types:1690]BIGINT UNSIGNED value is out of range in '(1 - 4)'") + require.Error(t, err, "[types:1690]BIGINT UNSIGNED value is out of range in '(1 - 4)'") err = tk.QueryToErr("select cast(-1 as signed) - cast(-1 as unsigned);") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[types:1690]BIGINT UNSIGNED value is out of range in '(-1 - 18446744073709551615)'") + require.Error(t, err) + require.Error(t, err, "[types:1690]BIGINT UNSIGNED value is out of range in '(-1 - 18446744073709551615)'") err = tk.QueryToErr("select cast(1 as signed) - cast(-1 as unsigned);") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[types:1690]BIGINT UNSIGNED value is out of range in '(1 - 18446744073709551615)'") + require.Error(t, err) + require.Error(t, err, "[types:1690]BIGINT UNSIGNED value is out of range in '(1 - 18446744073709551615)'") err = tk.QueryToErr("select cast(-1 as unsigned) - cast(-1 as signed);") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[types:1690]BIGINT UNSIGNED value is out of range in '(18446744073709551615 - -1)'") + require.Error(t, err) + require.Error(t, err, "[types:1690]BIGINT UNSIGNED value is out of range in '(18446744073709551615 - -1)'") err = tk.QueryToErr("select cast(-9223372036854775808 as unsigned) - (-9223372036854775808);") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[types:1690]BIGINT UNSIGNED value is out of range in '(9223372036854775808 - -9223372036854775808)'") + require.Error(t, err) + require.Error(t, err, "[types:1690]BIGINT UNSIGNED value is out of range in '(9223372036854775808 - -9223372036854775808)'") err = tk.QueryToErr("select cast(12 as unsigned) - (14);") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[types:1690]BIGINT UNSIGNED value is out of range in '(12 - 14)'") + require.Error(t, err) + require.Error(t, err, "[types:1690]BIGINT UNSIGNED value is out of range in '(12 - 14)'") err = tk.QueryToErr("select cast(9223372036854775807 as signed) - cast(-1 as signed);") - c.Assert(err.Error(), Equals, "[types:1690]BIGINT value is out of range in '(9223372036854775807 - -1)'") + require.Error(t, err, "[types:1690]BIGINT value is out of range in '(9223372036854775807 - -1)'") err = tk.QueryToErr("select cast(-9223372036854775808 as signed) - cast(1 as signed);") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[types:1690]BIGINT value is out of range in '(-9223372036854775808 - 1)'") + require.Error(t, err) + require.Error(t, err, "[types:1690]BIGINT value is out of range in '(-9223372036854775808 - 1)'") err = tk.QueryToErr("select cast(12 as signed) - cast(-9223372036854775808 as signed);") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[types:1690]BIGINT value is out of range in '(12 - -9223372036854775808)'") + require.Error(t, err) + require.Error(t, err, "[types:1690]BIGINT value is out of range in '(12 - -9223372036854775808)'") tk.MustExec(`create table tb5(a int(10));`) tk.MustExec(`insert into tb5 (a) values (10);`) e := tk.QueryToErr(`select * from tb5 where a - -9223372036854775808;`) - c.Assert(e, NotNil) - c.Assert(strings.HasSuffix(e.Error(), `BIGINT value is out of range in '(Column#0 - -9223372036854775808)'`), IsTrue, Commentf("err: %v", err)) + require.NotNil(t, e) + require.True(t, strings.HasSuffix(e.Error(), `BIGINT value is out of range in '(Column#0 - -9223372036854775808)'`), "err: %v", err) tk.MustExec(`drop table tb5`) tk.MustQuery("select cast(-9223372036854775808 as unsigned) - (-9223372036854775807);").Check(testkit.Rows("18446744073709551615")) @@ -3666,30 +1414,30 @@ func (s *testIntegrationSuite) TestArithmeticBuiltin(c *C) { // for multiply tk.MustQuery("select 1234567890 * 1234567890").Check(testkit.Rows("1524157875019052100")) rs, err = tk.Exec("select 1234567890 * 12345671890") - c.Assert(err, IsNil) - _, err = session.GetRows4Test(ctx, tk.Se, rs) - c.Assert(terror.ErrorEqual(err, types.ErrOverflow), IsTrue) - c.Assert(rs.Close(), IsNil) + require.NoError(t, err) + _, err = session.GetRows4Test(ctx, tk.Session(), rs) + require.True(t, terror.ErrorEqual(err, types.ErrOverflow)) + require.NoError(t, rs.Close()) tk.MustQuery("select cast(1234567890 as unsigned int) * 12345671890").Check(testkit.Rows("15241570095869612100")) tk.MustQuery("select 123344532434234234267890.0 * 1234567118923479823749823749.230").Check(testkit.Rows("152277104042296270209916846800130443726237424001224.7000")) rs, err = tk.Exec("select 123344532434234234267890.0 * 12345671189234798237498232384982309489238402830480239849238048239084749.230") - c.Assert(err, IsNil) - _, err = session.GetRows4Test(ctx, tk.Se, rs) - c.Assert(terror.ErrorEqual(err, types.ErrOverflow), IsTrue) - c.Assert(rs.Close(), IsNil) + require.NoError(t, err) + _, err = session.GetRows4Test(ctx, tk.Session(), rs) + require.True(t, terror.ErrorEqual(err, types.ErrOverflow)) + require.NoError(t, rs.Close()) // FIXME: There is something wrong in showing float number. // tk.MustQuery("select 1.797693134862315708145274237317043567981e+308 * 1").Check(testkit.Rows("1.7976931348623157e308")) // tk.MustQuery("select 1.797693134862315708145274237317043567981e+308 * -1").Check(testkit.Rows("-1.7976931348623157e308")) rs, err = tk.Exec("select 1.797693134862315708145274237317043567981e+308 * 1.1") - c.Assert(err, IsNil) - _, err = session.GetRows4Test(ctx, tk.Se, rs) - c.Assert(terror.ErrorEqual(err, types.ErrOverflow), IsTrue) - c.Assert(rs.Close(), IsNil) + require.NoError(t, err) + _, err = session.GetRows4Test(ctx, tk.Session(), rs) + require.True(t, terror.ErrorEqual(err, types.ErrOverflow)) + require.NoError(t, rs.Close()) rs, err = tk.Exec("select 1.797693134862315708145274237317043567981e+308 * -1.1") - c.Assert(err, IsNil) - _, err = session.GetRows4Test(ctx, tk.Se, rs) - c.Assert(terror.ErrorEqual(err, types.ErrOverflow), IsTrue) - c.Assert(rs.Close(), IsNil) + require.NoError(t, err) + _, err = session.GetRows4Test(ctx, tk.Session(), rs) + require.True(t, terror.ErrorEqual(err, types.ErrOverflow)) + require.NoError(t, rs.Close()) tk.MustQuery("select 0.0 * -1;").Check(testkit.Rows("0.0")) tk.MustExec("DROP TABLE IF EXISTS t;") @@ -3699,10 +1447,10 @@ func (s *testIntegrationSuite) TestArithmeticBuiltin(c *C) { result.Check(testkit.Rows("-0.545273 -0.090833 109.000000 0.1665833 -199.9000000 <nil> <nil> <nil> <nil>")) tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1365 Division by 0")) rs, err = tk.Exec("select 1e200/1e-200") - c.Assert(err, IsNil) - _, err = session.GetRows4Test(ctx, tk.Se, rs) - c.Assert(terror.ErrorEqual(err, types.ErrOverflow), IsTrue) - c.Assert(rs.Close(), IsNil) + require.NoError(t, err) + _, err = session.GetRows4Test(ctx, tk.Session(), rs) + require.True(t, terror.ErrorEqual(err, types.ErrOverflow)) + require.NoError(t, rs.Close()) // for intDiv result = tk.MustQuery("SELECT 13 DIV 12, 13 DIV 0.01, -13 DIV 2, 13 DIV NULL, NULL DIV 13, NULL DIV NULL;") @@ -3717,10 +1465,10 @@ func (s *testIntegrationSuite) TestArithmeticBuiltin(c *C) { "Warning|1292|Truncated incorrect DECIMAL value: '-1.7976931348623158e+307'", "Warning|1365|Division by 0")) rs, err = tk.Exec("select 1e300 DIV 1.5") - c.Assert(err, IsNil) - _, err = session.GetRows4Test(ctx, tk.Se, rs) - c.Assert(terror.ErrorEqual(err, types.ErrOverflow), IsTrue) - c.Assert(rs.Close(), IsNil) + require.NoError(t, err) + _, err = session.GetRows4Test(ctx, tk.Session(), rs) + require.True(t, terror.ErrorEqual(err, types.ErrOverflow)) + require.NoError(t, rs.Close()) tk.MustExec("drop table if exists t;") tk.MustExec("CREATE TABLE t (c_varchar varchar(255), c_time time, nonzero int, zero int, c_int_unsigned int unsigned, c_timestamp timestamp, c_enum enum('a','b','c'));") @@ -3763,7 +1511,7 @@ func (s *testIntegrationSuite) TestArithmeticBuiltin(c *C) { tk.MustQuery("select 0.000 % 0.11234500000000000000;").Check(testkit.Rows("0.00000000000000000000")) _, err = tk.Exec("INSERT INTO t VALUE(12 MOD 0);") - c.Assert(terror.ErrorEqual(err, expression.ErrDivisionByZero), IsTrue) + require.True(t, terror.ErrorEqual(err, expression.ErrDivisionByZero)) tk.MustQuery("select sum(1.2e2) * 0.1").Check(testkit.Rows("12")) tk.MustExec("drop table if exists t") @@ -3785,9 +1533,51 @@ func (s *testIntegrationSuite) TestArithmeticBuiltin(c *C) { tk.MustQuery("SELECT a/b FROM t;").Check(testkit.Rows("0.0000", "0.8264")) } -func (s *testIntegrationSuite) TestCompareBuiltin(c *C) { - defer s.cleanEnv(c) - tk := testkit.NewTestKit(c, s.store) +func TestGreatestTimeType(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + tk.MustExec("drop table if exists t1;") + tk.MustExec("create table t1(c_time time(5), c_dt datetime(4), c_ts timestamp(3), c_d date, c_str varchar(100));") + tk.MustExec("insert into t1 values('-800:10:10', '2021-10-10 10:10:10.1234', '2021-10-10 10:10:10.1234', '2021-10-11', '2021-10-10 10:10:10.1234');") + + for i := 0; i < 2; i++ { + if i == 0 { + tk.MustExec("set @@tidb_enable_vectorized_expression = off;") + } else { + tk.MustExec("set @@tidb_enable_vectorized_expression = on;") + } + tk.MustQuery("select greatest(c_time, c_time) from t1;").Check(testkit.Rows("-800:10:10.00000")) + tk.MustQuery("select greatest(c_dt, c_dt) from t1;").Check(testkit.Rows("2021-10-10 10:10:10.1234")) + tk.MustQuery("select greatest(c_ts, c_ts) from t1;").Check(testkit.Rows("2021-10-10 10:10:10.123")) + tk.MustQuery("select greatest(c_d, c_d) from t1;").Check(testkit.Rows("2021-10-11")) + tk.MustQuery("select greatest(c_str, c_str) from t1;").Check(testkit.Rows("2021-10-10 10:10:10.1234")) + + tk.MustQuery("select least(c_time, c_time) from t1;").Check(testkit.Rows("-800:10:10.00000")) + tk.MustQuery("select least(c_dt, c_dt) from t1;").Check(testkit.Rows("2021-10-10 10:10:10.1234")) + tk.MustQuery("select least(c_ts, c_ts) from t1;").Check(testkit.Rows("2021-10-10 10:10:10.123")) + tk.MustQuery("select least(c_d, c_d) from t1;").Check(testkit.Rows("2021-10-11")) + tk.MustQuery("select least(c_str, c_str) from t1;").Check(testkit.Rows("2021-10-10 10:10:10.1234")) + + tk.MustQuery("select greatest(c_time, cast('10:01:01' as time)) from t1;").Check(testkit.Rows("10:01:01.00000")) + tk.MustQuery("select least(c_time, cast('10:01:01' as time)) from t1;").Check(testkit.Rows("-800:10:10.00000")) + + tk.MustQuery("select greatest(c_d, cast('1999-10-10' as date)) from t1;").Check(testkit.Rows("2021-10-11")) + tk.MustQuery("select least(c_d, cast('1999-10-10' as date)) from t1;").Check(testkit.Rows("1999-10-10")) + + tk.MustQuery("select greatest(c_dt, cast('1999-10-10 10:10:10.1234' as datetime)) from t1;").Check(testkit.Rows("2021-10-10 10:10:10.1234")) + tk.MustQuery("select least(c_dt, cast('1999-10-10 10:10:10.1234' as datetime)) from t1;").Check(testkit.Rows("1999-10-10 10:10:10")) + } +} + +func TestCompareBuiltin(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") // compare as JSON @@ -3888,7 +1678,7 @@ func (s *testIntegrationSuite) TestCompareBuiltin(c *C) { result = tk.MustQuery("select coalesce(NULL, a), coalesce(NULL, b, a), coalesce(c, NULL, a, b), coalesce(d, NULL), coalesce(d, c), coalesce(NULL, NULL, e, 1), coalesce(f), coalesce(1, a, b, c, d, e, f) from t2") // coalesce(col_bit) is not same with MySQL, because it's a bug of MySQL(https://bugs.mysql.com/bug.php?id=103289&thanks=4) - result.Check(testkit.Rows(fmt.Sprintf("1 1.1 2017-08-01 12:01:01 12:01:01 %s 12:01:01 abcdef \x00\x15 1", time.Now().In(tk.Se.GetSessionVars().Location()).Format("2006-01-02")))) + result.Check(testkit.Rows(fmt.Sprintf("1 1.1 2017-08-01 12:01:01 12:01:01 %s 12:01:01 abcdef \x00\x15 1", time.Now().In(tk.Session().GetSessionVars().Location()).Format("2006-01-02")))) // nullif result = tk.MustQuery(`SELECT NULLIF(NULL, 1), NULLIF(1, NULL), NULLIF(1, 1), NULLIF(NULL, NULL);`) @@ -3936,14 +1726,15 @@ func (s *testIntegrationSuite) TestCompareBuiltin(c *C) { result.Check(testkit.Rows("1 1 1")) result = tk.MustQuery(`select INTERVAL(100, NULL, NULL, NULL, NULL, NULL, 100);`) result.Check(testkit.Rows("6")) + result = tk.MustQuery(`SELECT INTERVAL(0,(1*5)/2) + INTERVAL(5,4,3);`) + result.Check(testkit.Rows("2")) // for greatest result = tk.MustQuery(`select greatest(1, 2, 3), greatest("a", "b", "c"), greatest(1.1, 1.2, 1.3), greatest("123a", 1, 2)`) result.Check(testkit.Rows("3 c 1.3 2")) tk.MustQuery("show warnings").Check(testkit.Rows()) result = tk.MustQuery(`select greatest(cast("2017-01-01" as datetime), "123", "234", cast("2018-01-01" as date)), greatest(cast("2017-01-01" as date), "123", null)`) - // todo: MySQL returns "2018-01-01 <nil>" - result.Check(testkit.Rows("2018-01-01 00:00:00 <nil>")) + result.Check(testkit.Rows("234 <nil>")) tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1292|Incorrect time value: '123'", "Warning|1292|Incorrect time value: '234'", "Warning|1292|Incorrect time value: '123'")) // for least result = tk.MustQuery(`select least(1, 2, 3), least("a", "b", "c"), least(1.1, 1.2, 1.3), least("123a", 1, 2)`) @@ -3965,7 +1756,7 @@ func (s *testIntegrationSuite) TestCompareBuiltin(c *C) { // insert an nonexistent time tk.MustExec("set time_zone = 'America/Los_Angeles'") _, err := tk.Exec("insert into t value('2011-03-13 02:00:00')") - c.Assert(err, NotNil) + require.Error(t, err) // reset timezone to a +8 offset tk.MustExec("set time_zone = '+08:00'") tk.MustQuery("select * from t").Check(testkit.Rows("1991-05-06 12:59:28")) @@ -3989,8 +1780,11 @@ func (s *testIntegrationSuite) TestCompareBuiltin(c *C) { } // #23157: make sure if Nullif expr is correct combined with IsNull expr. -func (s *testIntegrationSuite) TestNullifWithIsNull(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestNullifWithIsNull(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int not null);") @@ -3999,9 +1793,11 @@ func (s *testIntegrationSuite) TestNullifWithIsNull(c *C) { rows.Check(testkit.Rows("1", "2")) } -func (s *testIntegrationSuite) TestAggregationBuiltin(c *C) { - defer s.cleanEnv(c) - tk := testkit.NewTestKit(c, s.store) +func TestAggregationBuiltin(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t(a decimal(7, 6))") @@ -4032,9 +1828,11 @@ func (s *testIntegrationSuite) TestAggregationBuiltin(c *C) { result.Check(testkit.Rows("1")) } -func (s *testIntegrationSuite) TestAggregationBuiltinBitOr(c *C) { - defer s.cleanEnv(c) - tk := testkit.NewTestKit(c, s.store) +func TestAggregationBuiltinBitOr(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t;") tk.MustExec("create table t(a bigint)") @@ -4057,9 +1855,11 @@ func (s *testIntegrationSuite) TestAggregationBuiltinBitOr(c *C) { result.Check(testkit.Rows("18446744073709551615")) } -func (s *testIntegrationSuite) TestAggregationBuiltinBitXor(c *C) { - defer s.cleanEnv(c) - tk := testkit.NewTestKit(c, s.store) +func TestAggregationBuiltinBitXor(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t;") tk.MustExec("create table t(a bigint)") @@ -4082,9 +1882,11 @@ func (s *testIntegrationSuite) TestAggregationBuiltinBitXor(c *C) { result.Check(testkit.Rows("<nil> 0", "1 1", "2 2", "3 0")) } -func (s *testIntegrationSuite) TestAggregationBuiltinBitAnd(c *C) { - defer s.cleanEnv(c) - tk := testkit.NewTestKit(c, s.store) +func TestAggregationBuiltinBitAnd(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t;") tk.MustExec("create table t(a bigint)") @@ -4107,9 +1909,11 @@ func (s *testIntegrationSuite) TestAggregationBuiltinBitAnd(c *C) { result.Check(testkit.Rows("7 7", "5 5", "3 3", "2 2", "<nil> 18446744073709551615")) } -func (s *testIntegrationSuite) TestAggregationBuiltinGroupConcat(c *C) { - defer s.cleanEnv(c) - tk := testkit.NewTestKit(c, s.store) +func TestAggregationBuiltinGroupConcat(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("create table t(a varchar(100))") tk.MustExec("create table d(a varchar(100))") @@ -4123,18 +1927,20 @@ func (s *testIntegrationSuite) TestAggregationBuiltinGroupConcat(c *C) { tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning 1260 Some rows were cut by GROUPCONCAT(test.t.a)")) _, err := tk.Exec("insert into d select group_concat(a) from t") - c.Assert(errors.Cause(err).(*terror.Error).Code(), Equals, errors.ErrCode(mysql.ErrCutValueGroupConcat)) + require.Equal(t, errors.ErrCode(mysql.ErrCutValueGroupConcat), errors.Cause(err).(*terror.Error).Code()) _, err = tk.Exec("set sql_mode=''") - c.Assert(err, IsNil) + require.NoError(t, err) tk.MustExec("insert into d select group_concat(a) from t") tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning 1260 Some rows were cut by GROUPCONCAT(test.t.a)")) tk.MustQuery("select * from d").Check(testkit.Rows("hello,h")) } -func (s *testIntegrationSuite) TestAggregationBuiltinJSONArrayagg(c *C) { - defer s.cleanEnv(c) - tk := testkit.NewTestKit(c, s.store) +func TestAggregationBuiltinJSONArrayagg(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t;") @@ -4172,9 +1978,11 @@ func (s *testIntegrationSuite) TestAggregationBuiltinJSONArrayagg(c *C) { result.Check(testkit.Rows(`[null]`)) } -func (s *testIntegrationSuite) TestAggregationBuiltinJSONObjectAgg(c *C) { - defer s.cleanEnv(c) - tk := testkit.NewTestKit(c, s.store) +func TestAggregationBuiltinJSONObjectAgg(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t;") @@ -4210,9 +2018,11 @@ func (s *testIntegrationSuite) TestAggregationBuiltinJSONObjectAgg(c *C) { result.Check(testkit.Rows(`{"1": null}`)) } -func (s *testIntegrationSuite2) TestOtherBuiltin(c *C) { - defer s.cleanEnv(c) - tk := testkit.NewTestKit(c, s.store) +func TestOtherBuiltin(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") @@ -4294,10 +2104,12 @@ func (s *testIntegrationSuite2) TestOtherBuiltin(c *C) { result.Check(testkit.Rows("1 <nil> <nil> <nil> <nil> <nil> <nil> <nil>")) } -func (s *testIntegrationSuite) TestDateBuiltin(c *C) { +func TestDateBuiltin(t *testing.T) { ctx := context.Background() - defer s.cleanEnv(c) - tk := testkit.NewTestKit(c, s.store) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("USE test;") tk.MustExec("DROP TABLE IF EXISTS t;") tk.MustExec("create table t (d date);") @@ -4325,11 +2137,11 @@ func (s *testIntegrationSuite) TestDateBuiltin(c *C) { tk.MustExec("set sql_mode = 'NO_ZERO_DATE'") rs, err := tk.Exec("select date '0000-00-00';") - c.Assert(err, IsNil) - _, err = session.GetRows4Test(ctx, tk.Se, rs) - c.Assert(err, NotNil) - c.Assert(terror.ErrorEqual(err, types.ErrWrongValue.GenWithStackByArgs(types.DateStr, "0000-00-00")), IsTrue) - c.Assert(rs.Close(), IsNil) + require.NoError(t, err) + _, err = session.GetRows4Test(ctx, tk.Session(), rs) + require.Error(t, err) + require.True(t, terror.ErrorEqual(err, types.ErrWrongValue.GenWithStackByArgs(types.DateStr, "0000-00-00"))) + require.NoError(t, rs.Close()) tk.MustExec("set sql_mode = ''") r = tk.MustQuery("select date '2007-10-00';") @@ -4337,10 +2149,10 @@ func (s *testIntegrationSuite) TestDateBuiltin(c *C) { tk.MustExec("set sql_mode = 'NO_ZERO_IN_DATE'") rs, _ = tk.Exec("select date '2007-10-00';") - _, err = session.GetRows4Test(ctx, tk.Se, rs) - c.Assert(err, NotNil) - c.Assert(terror.ErrorEqual(err, types.ErrWrongValue.GenWithStackByArgs(types.DateStr, "2017-10-00")), IsTrue) - c.Assert(rs.Close(), IsNil) + _, err = session.GetRows4Test(ctx, tk.Session(), rs) + require.Error(t, err) + require.True(t, terror.ErrorEqual(err, types.ErrWrongValue.GenWithStackByArgs(types.DateStr, "2017-10-00"))) + require.NoError(t, rs.Close()) tk.MustExec("set sql_mode = 'NO_ZERO_DATE'") r = tk.MustQuery("select date '2007-10-00';") @@ -4349,17 +2161,17 @@ func (s *testIntegrationSuite) TestDateBuiltin(c *C) { tk.MustExec("set sql_mode = 'NO_ZERO_IN_DATE,NO_ZERO_DATE'") rs, _ = tk.Exec("select date '2007-10-00';") - _, err = session.GetRows4Test(ctx, tk.Se, rs) - c.Assert(err, NotNil) - c.Assert(terror.ErrorEqual(err, types.ErrWrongValue.GenWithStackByArgs(types.DateStr, "2017-10-00")), IsTrue) - c.Assert(rs.Close(), IsNil) + _, err = session.GetRows4Test(ctx, tk.Session(), rs) + require.Error(t, err) + require.True(t, terror.ErrorEqual(err, types.ErrWrongValue.GenWithStackByArgs(types.DateStr, "2017-10-00"))) + require.NoError(t, rs.Close()) rs, err = tk.Exec("select date '0000-00-00';") - c.Assert(err, IsNil) - _, err = session.GetRows4Test(ctx, tk.Se, rs) - c.Assert(err, NotNil) - c.Assert(terror.ErrorEqual(err, types.ErrWrongValue.GenWithStackByArgs(types.DateStr, "0000-00-00")), IsTrue) - c.Assert(rs.Close(), IsNil) + require.NoError(t, err) + _, err = session.GetRows4Test(ctx, tk.Session(), rs) + require.Error(t, err) + require.True(t, terror.ErrorEqual(err, types.ErrWrongValue.GenWithStackByArgs(types.DateStr, "2017-10-00"))) + require.NoError(t, rs.Close()) r = tk.MustQuery("select date'1998~01~02'") r.Check(testkit.Rows("1998-01-02")) @@ -4368,34 +2180,36 @@ func (s *testIntegrationSuite) TestDateBuiltin(c *C) { r.Check(testkit.Rows("1973-11-24 2001-11-24")) _, err = tk.Exec("select date '0000-00-00 00:00:00';") - c.Assert(err, NotNil) - c.Assert(terror.ErrorEqual(err, types.ErrWrongValue.GenWithStackByArgs(types.DateStr, "0000-00-00 00:00:00")), IsTrue) + require.Error(t, err) + require.True(t, terror.ErrorEqual(err, types.ErrWrongValue.GenWithStackByArgs(types.DateStr, "0000-00-00 00:00:00"))) _, err = tk.Exec("select date '2017-99-99';") - c.Assert(err, NotNil) - c.Assert(terror.ErrorEqual(err, types.ErrWrongValue), IsTrue, Commentf("err: %v", err)) + require.Error(t, err) + require.True(t, terror.ErrorEqual(err, types.ErrWrongValue), "err: %v", err) _, err = tk.Exec("select date '2017-2-31';") - c.Assert(err, NotNil) - c.Assert(terror.ErrorEqual(err, types.ErrWrongValue), IsTrue, Commentf("err: %v", err)) + require.Error(t, err) + require.True(t, terror.ErrorEqual(err, types.ErrWrongValue), "err: %v", err) _, err = tk.Exec("select date '201712-31';") - c.Assert(err, NotNil) - c.Assert(terror.ErrorEqual(err, types.ErrWrongValue.GenWithStackByArgs(types.DateStr, "201712-31")), IsTrue, Commentf("err: %v", err)) + require.Error(t, err) + require.True(t, terror.ErrorEqual(err, types.ErrWrongValue.GenWithStackByArgs(types.DateStr, "201712-31")), "err: %v", err) _, err = tk.Exec("select date 'abcdefg';") - c.Assert(err, NotNil) - c.Assert(terror.ErrorEqual(err, types.ErrWrongValue.GenWithStackByArgs(types.DateStr, "abcdefg")), IsTrue, Commentf("err: %v", err)) + require.Error(t, err) + require.True(t, terror.ErrorEqual(err, types.ErrWrongValue.GenWithStackByArgs(types.DateStr, "abcdefg")), "err: %v", err) } -func (s *testIntegrationSuite) TestJSONBuiltin(c *C) { - defer s.cleanEnv(c) - tk := testkit.NewTestKit(c, s.store) +func TestJSONBuiltin(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("USE test;") tk.MustExec("DROP TABLE IF EXISTS t;") tk.MustExec("CREATE TABLE `my_collection` ( `doc` json DEFAULT NULL, `_id` varchar(32) GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(doc,'$._id'))) STORED NOT NULL, PRIMARY KEY (`_id`))") _, err := tk.Exec("UPDATE `test`.`my_collection` SET doc=JSON_SET(doc) WHERE (JSON_EXTRACT(doc,'$.name') = 'clare');") - c.Assert(err, NotNil) + require.Error(t, err) r := tk.MustQuery("select json_valid(null);") r.Check(testkit.Rows("<nil>")) @@ -4431,9 +2245,11 @@ func (s *testIntegrationSuite) TestJSONBuiltin(c *C) { r.Check(testkit.Rows("1")) } -func (s *testIntegrationSuite) TestTimeLiteral(c *C) { - defer s.cleanEnv(c) - tk := testkit.NewTestKit(c, s.store) +func TestTimeLiteral(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) r := tk.MustQuery("select time '117:01:12';") r.Check(testkit.Rows("117:01:12")) @@ -4463,32 +2279,37 @@ func (s *testIntegrationSuite) TestTimeLiteral(c *C) { r.Check(testkit.Rows("500:20:00")) _, err := tk.Exec("select time '2017-01-01 00:00:00';") - c.Assert(err, NotNil) - c.Assert(terror.ErrorEqual(err, types.ErrWrongValue.GenWithStackByArgs(types.TimeStr, "2017-01-01 00:00:00")), IsTrue) + require.Error(t, err) + require.True(t, terror.ErrorEqual(err, types.ErrWrongValue.GenWithStackByArgs(types.TimeStr, "2017-01-01 00:00:00"))) _, err = tk.Exec("select time '071231235959.999999';") - c.Assert(err, NotNil) - c.Assert(terror.ErrorEqual(err, types.ErrWrongValue.GenWithStackByArgs(types.TimeStr, "071231235959.999999")), IsTrue) + require.Error(t, err) + require.True(t, terror.ErrorEqual(err, types.ErrWrongValue.GenWithStackByArgs(types.TimeStr, "071231235959.999999"))) _, err = tk.Exec("select time '20171231235959.999999';") - c.Assert(err, NotNil) - c.Assert(terror.ErrorEqual(err, types.ErrWrongValue.GenWithStackByArgs(types.TimeStr, "20171231235959.999999")), IsTrue) + require.Error(t, err) + require.True(t, terror.ErrorEqual(err, types.ErrWrongValue.GenWithStackByArgs(types.TimeStr, "20171231235959.999999"))) _, err = tk.Exec("select ADDDATE('2008-01-34', -1);") - c.Assert(err, IsNil) + require.NoError(t, err) tk.MustQuery("Show warnings;").Check(testutil.RowsWithSep("|", "Warning|1292|Incorrect datetime value: '2008-01-34'")) } -func (s *testIntegrationSuite) TestIssue13822(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestIssue13822(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustQuery("select ADDDATE(20111111, interval '-123' DAY);").Check(testkit.Rows("2011-07-11")) tk.MustQuery("select SUBDATE(20111111, interval '-123' DAY);").Check(testkit.Rows("2012-03-13")) } -func (s *testIntegrationSuite) TestTimestampLiteral(c *C) { - defer s.cleanEnv(c) - tk := testkit.NewTestKit(c, s.store) +func TestTimestampLiteral(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) r := tk.MustQuery("select timestamp '2017-01-01 00:00:00';") r.Check(testkit.Rows("2017-01-01 00:00:00")) @@ -4503,28 +2324,32 @@ func (s *testIntegrationSuite) TestTimestampLiteral(c *C) { r.Check(testkit.Rows("2017-01-01 00:00:00.333")) _, err := tk.Exec("select timestamp '00:00:00';") - c.Assert(err, NotNil) - c.Assert(terror.ErrorEqual(err, types.ErrWrongValue.GenWithStackByArgs(types.DateTimeStr, "00:00:00")), IsTrue) + require.Error(t, err) + require.True(t, terror.ErrorEqual(err, types.ErrWrongValue.GenWithStackByArgs(types.DateTimeStr, "00:00:00"))) _, err = tk.Exec("select timestamp '1992-01-03';") - c.Assert(err, NotNil) - c.Assert(terror.ErrorEqual(err, types.ErrWrongValue.GenWithStackByArgs(types.DateTimeStr, "1992-01-03")), IsTrue) + require.Error(t, err) + require.True(t, terror.ErrorEqual(err, types.ErrWrongValue.GenWithStackByArgs(types.DateTimeStr, "1992-01-03"))) _, err = tk.Exec("select timestamp '20171231235959.999999';") - c.Assert(err, NotNil) - c.Assert(terror.ErrorEqual(err, types.ErrWrongValue.GenWithStackByArgs(types.DateTimeStr, "20171231235959.999999")), IsTrue) + require.Error(t, err) + require.True(t, terror.ErrorEqual(err, types.ErrWrongValue.GenWithStackByArgs(types.DateTimeStr, "20171231235959.999999"))) } -func (s *testIntegrationSuite) TestLiterals(c *C) { - defer s.cleanEnv(c) - tk := testkit.NewTestKit(c, s.store) +func TestLiterals(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) r := tk.MustQuery("SELECT LENGTH(b''), LENGTH(B''), b''+1, b''-1, B''+1;") r.Check(testkit.Rows("0 0 1 -1 1")) } -func (s *testIntegrationSuite) TestFuncJSON(c *C) { - tk := testkit.NewTestKit(c, s.store) - defer s.cleanEnv(c) +func TestFuncJSON(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("USE test;") tk.MustExec("DROP TABLE IF EXISTS table_json;") tk.MustExec("CREATE TABLE table_json(a json, b VARCHAR(255));") @@ -4638,11 +2463,11 @@ func (s *testIntegrationSuite) TestFuncJSON(c *C) { r = tk.MustQuery(`select json_contains('{"a": 1}', '1', "$.c"), json_contains('{"a": [1, 2]}', '1', "$.a[2]"), json_contains('{"a": [1, {"a": 1}]}', '1', "$.a[1].b")`) r.Check(testkit.Rows("<nil> <nil> <nil>")) rs, err := tk.Exec("select json_contains('1','1','$.*')") - c.Assert(err, IsNil) - c.Assert(rs, NotNil) - _, err = session.GetRows4Test(context.Background(), tk.Se, rs) - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[json:3149]In this situation, path expressions may not contain the * and ** tokens.") + require.NoError(t, err) + require.NotNil(t, rs) + _, err = session.GetRows4Test(context.Background(), tk.Session(), rs) + require.Error(t, err) + require.Error(t, err, "[json:3149]In this situation, path expressions may not contain the * and ** tokens.") r = tk.MustQuery(`select json_contains_path(NULL, 'one', "$.c"), @@ -4707,107 +2532,29 @@ func (s *testIntegrationSuite) TestFuncJSON(c *C) { tk.MustQuery("select json_array(a+b) = json_array(c) from tx1").Check(testkit.Rows("0")) } -func (s *testIntegrationSuite) TestColumnInfoModified(c *C) { - testKit := testkit.NewTestKit(c, s.store) - defer s.cleanEnv(c) +func TestColumnInfoModified(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + testKit := testkit.NewTestKit(t, store) testKit.MustExec("use test") testKit.MustExec("drop table if exists tab0") testKit.MustExec("CREATE TABLE tab0(col0 INTEGER, col1 INTEGER, col2 INTEGER)") testKit.MustExec("SELECT + - (- CASE + col0 WHEN + CAST( col0 AS SIGNED ) THEN col1 WHEN 79 THEN NULL WHEN + - col1 THEN col0 / + col0 END ) * - 16 FROM tab0") - ctx := testKit.Se.(sessionctx.Context) + ctx := testKit.Session().(sessionctx.Context) is := domain.GetDomain(ctx).InfoSchema() tbl, _ := is.TableByName(model.NewCIStr("test"), model.NewCIStr("tab0")) col := table.FindCol(tbl.Cols(), "col1") - c.Assert(col.Tp, Equals, mysql.TypeLong) -} - -func (s *testIntegrationSuite) TestSetVariables(c *C) { - tk := testkit.NewTestKit(c, s.store) - defer s.cleanEnv(c) - _, err := tk.Exec("set sql_mode='adfasdfadsfdasd';") - c.Assert(err, NotNil) - _, err = tk.Exec("set @@sql_mode='adfasdfadsfdasd';") - c.Assert(err, NotNil) - _, err = tk.Exec("set @@global.sql_mode='adfasdfadsfdasd';") - c.Assert(err, NotNil) - _, err = tk.Exec("set @@session.sql_mode='adfasdfadsfdasd';") - c.Assert(err, NotNil) - - var r *testkit.Result - _, err = tk.Exec("set @@session.sql_mode=',NO_ZERO_DATE,ANSI,ANSI_QUOTES';") - c.Assert(err, IsNil) - r = tk.MustQuery(`select @@session.sql_mode`) - r.Check(testkit.Rows("NO_ZERO_DATE,REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY,ANSI")) - r = tk.MustQuery(`show variables like 'sql_mode'`) - r.Check(testkit.Rows("sql_mode NO_ZERO_DATE,REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY,ANSI")) - - // for invalid SQL mode. - tk.MustExec("use test") - tk.MustExec("drop table if exists tab0") - tk.MustExec("CREATE TABLE tab0(col1 time)") - _, err = tk.Exec("set sql_mode='STRICT_TRANS_TABLES';") - c.Assert(err, IsNil) - _, err = tk.Exec("INSERT INTO tab0 select cast('999:44:33' as time);") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[types:1292]Truncated incorrect time value: '999:44:33'") - _, err = tk.Exec("set sql_mode=' ,';") - c.Assert(err, NotNil) - _, err = tk.Exec("INSERT INTO tab0 select cast('999:44:33' as time);") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[types:1292]Truncated incorrect time value: '999:44:33'") - - // issue #5478 - _, err = tk.Exec("set session transaction read write;") - c.Assert(err, IsNil) - _, err = tk.Exec("set global transaction read write;") - c.Assert(err, IsNil) - r = tk.MustQuery(`select @@session.tx_read_only, @@global.tx_read_only, @@session.transaction_read_only, @@global.transaction_read_only;`) - r.Check(testkit.Rows("0 0 0 0")) - - _, err = tk.Exec("set session transaction read only;") - c.Assert(err, NotNil) - - _, err = tk.Exec("start transaction read only;") - c.Assert(err, NotNil) - - _, err = tk.Exec("set tidb_enable_noop_functions=1") - c.Assert(err, IsNil) - - tk.MustExec("set session transaction read only;") - tk.MustExec("start transaction read only;") - - r = tk.MustQuery(`select @@session.tx_read_only, @@global.tx_read_only, @@session.transaction_read_only, @@global.transaction_read_only;`) - r.Check(testkit.Rows("1 0 1 0")) - _, err = tk.Exec("set global transaction read only;") - c.Assert(err, NotNil) - tk.MustExec("set global tidb_enable_noop_functions=1;") - tk.MustExec("set global transaction read only;") - r = tk.MustQuery(`select @@session.tx_read_only, @@global.tx_read_only, @@session.transaction_read_only, @@global.transaction_read_only;`) - r.Check(testkit.Rows("1 1 1 1")) - - _, err = tk.Exec("set session transaction read write;") - c.Assert(err, IsNil) - _, err = tk.Exec("set global transaction read write;") - c.Assert(err, IsNil) - r = tk.MustQuery(`select @@session.tx_read_only, @@global.tx_read_only, @@session.transaction_read_only, @@global.transaction_read_only;`) - r.Check(testkit.Rows("0 0 0 0")) - - // reset - tk.MustExec("set tidb_enable_noop_functions=0") - tk.MustExec("set global tidb_enable_noop_functions=1") - - _, err = tk.Exec("set @@global.max_user_connections='';") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, variable.ErrWrongTypeForVar.GenWithStackByArgs("max_user_connections").Error()) - _, err = tk.Exec("set @@global.max_prepared_stmt_count='';") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, variable.ErrWrongTypeForVar.GenWithStackByArgs("max_prepared_stmt_count").Error()) -} - -func (s *testIntegrationSuite) TestIssues(c *C) { + require.Equal(t, mysql.TypeLong, col.Tp) +} + +func TestIssues(t *testing.T) { + t.Skip("it has been broken. Please fix it as soon as possible.") // for issue #4954 - tk := testkit.NewTestKit(c, s.store) - defer s.cleanEnv(c) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("CREATE TABLE t (a CHAR(5) CHARACTER SET latin1);") @@ -4863,10 +2610,12 @@ func (s *testIntegrationSuite) TestIssues(c *C) { tk.MustQuery("select b'10000000' / 10").Check(testkit.Rows("12.8000")) } -func (s *testIntegrationSuite) TestInPredicate4UnsignedInt(c *C) { +func TestInPredicate4UnsignedInt(t *testing.T) { // for issue #6661 - tk := testkit.NewTestKit(c, s.store) - defer s.cleanEnv(c) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("CREATE TABLE t (a bigint unsigned,key (a));") @@ -4879,16 +2628,18 @@ func (s *testIntegrationSuite) TestInPredicate4UnsignedInt(c *C) { r.Check(testkit.Rows("5", "6", "7", "8", "9223372036854775810", "18446744073709551615")) // for issue #4473 - tk.MustExec("drop table if exists t") + tk.MustExec("drop table if exists t1") tk.MustExec("create table t1 (some_id smallint(5) unsigned,key (some_id) )") tk.MustExec("insert into t1 values (1),(2)") r = tk.MustQuery(`select some_id from t1 where some_id not in(2,-1);`) r.Check(testkit.Rows("1")) } -func (s *testIntegrationSuite) TestFilterExtractFromDNF(c *C) { - tk := testkit.NewTestKit(c, s.store) - defer s.cleanEnv(c) +func TestFilterExtractFromDNF(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int, b int, c int)") @@ -4922,16 +2673,16 @@ func (s *testIntegrationSuite) TestFilterExtractFromDNF(c *C) { ctx := context.Background() for _, tt := range tests { sql := "select * from t where " + tt.exprStr - sctx := tk.Se.(sessionctx.Context) + sctx := tk.Session().(sessionctx.Context) sc := sctx.GetSessionVars().StmtCtx stmts, err := session.Parse(sctx, sql) - c.Assert(err, IsNil, Commentf("error %v, for expr %s", err, tt.exprStr)) - c.Assert(stmts, HasLen, 1) + require.NoError(t, err, "error %v, for expr %s", err, tt.exprStr) + require.Len(t, stmts, 1) ret := &plannercore.PreprocessorReturn{} err = plannercore.Preprocess(sctx, stmts[0], plannercore.WithPreprocessorReturn(ret)) - c.Assert(err, IsNil, Commentf("error %v, for resolve name, expr %s", err, tt.exprStr)) + require.NoError(t, err, "error %v, for resolve name, expr %s", err, tt.exprStr) p, _, err := plannercore.BuildLogicalPlanForTest(ctx, sctx, stmts[0], ret.InfoSchema) - c.Assert(err, IsNil, Commentf("error %v, for build plan, expr %s", err, tt.exprStr)) + require.NoError(t, err, "error %v, for build plan, expr %s", err, tt.exprStr) selection := p.(plannercore.LogicalPlan).Children()[0].(*plannercore.LogicalSelection) conds := make([]expression.Expression, len(selection.Conditions)) for i, cond := range selection.Conditions { @@ -4941,16 +2692,18 @@ func (s *testIntegrationSuite) TestFilterExtractFromDNF(c *C) { sort.Slice(afterFunc, func(i, j int) bool { return bytes.Compare(afterFunc[i].HashCode(sc), afterFunc[j].HashCode(sc)) < 0 }) - c.Assert(fmt.Sprintf("%s", afterFunc), Equals, tt.result, Commentf("wrong result for expr: %s", tt.exprStr)) + require.Equal(t, fmt.Sprintf("%s", afterFunc), tt.result, "wrong result for expr: %s", tt.exprStr) } } -func (s *testIntegrationSuite) TestTiDBIsOwnerFunc(c *C) { - tk := testkit.NewTestKit(c, s.store) - defer s.cleanEnv(c) +func TestTiDBIsOwnerFunc(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) result := tk.MustQuery("select tidb_is_ddl_owner()") - ddlOwnerChecker := tk.Se.DDLOwnerChecker() - c.Assert(ddlOwnerChecker, NotNil) + ddlOwnerChecker := tk.Session().DDLOwnerChecker() + require.NotNil(t, ddlOwnerChecker) var ret int64 if ddlOwnerChecker.IsOwner() { ret = 1 @@ -4958,9 +2711,11 @@ func (s *testIntegrationSuite) TestTiDBIsOwnerFunc(c *C) { result.Check(testkit.Rows(fmt.Sprintf("%v", ret))) } -func (s *testIntegrationSuite) TestTiDBDecodePlanFunc(c *C) { - tk := testkit.NewTestKit(c, s.store) - defer s.cleanEnv(c) +func TestTiDBDecodePlanFunc(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustQuery("select tidb_decode_plan('')").Check(testkit.Rows("")) tk.MustQuery("select tidb_decode_plan('7APIMAk1XzEzCTAJMQlmdW5jczpjb3VudCgxKQoxCTE3XzE0CTAJMAlpbm5lciBqb2luLCBp" + "AQyQOlRhYmxlUmVhZGVyXzIxLCBlcXVhbDpbZXEoQ29sdW1uIzEsIA0KCDkpIBkXADIVFywxMCldCjIJMzFfMTgFZXhkYXRhOlNlbGVjdGlvbl" + @@ -4993,55 +2748,62 @@ func (s *testIntegrationSuite) TestTiDBDecodePlanFunc(c *C) { tk.MustQuery("select tidb_decode_plan('xxx')").Check(testkit.Rows("xxx")) } -func (s *testIntegrationSuite) TestTiDBInternalFunc(c *C) { - tk := testkit.NewTestKit(c, s.store) - defer s.cleanEnv(c) +func TestTiDBDecodeKeyFunc(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) var result *testkit.Result + + // Row Keys result = tk.MustQuery("select tidb_decode_key( '74800000000000002B5F72800000000000A5D3' )") result.Check(testkit.Rows(`{"_tidb_rowid":42451,"table_id":"43"}`)) result = tk.MustQuery("select tidb_decode_key( '7480000000000000325f7205bff199999999999a013131000000000000f9' )") result.Check(testkit.Rows(`{"handle":"{1.1, 11}","table_id":50}`)) + // Index Keys result = tk.MustQuery("select tidb_decode_key( '74800000000000019B5F698000000000000001015257303100000000FB013736383232313130FF3900000000000000F8010000000000000000F7' )") result.Check(testkit.Rows(`{"index_id":1,"index_vals":"RW01, 768221109, ","table_id":411}`)) result = tk.MustQuery("select tidb_decode_key( '7480000000000000695F698000000000000001038000000000004E20' )") result.Check(testkit.Rows(`{"index_id":1,"index_vals":"20000","table_id":105}`)) + // Table keys + result = tk.MustQuery("select tidb_decode_key( '7480000000000000FF4700000000000000F8' )") + result.Check(testkit.Rows(`{"table_id":71}`)) + // Test invalid record/index key. result = tk.MustQuery("select tidb_decode_key( '7480000000000000FF2E5F728000000011FFE1A3000000000000' )") result.Check(testkit.Rows("7480000000000000FF2E5F728000000011FFE1A3000000000000")) - warns := tk.Se.GetSessionVars().StmtCtx.GetWarnings() - c.Assert(warns, HasLen, 1) - c.Assert(warns[0].Err.Error(), Equals, "invalid record/index key: 7480000000000000FF2E5F728000000011FFE1A3000000000000") + warns := tk.Session().GetSessionVars().StmtCtx.GetWarnings() + require.Len(t, warns, 1) + require.Error(t, warns[0].Err, "invalid record/index key: 7480000000000000FF2E5F728000000011FFE1A3000000000000") // Test in real tables. tk.MustExec("use test;") tk.MustExec("drop table if exists t;") tk.MustExec("create table t (a varchar(255), b int, c datetime, primary key (a, b, c));") - dom := domain.GetDomain(tk.Se) + dom := domain.GetDomain(tk.Session()) is := dom.InfoSchema() tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) + require.NoError(t, err) getTime := func(year, month, day int, timeType byte) types.Time { ret := types.NewTime(types.FromDate(year, month, day, 0, 0, 0, 0), timeType, types.DefaultFsp) return ret } buildCommonKeyFromData := func(tableID int64, data []types.Datum) string { - k, err := codec.EncodeKey(tk.Se.GetSessionVars().StmtCtx, nil, data...) - c.Assert(err, IsNil) + k, err := codec.EncodeKey(tk.Session().GetSessionVars().StmtCtx, nil, data...) + require.NoError(t, err) h, err := kv.NewCommonHandle(k) - c.Assert(err, IsNil) + require.NoError(t, err) k = tablecodec.EncodeRowKeyWithHandle(tableID, h) - hexKey := hex.EncodeToString(codec.EncodeBytes(nil, k)) - return hexKey + return hex.EncodeToString(codec.EncodeBytes(nil, k)) } // split table t by ('bbbb', 10, '2020-01-01'); data := []types.Datum{types.NewStringDatum("bbbb"), types.NewIntDatum(10), types.NewTimeDatum(getTime(2020, 1, 1, mysql.TypeDatetime))} hexKey := buildCommonKeyFromData(tbl.Meta().ID, data) sql := fmt.Sprintf("select tidb_decode_key( '%s' )", hexKey) - result = tk.MustQuery(sql) rs := fmt.Sprintf(`{"handle":{"a":"bbbb","b":"10","c":"2020-01-01 00:00:00"},"table_id":%d}`, tbl.Meta().ID) - result.Check(testkit.Rows(rs)) + tk.MustQuery(sql).Check(testkit.Rows(rs)) // split table t by ('bbbb', 10, null); data = []types.Datum{types.NewStringDatum("bbbb"), types.NewIntDatum(10), types.NewDatum(nil)} @@ -5051,16 +2813,15 @@ func (s *testIntegrationSuite) TestTiDBInternalFunc(c *C) { tk.MustExec("drop table if exists t;") tk.MustExec("create table t (a varchar(255), b int, c datetime, index idx(a, b, c));") - dom = domain.GetDomain(tk.Se) + dom = domain.GetDomain(tk.Session()) is = dom.InfoSchema() tbl, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) + require.NoError(t, err) buildIndexKeyFromData := func(tableID, indexID int64, data []types.Datum) string { - k, err := codec.EncodeKey(tk.Se.GetSessionVars().StmtCtx, nil, data...) - c.Assert(err, IsNil) + k, err := codec.EncodeKey(tk.Session().GetSessionVars().StmtCtx, nil, data...) + require.NoError(t, err) k = tablecodec.EncodeIndexSeekKey(tableID, indexID, k) - hexKey := hex.EncodeToString(codec.EncodeBytes(nil, k)) - return hexKey + return hex.EncodeToString(codec.EncodeBytes(nil, k)) } // split table t index idx by ('aaaaa', 100, '2000-01-01'); data = []types.Datum{types.NewStringDatum("aaaaa"), types.NewIntDatum(100), types.NewTimeDatum(getTime(2000, 1, 1, mysql.TypeDatetime))} @@ -5081,21 +2842,46 @@ func (s *testIntegrationSuite) TestTiDBInternalFunc(c *C) { hexKey = "7480000000000000375F69800000000000000103800000000001D4C1023B6458" sql = fmt.Sprintf("select tidb_decode_key( '%s' )", hexKey) tk.MustQuery(sql).Check(testkit.Rows(hexKey)) -} -func newStoreWithBootstrap() (kv.Storage, *domain.Domain, error) { - store, err := mockstore.NewMockStore() - if err != nil { - return nil, nil, err + // Test the table with the nonclustered index. + const rowID = 10 + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int primary key nonclustered, b int, key bk (b));") + dom = domain.GetDomain(tk.Session()) + is = dom.InfoSchema() + tbl, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + buildTableRowKey := func(tableID, rowID int64) string { + return hex.EncodeToString( + codec.EncodeBytes( + nil, + tablecodec.EncodeRowKeyWithHandle(tableID, kv.IntHandle(rowID)), + )) } - session.SetSchemaLease(0) - dom, err := session.BootstrapSession(store) - return store, dom, err + hexKey = buildTableRowKey(tbl.Meta().ID, rowID) + sql = fmt.Sprintf("select tidb_decode_key( '%s' )", hexKey) + rs = fmt.Sprintf(`{"_tidb_rowid":%d,"table_id":"%d"}`, rowID, tbl.Meta().ID) + tk.MustQuery(sql).Check(testkit.Rows(rs)) + + // Test the table with the clustered index. + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int primary key clustered, b int, key bk (b));") + dom = domain.GetDomain(tk.Session()) + is = dom.InfoSchema() + tbl, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + hexKey = buildTableRowKey(tbl.Meta().ID, rowID) + sql = fmt.Sprintf("select tidb_decode_key( '%s' )", hexKey) + rs = fmt.Sprintf(`{"%s":%d,"table_id":"%d"}`, tbl.Meta().GetPkName().String(), rowID, tbl.Meta().ID) + tk.MustQuery(sql).Check(testkit.Rows(rs)) } -func (s *testIntegrationSuite) TestTwoDecimalTruncate(c *C) { - tk := testkit.NewTestKit(c, s.store) - defer s.cleanEnv(c) +func TestTwoDecimalTruncate(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec("set sql_mode=''") tk.MustExec("drop table if exists t") @@ -5108,9 +2894,12 @@ func (s *testIntegrationSuite) TestTwoDecimalTruncate(c *C) { res.Check(testkit.Rows("2.000000000000000000000000000000")) } -func (s *testIntegrationSuite) TestPrefixIndex(c *C) { - tk := testkit.NewTestKit(c, s.store) - defer s.cleanEnv(c) +func TestPrefixIndex(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec(`CREATE TABLE t1 ( name varchar(12) DEFAULT NULL, @@ -5138,8 +2927,11 @@ func (s *testIntegrationSuite) TestPrefixIndex(c *C) { res.Check(testkit.Rows("7 ÿÿ", "8 ÿÿ0", "9 ÿÿÿ")) } -func (s *testIntegrationSuite) TestDecimalMul(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestDecimalMul(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("USE test") tk.MustExec("create table t(a decimal(38, 17));") tk.MustExec("insert into t select 0.5999991229316*0.918755041726043;") @@ -5147,25 +2939,34 @@ func (s *testIntegrationSuite) TestDecimalMul(c *C) { res.Check(testkit.Rows("0.55125221922461136")) } -func (s *testIntegrationSuite) TestDecimalDiv(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestDecimalDiv(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustQuery("select cast(1 as decimal(60,30)) / cast(1 as decimal(60,30)) / cast(1 as decimal(60, 30))").Check(testkit.Rows("1.000000000000000000000000000000")) tk.MustQuery("select cast(1 as decimal(60,30)) / cast(3 as decimal(60,30)) / cast(7 as decimal(60, 30))").Check(testkit.Rows("0.047619047619047619047619047619")) tk.MustQuery("select cast(1 as decimal(60,30)) / cast(3 as decimal(60,30)) / cast(7 as decimal(60, 30)) / cast(13 as decimal(60, 30))").Check(testkit.Rows("0.003663003663003663003663003663")) } -func (s *testIntegrationSuite) TestUnknowHintIgnore(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestUnknowHintIgnore(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("USE test") tk.MustExec("create table t(a int)") tk.MustQuery("select /*+ unknown_hint(c1)*/ 1").Check(testkit.Rows("1")) - tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1064 You have an error in your SQL syntax; check the manual that corresponds to your TiDB version for the right syntax to use [parser:8064]Optimizer hint syntax error at line 1 column 23 near \"unknown_hint(c1)*/\" ")) + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1064 Optimizer hint syntax error at line 1 column 23 near \"unknown_hint(c1)*/\" ")) _, err := tk.Exec("select 1 from /*+ test1() */ t") - c.Assert(err, IsNil) + require.NoError(t, err) } -func (s *testIntegrationSuite) TestValuesInNonInsertStmt(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestValuesInNonInsertStmt(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec(`use test;`) tk.MustExec(`drop table if exists t;`) tk.MustExec(`create table t(a bigint, b double, c decimal, d varchar(20), e datetime, f time, g json);`) @@ -5174,16 +2975,21 @@ func (s *testIntegrationSuite) TestValuesInNonInsertStmt(c *C) { res.Check(testkit.Rows(`<nil> <nil> <nil> <nil> <nil> <nil> <nil>`)) } -func (s *testIntegrationSuite) TestForeignKeyVar(c *C) { +func TestForeignKeyVar(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() - tk := testkit.NewTestKit(c, s.store) + tk := testkit.NewTestKit(t, store) tk.MustExec("SET FOREIGN_KEY_CHECKS=1") tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows("Warning 8047 variable 'foreign_key_checks' does not yet support value: 1")) } -func (s *testIntegrationSuite) TestUserVarMockWindFunc(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestUserVarMockWindFunc(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec(`use test;`) tk.MustExec(`drop table if exists t;`) tk.MustExec(`create table t (a int, b varchar (20), c varchar (20));`) @@ -5255,8 +3061,11 @@ func (s *testIntegrationSuite) TestUserVarMockWindFunc(c *C) { )) } -func (s *testIntegrationSuite) TestCastAsTime(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestCastAsTime(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec(`use test;`) tk.MustExec(`drop table if exists t;`) tk.MustExec(`create table t (col1 bigint, col2 double, col3 decimal, col4 varchar(20), col5 json);`) @@ -5270,23 +3079,26 @@ func (s *testIntegrationSuite) TestCastAsTime(c *C) { )) err := tk.ExecToErr(`select cast(col1 as time(31)) from t where col1 is null;`) - c.Assert(err.Error(), Equals, "[expression:1426]Too big precision 31 specified for column 'CAST'. Maximum is 6.") + require.Error(t, err, "[expression:1426]Too big precision 31 specified for column 'CAST'. Maximum is 6.") err = tk.ExecToErr(`select cast(col2 as time(31)) from t where col1 is null;`) - c.Assert(err.Error(), Equals, "[expression:1426]Too big precision 31 specified for column 'CAST'. Maximum is 6.") + require.Error(t, err, "[expression:1426]Too big precision 31 specified for column 'CAST'. Maximum is 6.") err = tk.ExecToErr(`select cast(col3 as time(31)) from t where col1 is null;`) - c.Assert(err.Error(), Equals, "[expression:1426]Too big precision 31 specified for column 'CAST'. Maximum is 6.") + require.Error(t, err, "[expression:1426]Too big precision 31 specified for column 'CAST'. Maximum is 6.") err = tk.ExecToErr(`select cast(col4 as time(31)) from t where col1 is null;`) - c.Assert(err.Error(), Equals, "[expression:1426]Too big precision 31 specified for column 'CAST'. Maximum is 6.") + require.Error(t, err, "[expression:1426]Too big precision 31 specified for column 'CAST'. Maximum is 6.") err = tk.ExecToErr(`select cast(col5 as time(31)) from t where col1 is null;`) - c.Assert(err.Error(), Equals, "[expression:1426]Too big precision 31 specified for column 'CAST'. Maximum is 6.") + require.Error(t, err, "[expression:1426]Too big precision 31 specified for column 'CAST'. Maximum is 6.") } -func (s *testIntegrationSuite) TestValuesFloat32(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestValuesFloat32(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec(`drop table if exists t;`) tk.MustExec(`create table t (i int key, j float);`) @@ -5296,9 +3108,12 @@ func (s *testIntegrationSuite) TestValuesFloat32(c *C) { tk.MustQuery(`select * from t;`).Check(testkit.Rows(`1 0.02`)) } -func (s *testIntegrationSuite) TestFuncNameConst(c *C) { - tk := testkit.NewTestKit(c, s.store) - defer s.cleanEnv(c) +func TestFuncNameConst(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("USE test;") tk.MustExec("DROP TABLE IF EXISTS t;") tk.MustExec("CREATE TABLE t(a CHAR(20), b VARCHAR(20), c BIGINT);") @@ -5317,27 +3132,30 @@ func (s *testIntegrationSuite) TestFuncNameConst(c *C) { r = tk.MustQuery("SELECT NAME_CONST('come', -1.0);") r.Check(testkit.Rows("-1.0")) err := tk.ExecToErr(`select name_const(a,b) from t;`) - c.Assert(err.Error(), Equals, "[planner:1210]Incorrect arguments to NAME_CONST") + require.Error(t, err, "[planner:1210]Incorrect arguments to NAME_CONST") err = tk.ExecToErr(`select name_const(a,"hello") from t;`) - c.Assert(err.Error(), Equals, "[planner:1210]Incorrect arguments to NAME_CONST") + require.Error(t, err, "[planner:1210]Incorrect arguments to NAME_CONST") err = tk.ExecToErr(`select name_const("hello", b) from t;`) - c.Assert(err.Error(), Equals, "[planner:1210]Incorrect arguments to NAME_CONST") + require.Error(t, err, "[planner:1210]Incorrect arguments to NAME_CONST") err = tk.ExecToErr(`select name_const("hello", 1+1) from t;`) - c.Assert(err.Error(), Equals, "[planner:1210]Incorrect arguments to NAME_CONST") + require.Error(t, err, "[planner:1210]Incorrect arguments to NAME_CONST") err = tk.ExecToErr(`select name_const(concat('a', 'b'), 555) from t;`) - c.Assert(err.Error(), Equals, "[planner:1210]Incorrect arguments to NAME_CONST") + require.Error(t, err, "[planner:1210]Incorrect arguments to NAME_CONST") err = tk.ExecToErr(`select name_const(555) from t;`) - c.Assert(err.Error(), Equals, "[expression:1582]Incorrect parameter count in the call to native function 'name_const'") + require.Error(t, err, "[expression:1582]Incorrect parameter count in the call to native function 'name_const'") var rs sqlexec.RecordSet rs, err = tk.Exec(`select name_const("hello", 1);`) - c.Assert(err, IsNil) - c.Assert(len(rs.Fields()), Equals, 1) - c.Assert(rs.Fields()[0].Column.Name.L, Equals, "hello") + require.NoError(t, err) + require.Len(t, rs.Fields(), 1) + require.Equal(t, "hello", rs.Fields()[0].Column.Name.L) } -func (s *testIntegrationSuite) TestValuesEnum(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestValuesEnum(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec(`drop table if exists t;`) tk.MustExec(`create table t (a bigint primary key, b enum('a','b','c'));`) @@ -5347,14 +3165,17 @@ func (s *testIntegrationSuite) TestValuesEnum(c *C) { tk.MustQuery(`select * from t;`).Check(testkit.Rows(`1 b`)) } -func (s *testIntegrationSuite) TestIssue9325(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue9325(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t(a timestamp) partition by range(unix_timestamp(a)) (partition p0 values less than(unix_timestamp('2019-02-16 14:20:00')), partition p1 values less than (maxvalue))") tk.MustExec("insert into t values('2019-02-16 14:19:59'), ('2019-02-16 14:20:01')") result := tk.MustQuery("select * from t where a between timestamp'2019-02-16 14:19:00' and timestamp'2019-02-16 14:21:00'") - c.Assert(result.Rows(), HasLen, 2) + require.Len(t, result.Rows(), 2) tk.MustExec("drop table if exists t") tk.MustExec("create table t(a timestamp)") @@ -5363,8 +3184,11 @@ func (s *testIntegrationSuite) TestIssue9325(c *C) { result.Check(testkit.Rows("2019-02-16 14:19:59", "2019-02-16 14:20:01")) } -func (s *testIntegrationSuite) TestIssue9710(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue9710(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) getSAndMS := func(str string) (int, int) { results := strings.Split(str, ":") SAndMS := strings.Split(results[len(results)-1], ".") @@ -5385,17 +3209,19 @@ func (s *testIntegrationSuite) TestIssue9710(c *C) { } s1, _ := getSAndMS(rs.Rows()[0][0].(string)) - c.Assert(s, Equals, s1) // now() will truncate the result instead of rounding it + require.Equal(t, s, s1) // now() will truncate the result instead of rounding it - c.Assert(rs.Rows()[0][2], Equals, rs.Rows()[0][3]) // unix_timestamp() will truncate the result + require.Equal(t, rs.Rows()[0][2], rs.Rows()[0][3]) // unix_timestamp() will truncate the result break } } // TestDecimalConvertToTime for issue #9770 -func (s *testIntegrationSuite) TestDecimalConvertToTime(c *C) { - tk := testkit.NewTestKit(c, s.store) - defer s.cleanEnv(c) +func TestDecimalConvertToTime(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") @@ -5404,9 +3230,11 @@ func (s *testIntegrationSuite) TestDecimalConvertToTime(c *C) { tk.MustQuery("select * from t").Check(testkit.Rows("2001-01-01 10:00:00.123456 2011-07-07 10:11:12")) } -func (s *testIntegrationSuite) TestIssue9732(c *C) { - tk := testkit.NewTestKit(c, s.store) - defer s.cleanEnv(c) +func TestIssue9732(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustQuery(`select monthname(str_to_date(null, '%m')), monthname(str_to_date(null, '%m')), monthname(str_to_date(1, '%m')), monthname(str_to_date(0, '%m'));`).Check(testkit.Rows("<nil> <nil> <nil> <nil>")) @@ -5435,9 +3263,11 @@ monthname(str_to_date(1, '%m')), monthname(str_to_date(0, '%m'));`).Check(testki } } -func (s *testIntegrationSuite) TestDaynameArithmetic(c *C) { - tk := testkit.NewTestKit(c, s.store) - defer s.cleanEnv(c) +func TestDaynameArithmetic(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) cases := []struct { sql string @@ -5483,9 +3313,11 @@ func (s *testIntegrationSuite) TestDaynameArithmetic(c *C) { } } -func (s *testIntegrationSuite) TestIssue10156(c *C) { - tk := testkit.NewTestKit(c, s.store) - defer s.cleanEnv(c) +func TestIssue10156(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("CREATE TABLE `t1` (`period_name` varchar(24) DEFAULT NULL ,`period_id` bigint(20) DEFAULT NULL ,`starttime` bigint(20) DEFAULT NULL)") @@ -5505,9 +3337,11 @@ where tk.MustQuery(q) } -func (s *testIntegrationSuite) TestIssue9727(c *C) { - tk := testkit.NewTestKit(c, s.store) - defer s.cleanEnv(c) +func TestIssue9727(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) cases := []struct { sql string @@ -5554,8 +3388,11 @@ func (s *testIntegrationSuite) TestIssue9727(c *C) { } } -func (s *testIntegrationSuite) TestTimestampDatumEncode(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestTimestampDatumEncode(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec(`drop table if exists t;`) tk.MustExec(`create table t (a bigint primary key, b timestamp)`) @@ -5568,9 +3405,11 @@ func (s *testIntegrationSuite) TestTimestampDatumEncode(c *C) { tk.MustQuery(`select * from t where b = (select max(b) from t)`).Check(testkit.Rows(`1 2019-04-29 11:56:12`)) } -func (s *testIntegrationSuite) TestDateTimeAddReal(c *C) { - tk := testkit.NewTestKit(c, s.store) - defer s.cleanEnv(c) +func TestDateTimeAddReal(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) cases := []struct { sql string @@ -5590,8 +3429,11 @@ func (s *testIntegrationSuite) TestDateTimeAddReal(c *C) { } } -func (s *testIntegrationSuite) TestIssue10181(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue10181(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec(`drop table if exists t;`) tk.MustExec(`create table t(a bigint unsigned primary key);`) @@ -5599,8 +3441,11 @@ func (s *testIntegrationSuite) TestIssue10181(c *C) { tk.MustQuery(`select * from t where a > 9223372036854775807-0.5 order by a`).Check(testkit.Rows(`9223372036854775807`, `18446744073709551615`)) } -func (s *testIntegrationSuite) TestExprPushdown(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestExprPushdown(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t(id int, col1 varchar(10), col2 varchar(10), col3 int, col4 int, col5 int, index key1" + @@ -5610,41 +3455,44 @@ func (s *testIntegrationSuite) TestExprPushdown(c *C) { // case 1, index scan without double read, some filters can not be pushed to cop task rows := tk.MustQuery("explain format = 'brief' select col2, col1 from t use index(key1) where col2 like '5%' and substr(col1, 1, 1) = '4'").Rows() - c.Assert(fmt.Sprintf("%v", rows[1][2]), Equals, "root") - c.Assert(fmt.Sprintf("%v", rows[1][4]), Equals, "eq(substr(test.t.col1, 1, 1), \"4\")") - c.Assert(fmt.Sprintf("%v", rows[3][2]), Equals, "cop[tikv]") - c.Assert(fmt.Sprintf("%v", rows[3][4]), Equals, "like(test.t.col2, \"5%\", 92)") + require.Equal(t, "root", fmt.Sprintf("%v", rows[1][2])) + require.Equal(t, "eq(substr(test.t.col1, 1, 1), \"4\")", fmt.Sprintf("%v", rows[1][4])) + require.Equal(t, "cop[tikv]", fmt.Sprintf("%v", rows[3][2])) + require.Equal(t, "like(test.t.col2, \"5%\", 92)", fmt.Sprintf("%v", rows[3][4])) tk.MustQuery("select col2, col1 from t use index(key1) where col2 like '5%' and substr(col1, 1, 1) = '4'").Check(testkit.Rows("511 411111")) tk.MustQuery("select count(col2) from t use index(key1) where col2 like '5%' and substr(col1, 1, 1) = '4'").Check(testkit.Rows("1")) // case 2, index scan without double read, none of the filters can be pushed to cop task rows = tk.MustQuery("explain format = 'brief' select col1, col2 from t use index(key2) where substr(col2, 1, 1) = '5' and substr(col1, 1, 1) = '4'").Rows() - c.Assert(fmt.Sprintf("%v", rows[0][2]), Equals, "root") - c.Assert(fmt.Sprintf("%v", rows[0][4]), Equals, "eq(substr(test.t.col1, 1, 1), \"4\"), eq(substr(test.t.col2, 1, 1), \"5\")") + require.Equal(t, "root", fmt.Sprintf("%v", rows[0][2])) + require.Equal(t, "eq(substr(test.t.col1, 1, 1), \"4\"), eq(substr(test.t.col2, 1, 1), \"5\")", fmt.Sprintf("%v", rows[0][4])) tk.MustQuery("select col1, col2 from t use index(key2) where substr(col2, 1, 1) = '5' and substr(col1, 1, 1) = '4'").Check(testkit.Rows("411111 511")) tk.MustQuery("select count(col1) from t use index(key2) where substr(col2, 1, 1) = '5' and substr(col1, 1, 1) = '4'").Check(testkit.Rows("1")) // case 3, index scan with double read, some filters can not be pushed to cop task rows = tk.MustQuery("explain format = 'brief' select id from t use index(key1) where col2 like '5%' and substr(col1, 1, 1) = '4'").Rows() - c.Assert(fmt.Sprintf("%v", rows[1][2]), Equals, "root") - c.Assert(fmt.Sprintf("%v", rows[1][4]), Equals, "eq(substr(test.t.col1, 1, 1), \"4\")") - c.Assert(fmt.Sprintf("%v", rows[3][2]), Equals, "cop[tikv]") - c.Assert(fmt.Sprintf("%v", rows[3][4]), Equals, "like(test.t.col2, \"5%\", 92)") + require.Equal(t, "root", fmt.Sprintf("%v", rows[1][2])) + require.Equal(t, "eq(substr(test.t.col1, 1, 1), \"4\")", fmt.Sprintf("%v", rows[1][4])) + require.Equal(t, "cop[tikv]", fmt.Sprintf("%v", rows[3][2])) + require.Equal(t, "like(test.t.col2, \"5%\", 92)", fmt.Sprintf("%v", rows[3][4])) tk.MustQuery("select id from t use index(key1) where col2 like '5%' and substr(col1, 1, 1) = '4'").Check(testkit.Rows("3")) tk.MustQuery("select count(id) from t use index(key1) where col2 like '5%' and substr(col1, 1, 1) = '4'").Check(testkit.Rows("1")) // case 4, index scan with double read, none of the filters can be pushed to cop task rows = tk.MustQuery("explain format = 'brief' select id from t use index(key2) where substr(col2, 1, 1) = '5' and substr(col1, 1, 1) = '4'").Rows() - c.Assert(fmt.Sprintf("%v", rows[1][2]), Equals, "root") - c.Assert(fmt.Sprintf("%v", rows[1][4]), Equals, "eq(substr(test.t.col1, 1, 1), \"4\"), eq(substr(test.t.col2, 1, 1), \"5\")") + require.Equal(t, "root", fmt.Sprintf("%v", rows[1][2])) + require.Equal(t, "eq(substr(test.t.col1, 1, 1), \"4\"), eq(substr(test.t.col2, 1, 1), \"5\")", fmt.Sprintf("%v", rows[1][4])) tk.MustQuery("select id from t use index(key2) where substr(col2, 1, 1) = '5' and substr(col1, 1, 1) = '4'").Check(testkit.Rows("3")) tk.MustQuery("select count(id) from t use index(key2) where substr(col2, 1, 1) = '5' and substr(col1, 1, 1) = '4'").Check(testkit.Rows("1")) } -func (s *testIntegrationSuite) TestIssue16973(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue16973(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t1") - tk.Se.GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeIntOnly + tk.Session().GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeIntOnly tk.MustExec("create table t1(id varchar(36) not null primary key, org_id varchar(36) not null, " + "status tinyint default 1 not null, ns varchar(36) default '' not null);") tk.MustExec("create table t2(id varchar(36) not null primary key, order_id varchar(36) not null, " + @@ -5657,16 +3505,19 @@ func (s *testIntegrationSuite) TestIssue16973(c *C) { rows := tk.MustQuery("explain format = 'brief' SELECT /*+ INL_MERGE_JOIN(t1,t2) */ COUNT(*) FROM t1 LEFT JOIN t2 ON t1.id = t2.order_id WHERE t1.ns = 'a' AND t1.org_id IN (1) " + "AND t1.status IN (2,6,10) AND timestampdiff(month, t2.begin_time, date'2020-05-06') = 0;").Rows() - c.Assert(fmt.Sprintf("%v", rows[1][0]), Matches, ".*IndexMergeJoin.*") - c.Assert(fmt.Sprintf("%v", rows[4][3]), Equals, "table:t1") - c.Assert(fmt.Sprintf("%v", rows[5][0]), Matches, ".*Selection.*") - c.Assert(fmt.Sprintf("%v", rows[9][3]), Equals, "table:t2") + require.Regexp(t, ".*IndexMergeJoin.*", fmt.Sprintf("%v", rows[1][0])) + require.Equal(t, "table:t1", fmt.Sprintf("%v", rows[4][3])) + require.Regexp(t, ".*Selection.*", fmt.Sprintf("%v", rows[5][0])) + require.Equal(t, "table:t2", fmt.Sprintf("%v", rows[9][3])) tk.MustQuery("SELECT /*+ INL_MERGE_JOIN(t1,t2) */ COUNT(*) FROM t1 LEFT JOIN t2 ON t1.id = t2.order_id WHERE t1.ns = 'a' AND t1.org_id IN (1) " + "AND t1.status IN (2,6,10) AND timestampdiff(month, t2.begin_time, date'2020-05-06') = 0;").Check(testkit.Rows("1")) } -func (s *testIntegrationSuite) TestExprPushdownBlacklist(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestExprPushdownBlacklist(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustQuery(`select * from mysql.expr_pushdown_blacklist`).Check(testkit.Rows( "date_add tiflash DST(daylight saving time) does not take effect in TiFlash date_add")) @@ -5675,10 +3526,10 @@ func (s *testIntegrationSuite) TestExprPushdownBlacklist(c *C) { tk.MustExec("create table t(a int , b date)") // Create virtual tiflash replica info. - dom := domain.GetDomain(tk.Se) + dom := domain.GetDomain(tk.Session()) is := dom.InfoSchema() db, exists := is.SchemaByName(model.NewCIStr("test")) - c.Assert(exists, IsTrue) + require.True(t, exists) for _, tblInfo := range db.Tables { if tblInfo.Name.L == "t" { tblInfo.TiFlashReplica = &model.TiFlashReplicaInfo{ @@ -5698,27 +3549,33 @@ func (s *testIntegrationSuite) TestExprPushdownBlacklist(c *C) { // > pushed to both TiKV and TiFlash rows := tk.MustQuery("explain format = 'brief' select * from test.t where b > date'1988-01-01' and b < date'1994-01-01' " + "and cast(a as decimal(10,2)) > 10.10 and date_format(b,'%m') = '11'").Rows() - c.Assert(fmt.Sprintf("%v", rows[0][4]), Equals, "gt(cast(test.t.a, decimal(10,2) BINARY), 10.10), lt(test.t.b, 1994-01-01)") - c.Assert(fmt.Sprintf("%v", rows[2][4]), Equals, "eq(date_format(test.t.b, \"%m\"), \"11\"), gt(test.t.b, 1988-01-01)") + require.Equal(t, "gt(cast(test.t.a, decimal(10,2) BINARY), 10.10), lt(test.t.b, 1994-01-01)", fmt.Sprintf("%v", rows[0][4])) + require.Equal(t, "eq(date_format(test.t.b, \"%m\"), \"11\"), gt(test.t.b, 1988-01-01)", fmt.Sprintf("%v", rows[2][4])) tk.MustExec("set @@session.tidb_isolation_read_engines = 'tikv'") rows = tk.MustQuery("explain format = 'brief' select * from test.t where b > date'1988-01-01' and b < date'1994-01-01' " + "and cast(a as decimal(10,2)) > 10.10 and date_format(b,'%m') = '11'").Rows() - c.Assert(fmt.Sprintf("%v", rows[0][4]), Equals, "eq(date_format(test.t.b, \"%m\"), \"11\"), lt(test.t.b, 1994-01-01)") - c.Assert(fmt.Sprintf("%v", rows[2][4]), Equals, "gt(cast(test.t.a, decimal(10,2) BINARY), 10.10), gt(test.t.b, 1988-01-01)") + require.Equal(t, "eq(date_format(test.t.b, \"%m\"), \"11\"), lt(test.t.b, 1994-01-01)", fmt.Sprintf("%v", rows[0][4])) + require.Equal(t, "gt(cast(test.t.a, decimal(10,2) BINARY), 10.10), gt(test.t.b, 1988-01-01)", fmt.Sprintf("%v", rows[2][4])) tk.MustExec("delete from mysql.expr_pushdown_blacklist where name = '<' and store_type = 'tikv,tiflash,tidb' and reason = 'for test'") tk.MustExec("delete from mysql.expr_pushdown_blacklist where name = 'date_format' and store_type = 'tikv' and reason = 'for test'") tk.MustExec("admin reload expr_pushdown_blacklist") } -func (s *testIntegrationSuite) TestOptRuleBlacklist(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestOptRuleBlacklist(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustQuery(`select * from mysql.opt_rule_blacklist`).Check(testkit.Rows()) } -func (s *testIntegrationSuite) TestIssue10804(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue10804(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustQuery(`SELECT @@information_schema_stats_expiry`).Check(testkit.Rows(`86400`)) tk.MustExec("/*!80000 SET SESSION information_schema_stats_expiry=0 */") tk.MustQuery(`SELECT @@information_schema_stats_expiry`).Check(testkit.Rows(`0`)) @@ -5727,16 +3584,19 @@ func (s *testIntegrationSuite) TestIssue10804(c *C) { tk.MustQuery(`SELECT @@GLOBAL.information_schema_stats_expiry`).Check(testkit.Rows(`0`)) } -func (s *testIntegrationSuite) TestInvalidEndingStatement(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestInvalidEndingStatement(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") parseErrMsg := "[parser:1064]" errMsgLen := len(parseErrMsg) assertParseErr := func(sql string) { _, err := tk.Exec(sql) - c.Assert(err, NotNil) - c.Assert(err.Error()[:errMsgLen], Equals, parseErrMsg) + require.Error(t, err) + require.Equal(t, err.Error()[:errMsgLen], parseErrMsg) } assertParseErr("drop table if exists t'xyz") @@ -5746,16 +3606,22 @@ func (s *testIntegrationSuite) TestInvalidEndingStatement(c *C) { assertParseErr(`drop table if exists t"`) } -func (s *testIntegrationSuite) TestIssue15613(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue15613(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustQuery("select sec_to_time(1e-4)").Check(testkit.Rows("00:00:00.000100")) tk.MustQuery("select sec_to_time(1e-5)").Check(testkit.Rows("00:00:00.000010")) tk.MustQuery("select sec_to_time(1e-6)").Check(testkit.Rows("00:00:00.000001")) tk.MustQuery("select sec_to_time(1e-7)").Check(testkit.Rows("00:00:00.000000")) } -func (s *testIntegrationSuite) TestIssue10675(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue10675(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec(`drop table if exists t;`) tk.MustExec(`create table t(a int);`) @@ -5784,8 +3650,11 @@ func (s *testIntegrationSuite) TestIssue10675(c *C) { tk.MustQuery(`select count(*) from t where b = b'111111111111111111111111111111111111111111111111111111111111111';`).Check(testkit.Rows("1")) } -func (s *testIntegrationSuite) TestDatetimeMicrosecond(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestDatetimeMicrosecond(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) // For int tk.MustQuery(`select DATE_ADD('2007-03-28 22:08:28',INTERVAL -2 SECOND_MICROSECOND);`).Check( testkit.Rows("2007-03-28 22:08:27.800000")) @@ -5935,8 +3804,12 @@ func (s *testIntegrationSuite) TestDatetimeMicrosecond(c *C) { testkit.Rows("2007-03-28 22:08:27.999998")) } -func (s *testIntegrationSuite) TestFuncCaseWithLeftJoin(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestFuncCaseWithLeftJoin(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec("create table kankan1(id int, name text)") tk.MustExec("insert into kankan1 values(1, 'a')") @@ -5948,8 +3821,11 @@ func (s *testIntegrationSuite) TestFuncCaseWithLeftJoin(c *C) { tk.MustQuery("select t1.id from kankan1 t1 left join kankan2 t2 on t1.id = t2.id where (case when t1.name='b' then 'case2' when t1.name='a' then 'case1' else NULL end) = 'case1' order by t1.id").Check(testkit.Rows("1", "2")) } -func (s *testIntegrationSuite) TestIssue11594(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue11594(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec(`drop table if exists t1;`) tk.MustExec("CREATE TABLE t1 (v bigint(20) UNSIGNED NOT NULL);") @@ -5960,14 +3836,20 @@ func (s *testIntegrationSuite) TestIssue11594(c *C) { tk.MustQuery("SELECT sum(COALESCE(cast(null+rand() as unsigned), v)) FROM t1;").Check(testkit.Rows("3")) } -func (s *testIntegrationSuite) TestDefEnableVectorizedEvaluation(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestDefEnableVectorizedEvaluation(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use mysql") tk.MustQuery(`select @@tidb_enable_vectorized_expression`).Check(testkit.Rows("1")) } -func (s *testIntegrationSuite) TestIssue11309And11319(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue11309And11319(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec(`drop table if exists t;`) tk.MustExec(`CREATE TABLE t (a decimal(6,3),b double(6,3),c float(6,3));`) @@ -6013,47 +3895,60 @@ func (s *testIntegrationSuite) TestIssue11309And11319(c *C) { tk.MustQuery(`SELECT DATE_ADD('2007-03-28 22:08:28',INTERVAL 2.2 YEAR_MONTH)`).Check(testkit.Rows("2009-05-28 22:08:28")) } -func (s *testIntegrationSuite) TestIssue12301(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue12301(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("create table t (d decimal(19, 0), i bigint(11))") tk.MustExec("insert into t values (123456789012, 123456789012)") tk.MustQuery("select * from t where d = i").Check(testkit.Rows("123456789012 123456789012")) } -func (s *testIntegrationSerialSuite) TestIssue15315(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue15315(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustQuery("select '0-3261554956'+0.0").Check(testkit.Rows("0")) tk.MustQuery("select cast('0-1234' as real)").Check(testkit.Rows("0")) } -func (s *testIntegrationSuite) TestNotExistFunc(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestNotExistFunc(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) // current db is empty _, err := tk.Exec("SELECT xxx(1)") - c.Assert(err.Error(), Equals, "[planner:1046]No database selected") + require.Error(t, err, "[planner:1046]No database selected") _, err = tk.Exec("SELECT yyy()") - c.Assert(err.Error(), Equals, "[planner:1046]No database selected") + require.Error(t, err, "[planner:1046]No database selected") // current db is not empty tk.MustExec("use test") _, err = tk.Exec("SELECT xxx(1)") - c.Assert(err.Error(), Equals, "[expression:1305]FUNCTION test.xxx does not exist") + require.Error(t, err, "[expression:1305]FUNCTION test.xxx does not exist") _, err = tk.Exec("SELECT yyy()") - c.Assert(err.Error(), Equals, "[expression:1305]FUNCTION test.yyy does not exist") + require.Error(t, err, "[expression:1305]FUNCTION test.yyy does not exist") tk.MustExec("use test") _, err = tk.Exec("SELECT timestampliteral(rand())") - c.Assert(err.Error(), Equals, "[expression:1305]FUNCTION test.timestampliteral does not exist") + require.Error(t, err, "[expression:1305]FUNCTION test.timestampliteral does not exist") } -func (s *testIntegrationSuite) TestDecodetoChunkReuse(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestDecodetoChunkReuse(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec("create table chk (a int,b varchar(20))") for i := 0; i < 200; i++ { if i%5 == 0 { @@ -6063,7 +3958,7 @@ func (s *testIntegrationSuite) TestDecodetoChunkReuse(c *C) { tk.MustExec(fmt.Sprintf("insert chk values (%d,'%s')", i, strconv.Itoa(i))) } - tk.Se.GetSessionVars().SetDistSQLScanConcurrency(1) + tk.Session().GetSessionVars().SetDistSQLScanConcurrency(1) tk.MustExec("set tidb_init_chunk_size = 2") tk.MustExec("set tidb_max_chunk_size = 32") defer func() { @@ -6071,35 +3966,39 @@ func (s *testIntegrationSuite) TestDecodetoChunkReuse(c *C) { tk.MustExec(fmt.Sprintf("set tidb_max_chunk_size = %d", variable.DefMaxChunkSize)) }() rs, err := tk.Exec("select * from chk") - c.Assert(err, IsNil) - req := rs.NewChunk() + require.NoError(t, err) + req := rs.NewChunk(nil) var count int for { err = rs.Next(context.TODO(), req) - c.Assert(err, IsNil) + require.NoError(t, err) numRows := req.NumRows() if numRows == 0 { break } for i := 0; i < numRows; i++ { if count%5 == 0 { - c.Assert(req.GetRow(i).IsNull(0), Equals, true) - c.Assert(req.GetRow(i).IsNull(1), Equals, true) + require.True(t, req.GetRow(i).IsNull(0)) + require.True(t, req.GetRow(i).IsNull(1)) } else { - c.Assert(req.GetRow(i).IsNull(0), Equals, false) - c.Assert(req.GetRow(i).IsNull(1), Equals, false) - c.Assert(req.GetRow(i).GetInt64(0), Equals, int64(count)) - c.Assert(req.GetRow(i).GetString(1), Equals, strconv.Itoa(count)) + require.False(t, req.GetRow(i).IsNull(0)) + require.False(t, req.GetRow(i).IsNull(1)) + require.Equal(t, int64(count), req.GetRow(i).GetInt64(0)) + require.Equal(t, strconv.Itoa(count), req.GetRow(i).GetString(1)) } count++ } } - c.Assert(count, Equals, 200) + require.Equal(t, count, 200) rs.Close() } -func (s *testIntegrationSuite) TestInMeetsPrepareAndExecute(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestInMeetsPrepareAndExecute(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec("prepare pr1 from 'select ? in (1,?,?)'") tk.MustExec("set @a=1, @b=2, @c=3") tk.MustQuery("execute pr1 using @a,@b,@c").Check(testkit.Rows("1")) @@ -6117,8 +4016,12 @@ func (s *testIntegrationSuite) TestInMeetsPrepareAndExecute(c *C) { tk.MustQuery("execute pr4 using @a,@b,@c,@d").Check(testkit.Rows("0")) } -func (s *testIntegrationSuite) TestCastStrToInt(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestCastStrToInt(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") cases := []struct { sql string result int @@ -6130,114 +4033,47 @@ func (s *testIntegrationSuite) TestCastStrToInt(c *C) { {"select cast('-123e456' as signed)", -123}, } for _, ca := range cases { - tk.Se.GetSessionVars().StmtCtx.SetWarnings(nil) + tk.Session().GetSessionVars().StmtCtx.SetWarnings(nil) tk.MustQuery(ca.sql).Check(testkit.Rows(fmt.Sprintf("%v", ca.result))) - c.Assert(terror.ErrorEqual(tk.Se.GetSessionVars().StmtCtx.GetWarnings()[0].Err, types.ErrTruncatedWrongVal), IsTrue) + require.True(t, terror.ErrorEqual(tk.Session().GetSessionVars().StmtCtx.GetWarnings()[0].Err, types.ErrTruncatedWrongVal)) } } -func (s *testIntegrationSerialSuite) TestPreparePlanCache(c *C) { - tk := testkit.NewTestKit(c, s.store) - - // Plan cache should now be off by default - c.Assert(plannercore.PreparedPlanCacheEnabled(), Equals, false) - - orgEnable := plannercore.PreparedPlanCacheEnabled() - defer func() { - plannercore.SetPreparedPlanCache(orgEnable) - }() - plannercore.SetPreparedPlanCache(true) - var err error - tk.Se, err = session.CreateSession4TestWithOpt(s.store, &session.Opt{ - PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), - }) - c.Assert(err, IsNil) - // Use the example from the docs https://docs.pingcap.com/tidb/stable/sql-prepare-plan-cache - tk.MustExec("use test") - tk.MustExec("drop table if exists t;") - tk.MustExec("create table t(a int);") - tk.MustExec("prepare stmt from 'select * from t where a = ?';") - tk.MustExec("set @a = 1;") - tk.MustExec("execute stmt using @a;") - tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) - tk.MustExec("execute stmt using @a;") - tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) -} - -func (s *testIntegrationSerialSuite) TestIssue16205(c *C) { - tk := testkit.NewTestKit(c, s.store) - orgEnable := plannercore.PreparedPlanCacheEnabled() - defer func() { - plannercore.SetPreparedPlanCache(orgEnable) - }() - plannercore.SetPreparedPlanCache(true) - var err error - tk.Se, err = session.CreateSession4TestWithOpt(s.store, &session.Opt{ - PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), - }) - c.Assert(err, IsNil) - - tk.MustExec("use test") - tk.MustExec("prepare stmt from 'select random_bytes(3)'") - rows1 := tk.MustQuery("execute stmt").Rows() - c.Assert(len(rows1), Equals, 1) - rows2 := tk.MustQuery("execute stmt").Rows() - c.Assert(len(rows2), Equals, 1) - c.Assert(rows1[0][0].(string), Not(Equals), rows2[0][0].(string)) -} - -func (s *testIntegrationSerialSuite) TestRowCountPlanCache(c *C) { - tk := testkit.NewTestKit(c, s.store) - orgEnable := plannercore.PreparedPlanCacheEnabled() - defer func() { - plannercore.SetPreparedPlanCache(orgEnable) - }() - plannercore.SetPreparedPlanCache(true) - var err error - tk.Se, err = session.CreateSession4TestWithOpt(s.store, &session.Opt{ - PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), - }) - c.Assert(err, IsNil) - - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a int auto_increment primary key)") - tk.MustExec("prepare stmt from 'select row_count()';") - tk.MustExec("insert into t values()") - res := tk.MustQuery("execute stmt").Rows() - c.Assert(len(res), Equals, 1) - c.Assert(res[0][0], Equals, "1") - tk.MustExec("insert into t values(),(),()") - res = tk.MustQuery("execute stmt").Rows() - c.Assert(len(res), Equals, 1) - c.Assert(res[0][0], Equals, "3") -} - -func (s *testIntegrationSuite) TestValuesForBinaryLiteral(c *C) { +func TestValuesForBinaryLiteral(t *testing.T) { // See issue #15310 - tk := testkit.NewTestKit(c, s.store) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test;") tk.MustExec("create table testValuesBinary(id int primary key auto_increment, a bit(1));") tk.MustExec("insert into testValuesBinary values(1,1);") err := tk.ExecToErr("insert into testValuesBinary values(1,1) on duplicate key update id = values(id),a = values(a);") - c.Assert(err, IsNil) + require.NoError(t, err) tk.MustQuery("select a=0 from testValuesBinary;").Check(testkit.Rows("0")) err = tk.ExecToErr("insert into testValuesBinary values(1,0) on duplicate key update id = values(id),a = values(a);") - c.Assert(err, IsNil) + require.NoError(t, err) tk.MustQuery("select a=0 from testValuesBinary;").Check(testkit.Rows("1")) tk.MustExec("drop table testValuesBinary;") } -func (s *testIntegrationSuite) TestIssue14159(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestIssue14159(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec("DROP TABLE IF EXISTS t") tk.MustExec("CREATE TABLE t (v VARCHAR(100))") tk.MustExec("INSERT INTO t VALUES ('3289742893213123732904809')") tk.MustQuery("SELECT * FROM t WHERE v").Check(testkit.Rows("3289742893213123732904809")) } -func (s *testIntegrationSuite) TestIssue14146(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue14146(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("create table tt(a varchar(10))") tk.MustExec("insert into tt values(NULL)") @@ -6245,79 +4081,32 @@ func (s *testIntegrationSuite) TestIssue14146(c *C) { tk.MustQuery("select * from tt").Check(testkit.Rows("<nil>")) } -func (s *testIntegrationSuite) TestIssue15346(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) - tk.MustQuery("select collation(format_bytes(1024)) != 'binary';").Check(testkit.Rows("1")) - tk.MustQuery("select collation(format_nano_time(234)) != 'binary';").Check(testkit.Rows("1")) -} - -func (s *testIntegrationSerialSuite) TestCacheRegexpr(c *C) { - tk := testkit.NewTestKit(c, s.store) - orgEnable := plannercore.PreparedPlanCacheEnabled() - defer func() { - plannercore.SetPreparedPlanCache(orgEnable) - }() - plannercore.SetPreparedPlanCache(true) - var err error - tk.Se, err = session.CreateSession4TestWithOpt(s.store, &session.Opt{ - PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), - }) - c.Assert(err, IsNil) +func TestIssue15346(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") - tk.MustExec("drop table if exists t1") - tk.MustExec("create table t1 (a varchar(40))") - tk.MustExec("insert into t1 values ('C1'),('R1')") - tk.MustExec("prepare stmt1 from 'select a from t1 where a rlike ?'") - tk.MustExec("set @a='^C.*'") - tk.MustQuery("execute stmt1 using @a").Check(testkit.Rows("C1")) - tk.MustExec("set @a='^R.*'") - tk.MustQuery("execute stmt1 using @a").Check(testkit.Rows("R1")) + tk.MustQuery("select collation(format_bytes(1024)) != 'binary';").Check(testkit.Rows("1")) + tk.MustQuery("select collation(format_nano_time(234)) != 'binary';").Check(testkit.Rows("1")) } -func (s *testIntegrationSerialSuite) TestCacheRefineArgs(c *C) { - tk := testkit.NewTestKit(c, s.store) - orgEnable := plannercore.PreparedPlanCacheEnabled() - defer func() { - plannercore.SetPreparedPlanCache(orgEnable) - }() - plannercore.SetPreparedPlanCache(true) - var err error - tk.Se, err = session.CreateSession4TestWithOpt(s.store, &session.Opt{ - PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), - }) - c.Assert(err, IsNil) - - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(col_int int)") - tk.MustExec("insert into t values(null)") - tk.MustExec("prepare stmt from 'SELECT ((col_int is true) = ?) AS res FROM t'") - tk.MustExec("set @p0='0.8'") - tk.MustQuery("execute stmt using @p0").Check(testkit.Rows("0")) - tk.MustExec("set @p0='0'") - tk.MustQuery("execute stmt using @p0").Check(testkit.Rows("1")) +func TestOrderByFuncPlanCache(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() - tk.MustExec("delete from t") - tk.MustExec("insert into t values(1)") - tk.MustExec("prepare stmt from 'SELECT col_int < ? FROM t'") - tk.MustExec("set @p0='-184467440737095516167.1'") - tk.MustQuery("execute stmt using @p0").Check(testkit.Rows("0")) -} - -func (s *testIntegrationSuite) TestOrderByFuncPlanCache(c *C) { - tk := testkit.NewTestKit(c, s.store) + tk := testkit.NewTestKit(t, store) orgEnable := plannercore.PreparedPlanCacheEnabled() defer func() { plannercore.SetPreparedPlanCache(orgEnable) }() plannercore.SetPreparedPlanCache(true) var err error - tk.Se, err = session.CreateSession4TestWithOpt(s.store, &session.Opt{ + se, err := session.CreateSession4TestWithOpt(store, &session.Opt{ PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), }) - c.Assert(err, IsNil) - + require.NoError(t, err) + tk.SetSession(se) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int)") @@ -6327,19 +4116,22 @@ func (s *testIntegrationSuite) TestOrderByFuncPlanCache(c *C) { tk.MustQuery("execute stmt").Check(testkit.Rows()) } -func (s *testIntegrationSuite) TestSelectLimitPlanCache(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestSelectLimitPlanCache(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) orgEnable := plannercore.PreparedPlanCacheEnabled() defer func() { plannercore.SetPreparedPlanCache(orgEnable) }() plannercore.SetPreparedPlanCache(true) var err error - tk.Se, err = session.CreateSession4TestWithOpt(s.store, &session.Opt{ + se, err := session.CreateSession4TestWithOpt(store, &session.Opt{ PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), }) - c.Assert(err, IsNil) - + require.NoError(t, err) + tk.SetSession(se) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int)") @@ -6359,8 +4151,11 @@ func (s *testIntegrationSuite) TestSelectLimitPlanCache(c *C) { tk.MustQuery("execute stmt").Check(testkit.Rows("1", "2")) } -func (s *testIntegrationSuite) TestCollation(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestCollation(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t (utf8_bin_c varchar(10) charset utf8 collate utf8_bin, utf8_gen_c varchar(10) charset utf8 collate utf8_general_ci, bin_c binary, num_c int, " + @@ -6422,8 +4217,11 @@ func (s *testIntegrationSuite) TestCollation(c *C) { tk.MustQuery("select replace('abc' collate utf8mb4_bin, 'b' collate utf8mb4_general_ci, 'd' collate utf8mb4_unicode_ci);").Check(testkit.Rows("adc")) } -func (s *testIntegrationSuite) TestCoercibility(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestCoercibility(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) type testCase struct { expr string @@ -6460,41 +4258,12 @@ func (s *testIntegrationSuite) TestCoercibility(c *C) { tk.MustQuery("SELECT COERCIBILITY(@straaa);").Check(testkit.Rows("2")) } -func (s *testIntegrationSerialSuite) TestCacheConstEval(c *C) { - tk := testkit.NewTestKit(c, s.store) - orgEnable := plannercore.PreparedPlanCacheEnabled() - defer func() { - plannercore.SetPreparedPlanCache(orgEnable) - }() - plannercore.SetPreparedPlanCache(true) - var err error - tk.Se, err = session.CreateSession4TestWithOpt(s.store, &session.Opt{ - PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), - }) - c.Assert(err, IsNil) +func TestIssue20071(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(col_double double)") - tk.MustExec("insert into t values (1)") - tk.Se.GetSessionVars().EnableVectorizedExpression = false - tk.MustExec("insert into mysql.expr_pushdown_blacklist values('cast', 'tikv,tiflash,tidb', 'for test')") - tk.MustExec("admin reload expr_pushdown_blacklist") - tk.MustExec("prepare stmt from 'SELECT * FROM (SELECT col_double AS c0 FROM t) t WHERE (ABS((REPEAT(?, ?) OR 5617780767323292672)) < LN(EXP(c0)) + (? ^ ?))'") - tk.MustExec("set @a1 = 'JuvkBX7ykVux20zQlkwDK2DFelgn7'") - tk.MustExec("set @a2 = 1") - tk.MustExec("set @a3 = -112990.35179796701") - tk.MustExec("set @a4 = 87997.92704840179") - // Main purpose here is checking no error is reported. 1 is the result when plan cache is disabled, it is - // incompatible with MySQL actually, update the result after fixing it. - tk.MustQuery("execute stmt using @a1, @a2, @a3, @a4").Check(testkit.Rows("1")) - tk.Se.GetSessionVars().EnableVectorizedExpression = true - tk.MustExec("delete from mysql.expr_pushdown_blacklist where name = 'cast' and store_type = 'tikv,tiflash,tidb' and reason = 'for test'") - tk.MustExec("admin reload expr_pushdown_blacklist") -} - -func (s *testSuite) TestIssue20071(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) tk.MustExec("drop table if exists table_30_utf8_4") tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int)") @@ -6506,8 +4275,12 @@ func (s *testSuite) TestIssue20071(c *C) { tk.MustExec("select a from table_30_utf8_4 order by a") } -func (s *testSuite) TestVirtualGeneratedColumnAndLimit(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestVirtualGeneratedColumnAndLimit(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") tk.MustExec("drop table if exists t;") tk.MustExec("create table t (a int, b int as (a + 1));") tk.MustExec("insert into t(a) values (1);") @@ -6515,243 +4288,11 @@ func (s *testSuite) TestVirtualGeneratedColumnAndLimit(c *C) { tk.MustQuery("select /*+ LIMIT_TO_COP() */ b from t order by b limit 1;").Check(testkit.Rows("2")) } -func (s *testIntegrationSerialSuite) TestCollationBasic(c *C) { - tk := testkit.NewTestKit(c, s.store) - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - tk.MustExec("use test") - tk.MustExec("create table t_ci(a varchar(10) collate utf8mb4_general_ci, unique key(a))") - tk.MustExec("insert into t_ci values ('a')") - tk.MustQuery("select * from t_ci").Check(testkit.Rows("a")) - tk.MustQuery("select * from t_ci").Check(testkit.Rows("a")) - tk.MustQuery("select * from t_ci where a='a'").Check(testkit.Rows("a")) - tk.MustQuery("select * from t_ci where a='A'").Check(testkit.Rows("a")) - tk.MustQuery("select * from t_ci where a='a '").Check(testkit.Rows("a")) - tk.MustQuery("select * from t_ci where a='a '").Check(testkit.Rows("a")) - - tk.MustExec("drop table if exists t") - tk.MustExec("create table t (a varchar(10) primary key,b int)") - tk.MustExec("insert into t values ('a', 1), ('b', 3), ('a', 2) on duplicate key update b = b + 1;") - tk.MustExec("set autocommit=0") - tk.MustExec("insert into t values ('a', 1), ('b', 3), ('a', 2) on duplicate key update b = b + 1;") - tk.MustQuery("select * from t").Check(testkit.Rows("a 4", "b 4")) - tk.MustExec("set autocommit=1") - tk.MustQuery("select * from t").Check(testkit.Rows("a 4", "b 4")) - - tk.MustExec("drop table if exists t") - tk.MustExec("create table t (a varchar(10),b int, key tk (a))") - tk.MustExec("insert into t values ('', 1), ('', 3)") - tk.MustExec("set autocommit=0") - tk.MustExec("update t set b = b + 1") - tk.MustQuery("select * from t").Check(testkit.Rows(" 2", " 4")) - tk.MustExec("set autocommit=1") - tk.MustQuery("select * from t").Check(testkit.Rows(" 2", " 4")) - - tk.MustExec("drop table t_ci") - tk.MustExec("create table t_ci(id bigint primary key, a varchar(10) collate utf8mb4_general_ci, unique key(a, id))") - tk.MustExec("insert into t_ci values (1, 'a')") - tk.MustQuery("select a from t_ci").Check(testkit.Rows("a")) - tk.MustQuery("select a from t_ci").Check(testkit.Rows("a")) - tk.MustQuery("select a from t_ci where a='a'").Check(testkit.Rows("a")) - tk.MustQuery("select a from t_ci where a='A'").Check(testkit.Rows("a")) - tk.MustQuery("select a from t_ci where a='a '").Check(testkit.Rows("a")) - tk.MustQuery("select a from t_ci where a='a '").Check(testkit.Rows("a")) - - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(c set('A', 'B') collate utf8mb4_general_ci);") - tk.MustExec("insert into t values('a');") - tk.MustExec("insert into t values('B');") - tk.MustQuery("select c from t where c = 'a';").Check(testkit.Rows("A")) - tk.MustQuery("select c from t where c = 'A';").Check(testkit.Rows("A")) - tk.MustQuery("select c from t where c = 'b';").Check(testkit.Rows("B")) - tk.MustQuery("select c from t where c = 'B';").Check(testkit.Rows("B")) - - tk.MustExec("drop table if exists t1") - tk.MustExec("CREATE TABLE `t1` (" + - " `COL1` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL," + - " PRIMARY KEY (`COL1`(5)) clustered" + - ")") - tk.MustExec("INSERT INTO `t1` VALUES ('Ȇ');") - tk.MustQuery("select * from t1 where col1 not in (0xc484, 0xe5a4bc, 0xc3b3);").Check(testkit.Rows("Ȇ")) - tk.MustQuery("select * from t1 where col1 >= 0xc484 and col1 <= 0xc3b3;").Check(testkit.Rows("Ȇ")) - - tk.MustQuery("select collation(IF('a' < 'B' collate utf8mb4_general_ci, 'smaller', 'greater' collate utf8mb4_unicode_ci));").Check(testkit.Rows("utf8mb4_unicode_ci")) -} - -func (s *testIntegrationSerialSuite) TestWeightString(c *C) { - tk := testkit.NewTestKit(c, s.store) - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) +func TestIssue17791(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() - type testCase struct { - input []string - result []string - resultAsChar1 []string - resultAsChar3 []string - resultAsBinary1 []string - resultAsBinary5 []string - resultExplicitCollateBin []string - } - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t (id int, a varchar(20) collate utf8mb4_general_ci)") - cases := testCase{ - input: []string{"aAÁàãăâ", "a", "a ", "中", "中 "}, - result: []string{"\x00A\x00A\x00A\x00A\x00A\x00A\x00A", "\x00A", "\x00A", "\x4E\x2D", "\x4E\x2D"}, - resultAsChar1: []string{"\x00A", "\x00A", "\x00A", "\x4E\x2D", "\x4E\x2D"}, - resultAsChar3: []string{"\x00A\x00A\x00A", "\x00A", "\x00A", "\x4E\x2D", "\x4E\x2D"}, - resultAsBinary1: []string{"a", "a", "a", "\xE4", "\xE4"}, - resultAsBinary5: []string{"aA\xc3\x81\xc3", "a\x00\x00\x00\x00", "a \x00\x00", "中\x00\x00", "中 \x00"}, - resultExplicitCollateBin: []string{"aAÁàãăâ", "a", "a", "中", "中"}, - } - values := make([]string, len(cases.input)) - for i, input := range cases.input { - values[i] = fmt.Sprintf("(%d, '%s')", i, input) - } - tk.MustExec("insert into t values " + strings.Join(values, ",")) - rows := tk.MustQuery("select weight_string(a) from t order by id").Rows() - for i, out := range cases.result { - c.Assert(rows[i][0].(string), Equals, out) - } - rows = tk.MustQuery("select weight_string(a as char(1)) from t order by id").Rows() - for i, out := range cases.resultAsChar1 { - c.Assert(rows[i][0].(string), Equals, out) - } - rows = tk.MustQuery("select weight_string(a as char(3)) from t order by id").Rows() - for i, out := range cases.resultAsChar3 { - c.Assert(rows[i][0].(string), Equals, out) - } - rows = tk.MustQuery("select weight_string(a as binary(1)) from t order by id").Rows() - for i, out := range cases.resultAsBinary1 { - c.Assert(rows[i][0].(string), Equals, out) - } - rows = tk.MustQuery("select weight_string(a as binary(5)) from t order by id").Rows() - for i, out := range cases.resultAsBinary5 { - c.Assert(rows[i][0].(string), Equals, out) - } - c.Assert(tk.MustQuery("select weight_string(NULL);").Rows()[0][0], Equals, "<nil>") - c.Assert(tk.MustQuery("select weight_string(7);").Rows()[0][0], Equals, "<nil>") - c.Assert(tk.MustQuery("select weight_string(cast(7 as decimal(5)));").Rows()[0][0], Equals, "<nil>") - c.Assert(tk.MustQuery("select weight_string(cast(20190821 as date));").Rows()[0][0], Equals, "2019-08-21") - c.Assert(tk.MustQuery("select weight_string(cast(20190821 as date) as binary(5));").Rows()[0][0], Equals, "2019-") - c.Assert(tk.MustQuery("select weight_string(7.0);").Rows()[0][0], Equals, "<nil>") - c.Assert(tk.MustQuery("select weight_string(7 AS BINARY(2));").Rows()[0][0], Equals, "7\x00") - // test explicit collation - c.Assert(tk.MustQuery("select weight_string('中 ' collate utf8mb4_general_ci);").Rows()[0][0], Equals, "\x4E\x2D") - c.Assert(tk.MustQuery("select weight_string('中 ' collate utf8mb4_bin);").Rows()[0][0], Equals, "中") - c.Assert(tk.MustQuery("select weight_string('中 ' collate utf8mb4_unicode_ci);").Rows()[0][0], Equals, "\xFB\x40\xCE\x2D") - c.Assert(tk.MustQuery("select collation(a collate utf8mb4_general_ci) from t order by id").Rows()[0][0], Equals, "utf8mb4_general_ci") - c.Assert(tk.MustQuery("select collation('中 ' collate utf8mb4_general_ci);").Rows()[0][0], Equals, "utf8mb4_general_ci") - rows = tk.MustQuery("select weight_string(a collate utf8mb4_bin) from t order by id").Rows() - for i, out := range cases.resultExplicitCollateBin { - c.Assert(rows[i][0].(string), Equals, out) - } - tk.MustGetErrMsg("select weight_string(a collate utf8_general_ci) from t order by id", "[ddl:1253]COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'utf8mb4'") - tk.MustGetErrMsg("select weight_string('中' collate utf8_bin)", "[ddl:1253]COLLATION 'utf8_bin' is not valid for CHARACTER SET 'utf8mb4'") -} - -func (s *testIntegrationSerialSuite) TestCollationCreateIndex(c *C) { - tk := testkit.NewTestKit(c, s.store) - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t (a varchar(10) collate utf8mb4_general_ci);") - tk.MustExec("insert into t values ('a');") - tk.MustExec("insert into t values ('A');") - tk.MustExec("insert into t values ('b');") - tk.MustExec("insert into t values ('B');") - tk.MustExec("insert into t values ('a');") - tk.MustExec("insert into t values ('A');") - tk.MustExec("insert into t values ('ß');") - tk.MustExec("insert into t values ('sa');") - tk.MustExec("create index idx on t(a);") - tk.MustQuery("select * from t order by a").Check(testkit.Rows("a", "A", "a", "A", "b", "B", "ß", "sa")) - - tk.MustExec("drop table if exists t") - tk.MustExec("create table t (a varchar(10) collate utf8mb4_unicode_ci);") - tk.MustExec("insert into t values ('a');") - tk.MustExec("insert into t values ('A');") - tk.MustExec("insert into t values ('b');") - tk.MustExec("insert into t values ('B');") - tk.MustExec("insert into t values ('a');") - tk.MustExec("insert into t values ('A');") - tk.MustExec("insert into t values ('ß');") - tk.MustExec("insert into t values ('sa');") - tk.MustExec("create index idx on t(a);") - tk.MustQuery("select * from t order by a").Check(testkit.Rows("a", "A", "a", "A", "b", "B", "sa", "ß")) -} - -func (s *testIntegrationSerialSuite) TestCollateConstantPropagation(c *C) { - tk := testkit.NewTestKit(c, s.store) - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t (a char(10) collate utf8mb4_bin, b char(10) collate utf8mb4_general_ci);") - tk.MustExec("insert into t values ('a', 'A');") - tk.MustQuery("select * from t t1, t t2 where t1.a=t2.b and t2.b='a' collate utf8mb4_general_ci;").Check(nil) - tk.MustQuery("select * from t t1, t t2 where t1.a=t2.b and t2.b>='a' collate utf8mb4_general_ci;").Check(nil) - tk.MustExec("drop table t;") - tk.MustExec("create table t (a char(10) collate utf8mb4_general_ci, b char(10) collate utf8mb4_general_ci);") - tk.MustExec("insert into t values ('A', 'a');") - tk.MustQuery("select * from t t1, t t2 where t1.a=t2.b and t2.b='a' collate utf8mb4_bin;").Check(testkit.Rows("A a A a")) - tk.MustQuery("select * from t t1, t t2 where t1.a=t2.b and t2.b>='a' collate utf8mb4_bin;").Check(testkit.Rows("A a A a")) - tk.MustExec("drop table t;") - tk.MustExec("set names utf8mb4") - tk.MustExec("create table t (a char(10) collate utf8mb4_general_ci, b char(10) collate utf8_general_ci);") - tk.MustExec("insert into t values ('a', 'A');") - tk.MustQuery("select * from t t1, t t2 where t1.a=t2.b and t2.b='A'").Check(testkit.Rows("a A a A")) - tk.MustExec("drop table t;") - tk.MustExec("create table t(a char collate utf8_general_ci, b char collate utf8mb4_general_ci, c char collate utf8_bin);") - tk.MustExec("insert into t values ('b', 'B', 'B');") - tk.MustQuery("select * from t t1, t t2 where t1.a=t2.b and t2.b=t2.c;").Check(testkit.Rows("b B B b B B")) - tk.MustExec("drop table t;") - tk.MustExec("create table t(a char collate utf8_bin, b char collate utf8_general_ci);") - tk.MustExec("insert into t values ('a', 'A');") - tk.MustQuery("select * from t t1, t t2 where t1.b=t2.b and t2.b=t1.a collate utf8_general_ci;").Check(testkit.Rows("a A a A")) - tk.MustExec("drop table if exists t1, t2;") - tk.MustExec("set names utf8mb4 collate utf8mb4_general_ci;") - tk.MustExec("create table t1(a char, b varchar(10)) charset utf8mb4 collate utf8mb4_general_ci;") - tk.MustExec("create table t2(a char, b varchar(10)) charset utf8mb4 collate utf8mb4_bin;") - tk.MustExec("insert into t1 values ('A', 'a');") - tk.MustExec("insert into t2 values ('a', 'a')") - tk.MustQuery("select * from t1 left join t2 on t1.a = t2.a where t1.a = 'a';").Check(testkit.Rows("A a <nil> <nil>")) - tk.MustExec("drop table t;") - tk.MustExec("set names utf8mb4 collate utf8mb4_general_ci;") - tk.MustExec("create table t(a char collate utf8mb4_bin, b char collate utf8mb4_general_ci);") - tk.MustExec("insert into t values ('a', 'a');") - tk.MustQuery("select * from t t1, t t2 where t2.b = 'A' and lower(concat(t1.a , '' )) = t2.b;").Check(testkit.Rows("a a a a")) - tk.MustExec("drop table t;") - tk.MustExec("create table t(a char collate utf8_unicode_ci, b char collate utf8mb4_unicode_ci, c char collate utf8_bin);") - tk.MustExec("insert into t values ('b', 'B', 'B');") - tk.MustQuery("select * from t t1, t t2 where t1.a=t2.b and t2.b=t2.c;").Check(testkit.Rows("b B B b B B")) - tk.MustExec("drop table if exists t1, t2;") - tk.MustExec("set names utf8mb4 collate utf8mb4_unicode_ci;") - tk.MustExec("create table t1(a char, b varchar(10)) charset utf8mb4 collate utf8mb4_unicode_ci;") - tk.MustExec("create table t2(a char, b varchar(10)) charset utf8mb4 collate utf8mb4_bin;") - tk.MustExec("insert into t1 values ('A', 'a');") - tk.MustExec("insert into t2 values ('a', 'a')") - tk.MustQuery("select * from t1 left join t2 on t1.a = t2.a where t1.a = 'a';").Check(testkit.Rows("A a <nil> <nil>")) - tk.MustExec("drop table if exists t1, t2;") - tk.MustExec("set names utf8mb4 collate utf8mb4_general_ci;") - tk.MustExec("create table t1(a char, b varchar(10)) charset utf8mb4 collate utf8mb4_general_ci;") - tk.MustExec("create table t2(a char, b varchar(10)) charset utf8mb4 collate utf8mb4_unicode_ci;") - tk.MustExec("insert into t1 values ('ß', 's');") - tk.MustExec("insert into t2 values ('s', 's')") - tk.MustQuery("select * from t1 left join t2 on t1.a = t2.a collate utf8mb4_unicode_ci where t1.a = 's';").Check(testkit.Rows("ß s <nil> <nil>")) - tk.MustExec("drop table if exists t1, t2;") - tk.MustExec("create table t1(a char(10) collate utf8mb4_general_ci, index (a));") - tk.MustExec("create table t2(a char(10) collate utf8_bin, index (a));") - tk.MustExec("insert into t1 values ('a');") - tk.MustExec("insert into t2 values ('A');") - tk.MustExec("set names utf8 collate utf8_general_ci;") - tk.MustQuery("select * from t1, t2 where t1.a=t2.a and t1.a= 'a';").Check(testkit.Rows("a A")) -} - -func (s *testIntegrationSuite2) TestIssue17791(c *C) { - tk := testkit.NewTestKit(c, s.store) + tk := testkit.NewTestKit(t, store) tk.MustExec("use test;") tk.MustExec("drop table if exists t;") @@ -6765,519 +4306,11 @@ func (s *testIntegrationSuite2) TestIssue17791(c *C) { tk.MustQuery("SELECT id, pad, expr, NOT 1 BETWEEN -5 AND 5 as expr_in_select FROM t1;").Check(testkit.Rows("1 a 0 0", "2 b 0 0")) } -func (s *testIntegrationSerialSuite) TestMixCollation(c *C) { - tk := testkit.NewTestKit(c, s.store) - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - - tk.MustGetErrMsg(`select 'a' collate utf8mb4_bin = 'a' collate utf8mb4_general_ci;`, "[expression:1267]Illegal mix of collations (utf8mb4_bin,EXPLICIT) and (utf8mb4_general_ci,EXPLICIT) for operation '='") +func TestIssue15986(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() - tk.MustExec("use test;") - tk.MustExec("drop table if exists t;") - tk.MustExec(`create table t ( - mb4general varchar(10) charset utf8mb4 collate utf8mb4_general_ci, - mb4unicode varchar(10) charset utf8mb4 collate utf8mb4_unicode_ci, - mb4bin varchar(10) charset utf8mb4 collate utf8mb4_bin, - general varchar(10) charset utf8 collate utf8_general_ci, - unicode varchar(10) charset utf8 collate utf8_unicode_ci, - utfbin varchar(10) charset utf8 collate utf8_bin, - bin varchar(10) charset binary collate binary, - latin1_bin varchar(10) charset latin1 collate latin1_bin, - ascii_bin varchar(10) charset ascii collate ascii_bin, - i int - );`) - tk.MustExec("insert into t values ('s', 's', 's', 's', 's', 's', 's', 's', 's', 1);") - tk.MustExec("set names utf8mb4 collate utf8mb4_general_ci;") - - tk.MustQuery("select * from t where mb4unicode = 's' collate utf8mb4_unicode_ci;").Check(testkit.Rows("s s s s s s s s s 1")) - tk.MustQuery(`select * from t t1, t t2 where t1.mb4unicode = t2.mb4general collate utf8mb4_general_ci;`).Check(testkit.Rows("s s s s s s s s s 1 s s s s s s s s s 1")) - tk.MustQuery(`select * from t t1, t t2 where t1.mb4general = t2.mb4unicode collate utf8mb4_general_ci;`).Check(testkit.Rows("s s s s s s s s s 1 s s s s s s s s s 1")) - tk.MustQuery(`select * from t t1, t t2 where t1.mb4general = t2.mb4unicode collate utf8mb4_unicode_ci;`).Check(testkit.Rows("s s s s s s s s s 1 s s s s s s s s s 1")) - tk.MustQuery(`select * from t t1, t t2 where t1.mb4unicode = t2.mb4general collate utf8mb4_unicode_ci;`).Check(testkit.Rows("s s s s s s s s s 1 s s s s s s s s s 1")) - tk.MustQuery(`select * from t where mb4general = mb4bin collate utf8mb4_general_ci;`).Check(testkit.Rows("s s s s s s s s s 1")) - tk.MustQuery(`select * from t where mb4unicode = mb4general collate utf8mb4_unicode_ci;`).Check(testkit.Rows("s s s s s s s s s 1")) - tk.MustQuery(`select * from t where mb4general = mb4unicode collate utf8mb4_unicode_ci;`).Check(testkit.Rows("s s s s s s s s s 1")) - tk.MustQuery(`select * from t where mb4unicode = 's' collate utf8mb4_unicode_ci;`).Check(testkit.Rows("s s s s s s s s s 1")) - tk.MustQuery("select * from t where mb4unicode = mb4bin;").Check(testkit.Rows("s s s s s s s s s 1")) - tk.MustQuery("select * from t where general = mb4unicode;").Check(testkit.Rows("s s s s s s s s s 1")) - tk.MustQuery("select * from t where unicode = mb4unicode;").Check(testkit.Rows("s s s s s s s s s 1")) - tk.MustQuery("select * from t where mb4unicode = mb4unicode;").Check(testkit.Rows("s s s s s s s s s 1")) - - tk.MustQuery("select collation(concat(mb4unicode, mb4general collate utf8mb4_unicode_ci)) from t;").Check(testkit.Rows("utf8mb4_unicode_ci")) - tk.MustQuery("select collation(concat(mb4general, mb4unicode, mb4bin)) from t;").Check(testkit.Rows("utf8mb4_bin")) - tk.MustQuery("select coercibility(concat(mb4general, mb4unicode, mb4bin)) from t;").Check(testkit.Rows("1")) - tk.MustQuery("select collation(concat(mb4unicode, mb4bin, concat(mb4general))) from t;").Check(testkit.Rows("utf8mb4_bin")) - tk.MustQuery("select coercibility(concat(mb4unicode, mb4bin)) from t;").Check(testkit.Rows("2")) - tk.MustQuery("select collation(concat(mb4unicode, mb4bin)) from t;").Check(testkit.Rows("utf8mb4_bin")) - tk.MustQuery("select coercibility(concat(mb4bin, concat(mb4general))) from t;").Check(testkit.Rows("2")) - tk.MustQuery("select collation(concaT(mb4bin, cOncAt(mb4general))) from t;").Check(testkit.Rows("utf8mb4_bin")) - tk.MustQuery("select coercibility(concat(mb4unicode, mb4bin, concat(mb4general))) from t;").Check(testkit.Rows("2")) - tk.MustQuery("select collation(concat(mb4unicode, mb4bin, concat(mb4general))) from t;").Check(testkit.Rows("utf8mb4_bin")) - tk.MustQuery("select coercibility(concat(mb4unicode, mb4general)) from t;").Check(testkit.Rows("1")) - tk.MustQuery("select collation(coalesce(mb4unicode, mb4general)) from t;").Check(testkit.Rows("utf8mb4_bin")) - tk.MustQuery("select coercibility(coalesce(mb4unicode, mb4general)) from t;").Check(testkit.Rows("1")) - tk.MustQuery("select collation(CONCAT(concat(mb4unicode), concat(mb4general))) from t;").Check(testkit.Rows("utf8mb4_bin")) - tk.MustQuery("select coercibility(cONcat(unicode, general)) from t;").Check(testkit.Rows("1")) - tk.MustQuery("select collation(concAt(unicode, general)) from t;").Check(testkit.Rows("utf8_bin")) - tk.MustQuery("select collation(concat(bin, mb4general)) from t;").Check(testkit.Rows("binary")) - tk.MustQuery("select coercibility(concat(bin, mb4general)) from t;").Check(testkit.Rows("2")) - tk.MustQuery("select collation(concat(mb4unicode, ascii_bin)) from t;").Check(testkit.Rows("utf8mb4_unicode_ci")) - tk.MustQuery("select coercibility(concat(mb4unicode, ascii_bin)) from t;").Check(testkit.Rows("2")) - tk.MustQuery("select collation(concat(mb4unicode, mb4unicode)) from t;").Check(testkit.Rows("utf8mb4_unicode_ci")) - tk.MustQuery("select coercibility(concat(mb4unicode, mb4unicode)) from t;").Check(testkit.Rows("2")) - tk.MustQuery("select collation(concat(bin, bin)) from t;").Check(testkit.Rows("binary")) - tk.MustQuery("select coercibility(concat(bin, bin)) from t;").Check(testkit.Rows("2")) - tk.MustQuery("select collation(concat(latin1_bin, ascii_bin)) from t;").Check(testkit.Rows("latin1_bin")) - tk.MustQuery("select coercibility(concat(latin1_bin, ascii_bin)) from t;").Check(testkit.Rows("2")) - tk.MustQuery("select collation(concat(mb4unicode, bin)) from t;").Check(testkit.Rows("binary")) - tk.MustQuery("select coercibility(concat(mb4unicode, bin)) from t;").Check(testkit.Rows("2")) - tk.MustQuery("select collation(mb4general collate utf8mb4_unicode_ci) from t;").Check(testkit.Rows("utf8mb4_unicode_ci")) - tk.MustQuery("select coercibility(mb4general collate utf8mb4_unicode_ci) from t;").Check(testkit.Rows("0")) - tk.MustQuery("select collation(concat(concat(mb4unicode, mb4general), concat(unicode, general))) from t;").Check(testkit.Rows("utf8mb4_bin")) - tk.MustQuery("select coercibility(concat(concat(mb4unicode, mb4general), concat(unicode, general))) from t;").Check(testkit.Rows("1")) - tk.MustQuery("select collation(concat(i, 1)) from t;").Check(testkit.Rows("utf8mb4_general_ci")) - tk.MustQuery("select coercibility(concat(i, 1)) from t;").Check(testkit.Rows("4")) - tk.MustQuery("select collation(concat(i, user())) from t;").Check(testkit.Rows("utf8mb4_bin")) - tk.MustQuery("select coercibility(concat(i, user())) from t;").Check(testkit.Rows("3")) - tk.MustGetErrMsg("select * from t where mb4unicode = mb4general;", "[expression:1267]Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '='") - tk.MustGetErrMsg("select * from t where unicode = general;", "[expression:1267]Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '='") - tk.MustGetErrMsg("select concat(mb4general) = concat(mb4unicode) from t;", "[expression:1267]Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_unicode_ci,IMPLICIT) for operation '='") - tk.MustGetErrMsg("select * from t t1, t t2 where t1.mb4unicode = t2.mb4general;", "[expression:1267]Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '='") - tk.MustGetErrMsg("select field('s', mb4general, mb4unicode, mb4bin) from t;", "[expression:1271]Illegal mix of collations for operation 'field'") - tk.MustGetErrMsg("select concat(mb4unicode, mb4general) = mb4unicode from t;", "[expression:1267]Illegal mix of collations (utf8mb4_bin,NONE) and (utf8mb4_unicode_ci,IMPLICIT) for operation '='") - - tk.MustExec("drop table t;") -} - -func (s *testIntegrationSerialSuite) prepare4Join(c *C) *testkit.TestKit { - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("USE test") - tk.MustExec("drop table if exists t") - tk.MustExec("drop table if exists t_bin") - tk.MustExec("CREATE TABLE `t` ( `a` int(11) NOT NULL,`b` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL)") - tk.MustExec("CREATE TABLE `t_bin` ( `a` int(11) NOT NULL,`b` varchar(5) CHARACTER SET binary)") - tk.MustExec("insert into t values (1, 'a'), (2, 'À'), (3, 'á'), (4, 'à'), (5, 'b'), (6, 'c'), (7, ' ')") - tk.MustExec("insert into t_bin values (1, 'a'), (2, 'À'), (3, 'á'), (4, 'à'), (5, 'b'), (6, 'c'), (7, ' ')") - return tk -} - -func (s *testIntegrationSerialSuite) prepare4Join2(c *C) *testkit.TestKit { - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("USE test") - tk.MustExec("drop table if exists t1") - tk.MustExec("drop table if exists t2") - tk.MustExec("create table t1 (id int, v varchar(5) character set binary, key(v))") - tk.MustExec("create table t2 (v varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, key(v))") - tk.MustExec("insert into t1 values (1, 'a'), (2, 'À'), (3, 'á'), (4, 'à'), (5, 'b'), (6, 'c'), (7, ' ')") - tk.MustExec("insert into t2 values ('a'), ('À'), ('á'), ('à'), ('b'), ('c'), (' ')") - return tk -} - -func (s *testIntegrationSerialSuite) TestCollateHashJoin(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - tk := s.prepare4Join(c) - tk.MustQuery("select /*+ TIDB_HJ(t1, t2) */ t1.a, t1.b from t t1, t t2 where t1.b=t2.b order by t1.a").Check( - testkit.Rows("1 a", "1 a", "1 a", "1 a", "2 À", "2 À", "2 À", "2 À", "3 á", "3 á", "3 á", "3 á", "4 à", "4 à", "4 à", "4 à", "5 b", "6 c", "7 ")) - tk.MustQuery("select /*+ TIDB_HJ(t1, t2) */ t1.a, t1.b from t_bin t1, t_bin t2 where t1.b=t2.b order by t1.a").Check( - testkit.Rows("1 a", "2 À", "3 á", "4 à", "5 b", "6 c", "7 ")) - tk.MustQuery("select /*+ TIDB_HJ(t1, t2) */ t1.a, t1.b from t t1, t t2 where t1.b=t2.b and t1.a>3 order by t1.a").Check( - testkit.Rows("4 à", "4 à", "4 à", "4 à", "5 b", "6 c", "7 ")) - tk.MustQuery("select /*+ TIDB_HJ(t1, t2) */ t1.a, t1.b from t_bin t1, t_bin t2 where t1.b=t2.b and t1.a>3 order by t1.a").Check( - testkit.Rows("4 à", "5 b", "6 c", "7 ")) - tk.MustQuery("select /*+ TIDB_HJ(t1, t2) */ t1.a, t1.b from t t1, t t2 where t1.b=t2.b and t1.a>3 order by t1.a").Check( - testkit.Rows("4 à", "4 à", "4 à", "4 à", "5 b", "6 c", "7 ")) - tk.MustQuery("select /*+ TIDB_HJ(t1, t2) */ t1.a, t1.b from t_bin t1, t_bin t2 where t1.b=t2.b and t1.a>3 order by t1.a").Check( - testkit.Rows("4 à", "5 b", "6 c", "7 ")) - tk.MustQuery("select /*+ TIDB_HJ(t1, t2) */ t1.a, t1.b from t t1, t t2 where t1.b=t2.b and t1.a>t2.a order by t1.a").Check( - testkit.Rows("2 À", "3 á", "3 á", "4 à", "4 à", "4 à")) - tk.MustQuery("select /*+ TIDB_HJ(t1, t2) */ t1.a, t1.b from t_bin t1, t_bin t2 where t1.b=t2.b and t1.a>t2.a order by t1.a").Check( - testkit.Rows()) -} - -func (s *testIntegrationSerialSuite) TestCollateHashJoin2(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - tk := s.prepare4Join2(c) - tk.MustQuery("select /*+ TIDB_HJ(t1, t2) */ * from t1, t2 where t1.v=t2.v order by t1.id").Check( - testkit.Rows("1 a a", "2 À À", "3 á á", "4 à à", "5 b b", "6 c c", "7 ")) -} - -func (s *testIntegrationSerialSuite) TestCollateMergeJoin(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - tk := s.prepare4Join(c) - tk.MustQuery("select /*+ TIDB_SMJ(t1, t2) */ t1.a, t1.b from t t1, t t2 where t1.b=t2.b order by t1.a").Check( - testkit.Rows("1 a", "1 a", "1 a", "1 a", "2 À", "2 À", "2 À", "2 À", "3 á", "3 á", "3 á", "3 á", "4 à", "4 à", "4 à", "4 à", "5 b", "6 c", "7 ")) - tk.MustQuery("select /*+ TIDB_SMJ(t1, t2) */ t1.a, t1.b from t_bin t1, t_bin t2 where t1.b=t2.b order by t1.a").Check( - testkit.Rows("1 a", "2 À", "3 á", "4 à", "5 b", "6 c", "7 ")) - tk.MustQuery("select /*+ TIDB_SMJ(t1, t2) */ t1.a, t1.b from t t1, t t2 where t1.b=t2.b and t1.a>3 order by t1.a").Check( - testkit.Rows("4 à", "4 à", "4 à", "4 à", "5 b", "6 c", "7 ")) - tk.MustQuery("select /*+ TIDB_SMJ(t1, t2) */ t1.a, t1.b from t_bin t1, t_bin t2 where t1.b=t2.b and t1.a>3 order by t1.a").Check( - testkit.Rows("4 à", "5 b", "6 c", "7 ")) - tk.MustQuery("select /*+ TIDB_SMJ(t1, t2) */ t1.a, t1.b from t t1, t t2 where t1.b=t2.b and t1.a>3 order by t1.a").Check( - testkit.Rows("4 à", "4 à", "4 à", "4 à", "5 b", "6 c", "7 ")) - tk.MustQuery("select /*+ TIDB_SMJ(t1, t2) */ t1.a, t1.b from t_bin t1, t_bin t2 where t1.b=t2.b and t1.a>3 order by t1.a").Check( - testkit.Rows("4 à", "5 b", "6 c", "7 ")) - tk.MustQuery("select /*+ TIDB_SMJ(t1, t2) */ t1.a, t1.b from t t1, t t2 where t1.b=t2.b and t1.a>t2.a order by t1.a").Check( - testkit.Rows("2 À", "3 á", "3 á", "4 à", "4 à", "4 à")) - tk.MustQuery("select /*+ TIDB_SMJ(t1, t2) */ t1.a, t1.b from t_bin t1, t_bin t2 where t1.b=t2.b and t1.a>t2.a order by t1.a").Check( - testkit.Rows()) -} - -func (s *testIntegrationSerialSuite) TestCollateMergeJoin2(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - tk := s.prepare4Join2(c) - tk.MustQuery("select /*+ TIDB_SMJ(t1, t2) */ * from t1, t2 where t1.v=t2.v order by t1.id").Check( - testkit.Rows("1 a a", "2 À À", "3 á á", "4 à à", "5 b b", "6 c c", "7 ")) -} - -func (s *testIntegrationSerialSuite) TestCollateIndexMergeJoin(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t (a varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, b varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, key(a), key(b))") - tk.MustExec("insert into t values ('a', 'x'), ('x', 'À'), ('á', 'x'), ('à', 'à'), ('à', 'x')") - - tk.MustExec("set tidb_enable_index_merge=1") - tk.MustQuery("select /*+ USE_INDEX_MERGE(t, a, b) */ * from t where a = 'a' or b = 'a'").Sort().Check( - testkit.Rows("a x", "x À", "à x", "à à", "á x")) -} - -func (s *testIntegrationSerialSuite) prepare4Collation(c *C, hasIndex bool) *testkit.TestKit { - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("USE test") - tk.MustExec("drop table if exists t") - tk.MustExec("drop table if exists t_bin") - idxSQL := ", key(v)" - if !hasIndex { - idxSQL = "" - } - tk.MustExec(fmt.Sprintf("create table t (id int, v varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL %v)", idxSQL)) - tk.MustExec(fmt.Sprintf("create table t_bin (id int, v varchar(5) CHARACTER SET binary %v)", idxSQL)) - tk.MustExec("insert into t values (1, 'a'), (2, 'À'), (3, 'á'), (4, 'à'), (5, 'b'), (6, 'c'), (7, ' ')") - tk.MustExec("insert into t_bin values (1, 'a'), (2, 'À'), (3, 'á'), (4, 'à'), (5, 'b'), (6, 'c'), (7, ' ')") - return tk -} - -func (s *testIntegrationSerialSuite) TestCollateSelection(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - tk := s.prepare4Collation(c, false) - tk.MustQuery("select v from t where v='a' order by id").Check(testkit.Rows("a", "À", "á", "à")) - tk.MustQuery("select v from t_bin where v='a' order by id").Check(testkit.Rows("a")) - tk.MustQuery("select v from t where v<'b' and id<=3").Check(testkit.Rows("a", "À", "á")) - tk.MustQuery("select v from t_bin where v<'b' and id<=3").Check(testkit.Rows("a")) -} - -func (s *testIntegrationSerialSuite) TestCollateSort(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - tk := s.prepare4Collation(c, false) - tk.MustQuery("select id from t order by v, id").Check(testkit.Rows("7", "1", "2", "3", "4", "5", "6")) - tk.MustQuery("select id from t_bin order by v, id").Check(testkit.Rows("7", "1", "5", "6", "2", "4", "3")) - - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a char(10) collate utf8mb4_general_ci, key(a))") - tk.MustExec("insert into t values ('a'), ('A'), ('b')") - tk.MustExec("insert into t values ('a'), ('A'), ('b')") - tk.MustExec("insert into t values ('a'), ('A'), ('b')") - tk.MustQuery("select * from t order by a collate utf8mb4_bin").Check(testkit.Rows("A", "A", "A", "a", "a", "a", "b", "b", "b")) - tk.MustQuery("select * from t order by a collate utf8mb4_general_ci").Check(testkit.Rows("a", "A", "a", "A", "a", "A", "b", "b", "b")) - tk.MustQuery("select * from t order by a collate utf8mb4_unicode_ci").Check(testkit.Rows("a", "A", "a", "A", "a", "A", "b", "b", "b")) -} - -func (s *testIntegrationSerialSuite) TestCollateHashAgg(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - tk := s.prepare4Collation(c, false) - tk.HasPlan("select distinct(v) from t_bin", "HashAgg") - tk.MustQuery("select distinct(v) from t_bin").Sort().Check(testkit.Rows(" ", "a", "b", "c", "À", "à", "á")) - tk.HasPlan("select distinct(v) from t", "HashAgg") - tk.MustQuery("select distinct(v) from t").Sort().Check(testkit.Rows(" ", "a", "b", "c")) - tk.HasPlan("select v, count(*) from t_bin group by v", "HashAgg") - tk.MustQuery("select v, count(*) from t_bin group by v").Sort().Check(testkit.Rows(" 1", "a 1", "b 1", "c 1", "À 1", "à 1", "á 1")) - tk.HasPlan("select v, count(*) from t group by v", "HashAgg") - tk.MustQuery("select v, count(*) from t group by v").Sort().Check(testkit.Rows(" 1", "a 4", "b 1", "c 1")) - - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a char(10) collate utf8mb4_general_ci, key(a))") - tk.MustExec("insert into t values ('a'), ('A'), ('b')") - tk.MustExec("insert into t values ('a'), ('A'), ('b')") - tk.MustExec("insert into t values ('a'), ('A'), ('b')") - tk.MustExec("insert into t values ('s'), ('ss'), ('ß')") - tk.MustQuery("select count(1) from t group by a collate utf8mb4_bin order by a collate utf8mb4_bin").Check(testkit.Rows("3", "3", "3", "1", "1", "1")) - tk.MustQuery("select count(1) from t group by a collate utf8mb4_unicode_ci order by a collate utf8mb4_unicode_ci").Check(testkit.Rows("6", "3", "1", "2")) - tk.MustQuery("select count(1) from t group by a collate utf8mb4_general_ci order by a collate utf8mb4_general_ci").Check(testkit.Rows("6", "3", "2", "1")) -} - -func (s *testIntegrationSerialSuite) TestCollateStreamAgg(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - tk := s.prepare4Collation(c, true) - tk.HasPlan("select distinct(v) from t_bin", "StreamAgg") - tk.MustQuery("select distinct(v) from t_bin").Sort().Check(testkit.Rows(" ", "a", "b", "c", "À", "à", "á")) - tk.HasPlan("select distinct(v) from t", "StreamAgg") - tk.MustQuery("select distinct(v) from t").Sort().Check(testkit.Rows(" ", "a", "b", "c")) - tk.HasPlan("select v, count(*) from t_bin group by v", "StreamAgg") - tk.MustQuery("select v, count(*) from t_bin group by v").Sort().Check(testkit.Rows(" 1", "a 1", "b 1", "c 1", "À 1", "à 1", "á 1")) - tk.HasPlan("select v, count(*) from t group by v", "StreamAgg") - tk.MustQuery("select v, count(*) from t group by v").Sort().Check(testkit.Rows(" 1", "a 4", "b 1", "c 1")) -} - -func (s *testIntegrationSerialSuite) TestCollateIndexReader(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - tk := s.prepare4Collation(c, true) - tk.HasPlan("select v from t where v < 'b' order by v", "IndexReader") - tk.MustQuery("select v from t where v < 'b' order by v").Check(testkit.Rows(" ", "a", "À", "á", "à")) - tk.HasPlan("select v from t where v < 'b' and v > ' ' order by v", "IndexReader") - tk.MustQuery("select v from t where v < 'b' and v > ' ' order by v").Check(testkit.Rows("a", "À", "á", "à")) - tk.HasPlan("select v from t_bin where v < 'b' order by v", "IndexReader") - tk.MustQuery("select v from t_bin where v < 'b' order by v").Sort().Check(testkit.Rows(" ", "a")) - tk.HasPlan("select v from t_bin where v < 'b' and v > ' ' order by v", "IndexReader") - tk.MustQuery("select v from t_bin where v < 'b' and v > ' ' order by v").Sort().Check(testkit.Rows("a")) -} - -func (s *testIntegrationSerialSuite) TestCollateIndexLookup(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - tk := s.prepare4Collation(c, true) - - tk.HasPlan("select id from t where v < 'b'", "IndexLookUp") - tk.MustQuery("select id from t where v < 'b'").Sort().Check(testkit.Rows("1", "2", "3", "4", "7")) - tk.HasPlan("select id from t where v < 'b' and v > ' '", "IndexLookUp") - tk.MustQuery("select id from t where v < 'b' and v > ' '").Sort().Check(testkit.Rows("1", "2", "3", "4")) - tk.HasPlan("select id from t_bin where v < 'b'", "IndexLookUp") - tk.MustQuery("select id from t_bin where v < 'b'").Sort().Check(testkit.Rows("1", "7")) - tk.HasPlan("select id from t_bin where v < 'b' and v > ' '", "IndexLookUp") - tk.MustQuery("select id from t_bin where v < 'b' and v > ' '").Sort().Check(testkit.Rows("1")) -} - -func (s *testIntegrationSerialSuite) TestIssue16668(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists tx") - tk.MustExec("CREATE TABLE `tx` ( `a` int(11) NOT NULL,`b` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL)") - tk.MustExec("insert into tx values (1, 'a'), (2, 'À'), (3, 'á'), (4, 'à'), (5, 'b'), (6, 'c'), (7, ' ')") - tk.MustQuery("select count(distinct(b)) from tx").Check(testkit.Rows("4")) -} - -func (s *testIntegrationSerialSuite) TestIssue27091(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists tx") - tk.MustExec("CREATE TABLE `tx` ( `a` int(11) NOT NULL,`b` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, `c` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL)") - tk.MustExec("insert into tx values (1, 'a', 'a'), (2, 'A ', 'a '), (3, 'A', 'A'), (4, 'a ', 'A ')") - tk.MustQuery("select count(distinct b) from tx").Check(testkit.Rows("1")) - tk.MustQuery("select count(distinct c) from tx").Check(testkit.Rows("2")) - tk.MustQuery("select count(distinct b, c) from tx where a < 3").Check(testkit.Rows("1")) - tk.MustQuery("select approx_count_distinct(b) from tx").Check(testkit.Rows("1")) - tk.MustQuery("select approx_count_distinct(c) from tx").Check(testkit.Rows("2")) - tk.MustQuery("select approx_count_distinct(b, c) from tx where a < 3").Check(testkit.Rows("1")) -} - -func (s *testIntegrationSerialSuite) TestCollateStringFunction(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - tk := testkit.NewTestKit(c, s.store) - - tk.MustQuery("select field('a', 'b', 'a');").Check(testkit.Rows("2")) - tk.MustQuery("select field('a', 'b', 'A');").Check(testkit.Rows("0")) - tk.MustQuery("select field('a', 'b', 'A' collate utf8mb4_bin);").Check(testkit.Rows("0")) - tk.MustQuery("select field('a', 'b', 'a ' collate utf8mb4_bin);").Check(testkit.Rows("2")) - tk.MustQuery("select field('a', 'b', 'A' collate utf8mb4_unicode_ci);").Check(testkit.Rows("2")) - tk.MustQuery("select field('a', 'b', 'a ' collate utf8mb4_unicode_ci);").Check(testkit.Rows("2")) - tk.MustQuery("select field('a', 'b', 'A' collate utf8mb4_general_ci);").Check(testkit.Rows("2")) - tk.MustQuery("select field('a', 'b', 'a ' collate utf8mb4_general_ci);").Check(testkit.Rows("2")) - - tk.MustExec("USE test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a char(10), b char (10)) collate utf8mb4_general_ci") - tk.MustExec("insert into t values ('a', 'A')") - tk.MustQuery("select field(a, b) from t").Check(testkit.Rows("1")) - - tk.MustQuery("select FIND_IN_SET('a','b,a,c,d');").Check(testkit.Rows("2")) - tk.MustQuery("select FIND_IN_SET('a','b,A,c,d');").Check(testkit.Rows("0")) - tk.MustQuery("select FIND_IN_SET('a','b,A,c,d' collate utf8mb4_bin);").Check(testkit.Rows("0")) - tk.MustQuery("select FIND_IN_SET('a','b,a ,c,d' collate utf8mb4_bin);").Check(testkit.Rows("2")) - tk.MustQuery("select FIND_IN_SET('a','b,A,c,d' collate utf8mb4_general_ci);").Check(testkit.Rows("2")) - tk.MustQuery("select FIND_IN_SET('a','b,a ,c,d' collate utf8mb4_general_ci);").Check(testkit.Rows("2")) - - tk.MustExec("set names utf8mb4 collate utf8mb4_general_ci;") - tk.MustQuery("select collation(cast('a' as char));").Check(testkit.Rows("utf8mb4_general_ci")) - tk.MustQuery("select collation(cast('a' as binary));").Check(testkit.Rows("binary")) - tk.MustQuery("select collation(cast('a' collate utf8mb4_bin as char));").Check(testkit.Rows("utf8mb4_general_ci")) - tk.MustQuery("select collation(cast('a' collate utf8mb4_bin as binary));").Check(testkit.Rows("binary")) - - tk.MustQuery("select FIND_IN_SET('a','b,A,c,d' collate utf8mb4_unicode_ci);").Check(testkit.Rows("2")) - tk.MustQuery("select FIND_IN_SET('a','b,a ,c,d' collate utf8mb4_unicode_ci);").Check(testkit.Rows("2")) - - tk.MustExec("select concat('a' collate utf8mb4_bin, 'b' collate utf8mb4_bin);") - tk.MustGetErrMsg("select concat('a' collate utf8mb4_bin, 'b' collate utf8mb4_general_ci);", "[expression:1267]Illegal mix of collations (utf8mb4_bin,EXPLICIT) and (utf8mb4_general_ci,EXPLICIT) for operation 'concat'") - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a char)") - tk.MustGetErrMsg("select * from t t1 join t t2 on t1.a collate utf8mb4_bin = t2.a collate utf8mb4_general_ci;", "[expression:1267]Illegal mix of collations (utf8mb4_bin,EXPLICIT) and (utf8mb4_general_ci,EXPLICIT) for operation '='") - - tk.MustExec("DROP TABLE IF EXISTS t1;") - tk.MustExec("CREATE TABLE t1 ( a int, p1 VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_bin,p2 VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci , p3 VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin,p4 VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci ,n1 VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_bin,n2 VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci , n3 VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin,n4 VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci );") - tk.MustExec("insert into t1 (a,p1,p2,p3,p4,n1,n2,n3,n4) values(1,' 0aA1!测试テストמבחן ',' 0aA1!测试テストמבחן ',' 0aA1!测试テストמבחן ',' 0aA1!测试テストמבחן ',' 0Aa1!测试テストמבחן ',' 0Aa1!测试テストמבחן ',' 0Aa1!测试テストמבחן ',' 0Aa1!测试テストמבחן ');") - - tk.MustQuery("select INSTR(p1,n1) from t1;").Check(testkit.Rows("0")) - tk.MustQuery("select INSTR(p1,n2) from t1;").Check(testkit.Rows("0")) - tk.MustQuery("select INSTR(p1,n3) from t1;").Check(testkit.Rows("0")) - tk.MustQuery("select INSTR(p1,n4) from t1;").Check(testkit.Rows("0")) - tk.MustQuery("select INSTR(p2,n1) from t1;").Check(testkit.Rows("0")) - tk.MustQuery("select INSTR(p2,n2) from t1;").Check(testkit.Rows("1")) - tk.MustQuery("select INSTR(p2,n3) from t1;").Check(testkit.Rows("0")) - tk.MustQuery("select INSTR(p2,n4) from t1;").Check(testkit.Rows("1")) - tk.MustQuery("select INSTR(p3,n1) from t1;").Check(testkit.Rows("0")) - tk.MustQuery("select INSTR(p3,n2) from t1;").Check(testkit.Rows("0")) - tk.MustQuery("select INSTR(p3,n3) from t1;").Check(testkit.Rows("0")) - tk.MustQuery("select INSTR(p3,n4) from t1;").Check(testkit.Rows("0")) - tk.MustQuery("select INSTR(p4,n1) from t1;").Check(testkit.Rows("0")) - tk.MustQuery("select INSTR(p4,n2) from t1;").Check(testkit.Rows("1")) - tk.MustQuery("select INSTR(p4,n3) from t1;").Check(testkit.Rows("0")) - tk.MustQuery("select INSTR(p4,n4) from t1;").Check(testkit.Rows("1")) - - tk.MustExec("truncate table t1;") - tk.MustExec("insert into t1 (a,p1,p2,p3,p4,n1,n2,n3,n4) values (1,'0aA1!测试テストמבחן ','0aA1!测试テストמבחן ','0aA1!测试テストמבחן ','0aA1!测试テストמבחן ','0Aa1!测试テストמבחן','0Aa1!测试テストמבחן','0Aa1!测试テストמבחן','0Aa1!测试テストמבחן');") - tk.MustExec("insert into t1 (a,p1,p2,p3,p4,n1,n2,n3,n4) values (2,'0aA1!测试テストמבחן','0aA1!测试テストמבחן','0aA1!测试テストמבחן','0aA1!测试テストמבחן','0Aa1!测试テストמבחן','0Aa1!测试テストמבחן','0Aa1!测试テストמבחן','0Aa1!测试テストמבחן');") - tk.MustExec("insert into t1 (a,p1,p2,p3,p4,n1,n2,n3,n4) values (3,'0aA1!测试テストמבחן','0aA1!测试テストמבחן','0aA1!测试テストמבחן','0aA1!测试テストמבחן','0Aa1!测试テストמבחן ','0Aa1!测试テストמבחן ','0Aa1!测试テストמבחן ','0Aa1!测试テストמבחן ');") - - tk.MustQuery("select LOCATE(p1,n1) from t1;").Check(testkit.Rows("0", "0", "0")) - tk.MustQuery("select LOCATE(p1,n2) from t1;").Check(testkit.Rows("0", "0", "0")) - tk.MustQuery("select LOCATE(p1,n3) from t1;").Check(testkit.Rows("0", "0", "0")) - tk.MustQuery("select LOCATE(p1,n4) from t1;").Check(testkit.Rows("0", "1", "1")) - tk.MustQuery("select LOCATE(p2,n1) from t1;").Check(testkit.Rows("0", "0", "0")) - tk.MustQuery("select LOCATE(p2,n2) from t1;").Check(testkit.Rows("0", "1", "1")) - tk.MustQuery("select LOCATE(p2,n3) from t1;").Check(testkit.Rows("0", "0", "0")) - tk.MustQuery("select LOCATE(p2,n4) from t1;").Check(testkit.Rows("0", "1", "1")) - tk.MustQuery("select LOCATE(p3,n1) from t1;").Check(testkit.Rows("0", "0", "0")) - tk.MustQuery("select LOCATE(p3,n2) from t1;").Check(testkit.Rows("0", "0", "0")) - tk.MustQuery("select LOCATE(p3,n3) from t1;").Check(testkit.Rows("0", "0", "0")) - tk.MustQuery("select LOCATE(p3,n4) from t1;").Check(testkit.Rows("0", "0", "0")) - tk.MustQuery("select LOCATE(p4,n1) from t1;").Check(testkit.Rows("0", "1", "1")) - tk.MustQuery("select LOCATE(p4,n2) from t1;").Check(testkit.Rows("0", "1", "1")) - tk.MustQuery("select LOCATE(p4,n3) from t1;").Check(testkit.Rows("0", "0", "0")) - tk.MustQuery("select LOCATE(p4,n4) from t1;").Check(testkit.Rows("0", "1", "1")) - - tk.MustQuery("select locate('S', 's' collate utf8mb4_general_ci);").Check(testkit.Rows("1")) - tk.MustQuery("select locate('S', 'a' collate utf8mb4_general_ci);").Check(testkit.Rows("0")) - // MySQL return 0 here, I believe it is a bug in MySQL since 'ß' == 's' under utf8mb4_general_ci collation. - tk.MustQuery("select locate('ß', 's' collate utf8mb4_general_ci);").Check(testkit.Rows("1")) - tk.MustQuery("select locate('S', 's' collate utf8mb4_unicode_ci);").Check(testkit.Rows("1")) - tk.MustQuery("select locate('S', 'a' collate utf8mb4_unicode_ci);").Check(testkit.Rows("0")) - tk.MustQuery("select locate('ß', 'ss' collate utf8mb4_unicode_ci);").Check(testkit.Rows("1")) - - tk.MustExec("truncate table t1;") - tk.MustExec("insert into t1 (a) values (1);") - tk.MustExec("insert into t1 (a,p1,p2,p3,p4,n1,n2,n3,n4) values (2,'0aA1!测试テストמבחן ','0aA1!测试テストמבחן ','0aA1!测试テストמבחן ','0aA1!测试テストמבחן ','0Aa1!测试テストמבחן','0Aa1!测试テストמבחן','0Aa1!测试テストמבחן','0Aa1!测试テストמבחן');") - tk.MustExec("insert into t1 (a,p1,p2,p3,p4,n1,n2,n3,n4) values (3,'0aA1!测试テストמבחן','0aA1!测试テストמבחן','0aA1!测试テストמבחן','0aA1!测试テストמבחן','0Aa1!测试テストמבחן','0Aa1!测试テストמבחן','0Aa1!测试テストמבחן','0Aa1!测试テストמבחן');") - tk.MustExec("insert into t1 (a,p1,p2,p3,p4,n1,n2,n3,n4) values (4,'0aA1!测试テストמבחן','0aA1!测试テストמבחן','0aA1!测试テストמבחן','0aA1!测试テストמבחן','0Aa1!测试テストמבחן ','0Aa1!测试テストמבחן ','0Aa1!测试テストמבחן ','0Aa1!测试テストמבחן ');") - tk.MustExec("insert into t1 (a,p1,p2,p3,p4,n1,n2,n3,n4) values (5,'0aA1!测试テストמבחן0aA1!测试','0aA1!测试テストמבחן0aA1!测试','0aA1!测试テストמבחן0aA1!测试','0aA1!测试テストמבחן0aA1!测试','0Aa1!测试','0Aa1!测试','0Aa1!测试','0Aa1!测试');") - tk.MustExec("insert into t1 (a,p1,p2,p3,p4,n1,n2,n3,n4) values (6,'0aA1!测试テストמבחן0aA1!测试','0aA1!测试テストמבחן0aA1!测试','0aA1!测试テストמבחן0aA1!测试','0aA1!测试テストמבחן0aA1!测试','0aA1!测试','0aA1!测试','0aA1!测试','0aA1!测试');") - tk.MustExec("insert into t1 (a,p1,p2,p3,p4,n1,n2,n3,n4) values (7,'0aA1!测试テストמבחן ','0aA1!测试テストמבחן ','0aA1!测试テストמבחן ','0aA1!测试テストמבחן ','0aA1!测试テストמבחן','0aA1!测试テストמבחן','0aA1!测试テストמבחן','0aA1!测试テストמבחן');") - tk.MustExec("insert into t1 (a,p1,p2,p3,p4,n1,n2,n3,n4) values (8,'0aA1!测试テストמבחן','0aA1!测试テストמבחן','0aA1!测试テストמבחן','0aA1!测试テストמבחן','0aA1!测试テストמבחן ','0aA1!测试テストמבחן ','0aA1!测试テストמבחן ','0aA1!测试テストמבחן ');") - - tk.MustQuery("select p1 REGEXP n1 from t1;").Check(testkit.Rows("<nil>", "0", "0", "0", "0", "1", "1", "0")) - tk.MustQuery("select p1 REGEXP n2 from t1;").Check(testkit.Rows("<nil>", "0", "0", "0", "0", "1", "1", "0")) - tk.MustQuery("select p1 REGEXP n3 from t1;").Check(testkit.Rows("<nil>", "0", "0", "0", "0", "1", "1", "0")) - tk.MustQuery("select p1 REGEXP n4 from t1;").Check(testkit.Rows("<nil>", "1", "1", "0", "1", "1", "1", "0")) - tk.MustQuery("select p2 REGEXP n1 from t1;").Check(testkit.Rows("<nil>", "0", "0", "0", "0", "1", "1", "0")) - tk.MustQuery("select p2 REGEXP n2 from t1;").Check(testkit.Rows("<nil>", "1", "1", "0", "1", "1", "1", "0")) - tk.MustQuery("select p2 REGEXP n3 from t1;").Check(testkit.Rows("<nil>", "0", "0", "0", "0", "1", "1", "0")) - tk.MustQuery("select p2 REGEXP n4 from t1;").Check(testkit.Rows("<nil>", "1", "1", "0", "1", "1", "1", "0")) - tk.MustQuery("select p3 REGEXP n1 from t1;").Check(testkit.Rows("<nil>", "0", "0", "0", "0", "1", "1", "0")) - tk.MustQuery("select p3 REGEXP n2 from t1;").Check(testkit.Rows("<nil>", "0", "0", "0", "0", "1", "1", "0")) - tk.MustQuery("select p3 REGEXP n3 from t1;").Check(testkit.Rows("<nil>", "0", "0", "0", "0", "1", "1", "0")) - tk.MustQuery("select p3 REGEXP n4 from t1;").Check(testkit.Rows("<nil>", "0", "0", "0", "0", "1", "1", "0")) - tk.MustQuery("select p4 REGEXP n1 from t1;").Check(testkit.Rows("<nil>", "1", "1", "0", "1", "1", "1", "0")) - tk.MustQuery("select p4 REGEXP n2 from t1;").Check(testkit.Rows("<nil>", "1", "1", "0", "1", "1", "1", "0")) - tk.MustQuery("select p4 REGEXP n3 from t1;").Check(testkit.Rows("<nil>", "0", "0", "0", "0", "1", "1", "0")) - tk.MustQuery("select p4 REGEXP n4 from t1;").Check(testkit.Rows("<nil>", "1", "1", "0", "1", "1", "1", "0")) - - tk.MustExec("drop table t1;") -} - -func (s *testIntegrationSerialSuite) TestCollateLike(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("set names utf8mb4 collate utf8mb4_general_ci") - tk.MustQuery("select 'a' like 'A'").Check(testkit.Rows("1")) - tk.MustQuery("select 'a' like 'A' collate utf8mb4_general_ci").Check(testkit.Rows("1")) - tk.MustQuery("select 'a' like 'À'").Check(testkit.Rows("1")) - tk.MustQuery("select 'a' like '%À'").Check(testkit.Rows("1")) - tk.MustQuery("select 'a' like '%À '").Check(testkit.Rows("0")) - tk.MustQuery("select 'a' like 'À%'").Check(testkit.Rows("1")) - tk.MustQuery("select 'a' like 'À_'").Check(testkit.Rows("0")) - tk.MustQuery("select 'a' like '%À%'").Check(testkit.Rows("1")) - tk.MustQuery("select 'aaa' like '%ÀAa%'").Check(testkit.Rows("1")) - tk.MustExec("set names utf8mb4 collate utf8mb4_bin") - - tk.MustExec("use test;") - tk.MustExec("drop table if exists t_like;") - tk.MustExec("create table t_like(id int, b varchar(20) collate utf8mb4_general_ci);") - tk.MustExec("insert into t_like values (1, 'aaa'), (2, 'abc'), (3, 'aac');") - tk.MustQuery("select b like 'AaÀ' from t_like order by id;").Check(testkit.Rows("1", "0", "0")) - tk.MustQuery("select b like 'Aa_' from t_like order by id;").Check(testkit.Rows("1", "0", "1")) - tk.MustQuery("select b like '_A_' from t_like order by id;").Check(testkit.Rows("1", "0", "1")) - tk.MustQuery("select b from t_like where b like 'Aa_' order by id;").Check(testkit.Rows("aaa", "aac")) - tk.MustQuery("select b from t_like where b like 'A%' order by id;").Check(testkit.Rows("aaa", "abc", "aac")) - tk.MustQuery("select b from t_like where b like '%A%' order by id;").Check(testkit.Rows("aaa", "abc", "aac")) - tk.MustExec("alter table t_like add index idx_b(b);") - tk.MustQuery("select b from t_like use index(idx_b) where b like 'Aa_' order by id;").Check(testkit.Rows("aaa", "aac")) - tk.MustQuery("select b from t_like use index(idx_b) where b like 'A%' order by id;").Check(testkit.Rows("aaa", "abc", "aac")) - tk.MustQuery("select b from t_like use index(idx_b) where b like '%A%' order by id;").Check(testkit.Rows("aaa", "abc", "aac")) -} - -func (s *testIntegrationSerialSuite) TestCollateSubQuery(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - tk := s.prepare4Collation(c, false) - tk.MustQuery("select id from t where v in (select v from t_bin) order by id").Check(testkit.Rows("1", "2", "3", "4", "5", "6", "7")) - tk.MustQuery("select id from t_bin where v in (select v from t) order by id").Check(testkit.Rows("1", "2", "3", "4", "5", "6", "7")) - tk.MustQuery("select id from t where v not in (select v from t_bin) order by id").Check(testkit.Rows()) - tk.MustQuery("select id from t_bin where v not in (select v from t) order by id").Check(testkit.Rows()) - tk.MustQuery("select id from t where exists (select 1 from t_bin where t_bin.v=t.v) order by id").Check(testkit.Rows("1", "2", "3", "4", "5", "6", "7")) - tk.MustQuery("select id from t_bin where exists (select 1 from t where t_bin.v=t.v) order by id").Check(testkit.Rows("1", "2", "3", "4", "5", "6", "7")) - tk.MustQuery("select id from t where not exists (select 1 from t_bin where t_bin.v=t.v) order by id").Check(testkit.Rows()) - tk.MustQuery("select id from t_bin where not exists (select 1 from t where t_bin.v=t.v) order by id").Check(testkit.Rows()) -} - -func (s *testIntegrationSerialSuite) TestCollateDDL(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("create database t;") - tk.MustExec("use t;") - tk.MustExec("drop database t;") -} - -func (s *testIntegrationSerialSuite) TestNewCollationCheckClusterIndexTable(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.Se.GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeOn - tk.MustExec("create table t(name char(255) primary key, b int, c int, index idx(name), unique index uidx(name))") - tk.MustExec("insert into t values(\"aaaa\", 1, 1), (\"bbb\", 2, 2), (\"ccc\", 3, 3)") - tk.MustExec("admin check table t") -} - -func (s *testIntegrationSuite) TestIssue15986(c *C) { - tk := testkit.NewTestKit(c, s.store) + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t0") tk.MustExec("CREATE TABLE t0(c0 int)") @@ -7307,8 +4340,11 @@ func (s *testIntegrationSuite) TestIssue15986(c *C) { "00000000000000000000000000000000000000000000000000000000000000000000000000000000000009';").Check(testkit.Rows("0")) } -func (s *testIntegrationSuite) TestNegativeZeroForHashJoin(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestNegativeZeroForHashJoin(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test;") tk.MustExec("drop table if exists t0, t1") tk.MustExec("CREATE TABLE t0(c0 float);") @@ -7320,8 +4356,11 @@ func (s *testIntegrationSuite) TestNegativeZeroForHashJoin(c *C) { tk.MustExec("drop table t1;") } -func (s *testIntegrationSuite) TestIssue1223(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue1223(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists testjson") tk.MustExec("CREATE TABLE testjson (j json DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;") @@ -7372,62 +4411,11 @@ func (s *testIntegrationSuite) TestIssue1223(c *C) { `{"test": [null]}`, `{"test": true}`, `{"test": false}`, `""`, "null", `"0"`)) } -func (s *testIntegrationSerialSuite) TestNewCollationWithClusterIndex(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.Se.GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeOn - tk.MustExec("create table t(d double primary key, a int, name varchar(255), index idx(name(2)), index midx(a, name))") - tk.MustExec("insert into t values(2.11, 1, \"aa\"), (-1, 0, \"abcd\"), (9.99, 0, \"aaaa\")") - tk.MustQuery("select d from t use index(idx) where name=\"aa\"").Check(testkit.Rows("2.11")) -} +func TestIssue15743(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() -func (s *testIntegrationSerialSuite) TestNewCollationBinaryFlag(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t (a varchar(2) binary, index (a));") - tk.MustExec("insert into t values ('a ');") - tk.MustQuery("select hex(a) from t;").Check(testkit.Rows("6120")) - tk.MustQuery("select hex(a) from t use index (a);").Check(testkit.Rows("6120")) - - showCreateTable := func(createSQL string) string { - tk.MustExec("drop table if exists t;") - tk.MustExec(createSQL) - s := tk.MustQuery("show create table t;").Rows()[0][1].(string) - return s - } - var sct string - // define case = tuple(table_charset, table_collation, column_charset, column_collation) - // case: (nil, nil, nil, nil) - sct = showCreateTable("create table t(a varchar(10) binary);") - c.Assert(strings.Contains(sct, "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin"), IsTrue, Commentf(sct)) - // case: (nil, utf8_general_ci, nil, nil) - sct = showCreateTable("create table t(a varchar(10) binary) collate utf8_general_ci;") - c.Assert(strings.Contains(sct, "varchar(10) COLLATE utf8_bin"), IsTrue, Commentf(sct)) - c.Assert(strings.Contains(sct, "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci"), IsTrue, Commentf(sct)) - // case: (nil, nil, nil, utf8_general_ci) - sct = showCreateTable("create table t(a varchar(10) binary collate utf8_general_ci);") - c.Assert(strings.Contains(sct, "varchar(10) CHARACTER SET utf8 COLLATE utf8_bin"), IsTrue, Commentf(sct)) - // case: (nil, nil, utf8, utf8_general_ci) - sct = showCreateTable("create table t(a varchar(10) binary charset utf8 collate utf8_general_ci);") - c.Assert(strings.Contains(sct, "varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci"), IsTrue, Commentf(sct)) - // case: (utf8, utf8_general_ci, utf8mb4, utf8mb4_unicode_ci) - sct = showCreateTable("create table t(a varchar(10) binary charset utf8mb4 collate utf8mb4_unicode_ci) charset utf8 collate utf8_general_ci;") - c.Assert(strings.Contains(sct, "varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"), IsTrue, Commentf(sct)) - c.Assert(strings.Contains(sct, "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci"), IsTrue, Commentf(sct)) - // case: (nil, nil, binary, nil) - sct = showCreateTable("create table t(a varchar(10) binary charset binary);") - c.Assert(strings.Contains(sct, "varbinary(10) DEFAULT NULL"), IsTrue, Commentf(sct)) - c.Assert(strings.Contains(sct, "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin"), IsTrue, Commentf(sct)) -} - -func (s *testIntegrationSuite) TestIssue15743(c *C) { - tk := testkit.NewTestKit(c, s.store) + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t0") tk.MustExec("CREATE TABLE t0(c0 int)") @@ -7435,8 +4423,11 @@ func (s *testIntegrationSuite) TestIssue15743(c *C) { tk.MustQuery("SELECT * FROM t0 WHERE 1 AND 0.4").Check(testkit.Rows("1")) } -func (s *testIntegrationSuite) TestIssue15725(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue15725(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test;") tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int)") @@ -7445,8 +4436,11 @@ func (s *testIntegrationSuite) TestIssue15725(c *C) { tk.MustQuery("select * from t where (not not not not a) = a").Check(testkit.Rows()) } -func (s *testIntegrationSuite) TestIssue15790(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue15790(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test;") tk.MustExec("drop table if exists t0") tk.MustExec("CREATE TABLE t0(c0 INT);") @@ -7456,8 +4450,11 @@ func (s *testIntegrationSuite) TestIssue15790(c *C) { tk.MustExec("drop table t0;") } -func (s *testIntegrationSuite) TestIssue15990(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue15990(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test;") tk.MustExec("drop table if exists t0;") tk.MustExec("CREATE TABLE t0(c0 TEXT(10));") @@ -7468,8 +4465,11 @@ func (s *testIntegrationSuite) TestIssue15990(c *C) { tk.MustExec("drop table t0;") } -func (s *testIntegrationSuite) TestIssue15992(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestIssue15992(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test;") tk.MustExec("drop table if exists t0") tk.MustExec("CREATE TABLE t0(c0 INT, c1 INT AS (c0));") @@ -7478,8 +4478,11 @@ func (s *testIntegrationSuite) TestIssue15992(c *C) { tk.MustExec("drop table t0;") } -func (s *testIntegrationSuite) TestCTEWithDML(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestCTEWithDML(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test;") tk.MustExec("drop table if exists t1;") tk.MustExec("create table t1(a int);") @@ -7504,8 +4507,11 @@ func (s *testIntegrationSuite) TestCTEWithDML(c *C) { tk.MustQuery("select * from t1").Check(testkit.Rows("1 1", "2 2", "3 3", "4 4", "5 5")) } -func (s *testIntegrationSuite) TestIssue16419(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) +func TestIssue16419(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test;") tk.MustExec("drop table if exists t0") tk.MustExec("drop table if exists t1") @@ -7515,8 +4521,11 @@ func (s *testIntegrationSuite) TestIssue16419(c *C) { tk.MustExec("drop table t0, t1;") } -func (s *testIntegrationSuite) TestIssue16029(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue16029(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test;") tk.MustExec("drop table if exists t0,t1;") tk.MustExec("CREATE TABLE t0(c0 INT);") @@ -7528,26 +4537,11 @@ func (s *testIntegrationSuite) TestIssue16029(c *C) { tk.MustExec("drop table t1;") } -func (s *testIntegrationSerialSuite) TestIssue24502(c *C) { - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test;") - tk.MustExec("drop table if exists t0,t1;") - tk.MustExec("create table t0(col1 varchar(255));") - tk.MustExec("create table t1(col1 int(11));") - tk.MustExec(`insert into t0 values("\\9jM\\M");`) - tk.MustExec(`insert into t1 values(0);`) - tk.MustExec(`insert into t1 values(null);`) - tk.MustExec(`insert into t1 values(null);`) +func TestIssue16426(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() - tk.MustQuery(`select t0.col1, t1.col1 from t0 left join t1 on t0.col1 not like t0.col1;`). - Check(testkit.Rows(`\9jM\M <nil>`, `\9jM\M <nil>`, `\9jM\M 0`)) - - tk.MustQuery(`select 'a' like '\\a'`).Check(testkit.Rows("1")) - tk.MustQuery(`select 'a' like '+a' escape '+'`).Check(testkit.Rows("1")) -} - -func (s *testIntegrationSuite) TestIssue16426(c *C) { - tk := testkit.NewTestKit(c, s.store) + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t (a int)") @@ -7558,8 +4552,11 @@ func (s *testIntegrationSuite) TestIssue16426(c *C) { tk.MustQuery("select a from t where a/10000000").Check(testkit.Rows("42")) } -func (s *testIntegrationSuite) TestIssue16505(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue16505(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test;") tk.MustExec("drop table if exists t;") tk.MustExec("CREATE TABLE t(c varchar(100), index idx(c(100)));") @@ -7570,8 +4567,11 @@ func (s *testIntegrationSuite) TestIssue16505(c *C) { tk.MustExec("drop table t;") } -func (s *testIntegrationSuite) TestIssue20121(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue20121(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") // testcase for Datetime vs Year tk.MustExec("drop table if exists t") @@ -7605,8 +4605,11 @@ func (s *testIntegrationSuite) TestIssue20121(c *C) { tk.MustQuery("select * from ttt where ttt.a < ttt.b").Check(testkit.Rows("2019-11-11 11:11:11 2022")) } -func (s *testIntegrationSuite) TestIssue16779(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue16779(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t0") tk.MustExec("drop table if exists t1") @@ -7615,8 +4618,11 @@ func (s *testIntegrationSuite) TestIssue16779(c *C) { tk.MustQuery("SELECT * FROM t1 LEFT JOIN t0 ON TRUE WHERE BINARY EXPORT_SET(0, 0, 0 COLLATE 'binary', t0.c0, 0 COLLATE 'binary')") } -func (s *testIntegrationSuite) TestIssue16697(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue16697(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("CREATE TABLE t (v varchar(1024))") @@ -7628,15 +4634,18 @@ func (s *testIntegrationSuite) TestIssue16697(c *C) { for _, row := range rows { line := fmt.Sprintf("%v", row) if strings.Contains(line, "Projection") { - c.Assert(strings.Contains(line, "KB"), IsTrue) - c.Assert(strings.Contains(line, "MB"), IsFalse) - c.Assert(strings.Contains(line, "GB"), IsFalse) + require.Contains(t, line, "KB") + require.NotContains(t, line, "MB") + require.NotContains(t, line, "GB") } } } -func (s *testIntegrationSuite) TestIssue17045(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue17045(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int,b varchar(20),c datetime,d double,e int,f int as(a+b),key(a),key(b),key(c),key(d),key(e),key(f));") @@ -7645,8 +4654,11 @@ func (s *testIntegrationSuite) TestIssue17045(c *C) { tk.MustQuery("select /*+ use_index_merge(t)*/ * from t where t.e=5 or t.a=5;").Check(testkit.Rows("5 <nil> <nil> <nil> <nil> <nil>")) } -func (s *testIntegrationSuite) TestIssue17098(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue17098(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t1, t2") tk.MustExec("create table t1(a char) collate utf8mb4_bin;") @@ -7656,29 +4668,20 @@ func (s *testIntegrationSuite) TestIssue17098(c *C) { tk.MustQuery("select collation(t1.a) from t1 union select collation(t2.a) from t2;").Check(testkit.Rows("utf8mb4_bin")) } -func (s *testIntegrationSerialSuite) TestIssue17176(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustGetErrMsg("create table t(a enum('a', 'a ')) charset utf8 collate utf8_bin;", "[types:1291]Column 'a' has duplicated value 'a' in ENUM") - tk.MustGetErrMsg("create table t(a enum('a', 'Á')) charset utf8 collate utf8_general_ci;", "[types:1291]Column 'a' has duplicated value 'Á' in ENUM") - tk.MustGetErrMsg("create table t(a enum('a', 'a ')) charset utf8mb4 collate utf8mb4_bin;", "[types:1291]Column 'a' has duplicated value 'a' in ENUM") - tk.MustExec("create table t(a enum('a', 'A')) charset utf8 collate utf8_bin;") - tk.MustExec("drop table t;") - tk.MustExec("create table t3(a enum('a', 'A')) charset utf8mb4 collate utf8mb4_bin;") -} +func TestIssue17115(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() -func (s *testIntegrationSuite) TestIssue17115(c *C) { - tk := testkit.NewTestKit(c, s.store) + tk := testkit.NewTestKit(t, store) tk.MustQuery("select collation(user());").Check(testkit.Rows("utf8mb4_bin")) tk.MustQuery("select collation(compress('abc'));").Check(testkit.Rows("binary")) } -func (s *testIntegrationSuite) TestIndexedVirtualGeneratedColumnTruncate(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIndexedVirtualGeneratedColumnTruncate(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t1") tk.MustExec("create table t(a int, b tinyint as(a+100) unique key)") @@ -7708,19 +4711,22 @@ func (s *testIntegrationSuite) TestIndexedVirtualGeneratedColumnTruncate(c *C) { tk.MustExec("admin check table t") } -func (s *testIntegrationSuite) TestIssue17287(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue17287(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) orgEnable := plannercore.PreparedPlanCacheEnabled() defer func() { plannercore.SetPreparedPlanCache(orgEnable) }() plannercore.SetPreparedPlanCache(true) var err error - tk.Se, err = session.CreateSession4TestWithOpt(s.store, &session.Opt{ + se, err := session.CreateSession4TestWithOpt(store, &session.Opt{ PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), }) - c.Assert(err, IsNil) - + require.NoError(t, err) + tk.SetSession(se) tk.MustExec("use test;") tk.MustExec("drop table if exists t;") tk.MustExec("set @@tidb_enable_vectorized_expression = false;") @@ -7733,175 +4739,46 @@ func (s *testIntegrationSuite) TestIssue17287(c *C) { tk.MustQuery("execute stmt7 using @val2;").Check(testkit.Rows("1589873946")) } -func (s *testIntegrationSuite) TestIssue26989(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue26989(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("set names utf8mb4 collate utf8mb4_general_ci;") tk.MustQuery("select position('a' in 'AA');").Check(testkit.Rows("0")) tk.MustQuery("select locate('a', 'AA');").Check(testkit.Rows("0")) tk.MustQuery("select locate('a', 'a');").Check(testkit.Rows("1")) } -func (s *testIntegrationSuite) TestIssue17898(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue17898(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") - tk.MustExec("drop table t0") + tk.MustExec("drop table if exists t0") tk.MustExec("create table t0(a char(10), b int as ((a)));") tk.MustExec("insert into t0(a) values(\"0.5\");") tk.MustQuery("select * from t0;").Check(testkit.Rows("0.5 1")) } -func (s *testIntegrationSuite) TestIssue17727(c *C) { - tk := testkit.NewTestKit(c, s.store) - orgEnable := plannercore.PreparedPlanCacheEnabled() - defer func() { - plannercore.SetPreparedPlanCache(orgEnable) - }() - plannercore.SetPreparedPlanCache(true) - var err error - tk.Se, err = session.CreateSession4TestWithOpt(s.store, &session.Opt{ - PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), - }) - c.Assert(err, IsNil) - - tk.MustExec("use test;") - tk.MustExec("DROP TABLE IF EXISTS t1;") - tk.MustExec("CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY auto_increment, a timestamp NOT NULL);") - tk.MustExec("INSERT INTO t1 VALUES (null, '2020-05-30 20:30:00');") - tk.MustExec("PREPARE mystmt FROM 'SELECT * FROM t1 WHERE UNIX_TIMESTAMP(a) >= ?';") - tk.MustExec("SET @a=1590868800;") - tk.MustQuery("EXECUTE mystmt USING @a;").Check(testkit.Rows()) - tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) - - tk.MustExec("SET @a=1590868801;") - tk.MustQuery("EXECUTE mystmt USING @a;").Check(testkit.Rows()) - tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) - - tk.MustExec("prepare stmt from 'select unix_timestamp(?)';") - tk.MustExec("set @a = '2020-05-30 20:30:00';") - tk.MustQuery("execute stmt using @a;").Check(testkit.Rows("1590841800")) - tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) - - tk.MustExec("set @a = '2020-06-12 13:47:58';") - tk.MustQuery("execute stmt using @a;").Check(testkit.Rows("1591940878")) - tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) -} - -func (s *testIntegrationSerialSuite) TestIssue17891(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) +func TestIssue18515(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(id int, value set ('a','b','c') charset utf8mb4 collate utf8mb4_bin default 'a,b ');") - tk.MustExec("drop table t") - tk.MustExec("create table test(id int, value set ('a','b','c') charset utf8mb4 collate utf8mb4_general_ci default 'a,B ,C');") -} - -func (s *testIntegrationSerialSuite) TestIssue20268(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("CREATE TABLE `t` ( `a` enum('a','b') DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;") - tk.MustExec("insert into t values('a');") - tk.MustExec("select * from t where a = 'A';") -} - -func (s *testIntegrationSerialSuite) TestIssue17233(c *C) { - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists table_int") - tk.MustExec(`CREATE TABLE table_int ( - id_0 int(16) NOT NULL AUTO_INCREMENT, - col_int_0 int(16) DEFAULT NULL, - PRIMARY KEY (id_0), - KEY fvclc (id_0,col_int_0));`) - tk.MustExec("INSERT INTO table_int VALUES (1,NULL),(2,NULL),(3,65535),(4,1),(5,0),(6,NULL),(7,-1),(8,65535),(9,NULL),(10,65535),(11,-1),(12,0),(13,-1),(14,1),(15,65535),(16,0),(17,1),(18,0),(19,0)") - - tk.MustExec("drop table if exists table_varchar") - tk.MustExec(`CREATE TABLE table_varchar ( - id_2 int(16) NOT NULL AUTO_INCREMENT, - col_varchar_2 varchar(511) DEFAULT NULL, - PRIMARY KEY (id_2));`) - tk.MustExec(`INSERT INTO table_varchar VALUES (1,''),(2,''),(3,''),(4,''),(5,''),(6,''),(7,''),(8,''),(9,''),(10,''),(11,''),(12,'');`) - - tk.MustExec("drop table if exists table_float_varchar") - tk.MustExec(`CREATE TABLE table_int_float_varchar ( - id_6 int(16) NOT NULL AUTO_INCREMENT, - col_int_6 int(16) NOT NULL, - col_float_6 float DEFAULT NULL, - col_varchar_6 varchar(511) DEFAULT NULL, - PRIMARY KEY (id_6,col_int_6) - ) - PARTITION BY RANGE ( col_int_6 ) ( - PARTITION p0 VALUES LESS THAN (1), - PARTITION p2 VALUES LESS THAN (1000), - PARTITION p3 VALUES LESS THAN (10000), - PARTITION p5 VALUES LESS THAN (1000000), - PARTITION p7 VALUES LESS THAN (100000000), - PARTITION p9 VALUES LESS THAN (10000000000), - PARTITION p10 VALUES LESS THAN (100000000000), - PARTITION pn VALUES LESS THAN (MAXVALUE));`) - tk.MustExec(`INSERT INTO table_int_float_varchar VALUES (1,-1,0.1,'0000-00-00 00:00:00'),(2,0,0,NULL),(3,-1,1,NULL),(4,0,NULL,NULL),(7,0,0.5,NULL),(8,0,0,NULL),(10,-1,0,'-1'),(5,1,-0.1,NULL),(6,1,0.1,NULL),(9,65535,0,'1');`) - - tk.MustExec("drop table if exists table_float") - tk.MustExec(`CREATE TABLE table_float ( - id_1 int(16) NOT NULL AUTO_INCREMENT, - col_float_1 float DEFAULT NULL, - PRIMARY KEY (id_1), - KEY zbjus (id_1,col_float_1));`) - tk.MustExec(`INSERT INTO table_float VALUES (1,NULL),(2,-0.1),(3,-1),(4,NULL),(5,-0.1),(6,0),(7,0),(8,-1),(9,NULL),(10,NULL),(11,0.1),(12,-1);`) - - tk.MustExec("drop view if exists view_4") - tk.MustExec(`CREATE DEFINER='root'@'127.0.0.1' VIEW view_4 (col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9, col_10) AS - SELECT /*+ USE_INDEX(table_int fvclc, fvclc)*/ - tmp1.id_6 AS col_1, - tmp1.col_int_6 AS col_2, - tmp1.col_float_6 AS col_3, - tmp1.col_varchar_6 AS col_4, - tmp2.id_2 AS col_5, - tmp2.col_varchar_2 AS col_6, - tmp3.id_0 AS col_7, - tmp3.col_int_0 AS col_8, - tmp4.id_1 AS col_9, - tmp4.col_float_1 AS col_10 - FROM (( - test.table_int_float_varchar AS tmp1 LEFT JOIN - test.table_varchar AS tmp2 ON ((NULL<=tmp2.col_varchar_2)) IS NULL - ) JOIN - test.table_int AS tmp3 ON (1.117853833115198e-03!=tmp1.col_int_6)) - JOIN - test.table_float AS tmp4 ON !((1900370398268920328=0e+00)) WHERE ((''<='{Gm~PcZNb') OR (tmp2.id_2 OR tmp3.col_int_0)) ORDER BY col_1,col_2,col_3,col_4,col_5,col_6,col_7,col_8,col_9,col_10 LIMIT 20580,5;`) - - tk.MustExec("drop view if exists view_10") - tk.MustExec(`CREATE DEFINER='root'@'127.0.0.1' VIEW view_10 (col_1, col_2) AS - SELECT table_int.id_0 AS col_1, - table_int.col_int_0 AS col_2 - FROM test.table_int - WHERE - ((-1e+00=1) OR (0e+00>=table_int.col_int_0)) - ORDER BY col_1,col_2 - LIMIT 5,9;`) - - tk.MustQuery("SELECT col_1 FROM test.view_10").Sort().Check(testkit.Rows("16", "18", "19")) - tk.MustQuery("SELECT col_1 FROM test.view_4").Sort().Check(testkit.Rows("8", "8", "8", "8", "8")) - tk.MustQuery("SELECT view_10.col_1 FROM view_4 JOIN view_10").Check(testkit.Rows("16", "16", "16", "16", "16", "18", "18", "18", "18", "18", "19", "19", "19", "19", "19")) -} - -func (s *testIntegrationSuite) TestIssue18515(c *C) { - tk := testkit.NewTestKit(c, s.store) + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int, b json, c int AS (JSON_EXTRACT(b, '$.population')), key(c));") tk.MustExec("select /*+ TIDB_INLJ(t2) */ t1.a, t1.c, t2.a from t t1, t t2 where t1.c=t2.c;") } -func (s *testIntegrationSuite) TestIssue20223(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue20223(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("CREATE TABLE t (" + @@ -7917,8 +4794,11 @@ func (s *testIntegrationSuite) TestIssue20223(c *C) { "group by t_day").Check(testkit.Rows("2020-08-28 1")) } -func (s *testIntegrationSuite) TestIssue18525(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue18525(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t1") tk.MustExec("create table t1 (col0 BLOB, col1 CHAR(74), col2 DATE UNIQUE)") @@ -7929,21 +4809,12 @@ func (s *testIntegrationSuite) TestIssue18525(c *C) { } -func (s *testIntegrationSerialSuite) TestIssue17989(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 int, b tinyint as(a+1), c int as(b+1));") - tk.MustExec("set sql_mode='';") - tk.MustExec("insert into t(a) values(2000);") - tk.MustExec("create index idx on t(c);") - tk.MustQuery("select c from t;").Check(testkit.Rows("128")) - tk.MustExec("admin check table t") -} +func TestSchemaDMLNotChange(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() -func (s *testIntegrationSuite2) TestSchemaDMLNotChange(c *C) { - tk := testkit.NewTestKit(c, s.store) - tk2 := testkit.NewTestKit(c, s.store) + tk := testkit.NewTestKit(t, store) + tk2 := testkit.NewTestKit(t, store) tk.MustExec("use test") tk2.MustExec("use test") tk.MustExec("drop table if exists t") @@ -7955,273 +4826,32 @@ func (s *testIntegrationSuite2) TestSchemaDMLNotChange(c *C) { tk.MustExec("commit") } -func (s *testIntegrationSerialSuite) TestIssue18638(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a varchar(10) collate utf8mb4_bin, b varchar(10) collate utf8mb4_general_ci);") - tk.MustExec("insert into t (a, b) values ('a', 'A');") - tk.MustQuery("select * from t t1, t t2 where t1.a = t2.b collate utf8mb4_general_ci;").Check(testkit.Rows("a A a A")) - tk.MustQuery("select * from t t1 left join t t2 on t1.a = t2.b collate utf8mb4_general_ci;").Check(testkit.Rows("a A a A")) -} - -func (s *testIntegrationSerialSuite) TestCollationText(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a TINYTEXT collate UTF8MB4_GENERAL_CI, UNIQUE KEY `a`(`a`(10)));") - tk.MustExec("insert into t (a) values ('A');") - tk.MustQuery("select * from t t1 inner join t t2 on t1.a = t2.a where t1.a = 'A';").Check(testkit.Rows("A A")) - tk.MustExec("update t set a = 'B';") - tk.MustExec("admin check table t;") -} +func TestIssue18850(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() -func (s *testIntegrationSuite) TestIssue18850(c *C) { - tk := testkit.NewTestKit(c, s.store) + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t, t1") tk.MustExec("create table t(a int, b enum('A', 'B'));") - tk.MustExec("create table t1(a1 int, b1 enum('B', 'A'));") - tk.MustExec("insert into t values (1, 'A');") - tk.MustExec("insert into t1 values (1, 'A');") - tk.MustQuery("select /*+ HASH_JOIN(t, t1) */ * from t join t1 on t.b = t1.b1;").Check(testkit.Rows("1 A 1 A")) - - tk.MustExec("drop table t, t1") - tk.MustExec("create table t(a int, b set('A', 'B'));") - tk.MustExec("create table t1(a1 int, b1 set('B', 'A'));") - tk.MustExec("insert into t values (1, 'A');") - tk.MustExec("insert into t1 values (1, 'A');") - tk.MustQuery("select /*+ HASH_JOIN(t, t1) */ * from t join t1 on t.b = t1.b1;").Check(testkit.Rows("1 A 1 A")) -} - -func (s *testIntegrationSerialSuite) TestNullValueRange(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 int, b int, index(a))") - tk.MustExec("insert into t values (null, 0), (null, 1), (10, 11), (10, 12)") - tk.MustQuery("select * from t use index(a) where a is null order by b").Check(testkit.Rows("<nil> 0", "<nil> 1")) - tk.MustQuery("select * from t use index(a) where a<=>null order by b").Check(testkit.Rows("<nil> 0", "<nil> 1")) - tk.MustQuery("select * from t use index(a) where a<=>10 order by b").Check(testkit.Rows("10 11", "10 12")) - - tk.MustExec("drop table if exists t1") - tk.MustExec("create table t1(a int, b int, c int, unique key(a, b, c))") - tk.MustExec("insert into t1 values (1, null, 1), (1, null, 2), (1, null, 3), (1, null, 4)") - tk.MustExec("insert into t1 values (1, 1, 1), (1, 2, 2), (1, 3, 33), (1, 4, 44)") - tk.MustQuery("select c from t1 where a=1 and b<=>null and c>2 order by c").Check(testkit.Rows("3", "4")) - tk.MustQuery("select c from t1 where a=1 and b is null and c>2 order by c").Check(testkit.Rows("3", "4")) - tk.MustQuery("select c from t1 where a=1 and b is not null and c>2 order by c").Check(testkit.Rows("33", "44")) -} - -func (s *testIntegrationSerialSuite) TestIssue18652(c *C) { - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("DROP TABLE IF EXISTS t1") - tk.MustExec("CREATE TABLE t1 ( `pk` int not null primary key auto_increment, `col_smallint_key_signed` smallint , key (`col_smallint_key_signed`))") - tk.MustExec("INSERT INTO `t1` VALUES (1,0),(2,NULL),(3,NULL),(4,0),(5,0),(6,NULL),(7,NULL),(8,0),(9,0),(10,0)") - tk.MustQuery("SELECT * FROM t1 WHERE ( LOG( `col_smallint_key_signed`, -8297584758403770424 ) ) DIV 1").Check(testkit.Rows()) -} - -func (s *testIntegrationSerialSuite) TestIssue18662(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a varchar(10) collate utf8mb4_bin, b varchar(10) collate utf8mb4_general_ci);") - tk.MustExec("insert into t (a, b) values ('a', 'A');") - tk.MustQuery("select * from t where field('A', a collate utf8mb4_general_ci, b) > 1;").Check(testkit.Rows()) - tk.MustQuery("select * from t where field('A', a, b collate utf8mb4_general_ci) > 1;").Check(testkit.Rows()) - tk.MustQuery("select * from t where field('A' collate utf8mb4_general_ci, a, b) > 1;").Check(testkit.Rows()) - tk.MustQuery("select * from t where field('A', a, b) > 1;").Check(testkit.Rows("a A")) -} - -func (s *testIntegrationSerialSuite) TestIssue19045(c *C) { - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t, t1, t2") - tk.MustExec(`CREATE TABLE t ( - id int(11) NOT NULL AUTO_INCREMENT, - a char(10) DEFAULT NULL, - PRIMARY KEY (id) -);`) - tk.MustExec(`CREATE TABLE t1 ( - id int(11) NOT NULL AUTO_INCREMENT, - a char(10) DEFAULT NULL, - b char(10) DEFAULT NULL, - c char(10) DEFAULT NULL, - PRIMARY KEY (id) -);`) - tk.MustExec(`CREATE TABLE t2 ( - id int(11) NOT NULL AUTO_INCREMENT, - a char(10) DEFAULT NULL, - b char(10) DEFAULT NULL, - PRIMARY KEY (id), - UNIQUE KEY b (b) -);`) - tk.MustExec(`insert into t1(a,b,c) values('hs4_0004', "04", "101"), ('a01', "01", "101"),('a011', "02", "101");`) - tk.MustExec(`insert into t2(a,b) values("02","03");`) - tk.MustExec(`insert into t(a) values('101'),('101');`) - tk.MustQuery(`select ( SELECT t1.a FROM t1, t2 WHERE t1.b = t2.a AND t2.b = '03' AND t1.c = a.a) invode from t a ;`).Check(testkit.Rows("a011", "a011")) -} - -func (s *testIntegrationSerialSuite) TestIssue19116(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("set names utf8mb4 collate utf8mb4_general_ci;") - tk.MustQuery("select collation(concat(1 collate `binary`));").Check(testkit.Rows("binary")) - tk.MustQuery("select coercibility(concat(1 collate `binary`));").Check(testkit.Rows("0")) - tk.MustQuery("select collation(concat(NULL,NULL));").Check(testkit.Rows("binary")) - tk.MustQuery("select coercibility(concat(NULL,NULL));").Check(testkit.Rows("6")) - tk.MustQuery("select collation(concat(1,1));").Check(testkit.Rows("utf8mb4_general_ci")) - tk.MustQuery("select coercibility(concat(1,1));").Check(testkit.Rows("4")) - tk.MustQuery("select collation(1);").Check(testkit.Rows("binary")) - tk.MustQuery("select coercibility(1);").Check(testkit.Rows("5")) - tk.MustQuery("select coercibility(1=1);").Check(testkit.Rows("5")) - - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a datetime)") - tk.MustExec("insert into t values ('2020-02-02')") - tk.MustQuery("select collation(concat(unix_timestamp(a))) from t;").Check(testkit.Rows("utf8mb4_general_ci")) - tk.MustQuery("select coercibility(concat(unix_timestamp(a))) from t;").Check(testkit.Rows("4")) -} - -// issues 14448, 19383, 17734 -func (s *testIntegrationSerialSuite) TestNoopFunctions(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 NOT NULL PRIMARY KEY)") - tk.MustExec("INSERT INTO t1 VALUES (1),(2),(3)") - - message := `.* has only noop implementation in tidb now, use tidb_enable_noop_functions to enable these functions` - stmts := []string{ - "SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 1", - "SELECT * FROM t1 LOCK IN SHARE MODE", - "SELECT * FROM t1 GROUP BY a DESC", - "SELECT * FROM t1 GROUP BY a ASC", - "SELECT GET_LOCK('acdc', 10)", - "SELECT RELEASE_LOCK('acdc')", - } - - for _, stmt := range stmts { - // test on - tk.MustExec("SET tidb_enable_noop_functions='ON'") - tk.MustExec(stmt) - // test warning - tk.MustExec("SET tidb_enable_noop_functions='WARN'") - tk.MustExec(stmt) - warn := tk.Se.GetSessionVars().StmtCtx.GetWarnings() - c.Assert(warn[0].Err.Error(), Matches, message) - // test off - tk.MustExec("SET tidb_enable_noop_functions='OFF'") - _, err := tk.Exec(stmt) - c.Assert(err.Error(), Matches, message) - } - - // These statements return a different error message - // to the above. Test for error, not specifically the message. - // After they execute, we need to reset the values because - // otherwise tidb_enable_noop_functions can't be changed. - - stmts = []string{ - "START TRANSACTION READ ONLY", - "SET TRANSACTION READ ONLY", - "SET tx_read_only = 1", - "SET transaction_read_only = 1", - } - - for _, stmt := range stmts { - // test off - tk.MustExec("SET tidb_enable_noop_functions='OFF'") - _, err := tk.Exec(stmt) - c.Assert(err.Error(), NotNil) - // test warning - tk.MustExec("SET tidb_enable_noop_functions='WARN'") - tk.MustExec(stmt) - warn := tk.Se.GetSessionVars().StmtCtx.GetWarnings() - c.Assert(len(warn), Equals, 1) - // test on - tk.MustExec("SET tidb_enable_noop_functions='ON'") - tk.MustExec(stmt) - - // Reset (required for future loop iterations and future tests) - tk.MustExec("SET tx_read_only = 0") - tk.MustExec("SET transaction_read_only = 0") - } -} - -func (s *testIntegrationSerialSuite) TestIssue19315(c *C) { - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("drop table if exists t1") - tk.MustExec("CREATE TABLE `t` (`a` bit(10) DEFAULT NULL,`b` int(11) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin") - tk.MustExec("INSERT INTO `t` VALUES (_binary '\\0',1),(_binary '\\0',2),(_binary '\\0',5),(_binary '\\0',4),(_binary '\\0',2),(_binary '\\0 ',4)") - tk.MustExec("CREATE TABLE `t1` (`a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin") - tk.MustExec("INSERT INTO `t1` VALUES (1,1),(1,5),(2,3),(2,4),(3,3)") - err := tk.QueryToErr("select * from t where t.b > (select min(t1.b) from t1 where t1.a > t.a)") - c.Assert(err, IsNil) -} + tk.MustExec("create table t1(a1 int, b1 enum('B', 'A'));") + tk.MustExec("insert into t values (1, 'A');") + tk.MustExec("insert into t1 values (1, 'A');") + tk.MustQuery("select /*+ HASH_JOIN(t, t1) */ * from t join t1 on t.b = t1.b1;").Check(testkit.Rows("1 A 1 A")) -func (s *testIntegrationSerialSuite) TestIssue18674(c *C) { - tk := testkit.NewTestKit(c, s.store) - tk.MustQuery("select -1.0 % -1.0").Check(testkit.Rows("0.0")) - tk.MustExec("use test") - tk.MustExec("drop table if exists t1") - tk.MustExec("create table t1(`pk` int primary key,`col_float_key_signed` float ,key (`col_float_key_signed`))") - tk.MustExec("insert into t1 values (0, null), (1, 0), (2, -0), (3, 1), (-1,-1)") - tk.MustQuery("select * from t1 where ( `col_float_key_signed` % `col_float_key_signed`) IS FALSE").Sort().Check(testkit.Rows("-1 -1", "3 1")) - tk.MustQuery("select `col_float_key_signed` , `col_float_key_signed` % `col_float_key_signed` from t1").Sort().Check(testkit.Rows( - "-1 -0", "0 <nil>", "0 <nil>", "1 0", "<nil> <nil>")) - tk.MustQuery("select `col_float_key_signed` , (`col_float_key_signed` % `col_float_key_signed`) IS FALSE from t1").Sort().Check(testkit.Rows( - "-1 1", "0 0", "0 0", "1 1", "<nil> 0")) + tk.MustExec("drop table t, t1") + tk.MustExec("create table t(a int, b set('A', 'B'));") + tk.MustExec("create table t1(a1 int, b1 set('B', 'A'));") + tk.MustExec("insert into t values (1, 'A');") + tk.MustExec("insert into t1 values (1, 'A');") + tk.MustQuery("select /*+ HASH_JOIN(t, t1) */ * from t join t1 on t.b = t1.b1;").Check(testkit.Rows("1 A 1 A")) } -func (s *testIntegrationSerialSuite) TestIssue17063(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) +func TestIssue19504(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() - tk := testkit.NewTestKit(c, s.store) - tk.MustExec(`use test;`) - tk.MustExec(`drop table if exists t;`) - tk.MustExec("create table t(a char, b char) collate utf8mb4_general_ci;") - tk.MustExec(`insert into t values('a', 'b');`) - tk.MustExec(`insert into t values('a', 'B');`) - tk.MustQuery(`select * from t where if(a='x', a, b) = 'b';`).Check(testkit.Rows("a b", "a B")) - tk.MustQuery(`select collation(if(a='x', a, b)) from t;`).Check(testkit.Rows("utf8mb4_general_ci", "utf8mb4_general_ci")) - tk.MustQuery(`select coercibility(if(a='x', a, b)) from t;`).Check(testkit.Rows("2", "2")) - tk.MustQuery(`select collation(lag(b, 1, 'B') over w) from t window w as (order by b);`).Check(testkit.Rows("utf8mb4_general_ci", "utf8mb4_general_ci")) - tk.MustQuery(`select coercibility(lag(b, 1, 'B') over w) from t window w as (order by b);`).Check(testkit.Rows("2", "2")) -} - -func (s *testIntegrationSerialSuite) TestIssue11177(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - - tk := testkit.NewTestKit(c, s.store) - tk.MustQuery("SELECT 'lvuleck' BETWEEN '2008-09-16 22:23:50' AND 0;").Check(testkit.Rows("0")) - tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1292 Truncated incorrect DOUBLE value: 'lvuleck'", "Warning 1292 Truncated incorrect DOUBLE value: '2008-09-16 22:23:50'")) - tk.MustQuery("SELECT 'aa' BETWEEN 'bb' AND 0;").Check(testkit.Rows("1")) - tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1292 Truncated incorrect DOUBLE value: 'aa'", "Warning 1292 Truncated incorrect DOUBLE value: 'bb'")) - tk.MustQuery("select 1 between 0 and b'110';").Check(testkit.Rows("1")) - tk.MustQuery("show warnings;").Check(testkit.Rows()) - tk.MustQuery("select 'b' between 'a' and b'110';").Check(testkit.Rows("0")) - tk.MustQuery("show warnings;").Check(testkit.Rows()) -} - -func (s *testIntegrationSuite) TestIssue19504(c *C) { - tk := testkit.NewTestKit(c, s.store) + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t1;") tk.MustExec("create table t1 (c_int int, primary key (c_int));") @@ -8235,53 +4865,11 @@ func (s *testIntegrationSuite) TestIssue19504(c *C) { Check(testkit.Rows("1 1", "0 0", "0 0")) } -func (s *testIntegrationSerialSuite) TestIssue19804(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - - tk := testkit.NewTestKit(c, s.store) - tk.MustExec(`use test;`) - tk.MustExec(`drop table if exists t;`) - tk.MustExec(`create table t(a set('a', 'b', 'c'));`) - tk.MustGetErrMsg("alter table t change a a set('a', 'b', 'c', 'c');", "[types:1291]Column 'a' has duplicated value 'c' in SET") - tk.MustExec(`drop table if exists t;`) - tk.MustExec(`create table t(a enum('a', 'b', 'c'));`) - tk.MustGetErrMsg("alter table t change a a enum('a', 'b', 'c', 'c');", "[types:1291]Column 'a' has duplicated value 'c' in ENUM") - tk.MustExec(`drop table if exists t;`) - tk.MustExec(`create table t(a set('a', 'b', 'c'));`) - tk.MustExec(`alter table t change a a set('a', 'b', 'c', 'd');`) - tk.MustExec(`insert into t values('d');`) - tk.MustGetErrMsg(`alter table t change a a set('a', 'b', 'c', 'e', 'f');`, "[types:1265]Data truncated for column 'a', value is 'd'") -} - -func (s *testIntegrationSerialSuite) TestIssue20209(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - - tk := testkit.NewTestKit(c, s.store) - tk.MustExec(`use test;`) - tk.MustExec(`set @@character_set_client=utf8mb4;`) - tk.MustExec(`set @@collation_connection=utf8_bin;`) - tk.MustExec("CREATE VIEW tview_1 AS SELECT 'a' AS `id`;") -} - -func (s *testIntegrationSerialSuite) TestIssue18949(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - - tk := testkit.NewTestKit(c, s.store) - tk.MustExec(`use test;`) - tk.MustExec(`drop table if exists t;`) - tk.MustExec(`create table t(a enum('a ', 'b\t', ' c '), b set('a ', 'b\t', ' c '));`) - result := tk.MustQuery("show create table t").Rows()[0][1] - c.Assert(result, Matches, `(?s).*enum\('a','b ',' c'\).*set\('a','b ',' c'\).*`) - tk.MustExec(`alter table t change a aa enum('a ', 'b\t', ' c ');`) - result = tk.MustQuery("show create table t").Rows()[0][1] - c.Assert(result, Matches, `(?s).*enum\('a','b ',' c'\).*set\('a','b ',' c'\).*`) -} +func TestIssue17767(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() -func (s *testIntegrationSuite) TestIssue17767(c *C) { - tk := testkit.NewTestKit(c, s.store) + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t0;") tk.MustExec("CREATE TABLE t0(c0 INTEGER AS (NULL) NOT NULL, c1 INT);") @@ -8295,8 +4883,11 @@ func (s *testIntegrationSuite) TestIssue17767(c *C) { tk.MustExec("rollback") } -func (s *testIntegrationSuite) TestIssue19596(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue19596(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t;") tk.MustExec("create table t (a int) partition by range(a) (PARTITION p0 VALUES LESS THAN (10));") @@ -8306,8 +4897,11 @@ func (s *testIntegrationSuite) TestIssue19596(c *C) { tk.MustGetErrMsg("create table t (a int) partition by range(a) (PARTITION p0 VALUES LESS THAN (a));", "[planner:1054]Unknown column 'a' in 'expression'") } -func (s *testIntegrationSuite) TestIssue17476(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue17476(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("DROP TABLE IF EXISTS `table_float`;") tk.MustExec("DROP TABLE IF EXISTS `table_int_float_varchar`;") @@ -8329,79 +4923,11 @@ func (s *testIntegrationSuite) TestIssue17476(c *C) { tk.MustQuery(`SELECT * FROM (table_int_float_varchar AS tmp3) WHERE (col_varchar_6 AND NULL) IS NULL AND col_int_6=0;`).Check(testkit.Rows("13 0 -0.1 <nil>")) } -func (s *testIntegrationSerialSuite) TestClusteredIndexAndNewCollationIndexEncodeDecodeV5(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.Se.GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeOn - tk.MustExec("create table t(a int, b char(10) collate utf8mb4_bin, c char(10) collate utf8mb4_general_ci," + - "d varchar(10) collate utf8mb4_bin, e varchar(10) collate utf8mb4_general_ci, f char(10) collate utf8mb4_unicode_ci, g varchar(10) collate utf8mb4_unicode_ci, " + - "primary key(a, b, c, d, e, f, g), key a(a), unique key ua(a), key b(b), unique key ub(b), key c(c), unique key uc(c)," + - "key d(d), unique key ud(d),key e(e), unique key ue(e), key f(f), key g(g), unique key uf(f), unique key ug(g))") - - tk.MustExec("insert into t values (1, '啊 ', '啊 ', '啊 ', '啊 ', '啊 ', '啊 ')") - // Single Read. - tk.MustQuery("select * from t ").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) - - tk.MustQuery("select * from t use index(a)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) - tk.MustQuery("select * from t use index(ua)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) - tk.MustQuery("select * from t use index(b)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) - tk.MustQuery("select * from t use index(ub)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) - tk.MustQuery("select * from t use index(c)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) - tk.MustQuery("select * from t use index(uc)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) - tk.MustQuery("select * from t use index(d)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) - tk.MustQuery("select * from t use index(ud)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) - tk.MustQuery("select * from t use index(e)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) - tk.MustQuery("select * from t use index(ue)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) - tk.MustQuery("select * from t use index(f)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) - tk.MustQuery("select * from t use index(uf)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) - tk.MustQuery("select * from t use index(g)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) - tk.MustQuery("select * from t use index(ug)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) - - tk.MustExec("alter table t add column h varchar(10) collate utf8mb4_general_ci default '🐸'") - tk.MustExec("alter table t add column i varchar(10) collate utf8mb4_general_ci default '🐸'") - tk.MustExec("alter table t add index h(h)") - tk.MustExec("alter table t add unique index uh(h)") - - tk.MustQuery("select * from t use index(h)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) - tk.MustQuery("select * from t use index(uh)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) - - // Double read. - tk.MustQuery("select * from t use index(a)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) - tk.MustQuery("select * from t use index(ua)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) - tk.MustQuery("select * from t use index(b)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) - tk.MustQuery("select * from t use index(ub)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) - tk.MustQuery("select * from t use index(c)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) - tk.MustQuery("select * from t use index(uc)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) - tk.MustQuery("select * from t use index(d)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) - tk.MustQuery("select * from t use index(ud)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) - tk.MustQuery("select * from t use index(e)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) - tk.MustQuery("select * from t use index(ue)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) - tk.MustExec("admin check table t") - tk.MustExec("admin recover index t a") - tk.MustExec("alter table t add column n char(10) COLLATE utf8mb4_unicode_ci") - tk.MustExec("alter table t add index n(n)") - tk.MustExec("update t set n = '吧';") - tk.MustQuery("select * from t").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸,吧")) - tk.MustQuery("select * from t use index(n)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸,吧")) - tk.MustExec("admin check table t") - - tk.MustExec("drop table if exists t;") - tk.MustExec("create table t (a varchar(255) COLLATE utf8_general_ci primary key clustered, b int) partition by range columns(a) " + - "(partition p0 values less than ('0'), partition p1 values less than MAXVALUE);") - tk.MustExec("alter table t add index b(b);") - tk.MustExec("insert into t values ('0', 1);") - tk.MustQuery("select * from t use index(b);").Check(testkit.Rows("0 1")) - tk.MustQuery("select * from t use index();").Check(testkit.Rows("0 1")) - tk.MustExec("admin check table t") -} +func TestIssue11645(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() -func (s *testIntegrationSuite) TestIssue11645(c *C) { - defer s.cleanEnv(c) - tk := testkit.NewTestKit(c, s.store) + tk := testkit.NewTestKit(t, store) tk.MustQuery(`SELECT DATE_ADD('1000-01-01 00:00:00', INTERVAL -2 HOUR);`).Check(testkit.Rows("0999-12-31 22:00:00")) tk.MustQuery(`SELECT DATE_ADD('1000-01-01 00:00:00', INTERVAL -200 HOUR);`).Check(testkit.Rows("0999-12-23 16:00:00")) tk.MustQuery(`SELECT DATE_ADD('0001-01-01 00:00:00', INTERVAL -2 HOUR);`).Check(testkit.Rows("0000-00-00 22:00:00")) @@ -8414,9 +4940,11 @@ func (s *testIntegrationSuite) TestIssue11645(c *C) { tk.MustQuery(`SELECT DATE_ADD('0001-01-02 00:00:00', INTERVAL -8785 HOUR);`).Check(testkit.Rows("0000-00-00 23:00:00")) } -func (s *testIntegrationSuite) TestIssue14349(c *C) { - defer s.cleanEnv(c) - tk := testkit.NewTestKit(c, s.store) +func TestIssue14349(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test;") tk.MustExec("drop table if exists papers;") tk.MustExec("create table papers(title text, content longtext)") @@ -8427,8 +4955,11 @@ func (s *testIntegrationSuite) TestIssue14349(c *C) { tk.MustExec("set tidb_enable_vectorized_expression = 1;") } -func (s *testIntegrationSuite) TestIssue20180(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue20180(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t;") tk.MustExec("drop table if exists t1;") @@ -8446,8 +4977,11 @@ func (s *testIntegrationSuite) TestIssue20180(c *C) { tk.MustQuery("select * from t where a > 1 and a = \"b\";").Check(testkit.Rows("b")) } -func (s *testIntegrationSuite) TestIssue11755(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue11755(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists lt;") tk.MustExec("create table lt (d decimal(10, 4));") @@ -8455,8 +4989,11 @@ func (s *testIntegrationSuite) TestIssue11755(c *C) { tk.MustQuery("select LEAD(d,1,1) OVER(), LAG(d,1,1) OVER() from lt;").Check(testkit.Rows("0.2000 1.0000", "1.0000 0.2000")) } -func (s *testIntegrationSuite) TestIssue20369(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue20369(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t;") tk.MustExec("create table t(a int);") @@ -8465,8 +5002,11 @@ func (s *testIntegrationSuite) TestIssue20369(c *C) { tk.MustQuery("select * from t").Check(testkit.Rows("1", "<nil>")) } -func (s *testIntegrationSuite) TestIssue20730(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue20730(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("DROP TABLE IF EXISTS tmp;") tk.MustExec("CREATE TABLE tmp (id int(11) NOT NULL,value int(1) NOT NULL,PRIMARY KEY (id))") @@ -8475,55 +5015,23 @@ func (s *testIntegrationSuite) TestIssue20730(c *C) { tk.MustQuery("SELECT @sum := IF(@sum=20,4,@sum + tmp.value) sum FROM tmp ORDER BY tmp.id").Check(testkit.Rows("11", "13", "16", "20", "4")) } -func (s *testIntegrationSerialSuite) TestClusteredIndexAndNewCollation(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.Se.GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeOn - tk.MustExec("CREATE TABLE `t` (" + - "`a` char(10) COLLATE utf8mb4_unicode_ci NOT NULL," + - "`b` char(20) COLLATE utf8mb4_general_ci NOT NULL," + - "`c` int(11) NOT NULL," + - "PRIMARY KEY (`a`,`b`,`c`)," + - "KEY `idx` (`a`))") - - tk.MustExec("begin") - tk.MustExec("insert into t values ('a6', 'b6', 3)") - tk.MustQuery("select * from t").Check(testkit.Rows("a6 b6 3")) - tk.MustQuery("select * from t where a='a6'").Check(testkit.Rows("a6 b6 3")) - tk.MustExec("delete from t") - tk.MustQuery("select * from t").Check(testkit.Rows()) - tk.MustExec("commit") - tk.MustQuery("select * from t").Check(testkit.Rows()) - - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(`a` char(10) COLLATE utf8mb4_unicode_ci NOT NULL key)") - tk.MustExec("insert into t values ('&');") - tk.MustExec("replace into t values ('&');") - tk.MustQuery("select * from t").Check(testkit.Rows("&")) -} +func TestIssue20860(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() -func (s *testIntegrationSuite) TestIssue20860(c *C) { - tk := testkit.NewTestKit(c, s.store) + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t;") tk.MustExec("create table t(id int primary key, c int, d timestamp null default null)") tk.MustExec("insert into t values(1, 2, '2038-01-18 20:20:30')") - c.Assert(tk.ExecToErr("update t set d = adddate(d, interval 1 day) where id < 10"), NotNil) + require.Error(t, tk.ExecToErr("update t set d = adddate(d, interval 1 day) where id < 10")) } -func (s *testIntegrationSerialSuite) TestIssue20608(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - tk := testkit.NewTestKit(c, s.store) - tk.MustQuery("select '䇇Հ' collate utf8mb4_bin like '___Հ';").Check(testkit.Rows("0")) -} +func TestIssue15847(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() -func (s *testIntegrationSuite2) TestIssue15847(c *C) { - tk := testkit.NewTestKit(c, s.store) + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop view if exists t15847") tk.MustExec("CREATE VIEW t15847(c0) AS SELECT NULL;") @@ -8531,21 +5039,11 @@ func (s *testIntegrationSuite2) TestIssue15847(c *C) { tk.MustExec("drop view if exists t15847") } -func (s *testIntegrationSerialSuite) TestIssue20161(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) +func TestIssue10462(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() - tk := testkit.NewTestKit(c, s.store) - tk.MustExec(`use test;`) - tk.MustExec(`drop table if exists t;`) - tk.MustExec(`create table t(raw JSON);`) - tk.MustExec(`insert into t(raw) values('["a","ab"]'), ('["a"]'), (null);`) - tk.MustQuery(`SELECT JSON_SEARCH(raw,'one','c') FROM t;`). - Check(testkit.Rows("<nil>", "<nil>", "<nil>")) -} - -func (s *testIntegrationSuite) TestIssue10462(c *C) { - tk := testkit.NewTestKit(c, s.store) + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustQuery("select json_array(true)").Check(testkit.Rows("[true]")) tk.MustQuery("select json_array(1=2)").Check(testkit.Rows("[false]")) @@ -8581,30 +5079,11 @@ func (s *testIntegrationSuite) TestIssue10462(c *C) { tk.MustQuery("select json_array(is_ipv6('1a6b:8888:ff66:77ee:0000:1234:5678:bcde'))").Check(testkit.Rows("[true]")) } -func (s *testIntegrationSerialSuite) TestJsonObjectCompare(c *C) { - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - - tk.MustQuery("select json_object('k', -1) > json_object('k', 2)").Check(testkit.Rows("0")) - tk.MustQuery("select json_object('k', -1) < json_object('k', 2)").Check(testkit.Rows("1")) - - tk.MustExec("drop table if exists tx") - tk.MustExec("create table tx(a double, b int)") - tk.MustExec("insert into tx values (3.0, 3)") - tk.MustQuery("select json_object('k', a) = json_object('k', b) from tx").Check(testkit.Rows("1")) -} - -func (s *testIntegrationSerialSuite) TestIssue21290(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 date);") - tk.MustExec("insert into t1 values (20100202);") - tk.MustQuery("select a in ('2020-02-02', 20100202) from t1;").Check(testkit.Rows("1")) -} +func TestIssue17868(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() -func (s *testIntegrationSuite) TestIssue17868(c *C) { - tk := testkit.NewTestKit(c, s.store) + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t7") tk.MustExec("create table t7 (col0 SMALLINT, col1 VARBINARY(1), col2 DATE, col3 BIGINT, col4 BINARY(166))") @@ -8613,8 +5092,11 @@ func (s *testIntegrationSuite) TestIssue17868(c *C) { tk.MustQuery("select col2 != 1 from t7").Check(testkit.Rows("1")) } -func (s *testIntegrationSuite) TestIssue21619(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue21619(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustQuery(`select CAST("9223372036854775808" as json)`).Check(testkit.Rows("9223372036854775808")) tk.MustQuery(`select json_type(CAST("9223372036854775808" as json))`).Check(testkit.Rows("UNSIGNED INTEGER")) tk.MustQuery(`select CAST(9223372036854775808 as json)`).Check(testkit.Rows("9223372036854775808")) @@ -8623,8 +5105,11 @@ func (s *testIntegrationSuite) TestIssue21619(c *C) { tk.MustQuery(`select json_type(CAST(-9223372036854775808 as json))`).Check(testkit.Rows("INTEGER")) } -func (s *testIntegrationSuite) TestIssue10467(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue10467(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists tx2;") tk.MustExec("create table tx2 (col json);") @@ -8648,69 +5133,11 @@ func (s *testIntegrationSuite) TestIssue10467(c *C) { tk.MustQuery("select col, count(1) c from tx2 group by col order by c desc;").Check(testkit.Rows("[922337203685477581] 5", `["3"] 4`, "[3] 3", "[-3] 2", "[922337203685477580] 1")) } -func (s *testIntegrationSerialSuite) TestCollationIndexJoin(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t1, t2") - tk.MustExec("create table t1(a int, b char(10), key(b)) collate utf8mb4_general_ci") - tk.MustExec("create table t2(a int, b char(10), key(b)) collate ascii_bin") - tk.MustExec("insert into t1 values (1, 'a')") - tk.MustExec("insert into t2 values (1, 'A')") - - tk.MustQuery("select /*+ inl_join(t1) */ t1.b, t2.b from t1 join t2 where t1.b=t2.b").Check(testkit.Rows("a A")) - tk.MustQuery("select /*+ hash_join(t1) */ t1.b, t2.b from t1 join t2 where t1.b=t2.b").Check(testkit.Rows("a A")) - tk.MustQuery("select /*+ merge_join(t1) */ t1.b, t2.b from t1 join t2 where t1.b=t2.b").Check(testkit.Rows("a A")) - tk.MustQuery("select /*+ inl_hash_join(t1) */ t1.b, t2.b from t1 join t2 where t1.b=t2.b").Check(testkit.Rows("a A")) - tk.MustQuery("select /*+ inl_hash_join(t2) */ t1.b, t2.b from t1 join t2 where t1.b=t2.b").Check(testkit.Rows("a A")) - tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1815 Optimizer Hint /*+ INL_HASH_JOIN(t2) */ is inapplicable")) - tk.MustQuery("select /*+ inl_merge_join(t1) */ t1.b, t2.b from t1 join t2 where t1.b=t2.b").Check(testkit.Rows("a A")) - tk.MustQuery("select /*+ inl_merge_join(t2) */ t1.b, t2.b from t1 join t2 where t1.b=t2.b").Check(testkit.Rows("a A")) - tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1815 Optimizer Hint /*+ INL_MERGE_JOIN(t2) */ is inapplicable")) - - tk.MustExec("drop table if exists a, b") - tk.MustExec("create table a(i int, k varbinary(40), v int, primary key(i, k) clustered)") - tk.MustExec("create table b(i int, k varchar(40), v int, primary key(i, k) clustered)") - tk.MustExec("insert into a select 3, 'nice mccarthy', 10") - tk.MustQuery("select * from a, b where a.i = b.i and a.k = b.k").Check(testkit.Rows()) - - tk.MustExec("drop table if exists a, b") - tk.MustExec("create table a(i int NOT NULL, k varbinary(40) NOT NULL, v int, key idx1(i, k))") - tk.MustExec("create table b(i int NOT NULL, k varchar(40) NOT NULL, v int, key idx1(i, k))") - tk.MustExec("insert into a select 3, 'nice mccarthy', 10") - tk.MustQuery(" select /*+ inl_join(b) */ b.i from a, b where a.i = b.i and a.k = b.k").Check(testkit.Rows()) -} - -func (s *testIntegrationSerialSuite) TestCollationMergeJoin(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("CREATE TABLE `t` (" + - " `col_10` blob DEFAULT NULL," + - " `col_11` decimal(17,5) NOT NULL," + - " `col_13` varchar(381) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'Yr'," + - " PRIMARY KEY (`col_13`,`col_11`) CLUSTERED," + - " KEY `idx_4` (`col_10`(3))" + - ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin") - tk.MustExec("insert into t values ('a', 12523, 'A');") - tk.MustExec("insert into t values ('A', 2, 'a');") - tk.MustExec("insert into t values ('a', 23, 'A');") - tk.MustExec("insert into t values ('a', 23, 'h2');") - tk.MustExec("insert into t values ('a', 23, 'h3');") - tk.MustExec("insert into t values ('a', 23, 'h4');") - tk.MustExec("insert into t values ('a', 23, 'h5');") - tk.MustExec("insert into t values ('a', 23, 'h6');") - tk.MustExec("insert into t values ('a', 23, 'h7');") - tk.MustQuery("select /*+ MERGE_JOIN(t) */ t.* from t where col_13 in ( select col_10 from t where t.col_13 in ( 'a', 'b' ) ) order by col_10 ;").Check( - testkit.Rows("\x41 2.00000 a", "\x61 23.00000 A", "\x61 12523.00000 A")) -} - -func (s *testIntegrationSuite) TestIssue19892(c *C) { - defer s.cleanEnv(c) - tk := testkit.NewTestKit(c, s.store) +func TestIssue19892(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("USE test") tk.MustExec("CREATE TABLE dd(a date, b datetime, c timestamp)") @@ -8946,28 +5373,12 @@ func (s *testIntegrationSuite) TestIssue19892(c *C) { } } -func (s *testIntegrationSerialSuite) TestIssue20876(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.Se.GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeOn - tk.MustExec("drop table if exists t;") - tk.MustExec("CREATE TABLE `t` (" + - " `a` char(10) COLLATE utf8mb4_unicode_ci NOT NULL," + - " `b` char(20) COLLATE utf8mb4_general_ci NOT NULL," + - " `c` int(11) NOT NULL," + - " PRIMARY KEY (`a`,`b`,`c`)," + - " KEY `idx` (`a`)" + - ")") - tk.MustExec("insert into t values ('#', 'C', 10), ('$', 'c', 20), ('$', 'c', 30), ('a', 'a', 10), ('A', 'A', 30)") - tk.MustExec("analyze table t") - tk.MustQuery("select * from t where a='#';").Check(testkit.Rows("# C 10")) -} - // The actual results do not agree with the test results, It should be modified after the test suite is updated -func (s *testIntegrationSuite) TestIssue17726(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue17726(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t0") tk.MustExec("create table t0 (c1 DATE, c2 TIME, c3 DATETIME, c4 TIMESTAMP)") @@ -8977,17 +5388,23 @@ func (s *testIntegrationSuite) TestIssue17726(c *C) { result.Check(testkit.Rows("54995666 0 54995666117979.5 20040110095704")) } -func (s *testIntegrationSuite) TestDatetimeUserVariable(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestDatetimeUserVariable(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("set @p = now()") tk.MustExec("set @@tidb_enable_vectorized_expression = false") - c.Check(tk.MustQuery("select @p").Rows()[0][0] != "", IsTrue) + require.NotEqual(t, "", tk.MustQuery("select @p").Rows()[0][0]) tk.MustExec("set @@tidb_enable_vectorized_expression = true") - c.Check(tk.MustQuery("select @p").Rows()[0][0] != "", IsTrue) + require.NotEqual(t, "", tk.MustQuery("select @p").Rows()[0][0]) } -func (s *testIntegrationSuite) TestIssue12205(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue12205(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t12205;") @@ -8999,21 +5416,11 @@ func (s *testIntegrationSuite) TestIssue12205(c *C) { testkit.Rows("Warning 1292 Truncated incorrect time value: '18446744072635875000'")) } -// for issue 20128 -func (s *testIntegrationSerialSuite) TestIssue20128(c *C) { - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t;") - tk.MustExec("create table t(b enum('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z') DEFAULT NULL, c decimal(40,20));") - tk.MustExec("insert into t values('z', 19.18040000000000000000);") - tk.MustExec("insert into t values('z', 26.18040000000000000000);") - tk.MustExec("insert into t values('z', 25.18040000000000000000);") - tk.MustQuery("select * from t where t.b > t.c;").Check(testkit.Rows("z 19.18040000000000000000", "z 25.18040000000000000000")) - tk.MustQuery("select * from t where t.b < t.c;").Check(testkit.Rows("z 26.18040000000000000000")) -} +func TestIssue21677(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() -func (s *testIntegrationSuite) TestIssue21677(c *C) { - tk := testkit.NewTestKit(c, s.store) + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t;") @@ -9030,22 +5437,11 @@ func (s *testIntegrationSuite) TestIssue21677(c *C) { tk.MustQuery("select * from t where t. `r10` > 3;").Check(testkit.Rows("1 10")) } -func (s *testIntegrationSerialSuite) TestLikeWithCollation(c *C) { - tk := testkit.NewTestKit(c, s.store) - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - - tk.MustQuery(`select 'a' like 'A' collate utf8mb4_unicode_ci;`).Check(testkit.Rows("1")) - tk.MustGetErrMsg(`select 'a' collate utf8mb4_bin like 'A' collate utf8mb4_unicode_ci;`, "[expression:1267]Illegal mix of collations (utf8mb4_bin,EXPLICIT) and (utf8mb4_unicode_ci,EXPLICIT) for operation 'like'") - tk.MustQuery(`select '😛' collate utf8mb4_general_ci like '😋';`).Check(testkit.Rows("1")) - tk.MustQuery(`select '😛' collate utf8mb4_general_ci = '😋';`).Check(testkit.Rows("1")) - tk.MustQuery(`select '😛' collate utf8mb4_unicode_ci like '😋';`).Check(testkit.Rows("0")) - tk.MustQuery(`select '😛' collate utf8mb4_unicode_ci = '😋';`).Check(testkit.Rows("1")) -} +func TestIssue11333(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() -func (s *testIntegrationSuite) TestIssue11333(c *C) { - defer s.cleanEnv(c) - tk := testkit.NewTestKit(c, s.store) + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t;") tk.MustExec("drop table if exists t1;") @@ -9060,8 +5456,11 @@ func (s *testIntegrationSuite) TestIssue11333(c *C) { tk.MustQuery(`select 0.000000000000000000000000000000000000000000000000000000000000000000000001;`).Check(testkit.Rows("0.000000000000000000000000000000000000000000000000000000000000000000000001")) } -func (s *testSuite) TestIssue12206(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue12206(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t12206;") tk.MustExec("create table t12206(\n `col_tinyint_unsigned` tinyint(3) unsigned DEFAULT NULL,\n `col_double_unsigned` double unsigned DEFAULT NULL,\n `col_year_key` year(4) DEFAULT NULL\n);") @@ -9071,16 +5470,22 @@ func (s *testSuite) TestIssue12206(c *C) { tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1292 Truncated incorrect time value: '73'")) } -func (s *testIntegrationSuite2) TestCastCoer(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestCastCoer(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustQuery("select coercibility(binary('a'))").Check(testkit.Rows("2")) tk.MustQuery("select coercibility(cast('a' as char(10)))").Check(testkit.Rows("2")) tk.MustQuery("select coercibility(convert('abc', char(10)));").Check(testkit.Rows("2")) } -func (s *testIntegrationSuite) TestIssue12209(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue12209(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t12209;") @@ -9090,166 +5495,11 @@ func (s *testIntegrationSuite) TestIssue12209(c *C) { testkit.Rows("<nil>")) } -func (s *testIntegrationSerialSuite) TestCrossDCQuery(c *C) { - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t1") - tk.MustExec(`create table t1 (c int primary key, d int,e int,index idx_d(d),index idx_e(e)) -PARTITION BY RANGE (c) ( - PARTITION p0 VALUES LESS THAN (6), - PARTITION p1 VALUES LESS THAN (11) -);`) - defer tk.MustExec("drop table if exists t1") - - tk.MustExec(`insert into t1 (c,d,e) values (1,1,1);`) - tk.MustExec(`insert into t1 (c,d,e) values (2,3,5);`) - tk.MustExec(`insert into t1 (c,d,e) values (3,5,7);`) - - is := s.dom.InfoSchema() - - tb, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) - c.Assert(err, IsNil) - setBundle := func(parName, dc string) { - pid, err := tables.FindPartitionByName(tb.Meta(), parName) - c.Assert(err, IsNil) - groupID := placement.GroupID(pid) - is.SetBundle(&placement.Bundle{ - ID: groupID, - Rules: []*placement.Rule{ - { - GroupID: groupID, - Role: placement.Leader, - Count: 1, - Constraints: []placement.Constraint{ - { - Key: placement.DCLabelKey, - Op: placement.In, - Values: []string{dc}, - }, - }, - }, - }, - }) - } - setBundle("p0", "sh") - setBundle("p1", "bj") - - testcases := []struct { - name string - txnScope string - zone string - sql string - expectErr error - }{ - // FIXME: block by https://github.com/pingcap/tidb/issues/21872 - //{ - // name: "cross dc read to sh by holding bj, IndexReader", - // txnScope: "bj", - // sql: "select /*+ USE_INDEX(t1, idx_d) */ d from t1 where c < 5 and d < 1;", - // expectErr: fmt.Errorf(".*can not be read by.*"), - //}, - // FIXME: block by https://github.com/pingcap/tidb/issues/21847 - //{ - // name: "cross dc read to sh by holding bj, BatchPointGet", - // txnScope: "bj", - // sql: "select * from t1 where c in (1,2,3,4);", - // expectErr: fmt.Errorf(".*can not be read by.*"), - //}, - { - name: "cross dc read to sh by holding bj, PointGet", - txnScope: "local", - zone: "bj", - sql: "select * from t1 where c = 1", - expectErr: fmt.Errorf(".*can not be read by.*"), - }, - { - name: "cross dc read to sh by holding bj, IndexLookUp", - txnScope: "local", - zone: "bj", - sql: "select * from t1 use index (idx_d) where c < 5 and d < 5;", - expectErr: fmt.Errorf(".*can not be read by.*"), - }, - { - name: "cross dc read to sh by holding bj, IndexMerge", - txnScope: "local", - zone: "bj", - sql: "select /*+ USE_INDEX_MERGE(t1, idx_d, idx_e) */ * from t1 where c <5 and (d =5 or e=5);", - expectErr: fmt.Errorf(".*can not be read by.*"), - }, - { - name: "cross dc read to sh by holding bj, TableReader", - txnScope: "local", - zone: "bj", - sql: "select * from t1 where c < 6", - expectErr: fmt.Errorf(".*can not be read by.*"), - }, - { - name: "cross dc read to global by holding bj", - txnScope: "local", - zone: "bj", - sql: "select * from t1", - expectErr: fmt.Errorf(".*can not be read by.*"), - }, - { - name: "read sh dc by holding sh", - txnScope: "local", - zone: "sh", - sql: "select * from t1 where c < 6", - expectErr: nil, - }, - { - name: "read sh dc by holding global", - txnScope: "global", - zone: "", - sql: "select * from t1 where c < 6", - expectErr: nil, - }, - } - tk.MustExec("set global tidb_enable_local_txn = on;") - for _, testcase := range testcases { - c.Log(testcase.name) - failpoint.Enable("tikvclient/injectTxnScope", - fmt.Sprintf(`return("%v")`, testcase.zone)) - tk.MustExec(fmt.Sprintf("set @@txn_scope='%v'", testcase.txnScope)) - tk.Exec("begin") - res, err := tk.Exec(testcase.sql) - _, resErr := session.GetRows4Test(context.Background(), tk.Se, res) - var checkErr error - if err != nil { - checkErr = err - } else { - checkErr = resErr - } - if testcase.expectErr != nil { - c.Assert(checkErr, NotNil) - c.Assert(checkErr.Error(), Matches, ".*can not be read by.*") - } else { - c.Assert(checkErr, IsNil) - } - if res != nil { - res.Close() - } - tk.Exec("commit") - } - failpoint.Disable("tikvclient/injectTxnScope") - tk.MustExec("set global tidb_enable_local_txn = off;") -} - -func (s *testIntegrationSerialSuite) TestCollationUnion(c *C) { - // For issue 19694. - tk := testkit.NewTestKit(c, s.store) - - tk.MustQuery("select cast('2010-09-09' as date) a union select '2010-09-09 ' order by a;").Check(testkit.Rows("2010-09-09", "2010-09-09 ")) - res := tk.MustQuery("select cast('2010-09-09' as date) a union select '2010-09-09 ';") - c.Check(len(res.Rows()), Equals, 2) - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - res = tk.MustQuery("select cast('2010-09-09' as date) a union select '2010-09-09 ';") - c.Check(len(res.Rows()), Equals, 1) -} +func TestIssue22098(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() -func (s *testIntegrationSuite) TestIssue22098(c *C) { - tk := testkit.NewTestKit(c, s.store) + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("CREATE TABLE `ta` (" + @@ -9273,29 +5523,12 @@ func (s *testIntegrationSuite) TestIssue22098(c *C) { tk.MustQuery("execute stmt using @a,@b,@c,@d,@e,@f").Check(testkit.Rows()) } -func (s *testIntegrationSerialSuite) TestCollationUnion2(c *C) { - // For issue 22179 - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a varchar(10))") - tk.MustExec("insert into t values('aaaaaaaaa'),('天王盖地虎宝塔镇河妖')") - tk.MustQuery("select * from t").Check(testkit.Rows("aaaaaaaaa", "天王盖地虎宝塔镇河妖")) - - // check the collation of sub query of union statement. - tk.MustQuery("select collation(a) from (select null as a) aaa").Check(testkit.Rows("binary")) - tk.MustQuery("select collation(a) from (select a from t limit 1) aaa").Check(testkit.Rows("utf8mb4_bin")) - - // Reverse sub query of union statement. - tk.MustQuery("select * from (select null as a union all select a from t) aaa order by a").Check(testkit.Rows("<nil>", "aaaaaaaaa", "天王盖地虎宝塔镇河妖")) - tk.MustQuery("select * from (select a from t) aaa union all select null as a order by a").Check(testkit.Rows("<nil>", "aaaaaaaaa", "天王盖地虎宝塔镇河妖")) - tk.MustExec("drop table if exists t") -} - -func (s *testIntegrationSuite) Test22717(c *C) { +func Test22717(t *testing.T) { // For issue 22717 - tk := testkit.NewTestKit(c, s.store) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec(`create table t( @@ -9314,8 +5547,11 @@ func (s *testIntegrationSuite) Test22717(c *C) { tk.MustQuery("select d from t where d").Check(testkit.Rows("0", "1", "0,1")) } -func (s *testIntegrationSuite) Test23262(c *C) { - tk := testkit.NewTestKit(c, s.store) +func Test23262(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t(a year)") @@ -9324,35 +5560,12 @@ func (s *testIntegrationSuite) Test23262(c *C) { tk.MustQuery("select * from t where a='2'").Check(testkit.Rows("2002")) } -func (s *testIntegrationSerialSuite) TestPartitionPruningRelaxOP(c *C) { - // Discovered while looking at issue 19941 (not completely related) - // relaxOP relax the op > to >= and < to <= - // Sometime we need to relax the condition, for example: - // col < const => f(col) <= const - // datetime < 2020-02-11 16:18:42 => to_days(datetime) <= to_days(2020-02-11) - // We can't say: - // datetime < 2020-02-11 16:18:42 => to_days(datetime) < to_days(2020-02-11) - - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - - tk.MustExec("DROP TABLE IF EXISTS t1;") - tk.MustExec(`CREATE TABLE t1 (d date NOT NULL) PARTITION BY RANGE (YEAR(d)) - (PARTITION p2016 VALUES LESS THAN (2017), PARTITION p2017 VALUES LESS THAN (2018), PARTITION p2018 VALUES LESS THAN (2019), - PARTITION p2019 VALUES LESS THAN (2020), PARTITION pmax VALUES LESS THAN MAXVALUE)`) - - tk.MustExec(`INSERT INTO t1 VALUES ('2016-01-01'), ('2016-06-01'), ('2016-09-01'), ('2017-01-01'), - ('2017-06-01'), ('2017-09-01'), ('2018-01-01'), ('2018-06-01'), ('2018-09-01'), ('2018-10-01'), - ('2018-11-01'), ('2018-12-01'), ('2018-12-31'), ('2019-01-01'), ('2019-06-01'), ('2019-09-01'), - ('2020-01-01'), ('2020-06-01'), ('2020-09-01');`) - - tk.MustQuery("SELECT COUNT(*) FROM t1 WHERE d < '2018-01-01'").Check(testkit.Rows("6")) - tk.MustQuery("SELECT COUNT(*) FROM t1 WHERE d > '2018-01-01'").Check(testkit.Rows("12")) -} - -func (s *testIntegrationSuite) TestClusteredIndexCorCol(c *C) { +func TestClusteredIndexCorCol(t *testing.T) { // For issue 23076 - tk := testkit.NewTestKit(c, s.store) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t1, t2;") tk.MustExec("create table t1 (c_int int, c_str varchar(40), primary key (c_int, c_str) clustered, key(c_int) );") @@ -9362,8 +5575,11 @@ func (s *testIntegrationSuite) TestClusteredIndexCorCol(c *C) { tk.MustQuery("select (select t2.c_str from t2 where t2.c_str = t1.c_str and t2.c_int = 10 order by t2.c_str limit 1) x from t1;").Check(testkit.Rows("<nil>", "goofy mestorf")) } -func (s *testIntegrationSuite) TestEnumPushDown(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestEnumPushDown(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t (c_enum enum('c', 'b', 'a'))") @@ -9456,13 +5672,21 @@ func (s *testIntegrationSuite) TestEnumPushDown(c *C) { tk.MustExec("insert into tdm values (1, 'a');") tk.MustExec("update tdm set c12 = 2 where id = 1;") tk.MustQuery("select * from tdm").Check(testkit.Rows("1 b")) + tk.MustExec("set @@sql_mode = '';") + tk.MustExec("update tdm set c12 = 0 where id = 1;") + tk.MustQuery("select c12+0 from tdm").Check(testkit.Rows("0")) + tk.MustExec("update tdm set c12 = '0' where id = 1;") + tk.MustQuery("select c12+0 from tdm").Check(testkit.Rows("0")) } -func (s *testIntegrationSuite) TestJiraSetInnoDBDefaultRowFormat(c *C) { +func TestJiraSetInnoDBDefaultRowFormat(t *testing.T) { // For issue #23541 // JIRA needs to be able to set this to be happy. // See: https://nova.moe/run-jira-on-tidb/ - tk := testkit.NewTestKit(c, s.store) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("set global innodb_default_row_format = dynamic") tk.MustExec("set global innodb_default_row_format = 'dynamic'") tk.MustQuery("SHOW VARIABLES LIKE 'innodb_default_row_format'").Check(testkit.Rows("innodb_default_row_format dynamic")) @@ -9472,20 +5696,11 @@ func (s *testIntegrationSuite) TestJiraSetInnoDBDefaultRowFormat(c *C) { } -func (s *testIntegrationSerialSuite) TestCollationForBinaryLiteral(c *C) { - tk := testkit.NewTestKit(c, s.store) - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("CREATE TABLE t (`COL1` tinyblob NOT NULL, `COL2` binary(1) NOT NULL, `COL3` bigint(11) NOT NULL, PRIMARY KEY (`COL1`(5),`COL2`,`COL3`) /*T![clustered_index] CLUSTERED */)") - tk.MustExec("insert into t values(0x1E,0xEC,6966939640596047133);") - tk.MustQuery("select * from t where col1 not in (0x1B,0x20) order by col1").Check(testkit.Rows("\x1e \xec 6966939640596047133")) - tk.MustExec("drop table t") -} +func TestIssue23623(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() -func (s *testIntegrationSuite) TestIssue23623(c *C) { - tk := testkit.NewTestKit(c, s.store) + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t1;") tk.MustExec("create table t1(c1 int);") @@ -9493,8 +5708,11 @@ func (s *testIntegrationSuite) TestIssue23623(c *C) { tk.MustQuery("select count(*) from t1 where c1 > (select sum(c1) from t1);").Check(testkit.Rows("2")) } -func (s *testIntegrationSuite) TestApproximatePercentile(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestApproximatePercentile(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t (a bit(10))") @@ -9502,43 +5720,11 @@ func (s *testIntegrationSuite) TestApproximatePercentile(c *C) { tk.MustQuery("select approx_percentile(a, 10) from t").Check(testkit.Rows("<nil>")) } -func (s *testIntegrationSerialSuite) TestCollationPrefixClusteredIndex(c *C) { - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - - tk.MustExec("drop table if exists t") - tk.MustExec("create table t (k char(20), v int, primary key (k(4)) clustered, key (k)) collate utf8mb4_general_ci;") - tk.MustExec("insert into t values('01233', 1);") - tk.MustExec("create index idx on t(k(2))") - tk.MustQuery("select * from t use index(k_2);").Check(testkit.Rows("01233 1")) - tk.MustQuery("select * from t use index(idx);").Check(testkit.Rows("01233 1")) - tk.MustExec("admin check table t;") -} - -func (s *testIntegrationSerialSuite) TestIssue23805(c *C) { - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - - tk.MustExec("CREATE TABLE `tbl_5` (" + - " `col_25` time NOT NULL DEFAULT '05:35:58'," + - " `col_26` blob NOT NULL," + - " `col_27` double NOT NULL," + - " `col_28` char(83) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL," + - " `col_29` timestamp NOT NULL," + - " `col_30` varchar(36) COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'ywzIn'," + - " `col_31` binary(85) DEFAULT 'OIstcXsGmAyc'," + - " `col_32` datetime NOT NULL DEFAULT '2024-08-02 00:00:00'," + - " PRIMARY KEY (`col_26`(3),`col_27`) /*T![clustered_index] CLUSTERED */," + - " UNIQUE KEY `idx_10` (`col_26`(5)));") - tk.MustExec("insert ignore into tbl_5 set col_28 = 'ZmZIdSnq' , col_25 = '18:50:52.00' on duplicate key update col_26 = 'y';\n") -} +func TestIssue24429(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() -func (s *testIntegrationSuite) TestIssue24429(c *C) { - tk := testkit.NewTestKit(c, s.store) + tk := testkit.NewTestKit(t, store) tk.MustExec("set @@sql_mode = ANSI_QUOTES;") tk.MustExec("use test") @@ -9548,9 +5734,11 @@ func (s *testIntegrationSuite) TestIssue24429(c *C) { tk.MustExec("drop table if exists t;") } -func (s *testIntegrationSuite) TestVitessHash(c *C) { - defer s.cleanEnv(c) - tk := testkit.NewTestKit(c, s.store) +func TestVitessHash(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t_int, t_blob, t_varchar;") tk.MustExec("create table t_int(id int, a bigint unsigned null);") @@ -9577,9 +5765,11 @@ func (s *testIntegrationSuite) TestVitessHash(c *C) { Check(testkit.Rows("1E1788FF0FDE093C")) } -func (s *testIntegrationSuite) TestVitessHashMatchesVitessShards(c *C) { - defer s.cleanEnv(c) - tk := testkit.NewTestKit(c, s.store) +func TestVitessHashMatchesVitessShards(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t;") tk.MustExec("create table t(customer_id bigint, id bigint, expected_shard bigint unsigned, computed_shard bigint unsigned null, primary key (customer_id, id));") @@ -9620,20 +5810,25 @@ func (s *testIntegrationSuite) TestVitessHashMatchesVitessShards(c *C) { Check(testkit.Rows()) } -func (s *testIntegrationSuite) TestSecurityEnhancedMode(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestSecurityEnhancedMode(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) sem.Enable() defer sem.Disable() // When SEM is enabled these features are restricted to all users // regardless of what privileges they have available. _, err := tk.Exec("SELECT 1 INTO OUTFILE '/tmp/aaaa'") - c.Assert(err.Error(), Equals, "[planner:8132]Feature 'SELECT INTO' is not supported when security enhanced mode is enabled") + require.Error(t, err, "[planner:8132]Feature 'SELECT INTO' is not supported when security enhanced mode is enabled") } -func (s *testIntegrationSuite) TestIssue23925(c *C) { - defer s.cleanEnv(c) - tk := testkit.NewTestKit(c, s.store) +func TestIssue23925(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test;") tk.MustExec("drop table if exists t;") @@ -9647,8 +5842,11 @@ func (s *testIntegrationSuite) TestIssue23925(c *C) { tk.MustQuery("select max(b) + 0 from t group by a;").Check(testkit.Rows("2")) } -func (s *testIntegrationSuite) TestCTEInvalidUsage(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestCTEInvalidUsage(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test;") tk.MustExec("drop table if exists t;") @@ -9688,9 +5886,11 @@ func (s *testIntegrationSuite) TestCTEInvalidUsage(c *C) { tk.MustGetErrCode("with recursive cte(n) as (select 1 union select 1 except select * from cte) select * from cte;", errno.ErrNotSupportedYet) } -func (s *testIntegrationSuite) TestIssue23889(c *C) { - defer s.cleanEnv(c) - tk := testkit.NewTestKit(c, s.store) +func TestIssue23889(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists test_decimal,test_t;") tk.MustExec("create table test_decimal(col_decimal decimal(10,0));") @@ -9702,9 +5902,11 @@ func (s *testIntegrationSuite) TestIssue23889(c *C) { testkit.Rows("<nil>", "0")) } -func (s *testIntegrationSuite) TestRefineArgNullValues(c *C) { - defer s.cleanEnv(c) - tk := testkit.NewTestKit(c, s.store) +func TestRefineArgNullValues(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("create table t(id int primary key, a int)") tk.MustExec("create table s(a int)") @@ -9716,15 +5918,16 @@ func (s *testIntegrationSuite) TestRefineArgNullValues(c *C) { )) } -func (s *testIntegrationSuite) TestEnumIndex(c *C) { - defer s.cleanEnv(c) - +func TestEnumIndex(t *testing.T) { elems := []string{"\"a\"", "\"b\"", "\"c\""} rand.Shuffle(len(elems), func(i, j int) { elems[i], elems[j] = elems[j], elems[i] }) - tk := testkit.NewTestKit(c, s.store) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t,tidx") tk.MustExec("create table t(e enum(" + strings.Join(elems, ",") + "))") @@ -9811,8 +6014,11 @@ func (s *testIntegrationSuite) TestEnumIndex(c *C) { // Previously global values were cached. This is incorrect. // See: https://github.com/pingcap/tidb/issues/24368 -func (s *testIntegrationSuite) TestGlobalCacheCorrectness(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestGlobalCacheCorrectness(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustQuery("SHOW VARIABLES LIKE 'max_connections'").Check(testkit.Rows("max_connections 151")) tk.MustExec("SET GLOBAL max_connections=1234") tk.MustQuery("SHOW VARIABLES LIKE 'max_connections'").Check(testkit.Rows("max_connections 1234")) @@ -9820,8 +6026,11 @@ func (s *testIntegrationSuite) TestGlobalCacheCorrectness(c *C) { tk.MustExec("SET GLOBAL max_connections=151") } -func (s *testIntegrationSuite) TestRedundantColumnResolve(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestRedundantColumnResolve(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t1, t2") tk.MustExec("create table t1(a int not null)") @@ -9831,10 +6040,10 @@ func (s *testIntegrationSuite) TestRedundantColumnResolve(c *C) { tk.MustQuery("select a, count(*) from t1 join t2 using (a) group by a").Check(testkit.Rows("1 1")) tk.MustQuery("select a, count(*) from t1 natural join t2 group by a").Check(testkit.Rows("1 1")) err := tk.ExecToErr("select a, count(*) from t1 join t2 on t1.a=t2.a group by a") - c.Assert(err.Error(), Equals, "[planner:1052]Column 'a' in field list is ambiguous") + require.Error(t, err, "[planner:1052]Column 'a' in field list is ambiguous") tk.MustQuery("select t1.a, t2.a from t1 join t2 using (a) group by t1.a").Check(testkit.Rows("1 1")) err = tk.ExecToErr("select t1.a, t2.a from t1 join t2 using(a) group by a") - c.Assert(err.Error(), Equals, "[planner:1052]Column 'a' in group statement is ambiguous") + require.Error(t, err, "[planner:1052]Column 'a' in group statement is ambiguous") tk.MustQuery("select t2.a from t1 join t2 using (a) group by t1.a").Check(testkit.Rows("1")) tk.MustQuery("select t1.a from t1 join t2 using (a) group by t1.a").Check(testkit.Rows("1")) tk.MustQuery("select t2.a from t1 join t2 using (a) group by t2.a").Check(testkit.Rows("1")) @@ -9849,11 +6058,12 @@ func (s *testIntegrationSuite) TestRedundantColumnResolve(c *C) { tk.MustQuery("select t1.a, t2.a from t1 natural join t2").Check(testkit.Rows("1 1")) } -func (s *testIntegrationSuite) TestControlFunctionWithEnumOrSet(c *C) { - defer s.cleanEnv(c) - +func TestControlFunctionWithEnumOrSet(t *testing.T) { // issue 23114 - tk := testkit.NewTestKit(c, s.store) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists e;") tk.MustExec("create table e(e enum('c', 'b', 'a'));") @@ -9933,29 +6143,48 @@ func (s *testIntegrationSuite) TestControlFunctionWithEnumOrSet(c *C) { tk.MustExec("insert into t values(1,1,1),(2,1,1),(1,1,1),(2,1,1);") tk.MustQuery("select if(A, null,b)=1 from t;").Check(testkit.Rows("<nil>", "<nil>", "<nil>", "<nil>")) tk.MustQuery("select if(A, null,b)='a' from t;").Check(testkit.Rows("<nil>", "<nil>", "<nil>", "<nil>")) -} -func (s *testIntegrationSuite) TestComplexShowVariables(c *C) { + // issue 29357 + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(`a` enum('y','b','Abc','null','1','2','0')) CHARSET=binary;") + tk.MustExec("insert into t values(\"1\");") + tk.MustQuery("SELECT count(*) from t where (null like 'a') = (case when cast('2015' as real) <=> round(\"1200\",\"1\") then a end);\n").Check(testkit.Rows("0")) + tk.MustQuery("SELECT (null like 'a') = (case when cast('2015' as real) <=> round(\"1200\",\"1\") then a end) from t;\n").Check(testkit.Rows("<nil>")) + tk.MustQuery("SELECT 5 = (case when 0 <=> 0 then a end) from t;").Check(testkit.Rows("1")) + tk.MustQuery("SELECT '1' = (case when 0 <=> 0 then a end) from t;").Check(testkit.Rows("1")) + tk.MustQuery("SELECT 5 = (case when 0 <=> 1 then a end) from t;").Check(testkit.Rows("<nil>")) + tk.MustQuery("SELECT '1' = (case when 0 <=> 1 then a end) from t;").Check(testkit.Rows("<nil>")) + tk.MustQuery("SELECT 5 = (case when 0 <=> 1 then a else a end) from t;").Check(testkit.Rows("1")) + tk.MustQuery("SELECT '1' = (case when 0 <=> 1 then a else a end) from t;").Check(testkit.Rows("1")) +} + +func TestComplexShowVariables(t *testing.T) { // This is an example SHOW VARIABLES from mysql-connector-java-5.1.34 // It returns 19 rows in MySQL 5.7 (the language sysvar no longer exists in 5.6+) // and 16 rows in MySQL 8.0 (the aliases for tx_isolation is removed, along with query cache) // In the event that we hide noop sysvars in future, we must keep these variables. - tk := testkit.NewTestKit(c, s.store) - c.Assert(tk.MustQuery(`SHOW VARIABLES WHERE Variable_name ='language' OR Variable_name = 'net_write_timeout' OR Variable_name = 'interactive_timeout' + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + require.Len(t, tk.MustQuery(`SHOW VARIABLES WHERE Variable_name ='language' OR Variable_name = 'net_write_timeout' OR Variable_name = 'interactive_timeout' OR Variable_name = 'wait_timeout' OR Variable_name = 'character_set_client' OR Variable_name = 'character_set_connection' OR Variable_name = 'character_set' OR Variable_name = 'character_set_server' OR Variable_name = 'tx_isolation' OR Variable_name = 'transaction_isolation' OR Variable_name = 'character_set_results' OR Variable_name = 'timezone' OR Variable_name = 'time_zone' OR Variable_name = 'system_time_zone' OR Variable_name = 'lower_case_table_names' OR Variable_name = 'max_allowed_packet' OR Variable_name = 'net_buffer_length' OR Variable_name = 'sql_mode' OR Variable_name = 'query_cache_type' OR Variable_name = 'query_cache_size' -OR Variable_name = 'license' OR Variable_name = 'init_connect'`).Rows(), HasLen, 19) +OR Variable_name = 'license' OR Variable_name = 'init_connect'`).Rows(), 19) } -func (s *testIntegrationSuite) TestBuiltinFuncJSONMergePatch_InColumn(c *C) { +func TestBuiltinFuncJSONMergePatch_InColumn(t *testing.T) { ctx := context.Background() - tk := testkit.NewTestKit(c, s.store) - defer s.cleanEnv(c) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tests := []struct { input [2]interface{} expected interface{} @@ -10000,30 +6229,33 @@ func (s *testIntegrationSuite) TestBuiltinFuncJSONMergePatch_InColumn(c *C) { tk.MustExec(`use test;`) tk.MustExec(`drop table if exists t;`) tk.MustExec("CREATE TABLE t ( `id` INT NOT NULL AUTO_INCREMENT, `j` json NULL, `vc` VARCHAR ( 5000 ) NULL, PRIMARY KEY ( `id` ) );") - for id, t := range tests { - tk.MustExec("insert into t values(?,?,?)", id+1, t.input[0], t.input[1]) - if t.success { + for id, tt := range tests { + tk.MustExec("insert into t values(?,?,?)", id+1, tt.input[0], tt.input[1]) + if tt.success { result := tk.MustQuery("select json_merge_patch(j,vc) from t where id = ?", id+1) - if t.expected == nil { + if tt.expected == nil { result.Check(testkit.Rows("<nil>")) } else { - j, e := json.ParseBinaryFromString(t.expected.(string)) - c.Assert(e, IsNil) + j, e := json.ParseBinaryFromString(tt.expected.(string)) + require.NoError(t, e) result.Check(testkit.Rows(j.String())) } } else { rs, _ := tk.Exec("select json_merge_patch(j,vc) from t where id = ?;", id+1) - _, err := session.GetRows4Test(ctx, tk.Se, rs) + _, err := session.GetRows4Test(ctx, tk.Session(), rs) terr := errors.Cause(err).(*terror.Error) - c.Assert(terr.Code(), Equals, errors.ErrCode(t.errCode)) + require.Equal(t, errors.ErrCode(tt.errCode), terr.Code()) } } } -func (s *testIntegrationSuite) TestBuiltinFuncJSONMergePatch_InExpression(c *C) { +func TestBuiltinFuncJSONMergePatch_InExpression(t *testing.T) { ctx := context.Background() - tk := testkit.NewTestKit(c, s.store) - defer s.cleanEnv(c) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tests := []struct { input []interface{} expected interface{} @@ -10114,52 +6346,60 @@ func (s *testIntegrationSuite) TestBuiltinFuncJSONMergePatch_InExpression(c *C) {[]interface{}{`{"a":1}`, `jjj`, `null`}, nil, false, mysql.ErrInvalidJSONText}, } - for _, t := range tests { - marks := make([]string, len(t.input)) + for _, tt := range tests { + marks := make([]string, len(tt.input)) for i := 0; i < len(marks); i++ { marks[i] = "?" } sql := fmt.Sprintf("select json_merge_patch(%s);", strings.Join(marks, ",")) - if t.success { - result := tk.MustQuery(sql, t.input...) - if t.expected == nil { + if tt.success { + result := tk.MustQuery(sql, tt.input...) + if tt.expected == nil { result.Check(testkit.Rows("<nil>")) } else { - j, e := json.ParseBinaryFromString(t.expected.(string)) - c.Assert(e, IsNil) + j, e := json.ParseBinaryFromString(tt.expected.(string)) + require.NoError(t, e) result.Check(testkit.Rows(j.String())) } } else { - rs, _ := tk.Exec(sql, t.input...) - _, err := session.GetRows4Test(ctx, tk.Se, rs) + rs, _ := tk.Exec(sql, tt.input...) + _, err := session.GetRows4Test(ctx, tk.Session(), rs) terr := errors.Cause(err).(*terror.Error) - c.Assert(terr.Code(), Equals, errors.ErrCode(t.errCode)) + require.Equal(t, errors.ErrCode(tt.errCode), terr.Code()) } } } -func (s *testIntegrationSuite) TestFloat64Inf(c *C) { - defer s.cleanEnv(c) - tk := testkit.NewTestKit(c, s.store) +func TestFloat64Inf(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustQuery("select '1e800' + 1e100;").Check( testkit.Rows("179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")) tk.MustQuery("select '-1e800' - 1e100;").Check( testkit.Rows("-179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")) } -func (s *testIntegrationSuite) TestCharsetErr(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestCharsetErr(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("create table charset_test(id int auto_increment primary key, c1 varchar(255) character set ascii)") err := tk.ExecToErr("insert into charset_test(c1) values ('aaa\xEF\xBF\xBDabcdef')") - c.Assert(err.Error(), Equals, "[table:1366]Incorrect string value '\\xEF\\xBF\\xBDabc...' for column 'c1'") + require.Error(t, err, "[table:1366]Incorrect string value '\\xEF\\xBF\\xBDabc...' for column 'c1'") err = tk.ExecToErr("insert into charset_test(c1) values ('aaa\xEF\xBF\xBD')") - c.Assert(err.Error(), Equals, "[table:1366]Incorrect string value '\\xEF\\xBF\\xBD' for column 'c1'") + require.Error(t, err, "[table:1366]Incorrect string value '\\xEF\\xBF\\xBD' for column 'c1'") } -func (s *testIntegrationSuite2) TestIssue25591(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue25591(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test;") tk.MustExec("drop table if exists t1_1, t2_1;") @@ -10177,8 +6417,11 @@ func (s *testIntegrationSuite2) TestIssue25591(c *C) { rows.Check(testkit.Rows()) } -func (s *testIntegrationSuite2) TestIssue25526(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue25526(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test;") tk.MustExec("drop table if exists tbl_6, tbl_17;") @@ -10190,8 +6433,11 @@ func (s *testIntegrationSuite2) TestIssue25526(c *C) { rows.Check(testkit.Rows()) } -func (s *testIntegrationSuite) TestTimestampIssue25093(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestTimestampIssue25093(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t(col decimal(45,8) default 13.654 not null);") @@ -10204,8 +6450,11 @@ func (s *testIntegrationSuite) TestTimestampIssue25093(c *C) { tk.MustQuery("select timestamp(101.234) from t;").Check(testkit.Rows("2000-01-01 00:00:00.000")) } -func (s *testIntegrationSuite) TestIssue24953(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue24953(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists tbl_0,tbl_9;") tk.MustExec("CREATE TABLE `tbl_9` (\n `col_54` mediumint NOT NULL DEFAULT '2412996',\n `col_55` int NOT NULL,\n `col_56` bigint unsigned NOT NULL,\n `col_57` varchar(108) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,\n PRIMARY KEY (`col_57`(3),`col_55`,`col_56`,`col_54`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;") @@ -10215,9 +6464,11 @@ func (s *testIntegrationSuite) TestIssue24953(c *C) { } // issue https://github.com/pingcap/tidb/issues/26111 -func (s *testIntegrationSuite) TestRailsFKUsage(c *C) { - defer s.cleanEnv(c) - tk := testkit.NewTestKit(c, s.store) +func TestRailsFKUsage(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec(`CREATE TABLE author_addresses ( id bigint(20) NOT NULL AUTO_INCREMENT, @@ -10249,9 +6500,12 @@ func (s *testIntegrationSuite) TestRailsFKUsage(c *C) { AND fk.table_name = 'authors';`).Check(testkit.Rows("author_addresses id author_address_id fk_rails_94423a17a3 CASCADE RESTRICT")) } -func (s *testIntegrationSuite) TestTranslate(c *C) { +func TestTranslate(t *testing.T) { cases := []string{"'ABC'", "'AABC'", "'A.B.C'", "'aaaaabbbbb'", "'abc'", "'aaa'", "NULL"} - tk := testkit.NewTestKit(c, s.store) + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") // Non-reserved keyword @@ -10283,20 +6537,11 @@ func (s *testIntegrationSuite) TestTranslate(c *C) { tk.MustQuery("select translate(i, '0123456', 'abcdefg') from t").Check(testkit.Rows("a", "b", "c", "d", "e", "f", "g")) } -func (s *testIntegrationSerialSuite) TestIssue26662(c *C) { - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t1;") - tk.MustExec("create table t1(a varchar(36) NOT NULL) ENGINE = InnoDB DEFAULT CHARSET = utf8 COLLATE = utf8_general_ci;") - tk.MustExec("set names utf8;") - tk.MustQuery("select t2.b from (select t1.a as b from t1 union all select t1.a as b from t1) t2 where case when (t2.b is not null) then t2.b else '' end > '1234567';"). - Check(testkit.Rows()) -} +func TestIssue26958(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() -func (s *testIntegrationSuite) TestIssue26958(c *C) { - tk := testkit.NewTestKit(c, s.store) + tk := testkit.NewTestKit(t, store) tk.MustExec("use test;") tk.MustExec("drop table if exists t1;") tk.MustExec("create table t1 (c_int int not null);") @@ -10308,8 +6553,11 @@ func (s *testIntegrationSuite) TestIssue26958(c *C) { Check(testkit.Rows("3 3", "2 2", "1 1")) } -func (s *testIntegrationSuite) TestConstPropNullFunctions(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestConstPropNullFunctions(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t1, t2") tk.MustExec("create table t1 (a integer)") @@ -10326,8 +6574,11 @@ func (s *testIntegrationSuite) TestConstPropNullFunctions(c *C) { tk.MustQuery("select * from t2 where t2.i2=((select count(1) from t1 where t1.i1=t2.i2))").Check(testkit.Rows("1 <nil> 0.1")) } -func (s *testIntegrationSuite) TestIssue27233(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue27233(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test;") tk.MustExec("drop table if exists t;") tk.MustExec("CREATE TABLE `t` (\n `COL1` tinyint(45) NOT NULL,\n `COL2` tinyint(45) NOT NULL,\n PRIMARY KEY (`COL1`,`COL2`) /*T![clustered_index] NONCLUSTERED */\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;") @@ -10336,8 +6587,11 @@ func (s *testIntegrationSuite) TestIssue27233(c *C) { Check(testkit.Rows("100")) } -func (s *testIntegrationSuite) TestIssue27236(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue27236(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test;") row := tk.MustQuery(`select extract(hour_second from "-838:59:59.00");`) row.Check(testkit.Rows("-8385959")) @@ -10349,14 +6603,20 @@ func (s *testIntegrationSuite) TestIssue27236(c *C) { row.Check(testkit.Rows("-8385959", "7005959")) } -func (s *testIntegrationSuite) TestIssue26977(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue26977(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) result := tk.MustQuery("select a + 1 as f from (select cast(0xfffffffffffffff0 as unsigned) as a union select cast(1 as unsigned)) t having f != 2;") result.Check(testkit.Rows("18446744073709551601")) } -func (s *testIntegrationSuite) TestIssue27610(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue27610(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec(`use test;`) tk.MustExec(`drop table if exists PK_TCOLLATION3966STROBJSTROBJ;`) tk.MustExec("CREATE TABLE `PK_TCOLLATION3966STROBJSTROBJ` (\n `COL1` enum('ll','aa','bb','cc','dd','ee') COLLATE utf8_general_ci NOT NULL,\n `COL2` varchar(20) COLLATE utf8_general_ci DEFAULT NULL,\n PRIMARY KEY (`COL1`) /*T![clustered_index] CLUSTERED */\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;") @@ -10365,8 +6625,11 @@ func (s *testIntegrationSuite) TestIssue27610(c *C) { Check(testkit.Rows()) } -func (s *testIntegrationSuite) TestLastInsertId(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestLastInsertId(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec(`use test;`) tk.MustExec(`drop table if exists lastinsertid;`) tk.MustExec(`create table lastinsertid (id int not null primary key auto_increment);`) @@ -10379,8 +6642,61 @@ func (s *testIntegrationSuite) TestLastInsertId(c *C) { tk.MustQuery("SELECT @@last_insert_id, LAST_INSERT_ID()").Check(testkit.Rows("3 3")) } -func (s *testIntegrationSuite) TestIdentity(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestTimestamp(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec(`use test;`) + tk.MustExec("SET time_zone = '+00:00';") + defer tk.MustExec("SET time_zone = DEFAULT;") + timestampStr1 := fmt.Sprintf("%s", tk.MustQuery("SELECT @@timestamp;").Rows()[0]) + timestampStr1 = timestampStr1[1:] + timestampStr1 = timestampStr1[:len(timestampStr1)-1] + timestamp1, err := strconv.ParseFloat(timestampStr1, 64) + require.NoError(t, err) + nowStr1 := fmt.Sprintf("%s", tk.MustQuery("SELECT NOW(6);").Rows()[0]) + now1, err := time.Parse("[2006-01-02 15:04:05.000000]", nowStr1) + require.NoError(t, err) + tk.MustExec("set @@timestamp = 12345;") + tk.MustQuery("SELECT @@timestamp;").Check(testkit.Rows("12345")) + tk.MustQuery("SELECT NOW();").Check(testkit.Rows("1970-01-01 03:25:45")) + tk.MustQuery("SELECT NOW();").Check(testkit.Rows("1970-01-01 03:25:45")) + tk.MustExec("set @@timestamp = default;") + time.Sleep(2 * time.Microsecond) + timestampStr2 := fmt.Sprintf("%s", tk.MustQuery("SELECT @@timestamp;").Rows()[0]) + timestampStr2 = timestampStr2[1:] + timestampStr2 = timestampStr2[:len(timestampStr2)-1] + timestamp2, err := strconv.ParseFloat(timestampStr2, 64) + require.NoError(t, err) + nowStr2 := fmt.Sprintf("%s", tk.MustQuery("SELECT NOW(6);").Rows()[0]) + now2, err := time.Parse("[2006-01-02 15:04:05.000000]", nowStr2) + require.NoError(t, err) + require.Less(t, timestamp1, timestamp2) + require.Less(t, now1.UnixNano(), now2.UnixNano()) + tk.MustExec("set @@timestamp = 12345;") + tk.MustQuery("SELECT @@timestamp;").Check(testkit.Rows("12345")) + tk.MustQuery("SELECT NOW();").Check(testkit.Rows("1970-01-01 03:25:45")) + tk.MustQuery("SELECT NOW();").Check(testkit.Rows("1970-01-01 03:25:45")) + tk.MustExec("set @@timestamp = 0;") + time.Sleep(2 * time.Microsecond) + timestampStr3 := fmt.Sprintf("%s", tk.MustQuery("SELECT @@timestamp;").Rows()[0]) + timestampStr3 = timestampStr3[1:] + timestampStr3 = timestampStr3[:len(timestampStr3)-1] + timestamp3, err := strconv.ParseFloat(timestampStr3, 64) + require.NoError(t, err) + nowStr3 := fmt.Sprintf("%s", tk.MustQuery("SELECT NOW(6);").Rows()[0]) + now3, err := time.Parse("[2006-01-02 15:04:05.000000]", nowStr3) + require.NoError(t, err) + require.Less(t, timestamp2, timestamp3) + require.Less(t, now2.UnixNano(), now3.UnixNano()) +} + +func TestIdentity(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec(`use test;`) tk.MustExec(`drop table if exists identity;`) tk.MustExec(`create table identity (id int not null primary key auto_increment);`) @@ -10393,8 +6709,37 @@ func (s *testIntegrationSuite) TestIdentity(c *C) { tk.MustQuery("SELECT @@identity, LAST_INSERT_ID()").Check(testkit.Rows("3 3")) } -func (s *testIntegrationSuite) TestIssue28643(c *C) { - tk := testkit.NewTestKit(c, s.store) +func TestIssue28804(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists perf_offline_day;") + tk.MustExec(`CREATE TABLE perf_offline_day ( +uuid varchar(50), +ts timestamp NOT NULL, +user_id varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, +platform varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL, +host_id bigint(20) DEFAULT NULL, +PRIMARY KEY (uuid,ts) /*T![clustered_index] NONCLUSTERED */ +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci +PARTITION BY RANGE ( UNIX_TIMESTAMP(ts) ) ( +PARTITION p20210906 VALUES LESS THAN (1630944000), +PARTITION p20210907 VALUES LESS THAN (1631030400), +PARTITION p20210908 VALUES LESS THAN (1631116800), +PARTITION p20210909 VALUES LESS THAN (1631203200) +);`) + tk.MustExec("set @@tidb_partition_prune_mode = 'static'") + tk.MustExec("INSERT INTO `perf_offline_day` VALUES ('dd082c8a-3bab-4431-943a-348fe0592abd','2021-09-08 13:00:07','Xg9C8zq81jGNbugM', 'pc', 12345);") + tk.MustQuery("SELECT cast(floor(hour(ts) / 4) as char) as win_start FROM perf_offline_day partition (p20210907, p20210908) GROUP BY win_start;").Check(testkit.Rows("3")) +} + +func TestIssue28643(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t(a time(4));") @@ -10405,3 +6750,162 @@ func (s *testIntegrationSuite) TestIssue28643(c *C) { tk.MustExec("set tidb_enable_vectorized_expression = off;") tk.MustQuery("select hour(a) from t;").Check(testkit.Rows("838", "838")) } + +func TestIssue27831(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a enum(\"a\", \"b\"), b enum(\"a\", \"b\"), c bool)") + tk.MustExec("insert into t values(\"a\", \"a\", 1);") + tk.MustQuery("select * from t t1 right join t t2 on t1.a=t2.b and t1.a= t2.c;").Check(testkit.Rows("a a 1 a a 1")) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a enum(\"a\", \"b\"), b enum(\"a\", \"b\"), c bool, d int, index idx(d))") + tk.MustExec("insert into t values(\"a\", \"a\", 1, 1);") + tk.MustQuery("select /*+ inl_hash_join(t1) */ * from t t1 right join t t2 on t1.a=t2.b and t1.a= t2.c and t1.d=t2.d;").Check(testkit.Rows("a a 1 1 a a 1 1")) +} + +func TestIssue29434(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + tk.MustExec("drop table if exists t1;") + tk.MustExec("create table t1(c1 datetime);") + tk.MustExec("insert into t1 values('2021-12-12 10:10:10.000');") + tk.MustExec("set tidb_enable_vectorized_expression = on;") + tk.MustQuery("select greatest(c1, '99999999999999') from t1;").Check(testkit.Rows("99999999999999")) + tk.MustExec("set tidb_enable_vectorized_expression = off;") + tk.MustQuery("select greatest(c1, '99999999999999') from t1;").Check(testkit.Rows("99999999999999")) + + tk.MustExec("set tidb_enable_vectorized_expression = on;") + tk.MustQuery("select least(c1, '99999999999999') from t1;").Check(testkit.Rows("2021-12-12 10:10:10")) + tk.MustExec("set tidb_enable_vectorized_expression = off;") + tk.MustQuery("select least(c1, '99999999999999') from t1;").Check(testkit.Rows("2021-12-12 10:10:10")) +} + +func TestIssue29417(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1;") + tk.MustExec("create table t1 (f1 decimal(5,5));") + tk.MustExec("insert into t1 values (-0.12345);") + tk.MustQuery("select concat(f1) from t1;").Check(testkit.Rows("-0.12345")) +} + +func TestIssue29244(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a time(4));") + tk.MustExec("insert into t values(\"-700:10:10.123456111\");") + tk.MustExec("insert into t values(\"700:10:10.123456111\");") + tk.MustExec("set tidb_enable_vectorized_expression = on;") + tk.MustQuery("select microsecond(a) from t;").Check(testkit.Rows("123500", "123500")) + tk.MustExec("set tidb_enable_vectorized_expression = off;") + tk.MustQuery("select microsecond(a) from t;").Check(testkit.Rows("123500", "123500")) +} + +func TestIssue29513(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustQuery("select '123' union select cast(45678 as char);").Sort().Check(testkit.Rows("123", "45678")) + tk.MustQuery("select '123' union select cast(45678 as char(2));").Sort().Check(testkit.Rows("123", "45")) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int);") + tk.MustExec("insert into t values(45678);") + tk.MustQuery("select '123' union select cast(a as char) from t;").Sort().Check(testkit.Rows("123", "45678")) + tk.MustQuery("select '123' union select cast(a as char(2)) from t;").Sort().Check(testkit.Rows("123", "45")) +} + +func TestIssue29755(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + tk.MustExec("set tidb_enable_vectorized_expression = on;") + tk.MustQuery("select char(123, NULL, 123)").Check(testkit.Rows("{{")) + tk.MustQuery("select char(NULL, 123, 123)").Check(testkit.Rows("{{")) + tk.MustExec("set tidb_enable_vectorized_expression = off;") + tk.MustQuery("select char(123, NULL, 123)").Check(testkit.Rows("{{")) + tk.MustQuery("select char(NULL, 123, 123)").Check(testkit.Rows("{{")) +} + +func TestIssue30101(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1;") + tk.MustExec("create table t1(c1 bigint unsigned, c2 bigint unsigned);") + tk.MustExec("insert into t1 values(9223372036854775808, 9223372036854775809);") + tk.MustQuery("select greatest(c1, c2) from t1;").Sort().Check(testkit.Rows("9223372036854775809")) +} + +func TestIssue28739(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec(`USE test`) + tk.MustExec("SET time_zone = 'Europe/Vilnius'") + tk.MustQuery("SELECT UNIX_TIMESTAMP('2020-03-29 03:45:00')").Check(testkit.Rows("1585443600")) + tk.MustQuery("SELECT FROM_UNIXTIME(UNIX_TIMESTAMP('2020-03-29 03:45:00'))").Check(testkit.Rows("2020-03-29 04:00:00")) + tk.MustExec(`DROP TABLE IF EXISTS t`) + tk.MustExec(`CREATE TABLE t (dt DATETIME NULL)`) + defer tk.MustExec(`DROP TABLE t`) + // Test the vector implememtation + tk.MustExec(`INSERT INTO t VALUES ('2021-10-31 02:30:00'), ('2021-03-28 02:30:00'), ('2020-10-04 02:15:00'), ('2020-03-29 03:45:00'), (NULL)`) + tk.MustQuery(`SELECT dt, UNIX_TIMESTAMP(dt) FROM t`).Sort().Check(testkit.Rows( + "2020-03-29 03:45:00 1585443600", + "2020-10-04 02:15:00 1601766900", + "2021-03-28 02:30:00 1616891400", + "2021-10-31 02:30:00 1635636600", + "<nil> <nil>")) +} + +func TestIssue30326(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a int);") + tk.MustExec("insert into t values(1),(1),(2),(2);") + tk.MustExec("set tidb_window_concurrency = 1;") + err := tk.QueryToErr("select (FIRST_VALUE(1) over (partition by v.a)) as c3 from (select a from t where t.a = (select a from t t2 where t.a = t2.a)) as v;") + require.Error(t, err, "[executor:1242]Subquery returns more than 1 row") +} + +func TestIssue30174(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1,t2;") + tk.MustExec("CREATE TABLE `t1` (\n `c1` enum('Alice','Bob','Charlie','David') NOT NULL,\n `c2` blob NOT NULL,\n PRIMARY KEY (`c2`(5)),\n UNIQUE KEY `idx_89` (`c1`)\n);") + tk.MustExec("CREATE TABLE `t2` (\n `c1` enum('Alice','Bob','Charlie','David') NOT NULL DEFAULT 'Alice',\n `c2` set('Alice','Bob','Charlie','David') NOT NULL DEFAULT 'David',\n `c3` enum('Alice','Bob','Charlie','David') NOT NULL,\n PRIMARY KEY (`c3`,`c2`)\n);") + tk.MustExec("insert into t1 values('Charlie','');") + tk.MustExec("insert into t2 values('Charlie','Charlie','Alice');") + tk.MustQuery("select * from t2 where c3 in (select c2 from t1);").Check(testkit.Rows()) + tk.MustQuery("select * from t2 where c2 in (select c2 from t1);").Check(testkit.Rows()) +} diff --git a/expression/main_test.go b/expression/main_test.go new file mode 100644 index 0000000000000..9a1e170078f65 --- /dev/null +++ b/expression/main_test.go @@ -0,0 +1,82 @@ +// Copyright 2021 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, +// 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. + +package expression + +import ( + "testing" + "time" + + "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/testkit/testdata" + "github.com/pingcap/tidb/testkit/testmain" + "github.com/pingcap/tidb/util/mock" + "github.com/pingcap/tidb/util/testbridge" + "github.com/pingcap/tidb/util/timeutil" + "github.com/stretchr/testify/require" + "github.com/tikv/client-go/v2/tikv" + "go.uber.org/goleak" +) + +var testDataMap = make(testdata.BookKeeper) + +func TestMain(m *testing.M) { + testbridge.WorkaroundGoCheckFlags() + testmain.ShortCircuitForBench(m) + + config.UpdateGlobal(func(conf *config.Config) { + conf.TiKVClient.AsyncCommit.SafeWindow = 0 + conf.TiKVClient.AsyncCommit.AllowedClockDrift = 0 + conf.Experimental.AllowsExpressionIndex = true + }) + tikv.EnableFailpoints() + + // Some test depends on the values of timeutil.SystemLocation() + // If we don't SetSystemTZ() here, the value would change unpredictable. + // Affected by the order whether a testsuite runs before or after integration test. + // Note, SetSystemTZ() is a sync.Once operation. + timeutil.SetSystemTZ("system") + + testDataMap.LoadTestSuiteData("testdata", "flag_simplify") + testDataMap.LoadTestSuiteData("testdata", "expression_suite") + + opts := []goleak.Option{ + goleak.IgnoreTopFunction("go.etcd.io/etcd/pkg/logutil.(*MergeLogger).outputLoop"), + goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), + } + + callback := func(i int) int { + testDataMap.GenerateOutputIfNeeded() + return i + } + goleak.VerifyTestMain(testmain.WrapTestingM(m, callback), opts...) +} + +func createContext(t *testing.T) *mock.Context { + ctx := mock.NewContext() + ctx.GetSessionVars().StmtCtx.TimeZone = time.Local + sc := ctx.GetSessionVars().StmtCtx + sc.TruncateAsWarning = true + require.NoError(t, ctx.GetSessionVars().SetSystemVar("max_allowed_packet", "67108864")) + ctx.GetSessionVars().PlanColumnID = 0 + return ctx +} + +func GetFlagSimplifyData() testdata.TestData { + return testDataMap["flag_simplify"] +} + +func GetExpressionSuiteData() testdata.TestData { + return testDataMap["expression_suite"] +} diff --git a/expression/partition_pruner.go b/expression/partition_pruner.go index a9cb55cf69915..4ed5c06781164 100644 --- a/expression/partition_pruner.go +++ b/expression/partition_pruner.go @@ -19,6 +19,7 @@ import ( "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/disjointset" ) @@ -60,8 +61,8 @@ func (p *hashPartitionPruner) reduceColumnEQ() bool { father := p.unionSet.FindRoot(i) if p.constantMap[i] != nil { if p.constantMap[father] != nil { - // May has conflict here. - if !p.constantMap[father].Equal(p.ctx, p.constantMap[i]) { + // May has conflict here. We can choose collation from lhs or rhs, they should be equal. Exception is that `NULL` values. + if eq, err := p.constantMap[father].Value.Compare(p.ctx.GetSessionVars().StmtCtx, &p.constantMap[i].Value, collate.GetCollator(p.constantMap[i].GetType().Collate)); eq != 0 || err != nil { return true } } else { @@ -95,7 +96,8 @@ func (p *hashPartitionPruner) reduceConstantEQ() bool { if col != nil { id := p.getColID(col) if p.constantMap[id] != nil { - if p.constantMap[id].Equal(p.ctx, cond) { + // We can choose collation from lhs or rhs, they should be equal. Exception is that `NULL` values. + if eq, err := p.constantMap[id].Value.Compare(p.ctx.GetSessionVars().StmtCtx, &cond.Value, collate.GetCollator(cond.GetType().Collate)); eq == 0 && err == nil { continue } return true diff --git a/expression/scalar_function.go b/expression/scalar_function.go index dd7805a6c282f..bbc3086ed944f 100644 --- a/expression/scalar_function.go +++ b/expression/scalar_function.go @@ -30,15 +30,9 @@ import ( "github.com/pingcap/tidb/types/json" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/codec" - "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/hack" ) -// error definitions. -var ( - ErrNoDB = dbterror.ClassOptimizer.NewStd(mysql.ErrNoDB) -) - // ScalarFunction is the function that returns a value. type ScalarFunction struct { FuncName model.CIStr @@ -189,6 +183,10 @@ func newFunctionImpl(ctx sessionctx.Context, fold int, funcName string, retType return BuildCastFunction(ctx, args[0], retType), nil case ast.GetVar: return BuildGetVarFunction(ctx, args[0], retType) + case InternalFuncFromBinary: + return BuildFromBinaryFunction(ctx, args[0], retType), nil + case InternalFuncToBinary: + return BuildToBinaryFunction(ctx, args[0]), nil } fc, ok := funcs[funcName] if !ok { @@ -286,8 +284,9 @@ func (sf *ScalarFunction) Clone() Expression { Function: sf.Function.Clone(), hashcode: sf.hashcode, } - c.SetCharsetAndCollation(sf.CharsetAndCollation(sf.GetCtx())) + c.SetCharsetAndCollation(sf.CharsetAndCollation()) c.SetCoercibility(sf.Coercibility()) + c.SetRepertoire(sf.Repertoire()) return c } @@ -370,6 +369,14 @@ func (sf *ScalarFunction) Eval(row chunk.Row) (d types.Datum, err error) { str, isNull, err = sf.EvalString(sf.GetCtx(), row) if !isNull && err == nil && tp.Tp == mysql.TypeEnum { res, err = types.ParseEnum(tp.Elems, str, tp.Collate) + if ctx := sf.GetCtx(); ctx != nil { + if sc := ctx.GetSessionVars().StmtCtx; sc != nil { + if sc.TruncateAsWarning { + ctx.GetSessionVars().StmtCtx.AppendWarning(err) + err = nil + } + } + } } else { res = str } @@ -438,6 +445,12 @@ func ReHashCode(sf *ScalarFunction, sc *stmtctx.StatementContext) { for _, arg := range sf.GetArgs() { sf.hashcode = append(sf.hashcode, arg.HashCode(sc)...) } + // Cast is a special case. The RetType should also be considered as an argument. + // Please see `newFunctionImpl()` for detail. + if sf.FuncName.L == ast.Cast { + evalTp := sf.RetType.EvalType() + sf.hashcode = append(sf.hashcode, byte(evalTp)) + } } // ResolveIndices implements Expression interface. @@ -558,12 +571,12 @@ func (sf *ScalarFunction) SetCoercibility(val Coercibility) { sf.Function.SetCoercibility(val) } -// CharsetAndCollation ... -func (sf *ScalarFunction) CharsetAndCollation(ctx sessionctx.Context) (string, string) { - return sf.Function.CharsetAndCollation(ctx) +// CharsetAndCollation gets charset and collation. +func (sf *ScalarFunction) CharsetAndCollation() (string, string) { + return sf.Function.CharsetAndCollation() } -// SetCharsetAndCollation ... +// SetCharsetAndCollation sets charset and collation. func (sf *ScalarFunction) SetCharsetAndCollation(chs, coll string) { sf.Function.SetCharsetAndCollation(chs, coll) } diff --git a/expression/scalar_function_test.go b/expression/scalar_function_test.go index caed35f4c7b1f..07454f861431a 100644 --- a/expression/scalar_function_test.go +++ b/expression/scalar_function_test.go @@ -15,17 +15,20 @@ package expression import ( + "testing" "time" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/mock" + "github.com/stretchr/testify/require" ) -func (s *testEvaluatorSuite) TestScalarFunction(c *C) { +func TestScalarFunction(t *testing.T) { + ctx := mock.NewContext() a := &Column{ UniqueID: 1, RetType: types.NewFieldType(mysql.TypeDouble), @@ -33,23 +36,25 @@ func (s *testEvaluatorSuite) TestScalarFunction(c *C) { sc := &stmtctx.StatementContext{TimeZone: time.Local} sf := newFunction(ast.LT, a, NewOne()) res, err := sf.MarshalJSON() - c.Assert(err, IsNil) - c.Assert(res, DeepEquals, []byte{0x22, 0x6c, 0x74, 0x28, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x23, 0x31, 0x2c, 0x20, 0x31, 0x29, 0x22}) - c.Assert(sf.IsCorrelated(), IsFalse) - c.Assert(sf.ConstItem(s.ctx.GetSessionVars().StmtCtx), IsFalse) - c.Assert(sf.Decorrelate(nil).Equal(s.ctx, sf), IsTrue) - c.Assert(sf.HashCode(sc), DeepEquals, []byte{0x3, 0x4, 0x6c, 0x74, 0x1, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x5, 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}) + require.NoError(t, err) + require.EqualValues(t, []byte{0x22, 0x6c, 0x74, 0x28, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x23, 0x31, 0x2c, 0x20, 0x31, 0x29, 0x22}, res) + require.False(t, sf.IsCorrelated()) + require.False(t, sf.ConstItem(ctx.GetSessionVars().StmtCtx)) + require.True(t, sf.Decorrelate(nil).Equal(ctx, sf)) + require.EqualValues(t, []byte{0x3, 0x4, 0x6c, 0x74, 0x1, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x5, 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, sf.HashCode(sc)) - sf = NewValuesFunc(s.ctx, 0, types.NewFieldType(mysql.TypeLonglong)) + sf = NewValuesFunc(ctx, 0, types.NewFieldType(mysql.TypeLonglong)) newSf, ok := sf.Clone().(*ScalarFunction) - c.Assert(ok, IsTrue) - c.Assert(newSf.FuncName.O, Equals, "values") - c.Assert(newSf.RetType.Tp, Equals, mysql.TypeLonglong) + require.True(t, ok) + require.Equal(t, "values", newSf.FuncName.O) + require.Equal(t, mysql.TypeLonglong, newSf.RetType.Tp) + require.Equal(t, sf.Coercibility(), newSf.Coercibility()) + require.Equal(t, sf.Repertoire(), newSf.Repertoire()) _, ok = newSf.Function.(*builtinValuesIntSig) - c.Assert(ok, IsTrue) + require.True(t, ok) } -func (s *testEvaluatorSuite) TestIssue23309(c *C) { +func TestIssue23309(t *testing.T) { a := &Column{ UniqueID: 1, RetType: types.NewFieldType(mysql.TypeDouble), @@ -59,12 +64,13 @@ func (s *testEvaluatorSuite) TestIssue23309(c *C) { null.RetType = types.NewFieldType(mysql.TypeNull) sf, _ := newFunction(ast.NE, a, null).(*ScalarFunction) v, err := sf.GetArgs()[1].Eval(chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(v.IsNull(), IsTrue) - c.Assert(mysql.HasNotNullFlag(sf.GetArgs()[1].GetType().Flag), IsFalse) + require.NoError(t, err) + require.True(t, v.IsNull()) + require.False(t, mysql.HasNotNullFlag(sf.GetArgs()[1].GetType().Flag)) } -func (s *testEvaluatorSuite) TestScalarFuncs2Exprs(c *C) { +func TestScalarFuncs2Exprs(t *testing.T) { + ctx := mock.NewContext() a := &Column{ UniqueID: 1, RetType: types.NewFieldType(mysql.TypeDouble), @@ -75,6 +81,6 @@ func (s *testEvaluatorSuite) TestScalarFuncs2Exprs(c *C) { funcs := []*ScalarFunction{sf0, sf1} exprs := ScalarFuncs2Exprs(funcs) for i := range exprs { - c.Assert(exprs[i].Equal(s.ctx, funcs[i]), IsTrue) + require.True(t, exprs[i].Equal(ctx, funcs[i])) } } diff --git a/expression/schema.go b/expression/schema.go index 1ca8740de5eea..6207b1d9fd1ae 100644 --- a/expression/schema.go +++ b/expression/schema.go @@ -30,6 +30,15 @@ func (ki KeyInfo) Clone() KeyInfo { return result } +// String implements fmt.Stringer interface. +func (ki KeyInfo) String() string { + ukColStrs := make([]string, 0, len(ki)) + for _, col := range ki { + ukColStrs = append(ukColStrs, col.String()) + } + return "[" + strings.Join(ukColStrs, ",") + "]" +} + // Schema stands for the row schema and unique key information get from input. type Schema struct { Columns []*Column @@ -47,11 +56,7 @@ func (s *Schema) String() string { } ukStrs := make([]string, 0, len(s.Keys)) for _, key := range s.Keys { - ukColStrs := make([]string, 0, len(key)) - for _, col := range key { - ukColStrs = append(ukColStrs, col.String()) - } - ukStrs = append(ukStrs, "["+strings.Join(ukColStrs, ",")+"]") + ukStrs = append(ukStrs, key.String()) } return "Column: [" + strings.Join(colStrs, ",") + "] Unique key: [" + strings.Join(ukStrs, ",") + "]" } diff --git a/expression/schema_test.go b/expression/schema_test.go index 3bbec67c10b50..6ee4dc35b1853 100644 --- a/expression/schema_test.go +++ b/expression/schema_test.go @@ -16,10 +16,15 @@ package expression import ( "fmt" + "testing" - . "github.com/pingcap/check" + "github.com/stretchr/testify/require" ) +type schemaGenerator struct { + colID int64 +} + // generateKeys4Schema will generate keys for a given schema. Used only in this file. func generateKeys4Schema(schema *Schema) { keyCount := len(schema.Columns) - 1 @@ -31,35 +36,39 @@ func generateKeys4Schema(schema *Schema) { } // generateSchema will generate a schema for test. Used only in this file. -func (s *testEvalSuite) generateSchema(colCount int) *Schema { +func (s *schemaGenerator) generateSchema(colCount int) *Schema { cols := make([]*Column, 0, colCount) for i := 0; i < colCount; i++ { + s.colID++ cols = append(cols, &Column{ - UniqueID: s.allocColID(), + UniqueID: s.colID, }) } return NewSchema(cols...) } -func (s *testEvalSuite) TestSchemaString(c *C) { +func TestSchemaString(t *testing.T) { + s := &schemaGenerator{} schema := s.generateSchema(5) - c.Assert(schema.String(), Equals, "Column: [Column#1,Column#2,Column#3,Column#4,Column#5] Unique key: []") + require.Equal(t, "Column: [Column#1,Column#2,Column#3,Column#4,Column#5] Unique key: []", schema.String()) generateKeys4Schema(schema) - c.Assert(schema.String(), Equals, "Column: [Column#1,Column#2,Column#3,Column#4,Column#5] Unique key: [[Column#1],[Column#2],[Column#3],[Column#4]]") + require.Equal(t, "Column: [Column#1,Column#2,Column#3,Column#4,Column#5] Unique key: [[Column#1],[Column#2],[Column#3],[Column#4]]", schema.String()) } -func (s *testEvalSuite) TestSchemaRetrieveColumn(c *C) { +func TestSchemaRetrieveColumn(t *testing.T) { + s := &schemaGenerator{} schema := s.generateSchema(5) colOutSchema := &Column{ UniqueID: 100, } for _, col := range schema.Columns { - c.Assert(schema.RetrieveColumn(col), Equals, col) + require.Equal(t, col, schema.RetrieveColumn(col)) } - c.Assert(schema.RetrieveColumn(colOutSchema), IsNil) + require.Nil(t, schema.RetrieveColumn(colOutSchema)) } -func (s *testEvalSuite) TestSchemaIsUniqueKey(c *C) { +func TestSchemaIsUniqueKey(t *testing.T) { + s := &schemaGenerator{} schema := s.generateSchema(5) generateKeys4Schema(schema) colOutSchema := &Column{ @@ -67,26 +76,28 @@ func (s *testEvalSuite) TestSchemaIsUniqueKey(c *C) { } for i, col := range schema.Columns { if i < len(schema.Columns)-1 { - c.Assert(schema.IsUniqueKey(col), Equals, true) + require.Equal(t, true, schema.IsUniqueKey(col)) } else { - c.Assert(schema.IsUniqueKey(col), Equals, false) + require.Equal(t, false, schema.IsUniqueKey(col)) } } - c.Assert(schema.IsUniqueKey(colOutSchema), Equals, false) + require.Equal(t, false, schema.IsUniqueKey(colOutSchema)) } -func (s *testEvalSuite) TestSchemaContains(c *C) { +func TestSchemaContains(t *testing.T) { + s := &schemaGenerator{} schema := s.generateSchema(5) colOutSchema := &Column{ UniqueID: 100, } for _, col := range schema.Columns { - c.Assert(schema.Contains(col), Equals, true) + require.Equal(t, true, schema.Contains(col)) } - c.Assert(schema.Contains(colOutSchema), Equals, false) + require.Equal(t, false, schema.Contains(colOutSchema)) } -func (s *testEvalSuite) TestSchemaColumnsIndices(c *C) { +func TestSchemaColumnsIndices(t *testing.T) { + s := &schemaGenerator{} schema := s.generateSchema(5) colOutSchema := &Column{ UniqueID: 100, @@ -94,42 +105,45 @@ func (s *testEvalSuite) TestSchemaColumnsIndices(c *C) { for i := 0; i < len(schema.Columns)-1; i++ { colIndices := schema.ColumnsIndices([]*Column{schema.Columns[i], schema.Columns[i+1]}) for j, res := range colIndices { - c.Assert(res, Equals, i+j) + require.Equal(t, i+j, res) } } - c.Assert(schema.ColumnsIndices([]*Column{schema.Columns[0], schema.Columns[1], colOutSchema, schema.Columns[2]}), IsNil) + require.Nil(t, schema.ColumnsIndices([]*Column{schema.Columns[0], schema.Columns[1], colOutSchema, schema.Columns[2]})) } -func (s *testEvalSuite) TestSchemaColumnsByIndices(c *C) { +func TestSchemaColumnsByIndices(t *testing.T) { + s := &schemaGenerator{} schema := s.generateSchema(5) indices := []int{0, 1, 2, 3} retCols := schema.ColumnsByIndices(indices) for i, ret := range retCols { - c.Assert(fmt.Sprintf("%p", schema.Columns[i]), Equals, fmt.Sprintf("%p", ret)) + require.Equal(t, fmt.Sprintf("%p", ret), fmt.Sprintf("%p", schema.Columns[i])) } } -func (s *testEvalSuite) TestSchemaMergeSchema(c *C) { +func TestSchemaMergeSchema(t *testing.T) { + s := &schemaGenerator{} lSchema := s.generateSchema(5) generateKeys4Schema(lSchema) rSchema := s.generateSchema(5) generateKeys4Schema(rSchema) - c.Assert(MergeSchema(nil, nil), IsNil) - c.Assert(MergeSchema(lSchema, nil).String(), Equals, lSchema.String()) - c.Assert(MergeSchema(nil, rSchema).String(), Equals, rSchema.String()) + require.Nil(t, MergeSchema(nil, nil)) + require.Equal(t, lSchema.String(), MergeSchema(lSchema, nil).String()) + require.Equal(t, rSchema.String(), MergeSchema(nil, rSchema).String()) schema := MergeSchema(lSchema, rSchema) for i := 0; i < len(lSchema.Columns); i++ { - c.Assert(schema.Columns[i].UniqueID, Equals, lSchema.Columns[i].UniqueID) + require.Equal(t, lSchema.Columns[i].UniqueID, schema.Columns[i].UniqueID) } for i := 0; i < len(rSchema.Columns); i++ { - c.Assert(schema.Columns[i+len(lSchema.Columns)].UniqueID, Equals, rSchema.Columns[i].UniqueID) + require.Equal(t, rSchema.Columns[i].UniqueID, schema.Columns[i+len(lSchema.Columns)].UniqueID) } } -func (s *testEvalSuite) TestGetUsedList(c *C) { +func TestGetUsedList(t *testing.T) { + s := &schemaGenerator{} schema := s.generateSchema(5) var usedCols []*Column usedCols = append(usedCols, schema.Columns[3]) @@ -138,5 +152,5 @@ func (s *testEvalSuite) TestGetUsedList(c *C) { usedCols = append(usedCols, schema.Columns[3]) used := GetUsedList(usedCols, schema) - c.Assert(used, DeepEquals, []bool{false, true, false, true, false}) + require.Equal(t, []bool{false, true, false, true, false}, used) } diff --git a/expression/typeinfer_test.go b/expression/typeinfer_test.go index 13f5d81380e7e..b0f6508b33481 100644 --- a/expression/typeinfer_test.go +++ b/expression/typeinfer_test.go @@ -15,9 +15,10 @@ package expression_test import ( + "fmt" "math" + "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/parser/charset" "github.com/pingcap/tidb/parser/mysql" @@ -25,44 +26,21 @@ import ( "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/printer" - "github.com/pingcap/tidb/util/testkit" + "github.com/stretchr/testify/require" "golang.org/x/net/context" ) -var _ = SerialSuites(&testInferTypeSuite{}) +func TestInferType(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() -type typeInferTestCase struct { - sql string - tp byte - chs string - flag uint - flen int - decimal int -} - -type testInferTypeSuite struct { - *parser.Parser -} - -func (s *testInferTypeSuite) SetUpSuite(c *C) { - s.Parser = parser.New() -} - -func (s *testInferTypeSuite) TearDownSuite(c *C) { -} - -func (s *testInferTypeSuite) TestInferType(c *C) { - store, dom, err := newStoreWithBootstrap() - c.Assert(err, IsNil) - defer func() { - dom.Close() - store.Close() - }() + s := InferTypeSuite{} se, err := session.CreateSession4Test(store) - c.Assert(err, IsNil) - testKit := testkit.NewTestKit(c, store) + require.NoError(t, err) + testKit := testkit.NewTestKit(t, store) testKit.MustExec("use test") testKit.MustExec("drop table if exists t") sql := `create table t ( @@ -131,36 +109,47 @@ func (s *testInferTypeSuite) TestInferType(c *C) { tests = append(tests, s.createTestCase4MiscellaneousFunc()...) tests = append(tests, s.createTestCase4GetVarFunc()...) - sctx := testKit.Se.(sessionctx.Context) - c.Assert(sctx.GetSessionVars().SetSystemVar(variable.CharacterSetConnection, mysql.DefaultCharset), IsNil) - c.Assert(sctx.GetSessionVars().SetSystemVar(variable.CollationConnection, mysql.DefaultCollationName), IsNil) + sctx := testKit.Session().(sessionctx.Context) + require.NoError(t, sctx.GetSessionVars().SetSystemVar(variable.CharacterSetConnection, mysql.DefaultCharset)) + require.NoError(t, sctx.GetSessionVars().SetSystemVar(variable.CollationConnection, mysql.DefaultCollationName)) ctx := context.Background() + par := parser.New() for _, tt := range tests { sql := "select " + tt.sql + " from t" - comment := Commentf("for %s", sql) - stmt, err := s.ParseOneStmt(sql, "", "") - c.Assert(err, IsNil, comment) + comment := fmt.Sprintf("for %s", sql) + stmt, err := par.ParseOneStmt(sql, "", "") + require.NoError(t, err, comment) err = se.NewTxn(context.Background()) - c.Assert(err, IsNil) + require.NoError(t, err) ret := &plannercore.PreprocessorReturn{} err = plannercore.Preprocess(sctx, stmt, plannercore.WithPreprocessorReturn(ret)) - c.Assert(err, IsNil, comment) + require.NoError(t, err, comment) p, _, err := plannercore.BuildLogicalPlanForTest(ctx, sctx, stmt, ret.InfoSchema) - c.Assert(err, IsNil, comment) + require.NoError(t, err, comment) tp := p.Schema().Columns[0].RetType - - c.Check(tp.Tp, Equals, tt.tp, comment) - c.Check(tp.Charset, Equals, tt.chs, comment) - c.Check(tp.Flag, Equals, tt.flag, comment) - c.Check(tp.Flen, Equals, tt.flen, comment) - c.Check(tp.Decimal, Equals, tt.decimal, comment) + require.Equal(t, tt.tp, tp.Tp, comment) + require.Equal(t, tt.chs, tp.Charset, comment) + require.Equal(t, tt.flag, tp.Flag, comment) + require.Equal(t, tt.flen, tp.Flen, comment) + require.Equal(t, tt.decimal, tp.Decimal, comment) } } -func (s *testInferTypeSuite) createTestCase4Constants() []typeInferTestCase { +type typeInferTestCase struct { + sql string + tp byte + chs string + flag uint + flen int + decimal int +} + +type InferTypeSuite struct{} + +func (s *InferTypeSuite) createTestCase4Constants() []typeInferTestCase { return []typeInferTestCase{ {"1", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 1, 0}, {"-1", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 2, 0}, @@ -185,11 +174,11 @@ func (s *testInferTypeSuite) createTestCase4Constants() []typeInferTestCase { } } -func (s *testInferTypeSuite) createTestCase4Cast() []typeInferTestCase { +func (s *InferTypeSuite) createTestCase4Cast() []typeInferTestCase { return []typeInferTestCase{ - {"CAST(c_int_d AS BINARY)", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, -1, -1}, // TODO: Flen should be 11. + {"CAST(c_int_d AS BINARY)", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 11, -1}, {"CAST(c_int_d AS BINARY(5))", mysql.TypeString, charset.CharsetBin, mysql.BinaryFlag, 5, -1}, - {"CAST(c_int_d AS CHAR)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, -1, -1}, // TODO: Flen should be 11. + {"CAST(c_int_d AS CHAR)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 11, -1}, {"CAST(c_int_d AS CHAR(5))", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 5, -1}, {"CAST(c_int_d AS DATE)", mysql.TypeDate, charset.CharsetBin, mysql.BinaryFlag, 10, 0}, {"CAST(c_int_d AS DATETIME)", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag, 19, 0}, @@ -228,7 +217,7 @@ func (s *testInferTypeSuite) createTestCase4Cast() []typeInferTestCase { } } -func (s *testInferTypeSuite) createTestCase4Columns() []typeInferTestCase { +func (s *InferTypeSuite) createTestCase4Columns() []typeInferTestCase { return []typeInferTestCase{ {"c_bit ", mysql.TypeBit, charset.CharsetBin, mysql.UnsignedFlag, 10, 0}, {"c_year ", mysql.TypeYear, charset.CharsetBin, mysql.UnsignedFlag | mysql.ZerofillFlag, 4, 0}, @@ -264,7 +253,7 @@ func (s *testInferTypeSuite) createTestCase4Columns() []typeInferTestCase { } } -func (s *testInferTypeSuite) createTestCase4StrFuncs() []typeInferTestCase { +func (s *InferTypeSuite) createTestCase4StrFuncs() []typeInferTestCase { return []typeInferTestCase{ {"strcmp(c_char, c_char)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, {"space(c_int_d)", mysql.TypeLongBlob, mysql.DefaultCharset, 0, mysql.MaxBlobWidth, types.UnspecifiedLength}, @@ -335,7 +324,7 @@ func (s *testInferTypeSuite) createTestCase4StrFuncs() []typeInferTestCase { {"from_base64(c_bigint_d )", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 60, types.UnspecifiedLength}, {"from_base64(c_float_d )", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, types.UnspecifiedLength, types.UnspecifiedLength}, {"from_base64(c_double_d )", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, types.UnspecifiedLength, types.UnspecifiedLength}, - {"from_base64(c_decimal )", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 24, types.UnspecifiedLength}, + {"from_base64(c_decimal )", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 27, types.UnspecifiedLength}, {"from_base64(c_datetime )", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 66, types.UnspecifiedLength}, {"from_base64(c_time_d )", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 30, types.UnspecifiedLength}, {"from_base64(c_timestamp_d)", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 57, types.UnspecifiedLength}, @@ -436,9 +425,9 @@ func (s *testInferTypeSuite) createTestCase4StrFuncs() []typeInferTestCase { {"reverse(c_int_d )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 20, types.UnspecifiedLength}, {"reverse(c_bigint_d )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 20, types.UnspecifiedLength}, - {"reverse(c_float_d )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, -1, types.UnspecifiedLength}, - {"reverse(c_double_d )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, -1, types.UnspecifiedLength}, - {"reverse(c_decimal )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 8, types.UnspecifiedLength}, + {"reverse(c_float_d )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, types.UnspecifiedLength, types.UnspecifiedLength}, + {"reverse(c_double_d )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, types.UnspecifiedLength, types.UnspecifiedLength}, + {"reverse(c_decimal )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 9, types.UnspecifiedLength}, {"reverse(c_char )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 20, types.UnspecifiedLength}, {"reverse(c_varchar )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 20, types.UnspecifiedLength}, {"reverse(c_text_d )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 65535, types.UnspecifiedLength}, @@ -513,7 +502,7 @@ func (s *testInferTypeSuite) createTestCase4StrFuncs() []typeInferTestCase { } } -func (s *testInferTypeSuite) createTestCase4MathFuncs() []typeInferTestCase { +func (s *InferTypeSuite) createTestCase4MathFuncs() []typeInferTestCase { return []typeInferTestCase{ {"cos(c_double_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, {"sin(c_double_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, @@ -553,51 +542,51 @@ func (s *testInferTypeSuite) createTestCase4MathFuncs() []typeInferTestCase { {"cot(c_timestamp_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, {"cot(c_binary)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, - {"floor(c_int_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 11, 0}, - {"floor(c_uint_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.UnsignedFlag | mysql.BinaryFlag, 10, 0}, - {"floor(c_bigint_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 20, 0}, // TODO: Flen should be 17 - {"floor(c_ubigint_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.UnsignedFlag | mysql.BinaryFlag, 20, 0}, // TODO: Flen should be 17 - {"floor(c_decimal)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 6, 0}, - {"floor(c_udecimal)", mysql.TypeLonglong, charset.CharsetBin, mysql.UnsignedFlag | mysql.BinaryFlag, 10, 0}, - {"floor(c_double_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, 22, 0}, - {"floor(c_udouble_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, 22, 0}, - {"floor(c_float_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, 12, 0}, - {"floor(c_ufloat_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, 12, 0}, - {"floor(c_datetime)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, 0}, - {"floor(c_timestamp_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, 0}, - {"floor(c_time_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, 0}, - {"floor(c_enum)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, 0}, - {"floor(c_text_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, 0}, - {"floor(18446744073709551615)", mysql.TypeLonglong, charset.CharsetBin, mysql.NotNullFlag | mysql.UnsignedFlag | mysql.BinaryFlag, 20, 0}, + {"floor(c_int_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxIntWidth, 0}, + {"floor(c_uint_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.UnsignedFlag | mysql.BinaryFlag, mysql.MaxIntWidth, 0}, + {"floor(c_bigint_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxIntWidth, 0}, + {"floor(c_ubigint_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.UnsignedFlag | mysql.BinaryFlag, mysql.MaxIntWidth, 0}, + {"floor(c_decimal)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxIntWidth, 0}, + {"floor(c_udecimal)", mysql.TypeLonglong, charset.CharsetBin, mysql.UnsignedFlag | mysql.BinaryFlag, mysql.MaxIntWidth, 0}, + {"floor(c_double_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"floor(c_udouble_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"floor(c_float_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"floor(c_ufloat_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"floor(c_datetime)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"floor(c_timestamp_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"floor(c_time_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"floor(c_enum)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"floor(c_text_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"floor(18446744073709551615)", mysql.TypeLonglong, charset.CharsetBin, mysql.NotNullFlag | mysql.UnsignedFlag | mysql.BinaryFlag, mysql.MaxIntWidth, 0}, {"floor(18446744073709551615.1)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 23, 0}, - {"ceil(c_int_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 11, 0}, - {"ceil(c_uint_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.UnsignedFlag | mysql.BinaryFlag, 10, 0}, - {"ceil(c_bigint_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 20, 0}, // TODO: Flen should be 17 - {"ceil(c_ubigint_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.UnsignedFlag | mysql.BinaryFlag, 20, 0}, // TODO: Flen should be 17 - {"ceil(c_decimal)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 6, 0}, - {"floor(c_udecimal)", mysql.TypeLonglong, charset.CharsetBin, mysql.UnsignedFlag | mysql.BinaryFlag, 10, 0}, - {"ceil(c_double_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, 22, 0}, - {"floor(c_udouble_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, 22, 0}, - {"ceil(c_float_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, 12, 0}, - {"floor(c_ufloat_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, 12, 0}, - {"ceil(c_datetime)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, 0}, - {"ceil(c_timestamp_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, 0}, - {"ceil(c_time_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, 0}, - {"ceil(c_enum)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, 0}, - {"ceil(c_text_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, 0}, - {"ceil(18446744073709551615)", mysql.TypeLonglong, charset.CharsetBin, mysql.NotNullFlag | mysql.UnsignedFlag | mysql.BinaryFlag, 20, 0}, + {"ceil(c_int_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxIntWidth, 0}, + {"ceil(c_uint_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.UnsignedFlag | mysql.BinaryFlag, mysql.MaxIntWidth, 0}, + {"ceil(c_bigint_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxIntWidth, 0}, + {"ceil(c_ubigint_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.UnsignedFlag | mysql.BinaryFlag, mysql.MaxIntWidth, 0}, + {"ceil(c_decimal)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxIntWidth, 0}, + {"floor(c_udecimal)", mysql.TypeLonglong, charset.CharsetBin, mysql.UnsignedFlag | mysql.BinaryFlag, mysql.MaxIntWidth, 0}, + {"ceil(c_double_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"floor(c_udouble_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"ceil(c_float_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"floor(c_ufloat_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"ceil(c_datetime)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"ceil(c_timestamp_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"ceil(c_time_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"ceil(c_enum)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"ceil(c_text_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"ceil(18446744073709551615)", mysql.TypeLonglong, charset.CharsetBin, mysql.NotNullFlag | mysql.UnsignedFlag | mysql.BinaryFlag, mysql.MaxIntWidth, 0}, {"ceil(18446744073709551615.1)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 23, 0}, - {"ceiling(c_int_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 11, 0}, - {"ceiling(c_decimal)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 6, 0}, - {"ceiling(c_double_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, 22, 0}, - {"ceiling(c_float_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, 12, 0}, - {"ceiling(c_datetime)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, 0}, - {"ceiling(c_time_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, 0}, - {"ceiling(c_enum)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, 0}, - {"ceiling(c_text_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, 0}, - {"ceiling(18446744073709551615)", mysql.TypeLonglong, charset.CharsetBin, mysql.NotNullFlag | mysql.UnsignedFlag | mysql.BinaryFlag, 20, 0}, + {"ceiling(c_int_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxIntWidth, 0}, + {"ceiling(c_decimal)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxIntWidth, 0}, + {"ceiling(c_double_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"ceiling(c_float_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"ceiling(c_datetime)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"ceiling(c_time_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"ceiling(c_enum)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"ceiling(c_text_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"ceiling(18446744073709551615)", mysql.TypeLonglong, charset.CharsetBin, mysql.NotNullFlag | mysql.UnsignedFlag | mysql.BinaryFlag, mysql.MaxIntWidth, 0}, {"ceiling(18446744073709551615.1)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 23, 0}, {"conv(c_char, c_int_d, c_int_d)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 64, types.UnspecifiedLength}, @@ -620,29 +609,29 @@ func (s *testInferTypeSuite) createTestCase4MathFuncs() []typeInferTestCase { {"abs(c_set )", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, 22, types.UnspecifiedLength}, {"abs(c_enum )", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, 22, types.UnspecifiedLength}, - {"round(c_int_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 11, 0}, - {"round(c_bigint_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 20, 0}, - {"round(c_float_d )", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, 12, 0}, // flen Should be 17. - {"round(c_double_d )", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, 22, 0}, // flen Should be 17. + {"round(c_int_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxIntWidth, 0}, + {"round(c_bigint_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxIntWidth, 0}, + {"round(c_float_d )", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"round(c_double_d )", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, {"round(c_decimal )", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 6, 0}, // flen Should be 5. - {"round(c_datetime )", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, 0}, - {"round(c_time_d )", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, 0}, - {"round(c_timestamp_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, 0}, - {"round(c_char )", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, 0}, - {"round(c_varchar )", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, 0}, - {"round(c_text_d )", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, 0}, - {"round(c_binary )", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, 0}, - {"round(c_varbinary )", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, 0}, - {"round(c_blob_d )", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, 0}, - {"round(c_set )", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, 0}, - {"round(c_enum )", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, 0}, - - {"truncate(c_int_d, 1)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 11, 0}, - {"truncate(c_int_d, -5)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 11, 0}, - {"truncate(c_int_d, 100)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 11, 0}, - {"truncate(c_double_d, 1)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, 24, 1}, - {"truncate(c_double_d, 5)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, 28, 5}, - {"truncate(c_double_d, 100)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, 53, 30}, + {"round(c_datetime )", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"round(c_time_d )", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"round(c_timestamp_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"round(c_char )", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"round(c_varchar )", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"round(c_text_d )", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"round(c_binary )", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"round(c_varbinary )", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"round(c_blob_d )", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"round(c_set )", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"round(c_enum )", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + + {"truncate(c_int_d, 1)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxIntWidth, 0}, + {"truncate(c_int_d, -5)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxIntWidth, 0}, + {"truncate(c_int_d, 100)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxIntWidth, 0}, + {"truncate(c_double_d, 1)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"truncate(c_double_d, 5)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, + {"truncate(c_double_d, 100)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, {"rand( )", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, {"rand(c_int_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, @@ -721,7 +710,7 @@ func (s *testInferTypeSuite) createTestCase4MathFuncs() []typeInferTestCase { } } -func (s *testInferTypeSuite) createTestCase4ArithmeticFuncs() []typeInferTestCase { +func (s *InferTypeSuite) createTestCase4ArithmeticFuncs() []typeInferTestCase { return []typeInferTestCase{ {"c_int_d + c_int_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxIntWidth, 0}, {"c_int_d + c_bigint_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxIntWidth, 0}, @@ -815,7 +804,7 @@ func (s *testInferTypeSuite) createTestCase4ArithmeticFuncs() []typeInferTestCas } } -func (s *testInferTypeSuite) createTestCase4LogicalFuncs() []typeInferTestCase { +func (s *InferTypeSuite) createTestCase4LogicalFuncs() []typeInferTestCase { return []typeInferTestCase{ {"c_int_d and c_int_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, {"c_int_d xor c_int_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, @@ -825,7 +814,7 @@ func (s *testInferTypeSuite) createTestCase4LogicalFuncs() []typeInferTestCase { } } -func (s *testInferTypeSuite) createTestCase4ControlFuncs() []typeInferTestCase { +func (s *InferTypeSuite) createTestCase4ControlFuncs() []typeInferTestCase { return []typeInferTestCase{ {"ifnull(c_int_d, c_int_d)", mysql.TypeLong, charset.CharsetBin, mysql.BinaryFlag, 11, 0}, {"ifnull(c_int_d, c_decimal)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 14, 3}, @@ -853,7 +842,7 @@ func (s *testInferTypeSuite) createTestCase4ControlFuncs() []typeInferTestCase { } } -func (s *testInferTypeSuite) createTestCase4Aggregations() []typeInferTestCase { +func (s *InferTypeSuite) createTestCase4Aggregations() []typeInferTestCase { return []typeInferTestCase{ {"sum(c_int_d)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 32, 0}, {"sum(c_float_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, @@ -876,7 +865,7 @@ func (s *testInferTypeSuite) createTestCase4Aggregations() []typeInferTestCase { } } -func (s *testInferTypeSuite) createTestCase4InfoFunc() []typeInferTestCase { +func (s *InferTypeSuite) createTestCase4InfoFunc() []typeInferTestCase { return []typeInferTestCase{ {"last_insert_id( )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.UnsignedFlag | mysql.NotNullFlag, mysql.MaxIntWidth, 0}, {"last_insert_id(c_int_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.UnsignedFlag, mysql.MaxIntWidth, 0}, @@ -890,7 +879,7 @@ func (s *testInferTypeSuite) createTestCase4InfoFunc() []typeInferTestCase { } } -func (s *testInferTypeSuite) createTestCase4EncryptionFuncs() []typeInferTestCase { +func (s *InferTypeSuite) createTestCase4EncryptionFuncs() []typeInferTestCase { return []typeInferTestCase{ {"md5(c_int_d )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 32, types.UnspecifiedLength}, {"md5(c_bigint_d )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 32, types.UnspecifiedLength}, @@ -1022,7 +1011,7 @@ func (s *testInferTypeSuite) createTestCase4EncryptionFuncs() []typeInferTestCas } } -func (s *testInferTypeSuite) createTestCase4CompareFuncs() []typeInferTestCase { +func (s *InferTypeSuite) createTestCase4CompareFuncs() []typeInferTestCase { return []typeInferTestCase{ {"coalesce(c_int_d, 1)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 11, 0}, {"coalesce(NULL, c_int_d)", mysql.TypeLong, charset.CharsetBin, mysql.BinaryFlag, 11, 0}, @@ -1063,10 +1052,17 @@ func (s *testInferTypeSuite) createTestCase4CompareFuncs() []typeInferTestCase { {"interval(c_int_d, c_int_d, c_int_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxIntWidth, 0}, {"interval(c_int_d, c_float_d, c_double_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxIntWidth, 0}, + + {"greatest(c_bigint_d, c_ubigint_d, c_int_d)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxIntWidth, 0}, + {"greatest(c_ubigint_d, c_ubigint_d, c_uint_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.UnsignedFlag, mysql.MaxIntWidth, 0}, + {"greatest(c_uint_d, c_int_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.UnsignedFlag, 11, 0}, + {"least(c_bigint_d, c_ubigint_d, c_int_d)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxIntWidth, 0}, + {"least(c_ubigint_d, c_ubigint_d, c_uint_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.UnsignedFlag, mysql.MaxIntWidth, 0}, + {"least(c_uint_d, c_int_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 11, 0}, } } -func (s *testInferTypeSuite) createTestCase4Miscellaneous() []typeInferTestCase { +func (s *InferTypeSuite) createTestCase4Miscellaneous() []typeInferTestCase { return []typeInferTestCase{ {"sleep(c_int_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 21, 0}, {"sleep(c_float_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 21, 0}, @@ -1169,7 +1165,7 @@ func (s *testInferTypeSuite) createTestCase4Miscellaneous() []typeInferTestCase } } -func (s *testInferTypeSuite) createTestCase4OpFuncs() []typeInferTestCase { +func (s *InferTypeSuite) createTestCase4OpFuncs() []typeInferTestCase { return []typeInferTestCase{ {"c_int_d is true", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, {"c_decimal is true", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, @@ -1195,7 +1191,7 @@ func (s *testInferTypeSuite) createTestCase4OpFuncs() []typeInferTestCase { } } -func (s *testInferTypeSuite) createTestCase4OtherFuncs() []typeInferTestCase { +func (s *InferTypeSuite) createTestCase4OtherFuncs() []typeInferTestCase { return []typeInferTestCase{ {"1 in (c_int_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, {"1 in (c_decimal)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, @@ -1227,7 +1223,7 @@ func (s *testInferTypeSuite) createTestCase4OtherFuncs() []typeInferTestCase { } } -func (s *testInferTypeSuite) createTestCase4TimeFuncs() []typeInferTestCase { +func (s *InferTypeSuite) createTestCase4TimeFuncs() []typeInferTestCase { return []typeInferTestCase{ {`time_format('150:02:28', '%r%r%r%r')`, mysql.TypeVarString, charset.CharsetUTF8MB4, mysql.NotNullFlag, 44, types.UnspecifiedLength}, {`time_format(123456, '%r%r%r%r')`, mysql.TypeVarString, charset.CharsetUTF8MB4, mysql.NotNullFlag, 44, types.UnspecifiedLength}, @@ -1238,13 +1234,14 @@ func (s *testInferTypeSuite) createTestCase4TimeFuncs() []typeInferTestCase { {`date_format('2017-06-15', '%r%r%r%r')`, mysql.TypeVarString, charset.CharsetUTF8MB4, mysql.NotNullFlag, 44, types.UnspecifiedLength}, {`date_format(151113102019.12, '%r%r%r%r')`, mysql.TypeVarString, charset.CharsetUTF8MB4, mysql.NotNullFlag, 44, types.UnspecifiedLength}, - {"timestampadd(HOUR, c_int_d, c_timestamp_d)", mysql.TypeString, charset.CharsetUTF8MB4, 0, 19, types.UnspecifiedLength}, - {"timestampadd(minute, c_double_d, c_timestamp_d)", mysql.TypeString, charset.CharsetUTF8MB4, 0, 19, types.UnspecifiedLength}, - {"timestampadd(SeconD, c_int_d, c_char)", mysql.TypeString, charset.CharsetUTF8MB4, 0, 19, types.UnspecifiedLength}, - {"timestampadd(SeconD, c_varchar, c_time_d)", mysql.TypeString, charset.CharsetUTF8MB4, 0, 19, types.UnspecifiedLength}, - {"timestampadd(SeconD, c_int_d, c_datetime)", mysql.TypeString, charset.CharsetUTF8MB4, 0, 19, types.UnspecifiedLength}, - {"timestampadd(SeconD, c_double_d, c_bchar)", mysql.TypeString, charset.CharsetUTF8MB4, 0, 19, types.UnspecifiedLength}, - {"timestampadd(SeconD, c_int_d, c_blob_d)", mysql.TypeString, charset.CharsetUTF8MB4, 0, 19, types.UnspecifiedLength}, + {"timestampadd(HOUR, c_int_d, c_timestamp_d)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, mysql.MaxDatetimeWidthNoFsp, types.UnspecifiedLength}, + {"timestampadd(minute, c_double_d, c_timestamp_d)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, mysql.MaxDatetimeWidthNoFsp, types.UnspecifiedLength}, + {"timestampadd(SeconD, c_int_d, c_char)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, mysql.MaxDatetimeWidthNoFsp, types.UnspecifiedLength}, + {"timestampadd(SeconD, c_varchar, c_time_d)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, mysql.MaxDatetimeWidthNoFsp, types.UnspecifiedLength}, + {"timestampadd(SeconD, c_int_d, c_datetime)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, mysql.MaxDatetimeWidthNoFsp, types.UnspecifiedLength}, + {"timestampadd(SeconD, c_double_d, c_bchar)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, mysql.MaxDatetimeWidthNoFsp, types.UnspecifiedLength}, + {"timestampadd(SeconD, c_int_d, c_blob_d)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, mysql.MaxDatetimeWidthNoFsp, types.UnspecifiedLength}, + {"timestampadd(microsecond, c_int_d, c_blob_d)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, mysql.MaxDatetimeWidthWithFsp, types.UnspecifiedLength}, {"to_seconds(c_char)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 20, 0}, {"to_days(c_char)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 20, 0}, @@ -1908,7 +1905,7 @@ func (s *testInferTypeSuite) createTestCase4TimeFuncs() []typeInferTestCase { } } -func (s *testInferTypeSuite) createTestCase4LikeFuncs() []typeInferTestCase { +func (s *InferTypeSuite) createTestCase4LikeFuncs() []typeInferTestCase { return []typeInferTestCase{ {"c_int_d rlike c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, {"c_bigint_d rlike c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, @@ -1946,7 +1943,7 @@ func (s *testInferTypeSuite) createTestCase4LikeFuncs() []typeInferTestCase { } } -func (s *testInferTypeSuite) createTestCase4Literals() []typeInferTestCase { +func (s *InferTypeSuite) createTestCase4Literals() []typeInferTestCase { return []typeInferTestCase{ {"time '00:00:00'", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 10, 0}, {"time '00'", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 10, 0}, @@ -1958,7 +1955,7 @@ func (s *testInferTypeSuite) createTestCase4Literals() []typeInferTestCase { } } -func (s *testInferTypeSuite) createTestCase4JSONFuncs() []typeInferTestCase { +func (s *InferTypeSuite) createTestCase4JSONFuncs() []typeInferTestCase { return []typeInferTestCase{ {"json_type(c_json)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 51, types.UnspecifiedLength}, // TODO: Flen of json_unquote doesn't follow MySQL now. @@ -1974,7 +1971,7 @@ func (s *testInferTypeSuite) createTestCase4JSONFuncs() []typeInferTestCase { } } -func (s *testInferTypeSuite) createTestCase4MiscellaneousFunc() []typeInferTestCase { +func (s *InferTypeSuite) createTestCase4MiscellaneousFunc() []typeInferTestCase { return []typeInferTestCase{ {"get_lock(c_char, c_int_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, {"get_lock(c_char, c_bigint_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, @@ -1994,7 +1991,7 @@ func (s *testInferTypeSuite) createTestCase4MiscellaneousFunc() []typeInferTestC } } -func (s *testInferTypeSuite) createTestCase4GetVarFunc() []typeInferTestCase { +func (s *InferTypeSuite) createTestCase4GetVarFunc() []typeInferTestCase { return []typeInferTestCase{ {"@a", mysql.TypeDate, charset.CharsetBin, mysql.BinaryFlag, 10, 0}, {"@b", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag, 19, 0}, diff --git a/expression/util.go b/expression/util.go index 6469eefbee95b..d7b92329d51f6 100644 --- a/expression/util.go +++ b/expression/util.go @@ -20,7 +20,6 @@ import ( "math" "strconv" "strings" - "time" "unicode" "unicode/utf8" @@ -167,6 +166,29 @@ func extractColumns(result []*Column, expr Expression, filter func(*Column) bool return result } +// ExtractColumnsAndCorColumns extracts columns and correlated columns from `expr` and append them to `result`. +func ExtractColumnsAndCorColumns(result []*Column, expr Expression) []*Column { + switch v := expr.(type) { + case *Column: + result = append(result, v) + case *CorrelatedColumn: + result = append(result, &v.Column) + case *ScalarFunction: + for _, arg := range v.GetArgs() { + result = ExtractColumnsAndCorColumns(result, arg) + } + } + return result +} + +// ExtractColumnsAndCorColumnsFromExpressions extracts columns and correlated columns from expressions and append them to `result`. +func ExtractColumnsAndCorColumnsFromExpressions(result []*Column, list []Expression) []*Column { + for _, expr := range list { + result = ExtractColumnsAndCorColumns(result, expr) + } + return result +} + // ExtractColumnSet extracts the different values of `UniqueId` for columns in expressions. func ExtractColumnSet(exprs []Expression) *intsets.Sparse { set := &intsets.Sparse{} @@ -225,15 +247,21 @@ func ColumnSubstituteImpl(expr Expression, schema *Schema, newExprs []Expression newExpr.SetCoercibility(v.Coercibility()) return true, newExpr case *ScalarFunction: + substituted := false if v.FuncName.L == ast.Cast { newFunc := v.Clone().(*ScalarFunction) - _, newFunc.GetArgs()[0] = ColumnSubstituteImpl(newFunc.GetArgs()[0], schema, newExprs) - return true, newFunc + substituted, newFunc.GetArgs()[0] = ColumnSubstituteImpl(newFunc.GetArgs()[0], schema, newExprs) + if substituted { + // Workaround for issue https://github.com/pingcap/tidb/issues/28804 + e := NewFunctionInternal(v.GetCtx(), v.FuncName.L, v.RetType, newFunc.GetArgs()...) + e.SetCoercibility(v.Coercibility()) + return true, e + } + return false, newFunc } // cowExprRef is a copy-on-write util, args array allocation happens only // when expr in args is changed refExprArr := cowExprRef{v.GetArgs(), nil} - substituted := false _, coll := DeriveCollationFromExprs(v.GetCtx(), v.GetArgs()...) for idx, arg := range v.GetArgs() { changed, newFuncExpr := ColumnSubstituteImpl(arg, schema, newExprs) @@ -386,8 +414,8 @@ func locateStringWithCollation(str, substr, coll string) int64 { } // timeZone2Duration converts timezone whose format should satisfy the regular condition -// `(^(+|-)(0?[0-9]|1[0-2]):[0-5]?\d$)|(^+13:00$)` to time.Duration. -func timeZone2Duration(tz string) time.Duration { +// `(^(+|-)(0?[0-9]|1[0-2]):[0-5]?\d$)|(^+13:00$)` to int for use by time.FixedZone(). +func timeZone2int(tz string) int { sign := 1 if strings.HasPrefix(tz, "-") { sign = -1 @@ -398,7 +426,7 @@ func timeZone2Duration(tz string) time.Duration { terror.Log(err) m, err := strconv.Atoi(tz[i+1:]) terror.Log(err) - return time.Duration(sign) * (time.Duration(h)*time.Hour + time.Duration(m)*time.Minute) + return sign * ((h * 3600) + (m * 60)) } var logicalOps = map[string]struct{}{ @@ -910,11 +938,12 @@ func ContainCorrelatedColumn(exprs []Expression) bool { // `$a==$b`, but it will cause wrong results when `$a!=$b`. // So we need to do the check here. The check includes the following aspects: // 1. Whether the plan cache switch is enable. -// 2. Whether the expressions contain a lazy constant. +// 2. Whether the statement can be cached. +// 3. Whether the expressions contain a lazy constant. // TODO: Do more careful check here. func MaybeOverOptimized4PlanCache(ctx sessionctx.Context, exprs []Expression) bool { // If we do not enable plan cache, all the optimization can work correctly. - if !ctx.GetSessionVars().StmtCtx.UseCache { + if !ctx.GetSessionVars().StmtCtx.UseCache || ctx.GetSessionVars().StmtCtx.SkipPlanCache { return false } return containMutableConst(ctx, exprs) @@ -937,6 +966,19 @@ func containMutableConst(ctx sessionctx.Context, exprs []Expression) bool { return false } +// RemoveMutableConst used to remove the `ParamMarker` and `DeferredExpr` in the `Constant` expr. +func RemoveMutableConst(ctx sessionctx.Context, exprs []Expression) { + for _, expr := range exprs { + switch v := expr.(type) { + case *Constant: + v.ParamMarker = nil + v.DeferredExpr = nil + case *ScalarFunction: + RemoveMutableConst(ctx, v.GetArgs()) + } + } +} + const ( _ = iota kib = 1 << (10 * iota) @@ -989,7 +1031,7 @@ func GetFormatBytes(bytes float64) string { if divisor == 1 { return strconv.FormatFloat(bytes, 'f', 0, 64) + " " + unit } - value := float64(bytes) / divisor + value := bytes / divisor if math.Abs(value) >= 100000.0 { return strconv.FormatFloat(value, 'e', 2, 64) + " " + unit } @@ -1028,7 +1070,7 @@ func GetFormatNanoTime(time float64) string { if divisor == 1 { return strconv.FormatFloat(time, 'f', 0, 64) + " " + unit } - value := float64(time) / divisor + value := time / divisor if math.Abs(value) >= 100000.0 { return strconv.FormatFloat(value, 'e', 2, 64) + " " + unit } diff --git a/expression/util_test.go b/expression/util_test.go index 3aed1e9a32c15..5ad6331863db2 100644 --- a/expression/util_test.go +++ b/expression/util_test.go @@ -16,11 +16,9 @@ package expression import ( "context" - "reflect" "testing" "time" - "github.com/pingcap/check" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" @@ -31,33 +29,30 @@ import ( "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/codec" "github.com/pingcap/tidb/util/mock" + "github.com/stretchr/testify/require" ) -var _ = check.Suite(&testUtilSuite{}) - -type testUtilSuite struct{} - -func (s *testUtilSuite) TestBaseBuiltin(c *check.C) { +func TestBaseBuiltin(t *testing.T) { ctx := mock.NewContext() bf, err := newBaseBuiltinFuncWithTp(ctx, "", nil, types.ETTimestamp) - c.Assert(err, check.IsNil) + require.NoError(t, err) _, _, err = bf.evalInt(chunk.Row{}) - c.Assert(err, check.NotNil) + require.Error(t, err) _, _, err = bf.evalReal(chunk.Row{}) - c.Assert(err, check.NotNil) + require.Error(t, err) _, _, err = bf.evalString(chunk.Row{}) - c.Assert(err, check.NotNil) + require.Error(t, err) _, _, err = bf.evalDecimal(chunk.Row{}) - c.Assert(err, check.NotNil) + require.Error(t, err) _, _, err = bf.evalTime(chunk.Row{}) - c.Assert(err, check.NotNil) + require.Error(t, err) _, _, err = bf.evalDuration(chunk.Row{}) - c.Assert(err, check.NotNil) + require.Error(t, err) _, _, err = bf.evalJSON(chunk.Row{}) - c.Assert(err, check.NotNil) + require.Error(t, err) } -func (s *testUtilSuite) TestClone(c *check.C) { +func TestClone(t *testing.T) { builtinFuncs := []builtinFunc{ &builtinArithmeticPlusRealSig{}, &builtinArithmeticPlusDecimalSig{}, &builtinArithmeticPlusIntSig{}, &builtinArithmeticMinusRealSig{}, &builtinArithmeticMinusDecimalSig{}, &builtinArithmeticMinusIntSig{}, &builtinArithmeticDivideRealSig{}, &builtinArithmeticDivideDecimalSig{}, &builtinArithmeticMultiplyRealSig{}, &builtinArithmeticMultiplyDecimalSig{}, @@ -159,37 +154,37 @@ func (s *testUtilSuite) TestClone(c *check.C) { } for _, f := range builtinFuncs { cf := f.Clone() - c.Assert(reflect.TypeOf(f) == reflect.TypeOf(cf), check.IsTrue) + require.IsType(t, f, cf) } } -func (s *testUtilSuite) TestGetUint64FromConstant(c *check.C) { +func TestGetUint64FromConstant(t *testing.T) { con := &Constant{ Value: types.NewDatum(nil), } _, isNull, ok := GetUint64FromConstant(con) - c.Assert(ok, check.IsTrue) - c.Assert(isNull, check.IsTrue) + require.True(t, ok) + require.True(t, isNull) con = &Constant{ Value: types.NewIntDatum(-1), } _, _, ok = GetUint64FromConstant(con) - c.Assert(ok, check.IsFalse) + require.False(t, ok) con.Value = types.NewIntDatum(1) num, isNull, ok := GetUint64FromConstant(con) - c.Assert(ok, check.IsTrue) - c.Assert(isNull, check.IsFalse) - c.Assert(num, check.Equals, uint64(1)) + require.True(t, ok) + require.False(t, isNull) + require.Equal(t, uint64(1), num) con.Value = types.NewUintDatum(1) num, _, _ = GetUint64FromConstant(con) - c.Assert(num, check.Equals, uint64(1)) + require.Equal(t, uint64(1), num) con.DeferredExpr = &Constant{Value: types.NewIntDatum(1)} num, _, _ = GetUint64FromConstant(con) - c.Assert(num, check.Equals, uint64(1)) + require.Equal(t, uint64(1), num) ctx := mock.NewContext() ctx.GetSessionVars().PreparedParams = []types.Datum{ @@ -197,58 +192,58 @@ func (s *testUtilSuite) TestGetUint64FromConstant(c *check.C) { } con.ParamMarker = &ParamMarker{order: 0, ctx: ctx} num, _, _ = GetUint64FromConstant(con) - c.Assert(num, check.Equals, uint64(100)) + require.Equal(t, uint64(100), num) } -func (s *testUtilSuite) TestSetExprColumnInOperand(c *check.C) { +func TestSetExprColumnInOperand(t *testing.T) { col := &Column{RetType: newIntFieldType()} - c.Assert(setExprColumnInOperand(col).(*Column).InOperand, check.IsTrue) + require.True(t, setExprColumnInOperand(col).(*Column).InOperand) f, err := funcs[ast.Abs].getFunction(mock.NewContext(), []Expression{col}) - c.Assert(err, check.IsNil) + require.NoError(t, err) fun := &ScalarFunction{Function: f} setExprColumnInOperand(fun) - c.Assert(f.getArgs()[0].(*Column).InOperand, check.IsTrue) + require.True(t, f.getArgs()[0].(*Column).InOperand) } -func (s testUtilSuite) TestPopRowFirstArg(c *check.C) { +func TestPopRowFirstArg(t *testing.T) { c1, c2, c3 := &Column{RetType: newIntFieldType()}, &Column{RetType: newIntFieldType()}, &Column{RetType: newIntFieldType()} f, err := funcs[ast.RowFunc].getFunction(mock.NewContext(), []Expression{c1, c2, c3}) - c.Assert(err, check.IsNil) + require.NoError(t, err) fun := &ScalarFunction{Function: f, FuncName: model.NewCIStr(ast.RowFunc), RetType: newIntFieldType()} fun2, err := PopRowFirstArg(mock.NewContext(), fun) - c.Assert(err, check.IsNil) - c.Assert(len(fun2.(*ScalarFunction).GetArgs()), check.Equals, 2) + require.NoError(t, err) + require.Len(t, fun2.(*ScalarFunction).GetArgs(), 2) } -func (s testUtilSuite) TestGetStrIntFromConstant(c *check.C) { +func TestGetStrIntFromConstant(t *testing.T) { col := &Column{} _, _, err := GetStringFromConstant(mock.NewContext(), col) - c.Assert(err, check.NotNil) + require.Error(t, err) con := &Constant{RetType: &types.FieldType{Tp: mysql.TypeNull}} _, isNull, err := GetStringFromConstant(mock.NewContext(), con) - c.Assert(err, check.IsNil) - c.Assert(isNull, check.IsTrue) + require.NoError(t, err) + require.True(t, isNull) con = &Constant{RetType: newIntFieldType(), Value: types.NewIntDatum(1)} ret, _, _ := GetStringFromConstant(mock.NewContext(), con) - c.Assert(ret, check.Equals, "1") + require.Equal(t, "1", ret) con = &Constant{RetType: &types.FieldType{Tp: mysql.TypeNull}} _, isNull, _ = GetIntFromConstant(mock.NewContext(), con) - c.Assert(isNull, check.IsTrue) + require.True(t, isNull) con = &Constant{RetType: newStringFieldType(), Value: types.NewStringDatum("abc")} _, isNull, _ = GetIntFromConstant(mock.NewContext(), con) - c.Assert(isNull, check.IsTrue) + require.True(t, isNull) con = &Constant{RetType: newStringFieldType(), Value: types.NewStringDatum("123")} num, _, _ := GetIntFromConstant(mock.NewContext(), con) - c.Assert(num, check.Equals, 123) + require.Equal(t, 123, num) } -func (s *testUtilSuite) TestSubstituteCorCol2Constant(c *check.C) { +func TestSubstituteCorCol2Constant(t *testing.T) { ctx := mock.NewContext() corCol1 := &CorrelatedColumn{Data: &NewOne().Value} corCol1.RetType = types.NewFieldType(mysql.TypeLonglong) @@ -259,21 +254,21 @@ func (s *testUtilSuite) TestSubstituteCorCol2Constant(c *check.C) { plus2 := newFunction(ast.Plus, plus, NewOne()) ans1 := &Constant{Value: types.NewIntDatum(3), RetType: types.NewFieldType(mysql.TypeLonglong)} ret, err := SubstituteCorCol2Constant(plus2) - c.Assert(err, check.IsNil) - c.Assert(ret.Equal(ctx, ans1), check.IsTrue) + require.NoError(t, err) + require.True(t, ret.Equal(ctx, ans1)) col1 := &Column{Index: 1, RetType: types.NewFieldType(mysql.TypeLonglong)} ret, err = SubstituteCorCol2Constant(col1) - c.Assert(err, check.IsNil) + require.NoError(t, err) ans2 := col1 - c.Assert(ret.Equal(ctx, ans2), check.IsTrue) + require.True(t, ret.Equal(ctx, ans2)) plus3 := newFunction(ast.Plus, plus2, col1) ret, err = SubstituteCorCol2Constant(plus3) - c.Assert(err, check.IsNil) + require.NoError(t, err) ans3 := newFunction(ast.Plus, ans1, col1) - c.Assert(ret.Equal(ctx, ans3), check.IsTrue) + require.True(t, ret.Equal(ctx, ans3)) } -func (s *testUtilSuite) TestPushDownNot(c *check.C) { +func TestPushDownNot(t *testing.T) { ctx := mock.NewContext() col := &Column{Index: 1, RetType: types.NewFieldType(mysql.TypeLonglong)} // !((a=1||a=1)&&a=1) @@ -287,40 +282,38 @@ func (s *testUtilSuite) TestPushDownNot(c *check.C) { orFunc2 := newFunction(ast.LogicOr, andFunc2, neFunc) notFuncCopy := notFunc.Clone() ret := PushDownNot(ctx, notFunc) - c.Assert(ret.Equal(ctx, orFunc2), check.IsTrue) - c.Assert(notFunc.Equal(ctx, notFuncCopy), check.IsTrue) + require.True(t, ret.Equal(ctx, orFunc2)) + require.True(t, notFunc.Equal(ctx, notFuncCopy)) // issue 15725 // (not not a) should be optimized to (a is true) notFunc = newFunction(ast.UnaryNot, col) notFunc = newFunction(ast.UnaryNot, notFunc) ret = PushDownNot(ctx, notFunc) - c.Assert(ret.Equal(ctx, newFunction(ast.IsTruthWithNull, col)), check.IsTrue) + require.True(t, ret.Equal(ctx, newFunction(ast.IsTruthWithNull, col))) // (not not (a+1)) should be optimized to (a+1 is true) plusFunc := newFunction(ast.Plus, col, NewOne()) notFunc = newFunction(ast.UnaryNot, plusFunc) notFunc = newFunction(ast.UnaryNot, notFunc) ret = PushDownNot(ctx, notFunc) - c.Assert(ret.Equal(ctx, newFunction(ast.IsTruthWithNull, plusFunc)), check.IsTrue) - + require.True(t, ret.Equal(ctx, newFunction(ast.IsTruthWithNull, plusFunc))) // (not not not a) should be optimized to (not (a is true)) notFunc = newFunction(ast.UnaryNot, col) notFunc = newFunction(ast.UnaryNot, notFunc) notFunc = newFunction(ast.UnaryNot, notFunc) ret = PushDownNot(ctx, notFunc) - c.Assert(ret.Equal(ctx, newFunction(ast.UnaryNot, newFunction(ast.IsTruthWithNull, col))), check.IsTrue) - + require.True(t, ret.Equal(ctx, newFunction(ast.UnaryNot, newFunction(ast.IsTruthWithNull, col)))) // (not not not not a) should be optimized to (a is true) notFunc = newFunction(ast.UnaryNot, col) notFunc = newFunction(ast.UnaryNot, notFunc) notFunc = newFunction(ast.UnaryNot, notFunc) notFunc = newFunction(ast.UnaryNot, notFunc) ret = PushDownNot(ctx, notFunc) - c.Assert(ret.Equal(ctx, newFunction(ast.IsTruthWithNull, col)), check.IsTrue) + require.True(t, ret.Equal(ctx, newFunction(ast.IsTruthWithNull, col))) } -func (s *testUtilSuite) TestFilter(c *check.C) { +func TestFilter(t *testing.T) { conditions := []Expression{ newFunction(ast.EQ, newColumn(0), newColumn(1)), newFunction(ast.EQ, newColumn(1), newColumn(2)), @@ -328,24 +321,24 @@ func (s *testUtilSuite) TestFilter(c *check.C) { } result := make([]Expression, 0, 5) result = Filter(result, conditions, isLogicOrFunction) - c.Assert(result, check.HasLen, 1) + require.Len(t, result, 1) } -func (s *testUtilSuite) TestFilterOutInPlace(c *check.C) { +func TestFilterOutInPlace(t *testing.T) { conditions := []Expression{ newFunction(ast.EQ, newColumn(0), newColumn(1)), newFunction(ast.EQ, newColumn(1), newColumn(2)), newFunction(ast.LogicOr, newLonglong(1), newColumn(0)), } remained, filtered := FilterOutInPlace(conditions, isLogicOrFunction) - c.Assert(len(remained), check.Equals, 2) - c.Assert(remained[0].(*ScalarFunction).FuncName.L, check.Equals, "eq") - c.Assert(remained[1].(*ScalarFunction).FuncName.L, check.Equals, "eq") - c.Assert(len(filtered), check.Equals, 1) - c.Assert(filtered[0].(*ScalarFunction).FuncName.L, check.Equals, "or") + require.Equal(t, 2, len(remained)) + require.Equal(t, "eq", remained[0].(*ScalarFunction).FuncName.L) + require.Equal(t, "eq", remained[1].(*ScalarFunction).FuncName.L) + require.Equal(t, 1, len(filtered)) + require.Equal(t, "or", filtered[0].(*ScalarFunction).FuncName.L) } -func (s *testUtilSuite) TestHashGroupKey(c *check.C) { +func TestHashGroupKey(t *testing.T) { ctx := mock.NewContext() sc := &stmtctx.StatementContext{TimeZone: time.Local} eTypes := []types.EvalType{types.ETInt, types.ETReal, types.ETDecimal, types.ETString, types.ETTimestamp, types.ETDatetime, types.ETDuration} @@ -365,24 +358,17 @@ func (s *testUtilSuite) TestHashGroupKey(c *check.C) { } var err error err = EvalExpr(ctx, colExpr, colExpr.GetType().EvalType(), input, colBuf) - if err != nil { - c.Fatal(err) - } - if bufs, err = codec.HashGroupKey(sc, 1024, colBuf, bufs, ft); err != nil { - c.Fatal(err) - } + require.NoError(t, err) + bufs, err = codec.HashGroupKey(sc, 1024, colBuf, bufs, ft) + require.NoError(t, err) var buf []byte for j := 0; j < input.NumRows(); j++ { d, err := colExpr.Eval(input.GetRow(j)) - if err != nil { - c.Fatal(err) - } + require.NoError(t, err) buf, err = codec.EncodeValue(sc, buf[:0], d) - if err != nil { - c.Fatal(err) - } - c.Assert(string(bufs[j]), check.Equals, string(buf)) + require.NoError(t, err) + require.Equal(t, string(bufs[j]), string(buf)) } } } @@ -394,28 +380,27 @@ func isLogicOrFunction(e Expression) bool { return false } -func (s *testUtilSuite) TestDisableParseJSONFlag4Expr(c *check.C) { +func TestDisableParseJSONFlag4Expr(t *testing.T) { var expr Expression expr = &Column{RetType: newIntFieldType()} ft := expr.GetType() ft.Flag |= mysql.ParseToJSONFlag DisableParseJSONFlag4Expr(expr) - c.Assert(mysql.HasParseToJSONFlag(ft.Flag), check.IsTrue) + require.True(t, mysql.HasParseToJSONFlag(ft.Flag)) expr = &CorrelatedColumn{Column: Column{RetType: newIntFieldType()}} ft = expr.GetType() ft.Flag |= mysql.ParseToJSONFlag DisableParseJSONFlag4Expr(expr) - c.Assert(mysql.HasParseToJSONFlag(ft.Flag), check.IsTrue) - + require.True(t, mysql.HasParseToJSONFlag(ft.Flag)) expr = &ScalarFunction{RetType: newIntFieldType()} ft = expr.GetType() ft.Flag |= mysql.ParseToJSONFlag DisableParseJSONFlag4Expr(expr) - c.Assert(mysql.HasParseToJSONFlag(ft.Flag), check.IsFalse) + require.False(t, mysql.HasParseToJSONFlag(ft.Flag)) } -func (s *testUtilSuite) TestSQLDigestTextRetriever(c *check.C) { +func TestSQLDigestTextRetriever(t *testing.T) { // Create a fake session as the argument to the retriever, though it's actually not used when mock data is set. r := NewSQLDigestTextRetriever() @@ -457,24 +442,24 @@ func (s *testUtilSuite) TestSQLDigestTextRetriever(c *check.C) { } err := r.RetrieveLocal(context.Background(), nil) - c.Assert(err, check.IsNil) - c.Assert(r.SQLDigestsMap, check.DeepEquals, expectedLocalResult) + require.NoError(t, err) + require.Equal(t, expectedLocalResult, r.SQLDigestsMap) clearResult() err = r.RetrieveGlobal(context.Background(), nil) - c.Assert(err, check.IsNil) - c.Assert(r.SQLDigestsMap, check.DeepEquals, expectedGlobalResult) + require.NoError(t, err) + require.Equal(t, expectedGlobalResult, r.SQLDigestsMap) clearResult() r.fetchAllLimit = 1 err = r.RetrieveLocal(context.Background(), nil) - c.Assert(err, check.IsNil) - c.Assert(r.SQLDigestsMap, check.DeepEquals, expectedLocalResult) + require.NoError(t, err) + require.Equal(t, expectedLocalResult, r.SQLDigestsMap) clearResult() err = r.RetrieveGlobal(context.Background(), nil) - c.Assert(err, check.IsNil) - c.Assert(r.SQLDigestsMap, check.DeepEquals, expectedGlobalResult) + require.NoError(t, err) + require.Equal(t, expectedGlobalResult, r.SQLDigestsMap) } func BenchmarkExtractColumns(b *testing.B) { @@ -552,7 +537,7 @@ func (m *MockExpr) EvalInt(ctx sessionctx.Context, row chunk.Row) (val int64, is } func (m *MockExpr) EvalReal(ctx sessionctx.Context, row chunk.Row) (val float64, isNull bool, err error) { if x, ok := m.i.(float64); ok { - return float64(x), false, m.err + return x, false, m.err } return 0, m.i == nil, m.err } @@ -610,7 +595,7 @@ func (m *MockExpr) SetCoercibility(Coercibility) func (m *MockExpr) Repertoire() Repertoire { return UNICODE } func (m *MockExpr) SetRepertoire(Repertoire) {} -func (m *MockExpr) CharsetAndCollation(ctx sessionctx.Context) (string, string) { +func (m *MockExpr) CharsetAndCollation() (string, string) { return "", "" } func (m *MockExpr) SetCharsetAndCollation(chs, coll string) {} diff --git a/go.mod b/go.mod index 5d93a62d43475..3c2868df8b118 100644 --- a/go.mod +++ b/go.mod @@ -45,19 +45,19 @@ require ( github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 github.com/pingcap/badger v1.5.1-0.20210831093107-2f6cb8008145 github.com/pingcap/check v0.0.0-20200212061837-5e12011dc712 - github.com/pingcap/errors v0.11.5-0.20210425183316-da1aaba5fb63 + github.com/pingcap/errors v0.11.5-0.20211009033009-93128226aaa3 github.com/pingcap/failpoint v0.0.0-20210316064728-7acb0f0a3dfd github.com/pingcap/fn v0.0.0-20200306044125-d5540d389059 - github.com/pingcap/kvproto v0.0.0-20210915062418-0f5764a128ad + github.com/pingcap/kvproto v0.0.0-20211122024046-03abd340988f github.com/pingcap/log v0.0.0-20210906054005-afc726e70354 - github.com/pingcap/sysutil v0.0.0-20210730114356-fcd8a63f68c5 - github.com/pingcap/tidb-tools v5.0.3+incompatible + github.com/pingcap/sysutil v0.0.0-20211208032423-041a72e5860d + github.com/pingcap/tidb-tools v5.2.2-0.20211019062242-37a8bef2fa17+incompatible github.com/pingcap/tidb/parser v0.0.0-20211011031125-9b13dc409c5e - github.com/pingcap/tipb v0.0.0-20211008080435-3fd327dfce0e + github.com/pingcap/tipb v0.0.0-20211201080053-bd104bb270ba github.com/prometheus/client_golang v1.5.1 github.com/prometheus/client_model v0.2.0 github.com/prometheus/common v0.9.1 - github.com/shirou/gopsutil v3.21.2+incompatible + github.com/shirou/gopsutil v3.21.3+incompatible github.com/shurcooL/httpgzip v0.0.0-20190720172056-320755c1c1b0 github.com/sirupsen/logrus v1.8.1 // indirect github.com/soheilhy/cmux v0.1.4 @@ -65,8 +65,8 @@ require ( github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.7.0 github.com/tiancaiamao/appdash v0.0.0-20181126055449-889f96f722a2 - github.com/tikv/client-go/v2 v2.0.0-alpha.0.20211011083157-49c8dd23f1f0 - github.com/tikv/pd v1.1.0-beta.0.20210818082359-acba1da0018d + github.com/tikv/client-go/v2 v2.0.0-rc.0.20211214093715-605f49d3ba50 + github.com/tikv/pd v1.1.0-beta.0.20211118054146-02848d2660ee github.com/twmb/murmur3 v1.1.3 github.com/uber/jaeger-client-go v2.22.1+incompatible github.com/uber/jaeger-lib v2.4.1+incompatible // indirect @@ -76,20 +76,20 @@ require ( go.etcd.io/etcd v0.5.0-alpha.5.0.20210512015243-d19fbe541bf9 go.uber.org/atomic v1.9.0 go.uber.org/automaxprocs v1.4.0 - go.uber.org/goleak v1.1.11-0.20210813005559-691160354723 + go.uber.org/goleak v1.1.12 go.uber.org/multierr v1.7.0 go.uber.org/zap v1.19.1 golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420 golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a golang.org/x/sync v0.0.0-20210220032951-036812b2e83c - golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069 + golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e golang.org/x/text v0.3.7 golang.org/x/tools v0.1.5 google.golang.org/api v0.54.0 google.golang.org/grpc v1.40.0 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v2 v2.4.0 - modernc.org/mathutil v1.2.2 + modernc.org/mathutil v1.4.1 sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0 sourcegraph.com/sourcegraph/appdash-data v0.0.0-20151005221446-73f23eafcf67 ) diff --git a/go.sum b/go.sum index a61ff8747c3e2..a6b2d60e60a01 100644 --- a/go.sum +++ b/go.sum @@ -108,7 +108,6 @@ github.com/cenkalti/backoff/v4 v4.0.2/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.0/go.mod h1:dgIUBU3pDso/gPgZ1osOZ0iQf77oPR28Tjxl5dIMyVM= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cheggaaa/pb/v3 v3.0.8 h1:bC8oemdChbke2FHIIGy9mn4DPJ2caZYQnfbRqwmdCoA= @@ -161,20 +160,16 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsr github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cznic/golex v0.0.0-20181122101858-9c343928389c/go.mod h1:+bmmJDNmKlhWNG+gwWCkaBoTy39Fs+bzRxVBzoTQbIc= github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548 h1:iwZdTE0PVqJCos1vaoKsclOGD3ADKpshg3SRtYBbwso= github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM= -github.com/cznic/parser v0.0.0-20160622100904-31edd927e5b1/go.mod h1:2B43mz36vGZNZEwkWi8ayRSSUXLfjL8OkbzwW4NcPMM= github.com/cznic/sortutil v0.0.0-20181122101858-f5f958428db8 h1:LpMLYGyy67BoAFGda1NeOBQwqlv7nUXpm+rIVHGxZZ4= github.com/cznic/sortutil v0.0.0-20181122101858-f5f958428db8/go.mod h1:q2w6Bg5jeox1B+QkJ6Wp/+Vn0G/bo3f1uY7Fn3vivIQ= github.com/cznic/strutil v0.0.0-20171016134553-529a34b1c186/go.mod h1:AHHPPPXTw0h6pVabbcbyGRK1DckRn7r/STdZEeIDzZc= -github.com/cznic/y v0.0.0-20170802143616-045f81c6662a/go.mod h1:1rk5VM7oSnA4vjp+hrLQ3HWHa+Y4yPCa3/CsJrcNnvs= github.com/danjacques/gofslock v0.0.0-20191023191349-0a45f885bc37 h1:X6mKGhCFOxrKeeHAjv/3UvT6e5RRxW6wRdlqlV6/H4w= github.com/danjacques/gofslock v0.0.0-20191023191349-0a45f885bc37/go.mod h1:DC3JtzuG7kxMvJ6dZmf2ymjNyoXwgtklr7FN+Um2B0U= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgraph-io/ristretto v0.0.1 h1:cJwdnj42uV8Jg4+KLrYovLiCgIfz9wtWm6E6KA+1tLs= github.com/dgraph-io/ristretto v0.0.1/go.mod h1:T40EBc7CJke8TkpiYfGGKAeFjSaxuFXhuXRyumBd6RE= @@ -191,7 +186,6 @@ github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaI github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= @@ -257,8 +251,6 @@ github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3yg github.com/go-playground/overalls v0.0.0-20180201144345-22ec1a223b7c/go.mod h1:UqxAgEOt89sCiXlrc/ycnx00LVvUO/eS8tMUkWX4R7w= github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY= github.com/go-resty/resty/v2 v2.6.0/go.mod h1:PwvJS6hvaPkjtjNg9ph+VrSD92bi5Zq73w/BIH7cC3Q= -github.com/go-sql-driver/mysql v1.3.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= @@ -277,7 +269,6 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -401,7 +392,6 @@ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/hydrogen18/memlistener v0.0.0-20141126152155-54553eb933fb/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= -github.com/hypnoglow/gormzap v0.3.0/go.mod h1:5Wom8B7Jl2oK0Im9hs6KQ+Kl92w4Y7gKCrj66rhyvw0= github.com/iancoleman/strcase v0.0.0-20191112232945-16388991a334 h1:VHgatEHNcBFEB7inlalqfNqw65aNkM1lGX2yt3NmbS8= github.com/iancoleman/strcase v0.0.0-20191112232945-16388991a334/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= @@ -409,6 +399,7 @@ github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1: github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/tdigest v0.0.1/go.mod h1:Z0kXnxzbTC2qrx4NaIzYkE1k66+6oEDQTvL95hQFh5Y= github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI= @@ -417,9 +408,7 @@ github.com/jcmturner/gofork v0.0.0-20180107083740-2aebee971930/go.mod h1:MK8+TM0 github.com/jedib0t/go-pretty/v6 v6.2.2 h1:o3McN0rQ4X+IU+HduppSp9TwRdGLRW2rhJXy9CJaCRw= github.com/jedib0t/go-pretty/v6 v6.2.2/go.mod h1:+nE9fyyHGil+PuISTCrp7avEdo6bqoMwqZnuiK2r2a0= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jinzhu/gorm v1.9.12/go.mod h1:vhTjlKSJUTWNtcbQtrMBFCxy7eXTzeCAzfL5fBZT/Qs= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jinzhu/now v1.1.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= @@ -480,7 +469,6 @@ github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw= -github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -502,9 +490,8 @@ github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.12 h1:Y41i/hVW3Pgwr8gV+J23B9YEY0zxjptBuCWEaxmAOow= github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= -github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= +github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/mattn/go-sqlite3 v1.14.5/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI= -github.com/mattn/go-sqlite3 v2.0.1+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= @@ -579,10 +566,10 @@ github.com/pingcap/errors v0.11.0/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTw github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pingcap/errors v0.11.5-0.20190809092503-95897b64e011/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pingcap/errors v0.11.5-0.20200917111840-a15ef68f753d/go.mod h1:g4vx//d6VakjJ0mk7iLBlKA8LFavV/sAVINT/1PFxeQ= -github.com/pingcap/errors v0.11.5-0.20201029093017-5a7df2af2ac7/go.mod h1:G7x87le1poQzLB/TqvTJI2ILrSgobnq4Ut7luOwvfvI= github.com/pingcap/errors v0.11.5-0.20201126102027-b0a155152ca3/go.mod h1:G7x87le1poQzLB/TqvTJI2ILrSgobnq4Ut7luOwvfvI= -github.com/pingcap/errors v0.11.5-0.20210425183316-da1aaba5fb63 h1:+FZIDR/D97YOPik4N4lPDaUcLDF/EQPogxtlHB2ZZRM= github.com/pingcap/errors v0.11.5-0.20210425183316-da1aaba5fb63/go.mod h1:X2r9ueLEUZgtx2cIogM0v4Zj5uvvzhuuiu7Pn8HzMPg= +github.com/pingcap/errors v0.11.5-0.20211009033009-93128226aaa3 h1:8l9lu9RjWkI/VeqrP+Fn3tvZNPu5GYP0rYLLN5Q46go= +github.com/pingcap/errors v0.11.5-0.20211009033009-93128226aaa3/go.mod h1:X2r9ueLEUZgtx2cIogM0v4Zj5uvvzhuuiu7Pn8HzMPg= github.com/pingcap/failpoint v0.0.0-20191029060244-12f4ac2fd11d/go.mod h1:DNS3Qg7bEDhU6EXNHF+XSv/PGznQaMJ5FWvctpm6pQI= github.com/pingcap/failpoint v0.0.0-20200702092429-9f69995143ce/go.mod h1:w4PEZ5y16LeofeeGwdgZB4ddv9bLyDuIX+ljstgKZyk= github.com/pingcap/failpoint v0.0.0-20210316064728-7acb0f0a3dfd h1:I8IeI8MNiZVKnwuXhcIIzz6pREcOSbq18Q31KYIzFVM= @@ -593,28 +580,26 @@ github.com/pingcap/goleveldb v0.0.0-20191226122134-f82aafb29989 h1:surzm05a8C9dN github.com/pingcap/goleveldb v0.0.0-20191226122134-f82aafb29989/go.mod h1:O17XtbryoCJhkKGbT62+L2OlrniwqiGLSqrmdHCMzZw= github.com/pingcap/kvproto v0.0.0-20191211054548-3c6b38ea5107/go.mod h1:WWLmULLO7l8IOcQG+t+ItJ3fEcrL5FxF0Wu+HrMy26w= github.com/pingcap/kvproto v0.0.0-20200411081810-b85805c9476c/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI= -github.com/pingcap/kvproto v0.0.0-20210219064844-c1844a4775d6/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI= -github.com/pingcap/kvproto v0.0.0-20210805052247-76981389e818/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI= -github.com/pingcap/kvproto v0.0.0-20210915062418-0f5764a128ad h1:suBPTeuY6yVF7xvTGeTQ9+tiGzufnORJpCRwzbdN2sc= -github.com/pingcap/kvproto v0.0.0-20210915062418-0f5764a128ad/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI= +github.com/pingcap/kvproto v0.0.0-20210819164333-bd5706b9d9f2/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI= +github.com/pingcap/kvproto v0.0.0-20211109071446-a8b4d34474bc/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI= +github.com/pingcap/kvproto v0.0.0-20211122024046-03abd340988f h1:hjInxK1Ie6CYx7Jy2pYnBdEnWI8jIfr423l9Yh6LRy8= +github.com/pingcap/kvproto v0.0.0-20211122024046-03abd340988f/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI= github.com/pingcap/log v0.0.0-20191012051959-b742a5d432e9/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8= github.com/pingcap/log v0.0.0-20200511115504-543df19646ad/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8= -github.com/pingcap/log v0.0.0-20201112100606-8f1e84a3abc8/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8= github.com/pingcap/log v0.0.0-20210317133921-96f4fcab92a4/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8= github.com/pingcap/log v0.0.0-20210625125904-98ed8e2eb1c7/go.mod h1:8AanEdAHATuRurdGxZXBz0At+9avep+ub7U1AGYLIMM= github.com/pingcap/log v0.0.0-20210906054005-afc726e70354 h1:SvWCbCPh1YeHd9yQLksvJYAgft6wLTY1aNG81tpyscQ= github.com/pingcap/log v0.0.0-20210906054005-afc726e70354/go.mod h1:DWQW5jICDR7UJh4HtxXSM20Churx4CQL0fwL/SoOSA4= -github.com/pingcap/parser v0.0.0-20210525032559-c37778aff307/go.mod h1:xZC8I7bug4GJ5KtHhgAikjTfU4kBv1Sbo3Pf1MZ6lVw= -github.com/pingcap/sysutil v0.0.0-20200206130906-2bfa6dc40bcd/go.mod h1:EB/852NMQ+aRKioCpToQ94Wl7fktV+FNnxf3CX/TTXI= github.com/pingcap/sysutil v0.0.0-20210315073920-cc0985d983a3/go.mod h1:tckvA041UWP+NqYzrJ3fMgC/Hw9wnmQ/tUkp/JaHly8= -github.com/pingcap/sysutil v0.0.0-20210730114356-fcd8a63f68c5 h1:7rvAtZe/ZUzOKzgriNPQoBNvleJXBk4z7L3Z47+tS98= github.com/pingcap/sysutil v0.0.0-20210730114356-fcd8a63f68c5/go.mod h1:XsOaV712rUk63aOEKYP9PhXTIE3FMNHmC2r1wX5wElY= -github.com/pingcap/tidb-dashboard v0.0.0-20210312062513-eef5d6404638/go.mod h1:OzFN8H0EDMMqeulPhPMw2i2JaiZWOKFQ7zdRPhENNgo= -github.com/pingcap/tidb-dashboard v0.0.0-20210716172320-2226872e3296/go.mod h1:OCXbZTBTIMRcIt0jFsuCakZP+goYRv6IjawKbwLS2TQ= -github.com/pingcap/tidb-tools v5.0.3+incompatible h1:vYMrW9ux+3HRMeRZ1fUOjy2nyiodtuVyAyK270EKBEs= -github.com/pingcap/tidb-tools v5.0.3+incompatible/go.mod h1:XGdcy9+yqlDSEMTpOXnwf3hiTeqrV6MN/u1se9N8yIM= -github.com/pingcap/tipb v0.0.0-20211008080435-3fd327dfce0e h1:fZY5T65QWiPc9noQJ1UkdwejZyBZjNfxzSyTcBjKrEU= -github.com/pingcap/tipb v0.0.0-20211008080435-3fd327dfce0e/go.mod h1:A7mrd7WHBl1o63LE2bIBGEJMTNWXqhgmYiOvMLxozfs= +github.com/pingcap/sysutil v0.0.0-20211208032423-041a72e5860d h1:k3/APKZjXOyJrFy8VyYwRlZhMelpD3qBLJNsw3bPl/g= +github.com/pingcap/sysutil v0.0.0-20211208032423-041a72e5860d/go.mod h1:7j18ezaWTao2LHOyMlsc2Dg1vW+mDY9dEbPzVyOlaeM= +github.com/pingcap/tidb-dashboard v0.0.0-20211008050453-a25c25809529/go.mod h1:OCXbZTBTIMRcIt0jFsuCakZP+goYRv6IjawKbwLS2TQ= +github.com/pingcap/tidb-dashboard v0.0.0-20211107164327-80363dfbe884/go.mod h1:OCXbZTBTIMRcIt0jFsuCakZP+goYRv6IjawKbwLS2TQ= +github.com/pingcap/tidb-tools v5.2.2-0.20211019062242-37a8bef2fa17+incompatible h1:c7+izmker91NkjkZ6FgTlmD4k1A5FLOAq+li6Ki2/GY= +github.com/pingcap/tidb-tools v5.2.2-0.20211019062242-37a8bef2fa17+incompatible/go.mod h1:XGdcy9+yqlDSEMTpOXnwf3hiTeqrV6MN/u1se9N8yIM= +github.com/pingcap/tipb v0.0.0-20211201080053-bd104bb270ba h1:Tt5W/maVBUbG+wxg2nfc88Cqj/HiWYb0TJQ2Rfi0UOQ= +github.com/pingcap/tipb v0.0.0-20211201080053-bd104bb270ba/go.mod h1:A7mrd7WHBl1o63LE2bIBGEJMTNWXqhgmYiOvMLxozfs= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -627,7 +612,6 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_golang v1.2.1/go.mod h1:XMU6Z2MjaRKVu/dC1qupJI9SiNkDYzz3xecMgSW/F+U= github.com/prometheus/client_golang v1.5.1 h1:bdHYieyGlH+6OLEk2YQha8THib30KP0/yD0YH9m6xcA= github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= @@ -640,7 +624,6 @@ github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7q github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.9.1 h1:KOMtN28tlbam3/7ZKEYKHhKoJZYYj3gMH4uc62x7X7U= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -651,7 +634,6 @@ github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDa github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/remyoudompheng/bigfft v0.0.0-20190728182440-6a916e37a237/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= @@ -669,9 +651,9 @@ github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdh github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= github.com/sergi/go-diff v1.0.1-0.20180205163309-da645544ed44/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shirou/gopsutil v2.19.10+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shirou/gopsutil v3.21.2+incompatible h1:U+YvJfjCh6MslYlIAXvPtzhW3YZEtc9uncueUNpD/0A= github.com/shirou/gopsutil v3.21.2+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/gopsutil v3.21.3+incompatible h1:uenXGGa8ESCQq+dbgtl916dmg6PSAz2cXov0uORQ9v8= +github.com/shirou/gopsutil v3.21.3+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 h1:bUGsEnyNbVPw06Bs80sCeARAlK8lhwqGyi6UT8ymuGk= github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= @@ -724,18 +706,17 @@ github.com/swaggo/swag v1.6.3/go.mod h1:wcc83tB4Mb2aNiL/HP4MFeQdpHUrca+Rp/DRNgWA github.com/swaggo/swag v1.6.6-0.20200529100950-7c765ddd0476/go.mod h1:xDhTyuFIujYiN3DKWC/H/83xcfHp+UE/IzWWampG7Zc= github.com/syndtr/goleveldb v1.0.1-0.20190318030020-c3a204f8e965 h1:1oFLiOyVl+W7bnBzGhf7BbIv9loSFQcieWWYIjLqcAw= github.com/syndtr/goleveldb v1.0.1-0.20190318030020-c3a204f8e965/go.mod h1:9OrXJhf154huy1nPWmuSrkgjPUtUNhA+Zmy+6AESzuA= -github.com/thoas/go-funk v0.7.0/go.mod h1:+IWnUfUmFO1+WVYQWQtIJHeRRdaIyyYglZN7xzUPe4Q= github.com/thoas/go-funk v0.8.0/go.mod h1:+IWnUfUmFO1+WVYQWQtIJHeRRdaIyyYglZN7xzUPe4Q= github.com/tiancaiamao/appdash v0.0.0-20181126055449-889f96f722a2 h1:mbAskLJ0oJfDRtkanvQPiooDH8HvJ2FBh+iKT/OmiQQ= github.com/tiancaiamao/appdash v0.0.0-20181126055449-889f96f722a2/go.mod h1:2PfKggNGDuadAa0LElHrByyrz4JPZ9fFx6Gs7nx7ZZU= github.com/tidwall/gjson v1.3.5/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tikv/client-go/v2 v2.0.0-alpha.0.20211011083157-49c8dd23f1f0 h1:DZdVqFVe+r7M0tSZ2LdqeY+UNplR1DSLCdGtH1AKi5M= -github.com/tikv/client-go/v2 v2.0.0-alpha.0.20211011083157-49c8dd23f1f0/go.mod h1:00plYwQsQ5kBUmafHO+JkjznGgFaBokMZl82TZIbsQk= -github.com/tikv/pd v1.1.0-beta.0.20210323121136-78679e5e209d/go.mod h1:Jw9KG11C/23Rr7DW4XWQ7H5xOgGZo6DFL1OKAF4+Igw= -github.com/tikv/pd v1.1.0-beta.0.20210818082359-acba1da0018d h1:AFm1Dzw+QRUevWRfrFp45CPPkuK/zdSWcfxI10z+WVE= -github.com/tikv/pd v1.1.0-beta.0.20210818082359-acba1da0018d/go.mod h1:rammPjeZgpvfrQRPkijcx8tlxF1XM5+m6kRXrkDzCAA= +github.com/tikv/client-go/v2 v2.0.0-rc.0.20211214093715-605f49d3ba50 h1:B+cAIm2P1/SNsVV1vL9/mRaGUVl/vdgV8MU03O0vY28= +github.com/tikv/client-go/v2 v2.0.0-rc.0.20211214093715-605f49d3ba50/go.mod h1:wRuh+W35daKTiYBld0oBlT6PSkzEVr+pB/vChzJZk+8= +github.com/tikv/pd v1.1.0-beta.0.20211029083450-e65f0c55b6ae/go.mod h1:varH0IE0jJ9E9WN2Ei/N6pajMlPkcXdDEf7f5mmsUVQ= +github.com/tikv/pd v1.1.0-beta.0.20211118054146-02848d2660ee h1:rAAdvQ8Hh36syHr92g0VmZEpkH+40RGQBpFL2121xMs= +github.com/tikv/pd v1.1.0-beta.0.20211118054146-02848d2660ee/go.mod h1:lRbwxBAhnTQR5vqbTzeI/Bj62bD2OvYYuFezo2vrmeI= github.com/tklauser/go-sysconf v0.3.4 h1:HT8SVixZd3IzLdfs/xlpq0jeSfTX57g1v6wB1EuzV7M= github.com/tklauser/go-sysconf v0.3.4/go.mod h1:Cl2c8ZRWfHD5IrfHo9VN+FX9kCFjIOyVklgXycLB6ek= github.com/tklauser/numcpus v0.2.1 h1:ct88eFm+Q7m2ZfXJdan1xYoXKlmwsfP+k88q05KvlZc= @@ -825,8 +806,9 @@ go.uber.org/dig v1.8.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw= go.uber.org/fx v1.10.0/go.mod h1:vLRicqpG/qQEzno4SYU86iCwfT95EZza+Eba0ItuxqY= go.uber.org/goleak v0.10.0/go.mod h1:VCZuO8V8mFPlL0F5J5GK1rtHV3DrFcQ1R8ryq7FK0aI= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723 h1:sHOAIxRGBp443oHZIPB+HsUGaksVCXVQENPxwTfQdH4= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= +go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= @@ -835,7 +817,6 @@ go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9i go.uber.org/multierr v1.7.0 h1:zaiO/rmgFjbmCXdSYJWQcdvOCsthmdaHfr3Gm2Kx4Ec= go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.8.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.12.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= @@ -849,20 +830,19 @@ golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200204104054-c9f3fb736b72/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a h1:vclmkQCjlDX5OydZ9wv8rBCcS0QyQY66Mpf/7BZbInM= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20181106170214-d68db9428509/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1003,7 +983,6 @@ golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1042,8 +1021,9 @@ golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069 h1:siQdpVirKtzPhKl3lZWozZraCFObP8S1v6PRp0bLrtU= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e h1:XMgFehsDnnLGtjvjOfqWSUzt0alpTR1RSEuznObga2c= +golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1113,7 +1093,6 @@ golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWc golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200527183253-8e7acdbce89d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= @@ -1140,7 +1119,9 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= @@ -1301,8 +1282,20 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.2.0/go.mod h1:lPVVZ2BS5TfnjLyizF7o7hv7j9/L+8cZY2hLyjP9cGY= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -modernc.org/mathutil v1.2.2 h1:+yFk8hBprV+4c0U9GjFtL+dV3N8hOJ8JCituQcMShFY= -modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/fileutil v1.0.0/go.mod h1:JHsWpkrk/CnVV1H/eGlFf85BEpfkrp56ro8nojIq9Q8= +modernc.org/golex v1.0.1/go.mod h1:QCA53QtsT1NdGkaZZkF5ezFwk4IXh4BGNafAARTC254= +modernc.org/lex v1.0.0/go.mod h1:G6rxMTy3cH2iA0iXL/HRRv4Znu8MK4higxph/lE7ypk= +modernc.org/lexer v1.0.0/go.mod h1:F/Dld0YKYdZCLQ7bD0USbWL4YKCyTDRDHiDTOs0q0vk= +modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= +modernc.org/mathutil v1.4.1 h1:ij3fYGe8zBF4Vu+g0oT7mB06r8sqGWKuJu1yXeR4by8= +modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/parser v1.0.0/go.mod h1:H20AntYJ2cHHL6MHthJ8LZzXCdDCHMWt1KZXtIMjejA= +modernc.org/parser v1.0.2/go.mod h1:TXNq3HABP3HMaqLK7brD1fLA/LfN0KS6JxZn71QdDqs= +modernc.org/scanner v1.0.1/go.mod h1:OIzD2ZtjYk6yTuyqZr57FmifbM9fIH74SumloSsajuE= +modernc.org/sortutil v1.0.0/go.mod h1:1QO0q8IlIlmjBIwm6t/7sof874+xCfZouyqZMLIAtxM= +modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= +modernc.org/strutil v1.1.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= +modernc.org/y v1.0.1/go.mod h1:Ho86I+LVHEI+LYXoUKlmOMAM1JTXOCfj8qi1T8PsClE= moul.io/zapgorm2 v1.1.0/go.mod h1:emRfKjNqSzVj5lcgasBdovIXY1jSOwFz2GQZn1Rddks= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/infoschema/builder.go b/infoschema/builder.go index 9712420d6c810..b4f1552b7bef5 100644 --- a/infoschema/builder.go +++ b/infoschema/builder.go @@ -20,6 +20,7 @@ import ( "sort" "strings" + "github.com/ngaut/pools" "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/config" @@ -33,6 +34,7 @@ import ( "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/util/domainutil" + "github.com/pingcap/tidb/util/sqlexec" ) // Builder builds a new InfoSchema. @@ -41,6 +43,9 @@ type Builder struct { // TODO: store is only used by autoid allocators // detach allocators from storage, use passed transaction in the feature store kv.Storage + // TODO: renewLeaseCh is only used to pass data between table and domain + renewLeaseCh chan func() + factory func() (pools.Resource, error) } // ApplyDiff applies SchemaDiff to the new InfoSchema. @@ -63,6 +68,14 @@ func (b *Builder) ApplyDiff(m *meta.Meta, diff *model.SchemaDiff) ([]int64, erro case model.ActionAlterPlacementPolicy: return b.applyAlterPolicy(m, diff) case model.ActionCreateTables: + roDBInfo, ok := b.is.SchemaByID(diff.SchemaID) + if !ok { + return nil, ErrDatabaseNotExists.GenWithStackByArgs( + fmt.Sprintf("(Schema ID %d)", diff.SchemaID), + ) + } + dbInfo := b.copySchemaTables(roDBInfo.Name.L) + tblIDs := make([]int64, 0, len(diff.AffectedOpts)) if diff.AffectedOpts != nil { for _, opt := range diff.AffectedOpts { @@ -74,7 +87,7 @@ func (b *Builder) ApplyDiff(m *meta.Meta, diff *model.SchemaDiff) ([]int64, erro OldSchemaID: opt.OldSchemaID, OldTableID: opt.OldTableID, } - affectedIDs, err := b.ApplyDiff(m, affectedDiff) + affectedIDs, err := b.defaultApplyDiff(m, affectedDiff, dbInfo) if err != nil { return nil, errors.Trace(err) } @@ -89,147 +102,142 @@ func (b *Builder) ApplyDiff(m *meta.Meta, diff *model.SchemaDiff) ([]int64, erro fmt.Sprintf("(Schema ID %d)", diff.SchemaID), ) } - var oldTableID, newTableID int64 - switch diff.Type { - case model.ActionCreateTable, model.ActionCreateSequence, model.ActionRecoverTable: - newTableID = diff.TableID - case model.ActionDropTable, model.ActionDropView, model.ActionDropSequence: - oldTableID = diff.TableID - case model.ActionTruncateTable, model.ActionCreateView, model.ActionExchangeTablePartition: - oldTableID = diff.OldTableID - newTableID = diff.TableID - default: - oldTableID = diff.TableID - newTableID = diff.TableID + dbInfo := b.copySchemaTables(roDBInfo.Name.L) + return b.defaultApplyDiff(m, diff, dbInfo) + } +} + +// defaultApplyDiff handles all action types that is not handled in ApplyDiff. +func (b *Builder) defaultApplyDiff(m *meta.Meta, diff *model.SchemaDiff, dbInfo *model.DBInfo) ([]int64, error) { + var oldTableID, newTableID int64 + switch diff.Type { + case model.ActionCreateTable, model.ActionCreateSequence, model.ActionRecoverTable: + newTableID = diff.TableID + case model.ActionDropTable, model.ActionDropView, model.ActionDropSequence: + oldTableID = diff.TableID + case model.ActionTruncateTable, model.ActionCreateView, model.ActionExchangeTablePartition: + oldTableID = diff.OldTableID + newTableID = diff.TableID + default: + oldTableID = diff.TableID + newTableID = diff.TableID + } + // handle placement rule cache + switch diff.Type { + case model.ActionCreateTable: + if err := b.applyPlacementUpdate(placement.GroupID(newTableID)); err != nil { + return nil, errors.Trace(err) } - // handle placement rule cache - switch diff.Type { - case model.ActionCreateTable: - if err := b.applyPlacementUpdate(placement.GroupID(newTableID)); err != nil { - return nil, errors.Trace(err) - } - case model.ActionDropTable: - b.applyPlacementDelete(placement.GroupID(oldTableID)) - case model.ActionTruncateTable: - b.applyPlacementDelete(placement.GroupID(oldTableID)) - if err := b.applyPlacementUpdate(placement.GroupID(newTableID)); err != nil { - return nil, errors.Trace(err) - } - case model.ActionRecoverTable: - if err := b.applyPlacementUpdate(placement.GroupID(newTableID)); err != nil { - return nil, errors.Trace(err) - } - case model.ActionExchangeTablePartition: - if err := b.applyPlacementUpdate(placement.GroupID(newTableID)); err != nil { - return nil, errors.Trace(err) - } + case model.ActionDropTable: + b.applyPlacementDelete(placement.GroupID(oldTableID)) + case model.ActionTruncateTable: + b.applyPlacementDelete(placement.GroupID(oldTableID)) + if err := b.applyPlacementUpdate(placement.GroupID(newTableID)); err != nil { + return nil, errors.Trace(err) } - dbInfo := b.copySchemaTables(roDBInfo.Name.L) - b.copySortedTables(oldTableID, newTableID) - - tblIDs := make([]int64, 0, 2) - // We try to reuse the old allocator, so the cached auto ID can be reused. - var allocs autoid.Allocators - if tableIDIsValid(oldTableID) { - if oldTableID == newTableID && diff.Type != model.ActionRenameTable && - diff.Type != model.ActionExchangeTablePartition && - // For repairing table in TiDB cluster, given 2 normal node and 1 repair node. - // For normal node's information schema, repaired table is existed. - // For repair node's information schema, repaired table is filtered (couldn't find it in `is`). - // So here skip to reserve the allocators when repairing table. - diff.Type != model.ActionRepairTable && - // Alter sequence will change the sequence info in the allocator, so the old allocator is not valid any more. - diff.Type != model.ActionAlterSequence { - oldAllocs, _ := b.is.AllocByID(oldTableID) - allocs = filterAllocators(diff, oldAllocs) - } + case model.ActionRecoverTable: + if err := b.applyPlacementUpdate(placement.GroupID(newTableID)); err != nil { + return nil, errors.Trace(err) + } + case model.ActionExchangeTablePartition: + if err := b.applyPlacementUpdate(placement.GroupID(newTableID)); err != nil { + return nil, errors.Trace(err) + } + } + b.copySortedTables(oldTableID, newTableID) - tmpIDs := tblIDs - if (diff.Type == model.ActionRenameTable || diff.Type == model.ActionRenameTables) && diff.OldSchemaID != diff.SchemaID { - oldRoDBInfo, ok := b.is.SchemaByID(diff.OldSchemaID) - if !ok { - return nil, ErrDatabaseNotExists.GenWithStackByArgs( - fmt.Sprintf("(Schema ID %d)", diff.OldSchemaID), - ) - } - oldDBInfo := b.copySchemaTables(oldRoDBInfo.Name.L) - tmpIDs = b.applyDropTable(oldDBInfo, oldTableID, tmpIDs) - } else { - tmpIDs = b.applyDropTable(dbInfo, oldTableID, tmpIDs) - } + tblIDs := make([]int64, 0, 2) + // We try to reuse the old allocator, so the cached auto ID can be reused. + var allocs autoid.Allocators + if tableIDIsValid(oldTableID) { + if oldTableID == newTableID && diff.Type != model.ActionRenameTable && + diff.Type != model.ActionExchangeTablePartition && + // For repairing table in TiDB cluster, given 2 normal node and 1 repair node. + // For normal node's information schema, repaired table is existed. + // For repair node's information schema, repaired table is filtered (couldn't find it in `is`). + // So here skip to reserve the allocators when repairing table. + diff.Type != model.ActionRepairTable && + // Alter sequence will change the sequence info in the allocator, so the old allocator is not valid any more. + diff.Type != model.ActionAlterSequence { + oldAllocs, _ := b.is.AllocByID(oldTableID) + allocs = filterAllocators(diff, oldAllocs) + } - if oldTableID != newTableID { - // Update tblIDs only when oldTableID != newTableID because applyCreateTable() also updates tblIDs. - tblIDs = tmpIDs + tmpIDs := tblIDs + if (diff.Type == model.ActionRenameTable || diff.Type == model.ActionRenameTables) && diff.OldSchemaID != diff.SchemaID { + oldRoDBInfo, ok := b.is.SchemaByID(diff.OldSchemaID) + if !ok { + return nil, ErrDatabaseNotExists.GenWithStackByArgs( + fmt.Sprintf("(Schema ID %d)", diff.OldSchemaID), + ) } + oldDBInfo := b.copySchemaTables(oldRoDBInfo.Name.L) + tmpIDs = b.applyDropTable(oldDBInfo, oldTableID, tmpIDs) + } else { + tmpIDs = b.applyDropTable(dbInfo, oldTableID, tmpIDs) } - if tableIDIsValid(newTableID) { - // All types except DropTableOrView. - var err error - tblIDs, err = b.applyCreateTable(m, dbInfo, newTableID, allocs, diff.Type, tblIDs) - if err != nil { - return nil, errors.Trace(err) - } + + if oldTableID != newTableID { + // Update tblIDs only when oldTableID != newTableID because applyCreateTable() also updates tblIDs. + tblIDs = tmpIDs } - if diff.AffectedOpts != nil { - for _, opt := range diff.AffectedOpts { - switch diff.Type { - case model.ActionAlterTableAlterPartition: - partitionID := opt.TableID - // TODO: enhancement: If the leader Placement Policy isn't updated, maybe we can omit the diff. - return []int64{partitionID}, b.applyPlacementUpdate(placement.GroupID(partitionID)) - case model.ActionTruncateTablePartition: - // Reduce the impact on DML when executing partition DDL. eg. - // While session 1 performs the DML operation associated with partition 1, - // the TRUNCATE operation of session 2 on partition 2 does not cause the operation of session 1 to fail. - tblIDs = append(tblIDs, opt.OldTableID) - b.applyPlacementDelete(placement.GroupID(opt.OldTableID)) - err := b.applyPlacementUpdate(placement.GroupID(opt.TableID)) - if err != nil { - return nil, errors.Trace(err) - } - continue - case model.ActionDropTable, model.ActionDropTablePartition: - b.applyPlacementDelete(placement.GroupID(opt.OldTableID)) - continue - case model.ActionTruncateTable: - b.applyPlacementDelete(placement.GroupID(opt.OldTableID)) - err := b.applyPlacementUpdate(placement.GroupID(opt.TableID)) - if err != nil { - return nil, errors.Trace(err) - } - continue - case model.ActionRecoverTable: - err := b.applyPlacementUpdate(placement.GroupID(opt.TableID)) - if err != nil { - return nil, errors.Trace(err) - } - continue + } + if tableIDIsValid(newTableID) { + // All types except DropTableOrView. + var err error + tblIDs, err = b.applyCreateTable(m, dbInfo, newTableID, allocs, diff.Type, tblIDs) + if err != nil { + return nil, errors.Trace(err) + } + } + if diff.AffectedOpts != nil { + for _, opt := range diff.AffectedOpts { + switch diff.Type { + case model.ActionTruncateTablePartition: + // Reduce the impact on DML when executing partition DDL. eg. + // While session 1 performs the DML operation associated with partition 1, + // the TRUNCATE operation of session 2 on partition 2 does not cause the operation of session 1 to fail. + tblIDs = append(tblIDs, opt.OldTableID) + b.applyPlacementDelete(placement.GroupID(opt.OldTableID)) + err := b.applyPlacementUpdate(placement.GroupID(opt.TableID)) + if err != nil { + return nil, errors.Trace(err) } - var err error - affectedDiff := &model.SchemaDiff{ - Version: diff.Version, - Type: diff.Type, - SchemaID: opt.SchemaID, - TableID: opt.TableID, - OldSchemaID: opt.OldSchemaID, - OldTableID: opt.OldTableID, + continue + case model.ActionDropTable, model.ActionDropTablePartition: + b.applyPlacementDelete(placement.GroupID(opt.OldTableID)) + continue + case model.ActionTruncateTable: + b.applyPlacementDelete(placement.GroupID(opt.OldTableID)) + err := b.applyPlacementUpdate(placement.GroupID(opt.TableID)) + if err != nil { + return nil, errors.Trace(err) } - affectedIDs, err := b.ApplyDiff(m, affectedDiff) + continue + case model.ActionRecoverTable: + err := b.applyPlacementUpdate(placement.GroupID(opt.TableID)) if err != nil { return nil, errors.Trace(err) } - tblIDs = append(tblIDs, affectedIDs...) + continue } - } else { - switch diff.Type { - case model.ActionAlterTableAlterPartition: - // If there is no AffectedOpts, It means the job is in Public -> GlobalTxnState phase - return []int64{}, nil + var err error + affectedDiff := &model.SchemaDiff{ + Version: diff.Version, + Type: diff.Type, + SchemaID: opt.SchemaID, + TableID: opt.TableID, + OldSchemaID: opt.OldSchemaID, + OldTableID: opt.OldTableID, + } + affectedIDs, err := b.ApplyDiff(m, affectedDiff) + if err != nil { + return nil, errors.Trace(err) } + tblIDs = append(tblIDs, affectedIDs...) } - return tblIDs, nil } + return tblIDs, nil } func filterAllocators(diff *model.SchemaDiff, oldAllocs autoid.Allocators) autoid.Allocators { @@ -469,7 +477,7 @@ func (b *Builder) applyCreateTable(m *meta.Meta, dbInfo *model.DBInfo, tableID i } } } - tbl, err := tables.TableFromMeta(allocs, tblInfo) + tbl, err := b.tableFromMeta(allocs, tblInfo) if err != nil { return nil, errors.Trace(err) } @@ -632,7 +640,7 @@ func (b *Builder) InitWithDBInfos(dbInfos []*model.DBInfo, bundles []*placement. } for _, di := range dbInfos { - err := b.createSchemaTablesForDB(di, tables.TableFromMeta) + err := b.createSchemaTablesForDB(di, b.tableFromMeta) if err != nil { return nil, errors.Trace(err) } @@ -653,6 +661,26 @@ func (b *Builder) InitWithDBInfos(dbInfos []*model.DBInfo, bundles []*placement. return b, nil } +func (b *Builder) tableFromMeta(alloc autoid.Allocators, tblInfo *model.TableInfo) (table.Table, error) { + ret, err := tables.TableFromMeta(alloc, tblInfo) + if err != nil { + return nil, errors.Trace(err) + } + if t, ok := ret.(table.CachedTable); ok { + var tmp pools.Resource + tmp, err = b.factory() + if err != nil { + return nil, errors.Trace(err) + } + + err = t.Init(b.renewLeaseCh, tmp.(sqlexec.SQLExecutor)) + if err != nil { + return nil, errors.Trace(err) + } + } + return ret, nil +} + type tableFromMetaFunc func(alloc autoid.Allocators, tblInfo *model.TableInfo) (table.Table, error) func (b *Builder) createSchemaTablesForDB(di *model.DBInfo, tableFromMeta tableFromMetaFunc) error { @@ -689,7 +717,7 @@ func RegisterVirtualTable(dbInfo *model.DBInfo, tableFromMeta tableFromMetaFunc) } // NewBuilder creates a new Builder with a Handle. -func NewBuilder(store kv.Storage) *Builder { +func NewBuilder(store kv.Storage, renewCh chan func(), factory func() (pools.Resource, error)) *Builder { return &Builder{ store: store, is: &infoSchema{ @@ -698,6 +726,8 @@ func NewBuilder(store kv.Storage) *Builder { ruleBundleMap: map[string]*placement.Bundle{}, sortedTablesBuckets: make([]sortedTables, bucketCount), }, + renewLeaseCh: renewCh, + factory: factory, } } diff --git a/infoschema/cache_test.go b/infoschema/cache_test.go index cf86191ab4d30..977b9906c34b9 100644 --- a/infoschema/cache_test.go +++ b/infoschema/cache_test.go @@ -22,15 +22,11 @@ import ( ) func TestNewCache(t *testing.T) { - t.Parallel() - ic := infoschema.NewCache(16) require.NotNil(t, ic) } func TestInsert(t *testing.T) { - t.Parallel() - ic := infoschema.NewCache(3) require.NotNil(t, ic) @@ -101,8 +97,6 @@ func TestInsert(t *testing.T) { } func TestGetByVersion(t *testing.T) { - t.Parallel() - ic := infoschema.NewCache(2) require.NotNil(t, ic) is1 := infoschema.MockInfoSchemaWithSchemaVer(nil, 1) @@ -118,8 +112,6 @@ func TestGetByVersion(t *testing.T) { } func TestGetLatest(t *testing.T) { - t.Parallel() - ic := infoschema.NewCache(16) require.NotNil(t, ic) require.Nil(t, ic.GetLatest()) diff --git a/infoschema/cluster_tables_serial_test.go b/infoschema/cluster_tables_serial_test.go index ab4e54f86d911..d48fb494133e3 100644 --- a/infoschema/cluster_tables_serial_test.go +++ b/infoschema/cluster_tables_serial_test.go @@ -43,6 +43,7 @@ import ( "github.com/pingcap/tidb/util/resourcegrouptag" "github.com/pingcap/tidb/util/set" "github.com/pingcap/tidb/util/testutil" + "github.com/pingcap/tipb/go-tipb" "github.com/stretchr/testify/require" "google.golang.org/grpc" ) @@ -96,11 +97,11 @@ func SubTestForClusterServerInfo(s *clusterTablesSuite) func(*testing.T) { defer func() { require.NoError(t, failpoint.Disable(fpName)) }() cases := []struct { - sql string - types set.StringSet - addrs set.StringSet - names set.StringSet - skipOnOS string + sql string + types set.StringSet + addrs set.StringSet + names set.StringSet + skipOnDist set.StringSet }{ { sql: "select * from information_schema.CLUSTER_LOAD;", @@ -114,7 +115,8 @@ func SubTestForClusterServerInfo(s *clusterTablesSuite) func(*testing.T) { addrs: set.NewStringSet(s.listenAddr), names: set.NewStringSet("cpu", "memory", "net", "disk"), // The sysutil package will filter out all disk don't have /dev prefix. - skipOnOS: "windows", + // gopsutil cpu.Info will fail on mac M1 + skipOnDist: set.NewStringSet("windows", "darwin/arm64"), }, { sql: "select * from information_schema.CLUSTER_SYSTEMINFO;", @@ -125,12 +127,12 @@ func SubTestForClusterServerInfo(s *clusterTablesSuite) func(*testing.T) { // Because the underlying implementation use `sysctl` command to get the result // and there is no such command on windows. // https://github.com/pingcap/sysutil/blob/2bfa6dc40bcd4c103bf684fba528ae4279c7ec9f/system_info.go#L50 - skipOnOS: "windows", + skipOnDist: set.NewStringSet("windows"), }, } for _, cas := range cases { - if cas.skipOnOS == runtime.GOOS { + if cas.skipOnDist.Exist(runtime.GOOS+"/"+runtime.GOARCH) || cas.skipOnDist.Exist(runtime.GOOS) { continue } @@ -160,10 +162,10 @@ func SubTestTestDataLockWaits(s *clusterTablesSuite) func(*testing.T) { _, digest1 := parser.NormalizeDigest("select * from test_data_lock_waits for update") _, digest2 := parser.NormalizeDigest("update test_data_lock_waits set f1=1 where id=2") s.store.(mockstorage.MockLockWaitSetter).SetMockLockWaits([]*deadlock.WaitForEntry{ - {Txn: 1, WaitForTxn: 2, Key: []byte("key1"), ResourceGroupTag: resourcegrouptag.EncodeResourceGroupTag(digest1, nil)}, - {Txn: 3, WaitForTxn: 4, Key: []byte("key2"), ResourceGroupTag: resourcegrouptag.EncodeResourceGroupTag(digest2, nil)}, + {Txn: 1, WaitForTxn: 2, Key: []byte("key1"), ResourceGroupTag: resourcegrouptag.EncodeResourceGroupTag(digest1, nil, tipb.ResourceGroupTagLabel_ResourceGroupTagLabelUnknown)}, + {Txn: 3, WaitForTxn: 4, Key: []byte("key2"), ResourceGroupTag: resourcegrouptag.EncodeResourceGroupTag(digest2, nil, tipb.ResourceGroupTagLabel_ResourceGroupTagLabelUnknown)}, // Invalid digests - {Txn: 5, WaitForTxn: 6, Key: []byte("key3"), ResourceGroupTag: resourcegrouptag.EncodeResourceGroupTag(nil, nil)}, + {Txn: 5, WaitForTxn: 6, Key: []byte("key3"), ResourceGroupTag: resourcegrouptag.EncodeResourceGroupTag(nil, nil, tipb.ResourceGroupTagLabel_ResourceGroupTagLabelUnknown)}, {Txn: 7, WaitForTxn: 8, Key: []byte("key4"), ResourceGroupTag: []byte("asdfghjkl")}, }) @@ -539,12 +541,13 @@ func (s *clusterTablesSuite) setUpMockPDHTTPServer() (*httptest.Server, string) }, nil })) // mock PD API - router.Handle(pdapi.ClusterVersion, fn.Wrap(func() (string, error) { return "4.0.0-alpha", nil })) router.Handle(pdapi.Status, fn.Wrap(func() (interface{}, error) { return struct { + Version string `json:"version"` GitHash string `json:"git_hash"` StartTimestamp int64 `json:"start_timestamp"` }{ + Version: "4.0.0-alpha", GitHash: "mock-pd-githash", StartTimestamp: s.startTime.Unix(), }, nil diff --git a/infoschema/infoschema.go b/infoschema/infoschema.go index ce38ba18559b9..86dbc555996d8 100644 --- a/infoschema/infoschema.go +++ b/infoschema/infoschema.go @@ -457,20 +457,19 @@ func GetBundle(h InfoSchema, ids []int64) *placement.Bundle { return &placement.Bundle{ID: placement.GroupID(id), Rules: newRules} } -type schemaLocalTempSchemaTables struct { - tables map[string]table.Table -} - // LocalTemporaryTables store local temporary tables type LocalTemporaryTables struct { - schemaMap map[string]*schemaLocalTempSchemaTables + // Local temporary tables can be accessed after the db is dropped, so there needs a way to retain the DBInfo. + // schemaTables.dbInfo will only be used when the db is dropped and it may be stale after the db is created again. + // But it's fine because we only need its name. + schemaMap map[string]*schemaTables idx2table map[int64]table.Table } // NewLocalTemporaryTables creates a new NewLocalTemporaryTables object func NewLocalTemporaryTables() *LocalTemporaryTables { return &LocalTemporaryTables{ - schemaMap: make(map[string]*schemaLocalTempSchemaTables), + schemaMap: make(map[string]*schemaTables), idx2table: make(map[int64]table.Table), } } @@ -498,8 +497,8 @@ func (is *LocalTemporaryTables) TableByID(id int64) (tbl table.Table, ok bool) { } // AddTable add a table -func (is *LocalTemporaryTables) AddTable(schema model.CIStr, tbl table.Table) error { - schemaTables := is.ensureSchema(schema) +func (is *LocalTemporaryTables) AddTable(db *model.DBInfo, tbl table.Table) error { + schemaTables := is.ensureSchema(db) tblMeta := tbl.Meta() if _, ok := schemaTables.tables[tblMeta.Name.L]; ok { @@ -530,37 +529,40 @@ func (is *LocalTemporaryTables) RemoveTable(schema, table model.CIStr) (exist bo delete(tbls.tables, table.L) delete(is.idx2table, oldTable.Meta().ID) + if len(tbls.tables) == 0 { + delete(is.schemaMap, schema.L) + } return true } // SchemaByTable get a table's schema name -func (is *LocalTemporaryTables) SchemaByTable(tableInfo *model.TableInfo) (string, bool) { +func (is *LocalTemporaryTables) SchemaByTable(tableInfo *model.TableInfo) (*model.DBInfo, bool) { if tableInfo == nil { - return "", false + return nil, false } - for schema, v := range is.schemaMap { + for _, v := range is.schemaMap { if tbl, ok := v.tables[tableInfo.Name.L]; ok { if tbl.Meta().ID == tableInfo.ID { - return schema, true + return v.dbInfo, true } } } - return "", false + return nil, false } -func (is *LocalTemporaryTables) ensureSchema(schema model.CIStr) *schemaLocalTempSchemaTables { - if tbls, ok := is.schemaMap[schema.L]; ok { +func (is *LocalTemporaryTables) ensureSchema(db *model.DBInfo) *schemaTables { + if tbls, ok := is.schemaMap[db.Name.L]; ok { return tbls } - tbls := &schemaLocalTempSchemaTables{tables: make(map[string]table.Table)} - is.schemaMap[schema.L] = tbls + tbls := &schemaTables{dbInfo: db, tables: make(map[string]table.Table)} + is.schemaMap[db.Name.L] = tbls return tbls } -func (is *LocalTemporaryTables) schemaTables(schema model.CIStr) *schemaLocalTempSchemaTables { +func (is *LocalTemporaryTables) schemaTables(schema model.CIStr) *schemaTables { if is.schemaMap == nil { return nil } @@ -574,8 +576,7 @@ func (is *LocalTemporaryTables) schemaTables(schema model.CIStr) *schemaLocalTem // TemporaryTableAttachedInfoSchema implements InfoSchema // Local temporary table has a loose relationship with database. -// So when a database is dropped, its temporary tables still exist and can be return by TableByName/TableByID. -// However SchemaByTable will return nil if database is dropped. +// So when a database is dropped, its temporary tables still exist and can be returned by TableByName/TableByID. type TemporaryTableAttachedInfoSchema struct { InfoSchema LocalTemporaryTables *LocalTemporaryTables @@ -599,14 +600,14 @@ func (ts *TemporaryTableAttachedInfoSchema) TableByID(id int64) (table.Table, bo return ts.InfoSchema.TableByID(id) } -// SchemaByTable implements InfoSchema.SchemaByTable +// SchemaByTable implements InfoSchema.SchemaByTable, it returns a stale DBInfo even if it's dropped. func (ts *TemporaryTableAttachedInfoSchema) SchemaByTable(tableInfo *model.TableInfo) (*model.DBInfo, bool) { if tableInfo == nil { return nil, false } - if schemaName, ok := ts.LocalTemporaryTables.SchemaByTable(tableInfo); ok { - return ts.SchemaByName(model.NewCIStr(schemaName)) + if db, ok := ts.LocalTemporaryTables.SchemaByTable(tableInfo); ok { + return db, true } return ts.InfoSchema.SchemaByTable(tableInfo) diff --git a/infoschema/infoschema_test.go b/infoschema/infoschema_test.go index aba6617de3930..f3adc34ed7a15 100644 --- a/infoschema/infoschema_test.go +++ b/infoschema/infoschema_test.go @@ -38,8 +38,6 @@ import ( ) func TestBasic(t *testing.T) { - t.Parallel() - store, err := mockstore.NewMockStore() require.NoError(t, err) defer func() { @@ -109,7 +107,7 @@ func TestBasic(t *testing.T) { }) require.NoError(t, err) - builder, err := infoschema.NewBuilder(dom.Store()).InitWithDBInfos(dbInfos, nil, nil, 1) + builder, err := infoschema.NewBuilder(dom.Store(), nil, nil).InitWithDBInfos(dbInfos, nil, nil, 1) require.NoError(t, err) txn, err := store.Begin() @@ -212,8 +210,6 @@ func TestBasic(t *testing.T) { } func TestMockInfoSchema(t *testing.T) { - t.Parallel() - tblID := int64(1234) tblName := model.NewCIStr("tbl_m") tableInfo := &model.TableInfo{ @@ -250,8 +246,6 @@ func checkApplyCreateNonExistsTableDoesNotPanic(t *testing.T, txn kv.Transaction // TestInfoTables makes sure that all tables of information_schema could be found in infoschema handle. func TestInfoTables(t *testing.T) { - t.Parallel() - store, err := mockstore.NewMockStore() require.NoError(t, err) defer func() { @@ -259,7 +253,7 @@ func TestInfoTables(t *testing.T) { require.NoError(t, err) }() - builder, err := infoschema.NewBuilder(store).InitWithDBInfos(nil, nil, nil, 0) + builder, err := infoschema.NewBuilder(store, nil, nil).InitWithDBInfos(nil, nil, nil, 0) require.NoError(t, err) is := builder.Build() @@ -317,8 +311,6 @@ func genGlobalID(store kv.Storage) (int64, error) { } func TestGetBundle(t *testing.T) { - t.Parallel() - store, err := mockstore.NewMockStore() require.NoError(t, err) defer func() { @@ -326,7 +318,7 @@ func TestGetBundle(t *testing.T) { require.NoError(t, err) }() - builder, err := infoschema.NewBuilder(store).InitWithDBInfos(nil, nil, nil, 0) + builder, err := infoschema.NewBuilder(store, nil, nil).InitWithDBInfos(nil, nil, nil, 0) require.NoError(t, err) is := builder.Build() @@ -394,8 +386,6 @@ func TestGetBundle(t *testing.T) { } func TestLocalTemporaryTables(t *testing.T) { - t.Parallel() - store, err := mockstore.NewMockStore() require.NoError(t, err) defer func() { @@ -474,15 +464,15 @@ func TestLocalTemporaryTables(t *testing.T) { } } - assertSchemaByTable := func(sc *infoschema.LocalTemporaryTables, schema model.CIStr, tb *model.TableInfo) { + assertSchemaByTable := func(sc *infoschema.LocalTemporaryTables, db *model.DBInfo, tb *model.TableInfo) { got, ok := sc.SchemaByTable(tb) - if tb == nil { - require.True(t, schema.L == "") - require.Equal(t, "", got) + if db == nil { + require.Nil(t, got) require.False(t, ok) } else { - require.Equal(t, schema.L != "", ok) - require.Equal(t, got, schema.L) + require.NotNil(t, got) + require.Equal(t, db.Name.L, got.Name.L) + require.True(t, ok) } } @@ -513,7 +503,7 @@ func TestLocalTemporaryTables(t *testing.T) { } for _, p := range prepareTables { - err = sc.AddTable(p.db.Name, p.tb) + err = sc.AddTable(p.db, p.tb) require.NoError(t, err) } @@ -541,20 +531,20 @@ func TestLocalTemporaryTables(t *testing.T) { ) assertTableByID(sc, p.tb.Meta().ID, p.db, p.tb) - assertSchemaByTable(sc, p.db.Name, p.tb.Meta()) + assertSchemaByTable(sc, p.db, p.tb.Meta()) } // test add dup table - err = sc.AddTable(db1.Name, tb11) + err = sc.AddTable(db1, tb11) require.True(t, infoschema.ErrTableExists.Equal(err)) - err = sc.AddTable(db1b.Name, tb15) + err = sc.AddTable(db1b, tb15) require.True(t, infoschema.ErrTableExists.Equal(err)) - err = sc.AddTable(db1b.Name, tb11) + err = sc.AddTable(db1b, tb11) require.True(t, infoschema.ErrTableExists.Equal(err)) db1c := createNewSchemaInfo("db1") - err = sc.AddTable(db1c.Name, createNewTable(db1c.ID, "tb1", model.TempTableLocal)) + err = sc.AddTable(db1c, createNewTable(db1c.ID, "tb1", model.TempTableLocal)) require.True(t, infoschema.ErrTableExists.Equal(err)) - err = sc.AddTable(db1b.Name, tb11) + err = sc.AddTable(db1b, tb11) require.True(t, infoschema.ErrTableExists.Equal(err)) // failed add has no effect @@ -585,22 +575,23 @@ func TestLocalTemporaryTables(t *testing.T) { } // test non exist table schemaByTable - assertSchemaByTable(sc, model.NewCIStr(""), tb11.Meta()) - assertSchemaByTable(sc, model.NewCIStr(""), tb22.Meta()) - assertSchemaByTable(sc, model.NewCIStr(""), nil) + assertSchemaByTable(sc, nil, tb11.Meta()) + assertSchemaByTable(sc, nil, tb22.Meta()) + assertSchemaByTable(sc, nil, nil) // test TemporaryTableAttachedInfoSchema dbTest := createNewSchemaInfo("test") tmpTbTestA := createNewTable(dbTest.ID, "tba", model.TempTableLocal) normalTbTestA := createNewTable(dbTest.ID, "tba", model.TempTableNone) normalTbTestB := createNewTable(dbTest.ID, "tbb", model.TempTableNone) + normalTbTestC := createNewTable(db1.ID, "tbc", model.TempTableNone) is := &infoschema.TemporaryTableAttachedInfoSchema{ InfoSchema: infoschema.MockInfoSchema([]*model.TableInfo{normalTbTestA.Meta(), normalTbTestB.Meta()}), LocalTemporaryTables: sc, } - err = sc.AddTable(dbTest.Name, tmpTbTestA) + err = sc.AddTable(dbTest, tmpTbTestA) require.NoError(t, err) // test TableByName @@ -641,7 +632,16 @@ func TestLocalTemporaryTables(t *testing.T) { info, ok = is.SchemaByTable(tmpTbTestA.Meta()) require.True(t, ok) require.Equal(t, dbTest.Name.L, info.Name.L) + // SchemaByTable also returns DBInfo when the schema is not in the infoSchema but the table is an existing tmp table. info, ok = is.SchemaByTable(tb12.Meta()) + require.True(t, ok) + require.Equal(t, db1.Name.L, info.Name.L) + // SchemaByTable returns nil when the schema is not in the infoSchema and the table is an non-existing normal table. + info, ok = is.SchemaByTable(normalTbTestC.Meta()) + require.False(t, ok) + require.Nil(t, info) + // SchemaByTable returns nil when the schema is not in the infoSchema and the table is an non-existing tmp table. + info, ok = is.SchemaByTable(tb22.Meta()) require.False(t, ok) require.Nil(t, info) } diff --git a/infoschema/metrics_schema_test.go b/infoschema/metrics_schema_test.go index 2e12a7894651f..0cb1554f2e3ca 100644 --- a/infoschema/metrics_schema_test.go +++ b/infoschema/metrics_schema_test.go @@ -24,8 +24,6 @@ import ( ) func TestMetricSchemaDef(t *testing.T) { - t.Parallel() - for name, def := range infoschema.MetricTableMap { if strings.Contains(def.PromQL, "$QUANTILE") || strings.Contains(def.PromQL, "histogram_quantile") { require.Greaterf(t, def.Quantile, float64(0), "the quantile of metric table %v should > 0", name) diff --git a/infoschema/perfschema/tables_serial_test.go b/infoschema/perfschema/tables_serial_test.go new file mode 100644 index 0000000000000..f8126a57b2b7c --- /dev/null +++ b/infoschema/perfschema/tables_serial_test.go @@ -0,0 +1,159 @@ +// Copyright 2021 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, +// 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. + +package perfschema_test + +import ( + "fmt" + "io" + "net/http" + "net/http/httptest" + "os" + "path/filepath" + "runtime/pprof" + "strings" + "testing" + + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/parser/terror" + "github.com/pingcap/tidb/testkit" + "github.com/stretchr/testify/require" +) + +func TestTiKVProfileCPU(t *testing.T) { + store, clean := newMockStore(t) + defer clean() + + router := http.NewServeMux() + mockServer := httptest.NewServer(router) + mockAddr := strings.TrimPrefix(mockServer.URL, "http://") + defer mockServer.Close() + + // mock tikv profile + copyHandler := func(filename string) http.HandlerFunc { + return func(w http.ResponseWriter, _ *http.Request) { + file, err := os.Open(filepath.Join(currentSourceDir(), filename)) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + defer func() { terror.Log(file.Close()) }() + _, err = io.Copy(w, file) + terror.Log(err) + } + } + router.HandleFunc("/debug/pprof/profile", copyHandler("testdata/tikv.cpu.profile")) + + // failpoint setting + servers := []string{ + strings.Join([]string{"tikv", mockAddr, mockAddr}, ","), + strings.Join([]string{"pd", mockAddr, mockAddr}, ","), + } + fpExpr := strings.Join(servers, ";") + fpName := "github.com/pingcap/tidb/infoschema/perfschema/mockRemoteNodeStatusAddress" + require.NoError(t, failpoint.Enable(fpName, fmt.Sprintf(`return("%s")`, fpExpr))) + defer func() { require.NoError(t, failpoint.Disable(fpName)) }() + + tk := testkit.NewTestKit(t, store) + + tk.MustExec("use performance_schema") + result := tk.MustQuery("select function, percent_abs, percent_rel from tikv_profile_cpu where depth < 3") + + warnings := tk.Session().GetSessionVars().StmtCtx.GetWarnings() + require.Lenf(t, warnings, 0, "expect no warnings, but found: %+v", warnings) + + result.Check(testkit.Rows( + "root 100% 100%", + "├─tikv::server::load_statistics::linux::ThreadLoadStatistics::record::h59facb8d680e7794 75.00% 75.00%", + "│ └─procinfo::pid::stat::stat_task::h69e1aa2c331aebb6 75.00% 100%", + "├─nom::nom::digit::h905aaaeff7d8ec8e 16.07% 16.07%", + "│ ├─<core::iter::adapters::Enumerate<I> as core::iter::traits::iterator::Iterator>::next::h16936f9061bb75e4 6.25% 38.89%", + "│ ├─Unknown 3.57% 22.22%", + "│ ├─<&u8 as nom::traits::AsChar>::is_dec_digit::he9eacc3fad26ab81 2.68% 16.67%", + "│ ├─<&[u8] as nom::traits::InputIter>::iter_indices::h6192338433683bff 1.79% 11.11%", + "│ └─<&[T] as nom::traits::Slice<core::ops::range::RangeFrom<usize>>>::slice::h38d31f11f84aa302 1.79% 11.11%", + "├─<jemallocator::Jemalloc as core::alloc::GlobalAlloc>::realloc::h5199c50710ab6f9d 1.79% 1.79%", + "│ └─rallocx 1.79% 100%", + "├─<jemallocator::Jemalloc as core::alloc::GlobalAlloc>::dealloc::hea83459aa98dd2dc 1.79% 1.79%", + "│ └─sdallocx 1.79% 100%", + "├─<jemallocator::Jemalloc as core::alloc::GlobalAlloc>::alloc::hc7962e02169a5c56 0.89% 0.89%", + "│ └─mallocx 0.89% 100%", + "├─engine::rocks::util::engine_metrics::flush_engine_iostall_properties::h64a7661c95aa1db7 0.89% 0.89%", + "│ └─rocksdb::rocksdb::DB::get_map_property_cf::h9722f9040411af44 0.89% 100%", + "├─core::ptr::real_drop_in_place::h8def0d99e7136f33 0.89% 0.89%", + "│ └─<alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop::h9b59b303bffde02c 0.89% 100%", + "├─tikv_util::metrics::threads_linux::ThreadInfoStatistics::record::ha8cc290b3f46af88 0.89% 0.89%", + "│ └─procinfo::pid::stat::stat_task::h69e1aa2c331aebb6 0.89% 100%", + "├─crossbeam_utils::backoff::Backoff::snooze::h5c121ef4ce616a3c 0.89% 0.89%", + "│ └─core::iter::range::<impl core::iter::traits::iterator::Iterator for core::ops::range::Range<A>>::next::hdb23ceb766e7a91f 0.89% 100%", + "└─<hashbrown::raw::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next::he129c78b3deb639d 0.89% 0.89%", + " └─Unknown 0.89% 100%")) + + // We can use current processe profile to mock profile of PD because the PD has the + // same way of retrieving profile with TiDB. And the purpose of this test case is used + // to make sure all profile HTTP API have been accessed. + accessed := map[string]struct{}{} + handlerFactory := func(name string, debug ...int) func(w http.ResponseWriter, _ *http.Request) { + debugLevel := 0 + if len(debug) > 0 { + debugLevel = debug[0] + } + return func(w http.ResponseWriter, _ *http.Request) { + profile := pprof.Lookup(name) + if profile == nil { + http.Error(w, fmt.Sprintf("profile %s not found", name), http.StatusBadRequest) + return + } + if err := profile.WriteTo(w, debugLevel); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + accessed[name] = struct{}{} + } + } + + // mock PD profile + router.HandleFunc("/pd/api/v1/debug/pprof/profile", copyHandler("../../util/profile/testdata/test.pprof")) + router.HandleFunc("/pd/api/v1/debug/pprof/heap", handlerFactory("heap")) + router.HandleFunc("/pd/api/v1/debug/pprof/mutex", handlerFactory("mutex")) + router.HandleFunc("/pd/api/v1/debug/pprof/allocs", handlerFactory("allocs")) + router.HandleFunc("/pd/api/v1/debug/pprof/block", handlerFactory("block")) + router.HandleFunc("/pd/api/v1/debug/pprof/goroutine", handlerFactory("goroutine", 2)) + + tk.MustQuery("select * from pd_profile_cpu where depth < 3") + warnings = tk.Session().GetSessionVars().StmtCtx.GetWarnings() + require.Lenf(t, warnings, 0, "expect no warnings, but found: %+v", warnings) + + tk.MustQuery("select * from pd_profile_memory where depth < 3") + warnings = tk.Session().GetSessionVars().StmtCtx.GetWarnings() + require.Lenf(t, warnings, 0, "expect no warnings, but found: %+v", warnings) + + tk.MustQuery("select * from pd_profile_mutex where depth < 3") + warnings = tk.Session().GetSessionVars().StmtCtx.GetWarnings() + require.Lenf(t, warnings, 0, "expect no warnings, but found: %+v", warnings) + + tk.MustQuery("select * from pd_profile_allocs where depth < 3") + warnings = tk.Session().GetSessionVars().StmtCtx.GetWarnings() + require.Lenf(t, warnings, 0, "expect no warnings, but found: %+v", warnings) + + tk.MustQuery("select * from pd_profile_block where depth < 3") + warnings = tk.Session().GetSessionVars().StmtCtx.GetWarnings() + require.Lenf(t, warnings, 0, "expect no warnings, but found: %+v", warnings) + + tk.MustQuery("select * from pd_profile_goroutines") + warnings = tk.Session().GetSessionVars().StmtCtx.GetWarnings() + require.Lenf(t, warnings, 0, "expect no warnings, but found: %+v", warnings) + + require.Lenf(t, accessed, 5, "expect all HTTP API had been accessed, but found: %v", accessed) +} diff --git a/infoschema/perfschema/tables_test.go b/infoschema/perfschema/tables_test.go index 981243e663260..be739a5b6af48 100644 --- a/infoschema/perfschema/tables_test.go +++ b/infoschema/perfschema/tables_test.go @@ -15,21 +15,12 @@ package perfschema_test import ( - "fmt" - "io" - "net/http" - "net/http/httptest" - "os" "path/filepath" "runtime" - "runtime/pprof" - "strings" "testing" - "github.com/pingcap/failpoint" "github.com/pingcap/tidb/infoschema/perfschema" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/testkit" @@ -37,14 +28,11 @@ import ( ) func TestPredefinedTables(t *testing.T) { - t.Parallel() require.True(t, perfschema.IsPredefinedTable("EVENTS_statements_summary_by_digest")) require.False(t, perfschema.IsPredefinedTable("statements")) } func TestPerfSchemaTables(t *testing.T) { - t.Parallel() - store, clean := newMockStore(t) defer clean() tk := testkit.NewTestKit(t, store) @@ -56,135 +44,6 @@ func TestPerfSchemaTables(t *testing.T) { tk.MustQuery("select * from events_stages_history_long").Check(testkit.Rows()) } -func TestTiKVProfileCPU(t *testing.T) { - t.Parallel() - - store, clean := newMockStore(t) - defer clean() - - router := http.NewServeMux() - mockServer := httptest.NewServer(router) - mockAddr := strings.TrimPrefix(mockServer.URL, "http://") - defer mockServer.Close() - - // mock tikv profile - copyHandler := func(filename string) http.HandlerFunc { - return func(w http.ResponseWriter, _ *http.Request) { - file, err := os.Open(filepath.Join(currentSourceDir(), filename)) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - defer func() { terror.Log(file.Close()) }() - _, err = io.Copy(w, file) - terror.Log(err) - } - } - router.HandleFunc("/debug/pprof/profile", copyHandler("testdata/tikv.cpu.profile")) - - // failpoint setting - servers := []string{ - strings.Join([]string{"tikv", mockAddr, mockAddr}, ","), - strings.Join([]string{"pd", mockAddr, mockAddr}, ","), - } - fpExpr := strings.Join(servers, ";") - fpName := "github.com/pingcap/tidb/infoschema/perfschema/mockRemoteNodeStatusAddress" - require.NoError(t, failpoint.Enable(fpName, fmt.Sprintf(`return("%s")`, fpExpr))) - defer func() { require.NoError(t, failpoint.Disable(fpName)) }() - - tk := testkit.NewTestKit(t, store) - - tk.MustExec("use performance_schema") - result := tk.MustQuery("select function, percent_abs, percent_rel from tikv_profile_cpu where depth < 3") - - warnings := tk.Session().GetSessionVars().StmtCtx.GetWarnings() - require.Lenf(t, warnings, 0, "expect no warnings, but found: %+v", warnings) - - result.Check(testkit.Rows( - "root 100% 100%", - "├─tikv::server::load_statistics::linux::ThreadLoadStatistics::record::h59facb8d680e7794 75.00% 75.00%", - "│ └─procinfo::pid::stat::stat_task::h69e1aa2c331aebb6 75.00% 100%", - "├─nom::nom::digit::h905aaaeff7d8ec8e 16.07% 16.07%", - "│ ├─<core::iter::adapters::Enumerate<I> as core::iter::traits::iterator::Iterator>::next::h16936f9061bb75e4 6.25% 38.89%", - "│ ├─Unknown 3.57% 22.22%", - "│ ├─<&u8 as nom::traits::AsChar>::is_dec_digit::he9eacc3fad26ab81 2.68% 16.67%", - "│ ├─<&[u8] as nom::traits::InputIter>::iter_indices::h6192338433683bff 1.79% 11.11%", - "│ └─<&[T] as nom::traits::Slice<core::ops::range::RangeFrom<usize>>>::slice::h38d31f11f84aa302 1.79% 11.11%", - "├─<jemallocator::Jemalloc as core::alloc::GlobalAlloc>::realloc::h5199c50710ab6f9d 1.79% 1.79%", - "│ └─rallocx 1.79% 100%", - "├─<jemallocator::Jemalloc as core::alloc::GlobalAlloc>::dealloc::hea83459aa98dd2dc 1.79% 1.79%", - "│ └─sdallocx 1.79% 100%", - "├─<jemallocator::Jemalloc as core::alloc::GlobalAlloc>::alloc::hc7962e02169a5c56 0.89% 0.89%", - "│ └─mallocx 0.89% 100%", - "├─engine::rocks::util::engine_metrics::flush_engine_iostall_properties::h64a7661c95aa1db7 0.89% 0.89%", - "│ └─rocksdb::rocksdb::DB::get_map_property_cf::h9722f9040411af44 0.89% 100%", - "├─core::ptr::real_drop_in_place::h8def0d99e7136f33 0.89% 0.89%", - "│ └─<alloc::raw_vec::RawVec<T,A> as core::ops::drop::Drop>::drop::h9b59b303bffde02c 0.89% 100%", - "├─tikv_util::metrics::threads_linux::ThreadInfoStatistics::record::ha8cc290b3f46af88 0.89% 0.89%", - "│ └─procinfo::pid::stat::stat_task::h69e1aa2c331aebb6 0.89% 100%", - "├─crossbeam_utils::backoff::Backoff::snooze::h5c121ef4ce616a3c 0.89% 0.89%", - "│ └─core::iter::range::<impl core::iter::traits::iterator::Iterator for core::ops::range::Range<A>>::next::hdb23ceb766e7a91f 0.89% 100%", - "└─<hashbrown::raw::bitmask::BitMaskIter as core::iter::traits::iterator::Iterator>::next::he129c78b3deb639d 0.89% 0.89%", - " └─Unknown 0.89% 100%")) - - // We can use current processe profile to mock profile of PD because the PD has the - // same way of retrieving profile with TiDB. And the purpose of this test case is used - // to make sure all profile HTTP API have been accessed. - accessed := map[string]struct{}{} - handlerFactory := func(name string, debug ...int) func(w http.ResponseWriter, _ *http.Request) { - debugLevel := 0 - if len(debug) > 0 { - debugLevel = debug[0] - } - return func(w http.ResponseWriter, _ *http.Request) { - profile := pprof.Lookup(name) - if profile == nil { - http.Error(w, fmt.Sprintf("profile %s not found", name), http.StatusBadRequest) - return - } - if err := profile.WriteTo(w, debugLevel); err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - accessed[name] = struct{}{} - } - } - - // mock PD profile - router.HandleFunc("/pd/api/v1/debug/pprof/profile", copyHandler("../../util/profile/testdata/test.pprof")) - router.HandleFunc("/pd/api/v1/debug/pprof/heap", handlerFactory("heap")) - router.HandleFunc("/pd/api/v1/debug/pprof/mutex", handlerFactory("mutex")) - router.HandleFunc("/pd/api/v1/debug/pprof/allocs", handlerFactory("allocs")) - router.HandleFunc("/pd/api/v1/debug/pprof/block", handlerFactory("block")) - router.HandleFunc("/pd/api/v1/debug/pprof/goroutine", handlerFactory("goroutine", 2)) - - tk.MustQuery("select * from pd_profile_cpu where depth < 3") - warnings = tk.Session().GetSessionVars().StmtCtx.GetWarnings() - require.Lenf(t, warnings, 0, "expect no warnings, but found: %+v", warnings) - - tk.MustQuery("select * from pd_profile_memory where depth < 3") - warnings = tk.Session().GetSessionVars().StmtCtx.GetWarnings() - require.Lenf(t, warnings, 0, "expect no warnings, but found: %+v", warnings) - - tk.MustQuery("select * from pd_profile_mutex where depth < 3") - warnings = tk.Session().GetSessionVars().StmtCtx.GetWarnings() - require.Lenf(t, warnings, 0, "expect no warnings, but found: %+v", warnings) - - tk.MustQuery("select * from pd_profile_allocs where depth < 3") - warnings = tk.Session().GetSessionVars().StmtCtx.GetWarnings() - require.Lenf(t, warnings, 0, "expect no warnings, but found: %+v", warnings) - - tk.MustQuery("select * from pd_profile_block where depth < 3") - warnings = tk.Session().GetSessionVars().StmtCtx.GetWarnings() - require.Lenf(t, warnings, 0, "expect no warnings, but found: %+v", warnings) - - tk.MustQuery("select * from pd_profile_goroutines") - warnings = tk.Session().GetSessionVars().StmtCtx.GetWarnings() - require.Lenf(t, warnings, 0, "expect no warnings, but found: %+v", warnings) - - require.Lenf(t, accessed, 5, "expect all HTTP API had been accessed, but found: %v", accessed) -} - func newMockStore(t *testing.T) (store kv.Storage, clean func()) { var err error store, err = mockstore.NewMockStore() diff --git a/infoschema/tables.go b/infoschema/tables.go index 5d1f919ef11a1..2e09e91469541 100644 --- a/infoschema/tables.go +++ b/infoschema/tables.go @@ -18,7 +18,6 @@ import ( "context" "encoding/json" "fmt" - "io" "net" "net/http" "sort" @@ -171,12 +170,12 @@ const ( TableClientErrorsSummaryByHost = "CLIENT_ERRORS_SUMMARY_BY_HOST" // TableTiDBTrx is current running transaction status table. TableTiDBTrx = "TIDB_TRX" - // TableDeadlocks is the string constatnt of deadlock table. + // TableDeadlocks is the string constant of deadlock table. TableDeadlocks = "DEADLOCKS" // TableDataLockWaits is current lock waiting status table. TableDataLockWaits = "DATA_LOCK_WAITS" - // TableRegionLabel is the string constant of region label table. - TableRegionLabel = "REGION_LABEL" + // TableAttributes is the string constant of attributes table. + TableAttributes = "ATTRIBUTES" // TablePlacementRules is the string constant of placement rules table. TablePlacementRules = "PLACEMENT_RULES" ) @@ -274,7 +273,7 @@ var tableIDMap = map[string]int64{ TableDataLockWaits: autoid.InformationSchemaDBID + 74, TableStatementsSummaryEvicted: autoid.InformationSchemaDBID + 75, ClusterTableStatementsSummaryEvicted: autoid.InformationSchemaDBID + 76, - TableRegionLabel: autoid.InformationSchemaDBID + 77, + TableAttributes: autoid.InformationSchemaDBID + 77, TableTiDBHotRegionsHistory: autoid.InformationSchemaDBID + 78, TablePlacementRules: autoid.InformationSchemaDBID + 79, } @@ -360,6 +359,8 @@ var schemataCols = []columnInfo{ {name: "DEFAULT_CHARACTER_SET_NAME", tp: mysql.TypeVarchar, size: 64}, {name: "DEFAULT_COLLATION_NAME", tp: mysql.TypeVarchar, size: 32}, {name: "SQL_PATH", tp: mysql.TypeVarchar, size: 512}, + {name: "TIDB_PLACEMENT_POLICY_NAME", tp: mysql.TypeVarchar, size: 64}, + {name: "TIDB_DIRECT_PLACEMENT", tp: mysql.TypeVarchar, size: 1024}, } var tablesCols = []columnInfo{ @@ -388,7 +389,7 @@ var tablesCols = []columnInfo{ {name: "TIDB_ROW_ID_SHARDING_INFO", tp: mysql.TypeVarchar, size: 255}, {name: "TIDB_PK_TYPE", tp: mysql.TypeVarchar, size: 64}, {name: "TIDB_PLACEMENT_POLICY_NAME", tp: mysql.TypeVarchar, size: 64}, - {name: "TIDB_DIRECT_PLACEMENT", tp: mysql.TypeVarchar, size: types.UnspecifiedLength}, + {name: "TIDB_DIRECT_PLACEMENT", tp: mysql.TypeVarchar, size: 1024}, } // See: http://dev.mysql.com/doc/refman/5.7/en/columns-table.html @@ -561,7 +562,7 @@ var partitionsCols = []columnInfo{ {name: "TABLESPACE_NAME", tp: mysql.TypeVarchar, size: 64}, {name: "TIDB_PARTITION_ID", tp: mysql.TypeLonglong, size: 21}, {name: "TIDB_PLACEMENT_POLICY_NAME", tp: mysql.TypeVarchar, size: 64}, - {name: "TIDB_DIRECT_PLACEMENT", tp: mysql.TypeVarchar, size: types.UnspecifiedLength}, + {name: "TIDB_DIRECT_PLACEMENT", tp: mysql.TypeVarchar, size: 1024}, } var tableConstraintsCols = []columnInfo{ @@ -867,6 +868,8 @@ var slowQueryCols = []columnInfo{ {name: variable.SlowLogBackoffDetail, tp: mysql.TypeVarchar, size: 4096}, {name: variable.SlowLogPrepared, tp: mysql.TypeTiny, size: 1}, {name: variable.SlowLogSucc, tp: mysql.TypeTiny, size: 1}, + {name: variable.SlowLogIsExplicitTxn, tp: mysql.TypeTiny, size: 1}, + {name: variable.SlowLogIsWriteCacheTable, tp: mysql.TypeTiny, size: 1}, {name: variable.SlowLogPlanFromCache, tp: mysql.TypeTiny, size: 1}, {name: variable.SlowLogPlanFromBinding, tp: mysql.TypeTiny, size: 1}, {name: variable.SlowLogPlan, tp: mysql.TypeLongBlob, size: types.UnspecifiedLength}, @@ -1441,26 +1444,26 @@ var tableStatementsSummaryEvictedCols = []columnInfo{ {name: "EVICTED_COUNT", tp: mysql.TypeLonglong, size: 64, flag: mysql.NotNullFlag}, } -var tableRegionLabelCols = []columnInfo{ - {name: "RULE_ID", tp: mysql.TypeVarchar, size: types.UnspecifiedLength, flag: mysql.NotNullFlag}, - {name: "RULE_TYPE", tp: mysql.TypeVarchar, size: 16, flag: mysql.NotNullFlag}, - {name: "REGION_LABEL", tp: mysql.TypeVarchar, size: types.UnspecifiedLength}, +var tableAttributesCols = []columnInfo{ + {name: "ID", tp: mysql.TypeVarchar, size: types.UnspecifiedLength, flag: mysql.NotNullFlag}, + {name: "TYPE", tp: mysql.TypeVarchar, size: 16, flag: mysql.NotNullFlag}, + {name: "ATTRIBUTES", tp: mysql.TypeVarchar, size: types.UnspecifiedLength}, {name: "RANGES", tp: mysql.TypeBlob, size: types.UnspecifiedLength}, } var tablePlacementRulesCols = []columnInfo{ {name: "POLICY_ID", tp: mysql.TypeLonglong, size: 64, flag: mysql.NotNullFlag}, {name: "CATALOG_NAME", tp: mysql.TypeVarchar, size: 512, flag: mysql.NotNullFlag}, - {name: "POLICY_NAME", tp: mysql.TypeVarchar, size: types.UnspecifiedLength}, // Catalog wide policy - {name: "SCHEMA_NAME", tp: mysql.TypeVarchar, size: types.UnspecifiedLength}, // System policy does not have a schema - {name: "TABLE_NAME", tp: mysql.TypeVarchar, size: types.UnspecifiedLength}, // Schema level rules does not have a table - {name: "PARTITION_NAME", tp: mysql.TypeVarchar, size: types.UnspecifiedLength}, // Table level rules does not have a partition - {name: "PRIMARY_REGION", tp: mysql.TypeVarchar, size: types.UnspecifiedLength, flag: mysql.NotNullFlag}, - {name: "REGIONS", tp: mysql.TypeVarchar, size: types.UnspecifiedLength, flag: mysql.NotNullFlag}, - {name: "CONSTRAINTS", tp: mysql.TypeVarchar, size: types.UnspecifiedLength, flag: mysql.NotNullFlag}, - {name: "LEADER_CONSTRAINTS", tp: mysql.TypeVarchar, size: types.UnspecifiedLength, flag: mysql.NotNullFlag}, - {name: "FOLLOWER_CONSTRAINTS", tp: mysql.TypeVarchar, size: types.UnspecifiedLength, flag: mysql.NotNullFlag}, - {name: "LEARNER_CONSTRAINTS", tp: mysql.TypeVarchar, size: types.UnspecifiedLength, flag: mysql.NotNullFlag}, + {name: "POLICY_NAME", tp: mysql.TypeVarchar, size: 64}, // Catalog wide policy + {name: "SCHEMA_NAME", tp: mysql.TypeVarchar, size: 64}, // System policy does not have a schema + {name: "TABLE_NAME", tp: mysql.TypeVarchar, size: 64}, // Schema level rules does not have a table + {name: "PARTITION_NAME", tp: mysql.TypeVarchar, size: 64}, // Table level rules does not have a partition + {name: "PRIMARY_REGION", tp: mysql.TypeVarchar, size: 1024, flag: mysql.NotNullFlag}, + {name: "REGIONS", tp: mysql.TypeVarchar, size: 1024, flag: mysql.NotNullFlag}, + {name: "CONSTRAINTS", tp: mysql.TypeVarchar, size: 1024, flag: mysql.NotNullFlag}, + {name: "LEADER_CONSTRAINTS", tp: mysql.TypeVarchar, size: 1024, flag: mysql.NotNullFlag}, + {name: "FOLLOWER_CONSTRAINTS", tp: mysql.TypeVarchar, size: 1024, flag: mysql.NotNullFlag}, + {name: "LEARNER_CONSTRAINTS", tp: mysql.TypeVarchar, size: 1024, flag: mysql.NotNullFlag}, {name: "SCHEDULE", tp: mysql.TypeVarchar, size: 20, flag: mysql.NotNullFlag}, // EVEN or MAJORITY_IN_PRIMARY {name: "FOLLOWERS", tp: mysql.TypeLonglong, size: 64, flag: mysql.NotNullFlag}, {name: "LEARNERS", tp: mysql.TypeLonglong, size: 64, flag: mysql.NotNullFlag}, @@ -1644,8 +1647,8 @@ func GetPDServerInfo(ctx sessionctx.Context) ([]ServerInfo, error) { } var servers = make([]ServerInfo, 0, len(members)) for _, addr := range members { - // Get PD version - url := fmt.Sprintf("%s://%s%s", util.InternalHTTPSchema(), addr, pdapi.ClusterVersion) + // Get PD version, git_hash + url := fmt.Sprintf("%s://%s%s", util.InternalHTTPSchema(), addr, pdapi.Status) req, err := http.NewRequest(http.MethodGet, url, nil) if err != nil { return nil, errors.Trace(err) @@ -1655,25 +1658,8 @@ func GetPDServerInfo(ctx sessionctx.Context) ([]ServerInfo, error) { if err != nil { return nil, errors.Trace(err) } - pdVersion, err := io.ReadAll(resp.Body) - terror.Log(resp.Body.Close()) - if err != nil { - return nil, errors.Trace(err) - } - version := strings.Trim(strings.Trim(string(pdVersion), "\n"), "\"") - - // Get PD git_hash - url = fmt.Sprintf("%s://%s%s", util.InternalHTTPSchema(), addr, pdapi.Status) - req, err = http.NewRequest(http.MethodGet, url, nil) - if err != nil { - return nil, errors.Trace(err) - } - req.Header.Add("PD-Allow-follower-handle", "true") - resp, err = util.InternalHTTPClient().Do(req) - if err != nil { - return nil, errors.Trace(err) - } var content = struct { + Version string `json:"version"` GitHash string `json:"git_hash"` StartTimestamp int64 `json:"start_timestamp"` }{} @@ -1682,12 +1668,15 @@ func GetPDServerInfo(ctx sessionctx.Context) ([]ServerInfo, error) { if err != nil { return nil, errors.Trace(err) } + if len(content.Version) > 0 && content.Version[0] == 'v' { + content.Version = content.Version[1:] + } servers = append(servers, ServerInfo{ ServerType: "pd", Address: addr, StatusAddr: addr, - Version: version, + Version: content.Version, GitHash: content.GitHash, StartTimestamp: content.StartTimestamp, }) @@ -1848,7 +1837,7 @@ var tableNameToColumns = map[string][]columnInfo{ TableTiDBTrx: tableTiDBTrxCols, TableDeadlocks: tableDeadlocksCols, TableDataLockWaits: tableDataLockWaitsCols, - TableRegionLabel: tableRegionLabelCols, + TableAttributes: tableAttributesCols, TablePlacementRules: tablePlacementRulesCols, } diff --git a/infoschema/tables_serial_test.go b/infoschema/tables_serial_test.go index 01bc672cbf3c5..71aee026f6afd 100644 --- a/infoschema/tables_serial_test.go +++ b/infoschema/tables_serial_test.go @@ -556,13 +556,13 @@ func TestSlowQuery(t *testing.T) { tk.MustExec(fmt.Sprintf("set @@tidb_slow_query_file='%v'", slowLogFileName)) tk.MustExec("set time_zone = '+08:00';") re := tk.MustQuery("select * from information_schema.slow_query") - re.Check(testutil.RowsWithSep("|", "2019-02-12 19:33:56.571953|406315658548871171|root|localhost|6|57|0.12|4.895492|0.4|0.2|0.000000003|2|0.000000002|0.00000001|0.000000003|0.19|0.21|0.01|0|0.18|[txnLock]|0.03|0|15|480|1|8|0.3824278|0.161|0.101|0.092|1.71|1|100001|100000|100|10|10|10|100|test||0|42a1c8aae6f133e934d4bf0147491709a8812ea05ff8819ec522780fe657b772|t1:1,t2:2|0.1|0.2|0.03|127.0.0.1:20160|0.05|0.6|0.8|0.0.0.0:20160|70724|65536|0|0|0|0|10||0|1|1|0|abcd|60e9378c746d9a2be1c791047e008967cf252eb6de9167ad3aa6098fa2d523f4|update t set i = 2;|select * from t_slim;", - "2021-09-08|14:39:54.506967|427578666238083075|root|172.16.0.0|40507|0|0|25.571605962|0.002923536|0.006800973|0.002100764|0|0|0|0.000015801|25.542014572|0|0.002294647|0.000605473|12.483|[tikvRPC regionMiss tikvRPC regionMiss regionMiss]|0|0|624|172064|60|0|0|0|0|0|0|0|0|0|0|0|0|0|0|rtdb||0|124acb3a0bec903176baca5f9da00b4e7512a41c93b417923f26502edeb324cc||0|0|0||0|0|0||856544|0|86.635049185|0.015486658|100.054|0|0||0|1|0|0||||INSERT INTO ...;", + re.Check(testutil.RowsWithSep("|", "2019-02-12 19:33:56.571953|406315658548871171|root|localhost|6|57|0.12|4.895492|0.4|0.2|0.000000003|2|0.000000002|0.00000001|0.000000003|0.19|0.21|0.01|0|0.18|[txnLock]|0.03|0|15|480|1|8|0.3824278|0.161|0.101|0.092|1.71|1|100001|100000|100|10|10|10|100|test||0|42a1c8aae6f133e934d4bf0147491709a8812ea05ff8819ec522780fe657b772|t1:1,t2:2|0.1|0.2|0.03|127.0.0.1:20160|0.05|0.6|0.8|0.0.0.0:20160|70724|65536|0|0|0|0|10||0|1|0|0|1|0|abcd|60e9378c746d9a2be1c791047e008967cf252eb6de9167ad3aa6098fa2d523f4|update t set i = 2;|select * from t_slim;", + "2021-09-08|14:39:54.506967|427578666238083075|root|172.16.0.0|40507|0|0|25.571605962|0.002923536|0.006800973|0.002100764|0|0|0|0.000015801|25.542014572|0|0.002294647|0.000605473|12.483|[tikvRPC regionMiss tikvRPC regionMiss regionMiss]|0|0|624|172064|60|0|0|0|0|0|0|0|0|0|0|0|0|0|0|rtdb||0|124acb3a0bec903176baca5f9da00b4e7512a41c93b417923f26502edeb324cc||0|0|0||0|0|0||856544|0|86.635049185|0.015486658|100.054|0|0||0|1|0|0|0|0||||INSERT INTO ...;", )) tk.MustExec("set time_zone = '+00:00';") re = tk.MustQuery("select * from information_schema.slow_query") - re.Check(testutil.RowsWithSep("|", "2019-02-12 11:33:56.571953|406315658548871171|root|localhost|6|57|0.12|4.895492|0.4|0.2|0.000000003|2|0.000000002|0.00000001|0.000000003|0.19|0.21|0.01|0|0.18|[txnLock]|0.03|0|15|480|1|8|0.3824278|0.161|0.101|0.092|1.71|1|100001|100000|100|10|10|10|100|test||0|42a1c8aae6f133e934d4bf0147491709a8812ea05ff8819ec522780fe657b772|t1:1,t2:2|0.1|0.2|0.03|127.0.0.1:20160|0.05|0.6|0.8|0.0.0.0:20160|70724|65536|0|0|0|0|10||0|1|1|0|abcd|60e9378c746d9a2be1c791047e008967cf252eb6de9167ad3aa6098fa2d523f4|update t set i = 2;|select * from t_slim;", - "2021-09-08|06:39:54.506967|427578666238083075|root|172.16.0.0|40507|0|0|25.571605962|0.002923536|0.006800973|0.002100764|0|0|0|0.000015801|25.542014572|0|0.002294647|0.000605473|12.483|[tikvRPC regionMiss tikvRPC regionMiss regionMiss]|0|0|624|172064|60|0|0|0|0|0|0|0|0|0|0|0|0|0|0|rtdb||0|124acb3a0bec903176baca5f9da00b4e7512a41c93b417923f26502edeb324cc||0|0|0||0|0|0||856544|0|86.635049185|0.015486658|100.054|0|0||0|1|0|0||||INSERT INTO ...;", + re.Check(testutil.RowsWithSep("|", "2019-02-12 11:33:56.571953|406315658548871171|root|localhost|6|57|0.12|4.895492|0.4|0.2|0.000000003|2|0.000000002|0.00000001|0.000000003|0.19|0.21|0.01|0|0.18|[txnLock]|0.03|0|15|480|1|8|0.3824278|0.161|0.101|0.092|1.71|1|100001|100000|100|10|10|10|100|test||0|42a1c8aae6f133e934d4bf0147491709a8812ea05ff8819ec522780fe657b772|t1:1,t2:2|0.1|0.2|0.03|127.0.0.1:20160|0.05|0.6|0.8|0.0.0.0:20160|70724|65536|0|0|0|0|10||0|1|0|0|1|0|abcd|60e9378c746d9a2be1c791047e008967cf252eb6de9167ad3aa6098fa2d523f4|update t set i = 2;|select * from t_slim;", + "2021-09-08|06:39:54.506967|427578666238083075|root|172.16.0.0|40507|0|0|25.571605962|0.002923536|0.006800973|0.002100764|0|0|0|0.000015801|25.542014572|0|0.002294647|0.000605473|12.483|[tikvRPC regionMiss tikvRPC regionMiss regionMiss]|0|0|624|172064|60|0|0|0|0|0|0|0|0|0|0|0|0|0|0|rtdb||0|124acb3a0bec903176baca5f9da00b4e7512a41c93b417923f26502edeb324cc||0|0|0||0|0|0||856544|0|86.635049185|0.015486658|100.054|0|0||0|1|0|0|0|0||||INSERT INTO ...;", )) // Test for long query. @@ -759,7 +759,7 @@ func TestStmtSummaryTable(t *testing.T) { rows := tk.MustQuery("select tidb_decode_plan('" + p1 + "');").Rows() require.Equal(t, 1, len(rows)) require.Equal(t, 1, len(rows[0])) - require.Regexp(t, ".*\n.*Point_Get.*table.tidb, index.PRIMARY.VARIABLE_NAME.*", rows[0][0]) + require.Regexp(t, "\n.*Point_Get.*table.tidb, index.PRIMARY.VARIABLE_NAME", rows[0][0]) sql = "select table_names from information_schema.statements_summary " + "where digest_text like 'select `variable_value`%' and `schema_name`='test'" @@ -1431,19 +1431,19 @@ func TestInfoSchemaDeadlockPrivilege(t *testing.T) { _ = tk.MustQuery("select * from information_schema.deadlocks") } -func TestRegionLabel(t *testing.T) { +func TestAttributes(t *testing.T) { store, clean := testkit.CreateMockStore(t) defer clean() // test the failpoint for testing - fpName := "github.com/pingcap/tidb/executor/mockOutputOfRegionLabel" + fpName := "github.com/pingcap/tidb/executor/mockOutputOfAttributes" tk := newTestKitWithRoot(t, store) - tk.MustQuery("select * from information_schema.region_label").Check(testkit.Rows()) + tk.MustQuery("select * from information_schema.attributes").Check(testkit.Rows()) require.NoError(t, failpoint.Enable(fpName, "return")) defer func() { require.NoError(t, failpoint.Disable(fpName)) }() - tk.MustQuery(`select * from information_schema.region_label`).Check(testkit.Rows( + tk.MustQuery(`select * from information_schema.attributes`).Check(testkit.Rows( `schema/test/test_label key-range "merge_option=allow" [7480000000000000ff395f720000000000fa, 7480000000000000ff3a5f720000000000fa]`, )) } diff --git a/kv/checker_test.go b/kv/checker_test.go index 3143bd36ecfcd..0562d1f5868ad 100644 --- a/kv/checker_test.go +++ b/kv/checker_test.go @@ -22,8 +22,6 @@ import ( ) func TestIsRequestTypeSupported(t *testing.T) { - t.Parallel() - checker := kv.RequestTypeSupportedChecker{}.IsRequestTypeSupported assert.True(t, checker(kv.ReqTypeSelect, kv.ReqSubTypeGroupBy)) assert.True(t, checker(kv.ReqTypeDAG, kv.ReqSubTypeSignature)) diff --git a/kv/error_test.go b/kv/error_test.go index 09738aeab83da..e9842e63749df 100644 --- a/kv/error_test.go +++ b/kv/error_test.go @@ -23,8 +23,6 @@ import ( ) func TestError(t *testing.T) { - t.Parallel() - kvErrs := []*terror.Error{ ErrNotExist, ErrTxnRetryable, diff --git a/kv/fault_injection.go b/kv/fault_injection.go index af875d39ea1b6..0cd32dca1b5ac 100644 --- a/kv/fault_injection.go +++ b/kv/fault_injection.go @@ -58,17 +58,8 @@ func NewInjectedStore(store Storage, cfg *InjectionConfig) Storage { } // Begin creates an injected Transaction. -func (s *InjectedStore) Begin() (Transaction, error) { - txn, err := s.Storage.Begin() - return &InjectedTransaction{ - Transaction: txn, - cfg: s.cfg, - }, err -} - -// BeginWithOption creates an injected Transaction with given option. -func (s *InjectedStore) BeginWithOption(option tikv.StartTSOption) (Transaction, error) { - txn, err := s.Storage.BeginWithOption(option) +func (s *InjectedStore) Begin(opts ...tikv.TxnOption) (Transaction, error) { + txn, err := s.Storage.Begin(opts...) return &InjectedTransaction{ Transaction: txn, cfg: s.cfg, diff --git a/kv/fault_injection_test.go b/kv/fault_injection_test.go index 743d453b5dd68..c8743284c9a8c 100644 --- a/kv/fault_injection_test.go +++ b/kv/fault_injection_test.go @@ -26,8 +26,6 @@ import ( ) func TestFaultInjectionBasic(t *testing.T) { - t.Parallel() - var cfg InjectionConfig err1 := errors.New("foo") cfg.SetGetError(err1) @@ -37,7 +35,7 @@ func TestFaultInjectionBasic(t *testing.T) { txn, err := storage.Begin() require.Nil(t, err) - _, err = storage.BeginWithOption(tikv.DefaultStartTSOption().SetTxnScope(GlobalTxnScope).SetStartTS(0)) + _, err = storage.Begin(tikv.WithTxnScope(GlobalTxnScope), tikv.WithStartTS(0)) require.Nil(t, err) ver := Version{Ver: 1} diff --git a/kv/interface_mock_test.go b/kv/interface_mock_test.go index 166acf202794b..2542e6f7e5b55 100644 --- a/kv/interface_mock_test.go +++ b/kv/interface_mock_test.go @@ -63,6 +63,7 @@ func (t *mockTxn) IsReadOnly() bool { func (t *mockTxn) StartTS() uint64 { return uint64(0) } + func (t *mockTxn) Get(ctx context.Context, k Key) ([]byte, error) { return nil, nil } @@ -82,6 +83,7 @@ func (t *mockTxn) IterReverse(k Key) (Iterator, error) { func (t *mockTxn) Set(k Key, v []byte) error { return nil } + func (t *mockTxn) Delete(k Key) error { return nil } @@ -115,7 +117,6 @@ func (t *mockTxn) Flush() (int, error) { } func (t *mockTxn) Discard() { - } func (t *mockTxn) Reset() { @@ -123,7 +124,6 @@ func (t *mockTxn) Reset() { } func (t *mockTxn) SetVars(vars interface{}) { - } func (t *mockTxn) GetVars() interface{} { @@ -131,7 +131,6 @@ func (t *mockTxn) GetVars() interface{} { } func (t *mockTxn) CacheTableInfo(id int64, info *model.TableInfo) { - } func (t *mockTxn) GetTableInfo(id int64) *model.TableInfo { @@ -139,11 +138,11 @@ func (t *mockTxn) GetTableInfo(id int64) *model.TableInfo { } func (t *mockTxn) SetDiskFullOpt(level kvrpcpb.DiskFullOpt) { - //TODO nothing + // TODO nothing } func (t *mockTxn) ClearDiskFullOpt() { - //TODO nothing + // TODO nothing } // newMockTxn new a mockTxn. @@ -155,14 +154,9 @@ func newMockTxn() Transaction { } // mockStorage is used to start a must commit-failed txn. -type mockStorage struct { -} +type mockStorage struct{} -func (s *mockStorage) Begin() (Transaction, error) { - return newMockTxn(), nil -} - -func (s *mockStorage) BeginWithOption(option tikv.StartTSOption) (Transaction, error) { +func (s *mockStorage) Begin(opts ...tikv.TxnOption) (Transaction, error) { return newMockTxn(), nil } @@ -243,7 +237,6 @@ func (s *mockSnapshot) Get(ctx context.Context, k Key) ([]byte, error) { } func (s *mockSnapshot) SetPriority(priority int) { - } func (s *mockSnapshot) BatchGet(ctx context.Context, keys []Key) (map[string][]byte, error) { diff --git a/kv/key.go b/kv/key.go index 191bc65eb7ac3..ae75765535331 100644 --- a/kv/key.go +++ b/kv/key.go @@ -59,7 +59,7 @@ func (k Key) PrefixNext() Key { } if i == -1 { copy(buf, k) - buf = append(buf, 0) + buf = append(buf, 0) // nozero } return buf } diff --git a/kv/key_test.go b/kv/key_test.go index af4b6b58f1725..96b4fd2d8dfb4 100644 --- a/kv/key_test.go +++ b/kv/key_test.go @@ -30,8 +30,6 @@ import ( ) func TestPartialNext(t *testing.T) { - t.Parallel() - sc := &stmtctx.StatementContext{TimeZone: time.Local} // keyA represents a multi column index. keyA, err := codec.EncodeValue(sc, nil, types.NewDatum("abc"), types.NewDatum("def")) @@ -57,8 +55,6 @@ func TestPartialNext(t *testing.T) { } func TestIsPoint(t *testing.T) { - t.Parallel() - tests := []struct { start []byte end []byte @@ -111,16 +107,12 @@ func TestIsPoint(t *testing.T) { } func TestBasicFunc(t *testing.T) { - t.Parallel() - assert.False(t, IsTxnRetryableError(nil)) assert.True(t, IsTxnRetryableError(ErrTxnRetryable)) assert.False(t, IsTxnRetryableError(errors.New("test"))) } func TestHandle(t *testing.T) { - t.Parallel() - ih := IntHandle(100) assert.True(t, ih.IsInt()) @@ -153,8 +145,6 @@ func TestHandle(t *testing.T) { } func TestPaddingHandle(t *testing.T) { - t.Parallel() - dec := types.NewDecFromInt(1) encoded, err := codec.EncodeKey(new(stmtctx.StatementContext), nil, types.NewDecimalDatum(dec)) assert.Nil(t, err) @@ -171,8 +161,6 @@ func TestPaddingHandle(t *testing.T) { } func TestHandleMap(t *testing.T) { - t.Parallel() - m := NewHandleMap() h := IntHandle(1) diff --git a/kv/kv.go b/kv/kv.go index ca3dbd1d239a2..0e83f3daee8a0 100644 --- a/kv/kv.go +++ b/kv/kv.go @@ -30,6 +30,7 @@ import ( tikvstore "github.com/tikv/client-go/v2/kv" "github.com/tikv/client-go/v2/oracle" "github.com/tikv/client-go/v2/tikv" + "github.com/tikv/client-go/v2/tikvrpc" ) // UnCommitIndexKVFlag uses to indicate the index key/value is no need to commit. @@ -335,8 +336,10 @@ type Request struct { IsStaleness bool // MatchStoreLabels indicates the labels the store should be matched MatchStoreLabels []*metapb.StoreLabel - // ResourceGroupTag indicates the kv request task group. - ResourceGroupTag []byte + // ResourceGroupTagger indicates the kv request task group tagger. + ResourceGroupTagger tikvrpc.ResourceGroupTagger + // Paging indicates whether the request is a paging request. + Paging bool } const ( @@ -405,9 +408,7 @@ type Driver interface { // Isolation should be at least SI(SNAPSHOT ISOLATION) type Storage interface { // Begin a global transaction - Begin() (Transaction, error) - // BeginWithOption begins a transaction with given option - BeginWithOption(option tikv.StartTSOption) (Transaction, error) + Begin(opts ...tikv.TxnOption) (Transaction, error) // GetSnapshot gets a snapshot that is able to read any data which data is <= ver. // if ver is MaxVersion or > current max committed version, we will use current version for this snapshot. GetSnapshot(ver Version) Snapshot diff --git a/kv/mock_test.go b/kv/mock_test.go index e3e7d7e095edf..13740b0612eef 100644 --- a/kv/mock_test.go +++ b/kv/mock_test.go @@ -22,8 +22,6 @@ import ( ) func TestInterface(t *testing.T) { - t.Parallel() - storage := newMockStorage() storage.GetClient() storage.UUID() diff --git a/kv/mpp.go b/kv/mpp.go index 520b6ba2bb57c..8d2754eb4f239 100644 --- a/kv/mpp.go +++ b/kv/mpp.go @@ -81,7 +81,7 @@ type MPPClient interface { ConstructMPPTasks(context.Context, *MPPBuildTasksRequest, map[string]time.Time, time.Duration) ([]MPPTaskMeta, error) // DispatchMPPTasks dispatches ALL mpp requests at once, and returns an iterator that transfers the data. - DispatchMPPTasks(ctx context.Context, vars interface{}, reqs []*MPPDispatchRequest) Response + DispatchMPPTasks(ctx context.Context, vars interface{}, reqs []*MPPDispatchRequest, needTriggerFallback bool) Response } // MPPBuildTasksRequest request the stores allocation for a mpp plan fragment. @@ -89,7 +89,4 @@ type MPPClient interface { type MPPBuildTasksRequest struct { KeyRanges []KeyRange StartTS uint64 - - BalanceWithContinuity bool - BalanceContinuousRegionCount int64 } diff --git a/kv/option.go b/kv/option.go index 682c2be4f2d60..2a7a17fedcb6c 100644 --- a/kv/option.go +++ b/kv/option.go @@ -62,12 +62,18 @@ const ( IsStalenessReadOnly // MatchStoreLabels indicates the labels the store should be matched MatchStoreLabels - // ResourceGroupTag indicates the resource group of the kv request. + // ResourceGroupTag indicates the resource group tag of the kv request. ResourceGroupTag + // ResourceGroupTagger can be used to set the ResourceGroupTag dynamically according to the request content. It will be used only when ResourceGroupTag is nil. + ResourceGroupTagger // KVFilter indicates the filter to ignore key-values in the transaction's memory buffer. KVFilter + // SnapInterceptor is used for setting the interceptor for snapshot SnapInterceptor + // CommitTSUpperBoundChec is used by cached table + // The commitTS must be greater than all the write lock lease of the visited cached table. + CommitTSUpperBoundCheck ) // ReplicaReadType is the type of replica to read data from diff --git a/kv/txn.go b/kv/txn.go index 1359e60abb47d..7701dcd870b06 100644 --- a/kv/txn.go +++ b/kv/txn.go @@ -16,10 +16,12 @@ package kv import ( "context" + "errors" "math" "math/rand" "time" + "github.com/pingcap/failpoint" "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/util/logutil" "go.uber.org/zap" @@ -58,9 +60,24 @@ func RunInNewTxn(ctx context.Context, store Storage, retryable bool, f func(ctx return err } - err = txn.Commit(ctx) + failpoint.Inject("mockCommitErrorInNewTxn", func(val failpoint.Value) { + if v := val.(string); len(v) > 0 { + switch v { + case "retry_once": + if i == 0 { + err = ErrTxnRetryable + } + case "no_retry": + failpoint.Return(errors.New("mock commit error")) + } + } + }) + if err == nil { - break + err = txn.Commit(ctx) + if err == nil { + break + } } if retryable && IsTxnRetryableError(err) { logutil.BgLogger().Warn("RunInNewTxn", diff --git a/kv/txn_test.go b/kv/txn_test.go index b57dfab4dff74..84f5430c2e6d0 100644 --- a/kv/txn_test.go +++ b/kv/txn_test.go @@ -35,8 +35,6 @@ func mustBackOff(t *testing.T, cnt uint, sleep int) { } func TestRetryExceedCountError(t *testing.T) { - t.Parallel() - defer func(cnt uint) { maxRetryCnt = cnt }(maxRetryCnt) diff --git a/kv/utils_test.go b/kv/utils_test.go index bd7689026c18a..a91bbfc95b234 100644 --- a/kv/utils_test.go +++ b/kv/utils_test.go @@ -24,8 +24,6 @@ import ( ) func TestIncInt64(t *testing.T) { - t.Parallel() - mb := newMockMap() key := Key("key") v, err := IncInt64(mb, key, 1) @@ -53,8 +51,6 @@ func TestIncInt64(t *testing.T) { } func TestGetInt64(t *testing.T) { - t.Parallel() - mb := newMockMap() key := Key("key") v, err := GetInt64(context.TODO(), mb, key) diff --git a/kv/version_test.go b/kv/version_test.go index ebea2f4aa8422..1a2aa30143d10 100644 --- a/kv/version_test.go +++ b/kv/version_test.go @@ -21,8 +21,6 @@ import ( ) func TestVersion(t *testing.T) { - t.Parallel() - le := NewVersion(42).Cmp(NewVersion(43)) gt := NewVersion(42).Cmp(NewVersion(41)) eq := NewVersion(42).Cmp(NewVersion(42)) diff --git a/lock/lock.go b/lock/lock.go index b613ff1018b11..71d76ed924075 100644 --- a/lock/lock.go +++ b/lock/lock.go @@ -15,6 +15,8 @@ package lock import ( + "errors" + "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" @@ -29,6 +31,9 @@ type Checker struct { is infoschema.InfoSchema } +// ErrLockedTableDropped returns error when try to drop the table with write lock +var ErrLockedTableDropped = errors.New("other table can be accessed after locked table dropped") + // NewChecker return new lock Checker. func NewChecker(ctx sessionctx.Context, is infoschema.InfoSchema) *Checker { return &Checker{ctx: ctx, is: is} @@ -47,6 +52,7 @@ func (c *Checker) CheckTableLock(db, table string, privilege mysql.PrivilegeType if !alterWriteable && table == "" { return c.CheckLockInDB(db, privilege) } + switch privilege { case mysql.ShowDBPriv, mysql.AllPrivMask: // AllPrivMask only used in show create table statement now. @@ -68,6 +74,24 @@ func (c *Checker) CheckTableLock(db, table string, privilege mysql.PrivilegeType if err != nil { return err } + if tb.Meta().Lock == nil { + return nil + } + if privilege == mysql.DropPriv && tb.Meta().Name.O == table && c.ctx.HasLockedTables() { + lockTables := c.ctx.GetAllTableLocks() + for _, lockT := range lockTables { + if lockT.TableID == tb.Meta().ID { + switch tb.Meta().Lock.Tp { + case model.TableLockWrite: + return ErrLockedTableDropped + case model.TableLockRead, model.TableLockWriteLocal, model.TableLockReadOnly: + return infoschema.ErrTableNotLockedForWrite.GenWithStackByArgs(tb.Meta().Name) + } + } + } + + } + if !alterWriteable && c.ctx.HasLockedTables() { if locked, tp := c.ctx.CheckTableLocked(tb.Meta().ID); locked { if checkLockTpMeetPrivilege(tp, privilege) { @@ -78,10 +102,6 @@ func (c *Checker) CheckTableLock(db, table string, privilege mysql.PrivilegeType return infoschema.ErrTableNotLocked.GenWithStackByArgs(tb.Meta().Name) } - if tb.Meta().Lock == nil { - return nil - } - if privilege == mysql.SelectPriv { switch tb.Meta().Lock.Tp { case model.TableLockRead, model.TableLockWriteLocal, model.TableLockReadOnly: diff --git a/meta/autoid/autoid_test.go b/meta/autoid/autoid_test.go index c626bae2ffac6..16cfc7c64ac1c 100644 --- a/meta/autoid/autoid_test.go +++ b/meta/autoid/autoid_test.go @@ -529,7 +529,6 @@ func TestRollbackAlloc(t *testing.T) { // TestNextStep tests generate next auto id step. func TestNextStep(t *testing.T) { - t.Parallel() nextStep := autoid.NextStep(2000000, 1*time.Nanosecond) require.Equal(t, int64(2000000), nextStep) nextStep = autoid.NextStep(678910, 10*time.Second) diff --git a/meta/meta_test.go b/meta/meta_test.go index 3bcc2dfc4bb75..29441e3e39c52 100644 --- a/meta/meta_test.go +++ b/meta/meta_test.go @@ -33,8 +33,6 @@ import ( ) func TestPlacementPolicy(t *testing.T) { - t.Parallel() - store, err := mockstore.NewMockStore() require.NoError(t, err) @@ -105,8 +103,6 @@ func TestPlacementPolicy(t *testing.T) { } func TestBackupAndRestoreAutoIDs(t *testing.T) { - t.Parallel() - store, err := mockstore.NewMockStore() require.NoError(t, err) defer func() { @@ -154,8 +150,6 @@ func TestBackupAndRestoreAutoIDs(t *testing.T) { } func TestMeta(t *testing.T) { - t.Parallel() - store, err := mockstore.NewMockStore() require.NoError(t, err) @@ -389,7 +383,6 @@ func TestMeta(t *testing.T) { } func TestSnapshot(t *testing.T) { - t.Parallel() store, err := mockstore.NewMockStore() require.NoError(t, err) defer func() { @@ -427,7 +420,6 @@ func TestSnapshot(t *testing.T) { } func TestElement(t *testing.T) { - t.Parallel() checkElement := func(key []byte, resErr error) { e := &meta.Element{ID: 123, TypeKey: key} eBytes := e.EncodeElement() @@ -453,8 +445,6 @@ func TestElement(t *testing.T) { } func TestDDL(t *testing.T) { - t.Parallel() - testCases := []struct { desc string startHandle kv.Handle @@ -476,7 +466,6 @@ func TestDDL(t *testing.T) { // copy iterator variable into a new variable, see issue #27779 tc := tc t.Run(tc.desc, func(t *testing.T) { - t.Parallel() store, err := mockstore.NewMockStore() require.NoError(t, err) defer func() { @@ -619,8 +608,6 @@ func TestDDL(t *testing.T) { } func TestAddIndexJob(t *testing.T) { - t.Parallel() - store, err := mockstore.NewMockStore() require.NoError(t, err) defer func() { diff --git a/metrics/grafana/overview.json b/metrics/grafana/overview.json index 61bcb3543640b..ebbfb72ea361c 100644 --- a/metrics/grafana/overview.json +++ b/metrics/grafana/overview.json @@ -2695,6 +2695,7 @@ "dashLength": 10, "dashes": false, "datasource": "${DS_TEST-CLUSTER}", + "description": "The duration of a client starting to wait for the TS until received the TS result.", "fill": 1, "gridPos": { "h": 7, @@ -2730,7 +2731,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.999, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type=\"tso\"}[1m])) by (le))", + "expr": "histogram_quantile(0.999, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type=\"wait\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "999", @@ -2738,14 +2739,14 @@ "step": 10 }, { - "expr": "histogram_quantile(0.99, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type=\"tso\"}[1m])) by (le))", + "expr": "histogram_quantile(0.99, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type=\"wait\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "99", "refId": "B" }, { - "expr": "histogram_quantile(0.90, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type=\"tso\"}[1m])) by (le))", + "expr": "histogram_quantile(0.90, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type=\"wait\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "90", diff --git a/metrics/grafana/tidb.json b/metrics/grafana/tidb.json index cddda9e6063e7..f6606d18ef4c6 100644 --- a/metrics/grafana/tidb.json +++ b/metrics/grafana/tidb.json @@ -5426,7 +5426,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(tidb_tikvclient_safets_gap_seconds{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}) by (instance, store)", + "expr": "tidb_tikvclient_min_safets_gap_seconds{tidb_cluster=\"$tidb_cluster\"}", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}-store-{{store}}", @@ -5438,7 +5438,7 @@ "timeFrom": null, "timeRegions": [], "timeShift": null, - "title": "Max SafeTS gap", + "title": "Max SafeTS Gap", "tooltip": { "msResolution": false, "shared": true, @@ -6657,7 +6657,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_distsql_copr_cache_count{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", + "expr": "sum(rate(tidb_distsql_copr_cache_sum{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -8051,7 +8051,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.999, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type!~\"tso|tso_async_wait\"}[1m])) by (le, type))", + "expr": "histogram_quantile(0.999, sum(rate(tidb_tikvclient_ts_future_wait_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type!~\"tso|tso_async_wait\"}[1m])) by (le, type))", "format": "time_series", "intervalFactor": 2, "legendFormat": "999-{{type}}", @@ -8059,14 +8059,14 @@ "step": 10 }, { - "expr": "histogram_quantile(0.99, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type!~\"tso|tso_async_wait\"}[1m])) by (le, type))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_tikvclient_ts_future_wait_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type!~\"tso|tso_async_wait\"}[1m])) by (le, type))", "format": "time_series", "intervalFactor": 2, "legendFormat": "99-{{type}}", "refId": "B" }, { - "expr": "histogram_quantile(0.90, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type!~\"tso|tso_async_wait\"}[1m])) by (le, type))", + "expr": "histogram_quantile(0.90, sum(rate(tidb_tikvclient_ts_future_wait_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type!~\"tso|tso_async_wait\"}[1m])) by (le, type))", "format": "time_series", "intervalFactor": 2, "legendFormat": "90-{{type}}", @@ -8521,7 +8521,7 @@ "dashLength": 10, "dashes": false, "datasource": "${DS_TEST-CLUSTER}", - "description": "The duration of the waiting time for getting the start timestamp oracle", + "description": "The duration of the async TS until called the Wait function.", "editable": true, "error": false, "fill": 1, @@ -8556,7 +8556,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.999, sum(rate(tidb_pdclient_ts_future_wait_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", + "expr": "histogram_quantile(0.999, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type=\"tso_async_wait\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "999", @@ -8564,14 +8564,14 @@ "step": 10 }, { - "expr": "histogram_quantile(0.99, sum(rate(tidb_pdclient_ts_future_wait_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", + "expr": "histogram_quantile(0.99, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type=\"tso_async_wait\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "99", "refId": "B" }, { - "expr": "histogram_quantile(0.90, sum(rate(tidb_pdclient_ts_future_wait_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", + "expr": "histogram_quantile(0.90, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type=\"tso_async_wait\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "90", @@ -8582,7 +8582,7 @@ "timeFrom": null, "timeRegions": [], "timeShift": null, - "title": "Start TSO Wait Duration", + "title": "Async TSO Duration", "tooltip": { "msResolution": false, "shared": true, diff --git a/metrics/metrics.go b/metrics/metrics.go index 772663f530575..f5c1faf5bb3aa 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -157,6 +157,7 @@ func RegisterMetrics() { prometheus.MustRegister(TopSQLIgnoredCounter) prometheus.MustRegister(TopSQLReportDurationHistogram) prometheus.MustRegister(TopSQLReportDataHistogram) + prometheus.MustRegister(PDApiExecutionHistogram) tikvmetrics.InitMetrics(TiDB, TiKVClient) tikvmetrics.RegisterMetrics() diff --git a/metrics/server.go b/metrics/server.go index 3bc764f6f9afa..68f8e8b3abf86 100644 --- a/metrics/server.go +++ b/metrics/server.go @@ -229,6 +229,15 @@ var ( Name: "tiflash_query_total", Help: "Counter of TiFlash queries.", }, []string{LblType, LblResult}) + + PDApiExecutionHistogram = prometheus.NewHistogramVec( + prometheus.HistogramOpts{ + Namespace: "tidb", + Subsystem: "server", + Name: "pd_api_execution_duration_seconds", + Help: "Bucketed histogram of all pd api execution time (s)", + Buckets: prometheus.ExponentialBuckets(0.001, 2, 20), // 1ms ~ 524s + }, []string{LblType}) ) // ExecuteErrorToLabel converts an execute error to label. diff --git a/parser/ast/ddl.go b/parser/ast/ddl.go index 88407fb438abe..28834697b1961 100644 --- a/parser/ast/ddl.go +++ b/parser/ast/ddl.go @@ -15,6 +15,7 @@ package ast import ( "github.com/pingcap/errors" + "github.com/pingcap/tidb/parser/auth" "github.com/pingcap/tidb/parser/format" "github.com/pingcap/tidb/parser/model" @@ -1435,6 +1436,7 @@ func (n *CreateViewStmt) Accept(v Visitor) (Node, bool) { type CreatePlacementPolicyStmt struct { ddlNode + OrReplace bool IfNotExists bool PolicyName model.CIStr PlacementOptions []*PlacementOption @@ -1442,7 +1444,11 @@ type CreatePlacementPolicyStmt struct { // Restore implements Node interface. func (n *CreatePlacementPolicyStmt) Restore(ctx *format.RestoreCtx) error { - ctx.WriteKeyWord("CREATE PLACEMENT POLICY ") + ctx.WriteKeyWord("CREATE ") + if n.OrReplace { + ctx.WriteKeyWord("OR REPLACE ") + } + ctx.WriteKeyWord("PLACEMENT POLICY ") if n.IfNotExists { ctx.WriteKeyWord("IF NOT EXISTS ") } @@ -1684,7 +1690,9 @@ type DropIndexStmt struct { func (n *DropIndexStmt) Restore(ctx *format.RestoreCtx) error { ctx.WriteKeyWord("DROP INDEX ") if n.IfExists { - ctx.WriteKeyWord("IF EXISTS ") + ctx.WriteWithSpecialComments("", func() { + ctx.WriteKeyWord("IF EXISTS ") + }) } ctx.WriteName(n.IndexName) ctx.WriteKeyWord(" ON ") @@ -1956,6 +1964,16 @@ func (n *PlacementOption) Restore(ctx *format.RestoreCtx) error { return nil } +type StatsOptionType int + +const ( + StatsOptionBuckets StatsOptionType = 0x5000 + iota + StatsOptionTopN + StatsOptionColsChoice + StatsOptionColList + StatsOptionSampleRate +) + // TableOptionType is the type for TableOption type TableOptionType int @@ -2008,6 +2026,11 @@ const ( TableOptionPlacementFollowerConstraints = TableOptionType(PlacementOptionFollowerConstraints) TableOptionPlacementVoterConstraints = TableOptionType(PlacementOptionVoterConstraints) TableOptionPlacementPolicy = TableOptionType(PlacementOptionPolicy) + TableOptionStatsBuckets = TableOptionType(StatsOptionBuckets) + TableOptionStatsTopN = TableOptionType(StatsOptionTopN) + TableOptionStatsColsChoice = TableOptionType(StatsOptionColsChoice) + TableOptionStatsColList = TableOptionType(StatsOptionColList) + TableOptionStatsSampleRate = TableOptionType(StatsOptionSampleRate) ) // RowFormat types @@ -2052,6 +2075,7 @@ type TableOption struct { StrValue string UintValue uint64 BoolValue bool + Value ValueExpr TableNames []*TableName } @@ -2280,6 +2304,46 @@ func (n *TableOption) Restore(ctx *format.RestoreCtx) error { StrValue: n.StrValue, } return placementOpt.Restore(ctx) + case TableOptionStatsBuckets: + ctx.WriteKeyWord("STATS_BUCKETS ") + ctx.WritePlain("= ") + if n.Default { + ctx.WriteKeyWord("DEFAULT") + } else { + ctx.WritePlainf("%d", n.UintValue) + } + case TableOptionStatsTopN: + ctx.WriteKeyWord("STATS_TOPN ") + ctx.WritePlain("= ") + if n.Default { + ctx.WriteKeyWord("DEFAULT") + } else { + ctx.WritePlainf("%d", n.UintValue) + } + case TableOptionStatsSampleRate: + ctx.WriteKeyWord("STATS_SAMPLE_RATE ") + ctx.WritePlain("= ") + if n.Default { + ctx.WriteKeyWord("DEFAULT") + } else { + ctx.WritePlainf("%v", n.Value.GetValue()) + } + case TableOptionStatsColsChoice: + ctx.WriteKeyWord("STATS_COL_CHOICE ") + ctx.WritePlain("= ") + if n.Default { + ctx.WriteKeyWord("DEFAULT") + } else { + ctx.WriteString(n.StrValue) + } + case TableOptionStatsColList: + ctx.WriteKeyWord("STATS_COL_LIST ") + ctx.WritePlain("= ") + if n.Default { + ctx.WriteKeyWord("DEFAULT") + } else { + ctx.WriteString(n.StrValue) + } default: return errors.Errorf("invalid TableOption: %d", n.Tp) } @@ -2428,7 +2492,9 @@ const ( AlterTableRenameIndex AlterTableForce AlterTableAddPartitions - AlterTableAlterPartition + // A tombstone for `AlterTableAlterPartition`. It will never be used anymore. + // Just left a tombstone here to keep the enum number unchanged. + __DEPRECATED_AlterTableAlterPartition AlterTablePartitionAttributes AlterTablePartitionOptions AlterTableCoalescePartitions @@ -2459,12 +2525,15 @@ const ( AlterTableOrderByColumns // AlterTableSetTiFlashReplica uses to set the table TiFlash replica. AlterTableSetTiFlashReplica - AlterTablePlacement + // A tombstone for `AlterTablePlacement`. It will never be used anymore. + // Just left a tombstone here to keep the enum number unchanged. + __DEPRECATED_AlterTablePlacement AlterTableAddStatistics AlterTableDropStatistics AlterTableAttributes AlterTableCache AlterTableNoCache + AlterTableStatsOptions ) // LockType is the type for AlterTableSpec. @@ -2537,34 +2606,34 @@ type AlterTableSpec struct { NoWriteToBinlog bool OnAllPartitions bool - Tp AlterTableType - Name string - IndexName model.CIStr - Constraint *Constraint - Options []*TableOption - OrderByList []*AlterOrderItem - NewTable *TableName - NewColumns []*ColumnDef - NewConstraints []*Constraint - OldColumnName *ColumnName - NewColumnName *ColumnName - Position *ColumnPosition - LockType LockType - Algorithm AlgorithmType - Comment string - FromKey model.CIStr - ToKey model.CIStr - Partition *PartitionOptions - PartitionNames []model.CIStr - PartDefinitions []*PartitionDefinition - WithValidation bool - Num uint64 - Visibility IndexVisibility - TiFlashReplica *TiFlashReplicaSpec - PlacementSpecs []*PlacementSpec - Writeable bool - Statistics *StatisticsSpec - AttributesSpec *AttributesSpec + Tp AlterTableType + Name string + IndexName model.CIStr + Constraint *Constraint + Options []*TableOption + OrderByList []*AlterOrderItem + NewTable *TableName + NewColumns []*ColumnDef + NewConstraints []*Constraint + OldColumnName *ColumnName + NewColumnName *ColumnName + Position *ColumnPosition + LockType LockType + Algorithm AlgorithmType + Comment string + FromKey model.CIStr + ToKey model.CIStr + Partition *PartitionOptions + PartitionNames []model.CIStr + PartDefinitions []*PartitionDefinition + WithValidation bool + Num uint64 + Visibility IndexVisibility + TiFlashReplica *TiFlashReplicaSpec + Writeable bool + Statistics *StatisticsSpec + AttributesSpec *AttributesSpec + StatsOptionsSpec *StatsOptionsSpec } type TiFlashReplicaSpec struct { @@ -2853,23 +2922,6 @@ func (n *AlterTableSpec) Restore(ctx *format.RestoreCtx) error { ctx.WriteKeyWord(" PARTITIONS ") ctx.WritePlainf("%d", n.Num) } - case AlterTableAlterPartition: - if len(n.PartitionNames) != 1 { - return errors.Errorf("Maybe partition options are combined.") - } - - ctx.WriteKeyWord("ALTER PARTITION ") - ctx.WriteName(n.PartitionNames[0].O) - ctx.WritePlain(" ") - - for i, spec := range n.PlacementSpecs { - if i != 0 { - ctx.WritePlain(", ") - } - if err := spec.Restore(ctx); err != nil { - return errors.Annotatef(err, "An error occurred while restore AlterTableSpec.PlacementSpecs[%d]", i) - } - } case AlterTablePartitionOptions: ctx.WriteKeyWord("PARTITION ") ctx.WriteName(n.PartitionNames[0].O) @@ -3082,15 +3134,6 @@ func (n *AlterTableSpec) Restore(ctx *format.RestoreCtx) error { case IndexVisibilityInvisible: ctx.WriteKeyWord(" INVISIBLE") } - case AlterTablePlacement: - for i, spec := range n.PlacementSpecs { - if i != 0 { - ctx.WritePlain(", ") - } - if err := spec.Restore(ctx); err != nil { - return errors.Annotatef(err, "An error occurred while restore AlterTableSpec.PlacementSpecs[%d]", i) - } - } case AlterTableAttributes: spec := n.AttributesSpec if err := spec.Restore(ctx); err != nil { @@ -3100,6 +3143,12 @@ func (n *AlterTableSpec) Restore(ctx *format.RestoreCtx) error { ctx.WriteKeyWord("CACHE") case AlterTableNoCache: ctx.WriteKeyWord("NOCACHE") + case AlterTableStatsOptions: + spec := n.StatsOptionsSpec + if err := spec.Restore(ctx); err != nil { + return errors.Annotatef(err, "An error occurred while restore AlterTableSpec.StatsOptionsSpec") + } + default: // TODO: not support ctx.WritePlainf(" /* AlterTableType(%d) is not supported */ ", n.Tp) @@ -3168,13 +3217,6 @@ func (n *AlterTableSpec) Accept(v Visitor) (Node, bool) { return n, false } } - for i, spec := range n.PlacementSpecs { - node, ok := spec.Accept(v) - if !ok { - return n, false - } - n.PlacementSpecs[i] = node.(*PlacementSpec) - } return v.Leave(n) } @@ -3839,113 +3881,57 @@ func (n *FlashBackTableStmt) Accept(v Visitor) (Node, bool) { return v.Leave(n) } -type PlacementActionType int - -const ( - PlacementAdd PlacementActionType = iota + 1 - PlacementAlter - PlacementDrop -) - -type PlacementRole int - -const ( - PlacementRoleNone PlacementRole = iota - PlacementRoleLeader - PlacementRoleFollower - PlacementRoleLearner - PlacementRoleVoter -) - -type PlacementSpec struct { +type AttributesSpec struct { node - Tp PlacementActionType - Constraints string - Role PlacementRole - Replicas uint64 + Attributes string + Default bool } -func (n *PlacementSpec) restoreRole(ctx *format.RestoreCtx) error { - ctx.WriteKeyWord(" ROLE") +func (n *AttributesSpec) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("ATTRIBUTES") ctx.WritePlain("=") - switch n.Role { - case PlacementRoleFollower: - ctx.WriteKeyWord("FOLLOWER") - case PlacementRoleLeader: - ctx.WriteKeyWord("LEADER") - case PlacementRoleLearner: - ctx.WriteKeyWord("LEARNER") - case PlacementRoleVoter: - ctx.WriteKeyWord("VOTER") - default: - return errors.Errorf("invalid PlacementRole: %d", n.Role) - } - return nil -} - -func (n *PlacementSpec) Restore(ctx *format.RestoreCtx) error { - switch n.Tp { - case PlacementAdd: - ctx.WriteKeyWord("ADD PLACEMENT POLICY ") - case PlacementAlter: - ctx.WriteKeyWord("ALTER PLACEMENT POLICY ") - case PlacementDrop: - ctx.WriteKeyWord("DROP PLACEMENT POLICY") - if n.Role != PlacementRoleNone { - return n.restoreRole(ctx) - } + if n.Default { + ctx.WriteKeyWord("DEFAULT") return nil - default: - return errors.Errorf("invalid PlacementActionType: %d", n.Tp) - } - - ctx.WriteKeyWord("CONSTRAINTS") - ctx.WritePlain("=") - ctx.WriteString(n.Constraints) - - if err := n.restoreRole(ctx); err != nil { - return err } - - ctx.WriteKeyWord(" REPLICAS") - ctx.WritePlainf("=%d", n.Replicas) + ctx.WriteString(n.Attributes) return nil } -func (n *PlacementSpec) Accept(v Visitor) (Node, bool) { +func (n *AttributesSpec) Accept(v Visitor) (Node, bool) { newNode, skipChildren := v.Enter(n) if skipChildren { return v.Leave(newNode) } - n = newNode.(*PlacementSpec) + n = newNode.(*AttributesSpec) return v.Leave(n) } -type AttributesSpec struct { +type StatsOptionsSpec struct { node - Attributes string - Default bool + StatsOptions string + Default bool } -func (n *AttributesSpec) Restore(ctx *format.RestoreCtx) error { - ctx.WriteKeyWord("ATTRIBUTES") +func (n *StatsOptionsSpec) Restore(ctx *format.RestoreCtx) error { + ctx.WriteKeyWord("STATS_OPTIONS") ctx.WritePlain("=") if n.Default { ctx.WriteKeyWord("DEFAULT") return nil } - ctx.WriteString(n.Attributes) + ctx.WriteString(n.StatsOptions) return nil } -func (n *AttributesSpec) Accept(v Visitor) (Node, bool) { +func (n *StatsOptionsSpec) Accept(v Visitor) (Node, bool) { newNode, skipChildren := v.Enter(n) if skipChildren { return v.Leave(newNode) } - n = newNode.(*AttributesSpec) + n = newNode.(*StatsOptionsSpec) return v.Leave(n) } diff --git a/parser/ast/ddl_test.go b/parser/ast/ddl_test.go index d6b92b13edc89..af4ecc5a6ca85 100644 --- a/parser/ast/ddl_test.go +++ b/parser/ast/ddl_test.go @@ -14,21 +14,19 @@ package ast_test import ( - . "github.com/pingcap/check" + "testing" + + "github.com/stretchr/testify/require" + . "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/format" ) -var _ = Suite(&testDDLSuite{}) - -type testDDLSuite struct { -} - -func (ts *testDDLSuite) TestDDLVisitorCover(c *C) { +func TestDDLVisitorCover(t *testing.T) { ce := &checkExpr{} constraint := &Constraint{Keys: []*IndexPartSpecification{{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{}}, PlacementSpecs: []*PlacementSpec{{}, {}}, AttributesSpec: &AttributesSpec{}} + alterTableSpec := &AlterTableSpec{Constraint: constraint, Options: []*TableOption{{}}, NewTable: &TableName{}, NewColumns: []*ColumnDef{{Name: &ColumnName{}}}, OldColumnName: &ColumnName{}, Position: &ColumnPosition{RelativeColumn: &ColumnName{}}, AttributesSpec: &AttributesSpec{}} stmts := []struct { node Node @@ -62,13 +60,13 @@ func (ts *testDDLSuite) TestDDLVisitorCover(c *C) { for _, v := range stmts { ce.reset() v.node.Accept(checkVisitor{}) - c.Check(ce.enterCnt, Equals, v.expectedEnterCnt) - c.Check(ce.leaveCnt, Equals, v.expectedLeaveCnt) + require.Equal(t, v.expectedEnterCnt, ce.enterCnt) + require.Equal(t, v.expectedLeaveCnt, ce.leaveCnt) v.node.Accept(visitor1{}) } } -func (ts *testDDLSuite) TestDDLIndexColNameRestore(c *C) { +func TestDDLIndexColNameRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"(a + 1)", "(`a`+1)"}, {"(1 * 1 + (1 + 1))", "(1*1+(1+1))"}, @@ -77,10 +75,10 @@ func (ts *testDDLSuite) TestDDLIndexColNameRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*CreateIndexStmt).IndexPartSpecifications[0] } - RunNodeRestoreTest(c, testCases, "CREATE INDEX idx ON t (%s) USING HASH", extractNodeFunc) + runNodeRestoreTest(t, testCases, "CREATE INDEX idx ON t (%s) USING HASH", extractNodeFunc) } -func (ts *testDDLSuite) TestDDLIndexExprRestore(c *C) { +func TestDDLIndexExprRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"world", "`world`"}, {"world(2)", "`world`(2)"}, @@ -88,10 +86,10 @@ func (ts *testDDLSuite) TestDDLIndexExprRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*CreateIndexStmt).IndexPartSpecifications[0] } - RunNodeRestoreTest(c, testCases, "CREATE INDEX idx ON t (%s) USING HASH", extractNodeFunc) + runNodeRestoreTest(t, testCases, "CREATE INDEX idx ON t (%s) USING HASH", extractNodeFunc) } -func (ts *testDDLSuite) TestDDLOnDeleteRestore(c *C) { +func TestDDLOnDeleteRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"on delete restrict", "ON DELETE RESTRICT"}, {"on delete CASCADE", "ON DELETE CASCADE"}, @@ -101,12 +99,12 @@ func (ts *testDDLSuite) TestDDLOnDeleteRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*CreateTableStmt).Constraints[1].Refer.OnDelete } - RunNodeRestoreTest(c, testCases, "CREATE TABLE child (id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) %s)", extractNodeFunc) - RunNodeRestoreTest(c, testCases, "CREATE TABLE child (id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) on update CASCADE %s)", extractNodeFunc) - RunNodeRestoreTest(c, testCases, "CREATE TABLE child (id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) %s on update CASCADE)", extractNodeFunc) + runNodeRestoreTest(t, testCases, "CREATE TABLE child (id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) %s)", extractNodeFunc) + runNodeRestoreTest(t, testCases, "CREATE TABLE child (id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) on update CASCADE %s)", extractNodeFunc) + runNodeRestoreTest(t, testCases, "CREATE TABLE child (id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) %s on update CASCADE)", extractNodeFunc) } -func (ts *testDDLSuite) TestDDLOnUpdateRestore(c *C) { +func TestDDLOnUpdateRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"ON UPDATE RESTRICT", "ON UPDATE RESTRICT"}, {"on update CASCADE", "ON UPDATE CASCADE"}, @@ -116,12 +114,12 @@ func (ts *testDDLSuite) TestDDLOnUpdateRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*CreateTableStmt).Constraints[1].Refer.OnUpdate } - RunNodeRestoreTest(c, testCases, "CREATE TABLE child ( id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE %s )", extractNodeFunc) - RunNodeRestoreTest(c, testCases, "CREATE TABLE child ( id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) %s ON DELETE CASCADE)", extractNodeFunc) - RunNodeRestoreTest(c, testCases, "CREATE TABLE child ( id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) %s )", extractNodeFunc) + runNodeRestoreTest(t, testCases, "CREATE TABLE child ( id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE %s )", extractNodeFunc) + runNodeRestoreTest(t, testCases, "CREATE TABLE child ( id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) %s ON DELETE CASCADE)", extractNodeFunc) + runNodeRestoreTest(t, testCases, "CREATE TABLE child ( id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) %s )", extractNodeFunc) } -func (ts *testDDLSuite) TestDDLIndexOption(c *C) { +func TestDDLIndexOption(t *testing.T) { testCases := []NodeRestoreTestCase{ {"key_block_size=16", "KEY_BLOCK_SIZE=16"}, {"USING HASH", "USING HASH"}, @@ -136,20 +134,20 @@ func (ts *testDDLSuite) TestDDLIndexOption(c *C) { extractNodeFunc := func(node Node) Node { return node.(*CreateIndexStmt).IndexOption } - RunNodeRestoreTest(c, testCases, "CREATE INDEX idx ON t (a) %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "CREATE INDEX idx ON t (a) %s", extractNodeFunc) } -func (ts *testDDLSuite) TestTableToTableRestore(c *C) { +func TestTableToTableRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"t1 to t2", "`t1` TO `t2`"}, } extractNodeFunc := func(node Node) Node { return node.(*RenameTableStmt).TableToTables[0] } - RunNodeRestoreTest(c, testCases, "rename table %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "rename table %s", extractNodeFunc) } -func (ts *testDDLSuite) TestDDLReferenceDefRestore(c *C) { +func TestDDLReferenceDefRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"REFERENCES parent(id) ON DELETE CASCADE ON UPDATE RESTRICT", "REFERENCES `parent`(`id`) ON DELETE CASCADE ON UPDATE RESTRICT"}, {"REFERENCES parent(id) ON DELETE CASCADE", "REFERENCES `parent`(`id`) ON DELETE CASCADE"}, @@ -162,10 +160,10 @@ func (ts *testDDLSuite) TestDDLReferenceDefRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*CreateTableStmt).Constraints[1].Refer } - RunNodeRestoreTest(c, testCases, "CREATE TABLE child (id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) %s)", extractNodeFunc) + runNodeRestoreTest(t, testCases, "CREATE TABLE child (id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) %s)", extractNodeFunc) } -func (ts *testDDLSuite) TestDDLConstraintRestore(c *C) { +func TestDDLConstraintRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"INDEX par_ind (parent_id)", "INDEX `par_ind`(`parent_id`)"}, {"INDEX par_ind (parent_id(6))", "INDEX `par_ind`(`parent_id`(6))"}, @@ -204,7 +202,7 @@ func (ts *testDDLSuite) TestDDLConstraintRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*CreateTableStmt).Constraints[0] } - RunNodeRestoreTest(c, testCases, "CREATE TABLE child (id INT, parent_id INT, %s)", extractNodeFunc) + runNodeRestoreTest(t, testCases, "CREATE TABLE child (id INT, parent_id INT, %s)", extractNodeFunc) specialCommentCases := []NodeRestoreTestCase{ {"PRIMARY KEY (id) CLUSTERED", "PRIMARY KEY(`id`) /*T![clustered_index] CLUSTERED */"}, @@ -212,12 +210,12 @@ func (ts *testDDLSuite) TestDDLConstraintRestore(c *C) { {"PRIMARY KEY (id) /*T![clustered_index] CLUSTERED */", "PRIMARY KEY(`id`) /*T![clustered_index] CLUSTERED */"}, {"primary key (id) /*T![clustered_index] NONCLUSTERED */", "PRIMARY KEY(`id`) /*T![clustered_index] NONCLUSTERED */"}, } - RunNodeRestoreTestWithFlags(c, specialCommentCases, + runNodeRestoreTestWithFlags(t, specialCommentCases, "CREATE TABLE child (id INT, parent_id INT, %s)", extractNodeFunc, format.DefaultRestoreFlags|format.RestoreTiDBSpecialComment) } -func (ts *testDDLSuite) TestDDLColumnOptionRestore(c *C) { +func TestDDLColumnOptionRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"primary key", "PRIMARY KEY"}, {"not null", "NOT NULL"}, @@ -248,10 +246,10 @@ func (ts *testDDLSuite) TestDDLColumnOptionRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*CreateTableStmt).Cols[0].Options[0] } - RunNodeRestoreTest(c, testCases, "CREATE TABLE child (id INT %s)", extractNodeFunc) + runNodeRestoreTest(t, testCases, "CREATE TABLE child (id INT %s)", extractNodeFunc) } -func (ts *testDDLSuite) TestDDLColumnDefRestore(c *C) { +func TestDDLColumnDefRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ // for type {"id json", "`id` JSON"}, @@ -372,10 +370,10 @@ func (ts *testDDLSuite) TestDDLColumnDefRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*CreateTableStmt).Cols[0] } - RunNodeRestoreTest(c, testCases, "CREATE TABLE t (%s)", extractNodeFunc) + runNodeRestoreTest(t, testCases, "CREATE TABLE t (%s)", extractNodeFunc) } -func (ts *testDDLSuite) TestDDLTruncateTableStmtRestore(c *C) { +func TestDDLTruncateTableStmtRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"truncate t1", "TRUNCATE TABLE `t1`"}, {"truncate table t1", "TRUNCATE TABLE `t1`"}, @@ -384,10 +382,10 @@ func (ts *testDDLSuite) TestDDLTruncateTableStmtRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*TruncateTableStmt) } - RunNodeRestoreTest(c, testCases, "%s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "%s", extractNodeFunc) } -func (ts *testDDLSuite) TestDDLDropTableStmtRestore(c *C) { +func TestDDLDropTableStmtRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"drop table t1", "DROP TABLE `t1`"}, {"drop table if exists t1", "DROP TABLE IF EXISTS `t1`"}, @@ -398,10 +396,10 @@ func (ts *testDDLSuite) TestDDLDropTableStmtRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*DropTableStmt) } - RunNodeRestoreTest(c, testCases, "%s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "%s", extractNodeFunc) } -func (ts *testDDLSuite) TestColumnPositionRestore(c *C) { +func TestColumnPositionRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"", ""}, {"first", "FIRST"}, @@ -410,10 +408,10 @@ func (ts *testDDLSuite) TestColumnPositionRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*AlterTableStmt).Specs[0].Position } - RunNodeRestoreTest(c, testCases, "alter table t add column a varchar(255) %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "alter table t add column a varchar(255) %s", extractNodeFunc) } -func (ts *testDDLSuite) TestAlterTableSpecRestore(c *C) { +func TestAlterTableSpecRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"ENGINE innodb", "ENGINE = innodb"}, {"ENGINE = innodb", "ENGINE = innodb"}, @@ -539,10 +537,10 @@ func (ts *testDDLSuite) TestAlterTableSpecRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*AlterTableStmt).Specs[0] } - RunNodeRestoreTest(c, testCases, "ALTER TABLE t %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "ALTER TABLE t %s", extractNodeFunc) } -func (ts *testDDLSuite) TestAlterTableOptionRestore(c *C) { +func TestAlterTableOptionRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"ALTER TABLE t ROW_FORMAT = COMPRESSED KEY_BLOCK_SIZE = 8", "ALTER TABLE `t` ROW_FORMAT = COMPRESSED KEY_BLOCK_SIZE = 8"}, {"ALTER TABLE t ROW_FORMAT = COMPRESSED, KEY_BLOCK_SIZE = 8", "ALTER TABLE `t` ROW_FORMAT = COMPRESSED, KEY_BLOCK_SIZE = 8"}, @@ -550,10 +548,10 @@ func (ts *testDDLSuite) TestAlterTableOptionRestore(c *C) { extractNodeFunc := func(node Node) Node { return node } - RunNodeRestoreTest(c, testCases, "%s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "%s", extractNodeFunc) } -func (ts *testDDLSuite) TestAdminRepairTableRestore(c *C) { +func TestAdminRepairTableRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"ADMIN REPAIR TABLE t CREATE TABLE t (a int)", "ADMIN REPAIR TABLE `t` CREATE TABLE `t` (`a` INT)"}, {"ADMIN REPAIR TABLE t CREATE TABLE t (a char(1), b int)", "ADMIN REPAIR TABLE `t` CREATE TABLE `t` (`a` CHAR(1),`b` INT)"}, @@ -562,10 +560,10 @@ func (ts *testDDLSuite) TestAdminRepairTableRestore(c *C) { extractNodeFunc := func(node Node) Node { return node } - RunNodeRestoreTest(c, testCases, "%s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "%s", extractNodeFunc) } -func (ts *testDDLSuite) TestSequenceRestore(c *C) { +func TestSequenceRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"create sequence seq", "CREATE SEQUENCE `seq`"}, {"create sequence if not exists seq", "CREATE SEQUENCE IF NOT EXISTS `seq`"}, @@ -606,5 +604,27 @@ func (ts *testDDLSuite) TestSequenceRestore(c *C) { extractNodeFunc := func(node Node) Node { return node } - RunNodeRestoreTest(c, testCases, "%s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "%s", extractNodeFunc) +} + +func TestDropIndexRestore(t *testing.T) { + sourceSQL := "drop index if exists idx on t" + cases := []struct { + flags format.RestoreFlags + expectSQL string + }{ + {format.DefaultRestoreFlags, "DROP INDEX IF EXISTS `idx` ON `t`"}, + {format.DefaultRestoreFlags | format.RestoreTiDBSpecialComment, "DROP INDEX /*T! IF EXISTS */`idx` ON `t`"}, + } + + extractNodeFunc := func(node Node) Node { + return node + } + + for _, ca := range cases { + testCases := []NodeRestoreTestCase{ + {sourceSQL, ca.expectSQL}, + } + runNodeRestoreTestWithFlags(t, testCases, "%s", extractNodeFunc, ca.flags) + } } diff --git a/parser/ast/dml.go b/parser/ast/dml.go index edd4a6b04727e..cd29e293ba875 100644 --- a/parser/ast/dml.go +++ b/parser/ast/dml.go @@ -1100,6 +1100,8 @@ type SelectStmt struct { // Lists is filled only when Kind == SelectStmtKindValues Lists []*RowExpr With *WithClause + // AsViewSchema indicates if this stmt provides the schema for the view. It is only used when creating the view + AsViewSchema bool } func (*SelectStmt) resultSet() {} @@ -2578,6 +2580,7 @@ const ( ShowStatsTopN ShowStatsBuckets ShowStatsHealthy + ShowHistogramsInFlight ShowColumnStatsUsage ShowPlugins ShowProfile @@ -2766,6 +2769,11 @@ func (n *ShowStmt) Restore(ctx *format.RestoreCtx) error { if err := restoreShowLikeOrWhereOpt(); err != nil { return err } + case ShowHistogramsInFlight: + ctx.WriteKeyWord("HISTOGRAMS_IN_FLIGHT") + if err := restoreShowLikeOrWhereOpt(); err != nil { + return err + } case ShowColumnStatsUsage: ctx.WriteKeyWord("COLUMN_STATS_USAGE") if err := restoreShowLikeOrWhereOpt(); err != nil { @@ -2827,12 +2835,12 @@ func (n *ShowStmt) Restore(ctx *format.RestoreCtx) error { case ShowPlacementForTable: ctx.WriteKeyWord("PLACEMENT FOR TABLE ") if err := n.Table.Restore(ctx); err != nil { - return errors.Annotate(err, "An error occurred while resotre ShowStmt.Table") + return errors.Annotate(err, "An error occurred while restore ShowStmt.Table") } case ShowPlacementForPartition: ctx.WriteKeyWord("PLACEMENT FOR TABLE ") if err := n.Table.Restore(ctx); err != nil { - return errors.Annotate(err, "An error occurred while resotre ShowStmt.Table") + return errors.Annotate(err, "An error occurred while restore ShowStmt.Table") } ctx.WriteKeyWord(" PARTITION ") ctx.WriteName(n.Partition.String()) @@ -2862,7 +2870,7 @@ func (n *ShowStmt) Restore(ctx *format.RestoreCtx) error { // FROM or IN ctx.WriteKeyWord("INDEX IN ") if err := n.Table.Restore(ctx); err != nil { - return errors.Annotate(err, "An error occurred while resotre ShowStmt.Table") + return errors.Annotate(err, "An error occurred while restore ShowStmt.Table") } // TODO: remember to check this case case ShowColumns: // equivalent to SHOW FIELDS if n.Extended { @@ -2874,7 +2882,7 @@ func (n *ShowStmt) Restore(ctx *format.RestoreCtx) error { // FROM or IN ctx.WriteKeyWord(" IN ") if err := n.Table.Restore(ctx); err != nil { - return errors.Annotate(err, "An error occurred while resotre ShowStmt.Table") + return errors.Annotate(err, "An error occurred while restore ShowStmt.Table") } } restoreShowDatabaseNameOpt() @@ -2916,7 +2924,7 @@ func (n *ShowStmt) Restore(ctx *format.RestoreCtx) error { case ShowRegions: ctx.WriteKeyWord("TABLE ") if err := n.Table.Restore(ctx); err != nil { - return errors.Annotate(err, "An error occurred while restore SplitIndexRegionStmt.Table") + return errors.Annotate(err, "An error occurred while restore ShowStmt.Table") } if len(n.IndexName.L) > 0 { ctx.WriteKeyWord(" INDEX ") @@ -2930,7 +2938,7 @@ func (n *ShowStmt) Restore(ctx *format.RestoreCtx) error { case ShowTableNextRowId: ctx.WriteKeyWord("TABLE ") if err := n.Table.Restore(ctx); err != nil { - return errors.Annotate(err, "An error occurred while restore SplitIndexRegionStmt.Table") + return errors.Annotate(err, "An error occurred while restore ShowStmt.Table") } ctx.WriteKeyWord(" NEXT_ROW_ID") return nil diff --git a/parser/ast/dml_test.go b/parser/ast/dml_test.go index 0ed3fafb35f94..624717d2d7c54 100644 --- a/parser/ast/dml_test.go +++ b/parser/ast/dml_test.go @@ -14,16 +14,13 @@ package ast_test import ( - . "github.com/pingcap/check" + "testing" + . "github.com/pingcap/tidb/parser/ast" + "github.com/stretchr/testify/require" ) -var _ = Suite(&testDMLSuite{}) - -type testDMLSuite struct { -} - -func (ts *testDMLSuite) TestDMLVisitorCover(c *C) { +func TestDMLVisitorCover(t *testing.T) { ce := &checkExpr{} tableRefsClause := &TableRefsClause{TableRefs: &Join{Left: &TableSource{Source: &TableName{}}, On: &OnCondition{Expr: ce}}} @@ -67,13 +64,13 @@ func (ts *testDMLSuite) TestDMLVisitorCover(c *C) { for _, v := range stmts { ce.reset() v.node.Accept(checkVisitor{}) - c.Check(ce.enterCnt, Equals, v.expectedEnterCnt) - c.Check(ce.leaveCnt, Equals, v.expectedLeaveCnt) + require.Equal(t, v.expectedEnterCnt, ce.enterCnt) + require.Equal(t, v.expectedLeaveCnt, ce.leaveCnt) v.node.Accept(visitor1{}) } } -func (tc *testDMLSuite) TestTableNameRestore(c *C) { +func TestTableNameRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"dbb.`tbb1`", "`dbb`.`tbb1`"}, {"`tbb2`", "`tbb2`"}, @@ -85,10 +82,10 @@ func (tc *testDMLSuite) TestTableNameRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*CreateTableStmt).Table } - RunNodeRestoreTest(c, testCases, "CREATE TABLE %s (id VARCHAR(128) NOT NULL);", extractNodeFunc) + runNodeRestoreTest(t, testCases, "CREATE TABLE %s (id VARCHAR(128) NOT NULL);", extractNodeFunc) } -func (tc *testDMLSuite) TestTableNameIndexHintsRestore(c *C) { +func TestTableNameIndexHintsRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"t use index (hello)", "`t` USE INDEX (`hello`)"}, {"t use index (hello, world)", "`t` USE INDEX (`hello`, `world`)"}, @@ -127,10 +124,10 @@ func (tc *testDMLSuite) TestTableNameIndexHintsRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).From.TableRefs.Left } - RunNodeRestoreTest(c, testCases, "SELECT * FROM %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "SELECT * FROM %s", extractNodeFunc) } -func (tc *testDMLSuite) TestLimitRestore(c *C) { +func TestLimitRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"limit 10", "LIMIT 10"}, {"limit 10,20", "LIMIT 10,20"}, @@ -139,10 +136,10 @@ func (tc *testDMLSuite) TestLimitRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Limit } - RunNodeRestoreTest(c, testCases, "SELECT 1 %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "SELECT 1 %s", extractNodeFunc) } -func (tc *testDMLSuite) TestWildCardFieldRestore(c *C) { +func TestWildCardFieldRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"*", "*"}, {"t.*", "`t`.*"}, @@ -151,10 +148,10 @@ func (tc *testDMLSuite) TestWildCardFieldRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].WildCard } - RunNodeRestoreTest(c, testCases, "SELECT %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "SELECT %s", extractNodeFunc) } -func (tc *testDMLSuite) TestSelectFieldRestore(c *C) { +func TestSelectFieldRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"*", "*"}, {"t.*", "`t`.*"}, @@ -165,10 +162,10 @@ func (tc *testDMLSuite) TestSelectFieldRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0] } - RunNodeRestoreTest(c, testCases, "SELECT %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "SELECT %s", extractNodeFunc) } -func (tc *testDMLSuite) TestFieldListRestore(c *C) { +func TestFieldListRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"*", "*"}, {"t.*", "`t`.*"}, @@ -179,10 +176,10 @@ func (tc *testDMLSuite) TestFieldListRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields } - RunNodeRestoreTest(c, testCases, "SELECT %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "SELECT %s", extractNodeFunc) } -func (tc *testDMLSuite) TestTableSourceRestore(c *C) { +func TestTableSourceRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"tbl", "`tbl`"}, {"tbl as t", "`tbl` AS `t`"}, @@ -192,10 +189,10 @@ func (tc *testDMLSuite) TestTableSourceRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).From.TableRefs.Left } - RunNodeRestoreTest(c, testCases, "select * from %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select * from %s", extractNodeFunc) } -func (tc *testDMLSuite) TestOnConditionRestore(c *C) { +func TestOnConditionRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"on t1.a=t2.a", "ON `t1`.`a`=`t2`.`a`"}, {"on t1.a=t2.a and t1.b=t2.b", "ON `t1`.`a`=`t2`.`a` AND `t1`.`b`=`t2`.`b`"}, @@ -203,10 +200,10 @@ func (tc *testDMLSuite) TestOnConditionRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).From.TableRefs.On } - RunNodeRestoreTest(c, testCases, "select * from t1 join t2 %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select * from t1 join t2 %s", extractNodeFunc) } -func (tc *testDMLSuite) TestJoinRestore(c *C) { +func TestJoinRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"t1 natural join t2", "`t1` NATURAL JOIN `t2`"}, {"t1 natural left join t2", "`t1` NATURAL LEFT JOIN `t2`"}, @@ -240,11 +237,11 @@ func (tc *testDMLSuite) TestJoinRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).From.TableRefs } - RunNodeRestoreTest(c, testCases, "select * from %s", extractNodeFunc) - RunNodeRestoreTestWithFlagsStmtChange(c, testChangedCases, "select * from %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select * from %s", extractNodeFunc) + runNodeRestoreTestWithFlagsStmtChange(t, testChangedCases, "select * from %s", extractNodeFunc) } -func (ts *testDMLSuite) TestTableRefsClauseRestore(c *C) { +func TestTableRefsClauseRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"t", "`t`"}, {"t1 join t2", "`t1` JOIN `t2`"}, @@ -253,21 +250,21 @@ func (ts *testDMLSuite) TestTableRefsClauseRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).From } - RunNodeRestoreTest(c, testCases, "select * from %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select * from %s", extractNodeFunc) } -func (tc *testDMLSuite) TestDeleteTableListRestore(c *C) { +func TestDeleteTableListRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"t1,t2", "`t1`,`t2`"}, } extractNodeFunc := func(node Node) Node { return node.(*DeleteStmt).Tables } - RunNodeRestoreTest(c, testCases, "DELETE %s FROM t1, t2;", extractNodeFunc) - RunNodeRestoreTest(c, testCases, "DELETE FROM %s USING t1, t2;", extractNodeFunc) + runNodeRestoreTest(t, testCases, "DELETE %s FROM t1, t2;", extractNodeFunc) + runNodeRestoreTest(t, testCases, "DELETE FROM %s USING t1, t2;", extractNodeFunc) } -func (tc *testDMLSuite) TestDeleteTableIndexHintRestore(c *C) { +func TestDeleteTableIndexHintRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"DELETE FROM t1 USE key (`fld1`) WHERE fld=1", "DELETE FROM `t1` USE INDEX (`fld1`) WHERE `fld`=1"}, @@ -278,10 +275,10 @@ func (tc *testDMLSuite) TestDeleteTableIndexHintRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*DeleteStmt) } - RunNodeRestoreTest(c, testCases, "%s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "%s", extractNodeFunc) } -func (tc *testExpressionsSuite) TestByItemRestore(c *C) { +func TestByItemRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"a", "`a`"}, {"a desc", "`a` DESC"}, @@ -290,10 +287,10 @@ func (tc *testExpressionsSuite) TestByItemRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).OrderBy.Items[0] } - RunNodeRestoreTest(c, testCases, "select * from t order by %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select * from t order by %s", extractNodeFunc) } -func (tc *testExpressionsSuite) TestGroupByClauseRestore(c *C) { +func TestGroupByClauseRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"GROUP BY a,b desc", "GROUP BY `a`,`b` DESC"}, {"GROUP BY 1 desc,b", "GROUP BY 1 DESC,`b`"}, @@ -301,10 +298,10 @@ func (tc *testExpressionsSuite) TestGroupByClauseRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).GroupBy } - RunNodeRestoreTest(c, testCases, "select * from t %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select * from t %s", extractNodeFunc) } -func (tc *testDMLSuite) TestOrderByClauseRestore(c *C) { +func TestOrderByClauseRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"ORDER BY a", "ORDER BY `a`"}, {"ORDER BY a,b", "ORDER BY `a`,`b`"}, @@ -312,15 +309,15 @@ func (tc *testDMLSuite) TestOrderByClauseRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).OrderBy } - RunNodeRestoreTest(c, testCases, "SELECT 1 FROM t1 %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "SELECT 1 FROM t1 %s", extractNodeFunc) extractNodeFromSetOprStmtFunc := func(node Node) Node { return node.(*SetOprStmt).OrderBy } - RunNodeRestoreTest(c, testCases, "SELECT 1 FROM t1 UNION SELECT 2 FROM t2 %s", extractNodeFromSetOprStmtFunc) + runNodeRestoreTest(t, testCases, "SELECT 1 FROM t1 UNION SELECT 2 FROM t2 %s", extractNodeFromSetOprStmtFunc) } -func (tc *testDMLSuite) TestAssignmentRestore(c *C) { +func TestAssignmentRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"a=1", "`a`=1"}, {"b=1+2", "`b`=1+2"}, @@ -328,10 +325,10 @@ func (tc *testDMLSuite) TestAssignmentRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*UpdateStmt).List[0] } - RunNodeRestoreTest(c, testCases, "UPDATE t1 SET %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "UPDATE t1 SET %s", extractNodeFunc) } -func (ts *testDMLSuite) TestHavingClauseRestore(c *C) { +func TestHavingClauseRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"HAVING a", "HAVING `a`"}, {"HAVING NULL", "HAVING NULL"}, @@ -340,10 +337,10 @@ func (ts *testDMLSuite) TestHavingClauseRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Having } - RunNodeRestoreTest(c, testCases, "select 1 from t1 group by 1 %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select 1 from t1 group by 1 %s", extractNodeFunc) } -func (ts *testDMLSuite) TestFrameBoundRestore(c *C) { +func TestFrameBoundRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"CURRENT ROW", "CURRENT ROW"}, {"UNBOUNDED PRECEDING", "UNBOUNDED PRECEDING"}, @@ -358,10 +355,10 @@ func (ts *testDMLSuite) TestFrameBoundRestore(c *C) { extractNodeFunc := func(node Node) Node { return &node.(*SelectStmt).Fields.Fields[0].Expr.(*WindowFuncExpr).Spec.Frame.Extent.Start } - RunNodeRestoreTest(c, testCases, "select avg(val) over (rows between %s and current row) from t", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select avg(val) over (rows between %s and current row) from t", extractNodeFunc) } -func (ts *testDMLSuite) TestFrameClauseRestore(c *C) { +func TestFrameClauseRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"ROWS CURRENT ROW", "ROWS BETWEEN CURRENT ROW AND CURRENT ROW"}, {"ROWS UNBOUNDED PRECEDING", "ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW"}, @@ -372,10 +369,10 @@ func (ts *testDMLSuite) TestFrameClauseRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr.(*WindowFuncExpr).Spec.Frame } - RunNodeRestoreTest(c, testCases, "select avg(val) over (%s) from t", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select avg(val) over (%s) from t", extractNodeFunc) } -func (ts *testDMLSuite) TestPartitionByClauseRestore(c *C) { +func TestPartitionByClauseRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"PARTITION BY a", "PARTITION BY `a`"}, {"PARTITION BY NULL", "PARTITION BY NULL"}, @@ -384,10 +381,10 @@ func (ts *testDMLSuite) TestPartitionByClauseRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr.(*WindowFuncExpr).Spec.PartitionBy } - RunNodeRestoreTest(c, testCases, "select avg(val) over (%s rows current row) from t", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select avg(val) over (%s rows current row) from t", extractNodeFunc) } -func (ts *testDMLSuite) TestWindowSpecRestore(c *C) { +func TestWindowSpecRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"w as ()", "`w` AS ()"}, {"w as (w1)", "`w` AS (`w1`)"}, @@ -397,7 +394,7 @@ func (ts *testDMLSuite) TestWindowSpecRestore(c *C) { extractNodeFunc := func(node Node) Node { return &node.(*SelectStmt).WindowSpecs[0] } - RunNodeRestoreTest(c, testCases, "select rank() over w from t window %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select rank() over w from t window %s", extractNodeFunc) testCases = []NodeRestoreTestCase{ {"w", "`w`"}, @@ -409,11 +406,11 @@ func (ts *testDMLSuite) TestWindowSpecRestore(c *C) { extractNodeFunc = func(node Node) Node { return &node.(*SelectStmt).Fields.Fields[0].Expr.(*WindowFuncExpr).Spec } - RunNodeRestoreTest(c, testCases, "select rank() over %s from t window w as (order by a)", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select rank() over %s from t window w as (order by a)", extractNodeFunc) } -func (ts *testDMLSuite) TestFulltextSearchModifier(c *C) { - c.Assert(FulltextSearchModifier(FulltextSearchModifierNaturalLanguageMode).IsBooleanMode(), IsFalse) - c.Assert(FulltextSearchModifier(FulltextSearchModifierNaturalLanguageMode).IsNaturalLanguageMode(), IsTrue) - c.Assert(FulltextSearchModifier(FulltextSearchModifierNaturalLanguageMode).WithQueryExpansion(), IsFalse) +func TestFulltextSearchModifier(t *testing.T) { + require.False(t, FulltextSearchModifier(FulltextSearchModifierNaturalLanguageMode).IsBooleanMode()) + require.True(t, FulltextSearchModifier(FulltextSearchModifierNaturalLanguageMode).IsNaturalLanguageMode()) + require.False(t, FulltextSearchModifier(FulltextSearchModifierNaturalLanguageMode).WithQueryExpansion()) } diff --git a/parser/ast/expressions_test.go b/parser/ast/expressions_test.go index a3044a5d06948..7f01c84c1049f 100644 --- a/parser/ast/expressions_test.go +++ b/parser/ast/expressions_test.go @@ -14,17 +14,14 @@ package ast_test import ( - . "github.com/pingcap/check" + "testing" + . "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/format" "github.com/pingcap/tidb/parser/mysql" + "github.com/stretchr/testify/require" ) -var _ = Suite(&testExpressionsSuite{}) - -type testExpressionsSuite struct { -} - type checkVisitor struct{} func (v checkVisitor) Enter(in Node) (Node, bool) { @@ -63,7 +60,7 @@ func (n *checkExpr) reset() { n.leaveCnt = 0 } -func (tc *testExpressionsSuite) TestExpresionsVisitorCover(c *C) { +func TestExpresionsVisitorCover(t *testing.T) { ce := &checkExpr{} stmts := []struct { @@ -97,13 +94,13 @@ func (tc *testExpressionsSuite) TestExpresionsVisitorCover(c *C) { for _, v := range stmts { ce.reset() v.node.Accept(checkVisitor{}) - c.Check(ce.enterCnt, Equals, v.expectedEnterCnt) - c.Check(ce.leaveCnt, Equals, v.expectedLeaveCnt) + require.Equal(t, v.expectedEnterCnt, ce.enterCnt) + require.Equal(t, v.expectedLeaveCnt, ce.leaveCnt) v.node.Accept(visitor1{}) } } -func (tc *testExpressionsSuite) TestUnaryOperationExprRestore(c *C) { +func TestUnaryOperationExprRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"++1", "++1"}, {"--1", "--1"}, @@ -116,10 +113,10 @@ func (tc *testExpressionsSuite) TestUnaryOperationExprRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr } - RunNodeRestoreTest(c, testCases, "select %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select %s", extractNodeFunc) } -func (tc *testExpressionsSuite) TestColumnNameExprRestore(c *C) { +func TestColumnNameExprRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"abc", "`abc`"}, {"`abc`", "`abc`"}, @@ -132,10 +129,10 @@ func (tc *testExpressionsSuite) TestColumnNameExprRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr } - RunNodeRestoreTest(c, testCases, "select %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select %s", extractNodeFunc) } -func (tc *testExpressionsSuite) TestIsNullExprRestore(c *C) { +func TestIsNullExprRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"a is null", "`a` IS NULL"}, {"a is not null", "`a` IS NOT NULL"}, @@ -143,10 +140,10 @@ func (tc *testExpressionsSuite) TestIsNullExprRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr } - RunNodeRestoreTest(c, testCases, "select %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select %s", extractNodeFunc) } -func (tc *testExpressionsSuite) TestIsTruthRestore(c *C) { +func TestIsTruthRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"a is true", "`a` IS TRUE"}, {"a is not true", "`a` IS NOT TRUE"}, @@ -156,10 +153,10 @@ func (tc *testExpressionsSuite) TestIsTruthRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr } - RunNodeRestoreTest(c, testCases, "select %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select %s", extractNodeFunc) } -func (tc *testExpressionsSuite) TestBetweenExprRestore(c *C) { +func TestBetweenExprRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"b between 1 and 2", "`b` BETWEEN 1 AND 2"}, {"b not between 1 and 2", "`b` NOT BETWEEN 1 AND 2"}, @@ -170,10 +167,10 @@ func (tc *testExpressionsSuite) TestBetweenExprRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr } - RunNodeRestoreTest(c, testCases, "select %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select %s", extractNodeFunc) } -func (tc *testExpressionsSuite) TestCaseExpr(c *C) { +func TestCaseExpr(t *testing.T) { testCases := []NodeRestoreTestCase{ {"case when 1 then 2 end", "CASE WHEN 1 THEN 2 END"}, {"case when 1 then 'a' when 2 then 'b' end", "CASE WHEN 1 THEN _UTF8MB4'a' WHEN 2 THEN _UTF8MB4'b' END"}, @@ -184,10 +181,10 @@ func (tc *testExpressionsSuite) TestCaseExpr(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr } - RunNodeRestoreTest(c, testCases, "select %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select %s", extractNodeFunc) } -func (tc *testExpressionsSuite) TestBinaryOperationExpr(c *C) { +func TestBinaryOperationExpr(t *testing.T) { testCases := []NodeRestoreTestCase{ {"'a'!=1", "_UTF8MB4'a'!=1"}, {"a!=1", "`a`!=1"}, @@ -211,10 +208,10 @@ func (tc *testExpressionsSuite) TestBinaryOperationExpr(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr } - RunNodeRestoreTest(c, testCases, "select %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select %s", extractNodeFunc) } -func (tc *testExpressionsSuite) TestBinaryOperationExprWithFlags(c *C) { +func TestBinaryOperationExprWithFlags(t *testing.T) { testCases := []NodeRestoreTestCase{ {"'a'!=1", "_UTF8MB4'a' != 1"}, {"a!=1", "`a` != 1"}, @@ -229,10 +226,10 @@ func (tc *testExpressionsSuite) TestBinaryOperationExprWithFlags(c *C) { return node.(*SelectStmt).Fields.Fields[0].Expr } flags := format.DefaultRestoreFlags | format.RestoreSpacesAroundBinaryOperation - RunNodeRestoreTestWithFlags(c, testCases, "select %s", extractNodeFunc, flags) + runNodeRestoreTestWithFlags(t, testCases, "select %s", extractNodeFunc, flags) } -func (tc *testExpressionsSuite) TestParenthesesExpr(c *C) { +func TestParenthesesExpr(t *testing.T) { testCases := []NodeRestoreTestCase{ {"(1+2)*3", "(1+2)*3"}, {"1+2*3", "1+2*3"}, @@ -240,10 +237,10 @@ func (tc *testExpressionsSuite) TestParenthesesExpr(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr } - RunNodeRestoreTest(c, testCases, "select %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select %s", extractNodeFunc) } -func (tc *testExpressionsSuite) TestWhenClause(c *C) { +func TestWhenClause(t *testing.T) { testCases := []NodeRestoreTestCase{ {"when 1 then 2", "WHEN 1 THEN 2"}, {"when 1 then 'a'", "WHEN 1 THEN _UTF8MB4'a'"}, @@ -252,10 +249,10 @@ func (tc *testExpressionsSuite) TestWhenClause(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr.(*CaseExpr).WhenClauses[0] } - RunNodeRestoreTest(c, testCases, "select case %s end", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select case %s end", extractNodeFunc) } -func (tc *testExpressionsSuite) TestDefaultExpr(c *C) { +func TestDefaultExpr(t *testing.T) { testCases := []NodeRestoreTestCase{ {"default", "DEFAULT"}, {"default(i)", "DEFAULT(`i`)"}, @@ -263,10 +260,10 @@ func (tc *testExpressionsSuite) TestDefaultExpr(c *C) { extractNodeFunc := func(node Node) Node { return node.(*InsertStmt).Lists[0][0] } - RunNodeRestoreTest(c, testCases, "insert into t values(%s)", extractNodeFunc) + runNodeRestoreTest(t, testCases, "insert into t values(%s)", extractNodeFunc) } -func (tc *testExpressionsSuite) TestPatternInExprRestore(c *C) { +func TestPatternInExprRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"'a' in ('b')", "_UTF8MB4'a' IN (_UTF8MB4'b')"}, {"2 in (0,3,7)", "2 IN (0,3,7)"}, @@ -277,10 +274,10 @@ func (tc *testExpressionsSuite) TestPatternInExprRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr } - RunNodeRestoreTest(c, testCases, "select %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select %s", extractNodeFunc) } -func (tc *testExpressionsSuite) TestPatternLikeExprRestore(c *C) { +func TestPatternLikeExprRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"a like 't1'", "`a` LIKE _UTF8MB4't1'"}, {"a like 't1%'", "`a` LIKE _UTF8MB4't1%'"}, @@ -294,10 +291,10 @@ func (tc *testExpressionsSuite) TestPatternLikeExprRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr } - RunNodeRestoreTest(c, testCases, "select %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select %s", extractNodeFunc) } -func (tc *testExpressionsSuite) TestValuesExpr(c *C) { +func TestValuesExpr(t *testing.T) { testCases := []NodeRestoreTestCase{ {"values(a)", "VALUES(`a`)"}, {"values(a)+values(b)", "VALUES(`a`)+VALUES(`b`)"}, @@ -305,10 +302,10 @@ func (tc *testExpressionsSuite) TestValuesExpr(c *C) { extractNodeFunc := func(node Node) Node { return node.(*InsertStmt).OnDuplicate[0].Expr } - RunNodeRestoreTest(c, testCases, "insert into t values (1,2,3) on duplicate key update c=%s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "insert into t values (1,2,3) on duplicate key update c=%s", extractNodeFunc) } -func (tc *testExpressionsSuite) TestPatternRegexpExprRestore(c *C) { +func TestPatternRegexpExprRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"a regexp 't1'", "`a` REGEXP _UTF8MB4't1'"}, {"a regexp '^[abc][0-9]{11}|ok$'", "`a` REGEXP _UTF8MB4'^[abc][0-9]{11}|ok$'"}, @@ -322,10 +319,10 @@ func (tc *testExpressionsSuite) TestPatternRegexpExprRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr } - RunNodeRestoreTest(c, testCases, "select %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select %s", extractNodeFunc) } -func (tc *testExpressionsSuite) TestRowExprRestore(c *C) { +func TestRowExprRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"(1,2)", "ROW(1,2)"}, {"(col1,col2)", "ROW(`col1`,`col2`)"}, @@ -335,31 +332,31 @@ func (tc *testExpressionsSuite) TestRowExprRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Where.(*BinaryOperationExpr).L } - RunNodeRestoreTest(c, testCases, "select 1 from t1 where %s = row(1,2)", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select 1 from t1 where %s = row(1,2)", extractNodeFunc) } -func (tc *testExpressionsSuite) TestMaxValueExprRestore(c *C) { +func TestMaxValueExprRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"maxvalue", "MAXVALUE"}, } extractNodeFunc := func(node Node) Node { return node.(*AlterTableStmt).Specs[0].PartDefinitions[0].Clause.(*PartitionDefinitionClauseLessThan).Exprs[0] } - RunNodeRestoreTest(c, testCases, "alter table posts add partition ( partition p1 values less than %s)", extractNodeFunc) + runNodeRestoreTest(t, testCases, "alter table posts add partition ( partition p1 values less than %s)", extractNodeFunc) } -func (tc *testExpressionsSuite) TestPositionExprRestore(c *C) { +func TestPositionExprRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"1", "1"}, } extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).OrderBy.Items[0] } - RunNodeRestoreTest(c, testCases, "select * from t order by %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select * from t order by %s", extractNodeFunc) } -func (tc *testExpressionsSuite) TestExistsSubqueryExprRestore(c *C) { +func TestExistsSubqueryExprRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"EXISTS (SELECT 2)", "EXISTS (SELECT 2)"}, {"NOT EXISTS (SELECT 2)", "NOT EXISTS (SELECT 2)"}, @@ -369,10 +366,10 @@ func (tc *testExpressionsSuite) TestExistsSubqueryExprRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Where } - RunNodeRestoreTest(c, testCases, "select 1 from t1 where %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select 1 from t1 where %s", extractNodeFunc) } -func (tc *testExpressionsSuite) TestVariableExpr(c *C) { +func TestVariableExpr(t *testing.T) { testCases := []NodeRestoreTestCase{ {"@a>1", "@`a`>1"}, {"@`aB`+1", "@`aB`+1"}, @@ -392,10 +389,10 @@ func (tc *testExpressionsSuite) TestVariableExpr(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr } - RunNodeRestoreTest(c, testCases, "select %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select %s", extractNodeFunc) } -func (tc *testExpressionsSuite) TestMatchAgainstExpr(c *C) { +func TestMatchAgainstExpr(t *testing.T) { testCases := []NodeRestoreTestCase{ {`MATCH(content, title) AGAINST ('search for')`, "MATCH (`content`,`title`) AGAINST (_UTF8MB4'search for')"}, {`MATCH(content) AGAINST ('search for' IN BOOLEAN MODE)`, "MATCH (`content`) AGAINST (_UTF8MB4'search for' IN BOOLEAN MODE)"}, @@ -408,5 +405,5 @@ func (tc *testExpressionsSuite) TestMatchAgainstExpr(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Where } - RunNodeRestoreTest(c, testCases, "SELECT * FROM t WHERE %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "SELECT * FROM t WHERE %s", extractNodeFunc) } diff --git a/parser/ast/flag_test.go b/parser/ast/flag_test.go index 7022f2ecc1f15..e90a407f9ddcb 100644 --- a/parser/ast/flag_test.go +++ b/parser/ast/flag_test.go @@ -16,27 +16,12 @@ package ast_test import ( "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/parser/ast" + "github.com/stretchr/testify/require" ) -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) { +func TestHasAggFlag(t *testing.T) { expr := &ast.BetweenExpr{} flagTests := []struct { flag uint64 @@ -48,11 +33,11 @@ func (ts *testFlagSuite) TestHasAggFlag(c *C) { } for _, tt := range flagTests { expr.SetFlag(tt.flag) - c.Assert(ast.HasAggFlag(expr), Equals, tt.hasAgg) + require.Equal(t, tt.hasAgg, ast.HasAggFlag(expr)) } } -func (ts *testFlagSuite) TestFlag(c *C) { +func TestFlag(t *testing.T) { flagTests := []struct { expr string flag uint64 @@ -142,12 +127,13 @@ func (ts *testFlagSuite) TestFlag(c *C) { ast.FlagHasReference, }, } + p := parser.New() for _, tt := range flagTests { - stmt, err := ts.ParseOneStmt("select "+tt.expr, "", "") - c.Assert(err, IsNil) + stmt, err := p.ParseOneStmt("select "+tt.expr, "", "") + require.NoError(t, err) 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)) + require.Equalf(t, tt.flag, expr.GetFlag(), "For %s", tt.expr) } } diff --git a/parser/ast/format_test.go b/parser/ast/format_test.go index 81d972188fefa..59424d2876d34 100644 --- a/parser/ast/format_test.go +++ b/parser/ast/format_test.go @@ -3,22 +3,18 @@ package ast_test import ( "bytes" "fmt" + "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/parser/ast" + "github.com/stretchr/testify/require" ) -var _ = Suite(&testAstFormatSuite{}) - -type testAstFormatSuite struct { -} - func getDefaultCharsetAndCollate() (string, string) { return "utf8", "utf8_bin" } -func (ts *testAstFormatSuite) TestAstFormat(c *C) { +func TestAstFormat(t *testing.T) { var testcases = []struct { input string output string @@ -93,10 +89,10 @@ func (ts *testAstFormatSuite) TestAstFormat(c *C) { charset, collation := getDefaultCharsetAndCollate() stmts, _, err := parser.New().Parse(expr, charset, collation) node := stmts[0].(*ast.SelectStmt).Fields.Fields[0].Expr - c.Assert(err, IsNil) + require.NoError(t, err) writer := bytes.NewBufferString("") node.Format(writer) - c.Assert(writer.String(), Equals, tt.output) + require.Equal(t, tt.output, writer.String()) } } diff --git a/parser/ast/functions.go b/parser/ast/functions.go index e463598838fee..7775f3dbc2029 100644 --- a/parser/ast/functions.go +++ b/parser/ast/functions.go @@ -279,6 +279,7 @@ const ( IsIPv4Mapped = "is_ipv4_mapped" IsIPv6 = "is_ipv6" IsUsedLock = "is_used_lock" + IsUUID = "is_uuid" MasterPosWait = "master_pos_wait" NameConst = "name_const" ReleaseAllLocks = "release_all_locks" diff --git a/parser/ast/functions_test.go b/parser/ast/functions_test.go index 811ebee6e73b4..9f38e2d70958f 100644 --- a/parser/ast/functions_test.go +++ b/parser/ast/functions_test.go @@ -14,19 +14,16 @@ package ast_test import ( - . "github.com/pingcap/check" + "testing" + "github.com/pingcap/tidb/parser" . "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/test_driver" + "github.com/stretchr/testify/require" ) -var _ = Suite(&testFunctionsSuite{}) - -type testFunctionsSuite struct { -} - -func (ts *testFunctionsSuite) TestFunctionsVisitorCover(c *C) { +func TestFunctionsVisitorCover(t *testing.T) { valueExpr := NewValueExpr(42, mysql.DefaultCharset, mysql.DefaultCollationName) stmts := []Node{ &AggregateFuncExpr{Args: []ExprNode{valueExpr}}, @@ -41,7 +38,7 @@ func (ts *testFunctionsSuite) TestFunctionsVisitorCover(c *C) { } } -func (ts *testFunctionsSuite) TestFuncCallExprRestore(c *C) { +func TestFuncCallExprRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"JSON_ARRAYAGG(attribute)", "JSON_ARRAYAGG(`attribute`)"}, {"JSON_OBJECTAGG(attribute, value)", "JSON_OBJECTAGG(`attribute`, `value`)"}, @@ -103,10 +100,10 @@ func (ts *testFunctionsSuite) TestFuncCallExprRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr } - RunNodeRestoreTest(c, testCases, "select %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select %s", extractNodeFunc) } -func (ts *testFunctionsSuite) TestFuncCastExprRestore(c *C) { +func TestFuncCastExprRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"CONVERT('Müller' USING UtF8)", "CONVERT(_UTF8MB4'Müller' USING 'utf8')"}, {"CONVERT('Müller' USING UtF8Mb4)", "CONVERT(_UTF8MB4'Müller' USING 'utf8mb4')"}, @@ -117,10 +114,10 @@ func (ts *testFunctionsSuite) TestFuncCastExprRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr } - RunNodeRestoreTest(c, testCases, "select %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select %s", extractNodeFunc) } -func (ts *testFunctionsSuite) TestAggregateFuncExprRestore(c *C) { +func TestAggregateFuncExprRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"AVG(test_score)", "AVG(`test_score`)"}, {"AVG(distinct test_score)", "AVG(DISTINCT `test_score`)"}, @@ -152,10 +149,10 @@ func (ts *testFunctionsSuite) TestAggregateFuncExprRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr } - RunNodeRestoreTest(c, testCases, "select %s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select %s", extractNodeFunc) } -func (ts *testFunctionsSuite) TestConvert(c *C) { +func TestConvert(t *testing.T) { // Test case for CONVERT(expr USING transcoding_name). cases := []struct { SQL string @@ -172,19 +169,19 @@ func (ts *testFunctionsSuite) TestConvert(c *C) { for _, testCase := range cases { stmt, err := parser.New().ParseOneStmt(testCase.SQL, "", "") if testCase.ErrorMessage != "" { - c.Assert(err.Error(), Equals, testCase.ErrorMessage) + require.EqualError(t, err, testCase.ErrorMessage) continue } - c.Assert(err, IsNil) + require.NoError(t, err) st := stmt.(*SelectStmt) expr := st.Fields.Fields[0].Expr.(*FuncCallExpr) charsetArg := expr.Args[1].(*test_driver.ValueExpr) - c.Assert(charsetArg.GetString(), Equals, testCase.CharsetName) + require.Equal(t, testCase.CharsetName, charsetArg.GetString()) } } -func (ts *testFunctionsSuite) TestChar(c *C) { +func TestChar(t *testing.T) { // Test case for CHAR(N USING charset_name) cases := []struct { SQL string @@ -201,19 +198,19 @@ func (ts *testFunctionsSuite) TestChar(c *C) { for _, testCase := range cases { stmt, err := parser.New().ParseOneStmt(testCase.SQL, "", "") if testCase.ErrorMessage != "" { - c.Assert(err.Error(), Equals, testCase.ErrorMessage) + require.EqualError(t, err, testCase.ErrorMessage) continue } - c.Assert(err, IsNil) + require.NoError(t, err) st := stmt.(*SelectStmt) expr := st.Fields.Fields[0].Expr.(*FuncCallExpr) charsetArg := expr.Args[1].(*test_driver.ValueExpr) - c.Assert(charsetArg.GetString(), Equals, testCase.CharsetName) + require.Equal(t, testCase.CharsetName, charsetArg.GetString()) } } -func (ts *testDMLSuite) TestWindowFuncExprRestore(c *C) { +func TestWindowFuncExprRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"RANK() OVER w", "RANK() OVER `w`"}, {"RANK() OVER (PARTITION BY a)", "RANK() OVER (PARTITION BY `a`)"}, @@ -229,10 +226,10 @@ func (ts *testDMLSuite) TestWindowFuncExprRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr } - RunNodeRestoreTest(c, testCases, "select %s from t", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select %s from t", extractNodeFunc) } -func (ts *testFunctionsSuite) TestGenericFuncRestore(c *C) { +func TestGenericFuncRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"s.a()", "`s`.`a`()"}, {"`s`.`a`()", "`s`.`a`()"}, @@ -245,5 +242,5 @@ func (ts *testFunctionsSuite) TestGenericFuncRestore(c *C) { extractNodeFunc := func(node Node) Node { return node.(*SelectStmt).Fields.Fields[0].Expr } - RunNodeRestoreTest(c, testCases, "select %s from t", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select %s from t", extractNodeFunc) } diff --git a/parser/ast/misc.go b/parser/ast/misc.go index d467dc3945cd0..ffea37c7cb71f 100644 --- a/parser/ast/misc.go +++ b/parser/ast/misc.go @@ -122,12 +122,23 @@ type TraceStmt struct { Stmt StmtNode Format string + + TracePlan bool + TracePlanTarget string } // Restore implements Node interface. func (n *TraceStmt) Restore(ctx *format.RestoreCtx) error { ctx.WriteKeyWord("TRACE ") - if n.Format != "row" { + if n.TracePlan { + ctx.WriteKeyWord("PLAN ") + if n.TracePlanTarget != "" { + ctx.WriteKeyWord("TARGET") + ctx.WritePlain(" = ") + ctx.WriteString(n.TracePlanTarget) + ctx.WritePlain(" ") + } + } else if n.Format != "row" { ctx.WriteKeyWord("FORMAT") ctx.WritePlain(" = ") ctx.WriteString(n.Format) @@ -1191,6 +1202,8 @@ func (n *UserSpec) EncodedPassword() (string, bool) { switch opt.AuthPlugin { case mysql.AuthCachingSha2Password: return auth.NewSha2Password(opt.AuthString), true + case mysql.AuthSocket: + return "", true default: return auth.EncodePassword(opt.AuthString), true } diff --git a/parser/ast/misc_test.go b/parser/ast/misc_test.go index 8f31921c661b5..7b7df348f86fa 100644 --- a/parser/ast/misc_test.go +++ b/parser/ast/misc_test.go @@ -14,18 +14,16 @@ package ast_test import ( - . "github.com/pingcap/check" + "fmt" + "testing" + "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/auth" "github.com/pingcap/tidb/parser/mysql" + "github.com/stretchr/testify/require" ) -var _ = Suite(&testMiscSuite{}) - -type testMiscSuite struct { -} - type visitor struct{} func (v visitor) Enter(in ast.Node) (ast.Node, bool) { @@ -44,7 +42,7 @@ func (visitor1) Enter(in ast.Node) (ast.Node, bool) { return in, true } -func (ts *testMiscSuite) TestMiscVisitorCover(c *C) { +func TestMiscVisitorCover(t *testing.T) { valueExpr := ast.NewValueExpr(42, mysql.DefaultCharset, mysql.DefaultCollationName) stmts := []ast.Node{ &ast.AdminStmt{}, @@ -86,7 +84,7 @@ func (ts *testMiscSuite) TestMiscVisitorCover(c *C) { } } -func (ts *testMiscSuite) TestDDLVisitorCover(c *C) { +func TestDDLVisitorCoverMisc(t *testing.T) { sql := ` create table t (c1 smallint unsigned, c2 int unsigned); alter table t add column a smallint unsigned after b; @@ -104,14 +102,14 @@ constraint foreign key (jobabbr) references ffxi_jobtype (jobabbr) on delete cas ` parse := parser.New() stmts, _, err := parse.Parse(sql, "", "") - c.Assert(err, IsNil) + require.NoError(t, err) for _, stmt := range stmts { stmt.Accept(visitor{}) stmt.Accept(visitor1{}) } } -func (ts *testMiscSuite) TestDMLVistorCover(c *C) { +func TestDMLVistorCover(t *testing.T) { 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); @@ -123,7 +121,7 @@ load data infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by p := parser.New() stmts, _, err := p.Parse(sql, "", "") - c.Assert(err, IsNil) + require.NoError(t, err) for _, stmt := range stmts { stmt.Accept(visitor{}) stmt.Accept(visitor1{}) @@ -131,21 +129,21 @@ load data infile '/tmp/t.csv' into table t fields terminated by 'ab' enclosed by } // test Change Pump or drainer status sql parser -func (ts *testMiscSuite) TestChangeStmt(c *C) { +func TestChangeStmt(t *testing.T) { sql := `change pump to node_state='paused' for node_id '127.0.0.1:8249'; change drainer to node_state='paused' for node_id '127.0.0.1:8249'; shutdown;` p := parser.New() stmts, _, err := p.Parse(sql, "", "") - c.Assert(err, IsNil) + require.NoError(t, err) for _, stmt := range stmts { stmt.Accept(visitor{}) stmt.Accept(visitor1{}) } } -func (ts *testMiscSuite) TestSensitiveStatement(c *C) { +func TestSensitiveStatement(t *testing.T) { positive := []ast.StmtNode{ &ast.SetPwdStmt{}, &ast.CreateUserStmt{}, @@ -154,7 +152,7 @@ func (ts *testMiscSuite) TestSensitiveStatement(c *C) { } for i, stmt := range positive { _, ok := stmt.(ast.SensitiveStmtNode) - c.Assert(ok, IsTrue, Commentf("%d, %#v fail", i, stmt)) + require.Truef(t, ok, "%d, %#v fail", i, stmt) } negative := []ast.StmtNode{ @@ -172,11 +170,11 @@ func (ts *testMiscSuite) TestSensitiveStatement(c *C) { } for _, stmt := range negative { _, ok := stmt.(ast.SensitiveStmtNode) - c.Assert(ok, IsFalse) + require.False(t, ok) } } -func (ts *testMiscSuite) TestUserSpec(c *C) { +func TestUserSpec(t *testing.T) { hashString := "*3D56A309CD04FA2EEF181462E59011F075C89548" u := ast.UserSpec{ User: &auth.UserIdentity{ @@ -189,25 +187,25 @@ func (ts *testMiscSuite) TestUserSpec(c *C) { }, } pwd, ok := u.EncodedPassword() - c.Assert(ok, IsTrue) - c.Assert(pwd, Equals, u.AuthOpt.HashString) + require.True(t, ok) + require.Equal(t, u.AuthOpt.HashString, pwd) u.AuthOpt.HashString = "not-good-password-format" _, ok = u.EncodedPassword() - c.Assert(ok, IsFalse) + require.False(t, ok) u.AuthOpt.ByAuthString = true pwd, ok = u.EncodedPassword() - c.Assert(ok, IsTrue) - c.Assert(pwd, Equals, hashString) + require.True(t, ok) + require.Equal(t, hashString, pwd) u.AuthOpt.AuthString = "" pwd, ok = u.EncodedPassword() - c.Assert(ok, IsTrue) - c.Assert(pwd, Equals, "") + require.True(t, ok) + require.Equal(t, "", pwd) } -func (ts *testMiscSuite) TestTableOptimizerHintRestore(c *C) { +func TestTableOptimizerHintRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"USE_INDEX(t1 c1)", "USE_INDEX(`t1` `c1`)"}, {"USE_INDEX(test.t1 c1)", "USE_INDEX(`test`.`t1` `c1`)"}, @@ -279,10 +277,10 @@ func (ts *testMiscSuite) TestTableOptimizerHintRestore(c *C) { extractNodeFunc := func(node ast.Node) ast.Node { return node.(*ast.SelectStmt).TableHints[0] } - RunNodeRestoreTest(c, testCases, "select /*+ %s */ * from t1 join t2", extractNodeFunc) + runNodeRestoreTest(t, testCases, "select /*+ %s */ * from t1 join t2", extractNodeFunc) } -func (ts *testMiscSuite) TestChangeStmtRestore(c *C) { +func TestChangeStmtRestore(t *testing.T) { testCases := []NodeRestoreTestCase{ {"CHANGE PUMP TO NODE_STATE ='paused' FOR NODE_ID '127.0.0.1:9090'", "CHANGE PUMP TO NODE_STATE ='paused' FOR NODE_ID '127.0.0.1:9090'"}, {"CHANGE DRAINER TO NODE_STATE ='paused' FOR NODE_ID '127.0.0.1:9090'", "CHANGE DRAINER TO NODE_STATE ='paused' FOR NODE_ID '127.0.0.1:9090'"}, @@ -290,10 +288,10 @@ func (ts *testMiscSuite) TestChangeStmtRestore(c *C) { extractNodeFunc := func(node ast.Node) ast.Node { return node.(*ast.ChangeStmt) } - RunNodeRestoreTest(c, testCases, "%s", extractNodeFunc) + runNodeRestoreTest(t, testCases, "%s", extractNodeFunc) } -func (ts *testMiscSuite) TestBRIESecureText(c *C) { +func TestBRIESecureText(t *testing.T) { testCases := []struct { input string secured string @@ -319,13 +317,14 @@ func (ts *testMiscSuite) TestBRIESecureText(c *C) { }, } - parser := parser.New() + p := parser.New() for _, tc := range testCases { - comment := Commentf("input = %s", tc.input) - node, err := parser.ParseOneStmt(tc.input, "", "") - c.Assert(err, IsNil, comment) + comment := fmt.Sprintf("input = %s", tc.input) + node, err := p.ParseOneStmt(tc.input, "", "") + require.NoError(t, err, comment) n, ok := node.(ast.SensitiveStmtNode) - c.Assert(ok, IsTrue, comment) - c.Assert(n.SecureText(), Matches, tc.secured, comment) + require.True(t, ok, comment) + require.Regexp(t, tc.secured, n.SecureText(), comment) + } } diff --git a/parser/ast/stats.go b/parser/ast/stats.go index b533759569658..55bb1f7abbdd8 100644 --- a/parser/ast/stats.go +++ b/parser/ast/stats.go @@ -40,9 +40,8 @@ type AnalyzeTableStmt struct { // HistogramOperation is set in "ANALYZE TABLE ... UPDATE/DROP HISTOGRAM ..." statement. HistogramOperation HistogramOperationType // ColumnNames indicate the columns whose statistics need to be collected. - ColumnNames []*ColumnName - // PredicateColumns is true when we only collect statistics of predicate columns and indexed columns. - PredicateColumns bool + ColumnNames []model.CIStr + ColumnChoice model.ColumnChoice } // AnalyzeOptType is the type for analyze options. @@ -55,6 +54,7 @@ const ( AnalyzeOptCMSketchDepth AnalyzeOptCMSketchWidth AnalyzeOptNumSamples + AnalyzeOptSampleRate ) // AnalyzeOptionString stores the string form of analyze options. @@ -64,6 +64,7 @@ var AnalyzeOptionString = map[AnalyzeOptionType]string{ AnalyzeOptCMSketchWidth: "CMSKETCH WIDTH", AnalyzeOptCMSketchDepth: "CMSKETCH DEPTH", AnalyzeOptNumSamples: "SAMPLES", + AnalyzeOptSampleRate: "SAMPLERATE", } // HistogramOperationType is the type for histogram operation. @@ -91,7 +92,7 @@ func (hot HistogramOperationType) String() string { // AnalyzeOpt stores the analyze option type and value. type AnalyzeOpt struct { Type AnalyzeOptionType - Value uint64 + Value ValueExpr } // Restore implements Node interface. @@ -128,19 +129,23 @@ func (n *AnalyzeTableStmt) Restore(ctx *format.RestoreCtx) error { if i != 0 { ctx.WritePlain(",") } - ctx.WriteName(columnName.Name.O) + ctx.WriteName(columnName.O) } } - } else if len(n.ColumnNames) > 0 { + } + switch n.ColumnChoice { + case model.AllColumns: + ctx.WriteKeyWord(" ALL COLUMNS") + case model.PredicateColumns: + ctx.WriteKeyWord(" PREDICATE COLUMNS") + case model.ColumnList: ctx.WriteKeyWord(" COLUMNS ") for i, columnName := range n.ColumnNames { if i != 0 { ctx.WritePlain(",") } - ctx.WriteName(columnName.Name.O) + ctx.WriteName(columnName.O) } - } else if n.PredicateColumns { - ctx.WriteKeyWord(" PREDICATE COLUMNS") } if n.IndexFlag { ctx.WriteKeyWord(" INDEX") @@ -159,7 +164,7 @@ func (n *AnalyzeTableStmt) Restore(ctx *format.RestoreCtx) error { if i != 0 { ctx.WritePlain(",") } - ctx.WritePlainf(" %d ", opt.Value) + ctx.WritePlainf(" %v ", opt.Value.GetValue()) ctx.WritePlain(AnalyzeOptionString[opt.Type]) } } diff --git a/parser/ast/util_test.go b/parser/ast/util_test.go index ef4464be9088d..d8cb06eee448c 100644 --- a/parser/ast/util_test.go +++ b/parser/ast/util_test.go @@ -16,69 +16,65 @@ package ast_test import ( "fmt" "strings" + "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser" . "github.com/pingcap/tidb/parser/ast" . "github.com/pingcap/tidb/parser/format" "github.com/pingcap/tidb/parser/test_driver" + "github.com/stretchr/testify/require" ) -var _ = Suite(&testCacheableSuite{}) - -type testCacheableSuite struct { -} - -func (s *testCacheableSuite) TestCacheable(c *C) { +func TestCacheable(t *testing.T) { // test non-SelectStmt var stmt Node = &DeleteStmt{} - c.Assert(IsReadOnly(stmt), IsFalse) + require.False(t, IsReadOnly(stmt)) stmt = &InsertStmt{} - c.Assert(IsReadOnly(stmt), IsFalse) + require.False(t, IsReadOnly(stmt)) stmt = &UpdateStmt{} - c.Assert(IsReadOnly(stmt), IsFalse) + require.False(t, IsReadOnly(stmt)) stmt = &ExplainStmt{} - c.Assert(IsReadOnly(stmt), IsTrue) + require.True(t, IsReadOnly(stmt)) stmt = &ExplainStmt{} - c.Assert(IsReadOnly(stmt), IsTrue) + require.True(t, IsReadOnly(stmt)) stmt = &DoStmt{} - c.Assert(IsReadOnly(stmt), IsTrue) + require.True(t, IsReadOnly(stmt)) stmt = &ExplainStmt{ Stmt: &InsertStmt{}, } - c.Assert(IsReadOnly(stmt), IsTrue) + require.True(t, IsReadOnly(stmt)) stmt = &ExplainStmt{ Analyze: true, Stmt: &InsertStmt{}, } - c.Assert(IsReadOnly(stmt), IsFalse) + require.False(t, IsReadOnly(stmt)) stmt = &ExplainStmt{ Stmt: &SelectStmt{}, } - c.Assert(IsReadOnly(stmt), IsTrue) + require.True(t, IsReadOnly(stmt)) stmt = &ExplainStmt{ Analyze: true, Stmt: &SelectStmt{}, } - c.Assert(IsReadOnly(stmt), IsTrue) + require.True(t, IsReadOnly(stmt)) stmt = &ShowStmt{} - c.Assert(IsReadOnly(stmt), IsTrue) + require.True(t, IsReadOnly(stmt)) stmt = &ShowStmt{} - c.Assert(IsReadOnly(stmt), IsTrue) + require.True(t, IsReadOnly(stmt)) } -func (s *testCacheableSuite) TestUnionReadOnly(c *C) { +func TestUnionReadOnly(t *testing.T) { selectReadOnly := &SelectStmt{} selectForUpdate := &SelectStmt{ LockInfo: &SelectLockInfo{LockType: SelectLockForUpdate}, @@ -92,22 +88,22 @@ func (s *testCacheableSuite) TestUnionReadOnly(c *C) { Selects: []Node{selectReadOnly, selectReadOnly}, }, } - c.Assert(IsReadOnly(setOprStmt), IsTrue) + require.True(t, IsReadOnly(setOprStmt)) setOprStmt.SelectList.Selects = []Node{selectReadOnly, selectReadOnly, selectReadOnly} - c.Assert(IsReadOnly(setOprStmt), IsTrue) + require.True(t, IsReadOnly(setOprStmt)) setOprStmt.SelectList.Selects = []Node{selectReadOnly, selectForUpdate} - c.Assert(IsReadOnly(setOprStmt), IsFalse) + require.False(t, IsReadOnly(setOprStmt)) setOprStmt.SelectList.Selects = []Node{selectReadOnly, selectForUpdateNoWait} - c.Assert(IsReadOnly(setOprStmt), IsFalse) + require.False(t, IsReadOnly(setOprStmt)) setOprStmt.SelectList.Selects = []Node{selectForUpdate, selectForUpdateNoWait} - c.Assert(IsReadOnly(setOprStmt), IsFalse) + require.False(t, IsReadOnly(setOprStmt)) setOprStmt.SelectList.Selects = []Node{selectReadOnly, selectForUpdate, selectForUpdateNoWait} - c.Assert(IsReadOnly(setOprStmt), IsFalse) + require.False(t, IsReadOnly(setOprStmt)) } // CleanNodeText set the text of node and all child node empty. @@ -165,49 +161,49 @@ type NodeRestoreTestCase struct { expectSQL string } -func RunNodeRestoreTest(c *C, nodeTestCases []NodeRestoreTestCase, template string, extractNodeFunc func(node Node) Node) { - RunNodeRestoreTestWithFlags(c, nodeTestCases, template, extractNodeFunc, DefaultRestoreFlags) +func runNodeRestoreTest(t *testing.T, nodeTestCases []NodeRestoreTestCase, template string, extractNodeFunc func(node Node) Node) { + runNodeRestoreTestWithFlags(t, nodeTestCases, template, extractNodeFunc, DefaultRestoreFlags) } -func RunNodeRestoreTestWithFlags(c *C, nodeTestCases []NodeRestoreTestCase, template string, extractNodeFunc func(node Node) Node, flags RestoreFlags) { - parser := parser.New() - parser.EnableWindowFunc(true) +func runNodeRestoreTestWithFlags(t *testing.T, nodeTestCases []NodeRestoreTestCase, template string, extractNodeFunc func(node Node) Node, flags RestoreFlags) { + p := parser.New() + p.EnableWindowFunc(true) for _, testCase := range nodeTestCases { sourceSQL := fmt.Sprintf(template, testCase.sourceSQL) expectSQL := fmt.Sprintf(template, testCase.expectSQL) - stmt, err := parser.ParseOneStmt(sourceSQL, "", "") - comment := Commentf("source %#v", testCase) - c.Assert(err, IsNil, comment) + stmt, err := p.ParseOneStmt(sourceSQL, "", "") + comment := fmt.Sprintf("source %#v", testCase) + require.NoError(t, err, comment) var sb strings.Builder err = extractNodeFunc(stmt).Restore(NewRestoreCtx(flags, &sb)) - c.Assert(err, IsNil, comment) + require.NoError(t, err, comment) restoreSql := fmt.Sprintf(template, sb.String()) - comment = Commentf("source %#v; restore %v", testCase, restoreSql) - c.Assert(restoreSql, Equals, expectSQL, comment) - stmt2, err := parser.ParseOneStmt(restoreSql, "", "") - c.Assert(err, IsNil, comment) + comment = fmt.Sprintf("source %#v; restore %v", testCase, restoreSql) + require.Equal(t, expectSQL, restoreSql, comment) + stmt2, err := p.ParseOneStmt(restoreSql, "", "") + require.NoError(t, err, comment) CleanNodeText(stmt) CleanNodeText(stmt2) - c.Assert(stmt2, DeepEquals, stmt, comment) + require.Equal(t, stmt, stmt2, comment) } } -// RunNodeRestoreTestWithFlagsStmtChange likes RunNodeRestoreTestWithFlags but not check if the ASTs are same. +// runNodeRestoreTestWithFlagsStmtChange likes runNodeRestoreTestWithFlags but not check if the ASTs are same. // Sometimes the AST are different and it's expected. -func RunNodeRestoreTestWithFlagsStmtChange(c *C, nodeTestCases []NodeRestoreTestCase, template string, extractNodeFunc func(node Node) Node) { - par := parser.New() - par.EnableWindowFunc(true) +func runNodeRestoreTestWithFlagsStmtChange(t *testing.T, nodeTestCases []NodeRestoreTestCase, template string, extractNodeFunc func(node Node) Node) { + p := parser.New() + p.EnableWindowFunc(true) for _, testCase := range nodeTestCases { sourceSQL := fmt.Sprintf(template, testCase.sourceSQL) expectSQL := fmt.Sprintf(template, testCase.expectSQL) - stmt, err := par.ParseOneStmt(sourceSQL, "", "") - comment := Commentf("source %#v", testCase) - c.Assert(err, IsNil, comment) + stmt, err := p.ParseOneStmt(sourceSQL, "", "") + comment := fmt.Sprintf("source %#v", testCase) + require.NoError(t, err, comment) var sb strings.Builder err = extractNodeFunc(stmt).Restore(NewRestoreCtx(DefaultRestoreFlags, &sb)) - c.Assert(err, IsNil, comment) + require.NoError(t, err, comment) restoreSql := fmt.Sprintf(template, sb.String()) - comment = Commentf("source %#v; restore %v", testCase, restoreSql) - c.Assert(restoreSql, Equals, expectSQL, comment) + comment = fmt.Sprintf("source %#v; restore %v", testCase, restoreSql) + require.Equal(t, expectSQL, restoreSql, comment) } } diff --git a/parser/auth/auth.go b/parser/auth/auth.go index cb94346f82208..5657c6c276646 100644 --- a/parser/auth/auth.go +++ b/parser/auth/auth.go @@ -41,18 +41,24 @@ func (user *UserIdentity) Restore(ctx *format.RestoreCtx) error { } // String converts UserIdentity to the format user@host. +// It defaults to providing the AuthIdentity (the matching entry in priv tables) +// To use the actual identity use LoginString() func (user *UserIdentity) String() string { // TODO: Escape username and hostname. if user == nil { return "" } + if user.AuthUsername != "" { + return fmt.Sprintf("%s@%s", user.AuthUsername, user.AuthHostname) + } return fmt.Sprintf("%s@%s", user.Username, user.Hostname) } -// AuthIdentityString returns matched identity in user@host format -func (user *UserIdentity) AuthIdentityString() string { +// LoginString returns matched identity in user@host format +// It matches the login user. +func (user *UserIdentity) LoginString() string { // TODO: Escape username and hostname. - return fmt.Sprintf("%s@%s", user.AuthUsername, user.AuthHostname) + return fmt.Sprintf("%s@%s", user.Username, user.Hostname) } type RoleIdentity struct { diff --git a/parser/auth/caching_sha2_test.go b/parser/auth/caching_sha2_test.go index 32a7cc57c6c21..73e42ba9d28a8 100644 --- a/parser/auth/caching_sha2_test.go +++ b/parser/auth/caching_sha2_test.go @@ -15,59 +15,60 @@ package auth import ( "encoding/hex" + "testing" - . "github.com/pingcap/check" + "github.com/stretchr/testify/require" ) -func (s *testAuthSuite) TestCheckShaPasswordGood(c *C) { +func TestCheckShaPasswordGood(t *testing.T) { pwd := "foobar" pwhash, _ := hex.DecodeString("24412430303524031A69251C34295C4B35167C7F1E5A7B63091349503974624D34504B5A424679354856336868686F52485A736E4A733368786E427575516C73446469496537") r, err := CheckShaPassword(pwhash, pwd) - c.Assert(err, IsNil) - c.Assert(r, IsTrue) + require.NoError(t, err) + require.True(t, r) } -func (s *testAuthSuite) TestCheckShaPasswordBad(c *C) { +func TestCheckShaPasswordBad(t *testing.T) { pwd := "not_foobar" pwhash, _ := hex.DecodeString("24412430303524031A69251C34295C4B35167C7F1E5A7B63091349503974624D34504B5A424679354856336868686F52485A736E4A733368786E427575516C73446469496537") r, err := CheckShaPassword(pwhash, pwd) - c.Assert(err, IsNil) - c.Assert(r, IsFalse) + require.NoError(t, err) + require.False(t, r) } -func (s *testAuthSuite) TestCheckShaPasswordShort(c *C) { +func TestCheckShaPasswordShort(t *testing.T) { pwd := "not_foobar" pwhash, _ := hex.DecodeString("aaaaaaaa") _, err := CheckShaPassword(pwhash, pwd) - c.Assert(err, NotNil) + require.Error(t, err) } -func (s *testAuthSuite) TestCheckShaPasswordDigetTypeIncompatible(c *C) { +func TestCheckShaPasswordDigetTypeIncompatible(t *testing.T) { pwd := "not_foobar" pwhash, _ := hex.DecodeString("24422430303524031A69251C34295C4B35167C7F1E5A7B63091349503974624D34504B5A424679354856336868686F52485A736E4A733368786E427575516C73446469496537") _, err := CheckShaPassword(pwhash, pwd) - c.Assert(err, NotNil) + require.Error(t, err) } -func (s *testAuthSuite) TestCheckShaPasswordIterationsInvalid(c *C) { +func TestCheckShaPasswordIterationsInvalid(t *testing.T) { pwd := "not_foobar" pwhash, _ := hex.DecodeString("24412430304124031A69251C34295C4B35167C7F1E5A7B63091349503974624D34504B5A424679354856336868686F52485A736E4A733368786E427575516C73446469496537") _, err := CheckShaPassword(pwhash, pwd) - c.Assert(err, NotNil) + require.Error(t, err) } // The output from NewSha2Password is not stable as the hash is based on the genrated salt. // This is why CheckShaPassword is used here. -func (s *testAuthSuite) TestNewSha2Password(c *C) { +func TestNewSha2Password(t *testing.T) { pwd := "testpwd" pwhash := NewSha2Password(pwd) r, err := CheckShaPassword([]byte(pwhash), pwd) - c.Assert(err, IsNil) - c.Assert(r, IsTrue) + require.NoError(t, err) + require.True(t, r) for r := range pwhash { - c.Assert(pwhash[r], Less, uint8(128)) - c.Assert(pwhash[r], Not(Equals), 0) // NUL - c.Assert(pwhash[r], Not(Equals), 36) // '$' + require.Less(t, pwhash[r], uint8(128)) + require.NotEqual(t, pwhash[r], 0) // NUL + require.NotEqual(t, pwhash[r], 36) // '$' } } diff --git a/parser/auth/mysql_native_password.go b/parser/auth/mysql_native_password.go index bd91e5da68c0f..d781626a68c0f 100644 --- a/parser/auth/mysql_native_password.go +++ b/parser/auth/mysql_native_password.go @@ -64,7 +64,7 @@ func Sha1Hash(bs []byte) []byte { return crypt.Sum(nil) } -// EncodePassword converts plaintext password to hashed hex string. +// EncodePassword converts plaintext password(type is string) to hashed hex string. func EncodePassword(pwd string) string { if len(pwd) == 0 { return "" @@ -75,6 +75,17 @@ func EncodePassword(pwd string) string { return fmt.Sprintf("*%X", hash2) } +// EncodePasswordBytes converts plaintext password(type is []byte) to hashed hex string. +func EncodePasswordBytes(pwd []byte) string { + if len(pwd) == 0 { + return "" + } + hash1 := Sha1Hash(pwd) + hash2 := Sha1Hash(hash1) + + return fmt.Sprintf("*%X", hash2) +} + // DecodePassword converts hex string password without prefix '*' to byte array. func DecodePassword(pwd string) ([]byte, error) { x, err := hex.DecodeString(pwd[1:]) diff --git a/parser/auth/mysql_native_password_test.go b/parser/auth/mysql_native_password_test.go index f5d89fad4b5b9..d5ca7598d684c 100644 --- a/parser/auth/mysql_native_password_test.go +++ b/parser/auth/mysql_native_password_test.go @@ -14,32 +14,35 @@ package auth import ( - . "github.com/pingcap/check" + "testing" + + "github.com/stretchr/testify/require" ) -func (s *testAuthSuite) TestEncodePassword(c *C) { +func TestEncodePassword(t *testing.T) { pwd := "123" - c.Assert(EncodePassword(pwd), Equals, "*23AE809DDACAF96AF0FD78ED04B6A265E05AA257") + require.Equal(t, "*23AE809DDACAF96AF0FD78ED04B6A265E05AA257", EncodePassword(pwd)) + require.Equal(t, EncodePasswordBytes([]byte(pwd)), EncodePassword(pwd)) } -func (s *testAuthSuite) TestDecodePassword(c *C) { +func TestDecodePassword(t *testing.T) { x, err := DecodePassword(EncodePassword("123")) - c.Assert(err, IsNil) - c.Assert(x, DeepEquals, Sha1Hash(Sha1Hash([]byte("123")))) + require.NoError(t, err) + require.Equal(t, Sha1Hash(Sha1Hash([]byte("123"))), x) } -func (s *testAuthSuite) TestCheckScramble(c *C) { +func TestCheckScramble(t *testing.T) { 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) + require.NoError(t, err) res := CheckScrambledPassword(salt, hpwd, auth) - c.Assert(res, IsTrue) + require.True(t, res) // Do not panic for invalid input. res = CheckScrambledPassword(salt, hpwd, []byte("xxyyzz")) - c.Assert(res, IsFalse) + require.False(t, res) } diff --git a/parser/charset/charset.go b/parser/charset/charset.go index a0b665ecf2b4c..0fdff1b75c13e 100644 --- a/parser/charset/charset.go +++ b/parser/charset/charset.go @@ -18,8 +18,10 @@ import ( "strings" "github.com/pingcap/errors" + "github.com/pingcap/log" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" + "go.uber.org/zap" ) var ( @@ -68,6 +70,15 @@ var supportedCollationNames = map[string]struct{}{ CollationBin: {}, } +// TiFlashSupportedCharsets is a map which contains TiFlash supports charsets. +var TiFlashSupportedCharsets = map[string]struct{}{ + CharsetUTF8: {}, + CharsetUTF8MB4: {}, + CharsetASCII: {}, + CharsetLatin1: {}, + CharsetBin: {}, +} + // GetSupportedCharsets gets descriptions for all charsets supported so far. func GetSupportedCharsets() []*Charset { charsets := make([]*Charset, 0, len(charsetInfos)) @@ -148,7 +159,12 @@ func GetCharsetInfoByID(coID int) (string, string, error) { if collation, ok := collationsIDMap[coID]; ok { return collation.CharsetName, collation.Name, nil } - return "", "", errors.Errorf("Unknown charset id %d", coID) + + log.Warn( + "unable to get collation name from collation ID, return default charset and collation instead", + zap.Int("ID", coID), + zap.Stack("stack")) + return mysql.DefaultCharset, mysql.DefaultCollationName, errors.Errorf("Unknown collation id %d", coID) } // GetCollations returns a list for all collations. diff --git a/parser/charset/charset_serial_test.go b/parser/charset/charset_serial_test.go new file mode 100644 index 0000000000000..d5fffc7d7ec23 --- /dev/null +++ b/parser/charset/charset_serial_test.go @@ -0,0 +1,36 @@ +// 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" +) + +func TestValidCustomCharset(t *testing.T) { + AddCharset(&Charset{"custom", "custom_collation", make(map[string]*Collation), "Custom", 4}) + defer RemoveCharset("custom") + AddCollation(&Collation{99999, "custom", "custom_collation", true}) + + tests := []struct { + cs string + co string + succ bool + }{ + {"custom", "custom_collation", true}, + {"utf8", "utf8_invalid_ci", false}, + } + for _, tt := range tests { + testValidCharset(t, tt.cs, tt.co, tt.succ) + } +} diff --git a/parser/charset/charset_test.go b/parser/charset/charset_test.go index fe562d5eb8d3d..4a6777e1ddfa8 100644 --- a/parser/charset/charset_test.go +++ b/parser/charset/charset_test.go @@ -17,25 +17,15 @@ import ( "math/rand" "testing" - . "github.com/pingcap/check" + "github.com/stretchr/testify/require" ) -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) { +func testValidCharset(t *testing.T, charset string, collation string, expect bool) { b := ValidCharsetAndCollation(charset, collation) - c.Assert(b, Equals, expect) + require.Equal(t, expect, b) } -func (s *testCharsetSuite) TestValidCharset(c *C) { +func TestValidCharset(t *testing.T) { tests := []struct { cs string co string @@ -56,37 +46,20 @@ func (s *testCharsetSuite) TestValidCharset(c *C) { {"Utf8", "uTf8_bIN", true}, } for _, tt := range tests { - testValidCharset(c, tt.cs, tt.co, tt.succ) - } -} - -func (s *testCharsetSuite) TestValidCustomCharset(c *C) { - AddCharset(&Charset{"custom", "custom_collation", make(map[string]*Collation), "Custom", 4}) - AddCollation(&Collation{99999, "custom", "custom_collation", true}) - - tests := []struct { - cs string - co string - succ bool - }{ - {"custom", "custom_collation", true}, - {"utf8", "utf8_invalid_ci", false}, - } - for _, tt := range tests { - testValidCharset(c, tt.cs, tt.co, tt.succ) + testValidCharset(t, tt.cs, tt.co, tt.succ) } } -func testGetDefaultCollation(c *C, charset string, expectCollation string, succ bool) { +func testGetDefaultCollation(t *testing.T, charset string, expectCollation string, succ bool) { b, err := GetDefaultCollation(charset) if !succ { - c.Assert(err, NotNil) + require.Error(t, err) return } - c.Assert(b, Equals, expectCollation) + require.Equal(t, expectCollation, b) } -func (s *testCharsetSuite) TestGetDefaultCollation(c *C) { +func TestGetDefaultCollation(t *testing.T) { tests := []struct { cs string co string @@ -102,28 +75,27 @@ func (s *testCharsetSuite) TestGetDefaultCollation(c *C) { {"", "utf8_bin", false}, } for _, tt := range tests { - testGetDefaultCollation(c, tt.cs, tt.co, tt.succ) + testGetDefaultCollation(t, tt.cs, tt.co, tt.succ) } // Test the consistency of collations table and charset desc table - charset_num := 0 + charsetNum := 0 for _, collate := range collations { if collate.IsDefault { if desc, ok := charsetInfos[collate.CharsetName]; ok { - c.Assert(collate.Name, Equals, desc.DefaultCollation) - charset_num += 1 + require.Equal(t, desc.DefaultCollation, collate.Name) + charsetNum += 1 } } } - c.Assert(charset_num, Equals, len(charsetInfos)) + require.Equal(t, len(charsetInfos), charsetNum) } -func (s *testCharsetSuite) TestSupportedCollations(c *C) { +func TestSupportedCollations(t *testing.T) { // All supportedCollation are defined from their names - c.Assert(len(supportedCollationNames), Equals, len(supportedCollationNames)) + require.Equal(t, len(supportedCollationNames), len(supportedCollationNames)) // The default collations of supported charsets is the subset of supported collations - errMsg := "Charset [%v] is supported but its default collation [%v] is not." for _, desc := range GetSupportedCharsets() { found := false for _, c := range GetSupportedCollations() { @@ -132,11 +104,11 @@ func (s *testCharsetSuite) TestSupportedCollations(c *C) { break } } - c.Assert(found, IsTrue, Commentf(errMsg, desc.Name, desc.DefaultCollation)) + require.Truef(t, found, "Charset [%v] is supported but its default collation [%v] is not.", desc.Name, desc.DefaultCollation) } } -func (s *testCharsetSuite) TestGetCharsetDesc(c *C) { +func TestGetCharsetDesc(t *testing.T) { tests := []struct { cs string result string @@ -154,23 +126,22 @@ func (s *testCharsetSuite) TestGetCharsetDesc(c *C) { for _, tt := range tests { desc, err := GetCharsetInfo(tt.cs) if !tt.succ { - c.Assert(err, NotNil) + require.Error(t, err) } else { - c.Assert(desc.Name, Equals, tt.result) + require.Equal(t, tt.result, desc.Name) } } } -func (s *testCharsetSuite) TestGetCollationByName(c *C) { - +func TestGetCollationByName(t *testing.T) { for _, collation := range collations { coll, err := GetCollationByName(collation.Name) - c.Assert(err, IsNil) - c.Assert(coll, Equals, collation) + require.NoError(t, err) + require.Equal(t, collation, coll) } _, err := GetCollationByName("non_exist") - c.Assert(err, ErrorMatches, "\\[ddl:1273\\]Unknown collation: 'non_exist'") + require.EqualError(t, err, "[ddl:1273]Unknown collation: 'non_exist'") } func BenchmarkGetCharsetDesc(b *testing.B) { diff --git a/parser/charset/encoding.go b/parser/charset/encoding.go index c2f52b36e0639..8bd1b92c9bcf6 100644 --- a/parser/charset/encoding.go +++ b/parser/charset/encoding.go @@ -28,8 +28,6 @@ import ( "golang.org/x/text/transform" ) -const encodingLegacy = "utf-8" // utf-8 encoding is compatible with old default behavior. - var errInvalidCharacterString = terror.ClassParser.NewStd(mysql.ErrInvalidCharacterString) type EncodingLabel string @@ -54,7 +52,7 @@ type Encoding struct { // enabled indicates whether the non-utf8 encoding is used. func (e *Encoding) enabled() bool { - return e.enc != nil && e.charLength != nil + return e != UTF8Encoding } // Name returns the name of the current encoding. @@ -62,35 +60,21 @@ func (e *Encoding) Name() string { return e.name } +// CharLength returns the next character length in bytes. +func (e *Encoding) CharLength(bs []byte) int { + return e.charLength(bs) +} + // NewEncoding creates a new Encoding. func NewEncoding(label string) *Encoding { if len(label) == 0 { - return &Encoding{} - } - e, name := Lookup(label) - if e != nil && name != encodingLegacy { - return &Encoding{ - enc: e, - name: name, - charLength: FindNextCharacterLength(name), - specialCase: LookupSpecialCase(name), - } + return UTF8Encoding } - return &Encoding{name: name} -} - -// UpdateEncoding updates to a new Encoding. -func (e *Encoding) UpdateEncoding(label EncodingLabel) { - enc, name := lookup(label) - e.name = name - if enc != nil && name != encodingLegacy { - e.enc = enc - e.charLength = FindNextCharacterLength(name) - } else { - e.enc = nil - e.charLength = nil + + if e, exist := encodingMap[Format(label)]; exist { + return e } - e.specialCase = LookupSpecialCase(e.name) + return UTF8Encoding } // Encode convert bytes from utf-8 charset to a specific charset. @@ -110,6 +94,46 @@ func (e *Encoding) EncodeString(src string) (string, error) { return string(bs), err } +// EncodeFirstChar convert first code point of bytes from utf-8 charset to a specific charset. +func (e *Encoding) EncodeFirstChar(dest, src []byte) ([]byte, error) { + srcNextLen := e.nextCharLenInSrc(src, false) + srcEnd := mathutil.Min(srcNextLen, len(src)) + if !e.enabled() { + return src[:srcEnd], nil + } + return e.transform(e.enc.NewEncoder(), dest, src[:srcEnd], false) +} + +// EncodeInternal convert bytes from utf-8 charset to a specific charset, we actually do not do the real convert, just find the inconvertible character and use ? replace. +// The code below is equivalent to +// expr, _ := e.Encode(dest, src) +// ret, _ := e.Decode(nil, expr) +// return ret +func (e *Encoding) EncodeInternal(dest, src []byte) []byte { + if !e.enabled() { + return src + } + if dest == nil { + dest = make([]byte, 0, len(src)) + } + var srcOffset int + + var buf [4]byte + transformer := e.enc.NewEncoder() + for srcOffset < len(src) { + length := UTF8Encoding.CharLength(src[srcOffset:]) + _, _, err := transformer.Transform(buf[:], src[srcOffset:srcOffset+length], true) + if err != nil { + dest = append(dest, byte('?')) + } else { + dest = append(dest, src[srcOffset:srcOffset+length]...) + } + srcOffset += length + } + + return dest +} + // Decode convert bytes from a specific charset to utf-8 charset. func (e *Encoding) Decode(dest, src []byte) ([]byte, error) { if !e.enabled() { @@ -131,6 +155,9 @@ func (e *Encoding) transform(transformer transform.Transformer, dest, src []byte if len(dest) < len(src) { dest = make([]byte, len(src)*2) } + if len(src) == 0 { + return src, nil + } var destOffset, srcOffset int var encodingErr error for { @@ -162,7 +189,7 @@ func (e *Encoding) nextCharLenInSrc(srcRest []byte, isDecoding bool) int { } return len(srcRest) } - return characterLengthUTF8(srcRest) + return UTF8Encoding.CharLength(srcRest) } func enlargeCapacity(dest []byte) []byte { diff --git a/parser/charset/encoding_table.go b/parser/charset/encoding_table.go index ea7e6d8915798..2de9d957d923a 100644 --- a/parser/charset/encoding_table.go +++ b/parser/charset/encoding_table.go @@ -15,7 +15,10 @@ package charset import ( "strings" + go_unicode "unicode" + "unicode/utf8" + "github.com/cznic/mathutil" "golang.org/x/text/encoding" "golang.org/x/text/encoding/charmap" "golang.org/x/text/encoding/japanese" @@ -25,6 +28,15 @@ import ( "golang.org/x/text/encoding/unicode" ) +var encodingMap = map[EncodingLabel]*Encoding{ + CharsetUTF8MB4: UTF8Encoding, + CharsetUTF8: UTF8Encoding, + CharsetGBK: GBKEncoding, + CharsetLatin1: LatinEncoding, + CharsetBin: BinaryEncoding, + CharsetASCII: ASCIIEncoding, +} + // Lookup returns the encoding with the specified label, and its canonical // name. It returns nil and the empty string if label is not one of the // standard encodings for HTML. Matching is case-insensitive and ignores @@ -263,38 +275,178 @@ var encodings = map[string]struct { "x-user-defined": {charmap.XUserDefined, "x-user-defined"}, } -// FindNextCharacterLength is used in lexer.peek() to determine the next character length. -func FindNextCharacterLength(label string) func([]byte) int { - if f, ok := encodingNextCharacterLength[label]; ok { - return f +// TruncateStrategy indicates the way to handle the invalid strings in specific charset. +// - TruncateStrategyEmpty: returns an empty string. +// - TruncateStrategyTrim: returns the valid prefix part of string. +// - TruncateStrategyReplace: returns the whole string, but the invalid characters are replaced with '?'. +type TruncateStrategy int8 + +const ( + TruncateStrategyEmpty TruncateStrategy = iota + TruncateStrategyTrim + TruncateStrategyReplace +) + +var _ StringValidator = StringValidatorASCII{} +var _ StringValidator = StringValidatorUTF8{} +var _ StringValidator = StringValidatorOther{} + +// StringValidator is used to check if a string is valid in the specific charset. +type StringValidator interface { + Validate(str string) (invalidPos int) + Truncate(str string, strategy TruncateStrategy) (result string, invalidPos int) +} + +// StringValidatorASCII checks whether a string is valid ASCII string. +type StringValidatorASCII struct{} + +// Validate checks whether the string is valid in the given charset. +func (s StringValidatorASCII) Validate(str string) int { + _, invalidPos := s.Truncate(str, TruncateStrategyEmpty) + return invalidPos +} + +// Truncate implement the interface StringValidator. +func (s StringValidatorASCII) Truncate(str string, strategy TruncateStrategy) (string, int) { + invalidPos := -1 + for i := 0; i < len(str); i++ { + if str[i] > go_unicode.MaxASCII { + invalidPos = i + break + } } - return nil + if invalidPos == -1 { + // Quick check passed. + return str, -1 + } + switch strategy { + case TruncateStrategyEmpty: + return "", invalidPos + case TruncateStrategyTrim: + return str[:invalidPos], invalidPos + case TruncateStrategyReplace: + result := make([]byte, 0, len(str)) + for i, w := 0, 0; i < len(str); i += w { + w = 1 + if str[i] > go_unicode.MaxASCII { + w = UTF8Encoding.CharLength(Slice(str)[i:]) + w = mathutil.Min(w, len(str)-i) + result = append(result, '?') + continue + } + result = append(result, str[i:i+w]...) + } + return string(result), invalidPos + } + return str, -1 } -var encodingNextCharacterLength = map[string]func([]byte) int{ - // https://en.wikipedia.org/wiki/GBK_(character_encoding)#Layout_diagram - "gbk": characterLengthGBK, - "utf-8": characterLengthUTF8, - "binary": func(bs []byte) int { - return 1 - }, +// StringValidatorUTF8 checks whether a string is valid UTF8 string. +type StringValidatorUTF8 struct { + IsUTF8MB4 bool // Distinguish between "utf8" and "utf8mb4" + CheckMB4ValueInUTF8 bool } -func characterLengthGBK(bs []byte) int { - if len(bs) == 0 || bs[0] < 0x80 { - // A byte in the range 00–7F is a single byte that means the same thing as it does in ASCII. - return 1 +// Validate checks whether the string is valid in the given charset. +func (s StringValidatorUTF8) Validate(str string) int { + _, invalidPos := s.Truncate(str, TruncateStrategyEmpty) + return invalidPos +} + +// Truncate implement the interface StringValidator. +func (s StringValidatorUTF8) Truncate(str string, strategy TruncateStrategy) (string, int) { + if str == "" { + return str, -1 + } + if s.IsUTF8MB4 && utf8.ValidString(str) { + // Quick check passed. + return str, -1 + } + doMB4CharCheck := !s.IsUTF8MB4 && s.CheckMB4ValueInUTF8 + var result []byte + if strategy == TruncateStrategyReplace { + result = make([]byte, 0, len(str)) + } + invalidPos := -1 + for i, w := 0, 0; i < len(str); i += w { + var rv rune + rv, w = utf8.DecodeRuneInString(str[i:]) + if (rv == utf8.RuneError && w == 1) || (w > 3 && doMB4CharCheck) { + if invalidPos == -1 { + invalidPos = i + } + switch strategy { + case TruncateStrategyEmpty: + return "", invalidPos + case TruncateStrategyTrim: + return str[:i], invalidPos + case TruncateStrategyReplace: + result = append(result, '?') + continue + } + } + if strategy == TruncateStrategyReplace { + result = append(result, str[i:i+w]...) + } } - return 2 + if strategy == TruncateStrategyReplace { + return string(result), invalidPos + } + return str, -1 +} + +// StringValidatorOther checks whether a string is valid string in given charset. +type StringValidatorOther struct { + Charset string } -func characterLengthUTF8(bs []byte) int { - if len(bs) == 0 || bs[0] < 0x80 { - return 1 - } else if bs[0] < 0xe0 { - return 2 - } else if bs[0] < 0xf0 { - return 3 +// Validate checks whether the string is valid in the given charset. +func (s StringValidatorOther) Validate(str string) int { + _, invalidPos := s.Truncate(str, TruncateStrategyEmpty) + return invalidPos +} + +// Truncate implement the interface StringValidator. +func (s StringValidatorOther) Truncate(str string, strategy TruncateStrategy) (string, int) { + if str == "" { + return str, -1 + } + enc := NewEncoding(s.Charset) + if !enc.enabled() { + return str, -1 + } + var result []byte + if strategy == TruncateStrategyReplace { + result = make([]byte, 0, len(str)) + } + var buf [4]byte + strBytes := Slice(str) + transformer := enc.enc.NewEncoder() + invalidPos := -1 + for i, w := 0, 0; i < len(str); i += w { + w = UTF8Encoding.CharLength(strBytes[i:]) + w = mathutil.Min(w, len(str)-i) + _, _, err := transformer.Transform(buf[:], strBytes[i:i+w], true) + if err != nil { + if invalidPos == -1 { + invalidPos = i + } + switch strategy { + case TruncateStrategyEmpty: + return "", invalidPos + case TruncateStrategyTrim: + return str[:i], invalidPos + case TruncateStrategyReplace: + result = append(result, '?') + continue + } + } + if strategy == TruncateStrategyReplace { + result = append(result, strBytes[i:i+w]...) + } + } + if strategy == TruncateStrategyReplace { + return string(result), invalidPos } - return 4 + return str, -1 } diff --git a/parser/charset/encoding_test.go b/parser/charset/encoding_test.go index f49a76d80335a..51f5b53b3e2fd 100644 --- a/parser/charset/encoding_test.go +++ b/parser/charset/encoding_test.go @@ -14,38 +14,33 @@ package charset_test import ( - . "github.com/pingcap/check" + "fmt" + "testing" + "unicode/utf8" + "github.com/pingcap/tidb/parser/charset" + "github.com/stretchr/testify/require" "golang.org/x/text/transform" ) -var _ = Suite(&testEncodingSuite{}) - -type testEncodingSuite struct { -} - -func (s *testEncodingSuite) TestEncoding(c *C) { - enc := charset.NewEncoding("gbk") - c.Assert(enc.Name(), Equals, "gbk") - enc.UpdateEncoding("utf-8") - c.Assert(enc.Name(), Equals, "utf-8") - enc.UpdateEncoding("gbk") - c.Assert(enc.Name(), Equals, "gbk") +func TestEncoding(t *testing.T) { + enc := charset.NewEncoding(charset.CharsetGBK) + require.Equal(t, charset.CharsetGBK, enc.Name()) txt := []byte("一二三四") e, _ := charset.Lookup("gbk") gbkEncodedTxt, _, err := transform.Bytes(e.NewEncoder(), txt) - c.Assert(err, IsNil) + require.NoError(t, err) result, err := enc.Decode(nil, gbkEncodedTxt) - c.Assert(err, IsNil) - c.Assert(result, DeepEquals, txt) + require.NoError(t, err) + require.Equal(t, txt, result) gbkEncodedTxt2, err := enc.Encode(nil, txt) - c.Assert(err, IsNil) - c.Assert(gbkEncodedTxt, DeepEquals, gbkEncodedTxt2) + require.NoError(t, err) + require.Equal(t, gbkEncodedTxt2, gbkEncodedTxt) result, err = enc.Decode(nil, gbkEncodedTxt2) - c.Assert(err, IsNil) - c.Assert(result, DeepEquals, txt) + require.NoError(t, err) + require.Equal(t, txt, result) GBKCases := []struct { utf8Str string @@ -62,14 +57,14 @@ func (s *testEncodingSuite) TestEncoding(c *C) { {"佝佗佇佶侈侏侘佻佩佰侑佯", "浣濅綏浣囦蕉渚堜緩渚樹交浣╀桨渚戜蒋", true}, } for _, tc := range GBKCases { - cmt := Commentf("%v", tc) + cmt := fmt.Sprintf("%v", tc) result, err = enc.Decode(nil, []byte(tc.utf8Str)) if tc.isValid { - c.Assert(err, IsNil, cmt) + require.NoError(t, err, cmt) } else { - c.Assert(err, NotNil, cmt) + require.Error(t, err, cmt) } - c.Assert(string(result), Equals, tc.result, cmt) + require.Equal(t, tc.result, string(result), cmt) } utf8Cases := []struct { @@ -82,13 +77,122 @@ func (s *testEncodingSuite) TestEncoding(c *C) { {"valid_string_🀁", "valid_string_?", false}, } for _, tc := range utf8Cases { - cmt := Commentf("%v", tc) + cmt := fmt.Sprintf("%v", tc) result, err = enc.Encode(nil, []byte(tc.utf8Str)) if tc.isValid { - c.Assert(err, IsNil, cmt) + require.NoError(t, err, cmt) } else { - c.Assert(err, NotNil, cmt) + require.Error(t, err, cmt) } - c.Assert(string(result), Equals, tc.result, cmt) + require.Equal(t, tc.result, string(result), cmt) + } +} + +func TestStringValidatorASCII(t *testing.T) { + v := charset.StringValidatorASCII{} + testCases := []struct { + str string + strategy charset.TruncateStrategy + expected string + invalidPos int + }{ + {"", charset.TruncateStrategyEmpty, "", -1}, + {"qwerty", charset.TruncateStrategyEmpty, "qwerty", -1}, + {"qwÊrty", charset.TruncateStrategyEmpty, "", 2}, + {"qwÊrty", charset.TruncateStrategyTrim, "qw", 2}, + {"qwÊrty", charset.TruncateStrategyReplace, "qw?rty", 2}, + {"中文", charset.TruncateStrategyEmpty, "", 0}, + {"中文?qwert", charset.TruncateStrategyTrim, "", 0}, + {"中文?qwert", charset.TruncateStrategyReplace, "???qwert", 0}, + } + for _, tc := range testCases { + msg := fmt.Sprintf("%v", tc) + actual, invalidPos := v.Truncate(tc.str, tc.strategy) + require.Equal(t, tc.expected, actual, msg) + require.Equal(t, tc.invalidPos, invalidPos, msg) + } + require.Equal(t, -1, v.Validate("qwerty")) + require.Equal(t, 2, v.Validate("qwÊrty")) + require.Equal(t, 0, v.Validate("中文")) +} + +func TestStringValidatorUTF8(t *testing.T) { + // Test charset "utf8mb4". + v := charset.StringValidatorUTF8{IsUTF8MB4: true} + oxfffefd := string([]byte{0xff, 0xfe, 0xfd}) + testCases := []struct { + str string + strategy charset.TruncateStrategy + expected string + invalidPos int + }{ + {"", charset.TruncateStrategyEmpty, "", -1}, + {"qwerty", charset.TruncateStrategyEmpty, "qwerty", -1}, + {"qwÊrty", charset.TruncateStrategyEmpty, "qwÊrty", -1}, + {"qwÊ合法字符串", charset.TruncateStrategyEmpty, "qwÊ合法字符串", -1}, + {"😂", charset.TruncateStrategyEmpty, "😂", -1}, + {oxfffefd, charset.TruncateStrategyEmpty, "", 0}, + {oxfffefd, charset.TruncateStrategyReplace, "???", 0}, + {"中文" + oxfffefd, charset.TruncateStrategyTrim, "中文", 6}, + {"中文" + oxfffefd, charset.TruncateStrategyReplace, "中文???", 6}, + {string(utf8.RuneError), charset.TruncateStrategyEmpty, "�", -1}, + } + for _, tc := range testCases { + msg := fmt.Sprintf("%v", tc) + actual, invalidPos := v.Truncate(tc.str, tc.strategy) + require.Equal(t, tc.expected, actual, msg) + require.Equal(t, tc.invalidPos, invalidPos, msg) + } + // Test charset "utf8" with checking mb4 value. + v = charset.StringValidatorUTF8{IsUTF8MB4: false, CheckMB4ValueInUTF8: true} + testCases = []struct { + str string + strategy charset.TruncateStrategy + expected string + invalidPos int + }{ + {"", charset.TruncateStrategyEmpty, "", -1}, + {"qwerty", charset.TruncateStrategyEmpty, "qwerty", -1}, + {"qwÊrty", charset.TruncateStrategyEmpty, "qwÊrty", -1}, + {"qwÊ合法字符串", charset.TruncateStrategyEmpty, "qwÊ合法字符串", -1}, + {"😂", charset.TruncateStrategyEmpty, "", 0}, + {"😂", charset.TruncateStrategyReplace, "?", 0}, + {"valid_str😂", charset.TruncateStrategyReplace, "valid_str?", 9}, + {oxfffefd, charset.TruncateStrategyEmpty, "", 0}, + {oxfffefd, charset.TruncateStrategyReplace, "???", 0}, + {"中文" + oxfffefd, charset.TruncateStrategyTrim, "中文", 6}, + {"中文" + oxfffefd, charset.TruncateStrategyReplace, "中文???", 6}, + {string(utf8.RuneError), charset.TruncateStrategyEmpty, "�", -1}, + } + for _, tc := range testCases { + msg := fmt.Sprintf("%v", tc) + actual, invalidPos := v.Truncate(tc.str, tc.strategy) + require.Equal(t, tc.expected, actual, msg) + require.Equal(t, tc.invalidPos, invalidPos, msg) + } +} + +func TestStringValidatorGBK(t *testing.T) { + v := charset.StringValidatorOther{Charset: "gbk"} + testCases := []struct { + str string + strategy charset.TruncateStrategy + expected string + invalidPos int + }{ + {"", charset.TruncateStrategyEmpty, "", -1}, + {"asdf", charset.TruncateStrategyEmpty, "asdf", -1}, + {"中文", charset.TruncateStrategyEmpty, "中文", -1}, + {"À", charset.TruncateStrategyEmpty, "", 0}, + {"À", charset.TruncateStrategyReplace, "?", 0}, + {"中文À中文", charset.TruncateStrategyTrim, "中文", 6}, + {"中文À中文", charset.TruncateStrategyReplace, "中文?中文", 6}, + {"asdfÀ", charset.TruncateStrategyReplace, "asdf?", 4}, + } + for _, tc := range testCases { + msg := fmt.Sprintf("%v", tc) + actual, invalidPos := v.Truncate(tc.str, tc.strategy) + require.Equal(t, tc.expected, actual, msg) + require.Equal(t, tc.invalidPos, invalidPos, msg) } } diff --git a/parser/charset/gbk.go b/parser/charset/gbk.go new file mode 100644 index 0000000000000..5686c6e1b50f0 --- /dev/null +++ b/parser/charset/gbk.go @@ -0,0 +1,29 @@ +// Copyright 2021 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 "golang.org/x/text/encoding/simplifiedchinese" + +var GBKEncoding = &Encoding{ + enc: simplifiedchinese.GBK, + name: CharsetGBK, + charLength: func(bs []byte) int { + if len(bs) == 0 || bs[0] < 0x80 { + // A byte in the range 00–7F is a single byte that means the same thing as it does in ASCII. + return 1 + } + return 2 + }, + specialCase: GBKCase, +} diff --git a/parser/charset/latin.go b/parser/charset/latin.go new file mode 100644 index 0000000000000..04de80d250aef --- /dev/null +++ b/parser/charset/latin.go @@ -0,0 +1,48 @@ +// Copyright 2021 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 ( + "golang.org/x/text/encoding" + "golang.org/x/text/encoding/charmap" +) + +var ( + LatinEncoding = &Encoding{ + enc: charmap.Windows1252, + name: CharsetLatin1, + charLength: func(bytes []byte) int { + return 1 + }, + specialCase: nil, + } + + BinaryEncoding = &Encoding{ + enc: encoding.Nop, + name: CharsetBin, + charLength: func(bytes []byte) int { + return 1 + }, + specialCase: nil, + } + + ASCIIEncoding = &Encoding{ + enc: encoding.Nop, + name: CharsetASCII, + charLength: func(bytes []byte) int { + return 1 + }, + specialCase: nil, + } +) diff --git a/parser/charset/utf.go b/parser/charset/utf.go new file mode 100644 index 0000000000000..301aaba49d19a --- /dev/null +++ b/parser/charset/utf.go @@ -0,0 +1,34 @@ +// Copyright 2021 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 ( + "golang.org/x/text/encoding" +) + +var UTF8Encoding = &Encoding{ + enc: encoding.Nop, + name: CharsetUTF8MB4, + charLength: func(bs []byte) int { + if len(bs) == 0 || bs[0] < 0x80 { + return 1 + } else if bs[0] < 0xe0 { + return 2 + } else if bs[0] < 0xf0 { + return 3 + } + return 4 + }, + specialCase: nil, +} diff --git a/parser/checkout-pr-branch.sh b/parser/checkout-pr-branch.sh deleted file mode 100755 index e66b4aad82f4c..0000000000000 --- a/parser/checkout-pr-branch.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash - -# This script is used to checkout a Parser PR branch in a forked repo. -if test -z $1; then - echo -e "Usage:\n" - echo -e "\tcheckout-pr-branch.sh [github-username]:[pr-branch]\n" - echo -e "The argument can be copied directly from github PR page." - echo -e "The local branch name would be [github-username]/[pr-branch]." - exit 0; -fi - -username=$(echo $1 | cut -d':' -f1) -branch=$(echo $1 | cut -d':' -f2) -local_branch=$username/$branch -fork="https://github.com/$username/parser" - -exists=`git show-ref refs/heads/$local_branch` -if [ -n "$exists" ]; then - git checkout $local_branch - git pull $fork $branch:$local_branch -else - git fetch $fork $branch:$local_branch - git checkout $local_branch -fi diff --git a/parser/consistent_test.go b/parser/consistent_test.go index 1aaa15afe4c5d..621eea0a891eb 100644 --- a/parser/consistent_test.go +++ b/parser/consistent_test.go @@ -20,29 +20,19 @@ import ( "runtime" "sort" "strings" + "testing" - . "github.com/pingcap/check" + requires "github.com/stretchr/testify/require" ) -var _ = Suite(&testConsistentSuite{}) - -type testConsistentSuite struct { - content string - - reservedKeywords []string - unreservedKeywords []string - notKeywordTokens []string - tidbKeywords []string -} - -func (s *testConsistentSuite) SetUpSuite(c *C) { +func TestKeywordConsistent(t *testing.T) { _, filename, _, _ := runtime.Caller(0) parserFilename := path.Join(path.Dir(filename), "parser.y") parserFile, err := os.Open(parserFilename) - c.Assert(err, IsNil) + requires.NoError(t, err) data, err := ioutil.ReadAll(parserFile) - c.Assert(err, IsNil) - s.content = string(data) + requires.NoError(t, err) + content := string(data) reservedKeywordStartMarker := "\t/* The following tokens belong to ReservedKeyword. Notice: make sure these tokens are contained in ReservedKeyword. */" unreservedKeywordStartMarker := "\t/* The following tokens belong to UnReservedKeyword. Notice: make sure these tokens are contained in UnReservedKeyword. */" @@ -50,28 +40,26 @@ func (s *testConsistentSuite) SetUpSuite(c *C) { tidbKeywordStartMarker := "\t/* The following tokens belong to TiDBKeyword. Notice: make sure these tokens are contained in TiDBKeyword. */" identTokenEndMarker := "%token\t<item>" - s.reservedKeywords = extractKeywords(s.content, reservedKeywordStartMarker, unreservedKeywordStartMarker) - s.unreservedKeywords = extractKeywords(s.content, unreservedKeywordStartMarker, notKeywordTokenStartMarker) - s.notKeywordTokens = extractKeywords(s.content, notKeywordTokenStartMarker, tidbKeywordStartMarker) - s.tidbKeywords = extractKeywords(s.content, tidbKeywordStartMarker, identTokenEndMarker) -} + reservedKeywords := extractKeywords(content, reservedKeywordStartMarker, unreservedKeywordStartMarker) + unreservedKeywords := extractKeywords(content, unreservedKeywordStartMarker, notKeywordTokenStartMarker) + notKeywordTokens := extractKeywords(content, notKeywordTokenStartMarker, tidbKeywordStartMarker) + tidbKeywords := extractKeywords(content, tidbKeywordStartMarker, identTokenEndMarker) -func (s *testConsistentSuite) TestKeywordConsistent(c *C) { for k, v := range aliases { - c.Assert(k, Not(Equals), v) - c.Assert(tokenMap[k], Equals, tokenMap[v]) + requires.NotEqual(t, k, v) + requires.Equal(t, tokenMap[v], tokenMap[k]) } - keywordCount := len(s.reservedKeywords) + len(s.unreservedKeywords) + len(s.notKeywordTokens) + len(s.tidbKeywords) - c.Assert(len(tokenMap)-len(aliases), Equals, keywordCount-len(windowFuncTokenMap)) + keywordCount := len(reservedKeywords) + len(unreservedKeywords) + len(notKeywordTokens) + len(tidbKeywords) + requires.Equal(t, keywordCount-len(windowFuncTokenMap), len(tokenMap)-len(aliases)) - unreservedCollectionDef := extractKeywordsFromCollectionDef(s.content, "\nUnReservedKeyword:") - c.Assert(s.unreservedKeywords, DeepEquals, unreservedCollectionDef) + unreservedCollectionDef := extractKeywordsFromCollectionDef(content, "\nUnReservedKeyword:") + requires.Equal(t, unreservedCollectionDef, unreservedKeywords) - notKeywordTokensCollectionDef := extractKeywordsFromCollectionDef(s.content, "\nNotKeywordToken:") - c.Assert(s.notKeywordTokens, DeepEquals, notKeywordTokensCollectionDef) + notKeywordTokensCollectionDef := extractKeywordsFromCollectionDef(content, "\nNotKeywordToken:") + requires.Equal(t, notKeywordTokensCollectionDef, notKeywordTokens) - tidbKeywordsCollectionDef := extractKeywordsFromCollectionDef(s.content, "\nTiDBKeyword:") - c.Assert(s.tidbKeywords, DeepEquals, tidbKeywordsCollectionDef) + tidbKeywordsCollectionDef := extractKeywordsFromCollectionDef(content, "\nTiDBKeyword:") + requires.Equal(t, tidbKeywordsCollectionDef, tidbKeywords) } func extractMiddle(str, startMarker, endMarker string) string { diff --git a/parser/digester_test.go b/parser/digester_test.go index 9f797dd0fd6bc..d69346e2faa7c 100644 --- a/parser/digester_test.go +++ b/parser/digester_test.go @@ -19,16 +19,11 @@ import ( "fmt" "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser" + "github.com/stretchr/testify/require" ) -var _ = Suite(&testSQLDigestSuite{}) - -type testSQLDigestSuite struct { -} - -func (s *testSQLDigestSuite) TestNormalize(c *C) { +func TestNormalize(t *testing.T) { tests := []struct { input string expect string @@ -72,15 +67,15 @@ func (s *testSQLDigestSuite) TestNormalize(c *C) { for _, test := range tests { normalized := parser.Normalize(test.input) digest := parser.DigestNormalized(normalized) - c.Assert(normalized, Equals, test.expect) + require.Equal(t, test.expect, normalized) normalized2, digest2 := parser.NormalizeDigest(test.input) - c.Assert(normalized2, Equals, normalized) - c.Assert(digest2.String(), Equals, digest.String(), Commentf("%+v", test)) + require.Equal(t, normalized, normalized2) + require.Equalf(t, digest.String(), digest2.String(), "%+v", test) } } -func (s *testSQLDigestSuite) TestNormalizeDigest(c *C) { +func TestNormalizeDigest(t *testing.T) { tests := []struct { sql string normalized string @@ -90,17 +85,17 @@ func (s *testSQLDigestSuite) TestNormalizeDigest(c *C) { } for _, test := range tests { normalized, digest := parser.NormalizeDigest(test.sql) - c.Assert(normalized, Equals, test.normalized) - c.Assert(digest.String(), Equals, test.digest) + require.Equal(t, test.normalized, normalized) + require.Equal(t, test.digest, digest.String()) normalized = parser.Normalize(test.sql) digest = parser.DigestNormalized(normalized) - c.Assert(normalized, Equals, test.normalized) - c.Assert(digest.String(), Equals, test.digest) + require.Equal(t, test.normalized, normalized) + require.Equal(t, test.digest, digest.String()) } } -func (s *testSQLDigestSuite) TestDigestHashEqForSimpleSQL(c *C) { +func TestDigestHashEqForSimpleSQL(t *testing.T) { sqlGroups := [][]string{ {"select * from b where id = 1", "select * from b where id = '1'", "select * from b where id =2"}, {"select 2 from b, c where c.id > 1", "select 4 from b, c where c.id > 23"}, @@ -114,12 +109,12 @@ func (s *testSQLDigestSuite) TestDigestHashEqForSimpleSQL(c *C) { d = dig.String() continue } - c.Assert(d, Equals, dig.String()) + require.Equal(t, dig.String(), d) } } } -func (s *testSQLDigestSuite) TestDigestHashNotEqForSimpleSQL(c *C) { +func TestDigestHashNotEqForSimpleSQL(t *testing.T) { sqlGroups := [][]string{ {"select * from b where id = 1", "select a from b where id = 1", "select * from d where bid =1"}, } @@ -131,19 +126,19 @@ func (s *testSQLDigestSuite) TestDigestHashNotEqForSimpleSQL(c *C) { d = dig.String() continue } - c.Assert(d, Not(Equals), dig.String()) + require.NotEqual(t, dig.String(), d) } } } -func (s *testSQLDigestSuite) TestGenDigest(c *C) { +func TestGenDigest(t *testing.T) { hash := genRandDigest("abc") digest := parser.NewDigest(hash) - c.Assert(digest.String(), Equals, fmt.Sprintf("%x", hash)) - c.Assert(digest.Bytes(), DeepEquals, hash) + require.Equal(t, fmt.Sprintf("%x", hash), digest.String()) + require.Equal(t, hash, digest.Bytes()) digest = parser.NewDigest(nil) - c.Assert(digest.String(), Equals, "") - c.Assert(digest.Bytes(), IsNil) + require.Equal(t, "", digest.String()) + require.Nil(t, digest.Bytes()) } func genRandDigest(str string) []byte { diff --git a/parser/format/format_test.go b/parser/format/format_test.go index 9122edbe24adf..955b7fa46e965 100644 --- a/parser/format/format_test.go +++ b/parser/format/format_test.go @@ -19,29 +19,18 @@ import ( "strings" "testing" - . "github.com/pingcap/check" + "github.com/stretchr/testify/require" ) -func TestT(t *testing.T) { - CustomVerboseFlag = true - TestingT(t) -} - -var _ = Suite(&testFormatSuite{}) -var _ = Suite(&testRestoreCtxSuite{}) - -type testFormatSuite struct { -} - -func checkFormat(c *C, f Formatter, buf *bytes.Buffer, str, expect string) { +func checkFormat(t *testing.T, f Formatter, buf *bytes.Buffer, str, expect string) { _, err := f.Format(str, 3) - c.Assert(err, IsNil) + require.NoError(t, err) b, err := ioutil.ReadAll(buf) - c.Assert(err, IsNil) - c.Assert(string(b), Equals, expect) + require.NoError(t, err) + require.Equal(t, expect, string(b)) } -func (s *testFormatSuite) TestFormat(c *C) { +func TestFormat(t *testing.T) { str := "abc%d%%e%i\nx\ny\n%uz\n" buf := &bytes.Buffer{} f := IndentFormatter(buf, "\t") @@ -50,19 +39,16 @@ func (s *testFormatSuite) TestFormat(c *C) { y z ` - checkFormat(c, f, buf, str, expect) + checkFormat(t, f, buf, str, expect) str = "abc%d%%e%i\nx\ny\n%uz\n%i\n" buf = &bytes.Buffer{} f = FlatFormatter(buf) expect = "abc3%e x y z\n " - checkFormat(c, f, buf, str, expect) -} - -type testRestoreCtxSuite struct { + checkFormat(t, f, buf, str, expect) } -func (s *testRestoreCtxSuite) TestRestoreCtx(c *C) { +func TestRestoreCtx(t *testing.T) { testCases := []struct { flag RestoreFlags expect string @@ -92,22 +78,22 @@ func (s *testRestoreCtxSuite) TestRestoreCtx(c *C) { ctx.WriteString("str`.'\"ing\\") ctx.WritePlain(" ") ctx.WriteName("na`.'\"Me\\") - c.Assert(sb.String(), Equals, testCase.expect, Commentf("case: %#v", testCase)) + require.Equalf(t, testCase.expect, sb.String(), "case: %#v", testCase) } } -func (s *testRestoreCtxSuite) TestRestoreSpecialComment(c *C) { +func TestRestoreSpecialComment(t *testing.T) { var sb strings.Builder sb.Reset() ctx := NewRestoreCtx(RestoreTiDBSpecialComment, &sb) ctx.WriteWithSpecialComments("fea_id", func() { ctx.WritePlain("content") }) - c.Assert(sb.String(), Equals, "/*T![fea_id] content */") + require.Equal(t, "/*T![fea_id] content */", sb.String()) sb.Reset() ctx.WriteWithSpecialComments("", func() { ctx.WritePlain("shard_row_id_bits") }) - c.Assert(sb.String(), Equals, "/*T! shard_row_id_bits */") + require.Equal(t, "/*T! shard_row_id_bits */", sb.String()) } diff --git a/parser/go.mod b/parser/go.mod index 1ca210048de54..02b141eed3261 100644 --- a/parser/go.mod +++ b/parser/go.mod @@ -1,20 +1,18 @@ module github.com/pingcap/tidb/parser require ( - github.com/cznic/golex v0.0.0-20181122101858-9c343928389c // indirect github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548 - github.com/cznic/parser v0.0.0-20160622100904-31edd927e5b1 github.com/cznic/sortutil v0.0.0-20181122101858-f5f958428db8 github.com/cznic/strutil v0.0.0-20171016134553-529a34b1c186 - github.com/cznic/y v0.0.0-20170802143616-045f81c6662a - github.com/go-sql-driver/mysql v1.3.0 - github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8 + github.com/go-sql-driver/mysql v1.6.0 github.com/pingcap/errors v0.11.5-0.20210425183316-da1aaba5fb63 github.com/pingcap/log v0.0.0-20210625125904-98ed8e2eb1c7 - github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect github.com/stretchr/testify v1.7.0 + go.uber.org/goleak v1.1.10 go.uber.org/zap v1.18.1 golang.org/x/text v0.3.6 + modernc.org/parser v1.0.2 + modernc.org/y v1.0.1 ) go 1.13 diff --git a/parser/go.sum b/parser/go.sum index 2d4a804c5fd81..3ea7bfd55e941 100644 --- a/parser/go.sum +++ b/parser/go.sum @@ -2,30 +2,22 @@ github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/cznic/golex v0.0.0-20181122101858-9c343928389c h1:G8zTsaqyVfIHpgMFcGgdbhHSFhlNc77rAKkhVbQ9kQg= -github.com/cznic/golex v0.0.0-20181122101858-9c343928389c/go.mod h1:+bmmJDNmKlhWNG+gwWCkaBoTy39Fs+bzRxVBzoTQbIc= github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548 h1:iwZdTE0PVqJCos1vaoKsclOGD3ADKpshg3SRtYBbwso= github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM= -github.com/cznic/parser v0.0.0-20160622100904-31edd927e5b1 h1:uWcWCkSP+E1w1z8r082miT+c+9vzg+5UdrgGCo15lMo= -github.com/cznic/parser v0.0.0-20160622100904-31edd927e5b1/go.mod h1:2B43mz36vGZNZEwkWi8ayRSSUXLfjL8OkbzwW4NcPMM= github.com/cznic/sortutil v0.0.0-20181122101858-f5f958428db8 h1:LpMLYGyy67BoAFGda1NeOBQwqlv7nUXpm+rIVHGxZZ4= github.com/cznic/sortutil v0.0.0-20181122101858-f5f958428db8/go.mod h1:q2w6Bg5jeox1B+QkJ6Wp/+Vn0G/bo3f1uY7Fn3vivIQ= github.com/cznic/strutil v0.0.0-20171016134553-529a34b1c186 h1:0rkFMAbn5KBKNpJyHQ6Prb95vIKanmAe62KxsrN+sqA= github.com/cznic/strutil v0.0.0-20171016134553-529a34b1c186/go.mod h1:AHHPPPXTw0h6pVabbcbyGRK1DckRn7r/STdZEeIDzZc= -github.com/cznic/y v0.0.0-20170802143616-045f81c6662a h1:N2rDAvHuM46OGscJkGX4Dw4BBqZgg6mGNGLYs5utVVo= -github.com/cznic/y v0.0.0-20170802143616-045f81c6662a/go.mod h1:1rk5VM7oSnA4vjp+hrLQ3HWHa+Y4yPCa3/CsJrcNnvs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-sql-driver/mysql v1.3.0 h1:pgwjLi/dvffoP9aabwkT3AKpXQM93QARkjFhDDqC1UE= -github.com/go-sql-driver/mysql v1.3.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8 h1:USx2/E1bX46VG32FIw034Au6seQ2fY9NEILmNh/UlQg= -github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8/go.mod h1:B1+S9LNcuMyLH/4HMTViQOJevkGiik3wW2AN9zb2fNQ= github.com/pingcap/errors v0.11.0/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pingcap/errors v0.11.5-0.20210425183316-da1aaba5fb63 h1:+FZIDR/D97YOPik4N4lPDaUcLDF/EQPogxtlHB2ZZRM= github.com/pingcap/errors v0.11.5-0.20210425183316-da1aaba5fb63/go.mod h1:X2r9ueLEUZgtx2cIogM0v4Zj5uvvzhuuiu7Pn8HzMPg= @@ -55,6 +47,7 @@ go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.18.1 h1:CSUJ2mjFszzEWt4CdKISEuChVIXGBn3lAPwkRGyVrc4= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/exp v0.0.0-20181106170214-d68db9428509/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -81,3 +74,22 @@ gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +modernc.org/fileutil v1.0.0/go.mod h1:JHsWpkrk/CnVV1H/eGlFf85BEpfkrp56ro8nojIq9Q8= +modernc.org/golex v1.0.1 h1:EYKY1a3wStt0RzHaH8mdSRNg78Ub0OHxYfCRWw35YtM= +modernc.org/golex v1.0.1/go.mod h1:QCA53QtsT1NdGkaZZkF5ezFwk4IXh4BGNafAARTC254= +modernc.org/lex v1.0.0/go.mod h1:G6rxMTy3cH2iA0iXL/HRRv4Znu8MK4higxph/lE7ypk= +modernc.org/lexer v1.0.0/go.mod h1:F/Dld0YKYdZCLQ7bD0USbWL4YKCyTDRDHiDTOs0q0vk= +modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= +modernc.org/mathutil v1.4.1 h1:ij3fYGe8zBF4Vu+g0oT7mB06r8sqGWKuJu1yXeR4by8= +modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/parser v1.0.0/go.mod h1:H20AntYJ2cHHL6MHthJ8LZzXCdDCHMWt1KZXtIMjejA= +modernc.org/parser v1.0.2 h1:/qHLDn1ezrcRk9/XbErYp84bPPM4+w0kIDuvMdRk6Vc= +modernc.org/parser v1.0.2/go.mod h1:TXNq3HABP3HMaqLK7brD1fLA/LfN0KS6JxZn71QdDqs= +modernc.org/scanner v1.0.1/go.mod h1:OIzD2ZtjYk6yTuyqZr57FmifbM9fIH74SumloSsajuE= +modernc.org/sortutil v1.0.0 h1:SUTM1sCR0Ldpv7dbB/KCPC2zHHsZ1KrSkhmGmmV22CQ= +modernc.org/sortutil v1.0.0/go.mod h1:1QO0q8IlIlmjBIwm6t/7sof874+xCfZouyqZMLIAtxM= +modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= +modernc.org/strutil v1.1.0 h1:+1/yCzZxY2pZwwrsbH+4T7BQMoLQ9QiBshRC9eicYsc= +modernc.org/strutil v1.1.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= +modernc.org/y v1.0.1 h1:+QT+MtLkwkvLkh3fYQq+YD5vw2s5paVE73jdl5R/Py8= +modernc.org/y v1.0.1/go.mod h1:Ho86I+LVHEI+LYXoUKlmOMAM1JTXOCfj8qi1T8PsClE= diff --git a/parser/goyacc/format_yacc.go b/parser/goyacc/format_yacc.go index a814c2b5519fb..209c7acafc699 100644 --- a/parser/goyacc/format_yacc.go +++ b/parser/goyacc/format_yacc.go @@ -23,10 +23,10 @@ import ( "regexp" "strings" - parser "github.com/cznic/parser/yacc" "github.com/cznic/strutil" "github.com/pingcap/errors" "github.com/pingcap/tidb/parser/format" + parser "modernc.org/parser/yacc" ) func Format(inputFilename string, goldenFilename string) (err error) { diff --git a/parser/goyacc/main.go b/parser/goyacc/main.go index 4e9a08343dcec..1b8fae47cd756 100644 --- a/parser/goyacc/main.go +++ b/parser/goyacc/main.go @@ -142,10 +142,10 @@ import ( "strings" "github.com/cznic/mathutil" - parser "github.com/cznic/parser/yacc" "github.com/cznic/sortutil" "github.com/cznic/strutil" - "github.com/cznic/y" + parser "modernc.org/parser/yacc" + "modernc.org/y" ) var ( @@ -528,6 +528,7 @@ type %[1]sLexer interface { Lex(lval *%[1]sSymType) int Errorf(format string, a ...interface{}) error AppendError(err error) + AppendWarn(err error) Errors() (warns []error, errs []error) } diff --git a/parser/hintparser.go b/parser/hintparser.go index 71ead763fee73..146b3f33bace2 100644 --- a/parser/hintparser.go +++ b/parser/hintparser.go @@ -842,6 +842,7 @@ type yyhintLexer interface { Lex(lval *yyhintSymType) int Errorf(format string, a ...interface{}) error AppendError(err error) + AppendWarn(err error) Errors() (warns []error, errs []error) } diff --git a/parser/hintparser_test.go b/parser/hintparser_test.go index 240cdccfb7829..5c252b2d4af78 100644 --- a/parser/hintparser_test.go +++ b/parser/hintparser_test.go @@ -14,7 +14,9 @@ package parser_test import ( - . "github.com/pingcap/check" + "testing" + + "github.com/stretchr/testify/require" "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/parser/ast" @@ -22,11 +24,7 @@ import ( "github.com/pingcap/tidb/parser/mysql" ) -var _ = Suite(&testHintParserSuite{}) - -type testHintParserSuite struct{} - -func (s *testHintParserSuite) TestParseHint(c *C) { +func TestParseHint(t *testing.T) { testCases := []struct { input string mode mysql.SQLMode @@ -35,7 +33,7 @@ func (s *testHintParserSuite) TestParseHint(c *C) { }{ { input: "", - errs: []string{`.*Optimizer hint syntax error at line 1 .*`}, + errs: []string{`Optimizer hint syntax error at line 1 `}, }, { input: "MEMORY_QUOTA(8 MB) MEMORY_QUOTA(6 GB)", @@ -86,39 +84,39 @@ func (s *testHintParserSuite) TestParseHint(c *C) { }, { input: "QB_NAME(1)", - errs: []string{`.*Optimizer hint syntax error at line 1 .*`}, + errs: []string{`Optimizer hint syntax error at line 1 `}, }, { input: "QB_NAME('string literal')", - errs: []string{`.*Optimizer hint syntax error at line 1 .*`}, + errs: []string{`Optimizer hint syntax error at line 1 `}, }, { input: "QB_NAME(many identifiers)", - errs: []string{`.*Optimizer hint syntax error at line 1 .*`}, + errs: []string{`Optimizer hint syntax error at line 1 `}, }, { input: "QB_NAME(@qb1)", - errs: []string{`.*Optimizer hint syntax error at line 1 .*`}, + errs: []string{`Optimizer hint syntax error at line 1 `}, }, { input: "QB_NAME(b'10')", errs: []string{ - `.*Cannot use bit-value literal.*`, - `.*Optimizer hint syntax error at line 1 .*`, + `Cannot use bit-value literal`, + `Optimizer hint syntax error at line 1 `, }, }, { input: "QB_NAME(x'1a')", errs: []string{ - `.*Cannot use hexadecimal literal.*`, - `.*Optimizer hint syntax error at line 1 .*`, + `Cannot use hexadecimal literal`, + `Optimizer hint syntax error at line 1 `, }, }, { input: "JOIN_FIXED_ORDER() BKA()", errs: []string{ - `.*Optimizer hint JOIN_FIXED_ORDER is not supported.*`, - `.*Optimizer hint BKA is not supported.*`, + `Optimizer hint JOIN_FIXED_ORDER is not supported`, + `Optimizer hint BKA is not supported`, }, }, { @@ -298,36 +296,36 @@ func (s *testHintParserSuite) TestParseHint(c *C) { }, { input: "unknown_hint()", - errs: []string{`.*Optimizer hint syntax error at line 1 .*`}, + errs: []string{`Optimizer hint syntax error at line 1 `}, }, { input: "set_var(timestamp = 1.5)", errs: []string{ - `.*Cannot use decimal number.*`, - `.*Optimizer hint syntax error at line 1 .*`, + `Cannot use decimal number`, + `Optimizer hint syntax error at line 1 `, }, }, { input: "set_var(timestamp = _utf8mb4'1234')", // Optimizer hint doesn't recognize _charset'strings'. - errs: []string{`.*Optimizer hint syntax error at line 1 .*`}, + errs: []string{`Optimizer hint syntax error at line 1 `}, }, { input: "set_var(timestamp = 9999999999999999999999999999999999999)", errs: []string{ - `.*integer value is out of range.*`, - `.*Optimizer hint syntax error at line 1 .*`, + `integer value is out of range`, + `Optimizer hint syntax error at line 1 `, }, }, { input: "time_range('2020-02-20 12:12:12',456)", errs: []string{ - `.*Optimizer hint syntax error at line 1 .*`, + `Optimizer hint syntax error at line 1 `, }, }, { input: "time_range(456,'2020-02-20 12:12:12')", errs: []string{ - `.*Optimizer hint syntax error at line 1 .*`, + `Optimizer hint syntax error at line 1 `, }, }, { @@ -346,10 +344,11 @@ func (s *testHintParserSuite) TestParseHint(c *C) { for _, tc := range testCases { output, errs := parser.ParseHint("/*+"+tc.input+"*/", tc.mode, parser.Pos{Line: 1}) - c.Assert(errs, HasLen, len(tc.errs), Commentf("input = %s,\n... errs = %q", tc.input, errs)) + require.Lenf(t, errs, len(tc.errs), "input = %s,\n... errs = %q", tc.input, errs) for i, err := range errs { - c.Assert(err, ErrorMatches, tc.errs[i], Commentf("input = %s, i = %d", tc.input, i)) + require.Errorf(t, err, "input = %s, i = %d", tc.input, i) + require.Containsf(t, err.Error(), tc.errs[i], "input = %s, i = %d", tc.input, i) } - c.Assert(output, DeepEquals, tc.output, Commentf("input = %s,\n... output = %q", tc.input, output)) + require.Equalf(t, tc.output, output, "input = %s,\n... output = %q", tc.input, output) } } diff --git a/parser/hintparserimpl.go b/parser/hintparserimpl.go index 5bd91a245092f..2faf988cdbb75 100644 --- a/parser/hintparserimpl.go +++ b/parser/hintparserimpl.go @@ -38,7 +38,7 @@ type hintScanner struct { func (hs *hintScanner) Errorf(format string, args ...interface{}) error { inner := hs.Scanner.Errorf(format, args...) - return ErrWarnOptimizerHintParseError.GenWithStackByArgs(inner) + return ErrParse.GenWithStackByArgs("Optimizer hint syntax error at", inner) } func (hs *hintScanner) Lex(lval *yyhintSymType) int { diff --git a/parser/lexer.go b/parser/lexer.go index 9a13812eb326b..94358fe51a962 100644 --- a/parser/lexer.go +++ b/parser/lexer.go @@ -40,7 +40,7 @@ type Scanner struct { r reader buf bytes.Buffer - encoding charset.Encoding + encoding *charset.Encoding errs []error warns []error @@ -137,6 +137,14 @@ func (s *Scanner) AppendError(err error) { s.errs = append(s.errs, err) } +// AppendWarn sets warning into scanner. +func (s *Scanner) AppendWarn(err error) { + if err == nil { + return + } + s.warns = append(s.warns, err) +} + func (s *Scanner) tryDecodeToUTF8String(sql string) string { utf8Lit, err := s.encoding.DecodeString(sql) if err != nil { diff --git a/parser/lexer_test.go b/parser/lexer_test.go index 275b996533aa9..676d0add40450 100644 --- a/parser/lexer_test.go +++ b/parser/lexer_test.go @@ -15,33 +15,29 @@ package parser import ( "fmt" + "testing" "unicode" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser/mysql" + requires "github.com/stretchr/testify/require" ) -var _ = Suite(&testLexerSuite{}) - -type testLexerSuite struct { -} - -func (s *testLexerSuite) TestTokenID(c *C) { +func TestTokenID(t *testing.T) { for str, tok := range tokenMap { l := NewScanner(str) var v yySymType tok1 := l.Lex(&v) - c.Check(tok, Equals, tok1) + requires.Equal(t, tok1, tok) } } -func (s *testLexerSuite) TestSingleChar(c *C) { +func TestSingleChar(t *testing.T) { table := []byte{'|', '&', '-', '+', '*', '/', '%', '^', '~', '(', ',', ')'} for _, tok := range table { l := NewScanner(string(tok)) var v yySymType tok1 := l.Lex(&v) - c.Check(int(tok), Equals, tok1) + requires.Equal(t, tok1, int(tok)) } } @@ -55,7 +51,7 @@ type testLiteralValue struct { val interface{} } -func (s *testLexerSuite) TestSingleCharOther(c *C) { +func TestSingleCharOther(t *testing.T) { table := []testCaseItem{ {"AT", identifier}, {"?", paramMarker}, @@ -63,10 +59,10 @@ func (s *testLexerSuite) TestSingleCharOther(c *C) { {"=", eq}, {".", int('.')}, } - runTest(c, table) + runTest(t, table) } -func (s *testLexerSuite) TestAtLeadingIdentifier(c *C) { +func TestAtLeadingIdentifier(t *testing.T) { table := []testCaseItem{ {"@", singleAtIdentifier}, {"@''", singleAtIdentifier}, @@ -88,25 +84,25 @@ func (s *testLexerSuite) TestAtLeadingIdentifier(c *C) { {"@@local.`test`", doubleAtIdentifier}, {"@@`test`", doubleAtIdentifier}, } - runTest(c, table) + runTest(t, table) } -func (s *testLexerSuite) TestUnderscoreCS(c *C) { +func TestUnderscoreCS(t *testing.T) { var v yySymType scanner := NewScanner(`_utf8"string"`) tok := scanner.Lex(&v) - c.Check(tok, Equals, underscoreCS) + requires.Equal(t, underscoreCS, tok) tok = scanner.Lex(&v) - c.Check(tok, Equals, stringLit) + requires.Equal(t, stringLit, tok) scanner.reset("N'string'") tok = scanner.Lex(&v) - c.Check(tok, Equals, underscoreCS) + requires.Equal(t, underscoreCS, tok) tok = scanner.Lex(&v) - c.Check(tok, Equals, stringLit) + requires.Equal(t, stringLit, tok) } -func (s *testLexerSuite) TestLiteral(c *C) { +func TestLiteral(t *testing.T) { table := []testCaseItem{ {`'''a'''`, stringLit}, {`''a''`, stringLit}, @@ -151,10 +147,10 @@ func (s *testLexerSuite) TestLiteral(c *C) { {`b'0101'`, bitLit}, {`0b0101`, bitLit}, } - runTest(c, table) + runTest(t, table) } -func (s *testLexerSuite) TestLiteralValue(c *C) { +func TestLiteralValue(t *testing.T) { table := []testLiteralValue{ {`'''a'''`, `'a'`}, {`''a''`, ``}, @@ -199,36 +195,36 @@ func (s *testLexerSuite) TestLiteralValue(c *C) { {`b'0101'`, "[5]"}, {`0b0101`, "[5]"}, } - runLiteralTest(c, table) + runLiteralTest(t, table) } -func runTest(c *C, table []testCaseItem) { +func runTest(t *testing.T, 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)) + requires.Equal(t, v.tok, tok, v.str) } } -func runLiteralTest(c *C, table []testLiteralValue) { +func runLiteralTest(t *testing.T, table []testLiteralValue) { for _, v := range table { l := NewScanner(v.str) val := l.LexLiteral() switch val.(type) { case int64: - c.Check(v.val, Equals, val, Commentf(v.str)) + requires.Equal(t, val, v.val, v.str) case float64: - c.Check(v.val, Equals, val, Commentf(v.str)) + requires.Equal(t, val, v.val, v.str) case string: - c.Check(v.val, Equals, val, Commentf(v.str)) + requires.Equal(t, val, v.val, v.str) default: - c.Check(v.val, Equals, fmt.Sprint(val), Commentf(v.str)) + requires.Equal(t, fmt.Sprint(val), v.val, v.str) } } } -func (s *testLexerSuite) TestComment(c *C) { +func TestComment(t *testing.T) { table := []testCaseItem{ {"-- select --\n1", intLit}, {"/*!40101 SET character_set_client = utf8 */;", set}, @@ -250,19 +246,19 @@ SELECT`, selectKwd}, {"/*T![unsupported] '*/0 -- ' */", intLit}, // equivalent to 0 {"/*T![auto_rand] '*/0 -- ' */", stringLit}, // equivalent to '*/0 -- ' } - runTest(c, table) + runTest(t, table) } -func (s *testLexerSuite) TestscanQuotedIdent(c *C) { +func TestScanQuotedIdent(t *testing.T) { 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") + requires.Zero(t, pos.Offset) + requires.Equal(t, quotedIdentifier, tok) + requires.Equal(t, "fk", lit) } -func (s *testLexerSuite) TestscanString(c *C) { +func TestScanString(t *testing.T) { table := []struct { raw string expect string @@ -291,13 +287,13 @@ func (s *testLexerSuite) TestscanString(c *C) { 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) + requires.Zero(t, pos.Offset) + requires.Equal(t, stringLit, tok) + requires.Equal(t, v.expect, lit) } } -func (s *testLexerSuite) TestIdentifier(c *C) { +func TestIdentifier(t *testing.T) { replacementString := string(unicode.ReplacementChar) + "xxx" table := [][2]string{ {`哈哈`, "哈哈"}, @@ -323,44 +319,44 @@ func (s *testLexerSuite) TestIdentifier(c *C) { l.reset(item[0]) var v yySymType tok := l.Lex(&v) - c.Assert(tok, Equals, identifier) - c.Assert(v.ident, Equals, item[1]) + requires.Equal(t, identifier, tok) + requires.Equal(t, item[1], v.ident) } } -func (s *testLexerSuite) TestSpecialComment(c *C) { +func TestSpecialComment(t *testing.T) { 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, 9, 9}) + requires.Equal(t, identifier, tok) + requires.Equal(t, "select", lit) + requires.Equal(t, Pos{0, 9, 9}, pos) tok, pos, lit = l.scan() - c.Assert(tok, Equals, intLit) - c.Assert(lit, Equals, "5") - c.Assert(pos, Equals, Pos{1, 1, 16}) + requires.Equal(t, intLit, tok) + requires.Equal(t, "5", lit) + requires.Equal(t, Pos{1, 1, 16}, pos) } -func (s *testLexerSuite) TestFeatureIDsComment(c *C) { +func TestFeatureIDsComment(t *testing.T) { l := NewScanner("/*T![auto_rand] auto_random(5) */") tok, pos, lit := l.scan() - c.Assert(tok, Equals, identifier) - c.Assert(lit, Equals, "auto_random") - c.Assert(pos, Equals, Pos{0, 16, 16}) + requires.Equal(t, identifier, tok) + requires.Equal(t, "auto_random", lit) + requires.Equal(t, Pos{0, 16, 16}, pos) tok, pos, _ = l.scan() - c.Assert(tok, Equals, int('(')) + requires.Equal(t, int('('), tok) _, pos, lit = l.scan() - c.Assert(lit, Equals, "5") - c.Assert(pos, Equals, Pos{0, 28, 28}) + requires.Equal(t, "5", lit) + requires.Equal(t, Pos{0, 28, 28}, pos) tok, pos, _ = l.scan() - c.Assert(tok, Equals, int(')')) + requires.Equal(t, int(')'), tok) l = NewScanner("/*T![unsupported_feature] unsupported(123) */") tok, pos, _ = l.scan() - c.Assert(tok, Equals, 0) + requires.Equal(t, 0, tok) } -func (s *testLexerSuite) TestOptimizerHint(c *C) { +func TestOptimizerHint(t *testing.T) { l := NewScanner("SELECT /*+ BKA(t1) */ 0;") tokens := []struct { tok int @@ -378,13 +374,13 @@ func (s *testLexerSuite) TestOptimizerHint(c *C) { if tok == 0 { return } - c.Assert(tok, Equals, tokens[i].tok, Commentf("%d", i)) - c.Assert(sym.ident, Equals, tokens[i].ident, Commentf("%d", i)) - c.Assert(sym.offset, Equals, tokens[i].pos, Commentf("%d", i)) + requires.Equal(t, tokens[i].tok, tok, i) + requires.Equal(t, tokens[i].ident, sym.ident, i) + requires.Equal(t, tokens[i].pos, sym.offset, i) } } -func (s *testLexerSuite) TestOptimizerHintAfterCertainKeywordOnly(c *C) { +func TestOptimizerHintAfterCertainKeywordOnly(t *testing.T) { tests := []struct { input string tokens []int @@ -456,7 +452,7 @@ func (s *testLexerSuite) TestOptimizerHintAfterCertainKeywordOnly(c *C) { var sym yySymType for i := 0; ; i++ { tok := scanner.Lex(&sym) - c.Assert(tok, Equals, tc.tokens[i], Commentf("input = [%s], i = %d", tc.input, i)) + requires.Equalf(t, tc.tokens[i], tok, "input = [%s], i = %d", tc.input, i) if tok == 0 { break } @@ -464,7 +460,7 @@ func (s *testLexerSuite) TestOptimizerHintAfterCertainKeywordOnly(c *C) { } } -func (s *testLexerSuite) TestInt(c *C) { +func TestInt(t *testing.T) { tests := []struct { input string expect uint64 @@ -477,23 +473,23 @@ func (s *testLexerSuite) TestInt(c *C) { {"10", 10}, } scanner := NewScanner("") - for _, t := range tests { + for _, test := range tests { var v yySymType - scanner.reset(t.input) + scanner.reset(test.input) tok := scanner.Lex(&v) - c.Assert(tok, Equals, intLit) + requires.Equal(t, intLit, tok) switch i := v.item.(type) { case int64: - c.Assert(uint64(i), Equals, t.expect) + requires.Equal(t, test.expect, uint64(i)) case uint64: - c.Assert(i, Equals, t.expect) + requires.Equal(t, test.expect, i) default: - c.Fail() + t.Fail() } } } -func (s *testLexerSuite) TestSQLModeANSIQuotes(c *C) { +func TestSQLModeANSIQuotes(t *testing.T) { tests := []struct { input string tok int @@ -508,24 +504,24 @@ func (s *testLexerSuite) TestSQLModeANSIQuotes(c *C) { } scanner := NewScanner("") scanner.SetSQLMode(mysql.ModeANSIQuotes) - for _, t := range tests { + for _, test := range tests { var v yySymType - scanner.reset(t.input) + scanner.reset(test.input) tok := scanner.Lex(&v) - c.Assert(tok, Equals, t.tok) - c.Assert(v.ident, Equals, t.ident) + requires.Equal(t, test.tok, tok) + requires.Equal(t, test.ident, v.ident) } scanner.reset(`'string' 'string'`) var v yySymType tok := scanner.Lex(&v) - c.Assert(tok, Equals, stringLit) - c.Assert(v.ident, Equals, "string") + requires.Equal(t, stringLit, tok) + requires.Equal(t, "string", v.ident) tok = scanner.Lex(&v) - c.Assert(tok, Equals, stringLit) - c.Assert(v.ident, Equals, "string") + requires.Equal(t, stringLit, tok) + requires.Equal(t, "string", v.ident) } -func (s *testLexerSuite) TestIllegal(c *C) { +func TestIllegal(t *testing.T) { table := []testCaseItem{ {"'", invalid}, {"'fu", invalid}, @@ -540,10 +536,10 @@ func (s *testLexerSuite) TestIllegal(c *C) { {"@@`", invalid}, {"@@global.`", invalid}, } - runTest(c, table) + runTest(t, table) } -func (s *testLexerSuite) TestVersionDigits(c *C) { +func TestVersionDigits(t *testing.T) { tests := []struct { input string min int @@ -613,16 +609,15 @@ func (s *testLexerSuite) TestVersionDigits(c *C) { } scanner := NewScanner("") - for _, t := range tests { - comment := Commentf("input = %s", t.input) - scanner.reset(t.input) - scanner.scanVersionDigits(t.min, t.max) + for _, test := range tests { + scanner.reset(test.input) + scanner.scanVersionDigits(test.min, test.max) nextChar := scanner.r.readByte() - c.Assert(nextChar, Equals, t.nextChar, comment) + requires.Equalf(t, test.nextChar, nextChar, "input = %s", test.input) } } -func (s *testLexerSuite) TestFeatureIDs(c *C) { +func TestFeatureIDs(t *testing.T) { tests := []struct { input string featureIDs []string @@ -685,12 +680,11 @@ func (s *testLexerSuite) TestFeatureIDs(c *C) { }, } scanner := NewScanner("") - for _, t := range tests { - comment := Commentf("input = %s", t.input) - scanner.reset(t.input) + for _, test := range tests { + scanner.reset(test.input) featureIDs := scanner.scanFeatureIDs() - c.Assert(featureIDs, DeepEquals, t.featureIDs, comment) + requires.Equalf(t, test.featureIDs, featureIDs, "input = %s", test.input) nextChar := scanner.r.readByte() - c.Assert(nextChar, Equals, t.nextChar, comment) + requires.Equalf(t, test.nextChar, nextChar, "input = %s", test.input) } } diff --git a/parser/export_test.go b/parser/main_test.go similarity index 74% rename from parser/export_test.go rename to parser/main_test.go index c85c354803a74..edde620bc825c 100644 --- a/parser/export_test.go +++ b/parser/main_test.go @@ -1,4 +1,4 @@ -// Copyright 2019 PingCAP, Inc. +// Copyright 2021 PingCAP, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -8,10 +8,21 @@ // // 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. package parser +import ( + "testing" + + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + goleak.VerifyTestMain(m) +} + // WindowFuncTokenMapForTest exports windowFuncTokenMap in test-case var WindowFuncTokenMapForTest = windowFuncTokenMap diff --git a/parser/misc.go b/parser/misc.go index e1546128de2b7..da53103794e0b 100644 --- a/parser/misc.go +++ b/parser/misc.go @@ -157,6 +157,10 @@ var tokenMap = map[string]int{ "ASC": asc, "ASCII": ascii, "ATTRIBUTES": attributes, + "STATS_OPTIONS": statsOptions, + "STATS_SAMPLE_RATE": statsSampleRate, + "STATS_COL_CHOICE": statsColChoice, + "STATS_COL_LIST": statsColList, "AUTO_ID_CACHE": autoIdCache, "AUTO_INCREMENT": autoIncrement, "AUTO_RANDOM": autoRandom, @@ -602,6 +606,7 @@ var tokenMap = map[string]int{ "RUNNING": running, "S3": s3, "SAMPLES": samples, + "SAMPLERATE": sampleRate, "SAN": san, "SCHEDULE": schedule, "SCHEMA": database, @@ -665,6 +670,7 @@ var tokenMap = map[string]int{ "STATS_HISTOGRAMS": statsHistograms, "STATS_TOPN": statsTopN, "STATS_META": statsMeta, + "HISTOGRAMS_IN_FLIGHT": histogramsInFlight, "STATS_PERSISTENT": statsPersistent, "STATS_SAMPLE_PAGES": statsSamplePages, "STATS": stats, @@ -692,6 +698,7 @@ var tokenMap = map[string]int{ "SWITCHES": switchesSym, "SYSTEM": system, "SYSTEM_TIME": systemTime, + "TARGET": target, "TABLE_CHECKSUM": tableChecksum, "TABLE": tableKwd, "TABLES": tables, diff --git a/parser/model/ddl.go b/parser/model/ddl.go index 2c58f3c99500c..57ecac4585783 100644 --- a/parser/model/ddl.go +++ b/parser/model/ddl.go @@ -76,7 +76,11 @@ const ( ActionAddCheckConstraint ActionType = 43 ActionDropCheckConstraint ActionType = 44 ActionAlterCheckConstraint ActionType = 45 - ActionAlterTableAlterPartition ActionType = 46 + + // `ActionAlterTableAlterPartition` is removed and will never be used. + // Just left a tombstone here for compatibility. + __DEPRECATED_ActionAlterTableAlterPartition ActionType = 46 + ActionRenameTables ActionType = 47 ActionDropIndexes ActionType = 48 ActionAlterTableAttributes ActionType = 49 @@ -84,9 +88,13 @@ const ( ActionCreatePlacementPolicy ActionType = 51 ActionAlterPlacementPolicy ActionType = 52 ActionDropPlacementPolicy ActionType = 53 - ActionAlterTablePartitionPolicy ActionType = 54 + ActionAlterTablePartitionPlacement ActionType = 54 ActionModifySchemaDefaultPlacement ActionType = 55 - ActionCreateTables ActionType = 56 + ActionAlterTablePlacement ActionType = 56 + ActionAlterCacheTable ActionType = 57 + ActionAlterTableStatsOptions ActionType = 58 + ActionAlterNoCacheTable ActionType = 59 + ActionCreateTables ActionType = 60 ) var actionMap = map[ActionType]string{ @@ -105,6 +113,7 @@ var actionMap = map[ActionType]string{ ActionModifyColumn: "modify column", ActionRebaseAutoID: "rebase auto_increment ID", ActionRenameTable: "rename table", + ActionRenameTables: "rename tables", ActionSetDefaultValue: "set default value", ActionShardRowID: "shard row ID", ActionModifyTableComment: "modify table comment", @@ -136,14 +145,22 @@ var actionMap = map[ActionType]string{ ActionAddCheckConstraint: "add check constraint", ActionDropCheckConstraint: "drop check constraint", ActionAlterCheckConstraint: "alter check constraint", - ActionAlterTableAlterPartition: "alter partition", ActionDropIndexes: "drop multi-indexes", ActionAlterTableAttributes: "alter table attributes", + ActionAlterTablePartitionPlacement: "alter table partition placement", ActionAlterTablePartitionAttributes: "alter table partition attributes", ActionCreatePlacementPolicy: "create placement policy", ActionAlterPlacementPolicy: "alter placement policy", ActionDropPlacementPolicy: "drop placement policy", ActionModifySchemaDefaultPlacement: "modify schema default placement", + ActionAlterTablePlacement: "alter table placement", + ActionAlterCacheTable: "alter table cache", + ActionAlterNoCacheTable: "alter table nocache", + ActionAlterTableStatsOptions: "alter table statistics options", + + // `ActionAlterTableAlterPartition` is removed and will never be used. + // Just left a tombstone here for compatibility. + __DEPRECATED_ActionAlterTableAlterPartition: "alter partition", } // String return current ddl action in string @@ -207,6 +224,7 @@ type DDLReorgMeta struct { SQLMode mysql.SQLMode `json:"sql_mode"` Warnings map[errors.ErrorID]*terror.Error `json:"warnings"` WarningsCount map[errors.ErrorID]int64 `json:"warnings_count"` + Location *time.Location `json:"time_location"` } // NewDDLReorgMeta new a DDLReorgMeta. diff --git a/parser/model/model.go b/parser/model/model.go index 68c9e66167a9b..c08ea8b8b309c 100644 --- a/parser/model/model.go +++ b/parser/model/model.go @@ -22,6 +22,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/parser/auth" + "github.com/pingcap/tidb/parser/charset" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/types" ) @@ -337,10 +338,33 @@ type TableInfo struct { // It's true when the engine of the table is TiFlash only. IsColumnar bool `json:"is_columnar"` - TempTableType `json:"temp_table_type"` + TempTableType `json:"temp_table_type"` + TableCacheStatusType `json:"cache_table_status"` + PlacementPolicyRef *PolicyRefInfo `json:"policy_ref_info"` + DirectPlacementOpts *PlacementSettings `json:"placement_settings"` - PlacementPolicyRef *PolicyRefInfo `json:"policy_ref_info"` - DirectPlacementOpts *PlacementSettings `json:"placement_settings"` + // StatsOptions is used when do analyze/auto-analyze for each table + StatsOptions *StatsOptions `json:"stats_options"` +} +type TableCacheStatusType int + +const ( + TableCacheStatusDisable TableCacheStatusType = iota + TableCacheStatusEnable + TableCacheStatusSwitching +) + +func (t TableCacheStatusType) String() string { + switch t { + case TableCacheStatusDisable: + return "disable" + case TableCacheStatusEnable: + return "enable" + case TableCacheStatusSwitching: + return "switching" + default: + return "" + } } type TempTableType byte @@ -605,6 +629,7 @@ func NewExtraHandleColInfo() *ColumnInfo { colInfo.Flag = mysql.PriKeyFlag | mysql.NotNullFlag colInfo.Tp = mysql.TypeLonglong colInfo.Flen, colInfo.Decimal = mysql.GetDefaultFieldLengthAndDecimal(mysql.TypeLonglong) + colInfo.Charset, colInfo.Collate = charset.CharsetBin, charset.CollationBin return colInfo } @@ -631,6 +656,11 @@ func (t *TableInfo) ColumnIsInIndex(c *ColumnInfo) bool { return false } +// HasClusteredIndex checks whether the table has a clustered index. +func (t *TableInfo) HasClusteredIndex() bool { + return t.PKIsHandle || t.IsCommonHandle +} + // IsView checks if TableInfo is a view. func (t *TableInfo) IsView() bool { return t.View != nil @@ -808,6 +838,17 @@ func (pi *PartitionInfo) GetNameByID(id int64) string { return "" } +// GetPlacementByID gets the partition placement by ID. +func (pi *PartitionInfo) GetPlacementByID(id int64) (*PolicyRefInfo, *PlacementSettings) { + definitions := pi.Definitions + for i := range definitions { + if id == definitions[i].ID { + return definitions[i].PlacementPolicyRef, definitions[i].DirectPlacementOpts + } + } + return nil, nil +} + func (pi *PartitionInfo) GetStateByID(id int64) SchemaState { for _, pstate := range pi.States { if pstate.ID == id { @@ -1199,3 +1240,81 @@ func (p *PlacementSettings) String() string { return sb.String() } + +type StatsOptions struct { + *StatsWindowSettings + AutoRecalc bool `json:"auto_recalc"` + ColumnChoice ColumnChoice `json:"column_choice"` + ColumnList []CIStr `json:"column_list"` + SampleNum uint64 `json:"sample_num"` + SampleRate float64 `json:"sample_rate"` + Buckets uint64 `json:"buckets"` + TopN uint64 `json:"topn"` + Concurrency uint `json:"concurrency"` +} + +func NewStatsOptions() *StatsOptions { + return &StatsOptions{ + AutoRecalc: true, + ColumnChoice: DefaultChoice, + ColumnList: []CIStr{}, + SampleNum: uint64(0), + SampleRate: 0.0, + Buckets: uint64(0), + TopN: uint64(0), + Concurrency: uint(0), + } +} + +type ColumnChoice byte + +const ( + DefaultChoice ColumnChoice = iota + AllColumns + PredicateColumns + ColumnList +) + +func (s ColumnChoice) String() string { + switch s { + case AllColumns: + return "AllColumns" + case PredicateColumns: + return "PredicateColumns" + case ColumnList: + return "ColumnList" + default: + return "" + } +} + +type StatsWindowSettings struct { + WindowStart time.Time `json:"window_start"` + WindowEnd time.Time `json:"window_end"` + RepeatType WindowRepeatType `json:"repeat_type"` + RepeatInterval uint `json:"repeat_interval"` +} + +type WindowRepeatType byte + +const ( + Never WindowRepeatType = iota + Day + Week + Month +) + +func (s WindowRepeatType) String() string { + switch s { + case Never: + return "Never" + case Day: + return "Day" + case Week: + return "Week" + case Month: + return "Month" + default: + return "" + } +} diff --git a/parser/model/model_test.go b/parser/model/model_test.go index dc3b76fab2c9d..508eaa2713858 100644 --- a/parser/model/model_test.go +++ b/parser/model/model_test.go @@ -19,30 +19,20 @@ import ( "testing" "time" - . "github.com/pingcap/check" + "github.com/pingcap/tidb/parser/charset" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/types" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) 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") + require.Equal(t, "aBC", abc.O) + require.Equal(t, "abc", abc.L) + require.Equal(t, "aBC", abc.String()) } -func (*testModelSuite) TestModelBasic(c *C) { +func TestModelBasic(t *testing.T) { column := &ColumnInfo{ ID: 1, Name: NewCIStr("c"), @@ -103,60 +93,60 @@ func (*testModelSuite) TestModelBasic(c *C) { } n := dbInfo.Clone() - c.Assert(n, DeepEquals, dbInfo) + require.Equal(t, dbInfo, n) pkName := table.GetPkName() - c.Assert(pkName, Equals, NewCIStr("c")) + require.Equal(t, NewCIStr("c"), pkName) newColumn := table.GetPkColInfo() - c.Assert(newColumn.Hidden, Equals, true) - c.Assert(newColumn, DeepEquals, column) + require.Equal(t, true, newColumn.Hidden) + require.Equal(t, column, newColumn) inIdx := table.ColumnIsInIndex(column) - c.Assert(inIdx, Equals, true) + require.Equal(t, true, inIdx) tp := IndexTypeBtree - c.Assert(tp.String(), Equals, "BTREE") + require.Equal(t, "BTREE", tp.String()) tp = IndexTypeHash - c.Assert(tp.String(), Equals, "HASH") + require.Equal(t, "HASH", tp.String()) tp = 1e5 - c.Assert(tp.String(), Equals, "") + require.Equal(t, "", tp.String()) has := index.HasPrefixIndex() - c.Assert(has, Equals, true) - t := table.GetUpdateTime() - c.Assert(t, Equals, TSConvert2Time(table.UpdateTS)) - c.Assert(table2.IsSequence(), IsTrue) - c.Assert(table2.IsBaseTable(), IsFalse) + require.Equal(t, true, has) + require.Equal(t, TSConvert2Time(table.UpdateTS), table.GetUpdateTime()) + require.True(t, table2.IsSequence()) + require.False(t, table2.IsBaseTable()) // Corner cases column.Flag ^= mysql.PriKeyFlag pkName = table.GetPkName() - c.Assert(pkName, Equals, NewCIStr("")) + require.Equal(t, NewCIStr(""), pkName) newColumn = table.GetPkColInfo() - c.Assert(newColumn, IsNil) + require.Nil(t, newColumn) anCol := &ColumnInfo{ Name: NewCIStr("d"), } exIdx := table.ColumnIsInIndex(anCol) - c.Assert(exIdx, Equals, false) + require.Equal(t, false, exIdx) anIndex := &IndexInfo{ Columns: []*IndexColumn{}, } no := anIndex.HasPrefixIndex() - c.Assert(no, Equals, false) + require.Equal(t, false, no) extraPK := NewExtraHandleColInfo() - c.Assert(extraPK.Flag, Equals, uint(mysql.NotNullFlag|mysql.PriKeyFlag)) + require.Equal(t, mysql.NotNullFlag|mysql.PriKeyFlag, extraPK.Flag) + require.Equal(t, charset.CharsetBin, extraPK.Charset) + require.Equal(t, charset.CollationBin, extraPK.Collate) } -func (*testModelSuite) TestJobStartTime(c *C) { +func TestJobStartTime(t *testing.T) { job := &Job{ ID: 123, BinlogInfo: &HistoryInfo{}, } - t := time.Unix(0, 0) - c.Assert(t, Equals, TSConvert2Time(job.StartTS)) - c.Assert(job.String(), Equals, fmt.Sprintf("ID:123, Type:none, State:none, SchemaState:queueing, SchemaID:0, TableID:0, RowCount:0, ArgLen:0, start time: %s, Err:<nil>, ErrCount:0, SnapshotVersion:0", t)) + require.Equal(t, TSConvert2Time(job.StartTS), time.Unix(0, 0)) + require.Equal(t, fmt.Sprintf("ID:123, Type:none, State:none, SchemaState:queueing, SchemaID:0, TableID:0, RowCount:0, ArgLen:0, start time: %s, Err:<nil>, ErrCount:0, SnapshotVersion:0", time.Unix(0, 0)), job.String()) } -func (*testModelSuite) TestJobCodec(c *C) { +func TestJobCodec(t *testing.T) { type A struct { Name string } @@ -183,10 +173,10 @@ func (*testModelSuite) TestJobCodec(c *C) { Args: []interface{}{int64(3), NewCIStr("new_table_name")}, } job1.RawArgs, err = json.Marshal(job1.Args) - c.Assert(err, IsNil) + require.NoError(t, err) isDependent, err := job.IsDependentOn(job1) - c.Assert(err, IsNil) - c.Assert(isDependent, IsTrue) + require.NoError(t, err) + require.True(t, isDependent) // job1: rename table, old schema ID is 3 // job2: create schema, schema ID is 3 job2 := &Job{ @@ -197,62 +187,62 @@ func (*testModelSuite) TestJobCodec(c *C) { BinlogInfo: &HistoryInfo{}, } isDependent, err = job2.IsDependentOn(job1) - c.Assert(err, IsNil) - c.Assert(isDependent, IsTrue) + require.NoError(t, err) + require.True(t, isDependent) - c.Assert(job.IsCancelled(), Equals, false) + require.Equal(t, false, job.IsCancelled()) b, err := job.Encode(false) - c.Assert(err, IsNil) + require.NoError(t, err) newJob := &Job{} err = newJob.Decode(b) - c.Assert(err, IsNil) - c.Assert(newJob.BinlogInfo, DeepEquals, job.BinlogInfo) + require.NoError(t, err) + require.Equal(t, job.BinlogInfo, newJob.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) + require.NoError(t, err) + require.Equal(t, NewCIStr(""), name) + require.Equal(t, A{Name: ""}, a) + require.Greater(t, len(newJob.String()), 0) job.BinlogInfo.Clean() b1, err := job.Encode(true) - c.Assert(err, IsNil) + require.NoError(t, err) newJob = &Job{} err = newJob.Decode(b1) - c.Assert(err, IsNil) - c.Assert(newJob.BinlogInfo, DeepEquals, &HistoryInfo{}) + require.NoError(t, err) + require.Equal(t, &HistoryInfo{}, newJob.BinlogInfo) 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) + require.NoError(t, err) + require.Equal(t, NewCIStr("a"), name) + require.Equal(t, A{Name: "abc"}, a) + require.Greater(t, len(newJob.String()), 0) b2, err := job.Encode(true) - c.Assert(err, IsNil) + require.NoError(t, err) newJob = &Job{} err = newJob.Decode(b2) - c.Assert(err, IsNil) + require.NoError(t, err) 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) + require.NoError(t, err) + require.Equal(t, NewCIStr("a"), name) + require.Greater(t, len(newJob.String()), 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) + require.True(t, job.IsDone()) + require.True(t, job.IsFinished()) + require.False(t, job.IsRunning()) + require.False(t, job.IsSynced()) + require.False(t, job.IsRollbackDone()) job.SetRowCount(3) - c.Assert(job.GetRowCount(), Equals, int64(3)) + require.Equal(t, int64(3), job.GetRowCount()) } -func (testModelSuite) TestState(c *C) { +func TestState(t *testing.T) { schemaTbl := []SchemaState{ StateDeleteOnly, StateWriteOnly, @@ -263,7 +253,7 @@ func (testModelSuite) TestState(c *C) { } for _, state := range schemaTbl { - c.Assert(len(state.String()), Greater, 0) + require.Greater(t, len(state.String()), 0) } jobTbl := []JobState{ @@ -276,11 +266,11 @@ func (testModelSuite) TestState(c *C) { } for _, state := range jobTbl { - c.Assert(len(state.String()), Greater, 0) + require.Greater(t, len(state.String()), 0) } } -func (testModelSuite) TestString(c *C) { +func TestString(t *testing.T) { acts := []struct { act ActionType result string @@ -291,6 +281,7 @@ func (testModelSuite) TestString(c *C) { {ActionTruncateTable, "truncate table"}, {ActionModifyColumn, "modify column"}, {ActionRenameTable, "rename table"}, + {ActionRenameTables, "rename tables"}, {ActionSetDefaultValue, "set default value"}, {ActionCreateSchema, "create schema"}, {ActionDropSchema, "drop schema"}, @@ -304,34 +295,37 @@ func (testModelSuite) TestString(c *C) { {ActionDropColumns, "drop multi-columns"}, {ActionModifySchemaCharsetAndCollate, "modify schema charset and collate"}, {ActionDropIndexes, "drop multi-indexes"}, + {ActionAlterTablePlacement, "alter table placement"}, + {ActionAlterTablePartitionPlacement, "alter table partition placement"}, + {ActionAlterNoCacheTable, "alter table nocache"}, } for _, v := range acts { str := v.act.String() - c.Assert(str, Equals, v.result) + require.Equal(t, v.result, str) } } -func (testModelSuite) TestUnmarshalCIStr(c *C) { +func TestUnmarshalCIStr(t *testing.T) { 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") + require.NoError(t, err) + require.NoError(t, ci.UnmarshalJSON(buf)) + require.Equal(t, str, ci.O) + require.Equal(t, "aabb", ci.L) buf, err = json.Marshal(ci) - c.Assert(err, IsNil) - c.Assert(string(buf), Equals, `{"O":"aaBB","L":"aabb"}`) - ci.UnmarshalJSON(buf) - c.Assert(ci.O, Equals, str) - c.Assert(ci.L, Equals, "aabb") + require.NoError(t, err) + require.Equal(t, `{"O":"aaBB","L":"aabb"}`, string(buf)) + require.NoError(t, ci.UnmarshalJSON(buf)) + require.Equal(t, str, ci.O) + require.Equal(t, "aabb", ci.L) } -func (testModelSuite) TestDefaultValue(c *C) { +func TestDefaultValue(t *testing.T) { srcCol := &ColumnInfo{ ID: 1, } @@ -347,11 +341,11 @@ func (testModelSuite) TestDefaultValue(c *C) { newPlainCol.Name = NewCIStr("newPlainCol") newPlainCol.FieldType = *types.NewFieldType(mysql.TypeLong) err := newPlainCol.SetDefaultValue(1) - c.Assert(err, IsNil) - c.Assert(newPlainCol.GetDefaultValue(), Equals, 1) + require.NoError(t, err) + require.Equal(t, 1, newPlainCol.GetDefaultValue()) err = newPlainCol.SetDefaultValue(randPlainStr) - c.Assert(err, IsNil) - c.Assert(newPlainCol.GetDefaultValue(), Equals, randPlainStr) + require.NoError(t, err) + require.Equal(t, randPlainStr, newPlainCol.GetDefaultValue()) randBitStr := string([]byte{25, 185}) @@ -366,18 +360,19 @@ func (testModelSuite) TestDefaultValue(c *C) { newBitCol.FieldType = *types.NewFieldType(mysql.TypeBit) err = newBitCol.SetDefaultValue(1) // Only string type is allowed in BIT column. - c.Assert(err, ErrorMatches, ".*Invalid default value.*") - c.Assert(newBitCol.GetDefaultValue(), Equals, 1) + require.Error(t, err) + require.Contains(t, err.Error(), "Invalid default value") + require.Equal(t, 1, newBitCol.GetDefaultValue()) err = newBitCol.SetDefaultValue(randBitStr) - c.Assert(err, IsNil) - c.Assert(newBitCol.GetDefaultValue(), Equals, randBitStr) + require.NoError(t, err) + require.Equal(t, randBitStr, newBitCol.GetDefaultValue()) nullBitCol := srcCol.Clone() nullBitCol.Name = NewCIStr("nullBitCol") nullBitCol.FieldType = *types.NewFieldType(mysql.TypeBit) err = nullBitCol.SetOriginDefaultValue(nil) - c.Assert(err, IsNil) - c.Assert(nullBitCol.GetOriginDefaultValue(), IsNil) + require.NoError(t, err) + require.Nil(t, nullBitCol.GetOriginDefaultValue()) testCases := []struct { col *ColumnInfo @@ -391,36 +386,34 @@ func (testModelSuite) TestDefaultValue(c *C) { } for _, tc := range testCases { col, isConsistent := tc.col, tc.isConsistent - cmt := Commentf("%s assertion failed", col.Name.O) + comment := fmt.Sprintf("%s assertion failed", col.Name.O) bytes, err := json.Marshal(col) - c.Assert(err, IsNil, cmt) + require.NoError(t, err, comment) var newCol ColumnInfo err = json.Unmarshal(bytes, &newCol) - c.Assert(err, IsNil, cmt) + require.NoError(t, err, comment) if isConsistent { - c.Assert(col.GetDefaultValue(), Equals, newCol.GetDefaultValue()) - c.Assert(col.GetOriginDefaultValue(), Equals, newCol.GetOriginDefaultValue()) + require.Equal(t, newCol.GetDefaultValue(), col.GetDefaultValue()) + require.Equal(t, newCol.GetOriginDefaultValue(), col.GetOriginDefaultValue()) } else { - c.Assert(col.DefaultValue == newCol.DefaultValue, IsFalse, cmt) - c.Assert(col.OriginDefaultValue == newCol.OriginDefaultValue, IsFalse, cmt) + require.False(t, col.DefaultValue == newCol.DefaultValue, comment) + require.False(t, col.DefaultValue == newCol.DefaultValue, comment) } } } func TestPlacementSettingsString(t *testing.T) { - assert := assert.New(t) - settings := &PlacementSettings{ PrimaryRegion: "us-east-1", Regions: "us-east-1,us-east-2", Schedule: "EVEN", } - assert.Equal("PRIMARY_REGION=\"us-east-1\" REGIONS=\"us-east-1,us-east-2\" SCHEDULE=\"EVEN\"", settings.String()) + require.Equal(t, "PRIMARY_REGION=\"us-east-1\" REGIONS=\"us-east-1,us-east-2\" SCHEDULE=\"EVEN\"", settings.String()) settings = &PlacementSettings{ LeaderConstraints: "[+region=bj]", } - assert.Equal("LEADER_CONSTRAINTS=\"[+region=bj]\"", settings.String()) + require.Equal(t, "LEADER_CONSTRAINTS=\"[+region=bj]\"", settings.String()) settings = &PlacementSettings{ Voters: 1, @@ -430,7 +423,7 @@ func TestPlacementSettingsString(t *testing.T) { Learners: 3, LearnerConstraints: "[+region=us-east-2]", } - assert.Equal("VOTERS=1 VOTER_CONSTRAINTS=\"[+region=us-east-1]\" FOLLOWERS=2 FOLLOWER_CONSTRAINTS=\"[+disk=ssd]\" LEARNERS=3 LEARNER_CONSTRAINTS=\"[+region=us-east-2]\"", settings.String()) + require.Equal(t, "VOTERS=1 VOTER_CONSTRAINTS=\"[+region=us-east-1]\" FOLLOWERS=2 FOLLOWER_CONSTRAINTS=\"[+disk=ssd]\" LEARNERS=3 LEARNER_CONSTRAINTS=\"[+region=us-east-2]\"", settings.String()) settings = &PlacementSettings{ Voters: 3, @@ -438,5 +431,5 @@ func TestPlacementSettingsString(t *testing.T) { Learners: 1, Constraints: "{+us-east-1:1,+us-east-2:1}", } - assert.Equal("CONSTRAINTS=\"{+us-east-1:1,+us-east-2:1}\" VOTERS=3 FOLLOWERS=2 LEARNERS=1", settings.String()) + require.Equal(t, "CONSTRAINTS=\"{+us-east-1:1,+us-east-2:1}\" VOTERS=3 FOLLOWERS=2 LEARNERS=1", settings.String()) } diff --git a/parser/mysql/const.go b/parser/mysql/const.go index 23fdae95e7032..81be68bf788f6 100644 --- a/parser/mysql/const.go +++ b/parser/mysql/const.go @@ -589,7 +589,9 @@ func (n *PriorityEnum) Restore(ctx *format.RestoreCtx) error { return nil } -// PrimaryKeyName defines primary key name. const ( + // PrimaryKeyName defines primary key name. PrimaryKeyName = "PRIMARY" + // DefaultDecimal defines the default decimal value when the value out of range. + DefaultDecimal = "99999999999999999999999999999999999999999999999999999999999999999" ) diff --git a/parser/mysql/const_test.go b/parser/mysql/const_test.go index 93afba3a9e19a..3290e58ab11e5 100644 --- a/parser/mysql/const_test.go +++ b/parser/mysql/const_test.go @@ -16,18 +16,10 @@ package mysql import ( "testing" - . "github.com/pingcap/check" + "github.com/stretchr/testify/require" ) -var _ = Suite(&testConstSuite{}) - -type testConstSuite struct{} - -func TestT(t *testing.T) { - TestingT(t) -} - -func (s *testConstSuite) TestSQLMode(c *C) { +func TestSQLMode(t *testing.T) { // ref https://dev.mysql.com/doc/internals/en/query-event.html#q-sql-mode-code, hardCode := []struct { code SQLMode @@ -99,6 +91,6 @@ func (s *testConstSuite) TestSQLMode(c *C) { }} for _, ca := range hardCode { - c.Assert(int(ca.code), Equals, ca.value) + require.Equal(t, ca.value, int(ca.code)) } } diff --git a/parser/mysql/errname.go b/parser/mysql/errname.go index 5e7f9ae2cbbf3..857557b7a59ba 100644 --- a/parser/mysql/errname.go +++ b/parser/mysql/errname.go @@ -724,7 +724,7 @@ var MySQLErrName = map[uint16]*ErrMessage{ ErrFailedReadFromParFile: Message("Failed to read from the .par file", nil), ErrValuesIsNotIntType: Message("VALUES value for partition '%-.64s' must have type INT", nil), ErrAccessDeniedNoPassword: Message("Access denied for user '%-.48s'@'%-.64s'", nil), - ErrSetPasswordAuthPlugin: Message("SET PASSWORD has no significance for users authenticating via plugins", nil), + ErrSetPasswordAuthPlugin: Message("SET PASSWORD has no significance for user '%-.48s'@'%-.255s' as authentication plugin does not support it.", nil), ErrGrantPluginUserExists: Message("GRANT with IDENTIFIED WITH is illegal because the user %-.*s already exists", nil), ErrTruncateIllegalFk: Message("Cannot truncate a table referenced in a foreign key constraint (%.192s)", nil), ErrPluginIsPermanent: Message("Plugin '%s' is forcePlusPermanent and can not be unloaded", nil), diff --git a/parser/mysql/error_test.go b/parser/mysql/error_test.go index ea5cfc39661c7..846839001ddcd 100644 --- a/parser/mysql/error_test.go +++ b/parser/mysql/error_test.go @@ -14,24 +14,21 @@ package mysql import ( - . "github.com/pingcap/check" -) - -var _ = Suite(&testSQLErrorSuite{}) + "testing" -type testSQLErrorSuite struct { -} + "github.com/stretchr/testify/require" +) -func (s *testSQLErrorSuite) TestSQLError(c *C) { +func TestSQLError(t *testing.T) { e := NewErrf(ErrNoDB, "no db error", nil) - c.Assert(len(e.Error()), Greater, 0) + require.Greater(t, len(e.Error()), 0) e = NewErrf(0, "customized error", nil) - c.Assert(len(e.Error()), Greater, 0) + require.Greater(t, len(e.Error()), 0) e = NewErr(ErrNoDB) - c.Assert(len(e.Error()), Greater, 0) + require.Greater(t, len(e.Error()), 0) e = NewErr(0, "customized error", nil) - c.Assert(len(e.Error()), Greater, 0) + require.Greater(t, len(e.Error()), 0) } diff --git a/parser/mysql/privs.go b/parser/mysql/privs.go index 7ed874f1017b8..93e5db579ad1e 100644 --- a/parser/mysql/privs.go +++ b/parser/mysql/privs.go @@ -255,7 +255,7 @@ const ( CreateRolePriv // DropRolePriv is the privilege to drop a role. DropRolePriv - + // CreateTMPTablePriv is the privilege to create a temporary table. CreateTMPTablePriv LockTablesPriv CreateRoutinePriv diff --git a/parser/mysql/privs_test.go b/parser/mysql/privs_test.go index b57e18c2ff01c..03d4352569b43 100644 --- a/parser/mysql/privs_test.go +++ b/parser/mysql/privs_test.go @@ -14,83 +14,81 @@ package mysql import ( - . "github.com/pingcap/check" -) - -var _ = Suite(&testPrivsSuite{}) + "testing" -type testPrivsSuite struct{} + "github.com/stretchr/testify/require" +) -func (s *testPrivsSuite) TestPrivString(c *C) { +func TestPrivString(t *testing.T) { for i := 0; ; i++ { p := PrivilegeType(1 << i) if p > AllPriv { break } - c.Assert(p.String(), Not(Equals), "", Commentf("%d-th", i)) + require.NotEqualf(t, "", p.String(), "%d-th", i) } } -func (s *testPrivsSuite) TestPrivColumn(c *C) { +func TestPrivColumn(t *testing.T) { for _, p := range AllGlobalPrivs { - c.Assert(p.ColumnString(), Not(Equals), "", Commentf("%s", p)) + require.NotEmptyf(t, p.ColumnString(), "%s", p) np, ok := NewPrivFromColumn(p.ColumnString()) - c.Assert(ok, IsTrue, Commentf("%s", p)) - c.Assert(np, Equals, p) + require.Truef(t, ok, "%s", p) + require.Equal(t, p, np) } for _, p := range StaticGlobalOnlyPrivs { - c.Assert(p.ColumnString(), Not(Equals), "", Commentf("%s", p)) + require.NotEmptyf(t, p.ColumnString(), "%s", p) np, ok := NewPrivFromColumn(p.ColumnString()) - c.Assert(ok, IsTrue, Commentf("%s", p)) - c.Assert(np, Equals, p) + require.Truef(t, ok, "%s", p) + require.Equal(t, p, np) } for _, p := range AllDBPrivs { - c.Assert(p.ColumnString(), Not(Equals), "", Commentf("%s", p)) + require.NotEmptyf(t, p.ColumnString(), "%s", p) np, ok := NewPrivFromColumn(p.ColumnString()) - c.Assert(ok, IsTrue, Commentf("%s", p)) - c.Assert(np, Equals, p) + require.Truef(t, ok, "%s", p) + require.Equal(t, p, np) } } -func (s *testPrivsSuite) TestPrivSetString(c *C) { +func TestPrivSetString(t *testing.T) { for _, p := range AllTablePrivs { - c.Assert(p.SetString(), Not(Equals), "", Commentf("%s", p)) + require.NotEmptyf(t, p.SetString(), "%s", p) np, ok := NewPrivFromSetEnum(p.SetString()) - c.Assert(ok, IsTrue, Commentf("%s", p)) - c.Assert(np, Equals, p) + require.Truef(t, ok, "%s", p) + require.Equal(t, p, np) } for _, p := range AllColumnPrivs { - c.Assert(p.SetString(), Not(Equals), "", Commentf("%s", p)) + require.NotEmptyf(t, p.SetString(), "%s", p) np, ok := NewPrivFromSetEnum(p.SetString()) - c.Assert(ok, IsTrue, Commentf("%s", p)) - c.Assert(np, Equals, p) + require.Truef(t, ok, "%s", p) + require.Equal(t, p, np) } } -func (s *testPrivsSuite) TestPrivsHas(c *C) { +func TestPrivsHas(t *testing.T) { // it is a simple helper, does not handle all&dynamic privs privs := Privileges{AllPriv} - c.Assert(privs.Has(AllPriv), IsTrue) - c.Assert(privs.Has(InsertPriv), IsFalse) + require.True(t, privs.Has(AllPriv)) + require.False(t, privs.Has(InsertPriv)) // multiple privs privs = Privileges{InsertPriv, SelectPriv} - c.Assert(privs.Has(SelectPriv), IsTrue) - c.Assert(privs.Has(InsertPriv), IsTrue) - c.Assert(privs.Has(DropPriv), IsFalse) + require.True(t, privs.Has(SelectPriv)) + require.True(t, privs.Has(InsertPriv)) + require.False(t, privs.Has(DropPriv)) } -func (s *testPrivsSuite) TestPrivAllConsistency(c *C) { +func TestPrivAllConsistency(t *testing.T) { // AllPriv in mysql.user columns. - for priv := PrivilegeType(CreatePriv); priv != AllPriv; priv = priv << 1 { + for priv := CreatePriv; priv != AllPriv; priv = priv << 1 { _, ok := Priv2UserCol[priv] - c.Assert(ok, IsTrue, Commentf("priv fail %d", priv)) + require.Truef(t, ok, "priv fail %d", priv) } - c.Assert(len(Priv2UserCol), Equals, len(AllGlobalPrivs)+1) + require.Equal(t, len(AllGlobalPrivs)+1, len(Priv2UserCol)) // USAGE privilege doesn't have a column in Priv2UserCol // ALL privilege doesn't have a column in Priv2UserCol // so it's +2 - c.Assert(len(Priv2Str), Equals, len(Priv2UserCol)+2) + require.Equal(t, len(Priv2UserCol)+2, len(Priv2Str)) } diff --git a/parser/mysql/type_test.go b/parser/mysql/type_test.go index a5139b1681819..644f96bafb7ad 100644 --- a/parser/mysql/type_test.go +++ b/parser/mysql/type_test.go @@ -14,24 +14,22 @@ package mysql import ( - . "github.com/pingcap/check" -) - -var _ = Suite(&testTypeSuite{}) + "testing" -type testTypeSuite struct{} + "github.com/stretchr/testify/require" +) -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) +func TestFlags(t *testing.T) { + require.True(t, HasNotNullFlag(NotNullFlag)) + require.True(t, HasUniKeyFlag(UniqueKeyFlag)) + require.True(t, HasNotNullFlag(NotNullFlag)) + require.True(t, HasNoDefaultValueFlag(NoDefaultValueFlag)) + require.True(t, HasAutoIncrementFlag(AutoIncrementFlag)) + require.True(t, HasUnsignedFlag(UnsignedFlag)) + require.True(t, HasZerofillFlag(ZerofillFlag)) + require.True(t, HasBinaryFlag(BinaryFlag)) + require.True(t, HasPriKeyFlag(PriKeyFlag)) + require.True(t, HasMultipleKeyFlag(MultipleKeyFlag)) + require.True(t, HasTimestampFlag(TimestampFlag)) + require.True(t, HasOnUpdateNowFlag(OnUpdateNowFlag)) } diff --git a/parser/parser.go b/parser/parser.go index 20ce0e1d66ce8..709b3f30def0c 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -54,13 +54,13 @@ type yyXError struct { } const ( - yyDefault = 58096 + yyDefault = 58102 yyEOFCode = 57344 account = 57573 action = 57574 add = 57359 - addDate = 57904 - admin = 57985 + addDate = 57908 + admin = 57990 advise = 57575 after = 57576 against = 57577 @@ -72,2110 +72,2117 @@ const ( analyze = 57362 and = 57363 andand = 57354 - andnot = 58056 + andnot = 58063 any = 57581 - approxCountDistinct = 57905 - approxPercentile = 57906 + approxCountDistinct = 57909 + approxPercentile = 57910 as = 57364 asc = 57365 ascii = 57582 asof = 57347 - assignmentEq = 58057 + assignmentEq = 58064 attributes = 57583 - autoIdCache = 57584 - autoIncrement = 57585 - autoRandom = 57586 - autoRandomBase = 57587 - avg = 57588 - avgRowLength = 57589 - backend = 57590 - backup = 57591 - backups = 57592 - begin = 57593 - bernoulli = 57594 + autoIdCache = 57588 + autoIncrement = 57589 + autoRandom = 57590 + autoRandomBase = 57591 + avg = 57592 + avgRowLength = 57593 + backend = 57594 + backup = 57595 + backups = 57596 + begin = 57597 + bernoulli = 57598 between = 57366 bigIntType = 57367 binaryType = 57368 - binding = 57595 - bindings = 57596 - binlog = 57597 - bitAnd = 57907 - bitLit = 58055 - bitOr = 57908 - bitType = 57598 - bitXor = 57909 + binding = 57599 + bindings = 57600 + binlog = 57601 + bitAnd = 57911 + bitLit = 58062 + bitOr = 57912 + bitType = 57602 + bitXor = 57913 blobType = 57369 - block = 57599 - boolType = 57601 - booleanType = 57600 + block = 57603 + boolType = 57605 + booleanType = 57604 both = 57370 - bound = 57910 - briefType = 57911 - btree = 57602 - buckets = 57986 - builtinAddDate = 58022 - builtinApproxCountDistinct = 58028 - builtinApproxPercentile = 58029 - builtinBitAnd = 58023 - builtinBitOr = 58024 - builtinBitXor = 58025 - builtinCast = 58026 - builtinCount = 58027 - builtinCurDate = 58030 - builtinCurTime = 58031 - builtinDateAdd = 58032 - builtinDateSub = 58033 - builtinExtract = 58034 - builtinGroupConcat = 58035 - builtinMax = 58036 - builtinMin = 58037 - builtinNow = 58038 - builtinPosition = 58039 - builtinStddevPop = 58044 - builtinStddevSamp = 58045 - builtinSubDate = 58040 - builtinSubstring = 58041 - builtinSum = 58042 - builtinSysDate = 58043 - builtinTranslate = 58046 - builtinTrim = 58047 - builtinUser = 58048 - builtinVarPop = 58049 - builtinVarSamp = 58050 - builtins = 57987 + bound = 57914 + briefType = 57915 + btree = 57606 + buckets = 57991 + builtinAddDate = 58029 + builtinApproxCountDistinct = 58035 + builtinApproxPercentile = 58036 + builtinBitAnd = 58030 + builtinBitOr = 58031 + builtinBitXor = 58032 + builtinCast = 58033 + builtinCount = 58034 + builtinCurDate = 58037 + builtinCurTime = 58038 + builtinDateAdd = 58039 + builtinDateSub = 58040 + builtinExtract = 58041 + builtinGroupConcat = 58042 + builtinMax = 58043 + builtinMin = 58044 + builtinNow = 58045 + builtinPosition = 58046 + builtinStddevPop = 58051 + builtinStddevSamp = 58052 + builtinSubDate = 58047 + builtinSubstring = 58048 + builtinSum = 58049 + builtinSysDate = 58050 + builtinTranslate = 58053 + builtinTrim = 58054 + builtinUser = 58055 + builtinVarPop = 58056 + builtinVarSamp = 58057 + builtins = 57992 by = 57371 - byteType = 57603 - cache = 57604 + byteType = 57607 + cache = 57608 call = 57372 - cancel = 57988 - capture = 57605 - cardinality = 57989 + cancel = 57993 + capture = 57609 + cardinality = 57994 cascade = 57373 - cascaded = 57606 + cascaded = 57610 caseKwd = 57374 - cast = 57912 - causal = 57607 - chain = 57608 + cast = 57916 + causal = 57611 + chain = 57612 change = 57375 charType = 57377 character = 57376 - charsetKwd = 57609 + charsetKwd = 57613 check = 57378 - checkpoint = 57610 - checksum = 57611 - cipher = 57612 - cleanup = 57613 - client = 57614 - clientErrorsSummary = 57615 - clustered = 57641 - cmSketch = 57990 - coalesce = 57616 + checkpoint = 57614 + checksum = 57615 + cipher = 57616 + cleanup = 57617 + client = 57618 + clientErrorsSummary = 57619 + clustered = 57645 + cmSketch = 57995 + coalesce = 57620 collate = 57379 - collation = 57617 + collation = 57621 column = 57380 - columnFormat = 57618 - columnStatsUsage = 57991 - columns = 57619 - comment = 57621 - commit = 57622 - committed = 57623 - compact = 57624 - compressed = 57625 - compression = 57626 - concurrency = 57627 - config = 57620 - connection = 57628 - consistency = 57629 - consistent = 57630 + columnFormat = 57622 + columnStatsUsage = 57996 + columns = 57623 + comment = 57625 + commit = 57626 + committed = 57627 + compact = 57628 + compressed = 57629 + compression = 57630 + concurrency = 57631 + config = 57624 + connection = 57632 + consistency = 57633 + consistent = 57634 constraint = 57381 - constraints = 57914 - context = 57631 + constraints = 57918 + context = 57635 convert = 57382 - copyKwd = 57913 - correlation = 57992 - cpu = 57632 + copyKwd = 57917 + correlation = 57997 + cpu = 57636 create = 57383 - createTableSelect = 58080 + createTableSelect = 58086 cross = 57384 - csvBackslashEscape = 57633 - csvDelimiter = 57634 - csvHeader = 57635 - csvNotNull = 57636 - csvNull = 57637 - csvSeparator = 57638 - csvTrimLastSeparators = 57639 + csvBackslashEscape = 57637 + csvDelimiter = 57638 + csvHeader = 57639 + csvNotNull = 57640 + csvNull = 57641 + csvSeparator = 57642 + csvTrimLastSeparators = 57643 cumeDist = 57385 - curTime = 57915 - current = 57640 + curTime = 57919 + current = 57644 currentDate = 57386 currentRole = 57390 currentTime = 57387 currentTs = 57388 currentUser = 57389 - cycle = 57642 - data = 57643 + cycle = 57646 + data = 57647 database = 57391 databases = 57392 - dateAdd = 57916 - dateSub = 57917 - dateType = 57645 - datetimeType = 57644 - day = 57646 + dateAdd = 57920 + dateSub = 57921 + dateType = 57649 + datetimeType = 57648 + day = 57650 dayHour = 57393 dayMicrosecond = 57394 dayMinute = 57395 daySecond = 57396 - ddl = 57993 - deallocate = 57647 - decLit = 58052 + ddl = 57998 + deallocate = 57651 + decLit = 58059 decimalType = 57397 defaultKwd = 57398 - definer = 57648 - delayKeyWrite = 57649 + definer = 57652 + delayKeyWrite = 57653 delayed = 57399 deleteKwd = 57400 denseRank = 57401 - dependency = 57994 - depth = 57995 + dependency = 57999 + depth = 58000 desc = 57402 describe = 57403 - directory = 57650 - disable = 57651 - discard = 57652 - disk = 57653 + directory = 57654 + disable = 57655 + discard = 57656 + disk = 57657 distinct = 57404 distinctRow = 57405 div = 57406 - do = 57654 - dotType = 57918 + do = 57658 + dotType = 57922 doubleAtIdentifier = 57351 doubleType = 57407 - drainer = 57996 + drainer = 58001 drop = 57408 dual = 57409 - dump = 57919 - duplicate = 57655 - dynamic = 57656 + dump = 57923 + duplicate = 57659 + dynamic = 57660 elseKwd = 57410 - empty = 58070 - enable = 57657 + empty = 58077 + enable = 57661 enclosed = 57411 - encryption = 57658 - end = 57659 - enforced = 57660 - engine = 57661 - engines = 57662 - enum = 57663 - eq = 58058 + encryption = 57662 + end = 57663 + enforced = 57664 + engine = 57665 + engines = 57666 + enum = 57667 + eq = 58065 yyErrCode = 57345 - errorKwd = 57664 - escape = 57665 + errorKwd = 57668 + escape = 57669 escaped = 57412 - event = 57666 - events = 57667 - evolve = 57668 - exact = 57920 + event = 57670 + events = 57671 + evolve = 57672 + exact = 57924 except = 57415 - exchange = 57669 - exclusive = 57670 - execute = 57671 + exchange = 57673 + exclusive = 57674 + execute = 57675 exists = 57413 - expansion = 57672 - expire = 57673 + expansion = 57676 + expire = 57677 explain = 57414 - exprPushdownBlacklist = 57921 - extended = 57674 - extract = 57922 + exprPushdownBlacklist = 57925 + extended = 57678 + extract = 57926 falseKwd = 57416 - faultsSym = 57675 + faultsSym = 57679 fetch = 57417 - fields = 57676 - file = 57677 - first = 57678 + fields = 57680 + file = 57681 + first = 57682 firstValue = 57418 - fixed = 57679 - flashback = 57923 - floatLit = 58051 + fixed = 57683 + flashback = 57927 + floatLit = 58058 floatType = 57419 - flush = 57680 - follower = 57924 - followerConstraints = 57925 - followers = 57926 - following = 57681 + flush = 57684 + follower = 57928 + followerConstraints = 57929 + followers = 57930 + following = 57685 forKwd = 57420 force = 57421 foreign = 57422 - format = 57682 + format = 57686 from = 57423 - full = 57683 + full = 57687 fulltext = 57424 - function = 57684 - ge = 58059 - general = 57685 + function = 57688 + ge = 58066 + general = 57689 generated = 57425 - getFormat = 57927 - global = 57686 + getFormat = 57931 + global = 57690 grant = 57426 - grants = 57687 + grants = 57691 group = 57427 - groupConcat = 57928 + groupConcat = 57932 groups = 57428 - hash = 57688 + hash = 57692 having = 57429 - help = 57689 - hexLit = 58054 + help = 57693 + hexLit = 58061 highPriority = 57430 - higherThanComma = 58095 - higherThanParenthese = 58089 + higherThanComma = 58101 + higherThanParenthese = 58095 hintComment = 57353 - histogram = 57690 - history = 57691 - hosts = 57692 - hour = 57693 + histogram = 57694 + histogramsInFlight = 58018 + history = 57695 + hosts = 57696 + hour = 57697 hourMicrosecond = 57431 hourMinute = 57432 hourSecond = 57433 - identSQLErrors = 57695 - identified = 57694 + identSQLErrors = 57699 + identified = 57698 identifier = 57346 ifKwd = 57434 ignore = 57435 - importKwd = 57696 - imports = 57697 + importKwd = 57700 + imports = 57701 in = 57436 - increment = 57698 - incremental = 57699 + increment = 57702 + incremental = 57703 index = 57437 - indexes = 57700 + indexes = 57704 infile = 57438 inner = 57439 - inplace = 57930 + inplace = 57934 insert = 57446 - insertMethod = 57701 - insertValues = 58078 - instance = 57702 - instant = 57931 + insertMethod = 57705 + insertValues = 58084 + instance = 57706 + instant = 57935 int1Type = 57448 int2Type = 57449 int3Type = 57450 int4Type = 57451 int8Type = 57452 - intLit = 58053 + intLit = 58060 intType = 57447 integerType = 57440 - internal = 57932 + internal = 57936 intersect = 57441 interval = 57442 into = 57443 invalid = 57352 - invisible = 57703 - invoker = 57704 - io = 57705 - ipc = 57706 + invisible = 57707 + invoker = 57708 + io = 57709 + ipc = 57710 is = 57445 - isolation = 57707 - issuer = 57708 - job = 57998 - jobs = 57997 + isolation = 57711 + issuer = 57712 + job = 58003 + jobs = 58002 join = 57453 - jsonArrayagg = 57933 - jsonObjectAgg = 57934 - jsonType = 57709 - jss = 58061 - juss = 58062 + jsonArrayagg = 57937 + jsonObjectAgg = 57938 + jsonType = 57713 + jss = 58068 + juss = 58069 key = 57454 - keyBlockSize = 57710 + keyBlockSize = 57714 keys = 57455 kill = 57456 - labels = 57711 + labels = 57715 lag = 57457 - language = 57712 - last = 57713 - lastBackup = 57714 + language = 57716 + last = 57717 + lastBackup = 57718 lastValue = 57458 - lastval = 57715 - le = 58060 + lastval = 57719 + le = 58067 lead = 57459 - leader = 57935 - leaderConstraints = 57936 + leader = 57939 + leaderConstraints = 57940 leading = 57460 - learner = 57937 - learnerConstraints = 57938 - learners = 57939 + learner = 57941 + learnerConstraints = 57942 + learners = 57943 left = 57461 - less = 57716 - level = 57717 + less = 57720 + level = 57721 like = 57462 limit = 57463 linear = 57465 lines = 57464 - list = 57718 + list = 57722 load = 57466 - local = 57719 + local = 57723 localTime = 57467 localTs = 57468 - location = 57721 + location = 57725 lock = 57469 - locked = 57720 - logs = 57722 + locked = 57724 + logs = 57726 long = 57558 longblobType = 57470 longtextType = 57471 lowPriority = 57472 - lowerThanCharsetKwd = 58081 - lowerThanComma = 58094 - lowerThanCreateTableSelect = 58079 - lowerThanEq = 58091 - lowerThanFunction = 58086 - lowerThanInsertValues = 58077 - lowerThanIntervalKeyword = 58072 - lowerThanKey = 58082 - lowerThanLocal = 58083 - lowerThanNot = 58093 - lowerThanOn = 58090 - lowerThanParenthese = 58088 - lowerThanRemove = 58084 - lowerThanSelectOpt = 58071 - lowerThanSelectStmt = 58076 - lowerThanSetKeyword = 58075 - lowerThanStringLitToken = 58074 - lowerThanValueKeyword = 58073 - lowerThenOrder = 58085 - lsh = 58063 - master = 57723 + lowerThanCharsetKwd = 58087 + lowerThanComma = 58100 + lowerThanCreateTableSelect = 58085 + lowerThanEq = 58097 + lowerThanFunction = 58092 + lowerThanInsertValues = 58083 + lowerThanKey = 58088 + lowerThanLocal = 58089 + lowerThanNot = 58099 + lowerThanOn = 58096 + lowerThanParenthese = 58094 + lowerThanRemove = 58090 + lowerThanSelectOpt = 58078 + lowerThanSelectStmt = 58082 + lowerThanSetKeyword = 58081 + lowerThanStringLitToken = 58080 + lowerThanValueKeyword = 58079 + lowerThenOrder = 58091 + lsh = 58070 + master = 57727 match = 57473 - max = 57941 - maxConnectionsPerHour = 57726 - maxQueriesPerHour = 57727 - maxRows = 57728 - maxUpdatesPerHour = 57729 - maxUserConnections = 57730 + max = 57945 + maxConnectionsPerHour = 57730 + maxQueriesPerHour = 57731 + maxRows = 57732 + maxUpdatesPerHour = 57733 + maxUserConnections = 57734 maxValue = 57474 - max_idxnum = 57724 - max_minutes = 57725 - mb = 57731 + max_idxnum = 57728 + max_minutes = 57729 + mb = 57735 mediumIntType = 57476 mediumblobType = 57475 mediumtextType = 57477 - memory = 57732 - merge = 57733 - microsecond = 57734 - min = 57940 - minRows = 57735 - minValue = 57737 - minute = 57736 + memory = 57736 + merge = 57737 + microsecond = 57738 + min = 57944 + minRows = 57739 + minValue = 57741 + minute = 57740 minuteMicrosecond = 57478 minuteSecond = 57479 mod = 57480 - mode = 57738 - modify = 57739 - month = 57740 - names = 57741 - national = 57742 + mode = 57742 + modify = 57743 + month = 57744 + names = 57745 + national = 57746 natural = 57572 - ncharType = 57743 - neg = 58092 - neq = 58064 - neqSynonym = 58065 - never = 57744 - next = 57745 - next_row_id = 57929 - nextval = 57746 - no = 57747 + ncharType = 57747 + neg = 58098 + neq = 58071 + neqSynonym = 58072 + never = 57748 + next = 57749 + next_row_id = 57933 + nextval = 57750 + no = 57751 noWriteToBinLog = 57482 - nocache = 57748 - nocycle = 57749 - nodeID = 57999 - nodeState = 58000 - nodegroup = 57750 - nomaxvalue = 57751 - nominvalue = 57752 - nonclustered = 57753 - none = 57754 + nocache = 57752 + nocycle = 57753 + nodeID = 58004 + nodeState = 58005 + nodegroup = 57754 + nomaxvalue = 57755 + nominvalue = 57756 + nonclustered = 57757 + none = 57758 not = 57481 - not2 = 58069 - now = 57942 - nowait = 57755 + not2 = 58076 + now = 57946 + nowait = 57759 nthValue = 57483 ntile = 57484 null = 57485 - nulleq = 58066 - nulls = 57757 + nulleq = 58073 + nulls = 57761 numericType = 57486 - nvarcharType = 57756 + nvarcharType = 57760 odbcDateType = 57356 odbcTimeType = 57357 odbcTimestampType = 57358 of = 57487 - off = 57758 - offset = 57759 + off = 57762 + offset = 57763 on = 57488 - onDuplicate = 57760 - online = 57761 - only = 57762 - open = 57763 - optRuleBlacklist = 57943 - optimistic = 58001 + onDuplicate = 57764 + online = 57765 + only = 57766 + open = 57767 + optRuleBlacklist = 57947 + optimistic = 58006 optimize = 57489 option = 57490 - optional = 57764 + optional = 57768 optionally = 57491 or = 57492 order = 57493 outer = 57494 outfile = 57444 over = 57495 - packKeys = 57765 - pageSym = 57766 - paramMarker = 58067 - parser = 57767 - partial = 57768 + packKeys = 57769 + pageSym = 57770 + paramMarker = 58074 + parser = 57771 + partial = 57772 partition = 57496 - partitioning = 57769 - partitions = 57770 - password = 57771 - per_db = 57773 - per_table = 57774 - percent = 57772 + partitioning = 57773 + partitions = 57774 + password = 57775 + per_db = 57777 + per_table = 57778 + percent = 57776 percentRank = 57497 - pessimistic = 58002 + pessimistic = 58007 pipes = 57355 - pipesAsOr = 57775 - placement = 57944 - plan = 57945 - plugins = 57776 - policy = 57777 - position = 57946 - preSplitRegions = 57778 - preceding = 57779 + pipesAsOr = 57779 + placement = 57948 + plan = 57949 + plugins = 57780 + policy = 57781 + position = 57950 + preSplitRegions = 57782 + preceding = 57783 precisionType = 57498 - predicate = 57947 - prepare = 57780 - preserve = 57781 + predicate = 57951 + prepare = 57784 + preserve = 57785 primary = 57499 - primaryRegion = 57948 - privileges = 57782 + primaryRegion = 57952 + privileges = 57786 procedure = 57500 - process = 57783 - processlist = 57784 - profile = 57785 - profiles = 57786 - proxy = 57787 - pump = 58003 - purge = 57788 - quarter = 57789 - queries = 57790 - query = 57791 - quick = 57792 + process = 57787 + processlist = 57788 + profile = 57789 + profiles = 57790 + proxy = 57791 + pump = 58008 + purge = 57792 + quarter = 57793 + queries = 57794 + query = 57795 + quick = 57796 rangeKwd = 57501 rank = 57502 - rateLimit = 57793 + rateLimit = 57797 read = 57503 realType = 57504 - rebuild = 57794 - recent = 57949 - recover = 57795 + rebuild = 57798 + recent = 57953 + recover = 57799 recursive = 57505 - redundant = 57796 + redundant = 57800 references = 57506 regexpKwd = 57507 - region = 58021 - regions = 58020 + region = 58028 + regions = 58027 release = 57508 - reload = 57797 - remove = 57798 + reload = 57801 + remove = 57802 rename = 57509 - reorganize = 57799 - repair = 57800 + reorganize = 57803 + repair = 57804 repeat = 57510 - repeatable = 57801 + repeatable = 57805 replace = 57511 - replayer = 57950 - replica = 57802 - replicas = 57803 - replication = 57804 + replayer = 57954 + replica = 57806 + replicas = 57807 + replication = 57808 require = 57512 - required = 57805 - reset = 58019 - respect = 57806 - restart = 57807 - restore = 57808 - restores = 57809 + required = 57809 + reset = 58026 + respect = 57810 + restart = 57811 + restore = 57812 + restores = 57813 restrict = 57513 - resume = 57810 - reverse = 57811 + resume = 57814 + reverse = 57815 revoke = 57514 right = 57515 rlike = 57516 - role = 57812 - rollback = 57813 - routine = 57814 + role = 57816 + rollback = 57817 + routine = 57818 row = 57517 - rowCount = 57815 - rowFormat = 57816 + rowCount = 57819 + rowFormat = 57820 rowNumber = 57519 rows = 57518 - rsh = 58068 - rtree = 57817 - running = 57951 - s3 = 57952 - samples = 58004 - san = 57818 - schedule = 57953 - second = 57819 + rsh = 58075 + rtree = 57821 + running = 57955 + s3 = 57956 + sampleRate = 58010 + samples = 58009 + san = 57822 + schedule = 57957 + second = 57823 secondMicrosecond = 57520 - secondaryEngine = 57820 - secondaryLoad = 57821 - secondaryUnload = 57822 - security = 57823 + secondaryEngine = 57824 + secondaryLoad = 57825 + secondaryUnload = 57826 + security = 57827 selectKwd = 57521 - sendCredentialsToTiKV = 57824 - separator = 57825 - sequence = 57826 - serial = 57827 - serializable = 57828 - session = 57829 + sendCredentialsToTiKV = 57828 + separator = 57829 + sequence = 57830 + serial = 57831 + serializable = 57832 + session = 57833 set = 57522 - setval = 57830 - shardRowIDBits = 57831 - share = 57832 - shared = 57833 + setval = 57834 + shardRowIDBits = 57835 + share = 57836 + shared = 57837 show = 57523 - shutdown = 57834 - signed = 57835 - simple = 57836 + shutdown = 57838 + signed = 57839 + simple = 57840 singleAtIdentifier = 57350 - skip = 57837 - skipSchemaFiles = 57838 - slave = 57839 - slow = 57840 + skip = 57841 + skipSchemaFiles = 57842 + slave = 57843 + slow = 57844 smallIntType = 57524 - snapshot = 57841 - some = 57842 - source = 57843 + snapshot = 57845 + some = 57846 + source = 57847 spatial = 57525 - split = 58017 + split = 58024 sql = 57526 sqlBigResult = 57527 - sqlBufferResult = 57844 - sqlCache = 57845 + sqlBufferResult = 57848 + sqlCache = 57849 sqlCalcFoundRows = 57528 - sqlNoCache = 57846 + sqlNoCache = 57850 sqlSmallResult = 57529 - sqlTsiDay = 57847 - sqlTsiHour = 57848 - sqlTsiMinute = 57849 - sqlTsiMonth = 57850 - sqlTsiQuarter = 57851 - sqlTsiSecond = 57852 - sqlTsiWeek = 57853 - sqlTsiYear = 57854 + sqlTsiDay = 57851 + sqlTsiHour = 57852 + sqlTsiMinute = 57853 + sqlTsiMonth = 57854 + sqlTsiQuarter = 57855 + sqlTsiSecond = 57856 + sqlTsiWeek = 57857 + sqlTsiYear = 57858 ssl = 57530 - staleness = 57954 - start = 57855 + staleness = 57958 + start = 57859 starting = 57531 - statistics = 58005 - stats = 58006 - statsAutoRecalc = 57856 - statsBuckets = 58009 + statistics = 58011 + stats = 58012 + statsAutoRecalc = 57860 + statsBuckets = 58015 + statsColChoice = 57586 + statsColList = 57587 statsExtended = 57532 - statsHealthy = 58010 - statsHistograms = 58008 - statsMeta = 58007 - statsPersistent = 57857 - statsSamplePages = 57858 - statsTopN = 58011 - status = 57859 - std = 57955 - stddev = 57956 - stddevPop = 57957 - stddevSamp = 57958 - stop = 57959 - storage = 57860 + statsHealthy = 58016 + statsHistograms = 58014 + statsMeta = 58013 + statsOptions = 57584 + statsPersistent = 57861 + statsSamplePages = 57862 + statsSampleRate = 57585 + statsTopN = 58017 + status = 57863 + std = 57959 + stddev = 57960 + stddevPop = 57961 + stddevSamp = 57962 + stop = 57963 + storage = 57864 stored = 57536 straightJoin = 57533 - strict = 57960 - strictFormat = 57861 + strict = 57964 + strictFormat = 57865 stringLit = 57349 - strong = 57961 - subDate = 57962 - subject = 57862 - subpartition = 57863 - subpartitions = 57864 - substring = 57964 - sum = 57963 - super = 57865 - swaps = 57866 - switchesSym = 57867 - system = 57868 - systemTime = 57869 - tableChecksum = 57870 + strong = 57965 + subDate = 57966 + subject = 57866 + subpartition = 57867 + subpartitions = 57868 + substring = 57968 + sum = 57967 + super = 57869 + swaps = 57870 + switchesSym = 57871 + system = 57872 + systemTime = 57873 + tableChecksum = 57874 tableKwd = 57534 - tableRefPriority = 58087 + tableRefPriority = 58093 tableSample = 57535 - tables = 57871 - tablespace = 57872 - telemetry = 58012 - telemetryID = 58013 - temporary = 57873 - temptable = 57874 + tables = 57875 + tablespace = 57876 + target = 57969 + telemetry = 58019 + telemetryID = 58020 + temporary = 57877 + temptable = 57878 terminated = 57537 - textType = 57875 - than = 57876 + textType = 57879 + than = 57880 then = 57538 - tiFlash = 58015 - tidb = 58014 - tikvImporter = 57877 - timeType = 57879 - timestampAdd = 57965 - timestampDiff = 57966 - timestampType = 57878 + tiFlash = 58022 + tidb = 58021 + tikvImporter = 57881 + timeType = 57883 + timestampAdd = 57970 + timestampDiff = 57971 + timestampType = 57882 tinyIntType = 57540 tinyblobType = 57539 tinytextType = 57541 - tls = 57967 + tls = 57972 to = 57542 - tokudbDefault = 57968 - tokudbFast = 57969 - tokudbLzma = 57970 - tokudbQuickLZ = 57971 - tokudbSmall = 57973 - tokudbSnappy = 57972 - tokudbUncompressed = 57974 - tokudbZlib = 57975 - top = 57976 - topn = 58016 - tp = 57880 - trace = 57881 - traditional = 57882 + tokudbDefault = 57973 + tokudbFast = 57974 + tokudbLzma = 57975 + tokudbQuickLZ = 57976 + tokudbSmall = 57978 + tokudbSnappy = 57977 + tokudbUncompressed = 57979 + tokudbZlib = 57980 + top = 57981 + topn = 58023 + tp = 57884 + trace = 57885 + traditional = 57886 trailing = 57543 - transaction = 57883 + transaction = 57887 trigger = 57544 - triggers = 57884 - trim = 57977 + triggers = 57888 + trim = 57982 trueKwd = 57545 - truncate = 57885 - unbounded = 57886 - uncommitted = 57887 - undefined = 57888 + truncate = 57889 + unbounded = 57890 + uncommitted = 57891 + undefined = 57892 underscoreCS = 57348 - unicodeSym = 57889 + unicodeSym = 57893 union = 57547 unique = 57546 - unknown = 57890 + unknown = 57894 unlock = 57548 unsigned = 57549 update = 57550 usage = 57551 use = 57552 - user = 57891 + user = 57895 using = 57553 utcDate = 57554 utcTime = 57556 utcTimestamp = 57555 - validation = 57892 - value = 57893 + validation = 57896 + value = 57897 values = 57557 - varPop = 57979 - varSamp = 57980 + varPop = 57984 + varSamp = 57985 varbinaryType = 57561 varcharType = 57559 varcharacter = 57560 - variables = 57894 - variance = 57978 + variables = 57898 + variance = 57983 varying = 57562 - verboseType = 57981 - view = 57895 + verboseType = 57986 + view = 57899 virtual = 57563 - visible = 57896 - voter = 57982 - voterConstraints = 57983 - voters = 57984 - wait = 57903 - warnings = 57897 - week = 57898 - weightString = 57899 + visible = 57900 + voter = 57987 + voterConstraints = 57988 + voters = 57989 + wait = 57907 + warnings = 57901 + week = 57902 + weightString = 57903 when = 57564 where = 57565 - width = 58018 + width = 58025 window = 57567 with = 57568 - without = 57900 + without = 57904 write = 57566 - x509 = 57901 + x509 = 57905 xor = 57569 yearMonth = 57570 - yearType = 57902 + yearType = 57906 zerofill = 57571 yyMaxDepth = 200 - yyTabOfs = -2452 + yyTabOfs = -2454 ) var ( yyXLAT = map[int]int{ - 57344: 0, // $end (2164x) - 59: 1, // ';' (2163x) - 57798: 2, // remove (1842x) - 57799: 3, // reorganize (1842x) - 57621: 4, // comment (1762x) - 57860: 5, // storage (1738x) - 57585: 6, // autoIncrement (1727x) - 44: 7, // ',' (1649x) - 57678: 8, // first (1618x) - 57576: 9, // after (1616x) - 57827: 10, // serial (1612x) - 57586: 11, // autoRandom (1611x) - 57618: 12, // columnFormat (1611x) - 57914: 13, // constraints (1596x) - 57609: 14, // charsetKwd (1595x) - 57771: 15, // password (1591x) - 58020: 16, // regions (1587x) - 57944: 17, // placement (1582x) - 57925: 18, // followerConstraints (1580x) - 57926: 19, // followers (1580x) - 57936: 20, // leaderConstraints (1580x) - 57938: 21, // learnerConstraints (1580x) - 57939: 22, // learners (1580x) - 57948: 23, // primaryRegion (1580x) - 57953: 24, // schedule (1580x) - 57983: 25, // voterConstraints (1580x) - 57984: 26, // voters (1580x) - 57611: 27, // checksum (1577x) - 57658: 28, // encryption (1560x) - 57710: 29, // keyBlockSize (1559x) - 57872: 30, // tablespace (1556x) - 57661: 31, // engine (1551x) - 57643: 32, // data (1549x) - 57701: 33, // insertMethod (1547x) - 57728: 34, // maxRows (1547x) - 57735: 35, // minRows (1547x) - 57750: 36, // nodegroup (1547x) - 57628: 37, // connection (1539x) - 57587: 38, // autoRandomBase (1536x) - 57584: 39, // autoIdCache (1533x) - 57589: 40, // avgRowLength (1533x) - 57626: 41, // compression (1533x) - 57649: 42, // delayKeyWrite (1533x) - 57765: 43, // packKeys (1533x) - 57778: 44, // preSplitRegions (1533x) - 57816: 45, // rowFormat (1533x) - 57820: 46, // secondaryEngine (1533x) - 57831: 47, // shardRowIDBits (1533x) - 57856: 48, // statsAutoRecalc (1533x) - 57857: 49, // statsPersistent (1533x) - 57858: 50, // statsSamplePages (1533x) - 57870: 51, // tableChecksum (1533x) - 57573: 52, // account (1475x) - 41: 53, // ')' (1474x) - 57810: 54, // resume (1465x) - 57835: 55, // signed (1465x) - 57841: 56, // snapshot (1464x) - 57590: 57, // backend (1463x) - 57610: 58, // checkpoint (1463x) - 57627: 59, // concurrency (1463x) - 57633: 60, // csvBackslashEscape (1463x) - 57634: 61, // csvDelimiter (1463x) - 57635: 62, // csvHeader (1463x) - 57636: 63, // csvNotNull (1463x) - 57637: 64, // csvNull (1463x) - 57638: 65, // csvSeparator (1463x) - 57639: 66, // csvTrimLastSeparators (1463x) - 57714: 67, // lastBackup (1463x) - 57760: 68, // onDuplicate (1463x) - 57761: 69, // online (1463x) - 57793: 70, // rateLimit (1463x) - 57824: 71, // sendCredentialsToTiKV (1463x) - 57838: 72, // skipSchemaFiles (1463x) - 57861: 73, // strictFormat (1463x) - 57877: 74, // tikvImporter (1463x) - 57885: 75, // truncate (1460x) - 57747: 76, // no (1459x) - 57855: 77, // start (1455x) - 57604: 78, // cache (1454x) - 57748: 79, // nocache (1453x) - 57642: 80, // cycle (1452x) - 57737: 81, // minValue (1452x) - 57698: 82, // increment (1451x) - 57749: 83, // nocycle (1451x) - 57751: 84, // nomaxvalue (1451x) - 57752: 85, // nominvalue (1451x) - 57807: 86, // restart (1449x) - 57579: 87, // algorithm (1448x) - 57880: 88, // tp (1448x) - 57641: 89, // clustered (1447x) - 57703: 90, // invisible (1447x) - 57753: 91, // nonclustered (1447x) - 57896: 92, // visible (1447x) - 57812: 93, // role (1442x) - 57895: 94, // view (1439x) - 57619: 95, // columns (1438x) - 57803: 96, // replicas (1436x) - 57863: 97, // subpartition (1435x) - 57582: 98, // ascii (1434x) - 57603: 99, // byteType (1434x) - 57770: 100, // partitions (1434x) - 57889: 101, // unicodeSym (1434x) - 57902: 102, // yearType (1434x) - 57646: 103, // day (1433x) - 57676: 104, // fields (1433x) - 57819: 105, // second (1432x) - 57854: 106, // sqlTsiYear (1432x) - 57871: 107, // tables (1432x) - 57693: 108, // hour (1431x) - 57734: 109, // microsecond (1431x) - 57736: 110, // minute (1431x) - 57740: 111, // month (1431x) - 57789: 112, // quarter (1431x) - 57847: 113, // sqlTsiDay (1431x) - 57848: 114, // sqlTsiHour (1431x) - 57849: 115, // sqlTsiMinute (1431x) - 57850: 116, // sqlTsiMonth (1431x) - 57851: 117, // sqlTsiQuarter (1431x) - 57852: 118, // sqlTsiSecond (1431x) - 57853: 119, // sqlTsiWeek (1431x) - 57898: 120, // week (1431x) - 57825: 121, // separator (1430x) - 57859: 122, // status (1430x) - 57726: 123, // maxConnectionsPerHour (1429x) - 57727: 124, // maxQueriesPerHour (1429x) - 57729: 125, // maxUpdatesPerHour (1429x) - 57730: 126, // maxUserConnections (1429x) - 57779: 127, // preceding (1429x) - 57612: 128, // cipher (1428x) - 57696: 129, // importKwd (1428x) - 57708: 130, // issuer (1428x) - 57818: 131, // san (1428x) - 57862: 132, // subject (1428x) - 57719: 133, // local (1427x) - 57777: 134, // policy (1427x) - 57837: 135, // skip (1427x) - 57596: 136, // bindings (1426x) - 57648: 137, // definer (1426x) - 57688: 138, // hash (1426x) - 57694: 139, // identified (1426x) - 57722: 140, // logs (1426x) - 57791: 141, // query (1426x) - 57806: 142, // respect (1426x) - 57640: 143, // current (1425x) - 57660: 144, // enforced (1425x) - 57681: 145, // following (1425x) - 57755: 146, // nowait (1425x) - 57762: 147, // only (1425x) - 57893: 148, // value (1425x) - 57595: 149, // binding (1424x) - 57659: 150, // end (1424x) - 57929: 151, // next_row_id (1424x) - 57947: 152, // predicate (1424x) - 57873: 153, // temporary (1424x) - 57886: 154, // unbounded (1424x) - 57891: 155, // user (1424x) - 57622: 156, // commit (1423x) - 57686: 157, // global (1423x) - 57346: 158, // identifier (1423x) - 57759: 159, // offset (1423x) - 57780: 160, // prepare (1423x) - 57813: 161, // rollback (1423x) - 57890: 162, // unknown (1423x) - 57903: 163, // wait (1423x) - 57593: 164, // begin (1422x) - 57602: 165, // btree (1422x) - 57644: 166, // datetimeType (1422x) - 57645: 167, // dateType (1422x) - 57679: 168, // fixed (1422x) - 57707: 169, // isolation (1422x) - 57709: 170, // jsonType (1422x) - 57724: 171, // max_idxnum (1422x) - 57732: 172, // memory (1422x) - 57758: 173, // off (1422x) - 57764: 174, // optional (1422x) - 57773: 175, // per_db (1422x) - 57782: 176, // privileges (1422x) - 57805: 177, // required (1422x) - 57817: 178, // rtree (1422x) - 57951: 179, // running (1422x) - 57826: 180, // sequence (1422x) - 57840: 181, // slow (1422x) - 57879: 182, // timeType (1422x) - 57892: 183, // validation (1422x) - 57894: 184, // variables (1422x) - 57583: 185, // attributes (1421x) - 57651: 186, // disable (1421x) - 57655: 187, // duplicate (1421x) - 57656: 188, // dynamic (1421x) - 57657: 189, // enable (1421x) - 57664: 190, // errorKwd (1421x) - 57680: 191, // flush (1421x) - 57683: 192, // full (1421x) - 57695: 193, // identSQLErrors (1421x) - 57721: 194, // location (1421x) - 57731: 195, // mb (1421x) - 57738: 196, // mode (1421x) - 57744: 197, // never (1421x) - 57776: 198, // plugins (1421x) - 57784: 199, // processlist (1421x) - 57795: 200, // recover (1421x) - 57800: 201, // repair (1421x) - 57801: 202, // repeatable (1421x) - 57829: 203, // session (1421x) - 58005: 204, // statistics (1421x) - 57864: 205, // subpartitions (1421x) - 58014: 206, // tidb (1421x) - 57878: 207, // timestampType (1421x) - 57900: 208, // without (1421x) - 57985: 209, // admin (1420x) - 57591: 210, // backup (1420x) - 57597: 211, // binlog (1420x) - 57599: 212, // block (1420x) - 57600: 213, // booleanType (1420x) - 57986: 214, // buckets (1420x) - 57989: 215, // cardinality (1420x) - 57608: 216, // chain (1420x) - 57615: 217, // clientErrorsSummary (1420x) - 57990: 218, // cmSketch (1420x) - 57616: 219, // coalesce (1420x) - 57624: 220, // compact (1420x) - 57625: 221, // compressed (1420x) - 57631: 222, // context (1420x) - 57913: 223, // copyKwd (1420x) - 57992: 224, // correlation (1420x) - 57632: 225, // cpu (1420x) - 57647: 226, // deallocate (1420x) - 57994: 227, // dependency (1420x) - 57650: 228, // directory (1420x) - 57652: 229, // discard (1420x) - 57653: 230, // disk (1420x) - 57654: 231, // do (1420x) - 57996: 232, // drainer (1420x) - 57669: 233, // exchange (1420x) - 57671: 234, // execute (1420x) - 57672: 235, // expansion (1420x) - 57923: 236, // flashback (1420x) - 57685: 237, // general (1420x) - 57689: 238, // help (1420x) - 57690: 239, // histogram (1420x) - 57692: 240, // hosts (1420x) - 57930: 241, // inplace (1420x) - 57931: 242, // instant (1420x) - 57706: 243, // ipc (1420x) - 57998: 244, // job (1420x) - 57997: 245, // jobs (1420x) - 57711: 246, // labels (1420x) - 57720: 247, // locked (1420x) - 57739: 248, // modify (1420x) - 57745: 249, // next (1420x) - 57999: 250, // nodeID (1420x) - 58000: 251, // nodeState (1420x) - 57757: 252, // nulls (1420x) - 57766: 253, // pageSym (1420x) - 57945: 254, // plan (1420x) - 58003: 255, // pump (1420x) - 57788: 256, // purge (1420x) - 57794: 257, // rebuild (1420x) - 57796: 258, // redundant (1420x) - 57797: 259, // reload (1420x) - 57808: 260, // restore (1420x) - 57814: 261, // routine (1420x) - 57952: 262, // s3 (1420x) - 58004: 263, // samples (1420x) - 57821: 264, // secondaryLoad (1420x) - 57822: 265, // secondaryUnload (1420x) - 57832: 266, // share (1420x) - 57834: 267, // shutdown (1420x) - 57843: 268, // source (1420x) - 58017: 269, // split (1420x) - 58006: 270, // stats (1420x) - 57959: 271, // stop (1420x) - 57866: 272, // swaps (1420x) - 57968: 273, // tokudbDefault (1420x) - 57969: 274, // tokudbFast (1420x) - 57970: 275, // tokudbLzma (1420x) - 57971: 276, // tokudbQuickLZ (1420x) - 57973: 277, // tokudbSmall (1420x) - 57972: 278, // tokudbSnappy (1420x) - 57974: 279, // tokudbUncompressed (1420x) - 57975: 280, // tokudbZlib (1420x) - 58016: 281, // topn (1420x) - 57881: 282, // trace (1420x) - 57574: 283, // action (1419x) - 57575: 284, // advise (1419x) - 57577: 285, // against (1419x) - 57578: 286, // ago (1419x) - 57580: 287, // always (1419x) - 57592: 288, // backups (1419x) - 57594: 289, // bernoulli (1419x) - 57598: 290, // bitType (1419x) - 57601: 291, // boolType (1419x) - 57911: 292, // briefType (1419x) - 57987: 293, // builtins (1419x) - 57988: 294, // cancel (1419x) - 57605: 295, // capture (1419x) - 57606: 296, // cascaded (1419x) - 57607: 297, // causal (1419x) - 57613: 298, // cleanup (1419x) - 57614: 299, // client (1419x) - 57617: 300, // collation (1419x) - 57991: 301, // columnStatsUsage (1419x) - 57623: 302, // committed (1419x) - 57620: 303, // config (1419x) - 57629: 304, // consistency (1419x) - 57630: 305, // consistent (1419x) - 57993: 306, // ddl (1419x) - 57995: 307, // depth (1419x) - 57918: 308, // dotType (1419x) - 57919: 309, // dump (1419x) - 57662: 310, // engines (1419x) - 57663: 311, // enum (1419x) - 57667: 312, // events (1419x) - 57668: 313, // evolve (1419x) - 57673: 314, // expire (1419x) - 57921: 315, // exprPushdownBlacklist (1419x) - 57674: 316, // extended (1419x) - 57675: 317, // faultsSym (1419x) - 57924: 318, // follower (1419x) - 57682: 319, // format (1419x) - 57684: 320, // function (1419x) - 57687: 321, // grants (1419x) - 57691: 322, // history (1419x) - 57697: 323, // imports (1419x) - 57699: 324, // incremental (1419x) - 57700: 325, // indexes (1419x) - 57702: 326, // instance (1419x) - 57932: 327, // internal (1419x) - 57704: 328, // invoker (1419x) - 57705: 329, // io (1419x) - 57712: 330, // language (1419x) - 57713: 331, // last (1419x) - 57935: 332, // leader (1419x) - 57937: 333, // learner (1419x) - 57716: 334, // less (1419x) - 57717: 335, // level (1419x) - 57718: 336, // list (1419x) - 57723: 337, // master (1419x) - 57725: 338, // max_minutes (1419x) - 57733: 339, // merge (1419x) - 57742: 340, // national (1419x) - 57743: 341, // ncharType (1419x) - 57746: 342, // nextval (1419x) - 57754: 343, // none (1419x) - 57756: 344, // nvarcharType (1419x) - 57763: 345, // open (1419x) - 58001: 346, // optimistic (1419x) - 57943: 347, // optRuleBlacklist (1419x) - 57767: 348, // parser (1419x) - 57768: 349, // partial (1419x) - 57769: 350, // partitioning (1419x) - 57774: 351, // per_table (1419x) - 57772: 352, // percent (1419x) - 58002: 353, // pessimistic (1419x) - 57781: 354, // preserve (1419x) - 57785: 355, // profile (1419x) - 57786: 356, // profiles (1419x) - 57790: 357, // queries (1419x) - 57949: 358, // recent (1419x) - 58021: 359, // region (1419x) - 57950: 360, // replayer (1419x) - 57802: 361, // replica (1419x) - 58019: 362, // reset (1419x) - 57809: 363, // restores (1419x) - 57823: 364, // security (1419x) - 57828: 365, // serializable (1419x) - 57836: 366, // simple (1419x) - 57839: 367, // slave (1419x) - 58009: 368, // statsBuckets (1419x) - 58010: 369, // statsHealthy (1419x) - 58008: 370, // statsHistograms (1419x) - 58007: 371, // statsMeta (1419x) - 58011: 372, // statsTopN (1419x) - 57960: 373, // strict (1419x) - 57867: 374, // switchesSym (1419x) - 57868: 375, // system (1419x) - 57869: 376, // systemTime (1419x) - 58013: 377, // telemetryID (1419x) - 57874: 378, // temptable (1419x) - 57875: 379, // textType (1419x) - 57876: 380, // than (1419x) - 58015: 381, // tiFlash (1419x) - 57967: 382, // tls (1419x) - 57976: 383, // top (1419x) - 57882: 384, // traditional (1419x) - 57883: 385, // transaction (1419x) - 57884: 386, // triggers (1419x) - 57887: 387, // uncommitted (1419x) - 57888: 388, // undefined (1419x) - 57981: 389, // verboseType (1419x) - 57982: 390, // voter (1419x) - 57897: 391, // warnings (1419x) - 58018: 392, // width (1419x) - 57901: 393, // x509 (1419x) - 57904: 394, // addDate (1418x) - 57581: 395, // any (1418x) - 57905: 396, // approxCountDistinct (1418x) - 57906: 397, // approxPercentile (1418x) - 57588: 398, // avg (1418x) - 57907: 399, // bitAnd (1418x) - 57908: 400, // bitOr (1418x) - 57909: 401, // bitXor (1418x) - 57910: 402, // bound (1418x) - 57912: 403, // cast (1418x) - 57915: 404, // curTime (1418x) - 57916: 405, // dateAdd (1418x) - 57917: 406, // dateSub (1418x) - 57665: 407, // escape (1418x) - 57666: 408, // event (1418x) - 57920: 409, // exact (1418x) - 57670: 410, // exclusive (1418x) - 57922: 411, // extract (1418x) - 57677: 412, // file (1418x) - 57927: 413, // getFormat (1418x) - 57928: 414, // groupConcat (1418x) - 57933: 415, // jsonArrayagg (1418x) - 57934: 416, // jsonObjectAgg (1418x) - 57715: 417, // lastval (1418x) - 57941: 418, // max (1418x) - 57940: 419, // min (1418x) - 57741: 420, // names (1418x) - 57942: 421, // now (1418x) - 57946: 422, // position (1418x) - 57783: 423, // process (1418x) - 57787: 424, // proxy (1418x) - 57792: 425, // quick (1418x) - 57804: 426, // replication (1418x) - 57811: 427, // reverse (1418x) - 57815: 428, // rowCount (1418x) - 57830: 429, // setval (1418x) - 57833: 430, // shared (1418x) - 57842: 431, // some (1418x) - 57844: 432, // sqlBufferResult (1418x) - 57845: 433, // sqlCache (1418x) - 57846: 434, // sqlNoCache (1418x) - 57954: 435, // staleness (1418x) - 57955: 436, // std (1418x) - 57956: 437, // stddev (1418x) - 57957: 438, // stddevPop (1418x) - 57958: 439, // stddevSamp (1418x) - 57961: 440, // strong (1418x) - 57962: 441, // subDate (1418x) - 57964: 442, // substring (1418x) - 57963: 443, // sum (1418x) - 57865: 444, // super (1418x) - 58012: 445, // telemetry (1418x) - 57965: 446, // timestampAdd (1418x) - 57966: 447, // timestampDiff (1418x) - 57977: 448, // trim (1418x) - 57978: 449, // variance (1418x) - 57979: 450, // varPop (1418x) - 57980: 451, // varSamp (1418x) - 57899: 452, // weightString (1418x) - 57488: 453, // on (1358x) - 40: 454, // '(' (1270x) - 57568: 455, // with (1172x) - 57349: 456, // stringLit (1158x) - 58069: 457, // not2 (1150x) - 57481: 458, // not (1095x) - 57398: 459, // defaultKwd (1074x) - 57364: 460, // as (1072x) - 57547: 461, // union (1037x) - 57379: 462, // collate (1025x) - 57553: 463, // using (1025x) - 57461: 464, // left (1012x) - 57515: 465, // right (1012x) - 45: 466, // '-' (981x) - 43: 467, // '+' (980x) - 57480: 468, // mod (961x) - 57496: 469, // partition (945x) - 57435: 470, // ignore (928x) - 57415: 471, // except (925x) - 57441: 472, // intersect (924x) - 57485: 473, // null (907x) - 57420: 474, // forKwd (898x) - 57463: 475, // limit (898x) - 57443: 476, // into (895x) - 57469: 477, // lock (891x) - 58058: 478, // eq (888x) - 57423: 479, // from (882x) - 57417: 480, // fetch (881x) - 57557: 481, // values (880x) - 57565: 482, // where (879x) - 57421: 483, // force (878x) - 57493: 484, // order (877x) - 57377: 485, // charType (875x) - 57363: 486, // and (863x) - 57511: 487, // replace (854x) - 58053: 488, // intLit (846x) - 57492: 489, // or (840x) - 57354: 490, // andand (839x) - 57775: 491, // pipesAsOr (839x) - 57569: 492, // xor (839x) - 57522: 493, // set (834x) - 57427: 494, // group (811x) - 57533: 495, // straightJoin (807x) - 57567: 496, // window (799x) - 57429: 497, // having (797x) - 57453: 498, // join (795x) - 57572: 499, // natural (785x) - 57384: 500, // cross (784x) - 57439: 501, // inner (784x) - 57462: 502, // like (782x) - 125: 503, // '}' (781x) - 42: 504, // '*' (776x) - 57518: 505, // rows (769x) - 57552: 506, // use (765x) - 57535: 507, // tableSample (759x) - 57501: 508, // rangeKwd (758x) - 57428: 509, // groups (757x) - 57402: 510, // desc (756x) - 57365: 511, // asc (754x) - 57393: 512, // dayHour (752x) - 57394: 513, // dayMicrosecond (752x) - 57395: 514, // dayMinute (752x) - 57396: 515, // daySecond (752x) - 57431: 516, // hourMicrosecond (752x) - 57432: 517, // hourMinute (752x) - 57433: 518, // hourSecond (752x) - 57478: 519, // minuteMicrosecond (752x) - 57479: 520, // minuteSecond (752x) - 57520: 521, // secondMicrosecond (752x) - 57570: 522, // yearMonth (752x) - 57564: 523, // when (751x) - 57368: 524, // binaryType (750x) - 57436: 525, // in (749x) - 57410: 526, // elseKwd (748x) - 57538: 527, // then (745x) - 60: 528, // '<' (738x) - 62: 529, // '>' (738x) - 58059: 530, // ge (738x) - 57445: 531, // is (738x) - 58060: 532, // le (738x) - 58064: 533, // neq (738x) - 58065: 534, // neqSynonym (738x) - 58066: 535, // nulleq (738x) - 57366: 536, // between (736x) - 47: 537, // '/' (735x) - 37: 538, // '%' (734x) - 38: 539, // '&' (734x) - 94: 540, // '^' (734x) - 124: 541, // '|' (734x) - 57406: 542, // div (734x) - 58063: 543, // lsh (734x) - 58068: 544, // rsh (734x) - 57507: 545, // regexpKwd (728x) - 57516: 546, // rlike (728x) - 57434: 547, // ifKwd (725x) - 57350: 548, // singleAtIdentifier (707x) - 57446: 549, // insert (705x) - 57534: 550, // tableKwd (704x) - 57389: 551, // currentUser (703x) - 57416: 552, // falseKwd (701x) - 57545: 553, // trueKwd (701x) - 57517: 554, // row (694x) - 58054: 555, // hexLit (693x) - 57454: 556, // key (693x) - 58067: 557, // paramMarker (693x) - 123: 558, // '{' (691x) - 58055: 559, // bitLit (691x) - 58052: 560, // decLit (690x) - 58051: 561, // floatLit (690x) - 57442: 562, // interval (690x) - 57391: 563, // database (686x) - 57413: 564, // exists (686x) - 57355: 565, // pipes (686x) - 57378: 566, // check (683x) - 57382: 567, // convert (683x) - 57499: 568, // primary (683x) - 57351: 569, // doubleAtIdentifier (682x) - 58038: 570, // builtinNow (681x) - 57388: 571, // currentTs (681x) - 57467: 572, // localTime (681x) - 57468: 573, // localTs (681x) - 57348: 574, // underscoreCS (681x) - 33: 575, // '!' (679x) - 126: 576, // '~' (679x) - 58022: 577, // builtinAddDate (679x) - 58028: 578, // builtinApproxCountDistinct (679x) - 58029: 579, // builtinApproxPercentile (679x) - 58023: 580, // builtinBitAnd (679x) - 58024: 581, // builtinBitOr (679x) - 58025: 582, // builtinBitXor (679x) - 58026: 583, // builtinCast (679x) - 58027: 584, // builtinCount (679x) - 58030: 585, // builtinCurDate (679x) - 58031: 586, // builtinCurTime (679x) - 58032: 587, // builtinDateAdd (679x) - 58033: 588, // builtinDateSub (679x) - 58034: 589, // builtinExtract (679x) - 58035: 590, // builtinGroupConcat (679x) - 58036: 591, // builtinMax (679x) - 58037: 592, // builtinMin (679x) - 58039: 593, // builtinPosition (679x) - 58044: 594, // builtinStddevPop (679x) - 58045: 595, // builtinStddevSamp (679x) - 58040: 596, // builtinSubDate (679x) - 58041: 597, // builtinSubstring (679x) - 58042: 598, // builtinSum (679x) - 58043: 599, // builtinSysDate (679x) - 58046: 600, // builtinTranslate (679x) - 58047: 601, // builtinTrim (679x) - 58048: 602, // builtinUser (679x) - 58049: 603, // builtinVarPop (679x) - 58050: 604, // builtinVarSamp (679x) - 57374: 605, // caseKwd (679x) - 57385: 606, // cumeDist (679x) - 57386: 607, // currentDate (679x) - 57390: 608, // currentRole (679x) - 57387: 609, // currentTime (679x) - 57401: 610, // denseRank (679x) - 57418: 611, // firstValue (679x) - 57457: 612, // lag (679x) - 57458: 613, // lastValue (679x) - 57459: 614, // lead (679x) - 57483: 615, // nthValue (679x) - 57484: 616, // ntile (679x) - 57497: 617, // percentRank (679x) - 57502: 618, // rank (679x) - 57510: 619, // repeat (679x) - 57519: 620, // rowNumber (679x) - 57554: 621, // utcDate (679x) - 57556: 622, // utcTime (679x) - 57555: 623, // utcTimestamp (679x) - 57546: 624, // unique (676x) - 57381: 625, // constraint (674x) - 57506: 626, // references (671x) - 57425: 627, // generated (667x) - 57521: 628, // selectKwd (661x) - 57376: 629, // character (649x) - 57437: 630, // index (631x) - 57473: 631, // match (629x) - 57542: 632, // to (548x) - 46: 633, // '.' (526x) - 57362: 634, // analyze (510x) - 57550: 635, // update (496x) - 58061: 636, // jss (494x) - 58062: 637, // juss (494x) - 57474: 638, // maxValue (492x) - 57464: 639, // lines (485x) - 58314: 640, // Identifier (484x) - 58389: 641, // NotKeywordToken (484x) - 58616: 642, // TiDBKeyword (484x) - 58626: 643, // UnReservedKeyword (484x) - 57371: 644, // by (482x) - 58057: 645, // assignmentEq (480x) - 57361: 646, // alter (478x) - 57512: 647, // require (477x) - 64: 648, // '@' (472x) - 57526: 649, // sql (469x) - 57408: 650, // drop (468x) - 57373: 651, // cascade (465x) - 57503: 652, // read (465x) - 57513: 653, // restrict (465x) - 57347: 654, // asof (463x) - 57383: 655, // create (461x) - 57422: 656, // foreign (461x) - 57424: 657, // fulltext (461x) - 57560: 658, // varcharacter (459x) - 57559: 659, // varcharType (459x) - 57359: 660, // add (458x) - 57375: 661, // change (458x) - 57397: 662, // decimalType (458x) - 57407: 663, // doubleType (458x) - 57419: 664, // floatType (458x) - 57440: 665, // integerType (458x) - 57447: 666, // intType (458x) - 57504: 667, // realType (458x) - 57509: 668, // rename (458x) - 57566: 669, // write (458x) - 57561: 670, // varbinaryType (457x) - 57367: 671, // bigIntType (456x) - 57369: 672, // blobType (456x) - 57448: 673, // int1Type (456x) - 57449: 674, // int2Type (456x) - 57450: 675, // int3Type (456x) - 57451: 676, // int4Type (456x) - 57452: 677, // int8Type (456x) - 57558: 678, // long (456x) - 57470: 679, // longblobType (456x) - 57471: 680, // longtextType (456x) - 57475: 681, // mediumblobType (456x) - 57476: 682, // mediumIntType (456x) - 57477: 683, // mediumtextType (456x) - 57486: 684, // numericType (456x) - 57489: 685, // optimize (456x) - 57524: 686, // smallIntType (456x) - 57539: 687, // tinyblobType (456x) - 57540: 688, // tinyIntType (456x) - 57541: 689, // tinytextType (456x) - 58581: 690, // SubSelect (207x) - 58635: 691, // UserVariable (171x) - 58558: 692, // SimpleIdent (170x) - 58366: 693, // Literal (168x) - 58571: 694, // StringLiteral (168x) - 58387: 695, // NextValueForSequence (167x) - 58291: 696, // FunctionCallGeneric (166x) - 58292: 697, // FunctionCallKeyword (166x) - 58293: 698, // FunctionCallNonKeyword (166x) - 58294: 699, // FunctionNameConflict (166x) - 58295: 700, // FunctionNameDateArith (166x) - 58296: 701, // FunctionNameDateArithMultiForms (166x) - 58297: 702, // FunctionNameDatetimePrecision (166x) - 58298: 703, // FunctionNameOptionalBraces (166x) - 58299: 704, // FunctionNameSequence (166x) - 58557: 705, // SimpleExpr (166x) - 58582: 706, // SumExpr (166x) - 58584: 707, // SystemVariable (166x) - 58646: 708, // Variable (166x) - 58669: 709, // WindowFuncCall (166x) - 58143: 710, // BitExpr (153x) - 58467: 711, // PredicateExpr (130x) - 58146: 712, // BoolPri (127x) - 58258: 713, // Expression (127x) - 58684: 714, // logAnd (97x) - 58685: 715, // logOr (97x) - 58385: 716, // NUM (95x) - 58248: 717, // EqOpt (80x) - 57360: 718, // all (75x) - 58594: 719, // TableName (75x) - 58572: 720, // StringName (56x) - 57549: 721, // unsigned (47x) - 57495: 722, // over (45x) - 57571: 723, // zerofill (45x) - 58168: 724, // ColumnName (44x) - 58357: 725, // LengthNum (39x) - 57400: 726, // deleteKwd (38x) - 57404: 727, // distinct (36x) - 57405: 728, // distinctRow (36x) - 58674: 729, // WindowingClause (35x) - 57399: 730, // delayed (33x) - 57430: 731, // highPriority (33x) - 57472: 732, // lowPriority (33x) - 58513: 733, // SelectStmt (28x) - 58514: 734, // SelectStmtBasic (28x) - 58516: 735, // SelectStmtFromDualTable (28x) - 58517: 736, // SelectStmtFromTable (28x) - 58533: 737, // SetOprClause (28x) - 57353: 738, // hintComment (27x) - 58534: 739, // SetOprClauseList (27x) - 58537: 740, // SetOprStmtWithLimitOrderBy (27x) - 58538: 741, // SetOprStmtWoutLimitOrderBy (27x) - 58269: 742, // FieldLen (26x) - 58346: 743, // Int64Num (26x) - 58427: 744, // OptWindowingClause (24x) - 58526: 745, // SelectStmtWithClause (24x) - 58536: 746, // SetOprStmt (24x) - 58675: 747, // WithClause (24x) - 58432: 748, // OrderBy (23x) - 58520: 749, // SelectStmtLimit (23x) - 57527: 750, // sqlBigResult (23x) - 57528: 751, // sqlCalcFoundRows (23x) - 57529: 752, // sqlSmallResult (23x) - 58225: 753, // DirectPlacementOption (21x) - 58156: 754, // CharsetKw (20x) - 58637: 755, // Username (20x) - 58259: 756, // ExpressionList (17x) - 58458: 757, // PlacementPolicyOption (17x) - 58315: 758, // IfExists (16x) - 58456: 759, // PlacementOption (16x) - 57537: 760, // terminated (16x) - 58629: 761, // UpdateStmtNoWith (16x) - 58224: 762, // DeleteWithoutUsingStmt (15x) - 58226: 763, // DistinctKwd (15x) - 58316: 764, // IfNotExists (15x) - 58412: 765, // OptFieldLen (15x) - 58169: 766, // ColumnNameList (14x) - 58227: 767, // DistinctOpt (14x) - 57411: 768, // enclosed (14x) - 58343: 769, // InsertIntoStmt (14x) - 58443: 770, // PartitionNameList (14x) - 58488: 771, // ReplaceIntoStmt (14x) - 58628: 772, // UpdateStmt (14x) - 58659: 773, // WhereClause (14x) - 58660: 774, // WhereClauseOptional (14x) - 58219: 775, // DefaultKwdOpt (13x) - 57412: 776, // escaped (13x) - 57491: 777, // optionally (13x) - 58595: 778, // TableNameList (13x) - 58351: 779, // JoinTable (12x) - 58406: 780, // OptBinary (12x) - 58504: 781, // RolenameComposed (12x) - 58591: 782, // TableFactor (12x) - 58604: 783, // TableRef (12x) - 58118: 784, // AnalyzeOptionListOpt (11x) - 58223: 785, // DeleteWithUsingStmt (11x) - 58257: 786, // ExprOrDefault (11x) - 58286: 787, // FromOrIn (11x) - 58618: 788, // TimestampUnit (11x) - 58157: 789, // CharsetName (10x) - 58222: 790, // DeleteFromStmt (10x) - 58390: 791, // NotSym (10x) - 58433: 792, // OrderByOptional (10x) - 58435: 793, // PartDefOption (10x) - 58556: 794, // SignedNum (10x) - 58149: 795, // BuggyDefaultFalseDistinctOpt (9x) - 58209: 796, // DBName (9x) - 58218: 797, // DefaultFalseDistinctOpt (9x) - 58352: 798, // JoinType (9x) - 57482: 799, // noWriteToBinLog (9x) - 58503: 800, // Rolename (9x) - 58498: 801, // RoleNameString (9x) - 58114: 802, // AlterTableStmt (8x) - 58208: 803, // CrossOpt (8x) - 58249: 804, // EqOrAssignmentEq (8x) - 58260: 805, // ExpressionListOpt (8x) - 58337: 806, // IndexPartSpecification (8x) - 58353: 807, // KeyOrIndex (8x) - 57466: 808, // load (8x) - 58521: 809, // SelectStmtLimitOpt (8x) - 58617: 810, // TimeUnit (8x) - 58649: 811, // VariableName (8x) - 58100: 812, // AllOrPartitionNameList (7x) - 58192: 813, // ConstraintKeywordOpt (7x) - 58275: 814, // FieldsOrColumns (7x) - 58284: 815, // ForceOpt (7x) - 58338: 816, // IndexPartSpecificationList (7x) - 58388: 817, // NoWriteToBinLogAliasOpt (7x) - 58471: 818, // Priority (7x) - 58508: 819, // RowFormat (7x) - 58511: 820, // RowValue (7x) - 58542: 821, // ShowDatabaseNameOpt (7x) - 58601: 822, // TableOption (7x) - 57562: 823, // varying (7x) - 57380: 824, // column (6x) - 58163: 825, // ColumnDef (6x) - 58211: 826, // DatabaseOption (6x) - 58214: 827, // DatabaseSym (6x) - 58251: 828, // EscapedTableRef (6x) - 58256: 829, // ExplainableStmt (6x) - 58273: 830, // FieldTerminator (6x) - 57426: 831, // grant (6x) - 58320: 832, // IgnoreOptional (6x) - 58329: 833, // IndexInvisible (6x) - 58334: 834, // IndexNameList (6x) - 58340: 835, // IndexType (6x) - 58395: 836, // NumLiteral (6x) - 58444: 837, // PartitionNameListOpt (6x) - 57508: 838, // release (6x) - 58505: 839, // RolenameList (6x) - 58531: 840, // SetExpr (6x) - 57523: 841, // show (6x) - 58599: 842, // TableOptimizerHints (6x) - 58638: 843, // UsernameList (6x) - 58676: 844, // WithClustered (6x) - 58099: 845, // AlgorithmClause (5x) - 58150: 846, // ByItem (5x) - 58162: 847, // CollationName (5x) - 58166: 848, // ColumnKeywordOpt (5x) - 58271: 849, // FieldOpt (5x) - 58272: 850, // FieldOpts (5x) - 58332: 851, // IndexName (5x) - 58335: 852, // IndexOption (5x) - 58336: 853, // IndexOptionList (5x) - 57438: 854, // infile (5x) - 58362: 855, // LimitOption (5x) - 58374: 856, // LockClause (5x) - 58408: 857, // OptCharsetWithOptBinary (5x) - 58419: 858, // OptNullTreatment (5x) - 58459: 859, // PlacementRole (5x) - 58464: 860, // PolicyName (5x) - 58472: 861, // PriorityOpt (5x) - 58512: 862, // SelectLockOpt (5x) - 58519: 863, // SelectStmtIntoOption (5x) - 58605: 864, // TableRefs (5x) - 58631: 865, // UserSpec (5x) - 58124: 866, // Assignment (4x) - 58130: 867, // AuthString (4x) - 58139: 868, // BeginTransactionStmt (4x) - 58141: 869, // BindableStmt (4x) - 58131: 870, // BRIEBooleanOptionName (4x) - 58132: 871, // BRIEIntegerOptionName (4x) - 58133: 872, // BRIEKeywordOptionName (4x) - 58134: 873, // BRIEOption (4x) - 58135: 874, // BRIEOptions (4x) - 58137: 875, // BRIEStringOptionName (4x) - 58151: 876, // ByList (4x) - 58155: 877, // Char (4x) - 58182: 878, // CommitStmt (4x) - 58186: 879, // ConfigItemName (4x) - 58190: 880, // Constraint (4x) - 58280: 881, // FloatOpt (4x) - 58341: 882, // IndexTypeName (4x) - 58370: 883, // LoadDataStmt (4x) - 57490: 884, // option (4x) - 58424: 885, // OptWild (4x) - 57494: 886, // outer (4x) - 58454: 887, // PlacementCount (4x) - 58455: 888, // PlacementLabelConstraints (4x) - 58460: 889, // PlacementSpec (4x) - 58465: 890, // Precision (4x) - 58480: 891, // ReferDef (4x) - 58494: 892, // RestrictOrCascadeOpt (4x) - 58507: 893, // RollbackStmt (4x) - 58510: 894, // RowStmt (4x) - 58527: 895, // SequenceOption (4x) - 58541: 896, // SetStmt (4x) - 57532: 897, // statsExtended (4x) - 58586: 898, // TableAsName (4x) - 58587: 899, // TableAsNameOpt (4x) - 58598: 900, // TableNameOptWild (4x) - 58600: 901, // TableOptimizerHintsOpt (4x) - 58602: 902, // TableOptionList (4x) - 58621: 903, // TransactionChar (4x) - 58632: 904, // UserSpecList (4x) - 58670: 905, // WindowName (4x) - 58121: 906, // AsOfClause (3x) - 58125: 907, // AssignmentList (3x) - 58127: 908, // AttributesOpt (3x) - 58147: 909, // Boolean (3x) - 58175: 910, // ColumnOption (3x) - 58178: 911, // ColumnPosition (3x) - 58183: 912, // CommonTableExpr (3x) - 58204: 913, // CreateTableStmt (3x) - 58212: 914, // DatabaseOptionList (3x) - 58220: 915, // DefaultTrueDistinctOpt (3x) - 58245: 916, // EnforcedOrNot (3x) - 57414: 917, // explain (3x) - 58262: 918, // ExtendedPriv (3x) - 58300: 919, // GeneratedAlways (3x) - 58302: 920, // GlobalScope (3x) - 58306: 921, // GroupByClause (3x) - 58324: 922, // IndexHint (3x) - 58328: 923, // IndexHintType (3x) - 58333: 924, // IndexNameAndTypeOpt (3x) - 57455: 925, // keys (3x) - 58364: 926, // Lines (3x) - 58382: 927, // MaxValueOrExpression (3x) - 58420: 928, // OptOrder (3x) - 58423: 929, // OptTemporary (3x) - 58436: 930, // PartDefOptionList (3x) - 58438: 931, // PartitionDefinition (3x) - 58447: 932, // PasswordExpire (3x) - 58449: 933, // PasswordOrLockOption (3x) - 58461: 934, // PlacementSpecList (3x) - 58463: 935, // PluginNameList (3x) - 58470: 936, // PrimaryOpt (3x) - 58473: 937, // PrivElem (3x) - 58475: 938, // PrivType (3x) - 57500: 939, // procedure (3x) - 58489: 940, // RequireClause (3x) - 58490: 941, // RequireClauseOpt (3x) - 58492: 942, // RequireListElement (3x) - 58506: 943, // RolenameWithoutIdent (3x) - 58499: 944, // RoleOrPrivElem (3x) - 58518: 945, // SelectStmtGroup (3x) - 58535: 946, // SetOprOpt (3x) - 58585: 947, // TableAliasRefList (3x) - 58588: 948, // TableElement (3x) - 58597: 949, // TableNameListOpt2 (3x) - 58613: 950, // TextString (3x) - 58622: 951, // TransactionChars (3x) - 57544: 952, // trigger (3x) - 57548: 953, // unlock (3x) - 57551: 954, // usage (3x) - 58642: 955, // ValuesList (3x) - 58644: 956, // ValuesStmtList (3x) - 58640: 957, // ValueSym (3x) - 58647: 958, // VariableAssignment (3x) - 58667: 959, // WindowFrameStart (3x) - 58098: 960, // AdminStmt (2x) - 58101: 961, // AlterDatabaseStmt (2x) - 58102: 962, // AlterImportStmt (2x) - 58103: 963, // AlterInstanceStmt (2x) - 58104: 964, // AlterOrderItem (2x) - 58106: 965, // AlterPolicyStmt (2x) - 58107: 966, // AlterSequenceOption (2x) - 58109: 967, // AlterSequenceStmt (2x) - 58111: 968, // AlterTableSpec (2x) - 58115: 969, // AlterUserStmt (2x) - 58116: 970, // AnalyzeOption (2x) - 58119: 971, // AnalyzeTableStmt (2x) - 58142: 972, // BinlogStmt (2x) - 58136: 973, // BRIEStmt (2x) - 58138: 974, // BRIETables (2x) - 57372: 975, // call (2x) - 58152: 976, // CallStmt (2x) - 58153: 977, // CastType (2x) - 58154: 978, // ChangeStmt (2x) - 58160: 979, // CheckConstraintKeyword (2x) - 58170: 980, // ColumnNameListOpt (2x) - 58173: 981, // ColumnNameOrUserVariable (2x) - 58176: 982, // ColumnOptionList (2x) - 58177: 983, // ColumnOptionListOpt (2x) - 58179: 984, // ColumnSetValue (2x) - 58185: 985, // CompletionTypeWithinTransaction (2x) - 58187: 986, // ConnectionOption (2x) - 58189: 987, // ConnectionOptions (2x) - 58193: 988, // CreateBindingStmt (2x) - 58194: 989, // CreateDatabaseStmt (2x) - 58195: 990, // CreateImportStmt (2x) - 58196: 991, // CreateIndexStmt (2x) - 58197: 992, // CreatePolicyStmt (2x) - 58198: 993, // CreateRoleStmt (2x) - 58200: 994, // CreateSequenceStmt (2x) - 58201: 995, // CreateStatisticsStmt (2x) - 58202: 996, // CreateTableOptionListOpt (2x) - 58205: 997, // CreateUserStmt (2x) - 58207: 998, // CreateViewStmt (2x) - 57392: 999, // databases (2x) - 58216: 1000, // DeallocateStmt (2x) - 58217: 1001, // DeallocateSym (2x) - 57403: 1002, // describe (2x) - 58228: 1003, // DoStmt (2x) - 58229: 1004, // DropBindingStmt (2x) - 58230: 1005, // DropDatabaseStmt (2x) - 58231: 1006, // DropImportStmt (2x) - 58232: 1007, // DropIndexStmt (2x) - 58233: 1008, // DropPolicyStmt (2x) - 58234: 1009, // DropRoleStmt (2x) - 58235: 1010, // DropSequenceStmt (2x) - 58236: 1011, // DropStatisticsStmt (2x) - 58237: 1012, // DropStatsStmt (2x) - 58238: 1013, // DropTableStmt (2x) - 58239: 1014, // DropUserStmt (2x) - 58240: 1015, // DropViewStmt (2x) - 58241: 1016, // DuplicateOpt (2x) - 58243: 1017, // EmptyStmt (2x) - 58244: 1018, // EncryptionOpt (2x) - 58246: 1019, // EnforcedOrNotOpt (2x) - 58250: 1020, // ErrorHandling (2x) - 58252: 1021, // ExecuteStmt (2x) - 58254: 1022, // ExplainStmt (2x) - 58255: 1023, // ExplainSym (2x) - 58264: 1024, // Field (2x) - 58267: 1025, // FieldItem (2x) - 58274: 1026, // Fields (2x) - 58278: 1027, // FlashbackTableStmt (2x) - 58283: 1028, // FlushStmt (2x) - 58289: 1029, // FuncDatetimePrecList (2x) - 58290: 1030, // FuncDatetimePrecListOpt (2x) - 58303: 1031, // GrantProxyStmt (2x) - 58304: 1032, // GrantRoleStmt (2x) - 58305: 1033, // GrantStmt (2x) - 58307: 1034, // HandleRange (2x) - 58309: 1035, // HashString (2x) - 58311: 1036, // HelpStmt (2x) - 58323: 1037, // IndexAdviseStmt (2x) - 58325: 1038, // IndexHintList (2x) - 58326: 1039, // IndexHintListOpt (2x) - 58331: 1040, // IndexLockAndAlgorithmOpt (2x) - 58344: 1041, // InsertValues (2x) - 58348: 1042, // IntoOpt (2x) - 58354: 1043, // KeyOrIndexOpt (2x) - 57456: 1044, // kill (2x) - 58355: 1045, // KillOrKillTiDB (2x) - 58356: 1046, // KillStmt (2x) - 58361: 1047, // LimitClause (2x) - 57465: 1048, // linear (2x) - 58363: 1049, // LinearOpt (2x) - 58367: 1050, // LoadDataSetItem (2x) - 58371: 1051, // LoadStatsStmt (2x) - 58372: 1052, // LocalOpt (2x) - 58375: 1053, // LockTablesStmt (2x) - 58383: 1054, // MaxValueOrExpressionList (2x) - 58391: 1055, // NowSym (2x) - 58392: 1056, // NowSymFunc (2x) - 58393: 1057, // NowSymOptionFraction (2x) - 58394: 1058, // NumList (2x) - 58397: 1059, // ObjectType (2x) - 57487: 1060, // of (2x) - 58398: 1061, // OfTablesOpt (2x) - 58399: 1062, // OldPlacementOptions (2x) - 58400: 1063, // OnCommitOpt (2x) - 58401: 1064, // OnDelete (2x) - 58404: 1065, // OnUpdate (2x) - 58409: 1066, // OptCollate (2x) - 58414: 1067, // OptFull (2x) - 58416: 1068, // OptInteger (2x) - 58429: 1069, // OptionalBraces (2x) - 58428: 1070, // OptionLevel (2x) - 58418: 1071, // OptLeadLagInfo (2x) - 58417: 1072, // OptLLDefault (2x) - 58434: 1073, // OuterOpt (2x) - 58439: 1074, // PartitionDefinitionList (2x) - 58440: 1075, // PartitionDefinitionListOpt (2x) - 58446: 1076, // PartitionOpt (2x) - 58448: 1077, // PasswordOpt (2x) - 58450: 1078, // PasswordOrLockOptionList (2x) - 58451: 1079, // PasswordOrLockOptions (2x) - 58457: 1080, // PlacementOptionList (2x) - 58462: 1081, // PlanReplayerStmt (2x) - 58466: 1082, // PredicateColumnsOpt (2x) - 58469: 1083, // PreparedStmt (2x) - 58474: 1084, // PrivLevel (2x) - 58477: 1085, // PurgeImportStmt (2x) - 58478: 1086, // QuickOptional (2x) - 58479: 1087, // RecoverTableStmt (2x) - 58481: 1088, // ReferOpt (2x) - 58483: 1089, // RegexpSym (2x) - 58484: 1090, // RenameTableStmt (2x) - 58485: 1091, // RenameUserStmt (2x) - 58487: 1092, // RepeatableOpt (2x) - 58493: 1093, // RestartStmt (2x) - 58495: 1094, // ResumeImportStmt (2x) - 57514: 1095, // revoke (2x) - 58496: 1096, // RevokeRoleStmt (2x) - 58497: 1097, // RevokeStmt (2x) - 58500: 1098, // RoleOrPrivElemList (2x) - 58501: 1099, // RoleSpec (2x) - 58522: 1100, // SelectStmtOpt (2x) - 58525: 1101, // SelectStmtSQLCache (2x) - 58529: 1102, // SetDefaultRoleOpt (2x) - 58530: 1103, // SetDefaultRoleStmt (2x) - 58540: 1104, // SetRoleStmt (2x) - 58543: 1105, // ShowImportStmt (2x) - 58548: 1106, // ShowProfileType (2x) - 58551: 1107, // ShowStmt (2x) - 58552: 1108, // ShowTableAliasOpt (2x) - 58554: 1109, // ShutdownStmt (2x) - 58555: 1110, // SignedLiteral (2x) - 58559: 1111, // SplitOption (2x) - 58560: 1112, // SplitRegionStmt (2x) - 58564: 1113, // Statement (2x) - 58566: 1114, // StatsPersistentVal (2x) - 58567: 1115, // StatsType (2x) - 58568: 1116, // StopImportStmt (2x) - 58575: 1117, // SubPartDefinition (2x) - 58578: 1118, // SubPartitionMethod (2x) - 58583: 1119, // Symbol (2x) - 58589: 1120, // TableElementList (2x) - 58592: 1121, // TableLock (2x) - 58596: 1122, // TableNameListOpt (2x) - 58603: 1123, // TableOrTables (2x) - 58612: 1124, // TablesTerminalSym (2x) - 58610: 1125, // TableToTable (2x) - 58614: 1126, // TextStringList (2x) - 58620: 1127, // TraceableStmt (2x) - 58619: 1128, // TraceStmt (2x) - 58624: 1129, // TruncateTableStmt (2x) - 58627: 1130, // UnlockTablesStmt (2x) - 58633: 1131, // UserToUser (2x) - 58630: 1132, // UseStmt (2x) - 58645: 1133, // Varchar (2x) - 58648: 1134, // VariableAssignmentList (2x) - 58657: 1135, // WhenClause (2x) - 58662: 1136, // WindowDefinition (2x) - 58665: 1137, // WindowFrameBound (2x) - 58672: 1138, // WindowSpec (2x) - 58677: 1139, // WithGrantOptionOpt (2x) - 58678: 1140, // WithList (2x) - 58682: 1141, // Writeable (2x) - 58097: 1142, // AdminShowSlow (1x) - 58105: 1143, // AlterOrderList (1x) - 58108: 1144, // AlterSequenceOptionList (1x) - 58110: 1145, // AlterTablePartitionOpt (1x) - 58112: 1146, // AlterTableSpecList (1x) - 58113: 1147, // AlterTableSpecListOpt (1x) - 58117: 1148, // AnalyzeOptionList (1x) - 58120: 1149, // AnyOrAll (1x) - 58122: 1150, // AsOfClauseOpt (1x) - 58123: 1151, // AsOpt (1x) - 58128: 1152, // AuthOption (1x) - 58129: 1153, // AuthPlugin (1x) - 58140: 1154, // BetweenOrNotOp (1x) - 58144: 1155, // BitValueType (1x) - 58145: 1156, // BlobType (1x) - 58148: 1157, // BooleanType (1x) - 57370: 1158, // both (1x) - 58158: 1159, // CharsetNameOrDefault (1x) - 58159: 1160, // CharsetOpt (1x) - 58161: 1161, // ClearPasswordExpireOptions (1x) - 58165: 1162, // ColumnFormat (1x) - 58167: 1163, // ColumnList (1x) - 58174: 1164, // ColumnNameOrUserVariableList (1x) - 58171: 1165, // ColumnNameOrUserVarListOpt (1x) - 58172: 1166, // ColumnNameOrUserVarListOptWithBrackets (1x) - 58180: 1167, // ColumnSetValueList (1x) - 58184: 1168, // CompareOp (1x) - 58188: 1169, // ConnectionOptionList (1x) - 58191: 1170, // ConstraintElem (1x) - 58199: 1171, // CreateSequenceOptionListOpt (1x) - 58203: 1172, // CreateTableSelectOpt (1x) - 58206: 1173, // CreateViewSelectOpt (1x) - 58213: 1174, // DatabaseOptionListOpt (1x) - 58215: 1175, // DateAndTimeType (1x) - 58210: 1176, // DBNameList (1x) - 58221: 1177, // DefaultValueExpr (1x) - 57409: 1178, // dual (1x) - 58242: 1179, // ElseOpt (1x) - 58247: 1180, // EnforcedOrNotOrNotNullOpt (1x) - 58253: 1181, // ExplainFormatType (1x) - 58261: 1182, // ExpressionOpt (1x) - 58263: 1183, // FetchFirstOpt (1x) - 58265: 1184, // FieldAsName (1x) - 58266: 1185, // FieldAsNameOpt (1x) - 58268: 1186, // FieldItemList (1x) - 58270: 1187, // FieldList (1x) - 58276: 1188, // FirstOrNext (1x) - 58277: 1189, // FixedPointType (1x) - 58279: 1190, // FlashbackToNewName (1x) - 58281: 1191, // FloatingPointType (1x) - 58282: 1192, // FlushOption (1x) - 58285: 1193, // FromDual (1x) - 58287: 1194, // FulltextSearchModifierOpt (1x) - 58288: 1195, // FuncDatetimePrec (1x) - 58301: 1196, // GetFormatSelector (1x) - 58308: 1197, // HandleRangeList (1x) - 58310: 1198, // HavingClause (1x) - 58312: 1199, // IdentList (1x) - 58313: 1200, // IdentListWithParenOpt (1x) - 58317: 1201, // IfNotRunning (1x) - 58318: 1202, // IfRunning (1x) - 58319: 1203, // IgnoreLines (1x) - 58321: 1204, // ImportTruncate (1x) - 58327: 1205, // IndexHintScope (1x) - 58330: 1206, // IndexKeyTypeOpt (1x) - 58339: 1207, // IndexPartSpecificationListOpt (1x) - 58342: 1208, // IndexTypeOpt (1x) - 58322: 1209, // InOrNotOp (1x) - 58345: 1210, // InstanceOption (1x) - 58347: 1211, // IntegerType (1x) - 58350: 1212, // IsolationLevel (1x) - 58349: 1213, // IsOrNotOp (1x) - 57460: 1214, // leading (1x) - 58358: 1215, // LikeEscapeOpt (1x) - 58359: 1216, // LikeOrNotOp (1x) - 58360: 1217, // LikeTableWithOrWithoutParen (1x) - 58365: 1218, // LinesTerminated (1x) - 58368: 1219, // LoadDataSetList (1x) - 58369: 1220, // LoadDataSetSpecOpt (1x) - 58373: 1221, // LocationLabelList (1x) - 58376: 1222, // LockType (1x) - 58377: 1223, // LogTypeOpt (1x) - 58378: 1224, // Match (1x) - 58379: 1225, // MatchOpt (1x) - 58380: 1226, // MaxIndexNumOpt (1x) - 58381: 1227, // MaxMinutesOpt (1x) - 58384: 1228, // NChar (1x) - 58396: 1229, // NumericType (1x) - 58386: 1230, // NVarchar (1x) - 58402: 1231, // OnDeleteUpdateOpt (1x) - 58403: 1232, // OnDuplicateKeyUpdate (1x) - 58405: 1233, // OptBinMod (1x) - 58407: 1234, // OptCharset (1x) - 58410: 1235, // OptErrors (1x) - 58411: 1236, // OptExistingWindowName (1x) - 58413: 1237, // OptFromFirstLast (1x) - 58415: 1238, // OptGConcatSeparator (1x) - 58421: 1239, // OptPartitionClause (1x) - 58422: 1240, // OptTable (1x) - 58425: 1241, // OptWindowFrameClause (1x) - 58426: 1242, // OptWindowOrderByClause (1x) - 58431: 1243, // Order (1x) - 58430: 1244, // OrReplace (1x) - 57444: 1245, // outfile (1x) - 58437: 1246, // PartDefValuesOpt (1x) - 58441: 1247, // PartitionKeyAlgorithmOpt (1x) - 58442: 1248, // PartitionMethod (1x) - 58445: 1249, // PartitionNumOpt (1x) - 58452: 1250, // PerDB (1x) - 58453: 1251, // PerTable (1x) - 57498: 1252, // precisionType (1x) - 58468: 1253, // PrepareSQL (1x) - 58476: 1254, // ProcedureCall (1x) - 57505: 1255, // recursive (1x) - 58482: 1256, // RegexpOrNotOp (1x) - 58486: 1257, // ReorganizePartitionRuleOpt (1x) - 58491: 1258, // RequireList (1x) - 58502: 1259, // RoleSpecList (1x) - 58509: 1260, // RowOrRows (1x) - 58515: 1261, // SelectStmtFieldList (1x) - 58523: 1262, // SelectStmtOpts (1x) - 58524: 1263, // SelectStmtOptsList (1x) - 58528: 1264, // SequenceOptionList (1x) - 58532: 1265, // SetOpr (1x) - 58539: 1266, // SetRoleOpt (1x) - 58544: 1267, // ShowIndexKwd (1x) - 58545: 1268, // ShowLikeOrWhereOpt (1x) - 58546: 1269, // ShowPlacementTarget (1x) - 58547: 1270, // ShowProfileArgsOpt (1x) - 58549: 1271, // ShowProfileTypes (1x) - 58550: 1272, // ShowProfileTypesOpt (1x) - 58553: 1273, // ShowTargetFilterable (1x) - 57525: 1274, // spatial (1x) - 58561: 1275, // SplitSyntaxOption (1x) - 57530: 1276, // ssl (1x) - 58562: 1277, // Start (1x) - 58563: 1278, // Starting (1x) - 57531: 1279, // starting (1x) - 58565: 1280, // StatementList (1x) - 58569: 1281, // StorageMedia (1x) - 57536: 1282, // stored (1x) - 58570: 1283, // StringList (1x) - 58573: 1284, // StringNameOrBRIEOptionKeyword (1x) - 58574: 1285, // StringType (1x) - 58576: 1286, // SubPartDefinitionList (1x) - 58577: 1287, // SubPartDefinitionListOpt (1x) - 58579: 1288, // SubPartitionNumOpt (1x) - 58580: 1289, // SubPartitionOpt (1x) - 58590: 1290, // TableElementListOpt (1x) - 58593: 1291, // TableLockList (1x) - 58606: 1292, // TableRefsClause (1x) - 58607: 1293, // TableSampleMethodOpt (1x) - 58608: 1294, // TableSampleOpt (1x) - 58609: 1295, // TableSampleUnitOpt (1x) - 58611: 1296, // TableToTableList (1x) - 58615: 1297, // TextType (1x) - 57543: 1298, // trailing (1x) - 58623: 1299, // TrimDirection (1x) - 58625: 1300, // Type (1x) - 58634: 1301, // UserToUserList (1x) - 58636: 1302, // UserVariableList (1x) - 58639: 1303, // UsingRoles (1x) - 58641: 1304, // Values (1x) - 58643: 1305, // ValuesOpt (1x) - 58650: 1306, // ViewAlgorithm (1x) - 58651: 1307, // ViewCheckOption (1x) - 58652: 1308, // ViewDefiner (1x) - 58653: 1309, // ViewFieldList (1x) - 58654: 1310, // ViewName (1x) - 58655: 1311, // ViewSQLSecurity (1x) - 57563: 1312, // virtual (1x) - 58656: 1313, // VirtualOrStored (1x) - 58658: 1314, // WhenClauseList (1x) - 58661: 1315, // WindowClauseOptional (1x) - 58663: 1316, // WindowDefinitionList (1x) - 58664: 1317, // WindowFrameBetween (1x) - 58666: 1318, // WindowFrameExtent (1x) - 58668: 1319, // WindowFrameUnits (1x) - 58671: 1320, // WindowNameOrSpec (1x) - 58673: 1321, // WindowSpecDetails (1x) - 58679: 1322, // WithReadLockOpt (1x) - 58680: 1323, // WithValidation (1x) - 58681: 1324, // WithValidationOpt (1x) - 58683: 1325, // Year (1x) - 58096: 1326, // $default (0x) - 58056: 1327, // andnot (0x) - 58126: 1328, // AssignmentListOpt (0x) - 58164: 1329, // ColumnDefList (0x) - 58181: 1330, // CommaOpt (0x) - 58080: 1331, // createTableSelect (0x) - 58070: 1332, // empty (0x) - 57345: 1333, // error (0x) - 58095: 1334, // higherThanComma (0x) - 58089: 1335, // higherThanParenthese (0x) - 58078: 1336, // insertValues (0x) - 57352: 1337, // invalid (0x) - 58081: 1338, // lowerThanCharsetKwd (0x) - 58094: 1339, // lowerThanComma (0x) - 58079: 1340, // lowerThanCreateTableSelect (0x) - 58091: 1341, // lowerThanEq (0x) - 58086: 1342, // lowerThanFunction (0x) - 58077: 1343, // lowerThanInsertValues (0x) - 58072: 1344, // lowerThanIntervalKeyword (0x) - 58082: 1345, // lowerThanKey (0x) - 58083: 1346, // lowerThanLocal (0x) - 58093: 1347, // lowerThanNot (0x) - 58090: 1348, // lowerThanOn (0x) - 58088: 1349, // lowerThanParenthese (0x) - 58084: 1350, // lowerThanRemove (0x) - 58071: 1351, // lowerThanSelectOpt (0x) - 58076: 1352, // lowerThanSelectStmt (0x) - 58075: 1353, // lowerThanSetKeyword (0x) - 58074: 1354, // lowerThanStringLitToken (0x) - 58073: 1355, // lowerThanValueKeyword (0x) - 58085: 1356, // lowerThenOrder (0x) - 58092: 1357, // neg (0x) - 57356: 1358, // odbcDateType (0x) - 57358: 1359, // odbcTimestampType (0x) - 57357: 1360, // odbcTimeType (0x) - 58087: 1361, // tableRefPriority (0x) + 57344: 0, // $end (2166x) + 59: 1, // ';' (2165x) + 57802: 2, // remove (1838x) + 57803: 3, // reorganize (1838x) + 57625: 4, // comment (1774x) + 57864: 5, // storage (1750x) + 57589: 6, // autoIncrement (1739x) + 44: 7, // ',' (1647x) + 57682: 8, // first (1625x) + 57576: 9, // after (1623x) + 57831: 10, // serial (1619x) + 57590: 11, // autoRandom (1618x) + 57622: 12, // columnFormat (1618x) + 57613: 13, // charsetKwd (1610x) + 57775: 14, // password (1606x) + 58027: 15, // regions (1602x) + 57948: 16, // placement (1596x) + 57918: 17, // constraints (1595x) + 57929: 18, // followerConstraints (1595x) + 57930: 19, // followers (1595x) + 57940: 20, // leaderConstraints (1595x) + 57942: 21, // learnerConstraints (1595x) + 57943: 22, // learners (1595x) + 57952: 23, // primaryRegion (1595x) + 57957: 24, // schedule (1595x) + 57988: 25, // voterConstraints (1595x) + 57989: 26, // voters (1595x) + 57615: 27, // checksum (1592x) + 57662: 28, // encryption (1575x) + 57714: 29, // keyBlockSize (1574x) + 57876: 30, // tablespace (1571x) + 57665: 31, // engine (1566x) + 57647: 32, // data (1564x) + 57705: 33, // insertMethod (1562x) + 57732: 34, // maxRows (1562x) + 57739: 35, // minRows (1562x) + 57754: 36, // nodegroup (1562x) + 57632: 37, // connection (1554x) + 57591: 38, // autoRandomBase (1551x) + 58015: 39, // statsBuckets (1549x) + 58017: 40, // statsTopN (1549x) + 57588: 41, // autoIdCache (1548x) + 57593: 42, // avgRowLength (1548x) + 57630: 43, // compression (1548x) + 57653: 44, // delayKeyWrite (1548x) + 57769: 45, // packKeys (1548x) + 57782: 46, // preSplitRegions (1548x) + 57820: 47, // rowFormat (1548x) + 57824: 48, // secondaryEngine (1548x) + 57835: 49, // shardRowIDBits (1548x) + 57860: 50, // statsAutoRecalc (1548x) + 57586: 51, // statsColChoice (1548x) + 57587: 52, // statsColList (1548x) + 57861: 53, // statsPersistent (1548x) + 57862: 54, // statsSamplePages (1548x) + 57585: 55, // statsSampleRate (1548x) + 57874: 56, // tableChecksum (1548x) + 41: 57, // ')' (1483x) + 57573: 58, // account (1482x) + 57814: 59, // resume (1472x) + 57839: 60, // signed (1472x) + 57845: 61, // snapshot (1471x) + 57594: 62, // backend (1470x) + 57614: 63, // checkpoint (1470x) + 57631: 64, // concurrency (1470x) + 57637: 65, // csvBackslashEscape (1470x) + 57638: 66, // csvDelimiter (1470x) + 57639: 67, // csvHeader (1470x) + 57640: 68, // csvNotNull (1470x) + 57641: 69, // csvNull (1470x) + 57642: 70, // csvSeparator (1470x) + 57643: 71, // csvTrimLastSeparators (1470x) + 57718: 72, // lastBackup (1470x) + 57764: 73, // onDuplicate (1470x) + 57765: 74, // online (1470x) + 57797: 75, // rateLimit (1470x) + 57828: 76, // sendCredentialsToTiKV (1470x) + 57842: 77, // skipSchemaFiles (1470x) + 57865: 78, // strictFormat (1470x) + 57881: 79, // tikvImporter (1470x) + 57889: 80, // truncate (1467x) + 57751: 81, // no (1466x) + 57859: 82, // start (1464x) + 57608: 83, // cache (1461x) + 57752: 84, // nocache (1460x) + 57646: 85, // cycle (1459x) + 57741: 86, // minValue (1459x) + 57702: 87, // increment (1458x) + 57753: 88, // nocycle (1458x) + 57755: 89, // nomaxvalue (1458x) + 57756: 90, // nominvalue (1458x) + 57811: 91, // restart (1456x) + 57579: 92, // algorithm (1455x) + 57884: 93, // tp (1455x) + 57645: 94, // clustered (1454x) + 57707: 95, // invisible (1454x) + 57757: 96, // nonclustered (1454x) + 57900: 97, // visible (1454x) + 57623: 98, // columns (1446x) + 57899: 99, // view (1446x) + 57867: 100, // subpartition (1442x) + 57582: 101, // ascii (1441x) + 57607: 102, // byteType (1441x) + 57774: 103, // partitions (1441x) + 57893: 104, // unicodeSym (1441x) + 57906: 105, // yearType (1441x) + 57650: 106, // day (1440x) + 57680: 107, // fields (1440x) + 57823: 108, // second (1439x) + 57858: 109, // sqlTsiYear (1439x) + 57875: 110, // tables (1439x) + 57697: 111, // hour (1438x) + 57738: 112, // microsecond (1438x) + 57740: 113, // minute (1438x) + 57744: 114, // month (1438x) + 57793: 115, // quarter (1438x) + 57851: 116, // sqlTsiDay (1438x) + 57852: 117, // sqlTsiHour (1438x) + 57853: 118, // sqlTsiMinute (1438x) + 57854: 119, // sqlTsiMonth (1438x) + 57855: 120, // sqlTsiQuarter (1438x) + 57856: 121, // sqlTsiSecond (1438x) + 57857: 122, // sqlTsiWeek (1438x) + 57902: 123, // week (1438x) + 57829: 124, // separator (1437x) + 57863: 125, // status (1437x) + 57730: 126, // maxConnectionsPerHour (1436x) + 57731: 127, // maxQueriesPerHour (1436x) + 57733: 128, // maxUpdatesPerHour (1436x) + 57734: 129, // maxUserConnections (1436x) + 57783: 130, // preceding (1436x) + 57616: 131, // cipher (1435x) + 57700: 132, // importKwd (1435x) + 57712: 133, // issuer (1435x) + 57822: 134, // san (1435x) + 57866: 135, // subject (1435x) + 57723: 136, // local (1434x) + 57841: 137, // skip (1434x) + 57600: 138, // bindings (1433x) + 57652: 139, // definer (1433x) + 57692: 140, // hash (1433x) + 57698: 141, // identified (1433x) + 57726: 142, // logs (1433x) + 57795: 143, // query (1433x) + 57810: 144, // respect (1433x) + 57626: 145, // commit (1432x) + 57644: 146, // current (1432x) + 57664: 147, // enforced (1432x) + 57685: 148, // following (1432x) + 57759: 149, // nowait (1432x) + 57766: 150, // only (1432x) + 57817: 151, // rollback (1432x) + 57897: 152, // value (1432x) + 57597: 153, // begin (1431x) + 57599: 154, // binding (1431x) + 57663: 155, // end (1431x) + 57933: 156, // next_row_id (1431x) + 57781: 157, // policy (1431x) + 57951: 158, // predicate (1431x) + 57877: 159, // temporary (1431x) + 57890: 160, // unbounded (1431x) + 57895: 161, // user (1431x) + 57690: 162, // global (1430x) + 57346: 163, // identifier (1430x) + 57763: 164, // offset (1430x) + 57784: 165, // prepare (1430x) + 57816: 166, // role (1430x) + 57894: 167, // unknown (1430x) + 57907: 168, // wait (1430x) + 57606: 169, // btree (1429x) + 57648: 170, // datetimeType (1429x) + 57649: 171, // dateType (1429x) + 57683: 172, // fixed (1429x) + 57711: 173, // isolation (1429x) + 57713: 174, // jsonType (1429x) + 57728: 175, // max_idxnum (1429x) + 57736: 176, // memory (1429x) + 57762: 177, // off (1429x) + 57768: 178, // optional (1429x) + 57777: 179, // per_db (1429x) + 57786: 180, // privileges (1429x) + 57809: 181, // required (1429x) + 57821: 182, // rtree (1429x) + 57955: 183, // running (1429x) + 58010: 184, // sampleRate (1429x) + 57830: 185, // sequence (1429x) + 57844: 186, // slow (1429x) + 57883: 187, // timeType (1429x) + 57896: 188, // validation (1429x) + 57898: 189, // variables (1429x) + 57583: 190, // attributes (1428x) + 57655: 191, // disable (1428x) + 57659: 192, // duplicate (1428x) + 57660: 193, // dynamic (1428x) + 57661: 194, // enable (1428x) + 57668: 195, // errorKwd (1428x) + 57684: 196, // flush (1428x) + 57687: 197, // full (1428x) + 57699: 198, // identSQLErrors (1428x) + 57725: 199, // location (1428x) + 57735: 200, // mb (1428x) + 57742: 201, // mode (1428x) + 57748: 202, // never (1428x) + 57949: 203, // plan (1428x) + 57780: 204, // plugins (1428x) + 57788: 205, // processlist (1428x) + 57799: 206, // recover (1428x) + 57804: 207, // repair (1428x) + 57805: 208, // repeatable (1428x) + 57833: 209, // session (1428x) + 58011: 210, // statistics (1428x) + 57868: 211, // subpartitions (1428x) + 58021: 212, // tidb (1428x) + 57882: 213, // timestampType (1428x) + 57904: 214, // without (1428x) + 57990: 215, // admin (1427x) + 57595: 216, // backup (1427x) + 57601: 217, // binlog (1427x) + 57603: 218, // block (1427x) + 57604: 219, // booleanType (1427x) + 57991: 220, // buckets (1427x) + 57994: 221, // cardinality (1427x) + 57612: 222, // chain (1427x) + 57619: 223, // clientErrorsSummary (1427x) + 57995: 224, // cmSketch (1427x) + 57620: 225, // coalesce (1427x) + 57628: 226, // compact (1427x) + 57629: 227, // compressed (1427x) + 57635: 228, // context (1427x) + 57917: 229, // copyKwd (1427x) + 57997: 230, // correlation (1427x) + 57636: 231, // cpu (1427x) + 57651: 232, // deallocate (1427x) + 57999: 233, // dependency (1427x) + 57654: 234, // directory (1427x) + 57656: 235, // discard (1427x) + 57657: 236, // disk (1427x) + 57658: 237, // do (1427x) + 58001: 238, // drainer (1427x) + 57673: 239, // exchange (1427x) + 57675: 240, // execute (1427x) + 57676: 241, // expansion (1427x) + 57927: 242, // flashback (1427x) + 57689: 243, // general (1427x) + 57693: 244, // help (1427x) + 57694: 245, // histogram (1427x) + 57696: 246, // hosts (1427x) + 57934: 247, // inplace (1427x) + 57935: 248, // instant (1427x) + 57710: 249, // ipc (1427x) + 58003: 250, // job (1427x) + 58002: 251, // jobs (1427x) + 57715: 252, // labels (1427x) + 57724: 253, // locked (1427x) + 57743: 254, // modify (1427x) + 57749: 255, // next (1427x) + 58004: 256, // nodeID (1427x) + 58005: 257, // nodeState (1427x) + 57761: 258, // nulls (1427x) + 57770: 259, // pageSym (1427x) + 58008: 260, // pump (1427x) + 57792: 261, // purge (1427x) + 57798: 262, // rebuild (1427x) + 57800: 263, // redundant (1427x) + 57801: 264, // reload (1427x) + 57812: 265, // restore (1427x) + 57818: 266, // routine (1427x) + 57956: 267, // s3 (1427x) + 58009: 268, // samples (1427x) + 57825: 269, // secondaryLoad (1427x) + 57826: 270, // secondaryUnload (1427x) + 57836: 271, // share (1427x) + 57838: 272, // shutdown (1427x) + 57847: 273, // source (1427x) + 58024: 274, // split (1427x) + 58012: 275, // stats (1427x) + 57584: 276, // statsOptions (1427x) + 57963: 277, // stop (1427x) + 57870: 278, // swaps (1427x) + 57973: 279, // tokudbDefault (1427x) + 57974: 280, // tokudbFast (1427x) + 57975: 281, // tokudbLzma (1427x) + 57976: 282, // tokudbQuickLZ (1427x) + 57978: 283, // tokudbSmall (1427x) + 57977: 284, // tokudbSnappy (1427x) + 57979: 285, // tokudbUncompressed (1427x) + 57980: 286, // tokudbZlib (1427x) + 58023: 287, // topn (1427x) + 57885: 288, // trace (1427x) + 57574: 289, // action (1426x) + 57575: 290, // advise (1426x) + 57577: 291, // against (1426x) + 57578: 292, // ago (1426x) + 57580: 293, // always (1426x) + 57596: 294, // backups (1426x) + 57598: 295, // bernoulli (1426x) + 57602: 296, // bitType (1426x) + 57605: 297, // boolType (1426x) + 57915: 298, // briefType (1426x) + 57992: 299, // builtins (1426x) + 57993: 300, // cancel (1426x) + 57609: 301, // capture (1426x) + 57610: 302, // cascaded (1426x) + 57611: 303, // causal (1426x) + 57617: 304, // cleanup (1426x) + 57618: 305, // client (1426x) + 57621: 306, // collation (1426x) + 57996: 307, // columnStatsUsage (1426x) + 57627: 308, // committed (1426x) + 57624: 309, // config (1426x) + 57633: 310, // consistency (1426x) + 57634: 311, // consistent (1426x) + 57998: 312, // ddl (1426x) + 58000: 313, // depth (1426x) + 57922: 314, // dotType (1426x) + 57923: 315, // dump (1426x) + 57666: 316, // engines (1426x) + 57667: 317, // enum (1426x) + 57671: 318, // events (1426x) + 57672: 319, // evolve (1426x) + 57677: 320, // expire (1426x) + 57925: 321, // exprPushdownBlacklist (1426x) + 57678: 322, // extended (1426x) + 57679: 323, // faultsSym (1426x) + 57686: 324, // format (1426x) + 57688: 325, // function (1426x) + 57691: 326, // grants (1426x) + 58018: 327, // histogramsInFlight (1426x) + 57695: 328, // history (1426x) + 57701: 329, // imports (1426x) + 57703: 330, // incremental (1426x) + 57704: 331, // indexes (1426x) + 57706: 332, // instance (1426x) + 57936: 333, // internal (1426x) + 57708: 334, // invoker (1426x) + 57709: 335, // io (1426x) + 57716: 336, // language (1426x) + 57717: 337, // last (1426x) + 57720: 338, // less (1426x) + 57721: 339, // level (1426x) + 57722: 340, // list (1426x) + 57727: 341, // master (1426x) + 57729: 342, // max_minutes (1426x) + 57737: 343, // merge (1426x) + 57746: 344, // national (1426x) + 57747: 345, // ncharType (1426x) + 57750: 346, // nextval (1426x) + 57758: 347, // none (1426x) + 57760: 348, // nvarcharType (1426x) + 57767: 349, // open (1426x) + 58006: 350, // optimistic (1426x) + 57947: 351, // optRuleBlacklist (1426x) + 57771: 352, // parser (1426x) + 57772: 353, // partial (1426x) + 57773: 354, // partitioning (1426x) + 57778: 355, // per_table (1426x) + 57776: 356, // percent (1426x) + 58007: 357, // pessimistic (1426x) + 57785: 358, // preserve (1426x) + 57789: 359, // profile (1426x) + 57790: 360, // profiles (1426x) + 57794: 361, // queries (1426x) + 57953: 362, // recent (1426x) + 58028: 363, // region (1426x) + 57954: 364, // replayer (1426x) + 57806: 365, // replica (1426x) + 58026: 366, // reset (1426x) + 57813: 367, // restores (1426x) + 57827: 368, // security (1426x) + 57832: 369, // serializable (1426x) + 57840: 370, // simple (1426x) + 57843: 371, // slave (1426x) + 58016: 372, // statsHealthy (1426x) + 58014: 373, // statsHistograms (1426x) + 58013: 374, // statsMeta (1426x) + 57964: 375, // strict (1426x) + 57871: 376, // switchesSym (1426x) + 57872: 377, // system (1426x) + 57873: 378, // systemTime (1426x) + 57969: 379, // target (1426x) + 58020: 380, // telemetryID (1426x) + 57878: 381, // temptable (1426x) + 57879: 382, // textType (1426x) + 57880: 383, // than (1426x) + 58022: 384, // tiFlash (1426x) + 57972: 385, // tls (1426x) + 57981: 386, // top (1426x) + 57886: 387, // traditional (1426x) + 57887: 388, // transaction (1426x) + 57888: 389, // triggers (1426x) + 57891: 390, // uncommitted (1426x) + 57892: 391, // undefined (1426x) + 57986: 392, // verboseType (1426x) + 57901: 393, // warnings (1426x) + 58025: 394, // width (1426x) + 57905: 395, // x509 (1426x) + 57908: 396, // addDate (1425x) + 57581: 397, // any (1425x) + 57909: 398, // approxCountDistinct (1425x) + 57910: 399, // approxPercentile (1425x) + 57592: 400, // avg (1425x) + 57911: 401, // bitAnd (1425x) + 57912: 402, // bitOr (1425x) + 57913: 403, // bitXor (1425x) + 57914: 404, // bound (1425x) + 57916: 405, // cast (1425x) + 57919: 406, // curTime (1425x) + 57920: 407, // dateAdd (1425x) + 57921: 408, // dateSub (1425x) + 57669: 409, // escape (1425x) + 57670: 410, // event (1425x) + 57924: 411, // exact (1425x) + 57674: 412, // exclusive (1425x) + 57926: 413, // extract (1425x) + 57681: 414, // file (1425x) + 57928: 415, // follower (1425x) + 57931: 416, // getFormat (1425x) + 57932: 417, // groupConcat (1425x) + 57937: 418, // jsonArrayagg (1425x) + 57938: 419, // jsonObjectAgg (1425x) + 57719: 420, // lastval (1425x) + 57939: 421, // leader (1425x) + 57941: 422, // learner (1425x) + 57945: 423, // max (1425x) + 57944: 424, // min (1425x) + 57745: 425, // names (1425x) + 57946: 426, // now (1425x) + 57950: 427, // position (1425x) + 57787: 428, // process (1425x) + 57791: 429, // proxy (1425x) + 57796: 430, // quick (1425x) + 57807: 431, // replicas (1425x) + 57808: 432, // replication (1425x) + 57815: 433, // reverse (1425x) + 57819: 434, // rowCount (1425x) + 57834: 435, // setval (1425x) + 57837: 436, // shared (1425x) + 57846: 437, // some (1425x) + 57848: 438, // sqlBufferResult (1425x) + 57849: 439, // sqlCache (1425x) + 57850: 440, // sqlNoCache (1425x) + 57958: 441, // staleness (1425x) + 57959: 442, // std (1425x) + 57960: 443, // stddev (1425x) + 57961: 444, // stddevPop (1425x) + 57962: 445, // stddevSamp (1425x) + 57965: 446, // strong (1425x) + 57966: 447, // subDate (1425x) + 57968: 448, // substring (1425x) + 57967: 449, // sum (1425x) + 57869: 450, // super (1425x) + 58019: 451, // telemetry (1425x) + 57970: 452, // timestampAdd (1425x) + 57971: 453, // timestampDiff (1425x) + 57982: 454, // trim (1425x) + 57983: 455, // variance (1425x) + 57984: 456, // varPop (1425x) + 57985: 457, // varSamp (1425x) + 57987: 458, // voter (1425x) + 57903: 459, // weightString (1425x) + 57488: 460, // on (1372x) + 40: 461, // '(' (1288x) + 57568: 462, // with (1188x) + 57349: 463, // stringLit (1172x) + 58076: 464, // not2 (1158x) + 57481: 465, // not (1103x) + 57398: 466, // defaultKwd (1088x) + 57364: 467, // as (1085x) + 57547: 468, // union (1053x) + 57379: 469, // collate (1038x) + 57553: 470, // using (1033x) + 57461: 471, // left (1020x) + 57515: 472, // right (1020x) + 45: 473, // '-' (989x) + 43: 474, // '+' (988x) + 57480: 475, // mod (969x) + 57435: 476, // ignore (944x) + 57496: 477, // partition (940x) + 57415: 478, // except (933x) + 57441: 479, // intersect (932x) + 57485: 480, // null (914x) + 57420: 481, // forKwd (906x) + 57463: 482, // limit (906x) + 57443: 483, // into (903x) + 58065: 484, // eq (900x) + 57469: 485, // lock (899x) + 57557: 486, // values (898x) + 57421: 487, // force (894x) + 57377: 488, // charType (890x) + 57423: 489, // from (890x) + 57417: 490, // fetch (889x) + 57565: 491, // where (888x) + 57493: 492, // order (885x) + 57511: 493, // replace (871x) + 57363: 494, // and (870x) + 58060: 495, // intLit (858x) + 57492: 496, // or (847x) + 57354: 497, // andand (846x) + 57779: 498, // pipesAsOr (846x) + 57569: 499, // xor (846x) + 57522: 500, // set (844x) + 57427: 501, // group (819x) + 57533: 502, // straightJoin (815x) + 57567: 503, // window (807x) + 57429: 504, // having (805x) + 57453: 505, // join (803x) + 57572: 506, // natural (793x) + 57384: 507, // cross (792x) + 57439: 508, // inner (792x) + 57462: 509, // like (791x) + 125: 510, // '}' (789x) + 42: 511, // '*' (784x) + 57518: 512, // rows (777x) + 57552: 513, // use (773x) + 57535: 514, // tableSample (767x) + 57501: 515, // rangeKwd (766x) + 57428: 516, // groups (765x) + 57402: 517, // desc (764x) + 57365: 518, // asc (762x) + 57393: 519, // dayHour (760x) + 57394: 520, // dayMicrosecond (760x) + 57395: 521, // dayMinute (760x) + 57396: 522, // daySecond (760x) + 57431: 523, // hourMicrosecond (760x) + 57432: 524, // hourMinute (760x) + 57433: 525, // hourSecond (760x) + 57478: 526, // minuteMicrosecond (760x) + 57479: 527, // minuteSecond (760x) + 57520: 528, // secondMicrosecond (760x) + 57570: 529, // yearMonth (760x) + 57564: 530, // when (759x) + 57368: 531, // binaryType (757x) + 57436: 532, // in (757x) + 57410: 533, // elseKwd (756x) + 57538: 534, // then (753x) + 60: 535, // '<' (746x) + 62: 536, // '>' (746x) + 58066: 537, // ge (746x) + 57445: 538, // is (746x) + 58067: 539, // le (746x) + 58071: 540, // neq (746x) + 58072: 541, // neqSynonym (746x) + 58073: 542, // nulleq (746x) + 57366: 543, // between (744x) + 47: 544, // '/' (743x) + 37: 545, // '%' (742x) + 38: 546, // '&' (742x) + 94: 547, // '^' (742x) + 124: 548, // '|' (742x) + 57406: 549, // div (742x) + 58070: 550, // lsh (742x) + 58075: 551, // rsh (742x) + 57507: 552, // regexpKwd (736x) + 57516: 553, // rlike (736x) + 57434: 554, // ifKwd (732x) + 57534: 555, // tableKwd (722x) + 57446: 556, // insert (714x) + 57350: 557, // singleAtIdentifier (714x) + 57389: 558, // currentUser (710x) + 57416: 559, // falseKwd (708x) + 57545: 560, // trueKwd (708x) + 58059: 561, // decLit (702x) + 58058: 562, // floatLit (702x) + 57517: 563, // row (701x) + 58061: 564, // hexLit (700x) + 57454: 565, // key (700x) + 58074: 566, // paramMarker (700x) + 123: 567, // '{' (698x) + 58062: 568, // bitLit (698x) + 57442: 569, // interval (697x) + 57355: 570, // pipes (694x) + 57391: 571, // database (693x) + 57413: 572, // exists (693x) + 57378: 573, // check (690x) + 57382: 574, // convert (690x) + 57499: 575, // primary (690x) + 57351: 576, // doubleAtIdentifier (689x) + 58045: 577, // builtinNow (688x) + 57388: 578, // currentTs (688x) + 57467: 579, // localTime (688x) + 57468: 580, // localTs (688x) + 57348: 581, // underscoreCS (688x) + 33: 582, // '!' (686x) + 126: 583, // '~' (686x) + 58029: 584, // builtinAddDate (686x) + 58035: 585, // builtinApproxCountDistinct (686x) + 58036: 586, // builtinApproxPercentile (686x) + 58030: 587, // builtinBitAnd (686x) + 58031: 588, // builtinBitOr (686x) + 58032: 589, // builtinBitXor (686x) + 58033: 590, // builtinCast (686x) + 58034: 591, // builtinCount (686x) + 58037: 592, // builtinCurDate (686x) + 58038: 593, // builtinCurTime (686x) + 58039: 594, // builtinDateAdd (686x) + 58040: 595, // builtinDateSub (686x) + 58041: 596, // builtinExtract (686x) + 58042: 597, // builtinGroupConcat (686x) + 58043: 598, // builtinMax (686x) + 58044: 599, // builtinMin (686x) + 58046: 600, // builtinPosition (686x) + 58051: 601, // builtinStddevPop (686x) + 58052: 602, // builtinStddevSamp (686x) + 58047: 603, // builtinSubDate (686x) + 58048: 604, // builtinSubstring (686x) + 58049: 605, // builtinSum (686x) + 58050: 606, // builtinSysDate (686x) + 58053: 607, // builtinTranslate (686x) + 58054: 608, // builtinTrim (686x) + 58055: 609, // builtinUser (686x) + 58056: 610, // builtinVarPop (686x) + 58057: 611, // builtinVarSamp (686x) + 57374: 612, // caseKwd (686x) + 57385: 613, // cumeDist (686x) + 57386: 614, // currentDate (686x) + 57390: 615, // currentRole (686x) + 57387: 616, // currentTime (686x) + 57401: 617, // denseRank (686x) + 57418: 618, // firstValue (686x) + 57457: 619, // lag (686x) + 57458: 620, // lastValue (686x) + 57459: 621, // lead (686x) + 57483: 622, // nthValue (686x) + 57484: 623, // ntile (686x) + 57497: 624, // percentRank (686x) + 57502: 625, // rank (686x) + 57510: 626, // repeat (686x) + 57519: 627, // rowNumber (686x) + 57554: 628, // utcDate (686x) + 57556: 629, // utcTime (686x) + 57555: 630, // utcTimestamp (686x) + 57546: 631, // unique (683x) + 57381: 632, // constraint (681x) + 57521: 633, // selectKwd (679x) + 57506: 634, // references (678x) + 57425: 635, // generated (674x) + 57376: 636, // character (664x) + 57437: 637, // index (646x) + 57473: 638, // match (636x) + 57542: 639, // to (555x) + 57360: 640, // all (542x) + 46: 641, // '.' (533x) + 57362: 642, // analyze (517x) + 57550: 643, // update (506x) + 58068: 644, // jss (501x) + 58069: 645, // juss (501x) + 57474: 646, // maxValue (499x) + 57464: 647, // lines (492x) + 57371: 648, // by (489x) + 58064: 649, // assignmentEq (487x) + 57512: 650, // require (484x) + 57361: 651, // alter (483x) + 58321: 652, // Identifier (483x) + 58396: 653, // NotKeywordToken (483x) + 58617: 654, // TiDBKeyword (483x) + 58627: 655, // UnReservedKeyword (483x) + 64: 656, // '@' (479x) + 57526: 657, // sql (476x) + 57408: 658, // drop (473x) + 57373: 659, // cascade (472x) + 57503: 660, // read (472x) + 57513: 661, // restrict (472x) + 57347: 662, // asof (470x) + 57383: 663, // create (468x) + 57422: 664, // foreign (468x) + 57424: 665, // fulltext (468x) + 57560: 666, // varcharacter (466x) + 57559: 667, // varcharType (466x) + 57375: 668, // change (465x) + 57397: 669, // decimalType (465x) + 57407: 670, // doubleType (465x) + 57419: 671, // floatType (465x) + 57440: 672, // integerType (465x) + 57447: 673, // intType (465x) + 57504: 674, // realType (465x) + 57509: 675, // rename (465x) + 57566: 676, // write (465x) + 57561: 677, // varbinaryType (464x) + 57359: 678, // add (463x) + 57367: 679, // bigIntType (463x) + 57369: 680, // blobType (463x) + 57448: 681, // int1Type (463x) + 57449: 682, // int2Type (463x) + 57450: 683, // int3Type (463x) + 57451: 684, // int4Type (463x) + 57452: 685, // int8Type (463x) + 57558: 686, // long (463x) + 57470: 687, // longblobType (463x) + 57471: 688, // longtextType (463x) + 57475: 689, // mediumblobType (463x) + 57476: 690, // mediumIntType (463x) + 57477: 691, // mediumtextType (463x) + 57486: 692, // numericType (463x) + 57489: 693, // optimize (463x) + 57524: 694, // smallIntType (463x) + 57539: 695, // tinyblobType (463x) + 57540: 696, // tinyIntType (463x) + 57541: 697, // tinytextType (463x) + 58582: 698, // SubSelect (209x) + 58636: 699, // UserVariable (171x) + 58558: 700, // SimpleIdent (170x) + 58373: 701, // Literal (168x) + 58572: 702, // StringLiteral (168x) + 58394: 703, // NextValueForSequence (167x) + 58298: 704, // FunctionCallGeneric (166x) + 58299: 705, // FunctionCallKeyword (166x) + 58300: 706, // FunctionCallNonKeyword (166x) + 58301: 707, // FunctionNameConflict (166x) + 58302: 708, // FunctionNameDateArith (166x) + 58303: 709, // FunctionNameDateArithMultiForms (166x) + 58304: 710, // FunctionNameDatetimePrecision (166x) + 58305: 711, // FunctionNameOptionalBraces (166x) + 58306: 712, // FunctionNameSequence (166x) + 58557: 713, // SimpleExpr (166x) + 58583: 714, // SumExpr (166x) + 58585: 715, // SystemVariable (166x) + 58647: 716, // Variable (166x) + 58670: 717, // WindowFuncCall (166x) + 58150: 718, // BitExpr (153x) + 58467: 719, // PredicateExpr (130x) + 58153: 720, // BoolPri (127x) + 58265: 721, // Expression (127x) + 58685: 722, // logAnd (96x) + 58686: 723, // logOr (96x) + 58392: 724, // NUM (96x) + 58255: 725, // EqOpt (86x) + 58595: 726, // TableName (75x) + 58573: 727, // StringName (56x) + 57549: 728, // unsigned (47x) + 57495: 729, // over (45x) + 57571: 730, // zerofill (45x) + 57400: 731, // deleteKwd (41x) + 58175: 732, // ColumnName (40x) + 58364: 733, // LengthNum (40x) + 57404: 734, // distinct (36x) + 57405: 735, // distinctRow (36x) + 58675: 736, // WindowingClause (35x) + 57399: 737, // delayed (33x) + 57430: 738, // highPriority (33x) + 57472: 739, // lowPriority (33x) + 58513: 740, // SelectStmt (30x) + 58514: 741, // SelectStmtBasic (30x) + 58516: 742, // SelectStmtFromDualTable (30x) + 58517: 743, // SelectStmtFromTable (30x) + 58533: 744, // SetOprClause (30x) + 58534: 745, // SetOprClauseList (29x) + 58537: 746, // SetOprStmtWithLimitOrderBy (29x) + 58538: 747, // SetOprStmtWoutLimitOrderBy (29x) + 57353: 748, // hintComment (27x) + 58276: 749, // FieldLen (26x) + 58353: 750, // Int64Num (26x) + 58526: 751, // SelectStmtWithClause (26x) + 58536: 752, // SetOprStmt (26x) + 58676: 753, // WithClause (26x) + 58433: 754, // OptWindowingClause (24x) + 58438: 755, // OrderBy (23x) + 58520: 756, // SelectStmtLimit (23x) + 57527: 757, // sqlBigResult (23x) + 57528: 758, // sqlCalcFoundRows (23x) + 57529: 759, // sqlSmallResult (23x) + 58232: 760, // DirectPlacementOption (21x) + 58163: 761, // CharsetKw (20x) + 58638: 762, // Username (20x) + 58630: 763, // UpdateStmtNoWith (18x) + 58231: 764, // DeleteWithoutUsingStmt (17x) + 58266: 765, // ExpressionList (17x) + 58462: 766, // PlacementPolicyOption (17x) + 58322: 767, // IfExists (16x) + 58350: 768, // InsertIntoStmt (16x) + 58460: 769, // PlacementOption (16x) + 58488: 770, // ReplaceIntoStmt (16x) + 57537: 771, // terminated (16x) + 58629: 772, // UpdateStmt (16x) + 58233: 773, // DistinctKwd (15x) + 58323: 774, // IfNotExists (15x) + 58418: 775, // OptFieldLen (15x) + 58234: 776, // DistinctOpt (14x) + 57411: 777, // enclosed (14x) + 58449: 778, // PartitionNameList (14x) + 58660: 779, // WhereClause (14x) + 58661: 780, // WhereClauseOptional (14x) + 58226: 781, // DefaultKwdOpt (13x) + 58230: 782, // DeleteWithUsingStmt (13x) + 57412: 783, // escaped (13x) + 57491: 784, // optionally (13x) + 58596: 785, // TableNameList (13x) + 58229: 786, // DeleteFromStmt (12x) + 58264: 787, // ExprOrDefault (12x) + 58358: 788, // JoinTable (12x) + 58412: 789, // OptBinary (12x) + 58504: 790, // RolenameComposed (12x) + 58592: 791, // TableFactor (12x) + 58605: 792, // TableRef (12x) + 58125: 793, // AnalyzeOptionListOpt (11x) + 58293: 794, // FromOrIn (11x) + 58619: 795, // TimestampUnit (11x) + 58164: 796, // CharsetName (10x) + 58176: 797, // ColumnNameList (10x) + 57466: 798, // load (10x) + 58397: 799, // NotSym (10x) + 58439: 800, // OrderByOptional (10x) + 58441: 801, // PartDefOption (10x) + 58556: 802, // SignedNum (10x) + 58156: 803, // BuggyDefaultFalseDistinctOpt (9x) + 58216: 804, // DBName (9x) + 58225: 805, // DefaultFalseDistinctOpt (9x) + 58359: 806, // JoinType (9x) + 57482: 807, // noWriteToBinLog (9x) + 58402: 808, // NumLiteral (9x) + 58503: 809, // Rolename (9x) + 58498: 810, // RoleNameString (9x) + 58121: 811, // AlterTableStmt (8x) + 58215: 812, // CrossOpt (8x) + 58256: 813, // EqOrAssignmentEq (8x) + 58267: 814, // ExpressionListOpt (8x) + 58344: 815, // IndexPartSpecification (8x) + 58360: 816, // KeyOrIndex (8x) + 58521: 817, // SelectStmtLimitOpt (8x) + 58618: 818, // TimeUnit (8x) + 58650: 819, // VariableName (8x) + 58107: 820, // AllOrPartitionNameList (7x) + 58199: 821, // ConstraintKeywordOpt (7x) + 58282: 822, // FieldsOrColumns (7x) + 58291: 823, // ForceOpt (7x) + 58345: 824, // IndexPartSpecificationList (7x) + 58395: 825, // NoWriteToBinLogAliasOpt (7x) + 58471: 826, // Priority (7x) + 58508: 827, // RowFormat (7x) + 58511: 828, // RowValue (7x) + 58531: 829, // SetExpr (7x) + 58542: 830, // ShowDatabaseNameOpt (7x) + 58602: 831, // TableOption (7x) + 57562: 832, // varying (7x) + 58146: 833, // BeginTransactionStmt (6x) + 57380: 834, // column (6x) + 58170: 835, // ColumnDef (6x) + 58189: 836, // CommitStmt (6x) + 58218: 837, // DatabaseOption (6x) + 58221: 838, // DatabaseSym (6x) + 58258: 839, // EscapedTableRef (6x) + 58263: 840, // ExplainableStmt (6x) + 58280: 841, // FieldTerminator (6x) + 57426: 842, // grant (6x) + 58327: 843, // IgnoreOptional (6x) + 58336: 844, // IndexInvisible (6x) + 58341: 845, // IndexNameList (6x) + 58347: 846, // IndexType (6x) + 58377: 847, // LoadDataStmt (6x) + 58450: 848, // PartitionNameListOpt (6x) + 57508: 849, // release (6x) + 58505: 850, // RolenameList (6x) + 58507: 851, // RollbackStmt (6x) + 58541: 852, // SetStmt (6x) + 57523: 853, // show (6x) + 58600: 854, // TableOptimizerHints (6x) + 58639: 855, // UsernameList (6x) + 58677: 856, // WithClustered (6x) + 58105: 857, // AlgorithmClause (5x) + 58157: 858, // ByItem (5x) + 58169: 859, // CollationName (5x) + 58173: 860, // ColumnKeywordOpt (5x) + 58278: 861, // FieldOpt (5x) + 58279: 862, // FieldOpts (5x) + 58319: 863, // IdentList (5x) + 58339: 864, // IndexName (5x) + 58342: 865, // IndexOption (5x) + 58343: 866, // IndexOptionList (5x) + 57438: 867, // infile (5x) + 58369: 868, // LimitOption (5x) + 58381: 869, // LockClause (5x) + 58414: 870, // OptCharsetWithOptBinary (5x) + 58425: 871, // OptNullTreatment (5x) + 58465: 872, // PolicyName (5x) + 58472: 873, // PriorityOpt (5x) + 58512: 874, // SelectLockOpt (5x) + 58519: 875, // SelectStmtIntoOption (5x) + 58606: 876, // TableRefs (5x) + 58632: 877, // UserSpec (5x) + 58131: 878, // Assignment (4x) + 58137: 879, // AuthString (4x) + 58148: 880, // BindableStmt (4x) + 58138: 881, // BRIEBooleanOptionName (4x) + 58139: 882, // BRIEIntegerOptionName (4x) + 58140: 883, // BRIEKeywordOptionName (4x) + 58141: 884, // BRIEOption (4x) + 58142: 885, // BRIEOptions (4x) + 58144: 886, // BRIEStringOptionName (4x) + 58158: 887, // ByList (4x) + 58162: 888, // Char (4x) + 58193: 889, // ConfigItemName (4x) + 58197: 890, // Constraint (4x) + 58287: 891, // FloatOpt (4x) + 58348: 892, // IndexTypeName (4x) + 57490: 893, // option (4x) + 58430: 894, // OptWild (4x) + 57494: 895, // outer (4x) + 58466: 896, // Precision (4x) + 58480: 897, // ReferDef (4x) + 58494: 898, // RestrictOrCascadeOpt (4x) + 58510: 899, // RowStmt (4x) + 58527: 900, // SequenceOption (4x) + 57532: 901, // statsExtended (4x) + 58587: 902, // TableAsName (4x) + 58588: 903, // TableAsNameOpt (4x) + 58599: 904, // TableNameOptWild (4x) + 58601: 905, // TableOptimizerHintsOpt (4x) + 58603: 906, // TableOptionList (4x) + 58621: 907, // TraceableStmt (4x) + 58622: 908, // TransactionChar (4x) + 58633: 909, // UserSpecList (4x) + 58671: 910, // WindowName (4x) + 58128: 911, // AsOfClause (3x) + 58132: 912, // AssignmentList (3x) + 58134: 913, // AttributesOpt (3x) + 58154: 914, // Boolean (3x) + 58182: 915, // ColumnOption (3x) + 58185: 916, // ColumnPosition (3x) + 58190: 917, // CommonTableExpr (3x) + 58211: 918, // CreateTableStmt (3x) + 58219: 919, // DatabaseOptionList (3x) + 58227: 920, // DefaultTrueDistinctOpt (3x) + 58252: 921, // EnforcedOrNot (3x) + 57414: 922, // explain (3x) + 58269: 923, // ExtendedPriv (3x) + 58307: 924, // GeneratedAlways (3x) + 58309: 925, // GlobalScope (3x) + 58313: 926, // GroupByClause (3x) + 58331: 927, // IndexHint (3x) + 58335: 928, // IndexHintType (3x) + 58340: 929, // IndexNameAndTypeOpt (3x) + 57455: 930, // keys (3x) + 58371: 931, // Lines (3x) + 58389: 932, // MaxValueOrExpression (3x) + 58426: 933, // OptOrder (3x) + 58429: 934, // OptTemporary (3x) + 58442: 935, // PartDefOptionList (3x) + 58444: 936, // PartitionDefinition (3x) + 58453: 937, // PasswordExpire (3x) + 58455: 938, // PasswordOrLockOption (3x) + 58464: 939, // PluginNameList (3x) + 58470: 940, // PrimaryOpt (3x) + 58473: 941, // PrivElem (3x) + 58475: 942, // PrivType (3x) + 57500: 943, // procedure (3x) + 58489: 944, // RequireClause (3x) + 58490: 945, // RequireClauseOpt (3x) + 58492: 946, // RequireListElement (3x) + 58506: 947, // RolenameWithoutIdent (3x) + 58499: 948, // RoleOrPrivElem (3x) + 58518: 949, // SelectStmtGroup (3x) + 58535: 950, // SetOprOpt (3x) + 58586: 951, // TableAliasRefList (3x) + 58589: 952, // TableElement (3x) + 58598: 953, // TableNameListOpt2 (3x) + 58614: 954, // TextString (3x) + 58623: 955, // TransactionChars (3x) + 57544: 956, // trigger (3x) + 57548: 957, // unlock (3x) + 57551: 958, // usage (3x) + 58643: 959, // ValuesList (3x) + 58645: 960, // ValuesStmtList (3x) + 58641: 961, // ValueSym (3x) + 58648: 962, // VariableAssignment (3x) + 58668: 963, // WindowFrameStart (3x) + 58104: 964, // AdminStmt (2x) + 58106: 965, // AllColumnsOrPredicateColumnsOpt (2x) + 58108: 966, // AlterDatabaseStmt (2x) + 58109: 967, // AlterImportStmt (2x) + 58110: 968, // AlterInstanceStmt (2x) + 58111: 969, // AlterOrderItem (2x) + 58113: 970, // AlterPolicyStmt (2x) + 58114: 971, // AlterSequenceOption (2x) + 58116: 972, // AlterSequenceStmt (2x) + 58118: 973, // AlterTableSpec (2x) + 58122: 974, // AlterUserStmt (2x) + 58123: 975, // AnalyzeOption (2x) + 58126: 976, // AnalyzeTableStmt (2x) + 58149: 977, // BinlogStmt (2x) + 58143: 978, // BRIEStmt (2x) + 58145: 979, // BRIETables (2x) + 57372: 980, // call (2x) + 58159: 981, // CallStmt (2x) + 58160: 982, // CastType (2x) + 58161: 983, // ChangeStmt (2x) + 58167: 984, // CheckConstraintKeyword (2x) + 58177: 985, // ColumnNameListOpt (2x) + 58180: 986, // ColumnNameOrUserVariable (2x) + 58183: 987, // ColumnOptionList (2x) + 58184: 988, // ColumnOptionListOpt (2x) + 58186: 989, // ColumnSetValue (2x) + 58192: 990, // CompletionTypeWithinTransaction (2x) + 58194: 991, // ConnectionOption (2x) + 58196: 992, // ConnectionOptions (2x) + 58200: 993, // CreateBindingStmt (2x) + 58201: 994, // CreateDatabaseStmt (2x) + 58202: 995, // CreateImportStmt (2x) + 58203: 996, // CreateIndexStmt (2x) + 58204: 997, // CreatePolicyStmt (2x) + 58205: 998, // CreateRoleStmt (2x) + 58207: 999, // CreateSequenceStmt (2x) + 58208: 1000, // CreateStatisticsStmt (2x) + 58209: 1001, // CreateTableOptionListOpt (2x) + 58212: 1002, // CreateUserStmt (2x) + 58214: 1003, // CreateViewStmt (2x) + 57392: 1004, // databases (2x) + 58223: 1005, // DeallocateStmt (2x) + 58224: 1006, // DeallocateSym (2x) + 57403: 1007, // describe (2x) + 58235: 1008, // DoStmt (2x) + 58236: 1009, // DropBindingStmt (2x) + 58237: 1010, // DropDatabaseStmt (2x) + 58238: 1011, // DropImportStmt (2x) + 58239: 1012, // DropIndexStmt (2x) + 58240: 1013, // DropPolicyStmt (2x) + 58241: 1014, // DropRoleStmt (2x) + 58242: 1015, // DropSequenceStmt (2x) + 58243: 1016, // DropStatisticsStmt (2x) + 58244: 1017, // DropStatsStmt (2x) + 58245: 1018, // DropTableStmt (2x) + 58246: 1019, // DropUserStmt (2x) + 58247: 1020, // DropViewStmt (2x) + 58248: 1021, // DuplicateOpt (2x) + 58250: 1022, // EmptyStmt (2x) + 58251: 1023, // EncryptionOpt (2x) + 58253: 1024, // EnforcedOrNotOpt (2x) + 58257: 1025, // ErrorHandling (2x) + 58259: 1026, // ExecuteStmt (2x) + 58261: 1027, // ExplainStmt (2x) + 58262: 1028, // ExplainSym (2x) + 58271: 1029, // Field (2x) + 58274: 1030, // FieldItem (2x) + 58281: 1031, // Fields (2x) + 58285: 1032, // FlashbackTableStmt (2x) + 58290: 1033, // FlushStmt (2x) + 58296: 1034, // FuncDatetimePrecList (2x) + 58297: 1035, // FuncDatetimePrecListOpt (2x) + 58310: 1036, // GrantProxyStmt (2x) + 58311: 1037, // GrantRoleStmt (2x) + 58312: 1038, // GrantStmt (2x) + 58314: 1039, // HandleRange (2x) + 58316: 1040, // HashString (2x) + 58318: 1041, // HelpStmt (2x) + 58330: 1042, // IndexAdviseStmt (2x) + 58332: 1043, // IndexHintList (2x) + 58333: 1044, // IndexHintListOpt (2x) + 58338: 1045, // IndexLockAndAlgorithmOpt (2x) + 58351: 1046, // InsertValues (2x) + 58355: 1047, // IntoOpt (2x) + 58361: 1048, // KeyOrIndexOpt (2x) + 57456: 1049, // kill (2x) + 58362: 1050, // KillOrKillTiDB (2x) + 58363: 1051, // KillStmt (2x) + 58368: 1052, // LimitClause (2x) + 57465: 1053, // linear (2x) + 58370: 1054, // LinearOpt (2x) + 58374: 1055, // LoadDataSetItem (2x) + 58378: 1056, // LoadStatsStmt (2x) + 58379: 1057, // LocalOpt (2x) + 58382: 1058, // LockTablesStmt (2x) + 58390: 1059, // MaxValueOrExpressionList (2x) + 58398: 1060, // NowSym (2x) + 58399: 1061, // NowSymFunc (2x) + 58400: 1062, // NowSymOptionFraction (2x) + 58401: 1063, // NumList (2x) + 58404: 1064, // ObjectType (2x) + 57487: 1065, // of (2x) + 58405: 1066, // OfTablesOpt (2x) + 58406: 1067, // OnCommitOpt (2x) + 58407: 1068, // OnDelete (2x) + 58410: 1069, // OnUpdate (2x) + 58415: 1070, // OptCollate (2x) + 58420: 1071, // OptFull (2x) + 58422: 1072, // OptInteger (2x) + 58435: 1073, // OptionalBraces (2x) + 58434: 1074, // OptionLevel (2x) + 58424: 1075, // OptLeadLagInfo (2x) + 58423: 1076, // OptLLDefault (2x) + 58440: 1077, // OuterOpt (2x) + 58445: 1078, // PartitionDefinitionList (2x) + 58446: 1079, // PartitionDefinitionListOpt (2x) + 58452: 1080, // PartitionOpt (2x) + 58454: 1081, // PasswordOpt (2x) + 58456: 1082, // PasswordOrLockOptionList (2x) + 58457: 1083, // PasswordOrLockOptions (2x) + 58461: 1084, // PlacementOptionList (2x) + 58463: 1085, // PlanReplayerStmt (2x) + 58469: 1086, // PreparedStmt (2x) + 58474: 1087, // PrivLevel (2x) + 58477: 1088, // PurgeImportStmt (2x) + 58478: 1089, // QuickOptional (2x) + 58479: 1090, // RecoverTableStmt (2x) + 58481: 1091, // ReferOpt (2x) + 58483: 1092, // RegexpSym (2x) + 58484: 1093, // RenameTableStmt (2x) + 58485: 1094, // RenameUserStmt (2x) + 58487: 1095, // RepeatableOpt (2x) + 58493: 1096, // RestartStmt (2x) + 58495: 1097, // ResumeImportStmt (2x) + 57514: 1098, // revoke (2x) + 58496: 1099, // RevokeRoleStmt (2x) + 58497: 1100, // RevokeStmt (2x) + 58500: 1101, // RoleOrPrivElemList (2x) + 58501: 1102, // RoleSpec (2x) + 58522: 1103, // SelectStmtOpt (2x) + 58525: 1104, // SelectStmtSQLCache (2x) + 58529: 1105, // SetDefaultRoleOpt (2x) + 58530: 1106, // SetDefaultRoleStmt (2x) + 58540: 1107, // SetRoleStmt (2x) + 58543: 1108, // ShowImportStmt (2x) + 58548: 1109, // ShowProfileType (2x) + 58551: 1110, // ShowStmt (2x) + 58552: 1111, // ShowTableAliasOpt (2x) + 58554: 1112, // ShutdownStmt (2x) + 58555: 1113, // SignedLiteral (2x) + 58559: 1114, // SplitOption (2x) + 58560: 1115, // SplitRegionStmt (2x) + 58564: 1116, // Statement (2x) + 58566: 1117, // StatsOptionsOpt (2x) + 58567: 1118, // StatsPersistentVal (2x) + 58568: 1119, // StatsType (2x) + 58569: 1120, // StopImportStmt (2x) + 58576: 1121, // SubPartDefinition (2x) + 58579: 1122, // SubPartitionMethod (2x) + 58584: 1123, // Symbol (2x) + 58590: 1124, // TableElementList (2x) + 58593: 1125, // TableLock (2x) + 58597: 1126, // TableNameListOpt (2x) + 58604: 1127, // TableOrTables (2x) + 58613: 1128, // TablesTerminalSym (2x) + 58611: 1129, // TableToTable (2x) + 58615: 1130, // TextStringList (2x) + 58620: 1131, // TraceStmt (2x) + 58625: 1132, // TruncateTableStmt (2x) + 58628: 1133, // UnlockTablesStmt (2x) + 58634: 1134, // UserToUser (2x) + 58631: 1135, // UseStmt (2x) + 58646: 1136, // Varchar (2x) + 58649: 1137, // VariableAssignmentList (2x) + 58658: 1138, // WhenClause (2x) + 58663: 1139, // WindowDefinition (2x) + 58666: 1140, // WindowFrameBound (2x) + 58673: 1141, // WindowSpec (2x) + 58678: 1142, // WithGrantOptionOpt (2x) + 58679: 1143, // WithList (2x) + 58683: 1144, // Writeable (2x) + 58103: 1145, // AdminShowSlow (1x) + 58112: 1146, // AlterOrderList (1x) + 58115: 1147, // AlterSequenceOptionList (1x) + 58117: 1148, // AlterTablePartitionOpt (1x) + 58119: 1149, // AlterTableSpecList (1x) + 58120: 1150, // AlterTableSpecListOpt (1x) + 58124: 1151, // AnalyzeOptionList (1x) + 58127: 1152, // AnyOrAll (1x) + 58129: 1153, // AsOfClauseOpt (1x) + 58130: 1154, // AsOpt (1x) + 58135: 1155, // AuthOption (1x) + 58136: 1156, // AuthPlugin (1x) + 58147: 1157, // BetweenOrNotOp (1x) + 58151: 1158, // BitValueType (1x) + 58152: 1159, // BlobType (1x) + 58155: 1160, // BooleanType (1x) + 57370: 1161, // both (1x) + 58165: 1162, // CharsetNameOrDefault (1x) + 58166: 1163, // CharsetOpt (1x) + 58168: 1164, // ClearPasswordExpireOptions (1x) + 58172: 1165, // ColumnFormat (1x) + 58174: 1166, // ColumnList (1x) + 58181: 1167, // ColumnNameOrUserVariableList (1x) + 58178: 1168, // ColumnNameOrUserVarListOpt (1x) + 58179: 1169, // ColumnNameOrUserVarListOptWithBrackets (1x) + 58187: 1170, // ColumnSetValueList (1x) + 58191: 1171, // CompareOp (1x) + 58195: 1172, // ConnectionOptionList (1x) + 58198: 1173, // ConstraintElem (1x) + 58206: 1174, // CreateSequenceOptionListOpt (1x) + 58210: 1175, // CreateTableSelectOpt (1x) + 58213: 1176, // CreateViewSelectOpt (1x) + 58220: 1177, // DatabaseOptionListOpt (1x) + 58222: 1178, // DateAndTimeType (1x) + 58217: 1179, // DBNameList (1x) + 58228: 1180, // DefaultValueExpr (1x) + 57409: 1181, // dual (1x) + 58249: 1182, // ElseOpt (1x) + 58254: 1183, // EnforcedOrNotOrNotNullOpt (1x) + 58260: 1184, // ExplainFormatType (1x) + 58268: 1185, // ExpressionOpt (1x) + 58270: 1186, // FetchFirstOpt (1x) + 58272: 1187, // FieldAsName (1x) + 58273: 1188, // FieldAsNameOpt (1x) + 58275: 1189, // FieldItemList (1x) + 58277: 1190, // FieldList (1x) + 58283: 1191, // FirstOrNext (1x) + 58284: 1192, // FixedPointType (1x) + 58286: 1193, // FlashbackToNewName (1x) + 58288: 1194, // FloatingPointType (1x) + 58289: 1195, // FlushOption (1x) + 58292: 1196, // FromDual (1x) + 58294: 1197, // FulltextSearchModifierOpt (1x) + 58295: 1198, // FuncDatetimePrec (1x) + 58308: 1199, // GetFormatSelector (1x) + 58315: 1200, // HandleRangeList (1x) + 58317: 1201, // HavingClause (1x) + 58320: 1202, // IdentListWithParenOpt (1x) + 58324: 1203, // IfNotRunning (1x) + 58325: 1204, // IfRunning (1x) + 58326: 1205, // IgnoreLines (1x) + 58328: 1206, // ImportTruncate (1x) + 58334: 1207, // IndexHintScope (1x) + 58337: 1208, // IndexKeyTypeOpt (1x) + 58346: 1209, // IndexPartSpecificationListOpt (1x) + 58349: 1210, // IndexTypeOpt (1x) + 58329: 1211, // InOrNotOp (1x) + 58352: 1212, // InstanceOption (1x) + 58354: 1213, // IntegerType (1x) + 58357: 1214, // IsolationLevel (1x) + 58356: 1215, // IsOrNotOp (1x) + 57460: 1216, // leading (1x) + 58365: 1217, // LikeEscapeOpt (1x) + 58366: 1218, // LikeOrNotOp (1x) + 58367: 1219, // LikeTableWithOrWithoutParen (1x) + 58372: 1220, // LinesTerminated (1x) + 58375: 1221, // LoadDataSetList (1x) + 58376: 1222, // LoadDataSetSpecOpt (1x) + 58380: 1223, // LocationLabelList (1x) + 58383: 1224, // LockType (1x) + 58384: 1225, // LogTypeOpt (1x) + 58385: 1226, // Match (1x) + 58386: 1227, // MatchOpt (1x) + 58387: 1228, // MaxIndexNumOpt (1x) + 58388: 1229, // MaxMinutesOpt (1x) + 58391: 1230, // NChar (1x) + 58403: 1231, // NumericType (1x) + 58393: 1232, // NVarchar (1x) + 58408: 1233, // OnDeleteUpdateOpt (1x) + 58409: 1234, // OnDuplicateKeyUpdate (1x) + 58411: 1235, // OptBinMod (1x) + 58413: 1236, // OptCharset (1x) + 58416: 1237, // OptErrors (1x) + 58417: 1238, // OptExistingWindowName (1x) + 58419: 1239, // OptFromFirstLast (1x) + 58421: 1240, // OptGConcatSeparator (1x) + 58427: 1241, // OptPartitionClause (1x) + 58428: 1242, // OptTable (1x) + 58431: 1243, // OptWindowFrameClause (1x) + 58432: 1244, // OptWindowOrderByClause (1x) + 58437: 1245, // Order (1x) + 58436: 1246, // OrReplace (1x) + 57444: 1247, // outfile (1x) + 58443: 1248, // PartDefValuesOpt (1x) + 58447: 1249, // PartitionKeyAlgorithmOpt (1x) + 58448: 1250, // PartitionMethod (1x) + 58451: 1251, // PartitionNumOpt (1x) + 58458: 1252, // PerDB (1x) + 58459: 1253, // PerTable (1x) + 57498: 1254, // precisionType (1x) + 58468: 1255, // PrepareSQL (1x) + 58476: 1256, // ProcedureCall (1x) + 57505: 1257, // recursive (1x) + 58482: 1258, // RegexpOrNotOp (1x) + 58486: 1259, // ReorganizePartitionRuleOpt (1x) + 58491: 1260, // RequireList (1x) + 58502: 1261, // RoleSpecList (1x) + 58509: 1262, // RowOrRows (1x) + 58515: 1263, // SelectStmtFieldList (1x) + 58523: 1264, // SelectStmtOpts (1x) + 58524: 1265, // SelectStmtOptsList (1x) + 58528: 1266, // SequenceOptionList (1x) + 58532: 1267, // SetOpr (1x) + 58539: 1268, // SetRoleOpt (1x) + 58544: 1269, // ShowIndexKwd (1x) + 58545: 1270, // ShowLikeOrWhereOpt (1x) + 58546: 1271, // ShowPlacementTarget (1x) + 58547: 1272, // ShowProfileArgsOpt (1x) + 58549: 1273, // ShowProfileTypes (1x) + 58550: 1274, // ShowProfileTypesOpt (1x) + 58553: 1275, // ShowTargetFilterable (1x) + 57525: 1276, // spatial (1x) + 58561: 1277, // SplitSyntaxOption (1x) + 57530: 1278, // ssl (1x) + 58562: 1279, // Start (1x) + 58563: 1280, // Starting (1x) + 57531: 1281, // starting (1x) + 58565: 1282, // StatementList (1x) + 58570: 1283, // StorageMedia (1x) + 57536: 1284, // stored (1x) + 58571: 1285, // StringList (1x) + 58574: 1286, // StringNameOrBRIEOptionKeyword (1x) + 58575: 1287, // StringType (1x) + 58577: 1288, // SubPartDefinitionList (1x) + 58578: 1289, // SubPartDefinitionListOpt (1x) + 58580: 1290, // SubPartitionNumOpt (1x) + 58581: 1291, // SubPartitionOpt (1x) + 58591: 1292, // TableElementListOpt (1x) + 58594: 1293, // TableLockList (1x) + 58607: 1294, // TableRefsClause (1x) + 58608: 1295, // TableSampleMethodOpt (1x) + 58609: 1296, // TableSampleOpt (1x) + 58610: 1297, // TableSampleUnitOpt (1x) + 58612: 1298, // TableToTableList (1x) + 58616: 1299, // TextType (1x) + 57543: 1300, // trailing (1x) + 58624: 1301, // TrimDirection (1x) + 58626: 1302, // Type (1x) + 58635: 1303, // UserToUserList (1x) + 58637: 1304, // UserVariableList (1x) + 58640: 1305, // UsingRoles (1x) + 58642: 1306, // Values (1x) + 58644: 1307, // ValuesOpt (1x) + 58651: 1308, // ViewAlgorithm (1x) + 58652: 1309, // ViewCheckOption (1x) + 58653: 1310, // ViewDefiner (1x) + 58654: 1311, // ViewFieldList (1x) + 58655: 1312, // ViewName (1x) + 58656: 1313, // ViewSQLSecurity (1x) + 57563: 1314, // virtual (1x) + 58657: 1315, // VirtualOrStored (1x) + 58659: 1316, // WhenClauseList (1x) + 58662: 1317, // WindowClauseOptional (1x) + 58664: 1318, // WindowDefinitionList (1x) + 58665: 1319, // WindowFrameBetween (1x) + 58667: 1320, // WindowFrameExtent (1x) + 58669: 1321, // WindowFrameUnits (1x) + 58672: 1322, // WindowNameOrSpec (1x) + 58674: 1323, // WindowSpecDetails (1x) + 58680: 1324, // WithReadLockOpt (1x) + 58681: 1325, // WithValidation (1x) + 58682: 1326, // WithValidationOpt (1x) + 58684: 1327, // Year (1x) + 58102: 1328, // $default (0x) + 58063: 1329, // andnot (0x) + 58133: 1330, // AssignmentListOpt (0x) + 58171: 1331, // ColumnDefList (0x) + 58188: 1332, // CommaOpt (0x) + 58086: 1333, // createTableSelect (0x) + 58077: 1334, // empty (0x) + 57345: 1335, // error (0x) + 58101: 1336, // higherThanComma (0x) + 58095: 1337, // higherThanParenthese (0x) + 58084: 1338, // insertValues (0x) + 57352: 1339, // invalid (0x) + 58087: 1340, // lowerThanCharsetKwd (0x) + 58100: 1341, // lowerThanComma (0x) + 58085: 1342, // lowerThanCreateTableSelect (0x) + 58097: 1343, // lowerThanEq (0x) + 58092: 1344, // lowerThanFunction (0x) + 58083: 1345, // lowerThanInsertValues (0x) + 58088: 1346, // lowerThanKey (0x) + 58089: 1347, // lowerThanLocal (0x) + 58099: 1348, // lowerThanNot (0x) + 58096: 1349, // lowerThanOn (0x) + 58094: 1350, // lowerThanParenthese (0x) + 58090: 1351, // lowerThanRemove (0x) + 58078: 1352, // lowerThanSelectOpt (0x) + 58082: 1353, // lowerThanSelectStmt (0x) + 58081: 1354, // lowerThanSetKeyword (0x) + 58080: 1355, // lowerThanStringLitToken (0x) + 58079: 1356, // lowerThanValueKeyword (0x) + 58091: 1357, // lowerThenOrder (0x) + 58098: 1358, // neg (0x) + 57356: 1359, // odbcDateType (0x) + 57358: 1360, // odbcTimestampType (0x) + 57357: 1361, // odbcTimeType (0x) + 58093: 1362, // tableRefPriority (0x) } yySymNames = []string{ @@ -2192,11 +2199,11 @@ var ( "serial", "autoRandom", "columnFormat", - "constraints", "charsetKwd", "password", "regions", "placement", + "constraints", "followerConstraints", "followers", "leaderConstraints", @@ -2218,6 +2225,8 @@ var ( "nodegroup", "connection", "autoRandomBase", + "statsBuckets", + "statsTopN", "autoIdCache", "avgRowLength", "compression", @@ -2228,11 +2237,14 @@ var ( "secondaryEngine", "shardRowIDBits", "statsAutoRecalc", + "statsColChoice", + "statsColList", "statsPersistent", "statsSamplePages", + "statsSampleRate", "tableChecksum", - "account", "')'", + "account", "resume", "signed", "snapshot", @@ -2272,10 +2284,8 @@ var ( "invisible", "nonclustered", "visible", - "role", - "view", "columns", - "replicas", + "view", "subpartition", "ascii", "byteType", @@ -2313,7 +2323,6 @@ var ( "san", "subject", "local", - "policy", "skip", "bindings", "definer", @@ -2322,28 +2331,30 @@ var ( "logs", "query", "respect", + "commit", "current", "enforced", "following", "nowait", "only", + "rollback", "value", + "begin", "binding", "end", "next_row_id", + "policy", "predicate", "temporary", "unbounded", "user", - "commit", "global", "identifier", "offset", "prepare", - "rollback", + "role", "unknown", "wait", - "begin", "btree", "datetimeType", "dateType", @@ -2359,6 +2370,7 @@ var ( "required", "rtree", "running", + "sampleRate", "sequence", "slow", "timeType", @@ -2377,6 +2389,7 @@ var ( "mb", "mode", "never", + "plan", "plugins", "processlist", "recover", @@ -2433,7 +2446,6 @@ var ( "nodeState", "nulls", "pageSym", - "plan", "pump", "purge", "rebuild", @@ -2450,6 +2462,7 @@ var ( "source", "split", "stats", + "statsOptions", "stop", "swaps", "tokudbDefault", @@ -2497,10 +2510,10 @@ var ( "exprPushdownBlacklist", "extended", "faultsSym", - "follower", "format", "function", "grants", + "histogramsInFlight", "history", "imports", "incremental", @@ -2511,8 +2524,6 @@ var ( "io", "language", "last", - "leader", - "learner", "less", "level", "list", @@ -2547,15 +2558,14 @@ var ( "serializable", "simple", "slave", - "statsBuckets", "statsHealthy", "statsHistograms", "statsMeta", - "statsTopN", "strict", "switchesSym", "system", "systemTime", + "target", "telemetryID", "temptable", "textType", @@ -2569,7 +2579,6 @@ var ( "uncommitted", "undefined", "verboseType", - "voter", "warnings", "width", "x509", @@ -2592,11 +2601,14 @@ var ( "exclusive", "extract", "file", + "follower", "getFormat", "groupConcat", "jsonArrayagg", "jsonObjectAgg", "lastval", + "leader", + "learner", "max", "min", "names", @@ -2605,6 +2617,7 @@ var ( "process", "proxy", "quick", + "replicas", "replication", "reverse", "rowCount", @@ -2631,6 +2644,7 @@ var ( "variance", "varPop", "varSamp", + "voter", "weightString", "on", "'('", @@ -2648,25 +2662,25 @@ var ( "'-'", "'+'", "mod", - "partition", "ignore", + "partition", "except", "intersect", "null", "forKwd", "limit", "into", - "lock", "eq", + "lock", + "values", + "force", + "charType", "from", "fetch", - "values", "where", - "force", "order", - "charType", - "and", "replace", + "and", "intLit", "or", "andand", @@ -2727,24 +2741,24 @@ var ( "regexpKwd", "rlike", "ifKwd", - "singleAtIdentifier", - "insert", "tableKwd", + "insert", + "singleAtIdentifier", "currentUser", "falseKwd", "trueKwd", + "decLit", + "floatLit", "row", "hexLit", "key", "paramMarker", "'{'", "bitLit", - "decLit", - "floatLit", "interval", + "pipes", "database", "exists", - "pipes", "check", "convert", "primary", @@ -2805,13 +2819,14 @@ var ( "utcTimestamp", "unique", "constraint", + "selectKwd", "references", "generated", - "selectKwd", "character", "index", "match", "to", + "all", "'.'", "analyze", "update", @@ -2819,14 +2834,14 @@ var ( "juss", "maxValue", "lines", + "by", + "assignmentEq", + "require", + "alter", "Identifier", "NotKeywordToken", "TiDBKeyword", "UnReservedKeyword", - "by", - "assignmentEq", - "alter", - "require", "'@'", "sql", "drop", @@ -2839,7 +2854,6 @@ var ( "fulltext", "varcharacter", "varcharType", - "add", "change", "decimalType", "doubleType", @@ -2850,6 +2864,7 @@ var ( "rename", "write", "varbinaryType", + "add", "bigIntType", "blobType", "int1Type", @@ -2897,15 +2912,14 @@ var ( "logOr", "NUM", "EqOpt", - "all", "TableName", "StringName", "unsigned", "over", "zerofill", + "deleteKwd", "ColumnName", "LengthNum", - "deleteKwd", "distinct", "distinctRow", "WindowingClause", @@ -2917,16 +2931,16 @@ var ( "SelectStmtFromDualTable", "SelectStmtFromTable", "SetOprClause", - "hintComment", "SetOprClauseList", "SetOprStmtWithLimitOrderBy", "SetOprStmtWoutLimitOrderBy", + "hintComment", "FieldLen", "Int64Num", - "OptWindowingClause", "SelectStmtWithClause", "SetOprStmt", "WithClause", + "OptWindowingClause", "OrderBy", "SelectStmtLimit", "sqlBigResult", @@ -2935,41 +2949,42 @@ var ( "DirectPlacementOption", "CharsetKw", "Username", + "UpdateStmtNoWith", + "DeleteWithoutUsingStmt", "ExpressionList", "PlacementPolicyOption", "IfExists", + "InsertIntoStmt", "PlacementOption", + "ReplaceIntoStmt", "terminated", - "UpdateStmtNoWith", - "DeleteWithoutUsingStmt", + "UpdateStmt", "DistinctKwd", "IfNotExists", "OptFieldLen", - "ColumnNameList", "DistinctOpt", "enclosed", - "InsertIntoStmt", "PartitionNameList", - "ReplaceIntoStmt", - "UpdateStmt", "WhereClause", "WhereClauseOptional", "DefaultKwdOpt", + "DeleteWithUsingStmt", "escaped", "optionally", "TableNameList", + "DeleteFromStmt", + "ExprOrDefault", "JoinTable", "OptBinary", "RolenameComposed", "TableFactor", "TableRef", "AnalyzeOptionListOpt", - "DeleteWithUsingStmt", - "ExprOrDefault", "FromOrIn", "TimestampUnit", "CharsetName", - "DeleteFromStmt", + "ColumnNameList", + "load", "NotSym", "OrderByOptional", "PartDefOption", @@ -2979,6 +2994,7 @@ var ( "DefaultFalseDistinctOpt", "JoinType", "noWriteToBinLog", + "NumLiteral", "Rolename", "RoleNameString", "AlterTableStmt", @@ -2987,7 +3003,6 @@ var ( "ExpressionListOpt", "IndexPartSpecification", "KeyOrIndex", - "load", "SelectStmtLimitOpt", "TimeUnit", "VariableName", @@ -3000,11 +3015,14 @@ var ( "Priority", "RowFormat", "RowValue", + "SetExpr", "ShowDatabaseNameOpt", "TableOption", "varying", + "BeginTransactionStmt", "column", "ColumnDef", + "CommitStmt", "DatabaseOption", "DatabaseSym", "EscapedTableRef", @@ -3015,11 +3033,12 @@ var ( "IndexInvisible", "IndexNameList", "IndexType", - "NumLiteral", + "LoadDataStmt", "PartitionNameListOpt", "release", "RolenameList", - "SetExpr", + "RollbackStmt", + "SetStmt", "show", "TableOptimizerHints", "UsernameList", @@ -3030,6 +3049,7 @@ var ( "ColumnKeywordOpt", "FieldOpt", "FieldOpts", + "IdentList", "IndexName", "IndexOption", "IndexOptionList", @@ -3038,7 +3058,6 @@ var ( "LockClause", "OptCharsetWithOptBinary", "OptNullTreatment", - "PlacementRole", "PolicyName", "PriorityOpt", "SelectLockOpt", @@ -3047,7 +3066,6 @@ var ( "UserSpec", "Assignment", "AuthString", - "BeginTransactionStmt", "BindableStmt", "BRIEBooleanOptionName", "BRIEIntegerOptionName", @@ -3057,31 +3075,25 @@ var ( "BRIEStringOptionName", "ByList", "Char", - "CommitStmt", "ConfigItemName", "Constraint", "FloatOpt", "IndexTypeName", - "LoadDataStmt", "option", "OptWild", "outer", - "PlacementCount", - "PlacementLabelConstraints", - "PlacementSpec", "Precision", "ReferDef", "RestrictOrCascadeOpt", - "RollbackStmt", "RowStmt", "SequenceOption", - "SetStmt", "statsExtended", "TableAsName", "TableAsNameOpt", "TableNameOptWild", "TableOptimizerHintsOpt", "TableOptionList", + "TraceableStmt", "TransactionChar", "UserSpecList", "WindowName", @@ -3113,7 +3125,6 @@ var ( "PartitionDefinition", "PasswordExpire", "PasswordOrLockOption", - "PlacementSpecList", "PluginNameList", "PrimaryOpt", "PrivElem", @@ -3140,6 +3151,7 @@ var ( "VariableAssignment", "WindowFrameStart", "AdminStmt", + "AllColumnsOrPredicateColumnsOpt", "AlterDatabaseStmt", "AlterImportStmt", "AlterInstanceStmt", @@ -3241,7 +3253,6 @@ var ( "ObjectType", "of", "OfTablesOpt", - "OldPlacementOptions", "OnCommitOpt", "OnDelete", "OnUpdate", @@ -3261,7 +3272,6 @@ var ( "PasswordOrLockOptions", "PlacementOptionList", "PlanReplayerStmt", - "PredicateColumnsOpt", "PreparedStmt", "PrivLevel", "PurgeImportStmt", @@ -3293,6 +3303,7 @@ var ( "SplitOption", "SplitRegionStmt", "Statement", + "StatsOptionsOpt", "StatsPersistentVal", "StatsType", "StopImportStmt", @@ -3306,7 +3317,6 @@ var ( "TablesTerminalSym", "TableToTable", "TextStringList", - "TraceableStmt", "TraceStmt", "TruncateTableStmt", "UnlockTablesStmt", @@ -3378,7 +3388,6 @@ var ( "GetFormatSelector", "HandleRangeList", "HavingClause", - "IdentList", "IdentListWithParenOpt", "IfNotRunning", "IfRunning", @@ -3523,7 +3532,6 @@ var ( "lowerThanEq", "lowerThanFunction", "lowerThanInsertValues", - "lowerThanIntervalKeyword", "lowerThanKey", "lowerThanLocal", "lowerThanNot", @@ -3545,7457 +3553,7462 @@ var ( yyReductions = []struct{ xsym, components int }{ {0, 1}, - {1277, 1}, - {802, 6}, - {802, 8}, - {802, 10}, - {859, 3}, - {859, 3}, - {859, 3}, - {859, 3}, - {887, 3}, - {888, 3}, - {1080, 1}, - {1080, 2}, - {1080, 3}, - {753, 3}, - {753, 3}, - {753, 3}, - {753, 3}, - {753, 3}, - {753, 3}, - {753, 3}, - {753, 3}, - {753, 3}, - {753, 3}, - {753, 3}, - {759, 1}, - {759, 1}, - {757, 4}, - {757, 4}, - {757, 4}, - {757, 4}, - {1062, 1}, - {1062, 1}, - {1062, 1}, - {1062, 2}, - {1062, 2}, - {1062, 2}, - {889, 4}, - {889, 4}, - {889, 4}, - {934, 1}, - {934, 3}, - {908, 3}, - {908, 3}, - {1145, 1}, - {1145, 2}, - {1145, 4}, - {1145, 3}, - {1145, 3}, - {1221, 0}, - {1221, 3}, - {968, 1}, - {968, 5}, - {968, 5}, - {968, 5}, - {968, 5}, - {968, 6}, - {968, 2}, - {968, 5}, - {968, 6}, - {968, 8}, - {968, 1}, - {968, 4}, - {968, 3}, - {968, 4}, - {968, 5}, - {968, 3}, - {968, 4}, - {968, 4}, - {968, 7}, - {968, 3}, - {968, 4}, - {968, 4}, - {968, 4}, - {968, 4}, - {968, 2}, - {968, 2}, - {968, 4}, - {968, 4}, - {968, 5}, - {968, 3}, - {968, 2}, - {968, 2}, - {968, 5}, - {968, 6}, - {968, 6}, - {968, 8}, - {968, 5}, - {968, 5}, - {968, 3}, - {968, 3}, - {968, 3}, - {968, 5}, - {968, 1}, - {968, 1}, - {968, 1}, - {968, 1}, - {968, 2}, - {968, 2}, - {968, 1}, - {968, 1}, - {968, 4}, - {968, 3}, - {968, 4}, - {968, 1}, - {968, 1}, - {968, 1}, - {1257, 0}, - {1257, 5}, - {812, 1}, - {812, 1}, - {1324, 0}, - {1324, 1}, - {1323, 2}, - {1323, 2}, - {844, 1}, - {844, 1}, - {845, 3}, - {845, 3}, - {845, 3}, - {845, 3}, - {845, 3}, - {856, 3}, - {856, 3}, - {1141, 2}, - {1141, 2}, - {807, 1}, - {807, 1}, - {1043, 0}, - {1043, 1}, - {848, 0}, - {848, 1}, - {911, 0}, - {911, 1}, - {911, 2}, - {1147, 0}, - {1147, 1}, - {1146, 1}, - {1146, 3}, - {770, 1}, - {770, 3}, - {813, 0}, - {813, 1}, - {813, 2}, - {1119, 1}, - {1090, 3}, - {1296, 1}, - {1296, 3}, - {1125, 3}, - {1091, 3}, - {1301, 1}, - {1301, 3}, - {1131, 3}, - {1087, 5}, - {1087, 3}, - {1087, 4}, - {1027, 4}, - {1190, 0}, - {1190, 2}, - {1112, 6}, - {1112, 8}, - {1111, 6}, - {1111, 2}, - {1275, 0}, - {1275, 2}, - {1275, 1}, - {1275, 3}, - {971, 5}, - {971, 6}, - {971, 7}, - {971, 7}, - {971, 8}, - {971, 9}, - {971, 8}, - {971, 7}, - {971, 6}, - {971, 8}, - {1082, 0}, - {1082, 2}, - {784, 0}, - {784, 2}, + {1279, 1}, + {811, 6}, + {811, 8}, + {811, 10}, + {1084, 1}, + {1084, 2}, + {1084, 3}, + {760, 3}, + {760, 3}, + {760, 3}, + {760, 3}, + {760, 3}, + {760, 3}, + {760, 3}, + {760, 3}, + {760, 3}, + {760, 3}, + {760, 3}, + {769, 1}, + {769, 1}, + {766, 4}, + {766, 4}, + {766, 4}, + {766, 4}, + {913, 3}, + {913, 3}, + {1117, 3}, + {1117, 3}, {1148, 1}, + {1148, 2}, + {1148, 4}, {1148, 3}, - {970, 2}, - {970, 2}, - {970, 3}, - {970, 3}, - {970, 2}, - {866, 3}, - {907, 1}, - {907, 3}, - {1328, 0}, - {1328, 1}, - {868, 1}, - {868, 2}, - {868, 2}, - {868, 2}, - {868, 4}, - {868, 5}, - {868, 6}, - {868, 4}, - {868, 5}, - {972, 2}, - {1329, 1}, - {1329, 3}, - {825, 3}, - {825, 3}, - {724, 1}, - {724, 3}, - {724, 5}, - {766, 1}, - {766, 3}, - {980, 0}, - {980, 1}, - {1200, 0}, - {1200, 3}, - {1199, 1}, - {1199, 3}, - {1165, 0}, - {1165, 1}, - {1164, 1}, - {1164, 3}, - {981, 1}, - {981, 1}, - {1166, 0}, - {1166, 3}, - {878, 1}, - {878, 2}, - {936, 0}, - {936, 1}, - {791, 1}, - {791, 1}, + {1148, 3}, + {1223, 0}, + {1223, 3}, + {973, 1}, + {973, 5}, + {973, 5}, + {973, 5}, + {973, 5}, + {973, 6}, + {973, 2}, + {973, 5}, + {973, 6}, + {973, 8}, + {973, 1}, + {973, 1}, + {973, 3}, + {973, 4}, + {973, 5}, + {973, 3}, + {973, 4}, + {973, 4}, + {973, 7}, + {973, 3}, + {973, 4}, + {973, 4}, + {973, 4}, + {973, 4}, + {973, 2}, + {973, 2}, + {973, 4}, + {973, 4}, + {973, 5}, + {973, 3}, + {973, 2}, + {973, 2}, + {973, 5}, + {973, 6}, + {973, 6}, + {973, 8}, + {973, 5}, + {973, 5}, + {973, 3}, + {973, 3}, + {973, 3}, + {973, 5}, + {973, 1}, + {973, 1}, + {973, 1}, + {973, 1}, + {973, 2}, + {973, 2}, + {973, 1}, + {973, 1}, + {973, 4}, + {973, 3}, + {973, 4}, + {973, 1}, + {973, 1}, + {1259, 0}, + {1259, 5}, + {820, 1}, + {820, 1}, + {1326, 0}, + {1326, 1}, + {1325, 2}, + {1325, 2}, + {856, 1}, + {856, 1}, + {857, 3}, + {857, 3}, + {857, 3}, + {857, 3}, + {857, 3}, + {869, 3}, + {869, 3}, + {1144, 2}, + {1144, 2}, + {816, 1}, + {816, 1}, + {1048, 0}, + {1048, 1}, + {860, 0}, + {860, 1}, + {916, 0}, {916, 1}, {916, 2}, - {1019, 0}, - {1019, 1}, - {1180, 2}, - {1180, 1}, - {910, 2}, - {910, 1}, - {910, 1}, - {910, 2}, - {910, 3}, - {910, 1}, - {910, 2}, - {910, 2}, - {910, 3}, - {910, 3}, - {910, 2}, - {910, 6}, - {910, 6}, - {910, 1}, - {910, 2}, - {910, 2}, - {910, 2}, - {910, 2}, - {1281, 1}, - {1281, 1}, - {1281, 1}, - {1162, 1}, - {1162, 1}, - {1162, 1}, - {919, 0}, - {919, 2}, - {1313, 0}, - {1313, 1}, - {1313, 1}, - {982, 1}, - {982, 2}, - {983, 0}, - {983, 1}, - {1170, 7}, - {1170, 7}, - {1170, 7}, - {1170, 7}, - {1170, 8}, - {1170, 5}, - {1224, 2}, - {1224, 2}, - {1224, 2}, - {1225, 0}, - {1225, 1}, - {891, 5}, - {1064, 3}, - {1065, 3}, - {1231, 0}, - {1231, 1}, - {1231, 1}, - {1231, 2}, - {1231, 2}, - {1088, 1}, - {1088, 1}, - {1088, 2}, - {1088, 2}, - {1088, 2}, - {1177, 1}, - {1177, 1}, - {1177, 1}, - {1057, 1}, - {1057, 3}, - {1057, 4}, - {695, 4}, - {695, 4}, - {1056, 1}, - {1056, 1}, - {1056, 1}, - {1056, 1}, - {1055, 1}, - {1055, 1}, - {1055, 1}, - {1110, 1}, - {1110, 2}, - {1110, 2}, - {836, 1}, - {836, 1}, + {1150, 0}, + {1150, 1}, + {1149, 1}, + {1149, 3}, + {778, 1}, + {778, 3}, + {821, 0}, + {821, 1}, + {821, 2}, + {1123, 1}, + {1093, 3}, + {1298, 1}, + {1298, 3}, + {1129, 3}, + {1094, 3}, + {1303, 1}, + {1303, 3}, + {1134, 3}, + {1090, 5}, + {1090, 3}, + {1090, 4}, + {1032, 4}, + {1193, 0}, + {1193, 2}, + {1115, 6}, + {1115, 8}, + {1114, 6}, + {1114, 2}, + {1277, 0}, + {1277, 2}, + {1277, 1}, + {1277, 3}, + {976, 5}, + {976, 6}, + {976, 7}, + {976, 7}, + {976, 8}, + {976, 9}, + {976, 8}, + {976, 7}, + {976, 6}, + {976, 8}, + {965, 0}, + {965, 2}, + {965, 2}, + {793, 0}, + {793, 2}, + {1151, 1}, + {1151, 3}, + {975, 2}, + {975, 2}, + {975, 3}, + {975, 3}, + {975, 2}, + {975, 2}, + {878, 3}, + {912, 1}, + {912, 3}, + {1330, 0}, + {1330, 1}, + {833, 1}, + {833, 2}, + {833, 2}, + {833, 2}, + {833, 4}, + {833, 5}, + {833, 6}, + {833, 4}, + {833, 5}, + {977, 2}, + {1331, 1}, + {1331, 3}, + {835, 3}, + {835, 3}, + {732, 1}, + {732, 3}, + {732, 5}, + {797, 1}, + {797, 3}, + {985, 0}, + {985, 1}, + {1202, 0}, + {1202, 3}, + {863, 1}, + {863, 3}, + {1168, 0}, + {1168, 1}, + {1167, 1}, + {1167, 3}, + {986, 1}, + {986, 1}, + {1169, 0}, + {1169, 3}, {836, 1}, - {1115, 1}, - {1115, 1}, - {1115, 1}, - {995, 12}, - {1011, 3}, - {991, 13}, - {1207, 0}, - {1207, 3}, - {816, 1}, - {816, 3}, - {806, 3}, - {806, 4}, - {1040, 0}, - {1040, 1}, - {1040, 1}, - {1040, 2}, - {1040, 2}, - {1206, 0}, - {1206, 1}, - {1206, 1}, - {1206, 1}, - {961, 4}, - {961, 3}, - {989, 5}, - {796, 1}, - {860, 1}, - {826, 4}, - {826, 4}, - {826, 4}, - {826, 2}, - {826, 1}, - {1174, 0}, - {1174, 1}, - {914, 1}, - {914, 2}, - {913, 12}, - {913, 7}, - {1063, 0}, - {1063, 4}, - {1063, 4}, - {775, 0}, - {775, 1}, - {1076, 0}, - {1076, 6}, - {1118, 6}, - {1118, 5}, - {1247, 0}, - {1247, 3}, - {1248, 1}, - {1248, 4}, - {1248, 5}, + {836, 2}, + {940, 0}, + {940, 1}, + {799, 1}, + {799, 1}, + {921, 1}, + {921, 2}, + {1024, 0}, + {1024, 1}, + {1183, 2}, + {1183, 1}, + {915, 2}, + {915, 1}, + {915, 1}, + {915, 2}, + {915, 3}, + {915, 1}, + {915, 2}, + {915, 2}, + {915, 3}, + {915, 3}, + {915, 2}, + {915, 6}, + {915, 6}, + {915, 1}, + {915, 2}, + {915, 2}, + {915, 2}, + {915, 2}, + {1283, 1}, + {1283, 1}, + {1283, 1}, + {1165, 1}, + {1165, 1}, + {1165, 1}, + {924, 0}, + {924, 2}, + {1315, 0}, + {1315, 1}, + {1315, 1}, + {987, 1}, + {987, 2}, + {988, 0}, + {988, 1}, + {1173, 7}, + {1173, 7}, + {1173, 7}, + {1173, 7}, + {1173, 8}, + {1173, 5}, + {1226, 2}, + {1226, 2}, + {1226, 2}, + {1227, 0}, + {1227, 1}, + {897, 5}, + {1068, 3}, + {1069, 3}, + {1233, 0}, + {1233, 1}, + {1233, 1}, + {1233, 2}, + {1233, 2}, + {1091, 1}, + {1091, 1}, + {1091, 2}, + {1091, 2}, + {1091, 2}, + {1180, 1}, + {1180, 1}, + {1180, 1}, + {1062, 1}, + {1062, 3}, + {1062, 4}, + {703, 4}, + {703, 4}, + {1061, 1}, + {1061, 1}, + {1061, 1}, + {1061, 1}, + {1060, 1}, + {1060, 1}, + {1060, 1}, + {1113, 1}, + {1113, 2}, + {1113, 2}, + {808, 1}, + {808, 1}, + {808, 1}, + {1119, 1}, + {1119, 1}, + {1119, 1}, + {1000, 12}, + {1016, 3}, + {996, 13}, + {1209, 0}, + {1209, 3}, + {824, 1}, + {824, 3}, + {815, 3}, + {815, 4}, + {1045, 0}, + {1045, 1}, + {1045, 1}, + {1045, 2}, + {1045, 2}, + {1208, 0}, + {1208, 1}, + {1208, 1}, + {1208, 1}, + {966, 4}, + {966, 3}, + {994, 5}, + {804, 1}, + {872, 1}, + {837, 4}, + {837, 4}, + {837, 4}, + {837, 2}, + {837, 1}, + {1177, 0}, + {1177, 1}, + {919, 1}, + {919, 2}, + {918, 12}, + {918, 7}, + {1067, 0}, + {1067, 4}, + {1067, 4}, + {781, 0}, + {781, 1}, + {1080, 0}, + {1080, 6}, + {1122, 6}, + {1122, 5}, + {1249, 0}, + {1249, 3}, + {1250, 1}, + {1250, 4}, + {1250, 5}, + {1250, 4}, + {1250, 5}, + {1250, 4}, + {1250, 3}, + {1250, 1}, + {1054, 0}, + {1054, 1}, + {1291, 0}, + {1291, 4}, + {1290, 0}, + {1290, 2}, + {1251, 0}, + {1251, 2}, + {1079, 0}, + {1079, 3}, + {1078, 1}, + {1078, 3}, + {936, 5}, + {1289, 0}, + {1289, 3}, + {1288, 1}, + {1288, 3}, + {1121, 3}, + {935, 0}, + {935, 2}, + {801, 3}, + {801, 3}, + {801, 4}, + {801, 3}, + {801, 4}, + {801, 4}, + {801, 3}, + {801, 3}, + {801, 3}, + {801, 3}, + {801, 1}, + {1248, 0}, {1248, 4}, + {1248, 6}, + {1248, 1}, {1248, 5}, - {1248, 4}, - {1248, 3}, {1248, 1}, - {1049, 0}, - {1049, 1}, - {1289, 0}, - {1289, 4}, - {1288, 0}, - {1288, 2}, - {1249, 0}, - {1249, 2}, - {1075, 0}, - {1075, 3}, - {1074, 1}, - {1074, 3}, - {931, 5}, - {1287, 0}, - {1287, 3}, - {1286, 1}, - {1286, 3}, - {1117, 3}, - {930, 0}, - {930, 2}, - {793, 3}, - {793, 3}, - {793, 4}, - {793, 3}, - {793, 4}, - {793, 4}, - {793, 3}, - {793, 3}, - {793, 3}, - {793, 3}, - {793, 1}, + {1248, 1}, + {1021, 0}, + {1021, 1}, + {1021, 1}, + {1154, 0}, + {1154, 1}, + {1175, 0}, + {1175, 1}, + {1175, 1}, + {1175, 1}, + {1175, 1}, + {1176, 1}, + {1176, 1}, + {1176, 1}, + {1176, 1}, + {1219, 2}, + {1219, 4}, + {1003, 11}, {1246, 0}, - {1246, 4}, - {1246, 6}, - {1246, 1}, - {1246, 5}, - {1246, 1}, - {1246, 1}, - {1016, 0}, - {1016, 1}, - {1016, 1}, - {1151, 0}, - {1151, 1}, - {1172, 0}, - {1172, 1}, - {1172, 1}, - {1172, 1}, - {1172, 1}, - {1173, 1}, - {1173, 1}, - {1173, 1}, - {1173, 1}, - {1217, 2}, - {1217, 4}, - {998, 11}, - {1244, 0}, - {1244, 2}, - {1306, 0}, - {1306, 3}, - {1306, 3}, - {1306, 3}, + {1246, 2}, {1308, 0}, {1308, 3}, + {1308, 3}, + {1308, 3}, + {1310, 0}, + {1310, 3}, + {1313, 0}, + {1313, 3}, + {1313, 3}, + {1312, 1}, {1311, 0}, {1311, 3}, - {1311, 3}, - {1310, 1}, + {1166, 1}, + {1166, 3}, {1309, 0}, - {1309, 3}, - {1163, 1}, - {1163, 3}, - {1307, 0}, - {1307, 4}, - {1307, 4}, - {1003, 2}, - {762, 13}, - {762, 9}, - {785, 10}, - {790, 1}, - {790, 1}, - {790, 2}, - {790, 2}, - {827, 1}, - {1005, 4}, - {1007, 7}, - {1013, 6}, - {929, 0}, - {929, 1}, - {929, 2}, - {1015, 4}, - {1015, 6}, + {1309, 4}, + {1309, 4}, + {1008, 2}, + {764, 13}, + {764, 9}, + {782, 10}, + {786, 1}, + {786, 1}, + {786, 2}, + {786, 2}, + {838, 1}, + {1010, 4}, + {1012, 7}, + {1018, 6}, + {934, 0}, + {934, 1}, + {934, 2}, + {1020, 4}, + {1020, 6}, + {1019, 3}, + {1019, 5}, {1014, 3}, {1014, 5}, - {1009, 3}, - {1009, 5}, - {1012, 3}, - {1012, 5}, - {1012, 4}, - {892, 0}, - {892, 1}, - {892, 1}, - {1123, 1}, - {1123, 1}, - {717, 0}, - {717, 1}, - {1017, 0}, - {1128, 2}, - {1128, 5}, - {1023, 1}, - {1023, 1}, - {1023, 1}, - {1022, 2}, - {1022, 3}, - {1022, 2}, - {1022, 4}, - {1022, 7}, - {1022, 5}, - {1022, 7}, - {1022, 5}, - {1022, 3}, - {1181, 1}, - {1181, 1}, - {1181, 1}, - {1181, 1}, - {1181, 1}, - {1181, 1}, - {973, 5}, - {973, 5}, - {974, 2}, - {974, 2}, - {974, 2}, - {1176, 1}, - {1176, 3}, - {874, 0}, - {874, 2}, - {871, 1}, - {871, 1}, - {870, 1}, - {870, 1}, - {870, 1}, - {870, 1}, - {870, 1}, - {870, 1}, - {870, 1}, - {870, 1}, - {875, 1}, - {875, 1}, - {875, 1}, - {875, 1}, - {872, 1}, - {872, 1}, - {872, 2}, - {873, 3}, - {873, 3}, - {873, 3}, - {873, 3}, - {873, 5}, - {873, 3}, - {873, 3}, - {873, 3}, - {873, 3}, - {873, 6}, - {873, 3}, - {873, 3}, - {873, 3}, - {873, 3}, - {873, 3}, - {873, 3}, + {1017, 3}, + {1017, 5}, + {1017, 4}, + {898, 0}, + {898, 1}, + {898, 1}, + {1127, 1}, + {1127, 1}, + {725, 0}, {725, 1}, - {743, 1}, - {716, 1}, - {909, 1}, - {909, 1}, - {909, 1}, - {1070, 1}, - {1070, 1}, - {1070, 1}, - {1085, 3}, - {990, 8}, - {1116, 4}, - {1094, 4}, - {962, 6}, - {1006, 4}, - {1105, 5}, - {1202, 0}, - {1202, 2}, - {1201, 0}, - {1201, 3}, - {1235, 0}, - {1235, 1}, - {1020, 0}, - {1020, 1}, - {1020, 2}, - {1020, 2}, - {1020, 2}, - {1020, 2}, - {1204, 0}, - {1204, 3}, - {1204, 3}, - {713, 3}, - {713, 3}, - {713, 3}, - {713, 3}, - {713, 2}, - {713, 9}, - {713, 3}, - {713, 3}, - {713, 3}, - {713, 1}, - {927, 1}, - {927, 1}, - {1194, 0}, - {1194, 4}, - {1194, 7}, - {1194, 3}, - {1194, 3}, - {715, 1}, - {715, 1}, - {714, 1}, - {714, 1}, - {756, 1}, - {756, 3}, - {1054, 1}, - {1054, 3}, - {805, 0}, - {805, 1}, - {1030, 0}, - {1030, 1}, - {1029, 1}, - {712, 3}, - {712, 3}, - {712, 4}, - {712, 5}, - {712, 1}, - {1168, 1}, - {1168, 1}, - {1168, 1}, - {1168, 1}, - {1168, 1}, - {1168, 1}, - {1168, 1}, - {1168, 1}, - {1154, 1}, - {1154, 2}, - {1213, 1}, - {1213, 2}, - {1209, 1}, - {1209, 2}, - {1216, 1}, - {1216, 2}, - {1256, 1}, - {1256, 2}, - {1149, 1}, - {1149, 1}, - {1149, 1}, - {711, 5}, - {711, 3}, - {711, 5}, - {711, 4}, - {711, 3}, - {711, 1}, - {1089, 1}, - {1089, 1}, - {1215, 0}, - {1215, 2}, - {1024, 1}, - {1024, 3}, - {1024, 5}, - {1024, 2}, - {1185, 0}, - {1185, 1}, + {1022, 0}, + {1131, 2}, + {1131, 5}, + {1131, 3}, + {1131, 6}, + {1028, 1}, + {1028, 1}, + {1028, 1}, + {1027, 2}, + {1027, 3}, + {1027, 2}, + {1027, 4}, + {1027, 7}, + {1027, 5}, + {1027, 7}, + {1027, 5}, + {1027, 3}, {1184, 1}, - {1184, 2}, {1184, 1}, - {1184, 2}, - {1187, 1}, - {1187, 3}, - {921, 3}, - {1198, 0}, - {1198, 2}, - {1150, 0}, - {1150, 1}, - {906, 3}, - {758, 0}, - {758, 2}, - {764, 0}, - {764, 3}, - {832, 0}, - {832, 1}, - {851, 0}, - {851, 1}, - {853, 0}, - {853, 2}, - {852, 3}, - {852, 1}, - {852, 3}, - {852, 2}, - {852, 1}, - {852, 1}, - {924, 1}, - {924, 3}, - {924, 3}, - {1208, 0}, - {1208, 1}, - {835, 2}, - {835, 2}, - {882, 1}, + {1184, 1}, + {1184, 1}, + {1184, 1}, + {1184, 1}, + {978, 5}, + {978, 5}, + {979, 2}, + {979, 2}, + {979, 2}, + {1179, 1}, + {1179, 3}, + {885, 0}, + {885, 2}, {882, 1}, {882, 1}, - {833, 1}, - {833, 1}, - {640, 1}, - {640, 1}, - {640, 1}, - {640, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {643, 1}, - {642, 1}, - {642, 1}, - {642, 1}, - {642, 1}, - {642, 1}, - {642, 1}, - {642, 1}, - {642, 1}, - {642, 1}, - {642, 1}, - {642, 1}, - {642, 1}, - {642, 1}, - {642, 1}, - {642, 1}, - {642, 1}, - {642, 1}, - {642, 1}, - {642, 1}, - {642, 1}, - {642, 1}, - {642, 1}, - {642, 1}, - {642, 1}, - {642, 1}, - {642, 1}, - {642, 1}, - {642, 1}, - {642, 1}, - {642, 1}, - {642, 1}, - {642, 1}, - {642, 1}, - {642, 1}, - {642, 1}, - {642, 1}, - {642, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {641, 1}, - {976, 2}, - {1254, 1}, - {1254, 3}, - {1254, 4}, - {1254, 6}, - {769, 9}, - {1042, 0}, - {1042, 1}, - {1041, 5}, - {1041, 4}, - {1041, 4}, - {1041, 4}, - {1041, 4}, - {1041, 2}, - {1041, 1}, - {1041, 1}, - {1041, 1}, - {1041, 1}, - {1041, 2}, - {957, 1}, - {957, 1}, - {955, 1}, - {955, 3}, - {820, 3}, - {1305, 0}, - {1305, 1}, - {1304, 3}, - {1304, 1}, - {786, 1}, - {786, 1}, - {984, 3}, - {1167, 0}, - {1167, 1}, - {1167, 3}, - {1232, 0}, - {1232, 5}, - {771, 6}, - {693, 1}, - {693, 1}, - {693, 1}, - {693, 1}, - {693, 1}, - {693, 1}, - {693, 1}, - {693, 2}, - {693, 1}, - {693, 1}, - {693, 2}, - {693, 2}, - {694, 1}, - {694, 2}, - {1143, 1}, - {1143, 3}, - {964, 2}, - {748, 3}, - {876, 1}, - {876, 3}, - {846, 1}, - {846, 2}, - {1243, 1}, - {1243, 1}, - {928, 0}, - {928, 1}, - {928, 1}, - {792, 0}, - {792, 1}, - {710, 3}, - {710, 3}, - {710, 3}, - {710, 3}, - {710, 3}, - {710, 3}, - {710, 5}, - {710, 5}, - {710, 3}, - {710, 3}, - {710, 3}, - {710, 3}, - {710, 3}, - {710, 3}, - {710, 1}, - {692, 1}, - {692, 3}, - {692, 5}, - {705, 1}, - {705, 1}, - {705, 1}, - {705, 1}, - {705, 3}, - {705, 1}, - {705, 1}, - {705, 1}, - {705, 1}, - {705, 1}, - {705, 2}, - {705, 2}, - {705, 2}, - {705, 2}, - {705, 3}, - {705, 2}, - {705, 1}, - {705, 3}, - {705, 5}, - {705, 6}, - {705, 2}, - {705, 4}, - {705, 2}, - {705, 6}, - {705, 5}, - {705, 6}, - {705, 6}, - {705, 4}, - {705, 4}, - {705, 3}, - {705, 3}, - {763, 1}, - {763, 1}, - {767, 1}, - {767, 1}, - {797, 0}, - {797, 1}, - {915, 0}, - {915, 1}, - {795, 1}, - {795, 2}, - {699, 1}, - {699, 1}, - {699, 1}, - {699, 1}, - {699, 1}, - {699, 1}, - {699, 1}, - {699, 1}, - {699, 1}, - {699, 1}, - {699, 1}, - {699, 1}, - {699, 1}, - {699, 1}, - {699, 1}, - {699, 1}, - {699, 1}, - {699, 1}, - {699, 1}, - {699, 1}, - {699, 1}, - {699, 1}, - {699, 1}, - {699, 1}, - {699, 1}, - {699, 1}, - {699, 1}, - {699, 1}, - {699, 1}, - {1069, 0}, - {1069, 2}, - {703, 1}, - {703, 1}, - {703, 1}, - {703, 1}, - {702, 1}, - {702, 1}, - {702, 1}, - {702, 1}, - {702, 1}, - {702, 1}, - {697, 4}, - {697, 4}, - {697, 2}, - {697, 3}, - {697, 2}, - {697, 4}, - {697, 6}, - {697, 2}, - {697, 2}, - {697, 2}, - {697, 4}, - {697, 6}, - {697, 4}, - {698, 4}, - {698, 4}, - {698, 6}, - {698, 8}, - {698, 8}, - {698, 6}, - {698, 6}, - {698, 6}, - {698, 6}, - {698, 6}, - {698, 8}, - {698, 8}, - {698, 8}, - {698, 8}, - {698, 4}, - {698, 6}, - {698, 6}, - {698, 7}, - {698, 4}, - {698, 7}, - {698, 7}, - {698, 1}, - {698, 8}, - {1196, 1}, - {1196, 1}, - {1196, 1}, - {1196, 1}, - {700, 1}, - {700, 1}, + {881, 1}, + {881, 1}, + {881, 1}, + {881, 1}, + {881, 1}, + {881, 1}, + {881, 1}, + {881, 1}, + {886, 1}, + {886, 1}, + {886, 1}, + {886, 1}, + {883, 1}, + {883, 1}, + {883, 2}, + {884, 3}, + {884, 3}, + {884, 3}, + {884, 3}, + {884, 5}, + {884, 3}, + {884, 3}, + {884, 3}, + {884, 3}, + {884, 6}, + {884, 3}, + {884, 3}, + {884, 3}, + {884, 3}, + {884, 3}, + {884, 3}, + {733, 1}, + {750, 1}, + {724, 1}, + {914, 1}, + {914, 1}, + {914, 1}, + {1074, 1}, + {1074, 1}, + {1074, 1}, + {1088, 3}, + {995, 8}, + {1120, 4}, + {1097, 4}, + {967, 6}, + {1011, 4}, + {1108, 5}, + {1204, 0}, + {1204, 2}, + {1203, 0}, + {1203, 3}, + {1237, 0}, + {1237, 1}, + {1025, 0}, + {1025, 1}, + {1025, 2}, + {1025, 2}, + {1025, 2}, + {1025, 2}, + {1206, 0}, + {1206, 3}, + {1206, 3}, + {721, 3}, + {721, 3}, + {721, 3}, + {721, 3}, + {721, 2}, + {721, 9}, + {721, 3}, + {721, 3}, + {721, 3}, + {721, 1}, + {932, 1}, + {932, 1}, + {1197, 0}, + {1197, 4}, + {1197, 7}, + {1197, 3}, + {1197, 3}, + {723, 1}, + {723, 1}, + {722, 1}, + {722, 1}, + {765, 1}, + {765, 3}, + {1059, 1}, + {1059, 3}, + {814, 0}, + {814, 1}, + {1035, 0}, + {1035, 1}, + {1034, 1}, + {720, 3}, + {720, 3}, + {720, 4}, + {720, 5}, + {720, 1}, + {1171, 1}, + {1171, 1}, + {1171, 1}, + {1171, 1}, + {1171, 1}, + {1171, 1}, + {1171, 1}, + {1171, 1}, + {1157, 1}, + {1157, 2}, + {1215, 1}, + {1215, 2}, + {1211, 1}, + {1211, 2}, + {1218, 1}, + {1218, 2}, + {1258, 1}, + {1258, 2}, + {1152, 1}, + {1152, 1}, + {1152, 1}, + {719, 5}, + {719, 3}, + {719, 5}, + {719, 4}, + {719, 3}, + {719, 1}, + {1092, 1}, + {1092, 1}, + {1217, 0}, + {1217, 2}, + {1029, 1}, + {1029, 3}, + {1029, 5}, + {1029, 2}, + {1188, 0}, + {1188, 1}, + {1187, 1}, + {1187, 2}, + {1187, 1}, + {1187, 2}, + {1190, 1}, + {1190, 3}, + {926, 3}, + {1201, 0}, + {1201, 2}, + {1153, 0}, + {1153, 1}, + {911, 3}, + {767, 0}, + {767, 2}, + {774, 0}, + {774, 3}, + {843, 0}, + {843, 1}, + {864, 0}, + {864, 1}, + {866, 0}, + {866, 2}, + {865, 3}, + {865, 1}, + {865, 3}, + {865, 2}, + {865, 1}, + {865, 1}, + {929, 1}, + {929, 3}, + {929, 3}, + {1210, 0}, + {1210, 1}, + {846, 2}, + {846, 2}, + {892, 1}, + {892, 1}, + {892, 1}, + {844, 1}, + {844, 1}, + {652, 1}, + {652, 1}, + {652, 1}, + {652, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {655, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {654, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {653, 1}, + {981, 2}, + {1256, 1}, + {1256, 3}, + {1256, 4}, + {1256, 6}, + {768, 9}, + {1047, 0}, + {1047, 1}, + {1046, 5}, + {1046, 4}, + {1046, 4}, + {1046, 4}, + {1046, 4}, + {1046, 2}, + {1046, 1}, + {1046, 1}, + {1046, 1}, + {1046, 1}, + {1046, 2}, + {961, 1}, + {961, 1}, + {959, 1}, + {959, 3}, + {828, 3}, + {1307, 0}, + {1307, 1}, + {1306, 3}, + {1306, 1}, + {787, 1}, + {787, 1}, + {989, 3}, + {1170, 0}, + {1170, 1}, + {1170, 3}, + {1234, 0}, + {1234, 5}, + {770, 6}, {701, 1}, {701, 1}, - {1299, 1}, - {1299, 1}, - {1299, 1}, - {704, 4}, - {704, 6}, - {704, 1}, - {706, 6}, + {701, 1}, + {701, 1}, + {701, 1}, + {701, 1}, + {701, 1}, + {701, 2}, + {701, 1}, + {701, 1}, + {701, 2}, + {701, 2}, + {702, 1}, + {702, 2}, + {1146, 1}, + {1146, 3}, + {969, 2}, + {755, 3}, + {887, 1}, + {887, 3}, + {858, 1}, + {858, 2}, + {1245, 1}, + {1245, 1}, + {933, 0}, + {933, 1}, + {933, 1}, + {800, 0}, + {800, 1}, + {718, 3}, + {718, 3}, + {718, 3}, + {718, 3}, + {718, 3}, + {718, 3}, + {718, 5}, + {718, 5}, + {718, 3}, + {718, 3}, + {718, 3}, + {718, 3}, + {718, 3}, + {718, 3}, + {718, 1}, + {700, 1}, + {700, 3}, + {700, 5}, + {713, 1}, + {713, 1}, + {713, 1}, + {713, 1}, + {713, 3}, + {713, 1}, + {713, 1}, + {713, 1}, + {713, 1}, + {713, 1}, + {713, 2}, + {713, 2}, + {713, 2}, + {713, 2}, + {713, 3}, + {713, 2}, + {713, 1}, + {713, 3}, + {713, 5}, + {713, 6}, + {713, 2}, + {713, 4}, + {713, 2}, + {713, 6}, + {713, 5}, + {713, 6}, + {713, 6}, + {713, 4}, + {713, 4}, + {713, 3}, + {713, 3}, + {773, 1}, + {773, 1}, + {776, 1}, + {776, 1}, + {805, 0}, + {805, 1}, + {920, 0}, + {920, 1}, + {803, 1}, + {803, 2}, + {707, 1}, + {707, 1}, + {707, 1}, + {707, 1}, + {707, 1}, + {707, 1}, + {707, 1}, + {707, 1}, + {707, 1}, + {707, 1}, + {707, 1}, + {707, 1}, + {707, 1}, + {707, 1}, + {707, 1}, + {707, 1}, + {707, 1}, + {707, 1}, + {707, 1}, + {707, 1}, + {707, 1}, + {707, 1}, + {707, 1}, + {707, 1}, + {707, 1}, + {707, 1}, + {707, 1}, + {707, 1}, + {707, 1}, + {1073, 0}, + {1073, 2}, + {711, 1}, + {711, 1}, + {711, 1}, + {711, 1}, + {710, 1}, + {710, 1}, + {710, 1}, + {710, 1}, + {710, 1}, + {710, 1}, + {705, 4}, + {705, 4}, + {705, 2}, + {705, 3}, + {705, 2}, + {705, 4}, + {705, 6}, + {705, 2}, + {705, 2}, + {705, 2}, + {705, 4}, + {705, 6}, + {705, 4}, {706, 4}, {706, 4}, - {706, 5}, - {706, 6}, - {706, 5}, {706, 6}, - {706, 5}, - {706, 6}, - {706, 5}, - {706, 6}, - {706, 5}, - {706, 5}, + {706, 8}, {706, 8}, {706, 6}, {706, 6}, {706, 6}, {706, 6}, {706, 6}, + {706, 8}, + {706, 8}, + {706, 8}, + {706, 8}, + {706, 4}, {706, 6}, {706, 6}, - {706, 5}, - {706, 6}, {706, 7}, + {706, 4}, + {706, 7}, + {706, 7}, + {706, 1}, {706, 8}, - {706, 8}, - {706, 9}, - {1238, 0}, - {1238, 2}, - {696, 4}, - {696, 6}, - {1195, 0}, - {1195, 2}, - {1195, 3}, - {810, 1}, - {810, 1}, - {810, 1}, - {810, 1}, - {810, 1}, - {810, 1}, - {810, 1}, - {810, 1}, - {810, 1}, - {810, 1}, - {810, 1}, - {810, 1}, - {788, 1}, - {788, 1}, - {788, 1}, - {788, 1}, - {788, 1}, - {788, 1}, - {788, 1}, - {788, 1}, - {788, 1}, - {788, 1}, - {788, 1}, - {788, 1}, - {788, 1}, - {788, 1}, - {788, 1}, - {788, 1}, - {788, 1}, - {1182, 0}, - {1182, 1}, - {1314, 1}, - {1314, 2}, - {1135, 4}, - {1179, 0}, - {1179, 2}, - {977, 2}, - {977, 3}, - {977, 1}, - {977, 1}, - {977, 2}, - {977, 2}, - {977, 2}, - {977, 2}, - {977, 2}, - {977, 1}, - {977, 1}, - {977, 2}, - {977, 1}, + {1199, 1}, + {1199, 1}, + {1199, 1}, + {1199, 1}, + {708, 1}, + {708, 1}, + {709, 1}, + {709, 1}, + {1301, 1}, + {1301, 1}, + {1301, 1}, + {712, 4}, + {712, 6}, + {712, 1}, + {714, 6}, + {714, 4}, + {714, 4}, + {714, 5}, + {714, 6}, + {714, 5}, + {714, 6}, + {714, 5}, + {714, 6}, + {714, 5}, + {714, 6}, + {714, 5}, + {714, 5}, + {714, 8}, + {714, 6}, + {714, 6}, + {714, 6}, + {714, 6}, + {714, 6}, + {714, 6}, + {714, 6}, + {714, 5}, + {714, 6}, + {714, 7}, + {714, 8}, + {714, 8}, + {714, 9}, + {1240, 0}, + {1240, 2}, + {704, 4}, + {704, 6}, + {1198, 0}, + {1198, 2}, + {1198, 3}, {818, 1}, {818, 1}, {818, 1}, - {861, 0}, - {861, 1}, - {719, 1}, - {719, 3}, - {778, 1}, - {778, 3}, - {900, 2}, - {900, 4}, - {947, 1}, - {947, 3}, - {885, 0}, - {885, 2}, - {1086, 0}, - {1086, 1}, - {1083, 4}, - {1253, 1}, - {1253, 1}, - {1021, 2}, - {1021, 4}, - {1302, 1}, - {1302, 3}, - {1000, 3}, - {1001, 1}, - {1001, 1}, - {893, 1}, - {893, 2}, - {985, 4}, - {985, 4}, - {985, 5}, - {985, 2}, - {985, 3}, - {985, 1}, - {985, 2}, - {1109, 1}, - {1093, 1}, - {1036, 2}, - {734, 3}, - {735, 3}, - {736, 7}, - {1294, 0}, - {1294, 7}, - {1294, 5}, - {1293, 0}, - {1293, 1}, - {1293, 1}, - {1293, 1}, + {818, 1}, + {818, 1}, + {818, 1}, + {818, 1}, + {818, 1}, + {818, 1}, + {818, 1}, + {818, 1}, + {818, 1}, + {795, 1}, + {795, 1}, + {795, 1}, + {795, 1}, + {795, 1}, + {795, 1}, + {795, 1}, + {795, 1}, + {795, 1}, + {795, 1}, + {795, 1}, + {795, 1}, + {795, 1}, + {795, 1}, + {795, 1}, + {795, 1}, + {795, 1}, + {1185, 0}, + {1185, 1}, + {1316, 1}, + {1316, 2}, + {1138, 4}, + {1182, 0}, + {1182, 2}, + {982, 2}, + {982, 3}, + {982, 1}, + {982, 1}, + {982, 2}, + {982, 2}, + {982, 2}, + {982, 2}, + {982, 2}, + {982, 1}, + {982, 1}, + {982, 2}, + {982, 1}, + {826, 1}, + {826, 1}, + {826, 1}, + {873, 0}, + {873, 1}, + {726, 1}, + {726, 3}, + {785, 1}, + {785, 3}, + {904, 2}, + {904, 4}, + {951, 1}, + {951, 3}, + {894, 0}, + {894, 2}, + {1089, 0}, + {1089, 1}, + {1086, 4}, + {1255, 1}, + {1255, 1}, + {1026, 2}, + {1026, 4}, + {1304, 1}, + {1304, 3}, + {1005, 3}, + {1006, 1}, + {1006, 1}, + {851, 1}, + {851, 2}, + {990, 4}, + {990, 4}, + {990, 5}, + {990, 2}, + {990, 3}, + {990, 1}, + {990, 2}, + {1112, 1}, + {1096, 1}, + {1041, 2}, + {741, 3}, + {742, 3}, + {743, 7}, + {1296, 0}, + {1296, 7}, + {1296, 5}, {1295, 0}, {1295, 1}, {1295, 1}, - {1092, 0}, - {1092, 4}, - {733, 7}, - {733, 6}, - {733, 5}, - {733, 6}, - {733, 6}, - {745, 2}, - {745, 2}, - {747, 2}, - {747, 3}, - {1140, 3}, - {1140, 1}, - {912, 4}, - {1193, 2}, - {1315, 0}, - {1315, 2}, - {1316, 1}, - {1316, 3}, - {1136, 3}, - {905, 1}, - {1138, 3}, - {1321, 4}, - {1236, 0}, - {1236, 1}, - {1239, 0}, - {1239, 3}, - {1242, 0}, - {1242, 3}, - {1241, 0}, - {1241, 2}, - {1319, 1}, - {1319, 1}, - {1319, 1}, - {1318, 1}, + {1295, 1}, + {1297, 0}, + {1297, 1}, + {1297, 1}, + {1095, 0}, + {1095, 4}, + {740, 7}, + {740, 6}, + {740, 5}, + {740, 6}, + {740, 6}, + {751, 2}, + {751, 2}, + {753, 2}, + {753, 3}, + {1143, 3}, + {1143, 1}, + {917, 4}, + {1196, 2}, + {1317, 0}, + {1317, 2}, {1318, 1}, - {959, 2}, - {959, 2}, - {959, 2}, - {959, 4}, - {959, 2}, - {1317, 4}, - {1137, 1}, - {1137, 2}, - {1137, 2}, - {1137, 2}, - {1137, 4}, - {744, 0}, - {744, 1}, - {729, 2}, + {1318, 3}, + {1139, 3}, + {910, 1}, + {1141, 3}, + {1323, 4}, + {1238, 0}, + {1238, 1}, + {1241, 0}, + {1241, 3}, + {1244, 0}, + {1244, 3}, + {1243, 0}, + {1243, 2}, + {1321, 1}, + {1321, 1}, + {1321, 1}, {1320, 1}, {1320, 1}, - {709, 4}, - {709, 4}, - {709, 4}, - {709, 4}, - {709, 4}, - {709, 5}, - {709, 7}, - {709, 7}, - {709, 6}, - {709, 6}, - {709, 9}, - {1071, 0}, - {1071, 3}, - {1071, 3}, - {1072, 0}, - {1072, 2}, - {858, 0}, - {858, 2}, - {858, 2}, - {1237, 0}, - {1237, 2}, - {1237, 2}, - {1292, 1}, - {864, 1}, - {864, 3}, - {828, 1}, - {828, 4}, - {783, 1}, - {783, 1}, - {782, 6}, - {782, 2}, - {782, 3}, - {837, 0}, - {837, 4}, - {899, 0}, - {899, 1}, - {898, 1}, - {898, 2}, - {923, 2}, - {923, 2}, - {923, 2}, - {1205, 0}, - {1205, 2}, - {1205, 3}, - {1205, 3}, - {922, 5}, - {834, 0}, - {834, 1}, - {834, 3}, - {834, 1}, - {834, 3}, - {1038, 1}, - {1038, 2}, - {1039, 0}, - {1039, 1}, - {779, 3}, - {779, 5}, - {779, 7}, - {779, 7}, - {779, 9}, - {779, 4}, - {779, 6}, - {779, 3}, - {779, 5}, - {798, 1}, - {798, 1}, - {1073, 0}, - {1073, 1}, - {803, 1}, - {803, 2}, - {803, 2}, - {1047, 0}, - {1047, 2}, - {855, 1}, - {855, 1}, - {1260, 1}, - {1260, 1}, - {1188, 1}, - {1188, 1}, - {1183, 0}, - {1183, 1}, - {749, 2}, - {749, 4}, - {749, 4}, - {749, 5}, - {809, 0}, - {809, 1}, - {1100, 1}, - {1100, 1}, - {1100, 1}, - {1100, 1}, - {1100, 1}, - {1100, 1}, - {1100, 1}, - {1100, 1}, - {1100, 1}, - {1262, 0}, + {963, 2}, + {963, 2}, + {963, 2}, + {963, 4}, + {963, 2}, + {1319, 4}, + {1140, 1}, + {1140, 2}, + {1140, 2}, + {1140, 2}, + {1140, 4}, + {754, 0}, + {754, 1}, + {736, 2}, + {1322, 1}, + {1322, 1}, + {717, 4}, + {717, 4}, + {717, 4}, + {717, 4}, + {717, 4}, + {717, 5}, + {717, 7}, + {717, 7}, + {717, 6}, + {717, 6}, + {717, 9}, + {1075, 0}, + {1075, 3}, + {1075, 3}, + {1076, 0}, + {1076, 2}, + {871, 0}, + {871, 2}, + {871, 2}, + {1239, 0}, + {1239, 2}, + {1239, 2}, + {1294, 1}, + {876, 1}, + {876, 3}, + {839, 1}, + {839, 4}, + {792, 1}, + {792, 1}, + {791, 6}, + {791, 2}, + {791, 3}, + {848, 0}, + {848, 4}, + {903, 0}, + {903, 1}, + {902, 1}, + {902, 2}, + {928, 2}, + {928, 2}, + {928, 2}, + {1207, 0}, + {1207, 2}, + {1207, 3}, + {1207, 3}, + {927, 5}, + {845, 0}, + {845, 1}, + {845, 3}, + {845, 1}, + {845, 3}, + {1043, 1}, + {1043, 2}, + {1044, 0}, + {1044, 1}, + {788, 3}, + {788, 5}, + {788, 7}, + {788, 7}, + {788, 9}, + {788, 4}, + {788, 6}, + {788, 3}, + {788, 5}, + {806, 1}, + {806, 1}, + {1077, 0}, + {1077, 1}, + {812, 1}, + {812, 2}, + {812, 2}, + {1052, 0}, + {1052, 2}, + {868, 1}, + {868, 1}, + {1262, 1}, {1262, 1}, - {1263, 2}, + {1191, 1}, + {1191, 1}, + {1186, 0}, + {1186, 1}, + {756, 2}, + {756, 4}, + {756, 4}, + {756, 5}, + {817, 0}, + {817, 1}, + {1103, 1}, + {1103, 1}, + {1103, 1}, + {1103, 1}, + {1103, 1}, + {1103, 1}, + {1103, 1}, + {1103, 1}, + {1103, 1}, + {1264, 0}, + {1264, 1}, + {1265, 2}, + {1265, 1}, + {854, 1}, + {905, 0}, + {905, 1}, + {1104, 1}, + {1104, 1}, {1263, 1}, - {842, 1}, - {901, 0}, - {901, 1}, - {1101, 1}, - {1101, 1}, - {1261, 1}, - {945, 0}, - {945, 1}, - {863, 0}, - {863, 5}, - {690, 3}, - {690, 3}, - {690, 3}, - {862, 0}, - {862, 3}, - {862, 3}, - {862, 4}, - {862, 5}, - {862, 4}, - {862, 5}, - {862, 5}, - {862, 4}, - {1061, 0}, - {1061, 2}, - {746, 1}, - {746, 1}, + {949, 0}, + {949, 1}, + {875, 0}, + {875, 5}, + {698, 3}, + {698, 3}, + {698, 3}, + {698, 3}, + {874, 0}, + {874, 3}, + {874, 3}, + {874, 4}, + {874, 5}, + {874, 4}, + {874, 5}, + {874, 5}, + {874, 4}, + {1066, 0}, + {1066, 2}, + {752, 1}, + {752, 1}, + {752, 2}, + {752, 2}, + {747, 3}, + {747, 3}, + {746, 4}, + {746, 4}, + {746, 5}, {746, 2}, {746, 2}, - {741, 3}, - {741, 3}, - {740, 4}, - {740, 4}, - {740, 5}, - {740, 2}, - {740, 2}, - {740, 3}, - {739, 1}, - {739, 3}, - {737, 1}, - {737, 1}, - {1265, 2}, - {1265, 2}, - {1265, 2}, - {946, 1}, - {978, 9}, - {978, 9}, - {896, 2}, - {896, 4}, - {896, 6}, - {896, 4}, - {896, 4}, - {896, 3}, - {896, 6}, - {896, 6}, - {1104, 3}, - {1103, 6}, - {1102, 1}, - {1102, 1}, - {1102, 1}, - {1266, 3}, - {1266, 1}, - {1266, 1}, - {951, 1}, - {951, 3}, - {903, 3}, - {903, 2}, - {903, 2}, - {903, 3}, - {1212, 2}, - {1212, 2}, - {1212, 2}, - {1212, 1}, - {840, 1}, - {840, 1}, - {840, 1}, - {804, 1}, - {804, 1}, - {811, 1}, - {811, 3}, - {879, 1}, - {879, 3}, - {879, 3}, - {958, 3}, - {958, 4}, - {958, 4}, - {958, 4}, - {958, 3}, - {958, 3}, - {958, 2}, - {958, 4}, - {958, 4}, - {958, 2}, - {958, 2}, - {1159, 1}, - {1159, 1}, - {789, 1}, - {789, 1}, - {847, 1}, - {847, 1}, - {1134, 1}, - {1134, 3}, - {708, 1}, - {708, 1}, - {707, 1}, - {691, 1}, - {755, 1}, - {755, 3}, - {755, 2}, - {755, 2}, - {843, 1}, - {843, 3}, - {1077, 1}, - {1077, 4}, - {867, 1}, - {801, 1}, - {801, 1}, - {781, 3}, - {781, 2}, - {943, 1}, - {943, 1}, - {800, 1}, - {800, 1}, - {839, 1}, - {839, 3}, - {960, 3}, - {960, 5}, - {960, 6}, - {960, 4}, - {960, 4}, - {960, 5}, - {960, 5}, - {960, 5}, - {960, 6}, - {960, 4}, - {960, 5}, - {960, 6}, - {960, 4}, - {960, 3}, - {960, 3}, - {960, 4}, - {960, 4}, - {960, 5}, - {960, 5}, - {960, 3}, - {960, 3}, - {960, 3}, - {960, 3}, - {960, 3}, - {960, 3}, - {960, 3}, - {960, 3}, - {1142, 2}, - {1142, 2}, - {1142, 3}, - {1142, 3}, - {1197, 1}, - {1197, 3}, - {1034, 5}, - {1058, 1}, - {1058, 3}, - {1107, 3}, - {1107, 4}, - {1107, 4}, - {1107, 5}, - {1107, 4}, - {1107, 5}, - {1107, 4}, - {1107, 4}, - {1107, 6}, - {1107, 4}, - {1107, 8}, - {1107, 2}, - {1107, 5}, - {1107, 3}, + {746, 3}, + {745, 1}, + {745, 3}, + {744, 1}, + {744, 1}, + {1267, 2}, + {1267, 2}, + {1267, 2}, + {950, 1}, + {983, 9}, + {983, 9}, + {852, 2}, + {852, 4}, + {852, 6}, + {852, 4}, + {852, 4}, + {852, 3}, + {852, 6}, + {852, 6}, {1107, 3}, - {1107, 2}, - {1107, 5}, - {1107, 2}, - {1107, 2}, - {1107, 4}, - {1269, 2}, - {1269, 2}, - {1269, 4}, - {1272, 0}, - {1272, 1}, - {1271, 1}, - {1271, 3}, - {1106, 1}, - {1106, 1}, - {1106, 2}, - {1106, 2}, - {1106, 2}, - {1106, 1}, - {1106, 1}, - {1106, 1}, - {1106, 1}, - {1270, 0}, - {1270, 3}, - {1303, 0}, - {1303, 2}, - {1267, 1}, - {1267, 1}, - {1267, 1}, - {787, 1}, - {787, 1}, - {1273, 1}, - {1273, 1}, - {1273, 1}, - {1273, 1}, - {1273, 3}, - {1273, 3}, - {1273, 3}, - {1273, 3}, - {1273, 5}, - {1273, 4}, - {1273, 5}, - {1273, 1}, - {1273, 1}, - {1273, 2}, - {1273, 2}, - {1273, 2}, - {1273, 1}, - {1273, 2}, - {1273, 2}, - {1273, 2}, - {1273, 2}, - {1273, 2}, - {1273, 2}, - {1273, 1}, - {1273, 1}, - {1273, 1}, - {1273, 1}, - {1273, 1}, - {1273, 1}, - {1273, 1}, - {1273, 1}, - {1273, 2}, - {1273, 1}, - {1273, 1}, - {1273, 1}, - {1273, 1}, - {1273, 2}, - {1268, 0}, - {1268, 2}, - {1268, 2}, - {920, 0}, - {920, 1}, - {920, 1}, - {1067, 0}, - {1067, 1}, - {821, 0}, - {821, 2}, - {1108, 2}, - {1028, 3}, - {935, 1}, - {935, 3}, - {1192, 1}, - {1192, 1}, - {1192, 3}, - {1192, 1}, - {1192, 2}, - {1192, 3}, - {1192, 1}, - {1223, 0}, - {1223, 1}, - {1223, 1}, - {1223, 1}, - {1223, 1}, - {1223, 1}, - {817, 0}, - {817, 1}, - {817, 1}, - {1122, 0}, - {1122, 1}, - {949, 0}, - {949, 2}, - {1322, 0}, - {1322, 3}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1113, 1}, - {1127, 1}, - {1127, 1}, - {1127, 1}, - {1127, 1}, - {1127, 1}, - {1127, 1}, - {1127, 1}, - {1127, 1}, - {1127, 1}, - {1127, 1}, - {1127, 1}, - {1127, 1}, - {1127, 1}, - {829, 1}, - {829, 1}, - {829, 1}, - {829, 1}, - {829, 1}, - {829, 1}, + {1106, 6}, + {1105, 1}, + {1105, 1}, + {1105, 1}, + {1268, 3}, + {1268, 1}, + {1268, 1}, + {955, 1}, + {955, 3}, + {908, 3}, + {908, 2}, + {908, 2}, + {908, 3}, + {1214, 2}, + {1214, 2}, + {1214, 2}, + {1214, 1}, {829, 1}, {829, 1}, {829, 1}, - {1280, 1}, - {1280, 3}, - {880, 2}, - {979, 1}, - {979, 1}, - {948, 1}, - {948, 1}, - {1120, 1}, - {1120, 3}, - {1290, 0}, - {1290, 3}, - {822, 1}, - {822, 4}, - {822, 4}, - {822, 4}, - {822, 3}, - {822, 4}, - {822, 3}, - {822, 3}, - {822, 3}, - {822, 3}, - {822, 3}, - {822, 3}, - {822, 3}, - {822, 3}, - {822, 1}, - {822, 3}, - {822, 3}, - {822, 3}, - {822, 3}, - {822, 3}, - {822, 3}, - {822, 3}, - {822, 3}, - {822, 2}, - {822, 2}, - {822, 3}, - {822, 3}, - {822, 5}, - {822, 3}, - {815, 0}, - {815, 1}, - {1114, 1}, - {1114, 1}, - {996, 0}, - {996, 1}, - {902, 1}, - {902, 2}, - {902, 3}, - {1240, 0}, - {1240, 1}, - {1129, 3}, - {819, 3}, - {819, 3}, - {819, 3}, - {819, 3}, - {819, 3}, - {819, 3}, - {819, 3}, - {819, 3}, - {819, 3}, - {819, 3}, - {819, 3}, - {819, 3}, - {819, 3}, + {813, 1}, + {813, 1}, + {819, 1}, {819, 3}, - {1300, 1}, - {1300, 1}, - {1300, 1}, - {1229, 3}, - {1229, 2}, - {1229, 3}, - {1229, 3}, - {1229, 2}, - {1211, 1}, - {1211, 1}, - {1211, 1}, - {1211, 1}, - {1211, 1}, - {1211, 1}, - {1211, 1}, - {1211, 1}, - {1211, 1}, - {1211, 1}, - {1211, 1}, - {1157, 1}, - {1157, 1}, - {1068, 0}, - {1068, 1}, - {1068, 1}, - {1189, 1}, - {1189, 1}, - {1189, 1}, - {1191, 1}, - {1191, 1}, - {1191, 1}, - {1191, 2}, - {1155, 1}, - {1285, 3}, - {1285, 2}, - {1285, 3}, - {1285, 2}, - {1285, 3}, - {1285, 3}, - {1285, 2}, - {1285, 2}, - {1285, 1}, - {1285, 2}, - {1285, 5}, - {1285, 5}, + {889, 1}, + {889, 3}, + {889, 3}, + {962, 3}, + {962, 4}, + {962, 4}, + {962, 4}, + {962, 3}, + {962, 3}, + {962, 2}, + {962, 4}, + {962, 4}, + {962, 2}, + {962, 2}, + {1162, 1}, + {1162, 1}, + {796, 1}, + {796, 1}, + {859, 1}, + {859, 1}, + {1137, 1}, + {1137, 3}, + {716, 1}, + {716, 1}, + {715, 1}, + {699, 1}, + {762, 1}, + {762, 3}, + {762, 2}, + {762, 2}, + {855, 1}, + {855, 3}, + {1081, 1}, + {1081, 4}, + {879, 1}, + {810, 1}, + {810, 1}, + {790, 3}, + {790, 2}, + {947, 1}, + {947, 1}, + {809, 1}, + {809, 1}, + {850, 1}, + {850, 3}, + {964, 3}, + {964, 5}, + {964, 6}, + {964, 4}, + {964, 4}, + {964, 5}, + {964, 5}, + {964, 5}, + {964, 6}, + {964, 4}, + {964, 5}, + {964, 6}, + {964, 4}, + {964, 3}, + {964, 3}, + {964, 4}, + {964, 4}, + {964, 5}, + {964, 5}, + {964, 3}, + {964, 3}, + {964, 3}, + {964, 3}, + {964, 3}, + {964, 3}, + {964, 3}, + {964, 3}, + {1145, 2}, + {1145, 2}, + {1145, 3}, + {1145, 3}, + {1200, 1}, + {1200, 3}, + {1039, 5}, + {1063, 1}, + {1063, 3}, + {1110, 3}, + {1110, 4}, + {1110, 4}, + {1110, 5}, + {1110, 4}, + {1110, 5}, + {1110, 4}, + {1110, 4}, + {1110, 6}, + {1110, 4}, + {1110, 8}, + {1110, 2}, + {1110, 5}, + {1110, 3}, + {1110, 3}, + {1110, 2}, + {1110, 5}, + {1110, 2}, + {1110, 2}, + {1110, 4}, + {1271, 2}, + {1271, 2}, + {1271, 4}, + {1274, 0}, + {1274, 1}, + {1273, 1}, + {1273, 3}, + {1109, 1}, + {1109, 1}, + {1109, 2}, + {1109, 2}, + {1109, 2}, + {1109, 1}, + {1109, 1}, + {1109, 1}, + {1109, 1}, + {1272, 0}, + {1272, 3}, + {1305, 0}, + {1305, 2}, + {1269, 1}, + {1269, 1}, + {1269, 1}, + {794, 1}, + {794, 1}, + {1275, 1}, + {1275, 1}, + {1275, 1}, + {1275, 1}, + {1275, 3}, + {1275, 3}, + {1275, 3}, + {1275, 3}, + {1275, 5}, + {1275, 4}, + {1275, 5}, + {1275, 1}, + {1275, 1}, + {1275, 2}, + {1275, 2}, + {1275, 2}, + {1275, 1}, + {1275, 2}, + {1275, 2}, + {1275, 2}, + {1275, 2}, + {1275, 2}, + {1275, 2}, + {1275, 1}, + {1275, 1}, + {1275, 1}, + {1275, 1}, + {1275, 1}, + {1275, 1}, + {1275, 1}, + {1275, 1}, + {1275, 1}, + {1275, 2}, + {1275, 1}, + {1275, 1}, + {1275, 1}, + {1275, 1}, + {1275, 2}, + {1270, 0}, + {1270, 2}, + {1270, 2}, + {925, 0}, + {925, 1}, + {925, 1}, + {1071, 0}, + {1071, 1}, + {830, 0}, + {830, 2}, + {1111, 2}, + {1033, 3}, + {939, 1}, + {939, 3}, + {1195, 1}, + {1195, 1}, + {1195, 3}, + {1195, 1}, + {1195, 2}, + {1195, 3}, + {1195, 1}, + {1225, 0}, + {1225, 1}, + {1225, 1}, + {1225, 1}, + {1225, 1}, + {1225, 1}, + {825, 0}, + {825, 1}, + {825, 1}, + {1126, 0}, + {1126, 1}, + {953, 0}, + {953, 2}, + {1324, 0}, + {1324, 3}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {1116, 1}, + {907, 1}, + {907, 1}, + {907, 1}, + {907, 1}, + {907, 1}, + {907, 1}, + {907, 1}, + {907, 1}, + {907, 1}, + {907, 1}, + {907, 1}, + {907, 1}, + {907, 1}, + {840, 1}, + {840, 1}, + {840, 1}, + {840, 1}, + {840, 1}, + {840, 1}, + {840, 1}, + {840, 1}, + {840, 1}, + {1282, 1}, + {1282, 3}, + {890, 2}, + {984, 1}, + {984, 1}, + {952, 1}, + {952, 1}, + {1124, 1}, + {1124, 3}, + {1292, 0}, + {1292, 3}, + {831, 1}, + {831, 4}, + {831, 4}, + {831, 4}, + {831, 3}, + {831, 4}, + {831, 3}, + {831, 3}, + {831, 3}, + {831, 3}, + {831, 3}, + {831, 3}, + {831, 3}, + {831, 3}, + {831, 1}, + {831, 3}, + {831, 3}, + {831, 3}, + {831, 3}, + {831, 3}, + {831, 3}, + {831, 3}, + {831, 3}, + {831, 3}, + {831, 3}, + {831, 3}, + {831, 3}, + {831, 3}, + {831, 2}, + {831, 2}, + {831, 3}, + {831, 3}, + {831, 5}, + {831, 3}, + {823, 0}, + {823, 1}, + {1118, 1}, + {1118, 1}, + {1001, 0}, + {1001, 1}, + {906, 1}, + {906, 2}, + {906, 3}, + {1242, 0}, + {1242, 1}, + {1132, 3}, + {827, 3}, + {827, 3}, + {827, 3}, + {827, 3}, + {827, 3}, + {827, 3}, + {827, 3}, + {827, 3}, + {827, 3}, + {827, 3}, + {827, 3}, + {827, 3}, + {827, 3}, + {827, 3}, + {1302, 1}, + {1302, 1}, + {1302, 1}, + {1231, 3}, + {1231, 2}, + {1231, 3}, + {1231, 3}, + {1231, 2}, + {1213, 1}, + {1213, 1}, + {1213, 1}, + {1213, 1}, + {1213, 1}, + {1213, 1}, + {1213, 1}, + {1213, 1}, + {1213, 1}, + {1213, 1}, + {1213, 1}, + {1160, 1}, + {1160, 1}, + {1072, 0}, + {1072, 1}, + {1072, 1}, + {1192, 1}, + {1192, 1}, + {1192, 1}, + {1194, 1}, + {1194, 1}, + {1194, 1}, + {1194, 2}, + {1158, 1}, + {1287, 3}, + {1287, 2}, + {1287, 3}, + {1287, 2}, + {1287, 3}, + {1287, 3}, + {1287, 2}, + {1287, 2}, + {1287, 1}, + {1287, 2}, + {1287, 5}, + {1287, 5}, + {1287, 1}, + {1287, 3}, + {1287, 2}, + {888, 1}, + {888, 1}, + {1230, 1}, + {1230, 2}, + {1230, 2}, + {1136, 2}, + {1136, 2}, + {1136, 1}, + {1136, 1}, + {1232, 2}, + {1232, 2}, + {1232, 1}, + {1232, 2}, + {1232, 2}, + {1232, 3}, + {1232, 3}, + {1232, 2}, + {1327, 1}, + {1327, 1}, + {1159, 1}, + {1159, 2}, + {1159, 1}, + {1159, 1}, + {1159, 2}, + {1299, 1}, + {1299, 2}, + {1299, 1}, + {1299, 1}, + {870, 1}, + {870, 1}, + {870, 1}, + {870, 1}, + {1178, 1}, + {1178, 2}, + {1178, 2}, + {1178, 2}, + {1178, 3}, + {749, 3}, + {775, 0}, + {775, 1}, + {861, 1}, + {861, 1}, + {861, 1}, + {862, 0}, + {862, 2}, + {891, 0}, + {891, 1}, + {891, 1}, + {896, 5}, + {1235, 0}, + {1235, 1}, + {789, 0}, + {789, 2}, + {789, 3}, + {1236, 0}, + {1236, 2}, + {761, 2}, + {761, 1}, + {761, 2}, + {1070, 0}, + {1070, 2}, {1285, 1}, {1285, 3}, - {1285, 2}, - {877, 1}, - {877, 1}, - {1228, 1}, - {1228, 2}, - {1228, 2}, - {1133, 2}, - {1133, 2}, - {1133, 1}, - {1133, 1}, - {1230, 2}, - {1230, 2}, - {1230, 1}, - {1230, 2}, - {1230, 2}, - {1230, 3}, - {1230, 3}, - {1230, 2}, - {1325, 1}, - {1325, 1}, - {1156, 1}, - {1156, 2}, - {1156, 1}, - {1156, 1}, - {1156, 2}, - {1297, 1}, - {1297, 2}, - {1297, 1}, - {1297, 1}, - {857, 1}, - {857, 1}, - {857, 1}, - {857, 1}, - {1175, 1}, - {1175, 2}, - {1175, 2}, - {1175, 2}, - {1175, 3}, - {742, 3}, - {765, 0}, - {765, 1}, - {849, 1}, - {849, 1}, - {849, 1}, - {850, 0}, - {850, 2}, - {881, 0}, - {881, 1}, - {881, 1}, - {890, 5}, - {1233, 0}, - {1233, 1}, - {780, 0}, - {780, 2}, - {780, 3}, - {1234, 0}, - {1234, 2}, - {754, 2}, - {754, 1}, - {754, 2}, - {1066, 0}, - {1066, 2}, - {1283, 1}, - {1283, 3}, - {950, 1}, - {950, 1}, - {950, 1}, - {1126, 1}, - {1126, 3}, - {720, 1}, - {720, 1}, - {1284, 1}, - {1284, 1}, - {1284, 1}, + {954, 1}, + {954, 1}, + {954, 1}, + {1130, 1}, + {1130, 3}, + {727, 1}, + {727, 1}, + {1286, 1}, + {1286, 1}, + {1286, 1}, {772, 1}, {772, 2}, - {761, 10}, - {761, 8}, - {1132, 2}, - {773, 2}, - {774, 0}, - {774, 1}, - {1330, 0}, - {1330, 1}, - {997, 7}, - {993, 4}, - {969, 7}, - {969, 9}, - {963, 3}, - {1210, 2}, - {1210, 6}, - {865, 2}, - {904, 1}, - {904, 3}, - {987, 0}, - {987, 2}, - {1169, 1}, - {1169, 2}, - {986, 2}, - {986, 2}, - {986, 2}, - {986, 2}, - {941, 0}, - {941, 1}, - {940, 2}, - {940, 2}, - {940, 2}, - {940, 2}, - {1258, 1}, - {1258, 3}, - {1258, 2}, - {942, 2}, - {942, 2}, - {942, 2}, - {942, 2}, - {1079, 0}, - {1079, 1}, - {1078, 1}, - {1078, 2}, - {933, 2}, - {933, 2}, - {933, 1}, - {933, 4}, - {933, 2}, - {933, 2}, - {932, 3}, - {1161, 0}, - {1152, 0}, - {1152, 3}, - {1152, 3}, - {1152, 5}, - {1152, 5}, - {1152, 4}, - {1153, 1}, - {1035, 1}, - {1035, 1}, - {1099, 1}, - {1259, 1}, - {1259, 3}, - {869, 1}, - {869, 1}, - {869, 1}, - {869, 1}, - {869, 1}, - {869, 1}, - {869, 1}, - {869, 1}, - {988, 7}, - {1004, 5}, - {1004, 7}, - {1033, 9}, - {1031, 7}, - {1032, 4}, - {1139, 0}, - {1139, 3}, - {1139, 3}, - {1139, 3}, - {1139, 3}, - {1139, 3}, - {918, 1}, - {918, 2}, - {944, 1}, - {944, 1}, - {944, 1}, - {944, 3}, - {944, 3}, - {1098, 1}, - {1098, 3}, - {937, 1}, - {937, 4}, - {938, 1}, - {938, 2}, - {938, 1}, - {938, 1}, - {938, 2}, - {938, 2}, - {938, 1}, - {938, 1}, - {938, 1}, - {938, 1}, - {938, 1}, - {938, 1}, - {938, 1}, - {938, 1}, - {938, 1}, - {938, 2}, - {938, 1}, - {938, 2}, - {938, 1}, + {763, 10}, + {763, 8}, + {1135, 2}, + {779, 2}, + {780, 0}, + {780, 1}, + {1332, 0}, + {1332, 1}, + {1002, 7}, + {998, 4}, + {974, 7}, + {974, 9}, + {968, 3}, + {1212, 2}, + {1212, 6}, + {877, 2}, + {909, 1}, + {909, 3}, + {992, 0}, + {992, 2}, + {1172, 1}, + {1172, 2}, + {991, 2}, + {991, 2}, + {991, 2}, + {991, 2}, + {945, 0}, + {945, 1}, + {944, 2}, + {944, 2}, + {944, 2}, + {944, 2}, + {1260, 1}, + {1260, 3}, + {1260, 2}, + {946, 2}, + {946, 2}, + {946, 2}, + {946, 2}, + {1083, 0}, + {1083, 1}, + {1082, 1}, + {1082, 2}, {938, 2}, {938, 2}, {938, 1}, - {938, 1}, - {938, 1}, - {938, 1}, - {938, 3}, - {938, 2}, - {938, 2}, + {938, 4}, {938, 2}, {938, 2}, - {938, 2}, - {938, 2}, - {938, 2}, - {938, 1}, - {938, 1}, - {1059, 0}, - {1059, 1}, - {1059, 1}, - {1059, 1}, - {1084, 1}, - {1084, 3}, - {1084, 3}, - {1084, 3}, - {1084, 1}, - {1097, 7}, - {1096, 4}, - {883, 15}, - {1203, 0}, - {1203, 3}, - {1160, 0}, - {1160, 3}, - {1052, 0}, - {1052, 1}, - {1026, 0}, - {1026, 2}, - {814, 1}, - {814, 1}, - {1186, 2}, - {1186, 1}, - {1025, 3}, - {1025, 4}, - {1025, 3}, - {1025, 3}, - {830, 1}, - {830, 1}, - {830, 1}, - {926, 0}, - {926, 3}, - {1278, 0}, - {1278, 3}, - {1218, 0}, - {1218, 3}, + {937, 3}, + {1164, 0}, + {1155, 0}, + {1155, 3}, + {1155, 3}, + {1155, 5}, + {1155, 5}, + {1155, 4}, + {1156, 1}, + {1040, 1}, + {1040, 1}, + {1102, 1}, + {1261, 1}, + {1261, 3}, + {880, 1}, + {880, 1}, + {880, 1}, + {880, 1}, + {880, 1}, + {880, 1}, + {880, 1}, + {880, 1}, + {993, 7}, + {1009, 5}, + {1009, 7}, + {1038, 9}, + {1036, 7}, + {1037, 4}, + {1142, 0}, + {1142, 3}, + {1142, 3}, + {1142, 3}, + {1142, 3}, + {1142, 3}, + {923, 1}, + {923, 2}, + {948, 1}, + {948, 1}, + {948, 1}, + {948, 3}, + {948, 3}, + {1101, 1}, + {1101, 3}, + {941, 1}, + {941, 4}, + {942, 1}, + {942, 2}, + {942, 1}, + {942, 1}, + {942, 2}, + {942, 2}, + {942, 1}, + {942, 1}, + {942, 1}, + {942, 1}, + {942, 1}, + {942, 1}, + {942, 1}, + {942, 1}, + {942, 1}, + {942, 2}, + {942, 1}, + {942, 2}, + {942, 1}, + {942, 2}, + {942, 2}, + {942, 1}, + {942, 1}, + {942, 1}, + {942, 1}, + {942, 3}, + {942, 2}, + {942, 2}, + {942, 2}, + {942, 2}, + {942, 2}, + {942, 2}, + {942, 2}, + {942, 1}, + {942, 1}, + {1064, 0}, + {1064, 1}, + {1064, 1}, + {1064, 1}, + {1087, 1}, + {1087, 3}, + {1087, 3}, + {1087, 3}, + {1087, 1}, + {1100, 7}, + {1099, 4}, + {847, 15}, + {1205, 0}, + {1205, 3}, + {1163, 0}, + {1163, 3}, + {1057, 0}, + {1057, 1}, + {1031, 0}, + {1031, 2}, + {822, 1}, + {822, 1}, + {1189, 2}, + {1189, 1}, + {1030, 3}, + {1030, 4}, + {1030, 3}, + {1030, 3}, + {841, 1}, + {841, 1}, + {841, 1}, + {931, 0}, + {931, 3}, + {1280, 0}, + {1280, 3}, {1220, 0}, - {1220, 2}, - {1219, 3}, - {1219, 1}, - {1050, 3}, - {1130, 2}, - {1053, 3}, - {1124, 1}, - {1124, 1}, - {1121, 2}, - {1222, 1}, - {1222, 2}, - {1222, 1}, + {1220, 3}, + {1222, 0}, {1222, 2}, - {1291, 1}, - {1291, 3}, - {1046, 2}, - {1046, 3}, - {1046, 3}, - {1045, 1}, - {1045, 2}, + {1221, 3}, + {1221, 1}, + {1055, 3}, + {1133, 2}, + {1058, 3}, + {1128, 1}, + {1128, 1}, + {1125, 2}, + {1224, 1}, + {1224, 2}, + {1224, 1}, + {1224, 2}, + {1293, 1}, + {1293, 3}, + {1051, 2}, {1051, 3}, - {1008, 5}, - {992, 6}, - {965, 6}, - {994, 6}, - {1171, 0}, - {1171, 1}, - {1264, 1}, - {1264, 2}, - {895, 3}, - {895, 3}, - {895, 3}, - {895, 3}, - {895, 3}, - {895, 1}, - {895, 2}, - {895, 3}, - {895, 1}, - {895, 2}, - {895, 3}, - {895, 1}, - {895, 2}, - {895, 1}, - {895, 1}, - {895, 2}, - {794, 1}, - {794, 2}, - {794, 2}, - {1010, 4}, - {967, 5}, - {1144, 1}, - {1144, 2}, - {966, 1}, - {966, 1}, - {966, 3}, - {966, 3}, - {1037, 8}, - {1227, 0}, - {1227, 2}, - {1226, 0}, - {1226, 3}, - {1251, 0}, - {1251, 2}, - {1250, 0}, - {1250, 2}, - {1018, 1}, - {956, 1}, - {956, 3}, - {894, 2}, - {1081, 5}, - {1081, 6}, - {1081, 9}, - {1081, 10}, - {1081, 4}, + {1051, 3}, + {1050, 1}, + {1050, 2}, + {1056, 3}, + {1013, 5}, + {997, 7}, + {970, 6}, + {999, 6}, + {1174, 0}, + {1174, 1}, + {1266, 1}, + {1266, 2}, + {900, 3}, + {900, 3}, + {900, 3}, + {900, 3}, + {900, 3}, + {900, 1}, + {900, 2}, + {900, 3}, + {900, 1}, + {900, 2}, + {900, 3}, + {900, 1}, + {900, 2}, + {900, 1}, + {900, 1}, + {900, 2}, + {802, 1}, + {802, 2}, + {802, 2}, + {1015, 4}, + {972, 5}, + {1147, 1}, + {1147, 2}, + {971, 1}, + {971, 1}, + {971, 3}, + {971, 3}, + {1042, 8}, + {1229, 0}, + {1229, 2}, + {1228, 0}, + {1228, 3}, + {1253, 0}, + {1253, 2}, + {1252, 0}, + {1252, 2}, + {1023, 1}, + {960, 1}, + {960, 3}, + {899, 2}, + {1085, 5}, + {1085, 6}, + {1085, 9}, + {1085, 10}, + {1085, 4}, } yyXErrors = map[yyXError]string{} - yyParseTab = [4162][]uint16{ + yyParseTab = [4165][]uint16{ // 0 - {1975, 1975, 54: 2481, 75: 2596, 77: 2462, 86: 2492, 156: 2464, 160: 2486, 2490, 164: 2461, 191: 2511, 200: 2457, 209: 2510, 2477, 2463, 226: 2489, 231: 2467, 234: 2487, 236: 2458, 238: 2493, 254: 2608, 256: 2479, 260: 2478, 267: 2491, 269: 2459, 271: 2480, 282: 2472, 454: 2501, 2500, 477: 2604, 481: 2499, 487: 2485, 493: 2509, 506: 2599, 510: 2475, 549: 2484, 2498, 628: 2494, 630: 2607, 634: 2460, 2598, 646: 2455, 650: 2466, 655: 2465, 661: 2508, 668: 2456, 690: 2505, 726: 2468, 733: 2507, 2495, 2496, 2497, 2506, 739: 2504, 2503, 2502, 745: 2578, 2577, 2471, 761: 2597, 2469, 769: 2561, 771: 2572, 2588, 785: 2470, 790: 2527, 802: 2515, 808: 2602, 831: 2600, 841: 2482, 868: 2522, 878: 2525, 883: 2564, 893: 2569, 896: 2579, 913: 2534, 917: 2473, 953: 2603, 960: 2513, 2514, 2517, 2518, 965: 2520, 967: 2519, 969: 2516, 971: 2521, 2523, 2524, 975: 2483, 2560, 978: 2530, 988: 2538, 2531, 2532, 2533, 2539, 2537, 2540, 2541, 997: 2536, 2535, 1000: 2526, 2488, 2474, 2542, 2554, 2543, 2544, 2545, 2547, 2551, 2548, 2552, 2553, 2546, 2550, 2549, 1017: 2512, 1021: 2528, 2529, 2476, 1027: 2556, 2555, 1031: 2558, 2559, 2557, 1036: 2594, 2562, 1044: 2606, 2605, 2563, 1051: 2565, 1053: 2591, 1081: 2566, 1083: 2567, 1085: 2568, 1087: 2573, 1090: 2570, 2571, 1093: 2593, 2574, 2601, 2576, 2575, 1103: 2581, 2580, 2584, 1107: 2585, 1109: 2592, 1112: 2582, 2595, 1116: 2583, 1128: 2586, 2587, 2590, 1132: 2589, 1277: 2453, 1280: 2454}, - {2452}, - {2451, 6612}, - {17: 6553, 129: 6550, 155: 6551, 180: 6554, 326: 6552, 470: 4070, 550: 1793, 563: 5916, 827: 6549, 832: 4069}, - {155: 6534, 550: 6533}, + {1991, 1991, 59: 2483, 80: 2598, 82: 2464, 91: 2494, 145: 2466, 151: 2492, 153: 2463, 165: 2488, 196: 2513, 203: 2610, 206: 2459, 215: 2512, 2479, 2465, 232: 2491, 237: 2469, 240: 2489, 242: 2460, 244: 2495, 261: 2481, 265: 2480, 272: 2493, 274: 2461, 277: 2482, 288: 2474, 461: 2503, 2502, 485: 2606, 2501, 493: 2487, 500: 2511, 513: 2601, 517: 2477, 555: 2500, 2486, 633: 2496, 637: 2609, 642: 2462, 2600, 651: 2457, 658: 2468, 663: 2467, 668: 2510, 675: 2458, 698: 2507, 731: 2470, 740: 2509, 2497, 2498, 2499, 2508, 2506, 2505, 2504, 751: 2580, 2579, 2473, 763: 2599, 2471, 768: 2563, 770: 2574, 772: 2590, 782: 2472, 786: 2529, 798: 2604, 811: 2517, 833: 2524, 836: 2527, 842: 2602, 847: 2566, 851: 2571, 2581, 2484, 918: 2536, 922: 2475, 957: 2605, 964: 2515, 966: 2516, 2519, 2520, 970: 2522, 972: 2521, 974: 2518, 976: 2523, 2525, 2526, 980: 2485, 2562, 983: 2532, 993: 2540, 2533, 2534, 2535, 2541, 2539, 2542, 2543, 1002: 2538, 2537, 1005: 2528, 2490, 2476, 2544, 2556, 2545, 2546, 2547, 2549, 2553, 2550, 2554, 2555, 2548, 2552, 2551, 1022: 2514, 1026: 2530, 2531, 2478, 1032: 2558, 2557, 1036: 2560, 2561, 2559, 1041: 2596, 2564, 1049: 2608, 2607, 2565, 1056: 2567, 1058: 2593, 1085: 2568, 2569, 1088: 2570, 1090: 2575, 1093: 2572, 2573, 1096: 2595, 2576, 2603, 2578, 2577, 1106: 2583, 2582, 2586, 1110: 2587, 1112: 2594, 1115: 2584, 2597, 1120: 2585, 1131: 2588, 2589, 2592, 1135: 2591, 1279: 2455, 1282: 2456}, + {2454}, + {2453, 6617}, + {16: 6558, 132: 6555, 161: 6556, 185: 6559, 332: 6557, 476: 4080, 555: 1807, 571: 5913, 838: 6554, 843: 4079}, + {161: 6539, 555: 6538}, // 5 - {550: 6527}, - {550: 6522}, - {359: 6503, 469: 6504, 550: 2289, 1275: 6502}, - {324: 6460, 550: 6459}, - {2259, 2259, 346: 6458, 353: 6457}, + {555: 6532}, + {555: 6527}, + {363: 6508, 477: 6509, 555: 2307, 1277: 6507}, + {330: 6463, 555: 6462}, + {2275, 2275, 350: 6461, 357: 6460}, // 10 - {385: 6446}, - {456: 6445}, - {2226, 2226, 76: 5759, 486: 5757, 838: 5758, 985: 6444}, - {17: 6263, 87: 2025, 93: 6261, 2025, 129: 6259, 137: 2025, 149: 569, 153: 5414, 155: 6260, 157: 6181, 180: 6264, 203: 5885, 6251, 489: 6258, 550: 1994, 563: 5916, 624: 6253, 630: 2119, 649: 2025, 657: 6255, 827: 6256, 920: 6262, 929: 5413, 1206: 6252, 1244: 6257, 1274: 6254}, - {17: 6188, 93: 6184, 6182, 107: 1994, 129: 6186, 149: 569, 153: 5414, 155: 6183, 157: 6181, 160: 992, 180: 6189, 203: 5885, 6177, 270: 6185, 550: 1994, 563: 5916, 630: 6179, 827: 6178, 920: 6187, 929: 6180}, + {388: 6449}, + {463: 6448}, + {2242, 2242, 81: 5755, 494: 5753, 849: 5754, 990: 6447}, + {16: 2041, 92: 2041, 99: 2041, 132: 6262, 139: 2041, 154: 574, 159: 5410, 161: 6263, 6184, 166: 6264, 185: 6266, 209: 5882, 6254, 496: 6261, 555: 2010, 571: 5913, 631: 6256, 637: 2135, 657: 2041, 665: 6258, 838: 6259, 925: 6265, 934: 5409, 1208: 6255, 1246: 6260, 1276: 6257}, + {16: 6191, 99: 6185, 110: 2010, 132: 6189, 154: 574, 159: 5410, 161: 6186, 6184, 165: 999, 6187, 185: 6192, 209: 5882, 6180, 275: 6188, 555: 2010, 571: 5913, 637: 6182, 838: 6181, 925: 6190, 934: 6183}, // 15 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3473, 756: 6176}, - {2: 813, 813, 813, 813, 813, 8: 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 54: 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 470: 813, 479: 813, 730: 813, 813, 813, 738: 5226, 842: 5227, 901: 6142}, - {2002, 2002}, - {2001, 2001}, - {454: 2501, 481: 2499, 550: 2498, 628: 2494, 635: 2598, 690: 3771, 726: 2468, 733: 3770, 2495, 2496, 2497, 2506, 739: 2504, 3772, 3773, 761: 6141, 6139, 785: 6140}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3482, 765: 6179}, + {2: 820, 820, 820, 820, 820, 8: 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 58: 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 476: 820, 489: 820, 737: 820, 820, 820, 748: 5222, 854: 5223, 905: 6145}, + {2018, 2018}, + {2017, 2017}, + {461: 2503, 486: 2501, 555: 2500, 633: 2496, 643: 2600, 698: 3780, 731: 2470, 740: 3779, 2497, 2498, 2499, 2508, 2506, 3781, 3782, 763: 6144, 6142, 782: 6143}, // 20 - {77: 2462, 156: 2464, 161: 2490, 164: 2461, 319: 6120, 454: 2501, 2500, 481: 2499, 487: 2485, 493: 6123, 549: 2484, 2498, 628: 2494, 635: 2598, 690: 6121, 726: 2468, 733: 6122, 2495, 2496, 2497, 2506, 739: 2504, 2503, 2502, 745: 6129, 6128, 2471, 761: 2597, 2469, 769: 6126, 771: 6127, 6125, 785: 2470, 790: 6124, 808: 6135, 868: 6131, 878: 6132, 883: 6130, 893: 6133, 896: 6134, 1127: 6119}, - {2: 1972, 1972, 1972, 1972, 1972, 8: 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 54: 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972, 454: 1972, 1972, 474: 1972, 481: 1972, 487: 1972, 549: 1972, 1972, 628: 1972, 634: 1972, 1972, 646: 1972, 726: 1972}, - {2: 1971, 1971, 1971, 1971, 1971, 8: 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 54: 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971, 454: 1971, 1971, 474: 1971, 481: 1971, 487: 1971, 549: 1971, 1971, 628: 1971, 634: 1971, 1971, 646: 1971, 726: 1971}, - {2: 1970, 1970, 1970, 1970, 1970, 8: 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 54: 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970, 454: 1970, 1970, 474: 1970, 481: 1970, 487: 1970, 549: 1970, 1970, 628: 1970, 634: 1970, 1970, 646: 1970, 726: 1970}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 6096, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 454: 2501, 2500, 474: 6095, 481: 2499, 487: 2485, 549: 2484, 2498, 628: 2494, 634: 6097, 2598, 640: 3804, 2668, 2669, 2667, 646: 2614, 690: 2615, 719: 6093, 726: 2468, 733: 2616, 2495, 2496, 2497, 2506, 739: 2504, 2503, 2502, 745: 2622, 2621, 2471, 761: 2597, 2469, 769: 2619, 771: 2620, 2618, 785: 2470, 790: 2617, 802: 2623, 829: 6094}, + {82: 2464, 145: 2466, 151: 2492, 153: 2463, 203: 6118, 324: 6117, 461: 2503, 2502, 486: 2501, 493: 2487, 500: 6121, 555: 2500, 2486, 633: 2496, 643: 2600, 698: 6119, 731: 2470, 740: 6120, 2497, 2498, 2499, 2508, 2506, 2505, 2504, 751: 6127, 6126, 2473, 763: 2599, 2471, 768: 6124, 770: 6125, 772: 6123, 782: 2472, 786: 6122, 798: 6133, 833: 6129, 836: 6130, 847: 6128, 851: 6131, 6132, 907: 6116}, + {2: 1986, 1986, 1986, 1986, 1986, 8: 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 58: 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 1986, 461: 1986, 1986, 481: 1986, 486: 1986, 493: 1986, 555: 1986, 1986, 633: 1986, 642: 1986, 1986, 651: 1986, 731: 1986}, + {2: 1985, 1985, 1985, 1985, 1985, 8: 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 58: 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 1985, 461: 1985, 1985, 481: 1985, 486: 1985, 493: 1985, 555: 1985, 1985, 633: 1985, 642: 1985, 1985, 651: 1985, 731: 1985}, + {2: 1984, 1984, 1984, 1984, 1984, 8: 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 58: 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 1984, 461: 1984, 1984, 481: 1984, 486: 1984, 493: 1984, 555: 1984, 1984, 633: 1984, 642: 1984, 1984, 651: 1984, 731: 1984}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 6093, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 461: 2503, 2502, 481: 6092, 486: 2501, 493: 2487, 555: 2500, 2486, 633: 2496, 642: 6094, 2600, 651: 2616, 3813, 2670, 2671, 2669, 698: 2617, 726: 6090, 731: 2470, 740: 2618, 2497, 2498, 2499, 2508, 2506, 2505, 2504, 751: 2624, 2623, 2473, 763: 2599, 2471, 768: 2621, 770: 2622, 772: 2620, 782: 2472, 786: 2619, 811: 2625, 840: 6091}, // 25 - {550: 6011, 563: 5916, 827: 6010, 974: 6089}, - {550: 6011, 563: 5916, 827: 6010, 974: 6009}, - {129: 6007}, - {129: 6002}, - {129: 5996}, + {555: 6008, 571: 5913, 838: 6007, 979: 6086}, + {555: 6008, 571: 5913, 838: 6007, 979: 6006}, + {132: 6004}, + {132: 5999}, + {132: 5993}, // 30 - {14: 3719, 17: 5851, 95: 566, 104: 566, 107: 566, 122: 569, 129: 5840, 136: 569, 157: 5884, 176: 5849, 184: 569, 192: 5886, 5863, 198: 5872, 566, 203: 5885, 232: 5869, 255: 5868, 288: 5881, 293: 5850, 300: 5865, 5879, 303: 5857, 310: 5855, 312: 5871, 316: 5861, 320: 5870, 5844, 323: 5883, 325: 5853, 337: 5845, 345: 5859, 355: 5848, 5847, 363: 5882, 368: 5877, 5878, 5875, 5874, 5876, 386: 5866, 391: 5862, 485: 3720, 550: 5843, 629: 3718, 5852, 634: 5880, 655: 5842, 754: 5858, 897: 5873, 920: 5864, 925: 5854, 939: 5867, 999: 5856, 1067: 5846, 1267: 5860, 1273: 5841}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 5829, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5831, 2668, 2669, 2667, 1254: 5830}, - {2: 813, 813, 813, 813, 813, 8: 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 54: 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 470: 813, 476: 813, 730: 813, 813, 813, 738: 5226, 842: 5227, 901: 5816}, - {2: 1015, 1015, 1015, 1015, 1015, 8: 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 54: 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 476: 1015, 730: 5231, 5230, 5229, 818: 5232, 861: 5782}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5777, 2668, 2669, 2667}, + {13: 3728, 16: 5847, 39: 5873, 5872, 98: 571, 107: 571, 110: 571, 125: 574, 132: 5836, 138: 574, 162: 5881, 180: 5845, 189: 574, 197: 5883, 5859, 204: 5868, 571, 209: 5882, 238: 5865, 260: 5864, 294: 5878, 299: 5846, 306: 5861, 5876, 309: 5853, 316: 5851, 318: 5867, 322: 5857, 325: 5866, 5840, 5875, 329: 5880, 331: 5849, 341: 5841, 349: 5855, 359: 5844, 5843, 367: 5879, 372: 5874, 5871, 5870, 389: 5862, 393: 5858, 488: 3729, 555: 5839, 636: 3727, 5848, 642: 5877, 663: 5838, 761: 5854, 901: 5869, 925: 5860, 930: 5850, 943: 5863, 1004: 5852, 1071: 5842, 1269: 5856, 1275: 5837}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 5825, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5827, 2670, 2671, 2669, 1256: 5826}, + {2: 820, 820, 820, 820, 820, 8: 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 58: 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 476: 820, 483: 820, 737: 820, 820, 820, 748: 5222, 854: 5223, 905: 5812}, + {2: 1022, 1022, 1022, 1022, 1022, 8: 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 58: 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 483: 1022, 737: 5227, 5226, 5225, 826: 5228, 873: 5778}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5773, 2670, 2671, 2669}, // 35 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5771, 2668, 2669, 2667}, - {160: 5769}, - {160: 993}, - {991, 991, 76: 5759, 486: 5757, 838: 5758, 985: 5756}, - {982, 982}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5767, 2670, 2671, 2669}, + {165: 5765}, + {165: 1000}, + {998, 998, 81: 5755, 494: 5753, 849: 5754, 990: 5752}, + {989, 989}, // 40 - {981, 981}, - {456: 5755}, - {2: 818, 818, 818, 818, 818, 8: 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 54: 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 5726, 5732, 5733, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 454: 818, 456: 818, 818, 818, 818, 464: 818, 818, 818, 818, 818, 473: 818, 481: 818, 485: 818, 487: 818, 818, 495: 5729, 504: 818, 524: 818, 547: 818, 818, 818, 551: 818, 818, 818, 818, 818, 557: 818, 818, 818, 818, 818, 818, 818, 818, 567: 818, 569: 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 631: 818, 718: 3431, 727: 3429, 3430, 730: 5231, 5230, 5229, 738: 5226, 750: 5725, 5728, 5724, 763: 5647, 767: 5722, 818: 5723, 842: 5721, 1100: 5731, 5727, 1262: 5720, 5730}, - {237, 237, 53: 237, 453: 237, 455: 237, 461: 237, 463: 237, 471: 237, 237, 474: 237, 237, 237, 237, 479: 5695, 237, 482: 2628, 484: 237, 494: 237, 773: 2629, 5696, 1193: 5694}, - {808, 808, 53: 808, 453: 808, 455: 808, 461: 808, 463: 808, 471: 808, 808, 474: 808, 808, 808, 808, 480: 808, 484: 808, 494: 5685, 921: 5687, 945: 5686}, + {988, 988}, + {463: 5751}, + {2: 825, 825, 825, 825, 825, 8: 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 58: 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 5722, 5728, 5729, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 461: 825, 463: 825, 825, 825, 825, 471: 825, 825, 825, 825, 825, 480: 825, 486: 825, 488: 825, 493: 825, 495: 825, 502: 5725, 511: 825, 531: 825, 554: 825, 556: 825, 825, 825, 825, 825, 825, 825, 825, 825, 566: 825, 825, 825, 825, 571: 825, 825, 574: 825, 576: 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 638: 825, 640: 3440, 734: 3438, 3439, 737: 5227, 5226, 5225, 748: 5222, 757: 5721, 5724, 5720, 773: 5643, 776: 5718, 826: 5719, 854: 5717, 1103: 5727, 5723, 1264: 5716, 5726}, + {237, 237, 57: 237, 460: 237, 462: 237, 468: 237, 470: 237, 478: 237, 237, 481: 237, 237, 237, 485: 237, 489: 5691, 237, 2630, 237, 501: 237, 779: 2631, 5692, 1196: 5690}, + {815, 815, 57: 815, 460: 815, 462: 815, 468: 815, 470: 815, 478: 815, 815, 481: 815, 815, 815, 485: 815, 490: 815, 492: 815, 501: 5681, 926: 5683, 949: 5682}, // 45 - {1253, 1253, 53: 1253, 453: 1253, 455: 1253, 461: 1253, 463: 1253, 471: 1253, 1253, 474: 1253, 1253, 1253, 1253, 480: 1253, 484: 2631, 748: 2632, 792: 5681}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 5676}, - {554: 3779, 894: 3778, 956: 3777}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5663, 2668, 2669, 2667, 912: 5662, 1140: 5660, 1255: 5661}, - {454: 2501, 2500, 481: 2499, 550: 2498, 628: 2494, 690: 5659, 733: 3764, 2495, 2496, 2497, 2506, 739: 2504, 2503, 2502, 745: 3766, 3765, 3763}, + {1260, 1260, 57: 1260, 460: 1260, 462: 1260, 468: 1260, 470: 1260, 478: 1260, 1260, 481: 1260, 1260, 1260, 485: 1260, 490: 1260, 492: 2633, 755: 2634, 800: 5677}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 5672}, + {563: 3788, 899: 3787, 960: 3786}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5659, 2670, 2671, 2669, 917: 5658, 1143: 5656, 1257: 5657}, + {461: 2503, 2502, 486: 2501, 555: 2500, 633: 2496, 698: 5655, 740: 3773, 2497, 2498, 2499, 2508, 2506, 2505, 2504, 751: 3775, 3774, 3772}, // 50 - {790, 790, 53: 790, 453: 790, 455: 790, 463: 790}, - {789, 789, 53: 789, 453: 789, 455: 789, 463: 789}, - {461: 5644, 471: 5645, 5646, 1265: 5643}, - {468, 468, 461: 775, 471: 775, 775, 475: 2634, 480: 2635, 484: 2631, 748: 3774, 3775}, - {461: 778, 471: 778, 778}, + {796, 796, 57: 796, 460: 796, 462: 796, 470: 796}, + {795, 795, 57: 795, 460: 795, 462: 795, 470: 795}, + {468: 5640, 478: 5641, 5642, 1267: 5639}, + {473, 473, 468: 781, 478: 781, 781, 482: 2636, 490: 2637, 492: 2633, 755: 3783, 3784}, + {468: 784, 478: 784, 784}, // 55 - {470, 470, 461: 776, 471: 776, 776}, - {232: 5628, 255: 5627}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 5511, 5516, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 5517, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 5514, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 5513, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 5518, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 5512, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 5519, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 5515, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 459: 5521, 485: 3720, 548: 5525, 569: 5524, 629: 3718, 640: 5522, 2668, 2669, 2667, 754: 5526, 811: 5523, 958: 5527, 1134: 5520}, - {27: 5396, 191: 5401, 198: 5399, 200: 5394, 5400, 259: 5398, 294: 5397, 5402, 298: 5395, 313: 5403, 362: 5404, 566: 5393, 841: 5392}, - {31: 545, 107: 545, 122: 545, 133: 4584, 140: 545, 176: 545, 181: 545, 190: 545, 206: 545, 217: 545, 237: 545, 240: 545, 524: 545, 550: 545, 799: 4583, 817: 5365}, + {475, 475, 468: 782, 478: 782, 782}, + {238: 5624, 260: 5623}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 5507, 5512, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 5510, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 5509, 3260, 2744, 2748, 5513, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 5514, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 5508, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 5515, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 5511, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 466: 5517, 488: 3729, 557: 5521, 576: 5520, 636: 3727, 652: 5518, 2670, 2671, 2669, 761: 5522, 819: 5519, 962: 5523, 1137: 5516}, + {27: 5392, 196: 5397, 204: 5395, 206: 5390, 5396, 264: 5394, 300: 5393, 5398, 304: 5391, 319: 5399, 366: 5400, 573: 5389, 853: 5388}, + {31: 550, 110: 550, 125: 550, 136: 4630, 142: 550, 180: 550, 186: 550, 195: 550, 212: 550, 223: 550, 243: 550, 246: 550, 531: 550, 555: 550, 807: 4629, 825: 5361}, // 60 + {541, 541}, + {540, 540}, + {539, 539}, + {538, 538}, + {537, 537}, + // 65 {536, 536}, {535, 535}, {534, 534}, {533, 533}, {532, 532}, - // 65 + // 70 {531, 531}, {530, 530}, {529, 529}, {528, 528}, {527, 527}, - // 70 + // 75 {526, 526}, {525, 525}, {524, 524}, {523, 523}, {522, 522}, - // 75 + // 80 {521, 521}, {520, 520}, {519, 519}, {518, 518}, {517, 517}, - // 80 + // 85 {516, 516}, {515, 515}, {514, 514}, {513, 513}, {512, 512}, - // 85 + // 90 {511, 511}, {510, 510}, {509, 509}, {508, 508}, {507, 507}, - // 90 + // 95 {506, 506}, {505, 505}, {504, 504}, {503, 503}, {502, 502}, - // 95 + // 100 {501, 501}, {500, 500}, {499, 499}, {498, 498}, {497, 497}, - // 100 + // 105 {496, 496}, {495, 495}, {494, 494}, {493, 493}, {492, 492}, - // 105 + // 110 {491, 491}, {490, 490}, {489, 489}, {488, 488}, {487, 487}, - // 110 + // 115 {486, 486}, {485, 485}, {484, 484}, {483, 483}, {482, 482}, - // 115 + // 120 {481, 481}, {480, 480}, {479, 479}, {478, 478}, {477, 477}, - // 120 + // 125 {476, 476}, - {475, 475}, {474, 474}, - {473, 473}, {472, 472}, - // 125 {471, 471}, + {470, 470}, + // 130 {469, 469}, + {468, 468}, {467, 467}, {466, 466}, {465, 465}, - // 130 + // 135 {464, 464}, {463, 463}, {462, 462}, {461, 461}, {460, 460}, - // 135 + // 140 {459, 459}, {458, 458}, {457, 457}, - {456, 456}, - {455, 455}, - // 140 - {454, 454}, - {453, 453}, - {452, 452}, - {429, 429}, - {2: 380, 380, 380, 380, 380, 8: 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 54: 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 550: 5362, 1240: 5363}, + {434, 434}, + {2: 380, 380, 380, 380, 380, 8: 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 58: 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 555: 5358, 1242: 5359}, // 145 - {243, 243, 463: 243}, - {2: 813, 813, 813, 813, 813, 8: 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 54: 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 454: 813, 470: 813, 558: 813, 730: 813, 813, 813, 738: 5226, 842: 5227, 901: 5228}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5224, 2668, 2669, 2667, 796: 5225}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 5069, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 5071, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 5077, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 5073, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 5070, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 5078, 3094, 2831, 3049, 5072, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 5075, 5179, 2745, 5076, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 5074, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 5080, 477: 5103, 549: 5097, 626: 5101, 628: 5086, 630: 5096, 635: 5099, 640: 3376, 2668, 2669, 2667, 646: 5091, 650: 5095, 655: 5092, 718: 5090, 720: 5079, 726: 5094, 781: 5081, 808: 5085, 831: 5100, 841: 5098, 918: 5082, 937: 5083, 5089, 943: 5084, 5087, 952: 5093, 954: 5102, 1098: 5180}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 5069, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 5071, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 5077, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 5073, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 5070, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 5078, 3094, 2831, 3049, 5072, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 5075, 2744, 2745, 5076, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 5074, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 5080, 477: 5103, 549: 5097, 626: 5101, 628: 5086, 630: 5096, 635: 5099, 640: 3376, 2668, 2669, 2667, 646: 5091, 650: 5095, 655: 5092, 718: 5090, 720: 5079, 726: 5094, 781: 5081, 808: 5085, 831: 5100, 841: 5098, 918: 5082, 937: 5083, 5089, 943: 5084, 5087, 952: 5093, 954: 5102, 1098: 5088}, + {243, 243, 470: 243}, + {2: 820, 820, 820, 820, 820, 8: 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 58: 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 461: 820, 476: 820, 567: 820, 737: 820, 820, 820, 748: 5222, 854: 5223, 905: 5224}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5220, 2670, 2671, 2669, 804: 5221}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 5065, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 5067, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 5073, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 5069, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 5066, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 5074, 3103, 2837, 3057, 5068, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 5071, 5175, 2751, 2987, 5072, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 5070, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 5076, 485: 5099, 556: 5093, 633: 5082, 5097, 637: 5092, 640: 5086, 643: 5095, 651: 5087, 3385, 2670, 2671, 2669, 658: 5091, 663: 5088, 727: 5075, 731: 5090, 790: 5077, 798: 5081, 842: 5096, 853: 5094, 923: 5078, 941: 5079, 5085, 947: 5080, 5083, 956: 5089, 958: 5098, 1101: 5176}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 5065, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 5067, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 5073, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 5069, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 5066, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 5074, 3103, 2837, 3057, 5068, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 5071, 2750, 2751, 2987, 5072, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 5070, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 5076, 485: 5099, 556: 5093, 633: 5082, 5097, 637: 5092, 640: 5086, 643: 5095, 651: 5087, 3385, 2670, 2671, 2669, 658: 5091, 663: 5088, 727: 5075, 731: 5090, 790: 5077, 798: 5081, 842: 5096, 853: 5094, 923: 5078, 941: 5079, 5085, 947: 5080, 5083, 956: 5089, 958: 5098, 1101: 5084}, // 150 - {32: 5028, 270: 5029}, - {107: 5015, 550: 5016, 1124: 5027}, - {107: 5015, 550: 5016, 1124: 5014}, - {37: 5010, 141: 5011, 488: 2642, 716: 5009}, - {37: 56, 141: 56, 206: 5008, 488: 56}, + {32: 5024, 275: 5025}, + {110: 5011, 555: 5012, 1128: 5023}, + {110: 5011, 555: 5012, 1128: 5010}, + {37: 5006, 143: 5007, 495: 2644, 724: 5005}, + {37: 56, 143: 56, 212: 5004, 495: 56}, // 155 - {284: 4991}, - {360: 2609}, - {309: 2610, 808: 2611}, - {917: 2613}, - {456: 2612}, + {290: 4987}, + {364: 2611}, + {315: 2612, 798: 2613}, + {922: 2615}, + {463: 2614}, // 160 {1, 1}, - {181: 2626, 454: 2501, 2500, 481: 2499, 487: 2485, 549: 2484, 2498, 628: 2494, 634: 2625, 2598, 646: 2614, 690: 2615, 726: 2468, 733: 2616, 2495, 2496, 2497, 2506, 739: 2504, 2503, 2502, 745: 2622, 2621, 2471, 761: 2597, 2469, 769: 2619, 771: 2620, 2618, 785: 2470, 790: 2617, 802: 2623, 829: 2624}, - {470: 4070, 550: 1793, 832: 4069}, - {431, 431, 461: 775, 471: 775, 775, 475: 2634, 480: 2635, 484: 2631, 748: 3774, 3775}, - {433, 433, 461: 776, 471: 776, 776}, + {186: 2628, 461: 2503, 2502, 486: 2501, 493: 2487, 555: 2500, 2486, 633: 2496, 642: 2627, 2600, 651: 2616, 698: 2617, 731: 2470, 740: 2618, 2497, 2498, 2499, 2508, 2506, 2505, 2504, 751: 2624, 2623, 2473, 763: 2599, 2471, 768: 2621, 770: 2622, 772: 2620, 782: 2472, 786: 2619, 811: 2625, 840: 2626}, + {476: 4080, 555: 1807, 843: 4079}, + {436, 436, 468: 781, 478: 781, 781, 482: 2636, 490: 2637, 492: 2633, 755: 3783, 3784}, + {438, 438, 468: 782, 478: 782, 782}, // 165 - {438, 438}, + {443, 443}, + {442, 442}, + {441, 441}, + {440, 440}, + {439, 439}, + // 170 {437, 437}, - {436, 436}, {435, 435}, - {434, 434}, - // 170 - {432, 432}, - {430, 430}, {5, 5}, - {181: 4064, 454: 2501, 2500, 481: 2499, 487: 2485, 549: 2484, 2498, 628: 2494, 635: 2598, 646: 2614, 690: 2615, 726: 2468, 733: 2616, 2495, 2496, 2497, 2506, 739: 2504, 2503, 2502, 745: 2622, 2621, 2471, 761: 2597, 2469, 769: 2619, 771: 2620, 2618, 785: 2470, 790: 2617, 802: 2623, 829: 4063}, - {141: 2627}, + {186: 4074, 461: 2503, 2502, 486: 2501, 493: 2487, 555: 2500, 2486, 633: 2496, 643: 2600, 651: 2616, 698: 2617, 731: 2470, 740: 2618, 2497, 2498, 2499, 2508, 2506, 2505, 2504, 751: 2624, 2623, 2473, 763: 2599, 2471, 768: 2621, 770: 2622, 772: 2620, 782: 2472, 786: 2619, 811: 2625, 840: 4073}, + {143: 2629}, // 175 - {237, 237, 475: 237, 480: 237, 482: 2628, 484: 237, 773: 2629, 2630}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 4062}, - {236, 236, 53: 236, 453: 236, 455: 236, 461: 236, 463: 236, 471: 236, 236, 474: 236, 236, 236, 236, 480: 236, 484: 236, 494: 236, 496: 236, 236}, - {1253, 1253, 475: 1253, 480: 1253, 484: 2631, 748: 2632, 792: 2633}, - {644: 2656}, + {237, 237, 482: 237, 490: 237, 2630, 237, 779: 2631, 2632}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 4072}, + {236, 236, 57: 236, 460: 236, 462: 236, 468: 236, 470: 236, 478: 236, 236, 481: 236, 236, 236, 485: 236, 490: 236, 492: 236, 501: 236, 503: 236, 236}, + {1260, 1260, 482: 1260, 490: 1260, 492: 2633, 755: 2634, 800: 2635}, + {648: 2658}, // 180 - {1252, 1252, 53: 1252, 121: 1252, 453: 1252, 455: 1252, 461: 1252, 463: 1252, 471: 1252, 1252, 474: 1252, 1252, 1252, 1252, 480: 1252}, - {829, 829, 475: 2634, 480: 2635, 749: 2636, 809: 2637}, - {488: 2642, 557: 2644, 716: 2641, 725: 2643, 855: 2651}, - {8: 2638, 249: 2639, 1188: 2640}, - {828, 828, 53: 828, 453: 828, 455: 828, 461: 828, 463: 828, 471: 828, 828, 474: 828, 476: 828, 828}, + {1259, 1259, 57: 1259, 124: 1259, 460: 1259, 462: 1259, 468: 1259, 470: 1259, 478: 1259, 1259, 481: 1259, 1259, 1259, 485: 1259, 490: 1259}, + {836, 836, 482: 2636, 490: 2637, 756: 2638, 817: 2639}, + {495: 2644, 566: 2646, 724: 2643, 733: 2645, 868: 2653}, + {8: 2640, 255: 2641, 1191: 2642}, + {835, 835, 57: 835, 460: 835, 462: 835, 468: 835, 470: 835, 478: 835, 835, 481: 835, 483: 835, 485: 835}, // 185 {3, 3}, - {488: 837, 505: 837, 554: 837, 557: 837}, - {488: 836, 505: 836, 554: 836, 557: 836}, - {488: 2642, 505: 835, 554: 835, 557: 2644, 716: 2641, 725: 2643, 855: 2645, 1183: 2646}, - {1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 13: 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 53: 1912, 1912, 56: 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 87: 1912, 1912, 1912, 1912, 1912, 1912, 1912, 96: 1912, 1912, 100: 1912, 102: 1912, 1912, 105: 1912, 1912, 108: 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 1912, 159: 1912, 194: 1912, 1912, 453: 1912, 1912, 1912, 459: 1912, 1912, 1912, 1912, 1912, 469: 1912, 1912, 1912, 1912, 474: 1912, 476: 1912, 1912, 481: 1912, 483: 1912, 485: 1912, 487: 1912, 505: 1912, 550: 1912, 554: 1912, 628: 1912, 1912, 1912, 634: 1912}, + {495: 844, 512: 844, 563: 844, 566: 844}, + {495: 843, 512: 843, 563: 843, 566: 843}, + {495: 2644, 512: 842, 563: 842, 566: 2646, 724: 2643, 733: 2645, 868: 2647, 1186: 2648}, + {1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 13: 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 59: 1926, 61: 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 92: 1926, 1926, 1926, 1926, 1926, 1926, 100: 1926, 103: 1926, 105: 1926, 1926, 108: 1926, 1926, 111: 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 164: 1926, 199: 1926, 1926, 460: 1926, 1926, 1926, 466: 1926, 1926, 1926, 1926, 1926, 476: 1926, 1926, 1926, 1926, 481: 1926, 483: 1926, 485: 1926, 1926, 1926, 1926, 493: 1926, 512: 1926, 555: 1926, 563: 1926, 633: 1926, 636: 1926, 1926, 642: 1926}, // 190 - {1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 13: 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 56: 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 96: 1910, 1910, 100: 1910, 102: 1910, 1910, 105: 1910, 1910, 108: 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 123: 1910, 1910, 1910, 1910, 159: 1910, 171: 1910, 175: 1910, 194: 1910, 1910, 214: 1910, 218: 1910, 263: 1910, 281: 1910, 453: 1910, 1910, 1910, 459: 1910, 1910, 1910, 1910, 1910, 469: 1910, 1910, 1910, 1910, 474: 1910, 1910, 1910, 1910, 480: 1910, 1910, 1910, 1910, 485: 1910, 487: 1910, 505: 1910, 550: 1910, 554: 1910, 628: 1910, 1910, 1910, 634: 1910, 638: 1910, 1910}, - {841, 841, 7: 841, 53: 841, 159: 841, 453: 841, 455: 841, 461: 841, 463: 841, 471: 841, 841, 474: 841, 476: 841, 841, 505: 841, 554: 841}, - {840, 840, 7: 840, 53: 840, 159: 840, 453: 840, 455: 840, 461: 840, 463: 840, 471: 840, 840, 474: 840, 476: 840, 840, 505: 840, 554: 840}, - {505: 834, 554: 834}, - {505: 2648, 554: 2647, 1260: 2649}, + {1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 13: 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 61: 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 100: 1924, 103: 1924, 105: 1924, 1924, 108: 1924, 1924, 111: 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 126: 1924, 1924, 1924, 1924, 164: 1924, 175: 1924, 179: 1924, 199: 1924, 1924, 460: 1924, 1924, 1924, 466: 1924, 1924, 1924, 1924, 1924, 476: 1924, 1924, 1924, 1924, 481: 1924, 1924, 1924, 485: 1924, 1924, 1924, 1924, 490: 1924, 1924, 493: 1924, 512: 1924, 555: 1924, 563: 1924, 633: 1924, 636: 1924, 1924, 642: 1924, 646: 1924, 1924}, + {848, 848, 7: 848, 57: 848, 164: 848, 460: 848, 462: 848, 468: 848, 470: 848, 478: 848, 848, 481: 848, 483: 848, 485: 848, 512: 848, 563: 848}, + {847, 847, 7: 847, 57: 847, 164: 847, 460: 847, 462: 847, 468: 847, 470: 847, 478: 847, 847, 481: 847, 483: 847, 485: 847, 512: 847, 563: 847}, + {512: 841, 563: 841}, + {512: 2650, 563: 2649, 1262: 2651}, // 195 - {147: 839}, - {147: 838}, - {147: 2650}, - {830, 830, 53: 830, 453: 830, 455: 830, 461: 830, 463: 830, 471: 830, 830, 474: 830, 476: 830, 830}, - {833, 833, 7: 2652, 53: 833, 159: 2653, 453: 833, 455: 833, 461: 833, 463: 833, 471: 833, 833, 474: 833, 476: 833, 833}, + {150: 846}, + {150: 845}, + {150: 2652}, + {837, 837, 57: 837, 460: 837, 462: 837, 468: 837, 470: 837, 478: 837, 837, 481: 837, 483: 837, 485: 837}, + {840, 840, 7: 2654, 57: 840, 164: 2655, 460: 840, 462: 840, 468: 840, 470: 840, 478: 840, 840, 481: 840, 483: 840, 485: 840}, // 200 - {488: 2642, 557: 2644, 716: 2641, 725: 2643, 855: 2655}, - {488: 2642, 557: 2644, 716: 2641, 725: 2643, 855: 2654}, - {831, 831, 53: 831, 453: 831, 455: 831, 461: 831, 463: 831, 471: 831, 831, 474: 831, 476: 831, 831}, - {832, 832, 53: 832, 453: 832, 455: 832, 461: 832, 463: 832, 471: 832, 832, 474: 832, 476: 832, 832}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 2660, 846: 3128, 876: 3127}, + {495: 2644, 566: 2646, 724: 2643, 733: 2645, 868: 2657}, + {495: 2644, 566: 2646, 724: 2643, 733: 2645, 868: 2656}, + {838, 838, 57: 838, 460: 838, 462: 838, 468: 838, 470: 838, 478: 838, 838, 481: 838, 483: 838, 485: 838}, + {839, 839, 57: 839, 460: 839, 462: 839, 468: 839, 470: 839, 478: 839, 839, 481: 839, 483: 839, 485: 839}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 2662, 858: 3137, 887: 3136}, // 205 - {1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 4059, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 455: 1480, 1480, 1480, 1480, 460: 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 470: 1480, 1480, 1480, 474: 1480, 1480, 1480, 1480, 1480, 1480, 1480, 482: 1480, 1480, 1480, 486: 1480, 489: 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 525: 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 565: 1480, 633: 1480, 636: 1480, 1480}, - {1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 4056, 1479, 1479, 1479, 1479, 460: 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 470: 1479, 1479, 1479, 474: 1479, 1479, 1479, 1479, 1479, 1479, 1479, 482: 1479, 1479, 1479, 486: 1479, 489: 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 525: 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 565: 1479, 633: 1479, 636: 1479, 1479}, - {710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 455: 710, 710, 710, 710, 460: 710, 710, 710, 710, 710, 710, 710, 710, 710, 470: 710, 710, 710, 474: 710, 710, 710, 710, 710, 710, 710, 482: 710, 710, 710, 486: 710, 489: 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 525: 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 565: 710, 645: 4054}, - {1260, 1260, 7: 1260, 53: 1260, 121: 1260, 453: 1260, 455: 1260, 461: 1260, 463: 1260, 471: 1260, 1260, 474: 1260, 1260, 1260, 1260, 480: 1260, 484: 1260, 486: 3233, 489: 3231, 3232, 3230, 3228, 496: 1260, 1260, 505: 1260, 508: 1260, 1260, 4053, 4052, 714: 3229, 3227, 1243: 4051}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 4050}, + {1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 4069, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 462: 1490, 1490, 1490, 1490, 467: 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 478: 1490, 1490, 481: 1490, 1490, 1490, 1490, 1490, 487: 1490, 489: 1490, 1490, 1490, 1490, 494: 1490, 496: 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 532: 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 570: 1490, 641: 1490, 644: 1490, 1490}, + {1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 4066, 1489, 1489, 1489, 1489, 467: 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 478: 1489, 1489, 481: 1489, 1489, 1489, 1489, 1489, 487: 1489, 489: 1489, 1489, 1489, 1489, 494: 1489, 496: 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 532: 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 570: 1489, 641: 1489, 644: 1489, 1489}, + {716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 462: 716, 716, 716, 716, 467: 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 478: 716, 716, 481: 716, 716, 716, 716, 716, 487: 716, 489: 716, 716, 716, 716, 494: 716, 496: 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 532: 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 570: 716, 649: 4064}, + {1267, 1267, 7: 1267, 57: 1267, 124: 1267, 460: 1267, 462: 1267, 468: 1267, 470: 1267, 478: 1267, 1267, 481: 1267, 1267, 1267, 485: 1267, 490: 1267, 492: 1267, 494: 3242, 496: 3240, 3241, 3239, 3237, 503: 1267, 1267, 512: 1267, 515: 1267, 1267, 4063, 4062, 722: 3238, 3236, 1245: 4061}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 4060}, // 210 - {454: 4022}, - {1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 455: 1872, 1872, 460: 1872, 1872, 463: 1872, 1872, 1872, 470: 1872, 1872, 1872, 474: 1872, 1872, 1872, 1872, 4005, 1872, 1872, 482: 1872, 1872, 1872, 486: 1872, 489: 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 503: 1872, 505: 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1872, 526: 1872, 1872, 4002, 4000, 3999, 4007, 4001, 4003, 4004, 4006, 1168: 3998, 1213: 3997}, - {1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 455: 1847, 1847, 460: 1847, 1847, 463: 1847, 1847, 1847, 470: 1847, 1847, 1847, 474: 1847, 1847, 1847, 1847, 1847, 1847, 1847, 482: 1847, 1847, 1847, 486: 1847, 489: 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 503: 1847, 505: 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 526: 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847}, - {1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 455: 1820, 1820, 3969, 3968, 460: 1820, 1820, 463: 1820, 1820, 1820, 3572, 3571, 3577, 470: 1820, 1820, 1820, 474: 1820, 1820, 1820, 1820, 1820, 1820, 1820, 482: 1820, 1820, 1820, 486: 1820, 489: 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 3973, 1820, 3573, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 525: 3972, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 1820, 3970, 3574, 3575, 3568, 3578, 3567, 3576, 3569, 3570, 3979, 3980, 791: 3971, 1089: 3974, 1154: 3976, 1209: 3975, 1216: 3977, 1256: 3978}, - {1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 3965, 1769, 1769, 1769, 1769, 460: 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 470: 1769, 1769, 1769, 474: 1769, 1769, 1769, 1769, 1769, 1769, 1769, 482: 1769, 1769, 1769, 486: 1769, 489: 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 525: 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 565: 1769, 633: 1769, 636: 1769, 1769}, + {461: 4032}, + {1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 462: 1886, 1886, 467: 1886, 1886, 470: 1886, 1886, 1886, 476: 1886, 478: 1886, 1886, 481: 1886, 1886, 1886, 4015, 1886, 487: 1886, 489: 1886, 1886, 1886, 1886, 494: 1886, 496: 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 510: 1886, 512: 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 533: 1886, 1886, 4012, 4010, 4009, 4017, 4011, 4013, 4014, 4016, 1171: 4008, 1215: 4007}, + {1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 462: 1861, 1861, 467: 1861, 1861, 470: 1861, 1861, 1861, 476: 1861, 478: 1861, 1861, 481: 1861, 1861, 1861, 1861, 1861, 487: 1861, 489: 1861, 1861, 1861, 1861, 494: 1861, 496: 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 510: 1861, 512: 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 533: 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861}, + {1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 462: 1834, 1834, 3979, 3978, 467: 1834, 1834, 470: 1834, 1834, 1834, 3581, 3580, 3586, 1834, 478: 1834, 1834, 481: 1834, 1834, 1834, 1834, 1834, 487: 1834, 489: 1834, 1834, 1834, 1834, 494: 1834, 496: 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 3983, 1834, 3582, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 532: 3982, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 3980, 3583, 3584, 3577, 3587, 3576, 3585, 3578, 3579, 3989, 3990, 799: 3981, 1092: 3984, 1157: 3986, 1211: 3985, 1218: 3987, 1258: 3988}, + {1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 3975, 1783, 1783, 1783, 1783, 467: 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 478: 1783, 1783, 481: 1783, 1783, 1783, 1783, 1783, 487: 1783, 489: 1783, 1783, 1783, 1783, 494: 1783, 496: 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 532: 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 570: 1783, 641: 1783, 644: 1783, 1783}, // 215 - {1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 644: 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768}, - {1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 644: 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767}, - {1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 644: 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766}, - {1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 644: 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765}, - {1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 644: 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764}, + {1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 656: 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782, 1782}, + {1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 656: 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781}, + {1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 656: 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780, 1780}, + {1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 656: 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779, 1779}, + {1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 656: 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778, 1778}, // 220 - {1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1192, 1763, 1763, 1763, 1763, 460: 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 470: 1763, 1763, 1763, 474: 1763, 1763, 1763, 1763, 1763, 1763, 1763, 482: 1763, 1763, 1763, 486: 1763, 489: 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 525: 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 565: 1763, 633: 1763, 636: 1763, 1763}, - {1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 644: 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762}, - {1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 644: 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761}, - {1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 644: 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760}, - {1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 644: 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759}, + {1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1199, 1777, 1777, 1777, 1777, 467: 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 478: 1777, 1777, 481: 1777, 1777, 1777, 1777, 1777, 487: 1777, 489: 1777, 1777, 1777, 1777, 494: 1777, 496: 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 532: 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 570: 1777, 641: 1777, 644: 1777, 1777}, + {1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 656: 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776, 1776}, + {1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 656: 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775, 1775}, + {1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 656: 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774, 1774}, + {1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 656: 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773, 1773}, // 225 - {1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 644: 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758}, - {1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 3960, 1757, 1757, 1757, 1757, 460: 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 470: 1757, 1757, 1757, 474: 1757, 1757, 1757, 1757, 1757, 1757, 1757, 482: 1757, 1757, 1757, 486: 1757, 489: 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 525: 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 565: 1757, 633: 1757, 636: 1757, 1757}, - {1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 644: 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756}, - {1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 644: 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755}, - {1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 644: 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754}, + {1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 656: 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772, 1772}, + {1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 656: 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771, 1771}, + {1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 656: 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770, 1770}, + {1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 656: 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769}, + {1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 656: 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768, 1768}, // 230 - {1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 644: 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753}, - {1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 644: 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752}, - {1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 644: 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751}, - {1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 644: 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750}, - {1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 644: 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749}, + {1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 3970, 1767, 1767, 1767, 1767, 467: 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 478: 1767, 1767, 481: 1767, 1767, 1767, 1767, 1767, 487: 1767, 489: 1767, 1767, 1767, 1767, 494: 1767, 496: 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 532: 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 570: 1767, 641: 1767, 644: 1767, 1767}, + {1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 656: 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766}, + {1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 656: 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765}, + {1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 656: 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764, 1764}, + {1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 656: 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763}, // 235 - {1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 644: 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748}, - {1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 644: 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747}, - {1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1191, 1746, 1746, 1746, 1746, 460: 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 470: 1746, 1746, 1746, 474: 1746, 1746, 1746, 1746, 1746, 1746, 1746, 482: 1746, 1746, 1746, 486: 1746, 489: 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 525: 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 565: 1746, 633: 1746, 636: 1746, 1746}, - {1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 644: 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745}, - {1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 644: 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744}, + {1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 656: 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762, 1762}, + {1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 656: 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761}, + {1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 656: 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760, 1760}, + {1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 656: 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759}, + {1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 656: 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758, 1758}, // 240 - {1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 644: 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743}, - {1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 644: 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742}, - {1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 644: 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741}, - {1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 644: 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740}, - {1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 644: 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739}, + {1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 656: 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757}, + {1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1198, 1756, 1756, 1756, 1756, 467: 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 478: 1756, 1756, 481: 1756, 1756, 1756, 1756, 1756, 487: 1756, 489: 1756, 1756, 1756, 1756, 494: 1756, 496: 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 532: 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 570: 1756, 641: 1756, 644: 1756, 1756}, + {1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 656: 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755}, + {1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 656: 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754, 1754}, + {1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 656: 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753, 1753}, // 245 - {1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 644: 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738}, - {1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 644: 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737}, - {1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 644: 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736}, - {1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1188, 1735, 3959, 1735, 1735, 460: 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 470: 1735, 1735, 1735, 474: 1735, 1735, 1735, 1735, 1735, 1735, 1735, 482: 1735, 1735, 1735, 486: 1735, 489: 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 525: 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 565: 1735, 633: 1735, 636: 1735, 1735}, - {1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 644: 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734}, + {1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 656: 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752, 1752}, + {1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 656: 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751, 1751}, + {1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 656: 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750, 1750}, + {1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 656: 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749, 1749}, + {1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 656: 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748, 1748}, // 250 - {1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1186, 1733, 1733, 1733, 1733, 460: 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 470: 1733, 1733, 1733, 474: 1733, 1733, 1733, 1733, 1733, 1733, 1733, 482: 1733, 1733, 1733, 486: 1733, 489: 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 525: 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 565: 1733, 633: 1733, 636: 1733, 1733}, - {1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 644: 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732}, - {1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 644: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731}, - {1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 644: 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730}, - {1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 644: 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729}, + {1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 656: 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747, 1747}, + {1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 656: 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746}, + {1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1195, 1745, 3969, 1745, 1745, 467: 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 478: 1745, 1745, 481: 1745, 1745, 1745, 1745, 1745, 487: 1745, 489: 1745, 1745, 1745, 1745, 494: 1745, 496: 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 532: 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 570: 1745, 641: 1745, 644: 1745, 1745}, + {1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 656: 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744, 1744}, + {1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1193, 1743, 1743, 1743, 1743, 467: 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 478: 1743, 1743, 481: 1743, 1743, 1743, 1743, 1743, 487: 1743, 489: 1743, 1743, 1743, 1743, 494: 1743, 496: 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 532: 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 570: 1743, 641: 1743, 644: 1743, 1743}, // 255 - {1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 644: 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728}, - {1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 644: 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727}, - {1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 644: 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726}, - {1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 644: 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725}, - {1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 644: 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724}, + {1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 656: 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742, 1742}, + {1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 656: 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741}, + {1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 656: 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740}, + {1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 656: 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739, 1739}, + {1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 656: 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738}, // 260 - {1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 644: 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723}, - {1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 644: 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722}, - {1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 644: 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721}, - {1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 644: 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720}, - {1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 644: 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719}, + {1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 656: 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737, 1737}, + {1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 656: 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736, 1736}, + {1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 656: 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735}, + {1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 656: 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734, 1734}, + {1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 656: 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733}, // 265 - {1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 644: 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718}, - {1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 644: 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717}, - {1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 644: 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716}, - {1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 644: 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715}, - {1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 644: 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714}, + {1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 656: 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732}, + {1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 656: 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731}, + {1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 656: 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730, 1730}, + {1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 656: 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729, 1729}, + {1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 656: 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728, 1728}, // 270 - {1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 644: 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713}, - {1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 644: 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712}, - {1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 644: 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711}, - {1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1182, 1710, 1710, 1710, 1710, 460: 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 470: 1710, 1710, 1710, 474: 1710, 1710, 1710, 1710, 1710, 1710, 1710, 482: 1710, 1710, 1710, 486: 1710, 489: 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 525: 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 565: 1710, 633: 1710, 636: 1710, 1710}, - {1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 644: 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709}, + {1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 656: 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727, 1727}, + {1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 656: 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726}, + {1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 656: 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725}, + {1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 656: 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724, 1724}, + {1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 656: 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723, 1723}, // 275 - {1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 644: 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708}, - {1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 644: 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707}, - {1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 644: 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706}, - {1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 644: 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705}, - {1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1185, 1704, 1704, 1704, 1704, 460: 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 470: 1704, 1704, 1704, 474: 1704, 1704, 1704, 1704, 1704, 1704, 1704, 482: 1704, 1704, 1704, 486: 1704, 489: 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 525: 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 565: 1704, 633: 1704, 636: 1704, 1704}, + {1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 656: 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722}, + {1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 656: 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721}, + {1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1189, 1720, 1720, 1720, 1720, 467: 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 478: 1720, 1720, 481: 1720, 1720, 1720, 1720, 1720, 487: 1720, 489: 1720, 1720, 1720, 1720, 494: 1720, 496: 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 532: 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 570: 1720, 641: 1720, 644: 1720, 1720}, + {1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 656: 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719, 1719}, + {1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 656: 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718, 1718}, // 280 - {1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 644: 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703}, - {1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 644: 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702}, - {1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 644: 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701}, - {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 644: 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, - {1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 644: 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699}, + {1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 656: 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717, 1717}, + {1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 656: 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716, 1716}, + {1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 656: 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715, 1715}, + {1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1192, 1714, 1714, 1714, 1714, 467: 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 478: 1714, 1714, 481: 1714, 1714, 1714, 1714, 1714, 487: 1714, 489: 1714, 1714, 1714, 1714, 494: 1714, 496: 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 532: 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 570: 1714, 641: 1714, 644: 1714, 1714}, + {1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 656: 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713, 1713}, // 285 - {1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 644: 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698}, - {1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 644: 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697}, - {1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 644: 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696}, - {1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 644: 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695}, - {1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 3956, 1694, 1694, 1694, 1694, 460: 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 470: 1694, 1694, 1694, 474: 1694, 1694, 1694, 1694, 1694, 1694, 1694, 482: 1694, 1694, 1694, 486: 1694, 489: 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 525: 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 565: 1694, 633: 1694, 636: 1694, 1694}, + {1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 656: 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712, 1712}, + {1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 656: 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711, 1711}, + {1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 656: 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710}, + {1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 656: 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709}, + {1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 656: 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708, 1708}, // 290 - {1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 644: 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693}, - {1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 644: 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692}, - {1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 644: 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691}, - {1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 644: 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690}, - {1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 644: 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689}, + {1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 656: 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707, 1707}, + {1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 656: 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706}, + {1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 656: 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705, 1705}, + {1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 3966, 1704, 1704, 1704, 1704, 467: 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 478: 1704, 1704, 481: 1704, 1704, 1704, 1704, 1704, 487: 1704, 489: 1704, 1704, 1704, 1704, 494: 1704, 496: 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 532: 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 570: 1704, 641: 1704, 644: 1704, 1704}, + {1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 656: 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703}, // 295 - {1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 644: 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688}, - {1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 644: 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687}, - {1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 644: 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686}, - {1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 644: 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685}, - {1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 644: 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684}, + {1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 656: 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702}, + {1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 656: 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701, 1701}, + {1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 656: 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700}, + {1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 656: 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699, 1699}, + {1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 656: 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698}, // 300 - {1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 644: 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683}, - {1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 644: 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682}, - {1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 644: 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681}, - {1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 644: 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680}, - {1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 644: 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679}, + {1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 656: 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1697}, + {1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 656: 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696, 1696}, + {1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 656: 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695, 1695}, + {1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 656: 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694}, + {1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 656: 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693}, // 305 - {1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 644: 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678}, - {1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 644: 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677}, - {1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 644: 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676}, - {1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 644: 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675}, - {1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 644: 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674}, + {1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 656: 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692}, + {1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 656: 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691}, + {1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 656: 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690}, + {1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 656: 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689}, + {1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 656: 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688}, // 310 - {1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 644: 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673}, - {1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 644: 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672}, - {1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 644: 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671}, - {1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 644: 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670}, - {1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1169, 1669, 3955, 1669, 1669, 460: 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 470: 1669, 1669, 1669, 474: 1669, 1669, 1669, 1669, 1669, 1669, 1669, 482: 1669, 1669, 1669, 486: 1669, 489: 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 525: 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 565: 1669, 633: 1669, 636: 1669, 1669}, + {1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 656: 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687, 1687}, + {1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 656: 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686}, + {1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 656: 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685, 1685}, + {1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 656: 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684}, + {1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 656: 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683}, // 315 - {1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1168, 1668, 3954, 1668, 1668, 460: 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 470: 1668, 1668, 1668, 474: 1668, 1668, 1668, 1668, 1668, 1668, 1668, 482: 1668, 1668, 1668, 486: 1668, 489: 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 525: 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 565: 1668, 633: 1668, 636: 1668, 1668}, - {1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 644: 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667}, - {1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 644: 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666}, - {1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1167, 1665, 1665, 1665, 1665, 460: 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 470: 1665, 1665, 1665, 474: 1665, 1665, 1665, 1665, 1665, 1665, 1665, 482: 1665, 1665, 1665, 486: 1665, 489: 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 525: 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 565: 1665, 633: 1665, 636: 1665, 1665}, - {1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 644: 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664}, + {1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 656: 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682}, + {1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 656: 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681}, + {1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 656: 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680}, + {1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1176, 1679, 3965, 1679, 1679, 467: 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 478: 1679, 1679, 481: 1679, 1679, 1679, 1679, 1679, 487: 1679, 489: 1679, 1679, 1679, 1679, 494: 1679, 496: 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 532: 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 570: 1679, 641: 1679, 644: 1679, 1679}, + {1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1175, 1678, 3964, 1678, 1678, 467: 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 478: 1678, 1678, 481: 1678, 1678, 1678, 1678, 1678, 487: 1678, 489: 1678, 1678, 1678, 1678, 494: 1678, 496: 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 532: 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 570: 1678, 641: 1678, 644: 1678, 1678}, // 320 - {1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 644: 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663}, - {1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 644: 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662}, - {1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 644: 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661}, - {1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1164, 1660, 1660, 1660, 1660, 460: 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 470: 1660, 1660, 1660, 474: 1660, 1660, 1660, 1660, 1660, 1660, 1660, 482: 1660, 1660, 1660, 486: 1660, 489: 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 525: 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 565: 1660, 633: 1660, 636: 1660, 1660}, - {1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 644: 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659}, + {1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 656: 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677}, + {1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 656: 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676}, + {1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1174, 1675, 1675, 1675, 1675, 467: 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 478: 1675, 1675, 481: 1675, 1675, 1675, 1675, 1675, 487: 1675, 489: 1675, 1675, 1675, 1675, 494: 1675, 496: 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 532: 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 570: 1675, 641: 1675, 644: 1675, 1675}, + {1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 656: 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674, 1674}, + {1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 656: 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673}, // 325 - {1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1165, 1658, 1658, 1658, 1658, 460: 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 470: 1658, 1658, 1658, 474: 1658, 1658, 1658, 1658, 1658, 1658, 1658, 482: 1658, 1658, 1658, 486: 1658, 489: 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 525: 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 565: 1658, 633: 1658, 636: 1658, 1658}, - {1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 3944, 1657, 1657, 1657, 1657, 460: 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 470: 1657, 1657, 1657, 474: 1657, 1657, 1657, 1657, 1657, 1657, 1657, 482: 1657, 1657, 1657, 486: 1657, 489: 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 525: 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 565: 1657, 633: 1657, 636: 1657, 1657}, - {1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 644: 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656}, - {1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 644: 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655}, - {1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1166, 1654, 1654, 1654, 1654, 460: 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 470: 1654, 1654, 1654, 474: 1654, 1654, 1654, 1654, 1654, 1654, 1654, 482: 1654, 1654, 1654, 486: 1654, 489: 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 525: 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 565: 1654, 633: 1654, 636: 1654, 1654}, + {1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 656: 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672}, + {1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 656: 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671}, + {1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1171, 1670, 1670, 1670, 1670, 467: 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 478: 1670, 1670, 481: 1670, 1670, 1670, 1670, 1670, 487: 1670, 489: 1670, 1670, 1670, 1670, 494: 1670, 496: 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 532: 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 570: 1670, 641: 1670, 644: 1670, 1670}, + {1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 656: 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669}, + {1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1172, 1668, 1668, 1668, 1668, 467: 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 478: 1668, 1668, 481: 1668, 1668, 1668, 1668, 1668, 487: 1668, 489: 1668, 1668, 1668, 1668, 494: 1668, 496: 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 532: 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 570: 1668, 641: 1668, 644: 1668, 1668}, // 330 - {1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 644: 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653}, - {1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1189, 1652, 1652, 1652, 1652, 460: 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 470: 1652, 1652, 1652, 474: 1652, 1652, 1652, 1652, 1652, 1652, 1652, 482: 1652, 1652, 1652, 486: 1652, 489: 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 525: 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 565: 1652, 633: 1652, 636: 1652, 1652}, - {1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 644: 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651}, - {1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 644: 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650}, - {1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 644: 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649}, + {1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 3954, 1667, 1667, 1667, 1667, 467: 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 478: 1667, 1667, 481: 1667, 1667, 1667, 1667, 1667, 487: 1667, 489: 1667, 1667, 1667, 1667, 494: 1667, 496: 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 532: 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 570: 1667, 641: 1667, 644: 1667, 1667}, + {1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 656: 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666}, + {1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 656: 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665}, + {1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1173, 1664, 1664, 1664, 1664, 467: 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 478: 1664, 1664, 481: 1664, 1664, 1664, 1664, 1664, 487: 1664, 489: 1664, 1664, 1664, 1664, 494: 1664, 496: 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 532: 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 570: 1664, 641: 1664, 644: 1664, 1664}, + {1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 656: 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663}, // 335 - {1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 644: 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648}, - {1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 644: 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647}, - {1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 644: 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646}, - {1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 644: 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645}, - {1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 644: 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644}, + {1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1196, 1662, 1662, 1662, 1662, 467: 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 478: 1662, 1662, 481: 1662, 1662, 1662, 1662, 1662, 487: 1662, 489: 1662, 1662, 1662, 1662, 494: 1662, 496: 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 532: 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 570: 1662, 641: 1662, 644: 1662, 1662}, + {1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 656: 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661, 1661}, + {1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 656: 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660}, + {1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 656: 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659}, + {1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 656: 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658}, // 340 - {1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 644: 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643}, - {1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 644: 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642}, - {1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 644: 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641}, - {1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 644: 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640}, - {1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1176, 1639, 1639, 1639, 1639, 460: 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 470: 1639, 1639, 1639, 474: 1639, 1639, 1639, 1639, 1639, 1639, 1639, 482: 1639, 1639, 1639, 486: 1639, 489: 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 525: 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 565: 1639, 633: 1639, 636: 1639, 1639}, + {1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 656: 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657}, + {1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 656: 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656}, + {1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 656: 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655}, + {1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 656: 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654}, + {1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 656: 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653, 1653}, // 345 - {1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 644: 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638}, - {1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 644: 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637}, - {1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 644: 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636}, - {1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 644: 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635}, - {1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 644: 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634}, + {1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 656: 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652}, + {1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 656: 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651}, + {1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 656: 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650, 1650}, + {1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1183, 1649, 1649, 1649, 1649, 467: 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 478: 1649, 1649, 481: 1649, 1649, 1649, 1649, 1649, 487: 1649, 489: 1649, 1649, 1649, 1649, 494: 1649, 496: 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 532: 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 570: 1649, 641: 1649, 644: 1649, 1649}, + {1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 656: 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648}, // 350 - {1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 644: 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633}, - {1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 644: 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632}, - {1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 644: 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631}, - {1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 644: 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630}, - {1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 644: 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629}, + {1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 656: 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647, 1647}, + {1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 656: 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646, 1646}, + {1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 656: 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645, 1645}, + {1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 656: 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644, 1644}, + {1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 656: 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643}, // 355 - {1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 644: 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628}, - {1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 644: 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627}, - {1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 644: 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626}, - {1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 644: 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625}, - {1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 644: 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624}, + {1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 656: 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642, 1642}, + {1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 656: 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641}, + {1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 656: 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640, 1640}, + {1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 656: 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639}, + {1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 656: 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638, 1638}, // 360 - {1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 644: 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623}, - {1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 644: 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622}, - {1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 644: 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621}, - {1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 644: 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620}, - {1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 644: 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619}, + {1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 656: 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637, 1637}, + {1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 656: 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636, 1636}, + {1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 656: 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635, 1635}, + {1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 656: 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634, 1634}, + {1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 656: 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633}, // 365 - {1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1173, 1618, 1618, 1618, 1618, 460: 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 470: 1618, 1618, 1618, 474: 1618, 1618, 1618, 1618, 1618, 1618, 1618, 482: 1618, 1618, 1618, 486: 1618, 489: 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 525: 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 565: 1618, 633: 1618, 636: 1618, 1618}, - {1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 644: 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617}, - {1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 644: 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616}, - {1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 644: 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615}, - {1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 644: 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614}, + {1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 656: 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632, 1632}, + {1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 656: 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631}, + {1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 656: 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630}, + {1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 656: 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629, 1629}, + {1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1180, 1628, 1628, 1628, 1628, 467: 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 478: 1628, 1628, 481: 1628, 1628, 1628, 1628, 1628, 487: 1628, 489: 1628, 1628, 1628, 1628, 494: 1628, 496: 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 532: 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 570: 1628, 641: 1628, 644: 1628, 1628}, // 370 - {1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 644: 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613}, - {1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 644: 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612}, - {1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 644: 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611}, - {1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 644: 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610}, - {1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 644: 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609}, + {1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 656: 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627}, + {1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 656: 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626, 1626}, + {1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 656: 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625, 1625}, + {1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 656: 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624}, + {1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 656: 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623}, // 375 - {1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 644: 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608}, - {1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 644: 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607}, - {1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 644: 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606}, - {1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 644: 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605}, - {1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 644: 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604}, + {1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 656: 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622}, + {1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 656: 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621, 1621}, + {1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 656: 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620}, + {1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 656: 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619}, + {1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 656: 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618}, // 380 - {1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 644: 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603}, - {1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 644: 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602}, - {1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1171, 1601, 1601, 1601, 1601, 460: 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 470: 1601, 1601, 1601, 474: 1601, 1601, 1601, 1601, 1601, 1601, 1601, 482: 1601, 1601, 1601, 486: 1601, 489: 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 525: 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 565: 1601, 633: 1601, 636: 1601, 1601}, - {1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1190, 1600, 1600, 1600, 1600, 460: 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 470: 1600, 1600, 1600, 474: 1600, 1600, 1600, 1600, 1600, 1600, 1600, 482: 1600, 1600, 1600, 486: 1600, 489: 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 525: 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 565: 1600, 633: 1600, 636: 1600, 1600}, - {1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1178, 1599, 1599, 1599, 1599, 460: 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 470: 1599, 1599, 1599, 474: 1599, 1599, 1599, 1599, 1599, 1599, 1599, 482: 1599, 1599, 1599, 486: 1599, 489: 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 525: 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 565: 1599, 633: 1599, 636: 1599, 1599}, + {1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 656: 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617}, + {1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 656: 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616, 1616}, + {1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 656: 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615, 1615}, + {1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 656: 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614, 1614}, + {1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 656: 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613, 1613}, // 385 - {1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 644: 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598}, - {1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 644: 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597}, - {1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 644: 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596}, - {1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1180, 1595, 1595, 1595, 1595, 460: 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 470: 1595, 1595, 1595, 474: 1595, 1595, 1595, 1595, 1595, 1595, 1595, 482: 1595, 1595, 1595, 486: 1595, 489: 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 525: 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 565: 1595, 633: 1595, 636: 1595, 1595}, - {1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1179, 1594, 1594, 1594, 1594, 460: 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 470: 1594, 1594, 1594, 474: 1594, 1594, 1594, 1594, 1594, 1594, 1594, 482: 1594, 1594, 1594, 486: 1594, 489: 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 525: 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 565: 1594, 633: 1594, 636: 1594, 1594}, + {1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 656: 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612, 1612}, + {1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1178, 1611, 1611, 1611, 1611, 467: 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 478: 1611, 1611, 481: 1611, 1611, 1611, 1611, 1611, 487: 1611, 489: 1611, 1611, 1611, 1611, 494: 1611, 496: 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 532: 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 570: 1611, 641: 1611, 644: 1611, 1611}, + {1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1197, 1610, 1610, 1610, 1610, 467: 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 478: 1610, 1610, 481: 1610, 1610, 1610, 1610, 1610, 487: 1610, 489: 1610, 1610, 1610, 1610, 494: 1610, 496: 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 532: 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 570: 1610, 641: 1610, 644: 1610, 1610}, + {1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1185, 1609, 1609, 1609, 1609, 467: 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 478: 1609, 1609, 481: 1609, 1609, 1609, 1609, 1609, 487: 1609, 489: 1609, 1609, 1609, 1609, 494: 1609, 496: 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 532: 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 570: 1609, 641: 1609, 644: 1609, 1609}, + {1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 656: 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608, 1608}, // 390 - {1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 644: 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593}, - {1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 644: 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592}, - {1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 644: 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591}, - {1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 644: 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590}, - {1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1170, 1589, 1589, 1589, 1589, 460: 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 470: 1589, 1589, 1589, 474: 1589, 1589, 1589, 1589, 1589, 1589, 1589, 482: 1589, 1589, 1589, 486: 1589, 489: 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 525: 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 565: 1589, 633: 1589, 636: 1589, 1589}, + {1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 656: 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607, 1607}, + {1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 656: 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606}, + {1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1187, 1605, 1605, 1605, 1605, 467: 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 478: 1605, 1605, 481: 1605, 1605, 1605, 1605, 1605, 487: 1605, 489: 1605, 1605, 1605, 1605, 494: 1605, 496: 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 532: 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 570: 1605, 641: 1605, 644: 1605, 1605}, + {1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1186, 1604, 1604, 1604, 1604, 467: 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 478: 1604, 1604, 481: 1604, 1604, 1604, 1604, 1604, 487: 1604, 489: 1604, 1604, 1604, 1604, 494: 1604, 496: 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 532: 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 570: 1604, 641: 1604, 644: 1604, 1604}, + {1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 656: 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603, 1603}, // 395 - {1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 644: 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588}, - {1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 644: 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587}, - {1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 644: 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586}, - {1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 644: 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585}, - {1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 644: 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584}, + {1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 656: 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602, 1602}, + {1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 656: 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601}, + {1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 656: 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600}, + {1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1177, 1599, 1599, 1599, 1599, 467: 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 478: 1599, 1599, 481: 1599, 1599, 1599, 1599, 1599, 487: 1599, 489: 1599, 1599, 1599, 1599, 494: 1599, 496: 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 532: 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 570: 1599, 641: 1599, 644: 1599, 1599}, + {1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 656: 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598}, // 400 - {1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 644: 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583}, - {1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 644: 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582}, - {1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 644: 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581}, - {1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 644: 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580}, - {1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 644: 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579}, + {1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 656: 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597}, + {1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 656: 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596}, + {1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 656: 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595}, + {1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 656: 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594}, + {1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 656: 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593}, // 405 - {1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 644: 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578}, - {1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 644: 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577}, - {1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 644: 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576}, - {1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 644: 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575}, - {1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 644: 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574}, + {1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 656: 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592}, + {1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 656: 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591, 1591}, + {1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 656: 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590, 1590}, + {1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 656: 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589}, + {1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 656: 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588}, // 410 - {1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 644: 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573}, - {1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 644: 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572}, - {1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 644: 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571}, - {1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 644: 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570}, - {1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 644: 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569}, + {1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 656: 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587}, + {1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 656: 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586, 1586}, + {1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 656: 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585, 1585}, + {1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 656: 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584}, + {1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 656: 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583}, // 415 - {1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 644: 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568}, - {1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 644: 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567}, - {1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 644: 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566}, - {1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 644: 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565}, - {1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 644: 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564}, + {1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 656: 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582}, + {1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 656: 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581, 1581}, + {1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 656: 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580, 1580}, + {1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 656: 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579, 1579}, + {1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 656: 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578}, // 420 - {1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 644: 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563}, - {1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 644: 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562}, - {1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 644: 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561}, - {1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 644: 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560}, - {1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 644: 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559}, + {1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 656: 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577}, + {1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 656: 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576, 1576}, + {1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 656: 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575, 1575}, + {1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 656: 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574, 1574}, + {1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 656: 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573, 1573}, // 425 - {1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 644: 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558}, - {1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 644: 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557}, - {1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 644: 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556}, - {1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 644: 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555}, - {1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 644: 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554}, + {1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 656: 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572, 1572}, + {1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 656: 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571, 1571}, + {1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 656: 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570, 1570}, + {1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 656: 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569, 1569}, + {1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 656: 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568}, // 430 - {1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 644: 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553}, - {1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 644: 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552}, - {1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 644: 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551}, - {1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 644: 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550}, - {1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 644: 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549}, + {1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 656: 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567, 1567}, + {1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 656: 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566}, + {1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 656: 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565}, + {1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 656: 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564}, + {1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 656: 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563, 1563}, // 435 - {1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 644: 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548}, - {1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 644: 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547}, - {1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 644: 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546}, - {1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 644: 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545}, - {1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 644: 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544}, + {1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 656: 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562, 1562}, + {1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 656: 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561}, + {1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 656: 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 1560}, + {1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 656: 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559, 1559}, + {1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 656: 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558}, // 440 - {1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 644: 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543}, - {1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 644: 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542}, - {1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 644: 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541}, - {1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 644: 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540}, - {1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 644: 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539}, + {1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 656: 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557, 1557}, + {1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 656: 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556, 1556}, + {1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 656: 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555, 1555}, + {1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 656: 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554}, + {1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 656: 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553, 1553}, // 445 - {1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 644: 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538}, - {1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 644: 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537}, - {1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 644: 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536}, - {1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 644: 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535}, - {1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 644: 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534}, + {1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 656: 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 1552}, + {1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 656: 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551, 1551}, + {1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 656: 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550}, + {1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 656: 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549}, + {1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 656: 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548}, // 450 - {1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 644: 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533}, - {1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 644: 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532}, - {1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 644: 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531}, - {1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 644: 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530}, - {1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 644: 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529}, + {1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 656: 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547}, + {1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 656: 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546, 1546}, + {1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 656: 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545}, + {1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 656: 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544}, + {1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 656: 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543}, // 455 - {1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 644: 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528}, - {1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 644: 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527}, - {1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 644: 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526}, - {1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 644: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525}, - {1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 644: 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524}, + {1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 656: 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542, 1542}, + {1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 656: 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541, 1541}, + {1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 656: 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540}, + {1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 656: 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539}, + {1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 656: 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538}, // 460 - {1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 644: 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523}, - {1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 644: 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522}, - {1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 644: 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521}, - {1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 644: 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520}, - {1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 644: 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519}, + {1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 656: 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537, 1537}, + {1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 656: 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536, 1536}, + {1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 656: 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535}, + {1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 656: 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534}, + {1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 656: 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533}, // 465 - {1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 644: 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518}, - {1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 644: 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517}, - {1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 644: 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516}, - {1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 644: 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515}, - {1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 644: 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514}, + {1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 656: 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532}, + {1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 656: 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531}, + {1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 656: 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530, 1530}, + {1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 656: 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529, 1529}, + {1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 656: 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528, 1528}, // 470 - {1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 644: 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513}, - {1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 644: 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512}, - {1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 644: 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511}, - {1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 644: 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510}, - {1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 644: 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509}, + {1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 656: 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527, 1527}, + {1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 656: 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526, 1526}, + {1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 656: 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1525}, + {1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 656: 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524, 1524}, + {1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 656: 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523}, // 475 - {1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 644: 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508}, - {1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 644: 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507}, - {1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 644: 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506}, - {1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 644: 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505}, - {1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 644: 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504}, + {1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 656: 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522, 1522}, + {1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 656: 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521}, + {1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 656: 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520}, + {1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 656: 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519}, + {1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 656: 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518, 1518}, // 480 - {1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 644: 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503}, - {1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 644: 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502}, - {1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 644: 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501}, - {1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 644: 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500}, - {1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 644: 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499}, + {1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 656: 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517, 1517}, + {1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 656: 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516}, + {1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 656: 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515, 1515}, + {1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 656: 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514, 1514}, + {1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 656: 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513, 1513}, // 485 - {1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 644: 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498}, - {1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 644: 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497}, - {1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 644: 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496}, - {1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 644: 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495}, - {1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 644: 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494}, + {1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 656: 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512}, + {1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 656: 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511}, + {1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 656: 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510, 1510}, + {1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 656: 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509, 1509}, + {1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 656: 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508, 1508}, // 490 - {1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 644: 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493}, - {1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 644: 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492}, - {1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 644: 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491}, - {1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 644: 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490}, - {1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 644: 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489}, + {1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 656: 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507, 1507}, + {1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 656: 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506, 1506}, + {1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 656: 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505, 1505}, + {1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 656: 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504, 1504}, + {1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 656: 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503, 1503}, // 495 - {1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 644: 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488}, - {1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 644: 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487}, - {1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 644: 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486}, - {1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 644: 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485}, - {1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 644: 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484}, + {1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 656: 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502, 1502}, + {1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 656: 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501, 1501}, + {1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 656: 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500}, + {1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 656: 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499, 1499}, + {1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 656: 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498}, // 500 - {1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 644: 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483}, - {1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 644: 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482}, - {1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 644: 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481}, - {1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 3941, 1478, 1478, 1478, 1478, 460: 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 470: 1478, 1478, 1478, 474: 1478, 1478, 1478, 1478, 1478, 1478, 1478, 482: 1478, 1478, 1478, 486: 1478, 489: 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 525: 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 565: 1478, 633: 1478, 636: 1478, 1478}, - {1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 3930, 1477, 1477, 1477, 1477, 460: 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 470: 1477, 1477, 1477, 474: 1477, 1477, 1477, 1477, 1477, 1477, 1477, 482: 1477, 1477, 1477, 486: 1477, 489: 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 525: 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 565: 1477, 633: 1477, 636: 1477, 1477}, + {1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 656: 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497}, + {1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 656: 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496}, + {1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 656: 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495}, + {1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 656: 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494, 1494}, + {1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 656: 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493}, // 505 - {1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 644: 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476}, - {1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 644: 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475}, - {1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 644: 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474}, - {1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 644: 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473}, - {1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 644: 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472}, + {1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 656: 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492, 1492}, + {1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 656: 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491, 1491}, + {1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 3951, 1488, 1488, 1488, 1488, 467: 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 478: 1488, 1488, 481: 1488, 1488, 1488, 1488, 1488, 487: 1488, 489: 1488, 1488, 1488, 1488, 494: 1488, 496: 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 532: 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 570: 1488, 641: 1488, 644: 1488, 1488}, + {1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 3940, 1487, 1487, 1487, 1487, 467: 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 478: 1487, 1487, 481: 1487, 1487, 1487, 1487, 1487, 487: 1487, 489: 1487, 1487, 1487, 1487, 494: 1487, 496: 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 532: 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 570: 1487, 641: 1487, 644: 1487, 1487}, + {1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 656: 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486, 1486}, // 510 - {1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 644: 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471}, - {1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 644: 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470}, - {1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 644: 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469}, - {1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 644: 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468}, - {1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 644: 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467}, + {1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 656: 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485}, + {1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 656: 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484, 1484}, + {1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 656: 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483}, + {1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 656: 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482}, + {1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 656: 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481}, // 515 - {1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 644: 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466}, - {1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 644: 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465}, - {1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 644: 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464}, - {1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 644: 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463}, - {1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 644: 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462}, + {1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 656: 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480}, + {1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 656: 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479}, + {1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 656: 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478}, + {1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 656: 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477}, + {1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 656: 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476}, // 520 - {1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 644: 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461}, - {1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 644: 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460}, - {1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 644: 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459}, - {1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 644: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458}, - {1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 644: 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457}, + {1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 656: 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475, 1475}, + {1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 656: 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474, 1474}, + {1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 656: 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473, 1473}, + {1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 656: 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472, 1472}, + {1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 656: 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471, 1471}, // 525 - {1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 644: 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456}, - {1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 644: 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455}, - {1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 644: 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454}, - {1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 644: 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453}, - {1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 644: 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452}, + {1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 656: 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470, 1470}, + {1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 656: 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469, 1469}, + {1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 656: 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1468}, + {1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 656: 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467, 1467}, + {1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 656: 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466, 1466}, // 530 - {1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 644: 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451}, - {1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 644: 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450}, - {1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 644: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449}, - {1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 644: 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448}, - {1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 644: 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447}, + {1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 656: 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465}, + {1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 656: 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464}, + {1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 656: 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463, 1463}, + {1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 656: 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462, 1462}, + {1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 656: 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461}, // 535 - {1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 644: 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446}, - {1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 644: 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445}, - {1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 644: 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444}, - {1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 644: 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443}, - {1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 644: 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442}, + {1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 656: 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460}, + {1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 656: 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459, 1459}, + {1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 656: 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458}, + {1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 656: 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457, 1457}, + {1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 656: 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456, 1456}, // 540 - {1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 644: 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441}, - {1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 644: 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440}, - {1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 644: 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439}, - {1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 644: 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438}, - {1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 644: 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437}, + {1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 656: 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455, 1455}, + {1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 656: 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454}, + {1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 656: 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453, 1453}, + {1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 656: 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452, 1452}, + {1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 656: 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451, 1451}, // 545 - {1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 644: 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436}, - {1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 644: 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435}, - {1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 644: 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434}, - {1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 644: 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433}, - {1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 644: 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432}, + {1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 656: 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450}, + {1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 656: 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449}, + {1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 656: 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448}, + {1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 656: 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447}, + {1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 656: 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446}, // 550 - {1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 644: 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431}, - {1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 644: 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430}, - {1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 644: 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429}, - {1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 644: 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428}, - {1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 644: 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427}, + {1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 656: 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445, 1445}, + {1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 656: 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444}, + {1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 656: 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443}, + {1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 656: 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442, 1442}, + {1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 656: 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1441}, // 555 - {1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 644: 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426}, - {1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 644: 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425}, - {1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 644: 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424}, - {1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 644: 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423}, - {1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 644: 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422}, + {1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 656: 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440}, + {1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 656: 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439, 1439}, + {1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 656: 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438, 1438}, + {1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 656: 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437, 1437}, + {1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 656: 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436, 1436}, // 560 - {1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 644: 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421}, - {1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 644: 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420}, - {1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 644: 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419}, - {1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 644: 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418}, - {1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 644: 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417}, + {1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 656: 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435, 1435}, + {1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 656: 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434}, + {1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 656: 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433}, + {1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 656: 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432}, + {1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 656: 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431}, // 565 - {1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 644: 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416}, - {1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 644: 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415}, - {1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 644: 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414}, - {1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 644: 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413}, - {1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 644: 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412}, + {1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 656: 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430, 1430}, + {1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 656: 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429, 1429}, + {1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 656: 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428}, + {1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 656: 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427}, + {1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 656: 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426, 1426}, // 570 - {1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 644: 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411}, - {1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 644: 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410}, - {1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 644: 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409}, - {1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 644: 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408}, - {1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 644: 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407}, + {1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 656: 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425, 1425}, + {1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 656: 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424, 1424}, + {1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 656: 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423}, + {1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 656: 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422}, + {1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 656: 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421}, // 575 - {1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 644: 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406}, - {1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 644: 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405}, - {1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 644: 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404}, - {1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 644: 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403}, - {1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 644: 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402}, + {1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 656: 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420, 1420}, + {1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 656: 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419, 1419}, + {1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 656: 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418, 1418}, + {1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 656: 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417, 1417}, + {1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 656: 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416, 1416}, // 580 - {1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 644: 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401}, - {1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 644: 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400}, - {1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 644: 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399}, - {1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 644: 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398}, - {1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 644: 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397}, + {1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 656: 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415}, + {1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 656: 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414, 1414}, + {1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 656: 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413, 1413}, + {1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 656: 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412}, + {1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 656: 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411, 1411}, // 585 - {1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 644: 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396}, - {1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 644: 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395}, - {1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 644: 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394}, - {1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 644: 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393}, - {1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 644: 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392}, + {1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 656: 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410, 1410}, + {1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 656: 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409}, + {1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 656: 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1408}, + {1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 656: 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407, 1407}, + {1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 656: 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406, 1406}, // 590 - {1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 644: 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391}, - {1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 644: 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390}, - {1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 644: 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389}, - {1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 644: 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388}, - {1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 644: 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387}, + {1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 656: 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405, 1405}, + {1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 656: 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404}, + {1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 656: 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403}, + {1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 656: 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402}, + {1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 656: 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401}, // 595 - {1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 644: 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386}, - {1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 644: 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385}, - {1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 644: 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384}, - {1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 3921, 1383, 1383, 1383, 1383, 460: 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 470: 1383, 1383, 1383, 474: 1383, 1383, 1383, 1383, 1383, 1383, 1383, 482: 1383, 1383, 1383, 486: 1383, 489: 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 525: 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 565: 1383, 633: 1383, 636: 1383, 1383}, - {1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 644: 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382}, + {1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 656: 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1400}, + {1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 656: 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399}, + {1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 656: 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398, 1398}, + {1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 656: 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397, 1397}, + {1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 656: 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396}, // 600 - {1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 644: 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381}, - {1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 644: 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380}, - {1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 644: 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379}, - {1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 644: 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378}, - {1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 644: 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377}, + {1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 656: 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395, 1395}, + {1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 656: 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394}, + {1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 656: 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393}, + {1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 656: 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392, 1392}, + {1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 3931, 1391, 1391, 1391, 1391, 467: 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 478: 1391, 1391, 481: 1391, 1391, 1391, 1391, 1391, 487: 1391, 489: 1391, 1391, 1391, 1391, 494: 1391, 496: 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 532: 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 570: 1391, 641: 1391, 644: 1391, 1391}, // 605 - {1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 644: 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376}, - {1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 644: 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375}, - {1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 644: 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374}, - {1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 644: 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373}, - {1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 644: 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372}, + {1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 656: 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390, 1390}, + {1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 656: 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389}, + {1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 656: 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388, 1388}, + {1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 656: 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387, 1387}, + {1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 656: 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 1386}, // 610 - {1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 644: 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371}, - {1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 644: 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370}, - {1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 644: 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369}, - {1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 644: 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368}, - {1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 644: 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367}, + {1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 656: 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385}, + {1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 656: 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384, 1384}, + {1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 656: 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383}, + {1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 656: 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382}, + {1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 656: 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381}, // 615 - {1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 644: 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366}, - {1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 644: 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365}, - {1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 644: 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364}, - {1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 644: 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363}, - {1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 644: 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362}, + {1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 656: 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380}, + {1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 656: 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379, 1379}, + {1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 656: 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378, 1378}, + {1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 656: 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377}, + {1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 656: 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376, 1376}, // 620 - {1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 644: 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361}, - {1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 644: 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360}, - {1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 644: 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359}, - {1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 644: 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358}, - {1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 644: 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357}, + {1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 656: 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375, 1375}, + {1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 656: 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374, 1374}, + {1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 656: 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373}, + {1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 656: 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372}, + {1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 656: 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371, 1371}, // 625 - {1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 644: 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356}, - {1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 3914, 1355, 1355, 1355, 1355, 460: 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 470: 1355, 1355, 1355, 474: 1355, 1355, 1355, 1355, 1355, 1355, 1355, 482: 1355, 1355, 1355, 486: 1355, 489: 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 525: 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 565: 1355, 633: 1355, 636: 1355, 1355}, - {1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 3907, 1354, 1354, 1354, 1354, 460: 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 470: 1354, 1354, 1354, 474: 1354, 1354, 1354, 1354, 1354, 1354, 1354, 482: 1354, 1354, 1354, 486: 1354, 489: 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 525: 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 565: 1354, 633: 1354, 636: 1354, 1354}, - {1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 644: 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353}, - {1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 644: 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352}, + {1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 656: 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370, 1370}, + {1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 656: 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369}, + {1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 656: 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368, 1368}, + {1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 656: 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367, 1367}, + {1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 656: 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366, 1366}, // 630 - {1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 644: 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351}, - {1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 644: 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350}, - {1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 644: 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349}, - {1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 644: 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348}, - {1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 644: 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347}, + {1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 656: 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365}, + {1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 656: 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364, 1364}, + {1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 656: 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363, 1363}, + {1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 3924, 1362, 1362, 1362, 1362, 467: 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 478: 1362, 1362, 481: 1362, 1362, 1362, 1362, 1362, 487: 1362, 489: 1362, 1362, 1362, 1362, 494: 1362, 496: 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 532: 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 570: 1362, 641: 1362, 644: 1362, 1362}, + {1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 3917, 1361, 1361, 1361, 1361, 467: 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 478: 1361, 1361, 481: 1361, 1361, 1361, 1361, 1361, 487: 1361, 489: 1361, 1361, 1361, 1361, 494: 1361, 496: 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 532: 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 570: 1361, 641: 1361, 644: 1361, 1361}, // 635 - {1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 644: 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346}, - {1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 644: 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345}, - {1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 644: 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344}, - {1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 644: 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343}, - {1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 644: 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342}, + {1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 656: 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360, 1360}, + {1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 656: 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359}, + {1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 656: 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1358}, + {1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 656: 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357, 1357}, + {1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 656: 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356, 1356}, // 640 - {1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 644: 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341}, - {1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 644: 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340}, - {1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 644: 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339}, - {1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 644: 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338}, - {1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 644: 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337}, + {1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 656: 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355}, + {1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 656: 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354}, + {1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 656: 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353}, + {1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 656: 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352, 1352}, + {1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 656: 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351, 1351}, // 645 - {1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 644: 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336}, - {1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 3887, 1335, 1335, 1335, 1335, 460: 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 470: 1335, 1335, 1335, 474: 1335, 1335, 1335, 1335, 1335, 1335, 1335, 482: 1335, 1335, 1335, 486: 1335, 489: 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 525: 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 565: 1335, 633: 1335, 636: 1335, 1335}, - {1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 3879, 1334, 1334, 1334, 1334, 460: 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 470: 1334, 1334, 1334, 474: 1334, 1334, 1334, 1334, 1334, 1334, 1334, 482: 1334, 1334, 1334, 486: 1334, 489: 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 525: 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 565: 1334, 633: 1334, 636: 1334, 1334}, - {1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 644: 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333}, - {1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 644: 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332}, + {1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 656: 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350, 1350}, + {1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 656: 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349, 1349}, + {1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 656: 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348, 1348}, + {1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 656: 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347, 1347}, + {1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 656: 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1346}, // 650 - {1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 644: 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331}, - {1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 644: 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330}, - {1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 644: 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329}, - {1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 644: 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328}, - {1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 644: 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327}, + {1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 656: 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345, 1345}, + {1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 656: 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344}, + {1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 656: 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343}, + {1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 3897, 1342, 1342, 1342, 1342, 467: 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 478: 1342, 1342, 481: 1342, 1342, 1342, 1342, 1342, 487: 1342, 489: 1342, 1342, 1342, 1342, 494: 1342, 496: 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 532: 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 570: 1342, 641: 1342, 644: 1342, 1342}, + {1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 3889, 1341, 1341, 1341, 1341, 467: 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 478: 1341, 1341, 481: 1341, 1341, 1341, 1341, 1341, 487: 1341, 489: 1341, 1341, 1341, 1341, 494: 1341, 496: 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 532: 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 570: 1341, 641: 1341, 644: 1341, 1341}, // 655 - {1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 644: 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326}, - {1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 644: 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325}, - {1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 644: 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324}, - {1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 644: 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323}, - {1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 644: 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322}, + {1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 656: 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340, 1340}, + {1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 656: 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339, 1339}, + {1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 656: 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338}, + {1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 656: 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337, 1337}, + {1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 656: 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336, 1336}, // 660 - {1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 644: 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321}, - {1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 644: 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320}, - {1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 644: 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319}, - {1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 644: 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318}, - {1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 455: 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 482: 1280, 1280, 1280, 486: 1280, 489: 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 525: 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 556: 1280, 565: 1280, 1280, 568: 1280, 624: 1280, 1280, 1280, 1280}, + {1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 656: 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335}, + {1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 656: 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334}, + {1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 656: 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333}, + {1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 656: 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332}, + {1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 656: 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331}, // 665 - {1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 455: 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 482: 1279, 1279, 1279, 486: 1279, 489: 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 525: 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 556: 1279, 565: 1279, 1279, 568: 1279, 624: 1279, 1279, 1279, 1279}, - {1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 455: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 482: 1278, 1278, 1278, 486: 1278, 489: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 525: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 556: 1278, 565: 1278, 1278, 568: 1278, 624: 1278, 1278, 1278, 1278}, - {1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 455: 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 482: 1277, 1277, 1277, 486: 1277, 489: 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 525: 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 556: 1277, 565: 1277, 1277, 568: 1277, 624: 1277, 1277, 1277, 1277}, - {1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 455: 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 482: 1276, 1276, 1276, 486: 1276, 489: 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 525: 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 556: 1276, 565: 1276, 1276, 568: 1276, 624: 1276, 1276, 1276, 1276}, - {1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 455: 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 482: 1275, 1275, 1275, 486: 1275, 489: 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 525: 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 556: 1275, 565: 1275, 1275, 568: 1275, 624: 1275, 1275, 1275, 1275}, + {1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 656: 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330}, + {1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 656: 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329}, + {1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 656: 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328}, + {1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 656: 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327}, + {1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 656: 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326}, // 670 - {1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 455: 1274, 3878, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 482: 1274, 1274, 1274, 486: 1274, 489: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 525: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 556: 1274, 565: 1274, 1274, 568: 1274, 624: 1274, 1274, 1274, 1274}, - {456: 3875, 555: 3876, 559: 3877}, - {1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 455: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 482: 1272, 1272, 1272, 486: 1272, 489: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 525: 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 1272, 556: 1272, 565: 1272, 1272, 568: 1272, 624: 1272, 1272, 1272, 1272}, - {1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 455: 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 482: 1271, 1271, 1271, 486: 1271, 489: 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 525: 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 556: 1271, 565: 1271, 1271, 568: 1271, 624: 1271, 1271, 1271, 1271}, - {1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 455: 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 482: 1268, 1268, 1268, 486: 1268, 489: 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 525: 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 556: 1268, 565: 1268, 1268, 568: 1268, 624: 1268, 1268, 1268, 1268}, + {1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 656: 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325}, + {1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 462: 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 487: 1287, 489: 1287, 1287, 1287, 1287, 494: 1287, 496: 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 532: 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 565: 1287, 570: 1287, 573: 1287, 575: 1287, 631: 1287, 1287, 634: 1287, 1287}, + {1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 462: 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 487: 1286, 489: 1286, 1286, 1286, 1286, 494: 1286, 496: 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 532: 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 1286, 565: 1286, 570: 1286, 573: 1286, 575: 1286, 631: 1286, 1286, 634: 1286, 1286}, + {1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 462: 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 487: 1285, 489: 1285, 1285, 1285, 1285, 494: 1285, 496: 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 532: 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 565: 1285, 570: 1285, 573: 1285, 575: 1285, 631: 1285, 1285, 634: 1285, 1285}, + {1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 462: 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 487: 1284, 489: 1284, 1284, 1284, 1284, 494: 1284, 496: 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 532: 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 1284, 565: 1284, 570: 1284, 573: 1284, 575: 1284, 631: 1284, 1284, 634: 1284, 1284}, // 675 - {1263, 1263, 7: 3297, 53: 1263, 121: 1263, 453: 1263, 455: 1263, 461: 1263, 463: 1263, 471: 1263, 1263, 474: 1263, 1263, 1263, 1263, 480: 1263}, - {1262, 1262, 7: 1262, 53: 1262, 121: 1262, 453: 1262, 455: 1262, 461: 1262, 463: 1262, 471: 1262, 1262, 474: 1262, 1262, 1262, 1262, 480: 1262, 484: 1262, 496: 1262, 1262, 505: 1262, 508: 1262, 1262}, - {1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 455: 1237, 1237, 1237, 1237, 460: 1237, 1237, 3237, 1237, 1237, 1237, 1237, 1237, 1237, 470: 1237, 1237, 1237, 474: 1237, 1237, 1237, 1237, 1237, 1237, 1237, 482: 1237, 1237, 1237, 486: 1237, 489: 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 525: 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 565: 3238}, - {1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 455: 1236, 1236, 1236, 1236, 460: 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 470: 1236, 1236, 1236, 474: 1236, 1236, 1236, 1236, 1236, 1236, 1236, 482: 1236, 1236, 1236, 486: 1236, 489: 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 525: 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 565: 1236, 633: 3870, 636: 1236, 1236}, - {1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 455: 1233, 1233, 1233, 1233, 460: 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 470: 1233, 1233, 1233, 474: 1233, 1233, 1233, 1233, 1233, 1233, 1233, 482: 1233, 1233, 1233, 486: 1233, 489: 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 525: 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 565: 1233, 636: 3866, 3867}, + {1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 462: 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 487: 1283, 489: 1283, 1283, 1283, 1283, 494: 1283, 496: 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 532: 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 565: 1283, 570: 1283, 573: 1283, 575: 1283, 631: 1283, 1283, 634: 1283, 1283}, + {1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 462: 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 487: 1282, 489: 1282, 1282, 1282, 1282, 494: 1282, 496: 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 532: 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 1282, 565: 1282, 570: 1282, 573: 1282, 575: 1282, 631: 1282, 1282, 634: 1282, 1282}, + {1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 462: 1281, 3888, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 487: 1281, 489: 1281, 1281, 1281, 1281, 494: 1281, 496: 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 532: 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 565: 1281, 570: 1281, 573: 1281, 575: 1281, 631: 1281, 1281, 634: 1281, 1281}, + {463: 3885, 564: 3886, 568: 3887}, + {1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 462: 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 487: 1279, 489: 1279, 1279, 1279, 1279, 494: 1279, 496: 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 532: 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 1279, 565: 1279, 570: 1279, 573: 1279, 575: 1279, 631: 1279, 1279, 634: 1279, 1279}, // 680 - {1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 455: 1232, 1232, 1232, 1232, 460: 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 470: 1232, 1232, 1232, 474: 1232, 1232, 1232, 1232, 1232, 1232, 1232, 482: 1232, 1232, 1232, 486: 1232, 489: 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 525: 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 565: 1232}, - {1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 455: 1231, 1231, 1231, 1231, 460: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 470: 1231, 1231, 1231, 474: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 482: 1231, 1231, 1231, 486: 1231, 489: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 525: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 565: 1231}, - {1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 455: 1230, 1230, 1230, 1230, 460: 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 470: 1230, 1230, 1230, 474: 1230, 1230, 1230, 1230, 1230, 1230, 1230, 482: 1230, 1230, 1230, 486: 1230, 489: 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 525: 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 565: 1230}, - {1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 455: 1228, 1228, 1228, 1228, 460: 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 470: 1228, 1228, 1228, 474: 1228, 1228, 1228, 1228, 1228, 1228, 1228, 482: 1228, 1228, 1228, 486: 1228, 489: 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 525: 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 565: 1228}, - {1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 455: 1227, 1227, 1227, 1227, 460: 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 470: 1227, 1227, 1227, 474: 1227, 1227, 1227, 1227, 1227, 1227, 1227, 482: 1227, 1227, 1227, 486: 1227, 489: 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 525: 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 565: 1227}, + {1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 462: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 487: 1278, 489: 1278, 1278, 1278, 1278, 494: 1278, 496: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 532: 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 1278, 565: 1278, 570: 1278, 573: 1278, 575: 1278, 631: 1278, 1278, 634: 1278, 1278}, + {1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 462: 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 487: 1275, 489: 1275, 1275, 1275, 1275, 494: 1275, 496: 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 532: 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 565: 1275, 570: 1275, 573: 1275, 575: 1275, 631: 1275, 1275, 634: 1275, 1275}, + {1270, 1270, 7: 3306, 57: 1270, 124: 1270, 460: 1270, 462: 1270, 468: 1270, 470: 1270, 478: 1270, 1270, 481: 1270, 1270, 1270, 485: 1270, 490: 1270}, + {1269, 1269, 7: 1269, 57: 1269, 124: 1269, 460: 1269, 462: 1269, 468: 1269, 470: 1269, 478: 1269, 1269, 481: 1269, 1269, 1269, 485: 1269, 490: 1269, 492: 1269, 503: 1269, 1269, 512: 1269, 515: 1269, 1269}, + {1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 462: 1244, 1244, 1244, 1244, 467: 1244, 1244, 3246, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 478: 1244, 1244, 481: 1244, 1244, 1244, 1244, 1244, 487: 1244, 489: 1244, 1244, 1244, 1244, 494: 1244, 496: 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 532: 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 570: 3247}, // 685 - {1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 455: 1226, 1226, 1226, 1226, 460: 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 470: 1226, 1226, 1226, 474: 1226, 1226, 1226, 1226, 1226, 1226, 1226, 482: 1226, 1226, 1226, 486: 1226, 489: 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 525: 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 565: 1226}, - {1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 455: 1225, 1225, 1225, 1225, 460: 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 470: 1225, 1225, 1225, 474: 1225, 1225, 1225, 1225, 1225, 1225, 1225, 482: 1225, 1225, 1225, 486: 1225, 489: 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 525: 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 565: 1225}, - {1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 455: 1224, 1224, 1224, 1224, 460: 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 470: 1224, 1224, 1224, 474: 1224, 1224, 1224, 1224, 1224, 1224, 1224, 482: 1224, 1224, 1224, 486: 1224, 489: 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 525: 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 565: 1224}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3865, 3139, 3222, 3138, 3135}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3864, 3139, 3222, 3138, 3135}, + {1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 462: 1243, 1243, 1243, 1243, 467: 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 478: 1243, 1243, 481: 1243, 1243, 1243, 1243, 1243, 487: 1243, 489: 1243, 1243, 1243, 1243, 494: 1243, 496: 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 532: 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 570: 1243, 641: 3880, 644: 1243, 1243}, + {1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 462: 1240, 1240, 1240, 1240, 467: 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 478: 1240, 1240, 481: 1240, 1240, 1240, 1240, 1240, 487: 1240, 489: 1240, 1240, 1240, 1240, 494: 1240, 496: 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 532: 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 570: 1240, 644: 3876, 3877}, + {1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 462: 1239, 1239, 1239, 1239, 467: 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 478: 1239, 1239, 481: 1239, 1239, 1239, 1239, 1239, 487: 1239, 489: 1239, 1239, 1239, 1239, 494: 1239, 496: 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 532: 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 570: 1239}, + {1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 462: 1238, 1238, 1238, 1238, 467: 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 478: 1238, 1238, 481: 1238, 1238, 1238, 1238, 1238, 487: 1238, 489: 1238, 1238, 1238, 1238, 494: 1238, 496: 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 532: 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 570: 1238}, + {1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 462: 1237, 1237, 1237, 1237, 467: 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 478: 1237, 1237, 481: 1237, 1237, 1237, 1237, 1237, 487: 1237, 489: 1237, 1237, 1237, 1237, 494: 1237, 496: 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 532: 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 570: 1237}, // 690 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3863, 3139, 3222, 3138, 3135}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3862, 3139, 3222, 3138, 3135}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3861, 3139, 3222, 3138, 3135}, - {1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 455: 1217, 1217, 1217, 1217, 460: 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 470: 1217, 1217, 1217, 474: 1217, 1217, 1217, 1217, 1217, 1217, 1217, 482: 1217, 1217, 1217, 486: 1217, 489: 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 525: 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 565: 1217}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 2500, 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3762, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 2498, 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 628: 2494, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3761, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3759, 733: 3764, 2495, 2496, 2497, 2506, 739: 2504, 2503, 2502, 745: 3766, 3765, 3763, 756: 3760}, + {1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 462: 1235, 1235, 1235, 1235, 467: 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 478: 1235, 1235, 481: 1235, 1235, 1235, 1235, 1235, 487: 1235, 489: 1235, 1235, 1235, 1235, 494: 1235, 496: 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 532: 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 570: 1235}, + {1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 462: 1234, 1234, 1234, 1234, 467: 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 478: 1234, 1234, 481: 1234, 1234, 1234, 1234, 1234, 487: 1234, 489: 1234, 1234, 1234, 1234, 494: 1234, 496: 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 532: 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 570: 1234}, + {1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 462: 1233, 1233, 1233, 1233, 467: 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 478: 1233, 1233, 481: 1233, 1233, 1233, 1233, 1233, 487: 1233, 489: 1233, 1233, 1233, 1233, 494: 1233, 496: 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 532: 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 570: 1233}, + {1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 462: 1232, 1232, 1232, 1232, 467: 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 478: 1232, 1232, 481: 1232, 1232, 1232, 1232, 1232, 487: 1232, 489: 1232, 1232, 1232, 1232, 494: 1232, 496: 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 532: 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 1232, 570: 1232}, + {1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 462: 1231, 1231, 1231, 1231, 467: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 478: 1231, 1231, 481: 1231, 1231, 1231, 1231, 1231, 487: 1231, 489: 1231, 1231, 1231, 1231, 494: 1231, 496: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 532: 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 1231, 570: 1231}, // 695 - {454: 3754}, - {454: 2501, 690: 3753}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3750, 2668, 2669, 2667}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3749, 3139, 3222, 3138, 3135}, - {454: 3744}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3875, 3148, 3231, 3147, 3144}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3874, 3148, 3231, 3147, 3144}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3873, 3148, 3231, 3147, 3144}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3872, 3148, 3231, 3147, 3144}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3871, 3148, 3231, 3147, 3144}, // 700 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 523: 1038, 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3731, 1182: 3732}, - {454: 3673}, - {454: 3670}, - {454: 3662}, - {454: 1187}, + {1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 462: 1224, 1224, 1224, 1224, 467: 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 478: 1224, 1224, 481: 1224, 1224, 1224, 1224, 1224, 487: 1224, 489: 1224, 1224, 1224, 1224, 494: 1224, 496: 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 532: 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 570: 1224}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 2502, 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3771, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 2500, 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 633: 2496, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3770, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3768, 740: 3773, 2497, 2498, 2499, 2508, 2506, 2505, 2504, 751: 3775, 3774, 3772, 765: 3769}, + {461: 3763}, + {461: 2503, 698: 3762}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3759, 2670, 2671, 2669}, // 705 - {454: 1184}, - {454: 1183}, - {454: 1181}, - {454: 1177}, - {454: 1175}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3758, 3148, 3231, 3147, 3144}, + {461: 3753}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 530: 1045, 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3740, 1185: 3741}, + {461: 3682}, + {461: 3679}, // 710 - {454: 1174}, - {454: 1172}, - {1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 460: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 470: 1161, 1161, 1161, 474: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 482: 1161, 1161, 1161, 486: 1161, 489: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 525: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 565: 1161}, - {1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 460: 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 470: 1160, 1160, 1160, 474: 1160, 1160, 1160, 1160, 1160, 1160, 1160, 482: 1160, 1160, 1160, 486: 1160, 489: 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 525: 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 565: 1160}, - {1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 460: 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 470: 1159, 1159, 1159, 474: 1159, 1159, 1159, 1159, 1159, 1159, 1159, 482: 1159, 1159, 1159, 486: 1159, 489: 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 525: 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 565: 1159}, + {461: 3671}, + {461: 1194}, + {461: 1191}, + {461: 1190}, + {461: 1188}, // 715 - {1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 460: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 470: 1158, 1158, 1158, 474: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 482: 1158, 1158, 1158, 486: 1158, 489: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 525: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 565: 1158}, - {1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 460: 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 470: 1157, 1157, 1157, 474: 1157, 1157, 1157, 1157, 1157, 1157, 1157, 482: 1157, 1157, 1157, 486: 1157, 489: 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 525: 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 565: 1157}, - {1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 460: 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 470: 1156, 1156, 1156, 474: 1156, 1156, 1156, 1156, 1156, 1156, 1156, 482: 1156, 1156, 1156, 486: 1156, 489: 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 525: 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 565: 1156}, - {1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 460: 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 470: 1155, 1155, 1155, 474: 1155, 1155, 1155, 1155, 1155, 1155, 1155, 482: 1155, 1155, 1155, 486: 1155, 489: 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 525: 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 565: 1155}, - {1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 460: 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 470: 1154, 1154, 1154, 474: 1154, 1154, 1154, 1154, 1154, 1154, 1154, 482: 1154, 1154, 1154, 486: 1154, 489: 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 525: 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 565: 1154}, + {461: 1184}, + {461: 1182}, + {461: 1181}, + {461: 1179}, + {1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 467: 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 478: 1168, 1168, 481: 1168, 1168, 1168, 1168, 1168, 487: 1168, 489: 1168, 1168, 1168, 1168, 494: 1168, 496: 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 532: 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 570: 1168}, // 720 - {1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 460: 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 470: 1153, 1153, 1153, 474: 1153, 1153, 1153, 1153, 1153, 1153, 1153, 482: 1153, 1153, 1153, 486: 1153, 489: 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 525: 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 565: 1153}, - {1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 460: 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 470: 1152, 1152, 1152, 474: 1152, 1152, 1152, 1152, 1152, 1152, 1152, 482: 1152, 1152, 1152, 486: 1152, 489: 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 525: 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 565: 1152}, - {454: 3659}, - {454: 3656}, - {1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 3653, 1163, 1163, 1163, 1163, 460: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 470: 1163, 1163, 1163, 474: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 482: 1163, 1163, 1163, 486: 1163, 489: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 525: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 565: 1163, 1069: 3654}, + {1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 467: 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 478: 1167, 1167, 481: 1167, 1167, 1167, 1167, 1167, 487: 1167, 489: 1167, 1167, 1167, 1167, 494: 1167, 496: 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 532: 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 570: 1167}, + {1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 467: 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 478: 1166, 1166, 481: 1166, 1166, 1166, 1166, 1166, 487: 1166, 489: 1166, 1166, 1166, 1166, 494: 1166, 496: 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 532: 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 570: 1166}, + {1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 467: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 478: 1165, 1165, 481: 1165, 1165, 1165, 1165, 1165, 487: 1165, 489: 1165, 1165, 1165, 1165, 494: 1165, 496: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 532: 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 570: 1165}, + {1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 467: 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 478: 1164, 1164, 481: 1164, 1164, 1164, 1164, 1164, 487: 1164, 489: 1164, 1164, 1164, 1164, 494: 1164, 496: 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 532: 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 570: 1164}, + {1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 467: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 478: 1163, 1163, 481: 1163, 1163, 1163, 1163, 1163, 487: 1163, 489: 1163, 1163, 1163, 1163, 494: 1163, 496: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 532: 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 1163, 570: 1163}, // 725 - {454: 3651}, - {1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 3647, 1070, 1070, 1070, 1070, 460: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 470: 1070, 1070, 1070, 474: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 482: 1070, 1070, 1070, 486: 1070, 489: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 525: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 565: 1070, 1195: 3646}, - {454: 3638}, - {454: 3634}, - {454: 3629}, + {1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 467: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 478: 1162, 1162, 481: 1162, 1162, 1162, 1162, 1162, 487: 1162, 489: 1162, 1162, 1162, 1162, 494: 1162, 496: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 532: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 570: 1162}, + {1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 467: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 478: 1161, 1161, 481: 1161, 1161, 1161, 1161, 1161, 487: 1161, 489: 1161, 1161, 1161, 1161, 494: 1161, 496: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 532: 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 570: 1161}, + {1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 467: 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 478: 1160, 1160, 481: 1160, 1160, 1160, 1160, 1160, 487: 1160, 489: 1160, 1160, 1160, 1160, 494: 1160, 496: 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 532: 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 570: 1160}, + {1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 467: 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 478: 1159, 1159, 481: 1159, 1159, 1159, 1159, 1159, 487: 1159, 489: 1159, 1159, 1159, 1159, 494: 1159, 496: 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 532: 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 570: 1159}, + {461: 3668}, // 730 - {454: 3626}, - {454: 3621}, - {454: 3612}, - {454: 3605}, - {454: 3600}, + {461: 3665}, + {1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 3662, 1170, 1170, 1170, 1170, 467: 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 478: 1170, 1170, 481: 1170, 1170, 1170, 1170, 1170, 487: 1170, 489: 1170, 1170, 1170, 1170, 494: 1170, 496: 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 532: 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 570: 1170, 1073: 3663}, + {461: 3660}, + {1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 3656, 1077, 1077, 1077, 1077, 467: 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 478: 1077, 1077, 481: 1077, 1077, 1077, 1077, 1077, 487: 1077, 489: 1077, 1077, 1077, 1077, 494: 1077, 496: 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 532: 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 570: 1077, 1198: 3655}, + {461: 3647}, // 735 - {454: 3565}, - {454: 3551}, - {454: 3534}, - {1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 455: 1117, 1117, 1117, 1117, 460: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 470: 1117, 1117, 1117, 474: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 482: 1117, 1117, 1117, 486: 1117, 489: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 525: 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 565: 1117}, - {454: 3527}, + {461: 3643}, + {461: 3638}, + {461: 3635}, + {461: 3630}, + {461: 3621}, // 740 - {454: 1111}, - {454: 1110}, - {454: 1109}, - {454: 1108}, - {1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 455: 1102, 1102, 1102, 1102, 460: 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 470: 1102, 1102, 1102, 474: 1102, 1102, 1102, 1102, 1102, 1102, 1102, 482: 1102, 1102, 1102, 486: 1102, 489: 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 525: 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 565: 1102}, + {461: 3614}, + {461: 3609}, + {461: 3574}, + {461: 3560}, + {461: 3543}, // 745 - {454: 3524}, - {454: 3521}, - {454: 3513}, - {454: 3505}, - {454: 3497}, + {1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 462: 1124, 1124, 1124, 1124, 467: 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 478: 1124, 1124, 481: 1124, 1124, 1124, 1124, 1124, 487: 1124, 489: 1124, 1124, 1124, 1124, 494: 1124, 496: 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 532: 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 570: 1124}, + {461: 3536}, + {461: 1118}, + {461: 1117}, + {461: 1116}, // 750 - {454: 3483}, - {454: 3471}, - {454: 3466}, - {454: 3461}, - {454: 3456}, + {461: 1115}, + {1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 462: 1109, 1109, 1109, 1109, 467: 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 478: 1109, 1109, 481: 1109, 1109, 1109, 1109, 1109, 487: 1109, 489: 1109, 1109, 1109, 1109, 494: 1109, 496: 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 532: 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 1109, 570: 1109}, + {461: 3533}, + {461: 3530}, + {461: 3522}, // 755 - {454: 3451}, - {454: 3446}, - {454: 3441}, - {454: 3428}, - {454: 3425}, + {461: 3514}, + {461: 3506}, + {461: 3492}, + {461: 3480}, + {461: 3475}, // 760 - {454: 3422}, - {454: 3419}, - {454: 3416}, - {454: 3413}, - {454: 3409}, + {461: 3470}, + {461: 3465}, + {461: 3460}, + {461: 3455}, + {461: 3450}, // 765 - {454: 3403}, - {454: 3390}, - {454: 3385}, - {454: 3380}, - {454: 3225}, + {461: 3437}, + {461: 3434}, + {461: 3431}, + {461: 3428}, + {461: 3425}, // 770 - {713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 455: 713, 713, 713, 713, 460: 713, 713, 713, 713, 713, 713, 713, 713, 713, 470: 713, 713, 713, 474: 713, 713, 713, 713, 713, 713, 713, 482: 713, 713, 713, 486: 713, 489: 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 525: 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 713, 565: 713}, - {712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 455: 712, 712, 712, 712, 460: 712, 712, 712, 712, 712, 712, 712, 712, 712, 470: 712, 712, 712, 474: 712, 712, 712, 712, 712, 712, 712, 482: 712, 712, 712, 486: 712, 489: 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 525: 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 712, 565: 712}, - {711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 455: 711, 711, 711, 711, 460: 711, 711, 711, 711, 711, 711, 711, 711, 711, 470: 711, 711, 711, 474: 711, 711, 711, 711, 711, 711, 711, 482: 711, 711, 711, 486: 711, 489: 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 525: 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, 565: 711}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3226}, - {7: 3234, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, + {461: 3422}, + {461: 3418}, + {461: 3412}, + {461: 3399}, + {461: 3394}, // 775 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3379}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3378}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3377}, - {2: 1864, 1864, 1864, 1864, 1864, 8: 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 54: 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 454: 1864, 456: 1864, 1864, 1864, 1864, 464: 1864, 1864, 1864, 1864, 1864, 473: 1864, 481: 1864, 485: 1864, 487: 1864, 1864, 524: 1864, 547: 1864, 1864, 1864, 551: 1864, 1864, 1864, 1864, 1864, 557: 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 567: 1864, 569: 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 631: 1864}, - {2: 1863, 1863, 1863, 1863, 1863, 8: 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 54: 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 454: 1863, 456: 1863, 1863, 1863, 1863, 464: 1863, 1863, 1863, 1863, 1863, 473: 1863, 481: 1863, 485: 1863, 487: 1863, 1863, 524: 1863, 547: 1863, 1863, 1863, 551: 1863, 1863, 1863, 1863, 1863, 557: 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 567: 1863, 569: 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 631: 1863}, + {461: 3389}, + {461: 3234}, + {719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 462: 719, 719, 719, 719, 467: 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 478: 719, 719, 481: 719, 719, 719, 719, 719, 487: 719, 489: 719, 719, 719, 719, 494: 719, 496: 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 532: 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 570: 719}, + {718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 462: 718, 718, 718, 718, 467: 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 478: 718, 718, 481: 718, 718, 718, 718, 718, 487: 718, 489: 718, 718, 718, 718, 494: 718, 496: 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 532: 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 570: 718}, + {717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 462: 717, 717, 717, 717, 467: 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 478: 717, 717, 481: 717, 717, 717, 717, 717, 487: 717, 489: 717, 717, 717, 717, 494: 717, 496: 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 532: 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 570: 717}, // 780 - {2: 1862, 1862, 1862, 1862, 1862, 8: 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 54: 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 454: 1862, 456: 1862, 1862, 1862, 1862, 464: 1862, 1862, 1862, 1862, 1862, 473: 1862, 481: 1862, 485: 1862, 487: 1862, 1862, 524: 1862, 547: 1862, 1862, 1862, 551: 1862, 1862, 1862, 1862, 1862, 557: 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 567: 1862, 569: 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 631: 1862}, - {2: 1861, 1861, 1861, 1861, 1861, 8: 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 54: 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 454: 1861, 456: 1861, 1861, 1861, 1861, 464: 1861, 1861, 1861, 1861, 1861, 473: 1861, 481: 1861, 485: 1861, 487: 1861, 1861, 524: 1861, 547: 1861, 1861, 1861, 551: 1861, 1861, 1861, 1861, 1861, 557: 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 567: 1861, 569: 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 631: 1861}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3235, 3139, 3222, 3138, 3135}, - {53: 3239, 462: 3237, 565: 3238}, - {710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 455: 710, 710, 710, 710, 460: 710, 710, 710, 710, 710, 710, 710, 710, 710, 470: 710, 710, 710, 474: 710, 710, 710, 710, 710, 710, 710, 482: 710, 710, 710, 486: 710, 489: 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 525: 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 565: 710}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3235}, + {7: 3243, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3388}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3387}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3386}, // 785 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 524: 3374, 640: 3376, 2668, 2669, 2667, 720: 3373, 847: 3372}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3371, 3139, 3222, 3138, 3135}, - {142: 895, 470: 895, 479: 3241, 722: 895, 1237: 3240}, - {142: 3245, 470: 3246, 722: 898, 858: 3244}, - {8: 3242, 331: 3243}, + {2: 1878, 1878, 1878, 1878, 1878, 8: 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 58: 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 461: 1878, 463: 1878, 1878, 1878, 1878, 471: 1878, 1878, 1878, 1878, 1878, 480: 1878, 486: 1878, 488: 1878, 493: 1878, 495: 1878, 531: 1878, 554: 1878, 556: 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 566: 1878, 1878, 1878, 1878, 571: 1878, 1878, 574: 1878, 576: 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 638: 1878}, + {2: 1877, 1877, 1877, 1877, 1877, 8: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 58: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 461: 1877, 463: 1877, 1877, 1877, 1877, 471: 1877, 1877, 1877, 1877, 1877, 480: 1877, 486: 1877, 488: 1877, 493: 1877, 495: 1877, 531: 1877, 554: 1877, 556: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 566: 1877, 1877, 1877, 1877, 571: 1877, 1877, 574: 1877, 576: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 638: 1877}, + {2: 1876, 1876, 1876, 1876, 1876, 8: 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 58: 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 461: 1876, 463: 1876, 1876, 1876, 1876, 471: 1876, 1876, 1876, 1876, 1876, 480: 1876, 486: 1876, 488: 1876, 493: 1876, 495: 1876, 531: 1876, 554: 1876, 556: 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 566: 1876, 1876, 1876, 1876, 571: 1876, 1876, 574: 1876, 576: 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 638: 1876}, + {2: 1875, 1875, 1875, 1875, 1875, 8: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 58: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 461: 1875, 463: 1875, 1875, 1875, 1875, 471: 1875, 1875, 1875, 1875, 1875, 480: 1875, 486: 1875, 488: 1875, 493: 1875, 495: 1875, 531: 1875, 554: 1875, 556: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 566: 1875, 1875, 1875, 1875, 571: 1875, 1875, 574: 1875, 576: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 638: 1875}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3244, 3148, 3231, 3147, 3144}, // 790 - {142: 894, 470: 894, 722: 894}, - {142: 893, 470: 893, 722: 893}, - {722: 3249, 729: 3250}, - {252: 3248}, - {252: 3247}, + {57: 3248, 469: 3246, 570: 3247}, + {716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 462: 716, 716, 716, 716, 467: 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 478: 716, 716, 481: 716, 716, 716, 716, 716, 487: 716, 489: 716, 716, 716, 716, 494: 716, 496: 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 532: 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 570: 716}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 531: 3383, 652: 3385, 2670, 2671, 2669, 727: 3382, 859: 3381}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3380, 3148, 3231, 3147, 3144}, + {144: 902, 476: 902, 489: 3250, 729: 902, 1239: 3249}, // 795 - {722: 896}, - {722: 897}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 454: 3286, 640: 3285, 2668, 2669, 2667, 905: 3288, 1138: 3289, 1320: 3287}, - {904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 455: 904, 904, 904, 904, 460: 904, 904, 904, 904, 904, 904, 904, 904, 904, 470: 904, 904, 904, 474: 904, 904, 904, 904, 904, 904, 904, 482: 904, 904, 904, 486: 904, 489: 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 525: 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 904, 565: 904}, - {1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 644: 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769, 1769}, + {144: 3254, 476: 3255, 729: 905, 871: 3253}, + {8: 3251, 337: 3252}, + {144: 901, 476: 901, 729: 901}, + {144: 900, 476: 900, 729: 900}, + {729: 3258, 736: 3259}, // 800 - {1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 644: 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763, 1763}, - {1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 644: 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757, 1757}, - {1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 644: 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746, 1746}, - {1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 644: 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735}, - {1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 644: 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733}, + {258: 3257}, + {258: 3256}, + {729: 903}, + {729: 904}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 461: 3295, 652: 3294, 2670, 2671, 2669, 910: 3297, 1141: 3298, 1322: 3296}, // 805 - {1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 644: 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710}, - {1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 644: 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704}, - {1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 644: 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694}, - {1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 644: 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669}, - {1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 644: 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668}, + {911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 462: 911, 911, 911, 911, 467: 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 478: 911, 911, 481: 911, 911, 911, 911, 911, 487: 911, 489: 911, 911, 911, 911, 494: 911, 496: 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 532: 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 570: 911}, + {1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 656: 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783, 1783}, + {1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 656: 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777}, + {1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 656: 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767}, + {1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 656: 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756, 1756}, // 810 - {1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 644: 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665}, - {1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 644: 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660, 1660}, - {1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 644: 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658, 1658}, - {1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 644: 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657}, - {1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 644: 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654, 1654}, + {1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 656: 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745, 1745}, + {1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 656: 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743, 1743}, + {1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 656: 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720}, + {1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 656: 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714}, + {1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 656: 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704, 1704}, // 815 - {1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 644: 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652}, - {1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 644: 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639, 1639}, - {1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 644: 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618, 1618}, - {1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 644: 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601, 1601}, - {1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 644: 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600}, + {1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 656: 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679, 1679}, + {1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 656: 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678}, + {1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 656: 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675}, + {1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 656: 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670}, + {1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 656: 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668}, // 820 - {1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 644: 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599}, - {1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 644: 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595, 1595}, - {1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 644: 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594}, - {1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 644: 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589}, - {1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 644: 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480, 1480}, + {1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 656: 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667, 1667}, + {1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 656: 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664, 1664}, + {1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 656: 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662}, + {1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 656: 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649}, + {1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 656: 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628, 1628}, // 825 - {1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 644: 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479, 1479}, - {1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 644: 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478}, - {1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 644: 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477, 1477}, - {1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 644: 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383, 1383}, - {1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 644: 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355}, + {1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 656: 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611, 1611}, + {1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 656: 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610, 1610}, + {1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 656: 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609}, + {1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 656: 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605, 1605}, + {1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 656: 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604, 1604}, // 830 - {1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 644: 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354}, - {1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 644: 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335}, - {1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 644: 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334}, - {946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 455: 946, 946, 946, 946, 460: 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 474: 946, 946, 946, 946, 946, 946, 946, 482: 946, 946, 946, 486: 946, 489: 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 525: 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 946, 565: 946}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 943, 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 469: 943, 484: 943, 505: 943, 508: 943, 943, 640: 3285, 2668, 2669, 2667, 905: 3292, 1236: 3291, 1321: 3290}, + {1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 656: 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599}, + {1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 656: 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490, 1490}, + {1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 656: 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489, 1489}, + {1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 656: 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488, 1488}, + {1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 656: 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487, 1487}, // 835 - {917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 455: 917, 917, 917, 917, 460: 917, 917, 917, 917, 917, 917, 917, 917, 917, 470: 917, 917, 917, 474: 917, 917, 917, 917, 917, 917, 917, 482: 917, 917, 917, 486: 917, 489: 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 525: 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 565: 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, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 455: 916, 916, 916, 916, 460: 916, 916, 916, 916, 916, 916, 916, 916, 916, 470: 916, 916, 916, 474: 916, 916, 916, 916, 916, 916, 916, 482: 916, 916, 916, 486: 916, 489: 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 525: 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 565: 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, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 455: 915, 915, 915, 915, 460: 915, 915, 915, 915, 915, 915, 915, 915, 915, 470: 915, 915, 915, 474: 915, 915, 915, 915, 915, 915, 915, 482: 915, 915, 915, 486: 915, 489: 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 525: 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 565: 915}, - {53: 3370}, - {53: 941, 469: 3294, 484: 941, 505: 941, 508: 941, 941, 1239: 3293}, + {1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 656: 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391}, + {1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 656: 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362, 1362}, + {1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 656: 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361}, + {1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 656: 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342, 1342}, + {1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 656: 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341}, // 840 - {53: 942, 469: 942, 484: 942, 505: 942, 508: 942, 942}, - {53: 939, 484: 3300, 505: 939, 508: 939, 939, 1242: 3299}, - {644: 3295}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 2660, 846: 3128, 876: 3296}, - {7: 3297, 53: 940, 484: 940, 505: 940, 508: 940, 940}, + {953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 462: 953, 953, 953, 953, 467: 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 481: 953, 953, 953, 953, 953, 487: 953, 489: 953, 953, 953, 953, 494: 953, 496: 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 532: 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 570: 953}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 950, 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 477: 950, 492: 950, 512: 950, 515: 950, 950, 652: 3294, 2670, 2671, 2669, 910: 3301, 1238: 3300, 1323: 3299}, + {924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 462: 924, 924, 924, 924, 467: 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 478: 924, 924, 481: 924, 924, 924, 924, 924, 487: 924, 489: 924, 924, 924, 924, 494: 924, 496: 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 532: 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 924, 570: 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, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 462: 923, 923, 923, 923, 467: 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 478: 923, 923, 481: 923, 923, 923, 923, 923, 487: 923, 489: 923, 923, 923, 923, 494: 923, 496: 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 532: 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, 570: 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, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 462: 922, 922, 922, 922, 467: 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 478: 922, 922, 481: 922, 922, 922, 922, 922, 487: 922, 489: 922, 922, 922, 922, 494: 922, 496: 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 532: 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 922, 570: 922}, // 845 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 2660, 846: 3298}, - {1261, 1261, 7: 1261, 53: 1261, 121: 1261, 453: 1261, 455: 1261, 461: 1261, 463: 1261, 471: 1261, 1261, 474: 1261, 1261, 1261, 1261, 480: 1261, 484: 1261, 496: 1261, 1261, 505: 1261, 508: 1261, 1261}, - {53: 937, 505: 3305, 508: 3306, 3307, 1241: 3303, 1319: 3304}, - {644: 3301}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 2660, 846: 3128, 876: 3302}, + {57: 3379}, + {57: 948, 477: 3303, 492: 948, 512: 948, 515: 948, 948, 1241: 3302}, + {57: 949, 477: 949, 492: 949, 512: 949, 515: 949, 949}, + {57: 946, 492: 3309, 512: 946, 515: 946, 946, 1244: 3308}, + {648: 3304}, // 850 - {7: 3297, 53: 938, 505: 938, 508: 938, 938}, - {53: 944}, - {143: 3318, 154: 3314, 488: 3308, 536: 3319, 557: 3316, 560: 3310, 3309, 3317, 836: 3315, 959: 3312, 1317: 3313, 3311}, - {143: 935, 154: 935, 488: 935, 536: 935, 557: 935, 560: 935, 935, 935}, - {143: 934, 154: 934, 488: 934, 536: 934, 557: 934, 560: 934, 934, 934}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 2662, 858: 3137, 887: 3305}, + {7: 3306, 57: 947, 492: 947, 512: 947, 515: 947, 947}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 2662, 858: 3307}, + {1268, 1268, 7: 1268, 57: 1268, 124: 1268, 460: 1268, 462: 1268, 468: 1268, 470: 1268, 478: 1268, 1268, 481: 1268, 1268, 1268, 485: 1268, 490: 1268, 492: 1268, 503: 1268, 1268, 512: 1268, 515: 1268, 1268}, + {57: 944, 512: 3314, 515: 3315, 3316, 1243: 3312, 1321: 3313}, // 855 - {143: 933, 154: 933, 488: 933, 536: 933, 557: 933, 560: 933, 933, 933}, - {2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 2139, 53: 2139, 127: 2139, 145: 2139, 453: 2139, 457: 2139, 2139, 2139, 2139, 462: 2139, 469: 2139, 473: 2139, 556: 2139, 566: 2139, 568: 2139, 624: 2139, 2139, 2139, 2139}, - {2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 53: 2138, 127: 2138, 145: 2138, 453: 2138, 457: 2138, 2138, 2138, 2138, 462: 2138, 469: 2138, 473: 2138, 556: 2138, 566: 2138, 568: 2138, 624: 2138, 2138, 2138, 2138}, - {2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 2137, 53: 2137, 127: 2137, 145: 2137, 453: 2137, 457: 2137, 2137, 2137, 2137, 462: 2137, 469: 2137, 473: 2137, 556: 2137, 566: 2137, 568: 2137, 624: 2137, 2137, 2137, 2137}, - {53: 936}, + {648: 3310}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 2662, 858: 3137, 887: 3311}, + {7: 3306, 57: 945, 512: 945, 515: 945, 945}, + {57: 951}, + {146: 3327, 160: 3323, 495: 3317, 543: 3328, 561: 3319, 3318, 566: 3325, 569: 3326, 808: 3324, 963: 3321, 1319: 3322, 3320}, // 860 - {53: 932}, - {53: 931}, - {127: 3365}, - {127: 3363}, - {127: 3361}, + {146: 942, 160: 942, 495: 942, 543: 942, 561: 942, 942, 566: 942, 569: 942}, + {146: 941, 160: 941, 495: 941, 543: 941, 561: 941, 941, 566: 941, 569: 941}, + {146: 940, 160: 940, 495: 940, 543: 940, 561: 940, 940, 566: 940, 569: 940}, + {2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 130: 2155, 148: 2155, 460: 2155, 2155, 2155, 464: 2155, 2155, 2155, 2155, 2155, 2155, 476: 2155, 2155, 480: 2155, 486: 2155, 2155, 2155, 493: 2155, 555: 2155, 565: 2155, 573: 2155, 575: 2155, 631: 2155, 2155, 2155, 2155, 2155, 2155, 2155}, + {2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 130: 2154, 148: 2154, 184: 2154, 460: 2154, 2154, 2154, 464: 2154, 2154, 2154, 2154, 2154, 2154, 476: 2154, 2154, 480: 2154, 486: 2154, 2154, 2154, 493: 2154, 555: 2154, 565: 2154, 573: 2154, 575: 2154, 631: 2154, 2154, 2154, 2154, 2154, 2154, 2154}, // 865 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3368}, - {554: 3367}, - {143: 3318, 154: 3320, 488: 3308, 557: 3322, 560: 3310, 3309, 3323, 836: 3321, 959: 3325, 1137: 3324}, - {127: 3365, 145: 3366}, - {127: 3363, 145: 3364}, + {2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 130: 2153, 148: 2153, 184: 2153, 460: 2153, 2153, 2153, 464: 2153, 2153, 2153, 2153, 2153, 2153, 476: 2153, 2153, 480: 2153, 486: 2153, 2153, 2153, 493: 2153, 555: 2153, 565: 2153, 573: 2153, 575: 2153, 631: 2153, 2153, 2153, 2153, 2153, 2153, 2153}, + {57: 943}, + {57: 939}, + {57: 938}, + {130: 3374}, // 870 - {127: 3361, 145: 3362}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3328}, - {486: 3326}, - {53: 924, 486: 924}, - {143: 3318, 154: 3320, 488: 3308, 557: 3322, 560: 3310, 3309, 3323, 836: 3321, 959: 3325, 1137: 3327}, + {130: 3372}, + {130: 3370}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3377}, + {563: 3376}, + {146: 3327, 160: 3329, 495: 3317, 561: 3319, 3318, 566: 3331, 569: 3332, 808: 3330, 963: 3334, 1140: 3333}, // 875 - {53: 925}, - {102: 3349, 3345, 105: 3342, 3357, 108: 3344, 3341, 3343, 3347, 3348, 3353, 3352, 3351, 3355, 3356, 3350, 3354, 3346, 486: 3233, 489: 3231, 3232, 3230, 3228, 512: 3339, 3336, 3338, 3337, 3333, 3335, 3334, 3331, 3332, 3330, 3340, 714: 3229, 3227, 788: 3329, 810: 3358}, - {1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 460: 1067, 1067, 463: 1067, 1067, 1067, 1067, 1067, 1067, 470: 1067, 1067, 1067, 474: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 486: 1067, 1067, 489: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 525: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 550: 1067, 628: 1067}, - {1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 460: 1066, 1066, 463: 1066, 1066, 1066, 1066, 1066, 1066, 470: 1066, 1066, 1066, 474: 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 486: 1066, 1066, 489: 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 525: 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 550: 1066, 628: 1066}, - {1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 460: 1065, 1065, 463: 1065, 1065, 1065, 1065, 1065, 1065, 470: 1065, 1065, 1065, 474: 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 486: 1065, 1065, 489: 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 525: 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 550: 1065, 628: 1065}, + {130: 3374, 148: 3375}, + {130: 3372, 148: 3373}, + {130: 3370, 148: 3371}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3337}, + {494: 3335}, // 880 - {1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 460: 1064, 1064, 463: 1064, 1064, 1064, 1064, 1064, 1064, 470: 1064, 1064, 1064, 474: 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 486: 1064, 1064, 489: 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 525: 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 550: 1064, 628: 1064}, - {1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 460: 1063, 1063, 463: 1063, 1063, 1063, 1063, 1063, 1063, 470: 1063, 1063, 1063, 474: 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 486: 1063, 1063, 489: 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 525: 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 550: 1063, 628: 1063}, - {1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 460: 1062, 1062, 463: 1062, 1062, 1062, 1062, 1062, 1062, 470: 1062, 1062, 1062, 474: 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 486: 1062, 1062, 489: 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 525: 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 550: 1062, 628: 1062}, - {1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 460: 1061, 1061, 463: 1061, 1061, 1061, 1061, 1061, 1061, 470: 1061, 1061, 1061, 474: 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 486: 1061, 1061, 489: 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 525: 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 550: 1061, 628: 1061}, - {1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 460: 1060, 1060, 463: 1060, 1060, 1060, 1060, 1060, 1060, 470: 1060, 1060, 1060, 474: 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 486: 1060, 1060, 489: 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 525: 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 550: 1060, 628: 1060}, + {57: 931, 494: 931}, + {146: 3327, 160: 3329, 495: 3317, 561: 3319, 3318, 566: 3331, 569: 3332, 808: 3330, 963: 3334, 1140: 3336}, + {57: 932}, + {105: 3358, 3354, 108: 3351, 3366, 111: 3353, 3350, 3352, 3356, 3357, 3362, 3361, 3360, 3364, 3365, 3359, 3363, 3355, 494: 3242, 496: 3240, 3241, 3239, 3237, 519: 3348, 3345, 3347, 3346, 3342, 3344, 3343, 3340, 3341, 3339, 3349, 722: 3238, 3236, 795: 3338, 818: 3367}, + {1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 467: 1074, 1074, 470: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 478: 1074, 1074, 481: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 489: 1074, 1074, 1074, 1074, 1074, 1074, 496: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 532: 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 555: 1074, 633: 1074}, // 885 - {1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 460: 1059, 1059, 463: 1059, 1059, 1059, 1059, 1059, 1059, 470: 1059, 1059, 1059, 474: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 486: 1059, 1059, 489: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 525: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 550: 1059, 628: 1059}, - {1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 460: 1058, 1058, 463: 1058, 1058, 1058, 1058, 1058, 1058, 470: 1058, 1058, 1058, 474: 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 486: 1058, 1058, 489: 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 525: 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 550: 1058, 628: 1058}, - {1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 460: 1057, 1057, 463: 1057, 1057, 1057, 1057, 1057, 1057, 470: 1057, 1057, 1057, 474: 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 486: 1057, 1057, 489: 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 525: 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 550: 1057, 628: 1057}, - {1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 460: 1056, 1056, 463: 1056, 1056, 1056, 1056, 1056, 1056, 470: 1056, 1056, 1056, 474: 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 486: 1056, 1056, 489: 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 525: 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 550: 1056, 628: 1056}, - {1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 460: 1055, 1055, 463: 1055, 1055, 1055, 1055, 1055, 1055, 470: 1055, 1055, 1055, 474: 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 486: 1055, 1055, 489: 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 525: 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 550: 1055, 628: 1055}, + {1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 467: 1073, 1073, 470: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 478: 1073, 1073, 481: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 489: 1073, 1073, 1073, 1073, 1073, 1073, 496: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 532: 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 555: 1073, 633: 1073}, + {1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 467: 1072, 1072, 470: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 478: 1072, 1072, 481: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 489: 1072, 1072, 1072, 1072, 1072, 1072, 496: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 532: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 555: 1072, 633: 1072}, + {1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 467: 1071, 1071, 470: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 478: 1071, 1071, 481: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 489: 1071, 1071, 1071, 1071, 1071, 1071, 496: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 532: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 555: 1071, 633: 1071}, + {1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 467: 1070, 1070, 470: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 478: 1070, 1070, 481: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 489: 1070, 1070, 1070, 1070, 1070, 1070, 496: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 532: 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 1070, 555: 1070, 633: 1070}, + {1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 467: 1069, 1069, 470: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 478: 1069, 1069, 481: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 489: 1069, 1069, 1069, 1069, 1069, 1069, 496: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 532: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 555: 1069, 633: 1069}, // 890 - {1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 460: 1054, 1054, 463: 1054, 1054, 1054, 1054, 1054, 1054, 470: 1054, 1054, 1054, 474: 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 486: 1054, 1054, 489: 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 525: 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 550: 1054, 628: 1054}, - {1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 460: 1053, 1053, 463: 1053, 1053, 1053, 1053, 1053, 1053, 470: 1053, 1053, 1053, 474: 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 486: 1053, 1053, 489: 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 525: 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 550: 1053, 628: 1053}, - {1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 460: 1052, 1052, 463: 1052, 1052, 1052, 1052, 1052, 1052, 470: 1052, 1052, 1052, 474: 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 486: 1052, 1052, 489: 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 525: 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 550: 1052, 628: 1052}, - {1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 460: 1051, 1051, 463: 1051, 1051, 1051, 1051, 1051, 1051, 470: 1051, 1051, 1051, 474: 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 486: 1051, 1051, 489: 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 525: 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 550: 1051, 628: 1051}, - {1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 460: 1050, 1050, 463: 1050, 1050, 1050, 1050, 1050, 1050, 470: 1050, 1050, 1050, 474: 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 486: 1050, 1050, 489: 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 525: 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 550: 1050, 628: 1050}, + {1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 467: 1068, 1068, 470: 1068, 1068, 1068, 1068, 1068, 1068, 1068, 478: 1068, 1068, 481: 1068, 1068, 1068, 1068, 1068, 1068, 1068, 489: 1068, 1068, 1068, 1068, 1068, 1068, 496: 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 532: 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 555: 1068, 633: 1068}, + {1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 467: 1067, 1067, 470: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 478: 1067, 1067, 481: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 489: 1067, 1067, 1067, 1067, 1067, 1067, 496: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 532: 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 1067, 555: 1067, 633: 1067}, + {1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 467: 1066, 1066, 470: 1066, 1066, 1066, 1066, 1066, 1066, 1066, 478: 1066, 1066, 481: 1066, 1066, 1066, 1066, 1066, 1066, 1066, 489: 1066, 1066, 1066, 1066, 1066, 1066, 496: 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 532: 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 555: 1066, 633: 1066}, + {1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 467: 1065, 1065, 470: 1065, 1065, 1065, 1065, 1065, 1065, 1065, 478: 1065, 1065, 481: 1065, 1065, 1065, 1065, 1065, 1065, 1065, 489: 1065, 1065, 1065, 1065, 1065, 1065, 496: 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 532: 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 555: 1065, 633: 1065}, + {1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 467: 1064, 1064, 470: 1064, 1064, 1064, 1064, 1064, 1064, 1064, 478: 1064, 1064, 481: 1064, 1064, 1064, 1064, 1064, 1064, 1064, 489: 1064, 1064, 1064, 1064, 1064, 1064, 496: 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 532: 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064, 555: 1064, 633: 1064}, // 895 - {1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 460: 1049, 1049, 463: 1049, 1049, 1049, 1049, 1049, 1049, 470: 1049, 1049, 1049, 474: 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 486: 1049, 1049, 489: 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 525: 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 550: 1049, 628: 1049}, - {1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 460: 1048, 1048, 463: 1048, 1048, 1048, 1048, 1048, 1048, 470: 1048, 1048, 1048, 474: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 486: 1048, 1048, 489: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 525: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 550: 1048, 628: 1048}, - {1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 460: 1047, 1047, 463: 1047, 1047, 1047, 1047, 1047, 1047, 470: 1047, 1047, 1047, 474: 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 486: 1047, 1047, 489: 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 525: 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 550: 1047, 628: 1047}, - {1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 460: 1046, 1046, 463: 1046, 1046, 1046, 1046, 1046, 1046, 470: 1046, 1046, 1046, 474: 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 486: 1046, 1046, 489: 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 525: 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 550: 1046, 628: 1046}, - {1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 460: 1045, 1045, 463: 1045, 1045, 1045, 1045, 1045, 1045, 470: 1045, 1045, 1045, 474: 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 486: 1045, 1045, 489: 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 525: 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 550: 1045, 628: 1045}, + {1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 467: 1063, 1063, 470: 1063, 1063, 1063, 1063, 1063, 1063, 1063, 478: 1063, 1063, 481: 1063, 1063, 1063, 1063, 1063, 1063, 1063, 489: 1063, 1063, 1063, 1063, 1063, 1063, 496: 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 532: 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1063, 555: 1063, 633: 1063}, + {1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 467: 1062, 1062, 470: 1062, 1062, 1062, 1062, 1062, 1062, 1062, 478: 1062, 1062, 481: 1062, 1062, 1062, 1062, 1062, 1062, 1062, 489: 1062, 1062, 1062, 1062, 1062, 1062, 496: 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 532: 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 555: 1062, 633: 1062}, + {1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 467: 1061, 1061, 470: 1061, 1061, 1061, 1061, 1061, 1061, 1061, 478: 1061, 1061, 481: 1061, 1061, 1061, 1061, 1061, 1061, 1061, 489: 1061, 1061, 1061, 1061, 1061, 1061, 496: 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 532: 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 555: 1061, 633: 1061}, + {1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 467: 1060, 1060, 470: 1060, 1060, 1060, 1060, 1060, 1060, 1060, 478: 1060, 1060, 481: 1060, 1060, 1060, 1060, 1060, 1060, 1060, 489: 1060, 1060, 1060, 1060, 1060, 1060, 496: 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 532: 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 1060, 555: 1060, 633: 1060}, + {1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 467: 1059, 1059, 470: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 478: 1059, 1059, 481: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 489: 1059, 1059, 1059, 1059, 1059, 1059, 496: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 532: 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 555: 1059, 633: 1059}, // 900 - {1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 460: 1044, 1044, 463: 1044, 1044, 1044, 1044, 1044, 1044, 470: 1044, 1044, 1044, 474: 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 486: 1044, 1044, 489: 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 525: 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 550: 1044, 628: 1044}, - {1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 460: 1043, 1043, 463: 1043, 1043, 1043, 1043, 1043, 1043, 470: 1043, 1043, 1043, 474: 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 486: 1043, 1043, 489: 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 525: 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 550: 1043, 628: 1043}, - {1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 460: 1042, 1042, 463: 1042, 1042, 1042, 1042, 1042, 1042, 470: 1042, 1042, 1042, 474: 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 486: 1042, 1042, 489: 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 525: 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 550: 1042, 628: 1042}, - {1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 460: 1041, 1041, 463: 1041, 1041, 1041, 1041, 1041, 1041, 470: 1041, 1041, 1041, 474: 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 486: 1041, 1041, 489: 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 525: 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 550: 1041, 628: 1041}, - {1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 460: 1040, 1040, 463: 1040, 1040, 1040, 1040, 1040, 1040, 470: 1040, 1040, 1040, 474: 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 486: 1040, 1040, 489: 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 525: 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 550: 1040, 628: 1040}, + {1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 467: 1058, 1058, 470: 1058, 1058, 1058, 1058, 1058, 1058, 1058, 478: 1058, 1058, 481: 1058, 1058, 1058, 1058, 1058, 1058, 1058, 489: 1058, 1058, 1058, 1058, 1058, 1058, 496: 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 532: 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 555: 1058, 633: 1058}, + {1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 467: 1057, 1057, 470: 1057, 1057, 1057, 1057, 1057, 1057, 1057, 478: 1057, 1057, 481: 1057, 1057, 1057, 1057, 1057, 1057, 1057, 489: 1057, 1057, 1057, 1057, 1057, 1057, 496: 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 532: 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 1057, 555: 1057, 633: 1057}, + {1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 467: 1056, 1056, 470: 1056, 1056, 1056, 1056, 1056, 1056, 1056, 478: 1056, 1056, 481: 1056, 1056, 1056, 1056, 1056, 1056, 1056, 489: 1056, 1056, 1056, 1056, 1056, 1056, 496: 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 532: 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 1056, 555: 1056, 633: 1056}, + {1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 467: 1055, 1055, 470: 1055, 1055, 1055, 1055, 1055, 1055, 1055, 478: 1055, 1055, 481: 1055, 1055, 1055, 1055, 1055, 1055, 1055, 489: 1055, 1055, 1055, 1055, 1055, 1055, 496: 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 532: 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 1055, 555: 1055, 633: 1055}, + {1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 467: 1054, 1054, 470: 1054, 1054, 1054, 1054, 1054, 1054, 1054, 478: 1054, 1054, 481: 1054, 1054, 1054, 1054, 1054, 1054, 1054, 489: 1054, 1054, 1054, 1054, 1054, 1054, 496: 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 532: 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 555: 1054, 633: 1054}, // 905 - {1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 460: 1039, 1039, 463: 1039, 1039, 1039, 1039, 1039, 1039, 470: 1039, 1039, 1039, 474: 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 486: 1039, 1039, 489: 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 525: 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 550: 1039, 628: 1039}, - {127: 3359, 145: 3360}, - {53: 927, 486: 927}, - {53: 920, 486: 920}, - {53: 928, 486: 928}, + {1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 467: 1053, 1053, 470: 1053, 1053, 1053, 1053, 1053, 1053, 1053, 478: 1053, 1053, 481: 1053, 1053, 1053, 1053, 1053, 1053, 1053, 489: 1053, 1053, 1053, 1053, 1053, 1053, 496: 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 532: 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 1053, 555: 1053, 633: 1053}, + {1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 467: 1052, 1052, 470: 1052, 1052, 1052, 1052, 1052, 1052, 1052, 478: 1052, 1052, 481: 1052, 1052, 1052, 1052, 1052, 1052, 1052, 489: 1052, 1052, 1052, 1052, 1052, 1052, 496: 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 532: 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 1052, 555: 1052, 633: 1052}, + {1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 467: 1051, 1051, 470: 1051, 1051, 1051, 1051, 1051, 1051, 1051, 478: 1051, 1051, 481: 1051, 1051, 1051, 1051, 1051, 1051, 1051, 489: 1051, 1051, 1051, 1051, 1051, 1051, 496: 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 532: 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 1051, 555: 1051, 633: 1051}, + {1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 467: 1050, 1050, 470: 1050, 1050, 1050, 1050, 1050, 1050, 1050, 478: 1050, 1050, 481: 1050, 1050, 1050, 1050, 1050, 1050, 1050, 489: 1050, 1050, 1050, 1050, 1050, 1050, 496: 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 532: 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 555: 1050, 633: 1050}, + {1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 467: 1049, 1049, 470: 1049, 1049, 1049, 1049, 1049, 1049, 1049, 478: 1049, 1049, 481: 1049, 1049, 1049, 1049, 1049, 1049, 1049, 489: 1049, 1049, 1049, 1049, 1049, 1049, 496: 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 532: 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 555: 1049, 633: 1049}, // 910 - {53: 921, 486: 921}, - {53: 929, 486: 929}, - {53: 922, 486: 922}, - {53: 930, 486: 930}, - {53: 923, 486: 923}, + {1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 467: 1048, 1048, 470: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 478: 1048, 1048, 481: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 489: 1048, 1048, 1048, 1048, 1048, 1048, 496: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 532: 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 555: 1048, 633: 1048}, + {1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 467: 1047, 1047, 470: 1047, 1047, 1047, 1047, 1047, 1047, 1047, 478: 1047, 1047, 481: 1047, 1047, 1047, 1047, 1047, 1047, 1047, 489: 1047, 1047, 1047, 1047, 1047, 1047, 496: 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 532: 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047, 555: 1047, 633: 1047}, + {1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 467: 1046, 1046, 470: 1046, 1046, 1046, 1046, 1046, 1046, 1046, 478: 1046, 1046, 481: 1046, 1046, 1046, 1046, 1046, 1046, 1046, 489: 1046, 1046, 1046, 1046, 1046, 1046, 496: 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 532: 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 555: 1046, 633: 1046}, + {130: 3368, 148: 3369}, + {57: 934, 494: 934}, // 915 - {53: 926, 486: 926}, - {102: 3349, 3345, 105: 3342, 3357, 108: 3344, 3341, 3343, 3347, 3348, 3353, 3352, 3351, 3355, 3356, 3350, 3354, 3346, 486: 3233, 489: 3231, 3232, 3230, 3228, 512: 3339, 3336, 3338, 3337, 3333, 3335, 3334, 3331, 3332, 3330, 3340, 714: 3229, 3227, 788: 3329, 810: 3369}, - {127: 3359}, - {945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 455: 945, 945, 945, 945, 460: 945, 945, 945, 945, 945, 945, 945, 945, 945, 470: 945, 945, 945, 474: 945, 945, 945, 945, 945, 945, 945, 482: 945, 945, 945, 486: 945, 489: 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 525: 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 945, 565: 945}, - {1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 455: 1219, 1219, 1219, 1219, 460: 1219, 1219, 3237, 1219, 1219, 1219, 1219, 1219, 1219, 470: 1219, 1219, 1219, 474: 1219, 1219, 1219, 1219, 1219, 1219, 1219, 482: 1219, 1219, 1219, 486: 1219, 489: 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 525: 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 565: 1219}, + {57: 927, 494: 927}, + {57: 935, 494: 935}, + {57: 928, 494: 928}, + {57: 936, 494: 936}, + {57: 929, 494: 929}, // 920 - {1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 455: 1229, 1229, 1229, 1229, 460: 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 470: 1229, 1229, 1229, 474: 1229, 1229, 1229, 1229, 1229, 1229, 1229, 482: 1229, 1229, 1229, 486: 1229, 489: 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 525: 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 565: 1229}, - {717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 489: 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 525: 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 550: 717, 556: 717, 565: 717, 717, 568: 717, 624: 717, 717, 717, 717, 717, 717, 717}, - {716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 489: 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 525: 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 550: 716, 556: 716, 565: 716, 716, 568: 716, 624: 716, 716, 716, 716, 716, 716, 716}, - {248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 489: 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 548: 248, 550: 248, 556: 248, 565: 248, 248, 568: 248, 624: 248, 248, 248, 248, 248, 248, 248, 632: 248, 634: 248, 639: 248, 644: 248, 647: 248, 248, 248}, - {247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 489: 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 548: 247, 550: 247, 556: 247, 565: 247, 247, 568: 247, 624: 247, 247, 247, 247, 247, 247, 247, 632: 247, 634: 247, 639: 247, 644: 247, 647: 247, 247, 247}, + {57: 937, 494: 937}, + {57: 930, 494: 930}, + {57: 933, 494: 933}, + {105: 3358, 3354, 108: 3351, 3366, 111: 3353, 3350, 3352, 3356, 3357, 3362, 3361, 3360, 3364, 3365, 3359, 3363, 3355, 494: 3242, 496: 3240, 3241, 3239, 3237, 519: 3348, 3345, 3347, 3346, 3342, 3344, 3343, 3340, 3341, 3339, 3349, 722: 3238, 3236, 795: 3338, 818: 3378}, + {130: 3368}, // 925 - {1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 455: 1878, 1878, 460: 1878, 1878, 463: 1878, 1878, 1878, 470: 1878, 1878, 1878, 474: 1878, 1878, 1878, 1878, 479: 1878, 1878, 482: 1878, 1878, 1878, 486: 1878, 489: 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 503: 1878, 505: 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 526: 1878, 1878, 714: 3229, 3227}, - {1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 455: 1879, 1879, 460: 1879, 1879, 463: 1879, 1879, 1879, 470: 1879, 1879, 1879, 474: 1879, 1879, 1879, 1879, 479: 1879, 1879, 482: 1879, 1879, 1879, 486: 3233, 489: 1879, 3232, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 503: 1879, 505: 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 1879, 526: 1879, 1879, 714: 3229, 3227}, - {1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 455: 1880, 1880, 460: 1880, 1880, 463: 1880, 1880, 1880, 470: 1880, 1880, 1880, 474: 1880, 1880, 1880, 1880, 479: 1880, 1880, 482: 1880, 1880, 1880, 486: 3233, 489: 1880, 3232, 1880, 3228, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 503: 1880, 505: 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 526: 1880, 1880, 714: 3229, 3227}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3381}, - {53: 3382, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, + {952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 462: 952, 952, 952, 952, 467: 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 478: 952, 952, 481: 952, 952, 952, 952, 952, 487: 952, 489: 952, 952, 952, 952, 494: 952, 496: 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 532: 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 952, 570: 952}, + {1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 462: 1226, 1226, 1226, 1226, 467: 1226, 1226, 3246, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 478: 1226, 1226, 481: 1226, 1226, 1226, 1226, 1226, 487: 1226, 489: 1226, 1226, 1226, 1226, 494: 1226, 496: 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 532: 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 570: 1226}, + {1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 462: 1236, 1236, 1236, 1236, 467: 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 478: 1236, 1236, 481: 1236, 1236, 1236, 1236, 1236, 487: 1236, 489: 1236, 1236, 1236, 1236, 494: 1236, 496: 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 532: 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 570: 1236}, + {723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 496: 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 532: 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 555: 723, 565: 723, 570: 723, 573: 723, 575: 723, 631: 723, 723, 723, 723, 723, 723, 723}, + {722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 496: 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 532: 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 555: 722, 565: 722, 570: 722, 573: 722, 575: 722, 631: 722, 722, 722, 722, 722, 722, 722}, // 930 - {142: 3245, 470: 3246, 722: 898, 858: 3383}, - {722: 3249, 729: 3384}, - {905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 455: 905, 905, 905, 905, 460: 905, 905, 905, 905, 905, 905, 905, 905, 905, 470: 905, 905, 905, 474: 905, 905, 905, 905, 905, 905, 905, 482: 905, 905, 905, 486: 905, 489: 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 525: 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 905, 565: 905}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3386}, - {53: 3387, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, + {248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 496: 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 555: 248, 557: 248, 565: 248, 570: 248, 573: 248, 575: 248, 631: 248, 248, 248, 248, 248, 248, 248, 639: 248, 642: 248, 647: 248, 248, 650: 248, 656: 248, 248}, + {247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 496: 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 555: 247, 557: 247, 565: 247, 570: 247, 573: 247, 575: 247, 631: 247, 247, 247, 247, 247, 247, 247, 639: 247, 642: 247, 647: 247, 247, 650: 247, 656: 247, 247}, + {1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 462: 1892, 1892, 467: 1892, 1892, 470: 1892, 1892, 1892, 476: 1892, 478: 1892, 1892, 481: 1892, 1892, 1892, 485: 1892, 487: 1892, 489: 1892, 1892, 1892, 1892, 494: 1892, 496: 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 510: 1892, 512: 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 1892, 533: 1892, 1892, 722: 3238, 3236}, + {1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 462: 1893, 1893, 467: 1893, 1893, 470: 1893, 1893, 1893, 476: 1893, 478: 1893, 1893, 481: 1893, 1893, 1893, 485: 1893, 487: 1893, 489: 1893, 1893, 1893, 1893, 494: 3242, 496: 1893, 3241, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 510: 1893, 512: 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 533: 1893, 1893, 722: 3238, 3236}, + {1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 462: 1894, 1894, 467: 1894, 1894, 470: 1894, 1894, 1894, 476: 1894, 478: 1894, 1894, 481: 1894, 1894, 1894, 485: 1894, 487: 1894, 489: 1894, 1894, 1894, 1894, 494: 3242, 496: 1894, 3241, 1894, 3237, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 510: 1894, 512: 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 533: 1894, 1894, 722: 3238, 3236}, // 935 - {142: 3245, 470: 3246, 722: 898, 858: 3388}, - {722: 3249, 729: 3389}, - {906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 455: 906, 906, 906, 906, 460: 906, 906, 906, 906, 906, 906, 906, 906, 906, 470: 906, 906, 906, 474: 906, 906, 906, 906, 906, 906, 906, 482: 906, 906, 906, 486: 906, 489: 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 525: 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 906, 565: 906}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3391}, - {7: 3393, 53: 903, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227, 1071: 3392}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3390}, + {57: 3391, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {144: 3254, 476: 3255, 729: 905, 871: 3392}, + {729: 3258, 736: 3393}, + {912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 462: 912, 912, 912, 912, 467: 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 478: 912, 912, 481: 912, 912, 912, 912, 912, 487: 912, 489: 912, 912, 912, 912, 494: 912, 496: 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 532: 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 570: 912}, // 940 - {53: 3400}, - {488: 3308, 557: 3395, 560: 3310, 3309, 836: 3394}, - {7: 3397, 53: 900, 1072: 3399}, - {7: 3397, 53: 900, 1072: 3396}, - {53: 901}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3395}, + {57: 3396, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {144: 3254, 476: 3255, 729: 905, 871: 3397}, + {729: 3258, 736: 3398}, + {913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 462: 913, 913, 913, 913, 467: 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 478: 913, 913, 481: 913, 913, 913, 913, 913, 487: 913, 489: 913, 913, 913, 913, 494: 913, 496: 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 532: 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 570: 913}, // 945 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3398}, - {53: 899, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {53: 902}, - {142: 3245, 470: 3246, 722: 898, 858: 3401}, - {722: 3249, 729: 3402}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3400}, + {7: 3402, 57: 910, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236, 1075: 3401}, + {57: 3409}, + {495: 3317, 561: 3319, 3318, 566: 3404, 808: 3403}, + {7: 3406, 57: 907, 1076: 3408}, // 950 - {907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 455: 907, 907, 907, 907, 460: 907, 907, 907, 907, 907, 907, 907, 907, 907, 470: 907, 907, 907, 474: 907, 907, 907, 907, 907, 907, 907, 482: 907, 907, 907, 486: 907, 489: 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 525: 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 565: 907}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3404}, - {7: 3393, 53: 903, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227, 1071: 3405}, - {53: 3406}, - {142: 3245, 470: 3246, 722: 898, 858: 3407}, + {7: 3406, 57: 907, 1076: 3405}, + {57: 908}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3407}, + {57: 906, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {57: 909}, // 955 - {722: 3249, 729: 3408}, - {908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 455: 908, 908, 908, 908, 460: 908, 908, 908, 908, 908, 908, 908, 908, 908, 470: 908, 908, 908, 474: 908, 908, 908, 908, 908, 908, 908, 482: 908, 908, 908, 486: 908, 489: 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 525: 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 908, 565: 908}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3410, 3139, 3222, 3138, 3135}, - {53: 3411, 462: 3237, 565: 3238}, - {722: 3249, 729: 3412}, + {144: 3254, 476: 3255, 729: 905, 871: 3410}, + {729: 3258, 736: 3411}, + {914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 462: 914, 914, 914, 914, 467: 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 478: 914, 914, 481: 914, 914, 914, 914, 914, 487: 914, 489: 914, 914, 914, 914, 494: 914, 496: 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 532: 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 570: 914}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3413}, + {7: 3402, 57: 910, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236, 1075: 3414}, // 960 - {909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 455: 909, 909, 909, 909, 460: 909, 909, 909, 909, 909, 909, 909, 909, 909, 470: 909, 909, 909, 474: 909, 909, 909, 909, 909, 909, 909, 482: 909, 909, 909, 486: 909, 489: 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 525: 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, 565: 909}, - {53: 3414}, - {722: 3249, 729: 3415}, - {910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 455: 910, 910, 910, 910, 460: 910, 910, 910, 910, 910, 910, 910, 910, 910, 470: 910, 910, 910, 474: 910, 910, 910, 910, 910, 910, 910, 482: 910, 910, 910, 486: 910, 489: 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 525: 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 910, 565: 910}, - {53: 3417}, + {57: 3415}, + {144: 3254, 476: 3255, 729: 905, 871: 3416}, + {729: 3258, 736: 3417}, + {915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 462: 915, 915, 915, 915, 467: 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 478: 915, 915, 481: 915, 915, 915, 915, 915, 487: 915, 489: 915, 915, 915, 915, 494: 915, 496: 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 532: 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 570: 915}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3419, 3148, 3231, 3147, 3144}, // 965 - {722: 3249, 729: 3418}, - {911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 455: 911, 911, 911, 911, 460: 911, 911, 911, 911, 911, 911, 911, 911, 911, 470: 911, 911, 911, 474: 911, 911, 911, 911, 911, 911, 911, 482: 911, 911, 911, 486: 911, 489: 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 525: 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, 565: 911}, - {53: 3420}, - {722: 3249, 729: 3421}, - {912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 455: 912, 912, 912, 912, 460: 912, 912, 912, 912, 912, 912, 912, 912, 912, 470: 912, 912, 912, 474: 912, 912, 912, 912, 912, 912, 912, 482: 912, 912, 912, 486: 912, 489: 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 525: 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 912, 565: 912}, + {57: 3420, 469: 3246, 570: 3247}, + {729: 3258, 736: 3421}, + {916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 462: 916, 916, 916, 916, 467: 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 478: 916, 916, 481: 916, 916, 916, 916, 916, 487: 916, 489: 916, 916, 916, 916, 494: 916, 496: 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 532: 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 570: 916}, + {57: 3423}, + {729: 3258, 736: 3424}, // 970 - {53: 3423}, - {722: 3249, 729: 3424}, - {913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 455: 913, 913, 913, 913, 460: 913, 913, 913, 913, 913, 913, 913, 913, 913, 470: 913, 913, 913, 474: 913, 913, 913, 913, 913, 913, 913, 482: 913, 913, 913, 486: 913, 489: 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 525: 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 565: 913}, - {53: 3426}, - {722: 3249, 729: 3427}, + {917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 462: 917, 917, 917, 917, 467: 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 478: 917, 917, 481: 917, 917, 917, 917, 917, 487: 917, 489: 917, 917, 917, 917, 494: 917, 496: 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 532: 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 570: 917}, + {57: 3426}, + {729: 3258, 736: 3427}, + {918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 462: 918, 918, 918, 918, 467: 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 478: 918, 918, 481: 918, 918, 918, 918, 918, 487: 918, 489: 918, 918, 918, 918, 494: 918, 496: 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 532: 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 570: 918}, + {57: 3429}, // 975 - {914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 455: 914, 914, 914, 914, 460: 914, 914, 914, 914, 914, 914, 914, 914, 914, 470: 914, 914, 914, 474: 914, 914, 914, 914, 914, 914, 914, 482: 914, 914, 914, 486: 914, 489: 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 525: 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, 565: 914}, - {2: 1198, 1198, 1198, 1198, 1198, 8: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 54: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 454: 1198, 456: 1198, 1198, 1198, 1198, 464: 1198, 1198, 1198, 1198, 1198, 473: 1198, 481: 1198, 485: 1198, 487: 1198, 1198, 524: 1198, 547: 1198, 1198, 1198, 551: 1198, 1198, 1198, 1198, 1198, 557: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 567: 1198, 569: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 631: 1198, 718: 3431, 727: 3429, 3430, 763: 3432, 767: 3433, 795: 3435, 797: 3434}, - {2: 1202, 1202, 1202, 1202, 1202, 8: 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 54: 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 454: 1202, 456: 1202, 1202, 1202, 1202, 464: 1202, 1202, 1202, 1202, 1202, 473: 1202, 481: 1202, 485: 1202, 487: 1202, 1202, 495: 1202, 504: 1202, 524: 1202, 547: 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 557: 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 567: 1202, 569: 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 1202, 628: 1202, 631: 1202, 718: 1202, 727: 1202, 1202, 730: 1202, 1202, 1202, 738: 1202, 750: 1202, 1202, 1202}, - {2: 1201, 1201, 1201, 1201, 1201, 8: 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 54: 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 454: 1201, 456: 1201, 1201, 1201, 1201, 464: 1201, 1201, 1201, 1201, 1201, 473: 1201, 481: 1201, 485: 1201, 487: 1201, 1201, 495: 1201, 504: 1201, 524: 1201, 547: 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 557: 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 567: 1201, 569: 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 628: 1201, 631: 1201, 718: 1201, 727: 1201, 1201, 730: 1201, 1201, 1201, 738: 1201, 750: 1201, 1201, 1201}, - {2: 1200, 1200, 1200, 1200, 1200, 8: 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 54: 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 454: 1200, 456: 1200, 1200, 1200, 1200, 464: 1200, 1200, 1200, 1200, 1200, 473: 1200, 481: 1200, 485: 1200, 487: 1200, 1200, 495: 1200, 504: 1200, 524: 1200, 547: 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 557: 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 567: 1200, 569: 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 628: 1200, 631: 1200, 718: 1200, 727: 1200, 1200, 730: 1200, 1200, 1200, 738: 1200, 750: 1200, 1200, 1200}, + {729: 3258, 736: 3430}, + {919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 462: 919, 919, 919, 919, 467: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 478: 919, 919, 481: 919, 919, 919, 919, 919, 487: 919, 489: 919, 919, 919, 919, 494: 919, 496: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 532: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 570: 919}, + {57: 3432}, + {729: 3258, 736: 3433}, + {920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 462: 920, 920, 920, 920, 467: 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 478: 920, 920, 481: 920, 920, 920, 920, 920, 487: 920, 489: 920, 920, 920, 920, 494: 920, 496: 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 532: 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 920, 570: 920}, // 980 - {2: 1199, 1199, 1199, 1199, 1199, 8: 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 54: 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 454: 1199, 456: 1199, 1199, 1199, 1199, 464: 1199, 1199, 1199, 1199, 1199, 473: 1199, 481: 1199, 485: 1199, 487: 1199, 1199, 524: 1199, 547: 1199, 1199, 1199, 551: 1199, 1199, 1199, 1199, 1199, 557: 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 567: 1199, 569: 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 631: 1199, 718: 3440}, - {2: 1197, 1197, 1197, 1197, 1197, 8: 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 54: 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 454: 1197, 456: 1197, 1197, 1197, 1197, 464: 1197, 1197, 1197, 1197, 1197, 473: 1197, 481: 1197, 485: 1197, 487: 1197, 1197, 524: 1197, 547: 1197, 1197, 1197, 551: 1197, 1197, 1197, 1197, 1197, 557: 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 567: 1197, 569: 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 631: 1197}, - {2: 1194, 1194, 1194, 1194, 1194, 8: 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 54: 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 454: 1194, 456: 1194, 1194, 1194, 1194, 464: 1194, 1194, 1194, 1194, 1194, 473: 1194, 481: 1194, 485: 1194, 487: 1194, 1194, 524: 1194, 547: 1194, 1194, 1194, 551: 1194, 1194, 1194, 1194, 1194, 557: 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 567: 1194, 569: 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194, 631: 1194}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3436}, - {53: 3437, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, + {57: 3435}, + {729: 3258, 736: 3436}, + {921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 462: 921, 921, 921, 921, 467: 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 478: 921, 921, 481: 921, 921, 921, 921, 921, 487: 921, 489: 921, 921, 921, 921, 494: 921, 496: 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 532: 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 921, 570: 921}, + {2: 1205, 1205, 1205, 1205, 1205, 8: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 58: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 461: 1205, 463: 1205, 1205, 1205, 1205, 471: 1205, 1205, 1205, 1205, 1205, 480: 1205, 486: 1205, 488: 1205, 493: 1205, 495: 1205, 531: 1205, 554: 1205, 556: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 566: 1205, 1205, 1205, 1205, 571: 1205, 1205, 574: 1205, 576: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 638: 1205, 640: 3440, 734: 3438, 3439, 773: 3441, 776: 3442, 803: 3444, 805: 3443}, + {2: 1209, 1209, 1209, 1209, 1209, 8: 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 58: 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 461: 1209, 463: 1209, 1209, 1209, 1209, 471: 1209, 1209, 1209, 1209, 1209, 480: 1209, 486: 1209, 488: 1209, 493: 1209, 495: 1209, 502: 1209, 511: 1209, 531: 1209, 554: 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 566: 1209, 1209, 1209, 1209, 571: 1209, 1209, 574: 1209, 576: 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 633: 1209, 638: 1209, 640: 1209, 734: 1209, 1209, 737: 1209, 1209, 1209, 748: 1209, 757: 1209, 1209, 1209}, // 985 - {919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 455: 919, 919, 919, 919, 460: 919, 919, 919, 919, 919, 919, 919, 919, 919, 470: 919, 919, 919, 474: 919, 919, 919, 919, 919, 919, 919, 482: 919, 919, 919, 486: 919, 489: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 525: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 565: 919, 722: 3249, 729: 3439, 744: 3438}, - {1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 455: 1081, 1081, 1081, 1081, 460: 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 470: 1081, 1081, 1081, 474: 1081, 1081, 1081, 1081, 1081, 1081, 1081, 482: 1081, 1081, 1081, 486: 1081, 489: 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 525: 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 565: 1081}, - {918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 455: 918, 918, 918, 918, 460: 918, 918, 918, 918, 918, 918, 918, 918, 918, 470: 918, 918, 918, 474: 918, 918, 918, 918, 918, 918, 918, 482: 918, 918, 918, 486: 918, 489: 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 525: 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 918, 565: 918}, - {2: 1193, 1193, 1193, 1193, 1193, 8: 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 54: 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 454: 1193, 456: 1193, 1193, 1193, 1193, 464: 1193, 1193, 1193, 1193, 1193, 473: 1193, 481: 1193, 485: 1193, 487: 1193, 1193, 524: 1193, 547: 1193, 1193, 1193, 551: 1193, 1193, 1193, 1193, 1193, 557: 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 567: 1193, 569: 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 631: 1193}, - {2: 1198, 1198, 1198, 1198, 1198, 8: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 54: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 454: 1198, 456: 1198, 1198, 1198, 1198, 464: 1198, 1198, 1198, 1198, 1198, 473: 1198, 481: 1198, 485: 1198, 487: 1198, 1198, 524: 1198, 547: 1198, 1198, 1198, 551: 1198, 1198, 1198, 1198, 1198, 557: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 567: 1198, 569: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 631: 1198, 718: 3431, 727: 3429, 3430, 763: 3432, 767: 3433, 795: 3442, 797: 3434}, + {2: 1208, 1208, 1208, 1208, 1208, 8: 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 58: 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 461: 1208, 463: 1208, 1208, 1208, 1208, 471: 1208, 1208, 1208, 1208, 1208, 480: 1208, 486: 1208, 488: 1208, 493: 1208, 495: 1208, 502: 1208, 511: 1208, 531: 1208, 554: 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 566: 1208, 1208, 1208, 1208, 571: 1208, 1208, 574: 1208, 576: 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 633: 1208, 638: 1208, 640: 1208, 734: 1208, 1208, 737: 1208, 1208, 1208, 748: 1208, 757: 1208, 1208, 1208}, + {2: 1207, 1207, 1207, 1207, 1207, 8: 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 58: 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 461: 1207, 463: 1207, 1207, 1207, 1207, 471: 1207, 1207, 1207, 1207, 1207, 480: 1207, 486: 1207, 488: 1207, 493: 1207, 495: 1207, 502: 1207, 511: 1207, 531: 1207, 554: 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 566: 1207, 1207, 1207, 1207, 571: 1207, 1207, 574: 1207, 576: 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 633: 1207, 638: 1207, 640: 1207, 734: 1207, 1207, 737: 1207, 1207, 1207, 748: 1207, 757: 1207, 1207, 1207}, + {2: 1206, 1206, 1206, 1206, 1206, 8: 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 58: 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 461: 1206, 463: 1206, 1206, 1206, 1206, 471: 1206, 1206, 1206, 1206, 1206, 480: 1206, 486: 1206, 488: 1206, 493: 1206, 495: 1206, 531: 1206, 554: 1206, 556: 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 566: 1206, 1206, 1206, 1206, 571: 1206, 1206, 574: 1206, 576: 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 638: 1206, 640: 3449}, + {2: 1204, 1204, 1204, 1204, 1204, 8: 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 58: 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 461: 1204, 463: 1204, 1204, 1204, 1204, 471: 1204, 1204, 1204, 1204, 1204, 480: 1204, 486: 1204, 488: 1204, 493: 1204, 495: 1204, 531: 1204, 554: 1204, 556: 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 566: 1204, 1204, 1204, 1204, 571: 1204, 1204, 574: 1204, 576: 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 638: 1204}, + {2: 1201, 1201, 1201, 1201, 1201, 8: 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 58: 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 461: 1201, 463: 1201, 1201, 1201, 1201, 471: 1201, 1201, 1201, 1201, 1201, 480: 1201, 486: 1201, 488: 1201, 493: 1201, 495: 1201, 531: 1201, 554: 1201, 556: 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 566: 1201, 1201, 1201, 1201, 571: 1201, 1201, 574: 1201, 576: 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 638: 1201}, // 990 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3443}, - {53: 3444, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 455: 919, 919, 919, 919, 460: 919, 919, 919, 919, 919, 919, 919, 919, 919, 470: 919, 919, 919, 474: 919, 919, 919, 919, 919, 919, 919, 482: 919, 919, 919, 486: 919, 489: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 525: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 565: 919, 722: 3249, 729: 3439, 744: 3445}, - {1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 455: 1082, 1082, 1082, 1082, 460: 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 470: 1082, 1082, 1082, 474: 1082, 1082, 1082, 1082, 1082, 1082, 1082, 482: 1082, 1082, 1082, 486: 1082, 489: 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 525: 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 565: 1082}, - {2: 1198, 1198, 1198, 1198, 1198, 8: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 54: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 454: 1198, 456: 1198, 1198, 1198, 1198, 464: 1198, 1198, 1198, 1198, 1198, 473: 1198, 481: 1198, 485: 1198, 487: 1198, 1198, 524: 1198, 547: 1198, 1198, 1198, 551: 1198, 1198, 1198, 1198, 1198, 557: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 567: 1198, 569: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 631: 1198, 718: 3431, 727: 3429, 3430, 763: 3432, 767: 3433, 795: 3447, 797: 3434}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3445}, + {57: 3446, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 462: 926, 926, 926, 926, 467: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 478: 926, 926, 481: 926, 926, 926, 926, 926, 487: 926, 489: 926, 926, 926, 926, 494: 926, 496: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 532: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 570: 926, 729: 3258, 736: 3448, 754: 3447}, + {1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 462: 1088, 1088, 1088, 1088, 467: 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 478: 1088, 1088, 481: 1088, 1088, 1088, 1088, 1088, 487: 1088, 489: 1088, 1088, 1088, 1088, 494: 1088, 496: 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 532: 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 570: 1088}, + {925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 462: 925, 925, 925, 925, 467: 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 478: 925, 925, 481: 925, 925, 925, 925, 925, 487: 925, 489: 925, 925, 925, 925, 494: 925, 496: 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 532: 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, 570: 925}, // 995 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3448}, - {53: 3449, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 455: 919, 919, 919, 919, 460: 919, 919, 919, 919, 919, 919, 919, 919, 919, 470: 919, 919, 919, 474: 919, 919, 919, 919, 919, 919, 919, 482: 919, 919, 919, 486: 919, 489: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 525: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 565: 919, 722: 3249, 729: 3439, 744: 3450}, - {1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 455: 1083, 1083, 1083, 1083, 460: 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 470: 1083, 1083, 1083, 474: 1083, 1083, 1083, 1083, 1083, 1083, 1083, 482: 1083, 1083, 1083, 486: 1083, 489: 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 525: 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 565: 1083}, - {2: 1198, 1198, 1198, 1198, 1198, 8: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 54: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 454: 1198, 456: 1198, 1198, 1198, 1198, 464: 1198, 1198, 1198, 1198, 1198, 473: 1198, 481: 1198, 485: 1198, 487: 1198, 1198, 524: 1198, 547: 1198, 1198, 1198, 551: 1198, 1198, 1198, 1198, 1198, 557: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 567: 1198, 569: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 631: 1198, 718: 3431, 727: 3429, 3430, 763: 3432, 767: 3433, 795: 3452, 797: 3434}, + {2: 1200, 1200, 1200, 1200, 1200, 8: 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 58: 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 461: 1200, 463: 1200, 1200, 1200, 1200, 471: 1200, 1200, 1200, 1200, 1200, 480: 1200, 486: 1200, 488: 1200, 493: 1200, 495: 1200, 531: 1200, 554: 1200, 556: 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 566: 1200, 1200, 1200, 1200, 571: 1200, 1200, 574: 1200, 576: 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 638: 1200}, + {2: 1205, 1205, 1205, 1205, 1205, 8: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 58: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 461: 1205, 463: 1205, 1205, 1205, 1205, 471: 1205, 1205, 1205, 1205, 1205, 480: 1205, 486: 1205, 488: 1205, 493: 1205, 495: 1205, 531: 1205, 554: 1205, 556: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 566: 1205, 1205, 1205, 1205, 571: 1205, 1205, 574: 1205, 576: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 638: 1205, 640: 3440, 734: 3438, 3439, 773: 3441, 776: 3442, 803: 3451, 805: 3443}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3452}, + {57: 3453, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 462: 926, 926, 926, 926, 467: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 478: 926, 926, 481: 926, 926, 926, 926, 926, 487: 926, 489: 926, 926, 926, 926, 494: 926, 496: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 532: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 570: 926, 729: 3258, 736: 3448, 754: 3454}, // 1000 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3453}, - {53: 3454, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 455: 919, 919, 919, 919, 460: 919, 919, 919, 919, 919, 919, 919, 919, 919, 470: 919, 919, 919, 474: 919, 919, 919, 919, 919, 919, 919, 482: 919, 919, 919, 486: 919, 489: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 525: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 565: 919, 722: 3249, 729: 3439, 744: 3455}, - {1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 455: 1084, 1084, 1084, 1084, 460: 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 470: 1084, 1084, 1084, 474: 1084, 1084, 1084, 1084, 1084, 1084, 1084, 482: 1084, 1084, 1084, 486: 1084, 489: 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 525: 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 565: 1084}, - {2: 1198, 1198, 1198, 1198, 1198, 8: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 54: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 454: 1198, 456: 1198, 1198, 1198, 1198, 464: 1198, 1198, 1198, 1198, 1198, 473: 1198, 481: 1198, 485: 1198, 487: 1198, 1198, 524: 1198, 547: 1198, 1198, 1198, 551: 1198, 1198, 1198, 1198, 1198, 557: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 567: 1198, 569: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 631: 1198, 718: 3431, 727: 3429, 3430, 763: 3432, 767: 3433, 795: 3457, 797: 3434}, + {1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 462: 1089, 1089, 1089, 1089, 467: 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 478: 1089, 1089, 481: 1089, 1089, 1089, 1089, 1089, 487: 1089, 489: 1089, 1089, 1089, 1089, 494: 1089, 496: 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 532: 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 570: 1089}, + {2: 1205, 1205, 1205, 1205, 1205, 8: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 58: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 461: 1205, 463: 1205, 1205, 1205, 1205, 471: 1205, 1205, 1205, 1205, 1205, 480: 1205, 486: 1205, 488: 1205, 493: 1205, 495: 1205, 531: 1205, 554: 1205, 556: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 566: 1205, 1205, 1205, 1205, 571: 1205, 1205, 574: 1205, 576: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 638: 1205, 640: 3440, 734: 3438, 3439, 773: 3441, 776: 3442, 803: 3456, 805: 3443}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3457}, + {57: 3458, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 462: 926, 926, 926, 926, 467: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 478: 926, 926, 481: 926, 926, 926, 926, 926, 487: 926, 489: 926, 926, 926, 926, 494: 926, 496: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 532: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 570: 926, 729: 3258, 736: 3448, 754: 3459}, // 1005 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3458}, - {53: 3459, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 455: 919, 919, 919, 919, 460: 919, 919, 919, 919, 919, 919, 919, 919, 919, 470: 919, 919, 919, 474: 919, 919, 919, 919, 919, 919, 919, 482: 919, 919, 919, 486: 919, 489: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 525: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 565: 919, 722: 3249, 729: 3439, 744: 3460}, - {1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 455: 1085, 1085, 1085, 1085, 460: 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 470: 1085, 1085, 1085, 474: 1085, 1085, 1085, 1085, 1085, 1085, 1085, 482: 1085, 1085, 1085, 486: 1085, 489: 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 525: 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 565: 1085}, - {2: 1198, 1198, 1198, 1198, 1198, 8: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 54: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 454: 1198, 456: 1198, 1198, 1198, 1198, 464: 1198, 1198, 1198, 1198, 1198, 473: 1198, 481: 1198, 485: 1198, 487: 1198, 1198, 524: 1198, 547: 1198, 1198, 1198, 551: 1198, 1198, 1198, 1198, 1198, 557: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 567: 1198, 569: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 631: 1198, 718: 3431, 727: 3429, 3430, 763: 3432, 767: 3433, 795: 3462, 797: 3434}, + {1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 462: 1090, 1090, 1090, 1090, 467: 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 478: 1090, 1090, 481: 1090, 1090, 1090, 1090, 1090, 487: 1090, 489: 1090, 1090, 1090, 1090, 494: 1090, 496: 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 532: 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 570: 1090}, + {2: 1205, 1205, 1205, 1205, 1205, 8: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 58: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 461: 1205, 463: 1205, 1205, 1205, 1205, 471: 1205, 1205, 1205, 1205, 1205, 480: 1205, 486: 1205, 488: 1205, 493: 1205, 495: 1205, 531: 1205, 554: 1205, 556: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 566: 1205, 1205, 1205, 1205, 571: 1205, 1205, 574: 1205, 576: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 638: 1205, 640: 3440, 734: 3438, 3439, 773: 3441, 776: 3442, 803: 3461, 805: 3443}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3462}, + {57: 3463, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 462: 926, 926, 926, 926, 467: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 478: 926, 926, 481: 926, 926, 926, 926, 926, 487: 926, 489: 926, 926, 926, 926, 494: 926, 496: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 532: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 570: 926, 729: 3258, 736: 3448, 754: 3464}, // 1010 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3463}, - {53: 3464, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 455: 919, 919, 919, 919, 460: 919, 919, 919, 919, 919, 919, 919, 919, 919, 470: 919, 919, 919, 474: 919, 919, 919, 919, 919, 919, 919, 482: 919, 919, 919, 486: 919, 489: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 525: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 565: 919, 722: 3249, 729: 3439, 744: 3465}, - {1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 455: 1086, 1086, 1086, 1086, 460: 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 470: 1086, 1086, 1086, 474: 1086, 1086, 1086, 1086, 1086, 1086, 1086, 482: 1086, 1086, 1086, 486: 1086, 489: 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 525: 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 565: 1086}, - {2: 1198, 1198, 1198, 1198, 1198, 8: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 54: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 454: 1198, 456: 1198, 1198, 1198, 1198, 464: 1198, 1198, 1198, 1198, 1198, 473: 1198, 481: 1198, 485: 1198, 487: 1198, 1198, 524: 1198, 547: 1198, 1198, 1198, 551: 1198, 1198, 1198, 1198, 1198, 557: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 567: 1198, 569: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 631: 1198, 718: 3431, 727: 3429, 3430, 763: 3432, 767: 3433, 795: 3467, 797: 3434}, + {1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 462: 1091, 1091, 1091, 1091, 467: 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 478: 1091, 1091, 481: 1091, 1091, 1091, 1091, 1091, 487: 1091, 489: 1091, 1091, 1091, 1091, 494: 1091, 496: 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 532: 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 570: 1091}, + {2: 1205, 1205, 1205, 1205, 1205, 8: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 58: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 461: 1205, 463: 1205, 1205, 1205, 1205, 471: 1205, 1205, 1205, 1205, 1205, 480: 1205, 486: 1205, 488: 1205, 493: 1205, 495: 1205, 531: 1205, 554: 1205, 556: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 566: 1205, 1205, 1205, 1205, 571: 1205, 1205, 574: 1205, 576: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 638: 1205, 640: 3440, 734: 3438, 3439, 773: 3441, 776: 3442, 803: 3466, 805: 3443}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3467}, + {57: 3468, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 462: 926, 926, 926, 926, 467: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 478: 926, 926, 481: 926, 926, 926, 926, 926, 487: 926, 489: 926, 926, 926, 926, 494: 926, 496: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 532: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 570: 926, 729: 3258, 736: 3448, 754: 3469}, // 1015 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3468}, - {53: 3469, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 455: 919, 919, 919, 919, 460: 919, 919, 919, 919, 919, 919, 919, 919, 919, 470: 919, 919, 919, 474: 919, 919, 919, 919, 919, 919, 919, 482: 919, 919, 919, 486: 919, 489: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 525: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 565: 919, 722: 3249, 729: 3439, 744: 3470}, - {1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 455: 1087, 1087, 1087, 1087, 460: 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 470: 1087, 1087, 1087, 474: 1087, 1087, 1087, 1087, 1087, 1087, 1087, 482: 1087, 1087, 1087, 486: 1087, 489: 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 525: 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 565: 1087}, - {2: 1198, 1198, 1198, 1198, 1198, 8: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 54: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 454: 1198, 456: 1198, 1198, 1198, 1198, 464: 1198, 1198, 1198, 1198, 1198, 473: 1198, 481: 1198, 485: 1198, 487: 1198, 1198, 524: 1198, 547: 1198, 1198, 1198, 551: 1198, 1198, 1198, 1198, 1198, 557: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 567: 1198, 569: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 631: 1198, 718: 3431, 727: 3429, 3430, 763: 3432, 767: 3433, 795: 3472, 797: 3434}, + {1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 462: 1092, 1092, 1092, 1092, 467: 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 478: 1092, 1092, 481: 1092, 1092, 1092, 1092, 1092, 487: 1092, 489: 1092, 1092, 1092, 1092, 494: 1092, 496: 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 532: 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 570: 1092}, + {2: 1205, 1205, 1205, 1205, 1205, 8: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 58: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 461: 1205, 463: 1205, 1205, 1205, 1205, 471: 1205, 1205, 1205, 1205, 1205, 480: 1205, 486: 1205, 488: 1205, 493: 1205, 495: 1205, 531: 1205, 554: 1205, 556: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 566: 1205, 1205, 1205, 1205, 571: 1205, 1205, 574: 1205, 576: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 638: 1205, 640: 3440, 734: 3438, 3439, 773: 3441, 776: 3442, 803: 3471, 805: 3443}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3472}, + {57: 3473, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 462: 926, 926, 926, 926, 467: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 478: 926, 926, 481: 926, 926, 926, 926, 926, 487: 926, 489: 926, 926, 926, 926, 494: 926, 496: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 532: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 570: 926, 729: 3258, 736: 3448, 754: 3474}, // 1020 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3473, 756: 3474}, - {1860, 1860, 7: 1860, 53: 1860, 121: 1860, 463: 1860, 484: 1860, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {7: 3475, 53: 1253, 121: 1253, 484: 2631, 748: 2632, 792: 3476}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3482}, - {53: 1074, 121: 3478, 1238: 3477}, + {1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 462: 1093, 1093, 1093, 1093, 467: 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 478: 1093, 1093, 481: 1093, 1093, 1093, 1093, 1093, 487: 1093, 489: 1093, 1093, 1093, 1093, 494: 1093, 496: 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 532: 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 570: 1093}, + {2: 1205, 1205, 1205, 1205, 1205, 8: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 58: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 461: 1205, 463: 1205, 1205, 1205, 1205, 471: 1205, 1205, 1205, 1205, 1205, 480: 1205, 486: 1205, 488: 1205, 493: 1205, 495: 1205, 531: 1205, 554: 1205, 556: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 566: 1205, 1205, 1205, 1205, 571: 1205, 1205, 574: 1205, 576: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 638: 1205, 640: 3440, 734: 3438, 3439, 773: 3441, 776: 3442, 803: 3476, 805: 3443}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3477}, + {57: 3478, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 462: 926, 926, 926, 926, 467: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 478: 926, 926, 481: 926, 926, 926, 926, 926, 487: 926, 489: 926, 926, 926, 926, 494: 926, 496: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 532: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 570: 926, 729: 3258, 736: 3448, 754: 3479}, // 1025 - {53: 3480}, - {456: 3479}, - {53: 1073}, - {919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 455: 919, 919, 919, 919, 460: 919, 919, 919, 919, 919, 919, 919, 919, 919, 470: 919, 919, 919, 474: 919, 919, 919, 919, 919, 919, 919, 482: 919, 919, 919, 486: 919, 489: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 525: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 565: 919, 722: 3249, 729: 3439, 744: 3481}, - {1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 455: 1088, 1088, 1088, 1088, 460: 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 470: 1088, 1088, 1088, 474: 1088, 1088, 1088, 1088, 1088, 1088, 1088, 482: 1088, 1088, 1088, 486: 1088, 489: 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 525: 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 565: 1088}, + {1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 462: 1094, 1094, 1094, 1094, 467: 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 478: 1094, 1094, 481: 1094, 1094, 1094, 1094, 1094, 487: 1094, 489: 1094, 1094, 1094, 1094, 494: 1094, 496: 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 532: 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 570: 1094}, + {2: 1205, 1205, 1205, 1205, 1205, 8: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 58: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 461: 1205, 463: 1205, 1205, 1205, 1205, 471: 1205, 1205, 1205, 1205, 1205, 480: 1205, 486: 1205, 488: 1205, 493: 1205, 495: 1205, 531: 1205, 554: 1205, 556: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 566: 1205, 1205, 1205, 1205, 571: 1205, 1205, 574: 1205, 576: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 638: 1205, 640: 3440, 734: 3438, 3439, 773: 3441, 776: 3442, 803: 3481, 805: 3443}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3482, 765: 3483}, + {1874, 1874, 7: 1874, 57: 1874, 124: 1874, 470: 1874, 492: 1874, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {7: 3484, 57: 1260, 124: 1260, 492: 2633, 755: 2634, 800: 3485}, // 1030 - {1859, 1859, 7: 1859, 53: 1859, 121: 1859, 463: 1859, 484: 1859, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 504: 3487, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3484, 718: 3486, 727: 3429, 3430, 763: 3485}, - {53: 3495, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3473, 756: 3493}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3490}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3491}, + {57: 1081, 124: 3487, 1240: 3486}, + {57: 3489}, + {463: 3488}, + {57: 1080}, // 1035 - {53: 3488}, - {919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 455: 919, 919, 919, 919, 460: 919, 919, 919, 919, 919, 919, 919, 919, 919, 470: 919, 919, 919, 474: 919, 919, 919, 919, 919, 919, 919, 482: 919, 919, 919, 486: 919, 489: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 525: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 565: 919, 722: 3249, 729: 3439, 744: 3489}, - {1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 455: 1089, 1089, 1089, 1089, 460: 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 470: 1089, 1089, 1089, 474: 1089, 1089, 1089, 1089, 1089, 1089, 1089, 482: 1089, 1089, 1089, 486: 1089, 489: 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 525: 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 1089, 565: 1089}, - {53: 3491, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 455: 919, 919, 919, 919, 460: 919, 919, 919, 919, 919, 919, 919, 919, 919, 470: 919, 919, 919, 474: 919, 919, 919, 919, 919, 919, 919, 482: 919, 919, 919, 486: 919, 489: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 525: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 565: 919, 722: 3249, 729: 3439, 744: 3492}, + {926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 462: 926, 926, 926, 926, 467: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 478: 926, 926, 481: 926, 926, 926, 926, 926, 487: 926, 489: 926, 926, 926, 926, 494: 926, 496: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 532: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 570: 926, 729: 3258, 736: 3448, 754: 3490}, + {1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 462: 1095, 1095, 1095, 1095, 467: 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 478: 1095, 1095, 481: 1095, 1095, 1095, 1095, 1095, 487: 1095, 489: 1095, 1095, 1095, 1095, 494: 1095, 496: 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 532: 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 570: 1095}, + {1873, 1873, 7: 1873, 57: 1873, 124: 1873, 470: 1873, 492: 1873, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 511: 3496, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 640: 3495, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3493, 734: 3438, 3439, 773: 3494}, + {57: 3504, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, // 1040 - {1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 455: 1091, 1091, 1091, 1091, 460: 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 470: 1091, 1091, 1091, 474: 1091, 1091, 1091, 1091, 1091, 1091, 1091, 482: 1091, 1091, 1091, 486: 1091, 489: 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 525: 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 565: 1091}, - {7: 3475, 53: 3494}, - {1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 455: 1092, 1092, 1092, 1092, 460: 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 470: 1092, 1092, 1092, 474: 1092, 1092, 1092, 1092, 1092, 1092, 1092, 482: 1092, 1092, 1092, 486: 1092, 489: 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 525: 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 565: 1092}, - {919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 455: 919, 919, 919, 919, 460: 919, 919, 919, 919, 919, 919, 919, 919, 919, 470: 919, 919, 919, 474: 919, 919, 919, 919, 919, 919, 919, 482: 919, 919, 919, 486: 919, 489: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 525: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 565: 919, 722: 3249, 729: 3439, 744: 3496}, - {1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 455: 1090, 1090, 1090, 1090, 460: 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 470: 1090, 1090, 1090, 474: 1090, 1090, 1090, 1090, 1090, 1090, 1090, 482: 1090, 1090, 1090, 486: 1090, 489: 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 525: 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 1090, 565: 1090}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3482, 765: 3502}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3499}, + {57: 3497}, + {926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 462: 926, 926, 926, 926, 467: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 478: 926, 926, 481: 926, 926, 926, 926, 926, 487: 926, 489: 926, 926, 926, 926, 494: 926, 496: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 532: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 570: 926, 729: 3258, 736: 3448, 754: 3498}, + {1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 462: 1096, 1096, 1096, 1096, 467: 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 478: 1096, 1096, 481: 1096, 1096, 1096, 1096, 1096, 487: 1096, 489: 1096, 1096, 1096, 1096, 494: 1096, 496: 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 532: 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 570: 1096}, // 1045 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3498, 718: 3499}, - {53: 3503, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3500}, - {53: 3501, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 455: 919, 919, 919, 919, 460: 919, 919, 919, 919, 919, 919, 919, 919, 919, 470: 919, 919, 919, 474: 919, 919, 919, 919, 919, 919, 919, 482: 919, 919, 919, 486: 919, 489: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 525: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 565: 919, 722: 3249, 729: 3439, 744: 3502}, + {57: 3500, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 462: 926, 926, 926, 926, 467: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 478: 926, 926, 481: 926, 926, 926, 926, 926, 487: 926, 489: 926, 926, 926, 926, 494: 926, 496: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 532: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 570: 926, 729: 3258, 736: 3448, 754: 3501}, + {1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 462: 1098, 1098, 1098, 1098, 467: 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 478: 1098, 1098, 481: 1098, 1098, 1098, 1098, 1098, 487: 1098, 489: 1098, 1098, 1098, 1098, 494: 1098, 496: 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 532: 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 570: 1098}, + {7: 3484, 57: 3503}, + {1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 462: 1099, 1099, 1099, 1099, 467: 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 478: 1099, 1099, 481: 1099, 1099, 1099, 1099, 1099, 487: 1099, 489: 1099, 1099, 1099, 1099, 494: 1099, 496: 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 532: 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 570: 1099}, // 1050 - {1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 455: 1093, 1093, 1093, 1093, 460: 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 470: 1093, 1093, 1093, 474: 1093, 1093, 1093, 1093, 1093, 1093, 1093, 482: 1093, 1093, 1093, 486: 1093, 489: 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 525: 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 565: 1093}, - {919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 455: 919, 919, 919, 919, 460: 919, 919, 919, 919, 919, 919, 919, 919, 919, 470: 919, 919, 919, 474: 919, 919, 919, 919, 919, 919, 919, 482: 919, 919, 919, 486: 919, 489: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 525: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 565: 919, 722: 3249, 729: 3439, 744: 3504}, - {1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 455: 1094, 1094, 1094, 1094, 460: 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 470: 1094, 1094, 1094, 474: 1094, 1094, 1094, 1094, 1094, 1094, 1094, 482: 1094, 1094, 1094, 486: 1094, 489: 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 525: 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 565: 1094}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3506, 718: 3507}, - {53: 3511, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, + {926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 462: 926, 926, 926, 926, 467: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 478: 926, 926, 481: 926, 926, 926, 926, 926, 487: 926, 489: 926, 926, 926, 926, 494: 926, 496: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 532: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 570: 926, 729: 3258, 736: 3448, 754: 3505}, + {1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 462: 1097, 1097, 1097, 1097, 467: 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 478: 1097, 1097, 481: 1097, 1097, 1097, 1097, 1097, 487: 1097, 489: 1097, 1097, 1097, 1097, 494: 1097, 496: 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 532: 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 570: 1097}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 640: 3508, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3507}, + {57: 3512, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3509}, // 1055 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3508}, - {53: 3509, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 455: 919, 919, 919, 919, 460: 919, 919, 919, 919, 919, 919, 919, 919, 919, 470: 919, 919, 919, 474: 919, 919, 919, 919, 919, 919, 919, 482: 919, 919, 919, 486: 919, 489: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 525: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 565: 919, 722: 3249, 729: 3439, 744: 3510}, - {1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 455: 1095, 1095, 1095, 1095, 460: 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 470: 1095, 1095, 1095, 474: 1095, 1095, 1095, 1095, 1095, 1095, 1095, 482: 1095, 1095, 1095, 486: 1095, 489: 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 525: 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 565: 1095}, - {919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 455: 919, 919, 919, 919, 460: 919, 919, 919, 919, 919, 919, 919, 919, 919, 470: 919, 919, 919, 474: 919, 919, 919, 919, 919, 919, 919, 482: 919, 919, 919, 486: 919, 489: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 525: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 565: 919, 722: 3249, 729: 3439, 744: 3512}, + {57: 3510, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 462: 926, 926, 926, 926, 467: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 478: 926, 926, 481: 926, 926, 926, 926, 926, 487: 926, 489: 926, 926, 926, 926, 494: 926, 496: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 532: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 570: 926, 729: 3258, 736: 3448, 754: 3511}, + {1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 462: 1100, 1100, 1100, 1100, 467: 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 478: 1100, 1100, 481: 1100, 1100, 1100, 1100, 1100, 487: 1100, 489: 1100, 1100, 1100, 1100, 494: 1100, 496: 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 532: 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 570: 1100}, + {926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 462: 926, 926, 926, 926, 467: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 478: 926, 926, 481: 926, 926, 926, 926, 926, 487: 926, 489: 926, 926, 926, 926, 494: 926, 496: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 532: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 570: 926, 729: 3258, 736: 3448, 754: 3513}, + {1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 462: 1101, 1101, 1101, 1101, 467: 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 478: 1101, 1101, 481: 1101, 1101, 1101, 1101, 1101, 487: 1101, 489: 1101, 1101, 1101, 1101, 494: 1101, 496: 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 532: 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 570: 1101}, // 1060 - {1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 455: 1096, 1096, 1096, 1096, 460: 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 470: 1096, 1096, 1096, 474: 1096, 1096, 1096, 1096, 1096, 1096, 1096, 482: 1096, 1096, 1096, 486: 1096, 489: 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 525: 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 565: 1096}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3514, 718: 3515}, - {53: 3519, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3516}, - {53: 3517, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 640: 3516, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3515}, + {57: 3520, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3517}, + {57: 3518, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 462: 926, 926, 926, 926, 467: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 478: 926, 926, 481: 926, 926, 926, 926, 926, 487: 926, 489: 926, 926, 926, 926, 494: 926, 496: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 532: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 570: 926, 729: 3258, 736: 3448, 754: 3519}, // 1065 - {919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 455: 919, 919, 919, 919, 460: 919, 919, 919, 919, 919, 919, 919, 919, 919, 470: 919, 919, 919, 474: 919, 919, 919, 919, 919, 919, 919, 482: 919, 919, 919, 486: 919, 489: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 525: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 565: 919, 722: 3249, 729: 3439, 744: 3518}, - {1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 455: 1097, 1097, 1097, 1097, 460: 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 470: 1097, 1097, 1097, 474: 1097, 1097, 1097, 1097, 1097, 1097, 1097, 482: 1097, 1097, 1097, 486: 1097, 489: 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 525: 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 1097, 565: 1097}, - {919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 455: 919, 919, 919, 919, 460: 919, 919, 919, 919, 919, 919, 919, 919, 919, 470: 919, 919, 919, 474: 919, 919, 919, 919, 919, 919, 919, 482: 919, 919, 919, 486: 919, 489: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 525: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 565: 919, 722: 3249, 729: 3439, 744: 3520}, - {1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 455: 1098, 1098, 1098, 1098, 460: 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 470: 1098, 1098, 1098, 474: 1098, 1098, 1098, 1098, 1098, 1098, 1098, 482: 1098, 1098, 1098, 486: 1098, 489: 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 525: 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 565: 1098}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3473, 756: 3522}, + {1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 462: 1102, 1102, 1102, 1102, 467: 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 478: 1102, 1102, 481: 1102, 1102, 1102, 1102, 1102, 487: 1102, 489: 1102, 1102, 1102, 1102, 494: 1102, 496: 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 532: 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 570: 1102}, + {926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 462: 926, 926, 926, 926, 467: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 478: 926, 926, 481: 926, 926, 926, 926, 926, 487: 926, 489: 926, 926, 926, 926, 494: 926, 496: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 532: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 570: 926, 729: 3258, 736: 3448, 754: 3521}, + {1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 462: 1103, 1103, 1103, 1103, 467: 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 478: 1103, 1103, 481: 1103, 1103, 1103, 1103, 1103, 487: 1103, 489: 1103, 1103, 1103, 1103, 494: 1103, 496: 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 532: 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 570: 1103}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 640: 3524, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3523}, + {57: 3528, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, // 1070 - {7: 3475, 53: 3523}, - {1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 455: 1099, 1099, 1099, 1099, 460: 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 470: 1099, 1099, 1099, 474: 1099, 1099, 1099, 1099, 1099, 1099, 1099, 482: 1099, 1099, 1099, 486: 1099, 489: 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 525: 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 565: 1099}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3473, 756: 3525}, - {7: 3475, 53: 3526}, - {1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 455: 1100, 1100, 1100, 1100, 460: 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 470: 1100, 1100, 1100, 474: 1100, 1100, 1100, 1100, 1100, 1100, 1100, 482: 1100, 1100, 1100, 486: 1100, 489: 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 525: 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 565: 1100}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3525}, + {57: 3526, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 462: 926, 926, 926, 926, 467: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 478: 926, 926, 481: 926, 926, 926, 926, 926, 487: 926, 489: 926, 926, 926, 926, 494: 926, 496: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 532: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 570: 926, 729: 3258, 736: 3448, 754: 3527}, + {1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 462: 1104, 1104, 1104, 1104, 467: 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 478: 1104, 1104, 481: 1104, 1104, 1104, 1104, 1104, 487: 1104, 489: 1104, 1104, 1104, 1104, 494: 1104, 496: 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 532: 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 570: 1104}, + {926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 462: 926, 926, 926, 926, 467: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 478: 926, 926, 481: 926, 926, 926, 926, 926, 487: 926, 489: 926, 926, 926, 926, 494: 926, 496: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 532: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 570: 926, 729: 3258, 736: 3448, 754: 3529}, // 1075 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3528}, - {7: 3529, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3530}, - {7: 3531, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3532}, + {1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 462: 1105, 1105, 1105, 1105, 467: 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 478: 1105, 1105, 481: 1105, 1105, 1105, 1105, 1105, 487: 1105, 489: 1105, 1105, 1105, 1105, 494: 1105, 496: 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 532: 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 570: 1105}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3482, 765: 3531}, + {7: 3484, 57: 3532}, + {1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 462: 1106, 1106, 1106, 1106, 467: 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 478: 1106, 1106, 481: 1106, 1106, 1106, 1106, 1106, 487: 1106, 489: 1106, 1106, 1106, 1106, 494: 1106, 496: 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 532: 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 570: 1106}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3482, 765: 3534}, // 1080 - {53: 3533, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 455: 1116, 1116, 1116, 1116, 460: 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 470: 1116, 1116, 1116, 474: 1116, 1116, 1116, 1116, 1116, 1116, 1116, 482: 1116, 1116, 1116, 486: 1116, 489: 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 525: 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 565: 1116}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3535, 1158: 3537, 1214: 3538, 1298: 3539, 3536}, - {53: 3547, 479: 3548, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 479: 3541, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3540}, + {7: 3484, 57: 3535}, + {1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 462: 1107, 1107, 1107, 1107, 467: 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 478: 1107, 1107, 481: 1107, 1107, 1107, 1107, 1107, 487: 1107, 489: 1107, 1107, 1107, 1107, 494: 1107, 496: 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 532: 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 570: 1107}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3537}, + {7: 3538, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3539}, // 1085 - {2: 1107, 1107, 1107, 1107, 1107, 8: 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 54: 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 454: 1107, 456: 1107, 1107, 1107, 1107, 464: 1107, 1107, 1107, 1107, 1107, 473: 1107, 479: 1107, 481: 1107, 485: 1107, 487: 1107, 1107, 524: 1107, 547: 1107, 1107, 1107, 551: 1107, 1107, 1107, 1107, 1107, 557: 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 567: 1107, 569: 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 1107, 631: 1107}, - {2: 1106, 1106, 1106, 1106, 1106, 8: 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 54: 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 454: 1106, 456: 1106, 1106, 1106, 1106, 464: 1106, 1106, 1106, 1106, 1106, 473: 1106, 479: 1106, 481: 1106, 485: 1106, 487: 1106, 1106, 524: 1106, 547: 1106, 1106, 1106, 551: 1106, 1106, 1106, 1106, 1106, 557: 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 567: 1106, 569: 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1106, 631: 1106}, - {2: 1105, 1105, 1105, 1105, 1105, 8: 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 54: 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 454: 1105, 456: 1105, 1105, 1105, 1105, 464: 1105, 1105, 1105, 1105, 1105, 473: 1105, 479: 1105, 481: 1105, 485: 1105, 487: 1105, 1105, 524: 1105, 547: 1105, 1105, 1105, 551: 1105, 1105, 1105, 1105, 1105, 557: 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 567: 1105, 569: 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 1105, 631: 1105}, - {479: 3544, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3542}, + {7: 3540, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3541}, + {57: 3542, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 462: 1123, 1123, 1123, 1123, 467: 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 478: 1123, 1123, 481: 1123, 1123, 1123, 1123, 1123, 487: 1123, 489: 1123, 1123, 1123, 1123, 494: 1123, 496: 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 532: 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 570: 1123}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3544, 1161: 3546, 1216: 3547, 1300: 3548, 3545}, // 1090 - {53: 3543, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 455: 1122, 1122, 1122, 1122, 460: 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 470: 1122, 1122, 1122, 474: 1122, 1122, 1122, 1122, 1122, 1122, 1122, 482: 1122, 1122, 1122, 486: 1122, 489: 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 525: 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 565: 1122}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3545}, - {53: 3546, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 455: 1121, 1121, 1121, 1121, 460: 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 470: 1121, 1121, 1121, 474: 1121, 1121, 1121, 1121, 1121, 1121, 1121, 482: 1121, 1121, 1121, 486: 1121, 489: 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 525: 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 565: 1121}, + {57: 3556, 489: 3557, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 3550, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3549}, + {2: 1114, 1114, 1114, 1114, 1114, 8: 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 58: 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 461: 1114, 463: 1114, 1114, 1114, 1114, 471: 1114, 1114, 1114, 1114, 1114, 480: 1114, 486: 1114, 488: 1114, 1114, 493: 1114, 495: 1114, 531: 1114, 554: 1114, 556: 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 566: 1114, 1114, 1114, 1114, 571: 1114, 1114, 574: 1114, 576: 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 638: 1114}, + {2: 1113, 1113, 1113, 1113, 1113, 8: 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 58: 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 461: 1113, 463: 1113, 1113, 1113, 1113, 471: 1113, 1113, 1113, 1113, 1113, 480: 1113, 486: 1113, 488: 1113, 1113, 493: 1113, 495: 1113, 531: 1113, 554: 1113, 556: 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 566: 1113, 1113, 1113, 1113, 571: 1113, 1113, 574: 1113, 576: 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 638: 1113}, + {2: 1112, 1112, 1112, 1112, 1112, 8: 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 58: 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 461: 1112, 463: 1112, 1112, 1112, 1112, 471: 1112, 1112, 1112, 1112, 1112, 480: 1112, 486: 1112, 488: 1112, 1112, 493: 1112, 495: 1112, 531: 1112, 554: 1112, 556: 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 566: 1112, 1112, 1112, 1112, 571: 1112, 1112, 574: 1112, 576: 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 638: 1112}, // 1095 - {1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 455: 1124, 1124, 1124, 1124, 460: 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 470: 1124, 1124, 1124, 474: 1124, 1124, 1124, 1124, 1124, 1124, 1124, 482: 1124, 1124, 1124, 486: 1124, 489: 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 525: 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 565: 1124}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3549}, - {53: 3550, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 455: 1123, 1123, 1123, 1123, 460: 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 470: 1123, 1123, 1123, 474: 1123, 1123, 1123, 1123, 1123, 1123, 1123, 482: 1123, 1123, 1123, 486: 1123, 489: 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 525: 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 565: 1123}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3552}, + {489: 3553, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3551}, + {57: 3552, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 462: 1129, 1129, 1129, 1129, 467: 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 478: 1129, 1129, 481: 1129, 1129, 1129, 1129, 1129, 487: 1129, 489: 1129, 1129, 1129, 1129, 494: 1129, 496: 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 532: 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 570: 1129}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3554}, // 1100 - {7: 3553, 479: 3554, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3560}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3555}, - {53: 3556, 474: 3557, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 455: 1129, 1129, 1129, 1129, 460: 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 470: 1129, 1129, 1129, 474: 1129, 1129, 1129, 1129, 1129, 1129, 1129, 482: 1129, 1129, 1129, 486: 1129, 489: 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 525: 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 565: 1129}, + {57: 3555, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 462: 1128, 1128, 1128, 1128, 467: 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 478: 1128, 1128, 481: 1128, 1128, 1128, 1128, 1128, 487: 1128, 489: 1128, 1128, 1128, 1128, 494: 1128, 496: 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 532: 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 570: 1128}, + {1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 462: 1131, 1131, 1131, 1131, 467: 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 478: 1131, 1131, 481: 1131, 1131, 1131, 1131, 1131, 487: 1131, 489: 1131, 1131, 1131, 1131, 494: 1131, 496: 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 532: 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 570: 1131}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3558}, + {57: 3559, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, // 1105 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3558}, - {53: 3559, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 455: 1127, 1127, 1127, 1127, 460: 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 470: 1127, 1127, 1127, 474: 1127, 1127, 1127, 1127, 1127, 1127, 1127, 482: 1127, 1127, 1127, 486: 1127, 489: 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 525: 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 565: 1127}, - {7: 3562, 53: 3561, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 455: 1130, 1130, 1130, 1130, 460: 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 470: 1130, 1130, 1130, 474: 1130, 1130, 1130, 1130, 1130, 1130, 1130, 482: 1130, 1130, 1130, 486: 1130, 489: 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 525: 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 565: 1130}, + {1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 462: 1130, 1130, 1130, 1130, 467: 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 478: 1130, 1130, 481: 1130, 1130, 1130, 1130, 1130, 487: 1130, 489: 1130, 1130, 1130, 1130, 494: 1130, 496: 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 532: 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 570: 1130}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3561}, + {7: 3562, 489: 3563, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3569}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3564}, // 1110 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3563}, - {53: 3564, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 455: 1128, 1128, 1128, 1128, 460: 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 470: 1128, 1128, 1128, 474: 1128, 1128, 1128, 1128, 1128, 1128, 1128, 482: 1128, 1128, 1128, 486: 1128, 489: 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 525: 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 565: 1128}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 3566}, - {466: 3572, 3571, 3577, 504: 3573, 525: 3579, 537: 3574, 3575, 3568, 3578, 3567, 3576, 3569, 3570}, + {57: 3565, 481: 3566, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 462: 1136, 1136, 1136, 1136, 467: 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 478: 1136, 1136, 481: 1136, 1136, 1136, 1136, 1136, 487: 1136, 489: 1136, 1136, 1136, 1136, 494: 1136, 496: 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 532: 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 570: 1136}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3567}, + {57: 3568, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 462: 1134, 1134, 1134, 1134, 467: 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 478: 1134, 1134, 481: 1134, 1134, 1134, 1134, 1134, 487: 1134, 489: 1134, 1134, 1134, 1134, 494: 1134, 496: 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 532: 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 570: 1134}, // 1115 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 3599}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 3598}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 3597}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 3596}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3593, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 3592}, + {7: 3571, 57: 3570, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 462: 1137, 1137, 1137, 1137, 467: 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 478: 1137, 1137, 481: 1137, 1137, 1137, 1137, 1137, 487: 1137, 489: 1137, 1137, 1137, 1137, 494: 1137, 496: 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 532: 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 570: 1137}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3572}, + {57: 3573, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 462: 1135, 1135, 1135, 1135, 467: 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 478: 1135, 1135, 481: 1135, 1135, 1135, 1135, 1135, 487: 1135, 489: 1135, 1135, 1135, 1135, 494: 1135, 496: 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 532: 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 570: 1135}, // 1120 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3589, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 3588}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 3587}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 3586}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 3585}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 3584}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 3575}, + {473: 3581, 3580, 3586, 511: 3582, 532: 3588, 544: 3583, 3584, 3577, 3587, 3576, 3585, 3578, 3579}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 3608}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 3607}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 3606}, // 1125 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 3583}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 3582}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3580}, - {53: 3581, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 455: 1131, 1131, 1131, 1131, 460: 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 470: 1131, 1131, 1131, 474: 1131, 1131, 1131, 1131, 1131, 1131, 1131, 482: 1131, 1131, 1131, 486: 1131, 489: 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 525: 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 565: 1131}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 3605}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3602, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 3601}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3598, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 3597}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 3596}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 3595}, // 1130 - {1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 455: 1238, 1238, 1238, 1238, 460: 1238, 1238, 463: 1238, 1238, 1238, 1238, 1238, 1238, 470: 1238, 1238, 1238, 474: 1238, 1238, 1238, 1238, 1238, 1238, 1238, 482: 1238, 1238, 1238, 486: 1238, 489: 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 525: 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238, 1238}, - {1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 455: 1239, 1239, 1239, 1239, 460: 1239, 1239, 463: 1239, 1239, 1239, 1239, 1239, 1239, 470: 1239, 1239, 1239, 474: 1239, 1239, 1239, 1239, 1239, 1239, 1239, 482: 1239, 1239, 1239, 486: 1239, 489: 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 525: 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 3578, 1239, 1239, 1239, 1239, 1239, 1239}, - {1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 455: 1240, 1240, 1240, 1240, 460: 1240, 1240, 463: 1240, 1240, 1240, 1240, 1240, 1240, 470: 1240, 1240, 1240, 474: 1240, 1240, 1240, 1240, 1240, 1240, 1240, 482: 1240, 1240, 1240, 486: 1240, 489: 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 525: 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 3578, 1240, 1240, 1240, 1240, 1240, 1240}, - {1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 455: 1241, 1241, 1241, 1241, 460: 1241, 1241, 463: 1241, 1241, 1241, 1241, 1241, 1241, 470: 1241, 1241, 1241, 474: 1241, 1241, 1241, 1241, 1241, 1241, 1241, 482: 1241, 1241, 1241, 486: 1241, 489: 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 525: 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 3578, 1241, 1241, 1241, 1241, 1241, 1241}, - {1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 455: 1242, 1242, 1242, 1242, 460: 1242, 1242, 463: 1242, 1242, 1242, 1242, 1242, 1242, 470: 1242, 1242, 1242, 474: 1242, 1242, 1242, 1242, 1242, 1242, 1242, 482: 1242, 1242, 1242, 486: 1242, 489: 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 525: 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 3578, 1242, 1242, 1242, 1242, 1242, 1242}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 3594}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 3593}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 3592}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 3591}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3589}, // 1135 - {1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 455: 1243, 1243, 1243, 1243, 460: 1243, 1243, 463: 1243, 1243, 1243, 1243, 1243, 1243, 470: 1243, 1243, 1243, 474: 1243, 1243, 1243, 1243, 1243, 1243, 1243, 482: 1243, 1243, 1243, 486: 1243, 489: 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 525: 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 3578, 1243, 1243, 1243, 1243, 1243, 1243}, - {1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 455: 1246, 1246, 1246, 1246, 460: 1246, 1246, 463: 1246, 1246, 1246, 1246, 1246, 3577, 470: 1246, 1246, 1246, 474: 1246, 1246, 1246, 1246, 1246, 1246, 1246, 482: 1246, 1246, 1246, 486: 1246, 489: 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 3573, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 525: 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 3574, 3575, 1246, 3578, 1246, 3576, 1246, 1246, 1246, 1246}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3590}, - {102: 3349, 3345, 105: 3342, 3357, 108: 3344, 3341, 3343, 3347, 3348, 3353, 3352, 3351, 3355, 3356, 3350, 3354, 3346, 486: 3233, 489: 3231, 3232, 3230, 3228, 512: 3339, 3336, 3338, 3337, 3333, 3335, 3334, 3331, 3332, 3330, 3340, 714: 3229, 3227, 788: 3329, 810: 3591}, - {1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 455: 1244, 1244, 1244, 1244, 460: 1244, 1244, 463: 1244, 1244, 1244, 1244, 1244, 1244, 470: 1244, 1244, 1244, 474: 1244, 1244, 1244, 1244, 1244, 1244, 1244, 482: 1244, 1244, 1244, 486: 1244, 489: 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 525: 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244}, + {57: 3590, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 462: 1138, 1138, 1138, 1138, 467: 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 478: 1138, 1138, 481: 1138, 1138, 1138, 1138, 1138, 487: 1138, 489: 1138, 1138, 1138, 1138, 494: 1138, 496: 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 532: 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 570: 1138}, + {1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 462: 1245, 1245, 1245, 1245, 467: 1245, 1245, 470: 1245, 1245, 1245, 1245, 1245, 1245, 1245, 478: 1245, 1245, 481: 1245, 1245, 1245, 1245, 1245, 487: 1245, 489: 1245, 1245, 1245, 1245, 494: 1245, 496: 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 532: 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245}, + {1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 462: 1246, 1246, 1246, 1246, 467: 1246, 1246, 470: 1246, 1246, 1246, 1246, 1246, 1246, 1246, 478: 1246, 1246, 481: 1246, 1246, 1246, 1246, 1246, 487: 1246, 489: 1246, 1246, 1246, 1246, 494: 1246, 496: 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 532: 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 1246, 3587, 1246, 1246, 1246, 1246, 1246, 1246}, + {1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 462: 1247, 1247, 1247, 1247, 467: 1247, 1247, 470: 1247, 1247, 1247, 1247, 1247, 1247, 1247, 478: 1247, 1247, 481: 1247, 1247, 1247, 1247, 1247, 487: 1247, 489: 1247, 1247, 1247, 1247, 494: 1247, 496: 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 532: 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 3587, 1247, 1247, 1247, 1247, 1247, 1247}, // 1140 - {1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 455: 1247, 1247, 1247, 1247, 460: 1247, 1247, 463: 1247, 1247, 1247, 1247, 1247, 3577, 470: 1247, 1247, 1247, 474: 1247, 1247, 1247, 1247, 1247, 1247, 1247, 482: 1247, 1247, 1247, 486: 1247, 489: 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 3573, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 525: 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 1247, 3574, 3575, 1247, 3578, 1247, 3576, 1247, 1247, 1247, 1247}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3594}, - {102: 3349, 3345, 105: 3342, 3357, 108: 3344, 3341, 3343, 3347, 3348, 3353, 3352, 3351, 3355, 3356, 3350, 3354, 3346, 486: 3233, 489: 3231, 3232, 3230, 3228, 512: 3339, 3336, 3338, 3337, 3333, 3335, 3334, 3331, 3332, 3330, 3340, 714: 3229, 3227, 788: 3329, 810: 3595}, - {1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 455: 1245, 1245, 1245, 1245, 460: 1245, 1245, 463: 1245, 1245, 1245, 1245, 1245, 1245, 470: 1245, 1245, 1245, 474: 1245, 1245, 1245, 1245, 1245, 1245, 1245, 482: 1245, 1245, 1245, 486: 1245, 489: 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 525: 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245}, - {1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 455: 1248, 1248, 1248, 1248, 460: 1248, 1248, 463: 1248, 1248, 1248, 3572, 3571, 3577, 470: 1248, 1248, 1248, 474: 1248, 1248, 1248, 1248, 1248, 1248, 1248, 482: 1248, 1248, 1248, 486: 1248, 489: 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 3573, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 525: 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 3574, 3575, 1248, 3578, 1248, 3576, 1248, 1248, 1248, 1248}, + {1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 462: 1248, 1248, 1248, 1248, 467: 1248, 1248, 470: 1248, 1248, 1248, 1248, 1248, 1248, 1248, 478: 1248, 1248, 481: 1248, 1248, 1248, 1248, 1248, 487: 1248, 489: 1248, 1248, 1248, 1248, 494: 1248, 496: 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 532: 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 1248, 3587, 1248, 1248, 1248, 1248, 1248, 1248}, + {1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 462: 1249, 1249, 1249, 1249, 467: 1249, 1249, 470: 1249, 1249, 1249, 1249, 1249, 1249, 1249, 478: 1249, 1249, 481: 1249, 1249, 1249, 1249, 1249, 487: 1249, 489: 1249, 1249, 1249, 1249, 494: 1249, 496: 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 532: 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 3587, 1249, 1249, 1249, 1249, 1249, 1249}, + {1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 462: 1250, 1250, 1250, 1250, 467: 1250, 1250, 470: 1250, 1250, 1250, 1250, 1250, 1250, 1250, 478: 1250, 1250, 481: 1250, 1250, 1250, 1250, 1250, 487: 1250, 489: 1250, 1250, 1250, 1250, 494: 1250, 496: 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 532: 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 3587, 1250, 1250, 1250, 1250, 1250, 1250}, + {1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 462: 1253, 1253, 1253, 1253, 467: 1253, 1253, 470: 1253, 1253, 1253, 1253, 1253, 3586, 1253, 478: 1253, 1253, 481: 1253, 1253, 1253, 1253, 1253, 487: 1253, 489: 1253, 1253, 1253, 1253, 494: 1253, 496: 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 3582, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 532: 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1253, 3583, 3584, 1253, 3587, 1253, 3585, 1253, 1253, 1253, 1253}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 1190, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3599}, // 1145 - {1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 455: 1249, 1249, 1249, 1249, 460: 1249, 1249, 463: 1249, 1249, 1249, 3572, 3571, 3577, 470: 1249, 1249, 1249, 474: 1249, 1249, 1249, 1249, 1249, 1249, 1249, 482: 1249, 1249, 1249, 486: 1249, 489: 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 3573, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 525: 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 3574, 3575, 1249, 3578, 1249, 3576, 1249, 1249, 1249, 1249}, - {1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 455: 1250, 1250, 1250, 1250, 460: 1250, 1250, 463: 1250, 1250, 1250, 3572, 3571, 3577, 470: 1250, 1250, 1250, 474: 1250, 1250, 1250, 1250, 1250, 1250, 1250, 482: 1250, 1250, 1250, 486: 1250, 489: 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 3573, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 525: 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250, 3574, 3575, 1250, 3578, 1250, 3576, 3569, 3570, 1250, 1250}, - {1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 455: 1251, 1251, 1251, 1251, 460: 1251, 1251, 463: 1251, 1251, 1251, 3572, 3571, 3577, 470: 1251, 1251, 1251, 474: 1251, 1251, 1251, 1251, 1251, 1251, 1251, 482: 1251, 1251, 1251, 486: 1251, 489: 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 3573, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 525: 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 3574, 3575, 3568, 3578, 1251, 3576, 3569, 3570, 1251, 1251}, - {102: 3349, 3345, 105: 3342, 3357, 108: 3344, 3341, 3343, 3347, 3348, 3353, 3352, 3351, 3355, 3356, 3350, 3354, 3346, 512: 3339, 3336, 3338, 3337, 3333, 3335, 3334, 3331, 3332, 3330, 3340, 788: 3329, 810: 3601}, - {479: 3602}, + {105: 3358, 3354, 108: 3351, 3366, 111: 3353, 3350, 3352, 3356, 3357, 3362, 3361, 3360, 3364, 3365, 3359, 3363, 3355, 494: 3242, 496: 3240, 3241, 3239, 3237, 519: 3348, 3345, 3347, 3346, 3342, 3344, 3343, 3340, 3341, 3339, 3349, 722: 3238, 3236, 795: 3338, 818: 3600}, + {1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 462: 1251, 1251, 1251, 1251, 467: 1251, 1251, 470: 1251, 1251, 1251, 1251, 1251, 1251, 1251, 478: 1251, 1251, 481: 1251, 1251, 1251, 1251, 1251, 487: 1251, 489: 1251, 1251, 1251, 1251, 494: 1251, 496: 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 532: 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251, 1251}, + {1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 462: 1254, 1254, 1254, 1254, 467: 1254, 1254, 470: 1254, 1254, 1254, 1254, 1254, 3586, 1254, 478: 1254, 1254, 481: 1254, 1254, 1254, 1254, 1254, 487: 1254, 489: 1254, 1254, 1254, 1254, 494: 1254, 496: 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 3582, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 532: 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 3583, 3584, 1254, 3587, 1254, 3585, 1254, 1254, 1254, 1254}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 1190, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3603}, + {105: 3358, 3354, 108: 3351, 3366, 111: 3353, 3350, 3352, 3356, 3357, 3362, 3361, 3360, 3364, 3365, 3359, 3363, 3355, 494: 3242, 496: 3240, 3241, 3239, 3237, 519: 3348, 3345, 3347, 3346, 3342, 3344, 3343, 3340, 3341, 3339, 3349, 722: 3238, 3236, 795: 3338, 818: 3604}, // 1150 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3603}, - {53: 3604, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 455: 1133, 1133, 1133, 1133, 460: 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 470: 1133, 1133, 1133, 474: 1133, 1133, 1133, 1133, 1133, 1133, 1133, 482: 1133, 1133, 1133, 486: 1133, 489: 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 525: 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 565: 1133}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3606}, - {7: 3607, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, + {1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 462: 1252, 1252, 1252, 1252, 467: 1252, 1252, 470: 1252, 1252, 1252, 1252, 1252, 1252, 1252, 478: 1252, 1252, 481: 1252, 1252, 1252, 1252, 1252, 487: 1252, 489: 1252, 1252, 1252, 1252, 494: 1252, 496: 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 532: 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1252}, + {1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 462: 1255, 1255, 1255, 1255, 467: 1255, 1255, 470: 1255, 1255, 1255, 3581, 3580, 3586, 1255, 478: 1255, 1255, 481: 1255, 1255, 1255, 1255, 1255, 487: 1255, 489: 1255, 1255, 1255, 1255, 494: 1255, 496: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 3582, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 532: 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 3583, 3584, 1255, 3587, 1255, 3585, 1255, 1255, 1255, 1255}, + {1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 462: 1256, 1256, 1256, 1256, 467: 1256, 1256, 470: 1256, 1256, 1256, 3581, 3580, 3586, 1256, 478: 1256, 1256, 481: 1256, 1256, 1256, 1256, 1256, 487: 1256, 489: 1256, 1256, 1256, 1256, 494: 1256, 496: 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 3582, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 532: 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 1256, 3583, 3584, 1256, 3587, 1256, 3585, 1256, 1256, 1256, 1256}, + {1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 462: 1257, 1257, 1257, 1257, 467: 1257, 1257, 470: 1257, 1257, 1257, 3581, 3580, 3586, 1257, 478: 1257, 1257, 481: 1257, 1257, 1257, 1257, 1257, 487: 1257, 489: 1257, 1257, 1257, 1257, 494: 1257, 496: 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 3582, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 532: 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 1257, 3583, 3584, 1257, 3587, 1257, 3585, 3578, 3579, 1257, 1257}, + {1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 462: 1258, 1258, 1258, 1258, 467: 1258, 1258, 470: 1258, 1258, 1258, 3581, 3580, 3586, 1258, 478: 1258, 1258, 481: 1258, 1258, 1258, 1258, 1258, 487: 1258, 489: 1258, 1258, 1258, 1258, 494: 1258, 496: 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 3582, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 532: 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 1258, 3583, 3584, 3577, 3587, 1258, 3585, 3578, 3579, 1258, 1258}, // 1155 - {562: 3608}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3609}, - {102: 3349, 3345, 105: 3342, 3357, 108: 3344, 3341, 3343, 3347, 3348, 3353, 3352, 3351, 3355, 3356, 3350, 3354, 3346, 486: 3233, 489: 3231, 3232, 3230, 3228, 512: 3339, 3336, 3338, 3337, 3333, 3335, 3334, 3331, 3332, 3330, 3340, 714: 3229, 3227, 788: 3329, 810: 3610}, - {53: 3611}, - {1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 455: 1134, 1134, 1134, 1134, 460: 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 470: 1134, 1134, 1134, 474: 1134, 1134, 1134, 1134, 1134, 1134, 1134, 482: 1134, 1134, 1134, 486: 1134, 489: 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 525: 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 565: 1134}, + {105: 3358, 3354, 108: 3351, 3366, 111: 3353, 3350, 3352, 3356, 3357, 3362, 3361, 3360, 3364, 3365, 3359, 3363, 3355, 519: 3348, 3345, 3347, 3346, 3342, 3344, 3343, 3340, 3341, 3339, 3349, 795: 3338, 818: 3610}, + {489: 3611}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3612}, + {57: 3613, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 462: 1140, 1140, 1140, 1140, 467: 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 478: 1140, 1140, 481: 1140, 1140, 1140, 1140, 1140, 487: 1140, 489: 1140, 1140, 1140, 1140, 494: 1140, 496: 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 532: 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 570: 1140}, // 1160 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3613}, - {7: 3614, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3616, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3615}, - {53: 3620, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3617}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3615}, + {7: 3616, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {569: 3617}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3618}, + {105: 3358, 3354, 108: 3351, 3366, 111: 3353, 3350, 3352, 3356, 3357, 3362, 3361, 3360, 3364, 3365, 3359, 3363, 3355, 494: 3242, 496: 3240, 3241, 3239, 3237, 519: 3348, 3345, 3347, 3346, 3342, 3344, 3343, 3340, 3341, 3339, 3349, 722: 3238, 3236, 795: 3338, 818: 3619}, // 1165 - {102: 3349, 3345, 105: 3342, 3357, 108: 3344, 3341, 3343, 3347, 3348, 3353, 3352, 3351, 3355, 3356, 3350, 3354, 3346, 486: 3233, 489: 3231, 3232, 3230, 3228, 512: 3339, 3336, 3338, 3337, 3333, 3335, 3334, 3331, 3332, 3330, 3340, 714: 3229, 3227, 788: 3329, 810: 3618}, - {53: 3619}, - {1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 455: 1135, 1135, 1135, 1135, 460: 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 470: 1135, 1135, 1135, 474: 1135, 1135, 1135, 1135, 1135, 1135, 1135, 482: 1135, 1135, 1135, 486: 1135, 489: 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 525: 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 565: 1135}, - {1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 455: 1136, 1136, 1136, 1136, 460: 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 470: 1136, 1136, 1136, 474: 1136, 1136, 1136, 1136, 1136, 1136, 1136, 482: 1136, 1136, 1136, 486: 1136, 489: 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 525: 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 565: 1136}, - {53: 1854, 488: 3623, 1029: 3622, 3624}, + {57: 3620}, + {1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 462: 1141, 1141, 1141, 1141, 467: 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 478: 1141, 1141, 481: 1141, 1141, 1141, 1141, 1141, 487: 1141, 489: 1141, 1141, 1141, 1141, 494: 1141, 496: 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 532: 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 570: 1141}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3622}, + {7: 3623, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3625, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3624}, // 1170 - {53: 1853}, - {53: 1852}, - {53: 3625}, - {1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 455: 1137, 1137, 1137, 1137, 460: 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 470: 1137, 1137, 1137, 474: 1137, 1137, 1137, 1137, 1137, 1137, 1137, 482: 1137, 1137, 1137, 486: 1137, 489: 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 525: 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 565: 1137}, - {53: 1854, 488: 3623, 1029: 3622, 3627}, + {57: 3629, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 1190, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3626}, + {105: 3358, 3354, 108: 3351, 3366, 111: 3353, 3350, 3352, 3356, 3357, 3362, 3361, 3360, 3364, 3365, 3359, 3363, 3355, 494: 3242, 496: 3240, 3241, 3239, 3237, 519: 3348, 3345, 3347, 3346, 3342, 3344, 3343, 3340, 3341, 3339, 3349, 722: 3238, 3236, 795: 3338, 818: 3627}, + {57: 3628}, + {1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 462: 1142, 1142, 1142, 1142, 467: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 478: 1142, 1142, 481: 1142, 1142, 1142, 1142, 1142, 487: 1142, 489: 1142, 1142, 1142, 1142, 494: 1142, 496: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 532: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 570: 1142}, // 1175 - {53: 3628}, - {1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 455: 1138, 1138, 1138, 1138, 460: 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 470: 1138, 1138, 1138, 474: 1138, 1138, 1138, 1138, 1138, 1138, 1138, 482: 1138, 1138, 1138, 486: 1138, 489: 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 525: 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 565: 1138}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 3630}, - {7: 3631, 466: 3572, 3571, 3577, 504: 3573, 537: 3574, 3575, 3568, 3578, 3567, 3576, 3569, 3570}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 3632}, + {1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 462: 1143, 1143, 1143, 1143, 467: 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 478: 1143, 1143, 481: 1143, 1143, 1143, 1143, 1143, 487: 1143, 489: 1143, 1143, 1143, 1143, 494: 1143, 496: 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 532: 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 570: 1143}, + {57: 1868, 495: 3632, 1034: 3631, 3633}, + {57: 1867}, + {57: 1866}, + {57: 3634}, // 1180 - {53: 3633, 466: 3572, 3571, 3577, 504: 3573, 537: 3574, 3575, 3568, 3578, 3567, 3576, 3569, 3570}, - {1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 455: 1140, 1140, 1140, 1140, 460: 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 470: 1140, 1140, 1140, 474: 1140, 1140, 1140, 1140, 1140, 1140, 1140, 482: 1140, 1140, 1140, 486: 1140, 489: 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 525: 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 1140, 565: 1140}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 1856, 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3473, 756: 3635, 805: 3636}, - {7: 3475, 53: 1855}, - {53: 3637}, + {1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 462: 1144, 1144, 1144, 1144, 467: 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 478: 1144, 1144, 481: 1144, 1144, 1144, 1144, 1144, 487: 1144, 489: 1144, 1144, 1144, 1144, 494: 1144, 496: 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 532: 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 570: 1144}, + {57: 1868, 495: 3632, 1034: 3631, 3636}, + {57: 3637}, + {1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 462: 1145, 1145, 1145, 1145, 467: 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 478: 1145, 1145, 481: 1145, 1145, 1145, 1145, 1145, 487: 1145, 489: 1145, 1145, 1145, 1145, 494: 1145, 496: 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 532: 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 570: 1145}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 3639}, // 1185 - {1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 455: 1141, 1141, 1141, 1141, 460: 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 470: 1141, 1141, 1141, 474: 1141, 1141, 1141, 1141, 1141, 1141, 1141, 482: 1141, 1141, 1141, 486: 1141, 489: 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 525: 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 565: 1141}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3473, 756: 3639}, - {7: 3475, 53: 3640, 463: 3641}, - {1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 455: 1146, 1146, 1146, 1146, 460: 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 470: 1146, 1146, 1146, 474: 1146, 1146, 1146, 1146, 1146, 1146, 1146, 482: 1146, 1146, 1146, 486: 1146, 489: 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 525: 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 565: 1146}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 524: 3644, 640: 3376, 2668, 2669, 2667, 720: 3643, 789: 3642}, + {7: 3640, 473: 3581, 3580, 3586, 511: 3582, 544: 3583, 3584, 3577, 3587, 3576, 3585, 3578, 3579}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 3641}, + {57: 3642, 473: 3581, 3580, 3586, 511: 3582, 544: 3583, 3584, 3577, 3587, 3576, 3585, 3578, 3579}, + {1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 462: 1147, 1147, 1147, 1147, 467: 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 478: 1147, 1147, 481: 1147, 1147, 1147, 1147, 1147, 487: 1147, 489: 1147, 1147, 1147, 1147, 494: 1147, 496: 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 532: 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 570: 1147}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 1870, 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3482, 765: 3644, 814: 3645}, // 1190 - {53: 3645}, - {719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 53: 719, 95: 719, 104: 719, 453: 719, 719, 719, 457: 719, 719, 719, 719, 719, 719, 469: 719, 719, 473: 719, 481: 719, 483: 719, 485: 719, 487: 719, 493: 719, 524: 719, 550: 719, 556: 719, 566: 719, 568: 719, 624: 719, 719, 719, 719, 719, 719, 719, 639: 719}, - {718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 53: 718, 95: 718, 104: 718, 453: 718, 718, 718, 457: 718, 718, 718, 718, 718, 718, 469: 718, 718, 473: 718, 481: 718, 483: 718, 485: 718, 487: 718, 493: 718, 524: 718, 550: 718, 556: 718, 566: 718, 568: 718, 624: 718, 718, 718, 718, 718, 718, 718, 639: 718}, - {1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 455: 1145, 1145, 1145, 1145, 460: 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 470: 1145, 1145, 1145, 474: 1145, 1145, 1145, 1145, 1145, 1145, 1145, 482: 1145, 1145, 1145, 486: 1145, 489: 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 525: 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 1145, 565: 1145}, - {1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 455: 1147, 1147, 1147, 1147, 460: 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 470: 1147, 1147, 1147, 474: 1147, 1147, 1147, 1147, 1147, 1147, 1147, 482: 1147, 1147, 1147, 486: 1147, 489: 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 525: 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 565: 1147}, + {7: 3484, 57: 1869}, + {57: 3646}, + {1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 462: 1148, 1148, 1148, 1148, 467: 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 478: 1148, 1148, 481: 1148, 1148, 1148, 1148, 1148, 487: 1148, 489: 1148, 1148, 1148, 1148, 494: 1148, 496: 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 532: 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 570: 1148}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3482, 765: 3648}, + {7: 3484, 57: 3649, 470: 3650}, // 1195 - {53: 3648, 488: 3649}, - {1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 455: 1069, 1069, 1069, 1069, 460: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 470: 1069, 1069, 1069, 474: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 482: 1069, 1069, 1069, 486: 1069, 489: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 525: 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 1069, 565: 1069}, - {53: 3650}, - {1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 455: 1068, 1068, 1068, 1068, 460: 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 470: 1068, 1068, 1068, 474: 1068, 1068, 1068, 1068, 1068, 1068, 1068, 482: 1068, 1068, 1068, 486: 1068, 489: 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 525: 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 565: 1068}, - {53: 3652}, + {1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 462: 1153, 1153, 1153, 1153, 467: 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 478: 1153, 1153, 481: 1153, 1153, 1153, 1153, 1153, 487: 1153, 489: 1153, 1153, 1153, 1153, 494: 1153, 496: 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 532: 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153, 570: 1153}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 531: 3653, 652: 3385, 2670, 2671, 2669, 727: 3652, 796: 3651}, + {57: 3654}, + {725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 98: 725, 107: 725, 460: 725, 725, 725, 464: 725, 725, 725, 725, 725, 725, 476: 725, 725, 480: 725, 486: 725, 725, 725, 493: 725, 500: 725, 531: 725, 555: 725, 565: 725, 573: 725, 575: 725, 631: 725, 725, 725, 725, 725, 725, 725, 647: 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, 98: 724, 107: 724, 460: 724, 724, 724, 464: 724, 724, 724, 724, 724, 724, 476: 724, 724, 480: 724, 486: 724, 724, 724, 493: 724, 500: 724, 531: 724, 555: 724, 565: 724, 573: 724, 575: 724, 631: 724, 724, 724, 724, 724, 724, 724, 647: 724}, // 1200 - {1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 455: 1148, 1148, 1148, 1148, 460: 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 470: 1148, 1148, 1148, 474: 1148, 1148, 1148, 1148, 1148, 1148, 1148, 482: 1148, 1148, 1148, 486: 1148, 489: 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 525: 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 1148, 565: 1148}, - {53: 3655}, - {1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 455: 1149, 1149, 1149, 1149, 460: 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 470: 1149, 1149, 1149, 474: 1149, 1149, 1149, 1149, 1149, 1149, 1149, 482: 1149, 1149, 1149, 486: 1149, 489: 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 525: 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 565: 1149}, - {1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 455: 1162, 1162, 1162, 1162, 460: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 470: 1162, 1162, 1162, 474: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 482: 1162, 1162, 1162, 486: 1162, 489: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 525: 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 565: 1162, 632: 1162, 647: 1162, 649: 1162}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 1856, 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3473, 756: 3635, 805: 3657}, + {1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 462: 1152, 1152, 1152, 1152, 467: 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 478: 1152, 1152, 481: 1152, 1152, 1152, 1152, 1152, 487: 1152, 489: 1152, 1152, 1152, 1152, 494: 1152, 496: 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 532: 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 570: 1152}, + {1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 462: 1154, 1154, 1154, 1154, 467: 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 478: 1154, 1154, 481: 1154, 1154, 1154, 1154, 1154, 487: 1154, 489: 1154, 1154, 1154, 1154, 494: 1154, 496: 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 532: 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 570: 1154}, + {57: 3657, 495: 3658}, + {1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 462: 1076, 1076, 1076, 1076, 467: 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 478: 1076, 1076, 481: 1076, 1076, 1076, 1076, 1076, 487: 1076, 489: 1076, 1076, 1076, 1076, 494: 1076, 496: 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 532: 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 570: 1076}, + {57: 3659}, // 1205 - {53: 3658}, - {1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 455: 1150, 1150, 1150, 1150, 460: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 470: 1150, 1150, 1150, 474: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 482: 1150, 1150, 1150, 486: 1150, 489: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 525: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 565: 1150}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 1856, 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3473, 756: 3635, 805: 3660}, - {53: 3661}, - {1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 455: 1151, 1151, 1151, 1151, 460: 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 470: 1151, 1151, 1151, 474: 1151, 1151, 1151, 1151, 1151, 1151, 1151, 482: 1151, 1151, 1151, 486: 1151, 489: 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 525: 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 565: 1151}, + {1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 462: 1075, 1075, 1075, 1075, 467: 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 478: 1075, 1075, 481: 1075, 1075, 1075, 1075, 1075, 487: 1075, 489: 1075, 1075, 1075, 1075, 494: 1075, 496: 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 532: 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 570: 1075}, + {57: 3661}, + {1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 462: 1155, 1155, 1155, 1155, 467: 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 478: 1155, 1155, 481: 1155, 1155, 1155, 1155, 1155, 487: 1155, 489: 1155, 1155, 1155, 1155, 494: 1155, 496: 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 532: 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 570: 1155}, + {57: 3664}, + {1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 462: 1156, 1156, 1156, 1156, 467: 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 478: 1156, 1156, 481: 1156, 1156, 1156, 1156, 1156, 487: 1156, 489: 1156, 1156, 1156, 1156, 494: 1156, 496: 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 532: 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 1156, 570: 1156}, // 1210 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3663, 2668, 2669, 2667, 692: 3664}, - {53: 1236, 478: 1236, 633: 3666}, - {53: 3665}, - {1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 455: 1205, 1205, 1205, 1205, 460: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 470: 1205, 1205, 1205, 474: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 482: 1205, 1205, 1205, 486: 1205, 489: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 525: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 565: 1205}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3667, 2668, 2669, 2667}, + {1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 462: 1169, 1169, 1169, 1169, 467: 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 478: 1169, 1169, 481: 1169, 1169, 1169, 1169, 1169, 487: 1169, 489: 1169, 1169, 1169, 1169, 494: 1169, 496: 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 532: 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 1169, 570: 1169, 639: 1169, 650: 1169, 657: 1169}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 1870, 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3482, 765: 3644, 814: 3666}, + {57: 3667}, + {1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 462: 1157, 1157, 1157, 1157, 467: 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 478: 1157, 1157, 481: 1157, 1157, 1157, 1157, 1157, 487: 1157, 489: 1157, 1157, 1157, 1157, 494: 1157, 496: 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 532: 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 570: 1157}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 1870, 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3482, 765: 3644, 814: 3669}, // 1215 - {53: 1235, 478: 1235, 633: 3668}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3669, 2668, 2669, 2667}, - {1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 455: 1234, 1234, 1234, 1234, 460: 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 470: 1234, 1234, 1234, 474: 1234, 1234, 1234, 1234, 1234, 1234, 1234, 482: 1234, 1234, 1234, 486: 1234, 489: 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 525: 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 1234, 565: 1234, 636: 1234, 1234}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3663, 2668, 2669, 2667, 692: 3671}, - {53: 3672}, + {57: 3670}, + {1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 462: 1158, 1158, 1158, 1158, 467: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 478: 1158, 1158, 481: 1158, 1158, 1158, 1158, 1158, 487: 1158, 489: 1158, 1158, 1158, 1158, 494: 1158, 496: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 532: 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 570: 1158}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3672, 2670, 2671, 2669, 700: 3673}, + {57: 1243, 484: 1243, 641: 3675}, + {57: 3674}, // 1220 - {1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 455: 1206, 1206, 1206, 1206, 460: 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 470: 1206, 1206, 1206, 474: 1206, 1206, 1206, 1206, 1206, 1206, 1206, 482: 1206, 1206, 1206, 486: 1206, 489: 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 525: 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 565: 1206}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3674}, - {7: 3675, 463: 3676, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {55: 3687, 102: 3683, 166: 3684, 3682, 170: 3689, 182: 3686, 485: 3694, 524: 3680, 629: 3693, 662: 3685, 3690, 3691, 667: 3692, 721: 3688, 877: 3681, 977: 3679}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 524: 3644, 640: 3376, 2668, 2669, 2667, 720: 3643, 789: 3677}, + {1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 462: 1212, 1212, 1212, 1212, 467: 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 478: 1212, 1212, 481: 1212, 1212, 1212, 1212, 1212, 487: 1212, 489: 1212, 1212, 1212, 1212, 494: 1212, 496: 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 532: 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 570: 1212}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3676, 2670, 2671, 2669}, + {57: 1242, 484: 1242, 641: 3677}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3678, 2670, 2671, 2669}, + {1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 462: 1241, 1241, 1241, 1241, 467: 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 478: 1241, 1241, 481: 1241, 1241, 1241, 1241, 1241, 487: 1241, 489: 1241, 1241, 1241, 1241, 494: 1241, 496: 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 532: 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 1241, 570: 1241, 644: 1241, 1241}, // 1225 - {53: 3678}, - {1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 455: 1207, 1207, 1207, 1207, 460: 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 470: 1207, 1207, 1207, 474: 1207, 1207, 1207, 1207, 1207, 1207, 1207, 482: 1207, 1207, 1207, 486: 1207, 489: 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 525: 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 1207, 565: 1207}, - {53: 3730}, - {53: 278, 454: 3709, 742: 3710, 765: 3729}, - {14: 278, 53: 278, 454: 3709, 485: 278, 524: 278, 629: 278, 742: 3710, 765: 3714}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3672, 2670, 2671, 2669, 700: 3680}, + {57: 3681}, + {1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 462: 1213, 1213, 1213, 1213, 467: 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 478: 1213, 1213, 481: 1213, 1213, 1213, 1213, 1213, 487: 1213, 489: 1213, 1213, 1213, 1213, 494: 1213, 496: 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 532: 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 570: 1213}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3683}, + {7: 3684, 470: 3685, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, // 1230 - {53: 1029}, - {53: 1028}, - {53: 278, 454: 3709, 742: 3710, 765: 3713}, - {53: 271, 454: 3696, 742: 3697, 881: 3712, 890: 3698}, - {53: 278, 454: 3709, 742: 3710, 765: 3708}, + {60: 3696, 105: 3692, 170: 3693, 3691, 174: 3698, 187: 3695, 488: 3703, 531: 3689, 636: 3702, 669: 3694, 3699, 3700, 674: 3701, 728: 3697, 888: 3690, 982: 3688}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 531: 3653, 652: 3385, 2670, 2671, 2669, 727: 3652, 796: 3686}, + {57: 3687}, + {1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 462: 1214, 1214, 1214, 1214, 467: 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 478: 1214, 1214, 481: 1214, 1214, 1214, 1214, 1214, 487: 1214, 489: 1214, 1214, 1214, 1214, 494: 1214, 496: 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 532: 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 570: 1214}, + {57: 3739}, // 1235 - {53: 342, 665: 3705, 3706, 1068: 3707}, - {53: 342, 665: 3705, 3706, 1068: 3704}, - {53: 1022}, - {53: 1021}, - {53: 271, 454: 3696, 742: 3697, 881: 3695, 890: 3698}, + {57: 278, 461: 3718, 749: 3719, 775: 3738}, + {13: 278, 57: 278, 461: 3718, 488: 278, 531: 278, 636: 278, 749: 3719, 775: 3723}, + {57: 1036}, + {57: 1035}, + {57: 278, 461: 3718, 749: 3719, 775: 3722}, // 1240 - {53: 1019}, - {14: 316, 53: 316, 454: 316, 485: 316, 524: 316, 629: 316}, - {14: 315, 53: 315, 454: 315, 485: 315, 524: 315, 629: 315}, - {53: 1020}, - {488: 2642, 716: 2641, 725: 3699}, + {57: 271, 461: 3705, 749: 3706, 891: 3721, 896: 3707}, + {57: 278, 461: 3718, 749: 3719, 775: 3717}, + {57: 342, 672: 3714, 3715, 1072: 3716}, + {57: 342, 672: 3714, 3715, 1072: 3713}, + {57: 1029}, // 1245 - {270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 53: 270, 55: 270, 453: 270, 457: 270, 270, 270, 270, 462: 270, 469: 270, 473: 270, 556: 270, 566: 270, 568: 270, 624: 270, 270, 270, 270, 721: 270, 723: 270}, - {269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 53: 269, 55: 269, 453: 269, 457: 269, 269, 269, 269, 462: 269, 469: 269, 473: 269, 556: 269, 566: 269, 568: 269, 624: 269, 269, 269, 269, 721: 269, 723: 269}, - {7: 3701, 53: 3700}, - {279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 14: 279, 53: 279, 55: 279, 98: 279, 279, 101: 279, 453: 279, 457: 279, 279, 279, 279, 462: 279, 469: 279, 473: 279, 485: 279, 510: 279, 279, 524: 279, 556: 279, 566: 279, 568: 279, 624: 279, 279, 279, 279, 629: 279, 721: 279, 723: 279}, - {488: 2642, 716: 2641, 725: 3702}, + {57: 1028}, + {57: 271, 461: 3705, 749: 3706, 891: 3704, 896: 3707}, + {57: 1026}, + {13: 316, 57: 316, 461: 316, 488: 316, 531: 316, 636: 316}, + {13: 315, 57: 315, 461: 315, 488: 315, 531: 315, 636: 315}, // 1250 - {53: 3703}, - {268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 53: 268, 55: 268, 453: 268, 457: 268, 268, 268, 268, 462: 268, 469: 268, 473: 268, 556: 268, 566: 268, 568: 268, 624: 268, 268, 268, 268, 721: 268, 723: 268}, - {53: 1023}, - {53: 341}, - {53: 340}, + {57: 1027}, + {495: 2644, 724: 2643, 733: 3708}, + {270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 57: 270, 60: 270, 460: 270, 464: 270, 270, 270, 270, 469: 270, 477: 270, 480: 270, 565: 270, 573: 270, 575: 270, 631: 270, 270, 634: 270, 270, 728: 270, 730: 270}, + {269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 57: 269, 60: 269, 460: 269, 464: 269, 269, 269, 269, 469: 269, 477: 269, 480: 269, 565: 269, 573: 269, 575: 269, 631: 269, 269, 634: 269, 269, 728: 269, 730: 269}, + {7: 3710, 57: 3709}, // 1255 - {53: 1024}, - {53: 1025}, - {488: 2642, 716: 2641, 725: 3711}, - {277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 14: 277, 53: 277, 55: 277, 98: 277, 277, 101: 277, 453: 277, 457: 277, 277, 277, 277, 462: 277, 469: 277, 473: 277, 485: 277, 510: 277, 277, 524: 277, 556: 277, 566: 277, 568: 277, 624: 277, 277, 277, 277, 629: 277, 721: 277, 723: 277}, - {53: 3700}, + {279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 57: 279, 60: 279, 101: 279, 279, 104: 279, 460: 279, 464: 279, 279, 279, 279, 469: 279, 477: 279, 480: 279, 488: 279, 517: 279, 279, 531: 279, 565: 279, 573: 279, 575: 279, 631: 279, 279, 634: 279, 279, 279, 728: 279, 730: 279}, + {495: 2644, 724: 2643, 733: 3711}, + {57: 3712}, + {268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 57: 268, 60: 268, 460: 268, 464: 268, 268, 268, 268, 469: 268, 477: 268, 480: 268, 565: 268, 573: 268, 575: 268, 631: 268, 268, 634: 268, 268, 728: 268, 730: 268}, + {57: 1030}, // 1260 - {53: 1026}, - {53: 1027}, - {14: 3719, 53: 265, 485: 3720, 524: 3716, 629: 3718, 754: 3717, 780: 3715}, - {53: 1030}, - {262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 14: 3719, 53: 262, 453: 262, 457: 262, 262, 262, 262, 462: 262, 469: 262, 473: 262, 485: 3720, 556: 262, 566: 262, 568: 262, 624: 262, 262, 262, 262, 629: 3718, 754: 3727, 1234: 3726}, + {57: 341}, + {57: 340}, + {57: 1031}, + {57: 1032}, + {495: 2644, 724: 2643, 733: 3720}, // 1265 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 524: 3644, 640: 3376, 2668, 2669, 2667, 720: 3643, 789: 3723}, - {493: 3722}, - {259, 259, 259, 259, 259, 259, 259, 8: 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 54: 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 456: 259, 459: 259, 478: 259, 482: 259, 502: 259, 524: 259}, - {493: 3721}, - {258, 258, 258, 258, 258, 258, 258, 8: 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 54: 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 456: 258, 459: 258, 478: 258, 482: 258, 502: 258, 524: 258}, + {277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 57: 277, 60: 277, 101: 277, 277, 104: 277, 460: 277, 464: 277, 277, 277, 277, 469: 277, 477: 277, 480: 277, 488: 277, 517: 277, 277, 531: 277, 565: 277, 573: 277, 575: 277, 631: 277, 277, 634: 277, 277, 277, 728: 277, 730: 277}, + {57: 3709}, + {57: 1033}, + {57: 1034}, + {13: 3728, 57: 265, 488: 3729, 531: 3725, 636: 3727, 761: 3726, 789: 3724}, // 1270 - {260, 260, 260, 260, 260, 260, 260, 8: 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 54: 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 456: 260, 459: 260, 478: 260, 482: 260, 502: 260, 524: 260}, - {267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 53: 267, 453: 267, 457: 267, 267, 267, 267, 462: 267, 469: 267, 473: 267, 524: 3724, 556: 267, 566: 267, 568: 267, 624: 267, 267, 267, 267, 1233: 3725}, - {266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 53: 266, 453: 266, 457: 266, 266, 266, 266, 462: 266, 469: 266, 473: 266, 556: 266, 566: 266, 568: 266, 624: 266, 266, 266, 266}, - {263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 53: 263, 453: 263, 457: 263, 263, 263, 263, 462: 263, 469: 263, 473: 263, 556: 263, 566: 263, 568: 263, 624: 263, 263, 263, 263}, - {264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 53: 264, 453: 264, 457: 264, 264, 264, 264, 462: 264, 469: 264, 473: 264, 556: 264, 566: 264, 568: 264, 624: 264, 264, 264, 264}, + {57: 1037}, + {262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 3728, 57: 262, 460: 262, 464: 262, 262, 262, 262, 469: 262, 477: 262, 480: 262, 488: 3729, 565: 262, 573: 262, 575: 262, 631: 262, 262, 634: 262, 262, 3727, 761: 3736, 1236: 3735}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 531: 3653, 652: 3385, 2670, 2671, 2669, 727: 3652, 796: 3732}, + {500: 3731}, + {259, 259, 259, 259, 259, 259, 259, 8: 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 58: 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 463: 259, 466: 259, 484: 259, 491: 259, 509: 259, 531: 259}, // 1275 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 524: 3644, 640: 3376, 2668, 2669, 2667, 720: 3643, 789: 3728}, - {261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 53: 261, 453: 261, 457: 261, 261, 261, 261, 462: 261, 469: 261, 473: 261, 556: 261, 566: 261, 568: 261, 624: 261, 261, 261, 261}, - {53: 1031}, - {1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 455: 1208, 1208, 1208, 1208, 460: 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 470: 1208, 1208, 1208, 474: 1208, 1208, 1208, 1208, 1208, 1208, 1208, 482: 1208, 1208, 1208, 486: 1208, 489: 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 525: 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 565: 1208}, - {486: 3233, 489: 3231, 3232, 3230, 3228, 523: 1037, 714: 3229, 3227}, + {500: 3730}, + {258, 258, 258, 258, 258, 258, 258, 8: 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 58: 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 463: 258, 466: 258, 484: 258, 491: 258, 509: 258, 531: 258}, + {260, 260, 260, 260, 260, 260, 260, 8: 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 58: 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 463: 260, 466: 260, 484: 260, 491: 260, 509: 260, 531: 260}, + {267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 57: 267, 460: 267, 464: 267, 267, 267, 267, 469: 267, 477: 267, 480: 267, 531: 3733, 565: 267, 573: 267, 575: 267, 631: 267, 267, 634: 267, 267, 1235: 3734}, + {266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 57: 266, 460: 266, 464: 266, 266, 266, 266, 469: 266, 477: 266, 480: 266, 565: 266, 573: 266, 575: 266, 631: 266, 266, 634: 266, 266}, // 1280 - {523: 3735, 1135: 3734, 1314: 3733}, - {150: 1033, 523: 3735, 526: 3741, 1135: 3740, 1179: 3739}, - {150: 1036, 523: 1036, 526: 1036}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3736}, - {486: 3233, 489: 3231, 3232, 3230, 3228, 527: 3737, 714: 3229, 3227}, + {263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 57: 263, 460: 263, 464: 263, 263, 263, 263, 469: 263, 477: 263, 480: 263, 565: 263, 573: 263, 575: 263, 631: 263, 263, 634: 263, 263}, + {264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 264, 57: 264, 460: 264, 464: 264, 264, 264, 264, 469: 264, 477: 264, 480: 264, 565: 264, 573: 264, 575: 264, 631: 264, 264, 634: 264, 264}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 531: 3653, 652: 3385, 2670, 2671, 2669, 727: 3652, 796: 3737}, + {261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 57: 261, 460: 261, 464: 261, 261, 261, 261, 469: 261, 477: 261, 480: 261, 565: 261, 573: 261, 575: 261, 631: 261, 261, 634: 261, 261}, + {57: 1038}, // 1285 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3738}, - {150: 1034, 486: 3233, 489: 3231, 3232, 3230, 3228, 523: 1034, 526: 1034, 714: 3229, 3227}, - {150: 3743}, - {150: 1035, 523: 1035, 526: 1035}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3742}, + {1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 462: 1215, 1215, 1215, 1215, 467: 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 478: 1215, 1215, 481: 1215, 1215, 1215, 1215, 1215, 487: 1215, 489: 1215, 1215, 1215, 1215, 494: 1215, 496: 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 532: 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 570: 1215}, + {494: 3242, 496: 3240, 3241, 3239, 3237, 530: 1044, 722: 3238, 3236}, + {530: 3744, 1138: 3743, 1316: 3742}, + {155: 1040, 530: 3744, 533: 3750, 1138: 3749, 1182: 3748}, + {155: 1043, 530: 1043, 533: 1043}, // 1290 - {150: 1032, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 455: 1209, 1209, 1209, 1209, 460: 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 470: 1209, 1209, 1209, 474: 1209, 1209, 1209, 1209, 1209, 1209, 1209, 482: 1209, 1209, 1209, 486: 1209, 489: 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 525: 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 565: 1209}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3745}, - {460: 3746, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {55: 3687, 102: 3683, 166: 3684, 3682, 170: 3689, 182: 3686, 485: 3694, 524: 3680, 629: 3693, 662: 3685, 3690, 3691, 667: 3692, 721: 3688, 877: 3681, 977: 3747}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3745}, + {494: 3242, 496: 3240, 3241, 3239, 3237, 534: 3746, 722: 3238, 3236}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3747}, + {155: 1041, 494: 3242, 496: 3240, 3241, 3239, 3237, 530: 1041, 533: 1041, 722: 3238, 3236}, + {155: 3752}, // 1295 - {53: 3748}, - {1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 455: 1210, 1210, 1210, 1210, 460: 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 470: 1210, 1210, 1210, 474: 1210, 1210, 1210, 1210, 1210, 1210, 1210, 482: 1210, 1210, 1210, 486: 1210, 489: 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 525: 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 565: 1210}, - {1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 455: 1211, 1211, 1211, 1211, 460: 1211, 1211, 3237, 1211, 1211, 1211, 1211, 1211, 1211, 470: 1211, 1211, 1211, 474: 1211, 1211, 1211, 1211, 1211, 1211, 1211, 482: 1211, 1211, 1211, 486: 1211, 489: 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 525: 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 565: 1211}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3751}, - {486: 3233, 489: 3231, 3232, 3230, 3228, 503: 3752, 714: 3229, 3227}, + {155: 1042, 530: 1042, 533: 1042}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3751}, + {155: 1039, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 462: 1216, 1216, 1216, 1216, 467: 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 478: 1216, 1216, 481: 1216, 1216, 1216, 1216, 1216, 487: 1216, 489: 1216, 1216, 1216, 1216, 494: 1216, 496: 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 532: 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 570: 1216}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3754}, // 1300 - {1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 455: 1212, 1212, 1212, 1212, 460: 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 470: 1212, 1212, 1212, 474: 1212, 1212, 1212, 1212, 1212, 1212, 1212, 482: 1212, 1212, 1212, 486: 1212, 489: 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 525: 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 565: 1212}, - {1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 455: 1213, 1213, 1213, 1213, 460: 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 470: 1213, 1213, 1213, 474: 1213, 1213, 1213, 1213, 1213, 1213, 1213, 482: 1213, 1213, 1213, 486: 1213, 489: 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 525: 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 565: 1213}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3473, 756: 3755}, - {7: 3756}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3757}, + {467: 3755, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {60: 3696, 105: 3692, 170: 3693, 3691, 174: 3698, 187: 3695, 488: 3703, 531: 3689, 636: 3702, 669: 3694, 3699, 3700, 674: 3701, 728: 3697, 888: 3690, 982: 3756}, + {57: 3757}, + {1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 462: 1217, 1217, 1217, 1217, 467: 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 478: 1217, 1217, 481: 1217, 1217, 1217, 1217, 1217, 487: 1217, 489: 1217, 1217, 1217, 1217, 494: 1217, 496: 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 532: 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 570: 1217}, + {1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 462: 1218, 1218, 1218, 1218, 467: 1218, 1218, 3246, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 478: 1218, 1218, 481: 1218, 1218, 1218, 1218, 1218, 487: 1218, 489: 1218, 1218, 1218, 1218, 494: 1218, 496: 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 532: 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 570: 1218}, // 1305 - {7: 1859, 53: 3758, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 455: 1214, 1214, 1214, 1214, 460: 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 470: 1214, 1214, 1214, 474: 1214, 1214, 1214, 1214, 1214, 1214, 1214, 482: 1214, 1214, 1214, 486: 1214, 489: 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 525: 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 565: 1214}, - {7: 1860, 53: 3860, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {7: 3857}, - {7: 1217, 53: 1217, 457: 1217, 1217, 461: 775, 1217, 466: 1217, 1217, 1217, 471: 775, 775, 475: 2634, 478: 1217, 480: 2635, 484: 2631, 486: 1217, 489: 1217, 1217, 1217, 1217, 502: 1217, 504: 1217, 525: 1217, 528: 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 565: 1217, 748: 3774, 3775}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3760}, + {494: 3242, 496: 3240, 3241, 3239, 3237, 510: 3761, 722: 3238, 3236}, + {1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 462: 1219, 1219, 1219, 1219, 467: 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 478: 1219, 1219, 481: 1219, 1219, 1219, 1219, 1219, 487: 1219, 489: 1219, 1219, 1219, 1219, 494: 1219, 496: 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 532: 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 570: 1219}, + {1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 462: 1220, 1220, 1220, 1220, 467: 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 478: 1220, 1220, 481: 1220, 1220, 1220, 1220, 1220, 487: 1220, 489: 1220, 1220, 1220, 1220, 494: 1220, 496: 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 532: 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 570: 1220}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3482, 765: 3764}, // 1310 - {454: 3662, 554: 3779, 894: 3778, 956: 3777}, - {454: 2501, 481: 2499, 550: 2498, 628: 2494, 690: 3771, 733: 3770, 2495, 2496, 2497, 2506, 739: 2504, 3772, 3773}, - {53: 3769, 461: 776, 471: 776, 776}, - {53: 3768}, - {53: 3767}, + {7: 3765}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3766}, + {7: 1873, 57: 3767, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 462: 1221, 1221, 1221, 1221, 467: 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 478: 1221, 1221, 481: 1221, 1221, 1221, 1221, 1221, 487: 1221, 489: 1221, 1221, 1221, 1221, 494: 1221, 496: 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 532: 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 570: 1221}, + {7: 1874, 57: 3870, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, // 1315 - {802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 460: 802, 802, 802, 802, 802, 802, 802, 802, 802, 470: 802, 802, 802, 474: 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 486: 802, 489: 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 525: 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 802, 550: 802, 565: 802, 628: 802, 635: 802, 726: 802}, - {803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 460: 803, 803, 803, 803, 803, 803, 803, 803, 803, 470: 803, 803, 803, 474: 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 486: 803, 489: 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 525: 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 550: 803, 565: 803, 628: 803, 635: 803, 726: 803}, - {804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 460: 804, 804, 804, 804, 804, 804, 804, 804, 804, 470: 804, 804, 804, 474: 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 486: 804, 489: 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 525: 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, 550: 804, 565: 804, 628: 804, 635: 804, 726: 804}, - {959, 959, 53: 959, 453: 959, 455: 959, 461: 776, 463: 959, 471: 776, 776}, - {958, 958, 53: 958, 453: 958, 455: 958, 461: 775, 463: 958, 471: 775, 775, 475: 2634, 480: 2635, 484: 2631, 748: 3774, 3775}, + {7: 3867}, + {7: 1224, 57: 1224, 464: 1224, 1224, 468: 781, 1224, 473: 1224, 1224, 1224, 478: 781, 781, 482: 2636, 484: 1224, 490: 2637, 492: 2633, 494: 1224, 496: 1224, 1224, 1224, 1224, 509: 1224, 511: 1224, 532: 1224, 535: 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 570: 1224, 755: 3783, 3784}, + {461: 3671, 563: 3788, 899: 3787, 960: 3786}, + {461: 2503, 486: 2501, 555: 2500, 633: 2496, 698: 3780, 740: 3779, 2497, 2498, 2499, 2508, 2506, 3781, 3782}, + {57: 3778, 468: 782, 478: 782, 782}, // 1320 - {788, 788, 53: 788, 453: 788, 455: 788, 463: 788}, - {787, 787, 53: 787, 453: 787, 455: 787, 463: 787}, - {781, 781, 53: 781, 453: 781, 455: 781, 463: 781, 475: 2634, 480: 2635, 749: 3776}, - {780, 780, 53: 780, 453: 780, 455: 780, 463: 780}, - {779, 779, 53: 779, 453: 779, 455: 779, 463: 779}, + {57: 3777}, + {57: 3776}, + {809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 467: 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 478: 809, 809, 481: 809, 809, 809, 809, 809, 809, 809, 489: 809, 809, 809, 809, 494: 809, 496: 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 532: 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 555: 809, 570: 809, 633: 809, 643: 809, 731: 809}, + {810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 467: 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 478: 810, 810, 481: 810, 810, 810, 810, 810, 810, 810, 489: 810, 810, 810, 810, 494: 810, 496: 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 532: 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 555: 810, 570: 810, 633: 810, 643: 810, 731: 810}, + {811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 467: 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 478: 811, 811, 481: 811, 811, 811, 811, 811, 811, 811, 489: 811, 811, 811, 811, 494: 811, 496: 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 532: 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 555: 811, 570: 811, 633: 811, 643: 811, 731: 811}, // 1325 - {1253, 1253, 7: 3791, 53: 1253, 453: 1253, 455: 1253, 461: 1253, 463: 1253, 471: 1253, 1253, 474: 1253, 1253, 1253, 1253, 480: 1253, 484: 2631, 748: 2632, 792: 3790}, - {8, 8, 7: 8, 53: 8, 453: 8, 455: 8, 461: 8, 463: 8, 471: 8, 8, 474: 8, 8, 8, 8, 480: 8, 484: 8}, - {454: 3780, 820: 3781}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 1293, 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3786, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3782, 786: 3785, 1304: 3784, 3783}, - {6, 6, 7: 6, 53: 6, 453: 6, 455: 6, 461: 6, 463: 6, 471: 6, 6, 474: 6, 6, 6, 6, 480: 6, 484: 6}, + {966, 966, 57: 966, 460: 966, 462: 966, 468: 782, 470: 966, 478: 782, 782}, + {965, 965, 57: 965, 460: 965, 462: 965, 468: 781, 470: 965, 478: 781, 781, 482: 2636, 490: 2637, 492: 2633, 755: 3783, 3784}, + {794, 794, 57: 794, 460: 794, 462: 794, 470: 794}, + {793, 793, 57: 793, 460: 793, 462: 793, 470: 793}, + {787, 787, 57: 787, 460: 787, 462: 787, 470: 787, 482: 2636, 490: 2637, 756: 3785}, // 1330 - {1289, 1289, 7: 1289, 53: 1289, 453: 1289, 463: 1289, 475: 1289, 482: 1289, 484: 1289, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {53: 3789}, - {7: 3787, 53: 1292}, - {7: 1290, 53: 1290}, - {1288, 1288, 7: 1288, 53: 1288, 453: 1288, 3670, 463: 1288, 475: 1288, 482: 1288, 484: 1288}, + {786, 786, 57: 786, 460: 786, 462: 786, 470: 786}, + {785, 785, 57: 785, 460: 785, 462: 785, 470: 785}, + {1260, 1260, 7: 3800, 57: 1260, 460: 1260, 462: 1260, 468: 1260, 470: 1260, 478: 1260, 1260, 481: 1260, 1260, 1260, 485: 1260, 490: 1260, 492: 2633, 755: 2634, 800: 3799}, + {8, 8, 7: 8, 57: 8, 460: 8, 462: 8, 468: 8, 470: 8, 478: 8, 8, 481: 8, 8, 8, 485: 8, 490: 8, 492: 8}, + {461: 3789, 828: 3790}, // 1335 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3786, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3782, 786: 3788}, - {7: 1291, 53: 1291}, - {1294, 1294, 7: 1294, 16: 1294, 53: 1294, 453: 1294, 455: 1294, 461: 1294, 463: 1294, 471: 1294, 1294, 474: 1294, 1294, 1294, 1294, 480: 1294, 484: 1294, 486: 1294}, - {829, 829, 53: 829, 453: 829, 455: 829, 461: 829, 463: 829, 471: 829, 829, 474: 829, 2634, 829, 829, 480: 2635, 749: 2636, 809: 3793}, - {554: 3779, 894: 3792}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 1300, 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3795, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3791, 787: 3794, 1306: 3793, 3792}, + {6, 6, 7: 6, 57: 6, 460: 6, 462: 6, 468: 6, 470: 6, 478: 6, 6, 481: 6, 6, 6, 485: 6, 490: 6, 492: 6}, + {1296, 1296, 7: 1296, 57: 1296, 460: 1296, 470: 1296, 482: 1296, 491: 1296, 1296, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {57: 3798}, + {7: 3796, 57: 1299}, // 1340 - {7, 7, 7: 7, 53: 7, 453: 7, 455: 7, 461: 7, 463: 7, 471: 7, 7, 474: 7, 7, 7, 7, 480: 7, 484: 7}, - {801, 801, 53: 801, 453: 801, 455: 801, 461: 801, 463: 801, 471: 801, 801, 474: 3795, 476: 801, 3796, 862: 3794}, - {806, 806, 53: 806, 453: 806, 455: 806, 461: 806, 463: 806, 471: 806, 806, 476: 3821, 863: 3820}, - {266: 3801, 635: 3800}, - {525: 3797}, + {7: 1297, 57: 1297}, + {1295, 1295, 7: 1295, 57: 1295, 460: 1295, 3679, 470: 1295, 482: 1295, 491: 1295, 1295}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3795, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3791, 787: 3797}, + {7: 1298, 57: 1298}, + {1301, 1301, 7: 1301, 15: 1301, 57: 1301, 460: 1301, 462: 1301, 468: 1301, 470: 1301, 478: 1301, 1301, 481: 1301, 1301, 1301, 485: 1301, 490: 1301, 492: 1301, 494: 1301}, // 1345 - {266: 3798}, - {196: 3799}, - {793, 793, 53: 793, 453: 793, 455: 793, 461: 793, 463: 793, 471: 793, 793, 476: 793}, - {792, 792, 53: 792, 135: 792, 146: 792, 163: 792, 453: 792, 455: 792, 461: 792, 463: 792, 471: 792, 792, 476: 792, 1060: 3803, 3814}, - {792, 792, 53: 792, 135: 792, 146: 792, 453: 792, 455: 792, 461: 792, 463: 792, 471: 792, 792, 476: 792, 1060: 3803, 3802}, + {836, 836, 57: 836, 460: 836, 462: 836, 468: 836, 470: 836, 478: 836, 836, 481: 836, 2636, 836, 485: 836, 490: 2637, 756: 2638, 817: 3802}, + {563: 3788, 899: 3801}, + {7, 7, 7: 7, 57: 7, 460: 7, 462: 7, 468: 7, 470: 7, 478: 7, 7, 481: 7, 7, 7, 485: 7, 490: 7, 492: 7}, + {807, 807, 57: 807, 460: 807, 462: 807, 468: 807, 470: 807, 478: 807, 807, 481: 3804, 483: 807, 485: 3805, 874: 3803}, + {813, 813, 57: 813, 460: 813, 462: 813, 468: 813, 470: 813, 478: 813, 813, 483: 3830, 875: 3829}, // 1350 - {799, 799, 53: 799, 135: 3812, 146: 3811, 453: 799, 455: 799, 461: 799, 463: 799, 471: 799, 799, 476: 799}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 3805, 778: 3806}, - {1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 525: 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 550: 1013, 556: 1013, 565: 1013, 1013, 1013, 1013, 624: 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 3809, 1013, 1013, 638: 1013, 1013, 644: 1013, 646: 1013, 650: 1013, 1013, 1013, 1013, 1013, 1013, 660: 1013, 1013, 668: 1013, 1013, 685: 1013}, - {1011, 1011, 7: 1011, 53: 1011, 135: 1011, 146: 1011, 163: 1011, 453: 1011, 455: 1011, 461: 1011, 463: 1011, 471: 1011, 1011, 476: 1011, 479: 1011, 632: 1011, 651: 1011, 653: 1011}, - {791, 791, 7: 3807, 53: 791, 135: 791, 146: 791, 163: 791, 453: 791, 455: 791, 461: 791, 463: 791, 471: 791, 791, 476: 791}, + {271: 3810, 643: 3809}, + {532: 3806}, + {271: 3807}, + {201: 3808}, + {799, 799, 57: 799, 460: 799, 462: 799, 468: 799, 470: 799, 478: 799, 799, 483: 799}, // 1355 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 3808}, - {1010, 1010, 7: 1010, 53: 1010, 135: 1010, 146: 1010, 152: 1010, 163: 1010, 453: 1010, 455: 1010, 461: 1010, 463: 1010, 471: 1010, 1010, 476: 1010, 479: 1010, 632: 1010, 651: 1010, 653: 1010}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3810, 2668, 2669, 2667}, - {1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 525: 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 550: 1012, 556: 1012, 565: 1012, 1012, 1012, 1012, 624: 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 634: 1012, 1012, 638: 1012, 1012, 644: 1012, 646: 1012, 650: 1012, 1012, 1012, 1012, 1012, 1012, 660: 1012, 1012, 668: 1012, 1012, 685: 1012}, - {796, 796, 53: 796, 453: 796, 455: 796, 461: 796, 463: 796, 471: 796, 796, 476: 796}, + {798, 798, 57: 798, 137: 798, 149: 798, 168: 798, 460: 798, 462: 798, 468: 798, 470: 798, 478: 798, 798, 483: 798, 1065: 3812, 3823}, + {798, 798, 57: 798, 137: 798, 149: 798, 460: 798, 462: 798, 468: 798, 470: 798, 478: 798, 798, 483: 798, 1065: 3812, 3811}, + {805, 805, 57: 805, 137: 3821, 149: 3820, 460: 805, 462: 805, 468: 805, 470: 805, 478: 805, 805, 483: 805}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 3814, 785: 3815}, + {1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 532: 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 555: 1020, 565: 1020, 570: 1020, 573: 1020, 1020, 1020, 631: 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 3818, 1020, 1020, 646: 1020, 1020, 1020, 651: 1020, 658: 1020, 1020, 1020, 1020, 1020, 1020, 668: 1020, 675: 1020, 1020, 678: 1020, 693: 1020}, // 1360 - {247: 3813}, - {794, 794, 53: 794, 453: 794, 455: 794, 461: 794, 463: 794, 471: 794, 794, 476: 794}, - {800, 800, 53: 800, 135: 3817, 146: 3815, 163: 3816, 453: 800, 455: 800, 461: 800, 463: 800, 471: 800, 800, 476: 800}, - {798, 798, 53: 798, 453: 798, 455: 798, 461: 798, 463: 798, 471: 798, 798, 476: 798}, - {488: 2642, 716: 3819}, + {1018, 1018, 7: 1018, 57: 1018, 137: 1018, 149: 1018, 168: 1018, 460: 1018, 462: 1018, 468: 1018, 470: 1018, 478: 1018, 1018, 483: 1018, 489: 1018, 639: 1018, 659: 1018, 661: 1018}, + {797, 797, 7: 3816, 57: 797, 137: 797, 149: 797, 168: 797, 460: 797, 462: 797, 468: 797, 470: 797, 478: 797, 797, 483: 797}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 3817}, + {1017, 1017, 7: 1017, 57: 1017, 137: 1017, 149: 1017, 158: 1017, 168: 1017, 460: 1017, 462: 1017, 468: 1017, 470: 1017, 478: 1017, 1017, 483: 1017, 489: 1017, 639: 1017, 1017, 659: 1017, 661: 1017}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3819, 2670, 2671, 2669}, // 1365 - {247: 3818}, - {795, 795, 53: 795, 453: 795, 455: 795, 461: 795, 463: 795, 471: 795, 795, 476: 795}, - {797, 797, 53: 797, 453: 797, 455: 797, 461: 797, 463: 797, 471: 797, 797, 476: 797}, - {960, 960, 53: 960, 453: 960, 455: 960, 461: 960, 463: 960, 471: 960, 960}, - {1245: 3822}, + {1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 532: 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 555: 1019, 565: 1019, 570: 1019, 573: 1019, 1019, 1019, 631: 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 642: 1019, 1019, 646: 1019, 1019, 1019, 651: 1019, 658: 1019, 1019, 1019, 1019, 1019, 1019, 668: 1019, 675: 1019, 1019, 678: 1019, 693: 1019}, + {802, 802, 57: 802, 460: 802, 462: 802, 468: 802, 470: 802, 478: 802, 802, 483: 802}, + {253: 3822}, + {800, 800, 57: 800, 460: 800, 462: 800, 468: 800, 470: 800, 478: 800, 800, 483: 800}, + {806, 806, 57: 806, 137: 3826, 149: 3824, 168: 3825, 460: 806, 462: 806, 468: 806, 470: 806, 478: 806, 806, 483: 806}, // 1370 - {456: 3823}, - {94, 94, 53: 94, 95: 3827, 104: 3826, 453: 94, 455: 94, 461: 94, 463: 94, 471: 94, 94, 639: 94, 814: 3825, 1026: 3824}, - {81, 81, 53: 81, 453: 81, 455: 81, 461: 81, 463: 81, 471: 81, 81, 639: 3848, 926: 3847}, - {760: 3830, 768: 3832, 776: 3833, 3831, 1025: 3829, 1186: 3828}, - {92, 92, 27: 92, 54: 92, 56: 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 453: 92, 92, 479: 92, 525: 92, 634: 92, 760: 92, 768: 92, 776: 92, 92}, + {804, 804, 57: 804, 460: 804, 462: 804, 468: 804, 470: 804, 478: 804, 804, 483: 804}, + {495: 2644, 724: 3828}, + {253: 3827}, + {801, 801, 57: 801, 460: 801, 462: 801, 468: 801, 470: 801, 478: 801, 801, 483: 801}, + {803, 803, 57: 803, 460: 803, 462: 803, 468: 803, 470: 803, 478: 803, 803, 483: 803}, // 1375 - {91, 91, 27: 91, 54: 91, 56: 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 453: 91, 91, 479: 91, 525: 91, 634: 91, 760: 91, 768: 91, 776: 91, 91}, - {93, 93, 53: 93, 453: 93, 93, 93, 461: 93, 463: 93, 470: 93, 93, 93, 493: 93, 639: 93, 760: 3830, 768: 3832, 776: 3833, 3831, 1025: 3846}, - {89, 89, 53: 89, 453: 89, 89, 89, 461: 89, 463: 89, 470: 89, 89, 89, 493: 89, 639: 89, 760: 89, 768: 89, 776: 89, 89}, - {644: 3844}, - {768: 3841}, + {967, 967, 57: 967, 460: 967, 462: 967, 468: 967, 470: 967, 478: 967, 967}, + {1247: 3831}, + {463: 3832}, + {94, 94, 57: 94, 98: 3836, 107: 3835, 460: 94, 462: 94, 468: 94, 470: 94, 478: 94, 94, 647: 94, 822: 3834, 1031: 3833}, + {81, 81, 57: 81, 460: 81, 462: 81, 468: 81, 470: 81, 478: 81, 81, 647: 3857, 931: 3856}, // 1380 - {644: 3839}, - {644: 3834}, - {456: 3836, 555: 3837, 559: 3838, 830: 3835}, - {85, 85, 53: 85, 453: 85, 85, 85, 461: 85, 463: 85, 470: 85, 85, 85, 493: 85, 639: 85, 760: 85, 768: 85, 776: 85, 85}, - {84, 84, 53: 84, 453: 84, 84, 84, 461: 84, 463: 84, 470: 84, 84, 84, 493: 84, 639: 84, 760: 84, 768: 84, 776: 84, 84}, + {771: 3839, 777: 3841, 783: 3842, 3840, 1030: 3838, 1189: 3837}, + {92, 92, 27: 92, 59: 92, 61: 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 460: 92, 92, 489: 92, 532: 92, 642: 92, 771: 92, 777: 92, 783: 92, 92}, + {91, 91, 27: 91, 59: 91, 61: 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 460: 91, 91, 489: 91, 532: 91, 642: 91, 771: 91, 777: 91, 783: 91, 91}, + {93, 93, 57: 93, 460: 93, 93, 93, 468: 93, 470: 93, 476: 93, 478: 93, 93, 500: 93, 647: 93, 771: 3839, 777: 3841, 783: 3842, 3840, 1030: 3855}, + {89, 89, 57: 89, 460: 89, 89, 89, 468: 89, 470: 89, 476: 89, 478: 89, 89, 500: 89, 647: 89, 771: 89, 777: 89, 783: 89, 89}, // 1385 - {83, 83, 53: 83, 453: 83, 83, 83, 461: 83, 463: 83, 470: 83, 83, 83, 493: 83, 639: 83, 760: 83, 768: 83, 776: 83, 83}, - {82, 82, 53: 82, 453: 82, 82, 82, 461: 82, 463: 82, 470: 82, 82, 82, 493: 82, 639: 82, 760: 82, 768: 82, 776: 82, 82}, - {456: 3836, 555: 3837, 559: 3838, 830: 3840}, - {86, 86, 53: 86, 453: 86, 86, 86, 461: 86, 463: 86, 470: 86, 86, 86, 493: 86, 639: 86, 760: 86, 768: 86, 776: 86, 86}, - {644: 3842}, + {648: 3853}, + {777: 3850}, + {648: 3848}, + {648: 3843}, + {463: 3845, 564: 3846, 568: 3847, 841: 3844}, // 1390 - {456: 3836, 555: 3837, 559: 3838, 830: 3843}, - {87, 87, 53: 87, 453: 87, 87, 87, 461: 87, 463: 87, 470: 87, 87, 87, 493: 87, 639: 87, 760: 87, 768: 87, 776: 87, 87}, - {456: 3836, 555: 3837, 559: 3838, 830: 3845}, - {88, 88, 53: 88, 453: 88, 88, 88, 461: 88, 463: 88, 470: 88, 88, 88, 493: 88, 639: 88, 760: 88, 768: 88, 776: 88, 88}, - {90, 90, 53: 90, 453: 90, 90, 90, 461: 90, 463: 90, 470: 90, 90, 90, 493: 90, 639: 90, 760: 90, 768: 90, 776: 90, 90}, + {85, 85, 57: 85, 460: 85, 85, 85, 468: 85, 470: 85, 476: 85, 478: 85, 85, 500: 85, 647: 85, 771: 85, 777: 85, 783: 85, 85}, + {84, 84, 57: 84, 460: 84, 84, 84, 468: 84, 470: 84, 476: 84, 478: 84, 84, 500: 84, 647: 84, 771: 84, 777: 84, 783: 84, 84}, + {83, 83, 57: 83, 460: 83, 83, 83, 468: 83, 470: 83, 476: 83, 478: 83, 83, 500: 83, 647: 83, 771: 83, 777: 83, 783: 83, 83}, + {82, 82, 57: 82, 460: 82, 82, 82, 468: 82, 470: 82, 476: 82, 478: 82, 82, 500: 82, 647: 82, 771: 82, 777: 82, 783: 82, 82}, + {463: 3845, 564: 3846, 568: 3847, 841: 3849}, // 1395 - {805, 805, 53: 805, 453: 805, 455: 805, 461: 805, 463: 805, 471: 805, 805}, - {79, 79, 53: 79, 453: 79, 79, 79, 461: 79, 463: 79, 470: 79, 79, 79, 493: 79, 760: 79, 1278: 3849, 3850}, - {77, 77, 53: 77, 453: 77, 77, 77, 461: 77, 463: 77, 470: 77, 77, 77, 493: 77, 760: 3854, 1218: 3853}, - {644: 3851}, - {456: 3836, 555: 3837, 559: 3838, 830: 3852}, + {86, 86, 57: 86, 460: 86, 86, 86, 468: 86, 470: 86, 476: 86, 478: 86, 86, 500: 86, 647: 86, 771: 86, 777: 86, 783: 86, 86}, + {648: 3851}, + {463: 3845, 564: 3846, 568: 3847, 841: 3852}, + {87, 87, 57: 87, 460: 87, 87, 87, 468: 87, 470: 87, 476: 87, 478: 87, 87, 500: 87, 647: 87, 771: 87, 777: 87, 783: 87, 87}, + {463: 3845, 564: 3846, 568: 3847, 841: 3854}, // 1400 - {78, 78, 53: 78, 453: 78, 78, 78, 461: 78, 463: 78, 470: 78, 78, 78, 493: 78, 760: 78}, - {80, 80, 53: 80, 453: 80, 80, 80, 461: 80, 463: 80, 470: 80, 80, 80, 493: 80}, - {644: 3855}, - {456: 3836, 555: 3837, 559: 3838, 830: 3856}, - {76, 76, 53: 76, 453: 76, 76, 76, 461: 76, 463: 76, 470: 76, 76, 76, 493: 76}, + {88, 88, 57: 88, 460: 88, 88, 88, 468: 88, 470: 88, 476: 88, 478: 88, 88, 500: 88, 647: 88, 771: 88, 777: 88, 783: 88, 88}, + {90, 90, 57: 90, 460: 90, 90, 90, 468: 90, 470: 90, 476: 90, 478: 90, 90, 500: 90, 647: 90, 771: 90, 777: 90, 783: 90, 90}, + {812, 812, 57: 812, 460: 812, 462: 812, 468: 812, 470: 812, 478: 812, 812}, + {79, 79, 57: 79, 460: 79, 79, 79, 468: 79, 470: 79, 476: 79, 478: 79, 79, 500: 79, 771: 79, 1280: 3858, 3859}, + {77, 77, 57: 77, 460: 77, 77, 77, 468: 77, 470: 77, 476: 77, 478: 77, 77, 500: 77, 771: 3863, 1220: 3862}, // 1405 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3858}, - {7: 1859, 53: 3859, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 455: 1215, 1215, 1215, 1215, 460: 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 470: 1215, 1215, 1215, 474: 1215, 1215, 1215, 1215, 1215, 1215, 1215, 482: 1215, 1215, 1215, 486: 1215, 489: 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 525: 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 565: 1215}, - {1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 455: 1216, 1216, 1216, 1216, 460: 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 470: 1216, 1216, 1216, 474: 1216, 1216, 1216, 1216, 1216, 1216, 1216, 482: 1216, 1216, 1216, 486: 1216, 489: 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 525: 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 565: 1216}, - {1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 455: 1218, 1218, 1218, 1218, 460: 1218, 1218, 3237, 1218, 1218, 1218, 1218, 1218, 1218, 470: 1218, 1218, 1218, 474: 1218, 1218, 1218, 1218, 1218, 1218, 1218, 482: 1218, 1218, 1218, 486: 1218, 489: 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 525: 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 565: 1218}, + {648: 3860}, + {463: 3845, 564: 3846, 568: 3847, 841: 3861}, + {78, 78, 57: 78, 460: 78, 78, 78, 468: 78, 470: 78, 476: 78, 478: 78, 78, 500: 78, 771: 78}, + {80, 80, 57: 80, 460: 80, 80, 80, 468: 80, 470: 80, 476: 80, 478: 80, 80, 500: 80}, + {648: 3864}, // 1410 - {1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 455: 1220, 1220, 1220, 1220, 460: 1220, 1220, 3237, 1220, 1220, 1220, 1220, 1220, 1220, 470: 1220, 1220, 1220, 474: 1220, 1220, 1220, 1220, 1220, 1220, 1220, 482: 1220, 1220, 1220, 486: 1220, 489: 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 525: 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 565: 1220}, - {1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 455: 1221, 1221, 1221, 1221, 460: 1221, 1221, 3237, 1221, 1221, 1221, 1221, 1221, 1221, 470: 1221, 1221, 1221, 474: 1221, 1221, 1221, 1221, 1221, 1221, 1221, 482: 1221, 1221, 1221, 486: 1221, 489: 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 525: 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 565: 1221}, - {1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 455: 1222, 1222, 1222, 1222, 460: 1222, 1222, 3237, 1222, 1222, 1222, 1222, 1222, 1222, 470: 1222, 1222, 1222, 474: 1222, 1222, 1222, 1222, 1222, 1222, 1222, 482: 1222, 1222, 1222, 486: 1222, 489: 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 525: 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 565: 1222}, - {1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 455: 1223, 1223, 1223, 1223, 460: 1223, 1223, 3237, 1223, 1223, 1223, 1223, 1223, 1223, 470: 1223, 1223, 1223, 474: 1223, 1223, 1223, 1223, 1223, 1223, 1223, 482: 1223, 1223, 1223, 486: 1223, 489: 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 525: 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 565: 1223}, - {456: 3869}, + {463: 3845, 564: 3846, 568: 3847, 841: 3865}, + {76, 76, 57: 76, 460: 76, 76, 76, 468: 76, 470: 76, 476: 76, 478: 76, 76, 500: 76}, + {808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 467: 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 478: 808, 808, 481: 808, 808, 808, 808, 808, 808, 808, 489: 808, 808, 808, 808, 494: 808, 496: 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 532: 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 555: 808, 570: 808, 633: 808, 643: 808, 731: 808}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3868}, + {7: 1873, 57: 3869, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, // 1415 - {456: 3868}, - {1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 455: 1203, 1203, 1203, 1203, 460: 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 470: 1203, 1203, 1203, 474: 1203, 1203, 1203, 1203, 1203, 1203, 1203, 482: 1203, 1203, 1203, 486: 1203, 489: 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 525: 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 565: 1203}, - {1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 455: 1204, 1204, 1204, 1204, 460: 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 470: 1204, 1204, 1204, 474: 1204, 1204, 1204, 1204, 1204, 1204, 1204, 482: 1204, 1204, 1204, 486: 1204, 489: 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 525: 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 565: 1204}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3871, 2668, 2669, 2667}, - {1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 3872, 1235, 1235, 1235, 1235, 460: 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 470: 1235, 1235, 1235, 474: 1235, 1235, 1235, 1235, 1235, 1235, 1235, 482: 1235, 1235, 1235, 486: 1235, 489: 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 525: 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 565: 1235, 633: 3668, 636: 1235, 1235}, + {1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 462: 1222, 1222, 1222, 1222, 467: 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 478: 1222, 1222, 481: 1222, 1222, 1222, 1222, 1222, 487: 1222, 489: 1222, 1222, 1222, 1222, 494: 1222, 496: 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 532: 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 1222, 570: 1222}, + {1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 462: 1223, 1223, 1223, 1223, 467: 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 478: 1223, 1223, 481: 1223, 1223, 1223, 1223, 1223, 487: 1223, 489: 1223, 1223, 1223, 1223, 494: 1223, 496: 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 532: 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 1223, 570: 1223}, + {1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 462: 1225, 1225, 1225, 1225, 467: 1225, 1225, 3246, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 478: 1225, 1225, 481: 1225, 1225, 1225, 1225, 1225, 487: 1225, 489: 1225, 1225, 1225, 1225, 494: 1225, 496: 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 532: 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 570: 1225}, + {1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 462: 1227, 1227, 1227, 1227, 467: 1227, 1227, 3246, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 478: 1227, 1227, 481: 1227, 1227, 1227, 1227, 1227, 487: 1227, 489: 1227, 1227, 1227, 1227, 494: 1227, 496: 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 532: 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 570: 1227}, + {1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 462: 1228, 1228, 1228, 1228, 467: 1228, 1228, 3246, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 478: 1228, 1228, 481: 1228, 1228, 1228, 1228, 1228, 487: 1228, 489: 1228, 1228, 1228, 1228, 494: 1228, 496: 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 532: 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 570: 1228}, // 1420 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 1856, 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3473, 756: 3635, 805: 3873}, - {53: 3874}, - {1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 455: 1071, 1071, 1071, 1071, 460: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 470: 1071, 1071, 1071, 474: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 482: 1071, 1071, 1071, 486: 1071, 489: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 525: 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 1071, 565: 1071}, - {1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 455: 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 482: 1273, 1273, 1273, 486: 1273, 489: 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 525: 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 1273, 556: 1273, 565: 1273, 1273, 568: 1273, 624: 1273, 1273, 1273, 1273}, - {1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 455: 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 482: 1270, 1270, 1270, 486: 1270, 489: 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 525: 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 1270, 556: 1270, 565: 1270, 1270, 568: 1270, 624: 1270, 1270, 1270, 1270}, + {1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 462: 1229, 1229, 1229, 1229, 467: 1229, 1229, 3246, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 478: 1229, 1229, 481: 1229, 1229, 1229, 1229, 1229, 487: 1229, 489: 1229, 1229, 1229, 1229, 494: 1229, 496: 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 532: 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 570: 1229}, + {1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 462: 1230, 1230, 1230, 1230, 467: 1230, 1230, 3246, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 478: 1230, 1230, 481: 1230, 1230, 1230, 1230, 1230, 487: 1230, 489: 1230, 1230, 1230, 1230, 494: 1230, 496: 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 532: 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 570: 1230}, + {463: 3879}, + {463: 3878}, + {1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 462: 1210, 1210, 1210, 1210, 467: 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 478: 1210, 1210, 481: 1210, 1210, 1210, 1210, 1210, 487: 1210, 489: 1210, 1210, 1210, 1210, 494: 1210, 496: 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 532: 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 570: 1210}, // 1425 - {1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 455: 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 482: 1269, 1269, 1269, 486: 1269, 489: 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 525: 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 1269, 556: 1269, 565: 1269, 1269, 568: 1269, 624: 1269, 1269, 1269, 1269}, - {1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 455: 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 482: 1267, 1267, 1267, 486: 1267, 489: 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 525: 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 556: 1267, 565: 1267, 1267, 568: 1267, 624: 1267, 1267, 1267, 1267}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3880, 718: 3881}, - {53: 3885, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3882}, + {1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 462: 1211, 1211, 1211, 1211, 467: 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 478: 1211, 1211, 481: 1211, 1211, 1211, 1211, 1211, 487: 1211, 489: 1211, 1211, 1211, 1211, 494: 1211, 496: 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 532: 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 570: 1211}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3881, 2670, 2671, 2669}, + {1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 3882, 1242, 1242, 1242, 1242, 467: 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 478: 1242, 1242, 481: 1242, 1242, 1242, 1242, 1242, 487: 1242, 489: 1242, 1242, 1242, 1242, 494: 1242, 496: 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 532: 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 570: 1242, 641: 3677, 644: 1242, 1242}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 1870, 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3482, 765: 3644, 814: 3883}, + {57: 3884}, // 1430 - {53: 3883, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 455: 919, 919, 919, 919, 460: 919, 919, 919, 919, 919, 919, 919, 919, 919, 470: 919, 919, 919, 474: 919, 919, 919, 919, 919, 919, 919, 482: 919, 919, 919, 486: 919, 489: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 525: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 565: 919, 722: 3249, 729: 3439, 744: 3884}, - {1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 455: 1079, 1079, 1079, 1079, 460: 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 470: 1079, 1079, 1079, 474: 1079, 1079, 1079, 1079, 1079, 1079, 1079, 482: 1079, 1079, 1079, 486: 1079, 489: 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 525: 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 565: 1079}, - {919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 455: 919, 919, 919, 919, 460: 919, 919, 919, 919, 919, 919, 919, 919, 919, 470: 919, 919, 919, 474: 919, 919, 919, 919, 919, 919, 919, 482: 919, 919, 919, 486: 919, 489: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 525: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 565: 919, 722: 3249, 729: 3439, 744: 3886}, - {1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 455: 1080, 1080, 1080, 1080, 460: 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 470: 1080, 1080, 1080, 474: 1080, 1080, 1080, 1080, 1080, 1080, 1080, 482: 1080, 1080, 1080, 486: 1080, 489: 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 525: 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 565: 1080}, + {1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 462: 1078, 1078, 1078, 1078, 467: 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 478: 1078, 1078, 481: 1078, 1078, 1078, 1078, 1078, 487: 1078, 489: 1078, 1078, 1078, 1078, 494: 1078, 496: 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 532: 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 570: 1078}, + {1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 462: 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 487: 1280, 489: 1280, 1280, 1280, 1280, 494: 1280, 496: 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 532: 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 1280, 565: 1280, 570: 1280, 573: 1280, 575: 1280, 631: 1280, 1280, 634: 1280, 1280}, + {1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 462: 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 487: 1277, 489: 1277, 1277, 1277, 1277, 494: 1277, 496: 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 532: 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 565: 1277, 570: 1277, 573: 1277, 575: 1277, 631: 1277, 1277, 634: 1277, 1277}, + {1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 462: 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 487: 1276, 489: 1276, 1276, 1276, 1276, 494: 1276, 496: 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 532: 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 1276, 565: 1276, 570: 1276, 573: 1276, 575: 1276, 631: 1276, 1276, 634: 1276, 1276}, + {1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 462: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 487: 1274, 489: 1274, 1274, 1274, 1274, 494: 1274, 496: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 532: 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 1274, 565: 1274, 570: 1274, 573: 1274, 575: 1274, 631: 1274, 1274, 634: 1274, 1274}, // 1435 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3888, 718: 3889}, - {7: 3899, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3890}, - {7: 3891, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3892, 718: 3893}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 640: 3891, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3890}, + {57: 3895, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3892}, + {57: 3893, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 462: 926, 926, 926, 926, 467: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 478: 926, 926, 481: 926, 926, 926, 926, 926, 487: 926, 489: 926, 926, 926, 926, 494: 926, 496: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 532: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 570: 926, 729: 3258, 736: 3448, 754: 3894}, // 1440 - {53: 3897, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3894}, - {53: 3895, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 455: 919, 919, 919, 919, 460: 919, 919, 919, 919, 919, 919, 919, 919, 919, 470: 919, 919, 919, 474: 919, 919, 919, 919, 919, 919, 919, 482: 919, 919, 919, 486: 919, 489: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 525: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 565: 919, 722: 3249, 729: 3439, 744: 3896}, - {1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 455: 1075, 1075, 1075, 1075, 460: 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 470: 1075, 1075, 1075, 474: 1075, 1075, 1075, 1075, 1075, 1075, 1075, 482: 1075, 1075, 1075, 486: 1075, 489: 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 525: 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 1075, 565: 1075}, + {1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 462: 1086, 1086, 1086, 1086, 467: 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 478: 1086, 1086, 481: 1086, 1086, 1086, 1086, 1086, 487: 1086, 489: 1086, 1086, 1086, 1086, 494: 1086, 496: 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 532: 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 1086, 570: 1086}, + {926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 462: 926, 926, 926, 926, 467: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 478: 926, 926, 481: 926, 926, 926, 926, 926, 487: 926, 489: 926, 926, 926, 926, 494: 926, 496: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 532: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 570: 926, 729: 3258, 736: 3448, 754: 3896}, + {1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 462: 1087, 1087, 1087, 1087, 467: 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 478: 1087, 1087, 481: 1087, 1087, 1087, 1087, 1087, 487: 1087, 489: 1087, 1087, 1087, 1087, 494: 1087, 496: 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 532: 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 570: 1087}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 640: 3899, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3898}, + {7: 3909, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, // 1445 - {919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 455: 919, 919, 919, 919, 460: 919, 919, 919, 919, 919, 919, 919, 919, 919, 470: 919, 919, 919, 474: 919, 919, 919, 919, 919, 919, 919, 482: 919, 919, 919, 486: 919, 489: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 525: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 565: 919, 722: 3249, 729: 3439, 744: 3898}, - {1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 455: 1077, 1077, 1077, 1077, 460: 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 470: 1077, 1077, 1077, 474: 1077, 1077, 1077, 1077, 1077, 1077, 1077, 482: 1077, 1077, 1077, 486: 1077, 489: 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 525: 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 1077, 565: 1077}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3900, 718: 3901}, - {53: 3905, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3902}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3900}, + {7: 3901, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 640: 3903, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3902}, + {57: 3907, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3904}, // 1450 - {53: 3903, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 455: 919, 919, 919, 919, 460: 919, 919, 919, 919, 919, 919, 919, 919, 919, 470: 919, 919, 919, 474: 919, 919, 919, 919, 919, 919, 919, 482: 919, 919, 919, 486: 919, 489: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 525: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 565: 919, 722: 3249, 729: 3439, 744: 3904}, - {1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 455: 1076, 1076, 1076, 1076, 460: 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 470: 1076, 1076, 1076, 474: 1076, 1076, 1076, 1076, 1076, 1076, 1076, 482: 1076, 1076, 1076, 486: 1076, 489: 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 525: 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 1076, 565: 1076}, - {919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 455: 919, 919, 919, 919, 460: 919, 919, 919, 919, 919, 919, 919, 919, 919, 470: 919, 919, 919, 474: 919, 919, 919, 919, 919, 919, 919, 482: 919, 919, 919, 486: 919, 489: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 525: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 565: 919, 722: 3249, 729: 3439, 744: 3906}, - {1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 455: 1078, 1078, 1078, 1078, 460: 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 470: 1078, 1078, 1078, 474: 1078, 1078, 1078, 1078, 1078, 1078, 1078, 482: 1078, 1078, 1078, 486: 1078, 489: 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 525: 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 565: 1078}, + {57: 3905, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 462: 926, 926, 926, 926, 467: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 478: 926, 926, 481: 926, 926, 926, 926, 926, 487: 926, 489: 926, 926, 926, 926, 494: 926, 496: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 532: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 570: 926, 729: 3258, 736: 3448, 754: 3906}, + {1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 462: 1082, 1082, 1082, 1082, 467: 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 478: 1082, 1082, 481: 1082, 1082, 1082, 1082, 1082, 487: 1082, 489: 1082, 1082, 1082, 1082, 494: 1082, 496: 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 532: 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 570: 1082}, + {926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 462: 926, 926, 926, 926, 467: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 478: 926, 926, 481: 926, 926, 926, 926, 926, 487: 926, 489: 926, 926, 926, 926, 494: 926, 496: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 532: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 570: 926, 729: 3258, 736: 3448, 754: 3908}, + {1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 462: 1084, 1084, 1084, 1084, 467: 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 478: 1084, 1084, 481: 1084, 1084, 1084, 1084, 1084, 487: 1084, 489: 1084, 1084, 1084, 1084, 494: 1084, 496: 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 532: 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 570: 1084}, // 1455 - {102: 3349, 3345, 105: 3342, 3357, 108: 3344, 3341, 3343, 3347, 3348, 3353, 3352, 3351, 3355, 3356, 3350, 3354, 3346, 788: 3908}, - {7: 3909}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3910}, - {7: 3911, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3912}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 640: 3911, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3910}, + {57: 3915, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3912}, + {57: 3913, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 462: 926, 926, 926, 926, 467: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 478: 926, 926, 481: 926, 926, 926, 926, 926, 487: 926, 489: 926, 926, 926, 926, 494: 926, 496: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 532: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 570: 926, 729: 3258, 736: 3448, 754: 3914}, // 1460 - {53: 3913, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 455: 1125, 1125, 1125, 1125, 460: 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 470: 1125, 1125, 1125, 474: 1125, 1125, 1125, 1125, 1125, 1125, 1125, 482: 1125, 1125, 1125, 486: 1125, 489: 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 525: 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 565: 1125}, - {102: 3349, 3345, 105: 3342, 3357, 108: 3344, 3341, 3343, 3347, 3348, 3353, 3352, 3351, 3355, 3356, 3350, 3354, 3346, 788: 3915}, - {7: 3916}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3917}, + {1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 462: 1083, 1083, 1083, 1083, 467: 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 478: 1083, 1083, 481: 1083, 1083, 1083, 1083, 1083, 487: 1083, 489: 1083, 1083, 1083, 1083, 494: 1083, 496: 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 532: 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 570: 1083}, + {926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 462: 926, 926, 926, 926, 467: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 478: 926, 926, 481: 926, 926, 926, 926, 926, 487: 926, 489: 926, 926, 926, 926, 494: 926, 496: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 532: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 570: 926, 729: 3258, 736: 3448, 754: 3916}, + {1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 462: 1085, 1085, 1085, 1085, 467: 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 478: 1085, 1085, 481: 1085, 1085, 1085, 1085, 1085, 487: 1085, 489: 1085, 1085, 1085, 1085, 494: 1085, 496: 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 532: 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 570: 1085}, + {105: 3358, 3354, 108: 3351, 3366, 111: 3353, 3350, 3352, 3356, 3357, 3362, 3361, 3360, 3364, 3365, 3359, 3363, 3355, 795: 3918}, + {7: 3919}, // 1465 - {7: 3918, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3919}, - {53: 3920, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 455: 1126, 1126, 1126, 1126, 460: 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 470: 1126, 1126, 1126, 474: 1126, 1126, 1126, 1126, 1126, 1126, 1126, 482: 1126, 1126, 1126, 486: 1126, 489: 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 525: 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 565: 1126}, - {166: 3924, 3923, 182: 3925, 207: 3926, 1196: 3922}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3920}, + {7: 3921, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3922}, + {57: 3923, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 462: 1132, 1132, 1132, 1132, 467: 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 478: 1132, 1132, 481: 1132, 1132, 1132, 1132, 1132, 487: 1132, 489: 1132, 1132, 1132, 1132, 494: 1132, 496: 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 532: 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 570: 1132}, // 1470 - {7: 3927}, - {7: 1115}, - {7: 1114}, - {7: 1113}, - {7: 1112}, + {105: 3358, 3354, 108: 3351, 3366, 111: 3353, 3350, 3352, 3356, 3357, 3362, 3361, 3360, 3364, 3365, 3359, 3363, 3355, 795: 3925}, + {7: 3926}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3927}, + {7: 3928, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3929}, // 1475 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3928}, - {53: 3929, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 455: 1132, 1132, 1132, 1132, 460: 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 470: 1132, 1132, 1132, 474: 1132, 1132, 1132, 1132, 1132, 1132, 1132, 482: 1132, 1132, 1132, 486: 1132, 489: 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 525: 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 565: 1132}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 3931}, - {7: 3932}, + {57: 3930, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 462: 1133, 1133, 1133, 1133, 467: 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 478: 1133, 1133, 481: 1133, 1133, 1133, 1133, 1133, 487: 1133, 489: 1133, 1133, 1133, 1133, 494: 1133, 496: 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 532: 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 570: 1133}, + {170: 3934, 3933, 187: 3935, 213: 3936, 1199: 3932}, + {7: 3937}, + {7: 1122}, // 1480 - {466: 3937, 3936, 488: 2642, 716: 3933, 743: 3935, 794: 3934}, - {1911, 1911, 4: 1911, 1911, 1911, 1911, 13: 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 76: 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 1911, 103: 1911, 123: 1911, 1911, 1911, 1911, 459: 1911, 461: 1911, 1911, 475: 1911, 480: 1911, 482: 1911, 1911, 485: 1911, 629: 1911, 1911, 638: 1911}, - {53: 3940}, - {29, 29, 4: 29, 29, 29, 13: 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 53: 29, 76: 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 459: 29, 461: 29, 29, 483: 29, 485: 29, 629: 29, 29, 638: 29}, - {488: 2642, 716: 3933, 743: 3939}, + {7: 1121}, + {7: 1120}, + {7: 1119}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3938}, + {57: 3939, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, // 1485 - {488: 2642, 716: 3938}, - {27, 27, 4: 27, 27, 27, 13: 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 53: 27, 76: 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 459: 27, 461: 27, 27, 483: 27, 485: 27, 629: 27, 27, 638: 27}, - {28, 28, 4: 28, 28, 28, 13: 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 53: 28, 76: 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 459: 28, 461: 28, 28, 483: 28, 485: 28, 629: 28, 28, 638: 28}, - {1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 455: 1103, 1103, 1103, 1103, 460: 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 470: 1103, 1103, 1103, 474: 1103, 1103, 1103, 1103, 1103, 1103, 1103, 482: 1103, 1103, 1103, 486: 1103, 489: 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 525: 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 1103, 565: 1103}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 3942}, + {1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 462: 1139, 1139, 1139, 1139, 467: 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 478: 1139, 1139, 481: 1139, 1139, 1139, 1139, 1139, 487: 1139, 489: 1139, 1139, 1139, 1139, 494: 1139, 496: 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 532: 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 570: 1139}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 3941}, + {7: 3942}, + {473: 3947, 3946, 495: 2644, 724: 3943, 750: 3945, 802: 3944}, + {1925, 1925, 4: 1925, 1925, 1925, 1925, 13: 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 81: 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 106: 1925, 126: 1925, 1925, 1925, 1925, 466: 1925, 468: 1925, 1925, 482: 1925, 487: 1925, 1925, 490: 1925, 1925, 636: 1925, 1925, 646: 1925}, // 1490 - {53: 3943}, - {1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 455: 1104, 1104, 1104, 1104, 460: 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 470: 1104, 1104, 1104, 474: 1104, 1104, 1104, 1104, 1104, 1104, 1104, 482: 1104, 1104, 1104, 486: 1104, 489: 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 525: 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 565: 1104}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3945}, - {53: 3946, 460: 3947, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 455: 1120, 1120, 1120, 1120, 460: 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 470: 1120, 1120, 1120, 474: 1120, 1120, 1120, 1120, 1120, 1120, 1120, 482: 1120, 1120, 1120, 486: 1120, 489: 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 525: 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 565: 1120}, + {57: 3950}, + {29, 29, 4: 29, 29, 29, 13: 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 81: 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 466: 29, 468: 29, 29, 487: 29, 29, 636: 29, 29, 646: 29}, + {495: 2644, 724: 3943, 750: 3949}, + {495: 2644, 724: 3948}, + {27, 27, 4: 27, 27, 27, 13: 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 81: 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 466: 27, 468: 27, 27, 487: 27, 27, 636: 27, 27, 646: 27}, // 1495 - {485: 3694, 524: 3949, 629: 3693, 877: 3948}, - {454: 3709, 742: 3952}, - {454: 3709, 742: 3950}, - {53: 3951}, - {1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 455: 1118, 1118, 1118, 1118, 460: 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 470: 1118, 1118, 1118, 474: 1118, 1118, 1118, 1118, 1118, 1118, 1118, 482: 1118, 1118, 1118, 486: 1118, 489: 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 525: 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 565: 1118}, + {28, 28, 4: 28, 28, 28, 13: 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 81: 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 466: 28, 468: 28, 28, 487: 28, 28, 636: 28, 28, 646: 28}, + {1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 462: 1110, 1110, 1110, 1110, 467: 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 478: 1110, 1110, 481: 1110, 1110, 1110, 1110, 1110, 487: 1110, 489: 1110, 1110, 1110, 1110, 494: 1110, 496: 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 532: 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 570: 1110}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 3952}, + {57: 3953}, + {1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 462: 1111, 1111, 1111, 1111, 467: 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 478: 1111, 1111, 481: 1111, 1111, 1111, 1111, 1111, 487: 1111, 489: 1111, 1111, 1111, 1111, 494: 1111, 496: 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 532: 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 570: 1111}, // 1500 - {53: 3953}, - {1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 455: 1119, 1119, 1119, 1119, 460: 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 470: 1119, 1119, 1119, 474: 1119, 1119, 1119, 1119, 1119, 1119, 1119, 482: 1119, 1119, 1119, 486: 1119, 489: 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 525: 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 565: 1119}, - {1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 455: 1142, 1142, 1142, 1142, 460: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 470: 1142, 1142, 1142, 474: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 482: 1142, 1142, 1142, 486: 1142, 489: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 525: 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 565: 1142}, - {1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 455: 1143, 1143, 1143, 1143, 460: 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 470: 1143, 1143, 1143, 474: 1143, 1143, 1143, 1143, 1143, 1143, 1143, 482: 1143, 1143, 1143, 486: 1143, 489: 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 525: 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1143, 565: 1143}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 1856, 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3473, 756: 3635, 805: 3957}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3955}, + {57: 3956, 467: 3957, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 462: 1127, 1127, 1127, 1127, 467: 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 478: 1127, 1127, 481: 1127, 1127, 1127, 1127, 1127, 487: 1127, 489: 1127, 1127, 1127, 1127, 494: 1127, 496: 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 532: 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 570: 1127}, + {488: 3703, 531: 3959, 636: 3702, 888: 3958}, + {461: 3718, 749: 3962}, // 1505 - {53: 3958}, - {1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 455: 1139, 1139, 1139, 1139, 460: 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 470: 1139, 1139, 1139, 474: 1139, 1139, 1139, 1139, 1139, 1139, 1139, 482: 1139, 1139, 1139, 486: 1139, 489: 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 525: 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 565: 1139}, - {1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 455: 1144, 1144, 1144, 1144, 460: 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 470: 1144, 1144, 1144, 474: 1144, 1144, 1144, 1144, 1144, 1144, 1144, 482: 1144, 1144, 1144, 486: 1144, 489: 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 525: 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 565: 1144}, - {2: 1198, 1198, 1198, 1198, 1198, 8: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 54: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 454: 1198, 456: 1198, 1198, 1198, 1198, 464: 1198, 1198, 1198, 1198, 1198, 473: 1198, 481: 1198, 485: 1198, 487: 1198, 1198, 524: 1198, 547: 1198, 1198, 1198, 551: 1198, 1198, 1198, 1198, 1198, 557: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 567: 1198, 569: 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 631: 1198, 718: 3431, 727: 3429, 3430, 763: 3432, 767: 3433, 795: 3961, 797: 3434}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3962}, + {461: 3718, 749: 3960}, + {57: 3961}, + {1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 462: 1125, 1125, 1125, 1125, 467: 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 478: 1125, 1125, 481: 1125, 1125, 1125, 1125, 1125, 487: 1125, 489: 1125, 1125, 1125, 1125, 494: 1125, 496: 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 532: 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 570: 1125}, + {57: 3963}, + {1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 462: 1126, 1126, 1126, 1126, 467: 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 478: 1126, 1126, 481: 1126, 1126, 1126, 1126, 1126, 487: 1126, 489: 1126, 1126, 1126, 1126, 494: 1126, 496: 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 532: 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 570: 1126}, // 1510 - {53: 3963, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 455: 919, 919, 919, 919, 460: 919, 919, 919, 919, 919, 919, 919, 919, 919, 470: 919, 919, 919, 474: 919, 919, 919, 919, 919, 919, 919, 482: 919, 919, 919, 486: 919, 489: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 525: 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 565: 919, 722: 3249, 729: 3439, 744: 3964}, - {1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 455: 1101, 1101, 1101, 1101, 460: 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 470: 1101, 1101, 1101, 474: 1101, 1101, 1101, 1101, 1101, 1101, 1101, 482: 1101, 1101, 1101, 486: 1101, 489: 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 525: 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 565: 1101}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 1856, 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3473, 756: 3635, 805: 3966}, - {53: 3967}, + {1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 462: 1149, 1149, 1149, 1149, 467: 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 478: 1149, 1149, 481: 1149, 1149, 1149, 1149, 1149, 487: 1149, 489: 1149, 1149, 1149, 1149, 494: 1149, 496: 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 532: 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 570: 1149}, + {1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 462: 1150, 1150, 1150, 1150, 467: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 478: 1150, 1150, 481: 1150, 1150, 1150, 1150, 1150, 487: 1150, 489: 1150, 1150, 1150, 1150, 494: 1150, 496: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 532: 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 1150, 570: 1150}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 1870, 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3482, 765: 3644, 814: 3967}, + {57: 3968}, + {1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 462: 1146, 1146, 1146, 1146, 467: 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 478: 1146, 1146, 481: 1146, 1146, 1146, 1146, 1146, 487: 1146, 489: 1146, 1146, 1146, 1146, 494: 1146, 496: 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 532: 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 570: 1146}, // 1515 - {1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 455: 1072, 1072, 1072, 1072, 460: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 470: 1072, 1072, 1072, 474: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 482: 1072, 1072, 1072, 486: 1072, 489: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 525: 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 565: 1072}, - {144: 2222, 162: 2222, 179: 2222, 473: 2222, 502: 2222, 525: 2222, 536: 2222, 545: 2222, 2222, 552: 2222, 2222, 564: 2222}, - {144: 2221, 162: 2221, 179: 2221, 473: 2221, 502: 2221, 525: 2221, 536: 2221, 545: 2221, 2221, 552: 2221, 2221, 564: 2221}, - {2: 1838, 1838, 1838, 1838, 1838, 8: 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 54: 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 454: 1838, 456: 1838, 1838, 459: 1838, 464: 1838, 1838, 1838, 1838, 1838, 473: 1838, 481: 1838, 485: 1838, 487: 1838, 1838, 524: 1838, 547: 1838, 1838, 1838, 551: 1838, 1838, 1838, 1838, 1838, 557: 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 567: 1838, 569: 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838}, - {502: 3995, 525: 3994, 536: 3993, 545: 3979, 3980, 1089: 3996}, + {1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 462: 1151, 1151, 1151, 1151, 467: 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 478: 1151, 1151, 481: 1151, 1151, 1151, 1151, 1151, 487: 1151, 489: 1151, 1151, 1151, 1151, 494: 1151, 496: 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 532: 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 570: 1151}, + {2: 1205, 1205, 1205, 1205, 1205, 8: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 58: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 461: 1205, 463: 1205, 1205, 1205, 1205, 471: 1205, 1205, 1205, 1205, 1205, 480: 1205, 486: 1205, 488: 1205, 493: 1205, 495: 1205, 531: 1205, 554: 1205, 556: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 566: 1205, 1205, 1205, 1205, 571: 1205, 1205, 574: 1205, 576: 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 638: 1205, 640: 3440, 734: 3438, 3439, 773: 3441, 776: 3442, 803: 3971, 805: 3443}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3972}, + {57: 3973, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 462: 926, 926, 926, 926, 467: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 478: 926, 926, 481: 926, 926, 926, 926, 926, 487: 926, 489: 926, 926, 926, 926, 494: 926, 496: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 532: 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 570: 926, 729: 3258, 736: 3448, 754: 3974}, // 1520 - {454: 1834}, - {2: 1832, 1832, 1832, 1832, 1832, 8: 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 54: 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 454: 1832, 456: 1832, 1832, 459: 1832, 464: 1832, 1832, 1832, 1832, 1832, 473: 1832, 481: 1832, 485: 1832, 487: 1832, 1832, 524: 1832, 547: 1832, 1832, 1832, 551: 1832, 1832, 1832, 1832, 1832, 557: 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 567: 1832, 569: 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832}, - {2: 1830, 1830, 1830, 1830, 1830, 8: 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 54: 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 454: 1830, 456: 1830, 1830, 459: 1830, 464: 1830, 1830, 1830, 1830, 1830, 473: 1830, 481: 1830, 485: 1830, 487: 1830, 1830, 524: 1830, 547: 1830, 1830, 1830, 551: 1830, 1830, 1830, 1830, 1830, 557: 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 567: 1830, 569: 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830}, - {454: 3989, 690: 3990}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 3986}, + {1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 462: 1108, 1108, 1108, 1108, 467: 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 478: 1108, 1108, 481: 1108, 1108, 1108, 1108, 1108, 487: 1108, 489: 1108, 1108, 1108, 1108, 494: 1108, 496: 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 532: 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 570: 1108}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 1870, 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3482, 765: 3644, 814: 3976}, + {57: 3977}, + {1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 462: 1079, 1079, 1079, 1079, 467: 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 478: 1079, 1079, 481: 1079, 1079, 1079, 1079, 1079, 487: 1079, 489: 1079, 1079, 1079, 1079, 494: 1079, 496: 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 532: 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 1079, 570: 1079}, + {147: 2238, 167: 2238, 183: 2238, 480: 2238, 509: 2238, 532: 2238, 543: 2238, 552: 2238, 2238, 559: 2238, 2238, 572: 2238}, // 1525 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3982, 3139, 3222, 3138, 3135}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3981, 3139, 3222, 3138, 3135}, - {2: 1819, 1819, 1819, 1819, 1819, 8: 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 54: 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 454: 1819, 456: 1819, 1819, 459: 1819, 464: 1819, 1819, 1819, 1819, 1819, 473: 1819, 481: 1819, 485: 1819, 487: 1819, 1819, 524: 1819, 547: 1819, 1819, 1819, 551: 1819, 1819, 1819, 1819, 1819, 557: 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 567: 1819, 569: 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819, 1819}, - {2: 1818, 1818, 1818, 1818, 1818, 8: 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 54: 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 454: 1818, 456: 1818, 1818, 459: 1818, 464: 1818, 1818, 1818, 1818, 1818, 473: 1818, 481: 1818, 485: 1818, 487: 1818, 1818, 524: 1818, 547: 1818, 1818, 1818, 551: 1818, 1818, 1818, 1818, 1818, 557: 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 567: 1818, 569: 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818, 1818}, - {1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 455: 1821, 1821, 460: 1821, 1821, 3237, 1821, 1821, 1821, 470: 1821, 1821, 1821, 474: 1821, 1821, 1821, 1821, 1821, 1821, 1821, 482: 1821, 1821, 1821, 486: 1821, 489: 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 503: 1821, 505: 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 526: 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 1821, 565: 3238}, + {147: 2237, 167: 2237, 183: 2237, 480: 2237, 509: 2237, 532: 2237, 543: 2237, 552: 2237, 2237, 559: 2237, 2237, 572: 2237}, + {2: 1852, 1852, 1852, 1852, 1852, 8: 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 58: 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 461: 1852, 463: 1852, 1852, 466: 1852, 471: 1852, 1852, 1852, 1852, 1852, 480: 1852, 486: 1852, 488: 1852, 493: 1852, 495: 1852, 531: 1852, 554: 1852, 556: 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 566: 1852, 1852, 1852, 1852, 571: 1852, 1852, 574: 1852, 576: 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852}, + {509: 4005, 532: 4004, 543: 4003, 552: 3989, 3990, 1092: 4006}, + {461: 1848}, + {2: 1846, 1846, 1846, 1846, 1846, 8: 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 58: 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 461: 1846, 463: 1846, 1846, 466: 1846, 471: 1846, 1846, 1846, 1846, 1846, 480: 1846, 486: 1846, 488: 1846, 493: 1846, 495: 1846, 531: 1846, 554: 1846, 556: 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 566: 1846, 1846, 1846, 1846, 571: 1846, 1846, 574: 1846, 576: 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846}, // 1530 - {1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 3984, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 455: 1817, 1817, 460: 1817, 1817, 3237, 1817, 1817, 1817, 470: 1817, 1817, 1817, 474: 1817, 1817, 1817, 1817, 1817, 1817, 1817, 482: 1817, 1817, 1817, 486: 1817, 489: 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 503: 1817, 505: 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 526: 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 565: 3238, 1215: 3983}, - {1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 455: 1822, 1822, 460: 1822, 1822, 463: 1822, 1822, 1822, 470: 1822, 1822, 1822, 474: 1822, 1822, 1822, 1822, 1822, 1822, 1822, 482: 1822, 1822, 1822, 486: 1822, 489: 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 503: 1822, 505: 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 526: 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822, 1822}, - {456: 3985}, - {1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 455: 1816, 1816, 460: 1816, 1816, 463: 1816, 1816, 1816, 470: 1816, 1816, 1816, 474: 1816, 1816, 1816, 1816, 1816, 1816, 1816, 482: 1816, 1816, 1816, 486: 1816, 489: 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 503: 1816, 505: 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 526: 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816, 1816}, - {466: 3572, 3571, 3577, 486: 3987, 504: 3573, 537: 3574, 3575, 3568, 3578, 3567, 3576, 3569, 3570}, + {2: 1844, 1844, 1844, 1844, 1844, 8: 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 58: 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 461: 1844, 463: 1844, 1844, 466: 1844, 471: 1844, 1844, 1844, 1844, 1844, 480: 1844, 486: 1844, 488: 1844, 493: 1844, 495: 1844, 531: 1844, 554: 1844, 556: 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 566: 1844, 1844, 1844, 1844, 571: 1844, 1844, 574: 1844, 576: 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844}, + {461: 3999, 698: 4000}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 3996}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3992, 3148, 3231, 3147, 3144}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3991, 3148, 3231, 3147, 3144}, // 1535 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 3988}, - {1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 455: 1823, 1823, 460: 1823, 1823, 463: 1823, 1823, 1823, 470: 1823, 1823, 1823, 474: 1823, 1823, 1823, 1823, 1823, 1823, 1823, 482: 1823, 1823, 1823, 486: 1823, 489: 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 503: 1823, 505: 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 526: 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823, 1823}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 2500, 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3762, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 2498, 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 628: 2494, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3761, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3473, 733: 3764, 2495, 2496, 2497, 2506, 739: 2504, 2503, 2502, 745: 3766, 3765, 3763, 756: 3991}, - {1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 455: 1824, 1824, 460: 1824, 1824, 463: 1824, 1824, 1824, 470: 1824, 1824, 1824, 474: 1824, 1824, 1824, 1824, 1824, 1824, 1824, 482: 1824, 1824, 1824, 486: 1824, 489: 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 503: 1824, 505: 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 526: 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824}, - {7: 3475, 53: 3992}, + {2: 1833, 1833, 1833, 1833, 1833, 8: 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 58: 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 461: 1833, 463: 1833, 1833, 466: 1833, 471: 1833, 1833, 1833, 1833, 1833, 480: 1833, 486: 1833, 488: 1833, 493: 1833, 495: 1833, 531: 1833, 554: 1833, 556: 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 566: 1833, 1833, 1833, 1833, 571: 1833, 1833, 574: 1833, 576: 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833}, + {2: 1832, 1832, 1832, 1832, 1832, 8: 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 58: 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 461: 1832, 463: 1832, 1832, 466: 1832, 471: 1832, 1832, 1832, 1832, 1832, 480: 1832, 486: 1832, 488: 1832, 493: 1832, 495: 1832, 531: 1832, 554: 1832, 556: 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 566: 1832, 1832, 1832, 1832, 571: 1832, 1832, 574: 1832, 576: 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832}, + {1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 462: 1835, 1835, 467: 1835, 1835, 3246, 1835, 1835, 1835, 476: 1835, 478: 1835, 1835, 481: 1835, 1835, 1835, 1835, 1835, 487: 1835, 489: 1835, 1835, 1835, 1835, 494: 1835, 496: 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 510: 1835, 512: 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 533: 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 570: 3247}, + {1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 3994, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 462: 1831, 1831, 467: 1831, 1831, 3246, 1831, 1831, 1831, 476: 1831, 478: 1831, 1831, 481: 1831, 1831, 1831, 1831, 1831, 487: 1831, 489: 1831, 1831, 1831, 1831, 494: 1831, 496: 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 510: 1831, 512: 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 533: 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 570: 3247, 1217: 3993}, + {1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 462: 1836, 1836, 467: 1836, 1836, 470: 1836, 1836, 1836, 476: 1836, 478: 1836, 1836, 481: 1836, 1836, 1836, 1836, 1836, 487: 1836, 489: 1836, 1836, 1836, 1836, 494: 1836, 496: 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 510: 1836, 512: 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 533: 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836, 1836}, // 1540 - {1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 455: 1825, 1825, 460: 1825, 1825, 463: 1825, 1825, 1825, 470: 1825, 1825, 1825, 474: 1825, 1825, 1825, 1825, 1825, 1825, 1825, 482: 1825, 1825, 1825, 486: 1825, 489: 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 503: 1825, 505: 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 526: 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825, 1825}, - {2: 1837, 1837, 1837, 1837, 1837, 8: 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 54: 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 454: 1837, 456: 1837, 1837, 459: 1837, 464: 1837, 1837, 1837, 1837, 1837, 473: 1837, 481: 1837, 485: 1837, 487: 1837, 1837, 524: 1837, 547: 1837, 1837, 1837, 551: 1837, 1837, 1837, 1837, 1837, 557: 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 567: 1837, 569: 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837}, - {454: 1833}, - {2: 1831, 1831, 1831, 1831, 1831, 8: 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 54: 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 454: 1831, 456: 1831, 1831, 459: 1831, 464: 1831, 1831, 1831, 1831, 1831, 473: 1831, 481: 1831, 485: 1831, 487: 1831, 1831, 524: 1831, 547: 1831, 1831, 1831, 551: 1831, 1831, 1831, 1831, 1831, 557: 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 567: 1831, 569: 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831, 1831}, - {2: 1829, 1829, 1829, 1829, 1829, 8: 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 54: 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 454: 1829, 456: 1829, 1829, 459: 1829, 464: 1829, 1829, 1829, 1829, 1829, 473: 1829, 481: 1829, 485: 1829, 487: 1829, 1829, 524: 1829, 547: 1829, 1829, 1829, 551: 1829, 1829, 1829, 1829, 1829, 557: 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 567: 1829, 569: 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829, 1829}, + {463: 3995}, + {1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 462: 1830, 1830, 467: 1830, 1830, 470: 1830, 1830, 1830, 476: 1830, 478: 1830, 1830, 481: 1830, 1830, 1830, 1830, 1830, 487: 1830, 489: 1830, 1830, 1830, 1830, 494: 1830, 496: 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 510: 1830, 512: 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 533: 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830, 1830}, + {473: 3581, 3580, 3586, 494: 3997, 511: 3582, 544: 3583, 3584, 3577, 3587, 3576, 3585, 3578, 3579}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 3998}, + {1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 462: 1837, 1837, 467: 1837, 1837, 470: 1837, 1837, 1837, 476: 1837, 478: 1837, 1837, 481: 1837, 1837, 1837, 1837, 1837, 487: 1837, 489: 1837, 1837, 1837, 1837, 494: 1837, 496: 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 510: 1837, 512: 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 533: 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837}, // 1545 - {162: 4020, 473: 4021, 552: 4019, 4018}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 4012, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 4013, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 4011, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 4009, 718: 4014, 1149: 4010}, - {2: 1846, 1846, 1846, 1846, 1846, 8: 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 54: 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 454: 1846, 456: 1846, 1846, 459: 1846, 464: 1846, 1846, 1846, 1846, 1846, 473: 1846, 481: 1846, 485: 1846, 487: 1846, 1846, 524: 1846, 547: 1846, 1846, 1846, 551: 1846, 1846, 1846, 1846, 1846, 557: 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 567: 1846, 569: 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 718: 1846}, - {2: 1845, 1845, 1845, 1845, 1845, 8: 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 54: 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 454: 1845, 456: 1845, 1845, 459: 1845, 464: 1845, 1845, 1845, 1845, 1845, 473: 1845, 481: 1845, 485: 1845, 487: 1845, 1845, 524: 1845, 547: 1845, 1845, 1845, 551: 1845, 1845, 1845, 1845, 1845, 557: 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 567: 1845, 569: 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 718: 1845}, - {2: 1844, 1844, 1844, 1844, 1844, 8: 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 54: 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 454: 1844, 456: 1844, 1844, 459: 1844, 464: 1844, 1844, 1844, 1844, 1844, 473: 1844, 481: 1844, 485: 1844, 487: 1844, 1844, 524: 1844, 547: 1844, 1844, 1844, 551: 1844, 1844, 1844, 1844, 1844, 557: 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 567: 1844, 569: 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 718: 1844}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 2502, 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3771, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 2500, 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 633: 2496, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3770, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3482, 740: 3773, 2497, 2498, 2499, 2508, 2506, 2505, 2504, 751: 3775, 3774, 3772, 765: 4001}, + {1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 462: 1838, 1838, 467: 1838, 1838, 470: 1838, 1838, 1838, 476: 1838, 478: 1838, 1838, 481: 1838, 1838, 1838, 1838, 1838, 487: 1838, 489: 1838, 1838, 1838, 1838, 494: 1838, 496: 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 510: 1838, 512: 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 533: 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838}, + {7: 3484, 57: 4002}, + {1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 462: 1839, 1839, 467: 1839, 1839, 470: 1839, 1839, 1839, 476: 1839, 478: 1839, 1839, 481: 1839, 1839, 1839, 1839, 1839, 487: 1839, 489: 1839, 1839, 1839, 1839, 494: 1839, 496: 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 510: 1839, 512: 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 533: 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839}, + {2: 1851, 1851, 1851, 1851, 1851, 8: 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 58: 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 461: 1851, 463: 1851, 1851, 466: 1851, 471: 1851, 1851, 1851, 1851, 1851, 480: 1851, 486: 1851, 488: 1851, 493: 1851, 495: 1851, 531: 1851, 554: 1851, 556: 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 566: 1851, 1851, 1851, 1851, 571: 1851, 1851, 574: 1851, 576: 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851}, // 1550 - {2: 1843, 1843, 1843, 1843, 1843, 8: 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 54: 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 454: 1843, 456: 1843, 1843, 459: 1843, 464: 1843, 1843, 1843, 1843, 1843, 473: 1843, 481: 1843, 485: 1843, 487: 1843, 1843, 524: 1843, 547: 1843, 1843, 1843, 551: 1843, 1843, 1843, 1843, 1843, 557: 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 567: 1843, 569: 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 718: 1843}, - {2: 1842, 1842, 1842, 1842, 1842, 8: 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 54: 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 454: 1842, 456: 1842, 1842, 459: 1842, 464: 1842, 1842, 1842, 1842, 1842, 473: 1842, 481: 1842, 485: 1842, 487: 1842, 1842, 524: 1842, 547: 1842, 1842, 1842, 551: 1842, 1842, 1842, 1842, 1842, 557: 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 567: 1842, 569: 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 718: 1842}, - {2: 1841, 1841, 1841, 1841, 1841, 8: 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 54: 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 454: 1841, 456: 1841, 1841, 459: 1841, 464: 1841, 1841, 1841, 1841, 1841, 473: 1841, 481: 1841, 485: 1841, 487: 1841, 1841, 524: 1841, 547: 1841, 1841, 1841, 551: 1841, 1841, 1841, 1841, 1841, 557: 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 567: 1841, 569: 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 1841, 718: 1841}, - {2: 1840, 1840, 1840, 1840, 1840, 8: 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 54: 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 454: 1840, 456: 1840, 1840, 459: 1840, 464: 1840, 1840, 1840, 1840, 1840, 473: 1840, 481: 1840, 485: 1840, 487: 1840, 1840, 524: 1840, 547: 1840, 1840, 1840, 551: 1840, 1840, 1840, 1840, 1840, 557: 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 567: 1840, 569: 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 1840, 718: 1840}, - {2: 1839, 1839, 1839, 1839, 1839, 8: 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 54: 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 454: 1839, 456: 1839, 1839, 459: 1839, 464: 1839, 1839, 1839, 1839, 1839, 473: 1839, 481: 1839, 485: 1839, 487: 1839, 1839, 524: 1839, 547: 1839, 1839, 1839, 551: 1839, 1839, 1839, 1839, 1839, 557: 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 567: 1839, 569: 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 1839, 718: 1839}, + {461: 1847}, + {2: 1845, 1845, 1845, 1845, 1845, 8: 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 58: 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 461: 1845, 463: 1845, 1845, 466: 1845, 471: 1845, 1845, 1845, 1845, 1845, 480: 1845, 486: 1845, 488: 1845, 493: 1845, 495: 1845, 531: 1845, 554: 1845, 556: 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 566: 1845, 1845, 1845, 1845, 571: 1845, 1845, 574: 1845, 576: 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845}, + {2: 1843, 1843, 1843, 1843, 1843, 8: 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 58: 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 461: 1843, 463: 1843, 1843, 466: 1843, 471: 1843, 1843, 1843, 1843, 1843, 480: 1843, 486: 1843, 488: 1843, 493: 1843, 495: 1843, 531: 1843, 554: 1843, 556: 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 566: 1843, 1843, 1843, 1843, 571: 1843, 1843, 574: 1843, 576: 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843}, + {167: 4030, 480: 4031, 559: 4029, 4028}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 4022, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 4023, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 4021, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 640: 4024, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 4019, 1152: 4020}, // 1555 - {162: 1836, 457: 3969, 3968, 473: 1836, 552: 1836, 1836, 791: 4008}, - {162: 1835, 473: 1835, 552: 1835, 1835}, - {1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 455: 1850, 1850, 460: 1850, 1850, 463: 1850, 1850, 1850, 470: 1850, 1850, 1850, 474: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 482: 1850, 1850, 1850, 486: 1850, 489: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 503: 1850, 505: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 526: 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850}, - {454: 2501, 690: 4017}, - {710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 455: 710, 710, 710, 710, 460: 710, 710, 710, 710, 710, 710, 710, 710, 710, 470: 710, 710, 710, 474: 710, 710, 710, 710, 710, 710, 710, 482: 710, 710, 710, 486: 710, 489: 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 525: 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 710, 565: 710, 645: 4015}, + {2: 1860, 1860, 1860, 1860, 1860, 8: 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 58: 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 461: 1860, 463: 1860, 1860, 466: 1860, 471: 1860, 1860, 1860, 1860, 1860, 480: 1860, 486: 1860, 488: 1860, 493: 1860, 495: 1860, 531: 1860, 554: 1860, 556: 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 566: 1860, 1860, 1860, 1860, 571: 1860, 1860, 574: 1860, 576: 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 1860, 640: 1860}, + {2: 1859, 1859, 1859, 1859, 1859, 8: 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 58: 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 461: 1859, 463: 1859, 1859, 466: 1859, 471: 1859, 1859, 1859, 1859, 1859, 480: 1859, 486: 1859, 488: 1859, 493: 1859, 495: 1859, 531: 1859, 554: 1859, 556: 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 566: 1859, 1859, 1859, 1859, 571: 1859, 1859, 574: 1859, 576: 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 1859, 640: 1859}, + {2: 1858, 1858, 1858, 1858, 1858, 8: 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 58: 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 461: 1858, 463: 1858, 1858, 466: 1858, 471: 1858, 1858, 1858, 1858, 1858, 480: 1858, 486: 1858, 488: 1858, 493: 1858, 495: 1858, 531: 1858, 554: 1858, 556: 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 566: 1858, 1858, 1858, 1858, 571: 1858, 1858, 574: 1858, 576: 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 1858, 640: 1858}, + {2: 1857, 1857, 1857, 1857, 1857, 8: 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 58: 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 461: 1857, 463: 1857, 1857, 466: 1857, 471: 1857, 1857, 1857, 1857, 1857, 480: 1857, 486: 1857, 488: 1857, 493: 1857, 495: 1857, 531: 1857, 554: 1857, 556: 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 566: 1857, 1857, 1857, 1857, 571: 1857, 1857, 574: 1857, 576: 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 640: 1857}, + {2: 1856, 1856, 1856, 1856, 1856, 8: 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 58: 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 461: 1856, 463: 1856, 1856, 466: 1856, 471: 1856, 1856, 1856, 1856, 1856, 480: 1856, 486: 1856, 488: 1856, 493: 1856, 495: 1856, 531: 1856, 554: 1856, 556: 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 566: 1856, 1856, 1856, 1856, 571: 1856, 1856, 574: 1856, 576: 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856, 640: 1856}, // 1560 - {1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1828, 1656, 1656, 1656, 1656, 460: 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 470: 1656, 1656, 1656, 474: 1656, 1656, 1656, 1656, 1656, 1656, 1656, 482: 1656, 1656, 1656, 486: 1656, 489: 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 525: 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 1656, 565: 1656, 633: 1656, 636: 1656, 1656}, - {1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1827, 1655, 1655, 1655, 1655, 460: 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 470: 1655, 1655, 1655, 474: 1655, 1655, 1655, 1655, 1655, 1655, 1655, 482: 1655, 1655, 1655, 486: 1655, 489: 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 525: 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 1655, 565: 1655, 633: 1655, 636: 1655, 1655}, - {454: 1826}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 4016}, - {1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 455: 1848, 1848, 460: 1848, 1848, 463: 1848, 1848, 1848, 470: 1848, 1848, 1848, 474: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 482: 1848, 1848, 1848, 486: 1848, 489: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 503: 1848, 505: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 526: 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848}, + {2: 1855, 1855, 1855, 1855, 1855, 8: 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 58: 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 461: 1855, 463: 1855, 1855, 466: 1855, 471: 1855, 1855, 1855, 1855, 1855, 480: 1855, 486: 1855, 488: 1855, 493: 1855, 495: 1855, 531: 1855, 554: 1855, 556: 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 566: 1855, 1855, 1855, 1855, 571: 1855, 1855, 574: 1855, 576: 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 640: 1855}, + {2: 1854, 1854, 1854, 1854, 1854, 8: 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 58: 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 461: 1854, 463: 1854, 1854, 466: 1854, 471: 1854, 1854, 1854, 1854, 1854, 480: 1854, 486: 1854, 488: 1854, 493: 1854, 495: 1854, 531: 1854, 554: 1854, 556: 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 566: 1854, 1854, 1854, 1854, 571: 1854, 1854, 574: 1854, 576: 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 1854, 640: 1854}, + {2: 1853, 1853, 1853, 1853, 1853, 8: 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 58: 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 461: 1853, 463: 1853, 1853, 466: 1853, 471: 1853, 1853, 1853, 1853, 1853, 480: 1853, 486: 1853, 488: 1853, 493: 1853, 495: 1853, 531: 1853, 554: 1853, 556: 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 566: 1853, 1853, 1853, 1853, 571: 1853, 1853, 574: 1853, 576: 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 1853, 640: 1853}, + {167: 1850, 464: 3979, 3978, 480: 1850, 559: 1850, 1850, 799: 4018}, + {167: 1849, 480: 1849, 559: 1849, 1849}, // 1565 - {1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 455: 1849, 1849, 460: 1849, 1849, 463: 1849, 1849, 1849, 470: 1849, 1849, 1849, 474: 1849, 1849, 1849, 1849, 1849, 1849, 1849, 482: 1849, 1849, 1849, 486: 1849, 489: 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 503: 1849, 505: 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 526: 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849, 1849}, - {1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 455: 1875, 1875, 460: 1875, 1875, 463: 1875, 1875, 1875, 470: 1875, 1875, 1875, 474: 1875, 1875, 1875, 1875, 479: 1875, 1875, 482: 1875, 1875, 1875, 486: 1875, 489: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 503: 1875, 505: 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 1875, 526: 1875, 1875}, - {1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 455: 1874, 1874, 460: 1874, 1874, 463: 1874, 1874, 1874, 470: 1874, 1874, 1874, 474: 1874, 1874, 1874, 1874, 479: 1874, 1874, 482: 1874, 1874, 1874, 486: 1874, 489: 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 503: 1874, 505: 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 1874, 526: 1874, 1874}, - {1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 455: 1873, 1873, 460: 1873, 1873, 463: 1873, 1873, 1873, 470: 1873, 1873, 1873, 474: 1873, 1873, 1873, 1873, 479: 1873, 1873, 482: 1873, 1873, 1873, 486: 1873, 489: 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 503: 1873, 505: 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 1873, 526: 1873, 1873}, - {1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 455: 1851, 1851, 460: 1851, 1851, 463: 1851, 1851, 1851, 470: 1851, 1851, 1851, 474: 1851, 1851, 1851, 1851, 1851, 1851, 1851, 482: 1851, 1851, 1851, 486: 1851, 489: 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 503: 1851, 505: 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 526: 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851, 1851}, + {1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 462: 1864, 1864, 467: 1864, 1864, 470: 1864, 1864, 1864, 476: 1864, 478: 1864, 1864, 481: 1864, 1864, 1864, 1864, 1864, 487: 1864, 489: 1864, 1864, 1864, 1864, 494: 1864, 496: 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 510: 1864, 512: 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 533: 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864, 1864}, + {461: 2503, 698: 4027}, + {716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 462: 716, 716, 716, 716, 467: 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 478: 716, 716, 481: 716, 716, 716, 716, 716, 487: 716, 489: 716, 716, 716, 716, 494: 716, 496: 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 532: 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 570: 716, 649: 4025}, + {1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1842, 1666, 1666, 1666, 1666, 467: 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 478: 1666, 1666, 481: 1666, 1666, 1666, 1666, 1666, 487: 1666, 489: 1666, 1666, 1666, 1666, 494: 1666, 496: 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 532: 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666, 570: 1666, 641: 1666, 644: 1666, 1666}, + {1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1841, 1665, 1665, 1665, 1665, 467: 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 478: 1665, 1665, 481: 1665, 1665, 1665, 1665, 1665, 487: 1665, 489: 1665, 1665, 1665, 1665, 494: 1665, 496: 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 532: 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 570: 1665, 641: 1665, 644: 1665, 1665}, // 1570 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4023, 2668, 2669, 2667, 724: 4024, 766: 4025}, - {2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 454: 2245, 2245, 469: 2245, 478: 2245, 485: 2245, 493: 2245, 510: 2245, 2245, 524: 2245, 629: 2245, 633: 4046, 650: 2245, 2245, 653: 2245, 658: 2245, 2245, 662: 2245, 2245, 2245, 2245, 2245, 2245, 670: 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 686: 2245, 2245, 2245, 2245}, - {2242, 2242, 7: 2242, 53: 2242, 455: 2242}, - {7: 4026, 53: 4027}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4023, 2668, 2669, 2667, 724: 4045}, + {461: 1840}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 4026}, + {1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 462: 1862, 1862, 467: 1862, 1862, 470: 1862, 1862, 1862, 476: 1862, 478: 1862, 1862, 481: 1862, 1862, 1862, 1862, 1862, 487: 1862, 489: 1862, 1862, 1862, 1862, 494: 1862, 496: 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 510: 1862, 512: 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 533: 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862, 1862}, + {1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 462: 1863, 1863, 467: 1863, 1863, 470: 1863, 1863, 1863, 476: 1863, 478: 1863, 1863, 481: 1863, 1863, 1863, 1863, 1863, 487: 1863, 489: 1863, 1863, 1863, 1863, 494: 1863, 496: 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 510: 1863, 512: 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 533: 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863}, + {1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 462: 1889, 1889, 467: 1889, 1889, 470: 1889, 1889, 1889, 476: 1889, 478: 1889, 1889, 481: 1889, 1889, 1889, 485: 1889, 487: 1889, 489: 1889, 1889, 1889, 1889, 494: 1889, 496: 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 510: 1889, 512: 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 533: 1889, 1889}, // 1575 - {285: 4028}, - {454: 4029}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 4030}, - {53: 1869, 455: 4033, 466: 3572, 3571, 3577, 504: 3573, 525: 4032, 537: 3574, 3575, 3568, 3578, 3567, 3576, 3569, 3570, 1194: 4031}, - {53: 4044}, + {1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 462: 1888, 1888, 467: 1888, 1888, 470: 1888, 1888, 1888, 476: 1888, 478: 1888, 1888, 481: 1888, 1888, 1888, 485: 1888, 487: 1888, 489: 1888, 1888, 1888, 1888, 494: 1888, 496: 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 510: 1888, 512: 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 533: 1888, 1888}, + {1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 462: 1887, 1887, 467: 1887, 1887, 470: 1887, 1887, 1887, 476: 1887, 478: 1887, 1887, 481: 1887, 1887, 1887, 485: 1887, 487: 1887, 489: 1887, 1887, 1887, 1887, 494: 1887, 496: 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 510: 1887, 512: 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 533: 1887, 1887}, + {1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 462: 1865, 1865, 467: 1865, 1865, 470: 1865, 1865, 1865, 476: 1865, 478: 1865, 1865, 481: 1865, 1865, 1865, 1865, 1865, 487: 1865, 489: 1865, 1865, 1865, 1865, 494: 1865, 496: 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 510: 1865, 512: 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 533: 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4033, 2670, 2671, 2669, 732: 4034, 797: 4035}, + {2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 461: 2261, 477: 2261, 484: 2261, 488: 2261, 500: 2261, 517: 2261, 2261, 531: 2261, 636: 2261, 641: 4056, 658: 2261, 2261, 661: 2261, 666: 2261, 2261, 669: 2261, 2261, 2261, 2261, 2261, 2261, 677: 2261, 679: 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 2261, 694: 2261, 2261, 2261, 2261}, // 1580 - {213: 4037, 499: 4036}, - {141: 4034}, - {235: 4035}, - {53: 1865}, - {330: 4039}, + {7: 2258, 57: 2258}, + {7: 4036, 57: 4037}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4033, 2670, 2671, 2669, 732: 4055}, + {291: 4038}, + {461: 4039}, // 1585 - {196: 4038}, - {53: 1866}, - {196: 4040}, - {53: 1868, 455: 4041}, - {141: 4042}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 4040}, + {57: 1883, 462: 4043, 473: 3581, 3580, 3586, 511: 3582, 532: 4042, 544: 3583, 3584, 3577, 3587, 3576, 3585, 3578, 3579, 1197: 4041}, + {57: 4054}, + {219: 4047, 506: 4046}, + {143: 4044}, // 1590 - {235: 4043}, - {53: 1867}, - {1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 455: 1876, 1876, 460: 1876, 1876, 463: 1876, 1876, 1876, 470: 1876, 1876, 1876, 474: 1876, 1876, 1876, 1876, 479: 1876, 1876, 482: 1876, 1876, 1876, 486: 1876, 489: 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 503: 1876, 505: 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 1876, 526: 1876, 1876}, - {2241, 2241, 7: 2241, 53: 2241, 455: 2241}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4047, 2668, 2669, 2667}, + {241: 4045}, + {57: 1879}, + {336: 4049}, + {201: 4048}, + {57: 1880}, // 1595 - {2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 454: 2244, 2244, 469: 2244, 478: 2244, 485: 2244, 493: 2244, 510: 2244, 2244, 524: 2244, 629: 2244, 633: 4048, 650: 2244, 2244, 653: 2244, 658: 2244, 2244, 662: 2244, 2244, 2244, 2244, 2244, 2244, 670: 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 2244, 686: 2244, 2244, 2244, 2244}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4049, 2668, 2669, 2667}, - {2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 454: 2243, 2243, 469: 2243, 478: 2243, 485: 2243, 493: 2243, 510: 2243, 2243, 524: 2243, 629: 2243, 650: 2243, 2243, 653: 2243, 658: 2243, 2243, 662: 2243, 2243, 2243, 2243, 2243, 2243, 670: 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 2243, 686: 2243, 2243, 2243, 2243}, - {1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 455: 1877, 1877, 460: 1877, 1877, 463: 1877, 1877, 1877, 470: 1877, 1877, 1877, 474: 1877, 1877, 1877, 1877, 479: 1877, 1877, 482: 1877, 1877, 1877, 486: 1877, 489: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 503: 1877, 505: 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 526: 1877, 1877, 714: 3229, 3227}, - {1259, 1259, 7: 1259, 53: 1259, 121: 1259, 453: 1259, 455: 1259, 461: 1259, 463: 1259, 471: 1259, 1259, 474: 1259, 1259, 1259, 1259, 480: 1259, 484: 1259, 496: 1259, 1259, 505: 1259, 508: 1259, 1259}, + {201: 4050}, + {57: 1882, 462: 4051}, + {143: 4052}, + {241: 4053}, + {57: 1881}, // 1600 - {1258, 1258, 7: 1258, 53: 1258, 121: 1258, 453: 1258, 455: 1258, 461: 1258, 463: 1258, 471: 1258, 1258, 474: 1258, 1258, 1258, 1258, 480: 1258, 484: 1258, 496: 1258, 1258, 505: 1258, 508: 1258, 1258}, - {1257, 1257, 7: 1257, 53: 1257, 121: 1257, 453: 1257, 455: 1257, 461: 1257, 463: 1257, 471: 1257, 1257, 474: 1257, 1257, 1257, 1257, 480: 1257, 484: 1257, 496: 1257, 1257, 505: 1257, 508: 1257, 1257}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 4055}, - {1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 455: 1881, 1881, 460: 1881, 1881, 463: 1881, 1881, 1881, 470: 1881, 1881, 1881, 474: 1881, 1881, 1881, 1881, 479: 1881, 1881, 482: 1881, 1881, 1881, 486: 3233, 489: 3231, 3232, 3230, 3228, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 503: 1881, 505: 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 526: 1881, 1881, 714: 3229, 3227}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 4057}, + {1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 462: 1890, 1890, 467: 1890, 1890, 470: 1890, 1890, 1890, 476: 1890, 478: 1890, 1890, 481: 1890, 1890, 1890, 485: 1890, 487: 1890, 489: 1890, 1890, 1890, 1890, 494: 1890, 496: 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 510: 1890, 512: 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 533: 1890, 1890}, + {7: 2257, 57: 2257}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4057, 2670, 2671, 2669}, + {2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 461: 2260, 477: 2260, 484: 2260, 488: 2260, 500: 2260, 517: 2260, 2260, 531: 2260, 636: 2260, 641: 4058, 658: 2260, 2260, 661: 2260, 666: 2260, 2260, 669: 2260, 2260, 2260, 2260, 2260, 2260, 677: 2260, 679: 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 2260, 694: 2260, 2260, 2260, 2260}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4059, 2670, 2671, 2669}, // 1605 - {53: 4058}, - {2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 455: 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 482: 2150, 2150, 2150, 486: 2150, 489: 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 525: 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 2150, 556: 2150, 565: 2150, 2150, 568: 2150, 624: 2150, 2150, 2150, 2150}, - {474: 4060}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 4061}, - {2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 455: 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 482: 2151, 2151, 2151, 486: 2151, 489: 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 525: 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 2151, 556: 2151, 565: 2151, 2151, 568: 2151, 624: 2151, 2151, 2151, 2151}, + {2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 461: 2259, 477: 2259, 484: 2259, 488: 2259, 500: 2259, 517: 2259, 2259, 531: 2259, 636: 2259, 658: 2259, 2259, 661: 2259, 666: 2259, 2259, 669: 2259, 2259, 2259, 2259, 2259, 2259, 677: 2259, 679: 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 2259, 694: 2259, 2259, 2259, 2259}, + {1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 462: 1891, 1891, 467: 1891, 1891, 470: 1891, 1891, 1891, 476: 1891, 478: 1891, 1891, 481: 1891, 1891, 1891, 485: 1891, 487: 1891, 489: 1891, 1891, 1891, 1891, 494: 1891, 496: 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 510: 1891, 512: 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 1891, 533: 1891, 1891, 722: 3238, 3236}, + {1266, 1266, 7: 1266, 57: 1266, 124: 1266, 460: 1266, 462: 1266, 468: 1266, 470: 1266, 478: 1266, 1266, 481: 1266, 1266, 1266, 485: 1266, 490: 1266, 492: 1266, 503: 1266, 1266, 512: 1266, 515: 1266, 1266}, + {1265, 1265, 7: 1265, 57: 1265, 124: 1265, 460: 1265, 462: 1265, 468: 1265, 470: 1265, 478: 1265, 1265, 481: 1265, 1265, 1265, 485: 1265, 490: 1265, 492: 1265, 503: 1265, 1265, 512: 1265, 515: 1265, 1265}, + {1264, 1264, 7: 1264, 57: 1264, 124: 1264, 460: 1264, 462: 1264, 468: 1264, 470: 1264, 478: 1264, 1264, 481: 1264, 1264, 1264, 485: 1264, 490: 1264, 492: 1264, 503: 1264, 1264, 512: 1264, 515: 1264, 1264}, // 1610 - {238, 238, 53: 238, 453: 238, 455: 238, 461: 238, 463: 238, 471: 238, 238, 474: 238, 238, 238, 238, 480: 238, 484: 238, 486: 3233, 489: 3231, 3232, 3230, 3228, 494: 238, 496: 238, 238, 714: 3229, 3227}, - {4, 4}, - {141: 4065}, - {237, 237, 475: 237, 480: 237, 482: 2628, 484: 237, 773: 2629, 4066}, - {1253, 1253, 475: 1253, 480: 1253, 484: 2631, 748: 2632, 792: 4067}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 4065}, + {1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 462: 1895, 1895, 467: 1895, 1895, 470: 1895, 1895, 1895, 476: 1895, 478: 1895, 1895, 481: 1895, 1895, 1895, 485: 1895, 487: 1895, 489: 1895, 1895, 1895, 1895, 494: 3242, 496: 3240, 3241, 3239, 3237, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 510: 1895, 512: 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 533: 1895, 1895, 722: 3238, 3236}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 4067}, + {57: 4068}, + {2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 462: 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 487: 2166, 489: 2166, 2166, 2166, 2166, 494: 2166, 496: 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 532: 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 565: 2166, 570: 2166, 573: 2166, 575: 2166, 631: 2166, 2166, 634: 2166, 2166}, // 1615 - {829, 829, 475: 2634, 480: 2635, 749: 2636, 809: 4068}, - {2, 2}, - {550: 4071}, - {2: 1792, 1792, 1792, 1792, 1792, 8: 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 54: 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 454: 1792, 476: 1792, 479: 1792, 550: 1792, 558: 1792}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 4072}, + {481: 4070}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 4071}, + {2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 462: 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 487: 2167, 489: 2167, 2167, 2167, 2167, 494: 2167, 496: 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 532: 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 565: 2167, 570: 2167, 573: 2167, 575: 2167, 631: 2167, 2167, 634: 2167, 2167}, + {238, 238, 57: 238, 460: 238, 462: 238, 468: 238, 470: 238, 478: 238, 238, 481: 238, 238, 238, 485: 238, 490: 238, 492: 238, 494: 3242, 496: 3240, 3241, 3239, 3237, 501: 238, 503: 238, 238, 722: 3238, 3236}, + {4, 4}, // 1620 - {2317, 2317, 2317, 2317, 4130, 4132, 389, 13: 4081, 2096, 4149, 4076, 4088, 4083, 4077, 4082, 4085, 4079, 4075, 4080, 4084, 4078, 4147, 4162, 4151, 4138, 4131, 4134, 4133, 4136, 4137, 4139, 4146, 389, 4144, 4145, 4150, 4152, 4159, 4158, 4164, 4160, 4157, 4155, 4154, 4156, 4148, 75: 4102, 78: 4122, 4123, 87: 4124, 129: 4105, 185: 4094, 4109, 189: 4110, 201: 4104, 208: 4119, 219: 4100, 229: 4106, 233: 4101, 248: 4111, 257: 4107, 264: 4120, 4121, 455: 4118, 459: 4129, 461: 4161, 2096, 469: 2317, 477: 4125, 483: 4117, 4108, 2096, 493: 4096, 566: 4099, 4097, 629: 2096, 4135, 634: 4074, 646: 4090, 650: 4091, 652: 4126, 660: 4089, 4112, 668: 4113, 685: 4103, 753: 4086, 757: 4087, 759: 4140, 775: 4142, 793: 4141, 815: 4143, 819: 4153, 822: 4163, 845: 4116, 856: 4114, 889: 4092, 902: 4095, 908: 4098, 934: 4093, 968: 4128, 1141: 4115, 1146: 4127, 4073}, - {2094, 2094, 4925, 4926, 469: 4927, 1076: 4924, 1145: 4923}, - {469: 4900}, - {456: 1977, 478: 4165, 717: 4898}, - {456: 1977, 478: 4165, 717: 4896}, + {143: 4075}, + {237, 237, 482: 237, 490: 237, 2630, 237, 779: 2631, 4076}, + {1260, 1260, 482: 1260, 490: 1260, 492: 2633, 755: 2634, 800: 4077}, + {836, 836, 482: 2636, 490: 2637, 756: 2638, 817: 4078}, + {2, 2}, // 1625 - {478: 4165, 488: 1977, 717: 4894}, - {478: 4165, 488: 1977, 717: 4892}, - {478: 4165, 488: 1977, 717: 4890}, - {456: 1977, 478: 4165, 717: 4888}, - {456: 1977, 478: 4165, 717: 4886}, + {555: 4081}, + {2: 1806, 1806, 1806, 1806, 1806, 8: 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 58: 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 1806, 461: 1806, 483: 1806, 489: 1806, 555: 1806, 567: 1806}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 4082}, + {2335, 2335, 2335, 2335, 4140, 4142, 389, 13: 2112, 4159, 4086, 4098, 4091, 4093, 4087, 4092, 4095, 4089, 4085, 4090, 4094, 4088, 4157, 4177, 4161, 4148, 4141, 4144, 4143, 4146, 4147, 4149, 4156, 389, 4167, 4168, 4154, 4155, 4160, 4162, 4174, 4173, 4179, 4175, 4172, 4165, 4170, 4171, 4164, 4166, 4169, 4158, 80: 4111, 83: 4132, 4133, 92: 4134, 132: 4114, 190: 4099, 4118, 194: 4119, 207: 4113, 214: 4129, 225: 4108, 235: 4115, 239: 4110, 254: 4120, 262: 4116, 269: 4130, 4131, 276: 4100, 462: 4128, 466: 4139, 468: 4176, 2112, 477: 2335, 485: 4135, 487: 4127, 2112, 492: 4117, 500: 4102, 573: 4107, 4103, 636: 2112, 4145, 642: 4084, 651: 4122, 658: 4109, 660: 4136, 668: 4121, 675: 4123, 678: 4104, 693: 4112, 760: 4096, 766: 4097, 769: 4150, 781: 4152, 801: 4151, 823: 4153, 827: 4163, 831: 4178, 857: 4126, 869: 4124, 906: 4101, 913: 4105, 973: 4138, 1117: 4106, 1144: 4125, 1149: 4137, 4083}, + {2110, 2110, 4921, 4922, 477: 4923, 1080: 4920, 1148: 4919}, // 1630 - {456: 1977, 478: 4165, 717: 4884}, - {456: 1977, 478: 4165, 717: 4882}, - {456: 1977, 478: 4165, 717: 4880}, - {456: 1977, 478: 4165, 717: 4878}, - {2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 13: 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 2427, 53: 2427, 453: 2427, 2427, 2427, 459: 2427, 2427, 2427, 2427, 469: 2427, 2427, 481: 2427, 483: 2427, 485: 2427, 487: 2427, 550: 2427, 628: 2427, 2427, 2427}, + {477: 4893}, + {463: 1993, 484: 4180, 725: 4891}, + {463: 1993, 484: 4180, 725: 4889}, + {484: 4180, 495: 1993, 725: 4887}, + {484: 4180, 495: 1993, 725: 4885}, // 1635 - {2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 13: 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 2426, 53: 2426, 453: 2426, 2426, 2426, 459: 2426, 2426, 2426, 2426, 469: 2426, 2426, 481: 2426, 483: 2426, 485: 2426, 487: 2426, 550: 2426, 628: 2426, 2426, 2426}, - {134: 4870}, - {2: 2322, 2322, 2322, 2322, 2322, 8: 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 4677, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 54: 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 454: 2322, 469: 4729, 547: 2322, 556: 2311, 566: 2311, 568: 2311, 624: 2311, 4434, 630: 2311, 656: 2311, 2311, 813: 4731, 824: 4295, 848: 4727, 880: 4728, 897: 4730}, - {2: 2322, 2322, 2322, 2322, 2322, 8: 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 4662, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 54: 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 469: 4705, 566: 4687, 625: 4688, 630: 4708, 824: 4295, 848: 4706, 979: 4707}, - {2: 2322, 2322, 2322, 2322, 2322, 8: 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 4653, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 54: 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 469: 4682, 547: 2322, 556: 4283, 566: 4687, 568: 4681, 625: 4688, 630: 4284, 656: 4685, 807: 4684, 824: 4295, 848: 4680, 897: 4683, 979: 4686}, + {484: 4180, 495: 1993, 725: 4883}, + {463: 1993, 484: 4180, 725: 4881}, + {463: 1993, 484: 4180, 725: 4879}, + {463: 1993, 484: 4180, 725: 4877}, + {463: 1993, 484: 4180, 725: 4875}, // 1640 - {2412, 2412, 2412, 2412, 7: 2412, 469: 2412}, - {2348, 2348, 2348, 2348, 7: 4648, 469: 2348}, - {456: 1977, 459: 1977, 478: 4165, 717: 4645}, - {2401, 2401, 2401, 2401, 4130, 4132, 389, 2401, 13: 4081, 2096, 4149, 4076, 4088, 4083, 4077, 4082, 4085, 4079, 4075, 4080, 4084, 4078, 4147, 4162, 4151, 4138, 4131, 4134, 4133, 4136, 4137, 4139, 4146, 389, 4144, 4145, 4150, 4152, 4159, 4158, 4164, 4160, 4157, 4155, 4154, 4156, 4148, 459: 4129, 461: 4161, 2096, 469: 2401, 483: 4641, 485: 2096, 629: 2096, 4135, 753: 4086, 757: 4087, 759: 4140, 775: 4142, 793: 4141, 815: 4143, 819: 4153, 822: 4642}, - {381: 4631}, + {463: 1993, 484: 4180, 725: 4873}, + {463: 1993, 484: 4180, 725: 4871}, + {2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 13: 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 460: 2435, 2435, 2435, 466: 2435, 2435, 2435, 2435, 476: 2435, 2435, 486: 2435, 2435, 2435, 493: 2435, 555: 2435, 633: 2435, 636: 2435, 2435}, + {2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 13: 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 460: 2434, 2434, 2434, 466: 2434, 2434, 2434, 2434, 476: 2434, 2434, 486: 2434, 2434, 2434, 493: 2434, 555: 2434, 633: 2434, 636: 2434, 2434}, + {157: 4863}, // 1645 - {632: 4623}, - {2391, 2391, 2391, 2391, 7: 2391, 469: 2391}, - {469: 4621}, - {469: 4618}, - {469: 4607}, + {463: 1993, 466: 1993, 484: 4180, 725: 4860}, + {463: 1993, 466: 1993, 484: 4180, 725: 4857}, + {2418, 2418, 2418, 2418, 4140, 4142, 389, 2418, 13: 2112, 4159, 4086, 4098, 4091, 4093, 4087, 4092, 4095, 4089, 4085, 4090, 4094, 4088, 4157, 4177, 4161, 4148, 4141, 4144, 4143, 4146, 4147, 4149, 4156, 389, 4167, 4168, 4154, 4155, 4160, 4162, 4174, 4173, 4179, 4175, 4172, 4165, 4170, 4171, 4164, 4166, 4169, 4158, 466: 4139, 468: 4176, 2112, 477: 2418, 487: 4853, 2112, 636: 2112, 4145, 760: 4096, 766: 4097, 769: 4150, 781: 4152, 801: 4151, 823: 4153, 827: 4163, 831: 4854}, + {384: 4843}, + {639: 4835}, // 1650 - {469: 4605}, - {469: 4602}, - {469: 4599}, - {30: 4596, 469: 4595}, - {30: 4592, 469: 4591}, + {2: 2340, 2340, 2340, 2340, 2340, 8: 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 58: 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 461: 2340, 477: 4694, 554: 2340, 565: 2329, 573: 2329, 575: 2329, 631: 2329, 4487, 637: 2329, 664: 2329, 2329, 821: 4696, 834: 4322, 860: 4692, 890: 4693, 901: 4695}, + {2408, 2408, 2408, 2408, 7: 2408, 477: 2408}, + {2407, 2407, 2407, 2407, 7: 2407, 477: 2407}, + {477: 4690}, + {477: 4687}, // 1655 - {469: 4581}, - {644: 4574}, - {925: 4573}, - {925: 4572}, - {2: 2322, 2322, 2322, 2322, 2322, 8: 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 54: 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 547: 2322, 824: 4295, 848: 4568}, + {2: 2340, 2340, 2340, 2340, 2340, 8: 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 58: 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 477: 4666, 554: 2340, 565: 4308, 573: 4323, 575: 4665, 632: 4324, 637: 4309, 664: 4669, 816: 4668, 834: 4322, 860: 4664, 901: 4667, 984: 4670}, + {477: 4653}, + {477: 4651}, + {477: 4648}, + {477: 4645}, // 1660 - {2: 2322, 2322, 2322, 2322, 2322, 8: 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 54: 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 2322, 547: 2322, 824: 4295, 848: 4294}, - {2: 1977, 1977, 1977, 1977, 1977, 8: 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 54: 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 460: 4281, 478: 4165, 556: 4283, 630: 4284, 632: 4279, 717: 4280, 807: 4282, 824: 4278}, - {2359, 2359, 2359, 2359, 7: 2359, 469: 2359}, - {2358, 2358, 2358, 2358, 7: 2358, 469: 2358}, - {2357, 2357, 2357, 2357, 7: 2357, 469: 2357}, + {30: 4642, 477: 4641}, + {30: 4638, 477: 4637}, + {477: 4627}, + {648: 4620}, + {930: 4619}, // 1665 - {2356, 2356, 2356, 2356, 6: 388, 2356, 38: 388, 469: 2356}, - {183: 4277}, - {183: 4276}, - {2353, 2353, 2353, 2353, 7: 2353, 469: 2353}, - {2352, 2352, 2352, 2352, 7: 2352, 469: 2352}, + {930: 4618}, + {2: 2340, 2340, 2340, 2340, 2340, 8: 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 58: 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 554: 2340, 834: 4322, 860: 4614}, + {2: 2340, 2340, 2340, 2340, 2340, 8: 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 58: 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 554: 2340, 834: 4322, 860: 4348}, + {2: 2340, 2340, 2340, 2340, 2340, 8: 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 58: 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 2340, 573: 4323, 632: 4324, 637: 4321, 834: 4322, 860: 4319, 984: 4320}, + {2: 1993, 1993, 1993, 1993, 1993, 8: 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 58: 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 467: 4306, 484: 4180, 565: 4308, 637: 4309, 639: 4304, 725: 4305, 816: 4307, 834: 4303}, // 1670 - {2347, 2347, 2347, 2347, 7: 2347, 469: 2347}, - {2346, 2346, 2346, 2346, 7: 2346, 469: 2346}, - {158: 1977, 223: 1977, 241: 1977, 1977, 459: 1977, 478: 4165, 717: 4270}, - {2: 1977, 1977, 1977, 1977, 1977, 8: 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 54: 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 459: 1977, 478: 4165, 717: 4267}, - {147: 4266, 669: 4265}, + {2376, 2376, 2376, 2376, 7: 2376, 477: 2376}, + {2375, 2375, 2375, 2375, 7: 2375, 477: 2375}, + {2374, 2374, 2374, 2374, 7: 2374, 477: 2374}, + {2373, 2373, 2373, 2373, 6: 388, 2373, 38: 388, 477: 2373}, + {188: 4302}, // 1675 - {2316, 2316, 2316, 2316, 7: 4263, 469: 2316}, - {2315, 2315, 2315, 2315, 7: 2315, 469: 2315}, - {14: 2095, 17: 2095, 28: 2095, 462: 2095, 485: 2095, 629: 2095}, - {456: 1977, 478: 4165, 717: 4261}, - {2: 1977, 1977, 1977, 1977, 1977, 8: 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 54: 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 456: 1977, 478: 4165, 717: 4259}, + {188: 4301}, + {2370, 2370, 2370, 2370, 7: 2370, 477: 2370}, + {2369, 2369, 2369, 2369, 7: 2369, 477: 2369}, + {2365, 2365, 2365, 2365, 7: 2365, 477: 2365}, + {2364, 2364, 2364, 2364, 7: 2364, 477: 2364}, // 1680 - {31: 4254, 172: 4255, 230: 4256}, - {2: 1977, 1977, 1977, 1977, 1977, 8: 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 54: 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 456: 1977, 478: 4165, 717: 4252}, - {228: 4249}, - {228: 4246}, - {478: 4165, 488: 1977, 717: 4244}, + {163: 1993, 229: 1993, 247: 1993, 1993, 466: 1993, 484: 4180, 725: 4295}, + {2: 1993, 1993, 1993, 1993, 1993, 8: 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 58: 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 466: 1993, 484: 4180, 725: 4292}, + {150: 4291, 676: 4290}, + {2334, 2334, 2334, 2334, 7: 4288, 477: 2334}, + {2333, 2333, 2333, 2333, 7: 2333, 477: 2333}, // 1685 - {478: 4165, 488: 1977, 717: 4242}, - {2: 1977, 1977, 1977, 1977, 1977, 8: 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 54: 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 478: 4165, 717: 4240}, - {478: 4165, 488: 1977, 717: 4238}, - {2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 13: 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 2050, 53: 2050, 453: 2050, 2050, 2050, 459: 2050, 2050, 2050, 2050, 469: 2050, 2050, 481: 2050, 483: 2050, 485: 2050, 487: 2050, 550: 2050, 628: 2050, 2050, 2050}, - {418, 418, 418, 418, 418, 418, 418, 418, 13: 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 453: 418, 418, 418, 459: 418, 418, 418, 418, 469: 418, 418, 481: 418, 483: 418, 485: 418, 487: 418, 550: 418, 628: 418, 418, 418}, + {13: 2111, 16: 2111, 28: 2111, 469: 2111, 488: 2111, 636: 2111}, + {463: 1993, 484: 4180, 725: 4286}, + {2: 1993, 1993, 1993, 1993, 1993, 8: 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 58: 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 463: 1993, 484: 4180, 725: 4284}, + {31: 4279, 176: 4280, 236: 4281}, + {2: 1993, 1993, 1993, 1993, 1993, 8: 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 58: 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 463: 1993, 484: 4180, 725: 4277}, // 1690 - {14: 3719, 462: 4233, 485: 3720, 629: 3718, 754: 4232}, - {6: 4226, 38: 4227}, - {478: 4165, 488: 1977, 717: 4224}, - {478: 4165, 488: 1977, 717: 4222}, - {456: 1977, 478: 4165, 717: 4220}, + {234: 4274}, + {234: 4271}, + {484: 4180, 495: 1993, 725: 4269}, + {484: 4180, 495: 1993, 725: 4267}, + {2: 1993, 1993, 1993, 1993, 1993, 8: 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 58: 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 484: 4180, 725: 4265}, // 1695 - {478: 4165, 488: 1977, 717: 4218}, - {478: 4165, 488: 1977, 717: 4216}, - {456: 1977, 478: 4165, 717: 4214}, - {456: 1977, 478: 4165, 717: 4212}, - {478: 4165, 488: 1977, 717: 4210}, + {484: 4180, 495: 1993, 725: 4263}, + {2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 13: 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 2066, 460: 2066, 2066, 2066, 466: 2066, 2066, 2066, 2066, 476: 2066, 2066, 486: 2066, 2066, 2066, 493: 2066, 555: 2066, 633: 2066, 636: 2066, 2066}, + {423, 423, 423, 423, 423, 423, 423, 423, 13: 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 460: 423, 423, 423, 466: 423, 423, 423, 423, 476: 423, 423, 486: 423, 423, 423, 493: 423, 555: 423, 633: 423, 636: 423, 423}, + {13: 3728, 469: 4258, 488: 3729, 636: 3727, 761: 4257}, + {6: 4251, 38: 4252}, // 1700 - {478: 4165, 488: 1977, 717: 4208}, - {404, 404, 404, 404, 404, 404, 404, 404, 13: 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 453: 404, 404, 404, 459: 404, 404, 404, 404, 469: 404, 404, 481: 404, 483: 404, 485: 404, 487: 404, 550: 404, 628: 404, 404, 404}, - {459: 1977, 478: 4165, 488: 1977, 717: 4206}, - {459: 1977, 478: 4165, 488: 1977, 717: 4203}, - {459: 1977, 478: 4165, 488: 1977, 717: 4200}, + {484: 4180, 495: 1993, 725: 4249}, + {484: 4180, 495: 1993, 725: 4247}, + {463: 1993, 484: 4180, 725: 4245}, + {484: 4180, 495: 1993, 725: 4243}, + {484: 4180, 495: 1993, 725: 4241}, // 1705 - {478: 4165, 488: 1977, 717: 4198}, - {478: 4165, 488: 1977, 717: 4196}, - {459: 1977, 478: 4165, 488: 1977, 717: 4192}, - {2: 1977, 1977, 1977, 1977, 1977, 8: 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 54: 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 456: 1977, 473: 1977, 478: 4165, 717: 4189}, - {454: 1977, 478: 4165, 717: 4184}, + {463: 1993, 484: 4180, 725: 4239}, + {463: 1993, 484: 4180, 725: 4237}, + {484: 4180, 495: 1993, 725: 4235}, + {484: 4180, 495: 1993, 725: 4233}, + {409, 409, 409, 409, 409, 409, 409, 409, 13: 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 460: 409, 409, 409, 466: 409, 409, 409, 409, 476: 409, 409, 486: 409, 409, 409, 493: 409, 555: 409, 633: 409, 636: 409, 409}, // 1710 - {456: 1977, 478: 4165, 717: 4181}, - {383, 383, 383, 383, 383, 383, 383, 383, 13: 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 453: 383, 383, 383, 459: 383, 383, 383, 383, 469: 383, 383, 481: 383, 483: 383, 485: 383, 487: 383, 550: 383, 628: 383, 383, 383}, - {168: 1977, 188: 1977, 220: 1977, 1977, 258: 1977, 273: 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 459: 1977, 478: 4165, 717: 4166}, - {2: 1976, 1976, 1976, 1976, 1976, 8: 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 54: 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976, 454: 1976, 456: 1976, 459: 1976, 466: 1976, 1976, 470: 1976, 473: 1976, 487: 1976, 1976, 524: 1976, 552: 1976, 1976}, - {168: 4169, 188: 4168, 220: 4172, 4170, 258: 4171, 273: 4173, 4174, 4178, 4177, 4175, 4179, 4180, 4176, 459: 4167}, + {466: 1993, 484: 4180, 495: 1993, 725: 4231}, + {466: 1993, 484: 4180, 495: 1993, 725: 4228}, + {466: 1993, 484: 4180, 495: 1993, 725: 4225}, + {484: 4180, 495: 1993, 725: 4223}, + {484: 4180, 495: 1993, 725: 4221}, // 1715 - {377, 377, 377, 377, 377, 377, 377, 377, 13: 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 453: 377, 377, 377, 459: 377, 377, 377, 377, 469: 377, 377, 481: 377, 483: 377, 485: 377, 487: 377, 550: 377, 628: 377, 377, 377}, - {376, 376, 376, 376, 376, 376, 376, 376, 13: 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 453: 376, 376, 376, 459: 376, 376, 376, 376, 469: 376, 376, 481: 376, 483: 376, 485: 376, 487: 376, 550: 376, 628: 376, 376, 376}, - {375, 375, 375, 375, 375, 375, 375, 375, 13: 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 453: 375, 375, 375, 459: 375, 375, 375, 375, 469: 375, 375, 481: 375, 483: 375, 485: 375, 487: 375, 550: 375, 628: 375, 375, 375}, - {374, 374, 374, 374, 374, 374, 374, 374, 13: 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 453: 374, 374, 374, 459: 374, 374, 374, 374, 469: 374, 374, 481: 374, 483: 374, 485: 374, 487: 374, 550: 374, 628: 374, 374, 374}, - {373, 373, 373, 373, 373, 373, 373, 373, 13: 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 453: 373, 373, 373, 459: 373, 373, 373, 373, 469: 373, 373, 481: 373, 483: 373, 485: 373, 487: 373, 550: 373, 628: 373, 373, 373}, + {484: 4180, 495: 1993, 561: 1993, 1993, 725: 4219}, + {463: 1993, 484: 4180, 725: 4217}, + {463: 1993, 484: 4180, 725: 4215}, + {484: 4180, 495: 1993, 725: 4213}, + {484: 4180, 495: 1993, 725: 4211}, // 1720 - {372, 372, 372, 372, 372, 372, 372, 372, 13: 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 453: 372, 372, 372, 459: 372, 372, 372, 372, 469: 372, 372, 481: 372, 483: 372, 485: 372, 487: 372, 550: 372, 628: 372, 372, 372}, - {371, 371, 371, 371, 371, 371, 371, 371, 13: 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 453: 371, 371, 371, 459: 371, 371, 371, 371, 469: 371, 371, 481: 371, 483: 371, 485: 371, 487: 371, 550: 371, 628: 371, 371, 371}, - {370, 370, 370, 370, 370, 370, 370, 370, 13: 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 453: 370, 370, 370, 459: 370, 370, 370, 370, 469: 370, 370, 481: 370, 483: 370, 485: 370, 487: 370, 550: 370, 628: 370, 370, 370}, - {369, 369, 369, 369, 369, 369, 369, 369, 13: 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 453: 369, 369, 369, 459: 369, 369, 369, 369, 469: 369, 369, 481: 369, 483: 369, 485: 369, 487: 369, 550: 369, 628: 369, 369, 369}, - {368, 368, 368, 368, 368, 368, 368, 368, 13: 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 453: 368, 368, 368, 459: 368, 368, 368, 368, 469: 368, 368, 481: 368, 483: 368, 485: 368, 487: 368, 550: 368, 628: 368, 368, 368}, + {466: 1993, 484: 4180, 495: 1993, 725: 4207}, + {2: 1993, 1993, 1993, 1993, 1993, 8: 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 58: 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 463: 1993, 480: 1993, 484: 4180, 725: 4204}, + {461: 1993, 484: 4180, 725: 4199}, + {463: 1993, 484: 4180, 725: 4196}, + {383, 383, 383, 383, 383, 383, 383, 383, 13: 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 460: 383, 383, 383, 466: 383, 383, 383, 383, 476: 383, 383, 486: 383, 383, 383, 493: 383, 555: 383, 633: 383, 636: 383, 383}, // 1725 - {367, 367, 367, 367, 367, 367, 367, 367, 13: 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 453: 367, 367, 367, 459: 367, 367, 367, 367, 469: 367, 367, 481: 367, 483: 367, 485: 367, 487: 367, 550: 367, 628: 367, 367, 367}, - {366, 366, 366, 366, 366, 366, 366, 366, 13: 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 453: 366, 366, 366, 459: 366, 366, 366, 366, 469: 366, 366, 481: 366, 483: 366, 485: 366, 487: 366, 550: 366, 628: 366, 366, 366}, - {365, 365, 365, 365, 365, 365, 365, 365, 13: 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 453: 365, 365, 365, 459: 365, 365, 365, 365, 469: 365, 365, 481: 365, 483: 365, 485: 365, 487: 365, 550: 365, 628: 365, 365, 365}, - {364, 364, 364, 364, 364, 364, 364, 364, 13: 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 453: 364, 364, 364, 459: 364, 364, 364, 364, 469: 364, 364, 481: 364, 483: 364, 485: 364, 487: 364, 550: 364, 628: 364, 364, 364}, - {456: 4183, 1018: 4182}, + {172: 1993, 193: 1993, 226: 1993, 1993, 263: 1993, 279: 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 466: 1993, 484: 4180, 725: 4181}, + {2: 1992, 1992, 1992, 1992, 1992, 8: 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 58: 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 1992, 461: 1992, 463: 1992, 466: 1992, 473: 1992, 1992, 476: 1992, 480: 1992, 493: 1992, 495: 1992, 531: 1992, 559: 1992, 1992, 1992, 1992}, + {172: 4184, 193: 4183, 226: 4187, 4185, 263: 4186, 279: 4188, 4189, 4193, 4192, 4190, 4194, 4195, 4191, 466: 4182}, + {377, 377, 377, 377, 377, 377, 377, 377, 13: 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, 460: 377, 377, 377, 466: 377, 377, 377, 377, 476: 377, 377, 486: 377, 377, 377, 493: 377, 555: 377, 633: 377, 636: 377, 377}, + {376, 376, 376, 376, 376, 376, 376, 376, 13: 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 460: 376, 376, 376, 466: 376, 376, 376, 376, 476: 376, 376, 486: 376, 376, 376, 493: 376, 555: 376, 633: 376, 636: 376, 376}, // 1730 - {390, 390, 390, 390, 390, 390, 390, 390, 13: 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 453: 390, 390, 390, 459: 390, 390, 390, 390, 469: 390, 390, 481: 390, 483: 390, 485: 390, 487: 390, 550: 390, 628: 390, 390, 390}, - {9, 9, 9, 9, 9, 9, 9, 9, 13: 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 453: 9, 9, 9, 459: 9, 9, 9, 9, 469: 9, 9, 481: 9, 483: 9, 485: 9, 487: 9, 550: 9, 628: 9, 9, 9}, - {454: 4185}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 542, 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 3805, 778: 4186, 1122: 4187}, - {541, 541, 7: 3807, 53: 541, 455: 541}, + {375, 375, 375, 375, 375, 375, 375, 375, 13: 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 375, 460: 375, 375, 375, 466: 375, 375, 375, 375, 476: 375, 375, 486: 375, 375, 375, 493: 375, 555: 375, 633: 375, 636: 375, 375}, + {374, 374, 374, 374, 374, 374, 374, 374, 13: 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 460: 374, 374, 374, 466: 374, 374, 374, 374, 476: 374, 374, 486: 374, 374, 374, 493: 374, 555: 374, 633: 374, 636: 374, 374}, + {373, 373, 373, 373, 373, 373, 373, 373, 13: 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, 460: 373, 373, 373, 466: 373, 373, 373, 373, 476: 373, 373, 486: 373, 373, 373, 493: 373, 555: 373, 633: 373, 636: 373, 373}, + {372, 372, 372, 372, 372, 372, 372, 372, 13: 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 372, 460: 372, 372, 372, 466: 372, 372, 372, 372, 476: 372, 372, 486: 372, 372, 372, 493: 372, 555: 372, 633: 372, 636: 372, 372}, + {371, 371, 371, 371, 371, 371, 371, 371, 13: 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 460: 371, 371, 371, 466: 371, 371, 371, 371, 476: 371, 371, 486: 371, 371, 371, 493: 371, 555: 371, 633: 371, 636: 371, 371}, // 1735 - {53: 4188}, - {391, 391, 391, 391, 391, 391, 391, 391, 13: 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 453: 391, 391, 391, 459: 391, 391, 391, 391, 469: 391, 391, 481: 391, 483: 391, 485: 391, 487: 391, 550: 391, 628: 391, 391, 391}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 473: 4190, 640: 3376, 2668, 2669, 2667, 720: 4191}, - {393, 393, 393, 393, 393, 393, 393, 393, 13: 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 453: 393, 393, 393, 459: 393, 393, 393, 393, 469: 393, 393, 481: 393, 483: 393, 485: 393, 487: 393, 550: 393, 628: 393, 393, 393}, - {392, 392, 392, 392, 392, 392, 392, 392, 13: 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 453: 392, 392, 392, 459: 392, 392, 392, 392, 469: 392, 392, 481: 392, 483: 392, 485: 392, 487: 392, 550: 392, 628: 392, 392, 392}, + {370, 370, 370, 370, 370, 370, 370, 370, 13: 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 460: 370, 370, 370, 466: 370, 370, 370, 370, 476: 370, 370, 486: 370, 370, 370, 493: 370, 555: 370, 633: 370, 636: 370, 370}, + {369, 369, 369, 369, 369, 369, 369, 369, 13: 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 460: 369, 369, 369, 466: 369, 369, 369, 369, 476: 369, 369, 486: 369, 369, 369, 493: 369, 555: 369, 633: 369, 636: 369, 369}, + {368, 368, 368, 368, 368, 368, 368, 368, 13: 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 460: 368, 368, 368, 466: 368, 368, 368, 368, 476: 368, 368, 486: 368, 368, 368, 493: 368, 555: 368, 633: 368, 636: 368, 368}, + {367, 367, 367, 367, 367, 367, 367, 367, 13: 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, 460: 367, 367, 367, 466: 367, 367, 367, 367, 476: 367, 367, 486: 367, 367, 367, 493: 367, 555: 367, 633: 367, 636: 367, 367}, + {366, 366, 366, 366, 366, 366, 366, 366, 13: 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 460: 366, 366, 366, 466: 366, 366, 366, 366, 476: 366, 366, 486: 366, 366, 366, 493: 366, 555: 366, 633: 366, 636: 366, 366}, // 1740 - {459: 4194, 488: 2642, 716: 2641, 725: 4195, 1114: 4193}, - {396, 396, 396, 396, 396, 396, 396, 396, 13: 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 453: 396, 396, 396, 459: 396, 396, 396, 396, 469: 396, 396, 481: 396, 483: 396, 485: 396, 487: 396, 550: 396, 628: 396, 396, 396}, - {387, 387, 387, 387, 387, 387, 387, 387, 13: 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 453: 387, 387, 387, 459: 387, 387, 387, 387, 469: 387, 387, 481: 387, 483: 387, 485: 387, 487: 387, 550: 387, 628: 387, 387, 387}, - {386, 386, 386, 386, 386, 386, 386, 386, 13: 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 453: 386, 386, 386, 459: 386, 386, 386, 386, 469: 386, 386, 481: 386, 483: 386, 485: 386, 487: 386, 550: 386, 628: 386, 386, 386}, - {488: 2642, 716: 2641, 725: 4197}, + {365, 365, 365, 365, 365, 365, 365, 365, 13: 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 460: 365, 365, 365, 466: 365, 365, 365, 365, 476: 365, 365, 486: 365, 365, 365, 493: 365, 555: 365, 633: 365, 636: 365, 365}, + {364, 364, 364, 364, 364, 364, 364, 364, 13: 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 460: 364, 364, 364, 466: 364, 364, 364, 364, 476: 364, 364, 486: 364, 364, 364, 493: 364, 555: 364, 633: 364, 636: 364, 364}, + {463: 4198, 1023: 4197}, + {390, 390, 390, 390, 390, 390, 390, 390, 13: 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 460: 390, 390, 390, 466: 390, 390, 390, 390, 476: 390, 390, 486: 390, 390, 390, 493: 390, 555: 390, 633: 390, 636: 390, 390}, + {9, 9, 9, 9, 9, 9, 9, 9, 13: 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 460: 9, 9, 9, 466: 9, 9, 9, 9, 476: 9, 9, 486: 9, 9, 9, 493: 9, 555: 9, 633: 9, 636: 9, 9}, // 1745 - {397, 397, 397, 397, 397, 397, 397, 397, 13: 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 453: 397, 397, 397, 459: 397, 397, 397, 397, 469: 397, 397, 481: 397, 483: 397, 485: 397, 487: 397, 550: 397, 628: 397, 397, 397}, - {488: 2642, 716: 2641, 725: 4199}, - {398, 398, 398, 398, 398, 398, 398, 398, 13: 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 453: 398, 398, 398, 459: 398, 398, 398, 398, 469: 398, 398, 481: 398, 483: 398, 485: 398, 487: 398, 550: 398, 628: 398, 398, 398}, - {459: 4202, 488: 2642, 716: 2641, 725: 4201}, - {400, 400, 400, 400, 400, 400, 400, 400, 13: 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 453: 400, 400, 400, 459: 400, 400, 400, 400, 469: 400, 400, 481: 400, 483: 400, 485: 400, 487: 400, 550: 400, 628: 400, 400, 400}, + {461: 4200}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 547, 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 3814, 785: 4201, 1126: 4202}, + {546, 546, 7: 3816, 57: 546, 462: 546}, + {57: 4203}, + {391, 391, 391, 391, 391, 391, 391, 391, 13: 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 460: 391, 391, 391, 466: 391, 391, 391, 391, 476: 391, 391, 486: 391, 391, 391, 493: 391, 555: 391, 633: 391, 636: 391, 391}, // 1750 - {399, 399, 399, 399, 399, 399, 399, 399, 13: 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 453: 399, 399, 399, 459: 399, 399, 399, 399, 469: 399, 399, 481: 399, 483: 399, 485: 399, 487: 399, 550: 399, 628: 399, 399, 399}, - {459: 4205, 488: 2642, 716: 2641, 725: 4204}, - {402, 402, 402, 402, 402, 402, 402, 402, 13: 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 453: 402, 402, 402, 459: 402, 402, 402, 402, 469: 402, 402, 481: 402, 483: 402, 485: 402, 487: 402, 550: 402, 628: 402, 402, 402}, - {401, 401, 401, 401, 401, 401, 401, 401, 13: 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 453: 401, 401, 401, 459: 401, 401, 401, 401, 469: 401, 401, 481: 401, 483: 401, 485: 401, 487: 401, 550: 401, 628: 401, 401, 401}, - {459: 4194, 488: 2642, 716: 2641, 725: 4195, 1114: 4207}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 480: 4205, 652: 3385, 2670, 2671, 2669, 727: 4206}, + {393, 393, 393, 393, 393, 393, 393, 393, 13: 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 460: 393, 393, 393, 466: 393, 393, 393, 393, 476: 393, 393, 486: 393, 393, 393, 493: 393, 555: 393, 633: 393, 636: 393, 393}, + {392, 392, 392, 392, 392, 392, 392, 392, 13: 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 460: 392, 392, 392, 466: 392, 392, 392, 392, 476: 392, 392, 486: 392, 392, 392, 493: 392, 555: 392, 633: 392, 636: 392, 392}, + {466: 4209, 495: 2644, 724: 2643, 733: 4210, 1118: 4208}, + {396, 396, 396, 396, 396, 396, 396, 396, 13: 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 460: 396, 396, 396, 466: 396, 396, 396, 396, 476: 396, 396, 486: 396, 396, 396, 493: 396, 555: 396, 633: 396, 636: 396, 396}, // 1755 - {403, 403, 403, 403, 403, 403, 403, 403, 13: 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 453: 403, 403, 403, 459: 403, 403, 403, 403, 469: 403, 403, 481: 403, 483: 403, 485: 403, 487: 403, 550: 403, 628: 403, 403, 403}, - {488: 2642, 716: 2641, 725: 4209}, - {405, 405, 405, 405, 405, 405, 405, 405, 13: 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 453: 405, 405, 405, 459: 405, 405, 405, 405, 469: 405, 405, 481: 405, 483: 405, 485: 405, 487: 405, 550: 405, 628: 405, 405, 405}, - {488: 2642, 716: 2641, 725: 4211}, - {406, 406, 406, 406, 406, 406, 406, 406, 13: 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 453: 406, 406, 406, 459: 406, 406, 406, 406, 469: 406, 406, 481: 406, 483: 406, 485: 406, 487: 406, 550: 406, 628: 406, 406, 406}, + {387, 387, 387, 387, 387, 387, 387, 387, 13: 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 387, 460: 387, 387, 387, 466: 387, 387, 387, 387, 476: 387, 387, 486: 387, 387, 387, 493: 387, 555: 387, 633: 387, 636: 387, 387}, + {386, 386, 386, 386, 386, 386, 386, 386, 13: 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 386, 460: 386, 386, 386, 466: 386, 386, 386, 386, 476: 386, 386, 486: 386, 386, 386, 493: 386, 555: 386, 633: 386, 636: 386, 386}, + {495: 2644, 724: 2643, 733: 4212}, + {397, 397, 397, 397, 397, 397, 397, 397, 13: 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 460: 397, 397, 397, 466: 397, 397, 397, 397, 476: 397, 397, 486: 397, 397, 397, 493: 397, 555: 397, 633: 397, 636: 397, 397}, + {495: 2644, 724: 2643, 733: 4214}, // 1760 - {456: 4213}, - {407, 407, 407, 407, 407, 407, 407, 407, 13: 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 453: 407, 407, 407, 459: 407, 407, 407, 407, 469: 407, 407, 481: 407, 483: 407, 485: 407, 487: 407, 550: 407, 628: 407, 407, 407}, - {456: 4215}, - {408, 408, 408, 408, 408, 408, 408, 408, 13: 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 453: 408, 408, 408, 459: 408, 408, 408, 408, 469: 408, 408, 481: 408, 483: 408, 485: 408, 487: 408, 550: 408, 628: 408, 408, 408}, - {488: 2642, 716: 2641, 725: 4217}, + {398, 398, 398, 398, 398, 398, 398, 398, 13: 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 460: 398, 398, 398, 466: 398, 398, 398, 398, 476: 398, 398, 486: 398, 398, 398, 493: 398, 555: 398, 633: 398, 636: 398, 398}, + {463: 4216}, + {399, 399, 399, 399, 399, 399, 399, 399, 13: 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 460: 399, 399, 399, 466: 399, 399, 399, 399, 476: 399, 399, 486: 399, 399, 399, 493: 399, 555: 399, 633: 399, 636: 399, 399}, + {463: 4218}, + {400, 400, 400, 400, 400, 400, 400, 400, 13: 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 460: 400, 400, 400, 466: 400, 400, 400, 400, 476: 400, 400, 486: 400, 400, 400, 493: 400, 555: 400, 633: 400, 636: 400, 400}, // 1765 - {409, 409, 409, 409, 409, 409, 409, 409, 13: 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 453: 409, 409, 409, 459: 409, 409, 409, 409, 469: 409, 409, 481: 409, 483: 409, 485: 409, 487: 409, 550: 409, 628: 409, 409, 409}, - {488: 2642, 716: 2641, 725: 4219}, - {410, 410, 410, 410, 410, 410, 410, 410, 13: 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 453: 410, 410, 410, 459: 410, 410, 410, 410, 469: 410, 410, 481: 410, 483: 410, 485: 410, 487: 410, 550: 410, 628: 410, 410, 410}, - {456: 4221}, - {411, 411, 411, 411, 411, 411, 411, 411, 13: 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 453: 411, 411, 411, 459: 411, 411, 411, 411, 469: 411, 411, 481: 411, 483: 411, 485: 411, 487: 411, 550: 411, 628: 411, 411, 411}, + {495: 3317, 561: 3319, 3318, 808: 4220}, + {401, 401, 401, 401, 401, 401, 401, 401, 13: 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 460: 401, 401, 401, 466: 401, 401, 401, 401, 476: 401, 401, 486: 401, 401, 401, 493: 401, 555: 401, 633: 401, 636: 401, 401}, + {495: 2644, 724: 2643, 733: 4222}, + {402, 402, 402, 402, 402, 402, 402, 402, 13: 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 460: 402, 402, 402, 466: 402, 402, 402, 402, 476: 402, 402, 486: 402, 402, 402, 493: 402, 555: 402, 633: 402, 636: 402, 402}, + {495: 2644, 724: 2643, 733: 4224}, // 1770 - {488: 2642, 716: 2641, 725: 4223}, - {412, 412, 412, 412, 412, 412, 412, 412, 13: 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 453: 412, 412, 412, 459: 412, 412, 412, 412, 469: 412, 412, 481: 412, 483: 412, 485: 412, 487: 412, 550: 412, 628: 412, 412, 412}, - {488: 2642, 716: 2641, 725: 4225}, - {414, 414, 414, 414, 414, 414, 414, 414, 13: 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 453: 414, 414, 414, 459: 414, 414, 414, 414, 469: 414, 414, 481: 414, 483: 414, 485: 414, 487: 414, 550: 414, 628: 414, 414, 414}, - {478: 4165, 488: 1977, 717: 4230}, + {403, 403, 403, 403, 403, 403, 403, 403, 13: 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 460: 403, 403, 403, 466: 403, 403, 403, 403, 476: 403, 403, 486: 403, 403, 403, 493: 403, 555: 403, 633: 403, 636: 403, 403}, + {466: 4227, 495: 2644, 724: 2643, 733: 4226}, + {405, 405, 405, 405, 405, 405, 405, 405, 13: 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 460: 405, 405, 405, 466: 405, 405, 405, 405, 476: 405, 405, 486: 405, 405, 405, 493: 405, 555: 405, 633: 405, 636: 405, 405}, + {404, 404, 404, 404, 404, 404, 404, 404, 13: 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 460: 404, 404, 404, 466: 404, 404, 404, 404, 476: 404, 404, 486: 404, 404, 404, 493: 404, 555: 404, 633: 404, 636: 404, 404}, + {466: 4230, 495: 2644, 724: 2643, 733: 4229}, // 1775 - {478: 4165, 488: 1977, 717: 4228}, - {488: 2642, 716: 2641, 725: 4229}, - {413, 413, 413, 413, 413, 413, 413, 413, 13: 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 453: 413, 413, 413, 459: 413, 413, 413, 413, 469: 413, 413, 481: 413, 483: 413, 485: 413, 487: 413, 550: 413, 628: 413, 413, 413}, - {488: 2642, 716: 2641, 725: 4231}, - {415, 415, 415, 415, 415, 415, 415, 415, 13: 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 453: 415, 415, 415, 459: 415, 415, 415, 415, 469: 415, 415, 481: 415, 483: 415, 485: 415, 487: 415, 550: 415, 628: 415, 415, 415}, + {407, 407, 407, 407, 407, 407, 407, 407, 13: 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 460: 407, 407, 407, 466: 407, 407, 407, 407, 476: 407, 407, 486: 407, 407, 407, 493: 407, 555: 407, 633: 407, 636: 407, 407}, + {406, 406, 406, 406, 406, 406, 406, 406, 13: 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 460: 406, 406, 406, 466: 406, 406, 406, 406, 476: 406, 406, 486: 406, 406, 406, 493: 406, 555: 406, 633: 406, 636: 406, 406}, + {466: 4209, 495: 2644, 724: 2643, 733: 4210, 1118: 4232}, + {408, 408, 408, 408, 408, 408, 408, 408, 13: 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 460: 408, 408, 408, 466: 408, 408, 408, 408, 476: 408, 408, 486: 408, 408, 408, 493: 408, 555: 408, 633: 408, 636: 408, 408}, + {495: 2644, 724: 2643, 733: 4234}, // 1780 - {2: 1977, 1977, 1977, 1977, 1977, 8: 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 54: 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 456: 1977, 478: 4165, 524: 1977, 717: 4236}, - {2: 1977, 1977, 1977, 1977, 1977, 8: 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 54: 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 456: 1977, 478: 4165, 524: 1977, 717: 4234}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 524: 3374, 640: 3376, 2668, 2669, 2667, 720: 3373, 847: 4235}, - {416, 416, 416, 416, 416, 416, 416, 416, 13: 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 453: 416, 416, 416, 459: 416, 416, 416, 416, 469: 416, 416, 481: 416, 483: 416, 485: 416, 487: 416, 550: 416, 628: 416, 416, 416}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 524: 3644, 640: 3376, 2668, 2669, 2667, 720: 3643, 789: 4237}, + {410, 410, 410, 410, 410, 410, 410, 410, 13: 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 410, 460: 410, 410, 410, 466: 410, 410, 410, 410, 476: 410, 410, 486: 410, 410, 410, 493: 410, 555: 410, 633: 410, 636: 410, 410}, + {495: 2644, 724: 2643, 733: 4236}, + {411, 411, 411, 411, 411, 411, 411, 411, 13: 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 411, 460: 411, 411, 411, 466: 411, 411, 411, 411, 476: 411, 411, 486: 411, 411, 411, 493: 411, 555: 411, 633: 411, 636: 411, 411}, + {463: 4238}, + {412, 412, 412, 412, 412, 412, 412, 412, 13: 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 460: 412, 412, 412, 466: 412, 412, 412, 412, 476: 412, 412, 486: 412, 412, 412, 493: 412, 555: 412, 633: 412, 636: 412, 412}, // 1785 - {417, 417, 417, 417, 417, 417, 417, 417, 13: 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 453: 417, 417, 417, 459: 417, 417, 417, 417, 469: 417, 417, 481: 417, 483: 417, 485: 417, 487: 417, 550: 417, 628: 417, 417, 417}, - {488: 2642, 716: 2641, 725: 4239}, - {2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 13: 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 2051, 53: 2051, 453: 2051, 2051, 2051, 459: 2051, 2051, 2051, 2051, 469: 2051, 2051, 481: 2051, 483: 2051, 485: 2051, 487: 2051, 550: 2051, 628: 2051, 2051, 2051}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4241, 2668, 2669, 2667}, - {2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 13: 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052, 53: 2052, 453: 2052, 2052, 2052, 459: 2052, 2052, 2052, 2052, 469: 2052, 2052, 481: 2052, 483: 2052, 485: 2052, 487: 2052, 550: 2052, 628: 2052, 2052, 2052}, + {463: 4240}, + {413, 413, 413, 413, 413, 413, 413, 413, 13: 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 460: 413, 413, 413, 466: 413, 413, 413, 413, 476: 413, 413, 486: 413, 413, 413, 493: 413, 555: 413, 633: 413, 636: 413, 413}, + {495: 2644, 724: 2643, 733: 4242}, + {414, 414, 414, 414, 414, 414, 414, 414, 13: 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 460: 414, 414, 414, 466: 414, 414, 414, 414, 476: 414, 414, 486: 414, 414, 414, 493: 414, 555: 414, 633: 414, 636: 414, 414}, + {495: 2644, 724: 2643, 733: 4244}, // 1790 - {488: 2642, 716: 2641, 725: 4243}, - {2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 13: 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 53: 2053, 453: 2053, 2053, 2053, 459: 2053, 2053, 2053, 2053, 469: 2053, 2053, 481: 2053, 483: 2053, 485: 2053, 487: 2053, 550: 2053, 628: 2053, 2053, 2053}, - {488: 2642, 716: 2641, 725: 4245}, - {2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 13: 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 2054, 53: 2054, 453: 2054, 2054, 2054, 459: 2054, 2054, 2054, 2054, 469: 2054, 2054, 481: 2054, 483: 2054, 485: 2054, 487: 2054, 550: 2054, 628: 2054, 2054, 2054}, - {456: 1977, 478: 4165, 717: 4247}, + {415, 415, 415, 415, 415, 415, 415, 415, 13: 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, 460: 415, 415, 415, 466: 415, 415, 415, 415, 476: 415, 415, 486: 415, 415, 415, 493: 415, 555: 415, 633: 415, 636: 415, 415}, + {463: 4246}, + {416, 416, 416, 416, 416, 416, 416, 416, 13: 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 460: 416, 416, 416, 466: 416, 416, 416, 416, 476: 416, 416, 486: 416, 416, 416, 493: 416, 555: 416, 633: 416, 636: 416, 416}, + {495: 2644, 724: 2643, 733: 4248}, + {417, 417, 417, 417, 417, 417, 417, 417, 13: 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 460: 417, 417, 417, 466: 417, 417, 417, 417, 476: 417, 417, 486: 417, 417, 417, 493: 417, 555: 417, 633: 417, 636: 417, 417}, // 1795 - {456: 4248}, - {2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 13: 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 2055, 53: 2055, 453: 2055, 2055, 2055, 459: 2055, 2055, 2055, 2055, 469: 2055, 2055, 481: 2055, 483: 2055, 485: 2055, 487: 2055, 550: 2055, 628: 2055, 2055, 2055}, - {456: 1977, 478: 4165, 717: 4250}, - {456: 4251}, - {2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 13: 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 2056, 53: 2056, 453: 2056, 2056, 2056, 459: 2056, 2056, 2056, 2056, 469: 2056, 2056, 481: 2056, 483: 2056, 485: 2056, 487: 2056, 550: 2056, 628: 2056, 2056, 2056}, + {495: 2644, 724: 2643, 733: 4250}, + {419, 419, 419, 419, 419, 419, 419, 419, 13: 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 460: 419, 419, 419, 466: 419, 419, 419, 419, 476: 419, 419, 486: 419, 419, 419, 493: 419, 555: 419, 633: 419, 636: 419, 419}, + {484: 4180, 495: 1993, 725: 4255}, + {484: 4180, 495: 1993, 725: 4253}, + {495: 2644, 724: 2643, 733: 4254}, // 1800 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 640: 3376, 2668, 2669, 2667, 720: 4253}, - {2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 13: 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 2057, 53: 2057, 453: 2057, 2057, 2057, 459: 2057, 2057, 2057, 2057, 469: 2057, 2057, 481: 2057, 483: 2057, 485: 2057, 487: 2057, 550: 2057, 628: 2057, 2057, 2057}, - {2: 1977, 1977, 1977, 1977, 1977, 8: 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 54: 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 456: 1977, 478: 4165, 717: 4257}, - {395, 395, 395, 395, 395, 395, 395, 395, 13: 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 453: 395, 395, 395, 459: 395, 395, 395, 395, 469: 395, 395, 481: 395, 483: 395, 485: 395, 487: 395, 550: 395, 628: 395, 395, 395}, - {394, 394, 394, 394, 394, 394, 394, 394, 13: 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 453: 394, 394, 394, 459: 394, 394, 394, 394, 469: 394, 394, 481: 394, 483: 394, 485: 394, 487: 394, 550: 394, 628: 394, 394, 394}, + {418, 418, 418, 418, 418, 418, 418, 418, 13: 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 460: 418, 418, 418, 466: 418, 418, 418, 418, 476: 418, 418, 486: 418, 418, 418, 493: 418, 555: 418, 633: 418, 636: 418, 418}, + {495: 2644, 724: 2643, 733: 4256}, + {420, 420, 420, 420, 420, 420, 420, 420, 13: 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 460: 420, 420, 420, 466: 420, 420, 420, 420, 476: 420, 420, 486: 420, 420, 420, 493: 420, 555: 420, 633: 420, 636: 420, 420}, + {2: 1993, 1993, 1993, 1993, 1993, 8: 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 58: 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 463: 1993, 484: 4180, 531: 1993, 725: 4261}, + {2: 1993, 1993, 1993, 1993, 1993, 8: 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 58: 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 463: 1993, 484: 4180, 531: 1993, 725: 4259}, // 1805 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 640: 3376, 2668, 2669, 2667, 720: 4258}, - {2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 13: 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 2058, 53: 2058, 453: 2058, 2058, 2058, 459: 2058, 2058, 2058, 2058, 469: 2058, 2058, 481: 2058, 483: 2058, 485: 2058, 487: 2058, 550: 2058, 628: 2058, 2058, 2058}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 640: 3376, 2668, 2669, 2667, 720: 4260}, - {2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 13: 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 53: 2059, 453: 2059, 2059, 2059, 459: 2059, 2059, 2059, 2059, 469: 2059, 2059, 481: 2059, 483: 2059, 485: 2059, 487: 2059, 550: 2059, 628: 2059, 2059, 2059}, - {456: 4262}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 531: 3383, 652: 3385, 2670, 2671, 2669, 727: 3382, 859: 4260}, + {421, 421, 421, 421, 421, 421, 421, 421, 13: 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 460: 421, 421, 421, 466: 421, 421, 421, 421, 476: 421, 421, 486: 421, 421, 421, 493: 421, 555: 421, 633: 421, 636: 421, 421}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 531: 3653, 652: 3385, 2670, 2671, 2669, 727: 3652, 796: 4262}, + {422, 422, 422, 422, 422, 422, 422, 422, 13: 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 460: 422, 422, 422, 466: 422, 422, 422, 422, 476: 422, 422, 486: 422, 422, 422, 493: 422, 555: 422, 633: 422, 636: 422, 422}, + {495: 2644, 724: 2643, 733: 4264}, // 1810 - {2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 13: 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 53: 2060, 453: 2060, 2060, 2060, 459: 2060, 2060, 2060, 2060, 469: 2060, 2060, 481: 2060, 483: 2060, 485: 2060, 487: 2060, 550: 2060, 628: 2060, 2060, 2060}, - {4: 4130, 4132, 389, 13: 4081, 2096, 4149, 4076, 4088, 4083, 4077, 4082, 4085, 4079, 4075, 4080, 4084, 4078, 4147, 4162, 4151, 4138, 4131, 4134, 4133, 4136, 4137, 4139, 4146, 389, 4144, 4145, 4150, 4152, 4159, 4158, 4164, 4160, 4157, 4155, 4154, 4156, 4148, 75: 4102, 78: 4122, 4123, 87: 4124, 129: 4105, 185: 4094, 4109, 189: 4110, 201: 4104, 208: 4119, 219: 4100, 229: 4106, 233: 4101, 248: 4111, 257: 4107, 264: 4120, 4121, 455: 4118, 459: 4129, 461: 4161, 2096, 477: 4125, 483: 4117, 4108, 2096, 493: 4096, 566: 4099, 4097, 629: 2096, 4135, 646: 4090, 650: 4091, 652: 4126, 660: 4089, 4112, 668: 4113, 685: 4103, 753: 4086, 757: 4087, 759: 4140, 775: 4142, 793: 4141, 815: 4143, 819: 4153, 822: 4163, 845: 4116, 856: 4114, 889: 4092, 902: 4095, 908: 4098, 934: 4093, 968: 4264, 1141: 4115}, - {2314, 2314, 2314, 2314, 7: 2314, 469: 2314}, - {2328, 2328, 2328, 2328, 7: 2328, 469: 2328}, - {2327, 2327, 2327, 2327, 7: 2327, 469: 2327}, + {2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 13: 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067, 460: 2067, 2067, 2067, 466: 2067, 2067, 2067, 2067, 476: 2067, 2067, 486: 2067, 2067, 2067, 493: 2067, 555: 2067, 633: 2067, 636: 2067, 2067}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4266, 2670, 2671, 2669}, + {2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 13: 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 2068, 460: 2068, 2068, 2068, 466: 2068, 2068, 2068, 2068, 476: 2068, 2068, 486: 2068, 2068, 2068, 493: 2068, 555: 2068, 633: 2068, 636: 2068, 2068}, + {495: 2644, 724: 2643, 733: 4268}, + {2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 13: 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 2069, 460: 2069, 2069, 2069, 466: 2069, 2069, 2069, 2069, 476: 2069, 2069, 486: 2069, 2069, 2069, 493: 2069, 555: 2069, 633: 2069, 636: 2069, 2069}, // 1815 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 459: 4268, 640: 4269, 2668, 2669, 2667}, - {2330, 2330, 2330, 2330, 7: 2330, 87: 2330, 469: 2330}, - {2329, 2329, 2329, 2329, 7: 2329, 87: 2329, 469: 2329}, - {158: 4275, 223: 4272, 241: 4273, 4274, 459: 4271}, - {2335, 2335, 2335, 2335, 7: 2335, 469: 2335, 477: 2335}, + {495: 2644, 724: 2643, 733: 4270}, + {2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 13: 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 460: 2070, 2070, 2070, 466: 2070, 2070, 2070, 2070, 476: 2070, 2070, 486: 2070, 2070, 2070, 493: 2070, 555: 2070, 633: 2070, 636: 2070, 2070}, + {463: 1993, 484: 4180, 725: 4272}, + {463: 4273}, + {2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 13: 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071, 460: 2071, 2071, 2071, 466: 2071, 2071, 2071, 2071, 476: 2071, 2071, 486: 2071, 2071, 2071, 493: 2071, 555: 2071, 633: 2071, 636: 2071, 2071}, // 1820 - {2334, 2334, 2334, 2334, 7: 2334, 469: 2334, 477: 2334}, - {2333, 2333, 2333, 2333, 7: 2333, 469: 2333, 477: 2333}, - {2332, 2332, 2332, 2332, 7: 2332, 469: 2332, 477: 2332}, - {2331, 2331, 2331, 2331, 7: 2331, 469: 2331, 477: 2331}, - {2354, 2354, 2354, 2354, 7: 2354, 469: 2354}, + {463: 1993, 484: 4180, 725: 4275}, + {463: 4276}, + {2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 13: 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072, 460: 2072, 2072, 2072, 466: 2072, 2072, 2072, 2072, 476: 2072, 2072, 486: 2072, 2072, 2072, 493: 2072, 555: 2072, 633: 2072, 636: 2072, 2072}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 652: 3385, 2670, 2671, 2669, 727: 4278}, + {2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 13: 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073, 460: 2073, 2073, 2073, 466: 2073, 2073, 2073, 2073, 476: 2073, 2073, 486: 2073, 2073, 2073, 493: 2073, 555: 2073, 633: 2073, 636: 2073, 2073}, // 1825 - {2355, 2355, 2355, 2355, 7: 2355, 469: 2355}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4291, 2668, 2669, 2667}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 4290}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 4289}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 4288}, + {2: 1993, 1993, 1993, 1993, 1993, 8: 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 58: 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 463: 1993, 484: 4180, 725: 4282}, + {395, 395, 395, 395, 395, 395, 395, 395, 13: 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 395, 460: 395, 395, 395, 466: 395, 395, 395, 395, 476: 395, 395, 486: 395, 395, 395, 493: 395, 555: 395, 633: 395, 636: 395, 395}, + {394, 394, 394, 394, 394, 394, 394, 394, 13: 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 460: 394, 394, 394, 466: 394, 394, 394, 394, 476: 394, 394, 486: 394, 394, 394, 493: 394, 555: 394, 633: 394, 636: 394, 394}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 652: 3385, 2670, 2671, 2669, 727: 4283}, + {2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 13: 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074, 460: 2074, 2074, 2074, 466: 2074, 2074, 2074, 2074, 476: 2074, 2074, 486: 2074, 2074, 2074, 493: 2074, 555: 2074, 633: 2074, 636: 2074, 2074}, // 1830 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4285, 2668, 2669, 2667}, - {2: 2326, 2326, 2326, 2326, 2326, 8: 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 54: 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 454: 2326, 463: 2326, 474: 2326, 547: 2326}, - {2: 2325, 2325, 2325, 2325, 2325, 8: 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 54: 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 2325, 454: 2325, 463: 2325, 474: 2325, 547: 2325}, - {632: 4286}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4287, 2668, 2669, 2667}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 652: 3385, 2670, 2671, 2669, 727: 4285}, + {2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 13: 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 2075, 460: 2075, 2075, 2075, 466: 2075, 2075, 2075, 2075, 476: 2075, 2075, 486: 2075, 2075, 2075, 493: 2075, 555: 2075, 633: 2075, 636: 2075, 2075}, + {463: 4287}, + {2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 13: 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 2076, 460: 2076, 2076, 2076, 466: 2076, 2076, 2076, 2076, 476: 2076, 2076, 486: 2076, 2076, 2076, 493: 2076, 555: 2076, 633: 2076, 636: 2076, 2076}, + {4: 4140, 4142, 389, 13: 2112, 4159, 4086, 4098, 4091, 4093, 4087, 4092, 4095, 4089, 4085, 4090, 4094, 4088, 4157, 4177, 4161, 4148, 4141, 4144, 4143, 4146, 4147, 4149, 4156, 389, 4167, 4168, 4154, 4155, 4160, 4162, 4174, 4173, 4179, 4175, 4172, 4165, 4170, 4171, 4164, 4166, 4169, 4158, 80: 4111, 83: 4132, 4133, 92: 4134, 132: 4114, 190: 4099, 4118, 194: 4119, 207: 4113, 214: 4129, 225: 4108, 235: 4115, 239: 4110, 254: 4120, 262: 4116, 269: 4130, 4131, 276: 4100, 462: 4128, 466: 4139, 468: 4176, 2112, 485: 4135, 487: 4127, 2112, 492: 4117, 500: 4102, 573: 4107, 4103, 636: 2112, 4145, 651: 4122, 658: 4109, 660: 4136, 668: 4121, 675: 4123, 678: 4104, 693: 4112, 760: 4096, 766: 4097, 769: 4150, 781: 4152, 801: 4151, 823: 4153, 827: 4163, 831: 4178, 857: 4126, 869: 4124, 906: 4101, 913: 4105, 973: 4289, 1117: 4106, 1144: 4125}, // 1835 - {2360, 2360, 2360, 2360, 7: 2360, 469: 2360}, - {2361, 2361, 2361, 2361, 7: 2361, 469: 2361}, - {2362, 2362, 2362, 2362, 7: 2362, 469: 2362}, - {2363, 2363, 2363, 2363, 7: 2363, 469: 2363}, - {632: 4292}, + {2332, 2332, 2332, 2332, 7: 2332, 477: 2332}, + {2346, 2346, 2346, 2346, 7: 2346, 477: 2346}, + {2345, 2345, 2345, 2345, 7: 2345, 477: 2345}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 466: 4293, 652: 4294, 2670, 2671, 2669}, + {2348, 2348, 2348, 2348, 7: 2348, 92: 2348, 477: 2348}, // 1840 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4293, 2668, 2669, 2667}, - {2364, 2364, 2364, 2364, 7: 2364, 469: 2364}, - {2: 1797, 1797, 1797, 1797, 1797, 8: 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 54: 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 547: 4297, 758: 4296}, - {2: 2321, 2321, 2321, 2321, 2321, 8: 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 54: 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 2321, 454: 2321, 547: 2321}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4023, 2668, 2669, 2667, 724: 4299}, + {2347, 2347, 2347, 2347, 7: 2347, 92: 2347, 477: 2347}, + {163: 4300, 229: 4297, 247: 4298, 4299, 466: 4296}, + {2353, 2353, 2353, 2353, 7: 2353, 477: 2353, 485: 2353}, + {2352, 2352, 2352, 2352, 7: 2352, 477: 2352, 485: 2352}, + {2351, 2351, 2351, 2351, 7: 2351, 477: 2351, 485: 2351}, // 1845 - {564: 4298}, - {2: 1796, 1796, 1796, 1796, 1796, 8: 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 54: 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 1796, 456: 1796, 551: 1796}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4023, 2668, 2669, 2667, 724: 4301, 825: 4300}, - {2320, 2320, 2320, 2320, 7: 2320, 4565, 4566, 469: 2320, 911: 4564}, - {10: 4303, 102: 4351, 106: 4352, 166: 4362, 4361, 4327, 170: 4342, 182: 4364, 207: 4363, 213: 4324, 290: 4331, 4323, 311: 4340, 340: 4347, 4346, 344: 4350, 379: 4358, 485: 4345, 493: 4341, 524: 4336, 629: 4344, 658: 4349, 4348, 662: 4325, 4330, 4328, 4321, 4315, 4329, 670: 4337, 4322, 4354, 4316, 4317, 4318, 4319, 4320, 4343, 4356, 4360, 4355, 4314, 4359, 4326, 686: 4313, 4353, 4312, 4357, 877: 4332, 1133: 4334, 1155: 4311, 4338, 4308, 1175: 4306, 1189: 4309, 1191: 4310, 1211: 4307, 1228: 4333, 4304, 4335, 1285: 4305, 1297: 4339, 1300: 4302, 1325: 4365}, + {2350, 2350, 2350, 2350, 7: 2350, 477: 2350, 485: 2350}, + {2349, 2349, 2349, 2349, 7: 2349, 477: 2349, 485: 2349}, + {2371, 2371, 2371, 2371, 7: 2371, 477: 2371}, + {2372, 2372, 2372, 2372, 7: 2372, 477: 2372}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4316, 2670, 2671, 2669}, // 1850 - {2183, 2183, 2183, 2183, 4445, 4451, 4439, 2183, 2183, 2183, 4443, 4452, 4450, 53: 2183, 453: 4444, 457: 3969, 3968, 4442, 2190, 462: 4449, 469: 2183, 473: 4438, 556: 2224, 566: 2311, 568: 4436, 624: 4441, 4434, 4456, 4453, 791: 4437, 813: 4446, 891: 4448, 910: 4454, 919: 4447, 936: 4440, 982: 4455, 4563}, - {2183, 2183, 2183, 2183, 4445, 4451, 4439, 2183, 2183, 2183, 4443, 4452, 4450, 53: 2183, 453: 4444, 457: 3969, 3968, 4442, 2190, 462: 4449, 469: 2183, 473: 4438, 556: 2224, 566: 2311, 568: 4436, 624: 4441, 4434, 4456, 4453, 791: 4437, 813: 4446, 891: 4448, 910: 4454, 919: 4447, 936: 4440, 982: 4455, 4435}, - {363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 53: 363, 453: 363, 457: 363, 363, 363, 363, 462: 363, 469: 363, 473: 363, 556: 363, 566: 363, 568: 363, 624: 363, 363, 363, 363}, - {362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 53: 362, 453: 362, 457: 362, 362, 362, 362, 462: 362, 469: 362, 473: 362, 556: 362, 566: 362, 568: 362, 624: 362, 362, 362, 362}, - {361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 53: 361, 453: 361, 457: 361, 361, 361, 361, 462: 361, 469: 361, 473: 361, 556: 361, 566: 361, 568: 361, 624: 361, 361, 361, 361}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 4315}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 4314}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 4313}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4310, 2670, 2671, 2669}, + {2: 2344, 2344, 2344, 2344, 2344, 8: 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 58: 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 2344, 461: 2344, 470: 2344, 481: 2344, 554: 2344}, // 1855 - {278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 53: 278, 55: 278, 453: 278, 3709, 457: 278, 278, 278, 278, 462: 278, 469: 278, 473: 278, 556: 278, 566: 278, 568: 278, 624: 278, 278, 278, 278, 721: 278, 723: 278, 742: 3710, 765: 4432}, - {273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 53: 273, 55: 273, 453: 273, 457: 273, 273, 273, 273, 462: 273, 469: 273, 473: 273, 556: 273, 566: 273, 568: 273, 624: 273, 273, 273, 273, 721: 273, 723: 273, 850: 4431}, - {271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 53: 271, 55: 271, 453: 271, 3696, 457: 271, 271, 271, 271, 462: 271, 469: 271, 473: 271, 556: 271, 566: 271, 568: 271, 624: 271, 271, 271, 271, 721: 271, 723: 271, 742: 3697, 881: 4429, 890: 3698}, - {271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 53: 271, 55: 271, 453: 271, 3696, 457: 271, 271, 271, 271, 462: 271, 469: 271, 473: 271, 556: 271, 566: 271, 568: 271, 624: 271, 271, 271, 271, 721: 271, 723: 271, 742: 3697, 881: 4427, 890: 3698}, - {278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 53: 278, 453: 278, 3709, 457: 278, 278, 278, 278, 462: 278, 469: 278, 473: 278, 556: 278, 566: 278, 568: 278, 624: 278, 278, 278, 278, 742: 3710, 765: 4426}, + {2: 2343, 2343, 2343, 2343, 2343, 8: 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 58: 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 461: 2343, 470: 2343, 481: 2343, 554: 2343}, + {639: 4311}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4312, 2670, 2671, 2669}, + {2377, 2377, 2377, 2377, 7: 2377, 477: 2377}, + {2378, 2378, 2378, 2378, 7: 2378, 477: 2378}, // 1860 - {355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 53: 355, 55: 355, 453: 355, 355, 457: 355, 355, 355, 355, 462: 355, 469: 355, 473: 355, 556: 355, 566: 355, 568: 355, 624: 355, 355, 355, 355, 721: 355, 723: 355}, - {354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 53: 354, 55: 354, 453: 354, 354, 457: 354, 354, 354, 354, 462: 354, 469: 354, 473: 354, 556: 354, 566: 354, 568: 354, 624: 354, 354, 354, 354, 721: 354, 723: 354}, - {353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 53: 353, 55: 353, 453: 353, 353, 457: 353, 353, 353, 353, 462: 353, 469: 353, 473: 353, 556: 353, 566: 353, 568: 353, 624: 353, 353, 353, 353, 721: 353, 723: 353}, - {352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 53: 352, 55: 352, 453: 352, 352, 457: 352, 352, 352, 352, 462: 352, 469: 352, 473: 352, 556: 352, 566: 352, 568: 352, 624: 352, 352, 352, 352, 721: 352, 723: 352}, - {351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 53: 351, 55: 351, 453: 351, 351, 457: 351, 351, 351, 351, 462: 351, 469: 351, 473: 351, 556: 351, 566: 351, 568: 351, 624: 351, 351, 351, 351, 721: 351, 723: 351}, + {2379, 2379, 2379, 2379, 7: 2379, 477: 2379}, + {2380, 2380, 2380, 2380, 7: 2380, 477: 2380}, + {639: 4317}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4318, 2670, 2671, 2669}, + {2381, 2381, 2381, 2381, 7: 2381, 477: 2381}, // 1865 - {350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 53: 350, 55: 350, 453: 350, 350, 457: 350, 350, 350, 350, 462: 350, 469: 350, 473: 350, 556: 350, 566: 350, 568: 350, 624: 350, 350, 350, 350, 721: 350, 723: 350}, - {349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 53: 349, 55: 349, 453: 349, 349, 457: 349, 349, 349, 349, 462: 349, 469: 349, 473: 349, 556: 349, 566: 349, 568: 349, 624: 349, 349, 349, 349, 721: 349, 723: 349}, - {348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 53: 348, 55: 348, 453: 348, 348, 457: 348, 348, 348, 348, 462: 348, 469: 348, 473: 348, 556: 348, 566: 348, 568: 348, 624: 348, 348, 348, 348, 721: 348, 723: 348}, - {347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 53: 347, 55: 347, 453: 347, 347, 457: 347, 347, 347, 347, 462: 347, 469: 347, 473: 347, 556: 347, 566: 347, 568: 347, 624: 347, 347, 347, 347, 721: 347, 723: 347}, - {346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 53: 346, 55: 346, 453: 346, 346, 457: 346, 346, 346, 346, 462: 346, 469: 346, 473: 346, 556: 346, 566: 346, 568: 346, 624: 346, 346, 346, 346, 721: 346, 723: 346}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4033, 2670, 2671, 2669, 732: 4334}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4329, 2670, 2671, 2669}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4325, 2670, 2671, 2669}, + {2: 2339, 2339, 2339, 2339, 2339, 8: 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 58: 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 2339, 461: 2339, 554: 2339}, + {2: 431, 431, 431, 431, 431, 8: 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 58: 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431}, // 1870 - {345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 53: 345, 55: 345, 453: 345, 345, 457: 345, 345, 345, 345, 462: 345, 469: 345, 473: 345, 556: 345, 566: 345, 568: 345, 624: 345, 345, 345, 345, 721: 345, 723: 345}, - {344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 53: 344, 55: 344, 453: 344, 457: 344, 344, 344, 344, 462: 344, 469: 344, 473: 344, 556: 344, 566: 344, 568: 344, 624: 344, 344, 344, 344, 721: 344, 723: 344}, - {343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 53: 343, 55: 343, 453: 343, 457: 343, 343, 343, 343, 462: 343, 469: 343, 473: 343, 556: 343, 566: 343, 568: 343, 624: 343, 343, 343, 343, 721: 343, 723: 343}, - {339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 53: 339, 55: 339, 453: 339, 339, 457: 339, 339, 339, 339, 462: 339, 469: 339, 473: 339, 556: 339, 566: 339, 568: 339, 624: 339, 339, 339, 339, 721: 339, 723: 339}, - {338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 53: 338, 55: 338, 453: 338, 338, 457: 338, 338, 338, 338, 462: 338, 469: 338, 473: 338, 556: 338, 566: 338, 568: 338, 624: 338, 338, 338, 338, 721: 338, 723: 338}, + {2: 430, 430, 430, 430, 430, 8: 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 58: 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430}, + {95: 4328, 97: 4327, 844: 4326}, + {2366, 2366, 2366, 2366, 7: 2366, 477: 2366}, + {1785, 1785, 1785, 1785, 1785, 7: 1785, 29: 1785, 57: 1785, 92: 1785, 1785, 1785, 1785, 1785, 1785, 462: 1785, 470: 1785, 477: 1785, 485: 1785}, + {1784, 1784, 1784, 1784, 1784, 7: 1784, 29: 1784, 57: 1784, 92: 1784, 1784, 1784, 1784, 1784, 1784, 462: 1784, 470: 1784, 477: 1784, 485: 1784}, // 1875 - {337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 53: 337, 55: 337, 453: 337, 337, 457: 337, 337, 337, 337, 462: 337, 469: 337, 473: 337, 556: 337, 566: 337, 568: 337, 624: 337, 337, 337, 337, 721: 337, 723: 337}, - {336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 53: 336, 55: 336, 453: 336, 336, 457: 336, 336, 336, 336, 462: 336, 469: 336, 473: 336, 556: 336, 566: 336, 568: 336, 624: 336, 336, 336, 336, 721: 336, 723: 336}, - {335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 53: 335, 55: 335, 453: 335, 335, 457: 335, 335, 335, 335, 462: 335, 469: 335, 473: 335, 556: 335, 566: 335, 568: 335, 624: 335, 335, 335, 335, 721: 335, 723: 335}, - {334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 53: 334, 55: 334, 453: 334, 334, 457: 334, 334, 334, 334, 462: 334, 469: 334, 473: 334, 556: 334, 566: 334, 568: 334, 624: 334, 334, 334, 334, 721: 334, 723: 334, 1252: 4425}, - {332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 53: 332, 453: 332, 332, 457: 332, 332, 332, 332, 462: 332, 469: 332, 473: 332, 556: 332, 566: 332, 568: 332, 624: 332, 332, 332, 332}, + {147: 4331, 464: 3979, 3978, 799: 4332, 921: 4330}, + {2368, 2368, 2368, 2368, 7: 2368, 477: 2368}, + {2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, 2236, 57: 2236, 460: 2236, 464: 2236, 2236, 2236, 2236, 469: 2236, 477: 2236, 480: 2236, 565: 2236, 573: 2236, 575: 2236, 631: 2236, 2236, 634: 2236, 2236}, + {147: 4333}, + {2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 2235, 57: 2235, 460: 2235, 464: 2235, 2235, 2235, 2235, 469: 2235, 477: 2235, 480: 2235, 565: 2235, 573: 2235, 575: 2235, 631: 2235, 2235, 634: 2235, 2235}, // 1880 - {265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 14: 3719, 53: 265, 453: 265, 3709, 457: 265, 265, 265, 265, 462: 265, 469: 265, 473: 265, 485: 3720, 524: 3716, 556: 265, 566: 265, 568: 265, 624: 265, 265, 265, 265, 629: 3718, 742: 4422, 754: 3717, 780: 4423}, - {265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 14: 3719, 53: 265, 453: 265, 3709, 457: 265, 265, 265, 265, 462: 265, 469: 265, 473: 265, 485: 3720, 524: 3716, 556: 265, 566: 265, 568: 265, 624: 265, 265, 265, 265, 629: 3718, 742: 4419, 754: 3717, 780: 4420}, - {454: 3709, 742: 4417}, - {454: 3709, 742: 4415}, - {278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 53: 278, 453: 278, 3709, 457: 278, 278, 278, 278, 462: 278, 469: 278, 473: 278, 556: 278, 566: 278, 568: 278, 624: 278, 278, 278, 278, 742: 3710, 765: 4414}, + {500: 4335, 658: 4336}, + {466: 4338}, + {466: 4337}, + {2382, 2382, 2382, 2382, 7: 2382, 477: 2382}, + {461: 4340, 463: 3135, 473: 4343, 4342, 480: 3126, 495: 3130, 559: 3125, 3127, 3129, 3128, 564: 3133, 568: 3134, 581: 3132, 701: 4341, 3131, 1113: 4339}, // 1885 - {454: 3709, 742: 4413}, - {323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 53: 323, 453: 323, 457: 323, 323, 323, 323, 462: 323, 469: 323, 473: 323, 556: 323, 566: 323, 568: 323, 624: 323, 323, 323, 323}, - {265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 14: 3719, 53: 265, 98: 4394, 4396, 101: 4395, 453: 265, 457: 265, 265, 265, 265, 462: 265, 469: 265, 473: 265, 485: 3720, 524: 3716, 556: 265, 566: 265, 568: 265, 624: 265, 265, 265, 265, 629: 3718, 754: 3717, 780: 4393, 857: 4412}, - {454: 4408}, - {454: 4398}, + {2384, 2384, 2384, 2384, 7: 2384, 477: 2384}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 4346}, + {2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 57: 2158, 460: 2158, 464: 2158, 2158, 2158, 2158, 469: 2158, 477: 2158, 480: 2158, 565: 2158, 573: 2158, 575: 2158, 631: 2158, 2158, 634: 2158, 2158}, + {495: 3317, 561: 3319, 3318, 808: 4345}, + {495: 3317, 561: 3319, 3318, 808: 4344}, // 1890 - {319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 53: 319, 453: 319, 457: 319, 319, 319, 319, 462: 319, 469: 319, 473: 319, 556: 319, 566: 319, 568: 319, 624: 319, 319, 319, 319}, - {265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 14: 3719, 53: 265, 98: 4394, 4396, 101: 4395, 453: 265, 457: 265, 265, 265, 265, 462: 265, 469: 265, 473: 265, 485: 4391, 524: 3716, 556: 265, 566: 265, 568: 265, 624: 265, 265, 265, 265, 629: 4390, 658: 4349, 4348, 670: 4392, 754: 3717, 780: 4393, 857: 4389, 1133: 4388}, - {316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 14: 316, 53: 316, 453: 316, 316, 457: 316, 316, 316, 316, 462: 316, 469: 316, 473: 316, 485: 316, 524: 316, 556: 316, 566: 316, 568: 316, 624: 316, 316, 316, 316, 629: 316, 823: 4387}, - {315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 14: 315, 53: 315, 453: 315, 315, 457: 315, 315, 315, 315, 462: 315, 469: 315, 473: 315, 485: 315, 524: 315, 556: 315, 566: 315, 568: 315, 624: 315, 315, 315, 315, 629: 315, 823: 4386}, - {314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 14: 314, 53: 314, 453: 314, 314, 457: 314, 314, 314, 314, 462: 314, 469: 314, 473: 314, 485: 314, 524: 314, 556: 314, 566: 314, 568: 314, 624: 314, 314, 314, 314, 629: 314, 658: 4384, 4383, 823: 4385}, + {2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 57: 2156, 460: 2156, 464: 2156, 2156, 2156, 2156, 469: 2156, 477: 2156, 480: 2156, 565: 2156, 573: 2156, 575: 2156, 631: 2156, 2156, 634: 2156, 2156}, + {2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 57: 2157, 460: 2157, 464: 2157, 2157, 2157, 2157, 469: 2157, 477: 2157, 480: 2157, 565: 2157, 573: 2157, 575: 2157, 631: 2157, 2157, 634: 2157, 2157}, + {57: 4347, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {2383, 2383, 2383, 2383, 7: 2383, 477: 2383}, + {2: 1811, 1811, 1811, 1811, 1811, 8: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 58: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 554: 4350, 767: 4349}, // 1895 - {485: 4378, 629: 4377, 658: 4380, 4379}, - {309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 14: 309, 53: 309, 98: 309, 309, 101: 309, 453: 309, 309, 457: 309, 309, 309, 309, 462: 309, 469: 309, 473: 309, 485: 309, 524: 309, 556: 309, 566: 309, 568: 309, 624: 309, 309, 309, 309, 629: 309}, - {308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 14: 308, 53: 308, 98: 308, 308, 101: 308, 453: 308, 308, 457: 308, 308, 308, 308, 462: 308, 469: 308, 473: 308, 485: 308, 524: 308, 556: 308, 566: 308, 568: 308, 624: 308, 308, 308, 308, 629: 308}, - {454: 305}, - {299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 53: 299, 55: 299, 453: 299, 299, 457: 299, 299, 299, 299, 462: 299, 469: 299, 473: 299, 556: 299, 566: 299, 568: 299, 624: 299, 299, 299, 299, 721: 299, 723: 299}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4033, 2670, 2671, 2669, 732: 4352}, + {572: 4351}, + {2: 1810, 1810, 1810, 1810, 1810, 8: 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 58: 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 1810, 463: 1810, 558: 1810}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4033, 2670, 2671, 2669, 732: 4354, 835: 4353}, + {2338, 2338, 2338, 2338, 7: 2338, 4611, 4612, 477: 2338, 916: 4610}, // 1900 - {298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 53: 298, 55: 298, 453: 298, 298, 457: 298, 298, 298, 298, 462: 298, 469: 298, 473: 298, 556: 298, 566: 298, 568: 298, 624: 298, 298, 298, 298, 721: 298, 723: 298}, - {297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 53: 297, 453: 297, 457: 297, 297, 297, 297, 462: 297, 469: 297, 473: 297, 556: 297, 566: 297, 568: 297, 624: 297, 297, 297, 297}, - {278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 53: 278, 453: 278, 3709, 457: 278, 278, 278, 278, 462: 278, 469: 278, 473: 278, 556: 278, 566: 278, 568: 278, 624: 278, 278, 278, 278, 742: 3710, 765: 4376}, - {295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 53: 295, 453: 295, 457: 295, 295, 295, 295, 462: 295, 469: 295, 473: 295, 556: 295, 566: 295, 568: 295, 624: 295, 295, 295, 295}, - {294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 53: 294, 453: 294, 457: 294, 294, 294, 294, 462: 294, 469: 294, 473: 294, 556: 294, 566: 294, 568: 294, 624: 294, 294, 294, 294}, + {10: 4356, 105: 4404, 109: 4405, 170: 4415, 4414, 4380, 174: 4395, 187: 4417, 213: 4416, 219: 4377, 296: 4384, 4376, 317: 4393, 344: 4400, 4399, 348: 4403, 382: 4411, 488: 4398, 500: 4394, 531: 4389, 636: 4397, 666: 4402, 4401, 669: 4378, 4383, 4381, 4374, 4368, 4382, 677: 4390, 679: 4375, 4407, 4369, 4370, 4371, 4372, 4373, 4396, 4409, 4413, 4408, 4367, 4412, 4379, 694: 4366, 4406, 4365, 4410, 888: 4385, 1136: 4387, 1158: 4364, 4391, 4361, 1178: 4359, 1192: 4362, 1194: 4363, 1213: 4360, 1230: 4386, 4357, 4388, 1287: 4358, 1299: 4392, 1302: 4355, 1327: 4418}, + {2199, 2199, 2199, 2199, 4498, 4504, 4492, 2199, 2199, 2199, 4496, 4505, 4503, 57: 2199, 460: 4497, 464: 3979, 3978, 4495, 2206, 469: 4502, 477: 2199, 480: 4491, 565: 2240, 573: 2329, 575: 4489, 631: 4494, 4487, 634: 4509, 4506, 799: 4490, 821: 4499, 897: 4501, 915: 4507, 924: 4500, 940: 4493, 987: 4508, 4609}, + {2199, 2199, 2199, 2199, 4498, 4504, 4492, 2199, 2199, 2199, 4496, 4505, 4503, 57: 2199, 460: 4497, 464: 3979, 3978, 4495, 2206, 469: 4502, 477: 2199, 480: 4491, 565: 2240, 573: 2329, 575: 4489, 631: 4494, 4487, 634: 4509, 4506, 799: 4490, 821: 4499, 897: 4501, 915: 4507, 924: 4500, 940: 4493, 987: 4508, 4488}, + {363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 57: 363, 460: 363, 464: 363, 363, 363, 363, 469: 363, 477: 363, 480: 363, 565: 363, 573: 363, 575: 363, 631: 363, 363, 634: 363, 363}, + {362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 57: 362, 460: 362, 464: 362, 362, 362, 362, 469: 362, 477: 362, 480: 362, 565: 362, 573: 362, 575: 362, 631: 362, 362, 634: 362, 362}, // 1905 - {292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 14: 292, 53: 292, 98: 292, 292, 101: 292, 453: 292, 457: 292, 292, 292, 292, 462: 292, 469: 292, 473: 292, 485: 292, 524: 292, 556: 292, 566: 292, 568: 292, 624: 292, 292, 292, 292, 629: 292}, - {278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 14: 278, 53: 278, 98: 278, 278, 101: 278, 453: 278, 3709, 457: 278, 278, 278, 278, 462: 278, 469: 278, 473: 278, 485: 278, 524: 278, 556: 278, 566: 278, 568: 278, 624: 278, 278, 278, 278, 629: 278, 742: 3710, 765: 4375}, - {290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 14: 290, 53: 290, 98: 290, 290, 101: 290, 453: 290, 457: 290, 290, 290, 290, 462: 290, 469: 290, 473: 290, 485: 290, 524: 290, 556: 290, 566: 290, 568: 290, 624: 290, 290, 290, 290, 629: 290}, - {289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 14: 289, 53: 289, 98: 289, 289, 101: 289, 453: 289, 457: 289, 289, 289, 289, 462: 289, 469: 289, 473: 289, 485: 289, 524: 289, 556: 289, 566: 289, 568: 289, 624: 289, 289, 289, 289, 629: 289}, - {284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 53: 284, 453: 284, 457: 284, 284, 284, 284, 462: 284, 469: 284, 473: 284, 556: 284, 566: 284, 568: 284, 624: 284, 284, 284, 284}, + {361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 57: 361, 460: 361, 464: 361, 361, 361, 361, 469: 361, 477: 361, 480: 361, 565: 361, 573: 361, 575: 361, 631: 361, 361, 634: 361, 361}, + {278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 57: 278, 60: 278, 460: 278, 3718, 464: 278, 278, 278, 278, 469: 278, 477: 278, 480: 278, 565: 278, 573: 278, 575: 278, 631: 278, 278, 634: 278, 278, 728: 278, 730: 278, 749: 3719, 775: 4485}, + {273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 57: 273, 60: 273, 460: 273, 464: 273, 273, 273, 273, 469: 273, 477: 273, 480: 273, 565: 273, 573: 273, 575: 273, 631: 273, 273, 634: 273, 273, 728: 273, 730: 273, 862: 4484}, + {271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 57: 271, 60: 271, 460: 271, 3705, 464: 271, 271, 271, 271, 469: 271, 477: 271, 480: 271, 565: 271, 573: 271, 575: 271, 631: 271, 271, 634: 271, 271, 728: 271, 730: 271, 749: 3706, 891: 4482, 896: 3707}, + {271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 57: 271, 60: 271, 460: 271, 3705, 464: 271, 271, 271, 271, 469: 271, 477: 271, 480: 271, 565: 271, 573: 271, 575: 271, 631: 271, 271, 634: 271, 271, 728: 271, 730: 271, 749: 3706, 891: 4480, 896: 3707}, // 1910 - {278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 53: 278, 453: 278, 3709, 457: 278, 278, 278, 278, 462: 278, 469: 278, 473: 278, 556: 278, 566: 278, 568: 278, 624: 278, 278, 278, 278, 742: 3710, 765: 4374}, - {278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 53: 278, 453: 278, 3709, 457: 278, 278, 278, 278, 462: 278, 469: 278, 473: 278, 556: 278, 566: 278, 568: 278, 624: 278, 278, 278, 278, 742: 3710, 765: 4373}, - {278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 53: 278, 453: 278, 3709, 457: 278, 278, 278, 278, 462: 278, 469: 278, 473: 278, 556: 278, 566: 278, 568: 278, 624: 278, 278, 278, 278, 742: 3710, 765: 4372}, - {278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 53: 278, 55: 278, 453: 278, 3709, 457: 278, 278, 278, 278, 462: 278, 469: 278, 473: 278, 556: 278, 566: 278, 568: 278, 624: 278, 278, 278, 278, 721: 278, 723: 278, 742: 3710, 765: 4366}, - {273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 53: 273, 55: 273, 453: 273, 457: 273, 273, 273, 273, 462: 273, 469: 273, 473: 273, 556: 273, 566: 273, 568: 273, 624: 273, 273, 273, 273, 721: 273, 723: 273, 850: 4367}, + {278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 57: 278, 460: 278, 3718, 464: 278, 278, 278, 278, 469: 278, 477: 278, 480: 278, 565: 278, 573: 278, 575: 278, 631: 278, 278, 634: 278, 278, 749: 3719, 775: 4479}, + {355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 57: 355, 60: 355, 460: 355, 355, 464: 355, 355, 355, 355, 469: 355, 477: 355, 480: 355, 565: 355, 573: 355, 575: 355, 631: 355, 355, 634: 355, 355, 728: 355, 730: 355}, + {354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 57: 354, 60: 354, 460: 354, 354, 464: 354, 354, 354, 354, 469: 354, 477: 354, 480: 354, 565: 354, 573: 354, 575: 354, 631: 354, 354, 634: 354, 354, 728: 354, 730: 354}, + {353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 57: 353, 60: 353, 460: 353, 353, 464: 353, 353, 353, 353, 469: 353, 477: 353, 480: 353, 565: 353, 573: 353, 575: 353, 631: 353, 353, 634: 353, 353, 728: 353, 730: 353}, + {352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 57: 352, 60: 352, 460: 352, 352, 464: 352, 352, 352, 352, 469: 352, 477: 352, 480: 352, 565: 352, 573: 352, 575: 352, 631: 352, 352, 634: 352, 352, 728: 352, 730: 352}, // 1915 - {280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 53: 280, 55: 4369, 453: 280, 457: 280, 280, 280, 280, 462: 280, 469: 280, 473: 280, 556: 280, 566: 280, 568: 280, 624: 280, 280, 280, 280, 721: 4368, 723: 4370, 849: 4371}, - {276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 53: 276, 55: 276, 453: 276, 457: 276, 276, 276, 276, 462: 276, 469: 276, 473: 276, 556: 276, 566: 276, 568: 276, 624: 276, 276, 276, 276, 721: 276, 723: 276}, - {275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 53: 275, 55: 275, 453: 275, 457: 275, 275, 275, 275, 462: 275, 469: 275, 473: 275, 556: 275, 566: 275, 568: 275, 624: 275, 275, 275, 275, 721: 275, 723: 275}, - {274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 53: 274, 55: 274, 453: 274, 457: 274, 274, 274, 274, 462: 274, 469: 274, 473: 274, 556: 274, 566: 274, 568: 274, 624: 274, 274, 274, 274, 721: 274, 723: 274}, - {272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 53: 272, 55: 272, 453: 272, 457: 272, 272, 272, 272, 462: 272, 469: 272, 473: 272, 556: 272, 566: 272, 568: 272, 624: 272, 272, 272, 272, 721: 272, 723: 272}, + {351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 57: 351, 60: 351, 460: 351, 351, 464: 351, 351, 351, 351, 469: 351, 477: 351, 480: 351, 565: 351, 573: 351, 575: 351, 631: 351, 351, 634: 351, 351, 728: 351, 730: 351}, + {350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 57: 350, 60: 350, 460: 350, 350, 464: 350, 350, 350, 350, 469: 350, 477: 350, 480: 350, 565: 350, 573: 350, 575: 350, 631: 350, 350, 634: 350, 350, 728: 350, 730: 350}, + {349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 57: 349, 60: 349, 460: 349, 349, 464: 349, 349, 349, 349, 469: 349, 477: 349, 480: 349, 565: 349, 573: 349, 575: 349, 631: 349, 349, 634: 349, 349, 728: 349, 730: 349}, + {348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 57: 348, 60: 348, 460: 348, 348, 464: 348, 348, 348, 348, 469: 348, 477: 348, 480: 348, 565: 348, 573: 348, 575: 348, 631: 348, 348, 634: 348, 348, 728: 348, 730: 348}, + {347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 57: 347, 60: 347, 460: 347, 347, 464: 347, 347, 347, 347, 469: 347, 477: 347, 480: 347, 565: 347, 573: 347, 575: 347, 631: 347, 347, 634: 347, 347, 728: 347, 730: 347}, // 1920 - {281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 53: 281, 453: 281, 457: 281, 281, 281, 281, 462: 281, 469: 281, 473: 281, 556: 281, 566: 281, 568: 281, 624: 281, 281, 281, 281}, - {282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 53: 282, 453: 282, 457: 282, 282, 282, 282, 462: 282, 469: 282, 473: 282, 556: 282, 566: 282, 568: 282, 624: 282, 282, 282, 282}, - {283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 53: 283, 453: 283, 457: 283, 283, 283, 283, 462: 283, 469: 283, 473: 283, 556: 283, 566: 283, 568: 283, 624: 283, 283, 283, 283}, - {291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 14: 291, 53: 291, 98: 291, 291, 101: 291, 453: 291, 457: 291, 291, 291, 291, 462: 291, 469: 291, 473: 291, 485: 291, 524: 291, 556: 291, 566: 291, 568: 291, 624: 291, 291, 291, 291, 629: 291}, - {296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 53: 296, 453: 296, 457: 296, 296, 296, 296, 462: 296, 469: 296, 473: 296, 556: 296, 566: 296, 568: 296, 624: 296, 296, 296, 296}, + {346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 57: 346, 60: 346, 460: 346, 346, 464: 346, 346, 346, 346, 469: 346, 477: 346, 480: 346, 565: 346, 573: 346, 575: 346, 631: 346, 346, 634: 346, 346, 728: 346, 730: 346}, + {345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 57: 345, 60: 345, 460: 345, 345, 464: 345, 345, 345, 345, 469: 345, 477: 345, 480: 345, 565: 345, 573: 345, 575: 345, 631: 345, 345, 634: 345, 345, 728: 345, 730: 345}, + {344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 57: 344, 60: 344, 460: 344, 464: 344, 344, 344, 344, 469: 344, 477: 344, 480: 344, 565: 344, 573: 344, 575: 344, 631: 344, 344, 634: 344, 344, 728: 344, 730: 344}, + {343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 57: 343, 60: 343, 460: 343, 464: 343, 343, 343, 343, 469: 343, 477: 343, 480: 343, 565: 343, 573: 343, 575: 343, 631: 343, 343, 634: 343, 343, 728: 343, 730: 343}, + {339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 57: 339, 60: 339, 460: 339, 339, 464: 339, 339, 339, 339, 469: 339, 477: 339, 480: 339, 565: 339, 573: 339, 575: 339, 631: 339, 339, 634: 339, 339, 728: 339, 730: 339}, // 1925 - {313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 14: 313, 53: 313, 453: 313, 313, 457: 313, 313, 313, 313, 462: 313, 469: 313, 473: 313, 485: 313, 524: 313, 556: 313, 566: 313, 568: 313, 624: 313, 313, 313, 313, 629: 313, 823: 4382}, - {312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 14: 312, 53: 312, 453: 312, 312, 457: 312, 312, 312, 312, 462: 312, 469: 312, 473: 312, 485: 312, 524: 312, 556: 312, 566: 312, 568: 312, 624: 312, 312, 312, 312, 629: 312, 823: 4381}, - {454: 307}, - {454: 306}, - {454: 301}, + {338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 57: 338, 60: 338, 460: 338, 338, 464: 338, 338, 338, 338, 469: 338, 477: 338, 480: 338, 565: 338, 573: 338, 575: 338, 631: 338, 338, 634: 338, 338, 728: 338, 730: 338}, + {337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 57: 337, 60: 337, 460: 337, 337, 464: 337, 337, 337, 337, 469: 337, 477: 337, 480: 337, 565: 337, 573: 337, 575: 337, 631: 337, 337, 634: 337, 337, 728: 337, 730: 337}, + {336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 57: 336, 60: 336, 460: 336, 336, 464: 336, 336, 336, 336, 469: 336, 477: 336, 480: 336, 565: 336, 573: 336, 575: 336, 631: 336, 336, 634: 336, 336, 728: 336, 730: 336}, + {335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 57: 335, 60: 335, 460: 335, 335, 464: 335, 335, 335, 335, 469: 335, 477: 335, 480: 335, 565: 335, 573: 335, 575: 335, 631: 335, 335, 634: 335, 335, 728: 335, 730: 335}, + {334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, 57: 334, 60: 334, 460: 334, 334, 464: 334, 334, 334, 334, 469: 334, 477: 334, 480: 334, 565: 334, 573: 334, 575: 334, 631: 334, 334, 634: 334, 334, 728: 334, 730: 334, 1254: 4478}, // 1930 - {454: 302}, - {454: 304}, - {454: 303}, - {454: 300}, - {310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 14: 310, 53: 310, 98: 310, 310, 101: 310, 453: 310, 310, 457: 310, 310, 310, 310, 462: 310, 469: 310, 473: 310, 485: 310, 524: 310, 556: 310, 566: 310, 568: 310, 624: 310, 310, 310, 310, 629: 310}, + {332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 57: 332, 460: 332, 332, 464: 332, 332, 332, 332, 469: 332, 477: 332, 480: 332, 565: 332, 573: 332, 575: 332, 631: 332, 332, 634: 332, 332}, + {265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 3728, 57: 265, 460: 265, 3718, 464: 265, 265, 265, 265, 469: 265, 477: 265, 480: 265, 488: 3729, 531: 3725, 565: 265, 573: 265, 575: 265, 631: 265, 265, 634: 265, 265, 3727, 749: 4475, 761: 3726, 789: 4476}, + {265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 3728, 57: 265, 460: 265, 3718, 464: 265, 265, 265, 265, 469: 265, 477: 265, 480: 265, 488: 3729, 531: 3725, 565: 265, 573: 265, 575: 265, 631: 265, 265, 634: 265, 265, 3727, 749: 4472, 761: 3726, 789: 4473}, + {461: 3718, 749: 4470}, + {461: 3718, 749: 4468}, // 1935 - {311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 14: 311, 53: 311, 98: 311, 311, 101: 311, 453: 311, 311, 457: 311, 311, 311, 311, 462: 311, 469: 311, 473: 311, 485: 311, 524: 311, 556: 311, 566: 311, 568: 311, 624: 311, 311, 311, 311, 629: 311}, - {265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 14: 3719, 53: 265, 98: 4394, 4396, 101: 4395, 453: 265, 457: 265, 265, 265, 265, 462: 265, 469: 265, 473: 265, 485: 3720, 524: 3716, 556: 265, 566: 265, 568: 265, 624: 265, 265, 265, 265, 629: 3718, 754: 3717, 780: 4393, 857: 4397}, - {317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 53: 317, 453: 317, 457: 317, 317, 317, 317, 462: 317, 469: 317, 473: 317, 556: 317, 566: 317, 568: 317, 624: 317, 317, 317, 317}, - {493: 3722, 823: 4387}, - {493: 3721, 823: 4386}, + {278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 57: 278, 460: 278, 3718, 464: 278, 278, 278, 278, 469: 278, 477: 278, 480: 278, 565: 278, 573: 278, 575: 278, 631: 278, 278, 634: 278, 278, 749: 3719, 775: 4467}, + {461: 3718, 749: 4466}, + {323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 57: 323, 460: 323, 464: 323, 323, 323, 323, 469: 323, 477: 323, 480: 323, 565: 323, 573: 323, 575: 323, 631: 323, 323, 634: 323, 323}, + {265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 3728, 57: 265, 101: 4447, 4449, 104: 4448, 460: 265, 464: 265, 265, 265, 265, 469: 265, 477: 265, 480: 265, 488: 3729, 531: 3725, 565: 265, 573: 265, 575: 265, 631: 265, 265, 634: 265, 265, 3727, 761: 3726, 789: 4446, 870: 4465}, + {461: 4461}, // 1940 - {293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 53: 293, 453: 293, 457: 293, 293, 293, 293, 462: 293, 469: 293, 473: 293, 556: 293, 566: 293, 568: 293, 624: 293, 293, 293, 293}, - {288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 53: 288, 453: 288, 457: 288, 288, 288, 288, 462: 288, 469: 288, 473: 288, 556: 288, 566: 288, 568: 288, 624: 288, 288, 288, 288}, - {287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 53: 287, 453: 287, 457: 287, 287, 287, 287, 462: 287, 469: 287, 473: 287, 556: 287, 566: 287, 568: 287, 624: 287, 287, 287, 287}, - {286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 53: 286, 453: 286, 457: 286, 286, 286, 286, 462: 286, 469: 286, 473: 286, 556: 286, 566: 286, 568: 286, 624: 286, 286, 286, 286}, - {285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 53: 285, 453: 285, 457: 285, 285, 285, 285, 462: 285, 469: 285, 473: 285, 556: 285, 566: 285, 568: 285, 624: 285, 285, 285, 285}, + {461: 4451}, + {319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 57: 319, 460: 319, 464: 319, 319, 319, 319, 469: 319, 477: 319, 480: 319, 565: 319, 573: 319, 575: 319, 631: 319, 319, 634: 319, 319}, + {265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 3728, 57: 265, 101: 4447, 4449, 104: 4448, 460: 265, 464: 265, 265, 265, 265, 469: 265, 477: 265, 480: 265, 488: 4444, 531: 3725, 565: 265, 573: 265, 575: 265, 631: 265, 265, 634: 265, 265, 4443, 666: 4402, 4401, 677: 4445, 761: 3726, 789: 4446, 870: 4442, 1136: 4441}, + {316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 57: 316, 460: 316, 316, 464: 316, 316, 316, 316, 469: 316, 477: 316, 480: 316, 488: 316, 531: 316, 565: 316, 573: 316, 575: 316, 631: 316, 316, 634: 316, 316, 316, 832: 4440}, + {315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 57: 315, 460: 315, 315, 464: 315, 315, 315, 315, 469: 315, 477: 315, 480: 315, 488: 315, 531: 315, 565: 315, 573: 315, 575: 315, 631: 315, 315, 634: 315, 315, 315, 832: 4439}, // 1945 - {318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 53: 318, 453: 318, 457: 318, 318, 318, 318, 462: 318, 469: 318, 473: 318, 556: 318, 566: 318, 568: 318, 624: 318, 318, 318, 318}, - {456: 4400, 555: 4401, 559: 4402, 950: 4403, 1126: 4399}, - {7: 4405, 53: 4404}, - {7: 253, 53: 253}, - {7: 252, 53: 252}, + {314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 57: 314, 460: 314, 314, 464: 314, 314, 314, 314, 469: 314, 477: 314, 480: 314, 488: 314, 531: 314, 565: 314, 573: 314, 575: 314, 631: 314, 314, 634: 314, 314, 314, 666: 4437, 4436, 832: 4438}, + {488: 4431, 636: 4430, 666: 4433, 4432}, + {309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 57: 309, 101: 309, 309, 104: 309, 460: 309, 309, 464: 309, 309, 309, 309, 469: 309, 477: 309, 480: 309, 488: 309, 531: 309, 565: 309, 573: 309, 575: 309, 631: 309, 309, 634: 309, 309, 309}, + {308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 57: 308, 101: 308, 308, 104: 308, 460: 308, 308, 464: 308, 308, 308, 308, 469: 308, 477: 308, 480: 308, 488: 308, 531: 308, 565: 308, 573: 308, 575: 308, 631: 308, 308, 634: 308, 308, 308}, + {461: 305}, // 1950 - {7: 251, 53: 251}, - {7: 250, 53: 250}, - {265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 14: 3719, 53: 265, 98: 4394, 4396, 101: 4395, 453: 265, 457: 265, 265, 265, 265, 462: 265, 469: 265, 473: 265, 485: 3720, 524: 3716, 556: 265, 566: 265, 568: 265, 624: 265, 265, 265, 265, 629: 3718, 754: 3717, 780: 4393, 857: 4407}, - {456: 4400, 555: 4401, 559: 4402, 950: 4406}, - {7: 249, 53: 249}, + {299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 57: 299, 60: 299, 460: 299, 299, 464: 299, 299, 299, 299, 469: 299, 477: 299, 480: 299, 565: 299, 573: 299, 575: 299, 631: 299, 299, 634: 299, 299, 728: 299, 730: 299}, + {298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 57: 298, 60: 298, 460: 298, 298, 464: 298, 298, 298, 298, 469: 298, 477: 298, 480: 298, 565: 298, 573: 298, 575: 298, 631: 298, 298, 634: 298, 298, 728: 298, 730: 298}, + {297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 57: 297, 460: 297, 464: 297, 297, 297, 297, 469: 297, 477: 297, 480: 297, 565: 297, 573: 297, 575: 297, 631: 297, 297, 634: 297, 297}, + {278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 57: 278, 460: 278, 3718, 464: 278, 278, 278, 278, 469: 278, 477: 278, 480: 278, 565: 278, 573: 278, 575: 278, 631: 278, 278, 634: 278, 278, 749: 3719, 775: 4429}, + {295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 57: 295, 460: 295, 464: 295, 295, 295, 295, 469: 295, 477: 295, 480: 295, 565: 295, 573: 295, 575: 295, 631: 295, 295, 634: 295, 295}, // 1955 - {320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 53: 320, 453: 320, 457: 320, 320, 320, 320, 462: 320, 469: 320, 473: 320, 556: 320, 566: 320, 568: 320, 624: 320, 320, 320, 320}, - {456: 4400, 555: 4401, 559: 4402, 950: 4403, 1126: 4409}, - {7: 4405, 53: 4410}, - {265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 14: 3719, 53: 265, 98: 4394, 4396, 101: 4395, 453: 265, 457: 265, 265, 265, 265, 462: 265, 469: 265, 473: 265, 485: 3720, 524: 3716, 556: 265, 566: 265, 568: 265, 624: 265, 265, 265, 265, 629: 3718, 754: 3717, 780: 4393, 857: 4411}, - {321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 53: 321, 453: 321, 457: 321, 321, 321, 321, 462: 321, 469: 321, 473: 321, 556: 321, 566: 321, 568: 321, 624: 321, 321, 321, 321}, + {294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 294, 57: 294, 460: 294, 464: 294, 294, 294, 294, 469: 294, 477: 294, 480: 294, 565: 294, 573: 294, 575: 294, 631: 294, 294, 634: 294, 294}, + {292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 57: 292, 101: 292, 292, 104: 292, 460: 292, 464: 292, 292, 292, 292, 469: 292, 477: 292, 480: 292, 488: 292, 531: 292, 565: 292, 573: 292, 575: 292, 631: 292, 292, 634: 292, 292, 292}, + {278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 57: 278, 101: 278, 278, 104: 278, 460: 278, 3718, 464: 278, 278, 278, 278, 469: 278, 477: 278, 480: 278, 488: 278, 531: 278, 565: 278, 573: 278, 575: 278, 631: 278, 278, 634: 278, 278, 278, 749: 3719, 775: 4428}, + {290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 57: 290, 101: 290, 290, 104: 290, 460: 290, 464: 290, 290, 290, 290, 469: 290, 477: 290, 480: 290, 488: 290, 531: 290, 565: 290, 573: 290, 575: 290, 631: 290, 290, 634: 290, 290, 290}, + {289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 57: 289, 101: 289, 289, 104: 289, 460: 289, 464: 289, 289, 289, 289, 469: 289, 477: 289, 480: 289, 488: 289, 531: 289, 565: 289, 573: 289, 575: 289, 631: 289, 289, 634: 289, 289, 289}, // 1960 - {322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 53: 322, 453: 322, 457: 322, 322, 322, 322, 462: 322, 469: 322, 473: 322, 556: 322, 566: 322, 568: 322, 624: 322, 322, 322, 322}, - {324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 53: 324, 453: 324, 457: 324, 324, 324, 324, 462: 324, 469: 324, 473: 324, 556: 324, 566: 324, 568: 324, 624: 324, 324, 324, 324}, - {325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 53: 325, 453: 325, 457: 325, 325, 325, 325, 462: 325, 469: 325, 473: 325, 556: 325, 566: 325, 568: 325, 624: 325, 325, 325, 325}, - {265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 14: 3719, 53: 265, 453: 265, 457: 265, 265, 265, 265, 462: 265, 469: 265, 473: 265, 485: 3720, 524: 3716, 556: 265, 566: 265, 568: 265, 624: 265, 265, 265, 265, 629: 3718, 754: 3717, 780: 4416}, - {326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 53: 326, 453: 326, 457: 326, 326, 326, 326, 462: 326, 469: 326, 473: 326, 556: 326, 566: 326, 568: 326, 624: 326, 326, 326, 326}, + {284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 57: 284, 460: 284, 464: 284, 284, 284, 284, 469: 284, 477: 284, 480: 284, 565: 284, 573: 284, 575: 284, 631: 284, 284, 634: 284, 284}, + {278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 57: 278, 460: 278, 3718, 464: 278, 278, 278, 278, 469: 278, 477: 278, 480: 278, 565: 278, 573: 278, 575: 278, 631: 278, 278, 634: 278, 278, 749: 3719, 775: 4427}, + {278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 57: 278, 460: 278, 3718, 464: 278, 278, 278, 278, 469: 278, 477: 278, 480: 278, 565: 278, 573: 278, 575: 278, 631: 278, 278, 634: 278, 278, 749: 3719, 775: 4426}, + {278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 57: 278, 460: 278, 3718, 464: 278, 278, 278, 278, 469: 278, 477: 278, 480: 278, 565: 278, 573: 278, 575: 278, 631: 278, 278, 634: 278, 278, 749: 3719, 775: 4425}, + {278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 57: 278, 60: 278, 460: 278, 3718, 464: 278, 278, 278, 278, 469: 278, 477: 278, 480: 278, 565: 278, 573: 278, 575: 278, 631: 278, 278, 634: 278, 278, 728: 278, 730: 278, 749: 3719, 775: 4419}, // 1965 - {265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 14: 3719, 53: 265, 453: 265, 457: 265, 265, 265, 265, 462: 265, 469: 265, 473: 265, 485: 3720, 524: 3716, 556: 265, 566: 265, 568: 265, 624: 265, 265, 265, 265, 629: 3718, 754: 3717, 780: 4418}, - {327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 53: 327, 453: 327, 457: 327, 327, 327, 327, 462: 327, 469: 327, 473: 327, 556: 327, 566: 327, 568: 327, 624: 327, 327, 327, 327}, - {265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 14: 3719, 53: 265, 453: 265, 457: 265, 265, 265, 265, 462: 265, 469: 265, 473: 265, 485: 3720, 524: 3716, 556: 265, 566: 265, 568: 265, 624: 265, 265, 265, 265, 629: 3718, 754: 3717, 780: 4421}, - {328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 53: 328, 453: 328, 457: 328, 328, 328, 328, 462: 328, 469: 328, 473: 328, 556: 328, 566: 328, 568: 328, 624: 328, 328, 328, 328}, - {329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 53: 329, 453: 329, 457: 329, 329, 329, 329, 462: 329, 469: 329, 473: 329, 556: 329, 566: 329, 568: 329, 624: 329, 329, 329, 329}, + {273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 57: 273, 60: 273, 460: 273, 464: 273, 273, 273, 273, 469: 273, 477: 273, 480: 273, 565: 273, 573: 273, 575: 273, 631: 273, 273, 634: 273, 273, 728: 273, 730: 273, 862: 4420}, + {280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 57: 280, 60: 4422, 460: 280, 464: 280, 280, 280, 280, 469: 280, 477: 280, 480: 280, 565: 280, 573: 280, 575: 280, 631: 280, 280, 634: 280, 280, 728: 4421, 730: 4423, 861: 4424}, + {276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 57: 276, 60: 276, 460: 276, 464: 276, 276, 276, 276, 469: 276, 477: 276, 480: 276, 565: 276, 573: 276, 575: 276, 631: 276, 276, 634: 276, 276, 728: 276, 730: 276}, + {275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, 57: 275, 60: 275, 460: 275, 464: 275, 275, 275, 275, 469: 275, 477: 275, 480: 275, 565: 275, 573: 275, 575: 275, 631: 275, 275, 634: 275, 275, 728: 275, 730: 275}, + {274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 57: 274, 60: 274, 460: 274, 464: 274, 274, 274, 274, 469: 274, 477: 274, 480: 274, 565: 274, 573: 274, 575: 274, 631: 274, 274, 634: 274, 274, 728: 274, 730: 274}, // 1970 - {265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 14: 3719, 53: 265, 453: 265, 457: 265, 265, 265, 265, 462: 265, 469: 265, 473: 265, 485: 3720, 524: 3716, 556: 265, 566: 265, 568: 265, 624: 265, 265, 265, 265, 629: 3718, 754: 3717, 780: 4424}, - {330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 53: 330, 453: 330, 457: 330, 330, 330, 330, 462: 330, 469: 330, 473: 330, 556: 330, 566: 330, 568: 330, 624: 330, 330, 330, 330}, - {331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 53: 331, 453: 331, 457: 331, 331, 331, 331, 462: 331, 469: 331, 473: 331, 556: 331, 566: 331, 568: 331, 624: 331, 331, 331, 331}, - {333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 53: 333, 55: 333, 453: 333, 333, 457: 333, 333, 333, 333, 462: 333, 469: 333, 473: 333, 556: 333, 566: 333, 568: 333, 624: 333, 333, 333, 333, 721: 333, 723: 333}, - {356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 53: 356, 453: 356, 457: 356, 356, 356, 356, 462: 356, 469: 356, 473: 356, 556: 356, 566: 356, 568: 356, 624: 356, 356, 356, 356}, + {272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 57: 272, 60: 272, 460: 272, 464: 272, 272, 272, 272, 469: 272, 477: 272, 480: 272, 565: 272, 573: 272, 575: 272, 631: 272, 272, 634: 272, 272, 728: 272, 730: 272}, + {281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 57: 281, 460: 281, 464: 281, 281, 281, 281, 469: 281, 477: 281, 480: 281, 565: 281, 573: 281, 575: 281, 631: 281, 281, 634: 281, 281}, + {282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 57: 282, 460: 282, 464: 282, 282, 282, 282, 469: 282, 477: 282, 480: 282, 565: 282, 573: 282, 575: 282, 631: 282, 282, 634: 282, 282}, + {283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 57: 283, 460: 283, 464: 283, 283, 283, 283, 469: 283, 477: 283, 480: 283, 565: 283, 573: 283, 575: 283, 631: 283, 283, 634: 283, 283}, + {291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 57: 291, 101: 291, 291, 104: 291, 460: 291, 464: 291, 291, 291, 291, 469: 291, 477: 291, 480: 291, 488: 291, 531: 291, 565: 291, 573: 291, 575: 291, 631: 291, 291, 634: 291, 291, 291}, // 1975 - {273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 53: 273, 55: 273, 453: 273, 457: 273, 273, 273, 273, 462: 273, 469: 273, 473: 273, 556: 273, 566: 273, 568: 273, 624: 273, 273, 273, 273, 721: 273, 723: 273, 850: 4428}, - {357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 53: 357, 55: 4369, 453: 357, 457: 357, 357, 357, 357, 462: 357, 469: 357, 473: 357, 556: 357, 566: 357, 568: 357, 624: 357, 357, 357, 357, 721: 4368, 723: 4370, 849: 4371}, - {273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 53: 273, 55: 273, 453: 273, 457: 273, 273, 273, 273, 462: 273, 469: 273, 473: 273, 556: 273, 566: 273, 568: 273, 624: 273, 273, 273, 273, 721: 273, 723: 273, 850: 4430}, - {358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 53: 358, 55: 4369, 453: 358, 457: 358, 358, 358, 358, 462: 358, 469: 358, 473: 358, 556: 358, 566: 358, 568: 358, 624: 358, 358, 358, 358, 721: 4368, 723: 4370, 849: 4371}, - {359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 53: 359, 55: 4369, 453: 359, 457: 359, 359, 359, 359, 462: 359, 469: 359, 473: 359, 556: 359, 566: 359, 568: 359, 624: 359, 359, 359, 359, 721: 4368, 723: 4370, 849: 4371}, + {296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 296, 57: 296, 460: 296, 464: 296, 296, 296, 296, 469: 296, 477: 296, 480: 296, 565: 296, 573: 296, 575: 296, 631: 296, 296, 634: 296, 296}, + {313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 57: 313, 460: 313, 313, 464: 313, 313, 313, 313, 469: 313, 477: 313, 480: 313, 488: 313, 531: 313, 565: 313, 573: 313, 575: 313, 631: 313, 313, 634: 313, 313, 313, 832: 4435}, + {312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, 57: 312, 460: 312, 312, 464: 312, 312, 312, 312, 469: 312, 477: 312, 480: 312, 488: 312, 531: 312, 565: 312, 573: 312, 575: 312, 631: 312, 312, 634: 312, 312, 312, 832: 4434}, + {461: 307}, + {461: 306}, // 1980 - {273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 53: 273, 55: 273, 453: 273, 457: 273, 273, 273, 273, 462: 273, 469: 273, 473: 273, 556: 273, 566: 273, 568: 273, 624: 273, 273, 273, 273, 721: 273, 723: 273, 850: 4433}, - {360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 53: 360, 55: 4369, 453: 360, 457: 360, 360, 360, 360, 462: 360, 469: 360, 473: 360, 556: 360, 566: 360, 568: 360, 624: 360, 360, 360, 360, 721: 4368, 723: 4370, 849: 4371}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 556: 2310, 566: 2310, 568: 2310, 624: 2310, 630: 2310, 640: 4562, 2668, 2669, 2667, 656: 2310, 2310, 1119: 4561}, - {2246, 2246, 2246, 2246, 7: 2246, 2246, 2246, 53: 2246, 469: 2246}, - {556: 2223}, + {461: 301}, + {461: 302}, + {461: 304}, + {461: 303}, + {461: 300}, // 1985 - {473: 4560}, - {2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 53: 2213, 453: 2213, 457: 2213, 2213, 2213, 2213, 462: 2213, 469: 2213, 473: 2213, 556: 2213, 566: 2213, 568: 2213, 624: 2213, 2213, 2213, 2213}, - {2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 53: 2212, 453: 2212, 457: 2212, 2212, 2212, 2212, 462: 2212, 469: 2212, 473: 2212, 556: 2212, 566: 2212, 568: 2212, 624: 2212, 2212, 2212, 2212}, - {556: 4556}, - {2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 53: 2209, 453: 2209, 457: 2209, 2209, 2209, 2209, 462: 2209, 469: 2209, 473: 2209, 556: 4555, 566: 2209, 568: 2209, 624: 2209, 2209, 2209, 2209}, + {310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 310, 57: 310, 101: 310, 310, 104: 310, 460: 310, 310, 464: 310, 310, 310, 310, 469: 310, 477: 310, 480: 310, 488: 310, 531: 310, 565: 310, 573: 310, 575: 310, 631: 310, 310, 634: 310, 310, 310}, + {311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 57: 311, 101: 311, 311, 104: 311, 460: 311, 311, 464: 311, 311, 311, 311, 469: 311, 477: 311, 480: 311, 488: 311, 531: 311, 565: 311, 573: 311, 575: 311, 631: 311, 311, 634: 311, 311, 311}, + {265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 3728, 57: 265, 101: 4447, 4449, 104: 4448, 460: 265, 464: 265, 265, 265, 265, 469: 265, 477: 265, 480: 265, 488: 3729, 531: 3725, 565: 265, 573: 265, 575: 265, 631: 265, 265, 634: 265, 265, 3727, 761: 3726, 789: 4446, 870: 4450}, + {317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 57: 317, 460: 317, 464: 317, 317, 317, 317, 469: 317, 477: 317, 480: 317, 565: 317, 573: 317, 575: 317, 631: 317, 317, 634: 317, 317}, + {500: 3731, 832: 4440}, // 1990 - {249: 4548, 342: 4549, 456: 3126, 466: 4552, 4551, 473: 3117, 488: 3121, 552: 3116, 3118, 555: 3124, 559: 3125, 3120, 3119, 570: 4537, 4534, 4535, 4536, 3123, 693: 4550, 3122, 4547, 1055: 4532, 4533, 4545, 1110: 4546, 1177: 4544}, - {459: 4542}, - {635: 4530}, - {456: 4529}, - {566: 4518}, + {500: 3730, 832: 4439}, + {293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 57: 293, 460: 293, 464: 293, 293, 293, 293, 469: 293, 477: 293, 480: 293, 565: 293, 573: 293, 575: 293, 631: 293, 293, 634: 293, 293}, + {288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 57: 288, 460: 288, 464: 288, 288, 288, 288, 469: 288, 477: 288, 480: 288, 565: 288, 573: 288, 575: 288, 631: 288, 288, 634: 288, 288}, + {287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 57: 287, 460: 287, 464: 287, 287, 287, 287, 469: 287, 477: 287, 480: 287, 565: 287, 573: 287, 575: 287, 631: 287, 287, 634: 287, 287}, + {286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 57: 286, 460: 286, 464: 286, 286, 286, 286, 469: 286, 477: 286, 480: 286, 565: 286, 573: 286, 575: 286, 631: 286, 286, 634: 286, 286}, // 1995 - {460: 4511}, - {2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 53: 2201, 453: 2201, 457: 2201, 2201, 2201, 2201, 462: 2201, 469: 2201, 473: 2201, 556: 2201, 566: 2201, 568: 2201, 624: 2201, 2201, 2201, 2201}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 524: 3374, 640: 3376, 2668, 2669, 2667, 720: 3373, 847: 4510}, - {168: 4508, 188: 4509, 459: 4507, 1162: 4506}, - {172: 4505, 230: 4504, 459: 4503, 1281: 4502}, + {285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 57: 285, 460: 285, 464: 285, 285, 285, 285, 469: 285, 477: 285, 480: 285, 565: 285, 573: 285, 575: 285, 631: 285, 285, 634: 285, 285}, + {318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 57: 318, 460: 318, 464: 318, 318, 318, 318, 469: 318, 477: 318, 480: 318, 565: 318, 573: 318, 575: 318, 631: 318, 318, 634: 318, 318}, + {463: 4453, 564: 4454, 568: 4455, 954: 4456, 1130: 4452}, + {7: 4458, 57: 4457}, + {7: 253, 57: 253}, // 2000 - {278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 53: 278, 453: 278, 3709, 457: 278, 278, 278, 278, 462: 278, 469: 278, 473: 278, 556: 278, 566: 278, 568: 278, 624: 278, 278, 278, 278, 742: 3710, 765: 4501}, - {287: 4500}, - {2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 53: 2185, 453: 2185, 457: 2185, 2185, 2185, 2185, 462: 2185, 469: 2185, 473: 2185, 556: 2185, 566: 2185, 568: 2185, 624: 2185, 2185, 2185, 2185}, - {2182, 2182, 2182, 2182, 4445, 4451, 4439, 2182, 2182, 2182, 4443, 4452, 4450, 53: 2182, 453: 4444, 457: 3969, 3968, 4442, 2190, 462: 4449, 469: 2182, 473: 4438, 556: 2224, 566: 2311, 568: 4436, 624: 4441, 4434, 4456, 4453, 791: 4437, 813: 4446, 891: 4448, 910: 4499, 919: 4447, 936: 4440}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 4457}, + {7: 252, 57: 252}, + {7: 251, 57: 251}, + {7: 250, 57: 250}, + {265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 3728, 57: 265, 101: 4447, 4449, 104: 4448, 460: 265, 464: 265, 265, 265, 265, 469: 265, 477: 265, 480: 265, 488: 3729, 531: 3725, 565: 265, 573: 265, 575: 265, 631: 265, 265, 634: 265, 265, 3727, 761: 3726, 789: 4446, 870: 4460}, + {463: 4453, 564: 4454, 568: 4455, 954: 4459}, // 2005 - {2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 2130, 53: 2130, 453: 2130, 4459, 457: 2130, 2130, 2130, 2130, 462: 2130, 469: 2130, 473: 2130, 556: 2130, 566: 2130, 568: 2130, 624: 2130, 2130, 2130, 2130, 631: 2130, 1207: 4458}, - {2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 53: 2172, 453: 2172, 457: 2172, 2172, 2172, 2172, 462: 2172, 469: 2172, 473: 2172, 556: 2172, 566: 2172, 568: 2172, 624: 2172, 2172, 2172, 2172, 631: 4474, 1224: 4475, 4476}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 454: 4463, 640: 4023, 2668, 2669, 2667, 724: 4462, 806: 4461, 816: 4460}, - {7: 4472, 53: 4471}, - {7: 2128, 53: 2128}, + {7: 249, 57: 249}, + {320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 57: 320, 460: 320, 464: 320, 320, 320, 320, 469: 320, 477: 320, 480: 320, 565: 320, 573: 320, 575: 320, 631: 320, 320, 634: 320, 320}, + {463: 4453, 564: 4454, 568: 4455, 954: 4456, 1130: 4462}, + {7: 4458, 57: 4463}, + {265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 3728, 57: 265, 101: 4447, 4449, 104: 4448, 460: 265, 464: 265, 265, 265, 265, 469: 265, 477: 265, 480: 265, 488: 3729, 531: 3725, 565: 265, 573: 265, 575: 265, 631: 265, 265, 634: 265, 265, 3727, 761: 3726, 789: 4446, 870: 4464}, // 2010 - {7: 278, 53: 278, 454: 3709, 510: 278, 278, 742: 3710, 765: 4469}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 4464}, - {53: 4465, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {7: 1256, 53: 1256, 510: 4468, 4467, 928: 4466}, - {7: 2125, 53: 2125}, + {321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 57: 321, 460: 321, 464: 321, 321, 321, 321, 469: 321, 477: 321, 480: 321, 565: 321, 573: 321, 575: 321, 631: 321, 321, 634: 321, 321}, + {322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 322, 57: 322, 460: 322, 464: 322, 322, 322, 322, 469: 322, 477: 322, 480: 322, 565: 322, 573: 322, 575: 322, 631: 322, 322, 634: 322, 322}, + {324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 57: 324, 460: 324, 464: 324, 324, 324, 324, 469: 324, 477: 324, 480: 324, 565: 324, 573: 324, 575: 324, 631: 324, 324, 634: 324, 324}, + {325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, 57: 325, 460: 325, 464: 325, 325, 325, 325, 469: 325, 477: 325, 480: 325, 565: 325, 573: 325, 575: 325, 631: 325, 325, 634: 325, 325}, + {265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 3728, 57: 265, 460: 265, 464: 265, 265, 265, 265, 469: 265, 477: 265, 480: 265, 488: 3729, 531: 3725, 565: 265, 573: 265, 575: 265, 631: 265, 265, 634: 265, 265, 3727, 761: 3726, 789: 4469}, // 2015 - {1255, 1255, 1255, 1255, 7: 1255, 53: 1255, 469: 1255}, - {1254, 1254, 1254, 1254, 7: 1254, 53: 1254, 469: 1254}, - {7: 1256, 53: 1256, 510: 4468, 4467, 928: 4470}, - {7: 2126, 53: 2126}, - {2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 53: 2129, 453: 2129, 457: 2129, 2129, 2129, 2129, 462: 2129, 469: 2129, 473: 2129, 556: 2129, 566: 2129, 568: 2129, 624: 2129, 2129, 2129, 2129, 631: 2129}, + {326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 57: 326, 460: 326, 464: 326, 326, 326, 326, 469: 326, 477: 326, 480: 326, 565: 326, 573: 326, 575: 326, 631: 326, 326, 634: 326, 326}, + {265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 3728, 57: 265, 460: 265, 464: 265, 265, 265, 265, 469: 265, 477: 265, 480: 265, 488: 3729, 531: 3725, 565: 265, 573: 265, 575: 265, 631: 265, 265, 634: 265, 265, 3727, 761: 3726, 789: 4471}, + {327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 57: 327, 460: 327, 464: 327, 327, 327, 327, 469: 327, 477: 327, 480: 327, 565: 327, 573: 327, 575: 327, 631: 327, 327, 634: 327, 327}, + {265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 3728, 57: 265, 460: 265, 464: 265, 265, 265, 265, 469: 265, 477: 265, 480: 265, 488: 3729, 531: 3725, 565: 265, 573: 265, 575: 265, 631: 265, 265, 634: 265, 265, 3727, 761: 3726, 789: 4474}, + {328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 57: 328, 460: 328, 464: 328, 328, 328, 328, 469: 328, 477: 328, 480: 328, 565: 328, 573: 328, 575: 328, 631: 328, 328, 634: 328, 328}, // 2020 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 454: 4463, 640: 4023, 2668, 2669, 2667, 724: 4462, 806: 4473}, - {7: 2127, 53: 2127}, - {192: 4496, 349: 4497, 366: 4498}, - {2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 53: 2171, 453: 2171, 457: 2171, 2171, 2171, 2171, 462: 2171, 469: 2171, 473: 2171, 556: 2171, 566: 2171, 568: 2171, 624: 2171, 2171, 2171, 2171}, - {2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 2167, 53: 2167, 453: 4478, 457: 2167, 2167, 2167, 2167, 462: 2167, 469: 2167, 473: 2167, 556: 2167, 566: 2167, 568: 2167, 624: 2167, 2167, 2167, 2167, 1064: 4479, 4480, 1231: 4477}, + {329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, 57: 329, 460: 329, 464: 329, 329, 329, 329, 469: 329, 477: 329, 480: 329, 565: 329, 573: 329, 575: 329, 631: 329, 329, 634: 329, 329}, + {265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 3728, 57: 265, 460: 265, 464: 265, 265, 265, 265, 469: 265, 477: 265, 480: 265, 488: 3729, 531: 3725, 565: 265, 573: 265, 575: 265, 631: 265, 265, 634: 265, 265, 3727, 761: 3726, 789: 4477}, + {330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 57: 330, 460: 330, 464: 330, 330, 330, 330, 469: 330, 477: 330, 480: 330, 565: 330, 573: 330, 575: 330, 631: 330, 330, 634: 330, 330}, + {331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 57: 331, 460: 331, 464: 331, 331, 331, 331, 469: 331, 477: 331, 480: 331, 565: 331, 573: 331, 575: 331, 631: 331, 331, 634: 331, 331}, + {333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, 57: 333, 60: 333, 460: 333, 333, 464: 333, 333, 333, 333, 469: 333, 477: 333, 480: 333, 565: 333, 573: 333, 575: 333, 631: 333, 333, 634: 333, 333, 728: 333, 730: 333}, // 2025 - {2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 53: 2170, 453: 2170, 457: 2170, 2170, 2170, 2170, 462: 2170, 469: 2170, 473: 2170, 556: 2170, 566: 2170, 568: 2170, 624: 2170, 2170, 2170, 2170}, - {635: 4494, 726: 4483}, - {2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 2166, 53: 2166, 453: 4492, 457: 2166, 2166, 2166, 2166, 462: 2166, 469: 2166, 473: 2166, 556: 2166, 566: 2166, 568: 2166, 624: 2166, 2166, 2166, 2166, 1065: 4493}, - {2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 2165, 53: 2165, 453: 4481, 457: 2165, 2165, 2165, 2165, 462: 2165, 469: 2165, 473: 2165, 556: 2165, 566: 2165, 568: 2165, 624: 2165, 2165, 2165, 2165, 1064: 4482}, - {726: 4483}, + {356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 57: 356, 460: 356, 464: 356, 356, 356, 356, 469: 356, 477: 356, 480: 356, 565: 356, 573: 356, 575: 356, 631: 356, 356, 634: 356, 356}, + {273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 57: 273, 60: 273, 460: 273, 464: 273, 273, 273, 273, 469: 273, 477: 273, 480: 273, 565: 273, 573: 273, 575: 273, 631: 273, 273, 634: 273, 273, 728: 273, 730: 273, 862: 4481}, + {357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 57: 357, 60: 4422, 460: 357, 464: 357, 357, 357, 357, 469: 357, 477: 357, 480: 357, 565: 357, 573: 357, 575: 357, 631: 357, 357, 634: 357, 357, 728: 4421, 730: 4423, 861: 4424}, + {273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 57: 273, 60: 273, 460: 273, 464: 273, 273, 273, 273, 469: 273, 477: 273, 480: 273, 565: 273, 573: 273, 575: 273, 631: 273, 273, 634: 273, 273, 728: 273, 730: 273, 862: 4483}, + {358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 57: 358, 60: 4422, 460: 358, 464: 358, 358, 358, 358, 469: 358, 477: 358, 480: 358, 565: 358, 573: 358, 575: 358, 631: 358, 358, 634: 358, 358, 728: 4421, 730: 4423, 861: 4424}, // 2030 - {2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163, 53: 2163, 453: 2163, 457: 2163, 2163, 2163, 2163, 462: 2163, 469: 2163, 473: 2163, 556: 2163, 566: 2163, 568: 2163, 624: 2163, 2163, 2163, 2163}, - {76: 4488, 493: 4487, 651: 4486, 653: 4485, 1088: 4484}, - {2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 53: 2169, 453: 2169, 457: 2169, 2169, 2169, 2169, 462: 2169, 469: 2169, 473: 2169, 556: 2169, 566: 2169, 568: 2169, 624: 2169, 2169, 2169, 2169}, - {2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162, 53: 2162, 453: 2162, 457: 2162, 2162, 2162, 2162, 462: 2162, 469: 2162, 473: 2162, 556: 2162, 566: 2162, 568: 2162, 624: 2162, 2162, 2162, 2162}, - {2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 53: 2161, 453: 2161, 457: 2161, 2161, 2161, 2161, 462: 2161, 469: 2161, 473: 2161, 556: 2161, 566: 2161, 568: 2161, 624: 2161, 2161, 2161, 2161}, + {359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 57: 359, 60: 4422, 460: 359, 464: 359, 359, 359, 359, 469: 359, 477: 359, 480: 359, 565: 359, 573: 359, 575: 359, 631: 359, 359, 634: 359, 359, 728: 4421, 730: 4423, 861: 4424}, + {273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 57: 273, 60: 273, 460: 273, 464: 273, 273, 273, 273, 469: 273, 477: 273, 480: 273, 565: 273, 573: 273, 575: 273, 631: 273, 273, 634: 273, 273, 728: 273, 730: 273, 862: 4486}, + {360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 57: 360, 60: 4422, 460: 360, 464: 360, 360, 360, 360, 469: 360, 477: 360, 480: 360, 565: 360, 573: 360, 575: 360, 631: 360, 360, 634: 360, 360, 728: 4421, 730: 4423, 861: 4424}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 565: 2328, 573: 2328, 575: 2328, 631: 2328, 637: 2328, 652: 4608, 2670, 2671, 2669, 664: 2328, 2328, 1123: 4607}, + {2262, 2262, 2262, 2262, 7: 2262, 2262, 2262, 57: 2262, 477: 2262}, // 2035 - {459: 4491, 473: 4490}, - {283: 4489}, - {2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 53: 2159, 453: 2159, 457: 2159, 2159, 2159, 2159, 462: 2159, 469: 2159, 473: 2159, 556: 2159, 566: 2159, 568: 2159, 624: 2159, 2159, 2159, 2159}, - {2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 53: 2160, 453: 2160, 457: 2160, 2160, 2160, 2160, 462: 2160, 469: 2160, 473: 2160, 556: 2160, 566: 2160, 568: 2160, 624: 2160, 2160, 2160, 2160}, - {2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 2158, 53: 2158, 453: 2158, 457: 2158, 2158, 2158, 2158, 462: 2158, 469: 2158, 473: 2158, 556: 2158, 566: 2158, 568: 2158, 624: 2158, 2158, 2158, 2158}, + {565: 2239}, + {480: 4606}, + {2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 2229, 57: 2229, 460: 2229, 464: 2229, 2229, 2229, 2229, 469: 2229, 477: 2229, 480: 2229, 565: 2229, 573: 2229, 575: 2229, 631: 2229, 2229, 634: 2229, 2229}, + {2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 2228, 57: 2228, 460: 2228, 464: 2228, 2228, 2228, 2228, 469: 2228, 477: 2228, 480: 2228, 565: 2228, 573: 2228, 575: 2228, 631: 2228, 2228, 634: 2228, 2228}, + {565: 4602}, // 2040 - {635: 4494}, - {2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164, 53: 2164, 453: 2164, 457: 2164, 2164, 2164, 2164, 462: 2164, 469: 2164, 473: 2164, 556: 2164, 566: 2164, 568: 2164, 624: 2164, 2164, 2164, 2164}, - {76: 4488, 493: 4487, 651: 4486, 653: 4485, 1088: 4495}, - {2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 53: 2168, 453: 2168, 457: 2168, 2168, 2168, 2168, 462: 2168, 469: 2168, 473: 2168, 556: 2168, 566: 2168, 568: 2168, 624: 2168, 2168, 2168, 2168}, - {2175, 2175, 2175, 2175, 2175, 2175, 2175, 2175, 2175, 2175, 2175, 2175, 2175, 53: 2175, 453: 2175, 457: 2175, 2175, 2175, 2175, 462: 2175, 469: 2175, 473: 2175, 556: 2175, 566: 2175, 568: 2175, 624: 2175, 2175, 2175, 2175}, + {2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 57: 2225, 460: 2225, 464: 2225, 2225, 2225, 2225, 469: 2225, 477: 2225, 480: 2225, 565: 4601, 573: 2225, 575: 2225, 631: 2225, 2225, 634: 2225, 2225}, + {255: 4599, 346: 4600, 463: 3135, 473: 4343, 4342, 480: 3126, 495: 3130, 559: 3125, 3127, 3129, 3128, 564: 3133, 568: 3134, 577: 4588, 4585, 4586, 4587, 3132, 701: 4341, 3131, 4598, 1060: 4583, 4584, 4596, 1113: 4597, 1180: 4595}, + {466: 4593}, + {643: 4581}, + {463: 4580}, // 2045 - {2174, 2174, 2174, 2174, 2174, 2174, 2174, 2174, 2174, 2174, 2174, 2174, 2174, 53: 2174, 453: 2174, 457: 2174, 2174, 2174, 2174, 462: 2174, 469: 2174, 473: 2174, 556: 2174, 566: 2174, 568: 2174, 624: 2174, 2174, 2174, 2174}, - {2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 53: 2173, 453: 2173, 457: 2173, 2173, 2173, 2173, 462: 2173, 469: 2173, 473: 2173, 556: 2173, 566: 2173, 568: 2173, 624: 2173, 2173, 2173, 2173}, - {2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 53: 2184, 453: 2184, 457: 2184, 2184, 2184, 2184, 462: 2184, 469: 2184, 473: 2184, 556: 2184, 566: 2184, 568: 2184, 624: 2184, 2184, 2184, 2184}, - {460: 2189}, - {2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 2197, 53: 2197, 453: 2197, 457: 2197, 2197, 2197, 2197, 462: 2197, 469: 2197, 473: 2197, 556: 2197, 566: 2197, 568: 2197, 624: 2197, 2197, 2197, 2197}, + {573: 4571}, + {467: 4564}, + {2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 57: 2217, 460: 2217, 464: 2217, 2217, 2217, 2217, 469: 2217, 477: 2217, 480: 2217, 565: 2217, 573: 2217, 575: 2217, 631: 2217, 2217, 634: 2217, 2217}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 531: 3383, 652: 3385, 2670, 2671, 2669, 727: 3382, 859: 4563}, + {172: 4561, 193: 4562, 466: 4560, 1165: 4559}, // 2050 - {2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 2198, 53: 2198, 453: 2198, 457: 2198, 2198, 2198, 2198, 462: 2198, 469: 2198, 473: 2198, 556: 2198, 566: 2198, 568: 2198, 624: 2198, 2198, 2198, 2198}, - {2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 2196, 53: 2196, 453: 2196, 457: 2196, 2196, 2196, 2196, 462: 2196, 469: 2196, 473: 2196, 556: 2196, 566: 2196, 568: 2196, 624: 2196, 2196, 2196, 2196}, - {2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 2195, 53: 2195, 453: 2195, 457: 2195, 2195, 2195, 2195, 462: 2195, 469: 2195, 473: 2195, 556: 2195, 566: 2195, 568: 2195, 624: 2195, 2195, 2195, 2195}, - {2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 2194, 53: 2194, 453: 2194, 457: 2194, 2194, 2194, 2194, 462: 2194, 469: 2194, 473: 2194, 556: 2194, 566: 2194, 568: 2194, 624: 2194, 2194, 2194, 2194}, - {2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 2199, 53: 2199, 453: 2199, 457: 2199, 2199, 2199, 2199, 462: 2199, 469: 2199, 473: 2199, 556: 2199, 566: 2199, 568: 2199, 624: 2199, 2199, 2199, 2199}, + {176: 4558, 236: 4557, 466: 4556, 1283: 4555}, + {278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 57: 278, 460: 278, 3718, 464: 278, 278, 278, 278, 469: 278, 477: 278, 480: 278, 565: 278, 573: 278, 575: 278, 631: 278, 278, 634: 278, 278, 749: 3719, 775: 4554}, + {293: 4553}, + {2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 2201, 57: 2201, 460: 2201, 464: 2201, 2201, 2201, 2201, 469: 2201, 477: 2201, 480: 2201, 565: 2201, 573: 2201, 575: 2201, 631: 2201, 2201, 634: 2201, 2201}, + {2198, 2198, 2198, 2198, 4498, 4504, 4492, 2198, 2198, 2198, 4496, 4505, 4503, 57: 2198, 460: 4497, 464: 3979, 3978, 4495, 2206, 469: 4502, 477: 2198, 480: 4491, 565: 2240, 573: 2329, 575: 4489, 631: 4494, 4487, 634: 4509, 4506, 799: 4490, 821: 4499, 897: 4501, 915: 4552, 924: 4500, 940: 4493}, // 2055 - {2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 2193, 53: 2193, 453: 2193, 457: 2193, 2193, 2193, 2193, 462: 2193, 469: 2193, 473: 2193, 556: 2193, 566: 2193, 568: 2193, 624: 2193, 2193, 2193, 2193}, - {2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 2192, 53: 2192, 453: 2192, 457: 2192, 2192, 2192, 2192, 462: 2192, 469: 2192, 473: 2192, 556: 2192, 566: 2192, 568: 2192, 624: 2192, 2192, 2192, 2192}, - {2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 53: 2191, 453: 2191, 457: 2191, 2191, 2191, 2191, 462: 2191, 469: 2191, 473: 2191, 556: 2191, 566: 2191, 568: 2191, 624: 2191, 2191, 2191, 2191}, - {2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 53: 2200, 453: 2200, 457: 2200, 2200, 2200, 2200, 462: 2200, 469: 2200, 473: 2200, 556: 2200, 566: 2200, 568: 2200, 624: 2200, 2200, 2200, 2200}, - {454: 4512}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 4510}, + {2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146, 57: 2146, 460: 2146, 4512, 464: 2146, 2146, 2146, 2146, 469: 2146, 477: 2146, 480: 2146, 565: 2146, 573: 2146, 575: 2146, 631: 2146, 2146, 634: 2146, 2146, 638: 2146, 1209: 4511}, + {2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 57: 2188, 460: 2188, 464: 2188, 2188, 2188, 2188, 469: 2188, 477: 2188, 480: 2188, 565: 2188, 573: 2188, 575: 2188, 631: 2188, 2188, 634: 2188, 2188, 638: 4527, 1226: 4528, 4529}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 461: 4516, 652: 4033, 2670, 2671, 2669, 732: 4515, 815: 4514, 824: 4513}, + {7: 4525, 57: 4524}, // 2060 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 4513}, - {53: 4514, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 2188, 53: 2188, 453: 2188, 457: 2188, 2188, 2188, 2188, 462: 2188, 469: 2188, 473: 2188, 556: 2188, 566: 2188, 568: 2188, 624: 2188, 2188, 2188, 2188, 1282: 4517, 1312: 4516, 4515}, - {2202, 2202, 2202, 2202, 2202, 2202, 2202, 2202, 2202, 2202, 2202, 2202, 2202, 53: 2202, 453: 2202, 457: 2202, 2202, 2202, 2202, 462: 2202, 469: 2202, 473: 2202, 556: 2202, 566: 2202, 568: 2202, 624: 2202, 2202, 2202, 2202}, - {2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 53: 2187, 453: 2187, 457: 2187, 2187, 2187, 2187, 462: 2187, 469: 2187, 473: 2187, 556: 2187, 566: 2187, 568: 2187, 624: 2187, 2187, 2187, 2187}, + {7: 2144, 57: 2144}, + {7: 278, 57: 278, 461: 3718, 517: 278, 278, 749: 3719, 775: 4522}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 4517}, + {57: 4518, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {7: 1263, 57: 1263, 517: 4521, 4520, 933: 4519}, // 2065 - {2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 53: 2186, 453: 2186, 457: 2186, 2186, 2186, 2186, 462: 2186, 469: 2186, 473: 2186, 556: 2186, 566: 2186, 568: 2186, 624: 2186, 2186, 2186, 2186}, - {454: 4519}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 4520}, - {53: 4521, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 53: 2218, 144: 4522, 453: 2218, 457: 3969, 3968, 2218, 2218, 462: 2218, 469: 2218, 473: 2218, 556: 2218, 566: 2218, 568: 2218, 624: 2218, 2218, 2218, 2218, 791: 4523, 916: 4524, 1019: 4525, 1180: 4526}, + {7: 2141, 57: 2141}, + {1262, 1262, 1262, 1262, 7: 1262, 57: 1262, 477: 1262}, + {1261, 1261, 1261, 1261, 7: 1261, 57: 1261, 477: 1261}, + {7: 1263, 57: 1263, 517: 4521, 4520, 933: 4523}, + {7: 2142, 57: 2142}, // 2070 - {2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 53: 2220, 453: 2220, 457: 2220, 2220, 2220, 2220, 462: 2220, 469: 2220, 473: 2220, 556: 2220, 566: 2220, 568: 2220, 624: 2220, 2220, 2220, 2220}, - {144: 4527, 473: 4528}, - {2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 2217, 53: 2217, 453: 2217, 457: 2217, 2217, 2217, 2217, 462: 2217, 469: 2217, 473: 2217, 556: 2217, 566: 2217, 568: 2217, 624: 2217, 2217, 2217, 2217}, - {2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 53: 2215, 453: 2215, 457: 2215, 2215, 2215, 2215, 462: 2215, 469: 2215, 473: 2215, 556: 2215, 566: 2215, 568: 2215, 624: 2215, 2215, 2215, 2215}, - {2203, 2203, 2203, 2203, 2203, 2203, 2203, 2203, 2203, 2203, 2203, 2203, 2203, 53: 2203, 453: 2203, 457: 2203, 2203, 2203, 2203, 462: 2203, 469: 2203, 473: 2203, 556: 2203, 566: 2203, 568: 2203, 624: 2203, 2203, 2203, 2203}, + {2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 57: 2145, 460: 2145, 464: 2145, 2145, 2145, 2145, 469: 2145, 477: 2145, 480: 2145, 565: 2145, 573: 2145, 575: 2145, 631: 2145, 2145, 634: 2145, 2145, 638: 2145}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 461: 4516, 652: 4033, 2670, 2671, 2669, 732: 4515, 815: 4526}, + {7: 2143, 57: 2143}, + {197: 4549, 353: 4550, 370: 4551}, + {2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187, 57: 2187, 460: 2187, 464: 2187, 2187, 2187, 2187, 469: 2187, 477: 2187, 480: 2187, 565: 2187, 573: 2187, 575: 2187, 631: 2187, 2187, 634: 2187, 2187}, // 2075 - {2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 53: 2219, 453: 2219, 457: 2219, 2219, 2219, 2219, 462: 2219, 469: 2219, 473: 2219, 556: 2219, 566: 2219, 568: 2219, 624: 2219, 2219, 2219, 2219}, - {2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 53: 2216, 453: 2216, 457: 2216, 2216, 2216, 2216, 462: 2216, 469: 2216, 473: 2216, 556: 2216, 566: 2216, 568: 2216, 624: 2216, 2216, 2216, 2216}, - {2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 53: 2204, 453: 2204, 457: 2204, 2204, 2204, 2204, 462: 2204, 469: 2204, 473: 2204, 556: 2204, 566: 2204, 568: 2204, 624: 2204, 2204, 2204, 2204}, - {570: 4537, 4534, 4535, 4536, 1055: 4532, 4533, 4531}, - {2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 2205, 53: 2205, 453: 2205, 457: 2205, 2205, 2205, 2205, 462: 2205, 469: 2205, 473: 2205, 556: 2205, 566: 2205, 568: 2205, 624: 2205, 2205, 2205, 2205}, + {2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 2183, 57: 2183, 460: 4531, 464: 2183, 2183, 2183, 2183, 469: 2183, 477: 2183, 480: 2183, 565: 2183, 573: 2183, 575: 2183, 631: 2183, 2183, 634: 2183, 2183, 1068: 4532, 4533, 1233: 4530}, + {2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186, 57: 2186, 460: 2186, 464: 2186, 2186, 2186, 2186, 469: 2186, 477: 2186, 480: 2186, 565: 2186, 573: 2186, 575: 2186, 631: 2186, 2186, 634: 2186, 2186}, + {643: 4547, 731: 4536}, + {2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 2182, 57: 2182, 460: 4545, 464: 2182, 2182, 2182, 2182, 469: 2182, 477: 2182, 480: 2182, 565: 2182, 573: 2182, 575: 2182, 631: 2182, 2182, 634: 2182, 2182, 1069: 4546}, + {2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 2181, 57: 2181, 460: 4534, 464: 2181, 2181, 2181, 2181, 469: 2181, 477: 2181, 480: 2181, 565: 2181, 573: 2181, 575: 2181, 631: 2181, 2181, 634: 2181, 2181, 1068: 4535}, // 2080 - {2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 2154, 53: 2154, 453: 2154, 457: 2154, 2154, 2154, 2154, 462: 2154, 469: 2154, 473: 2154, 556: 2154, 566: 2154, 568: 2154, 624: 2154, 2154, 2154, 2154}, - {454: 4538}, - {2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 2145, 53: 2145, 453: 2145, 2149, 457: 2145, 2145, 2145, 2145, 462: 2145, 469: 2145, 473: 2145, 556: 2145, 566: 2145, 568: 2145, 624: 2145, 2145, 2145, 2145}, - {2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 2144, 53: 2144, 453: 2144, 2148, 457: 2144, 2144, 2144, 2144, 462: 2144, 469: 2144, 473: 2144, 556: 2144, 566: 2144, 568: 2144, 624: 2144, 2144, 2144, 2144}, - {2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143, 53: 2143, 453: 2143, 2147, 457: 2143, 2143, 2143, 2143, 462: 2143, 469: 2143, 473: 2143, 556: 2143, 566: 2143, 568: 2143, 624: 2143, 2143, 2143, 2143}, + {731: 4536}, + {2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 57: 2179, 460: 2179, 464: 2179, 2179, 2179, 2179, 469: 2179, 477: 2179, 480: 2179, 565: 2179, 573: 2179, 575: 2179, 631: 2179, 2179, 634: 2179, 2179}, + {81: 4541, 500: 4540, 659: 4539, 661: 4538, 1091: 4537}, + {2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 2185, 57: 2185, 460: 2185, 464: 2185, 2185, 2185, 2185, 469: 2185, 477: 2185, 480: 2185, 565: 2185, 573: 2185, 575: 2185, 631: 2185, 2185, 634: 2185, 2185}, + {2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 2178, 57: 2178, 460: 2178, 464: 2178, 2178, 2178, 2178, 469: 2178, 477: 2178, 480: 2178, 565: 2178, 573: 2178, 575: 2178, 631: 2178, 2178, 634: 2178, 2178}, // 2085 - {454: 2146}, - {53: 4539, 488: 2642, 716: 4540}, - {2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 2153, 53: 2153, 453: 2153, 457: 2153, 2153, 2153, 2153, 462: 2153, 469: 2153, 473: 2153, 556: 2153, 566: 2153, 568: 2153, 624: 2153, 2153, 2153, 2153}, - {53: 4541}, - {2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, 2152, 53: 2152, 453: 2152, 457: 2152, 2152, 2152, 2152, 462: 2152, 469: 2152, 473: 2152, 556: 2152, 566: 2152, 568: 2152, 624: 2152, 2152, 2152, 2152}, + {2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 2177, 57: 2177, 460: 2177, 464: 2177, 2177, 2177, 2177, 469: 2177, 477: 2177, 480: 2177, 565: 2177, 573: 2177, 575: 2177, 631: 2177, 2177, 634: 2177, 2177}, + {466: 4544, 480: 4543}, + {289: 4542}, + {2175, 2175, 2175, 2175, 2175, 2175, 2175, 2175, 2175, 2175, 2175, 2175, 2175, 57: 2175, 460: 2175, 464: 2175, 2175, 2175, 2175, 469: 2175, 477: 2175, 480: 2175, 565: 2175, 573: 2175, 575: 2175, 631: 2175, 2175, 634: 2175, 2175}, + {2176, 2176, 2176, 2176, 2176, 2176, 2176, 2176, 2176, 2176, 2176, 2176, 2176, 57: 2176, 460: 2176, 464: 2176, 2176, 2176, 2176, 469: 2176, 477: 2176, 480: 2176, 565: 2176, 573: 2176, 575: 2176, 631: 2176, 2176, 634: 2176, 2176}, // 2090 - {148: 4543}, - {2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 2206, 53: 2206, 453: 2206, 457: 2206, 2206, 2206, 2206, 462: 2206, 469: 2206, 473: 2206, 556: 2206, 566: 2206, 568: 2206, 624: 2206, 2206, 2206, 2206}, - {2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 53: 2207, 453: 2207, 457: 2207, 2207, 2207, 2207, 462: 2207, 469: 2207, 473: 2207, 556: 2207, 566: 2207, 568: 2207, 624: 2207, 2207, 2207, 2207}, - {2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 2157, 53: 2157, 453: 2157, 457: 2157, 2157, 2157, 2157, 462: 2157, 469: 2157, 473: 2157, 556: 2157, 566: 2157, 568: 2157, 624: 2157, 2157, 2157, 2157}, - {2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 2156, 53: 2156, 453: 2156, 457: 2156, 2156, 2156, 2156, 462: 2156, 469: 2156, 473: 2156, 556: 2156, 566: 2156, 568: 2156, 624: 2156, 2156, 2156, 2156}, + {2174, 2174, 2174, 2174, 2174, 2174, 2174, 2174, 2174, 2174, 2174, 2174, 2174, 57: 2174, 460: 2174, 464: 2174, 2174, 2174, 2174, 469: 2174, 477: 2174, 480: 2174, 565: 2174, 573: 2174, 575: 2174, 631: 2174, 2174, 634: 2174, 2174}, + {643: 4547}, + {2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 2180, 57: 2180, 460: 2180, 464: 2180, 2180, 2180, 2180, 469: 2180, 477: 2180, 480: 2180, 565: 2180, 573: 2180, 575: 2180, 631: 2180, 2180, 634: 2180, 2180}, + {81: 4541, 500: 4540, 659: 4539, 661: 4538, 1091: 4548}, + {2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184, 57: 2184, 460: 2184, 464: 2184, 2184, 2184, 2184, 469: 2184, 477: 2184, 480: 2184, 565: 2184, 573: 2184, 575: 2184, 631: 2184, 2184, 634: 2184, 2184}, // 2095 - {2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 2155, 53: 2155, 453: 2155, 457: 2155, 2155, 2155, 2155, 462: 2155, 469: 2155, 473: 2155, 556: 2155, 566: 2155, 568: 2155, 624: 2155, 2155, 2155, 2155}, - {148: 4059}, - {454: 4056}, - {2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 2142, 53: 2142, 453: 2142, 457: 2142, 2142, 2142, 2142, 462: 2142, 469: 2142, 473: 2142, 556: 2142, 566: 2142, 568: 2142, 624: 2142, 2142, 2142, 2142}, - {488: 3308, 560: 3310, 3309, 836: 4554}, + {2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 2191, 57: 2191, 460: 2191, 464: 2191, 2191, 2191, 2191, 469: 2191, 477: 2191, 480: 2191, 565: 2191, 573: 2191, 575: 2191, 631: 2191, 2191, 634: 2191, 2191}, + {2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 2190, 57: 2190, 460: 2190, 464: 2190, 2190, 2190, 2190, 469: 2190, 477: 2190, 480: 2190, 565: 2190, 573: 2190, 575: 2190, 631: 2190, 2190, 634: 2190, 2190}, + {2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 2189, 57: 2189, 460: 2189, 464: 2189, 2189, 2189, 2189, 469: 2189, 477: 2189, 480: 2189, 565: 2189, 573: 2189, 575: 2189, 631: 2189, 2189, 634: 2189, 2189}, + {2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 2200, 57: 2200, 460: 2200, 464: 2200, 2200, 2200, 2200, 469: 2200, 477: 2200, 480: 2200, 565: 2200, 573: 2200, 575: 2200, 631: 2200, 2200, 634: 2200, 2200}, + {467: 2205}, // 2100 - {488: 3308, 560: 3310, 3309, 836: 4553}, - {2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 53: 2140, 453: 2140, 457: 2140, 2140, 2140, 2140, 462: 2140, 469: 2140, 473: 2140, 556: 2140, 566: 2140, 568: 2140, 624: 2140, 2140, 2140, 2140}, - {2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 2141, 53: 2141, 453: 2141, 457: 2141, 2141, 2141, 2141, 462: 2141, 469: 2141, 473: 2141, 556: 2141, 566: 2141, 568: 2141, 624: 2141, 2141, 2141, 2141}, - {2208, 2208, 2208, 2208, 2208, 2208, 2208, 2208, 2208, 2208, 2208, 2208, 2208, 53: 2208, 453: 2208, 457: 2208, 2208, 2208, 2208, 462: 2208, 469: 2208, 473: 2208, 556: 2208, 566: 2208, 568: 2208, 624: 2208, 2208, 2208, 2208}, - {2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 53: 2211, 89: 4557, 91: 4558, 453: 2211, 457: 2211, 2211, 2211, 2211, 462: 2211, 469: 2211, 473: 2211, 556: 2211, 566: 2211, 568: 2211, 624: 2211, 2211, 2211, 2211, 844: 4559}, + {2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 2213, 57: 2213, 460: 2213, 464: 2213, 2213, 2213, 2213, 469: 2213, 477: 2213, 480: 2213, 565: 2213, 573: 2213, 575: 2213, 631: 2213, 2213, 634: 2213, 2213}, + {2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 57: 2214, 460: 2214, 464: 2214, 2214, 2214, 2214, 469: 2214, 477: 2214, 480: 2214, 565: 2214, 573: 2214, 575: 2214, 631: 2214, 2214, 634: 2214, 2214}, + {2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 2212, 57: 2212, 460: 2212, 464: 2212, 2212, 2212, 2212, 469: 2212, 477: 2212, 480: 2212, 565: 2212, 573: 2212, 575: 2212, 631: 2212, 2212, 634: 2212, 2212}, + {2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 2211, 57: 2211, 460: 2211, 464: 2211, 2211, 2211, 2211, 469: 2211, 477: 2211, 480: 2211, 565: 2211, 573: 2211, 575: 2211, 631: 2211, 2211, 634: 2211, 2211}, + {2210, 2210, 2210, 2210, 2210, 2210, 2210, 2210, 2210, 2210, 2210, 2210, 2210, 57: 2210, 460: 2210, 464: 2210, 2210, 2210, 2210, 469: 2210, 477: 2210, 480: 2210, 565: 2210, 573: 2210, 575: 2210, 631: 2210, 2210, 634: 2210, 2210}, // 2105 - {2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 2337, 29: 2337, 53: 2337, 87: 2337, 2337, 2337, 2337, 2337, 2337, 453: 2337, 455: 2337, 457: 2337, 2337, 2337, 2337, 462: 2337, 2337, 469: 2337, 473: 2337, 477: 2337, 556: 2337, 566: 2337, 568: 2337, 624: 2337, 2337, 2337, 2337}, - {2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 29: 2336, 53: 2336, 87: 2336, 2336, 2336, 2336, 2336, 2336, 453: 2336, 455: 2336, 457: 2336, 2336, 2336, 2336, 462: 2336, 2336, 469: 2336, 473: 2336, 477: 2336, 556: 2336, 566: 2336, 568: 2336, 624: 2336, 2336, 2336, 2336}, - {2210, 2210, 2210, 2210, 2210, 2210, 2210, 2210, 2210, 2210, 2210, 2210, 2210, 53: 2210, 453: 2210, 457: 2210, 2210, 2210, 2210, 462: 2210, 469: 2210, 473: 2210, 556: 2210, 566: 2210, 568: 2210, 624: 2210, 2210, 2210, 2210}, - {2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214, 53: 2214, 453: 2214, 457: 2214, 2214, 2214, 2214, 462: 2214, 469: 2214, 473: 2214, 556: 2214, 566: 2214, 568: 2214, 624: 2214, 2214, 2214, 2214}, - {556: 2309, 566: 2309, 568: 2309, 624: 2309, 630: 2309, 656: 2309, 2309}, + {2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 2215, 57: 2215, 460: 2215, 464: 2215, 2215, 2215, 2215, 469: 2215, 477: 2215, 480: 2215, 565: 2215, 573: 2215, 575: 2215, 631: 2215, 2215, 634: 2215, 2215}, + {2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 2209, 57: 2209, 460: 2209, 464: 2209, 2209, 2209, 2209, 469: 2209, 477: 2209, 480: 2209, 565: 2209, 573: 2209, 575: 2209, 631: 2209, 2209, 634: 2209, 2209}, + {2208, 2208, 2208, 2208, 2208, 2208, 2208, 2208, 2208, 2208, 2208, 2208, 2208, 57: 2208, 460: 2208, 464: 2208, 2208, 2208, 2208, 469: 2208, 477: 2208, 480: 2208, 565: 2208, 573: 2208, 575: 2208, 631: 2208, 2208, 634: 2208, 2208}, + {2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 57: 2207, 460: 2207, 464: 2207, 2207, 2207, 2207, 469: 2207, 477: 2207, 480: 2207, 565: 2207, 573: 2207, 575: 2207, 631: 2207, 2207, 634: 2207, 2207}, + {2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 2216, 57: 2216, 460: 2216, 464: 2216, 2216, 2216, 2216, 469: 2216, 477: 2216, 480: 2216, 565: 2216, 573: 2216, 575: 2216, 631: 2216, 2216, 634: 2216, 2216}, // 2110 - {2308, 2308, 2308, 2308, 7: 2308, 469: 2308, 556: 2308, 566: 2308, 568: 2308, 624: 2308, 630: 2308, 656: 2308, 2308}, - {2247, 2247, 2247, 2247, 7: 2247, 2247, 2247, 53: 2247, 469: 2247}, - {2368, 2368, 2368, 2368, 7: 2368, 469: 2368}, - {2319, 2319, 2319, 2319, 7: 2319, 469: 2319}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4023, 2668, 2669, 2667, 724: 4567}, + {461: 4565}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 4566}, + {57: 4567, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 2204, 57: 2204, 460: 2204, 464: 2204, 2204, 2204, 2204, 469: 2204, 477: 2204, 480: 2204, 565: 2204, 573: 2204, 575: 2204, 631: 2204, 2204, 634: 2204, 2204, 1284: 4570, 1314: 4569, 4568}, + {2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 2218, 57: 2218, 460: 2218, 464: 2218, 2218, 2218, 2218, 469: 2218, 477: 2218, 480: 2218, 565: 2218, 573: 2218, 575: 2218, 631: 2218, 2218, 634: 2218, 2218}, // 2115 - {2318, 2318, 2318, 2318, 7: 2318, 469: 2318}, - {2: 1797, 1797, 1797, 1797, 1797, 8: 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 54: 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 547: 4297, 758: 4569}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4023, 2668, 2669, 2667, 724: 4301, 825: 4570}, - {2320, 2320, 2320, 2320, 7: 2320, 4565, 4566, 469: 2320, 911: 4571}, - {2369, 2369, 2369, 2369, 7: 2369, 469: 2369}, + {2203, 2203, 2203, 2203, 2203, 2203, 2203, 2203, 2203, 2203, 2203, 2203, 2203, 57: 2203, 460: 2203, 464: 2203, 2203, 2203, 2203, 469: 2203, 477: 2203, 480: 2203, 565: 2203, 573: 2203, 575: 2203, 631: 2203, 2203, 634: 2203, 2203}, + {2202, 2202, 2202, 2202, 2202, 2202, 2202, 2202, 2202, 2202, 2202, 2202, 2202, 57: 2202, 460: 2202, 464: 2202, 2202, 2202, 2202, 469: 2202, 477: 2202, 480: 2202, 565: 2202, 573: 2202, 575: 2202, 631: 2202, 2202, 634: 2202, 2202}, + {461: 4572}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 4573}, + {57: 4574, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, // 2120 - {2370, 2370, 2370, 2370, 7: 2370, 469: 2370}, - {2371, 2371, 2371, 2371, 7: 2371, 469: 2371}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4023, 2668, 2669, 2667, 724: 4577, 964: 4576, 1143: 4575}, - {2372, 2372, 2372, 2372, 7: 4579, 469: 2372}, - {1266, 1266, 1266, 1266, 7: 1266, 469: 1266}, + {2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 2234, 57: 2234, 147: 4331, 460: 2234, 464: 3979, 3978, 2234, 2234, 469: 2234, 477: 2234, 480: 2234, 565: 2234, 573: 2234, 575: 2234, 631: 2234, 2234, 634: 2234, 2234, 799: 4575, 921: 4576, 1024: 4577, 1183: 4578}, + {147: 4333, 480: 4579}, + {2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233, 57: 2233, 460: 2233, 464: 2233, 2233, 2233, 2233, 469: 2233, 477: 2233, 480: 2233, 565: 2233, 573: 2233, 575: 2233, 631: 2233, 2233, 634: 2233, 2233}, + {2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 2231, 57: 2231, 460: 2231, 464: 2231, 2231, 2231, 2231, 469: 2231, 477: 2231, 480: 2231, 565: 2231, 573: 2231, 575: 2231, 631: 2231, 2231, 634: 2231, 2231}, + {2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 2219, 57: 2219, 460: 2219, 464: 2219, 2219, 2219, 2219, 469: 2219, 477: 2219, 480: 2219, 565: 2219, 573: 2219, 575: 2219, 631: 2219, 2219, 634: 2219, 2219}, // 2125 - {1256, 1256, 1256, 1256, 7: 1256, 469: 1256, 510: 4468, 4467, 928: 4578}, - {1264, 1264, 1264, 1264, 7: 1264, 469: 1264}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4023, 2668, 2669, 2667, 724: 4577, 964: 4580}, - {1265, 1265, 1265, 1265, 7: 1265, 469: 1265}, - {2: 545, 545, 545, 545, 545, 8: 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 54: 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 4584, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 718: 545, 799: 4583, 817: 4582}, + {2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 2232, 57: 2232, 460: 2232, 464: 2232, 2232, 2232, 2232, 469: 2232, 477: 2232, 480: 2232, 565: 2232, 573: 2232, 575: 2232, 631: 2232, 2232, 634: 2232, 2232}, + {2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 2220, 57: 2220, 460: 2220, 464: 2220, 2220, 2220, 2220, 469: 2220, 477: 2220, 480: 2220, 565: 2220, 573: 2220, 575: 2220, 631: 2220, 2220, 634: 2220, 2220}, + {577: 4588, 4585, 4586, 4587, 1060: 4583, 4584, 4582}, + {2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221, 57: 2221, 460: 2221, 464: 2221, 2221, 2221, 2221, 469: 2221, 477: 2221, 480: 2221, 565: 2221, 573: 2221, 575: 2221, 631: 2221, 2221, 634: 2221, 2221}, + {2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 2170, 57: 2170, 460: 2170, 464: 2170, 2170, 2170, 2170, 469: 2170, 477: 2170, 480: 2170, 565: 2170, 573: 2170, 575: 2170, 631: 2170, 2170, 634: 2170, 2170}, // 2130 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4588, 2668, 2669, 2667, 718: 4586, 770: 4587, 812: 4585}, - {544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 54: 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 454: 544, 469: 544, 488: 544, 524: 544, 550: 544, 718: 544}, - {543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 54: 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 543, 454: 543, 469: 543, 488: 543, 524: 543, 550: 543, 718: 543}, - {2375, 2375, 2375, 2375, 7: 2375, 469: 2375}, - {2343, 2343, 2343, 2343, 7: 2343, 30: 2343, 469: 2343}, + {461: 4589}, + {2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161, 57: 2161, 460: 2161, 2165, 464: 2161, 2161, 2161, 2161, 469: 2161, 477: 2161, 480: 2161, 565: 2161, 573: 2161, 575: 2161, 631: 2161, 2161, 634: 2161, 2161}, + {2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 2160, 57: 2160, 460: 2160, 2164, 464: 2160, 2160, 2160, 2160, 469: 2160, 477: 2160, 480: 2160, 565: 2160, 573: 2160, 575: 2160, 631: 2160, 2160, 634: 2160, 2160}, + {2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159, 57: 2159, 460: 2159, 2163, 464: 2159, 2159, 2159, 2159, 469: 2159, 477: 2159, 480: 2159, 565: 2159, 573: 2159, 575: 2159, 631: 2159, 2159, 634: 2159, 2159}, + {461: 2162}, // 2135 - {2342, 2342, 2342, 2342, 7: 4589, 30: 2342, 469: 2342}, - {2313, 2313, 2313, 2313, 7: 2313, 30: 2313, 53: 2313, 95: 2313, 152: 2313, 455: 2313, 469: 2313, 476: 2313, 630: 2313}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4590, 2668, 2669, 2667}, - {2312, 2312, 2312, 2312, 7: 2312, 30: 2312, 53: 2312, 95: 2312, 152: 2312, 455: 2312, 469: 2312, 476: 2312, 630: 2312}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4588, 2668, 2669, 2667, 718: 4586, 770: 4587, 812: 4593}, + {57: 4590, 495: 2644, 724: 4591}, + {2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 2169, 57: 2169, 460: 2169, 464: 2169, 2169, 2169, 2169, 469: 2169, 477: 2169, 480: 2169, 565: 2169, 573: 2169, 575: 2169, 631: 2169, 2169, 634: 2169, 2169}, + {57: 4592}, + {2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 2168, 57: 2168, 460: 2168, 464: 2168, 2168, 2168, 2168, 469: 2168, 477: 2168, 480: 2168, 565: 2168, 573: 2168, 575: 2168, 631: 2168, 2168, 634: 2168, 2168}, + {152: 4594}, // 2140 - {2376, 2376, 2376, 2376, 7: 2376, 469: 2376}, - {30: 4594}, - {2378, 2378, 2378, 2378, 7: 2378, 469: 2378}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4588, 2668, 2669, 2667, 718: 4586, 770: 4587, 812: 4597}, - {2377, 2377, 2377, 2377, 7: 2377, 469: 2377}, + {2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 2222, 57: 2222, 460: 2222, 464: 2222, 2222, 2222, 2222, 469: 2222, 477: 2222, 480: 2222, 565: 2222, 573: 2222, 575: 2222, 631: 2222, 2222, 634: 2222, 2222}, + {2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 2223, 57: 2223, 460: 2223, 464: 2223, 2223, 2223, 2223, 469: 2223, 477: 2223, 480: 2223, 565: 2223, 573: 2223, 575: 2223, 631: 2223, 2223, 634: 2223, 2223}, + {2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173, 57: 2173, 460: 2173, 464: 2173, 2173, 2173, 2173, 469: 2173, 477: 2173, 480: 2173, 565: 2173, 573: 2173, 575: 2173, 631: 2173, 2173, 634: 2173, 2173}, + {2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172, 57: 2172, 460: 2172, 464: 2172, 2172, 2172, 2172, 469: 2172, 477: 2172, 480: 2172, 565: 2172, 573: 2172, 575: 2172, 631: 2172, 2172, 634: 2172, 2172}, + {2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171, 57: 2171, 460: 2171, 464: 2171, 2171, 2171, 2171, 469: 2171, 477: 2171, 480: 2171, 565: 2171, 573: 2171, 575: 2171, 631: 2171, 2171, 634: 2171, 2171}, // 2145 - {30: 4598}, - {2379, 2379, 2379, 2379, 7: 2379, 469: 2379}, - {2: 545, 545, 545, 545, 545, 8: 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 54: 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 4584, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 718: 545, 799: 4583, 817: 4600}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4588, 2668, 2669, 2667, 718: 4586, 770: 4587, 812: 4601}, - {2380, 2380, 2380, 2380, 7: 2380, 469: 2380}, + {152: 4069}, + {461: 4066}, + {2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 2224, 57: 2224, 460: 2224, 464: 2224, 2224, 2224, 2224, 469: 2224, 477: 2224, 480: 2224, 565: 2224, 573: 2224, 575: 2224, 631: 2224, 2224, 634: 2224, 2224}, + {2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 2227, 57: 2227, 94: 4603, 96: 4604, 460: 2227, 464: 2227, 2227, 2227, 2227, 469: 2227, 477: 2227, 480: 2227, 565: 2227, 573: 2227, 575: 2227, 631: 2227, 2227, 634: 2227, 2227, 856: 4605}, + {2355, 2355, 2355, 2355, 2355, 2355, 2355, 2355, 2355, 2355, 2355, 2355, 2355, 29: 2355, 57: 2355, 92: 2355, 2355, 2355, 2355, 2355, 2355, 460: 2355, 462: 2355, 464: 2355, 2355, 2355, 2355, 469: 2355, 2355, 477: 2355, 480: 2355, 485: 2355, 565: 2355, 573: 2355, 575: 2355, 631: 2355, 2355, 634: 2355, 2355}, // 2150 - {2: 545, 545, 545, 545, 545, 8: 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 54: 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 4584, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 718: 545, 799: 4583, 817: 4603}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4588, 2668, 2669, 2667, 718: 4586, 770: 4587, 812: 4604}, - {2381, 2381, 2381, 2381, 7: 2381, 469: 2381}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4588, 2668, 2669, 2667, 718: 4586, 770: 4587, 812: 4606}, - {2382, 2382, 2382, 2382, 7: 2382, 469: 2382}, + {2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 2354, 29: 2354, 57: 2354, 92: 2354, 2354, 2354, 2354, 2354, 2354, 460: 2354, 462: 2354, 464: 2354, 2354, 2354, 2354, 469: 2354, 2354, 477: 2354, 480: 2354, 485: 2354, 565: 2354, 573: 2354, 575: 2354, 631: 2354, 2354, 634: 2354, 2354}, + {2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 2226, 57: 2226, 460: 2226, 464: 2226, 2226, 2226, 2226, 469: 2226, 477: 2226, 480: 2226, 565: 2226, 573: 2226, 575: 2226, 631: 2226, 2226, 634: 2226, 2226}, + {2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 2230, 57: 2230, 460: 2230, 464: 2230, 2230, 2230, 2230, 469: 2230, 477: 2230, 480: 2230, 565: 2230, 573: 2230, 575: 2230, 631: 2230, 2230, 634: 2230, 2230}, + {565: 2327, 573: 2327, 575: 2327, 631: 2327, 637: 2327, 664: 2327, 2327}, + {2326, 2326, 2326, 2326, 7: 2326, 477: 2326, 565: 2326, 573: 2326, 575: 2326, 631: 2326, 637: 2326, 664: 2326, 2326}, // 2155 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4608, 2668, 2669, 2667}, - {455: 4609}, - {550: 4610}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 4611}, - {2341, 2341, 2341, 2341, 7: 2341, 208: 4615, 455: 4614, 469: 2341, 1323: 4613, 4612}, + {2263, 2263, 2263, 2263, 7: 2263, 2263, 2263, 57: 2263, 477: 2263}, + {2385, 2385, 2385, 2385, 7: 2385, 477: 2385}, + {2337, 2337, 2337, 2337, 7: 2337, 477: 2337}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4033, 2670, 2671, 2669, 732: 4613}, + {2336, 2336, 2336, 2336, 7: 2336, 477: 2336}, // 2160 - {2383, 2383, 2383, 2383, 7: 2383, 469: 2383}, - {2340, 2340, 2340, 2340, 7: 2340, 469: 2340}, - {183: 4617}, - {183: 4616}, - {2338, 2338, 2338, 2338, 7: 2338, 469: 2338}, + {2: 1811, 1811, 1811, 1811, 1811, 8: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 58: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 554: 4350, 767: 4615}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4033, 2670, 2671, 2669, 732: 4354, 835: 4616}, + {2338, 2338, 2338, 2338, 7: 2338, 4611, 4612, 477: 2338, 916: 4617}, + {2386, 2386, 2386, 2386, 7: 2386, 477: 2386}, + {2387, 2387, 2387, 2387, 7: 2387, 477: 2387}, // 2165 - {2339, 2339, 2339, 2339, 7: 2339, 469: 2339}, - {133: 4584, 488: 545, 799: 4583, 817: 4619}, - {488: 2642, 716: 4620}, - {2388, 2388, 2388, 2388, 7: 2388, 469: 2388}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4588, 2668, 2669, 2667, 718: 4586, 770: 4587, 812: 4622}, + {2388, 2388, 2388, 2388, 7: 2388, 477: 2388}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4033, 2670, 2671, 2669, 732: 4623, 969: 4622, 1146: 4621}, + {2389, 2389, 2389, 2389, 7: 4625, 477: 2389}, + {1273, 1273, 1273, 1273, 7: 1273, 477: 1273}, + {1263, 1263, 1263, 1263, 7: 1263, 477: 1263, 517: 4521, 4520, 933: 4624}, // 2170 - {2389, 2389, 2389, 2389, 7: 2389, 469: 2389}, - {14: 3719, 485: 3720, 629: 3718, 754: 4624}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 459: 4626, 524: 3644, 640: 3376, 2668, 2669, 2667, 720: 3643, 789: 4625}, - {257, 257, 257, 257, 7: 257, 462: 4628, 469: 257, 1066: 4630}, - {257, 257, 257, 257, 7: 257, 462: 4628, 469: 257, 1066: 4627}, + {1271, 1271, 1271, 1271, 7: 1271, 477: 1271}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4033, 2670, 2671, 2669, 732: 4623, 969: 4626}, + {1272, 1272, 1272, 1272, 7: 1272, 477: 1272}, + {2: 550, 550, 550, 550, 550, 8: 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 58: 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 4630, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 640: 550, 807: 4629, 825: 4628}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 640: 4632, 652: 4634, 2670, 2671, 2669, 778: 4633, 820: 4631}, // 2175 - {2398, 2398, 2398, 2398, 7: 2398, 469: 2398}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 524: 3374, 640: 3376, 2668, 2669, 2667, 720: 3373, 847: 4629}, - {256, 256, 256, 256, 7: 256, 469: 256}, - {2399, 2399, 2399, 2399, 7: 2399, 469: 2399}, - {361: 4632}, + {549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 58: 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 549, 461: 549, 477: 549, 495: 549, 531: 549, 555: 549, 640: 549}, + {548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 58: 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 548, 461: 548, 477: 548, 495: 548, 531: 548, 555: 548, 640: 548}, + {2392, 2392, 2392, 2392, 7: 2392, 477: 2392}, + {2361, 2361, 2361, 2361, 7: 2361, 30: 2361, 477: 2361}, + {2360, 2360, 2360, 2360, 7: 4635, 30: 2360, 477: 2360}, // 2180 - {488: 2642, 716: 2641, 725: 4633}, - {2403, 2403, 2403, 2403, 7: 2403, 194: 4634, 469: 2403, 1221: 4635}, - {246: 4636}, - {2400, 2400, 2400, 2400, 7: 2400, 469: 2400}, - {456: 4638, 1283: 4637}, + {2331, 2331, 2331, 2331, 7: 2331, 30: 2331, 57: 2331, 98: 2331, 158: 2331, 462: 2331, 477: 2331, 483: 2331, 637: 2331, 640: 2331}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4636, 2670, 2671, 2669}, + {2330, 2330, 2330, 2330, 7: 2330, 30: 2330, 57: 2330, 98: 2330, 158: 2330, 462: 2330, 477: 2330, 483: 2330, 637: 2330, 640: 2330}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 640: 4632, 652: 4634, 2670, 2671, 2669, 778: 4633, 820: 4639}, + {2393, 2393, 2393, 2393, 7: 2393, 477: 2393}, // 2185 - {2402, 2402, 2402, 2402, 7: 4639, 469: 2402}, - {255, 255, 255, 255, 7: 255, 469: 255}, - {456: 4640}, - {254, 254, 254, 254, 7: 254, 469: 254}, - {6: 388, 38: 388}, + {30: 4640}, + {2395, 2395, 2395, 2395, 7: 2395, 477: 2395}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 640: 4632, 652: 4634, 2670, 2671, 2669, 778: 4633, 820: 4643}, + {2394, 2394, 2394, 2394, 7: 2394, 477: 2394}, + {30: 4644}, // 2190 - {382, 382, 382, 382, 382, 382, 382, 382, 13: 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 453: 382, 382, 382, 459: 382, 382, 382, 382, 469: 382, 382, 481: 382, 483: 382, 485: 382, 487: 382, 550: 382, 628: 382, 382, 382}, - {4: 4130, 4132, 389, 13: 4081, 2096, 4149, 4076, 4088, 4083, 4077, 4082, 4085, 4079, 4075, 4080, 4084, 4078, 4147, 4162, 4151, 4138, 4131, 4134, 4133, 4136, 4137, 4139, 4146, 389, 4144, 4145, 4150, 4152, 4159, 4158, 4164, 4160, 4157, 4155, 4154, 4156, 4148, 459: 4129, 461: 4161, 2096, 483: 4641, 485: 2096, 629: 2096, 4135, 753: 4086, 757: 4087, 759: 4140, 775: 4142, 793: 4141, 815: 4143, 819: 4153, 822: 4644}, - {381, 381, 381, 381, 381, 381, 381, 381, 13: 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 453: 381, 381, 381, 459: 381, 381, 381, 381, 469: 381, 381, 481: 381, 483: 381, 485: 381, 487: 381, 550: 381, 628: 381, 381, 381}, - {456: 4647, 459: 4646}, - {2410, 2410, 2410, 2410, 7: 2410, 469: 2410}, + {2396, 2396, 2396, 2396, 7: 2396, 477: 2396}, + {2: 550, 550, 550, 550, 550, 8: 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 58: 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 4630, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 640: 550, 807: 4629, 825: 4646}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 640: 4632, 652: 4634, 2670, 2671, 2669, 778: 4633, 820: 4647}, + {2397, 2397, 2397, 2397, 7: 2397, 477: 2397}, + {2: 550, 550, 550, 550, 550, 8: 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 58: 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 4630, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 640: 550, 807: 4629, 825: 4649}, // 2195 - {2409, 2409, 2409, 2409, 7: 2409, 469: 2409}, - {646: 4650, 650: 4651, 660: 4649, 889: 4652}, - {17: 4677}, - {17: 4662}, - {17: 4653}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 640: 4632, 652: 4634, 2670, 2671, 2669, 778: 4633, 820: 4650}, + {2398, 2398, 2398, 2398, 7: 2398, 477: 2398}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 640: 4632, 652: 4634, 2670, 2671, 2669, 778: 4633, 820: 4652}, + {2399, 2399, 2399, 2399, 7: 2399, 477: 2399}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4654, 2670, 2671, 2669}, // 2200 - {2411, 2411, 2411, 2411, 7: 2411, 469: 2411}, - {134: 4654}, - {93: 4655, 859: 4656}, - {478: 4657}, - {2413, 2413, 2413, 2413, 7: 2413, 469: 2413}, + {462: 4655}, + {555: 4656}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 4657}, + {2359, 2359, 2359, 2359, 7: 2359, 214: 4661, 462: 4660, 477: 2359, 1325: 4659, 4658}, + {2400, 2400, 2400, 2400, 7: 2400, 477: 2400}, // 2205 - {318: 4658, 332: 4659, 4660, 390: 4661}, - {2447, 2447, 2447, 2447, 7: 2447, 13: 2447, 93: 2447, 96: 2447, 469: 2447}, - {2446, 2446, 2446, 2446, 7: 2446, 13: 2446, 93: 2446, 96: 2446, 469: 2446}, - {2445, 2445, 2445, 2445, 7: 2445, 13: 2445, 93: 2445, 96: 2445, 469: 2445}, - {2444, 2444, 2444, 2444, 7: 2444, 13: 2444, 93: 2444, 96: 2444, 469: 2444}, + {2358, 2358, 2358, 2358, 7: 2358, 477: 2358}, + {188: 4663}, + {188: 4662}, + {2356, 2356, 2356, 2356, 7: 2356, 477: 2356}, + {2357, 2357, 2357, 2357, 7: 2357, 477: 2357}, // 2210 - {134: 4663}, - {13: 4665, 93: 4655, 96: 4664, 859: 4668, 887: 4666, 4667, 1062: 4669}, - {478: 4675}, - {478: 4673}, - {2421, 2421, 2421, 2421, 7: 2421, 13: 2421, 93: 2421, 96: 2421, 469: 2421}, + {2: 1811, 1811, 1811, 1811, 1811, 8: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 58: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 554: 4350, 767: 4682}, + {565: 4681}, + {2: 1811, 1811, 1811, 1811, 1811, 8: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 58: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 554: 4350, 767: 4679}, + {2: 1811, 1811, 1811, 1811, 1811, 8: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 58: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 554: 4350, 767: 4677}, + {2: 1811, 1811, 1811, 1811, 1811, 8: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 58: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 554: 4350, 767: 4675}, // 2215 - {2420, 2420, 2420, 2420, 7: 2420, 13: 2420, 93: 2420, 96: 2420, 469: 2420}, - {2419, 2419, 2419, 2419, 7: 2419, 13: 2419, 93: 2419, 96: 2419, 469: 2419}, - {2414, 2414, 2414, 2414, 7: 2414, 13: 4665, 93: 4655, 96: 4664, 469: 2414, 859: 4672, 887: 4670, 4671}, - {2418, 2418, 2418, 2418, 7: 2418, 13: 2418, 93: 2418, 96: 2418, 469: 2418}, - {2417, 2417, 2417, 2417, 7: 2417, 13: 2417, 93: 2417, 96: 2417, 469: 2417}, + {565: 4672}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4671, 2670, 2671, 2669}, + {2367, 2367, 2367, 2367, 7: 2367, 477: 2367}, + {2: 1811, 1811, 1811, 1811, 1811, 8: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 58: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 554: 4350, 767: 4673}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4608, 2670, 2671, 2669, 1123: 4674}, // 2220 - {2416, 2416, 2416, 2416, 7: 2416, 13: 2416, 93: 2416, 96: 2416, 469: 2416}, - {456: 4674}, - {2442, 2442, 2442, 2442, 7: 2442, 13: 2442, 93: 2442, 96: 2442, 469: 2442}, - {488: 2642, 716: 2641, 725: 4676}, - {2443, 2443, 2443, 2443, 7: 2443, 13: 2443, 93: 2443, 96: 2443, 469: 2443}, + {2390, 2390, 2390, 2390, 7: 2390, 477: 2390}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4676, 2670, 2671, 2669}, + {2391, 2391, 2391, 2391, 7: 2391, 477: 2391}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4678, 2670, 2671, 2669}, + {2401, 2401, 2401, 2401, 7: 2401, 477: 2401}, // 2225 - {134: 4678}, - {13: 4665, 93: 4655, 96: 4664, 859: 4668, 887: 4666, 4667, 1062: 4679}, - {2415, 2415, 2415, 2415, 7: 2415, 13: 4665, 93: 4655, 96: 4664, 469: 2415, 859: 4672, 887: 4670, 4671}, - {2: 1797, 1797, 1797, 1797, 1797, 8: 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 54: 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 547: 4297, 758: 4700}, - {556: 4699}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4634, 2670, 2671, 2669, 778: 4680}, + {2402, 2402, 2402, 2402, 7: 4635, 477: 2402}, + {2403, 2403, 2403, 2403, 7: 2403, 477: 2403}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4033, 2670, 2671, 2669, 732: 4683}, + {1998, 1998, 1998, 1998, 7: 1998, 477: 1998, 659: 4686, 661: 4685, 898: 4684}, // 2230 - {2: 1797, 1797, 1797, 1797, 1797, 8: 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 54: 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 547: 4297, 758: 4697}, - {2: 1797, 1797, 1797, 1797, 1797, 8: 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 54: 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 547: 4297, 758: 4695}, - {2: 1797, 1797, 1797, 1797, 1797, 8: 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 54: 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 547: 4297, 758: 4693}, - {556: 4690}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4689, 2668, 2669, 2667}, + {2404, 2404, 2404, 2404, 7: 2404, 477: 2404}, + {1997, 1997, 1997, 1997, 7: 1997, 477: 1997}, + {1996, 1996, 1996, 1996, 7: 1996, 477: 1996}, + {136: 4630, 495: 550, 807: 4629, 825: 4688}, + {495: 2644, 724: 4689}, // 2235 - {2: 426, 426, 426, 426, 426, 8: 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 54: 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426}, - {2: 425, 425, 425, 425, 425, 8: 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 54: 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425}, - {2350, 2350, 2350, 2350, 7: 2350, 469: 2350}, - {2: 1797, 1797, 1797, 1797, 1797, 8: 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 54: 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 547: 4297, 758: 4691}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4562, 2668, 2669, 2667, 1119: 4692}, + {2405, 2405, 2405, 2405, 7: 2405, 477: 2405}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 640: 4632, 652: 4634, 2670, 2671, 2669, 778: 4633, 820: 4691}, + {2406, 2406, 2406, 2406, 7: 2406, 477: 2406}, + {2: 1809, 1809, 1809, 1809, 1809, 8: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 58: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 461: 1809, 554: 4710, 774: 4824}, + {2412, 2412, 2412, 2412, 7: 2412, 477: 2412}, // 2240 - {2373, 2373, 2373, 2373, 7: 2373, 469: 2373}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4694, 2668, 2669, 2667}, - {2374, 2374, 2374, 2374, 7: 2374, 469: 2374}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4696, 2668, 2669, 2667}, - {2384, 2384, 2384, 2384, 7: 2384, 469: 2384}, + {1809, 1809, 1809, 1809, 7: 1809, 103: 1809, 136: 1809, 461: 1809, 477: 1809, 554: 4710, 774: 4778, 807: 1809}, + {2: 1809, 1809, 1809, 1809, 1809, 8: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 58: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 554: 4710, 774: 4769}, + {565: 4308, 573: 4702, 575: 4697, 631: 4700, 637: 4309, 664: 4701, 4698, 816: 4699, 1173: 4703}, + {565: 4763}, + {2: 2342, 2342, 2342, 2342, 2342, 8: 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 58: 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 461: 2342, 565: 4308, 637: 4309, 816: 4719, 1048: 4757}, // 2245 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4588, 2668, 2669, 2667, 770: 4698}, - {2385, 2385, 2385, 2385, 7: 4589, 469: 2385}, - {2386, 2386, 2386, 2386, 7: 2386, 469: 2386}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4023, 2668, 2669, 2667, 724: 4701}, - {1982, 1982, 1982, 1982, 7: 1982, 469: 1982, 651: 4704, 653: 4703, 892: 4702}, + {2: 1809, 1809, 1809, 1809, 1809, 8: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 58: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 461: 1809, 470: 1809, 554: 4710, 774: 4751}, + {2: 2342, 2342, 2342, 2342, 2342, 8: 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 58: 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 2342, 461: 2342, 470: 2342, 565: 4308, 637: 4309, 816: 4719, 1048: 4720}, + {565: 4708}, + {461: 4704}, + {432, 432, 432, 432, 7: 432, 57: 432, 477: 432}, // 2250 - {2387, 2387, 2387, 2387, 7: 2387, 469: 2387}, - {1981, 1981, 1981, 1981, 7: 1981, 469: 1981}, - {1980, 1980, 1980, 1980, 7: 1980, 469: 1980}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4725, 2668, 2669, 2667}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4023, 2668, 2669, 2667, 724: 4716}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 4705}, + {57: 4706, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {2234, 2234, 2234, 2234, 7: 2234, 57: 2234, 147: 4331, 464: 3979, 3978, 477: 2234, 799: 4332, 921: 4576, 1024: 4707}, + {2192, 2192, 2192, 2192, 7: 2192, 57: 2192, 477: 2192}, + {2: 1809, 1809, 1809, 1809, 1809, 8: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 58: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 461: 1809, 554: 4710, 774: 4709}, // 2255 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4713, 2668, 2669, 2667}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4709, 2668, 2669, 2667}, - {90: 4712, 92: 4711, 833: 4710}, - {2349, 2349, 2349, 2349, 7: 2349, 469: 2349}, - {1771, 1771, 1771, 1771, 1771, 7: 1771, 29: 1771, 53: 1771, 87: 1771, 1771, 1771, 1771, 1771, 1771, 455: 1771, 463: 1771, 469: 1771, 477: 1771}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 461: 1805, 652: 4714, 2670, 2671, 2669, 864: 4713}, + {464: 3979, 3978, 799: 4711}, + {572: 4712}, + {1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 58: 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 1808, 461: 1808, 463: 1808, 470: 1808, 477: 1808, 558: 1808, 807: 1808}, + {461: 4715}, // 2260 - {1770, 1770, 1770, 1770, 1770, 7: 1770, 29: 1770, 53: 1770, 87: 1770, 1770, 1770, 1770, 1770, 1770, 455: 1770, 463: 1770, 469: 1770, 477: 1770}, - {144: 4522, 457: 3969, 3968, 791: 4715, 916: 4714}, - {2351, 2351, 2351, 2351, 7: 2351, 469: 2351}, - {144: 4527}, - {493: 4717, 650: 4718}, + {461: 1804}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 461: 4516, 652: 4033, 2670, 2671, 2669, 732: 4515, 815: 4514, 824: 4716}, + {7: 4525, 57: 4717}, + {634: 4509, 897: 4718}, + {2193, 2193, 2193, 2193, 7: 2193, 57: 2193, 477: 2193}, // 2265 - {459: 4720}, - {459: 4719}, - {2365, 2365, 2365, 2365, 7: 2365, 469: 2365}, - {454: 4722, 456: 3126, 466: 4552, 4551, 473: 3117, 488: 3121, 552: 3116, 3118, 555: 3124, 559: 3125, 3120, 3119, 574: 3123, 693: 4550, 3122, 1110: 4721}, - {2367, 2367, 2367, 2367, 7: 2367, 469: 2367}, + {2: 2341, 2341, 2341, 2341, 2341, 8: 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 58: 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 2341, 461: 2341, 470: 2341}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 461: 1805, 470: 1805, 652: 4722, 2670, 2671, 2669, 864: 4723, 929: 4721}, + {461: 4731}, + {93: 4729, 461: 1804, 470: 1804}, + {461: 1795, 470: 4724}, // 2270 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 4723}, - {53: 4724, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {2366, 2366, 2366, 2366, 7: 2366, 469: 2366}, - {646: 4650, 650: 4651, 660: 4649, 889: 4092, 934: 4726}, - {2390, 2390, 2390, 2390, 7: 4648, 469: 2390}, + {140: 4727, 169: 4726, 182: 4728, 892: 4725}, + {461: 1794}, + {1788, 1788, 1788, 1788, 1788, 7: 1788, 29: 1788, 57: 1788, 92: 1788, 1788, 1788, 1788, 1788, 1788, 460: 1788, 1788, 1788, 470: 1788, 477: 1788, 485: 1788}, + {1787, 1787, 1787, 1787, 1787, 7: 1787, 29: 1787, 57: 1787, 92: 1787, 1787, 1787, 1787, 1787, 1787, 460: 1787, 1787, 1787, 470: 1787, 477: 1787, 485: 1787}, + {1786, 1786, 1786, 1786, 1786, 7: 1786, 29: 1786, 57: 1786, 92: 1786, 1786, 1786, 1786, 1786, 1786, 460: 1786, 1786, 1786, 470: 1786, 477: 1786, 485: 1786}, // 2275 - {2: 1795, 1795, 1795, 1795, 1795, 8: 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 54: 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 454: 1795, 547: 4745, 764: 4859}, - {2395, 2395, 2395, 2395, 7: 2395, 469: 2395}, - {1795, 1795, 1795, 1795, 7: 1795, 100: 1795, 133: 1795, 454: 1795, 469: 1795, 547: 4745, 764: 4813, 799: 1795}, - {2: 1795, 1795, 1795, 1795, 1795, 8: 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 54: 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 547: 4745, 764: 4804}, - {556: 4283, 566: 4737, 568: 4732, 624: 4735, 630: 4284, 656: 4736, 4733, 807: 4734, 1170: 4738}, + {140: 4727, 169: 4726, 182: 4728, 892: 4730}, + {461: 1793}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 461: 4516, 652: 4033, 2670, 2671, 2669, 732: 4515, 815: 4514, 824: 4732}, + {7: 4525, 57: 4733}, + {1803, 1803, 1803, 1803, 1803, 7: 1803, 29: 1803, 57: 1803, 93: 1803, 1803, 1803, 1803, 1803, 462: 1803, 470: 1803, 477: 1803, 866: 4734}, // 2280 - {556: 4798}, - {2: 2324, 2324, 2324, 2324, 2324, 8: 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 54: 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 454: 2324, 556: 4283, 630: 4284, 807: 4754, 1043: 4792}, - {2: 1795, 1795, 1795, 1795, 1795, 8: 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 54: 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 454: 1795, 463: 1795, 547: 4745, 764: 4786}, - {2: 2324, 2324, 2324, 2324, 2324, 8: 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 54: 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 2324, 454: 2324, 463: 2324, 556: 4283, 630: 4284, 807: 4754, 1043: 4755}, - {556: 4743}, + {2194, 2194, 2194, 2194, 4739, 7: 2194, 29: 4736, 57: 2194, 93: 4743, 4603, 4328, 4604, 4327, 462: 4738, 470: 4742, 477: 2194, 844: 4740, 846: 4737, 856: 4741, 865: 4735}, + {1802, 1802, 1802, 1802, 1802, 7: 1802, 29: 1802, 57: 1802, 92: 1802, 1802, 1802, 1802, 1802, 1802, 462: 1802, 470: 1802, 477: 1802, 485: 1802}, + {484: 4180, 495: 1993, 725: 4749}, + {1800, 1800, 1800, 1800, 1800, 7: 1800, 29: 1800, 57: 1800, 92: 1800, 1800, 1800, 1800, 1800, 1800, 462: 1800, 470: 1800, 477: 1800, 485: 1800}, + {352: 4747}, // 2285 - {454: 4739}, - {427, 427, 427, 427, 7: 427, 53: 427, 469: 427}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 4740}, - {53: 4741, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {2218, 2218, 2218, 2218, 7: 2218, 53: 2218, 144: 4522, 457: 3969, 3968, 469: 2218, 791: 4715, 916: 4524, 1019: 4742}, + {463: 4746}, + {1797, 1797, 1797, 1797, 1797, 7: 1797, 29: 1797, 57: 1797, 92: 1797, 1797, 1797, 1797, 1797, 1797, 462: 1797, 470: 1797, 477: 1797, 485: 1797}, + {1796, 1796, 1796, 1796, 1796, 7: 1796, 29: 1796, 57: 1796, 92: 1796, 1796, 1796, 1796, 1796, 1796, 462: 1796, 470: 1796, 477: 1796, 485: 1796}, + {140: 4727, 169: 4726, 182: 4728, 892: 4745}, + {140: 4727, 169: 4726, 182: 4728, 892: 4744}, // 2290 - {2176, 2176, 2176, 2176, 7: 2176, 53: 2176, 469: 2176}, - {2: 1795, 1795, 1795, 1795, 1795, 8: 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 54: 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 454: 1795, 547: 4745, 764: 4744}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 454: 1791, 640: 4749, 2668, 2669, 2667, 851: 4748}, - {457: 3969, 3968, 791: 4746}, - {564: 4747}, + {1789, 1789, 1789, 1789, 1789, 7: 1789, 29: 1789, 57: 1789, 92: 1789, 1789, 1789, 1789, 1789, 1789, 460: 1789, 462: 1789, 470: 1789, 477: 1789, 485: 1789}, + {1790, 1790, 1790, 1790, 1790, 7: 1790, 29: 1790, 57: 1790, 92: 1790, 1790, 1790, 1790, 1790, 1790, 460: 1790, 462: 1790, 470: 1790, 477: 1790, 485: 1790}, + {1798, 1798, 1798, 1798, 1798, 7: 1798, 29: 1798, 57: 1798, 92: 1798, 1798, 1798, 1798, 1798, 1798, 462: 1798, 470: 1798, 477: 1798, 485: 1798}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4748, 2670, 2671, 2669}, + {1799, 1799, 1799, 1799, 1799, 7: 1799, 29: 1799, 57: 1799, 92: 1799, 1799, 1799, 1799, 1799, 1799, 462: 1799, 470: 1799, 477: 1799, 485: 1799}, // 2295 - {1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 54: 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 1794, 454: 1794, 456: 1794, 463: 1794, 469: 1794, 551: 1794, 799: 1794}, - {454: 4750}, - {454: 1790}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 454: 4463, 640: 4023, 2668, 2669, 2667, 724: 4462, 806: 4461, 816: 4751}, - {7: 4472, 53: 4752}, + {495: 2644, 724: 2643, 733: 4750}, + {1801, 1801, 1801, 1801, 1801, 7: 1801, 29: 1801, 57: 1801, 92: 1801, 1801, 1801, 1801, 1801, 1801, 462: 1801, 470: 1801, 477: 1801, 485: 1801}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 461: 1805, 470: 1805, 652: 4722, 2670, 2671, 2669, 864: 4723, 929: 4752}, + {461: 4753}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 461: 4516, 652: 4033, 2670, 2671, 2669, 732: 4515, 815: 4514, 824: 4754}, // 2300 - {626: 4456, 891: 4753}, - {2177, 2177, 2177, 2177, 7: 2177, 53: 2177, 469: 2177}, - {2: 2323, 2323, 2323, 2323, 2323, 8: 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 54: 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 2323, 454: 2323, 463: 2323}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 454: 1791, 463: 1791, 640: 4757, 2668, 2669, 2667, 851: 4758, 924: 4756}, - {454: 4766}, + {7: 4525, 57: 4755}, + {1803, 1803, 1803, 1803, 1803, 7: 1803, 29: 1803, 57: 1803, 93: 1803, 1803, 1803, 1803, 1803, 462: 1803, 470: 1803, 477: 1803, 866: 4756}, + {2195, 2195, 2195, 2195, 4739, 7: 2195, 29: 4736, 57: 2195, 93: 4743, 4603, 4328, 4604, 4327, 462: 4738, 470: 4742, 477: 2195, 844: 4740, 846: 4737, 856: 4741, 865: 4735}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 461: 1805, 652: 4714, 2670, 2671, 2669, 864: 4758}, + {461: 4759}, // 2305 - {88: 4764, 454: 1790, 463: 1790}, - {454: 1781, 463: 4759}, - {138: 4762, 165: 4761, 178: 4763, 882: 4760}, - {454: 1780}, - {1774, 1774, 1774, 1774, 1774, 7: 1774, 29: 1774, 53: 1774, 87: 1774, 1774, 1774, 1774, 1774, 1774, 453: 1774, 1774, 1774, 463: 1774, 469: 1774, 477: 1774}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 461: 4516, 652: 4033, 2670, 2671, 2669, 732: 4515, 815: 4514, 824: 4760}, + {7: 4525, 57: 4761}, + {1803, 1803, 1803, 1803, 1803, 7: 1803, 29: 1803, 57: 1803, 93: 1803, 1803, 1803, 1803, 1803, 462: 1803, 470: 1803, 477: 1803, 866: 4762}, + {2196, 2196, 2196, 2196, 4739, 7: 2196, 29: 4736, 57: 2196, 93: 4743, 4603, 4328, 4604, 4327, 462: 4738, 470: 4742, 477: 2196, 844: 4740, 846: 4737, 856: 4741, 865: 4735}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 461: 1805, 470: 1805, 652: 4722, 2670, 2671, 2669, 864: 4723, 929: 4764}, // 2310 - {1773, 1773, 1773, 1773, 1773, 7: 1773, 29: 1773, 53: 1773, 87: 1773, 1773, 1773, 1773, 1773, 1773, 453: 1773, 1773, 1773, 463: 1773, 469: 1773, 477: 1773}, - {1772, 1772, 1772, 1772, 1772, 7: 1772, 29: 1772, 53: 1772, 87: 1772, 1772, 1772, 1772, 1772, 1772, 453: 1772, 1772, 1772, 463: 1772, 469: 1772, 477: 1772}, - {138: 4762, 165: 4761, 178: 4763, 882: 4765}, - {454: 1779}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 454: 4463, 640: 4023, 2668, 2669, 2667, 724: 4462, 806: 4461, 816: 4767}, + {461: 4765}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 461: 4516, 652: 4033, 2670, 2671, 2669, 732: 4515, 815: 4514, 824: 4766}, + {7: 4525, 57: 4767}, + {1803, 1803, 1803, 1803, 1803, 7: 1803, 29: 1803, 57: 1803, 93: 1803, 1803, 1803, 1803, 1803, 462: 1803, 470: 1803, 477: 1803, 866: 4768}, + {2197, 2197, 2197, 2197, 4739, 7: 2197, 29: 4736, 57: 2197, 93: 4743, 4603, 4328, 4604, 4327, 462: 4738, 470: 4742, 477: 2197, 844: 4740, 846: 4737, 856: 4741, 865: 4735}, // 2315 - {7: 4472, 53: 4768}, - {1789, 1789, 1789, 1789, 1789, 7: 1789, 29: 1789, 53: 1789, 88: 1789, 1789, 1789, 1789, 1789, 455: 1789, 463: 1789, 469: 1789, 853: 4769}, - {2178, 2178, 2178, 2178, 4774, 7: 2178, 29: 4771, 53: 2178, 88: 4778, 4557, 4712, 4558, 4711, 455: 4773, 463: 4777, 469: 2178, 833: 4775, 835: 4772, 844: 4776, 852: 4770}, - {1788, 1788, 1788, 1788, 1788, 7: 1788, 29: 1788, 53: 1788, 87: 1788, 1788, 1788, 1788, 1788, 1788, 455: 1788, 463: 1788, 469: 1788, 477: 1788}, - {478: 4165, 488: 1977, 717: 4784}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4770, 2670, 2671, 2669}, + {221: 4772, 230: 4774, 233: 4773, 1119: 4771}, + {461: 4775}, + {57: 2152, 461: 2152}, + {57: 2151, 461: 2151}, // 2320 - {1786, 1786, 1786, 1786, 1786, 7: 1786, 29: 1786, 53: 1786, 87: 1786, 1786, 1786, 1786, 1786, 1786, 455: 1786, 463: 1786, 469: 1786, 477: 1786}, - {348: 4782}, - {456: 4781}, - {1783, 1783, 1783, 1783, 1783, 7: 1783, 29: 1783, 53: 1783, 87: 1783, 1783, 1783, 1783, 1783, 1783, 455: 1783, 463: 1783, 469: 1783, 477: 1783}, - {1782, 1782, 1782, 1782, 1782, 7: 1782, 29: 1782, 53: 1782, 87: 1782, 1782, 1782, 1782, 1782, 1782, 455: 1782, 463: 1782, 469: 1782, 477: 1782}, + {57: 2150, 461: 2150}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4033, 2670, 2671, 2669, 732: 4034, 797: 4776}, + {7: 4036, 57: 4777}, + {2409, 2409, 2409, 2409, 7: 2409, 477: 2409}, + {550, 550, 550, 550, 7: 550, 103: 550, 136: 4630, 461: 550, 477: 550, 807: 4629, 825: 4779}, // 2325 - {138: 4762, 165: 4761, 178: 4763, 882: 4780}, - {138: 4762, 165: 4761, 178: 4763, 882: 4779}, - {1775, 1775, 1775, 1775, 1775, 7: 1775, 29: 1775, 53: 1775, 87: 1775, 1775, 1775, 1775, 1775, 1775, 453: 1775, 455: 1775, 463: 1775, 469: 1775, 477: 1775}, - {1776, 1776, 1776, 1776, 1776, 7: 1776, 29: 1776, 53: 1776, 87: 1776, 1776, 1776, 1776, 1776, 1776, 453: 1776, 455: 1776, 463: 1776, 469: 1776, 477: 1776}, - {1784, 1784, 1784, 1784, 1784, 7: 1784, 29: 1784, 53: 1784, 87: 1784, 1784, 1784, 1784, 1784, 1784, 455: 1784, 463: 1784, 469: 1784, 477: 1784}, + {2088, 2088, 2088, 2088, 7: 2088, 103: 4781, 461: 4782, 477: 2088, 1079: 4780}, + {2411, 2411, 2411, 2411, 7: 2411, 477: 2411}, + {495: 2644, 724: 4823}, + {477: 4785, 936: 4784, 1078: 4783}, + {7: 4821, 57: 4820}, // 2330 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4783, 2668, 2669, 2667}, - {1785, 1785, 1785, 1785, 1785, 7: 1785, 29: 1785, 53: 1785, 87: 1785, 1785, 1785, 1785, 1785, 1785, 455: 1785, 463: 1785, 469: 1785, 477: 1785}, - {488: 2642, 716: 2641, 725: 4785}, - {1787, 1787, 1787, 1787, 1787, 7: 1787, 29: 1787, 53: 1787, 87: 1787, 1787, 1787, 1787, 1787, 1787, 455: 1787, 463: 1787, 469: 1787, 477: 1787}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 454: 1791, 463: 1791, 640: 4757, 2668, 2669, 2667, 851: 4758, 924: 4787}, + {7: 2086, 57: 2086}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4786, 2670, 2671, 2669}, + {4: 2065, 2065, 7: 2065, 15: 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065, 30: 2065, 2065, 2065, 2065, 2065, 2065, 2065, 57: 2065, 146: 4791, 328: 4790, 461: 2065, 466: 4789, 486: 4788, 637: 2065, 1248: 4787}, + {4: 2078, 2078, 7: 2078, 15: 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 30: 2078, 2078, 2078, 2078, 2078, 2078, 2078, 57: 2078, 461: 2078, 637: 2078, 935: 4807}, + {338: 4792, 532: 4793}, // 2335 - {454: 4788}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 454: 4463, 640: 4023, 2668, 2669, 2667, 724: 4462, 806: 4461, 816: 4789}, - {7: 4472, 53: 4790}, - {1789, 1789, 1789, 1789, 1789, 7: 1789, 29: 1789, 53: 1789, 88: 1789, 1789, 1789, 1789, 1789, 455: 1789, 463: 1789, 469: 1789, 853: 4791}, - {2179, 2179, 2179, 2179, 4774, 7: 2179, 29: 4771, 53: 2179, 88: 4778, 4557, 4712, 4558, 4711, 455: 4773, 463: 4777, 469: 2179, 833: 4775, 835: 4772, 844: 4776, 852: 4770}, + {4: 2062, 2062, 7: 2062, 15: 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 30: 2062, 2062, 2062, 2062, 2062, 2062, 2062, 57: 2062, 461: 2062, 637: 2062}, + {4: 2060, 2060, 7: 2060, 15: 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060, 30: 2060, 2060, 2060, 2060, 2060, 2060, 2060, 57: 2060, 461: 2060, 637: 2060}, + {4: 2059, 2059, 7: 2059, 15: 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059, 30: 2059, 2059, 2059, 2059, 2059, 2059, 2059, 57: 2059, 461: 2059, 637: 2059}, + {383: 4802}, + {461: 4794}, // 2340 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 454: 1791, 640: 4749, 2668, 2669, 2667, 851: 4793}, - {454: 4794}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 454: 4463, 640: 4023, 2668, 2669, 2667, 724: 4462, 806: 4461, 816: 4795}, - {7: 4472, 53: 4796}, - {1789, 1789, 1789, 1789, 1789, 7: 1789, 29: 1789, 53: 1789, 88: 1789, 1789, 1789, 1789, 1789, 455: 1789, 463: 1789, 469: 1789, 853: 4797}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 646: 4796, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 4797, 932: 4798, 1059: 4795}, + {7: 4800, 57: 4799}, + {7: 1885, 57: 1885}, + {7: 1884, 57: 1884, 473: 3581, 3580, 3586, 511: 3582, 544: 3583, 3584, 3577, 3587, 3576, 3585, 3578, 3579}, + {7: 1872, 57: 1872}, // 2345 - {2180, 2180, 2180, 2180, 4774, 7: 2180, 29: 4771, 53: 2180, 88: 4778, 4557, 4712, 4558, 4711, 455: 4773, 463: 4777, 469: 2180, 833: 4775, 835: 4772, 844: 4776, 852: 4770}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 454: 1791, 463: 1791, 640: 4757, 2668, 2669, 2667, 851: 4758, 924: 4799}, - {454: 4800}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 454: 4463, 640: 4023, 2668, 2669, 2667, 724: 4462, 806: 4461, 816: 4801}, - {7: 4472, 53: 4802}, + {4: 2061, 2061, 7: 2061, 15: 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 30: 2061, 2061, 2061, 2061, 2061, 2061, 2061, 57: 2061, 461: 2061, 637: 2061}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 646: 4796, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 4797, 932: 4801}, + {7: 1871, 57: 1871}, + {461: 4804, 646: 4803}, + {4: 2064, 2064, 7: 2064, 15: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064, 30: 2064, 2064, 2064, 2064, 2064, 2064, 2064, 57: 2064, 461: 2064, 637: 2064}, // 2350 - {1789, 1789, 1789, 1789, 1789, 7: 1789, 29: 1789, 53: 1789, 88: 1789, 1789, 1789, 1789, 1789, 455: 1789, 463: 1789, 469: 1789, 853: 4803}, - {2181, 2181, 2181, 2181, 4774, 7: 2181, 29: 4771, 53: 2181, 88: 4778, 4557, 4712, 4558, 4711, 455: 4773, 463: 4777, 469: 2181, 833: 4775, 835: 4772, 844: 4776, 852: 4770}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4805, 2668, 2669, 2667}, - {215: 4807, 224: 4809, 227: 4808, 1115: 4806}, - {454: 4810}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 646: 4796, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 4797, 932: 4798, 1059: 4805}, + {7: 4800, 57: 4806}, + {4: 2063, 2063, 7: 2063, 15: 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063, 30: 2063, 2063, 2063, 2063, 2063, 2063, 2063, 57: 2063, 461: 2063, 637: 2063}, + {4: 4140, 4811, 7: 2083, 15: 4086, 4098, 4091, 4093, 4087, 4092, 4095, 4089, 4085, 4090, 4094, 4088, 30: 4148, 4141, 4144, 4143, 4146, 4147, 4149, 57: 2083, 461: 4809, 637: 4145, 760: 4096, 766: 4097, 769: 4150, 801: 4810, 1289: 4808}, + {7: 2084, 57: 2084}, // 2355 - {53: 2136, 454: 2136}, - {53: 2135, 454: 2135}, - {53: 2134, 454: 2134}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4023, 2668, 2669, 2667, 724: 4024, 766: 4811}, - {7: 4026, 53: 4812}, + {100: 4814, 1121: 4813, 1288: 4812}, + {2077, 2077, 4: 2077, 2077, 7: 2077, 15: 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 2077, 30: 2077, 2077, 2077, 2077, 2077, 2077, 2077, 57: 2077, 461: 2077, 637: 2077}, + {31: 4279}, + {7: 4818, 57: 4817}, + {7: 2081, 57: 2081}, // 2360 - {2392, 2392, 2392, 2392, 7: 2392, 469: 2392}, - {545, 545, 545, 545, 7: 545, 100: 545, 133: 4584, 454: 545, 469: 545, 799: 4583, 817: 4814}, - {2072, 2072, 2072, 2072, 7: 2072, 100: 4816, 454: 4817, 469: 2072, 1075: 4815}, - {2394, 2394, 2394, 2394, 7: 2394, 469: 2394}, - {488: 2642, 716: 4858}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4815, 2670, 2671, 2669}, + {4: 2078, 2078, 7: 2078, 15: 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 30: 2078, 2078, 2078, 2078, 2078, 2078, 2078, 57: 2078, 637: 2078, 935: 4816}, + {4: 4140, 4811, 7: 2079, 15: 4086, 4098, 4091, 4093, 4087, 4092, 4095, 4089, 4085, 4090, 4094, 4088, 30: 4148, 4141, 4144, 4143, 4146, 4147, 4149, 57: 2079, 637: 4145, 760: 4096, 766: 4097, 769: 4150, 801: 4810}, + {7: 2082, 57: 2082}, + {100: 4814, 1121: 4819}, // 2365 - {469: 4820, 931: 4819, 1074: 4818}, - {7: 4856, 53: 4855}, - {7: 2070, 53: 2070}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4821, 2668, 2669, 2667}, - {4: 2049, 2049, 7: 2049, 13: 2049, 16: 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 2049, 30: 2049, 2049, 2049, 2049, 2049, 2049, 2049, 53: 2049, 143: 4826, 322: 4825, 454: 2049, 459: 4824, 481: 4823, 630: 2049, 1246: 4822}, + {7: 2080, 57: 2080}, + {2087, 2087, 2087, 2087, 7: 2087, 460: 2087, 2087, 2087, 467: 2087, 476: 2087, 2087, 486: 2087, 493: 2087, 555: 2087, 633: 2087}, + {477: 4785, 936: 4822}, + {7: 2085, 57: 2085}, + {2410, 2410, 2410, 2410, 7: 2410, 477: 2410}, // 2370 - {4: 2062, 2062, 7: 2062, 13: 2062, 16: 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 30: 2062, 2062, 2062, 2062, 2062, 2062, 2062, 53: 2062, 454: 2062, 630: 2062, 930: 4842}, - {334: 4827, 525: 4828}, - {4: 2046, 2046, 7: 2046, 13: 2046, 16: 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046, 30: 2046, 2046, 2046, 2046, 2046, 2046, 2046, 53: 2046, 454: 2046, 630: 2046}, - {4: 2044, 2044, 7: 2044, 13: 2044, 16: 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 2044, 30: 2044, 2044, 2044, 2044, 2044, 2044, 2044, 53: 2044, 454: 2044, 630: 2044}, - {4: 2043, 2043, 7: 2043, 13: 2043, 16: 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 2043, 30: 2043, 2043, 2043, 2043, 2043, 2043, 2043, 53: 2043, 454: 2043, 630: 2043}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 461: 4826, 652: 4033, 2670, 2671, 2669, 732: 4354, 835: 4825}, + {2338, 2338, 2338, 2338, 7: 2338, 4611, 4612, 477: 2338, 916: 4834}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 565: 2329, 573: 2329, 575: 2329, 631: 2329, 4487, 637: 2329, 652: 4033, 2670, 2671, 2669, 664: 2329, 2329, 732: 4354, 821: 4696, 835: 4828, 890: 4829, 952: 4830, 1124: 4827}, + {7: 4832, 57: 4831}, + {7: 429, 57: 429}, // 2375 - {380: 4837}, - {454: 4829}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 638: 4831, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 4832, 927: 4833, 1054: 4830}, - {7: 4835, 53: 4834}, - {7: 1871, 53: 1871}, + {7: 428, 57: 428}, + {7: 427, 57: 427}, + {2413, 2413, 2413, 2413, 7: 2413, 477: 2413}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 565: 2329, 573: 2329, 575: 2329, 631: 2329, 4487, 637: 2329, 652: 4033, 2670, 2671, 2669, 664: 2329, 2329, 732: 4354, 821: 4696, 835: 4828, 890: 4829, 952: 4833}, + {7: 426, 57: 426}, // 2380 - {7: 1870, 53: 1870, 466: 3572, 3571, 3577, 504: 3573, 537: 3574, 3575, 3568, 3578, 3567, 3576, 3569, 3570}, - {7: 1858, 53: 1858}, - {4: 2045, 2045, 7: 2045, 13: 2045, 16: 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 2045, 30: 2045, 2045, 2045, 2045, 2045, 2045, 2045, 53: 2045, 454: 2045, 630: 2045}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 638: 4831, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 4832, 927: 4836}, - {7: 1857, 53: 1857}, + {2414, 2414, 2414, 2414, 7: 2414, 477: 2414}, + {13: 3728, 488: 3729, 636: 3727, 761: 4836}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 466: 4838, 531: 3653, 652: 3385, 2670, 2671, 2669, 727: 3652, 796: 4837}, + {257, 257, 257, 257, 7: 257, 469: 4840, 477: 257, 1070: 4842}, + {257, 257, 257, 257, 7: 257, 469: 4840, 477: 257, 1070: 4839}, // 2385 - {454: 4839, 638: 4838}, - {4: 2048, 2048, 7: 2048, 13: 2048, 16: 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 30: 2048, 2048, 2048, 2048, 2048, 2048, 2048, 53: 2048, 454: 2048, 630: 2048}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 638: 4831, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 4832, 927: 4833, 1054: 4840}, - {7: 4835, 53: 4841}, - {4: 2047, 2047, 7: 2047, 13: 2047, 16: 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 30: 2047, 2047, 2047, 2047, 2047, 2047, 2047, 53: 2047, 454: 2047, 630: 2047}, + {2415, 2415, 2415, 2415, 7: 2415, 477: 2415}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 531: 3383, 652: 3385, 2670, 2671, 2669, 727: 3382, 859: 4841}, + {256, 256, 256, 256, 7: 256, 477: 256}, + {2416, 2416, 2416, 2416, 7: 2416, 477: 2416}, + {365: 4844}, // 2390 - {4: 4130, 4846, 7: 2067, 13: 4081, 16: 4076, 4088, 4083, 4077, 4082, 4085, 4079, 4075, 4080, 4084, 4078, 30: 4138, 4131, 4134, 4133, 4136, 4137, 4139, 53: 2067, 454: 4844, 630: 4135, 753: 4086, 757: 4087, 759: 4140, 793: 4845, 1287: 4843}, - {7: 2068, 53: 2068}, - {97: 4849, 1117: 4848, 1286: 4847}, - {2061, 2061, 4: 2061, 2061, 7: 2061, 13: 2061, 16: 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061, 30: 2061, 2061, 2061, 2061, 2061, 2061, 2061, 53: 2061, 454: 2061, 630: 2061}, - {31: 4254}, + {495: 2644, 724: 2643, 733: 4845}, + {2420, 2420, 2420, 2420, 7: 2420, 199: 4846, 477: 2420, 1223: 4847}, + {252: 4848}, + {2417, 2417, 2417, 2417, 7: 2417, 477: 2417}, + {463: 4850, 1285: 4849}, // 2395 - {7: 4853, 53: 4852}, - {7: 2065, 53: 2065}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4850, 2668, 2669, 2667}, - {4: 2062, 2062, 7: 2062, 13: 2062, 16: 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 30: 2062, 2062, 2062, 2062, 2062, 2062, 2062, 53: 2062, 630: 2062, 930: 4851}, - {4: 4130, 4846, 7: 2063, 13: 4081, 16: 4076, 4088, 4083, 4077, 4082, 4085, 4079, 4075, 4080, 4084, 4078, 30: 4138, 4131, 4134, 4133, 4136, 4137, 4139, 53: 2063, 630: 4135, 753: 4086, 757: 4087, 759: 4140, 793: 4845}, + {2419, 2419, 2419, 2419, 7: 4851, 477: 2419}, + {255, 255, 255, 255, 7: 255, 477: 255}, + {463: 4852}, + {254, 254, 254, 254, 7: 254, 477: 254}, + {6: 388, 38: 388}, // 2400 - {7: 2066, 53: 2066}, - {97: 4849, 1117: 4854}, - {7: 2064, 53: 2064}, - {2071, 2071, 2071, 2071, 7: 2071, 453: 2071, 2071, 2071, 460: 2071, 469: 2071, 2071, 481: 2071, 487: 2071, 550: 2071, 628: 2071}, - {469: 4820, 931: 4857}, + {382, 382, 382, 382, 382, 382, 382, 382, 13: 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 460: 382, 382, 382, 466: 382, 382, 382, 382, 476: 382, 382, 486: 382, 382, 382, 493: 382, 555: 382, 633: 382, 636: 382, 382}, + {4: 4140, 4142, 389, 13: 2112, 4159, 4086, 4098, 4091, 4093, 4087, 4092, 4095, 4089, 4085, 4090, 4094, 4088, 4157, 4177, 4161, 4148, 4141, 4144, 4143, 4146, 4147, 4149, 4156, 389, 4167, 4168, 4154, 4155, 4160, 4162, 4174, 4173, 4179, 4175, 4172, 4165, 4170, 4171, 4164, 4166, 4169, 4158, 466: 4139, 468: 4176, 2112, 487: 4853, 2112, 636: 2112, 4145, 760: 4096, 766: 4097, 769: 4150, 781: 4152, 801: 4151, 823: 4153, 827: 4163, 831: 4856}, + {381, 381, 381, 381, 381, 381, 381, 381, 13: 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 460: 381, 381, 381, 466: 381, 381, 381, 381, 476: 381, 381, 486: 381, 381, 381, 493: 381, 555: 381, 633: 381, 636: 381, 381}, + {463: 4859, 466: 4858}, + {2427, 2427, 2427, 2427, 7: 2427, 477: 2427}, // 2405 - {7: 2069, 53: 2069}, - {2393, 2393, 2393, 2393, 7: 2393, 469: 2393}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 454: 4861, 640: 4023, 2668, 2669, 2667, 724: 4301, 825: 4860}, - {2320, 2320, 2320, 2320, 7: 2320, 4565, 4566, 469: 2320, 911: 4869}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 556: 2311, 566: 2311, 568: 2311, 624: 2311, 4434, 630: 2311, 640: 4023, 2668, 2669, 2667, 656: 2311, 2311, 724: 4301, 813: 4731, 825: 4863, 880: 4864, 948: 4865, 1120: 4862}, + {2426, 2426, 2426, 2426, 7: 2426, 477: 2426}, + {463: 4862, 466: 4861}, + {2429, 2429, 2429, 2429, 7: 2429, 477: 2429}, + {2428, 2428, 2428, 2428, 7: 2428, 477: 2428}, + {2: 1993, 1993, 1993, 1993, 1993, 8: 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 58: 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 463: 1993, 466: 1993, 484: 4180, 500: 4865, 725: 4864}, // 2410 - {7: 4867, 53: 4866}, - {7: 424, 53: 424}, - {7: 423, 53: 423}, - {7: 422, 53: 422}, - {2396, 2396, 2396, 2396, 7: 2396, 469: 2396}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 4867, 466: 4869, 652: 4870, 2670, 2671, 2669, 872: 4868}, + {466: 4866}, + {2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 13: 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 460: 2430, 2430, 2430, 466: 2430, 2430, 2430, 2430, 476: 2430, 2430, 486: 2430, 2430, 2430, 493: 2430, 555: 2430, 633: 2430, 636: 2430, 2430}, + {2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 13: 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 460: 2433, 2433, 2433, 466: 2433, 2433, 2433, 2433, 476: 2433, 2433, 486: 2433, 2433, 2433, 493: 2433, 555: 2433, 633: 2433, 636: 2433, 2433}, + {2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 13: 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 460: 2432, 2432, 2432, 466: 2432, 2432, 2432, 2432, 476: 2432, 2432, 486: 2432, 2432, 2432, 493: 2432, 555: 2432, 633: 2432, 636: 2432, 2432}, // 2415 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 556: 2311, 566: 2311, 568: 2311, 624: 2311, 4434, 630: 2311, 640: 4023, 2668, 2669, 2667, 656: 2311, 2311, 724: 4301, 813: 4731, 825: 4863, 880: 4864, 948: 4868}, - {7: 421, 53: 421}, - {2397, 2397, 2397, 2397, 7: 2397, 469: 2397}, - {2: 1977, 1977, 1977, 1977, 1977, 8: 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 54: 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 456: 1977, 459: 1977, 478: 4165, 493: 4872, 717: 4871}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 4874, 459: 4876, 640: 4877, 2668, 2669, 2667, 860: 4875}, + {2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 13: 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 460: 2431, 2431, 2431, 466: 2431, 2431, 2431, 2431, 476: 2431, 2431, 486: 2431, 2431, 2431, 493: 2431, 555: 2431, 633: 2431, 636: 2431, 2431}, + {2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 13: 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127, 460: 2127, 2127, 2127, 466: 2127, 2127, 2127, 2127, 476: 2127, 2127, 486: 2127, 2127, 2127, 493: 2127, 555: 2127, 633: 2127, 636: 2127, 2127}, + {463: 4872}, + {2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 13: 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 460: 2436, 2436, 2436, 466: 2436, 2436, 2436, 2436, 476: 2436, 2436, 486: 2436, 2436, 2436, 493: 2436, 555: 2436, 633: 2436, 636: 2436, 2436}, + {463: 4874}, // 2420 - {459: 4873}, - {2422, 2422, 2422, 2422, 2422, 2422, 2422, 2422, 13: 2422, 2422, 2422, 2422, 2422, 2422, 2422, 2422, 2422, 2422, 2422, 2422, 2422, 2422, 2422, 2422, 2422, 2422, 2422, 2422, 2422, 2422, 2422, 2422, 2422, 2422, 2422, 2422, 2422, 2422, 2422, 2422, 2422, 2422, 2422, 2422, 2422, 2422, 2422, 53: 2422, 453: 2422, 2422, 2422, 459: 2422, 2422, 2422, 2422, 469: 2422, 2422, 481: 2422, 483: 2422, 485: 2422, 487: 2422, 550: 2422, 628: 2422, 2422, 2422}, - {2425, 2425, 2425, 2425, 2425, 2425, 2425, 2425, 13: 2425, 2425, 2425, 2425, 2425, 2425, 2425, 2425, 2425, 2425, 2425, 2425, 2425, 2425, 2425, 2425, 2425, 2425, 2425, 2425, 2425, 2425, 2425, 2425, 2425, 2425, 2425, 2425, 2425, 2425, 2425, 2425, 2425, 2425, 2425, 2425, 2425, 2425, 2425, 53: 2425, 453: 2425, 2425, 2425, 459: 2425, 2425, 2425, 2425, 469: 2425, 2425, 481: 2425, 483: 2425, 485: 2425, 487: 2425, 550: 2425, 628: 2425, 2425, 2425}, - {2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 13: 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 2424, 53: 2424, 453: 2424, 2424, 2424, 459: 2424, 2424, 2424, 2424, 469: 2424, 2424, 481: 2424, 483: 2424, 485: 2424, 487: 2424, 550: 2424, 628: 2424, 2424, 2424}, - {2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 13: 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 53: 2423, 453: 2423, 2423, 2423, 459: 2423, 2423, 2423, 2423, 469: 2423, 2423, 481: 2423, 483: 2423, 485: 2423, 487: 2423, 550: 2423, 628: 2423, 2423, 2423}, + {2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 13: 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 460: 2437, 2437, 2437, 466: 2437, 2437, 2437, 2437, 476: 2437, 2437, 486: 2437, 2437, 2437, 493: 2437, 555: 2437, 633: 2437, 636: 2437, 2437}, + {463: 4876}, + {2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 13: 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 460: 2438, 2438, 2438, 466: 2438, 2438, 2438, 2438, 476: 2438, 2438, 486: 2438, 2438, 2438, 493: 2438, 555: 2438, 633: 2438, 636: 2438, 2438}, + {463: 4878}, + {2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 13: 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 460: 2439, 2439, 2439, 466: 2439, 2439, 2439, 2439, 476: 2439, 2439, 486: 2439, 2439, 2439, 493: 2439, 555: 2439, 633: 2439, 636: 2439, 2439}, // 2425 - {2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 13: 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 2111, 53: 2111, 453: 2111, 2111, 2111, 459: 2111, 2111, 2111, 2111, 469: 2111, 2111, 481: 2111, 483: 2111, 485: 2111, 487: 2111, 550: 2111, 628: 2111, 2111, 2111}, - {456: 4879}, - {2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428, 13: 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428, 2428, 53: 2428, 453: 2428, 2428, 2428, 459: 2428, 2428, 2428, 2428, 469: 2428, 2428, 481: 2428, 483: 2428, 485: 2428, 487: 2428, 550: 2428, 628: 2428, 2428, 2428}, - {456: 4881}, - {2429, 2429, 2429, 2429, 2429, 2429, 2429, 2429, 13: 2429, 2429, 2429, 2429, 2429, 2429, 2429, 2429, 2429, 2429, 2429, 2429, 2429, 2429, 2429, 2429, 2429, 2429, 2429, 2429, 2429, 2429, 2429, 2429, 2429, 2429, 2429, 2429, 2429, 2429, 2429, 2429, 2429, 2429, 2429, 2429, 2429, 2429, 2429, 53: 2429, 453: 2429, 2429, 2429, 459: 2429, 2429, 2429, 2429, 469: 2429, 2429, 481: 2429, 483: 2429, 485: 2429, 487: 2429, 550: 2429, 628: 2429, 2429, 2429}, + {463: 4880}, + {2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 13: 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 460: 2440, 2440, 2440, 466: 2440, 2440, 2440, 2440, 476: 2440, 2440, 486: 2440, 2440, 2440, 493: 2440, 555: 2440, 633: 2440, 636: 2440, 2440}, + {463: 4882}, + {2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 13: 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 460: 2441, 2441, 2441, 466: 2441, 2441, 2441, 2441, 476: 2441, 2441, 486: 2441, 2441, 2441, 493: 2441, 555: 2441, 633: 2441, 636: 2441, 2441}, + {495: 2644, 724: 2643, 733: 4884}, // 2430 - {456: 4883}, - {2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 13: 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 53: 2430, 453: 2430, 2430, 2430, 459: 2430, 2430, 2430, 2430, 469: 2430, 2430, 481: 2430, 483: 2430, 485: 2430, 487: 2430, 550: 2430, 628: 2430, 2430, 2430}, - {456: 4885}, - {2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 13: 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 2431, 53: 2431, 453: 2431, 2431, 2431, 459: 2431, 2431, 2431, 2431, 469: 2431, 2431, 481: 2431, 483: 2431, 485: 2431, 487: 2431, 550: 2431, 628: 2431, 2431, 2431}, - {456: 4887}, + {2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 13: 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 460: 2442, 2442, 2442, 466: 2442, 2442, 2442, 2442, 476: 2442, 2442, 486: 2442, 2442, 2442, 493: 2442, 555: 2442, 633: 2442, 636: 2442, 2442}, + {495: 2644, 724: 2643, 733: 4886}, + {2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 13: 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 460: 2443, 2443, 2443, 466: 2443, 2443, 2443, 2443, 476: 2443, 2443, 486: 2443, 2443, 2443, 493: 2443, 555: 2443, 633: 2443, 636: 2443, 2443}, + {495: 2644, 724: 2643, 733: 4888}, + {2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 13: 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 2444, 460: 2444, 2444, 2444, 466: 2444, 2444, 2444, 2444, 476: 2444, 2444, 486: 2444, 2444, 2444, 493: 2444, 555: 2444, 633: 2444, 636: 2444, 2444}, // 2435 - {2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 13: 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432, 53: 2432, 453: 2432, 2432, 2432, 459: 2432, 2432, 2432, 2432, 469: 2432, 2432, 481: 2432, 483: 2432, 485: 2432, 487: 2432, 550: 2432, 628: 2432, 2432, 2432}, - {456: 4889}, - {2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 13: 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 2433, 53: 2433, 453: 2433, 2433, 2433, 459: 2433, 2433, 2433, 2433, 469: 2433, 2433, 481: 2433, 483: 2433, 485: 2433, 487: 2433, 550: 2433, 628: 2433, 2433, 2433}, - {488: 2642, 716: 2641, 725: 4891}, - {2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 13: 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 2434, 53: 2434, 453: 2434, 2434, 2434, 459: 2434, 2434, 2434, 2434, 469: 2434, 2434, 481: 2434, 483: 2434, 485: 2434, 487: 2434, 550: 2434, 628: 2434, 2434, 2434}, + {463: 4890}, + {2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 13: 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 2445, 460: 2445, 2445, 2445, 466: 2445, 2445, 2445, 2445, 476: 2445, 2445, 486: 2445, 2445, 2445, 493: 2445, 555: 2445, 633: 2445, 636: 2445, 2445}, + {463: 4892}, + {2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 13: 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 2446, 460: 2446, 2446, 2446, 466: 2446, 2446, 2446, 2446, 476: 2446, 2446, 486: 2446, 2446, 2446, 493: 2446, 555: 2446, 633: 2446, 636: 2446, 2446}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4634, 2670, 2671, 2669, 778: 4894}, // 2440 - {488: 2642, 716: 2641, 725: 4893}, - {2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 13: 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 2435, 53: 2435, 453: 2435, 2435, 2435, 459: 2435, 2435, 2435, 2435, 469: 2435, 2435, 481: 2435, 483: 2435, 485: 2435, 487: 2435, 550: 2435, 628: 2435, 2435, 2435}, - {488: 2642, 716: 2641, 725: 4895}, - {2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 13: 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 2436, 53: 2436, 453: 2436, 2436, 2436, 459: 2436, 2436, 2436, 2436, 469: 2436, 2436, 481: 2436, 483: 2436, 485: 2436, 487: 2436, 550: 2436, 628: 2436, 2436, 2436}, - {456: 4897}, + {2290, 2290, 7: 4635, 462: 4897, 637: 4896, 793: 4895}, + {2451, 2451}, + {875, 875, 2906, 2754, 2790, 2908, 2681, 875, 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 462: 875, 575: 4914, 652: 4913, 2670, 2671, 2669, 845: 4912}, + {495: 4902, 561: 3319, 3318, 724: 4900, 808: 4901, 975: 4899, 1151: 4898}, + {2289, 2289, 7: 4910}, // 2445 - {2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 13: 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 53: 2437, 453: 2437, 2437, 2437, 459: 2437, 2437, 2437, 2437, 469: 2437, 2437, 481: 2437, 483: 2437, 485: 2437, 487: 2437, 550: 2437, 628: 2437, 2437, 2437}, - {456: 4899}, - {2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 13: 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 2438, 53: 2438, 453: 2438, 2438, 2438, 459: 2438, 2438, 2438, 2438, 469: 2438, 2438, 481: 2438, 483: 2438, 485: 2438, 487: 2438, 550: 2438, 628: 2438, 2438, 2438}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4588, 2668, 2669, 2667, 770: 4901}, - {2273, 2273, 7: 4589, 455: 4904, 630: 4903, 784: 4902}, + {2288, 2288, 7: 2288}, + {220: 4904, 224: 4906, 268: 4907, 287: 4905}, + {184: 4903}, + {184: 2155, 220: 1924, 224: 1924, 268: 1924, 287: 1924}, + {2281, 2281, 7: 2281}, // 2450 - {2449, 2449}, - {868, 868, 2900, 2748, 2784, 2902, 2675, 868, 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 455: 868, 568: 4918, 640: 4917, 2668, 2669, 2667, 834: 4916}, - {488: 2642, 716: 4907, 970: 4906, 1148: 4905}, - {2272, 2272, 7: 4914}, - {2271, 2271, 7: 2271}, + {2286, 2286, 7: 2286}, + {2285, 2285, 7: 2285}, + {313: 4908, 394: 4909}, + {2282, 2282, 7: 2282}, + {2284, 2284, 7: 2284}, // 2455 - {214: 4908, 218: 4910, 263: 4911, 281: 4909}, - {2269, 2269, 7: 2269}, - {2268, 2268, 7: 2268}, - {307: 4912, 392: 4913}, - {2265, 2265, 7: 2265}, + {2283, 2283, 7: 2283}, + {495: 4902, 561: 3319, 3318, 724: 4900, 808: 4901, 975: 4911}, + {2287, 2287, 7: 2287}, + {2290, 2290, 7: 4916, 462: 4897, 793: 4915}, + {874, 874, 7: 874, 57: 874, 462: 874}, // 2460 - {2267, 2267, 7: 2267}, - {2266, 2266, 7: 2266}, - {488: 2642, 716: 4907, 970: 4915}, - {2270, 2270, 7: 2270}, - {2273, 2273, 7: 4920, 455: 4904, 784: 4919}, + {872, 872, 7: 872, 57: 872, 462: 872}, + {2450, 2450}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 575: 4918, 652: 4917, 2670, 2671, 2669}, + {873, 873, 7: 873, 57: 873, 462: 873}, + {871, 871, 7: 871, 57: 871, 462: 871}, // 2465 - {867, 867, 7: 867, 53: 867, 455: 867}, - {865, 865, 7: 865, 53: 865, 455: 865}, - {2448, 2448}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 568: 4922, 640: 4921, 2668, 2669, 2667}, - {866, 866, 7: 866, 53: 866, 455: 866}, + {2452, 2452}, + {2425, 2425}, + {354: 4986}, + {477: 4978}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 648: 4925, 652: 4924, 2670, 2671, 2669}, // 2470 - {864, 864, 7: 864, 53: 864, 455: 864}, - {2450, 2450}, - {2408, 2408}, - {350: 4990}, - {469: 4982}, + {2078, 2078, 4: 2078, 2078, 15: 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078, 30: 2078, 2078, 2078, 2078, 2078, 2078, 2078, 190: 4099, 637: 2078, 913: 4976, 935: 4977}, + {140: 2096, 340: 4930, 378: 4931, 515: 4929, 565: 2096, 1053: 4932, 4927, 1122: 4928, 1250: 4926}, + {2090, 2090, 100: 2090, 103: 4966, 460: 2090, 2090, 2090, 467: 2090, 476: 2090, 486: 2090, 493: 2090, 555: 2090, 633: 2090, 1251: 4965}, + {140: 4953, 565: 4952}, + {2104, 2104, 100: 2104, 103: 2104, 460: 2104, 2104, 2104, 467: 2104, 476: 2104, 486: 2104, 493: 2104, 555: 2104, 633: 2104}, // 2475 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4928, 2668, 2669, 2667, 4929}, - {2062, 2062, 4: 2062, 2062, 13: 2062, 16: 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 2062, 30: 2062, 2062, 2062, 2062, 2062, 2062, 2062, 185: 4094, 630: 2062, 908: 4980, 930: 4981}, - {138: 2080, 336: 4934, 376: 4935, 508: 4933, 556: 2080, 1048: 4936, 4931, 1118: 4932, 1248: 4930}, - {2074, 2074, 97: 2074, 100: 4970, 453: 2074, 2074, 2074, 460: 2074, 470: 2074, 481: 2074, 487: 2074, 550: 2074, 628: 2074, 1249: 4969}, - {138: 4957, 556: 4956}, + {98: 3836, 107: 3835, 461: 4945, 822: 4946}, + {98: 3836, 107: 3835, 461: 4938, 822: 4939}, + {2097, 2097, 100: 2097, 103: 2097, 460: 2097, 2097, 2097, 467: 2097, 476: 2097, 482: 4934, 486: 2097, 493: 2097, 555: 2097, 569: 4933, 633: 2097}, + {140: 2095, 565: 2095}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 4936}, // 2480 - {2088, 2088, 97: 2088, 100: 2088, 453: 2088, 2088, 2088, 460: 2088, 470: 2088, 481: 2088, 487: 2088, 550: 2088, 628: 2088}, - {95: 3827, 104: 3826, 454: 4949, 814: 4950}, - {95: 3827, 104: 3826, 454: 4942, 814: 4943}, - {2081, 2081, 97: 2081, 100: 2081, 453: 2081, 2081, 2081, 460: 2081, 470: 2081, 475: 4938, 481: 2081, 487: 2081, 550: 2081, 562: 4937, 628: 2081}, - {138: 2079, 556: 2079}, + {495: 2644, 724: 2643, 733: 4935}, + {2098, 2098, 100: 2098, 103: 2098, 460: 2098, 2098, 2098, 467: 2098, 476: 2098, 486: 2098, 493: 2098, 555: 2098, 633: 2098}, + {105: 3358, 3354, 108: 3351, 3366, 111: 3353, 3350, 3352, 3356, 3357, 3362, 3361, 3360, 3364, 3365, 3359, 3363, 3355, 494: 3242, 496: 3240, 3241, 3239, 3237, 519: 3348, 3345, 3347, 3346, 3342, 3344, 3343, 3340, 3341, 3339, 3349, 722: 3238, 3236, 795: 3338, 818: 4937}, + {2099, 2099, 100: 2099, 103: 2099, 460: 2099, 2099, 2099, 467: 2099, 476: 2099, 486: 2099, 493: 2099, 555: 2099, 633: 2099}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 4943}, // 2485 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 4940}, - {488: 2642, 716: 2641, 725: 4939}, - {2082, 2082, 97: 2082, 100: 2082, 453: 2082, 2082, 2082, 460: 2082, 470: 2082, 481: 2082, 487: 2082, 550: 2082, 628: 2082}, - {102: 3349, 3345, 105: 3342, 3357, 108: 3344, 3341, 3343, 3347, 3348, 3353, 3352, 3351, 3355, 3356, 3350, 3354, 3346, 486: 3233, 489: 3231, 3232, 3230, 3228, 512: 3339, 3336, 3338, 3337, 3333, 3335, 3334, 3331, 3332, 3330, 3340, 714: 3229, 3227, 788: 3329, 810: 4941}, - {2083, 2083, 97: 2083, 100: 2083, 453: 2083, 2083, 2083, 460: 2083, 470: 2083, 481: 2083, 487: 2083, 550: 2083, 628: 2083}, + {461: 4940}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4033, 2670, 2671, 2669, 732: 4034, 797: 4941}, + {7: 4036, 57: 4942}, + {2100, 2100, 100: 2100, 103: 2100, 460: 2100, 2100, 2100, 467: 2100, 476: 2100, 486: 2100, 493: 2100, 555: 2100, 633: 2100}, + {57: 4944, 473: 3581, 3580, 3586, 511: 3582, 544: 3583, 3584, 3577, 3587, 3576, 3585, 3578, 3579}, // 2490 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 4947}, - {454: 4944}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4023, 2668, 2669, 2667, 724: 4024, 766: 4945}, - {7: 4026, 53: 4946}, - {2084, 2084, 97: 2084, 100: 2084, 453: 2084, 2084, 2084, 460: 2084, 470: 2084, 481: 2084, 487: 2084, 550: 2084, 628: 2084}, + {2101, 2101, 100: 2101, 103: 2101, 460: 2101, 2101, 2101, 467: 2101, 476: 2101, 486: 2101, 493: 2101, 555: 2101, 633: 2101}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 4950}, + {461: 4947}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4033, 2670, 2671, 2669, 732: 4034, 797: 4948}, + {7: 4036, 57: 4949}, // 2495 - {53: 4948, 466: 3572, 3571, 3577, 504: 3573, 537: 3574, 3575, 3568, 3578, 3567, 3576, 3569, 3570}, - {2085, 2085, 97: 2085, 100: 2085, 453: 2085, 2085, 2085, 460: 2085, 470: 2085, 481: 2085, 487: 2085, 550: 2085, 628: 2085}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 4954}, - {454: 4951}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4023, 2668, 2669, 2667, 724: 4024, 766: 4952}, + {2102, 2102, 100: 2102, 103: 2102, 460: 2102, 2102, 2102, 467: 2102, 476: 2102, 486: 2102, 493: 2102, 555: 2102, 633: 2102}, + {57: 4951, 473: 3581, 3580, 3586, 511: 3582, 544: 3583, 3584, 3577, 3587, 3576, 3585, 3578, 3579}, + {2103, 2103, 100: 2103, 103: 2103, 460: 2103, 2103, 2103, 467: 2103, 476: 2103, 486: 2103, 493: 2103, 555: 2103, 633: 2103}, + {92: 4958, 461: 2106, 1249: 4957}, + {461: 4954}, // 2500 - {7: 4026, 53: 4953}, - {2086, 2086, 97: 2086, 100: 2086, 453: 2086, 2086, 2086, 460: 2086, 470: 2086, 481: 2086, 487: 2086, 550: 2086, 628: 2086}, - {53: 4955, 466: 3572, 3571, 3577, 504: 3573, 537: 3574, 3575, 3568, 3578, 3567, 3576, 3569, 3570}, - {2087, 2087, 97: 2087, 100: 2087, 453: 2087, 2087, 2087, 460: 2087, 470: 2087, 481: 2087, 487: 2087, 550: 2087, 628: 2087}, - {87: 4962, 454: 2090, 1247: 4961}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 4955}, + {57: 4956, 473: 3581, 3580, 3586, 511: 3582, 544: 3583, 3584, 3577, 3587, 3576, 3585, 3578, 3579}, + {2107, 2107, 100: 2107, 103: 2107, 211: 2107, 460: 2107, 2107, 2107, 467: 2107, 476: 2107, 486: 2107, 493: 2107, 555: 2107, 633: 2107}, + {461: 4961}, + {484: 4959}, // 2505 - {454: 4958}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 4959}, - {53: 4960, 466: 3572, 3571, 3577, 504: 3573, 537: 3574, 3575, 3568, 3578, 3567, 3576, 3569, 3570}, - {2091, 2091, 97: 2091, 100: 2091, 205: 2091, 453: 2091, 2091, 2091, 460: 2091, 470: 2091, 481: 2091, 487: 2091, 550: 2091, 628: 2091}, - {454: 4965}, + {495: 2644, 724: 4960}, + {461: 2105}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 2256, 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4033, 2670, 2671, 2669, 732: 4034, 797: 4962, 985: 4963}, + {7: 4036, 57: 2255}, + {57: 4964}, // 2510 - {478: 4963}, - {488: 2642, 716: 4964}, - {454: 2089}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 2240, 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4023, 2668, 2669, 2667, 724: 4024, 766: 4966, 980: 4967}, - {7: 4026, 53: 2239}, + {2108, 2108, 100: 2108, 103: 2108, 211: 2108, 460: 2108, 2108, 2108, 467: 2108, 476: 2108, 486: 2108, 493: 2108, 555: 2108, 633: 2108}, + {2094, 2094, 100: 4969, 460: 2094, 2094, 2094, 467: 2094, 476: 2094, 486: 2094, 493: 2094, 555: 2094, 633: 2094, 1291: 4968}, + {495: 2644, 724: 2643, 733: 4967}, + {2089, 2089, 100: 2089, 460: 2089, 2089, 2089, 467: 2089, 476: 2089, 486: 2089, 493: 2089, 555: 2089, 633: 2089}, + {2088, 2088, 460: 2088, 4782, 2088, 467: 2088, 476: 2088, 486: 2088, 493: 2088, 555: 2088, 633: 2088, 1079: 4975}, // 2515 - {53: 4968}, - {2092, 2092, 97: 2092, 100: 2092, 205: 2092, 453: 2092, 2092, 2092, 460: 2092, 470: 2092, 481: 2092, 487: 2092, 550: 2092, 628: 2092}, - {2078, 2078, 97: 4973, 453: 2078, 2078, 2078, 460: 2078, 470: 2078, 481: 2078, 487: 2078, 550: 2078, 628: 2078, 1289: 4972}, - {488: 2642, 716: 2641, 725: 4971}, - {2073, 2073, 97: 2073, 453: 2073, 2073, 2073, 460: 2073, 470: 2073, 481: 2073, 487: 2073, 550: 2073, 628: 2073}, + {648: 4970}, + {140: 2096, 565: 2096, 1053: 4932, 4927, 1122: 4971}, + {2092, 2092, 211: 4973, 460: 2092, 2092, 2092, 467: 2092, 476: 2092, 486: 2092, 493: 2092, 555: 2092, 633: 2092, 1290: 4972}, + {2093, 2093, 460: 2093, 2093, 2093, 467: 2093, 476: 2093, 486: 2093, 493: 2093, 555: 2093, 633: 2093}, + {495: 2644, 724: 2643, 733: 4974}, // 2520 - {2072, 2072, 453: 2072, 4817, 2072, 460: 2072, 470: 2072, 481: 2072, 487: 2072, 550: 2072, 628: 2072, 1075: 4979}, - {644: 4974}, - {138: 2080, 556: 2080, 1048: 4936, 4931, 1118: 4975}, - {2076, 2076, 205: 4977, 453: 2076, 2076, 2076, 460: 2076, 470: 2076, 481: 2076, 487: 2076, 550: 2076, 628: 2076, 1288: 4976}, - {2077, 2077, 453: 2077, 2077, 2077, 460: 2077, 470: 2077, 481: 2077, 487: 2077, 550: 2077, 628: 2077}, + {2091, 2091, 460: 2091, 2091, 2091, 467: 2091, 476: 2091, 486: 2091, 493: 2091, 555: 2091, 633: 2091}, + {2109, 2109, 460: 2109, 2109, 2109, 467: 2109, 476: 2109, 486: 2109, 493: 2109, 555: 2109, 633: 2109}, + {2422, 2422}, + {2421, 2421, 4: 4140, 4811, 15: 4086, 4098, 4091, 4093, 4087, 4092, 4095, 4089, 4085, 4090, 4094, 4088, 30: 4148, 4141, 4144, 4143, 4146, 4147, 4149, 637: 4145, 760: 4096, 766: 4097, 769: 4150, 801: 4810}, + {550, 550, 550, 550, 550, 550, 550, 8: 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 58: 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 4630, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 807: 4629, 825: 4979}, // 2525 - {488: 2642, 716: 2641, 725: 4978}, - {2075, 2075, 453: 2075, 2075, 2075, 460: 2075, 470: 2075, 481: 2075, 487: 2075, 550: 2075, 628: 2075}, - {2093, 2093, 453: 2093, 2093, 2093, 460: 2093, 470: 2093, 481: 2093, 487: 2093, 550: 2093, 628: 2093}, - {2405, 2405}, - {2404, 2404, 4: 4130, 4846, 13: 4081, 16: 4076, 4088, 4083, 4077, 4082, 4085, 4079, 4075, 4080, 4084, 4078, 30: 4138, 4131, 4134, 4133, 4136, 4137, 4139, 630: 4135, 753: 4086, 757: 4087, 759: 4140, 793: 4845}, + {2363, 2363, 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4634, 2670, 2671, 2669, 778: 4981, 1259: 4980}, + {2423, 2423}, + {7: 4635, 483: 4982}, + {461: 4983}, + {477: 4785, 936: 4784, 1078: 4984}, // 2530 - {545, 545, 545, 545, 545, 545, 545, 8: 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 54: 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 4584, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 545, 799: 4583, 817: 4983}, - {2345, 2345, 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4588, 2668, 2669, 2667, 770: 4985, 1257: 4984}, - {2406, 2406}, - {7: 4589, 476: 4986}, - {454: 4987}, + {7: 4821, 57: 4985}, + {2362, 2362}, + {2424, 2424}, + {136: 4988, 867: 96, 1057: 4989}, + {867: 95}, // 2535 - {469: 4820, 931: 4819, 1074: 4988}, - {7: 4856, 53: 4989}, - {2344, 2344}, - {2407, 2407}, - {133: 4992, 854: 96, 1052: 4993}, + {867: 4990}, + {463: 4991}, + {17, 17, 175: 17, 342: 4993, 647: 17, 1229: 4992}, + {15, 15, 175: 4996, 647: 15, 1228: 4995}, + {495: 2644, 724: 4994}, // 2540 - {854: 95}, - {854: 4994}, - {456: 4995}, - {17, 17, 171: 17, 338: 4997, 639: 17, 1227: 4996}, - {15, 15, 171: 5000, 639: 15, 1226: 4999}, + {16, 16, 175: 16, 647: 16}, + {81, 81, 647: 3857, 931: 5003}, + {13, 13, 179: 13, 355: 4998, 647: 13, 1253: 4997}, + {11, 11, 179: 5001, 647: 11, 1252: 5000}, + {495: 2644, 724: 4999}, // 2545 - {488: 2642, 716: 4998}, - {16, 16, 171: 16, 639: 16}, - {81, 81, 639: 3848, 926: 5007}, - {13, 13, 175: 13, 351: 5002, 639: 13, 1251: 5001}, - {11, 11, 175: 5005, 639: 11, 1250: 5004}, - // 2550 - {488: 2642, 716: 5003}, - {12, 12, 175: 12, 639: 12}, - {14, 14, 639: 14}, - {488: 2642, 716: 5006}, - {10, 10, 639: 10}, - // 2555 + {12, 12, 179: 12, 647: 12}, + {14, 14, 647: 14}, + {495: 2644, 724: 5002}, + {10, 10, 647: 10}, {18, 18}, - {37: 55, 141: 55, 488: 55}, + // 2550 + {37: 55, 143: 55, 495: 55}, {59, 59}, - {488: 2642, 716: 5013}, - {488: 2642, 716: 5012}, - // 2560 + {495: 2644, 724: 5009}, + {495: 2644, 724: 5008}, {57, 57}, + // 2555 {58, 58}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 5018, 1121: 5019, 1291: 5017}, - {68, 68, 68, 68, 68, 68, 68, 8: 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 54: 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68}, - {67, 67, 67, 67, 67, 67, 67, 8: 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 54: 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67}, - // 2565 - {69, 69, 7: 5025}, - {652: 5021, 669: 5022, 1222: 5020}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 5014, 1125: 5015, 1293: 5013}, + {68, 68, 68, 68, 68, 68, 68, 8: 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 58: 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68}, + {67, 67, 67, 67, 67, 67, 67, 8: 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 58: 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67}, + {69, 69, 7: 5021}, + // 2560 + {660: 5017, 676: 5018, 1224: 5016}, {61, 61, 7: 61}, {66, 66, 7: 66}, - {65, 65, 7: 65, 133: 5024}, - // 2570 - {63, 63, 7: 63, 133: 5023}, + {65, 65, 7: 65, 136: 5020}, + {63, 63, 7: 63, 136: 5019}, + // 2565 {62, 62, 7: 62}, {64, 64, 7: 64}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 5018, 1121: 5026}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 5014, 1125: 5022}, {60, 60, 7: 60}, - // 2575 {70, 70}, - {133: 4992, 854: 96, 1052: 5031}, - {456: 5030}, + // 2570 + {136: 4988, 867: 96, 1057: 5027}, + {463: 5026}, {54, 54}, - {854: 5032}, + {867: 5028}, + {463: 5029}, + // 2575 + {476: 5030, 483: 2058, 493: 5031, 1021: 5032}, + {2057, 2057, 460: 2057, 2057, 2057, 467: 2057, 483: 2057, 486: 2057, 555: 2057, 633: 2057}, + {2056, 2056, 460: 2056, 2056, 2056, 467: 2056, 483: 2056, 486: 2056, 555: 2056, 633: 2056}, + {483: 5033}, + {555: 5034}, // 2580 - {456: 5033}, - {470: 5034, 476: 2042, 487: 5035, 1016: 5036}, - {2041, 2041, 453: 2041, 2041, 2041, 460: 2041, 476: 2041, 481: 2041, 550: 2041, 628: 2041}, - {2040, 2040, 453: 2040, 2040, 2040, 460: 2040, 476: 2040, 481: 2040, 550: 2040, 628: 2040}, - {476: 5037}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 5035}, + {98, 98, 98: 98, 107: 98, 461: 98, 476: 98, 500: 98, 636: 5037, 647: 98, 1163: 5036}, + {94, 94, 98: 3836, 107: 3835, 461: 94, 476: 94, 500: 94, 647: 94, 822: 3834, 1031: 5040}, + {500: 5038}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 531: 3653, 652: 3385, 2670, 2671, 2669, 727: 3652, 796: 5039}, // 2585 - {550: 5038}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 5039}, - {98, 98, 95: 98, 104: 98, 454: 98, 470: 98, 493: 98, 629: 5041, 639: 98, 1160: 5040}, - {94, 94, 95: 3827, 104: 3826, 454: 94, 470: 94, 493: 94, 639: 94, 814: 3825, 1026: 5044}, - {493: 5042}, + {97, 97, 98: 97, 107: 97, 461: 97, 476: 97, 500: 97, 647: 97}, + {81, 81, 461: 81, 476: 81, 500: 81, 647: 3857, 931: 5041}, + {100, 100, 461: 100, 476: 5043, 500: 100, 1205: 5042}, + {2244, 2244, 461: 5046, 500: 2244, 1169: 5047}, + {495: 2644, 724: 5044}, // 2590 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 524: 3644, 640: 3376, 2668, 2669, 2667, 720: 3643, 789: 5043}, - {97, 97, 95: 97, 104: 97, 454: 97, 470: 97, 493: 97, 639: 97}, - {81, 81, 454: 81, 470: 81, 493: 81, 639: 3848, 926: 5045}, - {100, 100, 454: 100, 470: 5047, 493: 100, 1203: 5046}, - {2228, 2228, 454: 5050, 493: 2228, 1166: 5051}, - // 2595 - {488: 2642, 716: 5048}, - {639: 5049}, - {99, 99, 454: 99, 493: 99}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 2234, 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 548: 3236, 640: 4023, 2668, 2669, 2667, 691: 5064, 724: 5063, 981: 5062, 1164: 5061, 5065}, - {75, 75, 493: 5053, 1220: 5052}, - // 2600 + {647: 5045}, + {99, 99, 461: 99, 500: 99}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 2250, 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 557: 3245, 652: 4033, 2670, 2671, 2669, 699: 5060, 732: 5059, 986: 5058, 1167: 5057, 5061}, + {75, 75, 500: 5049, 1222: 5048}, {101, 101}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3663, 2668, 2669, 2667, 692: 5056, 1050: 5055, 1219: 5054}, - {74, 74, 7: 5059}, + // 2595 + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3672, 2670, 2671, 2669, 700: 5052, 1055: 5051, 1221: 5050}, + {74, 74, 7: 5055}, {72, 72, 7: 72}, - {478: 5057}, - // 2605 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3786, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3782, 786: 5058}, + {484: 5053}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3795, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3791, 787: 5054}, + // 2600 {71, 71, 7: 71}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3663, 2668, 2669, 2667, 692: 5056, 1050: 5060}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3672, 2670, 2671, 2669, 700: 5052, 1055: 5056}, {73, 73, 7: 73}, - {7: 5067, 53: 2233}, + {7: 5063, 57: 2249}, + {7: 2248, 57: 2248}, + // 2605 + {7: 2246, 57: 2246}, + {7: 2245, 57: 2245}, + {57: 5062}, + {2243, 2243, 500: 2243}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 557: 3245, 652: 4033, 2670, 2671, 2669, 699: 5060, 732: 5059, 986: 5064}, // 2610 - {7: 2232, 53: 2232}, - {7: 2230, 53: 2230}, - {7: 2229, 53: 2229}, - {53: 5066}, - {2227, 2227, 493: 2227}, + {7: 2247, 57: 2247}, + {7: 158, 163: 158, 460: 158, 489: 158, 557: 1783, 639: 158, 656: 1783}, + {7: 123, 460: 123, 123, 489: 123, 557: 1754, 639: 123, 656: 1754}, + {7: 137, 460: 137, 137, 489: 137, 557: 1728, 639: 137, 656: 1728}, + {7: 124, 460: 124, 124, 489: 124, 557: 1725, 639: 124, 656: 1725}, // 2615 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 548: 3236, 640: 4023, 2668, 2669, 2667, 691: 5064, 724: 5063, 981: 5068}, - {7: 2231, 53: 2231}, - {7: 158, 158: 158, 453: 158, 479: 158, 548: 1769, 632: 158, 648: 1769}, - {7: 123, 453: 123, 123, 479: 123, 548: 1744, 632: 123, 648: 1744}, - {7: 137, 453: 137, 137, 479: 137, 548: 1718, 632: 137, 648: 1718}, + {7: 113, 460: 113, 113, 489: 113, 557: 1690, 639: 113, 656: 1690}, + {7: 133, 460: 133, 133, 489: 133, 557: 1615, 639: 133, 656: 1615}, + {7: 138, 460: 138, 138, 489: 138, 557: 1608, 639: 138, 656: 1608}, + {305: 5174, 371: 5173, 557: 1590, 656: 1590}, + {7: 125, 460: 125, 125, 489: 125, 557: 1587, 639: 125, 656: 1587}, // 2620 - {7: 124, 453: 124, 124, 479: 124, 548: 1715, 632: 124, 648: 1715}, - {7: 113, 453: 113, 113, 479: 113, 548: 1680, 632: 113, 648: 1680}, - {7: 133, 453: 133, 133, 479: 133, 548: 1605, 632: 133, 648: 1605}, - {7: 138, 453: 138, 138, 479: 138, 548: 1598, 632: 138, 648: 1598}, - {299: 5178, 367: 5177, 548: 1580, 648: 1580}, + {7: 114, 460: 114, 114, 489: 114, 557: 1584, 639: 114, 656: 1584}, + {557: 5171, 656: 5170}, + {7: 702, 460: 702, 489: 702, 557: 248, 639: 702, 656: 248}, + {7: 701, 460: 701, 489: 701, 639: 701}, + {7: 154, 163: 5169, 460: 154, 489: 154, 639: 154}, // 2625 - {7: 125, 453: 125, 125, 479: 125, 548: 1577, 632: 125, 648: 1577}, - {7: 114, 453: 114, 114, 479: 114, 548: 1574, 632: 114, 648: 1574}, - {548: 5175, 648: 5174}, - {7: 696, 453: 696, 479: 696, 548: 248, 632: 696, 648: 248}, - {7: 695, 453: 695, 479: 695, 632: 695}, + {7: 156, 460: 156, 489: 156, 639: 156}, + {7: 155, 460: 155, 489: 155, 639: 155}, + {489: 5167}, + {7: 134, 460: 134, 134, 483: 5165, 489: 134, 639: 134}, + {7: 151, 460: 151, 489: 151, 639: 151}, // 2630 - {7: 154, 158: 5173, 453: 154, 479: 154, 632: 154}, - {7: 156, 453: 156, 479: 156, 632: 156}, - {7: 155, 453: 155, 479: 155, 632: 155}, - {479: 5171}, - {7: 134, 453: 134, 134, 476: 5169, 479: 134, 632: 134}, + {7: 5117, 460: 5118, 489: 5119}, + {7: 149, 460: 149, 5114, 489: 149, 639: 149}, + {7: 147, 180: 5113, 460: 147, 147, 489: 147, 639: 147}, + {7: 145, 266: 5112, 460: 145, 145, 489: 145, 639: 145}, + {7: 144, 30: 5106, 99: 5108, 159: 5107, 161: 5105, 166: 5109, 266: 5110, 460: 144, 144, 489: 144, 639: 144}, // 2635 - {7: 151, 453: 151, 479: 151, 632: 151}, - {7: 5121, 453: 5122, 479: 5123}, - {7: 149, 453: 149, 5118, 479: 149, 632: 149}, - {7: 147, 176: 5117, 453: 147, 147, 479: 147, 632: 147}, - {7: 145, 261: 5116, 453: 145, 145, 479: 145, 632: 145}, + {7: 141, 460: 141, 141, 489: 141, 639: 141}, + {7: 140, 460: 140, 140, 489: 140, 639: 140}, + {7: 139, 166: 5104, 460: 139, 139, 489: 139, 639: 139}, + {7: 136, 460: 136, 136, 489: 136, 639: 136}, + {7: 135, 460: 135, 135, 489: 135, 639: 135}, // 2640 - {7: 144, 30: 5110, 93: 5113, 5112, 153: 5111, 155: 5109, 261: 5114, 453: 144, 144, 479: 144, 632: 144}, - {7: 141, 453: 141, 141, 479: 141, 632: 141}, - {7: 140, 453: 140, 140, 479: 140, 632: 140}, - {7: 139, 93: 5108, 453: 139, 139, 479: 139, 632: 139}, - {7: 136, 453: 136, 136, 479: 136, 632: 136}, + {99: 5103, 1004: 5102}, + {7: 131, 460: 131, 131, 489: 131, 639: 131}, + {893: 5101}, + {7: 129, 460: 129, 129, 489: 129, 639: 129}, + {7: 126, 460: 126, 126, 489: 126, 639: 126}, // 2645 - {7: 135, 453: 135, 135, 479: 135, 632: 135}, - {94: 5107, 999: 5106}, - {7: 131, 453: 131, 131, 479: 131, 632: 131}, - {884: 5105}, - {7: 129, 453: 129, 129, 479: 129, 632: 129}, + {110: 5100}, + {7: 121, 460: 121, 121, 489: 121, 639: 121}, + {7: 130, 460: 130, 130, 489: 130, 639: 130}, + {7: 132, 460: 132, 132, 489: 132, 639: 132}, + {7: 119, 460: 119, 119, 489: 119, 639: 119}, // 2650 - {7: 126, 453: 126, 126, 479: 126, 632: 126}, - {107: 5104}, - {7: 121, 453: 121, 121, 479: 121, 632: 121}, - {7: 130, 453: 130, 130, 479: 130, 632: 130}, - {7: 132, 453: 132, 132, 479: 132, 632: 132}, + {7: 117, 460: 117, 117, 489: 117, 639: 117}, + {7: 143, 460: 143, 143, 489: 143, 639: 143}, + {7: 142, 460: 142, 142, 489: 142, 639: 142}, + {110: 5111}, + {7: 120, 460: 120, 120, 489: 120, 639: 120}, // 2655 - {7: 119, 453: 119, 119, 479: 119, 632: 119}, - {7: 117, 453: 117, 117, 479: 117, 632: 117}, - {7: 143, 453: 143, 143, 479: 143, 632: 143}, - {7: 142, 453: 142, 142, 479: 142, 632: 142}, - {107: 5115}, + {7: 118, 460: 118, 118, 489: 118, 639: 118}, + {7: 116, 460: 116, 116, 489: 116, 639: 116}, + {7: 122, 460: 122, 122, 489: 122, 639: 122}, + {7: 115, 460: 115, 115, 489: 115, 639: 115}, + {7: 146, 460: 146, 146, 489: 146, 639: 146}, // 2660 - {7: 120, 453: 120, 120, 479: 120, 632: 120}, - {7: 118, 453: 118, 118, 479: 118, 632: 118}, - {7: 116, 453: 116, 116, 479: 116, 632: 116}, - {7: 122, 453: 122, 122, 479: 122, 632: 122}, - {7: 115, 453: 115, 115, 479: 115, 632: 115}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4033, 2670, 2671, 2669, 732: 4034, 797: 5115}, + {7: 4036, 57: 5116}, + {7: 148, 460: 148, 489: 148, 639: 148}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 5065, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 5067, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 5073, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 5069, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 5066, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 5074, 3103, 2837, 3057, 5068, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 5071, 2750, 2751, 2987, 5072, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 5070, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 5076, 485: 5099, 556: 5093, 633: 5082, 5097, 637: 5092, 640: 5086, 643: 5095, 651: 5087, 3385, 2670, 2671, 2669, 658: 5091, 663: 5088, 727: 5075, 731: 5090, 790: 5077, 798: 5081, 842: 5096, 853: 5094, 923: 5078, 941: 5079, 5085, 947: 5080, 5164, 956: 5089, 958: 5098}, + {2: 112, 112, 112, 112, 112, 8: 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 58: 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 5131, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 511: 112, 555: 5130, 943: 5132, 1064: 5133}, // 2665 - {7: 146, 453: 146, 146, 479: 146, 632: 146}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4023, 2668, 2669, 2667, 724: 4024, 766: 5119}, - {7: 4026, 53: 5120}, - {7: 148, 453: 148, 479: 148, 632: 148}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 5069, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 5071, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 5077, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 5073, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 5070, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 5078, 3094, 2831, 3049, 5072, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 5075, 2744, 2745, 5076, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 5074, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 5080, 477: 5103, 549: 5097, 626: 5101, 628: 5086, 630: 5096, 635: 5099, 640: 3376, 2668, 2669, 2667, 646: 5091, 650: 5095, 655: 5092, 718: 5090, 720: 5079, 726: 5094, 781: 5081, 808: 5085, 831: 5100, 841: 5098, 918: 5082, 937: 5083, 5089, 943: 5084, 5168, 952: 5093, 954: 5102}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 558: 5121, 652: 3385, 2670, 2671, 2669, 727: 5120, 762: 5122, 855: 5123}, + {715, 715, 7: 715, 14: 715, 58: 715, 99: 715, 141: 715, 462: 715, 470: 715, 484: 715, 557: 5128, 639: 715, 650: 715, 656: 5127, 715}, + {1170, 1170, 7: 1170, 14: 1170, 58: 1170, 99: 1170, 141: 1170, 461: 3662, 1170, 470: 1170, 484: 1170, 639: 1170, 650: 1170, 657: 1170, 1073: 5126}, + {711, 711, 7: 711, 462: 711}, + {102, 102, 7: 5124}, // 2670 - {2: 112, 112, 112, 112, 112, 8: 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 54: 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 5135, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 504: 112, 550: 5134, 939: 5136, 1059: 5137}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 551: 5125, 640: 3376, 2668, 2669, 2667, 720: 5124, 755: 5126, 843: 5127}, - {709, 709, 7: 709, 15: 709, 52: 709, 94: 709, 139: 709, 455: 709, 463: 709, 478: 709, 548: 5132, 632: 709, 647: 709, 5131, 709}, - {1163, 1163, 7: 1163, 15: 1163, 52: 1163, 94: 1163, 139: 1163, 454: 3653, 1163, 463: 1163, 478: 1163, 632: 1163, 647: 1163, 649: 1163, 1069: 5130}, - {705, 705, 7: 705, 455: 705}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 558: 5121, 652: 3385, 2670, 2671, 2669, 727: 5120, 762: 5125}, + {710, 710, 7: 710, 462: 710}, + {712, 712, 7: 712, 14: 712, 58: 712, 99: 712, 141: 712, 462: 712, 470: 712, 484: 712, 639: 712, 650: 712, 657: 712}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 652: 3385, 2670, 2671, 2669, 727: 5129}, + {713, 713, 7: 713, 14: 713, 58: 713, 99: 713, 141: 713, 462: 713, 470: 713, 484: 713, 639: 713, 650: 713, 657: 713}, // 2675 - {102, 102, 7: 5128}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 551: 5125, 640: 3376, 2668, 2669, 2667, 720: 5124, 755: 5129}, - {704, 704, 7: 704, 455: 704}, - {706, 706, 7: 706, 15: 706, 52: 706, 94: 706, 139: 706, 455: 706, 463: 706, 478: 706, 632: 706, 647: 706, 649: 706}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 640: 3376, 2668, 2669, 2667, 720: 5133}, + {714, 714, 7: 714, 14: 714, 58: 714, 99: 714, 141: 714, 462: 714, 470: 714, 484: 714, 639: 714, 650: 714, 657: 714}, + {2: 111, 111, 111, 111, 111, 8: 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 58: 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 511: 111}, + {2: 110, 110, 110, 110, 110, 8: 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 58: 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 511: 110}, + {2: 109, 109, 109, 109, 109, 8: 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 58: 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 511: 109}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 511: 5134, 652: 5135, 2670, 2671, 2669, 1087: 5136}, // 2680 - {707, 707, 7: 707, 15: 707, 52: 707, 94: 707, 139: 707, 455: 707, 463: 707, 478: 707, 632: 707, 647: 707, 649: 707}, - {708, 708, 7: 708, 15: 708, 52: 708, 94: 708, 139: 708, 455: 708, 463: 708, 478: 708, 632: 708, 647: 708, 649: 708}, - {2: 111, 111, 111, 111, 111, 8: 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 54: 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 504: 111}, - {2: 110, 110, 110, 110, 110, 8: 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 54: 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 504: 110}, - {2: 109, 109, 109, 109, 109, 8: 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 54: 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 504: 109}, + {489: 108, 639: 108, 641: 5162}, + {489: 104, 639: 104, 641: 5159}, + {489: 5137}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 558: 5121, 652: 3385, 2670, 2671, 2669, 727: 5120, 762: 5138, 877: 5139, 909: 5140}, + {190, 190, 7: 190, 14: 190, 58: 190, 141: 5144, 462: 190, 650: 190, 1155: 5143}, // 2685 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 504: 5138, 640: 5139, 2668, 2669, 2667, 1084: 5140}, - {479: 108, 632: 108, 5166}, - {479: 104, 632: 104, 5163}, - {479: 5141}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 551: 5125, 640: 3376, 2668, 2669, 2667, 720: 5124, 755: 5142, 865: 5143, 904: 5144}, + {225, 225, 7: 225, 14: 225, 58: 225, 462: 225, 650: 225}, + {103, 103, 7: 5141}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 558: 5121, 652: 3385, 2670, 2671, 2669, 727: 5120, 762: 5138, 877: 5142}, + {224, 224, 7: 224, 14: 224, 58: 224, 462: 224, 650: 224}, + {226, 226, 7: 226, 14: 226, 58: 226, 462: 226, 650: 226}, // 2690 - {190, 190, 7: 190, 15: 190, 52: 190, 139: 5148, 455: 190, 647: 190, 1152: 5147}, - {225, 225, 7: 225, 15: 225, 52: 225, 455: 225, 647: 225}, - {103, 103, 7: 5145}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 551: 5125, 640: 3376, 2668, 2669, 2667, 720: 5124, 755: 5142, 865: 5146}, - {224, 224, 7: 224, 15: 224, 52: 224, 455: 224, 647: 224}, + {462: 5146, 648: 5145}, + {14: 5157, 463: 5154, 879: 5156}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 652: 3385, 2670, 2671, 2669, 727: 5148, 1156: 5147}, + {188, 188, 7: 188, 14: 188, 58: 188, 462: 188, 467: 5150, 648: 5149, 650: 188}, + {184, 184, 7: 184, 14: 184, 58: 184, 462: 184, 467: 184, 648: 184, 650: 184}, // 2695 - {226, 226, 7: 226, 15: 226, 52: 226, 455: 226, 647: 226}, - {455: 5150, 644: 5149}, - {15: 5161, 456: 5158, 867: 5160}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 640: 3376, 2668, 2669, 2667, 720: 5152, 1153: 5151}, - {188, 188, 7: 188, 15: 188, 52: 188, 455: 188, 460: 5154, 644: 5153, 647: 188}, + {463: 5154, 879: 5155}, + {463: 5152, 564: 5153, 1040: 5151}, + {186, 186, 7: 186, 14: 186, 58: 186, 462: 186, 650: 186}, + {183, 183, 7: 183, 14: 183, 58: 183, 462: 183, 650: 183}, + {182, 182, 7: 182, 14: 182, 58: 182, 462: 182, 650: 182}, // 2700 - {184, 184, 7: 184, 15: 184, 52: 184, 455: 184, 460: 184, 644: 184, 647: 184}, - {456: 5158, 867: 5159}, - {456: 5156, 555: 5157, 1035: 5155}, - {186, 186, 7: 186, 15: 186, 52: 186, 455: 186, 647: 186}, - {183, 183, 7: 183, 15: 183, 52: 183, 455: 183, 647: 183}, + {707, 707, 7: 707, 14: 707, 57: 707, 707, 462: 707, 650: 707}, + {187, 187, 7: 187, 14: 187, 58: 187, 462: 187, 650: 187}, + {189, 189, 7: 189, 14: 189, 58: 189, 462: 189, 650: 189}, + {463: 5152, 564: 5153, 1040: 5158}, + {185, 185, 7: 185, 14: 185, 58: 185, 462: 185, 650: 185}, // 2705 - {182, 182, 7: 182, 15: 182, 52: 182, 455: 182, 647: 182}, - {701, 701, 7: 701, 15: 701, 52: 701, 701, 455: 701, 647: 701}, - {187, 187, 7: 187, 15: 187, 52: 187, 455: 187, 647: 187}, - {189, 189, 7: 189, 15: 189, 52: 189, 455: 189, 647: 189}, - {456: 5156, 555: 5157, 1035: 5162}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 511: 5160, 652: 5161, 2670, 2671, 2669}, + {489: 106, 639: 106}, + {489: 105, 639: 105}, + {511: 5163}, + {489: 107, 639: 107}, // 2710 - {185, 185, 7: 185, 15: 185, 52: 185, 455: 185, 647: 185}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 504: 5164, 640: 5165, 2668, 2669, 2667}, - {479: 106, 632: 106}, - {479: 105, 632: 105}, - {504: 5167}, + {7: 150, 460: 150, 489: 150, 639: 150}, + {267: 5166}, + {7: 152, 460: 152, 489: 152, 639: 152}, + {267: 5168}, + {7: 153, 460: 153, 489: 153, 639: 153}, // 2715 - {479: 107, 632: 107}, - {7: 150, 453: 150, 479: 150, 632: 150}, - {262: 5170}, - {7: 152, 453: 152, 479: 152, 632: 152}, - {262: 5172}, + {7: 157, 163: 157, 460: 157, 489: 157, 639: 157}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 652: 3385, 2670, 2671, 2669, 727: 5172}, + {703, 703, 7: 703, 460: 703, 489: 703, 639: 703}, + {704, 704, 7: 704, 460: 704, 489: 704, 639: 704}, + {7: 128, 460: 128, 128, 489: 128, 639: 128}, // 2720 - {7: 153, 453: 153, 479: 153, 632: 153}, - {7: 157, 158: 157, 453: 157, 479: 157, 632: 157}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 640: 3376, 2668, 2669, 2667, 720: 5176}, - {697, 697, 7: 697, 453: 697, 479: 697, 632: 697}, - {698, 698, 7: 698, 453: 698, 479: 698, 632: 698}, + {7: 127, 460: 127, 127, 489: 127, 639: 127}, + {460: 5215, 557: 1701, 656: 1701}, + {7: 5117, 460: 5177, 639: 5178}, + {2: 112, 112, 112, 112, 112, 8: 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 58: 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 5131, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 511: 112, 555: 5130, 943: 5132, 1064: 5180}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 558: 5121, 652: 3385, 2670, 2671, 2669, 727: 5120, 762: 5122, 855: 5179}, // 2725 - {7: 128, 453: 128, 128, 479: 128, 632: 128}, - {7: 127, 453: 127, 127, 479: 127, 632: 127}, - {453: 5219, 548: 1691, 648: 1691}, - {7: 5121, 453: 5181, 632: 5182}, - {2: 112, 112, 112, 112, 112, 8: 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 54: 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 5135, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 504: 112, 550: 5134, 939: 5136, 1059: 5184}, + {165, 165, 7: 5124}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 511: 5134, 652: 5135, 2670, 2671, 2669, 1087: 5181}, + {639: 5182}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 558: 5121, 652: 3385, 2670, 2671, 2669, 727: 5120, 762: 5138, 877: 5139, 909: 5183}, + {215, 215, 7: 5141, 462: 215, 650: 5185, 944: 5184, 5186}, // 2730 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 551: 5125, 640: 3376, 2668, 2669, 2667, 720: 5124, 755: 5126, 843: 5183}, - {165, 165, 7: 5128}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 504: 5138, 640: 5139, 2668, 2669, 2667, 1084: 5185}, - {632: 5186}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 551: 5125, 640: 3376, 2668, 2669, 2667, 720: 5124, 755: 5142, 865: 5143, 904: 5187}, - // 2735 - {215, 215, 7: 5145, 455: 215, 647: 5189, 940: 5188, 5190}, - {214, 214, 15: 214, 52: 214, 455: 214}, - {128: 5210, 130: 5208, 5211, 5209, 343: 5203, 393: 5205, 942: 5207, 1258: 5206, 1276: 5204}, - {164, 164, 455: 5192, 1139: 5191}, + {214, 214, 14: 214, 58: 214, 462: 214}, + {131: 5206, 133: 5204, 5207, 5205, 347: 5199, 395: 5201, 946: 5203, 1260: 5202, 1278: 5200}, + {164, 164, 462: 5188, 1142: 5187}, {167, 167}, + {126: 5192, 5190, 5191, 5193, 842: 5189}, + // 2735 + {893: 5198}, + {495: 2644, 724: 5197}, + {495: 2644, 724: 5196}, + {495: 2644, 724: 5195}, + {495: 2644, 724: 5194}, // 2740 - {123: 5196, 5194, 5195, 5197, 831: 5193}, - {884: 5202}, - {488: 2642, 716: 5201}, - {488: 2642, 716: 5200}, - {488: 2642, 716: 5199}, - // 2745 - {488: 2642, 716: 5198}, {159, 159}, {160, 160}, {161, 161}, {162, 162}, - // 2750 {163, 163}, - {213, 213, 15: 213, 52: 213, 455: 213}, - {212, 212, 15: 212, 52: 212, 455: 212}, - {211, 211, 15: 211, 52: 211, 455: 211}, - {210, 210, 15: 210, 52: 210, 128: 5210, 130: 5208, 5211, 5209, 455: 210, 486: 5216, 942: 5217}, + // 2745 + {213, 213, 14: 213, 58: 213, 462: 213}, + {212, 212, 14: 212, 58: 212, 462: 212}, + {211, 211, 14: 211, 58: 211, 462: 211}, + {210, 210, 14: 210, 58: 210, 131: 5206, 133: 5204, 5207, 5205, 462: 210, 494: 5212, 946: 5213}, + {209, 209, 14: 209, 58: 209, 131: 209, 133: 209, 209, 209, 462: 209, 494: 209}, + // 2750 + {463: 5211}, + {463: 5210}, + {463: 5209}, + {463: 5208}, + {203, 203, 14: 203, 58: 203, 131: 203, 133: 203, 203, 203, 462: 203, 494: 203}, // 2755 - {209, 209, 15: 209, 52: 209, 128: 209, 130: 209, 209, 209, 455: 209, 486: 209}, - {456: 5215}, - {456: 5214}, - {456: 5213}, - {456: 5212}, + {204, 204, 14: 204, 58: 204, 131: 204, 133: 204, 204, 204, 462: 204, 494: 204}, + {205, 205, 14: 205, 58: 205, 131: 205, 133: 205, 205, 205, 462: 205, 494: 205}, + {206, 206, 14: 206, 58: 206, 131: 206, 133: 206, 206, 206, 462: 206, 494: 206}, + {131: 5206, 133: 5204, 5207, 5205, 946: 5214}, + {207, 207, 14: 207, 58: 207, 131: 207, 133: 207, 207, 207, 462: 207, 494: 207}, // 2760 - {203, 203, 15: 203, 52: 203, 128: 203, 130: 203, 203, 203, 455: 203, 486: 203}, - {204, 204, 15: 204, 52: 204, 128: 204, 130: 204, 204, 204, 455: 204, 486: 204}, - {205, 205, 15: 205, 52: 205, 128: 205, 130: 205, 205, 205, 455: 205, 486: 205}, - {206, 206, 15: 206, 52: 206, 128: 206, 130: 206, 206, 206, 455: 206, 486: 206}, - {128: 5210, 130: 5208, 5211, 5209, 942: 5218}, + {208, 208, 14: 208, 58: 208, 131: 208, 133: 208, 208, 208, 462: 208, 494: 208}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 558: 5121, 652: 3385, 2670, 2671, 2669, 727: 5120, 762: 5216}, + {639: 5217}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 558: 5121, 652: 3385, 2670, 2671, 2669, 727: 5120, 762: 5122, 855: 5218}, + {164, 164, 7: 5124, 462: 5188, 1142: 5219}, // 2765 - {207, 207, 15: 207, 52: 207, 128: 207, 130: 207, 207, 207, 455: 207, 486: 207}, - {208, 208, 15: 208, 52: 208, 128: 208, 130: 208, 208, 208, 455: 208, 486: 208}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 551: 5125, 640: 3376, 2668, 2669, 2667, 720: 5124, 755: 5220}, - {632: 5221}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 551: 5125, 640: 3376, 2668, 2669, 2667, 720: 5124, 755: 5126, 843: 5222}, - // 2770 - {164, 164, 7: 5128, 455: 5192, 1139: 5223}, {166, 166}, - {2112, 2112, 7: 2112, 13: 2112, 2112, 16: 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112, 28: 2112, 459: 2112, 462: 2112, 479: 2112, 482: 2112, 485: 2112, 502: 2112, 629: 2112, 632: 2112}, + {2128, 2128, 7: 2128, 13: 2128, 15: 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128, 28: 2128, 466: 2128, 469: 2128, 488: 2128, 2128, 491: 2128, 509: 2128, 636: 2128, 639: 2128}, {239, 239}, - {2: 814, 814, 814, 814, 814, 8: 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 54: 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 454: 814, 456: 814, 814, 814, 814, 464: 814, 814, 814, 814, 814, 470: 814, 473: 814, 476: 814, 479: 814, 481: 814, 485: 814, 487: 814, 814, 495: 814, 504: 814, 524: 814, 547: 814, 814, 814, 551: 814, 814, 814, 814, 814, 557: 814, 814, 814, 814, 814, 814, 814, 814, 567: 814, 569: 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 631: 814, 718: 814, 727: 814, 814, 730: 814, 814, 814, 738: 814, 750: 814, 814, 814}, + {2: 821, 821, 821, 821, 821, 8: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 58: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 461: 821, 463: 821, 821, 821, 821, 471: 821, 821, 821, 821, 821, 821, 480: 821, 483: 821, 486: 821, 488: 821, 821, 493: 821, 495: 821, 502: 821, 511: 821, 531: 821, 554: 821, 556: 821, 821, 821, 821, 821, 821, 821, 821, 821, 566: 821, 821, 821, 821, 571: 821, 821, 574: 821, 576: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 638: 821, 640: 821, 734: 821, 821, 737: 821, 821, 821, 748: 821, 757: 821, 821, 821}, + {2: 819, 819, 819, 819, 819, 8: 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 58: 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 461: 819, 476: 819, 483: 819, 489: 819, 567: 819, 737: 819, 819, 819}, + // 2770 + {2: 1022, 1022, 1022, 1022, 1022, 8: 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 58: 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 461: 1022, 476: 1022, 567: 1022, 737: 5227, 5226, 5225, 826: 5228, 873: 5229}, + {2: 1025, 1025, 1025, 1025, 1025, 8: 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 58: 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 461: 1025, 463: 1025, 1025, 1025, 1025, 471: 1025, 1025, 1025, 1025, 1025, 1025, 480: 1025, 483: 1025, 486: 1025, 488: 1025, 1025, 493: 1025, 495: 1025, 502: 1025, 511: 1025, 531: 1025, 554: 1025, 556: 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 566: 1025, 1025, 1025, 1025, 571: 1025, 1025, 574: 1025, 576: 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 1025, 638: 1025, 640: 1025, 734: 1025, 1025, 737: 1025, 1025, 1025, 748: 1025, 757: 1025, 1025, 1025}, + {2: 1024, 1024, 1024, 1024, 1024, 8: 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 58: 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 461: 1024, 463: 1024, 1024, 1024, 1024, 471: 1024, 1024, 1024, 1024, 1024, 1024, 480: 1024, 483: 1024, 486: 1024, 488: 1024, 1024, 493: 1024, 495: 1024, 502: 1024, 511: 1024, 531: 1024, 554: 1024, 556: 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 566: 1024, 1024, 1024, 1024, 571: 1024, 1024, 574: 1024, 576: 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 638: 1024, 640: 1024, 734: 1024, 1024, 737: 1024, 1024, 1024, 748: 1024, 757: 1024, 1024, 1024}, + {2: 1023, 1023, 1023, 1023, 1023, 8: 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 58: 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 461: 1023, 463: 1023, 1023, 1023, 1023, 471: 1023, 1023, 1023, 1023, 1023, 1023, 480: 1023, 483: 1023, 486: 1023, 488: 1023, 1023, 493: 1023, 495: 1023, 502: 1023, 511: 1023, 531: 1023, 554: 1023, 556: 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 566: 1023, 1023, 1023, 1023, 571: 1023, 1023, 574: 1023, 576: 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 638: 1023, 640: 1023, 734: 1023, 1023, 737: 1023, 1023, 1023, 748: 1023, 757: 1023, 1023, 1023}, + {2: 1021, 1021, 1021, 1021, 1021, 8: 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 58: 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 1021, 461: 1021, 476: 1021, 483: 1021, 489: 1021, 567: 1021}, // 2775 - {2: 812, 812, 812, 812, 812, 8: 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 54: 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 812, 454: 812, 470: 812, 476: 812, 479: 812, 558: 812, 730: 812, 812, 812}, - {2: 1015, 1015, 1015, 1015, 1015, 8: 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 54: 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 454: 1015, 470: 1015, 558: 1015, 730: 5231, 5230, 5229, 818: 5232, 861: 5233}, - {2: 1018, 1018, 1018, 1018, 1018, 8: 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 54: 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 454: 1018, 456: 1018, 1018, 1018, 1018, 464: 1018, 1018, 1018, 1018, 1018, 470: 1018, 473: 1018, 476: 1018, 479: 1018, 481: 1018, 485: 1018, 487: 1018, 1018, 495: 1018, 504: 1018, 524: 1018, 547: 1018, 1018, 1018, 551: 1018, 1018, 1018, 1018, 1018, 557: 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 567: 1018, 569: 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 631: 1018, 718: 1018, 727: 1018, 1018, 730: 1018, 1018, 1018, 738: 1018, 750: 1018, 1018, 1018}, - {2: 1017, 1017, 1017, 1017, 1017, 8: 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 54: 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 454: 1017, 456: 1017, 1017, 1017, 1017, 464: 1017, 1017, 1017, 1017, 1017, 470: 1017, 473: 1017, 476: 1017, 479: 1017, 481: 1017, 485: 1017, 487: 1017, 1017, 495: 1017, 504: 1017, 524: 1017, 547: 1017, 1017, 1017, 551: 1017, 1017, 1017, 1017, 1017, 557: 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 567: 1017, 569: 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 631: 1017, 718: 1017, 727: 1017, 1017, 730: 1017, 1017, 1017, 738: 1017, 750: 1017, 1017, 1017}, - {2: 1016, 1016, 1016, 1016, 1016, 8: 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 54: 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 454: 1016, 456: 1016, 1016, 1016, 1016, 464: 1016, 1016, 1016, 1016, 1016, 470: 1016, 473: 1016, 476: 1016, 479: 1016, 481: 1016, 485: 1016, 487: 1016, 1016, 495: 1016, 504: 1016, 524: 1016, 547: 1016, 1016, 1016, 551: 1016, 1016, 1016, 1016, 1016, 557: 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 567: 1016, 569: 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 1016, 631: 1016, 718: 1016, 727: 1016, 1016, 730: 1016, 1016, 1016, 738: 1016, 750: 1016, 1016, 1016}, + {2: 1807, 1807, 1807, 1807, 1807, 8: 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 58: 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 461: 1807, 476: 4080, 567: 1807, 843: 5230}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 461: 5239, 567: 5234, 652: 3813, 2670, 2671, 2669, 698: 5238, 726: 5237, 788: 5236, 791: 5235, 5233, 839: 5231, 876: 5232}, + {898, 898, 7: 898, 57: 898, 460: 898, 462: 898, 468: 898, 470: 898, 478: 898, 898, 481: 898, 898, 898, 485: 898, 490: 898, 898, 898, 500: 898, 898, 503: 898, 898}, + {7: 5285, 500: 5355}, + {7: 896, 471: 5252, 5253, 500: 5342, 502: 5251, 505: 5254, 5250, 5255, 5256, 806: 5249, 812: 5248}, // 2780 - {2: 1014, 1014, 1014, 1014, 1014, 8: 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 54: 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 1014, 454: 1014, 470: 1014, 476: 1014, 479: 1014, 558: 1014}, - {2: 1793, 1793, 1793, 1793, 1793, 8: 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 54: 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 454: 1793, 470: 4070, 558: 1793, 832: 5234}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 454: 5243, 558: 5238, 640: 3804, 2668, 2669, 2667, 690: 5242, 719: 5241, 779: 5240, 782: 5239, 5237, 828: 5235, 864: 5236}, - {891, 891, 7: 891, 53: 891, 453: 891, 455: 891, 461: 891, 463: 891, 471: 891, 891, 474: 891, 891, 891, 891, 480: 891, 482: 891, 484: 891, 493: 891, 891, 496: 891, 891}, - {7: 5289, 493: 5359}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5339, 2670, 2671, 2669}, + {894, 894, 7: 894, 57: 894, 460: 894, 462: 894, 468: 894, 470: 894, 894, 894, 478: 894, 894, 481: 894, 894, 894, 485: 894, 490: 894, 894, 894, 500: 894, 894, 894, 894, 894, 894, 894, 894, 894, 510: 894}, + {893, 893, 7: 893, 57: 893, 460: 893, 462: 893, 468: 893, 470: 893, 893, 893, 478: 893, 893, 481: 893, 893, 893, 485: 893, 490: 893, 893, 893, 500: 893, 893, 893, 893, 893, 893, 893, 893, 893, 510: 893}, + {889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 462: 889, 467: 889, 889, 470: 889, 889, 889, 476: 889, 5289, 889, 889, 481: 889, 889, 889, 485: 889, 487: 889, 490: 889, 889, 889, 500: 889, 889, 889, 889, 889, 889, 889, 889, 889, 510: 889, 513: 889, 889, 662: 889, 848: 5288}, + {887, 887, 2906, 2754, 2790, 2908, 2681, 887, 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 887, 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 887, 462: 887, 467: 5246, 887, 470: 887, 887, 887, 478: 887, 887, 481: 887, 887, 887, 485: 887, 490: 887, 887, 887, 500: 887, 887, 887, 887, 887, 887, 887, 887, 887, 510: 887, 652: 5245, 2670, 2671, 2669, 902: 5244, 5243}, // 2785 - {7: 889, 464: 5256, 5257, 493: 5346, 495: 5255, 498: 5258, 5254, 5259, 5260, 798: 5253, 803: 5252}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5343, 2668, 2669, 2667}, - {887, 887, 7: 887, 53: 887, 453: 887, 455: 887, 461: 887, 463: 887, 887, 887, 471: 887, 887, 474: 887, 887, 887, 887, 480: 887, 482: 887, 484: 887, 493: 887, 887, 887, 887, 887, 887, 887, 887, 887, 503: 887}, - {886, 886, 7: 886, 53: 886, 453: 886, 455: 886, 461: 886, 463: 886, 886, 886, 471: 886, 886, 474: 886, 886, 886, 886, 480: 886, 482: 886, 484: 886, 493: 886, 886, 886, 886, 886, 886, 886, 886, 886, 503: 886}, - {882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 455: 882, 460: 882, 882, 463: 882, 882, 882, 469: 5293, 882, 882, 882, 474: 882, 882, 882, 882, 480: 882, 482: 882, 882, 882, 493: 882, 882, 882, 882, 882, 882, 882, 882, 882, 503: 882, 506: 882, 882, 654: 882, 837: 5292}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 461: 5239, 2502, 486: 2501, 555: 2500, 567: 5234, 633: 2496, 652: 3813, 2670, 2671, 2669, 698: 5242, 726: 5237, 740: 3773, 2497, 2498, 2499, 2508, 2506, 2505, 2504, 751: 3775, 3774, 3772, 788: 5236, 791: 5235, 5241, 839: 5231, 876: 5240}, + {7: 5285, 57: 5286}, + {896, 896, 7: 896, 57: 896, 460: 896, 462: 896, 468: 896, 470: 896, 5252, 5253, 478: 896, 896, 481: 896, 896, 896, 485: 896, 490: 896, 896, 896, 500: 896, 896, 5251, 896, 896, 5254, 5250, 5255, 5256, 806: 5249, 812: 5248}, + {2: 2906, 2754, 2790, 2908, 2681, 887, 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 3866, 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 467: 5246, 781, 471: 887, 887, 478: 781, 781, 482: 2636, 490: 2637, 492: 2633, 502: 887, 505: 887, 887, 887, 887, 652: 5245, 2670, 2671, 2669, 755: 3783, 3784, 902: 5244, 5243}, + {891, 891, 7: 891, 57: 891, 460: 891, 462: 891, 468: 891, 470: 891, 891, 891, 478: 891, 891, 481: 891, 891, 891, 485: 891, 490: 891, 891, 891, 500: 891, 891, 891, 891, 891, 891, 891, 891, 891, 510: 891}, // 2790 - {880, 880, 2900, 2748, 2784, 2902, 2675, 880, 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 880, 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 880, 455: 880, 460: 5250, 880, 463: 880, 880, 880, 471: 880, 880, 474: 880, 880, 880, 880, 480: 880, 482: 880, 484: 880, 493: 880, 880, 880, 880, 880, 880, 880, 880, 880, 503: 880, 640: 5249, 2668, 2669, 2667, 898: 5248, 5247}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 454: 5243, 2500, 481: 2499, 550: 2498, 558: 5238, 628: 2494, 640: 3804, 2668, 2669, 2667, 690: 5246, 719: 5241, 733: 3764, 2495, 2496, 2497, 2506, 739: 2504, 2503, 2502, 745: 3766, 3765, 3763, 779: 5240, 782: 5239, 5245, 828: 5235, 864: 5244}, - {7: 5289, 53: 5290}, - {889, 889, 7: 889, 53: 889, 453: 889, 455: 889, 461: 889, 463: 889, 5256, 5257, 471: 889, 889, 474: 889, 889, 889, 889, 480: 889, 482: 889, 484: 889, 493: 889, 889, 5255, 889, 889, 5258, 5254, 5259, 5260, 798: 5253, 803: 5252}, - {2: 2900, 2748, 2784, 2902, 2675, 880, 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 880, 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 460: 5250, 775, 464: 880, 880, 471: 775, 775, 475: 2634, 480: 2635, 484: 2631, 495: 880, 498: 880, 880, 880, 880, 640: 5249, 2668, 2669, 2667, 748: 3774, 3775, 898: 5248, 5247}, + {886, 886, 7: 886, 57: 886, 460: 886, 462: 886, 468: 886, 470: 886, 886, 886, 476: 886, 478: 886, 886, 481: 886, 886, 886, 485: 886, 487: 886, 490: 886, 886, 886, 500: 886, 886, 886, 886, 886, 886, 886, 886, 886, 510: 886, 513: 886, 886, 662: 886}, + {885, 885, 7: 885, 57: 885, 460: 885, 462: 885, 468: 885, 470: 885, 885, 885, 476: 885, 478: 885, 885, 481: 885, 885, 885, 485: 885, 487: 885, 490: 885, 885, 885, 500: 885, 885, 885, 885, 885, 885, 885, 885, 885, 510: 885, 513: 885, 885, 662: 885}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5247, 2670, 2671, 2669}, + {884, 884, 7: 884, 57: 884, 460: 884, 462: 884, 468: 884, 470: 884, 884, 884, 476: 884, 478: 884, 884, 481: 884, 884, 884, 485: 884, 487: 884, 490: 884, 884, 884, 500: 884, 884, 884, 884, 884, 884, 884, 884, 884, 510: 884, 513: 884, 884, 662: 884}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 461: 5239, 652: 3813, 2670, 2671, 2669, 698: 5238, 726: 5237, 788: 5236, 791: 5235, 5278}, // 2795 - {884, 884, 7: 884, 53: 884, 453: 884, 455: 884, 461: 884, 463: 884, 884, 884, 471: 884, 884, 474: 884, 884, 884, 884, 480: 884, 482: 884, 484: 884, 493: 884, 884, 884, 884, 884, 884, 884, 884, 884, 503: 884}, - {879, 879, 7: 879, 53: 879, 453: 879, 455: 879, 461: 879, 463: 879, 879, 879, 470: 879, 879, 879, 474: 879, 879, 879, 879, 480: 879, 482: 879, 879, 879, 493: 879, 879, 879, 879, 879, 879, 879, 879, 879, 503: 879, 506: 879, 879, 654: 879}, - {878, 878, 7: 878, 53: 878, 453: 878, 455: 878, 461: 878, 463: 878, 878, 878, 470: 878, 878, 878, 474: 878, 878, 878, 878, 480: 878, 482: 878, 878, 878, 493: 878, 878, 878, 878, 878, 878, 878, 878, 878, 503: 878, 506: 878, 878, 654: 878}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5251, 2668, 2669, 2667}, - {877, 877, 7: 877, 53: 877, 453: 877, 455: 877, 461: 877, 463: 877, 877, 877, 470: 877, 877, 877, 474: 877, 877, 877, 877, 480: 877, 482: 877, 877, 877, 493: 877, 877, 877, 877, 877, 877, 877, 877, 877, 503: 877, 506: 877, 877, 654: 877}, + {505: 855, 895: 5265, 1077: 5269}, + {471: 5252, 5253, 505: 5262, 806: 5263}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 461: 5239, 652: 3813, 2670, 2671, 2669, 698: 5238, 726: 5237, 788: 5236, 791: 5235, 5259}, + {505: 857, 895: 857}, + {505: 856, 895: 856}, // 2800 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 454: 5243, 640: 3804, 2668, 2669, 2667, 690: 5242, 719: 5241, 779: 5240, 782: 5239, 5282}, - {498: 848, 886: 5269, 1073: 5273}, - {464: 5256, 5257, 498: 5266, 798: 5267}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 454: 5243, 640: 3804, 2668, 2669, 2667, 690: 5242, 719: 5241, 779: 5240, 782: 5239, 5263}, - {498: 850, 886: 850}, + {2: 853, 853, 853, 853, 853, 8: 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 58: 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 461: 853}, + {505: 5258}, + {505: 5257}, + {2: 851, 851, 851, 851, 851, 8: 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 58: 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 461: 851}, + {2: 852, 852, 852, 852, 852, 8: 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 58: 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, 461: 852}, // 2805 - {498: 849, 886: 849}, - {2: 846, 846, 846, 846, 846, 8: 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 54: 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 454: 846}, - {498: 5262}, - {498: 5261}, - {2: 844, 844, 844, 844, 844, 8: 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 54: 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 454: 844}, + {859, 859, 7: 859, 57: 859, 460: 5260, 462: 859, 468: 859, 470: 859, 859, 859, 478: 859, 859, 481: 859, 859, 859, 485: 859, 490: 859, 859, 859, 500: 859, 859, 859, 859, 859, 859, 859, 859, 859, 510: 859, 806: 5249, 812: 5248}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 5261}, + {858, 858, 7: 858, 57: 858, 460: 858, 462: 858, 468: 858, 470: 858, 858, 858, 478: 858, 858, 481: 858, 858, 858, 485: 858, 490: 858, 858, 858, 494: 3242, 496: 3240, 3241, 3239, 3237, 858, 858, 858, 858, 858, 858, 858, 858, 858, 510: 858, 722: 3238, 3236}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 461: 5239, 652: 3813, 2670, 2671, 2669, 698: 5238, 726: 5237, 788: 5236, 791: 5235, 5268}, + {505: 855, 895: 5265, 1077: 5264}, // 2810 - {2: 845, 845, 845, 845, 845, 8: 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 54: 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 845, 454: 845}, - {852, 852, 7: 852, 53: 852, 453: 5264, 455: 852, 461: 852, 463: 852, 852, 852, 471: 852, 852, 474: 852, 852, 852, 852, 480: 852, 482: 852, 484: 852, 493: 852, 852, 852, 852, 852, 852, 852, 852, 852, 503: 852, 798: 5253, 803: 5252}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 5265}, - {851, 851, 7: 851, 53: 851, 453: 851, 455: 851, 461: 851, 463: 851, 851, 851, 471: 851, 851, 474: 851, 851, 851, 851, 480: 851, 482: 851, 484: 851, 486: 3233, 489: 3231, 3232, 3230, 3228, 851, 851, 851, 851, 851, 851, 851, 851, 851, 503: 851, 714: 3229, 3227}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 454: 5243, 640: 3804, 2668, 2669, 2667, 690: 5242, 719: 5241, 779: 5240, 782: 5239, 5272}, + {505: 5266}, + {505: 854}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 461: 5239, 652: 3813, 2670, 2671, 2669, 698: 5238, 726: 5237, 788: 5236, 791: 5235, 5267}, + {860, 860, 7: 860, 57: 860, 460: 860, 462: 860, 468: 860, 470: 860, 860, 860, 478: 860, 860, 481: 860, 860, 860, 485: 860, 490: 860, 860, 860, 500: 860, 860, 860, 860, 860, 860, 860, 860, 860, 510: 860, 806: 5249, 812: 5248}, + {861, 861, 7: 861, 57: 861, 460: 861, 462: 861, 468: 861, 470: 861, 861, 861, 478: 861, 861, 481: 861, 861, 861, 485: 861, 490: 861, 861, 861, 500: 861, 861, 861, 861, 861, 861, 861, 861, 861, 510: 861, 806: 5249, 812: 5248}, // 2815 - {498: 848, 886: 5269, 1073: 5268}, - {498: 5270}, - {498: 847}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 454: 5243, 640: 3804, 2668, 2669, 2667, 690: 5242, 719: 5241, 779: 5240, 782: 5239, 5271}, - {853, 853, 7: 853, 53: 853, 453: 853, 455: 853, 461: 853, 463: 853, 853, 853, 471: 853, 853, 474: 853, 853, 853, 853, 480: 853, 482: 853, 484: 853, 493: 853, 853, 853, 853, 853, 853, 853, 853, 853, 503: 853, 798: 5253, 803: 5252}, + {505: 5270}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 461: 5239, 652: 3813, 2670, 2671, 2669, 698: 5238, 726: 5237, 788: 5236, 791: 5235, 5271}, + {460: 5272, 470: 5273, 5252, 5253, 502: 5251, 505: 5254, 5250, 5255, 5256, 806: 5249, 812: 5248}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 5277}, + {461: 5274}, // 2820 - {854, 854, 7: 854, 53: 854, 453: 854, 455: 854, 461: 854, 463: 854, 854, 854, 471: 854, 854, 474: 854, 854, 854, 854, 480: 854, 482: 854, 484: 854, 493: 854, 854, 854, 854, 854, 854, 854, 854, 854, 503: 854, 798: 5253, 803: 5252}, - {498: 5274}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 454: 5243, 640: 3804, 2668, 2669, 2667, 690: 5242, 719: 5241, 779: 5240, 782: 5239, 5275}, - {453: 5276, 463: 5277, 5256, 5257, 495: 5255, 498: 5258, 5254, 5259, 5260, 798: 5253, 803: 5252}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 5281}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4033, 2670, 2671, 2669, 732: 4034, 797: 5275}, + {7: 4036, 57: 5276}, + {862, 862, 7: 862, 57: 862, 460: 862, 462: 862, 468: 862, 470: 862, 862, 862, 478: 862, 862, 481: 862, 862, 862, 485: 862, 490: 862, 862, 862, 500: 862, 862, 862, 862, 862, 862, 862, 862, 862, 510: 862}, + {863, 863, 7: 863, 57: 863, 460: 863, 462: 863, 468: 863, 470: 863, 863, 863, 478: 863, 863, 481: 863, 863, 863, 485: 863, 490: 863, 863, 863, 494: 3242, 496: 3240, 3241, 3239, 3237, 863, 863, 863, 863, 863, 863, 863, 863, 863, 510: 863, 722: 3238, 3236}, + {866, 866, 7: 866, 57: 866, 460: 5279, 462: 866, 468: 866, 470: 5280, 5252, 5253, 478: 866, 866, 481: 866, 866, 866, 485: 866, 490: 866, 866, 866, 500: 866, 866, 5251, 866, 866, 5254, 5250, 5255, 5256, 510: 866, 806: 5249, 812: 5248}, // 2825 - {454: 5278}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4023, 2668, 2669, 2667, 724: 4024, 766: 5279}, - {7: 4026, 53: 5280}, - {855, 855, 7: 855, 53: 855, 453: 855, 455: 855, 461: 855, 463: 855, 855, 855, 471: 855, 855, 474: 855, 855, 855, 855, 480: 855, 482: 855, 484: 855, 493: 855, 855, 855, 855, 855, 855, 855, 855, 855, 503: 855}, - {856, 856, 7: 856, 53: 856, 453: 856, 455: 856, 461: 856, 463: 856, 856, 856, 471: 856, 856, 474: 856, 856, 856, 856, 480: 856, 482: 856, 484: 856, 486: 3233, 489: 3231, 3232, 3230, 3228, 856, 856, 856, 856, 856, 856, 856, 856, 856, 503: 856, 714: 3229, 3227}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 5284}, + {461: 5281}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4033, 2670, 2671, 2669, 732: 4034, 797: 5282}, + {7: 4036, 57: 5283}, + {864, 864, 7: 864, 57: 864, 460: 864, 462: 864, 468: 864, 470: 864, 864, 864, 478: 864, 864, 481: 864, 864, 864, 485: 864, 490: 864, 864, 864, 500: 864, 864, 864, 864, 864, 864, 864, 864, 864, 510: 864}, // 2830 - {859, 859, 7: 859, 53: 859, 453: 5283, 455: 859, 461: 859, 463: 5284, 5256, 5257, 471: 859, 859, 474: 859, 859, 859, 859, 480: 859, 482: 859, 484: 859, 493: 859, 859, 5255, 859, 859, 5258, 5254, 5259, 5260, 503: 859, 798: 5253, 803: 5252}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 5288}, - {454: 5285}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4023, 2668, 2669, 2667, 724: 4024, 766: 5286}, - {7: 4026, 53: 5287}, + {865, 865, 7: 865, 57: 865, 460: 865, 462: 865, 468: 865, 470: 865, 865, 865, 478: 865, 865, 481: 865, 865, 865, 485: 865, 490: 865, 865, 865, 494: 3242, 496: 3240, 3241, 3239, 3237, 865, 865, 865, 865, 865, 865, 865, 865, 865, 510: 865, 722: 3238, 3236}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 461: 5239, 567: 5234, 652: 3813, 2670, 2671, 2669, 698: 5238, 726: 5237, 788: 5236, 791: 5235, 5241, 839: 5287}, + {890, 890, 7: 890, 57: 890, 460: 890, 462: 890, 468: 890, 470: 890, 890, 890, 478: 890, 890, 481: 890, 890, 890, 485: 890, 490: 890, 890, 890, 500: 890, 890, 890, 890, 890, 890, 890, 890, 890, 510: 890}, + {897, 897, 7: 897, 57: 897, 460: 897, 462: 897, 468: 897, 470: 897, 478: 897, 897, 481: 897, 897, 897, 485: 897, 490: 897, 897, 897, 500: 897, 897, 503: 897, 897}, + {887, 887, 2906, 2754, 2790, 2908, 2681, 887, 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 887, 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 887, 462: 887, 467: 5246, 887, 470: 887, 887, 887, 476: 887, 478: 887, 887, 481: 887, 887, 887, 485: 887, 487: 887, 490: 887, 887, 887, 500: 887, 887, 887, 887, 887, 887, 887, 887, 887, 510: 887, 513: 887, 887, 652: 5245, 2670, 2671, 2669, 662: 887, 902: 5244, 5293}, // 2835 - {857, 857, 7: 857, 53: 857, 453: 857, 455: 857, 461: 857, 463: 857, 857, 857, 471: 857, 857, 474: 857, 857, 857, 857, 480: 857, 482: 857, 484: 857, 493: 857, 857, 857, 857, 857, 857, 857, 857, 857, 503: 857}, - {858, 858, 7: 858, 53: 858, 453: 858, 455: 858, 461: 858, 463: 858, 858, 858, 471: 858, 858, 474: 858, 858, 858, 858, 480: 858, 482: 858, 484: 858, 486: 3233, 489: 3231, 3232, 3230, 3228, 858, 858, 858, 858, 858, 858, 858, 858, 858, 503: 858, 714: 3229, 3227}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 454: 5243, 558: 5238, 640: 3804, 2668, 2669, 2667, 690: 5242, 719: 5241, 779: 5240, 782: 5239, 5245, 828: 5291}, - {883, 883, 7: 883, 53: 883, 453: 883, 455: 883, 461: 883, 463: 883, 883, 883, 471: 883, 883, 474: 883, 883, 883, 883, 480: 883, 482: 883, 484: 883, 493: 883, 883, 883, 883, 883, 883, 883, 883, 883, 503: 883}, - {890, 890, 7: 890, 53: 890, 453: 890, 455: 890, 461: 890, 463: 890, 471: 890, 890, 474: 890, 890, 890, 890, 480: 890, 482: 890, 484: 890, 493: 890, 890, 496: 890, 890}, + {461: 5290}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4634, 2670, 2671, 2669, 778: 5291}, + {7: 4635, 57: 5292}, + {888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 888, 467: 888, 888, 470: 888, 888, 888, 476: 888, 478: 888, 888, 481: 888, 888, 888, 485: 888, 888, 888, 490: 888, 888, 888, 500: 888, 888, 888, 888, 888, 888, 888, 888, 888, 510: 888, 513: 888, 888, 543: 888, 555: 888, 633: 888, 637: 888, 648: 888, 662: 888}, + {1814, 1814, 7: 1814, 57: 1814, 460: 1814, 462: 1814, 468: 1814, 470: 1814, 1814, 1814, 476: 1814, 478: 1814, 1814, 481: 1814, 1814, 1814, 485: 1814, 487: 1814, 490: 1814, 1814, 1814, 500: 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 1814, 510: 1814, 513: 1814, 1814, 662: 5295, 911: 5294, 1153: 5296}, // 2840 - {880, 880, 2900, 2748, 2784, 2902, 2675, 880, 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 880, 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 880, 455: 880, 460: 5250, 880, 463: 880, 880, 880, 470: 880, 880, 880, 474: 880, 880, 880, 880, 480: 880, 482: 880, 880, 880, 493: 880, 880, 880, 880, 880, 880, 880, 880, 880, 503: 880, 506: 880, 880, 640: 5249, 2668, 2669, 2667, 654: 880, 898: 5248, 5297}, - {454: 5294}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4588, 2668, 2669, 2667, 770: 5295}, - {7: 4589, 53: 5296}, - {881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 881, 460: 881, 881, 463: 881, 881, 881, 470: 881, 881, 881, 474: 881, 881, 881, 881, 480: 881, 881, 881, 881, 881, 493: 881, 881, 881, 881, 881, 881, 881, 881, 881, 503: 881, 506: 881, 881, 536: 881, 550: 881, 628: 881, 630: 881, 644: 881, 654: 881}, + {1813, 1813, 7: 1813, 57: 1813, 460: 1813, 462: 1813, 468: 1813, 470: 1813, 1813, 1813, 476: 1813, 478: 1813, 1813, 481: 1813, 1813, 1813, 485: 1813, 487: 1813, 490: 1813, 1813, 1813, 500: 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 1813, 510: 1813, 513: 1813, 1813}, + {213: 5337}, + {868, 868, 7: 868, 57: 868, 460: 868, 462: 868, 468: 868, 470: 868, 868, 868, 476: 5299, 478: 868, 868, 481: 868, 868, 868, 485: 868, 487: 5300, 490: 868, 868, 868, 500: 868, 868, 868, 868, 868, 868, 868, 868, 868, 510: 868, 513: 5298, 868, 927: 5302, 5301, 1043: 5303, 5297}, + {983, 983, 7: 983, 57: 983, 460: 983, 462: 983, 468: 983, 470: 983, 983, 983, 478: 983, 983, 481: 983, 983, 983, 485: 983, 490: 983, 983, 983, 500: 983, 983, 983, 983, 983, 983, 983, 983, 983, 510: 983, 514: 5318, 1296: 5319}, + {565: 4308, 637: 4309, 816: 5317}, // 2845 - {1800, 1800, 7: 1800, 53: 1800, 453: 1800, 455: 1800, 461: 1800, 463: 1800, 1800, 1800, 470: 1800, 1800, 1800, 474: 1800, 1800, 1800, 1800, 480: 1800, 482: 1800, 1800, 1800, 493: 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800, 503: 1800, 506: 1800, 1800, 654: 5299, 906: 5298, 1150: 5300}, - {1799, 1799, 7: 1799, 53: 1799, 453: 1799, 455: 1799, 461: 1799, 463: 1799, 1799, 1799, 470: 1799, 1799, 1799, 474: 1799, 1799, 1799, 1799, 480: 1799, 482: 1799, 1799, 1799, 493: 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 1799, 503: 1799, 506: 1799, 1799}, - {207: 5341}, - {861, 861, 7: 861, 53: 861, 453: 861, 455: 861, 461: 861, 463: 861, 861, 861, 470: 5303, 861, 861, 474: 861, 861, 861, 861, 480: 861, 482: 861, 5304, 861, 493: 861, 861, 861, 861, 861, 861, 861, 861, 861, 503: 861, 506: 5302, 861, 922: 5306, 5305, 1038: 5307, 5301}, - {976, 976, 7: 976, 53: 976, 453: 976, 455: 976, 461: 976, 463: 976, 976, 976, 471: 976, 976, 474: 976, 976, 976, 976, 480: 976, 482: 976, 484: 976, 493: 976, 976, 976, 976, 976, 976, 976, 976, 976, 503: 976, 507: 5322, 1294: 5323}, + {565: 4308, 637: 4309, 816: 5316}, + {565: 4308, 637: 4309, 816: 5315}, + {461: 880, 481: 5305, 1207: 5306}, + {870, 870, 7: 870, 57: 870, 460: 870, 462: 870, 468: 870, 470: 870, 870, 870, 476: 870, 478: 870, 870, 481: 870, 870, 870, 485: 870, 487: 870, 490: 870, 870, 870, 500: 870, 870, 870, 870, 870, 870, 870, 870, 870, 510: 870, 513: 870, 870}, + {867, 867, 7: 867, 57: 867, 460: 867, 462: 867, 468: 867, 470: 867, 867, 867, 476: 5299, 478: 867, 867, 481: 867, 867, 867, 485: 867, 487: 5300, 490: 867, 867, 867, 500: 867, 867, 867, 867, 867, 867, 867, 867, 867, 510: 867, 513: 5298, 867, 927: 5304, 5301}, // 2850 - {556: 4283, 630: 4284, 807: 5321}, - {556: 4283, 630: 4284, 807: 5320}, - {556: 4283, 630: 4284, 807: 5319}, - {454: 873, 474: 5309, 1205: 5310}, - {863, 863, 7: 863, 53: 863, 453: 863, 455: 863, 461: 863, 463: 863, 863, 863, 470: 863, 863, 863, 474: 863, 863, 863, 863, 480: 863, 482: 863, 863, 863, 493: 863, 863, 863, 863, 863, 863, 863, 863, 863, 503: 863, 506: 863, 863}, + {869, 869, 7: 869, 57: 869, 460: 869, 462: 869, 468: 869, 470: 869, 869, 869, 476: 869, 478: 869, 869, 481: 869, 869, 869, 485: 869, 487: 869, 490: 869, 869, 869, 500: 869, 869, 869, 869, 869, 869, 869, 869, 869, 510: 869, 513: 869, 869}, + {492: 5311, 501: 5312, 505: 5310}, + {461: 5307}, + {2: 2906, 2754, 2790, 2908, 2681, 875, 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 875, 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 575: 4914, 652: 4913, 2670, 2671, 2669, 845: 5308}, + {7: 4916, 57: 5309}, // 2855 - {860, 860, 7: 860, 53: 860, 453: 860, 455: 860, 461: 860, 463: 860, 860, 860, 470: 5303, 860, 860, 474: 860, 860, 860, 860, 480: 860, 482: 860, 5304, 860, 493: 860, 860, 860, 860, 860, 860, 860, 860, 860, 503: 860, 506: 5302, 860, 922: 5308, 5305}, - {862, 862, 7: 862, 53: 862, 453: 862, 455: 862, 461: 862, 463: 862, 862, 862, 470: 862, 862, 862, 474: 862, 862, 862, 862, 480: 862, 482: 862, 862, 862, 493: 862, 862, 862, 862, 862, 862, 862, 862, 862, 503: 862, 506: 862, 862}, - {484: 5315, 494: 5316, 498: 5314}, - {454: 5311}, - {2: 2900, 2748, 2784, 2902, 2675, 868, 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 868, 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 568: 4918, 640: 4917, 2668, 2669, 2667, 834: 5312}, + {876, 876, 7: 876, 57: 876, 460: 876, 462: 876, 468: 876, 470: 876, 876, 876, 476: 876, 478: 876, 876, 481: 876, 876, 876, 485: 876, 487: 876, 490: 876, 876, 876, 500: 876, 876, 876, 876, 876, 876, 876, 876, 876, 510: 876, 513: 876, 876}, + {461: 879}, + {648: 5314}, + {648: 5313}, + {461: 877}, // 2860 - {7: 4920, 53: 5313}, - {869, 869, 7: 869, 53: 869, 453: 869, 455: 869, 461: 869, 463: 869, 869, 869, 470: 869, 869, 869, 474: 869, 869, 869, 869, 480: 869, 482: 869, 869, 869, 493: 869, 869, 869, 869, 869, 869, 869, 869, 869, 503: 869, 506: 869, 869}, - {454: 872}, - {644: 5318}, - {644: 5317}, + {461: 878}, + {461: 881, 481: 881}, + {461: 882, 481: 882}, + {461: 883, 481: 883}, + {15: 5323, 295: 5322, 377: 5321, 461: 980, 1295: 5320}, // 2865 - {454: 870}, - {454: 871}, - {454: 874, 474: 874}, - {454: 875, 474: 875}, - {454: 876, 474: 876}, + {892, 892, 7: 892, 57: 892, 460: 892, 462: 892, 468: 892, 470: 892, 892, 892, 478: 892, 892, 481: 892, 892, 892, 485: 892, 490: 892, 892, 892, 500: 892, 892, 892, 892, 892, 892, 892, 892, 892, 510: 892}, + {461: 5324}, + {461: 979}, + {461: 978}, + {461: 977}, // 2870 - {16: 5327, 289: 5326, 375: 5325, 454: 973, 1293: 5324}, - {885, 885, 7: 885, 53: 885, 453: 885, 455: 885, 461: 885, 463: 885, 885, 885, 471: 885, 885, 474: 885, 885, 885, 885, 480: 885, 482: 885, 484: 885, 493: 885, 885, 885, 885, 885, 885, 885, 885, 885, 503: 885}, - {454: 5328}, - {454: 972}, - {454: 971}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 5326, 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 5325}, + {57: 976, 356: 5334, 494: 3242, 496: 3240, 3241, 3239, 3237, 512: 5333, 722: 3238, 3236, 1297: 5332}, + {973, 973, 7: 973, 57: 973, 208: 5328, 460: 973, 462: 973, 468: 973, 470: 973, 973, 973, 478: 973, 973, 481: 973, 973, 973, 485: 973, 490: 973, 973, 973, 500: 973, 973, 973, 973, 973, 973, 973, 973, 973, 510: 973, 1095: 5327}, + {981, 981, 7: 981, 57: 981, 460: 981, 462: 981, 468: 981, 470: 981, 981, 981, 478: 981, 981, 481: 981, 981, 981, 485: 981, 490: 981, 981, 981, 500: 981, 981, 981, 981, 981, 981, 981, 981, 981, 510: 981}, + {461: 5329}, // 2875 - {454: 970}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 5330, 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 5329}, - {53: 969, 352: 5338, 486: 3233, 489: 3231, 3232, 3230, 3228, 505: 5337, 714: 3229, 3227, 1295: 5336}, - {966, 966, 7: 966, 53: 966, 202: 5332, 453: 966, 455: 966, 461: 966, 463: 966, 966, 966, 471: 966, 966, 474: 966, 966, 966, 966, 480: 966, 482: 966, 484: 966, 493: 966, 966, 966, 966, 966, 966, 966, 966, 966, 503: 966, 1092: 5331}, - {974, 974, 7: 974, 53: 974, 453: 974, 455: 974, 461: 974, 463: 974, 974, 974, 471: 974, 974, 474: 974, 974, 974, 974, 480: 974, 482: 974, 484: 974, 493: 974, 974, 974, 974, 974, 974, 974, 974, 974, 503: 974}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 5330}, + {57: 5331, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {972, 972, 7: 972, 57: 972, 460: 972, 462: 972, 468: 972, 470: 972, 972, 972, 478: 972, 972, 481: 972, 972, 972, 485: 972, 490: 972, 972, 972, 500: 972, 972, 972, 972, 972, 972, 972, 972, 972, 510: 972}, + {57: 5335}, + {57: 975}, // 2880 - {454: 5333}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 5334}, - {53: 5335, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {965, 965, 7: 965, 53: 965, 453: 965, 455: 965, 461: 965, 463: 965, 965, 965, 471: 965, 965, 474: 965, 965, 965, 965, 480: 965, 482: 965, 484: 965, 493: 965, 965, 965, 965, 965, 965, 965, 965, 965, 503: 965}, - {53: 5339}, + {57: 974}, + {973, 973, 7: 973, 57: 973, 208: 5328, 460: 973, 462: 973, 468: 973, 470: 973, 973, 973, 478: 973, 973, 481: 973, 973, 973, 485: 973, 490: 973, 973, 973, 500: 973, 973, 973, 973, 973, 973, 973, 973, 973, 510: 973, 1095: 5336}, + {982, 982, 7: 982, 57: 982, 460: 982, 462: 982, 468: 982, 470: 982, 982, 982, 478: 982, 982, 481: 982, 982, 982, 485: 982, 490: 982, 982, 982, 500: 982, 982, 982, 982, 982, 982, 982, 982, 982, 510: 982}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 5338}, + {1812, 1812, 7: 1812, 57: 1812, 460: 1812, 462: 1812, 468: 1812, 470: 1812, 1812, 1812, 476: 1812, 478: 1812, 1812, 481: 1812, 1812, 1812, 485: 1812, 487: 1812, 490: 1812, 1812, 1812, 494: 3242, 496: 3240, 3241, 3239, 3237, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 1812, 510: 1812, 513: 1812, 1812, 722: 3238, 3236}, // 2885 - {53: 968}, - {53: 967}, - {966, 966, 7: 966, 53: 966, 202: 5332, 453: 966, 455: 966, 461: 966, 463: 966, 966, 966, 471: 966, 966, 474: 966, 966, 966, 966, 480: 966, 482: 966, 484: 966, 493: 966, 966, 966, 966, 966, 966, 966, 966, 966, 503: 966, 1092: 5340}, - {975, 975, 7: 975, 53: 975, 453: 975, 455: 975, 461: 975, 463: 975, 975, 975, 471: 975, 975, 474: 975, 975, 975, 975, 480: 975, 482: 975, 484: 975, 493: 975, 975, 975, 975, 975, 975, 975, 975, 975, 503: 975}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 5342}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 461: 5239, 652: 3813, 2670, 2671, 2669, 698: 5238, 726: 5237, 788: 5236, 791: 5235, 5340}, + {471: 5252, 5253, 502: 5251, 505: 5254, 5250, 5255, 5256, 510: 5341, 806: 5249, 812: 5248}, + {895, 895, 7: 895, 57: 895, 460: 895, 462: 895, 468: 895, 470: 895, 478: 895, 895, 481: 895, 895, 895, 485: 895, 490: 895, 895, 895, 500: 895, 895, 503: 895, 895}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4033, 2670, 2671, 2669, 732: 5343, 878: 5344, 912: 5345}, + {484: 5353}, // 2890 - {1798, 1798, 7: 1798, 53: 1798, 453: 1798, 455: 1798, 461: 1798, 463: 1798, 1798, 1798, 470: 1798, 1798, 1798, 474: 1798, 1798, 1798, 1798, 480: 1798, 482: 1798, 1798, 1798, 486: 3233, 489: 3231, 3232, 3230, 3228, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 1798, 503: 1798, 506: 1798, 1798, 714: 3229, 3227}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 454: 5243, 640: 3804, 2668, 2669, 2667, 690: 5242, 719: 5241, 779: 5240, 782: 5239, 5344}, - {464: 5256, 5257, 495: 5255, 498: 5258, 5254, 5259, 5260, 503: 5345, 798: 5253, 803: 5252}, - {888, 888, 7: 888, 53: 888, 453: 888, 455: 888, 461: 888, 463: 888, 471: 888, 888, 474: 888, 888, 888, 888, 480: 888, 482: 888, 484: 888, 493: 888, 888, 496: 888, 888}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4023, 2668, 2669, 2667, 724: 5347, 866: 5348, 907: 5349}, + {2279, 2279, 7: 2279, 470: 2279, 482: 2279, 491: 2279, 2279}, + {237, 237, 7: 5346, 470: 237, 482: 237, 491: 2630, 237, 779: 2631, 5347}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4033, 2670, 2671, 2669, 732: 5343, 878: 5352}, + {1260, 1260, 470: 1260, 482: 1260, 492: 2633, 755: 2634, 800: 5348}, + {850, 850, 470: 850, 482: 5349, 1052: 5350}, // 2895 - {478: 5357}, - {2263, 2263, 7: 2263, 463: 2263, 475: 2263, 482: 2263, 484: 2263}, - {237, 237, 7: 5350, 463: 237, 475: 237, 482: 2628, 484: 237, 773: 2629, 5351}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4023, 2668, 2669, 2667, 724: 5347, 866: 5356}, - {1253, 1253, 463: 1253, 475: 1253, 484: 2631, 748: 2632, 792: 5352}, + {495: 2644, 566: 2646, 724: 2643, 733: 2645, 868: 5351}, + {241, 241, 470: 241}, + {849, 849, 470: 849}, + {2278, 2278, 7: 2278, 470: 2278, 482: 2278, 491: 2278, 2278}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3795, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3791, 787: 5354}, // 2900 - {843, 843, 463: 843, 475: 5353, 1047: 5354}, - {488: 2642, 557: 2644, 716: 2641, 725: 2643, 855: 5355}, - {241, 241, 463: 241}, - {842, 842, 463: 842}, - {2262, 2262, 7: 2262, 463: 2262, 475: 2262, 482: 2262, 484: 2262}, + {2280, 2280, 7: 2280, 470: 2280, 482: 2280, 491: 2280, 2280}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4033, 2670, 2671, 2669, 732: 5343, 878: 5344, 912: 5356}, + {237, 237, 7: 5346, 470: 237, 491: 2630, 779: 2631, 5357}, + {240, 240, 470: 240}, + {2: 379, 379, 379, 379, 379, 8: 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 58: 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379}, // 2905 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3786, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3782, 786: 5358}, - {2264, 2264, 7: 2264, 463: 2264, 475: 2264, 482: 2264, 484: 2264}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4023, 2668, 2669, 2667, 724: 5347, 866: 5348, 907: 5360}, - {237, 237, 7: 5350, 463: 237, 482: 2628, 773: 2629, 5361}, - {240, 240, 463: 240}, - // 2910 - {2: 379, 379, 379, 379, 379, 8: 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 54: 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 5364}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 5360}, {378, 378}, - {31: 5377, 107: 5367, 122: 5370, 140: 551, 176: 5369, 181: 5380, 190: 5378, 206: 5371, 217: 5375, 237: 5379, 240: 5372, 524: 5376, 550: 5366, 1123: 5374, 1192: 5368, 1223: 5373}, - {1979, 1979, 1979, 1979, 1979, 1979, 1979, 8: 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 54: 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 1979, 455: 1979, 547: 1979}, + {31: 5373, 110: 5363, 125: 5366, 142: 556, 180: 5365, 186: 5376, 195: 5374, 212: 5367, 223: 5371, 243: 5375, 246: 5368, 531: 5372, 555: 5362, 1127: 5370, 1195: 5364, 1225: 5369}, + {1995, 1995, 1995, 1995, 1995, 1995, 1995, 8: 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 58: 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995, 462: 1995, 554: 1995}, + {1994, 1994, 1994, 1994, 1994, 1994, 1994, 8: 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 58: 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994, 462: 1994, 554: 1994}, + // 2910 + {566, 566}, + {563, 563}, + {562, 562}, + {204: 5383}, + {560, 560}, // 2915 - {1978, 1978, 1978, 1978, 1978, 1978, 1978, 8: 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 54: 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 1978, 455: 1978, 547: 1978}, - {561, 561}, - {558, 558}, + {142: 5382}, + {547, 547, 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 462: 547, 652: 3813, 2670, 2671, 2669, 726: 3814, 785: 4201, 1126: 5377}, {557, 557}, - {198: 5387}, + {142: 555}, + {142: 554}, // 2920 - {555, 555}, - {140: 5386}, - {542, 542, 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 455: 542, 640: 3804, 2668, 2669, 2667, 719: 3805, 778: 4186, 1122: 5381}, - {552, 552}, - {140: 550}, + {142: 553}, + {142: 552}, + {142: 551}, + {543, 543, 462: 5379, 1324: 5378}, + {558, 558}, // 2925 - {140: 549}, - {140: 548}, - {140: 547}, - {140: 546}, - {538, 538, 455: 5383, 1322: 5382}, + {660: 5380}, + {485: 5381}, + {542, 542}, + {559, 559}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5384, 2670, 2671, 2669, 939: 5385}, // 2930 - {553, 553}, - {652: 5384}, - {477: 5385}, - {537, 537}, - {554, 554}, + {565, 565, 7: 565}, + {561, 561, 7: 5386}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5387, 2670, 2671, 2669}, + {564, 564, 7: 564}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 5486, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 5487, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 5488, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 5489}, // 2935 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5388, 2668, 2669, 2667, 935: 5389}, - {560, 560, 7: 560}, - {556, 556, 7: 5390}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5391, 2668, 2669, 2667}, - {559, 559, 7: 559}, + {555: 5472, 637: 5473}, + {637: 5469}, + {555: 5464, 637: 5463}, + {555: 5461}, + {312: 5455}, // 2940 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 5490, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 5491, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 5492, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 5493}, - {550: 5476, 630: 5477}, - {630: 5473}, - {550: 5468, 630: 5467}, - {550: 5465}, + {138: 5452, 210: 5454, 321: 5450, 351: 5451, 901: 5453}, + {191: 5447, 194: 5446}, + {555: 5405}, + {138: 5404}, + {138: 5403}, // 2945 - {306: 5459}, - {136: 5456, 204: 5458, 315: 5454, 347: 5455, 897: 5457}, - {186: 5451, 189: 5450}, - {550: 5409}, - {136: 5408}, + {138: 5402}, + {380: 5401}, + {670, 670}, + {675, 675}, + {676, 676}, // 2950 - {136: 5407}, - {136: 5406}, - {377: 5405}, - {664, 664}, - {669, 669}, + {677, 677}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 5406}, + {663: 5407, 918: 5408}, + {159: 5410, 162: 5411, 555: 2010, 934: 5409}, + {678, 678}, // 2955 - {670, 670}, - {671, 671}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 5410}, - {655: 5411, 913: 5412}, - {153: 5414, 157: 5415, 550: 1994, 929: 5413}, + {555: 5413}, + {110: 2009, 555: 2009}, + {159: 5412}, + {110: 2008, 555: 2008}, + {2: 1809, 1809, 1809, 1809, 1809, 8: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 58: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 554: 4710, 774: 5414}, // 2960 - {672, 672}, - {550: 5417}, - {107: 1993, 550: 1993}, - {153: 5416}, - {107: 1992, 550: 1992}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 5415}, + {425, 425, 4: 425, 425, 425, 13: 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 460: 425, 5419, 425, 466: 425, 425, 425, 425, 476: 425, 425, 486: 425, 425, 425, 493: 425, 509: 5418, 555: 425, 633: 425, 636: 425, 425, 1219: 5417, 1292: 5416}, + {385, 385, 4: 4140, 4142, 389, 13: 2112, 4159, 4086, 4098, 4091, 4093, 4087, 4092, 4095, 4089, 4085, 4090, 4094, 4088, 4157, 4177, 4161, 4148, 4141, 4144, 4143, 4146, 4147, 4149, 4156, 389, 4167, 4168, 4154, 4155, 4160, 4162, 4174, 4173, 4179, 4175, 4172, 4165, 4170, 4171, 4164, 4166, 4169, 4158, 460: 385, 385, 385, 466: 4139, 385, 4176, 2112, 476: 385, 385, 486: 385, 4853, 2112, 493: 385, 555: 385, 633: 385, 636: 2112, 4145, 760: 4096, 766: 4097, 769: 4150, 781: 4152, 801: 4151, 823: 4153, 827: 4163, 831: 4178, 906: 5434, 1001: 5433}, + {2115, 2115, 460: 5427, 1067: 5426}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 5425}, // 2965 - {2: 1795, 1795, 1795, 1795, 1795, 8: 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 54: 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 547: 4745, 764: 5418}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 5419}, - {420, 420, 4: 420, 420, 420, 13: 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 453: 420, 5423, 420, 459: 420, 420, 420, 420, 469: 420, 420, 481: 420, 483: 420, 485: 420, 487: 420, 502: 5422, 550: 420, 628: 420, 420, 420, 1217: 5421, 1290: 5420}, - {385, 385, 4: 4130, 4132, 389, 13: 4081, 2096, 4149, 4076, 4088, 4083, 4077, 4082, 4085, 4079, 4075, 4080, 4084, 4078, 4147, 4162, 4151, 4138, 4131, 4134, 4133, 4136, 4137, 4139, 4146, 389, 4144, 4145, 4150, 4152, 4159, 4158, 4164, 4160, 4157, 4155, 4154, 4156, 4148, 453: 385, 385, 385, 459: 4129, 385, 4161, 2096, 469: 385, 385, 481: 385, 483: 4641, 485: 2096, 487: 385, 550: 385, 628: 385, 2096, 4135, 753: 4086, 757: 4087, 759: 4140, 775: 4142, 793: 4141, 815: 4143, 819: 4153, 822: 4163, 902: 5438, 996: 5437}, - {2099, 2099, 453: 5431, 1063: 5430}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 509: 5420, 565: 2329, 573: 2329, 575: 2329, 631: 2329, 4487, 637: 2329, 652: 4033, 2670, 2671, 2669, 664: 2329, 2329, 732: 4354, 821: 4696, 835: 4828, 890: 4829, 952: 4830, 1124: 5421}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 5423}, + {7: 4832, 57: 5422}, + {424, 424, 4: 424, 424, 424, 13: 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 460: 424, 424, 424, 466: 424, 424, 424, 424, 476: 424, 424, 486: 424, 424, 424, 493: 424, 555: 424, 633: 424, 636: 424, 424}, + {57: 5424}, // 2970 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 5429}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 502: 5424, 556: 2311, 566: 2311, 568: 2311, 624: 2311, 4434, 630: 2311, 640: 4023, 2668, 2669, 2667, 656: 2311, 2311, 724: 4301, 813: 4731, 825: 4863, 880: 4864, 948: 4865, 1120: 5425}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 5427}, - {7: 4867, 53: 5426}, - {419, 419, 4: 419, 419, 419, 13: 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 453: 419, 419, 419, 459: 419, 419, 419, 419, 469: 419, 419, 481: 419, 483: 419, 485: 419, 487: 419, 550: 419, 628: 419, 419, 419}, + {2043, 2043, 460: 2043}, + {2044, 2044, 460: 2044}, + {2116, 2116}, + {145: 5428}, + {358: 5430, 731: 5429}, // 2975 - {53: 5428}, - {2027, 2027, 453: 2027}, - {2028, 2028, 453: 2028}, - {2100, 2100}, - {156: 5432}, + {512: 5432}, + {512: 5431}, + {2113, 2113}, + {2114, 2114}, + {2110, 2110, 460: 2110, 2110, 2110, 467: 2110, 476: 2110, 5436, 486: 2110, 493: 2110, 555: 2110, 633: 2110, 1080: 5435}, // 2980 - {354: 5434, 726: 5433}, - {505: 5436}, - {505: 5435}, - {2097, 2097}, - {2098, 2098}, + {384, 384, 4: 4140, 4142, 389, 4855, 13: 2112, 4159, 4086, 4098, 4091, 4093, 4087, 4092, 4095, 4089, 4085, 4090, 4094, 4088, 4157, 4177, 4161, 4148, 4141, 4144, 4143, 4146, 4147, 4149, 4156, 389, 4167, 4168, 4154, 4155, 4160, 4162, 4174, 4173, 4179, 4175, 4172, 4165, 4170, 4171, 4164, 4166, 4169, 4158, 460: 384, 384, 384, 466: 4139, 384, 4176, 2112, 476: 384, 384, 486: 384, 4853, 2112, 493: 384, 555: 384, 633: 384, 636: 2112, 4145, 760: 4096, 766: 4097, 769: 4150, 781: 4152, 801: 4151, 823: 4153, 827: 4163, 831: 4854}, + {2058, 2058, 460: 2058, 2058, 2058, 467: 2058, 476: 5030, 486: 2058, 493: 5031, 555: 2058, 633: 2058, 1021: 5437}, + {648: 4925}, + {2055, 2055, 460: 2055, 2055, 2055, 467: 5439, 486: 2055, 555: 2055, 633: 2055, 1154: 5438}, + {2053, 2053, 460: 2053, 2503, 2502, 486: 2501, 555: 2500, 633: 2496, 698: 5444, 740: 5442, 2497, 2498, 2499, 2508, 2506, 2505, 2504, 751: 5443, 5441, 3772, 1175: 5440}, // 2985 - {2094, 2094, 453: 2094, 2094, 2094, 460: 2094, 469: 5440, 2094, 481: 2094, 487: 2094, 550: 2094, 628: 2094, 1076: 5439}, - {384, 384, 4: 4130, 4132, 389, 4643, 13: 4081, 2096, 4149, 4076, 4088, 4083, 4077, 4082, 4085, 4079, 4075, 4080, 4084, 4078, 4147, 4162, 4151, 4138, 4131, 4134, 4133, 4136, 4137, 4139, 4146, 389, 4144, 4145, 4150, 4152, 4159, 4158, 4164, 4160, 4157, 4155, 4154, 4156, 4148, 453: 384, 384, 384, 459: 4129, 384, 4161, 2096, 469: 384, 384, 481: 384, 483: 4641, 485: 2096, 487: 384, 550: 384, 628: 384, 2096, 4135, 753: 4086, 757: 4087, 759: 4140, 775: 4142, 793: 4141, 815: 4143, 819: 4153, 822: 4642}, - {2042, 2042, 453: 2042, 2042, 2042, 460: 2042, 470: 5034, 481: 2042, 487: 5035, 550: 2042, 628: 2042, 1016: 5441}, - {644: 4929}, - {2039, 2039, 453: 2039, 2039, 2039, 460: 5443, 481: 2039, 550: 2039, 628: 2039, 1151: 5442}, + {2054, 2054, 460: 2054, 2054, 2054, 486: 2054, 555: 2054, 633: 2054}, + {2115, 2115, 460: 5427, 1067: 5445}, + {2052, 2052, 460: 2052}, + {2051, 2051, 460: 2051, 468: 782, 478: 782, 782}, + {2050, 2050, 460: 2050}, // 2990 - {2037, 2037, 453: 2037, 2501, 2500, 481: 2499, 550: 2498, 628: 2494, 690: 5448, 733: 5446, 2495, 2496, 2497, 2506, 739: 2504, 2503, 2502, 745: 5447, 5445, 3763, 1172: 5444}, - {2038, 2038, 453: 2038, 2038, 2038, 481: 2038, 550: 2038, 628: 2038}, - {2099, 2099, 453: 5431, 1063: 5449}, - {2036, 2036, 453: 2036}, - {2035, 2035, 453: 2035, 461: 776, 471: 776, 776}, + {2049, 2049, 460: 2049, 468: 781, 478: 781, 781, 482: 2636, 490: 2637, 492: 2633, 755: 3783, 3784}, + {2117, 2117}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5384, 2670, 2671, 2669, 939: 5449}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5384, 2670, 2671, 2669, 939: 5448}, + {680, 680, 7: 5386}, // 2995 - {2034, 2034, 453: 2034}, - {2033, 2033, 453: 2033, 461: 775, 471: 775, 775, 475: 2634, 480: 2635, 484: 2631, 748: 3774, 3775}, - {2101, 2101}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5388, 2668, 2669, 2667, 935: 5453}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5388, 2668, 2669, 2667, 935: 5452}, + {681, 681, 7: 5386}, + {683, 683}, + {682, 682}, + {674, 674}, + {673, 673}, // 3000 - {674, 674, 7: 5390}, - {675, 675, 7: 5390}, - {677, 677}, - {676, 676}, - {668, 668}, + {672, 672}, + {251: 5456}, + {495: 2644, 724: 3943, 750: 5458, 1063: 5457}, + {686, 686, 7: 5459}, + {662, 662, 7: 662}, // 3005 - {667, 667}, - {666, 666}, - {245: 5460}, - {488: 2642, 716: 3933, 743: 5462, 1058: 5461}, - {680, 680, 7: 5463}, + {495: 2644, 724: 3943, 750: 5460}, + {661, 661, 7: 661}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 3814, 785: 5462}, + {687, 687, 7: 3816}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 5467}, // 3010 - {656, 656, 7: 656}, - {488: 2642, 716: 3933, 743: 5464}, - {655, 655, 7: 655}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 3805, 778: 5466}, - {681, 681, 7: 3807}, + {485: 5465}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 3814, 785: 5466}, + {679, 679, 7: 3816}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5468, 2670, 2671, 2669}, + {689, 689}, // 3015 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 5471}, - {477: 5469}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 3805, 778: 5470}, - {673, 673, 7: 3807}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5472, 2668, 2669, 2667}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 5470}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5471, 2670, 2671, 2669}, + {690, 690}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 3814, 785: 5485}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 5474}, // 3020 - {683, 683}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 5474}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5475, 2668, 2669, 2667}, - {684, 684}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 3805, 778: 5489}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5475, 2670, 2671, 2669}, + {691, 691, 461: 5478, 1039: 5477, 1200: 5476}, + {688, 688, 7: 5483}, + {665, 665, 7: 665}, + {495: 2644, 724: 3943, 750: 5479}, // 3025 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 5478}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5479, 2668, 2669, 2667}, - {685, 685, 454: 5482, 1034: 5481, 1197: 5480}, - {682, 682, 7: 5487}, - {659, 659, 7: 659}, + {7: 5480}, + {495: 2644, 724: 3943, 750: 5481}, + {57: 5482}, + {663, 663, 7: 663}, + {461: 5478, 1039: 5484}, // 3030 - {488: 2642, 716: 3933, 743: 5483}, - {7: 5484}, - {488: 2642, 716: 3933, 743: 5485}, - {53: 5486}, - {657, 657, 7: 657}, + {664, 664, 7: 664}, + {692, 692, 7: 3816}, + {156: 1595, 362: 5499, 386: 5500, 641: 1595, 1145: 5498}, + {696, 696, 156: 1437, 250: 5492, 5491, 641: 1437}, + {671, 671, 156: 1418, 641: 1418}, // 3035 - {454: 5482, 1034: 5488}, - {658, 658, 7: 658}, - {686, 686, 7: 3807}, - {151: 1585, 358: 5503, 383: 5504, 633: 1585, 1142: 5502}, - {690, 690, 151: 1427, 244: 5496, 5495, 633: 1427}, + {156: 5490}, + {693, 693}, + {237, 237, 491: 2630, 495: 2644, 724: 3943, 750: 5496, 779: 2631, 5495}, + {361: 5493}, + {495: 2644, 724: 3943, 750: 5458, 1063: 5494}, // 3040 - {665, 665, 151: 1410, 633: 1410}, - {151: 5494}, - {687, 687}, - {237, 237, 482: 2628, 488: 2642, 716: 3933, 743: 5500, 773: 2629, 5499}, - {357: 5497}, + {685, 685, 7: 5459}, + {695, 695}, + {237, 237, 491: 2630, 779: 2631, 5497}, + {694, 694}, + {684, 684}, // 3045 - {488: 2642, 716: 3933, 743: 5462, 1058: 5498}, - {679, 679, 7: 5463}, - {689, 689}, - {237, 237, 482: 2628, 773: 2629, 5501}, - {688, 688}, + {495: 2644, 724: 5506}, + {333: 5502, 495: 2644, 640: 5503, 724: 5501}, + {668, 668}, + {495: 2644, 724: 5505}, + {495: 2644, 724: 5504}, // 3050 - {678, 678}, - {488: 2642, 716: 5510}, - {327: 5506, 488: 2642, 716: 5505, 718: 5507}, - {662, 662}, - {488: 2642, 716: 5509}, + {666, 666}, + {667, 667}, + {669, 669}, + {2: 259, 259, 259, 259, 259, 8: 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 58: 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 463: 259, 466: 259, 484: 1756, 531: 259, 641: 1756, 649: 1756}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 5611, 484: 1754, 641: 1754, 649: 1754, 652: 5610, 2670, 2671, 2669}, // 3055 - {488: 2642, 716: 5508}, - {660, 660}, - {661, 661}, - {663, 663}, - {2: 259, 259, 259, 259, 259, 8: 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 54: 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 456: 259, 459: 259, 478: 1746, 524: 259, 633: 1746, 645: 1746}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 5608, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 484: 1717, 641: 1717, 649: 1717, 652: 5518, 2670, 2671, 2669, 819: 5561}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 484: 1711, 641: 1711, 649: 1711, 652: 5518, 2670, 2671, 2669, 819: 5605}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 466: 5601, 484: 1709, 531: 3653, 641: 1709, 649: 1709, 652: 3385, 2670, 2671, 2669, 727: 3652, 796: 5600}, + {481: 5590, 484: 5589, 641: 1704, 649: 1704}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 5541, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 5542, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 5546, 466: 5586, 484: 1695, 640: 5584, 1695, 649: 1695, 652: 3385, 2670, 2671, 2669, 727: 5075, 790: 5548, 809: 5549, 5547, 850: 5545, 1105: 5585, 1268: 5583}, // 3060 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 5615, 478: 1744, 633: 1744, 640: 5614, 2668, 2669, 2667, 645: 1744}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 5612, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 478: 1707, 633: 1707, 640: 5522, 2668, 2669, 2667, 645: 1707, 811: 5565}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 478: 1701, 633: 1701, 640: 5522, 2668, 2669, 2667, 645: 1701, 811: 5609}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 459: 5605, 478: 1699, 524: 3644, 633: 1699, 640: 3376, 2668, 2669, 2667, 645: 1699, 720: 3643, 789: 5604}, - {474: 5594, 478: 5593, 633: 1694, 645: 1694}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 5581, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 484: 1693, 641: 1693, 649: 1693, 652: 5518, 2670, 2671, 2669, 819: 5558}, + {173: 5566, 484: 1676, 641: 1676, 649: 1676, 660: 5567, 908: 5565, 955: 5564}, + {774, 774, 7: 5554}, + {166: 5540}, + {484: 743, 641: 5538, 649: 743}, // 3065 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 5545, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 5546, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 5550, 459: 5590, 478: 1685, 633: 1685, 640: 3376, 2668, 2669, 2667, 645: 1685, 718: 5588, 720: 5079, 781: 5552, 800: 5553, 5551, 839: 5549, 1102: 5589, 1266: 5587}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 5585, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 478: 1683, 633: 1683, 640: 5522, 2668, 2669, 2667, 645: 1683, 811: 5562}, - {169: 5570, 478: 1666, 633: 1666, 645: 1666, 652: 5571, 903: 5569, 951: 5568}, - {768, 768, 7: 5558}, - {93: 5544}, + {484: 5527, 649: 5528, 813: 5536}, + {484: 5527, 649: 5528, 813: 5531}, + {484: 5527, 649: 5528, 813: 5529}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 466: 5526, 531: 3653, 652: 3385, 2670, 2671, 2669, 727: 3652, 796: 5525, 1162: 5524}, + {721, 721, 7: 721}, // 3070 - {478: 737, 633: 5542, 645: 737}, - {478: 5531, 645: 5532, 804: 5540}, - {478: 5531, 645: 5532, 804: 5535}, - {478: 5531, 645: 5532, 804: 5533}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 459: 5530, 524: 3644, 640: 3376, 2668, 2669, 2667, 720: 3643, 789: 5529, 1159: 5528}, + {728, 728, 7: 728}, + {727, 727, 7: 727}, + {726, 726, 7: 726}, + {2: 745, 745, 745, 745, 745, 8: 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 58: 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 463: 745, 745, 745, 745, 471: 745, 745, 745, 745, 745, 480: 745, 486: 745, 488: 745, 493: 745, 495: 745, 531: 745, 554: 745, 556: 745, 745, 745, 745, 745, 745, 745, 745, 745, 566: 745, 745, 745, 745, 571: 745, 745, 574: 745, 576: 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 745, 638: 745}, + {2: 744, 744, 744, 744, 744, 8: 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 58: 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 463: 744, 744, 744, 744, 471: 744, 744, 744, 744, 744, 480: 744, 486: 744, 488: 744, 493: 744, 495: 744, 531: 744, 554: 744, 556: 744, 744, 744, 744, 744, 744, 744, 744, 744, 566: 744, 744, 744, 744, 571: 744, 744, 574: 744, 576: 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, 638: 744}, // 3075 - {715, 715, 7: 715}, - {722, 722, 7: 722}, - {721, 721, 7: 721}, - {720, 720, 7: 720}, - {2: 739, 739, 739, 739, 739, 8: 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 54: 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 456: 739, 739, 739, 739, 464: 739, 739, 739, 739, 739, 473: 739, 481: 739, 485: 739, 487: 739, 739, 524: 739, 547: 739, 739, 739, 551: 739, 739, 739, 739, 739, 557: 739, 739, 739, 739, 739, 739, 739, 739, 567: 739, 569: 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 631: 739}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 5530}, + {733, 733, 7: 733, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 5533, 3155, 463: 3135, 3153, 2663, 3795, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 5532, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3791, 787: 5534, 829: 5535}, + {747, 747, 2906, 2754, 2790, 2908, 2681, 747, 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3758, 3148, 3231, 3147, 3144}, + {748, 748, 7: 748}, // 3080 - {2: 738, 738, 738, 738, 738, 8: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 54: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 456: 738, 738, 738, 738, 464: 738, 738, 738, 738, 738, 473: 738, 481: 738, 485: 738, 487: 738, 738, 524: 738, 547: 738, 738, 738, 551: 738, 738, 738, 738, 738, 557: 738, 738, 738, 738, 738, 738, 738, 738, 567: 738, 569: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 631: 738}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 5534}, - {727, 727, 7: 727, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 5537, 3146, 456: 3126, 3144, 2661, 3786, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 5536, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3782, 786: 5538, 840: 5539}, - {741, 741, 2900, 2748, 2784, 2902, 2675, 741, 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3749, 3139, 3222, 3138, 3135}, + {746, 746, 7: 746}, + {734, 734, 7: 734}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 5533, 3155, 463: 3135, 3153, 2663, 3795, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 5532, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3791, 787: 5534, 829: 5537}, + {738, 738, 7: 738}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5539, 2670, 2671, 2669}, // 3085 - {742, 742, 7: 742}, - {740, 740, 7: 740}, - {728, 728, 7: 728}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 5537, 3146, 456: 3126, 3144, 2661, 3786, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 5536, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3782, 786: 5538, 840: 5541}, - {732, 732, 7: 732}, + {484: 742, 649: 742}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 5541, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 5542, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 5546, 640: 5544, 652: 3385, 2670, 2671, 2669, 727: 5075, 790: 5548, 809: 5549, 5547, 850: 5545, 1105: 5543}, + {705, 705, 7: 705, 557: 1783, 639: 705, 656: 1783}, + {764, 764, 557: 1617, 639: 764, 656: 1617}, + {639: 5552}, // 3090 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5543, 2668, 2669, 2667}, - {478: 736, 645: 736}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 5545, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 5546, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 5550, 640: 3376, 2668, 2669, 2667, 718: 5548, 720: 5079, 781: 5552, 800: 5553, 5551, 839: 5549, 1102: 5547}, - {699, 699, 7: 699, 548: 1769, 632: 699, 648: 1769}, - {758, 758, 548: 1607, 632: 758, 648: 1607}, + {639: 763}, + {762, 762, 7: 5550, 639: 762}, + {706, 706, 7: 706, 557: 248, 639: 706, 656: 248}, + {700, 700, 7: 700, 639: 700}, + {699, 699, 7: 699, 639: 699}, // 3095 - {632: 5556}, - {632: 757}, - {756, 756, 7: 5554, 632: 756}, - {700, 700, 7: 700, 548: 248, 632: 700, 648: 248}, - {694, 694, 7: 694, 632: 694}, + {698, 698, 7: 698, 639: 698}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 5541, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 5546, 652: 3385, 2670, 2671, 2669, 727: 5075, 790: 5548, 809: 5551, 5547}, + {697, 697, 7: 697, 639: 697}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 558: 5121, 652: 3385, 2670, 2671, 2669, 727: 5120, 762: 5122, 855: 5553}, + {765, 765, 7: 5124}, // 3100 - {693, 693, 7: 693, 632: 693}, - {692, 692, 7: 692, 632: 692}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 5545, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 5550, 640: 3376, 2668, 2669, 2667, 720: 5079, 781: 5552, 800: 5555, 5551}, - {691, 691, 7: 691, 632: 691}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 551: 5125, 640: 3376, 2668, 2669, 2667, 720: 5124, 755: 5126, 843: 5557}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 5507, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 5510, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 5555, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 5556, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 5511, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 488: 3729, 557: 5521, 576: 5520, 636: 3727, 652: 5518, 2670, 2671, 2669, 761: 5522, 819: 5519, 962: 5557}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 484: 1717, 641: 1717, 649: 1717, 652: 5518, 2670, 2671, 2669, 819: 5561}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 484: 1693, 641: 1693, 649: 1693, 652: 5518, 2670, 2671, 2669, 819: 5558}, + {720, 720, 7: 720}, + {484: 5527, 649: 5528, 813: 5559}, // 3105 - {759, 759, 7: 5128}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 5511, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 5514, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 5559, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 5560, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 5515, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 485: 3720, 548: 5525, 569: 5524, 629: 3718, 640: 5522, 2668, 2669, 2667, 754: 5526, 811: 5523, 958: 5561}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 478: 1707, 633: 1707, 640: 5522, 2668, 2669, 2667, 645: 1707, 811: 5565}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 478: 1683, 633: 1683, 640: 5522, 2668, 2669, 2667, 645: 1683, 811: 5562}, - {714, 714, 7: 714}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 5533, 3155, 463: 3135, 3153, 2663, 3795, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 5532, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3791, 787: 5534, 829: 5560}, + {736, 736, 7: 736}, + {484: 5527, 649: 5528, 813: 5562}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 5533, 3155, 463: 3135, 3153, 2663, 3795, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 5532, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3791, 787: 5534, 829: 5563}, + {737, 737, 7: 737}, // 3110 - {478: 5531, 645: 5532, 804: 5563}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 5537, 3146, 456: 3126, 3144, 2661, 3786, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 5536, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3782, 786: 5538, 840: 5564}, - {730, 730, 7: 730}, - {478: 5531, 645: 5532, 804: 5566}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 5537, 3146, 456: 3126, 3144, 2661, 3786, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 5536, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3782, 786: 5538, 840: 5567}, + {769, 769, 7: 5579}, + {758, 758, 7: 758}, + {339: 5571}, + {150: 5569, 676: 5568}, + {755, 755, 7: 755}, // 3115 - {731, 731, 7: 731}, - {763, 763, 7: 5583}, - {752, 752, 7: 752}, - {335: 5575}, - {147: 5573, 669: 5572}, + {754, 754, 7: 754, 662: 5295, 911: 5570}, + {753, 753, 7: 753}, + {208: 5573, 369: 5575, 660: 5574, 1214: 5572}, + {756, 756, 7: 756}, + {660: 5578}, // 3120 + {308: 5576, 390: 5577}, {749, 749, 7: 749}, - {748, 748, 7: 748, 654: 5299, 906: 5574}, - {747, 747, 7: 747}, - {202: 5577, 365: 5579, 652: 5578, 1212: 5576}, + {751, 751, 7: 751}, {750, 750, 7: 750}, + {752, 752, 7: 752}, // 3125 - {652: 5582}, - {302: 5580, 387: 5581}, - {743, 743, 7: 743}, - {745, 745, 7: 745}, - {744, 744, 7: 744}, + {173: 5566, 660: 5567, 908: 5580}, + {757, 757, 7: 757}, + {173: 5566, 484: 1676, 641: 1676, 649: 1676, 660: 5567, 908: 5565, 955: 5582}, + {770, 770, 7: 5579}, + {766, 766}, // 3130 - {746, 746, 7: 746}, - {169: 5570, 652: 5571, 903: 5584}, - {751, 751, 7: 751}, - {169: 5570, 478: 1666, 633: 1666, 645: 1666, 652: 5571, 903: 5569, 951: 5586}, - {764, 764, 7: 5583}, - // 3135 + {763, 763, 478: 5587}, {760, 760}, - {757, 757, 471: 5591}, - {754, 754}, - {753, 753}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 5545, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 5550, 640: 3376, 2668, 2669, 2667, 720: 5079, 781: 5552, 800: 5553, 5551, 839: 5592}, + {759, 759}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 5541, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 5546, 652: 3385, 2670, 2671, 2669, 727: 5075, 790: 5548, 809: 5549, 5547, 850: 5588}, + {761, 761, 7: 5550}, + // 3135 + {14: 5595, 463: 5594, 1081: 5599}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 558: 5121, 652: 3385, 2670, 2671, 2669, 727: 5120, 762: 5591}, + {484: 5592}, + {14: 5595, 463: 5594, 1081: 5593}, + {772, 772}, // 3140 - {755, 755, 7: 5554}, - {15: 5599, 456: 5598, 1077: 5603}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 551: 5125, 640: 3376, 2668, 2669, 2667, 720: 5124, 755: 5595}, - {478: 5596}, - {15: 5599, 456: 5598, 1077: 5597}, + {709, 709}, + {461: 5596}, + {463: 5154, 879: 5597}, + {57: 5598}, + {708, 708}, // 3145 - {766, 766}, - {703, 703}, - {454: 5600}, - {456: 5158, 867: 5601}, - {53: 5602}, + {773, 773}, + {732, 732, 7: 732, 469: 5602}, + {729, 729, 7: 729}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 466: 5603, 652: 3385, 2670, 2671, 2669, 727: 5604}, + {731, 731, 7: 731}, // 3150 - {702, 702}, - {767, 767}, - {726, 726, 7: 726, 462: 5606}, - {723, 723, 7: 723}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 459: 5607, 640: 3376, 2668, 2669, 2667, 720: 5608}, + {730, 730, 7: 730}, + {484: 5527, 649: 5528, 813: 5606}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 5533, 3155, 463: 3135, 3153, 2663, 3795, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 5532, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3791, 787: 5534, 829: 5607}, + {735, 735, 7: 735}, + {173: 5566, 484: 1676, 641: 1676, 649: 1676, 660: 5567, 908: 5565, 955: 5609}, // 3155 - {725, 725, 7: 725}, - {724, 724, 7: 724}, - {478: 5531, 645: 5532, 804: 5610}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 5611}, - {729, 729, 7: 729, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, + {771, 771, 7: 5579}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5613, 2670, 2671, 2669, 889: 5620}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5613, 2670, 2671, 2669, 889: 5612}, + {484: 5527, 649: 5528, 813: 5618}, + {473: 5615, 484: 741, 641: 5614, 649: 741}, // 3160 - {169: 5570, 478: 1666, 633: 1666, 645: 1666, 652: 5571, 903: 5569, 951: 5613}, - {765, 765, 7: 5583}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5617, 2668, 2669, 2667, 879: 5624}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5617, 2668, 2669, 2667, 879: 5616}, - {478: 5531, 645: 5532, 804: 5622}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5613, 2670, 2671, 2669, 889: 5617}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5613, 2670, 2671, 2669, 889: 5616}, + {484: 739, 649: 739}, + {484: 740, 649: 740}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 5533, 3155, 463: 3135, 3153, 2663, 3795, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 5532, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3791, 787: 5534, 829: 5619}, // 3165 - {466: 5619, 478: 735, 633: 5618, 645: 735}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5617, 2668, 2669, 2667, 879: 5621}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5617, 2668, 2669, 2667, 879: 5620}, - {478: 733, 645: 733}, - {478: 734, 645: 734}, + {767, 767}, + {484: 5527, 649: 5528, 813: 5621}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 5533, 3155, 463: 3135, 3153, 2663, 3795, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 5532, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3791, 787: 5534, 829: 5622}, + {768, 768}, + {639: 5632}, // 3170 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 5537, 3146, 456: 3126, 3144, 2661, 3786, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 5536, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3782, 786: 5538, 840: 5623}, - {761, 761}, - {478: 5531, 645: 5532, 804: 5625}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 5537, 3146, 456: 3126, 3144, 2661, 3786, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 5536, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3782, 786: 5538, 840: 5626}, - {762, 762}, + {639: 5625}, + {257: 5626}, + {484: 5627}, + {463: 5628}, + {481: 5629}, // 3175 - {632: 5636}, - {632: 5629}, - {251: 5630}, - {478: 5631}, - {456: 5632}, + {256: 5630}, + {463: 5631}, + {775, 775}, + {257: 5633}, + {484: 5634}, // 3180 - {474: 5633}, - {250: 5634}, - {456: 5635}, - {769, 769}, - {251: 5637}, + {463: 5635}, + {481: 5636}, + {256: 5637}, + {463: 5638}, + {776, 776}, // 3185 - {478: 5638}, - {456: 5639}, - {474: 5640}, - {250: 5641}, - {456: 5642}, + {461: 2503, 486: 2501, 555: 2500, 633: 2496, 698: 5650, 740: 5649, 2497, 2498, 2499, 5651}, + {461: 1203, 486: 1203, 555: 1203, 633: 1203, 640: 3440, 734: 3438, 3439, 773: 5643, 776: 5644, 920: 5646, 950: 5648}, + {461: 1203, 486: 1203, 555: 1203, 633: 1203, 640: 3440, 734: 3438, 3439, 773: 5643, 776: 5644, 920: 5646, 950: 5647}, + {461: 1203, 486: 1203, 555: 1203, 633: 1203, 640: 3440, 734: 3438, 3439, 773: 5643, 776: 5644, 920: 5646, 950: 5645}, + {2: 1206, 1206, 1206, 1206, 1206, 8: 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 58: 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 461: 1206, 463: 1206, 1206, 1206, 1206, 471: 1206, 1206, 1206, 1206, 1206, 480: 1206, 486: 1206, 488: 1206, 493: 1206, 495: 1206, 502: 1206, 511: 1206, 531: 1206, 554: 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 566: 1206, 1206, 1206, 1206, 571: 1206, 1206, 574: 1206, 576: 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 633: 1206, 638: 1206, 640: 1206, 734: 1206, 1206, 737: 1206, 1206, 1206, 748: 1206, 757: 1206, 1206, 1206}, // 3190 - {770, 770}, - {454: 2501, 481: 2499, 550: 2498, 628: 2494, 690: 5654, 733: 5653, 2495, 2496, 2497, 5655}, - {454: 1196, 481: 1196, 550: 1196, 628: 1196, 718: 3431, 727: 3429, 3430, 763: 5647, 767: 5648, 915: 5650, 946: 5652}, - {454: 1196, 481: 1196, 550: 1196, 628: 1196, 718: 3431, 727: 3429, 3430, 763: 5647, 767: 5648, 915: 5650, 946: 5651}, - {454: 1196, 481: 1196, 550: 1196, 628: 1196, 718: 3431, 727: 3429, 3430, 763: 5647, 767: 5648, 915: 5650, 946: 5649}, + {461: 1202, 486: 1202, 555: 1202, 633: 1202}, + {461: 778, 486: 778, 555: 778, 633: 778}, + {461: 777, 486: 777, 555: 777, 633: 777}, + {461: 779, 486: 779, 555: 779, 633: 779}, + {461: 780, 486: 780, 555: 780, 633: 780}, // 3195 - {2: 1199, 1199, 1199, 1199, 1199, 8: 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 54: 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 454: 1199, 456: 1199, 1199, 1199, 1199, 464: 1199, 1199, 1199, 1199, 1199, 473: 1199, 481: 1199, 485: 1199, 487: 1199, 1199, 495: 1199, 504: 1199, 524: 1199, 547: 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 557: 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 567: 1199, 569: 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 628: 1199, 631: 1199, 718: 1199, 727: 1199, 1199, 730: 1199, 1199, 1199, 738: 1199, 750: 1199, 1199, 1199}, - {454: 1195, 481: 1195, 550: 1195, 628: 1195}, - {454: 772, 481: 772, 550: 772, 628: 772}, - {454: 771, 481: 771, 550: 771, 628: 771}, - {454: 773, 481: 773, 550: 773, 628: 773}, + {792, 792, 57: 792, 460: 792, 462: 792, 468: 782, 470: 792, 478: 782, 782}, + {791, 791, 57: 791, 460: 791, 462: 791, 468: 781, 470: 791, 478: 781, 781, 482: 2636, 490: 2637, 492: 2633, 755: 5652, 5653}, + {468: 783, 478: 783, 783}, + {790, 790, 57: 790, 460: 790, 462: 790, 470: 790, 482: 2636, 490: 2637, 756: 5654}, + {789, 789, 57: 789, 460: 789, 462: 789, 470: 789}, // 3200 - {454: 774, 481: 774, 550: 774, 628: 774}, - {786, 786, 53: 786, 453: 786, 455: 786, 461: 776, 463: 786, 471: 776, 776}, - {785, 785, 53: 785, 453: 785, 455: 785, 461: 775, 463: 785, 471: 775, 775, 475: 2634, 480: 2635, 484: 2631, 748: 5656, 5657}, - {461: 777, 471: 777, 777}, - {784, 784, 53: 784, 453: 784, 455: 784, 463: 784, 475: 2634, 480: 2635, 749: 5658}, + {788, 788, 57: 788, 460: 788, 462: 788, 470: 788}, + {57: 3866, 468: 781, 478: 781, 781, 482: 2636, 490: 2637, 492: 2633, 755: 3783, 3784}, + {7: 5670, 461: 964, 486: 964, 555: 964, 633: 964, 643: 964, 731: 964}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5659, 2670, 2671, 2669, 917: 5658, 1143: 5669}, + {7: 961, 461: 961, 486: 961, 555: 961, 633: 961, 643: 961, 731: 961}, // 3205 - {783, 783, 53: 783, 453: 783, 455: 783, 463: 783}, - {782, 782, 53: 782, 453: 782, 455: 782, 463: 782}, - {461: 775, 471: 775, 775, 475: 2634, 480: 2635, 484: 2631, 748: 3774, 3775}, - {7: 5674, 454: 957, 481: 957, 550: 957, 628: 957, 635: 957, 726: 957}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5663, 2668, 2669, 2667, 912: 5662, 1140: 5673}, + {461: 5660, 467: 2254, 1202: 5661}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5665, 2670, 2671, 2669, 863: 5664}, + {467: 5662}, + {461: 2503, 698: 5663}, + {7: 960, 461: 960, 486: 960, 555: 960, 633: 960, 643: 960, 731: 960}, // 3210 - {7: 954, 454: 954, 481: 954, 550: 954, 628: 954, 635: 954, 726: 954}, - {454: 5664, 460: 2238, 1200: 5665}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5669, 2668, 2669, 2667, 1199: 5668}, - {460: 5666}, - {454: 2501, 690: 5667}, + {7: 5667, 57: 5666}, + {2252, 2252, 7: 2252, 57: 2252, 462: 2252}, + {467: 2253}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5668, 2670, 2671, 2669}, + {2251, 2251, 7: 2251, 57: 2251, 462: 2251}, // 3215 - {7: 953, 454: 953, 481: 953, 550: 953, 628: 953, 635: 953, 726: 953}, - {7: 5671, 53: 5670}, - {7: 2236, 53: 2236}, - {460: 2237}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5672, 2668, 2669, 2667}, + {7: 5670, 461: 963, 486: 963, 555: 963, 633: 963, 643: 963, 731: 963}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5659, 2670, 2671, 2669, 917: 5671}, + {7: 962, 461: 962, 486: 962, 555: 962, 633: 962, 643: 962, 731: 962}, + {1260, 1260, 57: 1260, 460: 1260, 462: 1260, 468: 1260, 470: 1260, 478: 1260, 1260, 481: 1260, 1260, 1260, 485: 1260, 490: 1260, 492: 2633, 755: 2634, 800: 5673}, + {836, 836, 57: 836, 460: 836, 462: 836, 468: 836, 470: 836, 478: 836, 836, 481: 836, 2636, 836, 485: 836, 490: 2637, 756: 2638, 817: 5674}, // 3220 - {7: 2235, 53: 2235}, - {7: 5674, 454: 956, 481: 956, 550: 956, 628: 956, 635: 956, 726: 956}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5663, 2668, 2669, 2667, 912: 5675}, - {7: 955, 454: 955, 481: 955, 550: 955, 628: 955, 635: 955, 726: 955}, - {1253, 1253, 53: 1253, 453: 1253, 455: 1253, 461: 1253, 463: 1253, 471: 1253, 1253, 474: 1253, 1253, 1253, 1253, 480: 1253, 484: 2631, 748: 2632, 792: 5677}, + {807, 807, 57: 807, 460: 807, 462: 807, 468: 807, 470: 807, 478: 807, 807, 481: 3804, 483: 807, 485: 3805, 874: 5675}, + {813, 813, 57: 813, 460: 813, 462: 813, 468: 813, 470: 813, 478: 813, 813, 483: 3830, 875: 5676}, + {968, 968, 57: 968, 460: 968, 462: 968, 468: 968, 470: 968, 478: 968, 968}, + {836, 836, 57: 836, 460: 836, 462: 836, 468: 836, 470: 836, 478: 836, 836, 481: 836, 2636, 836, 485: 836, 490: 2637, 756: 2638, 817: 5678}, + {807, 807, 57: 807, 460: 807, 462: 807, 468: 807, 470: 807, 478: 807, 807, 481: 3804, 483: 807, 485: 3805, 874: 5679}, // 3225 - {829, 829, 53: 829, 453: 829, 455: 829, 461: 829, 463: 829, 471: 829, 829, 474: 829, 2634, 829, 829, 480: 2635, 749: 2636, 809: 5678}, - {801, 801, 53: 801, 453: 801, 455: 801, 461: 801, 463: 801, 471: 801, 801, 474: 3795, 476: 801, 3796, 862: 5679}, - {806, 806, 53: 806, 453: 806, 455: 806, 461: 806, 463: 806, 471: 806, 806, 476: 3821, 863: 5680}, - {961, 961, 53: 961, 453: 961, 455: 961, 461: 961, 463: 961, 471: 961, 961}, - {829, 829, 53: 829, 453: 829, 455: 829, 461: 829, 463: 829, 471: 829, 829, 474: 829, 2634, 829, 829, 480: 2635, 749: 2636, 809: 5682}, + {813, 813, 57: 813, 460: 813, 462: 813, 468: 813, 470: 813, 478: 813, 813, 483: 3830, 875: 5680}, + {969, 969, 57: 969, 460: 969, 462: 969, 468: 969, 470: 969, 478: 969, 969}, + {648: 5688}, + {1260, 1260, 57: 1260, 460: 1260, 462: 1260, 468: 1260, 470: 1260, 478: 1260, 1260, 481: 1260, 1260, 1260, 485: 1260, 490: 1260, 492: 2633, 755: 2634, 800: 5684}, + {814, 814, 57: 814, 460: 814, 462: 814, 468: 814, 470: 814, 478: 814, 814, 481: 814, 814, 814, 485: 814, 490: 814, 492: 814, 503: 814, 814}, // 3230 - {801, 801, 53: 801, 453: 801, 455: 801, 461: 801, 463: 801, 471: 801, 801, 474: 3795, 476: 801, 3796, 862: 5683}, - {806, 806, 53: 806, 453: 806, 455: 806, 461: 806, 463: 806, 471: 806, 806, 476: 3821, 863: 5684}, - {962, 962, 53: 962, 453: 962, 455: 962, 461: 962, 463: 962, 471: 962, 962}, - {644: 5692}, - {1253, 1253, 53: 1253, 453: 1253, 455: 1253, 461: 1253, 463: 1253, 471: 1253, 1253, 474: 1253, 1253, 1253, 1253, 480: 1253, 484: 2631, 748: 2632, 792: 5688}, + {836, 836, 57: 836, 460: 836, 462: 836, 468: 836, 470: 836, 478: 836, 836, 481: 836, 2636, 836, 485: 836, 490: 2637, 756: 2638, 817: 5685}, + {807, 807, 57: 807, 460: 807, 462: 807, 468: 807, 470: 807, 478: 807, 807, 481: 3804, 483: 807, 485: 3805, 874: 5686}, + {813, 813, 57: 813, 460: 813, 462: 813, 468: 813, 470: 813, 478: 813, 813, 483: 3830, 875: 5687}, + {970, 970, 57: 970, 460: 970, 462: 970, 468: 970, 470: 970, 478: 970, 970}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 2662, 858: 3137, 887: 5689}, // 3235 - {807, 807, 53: 807, 453: 807, 455: 807, 461: 807, 463: 807, 471: 807, 807, 474: 807, 807, 807, 807, 480: 807, 484: 807, 496: 807, 807}, - {829, 829, 53: 829, 453: 829, 455: 829, 461: 829, 463: 829, 471: 829, 829, 474: 829, 2634, 829, 829, 480: 2635, 749: 2636, 809: 5689}, - {801, 801, 53: 801, 453: 801, 455: 801, 461: 801, 463: 801, 471: 801, 801, 474: 3795, 476: 801, 3796, 862: 5690}, - {806, 806, 53: 806, 453: 806, 455: 806, 461: 806, 463: 806, 471: 806, 806, 476: 3821, 863: 5691}, - {963, 963, 53: 963, 453: 963, 455: 963, 461: 963, 463: 963, 471: 963, 963}, + {1817, 1817, 7: 3306, 57: 1817, 460: 1817, 462: 1817, 468: 1817, 470: 1817, 478: 1817, 1817, 481: 1817, 1817, 1817, 485: 1817, 490: 1817, 492: 1817, 503: 1817, 1817}, + {237, 237, 57: 237, 460: 237, 462: 237, 468: 237, 470: 237, 478: 237, 237, 481: 237, 237, 237, 485: 237, 490: 237, 2630, 237, 501: 237, 779: 2631, 5715}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 461: 5239, 567: 5234, 652: 3813, 2670, 2671, 2669, 698: 5238, 726: 5237, 788: 5236, 791: 5235, 5241, 839: 5231, 876: 5700, 1181: 5699, 1294: 5698}, + {815, 815, 57: 815, 460: 815, 462: 815, 468: 815, 470: 815, 478: 815, 815, 481: 815, 815, 815, 485: 815, 490: 815, 492: 815, 501: 5681, 926: 5683, 949: 5693}, + {1260, 1260, 57: 1260, 460: 1260, 462: 1260, 468: 1260, 470: 1260, 478: 1260, 1260, 481: 1260, 1260, 1260, 485: 1260, 490: 1260, 492: 2633, 755: 2634, 800: 5694}, // 3240 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 2660, 846: 3128, 876: 5693}, - {1803, 1803, 7: 3297, 53: 1803, 453: 1803, 455: 1803, 461: 1803, 463: 1803, 471: 1803, 1803, 474: 1803, 1803, 1803, 1803, 480: 1803, 484: 1803, 496: 1803, 1803}, - {237, 237, 53: 237, 453: 237, 455: 237, 461: 237, 463: 237, 471: 237, 237, 474: 237, 237, 237, 237, 480: 237, 482: 2628, 484: 237, 494: 237, 773: 2629, 5719}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 454: 5243, 558: 5238, 640: 3804, 2668, 2669, 2667, 690: 5242, 719: 5241, 779: 5240, 782: 5239, 5245, 828: 5235, 864: 5704, 1178: 5703, 1292: 5702}, - {808, 808, 53: 808, 453: 808, 455: 808, 461: 808, 463: 808, 471: 808, 808, 474: 808, 808, 808, 808, 480: 808, 484: 808, 494: 5685, 921: 5687, 945: 5697}, + {836, 836, 57: 836, 460: 836, 462: 836, 468: 836, 470: 836, 478: 836, 836, 481: 836, 2636, 836, 485: 836, 490: 2637, 756: 2638, 817: 5695}, + {807, 807, 57: 807, 460: 807, 462: 807, 468: 807, 470: 807, 478: 807, 807, 481: 3804, 483: 807, 485: 3805, 874: 5696}, + {813, 813, 57: 813, 460: 813, 462: 813, 468: 813, 470: 813, 478: 813, 813, 483: 3830, 875: 5697}, + {971, 971, 57: 971, 460: 971, 462: 971, 468: 971, 470: 971, 478: 971, 971}, + {237, 237, 57: 237, 460: 237, 462: 237, 468: 237, 470: 237, 478: 237, 237, 481: 237, 237, 237, 485: 237, 490: 237, 2630, 237, 501: 237, 503: 237, 237, 779: 2631, 5701}, // 3245 - {1253, 1253, 53: 1253, 453: 1253, 455: 1253, 461: 1253, 463: 1253, 471: 1253, 1253, 474: 1253, 1253, 1253, 1253, 480: 1253, 484: 2631, 748: 2632, 792: 5698}, - {829, 829, 53: 829, 453: 829, 455: 829, 461: 829, 463: 829, 471: 829, 829, 474: 829, 2634, 829, 829, 480: 2635, 749: 2636, 809: 5699}, - {801, 801, 53: 801, 453: 801, 455: 801, 461: 801, 463: 801, 471: 801, 801, 474: 3795, 476: 801, 3796, 862: 5700}, - {806, 806, 53: 806, 453: 806, 455: 806, 461: 806, 463: 806, 471: 806, 806, 476: 3821, 863: 5701}, - {964, 964, 53: 964, 453: 964, 455: 964, 461: 964, 463: 964, 471: 964, 964}, + {959, 959, 57: 959, 460: 959, 462: 959, 468: 959, 470: 959, 478: 959, 959, 481: 959, 959, 959, 485: 959, 490: 959, 959, 959, 501: 959}, + {899, 899, 7: 5285, 57: 899, 460: 899, 462: 899, 468: 899, 470: 899, 478: 899, 899, 481: 899, 899, 899, 485: 899, 490: 899, 899, 899, 501: 899, 503: 899, 899}, + {815, 815, 57: 815, 460: 815, 462: 815, 468: 815, 470: 815, 478: 815, 815, 481: 815, 815, 815, 485: 815, 490: 815, 492: 815, 501: 5681, 503: 815, 815, 926: 5683, 949: 5702}, + {1816, 1816, 57: 1816, 460: 1816, 462: 1816, 468: 1816, 470: 1816, 478: 1816, 1816, 481: 1816, 1816, 1816, 485: 1816, 490: 1816, 492: 1816, 503: 1816, 5703, 1201: 5704}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 5714}, // 3250 - {237, 237, 53: 237, 453: 237, 455: 237, 461: 237, 463: 237, 471: 237, 237, 474: 237, 237, 237, 237, 480: 237, 482: 2628, 484: 237, 494: 237, 496: 237, 237, 773: 2629, 5705}, - {952, 952, 53: 952, 453: 952, 455: 952, 461: 952, 463: 952, 471: 952, 952, 474: 952, 952, 952, 952, 480: 952, 482: 952, 484: 952, 494: 952}, - {892, 892, 7: 5289, 53: 892, 453: 892, 455: 892, 461: 892, 463: 892, 471: 892, 892, 474: 892, 892, 892, 892, 480: 892, 482: 892, 484: 892, 494: 892, 496: 892, 892}, - {808, 808, 53: 808, 453: 808, 455: 808, 461: 808, 463: 808, 471: 808, 808, 474: 808, 808, 808, 808, 480: 808, 484: 808, 494: 5685, 496: 808, 808, 921: 5687, 945: 5706}, - {1802, 1802, 53: 1802, 453: 1802, 455: 1802, 461: 1802, 463: 1802, 471: 1802, 1802, 474: 1802, 1802, 1802, 1802, 480: 1802, 484: 1802, 496: 1802, 5707, 1198: 5708}, + {958, 958, 57: 958, 460: 958, 462: 958, 468: 958, 470: 958, 478: 958, 958, 481: 958, 958, 958, 485: 958, 490: 958, 492: 958, 503: 5706, 1317: 5705}, + {984, 984, 57: 984, 460: 984, 462: 984, 468: 984, 470: 984, 478: 984, 984, 481: 984, 984, 984, 485: 984, 490: 984, 492: 984}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3294, 2670, 2671, 2669, 910: 5709, 1139: 5708, 1318: 5707}, + {957, 957, 7: 5712, 57: 957, 460: 957, 462: 957, 468: 957, 470: 957, 478: 957, 957, 481: 957, 957, 957, 485: 957, 490: 957, 492: 957}, + {956, 956, 7: 956, 57: 956, 460: 956, 462: 956, 468: 956, 470: 956, 478: 956, 956, 481: 956, 956, 956, 485: 956, 490: 956, 492: 956}, // 3255 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 5718}, - {951, 951, 53: 951, 453: 951, 455: 951, 461: 951, 463: 951, 471: 951, 951, 474: 951, 951, 951, 951, 480: 951, 484: 951, 496: 5710, 1315: 5709}, - {977, 977, 53: 977, 453: 977, 455: 977, 461: 977, 463: 977, 471: 977, 977, 474: 977, 977, 977, 977, 480: 977, 484: 977}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3285, 2668, 2669, 2667, 905: 5713, 1136: 5712, 1316: 5711}, - {950, 950, 7: 5716, 53: 950, 453: 950, 455: 950, 461: 950, 463: 950, 471: 950, 950, 474: 950, 950, 950, 950, 480: 950, 484: 950}, + {467: 5710}, + {461: 3295, 1141: 5711}, + {954, 954, 7: 954, 57: 954, 460: 954, 462: 954, 468: 954, 470: 954, 478: 954, 954, 481: 954, 954, 954, 485: 954, 490: 954, 492: 954}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3294, 2670, 2671, 2669, 910: 5709, 1139: 5713}, + {955, 955, 7: 955, 57: 955, 460: 955, 462: 955, 468: 955, 470: 955, 478: 955, 955, 481: 955, 955, 955, 485: 955, 490: 955, 492: 955}, // 3260 - {949, 949, 7: 949, 53: 949, 453: 949, 455: 949, 461: 949, 463: 949, 471: 949, 949, 474: 949, 949, 949, 949, 480: 949, 484: 949}, - {460: 5714}, - {454: 3286, 1138: 5715}, - {947, 947, 7: 947, 53: 947, 453: 947, 455: 947, 461: 947, 463: 947, 471: 947, 947, 474: 947, 947, 947, 947, 480: 947, 484: 947}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3285, 2668, 2669, 2667, 905: 5713, 1136: 5717}, + {1815, 1815, 57: 1815, 460: 1815, 462: 1815, 468: 1815, 470: 1815, 478: 1815, 1815, 481: 1815, 1815, 1815, 485: 1815, 490: 1815, 492: 1815, 494: 3242, 496: 3240, 3241, 3239, 3237, 503: 1815, 722: 3238, 3236}, + {985, 985, 57: 985, 460: 985, 462: 985, 468: 985, 470: 985, 478: 985, 985, 481: 985, 985, 985, 485: 985, 490: 985, 492: 985, 501: 985}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 511: 5732, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 5733, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 5731, 1029: 5734, 1190: 5735, 1263: 5736}, + {2: 834, 834, 834, 834, 834, 8: 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 58: 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 461: 834, 463: 834, 834, 834, 834, 471: 834, 834, 834, 834, 834, 480: 834, 486: 834, 488: 834, 493: 834, 495: 834, 502: 834, 511: 834, 531: 834, 554: 834, 556: 834, 834, 834, 834, 834, 834, 834, 834, 834, 566: 834, 834, 834, 834, 571: 834, 834, 574: 834, 576: 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 834, 638: 834, 640: 834, 734: 834, 834, 737: 834, 834, 834, 748: 834, 757: 834, 834, 834}, + {2: 833, 833, 833, 833, 833, 8: 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 58: 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 461: 833, 463: 833, 833, 833, 833, 471: 833, 833, 833, 833, 833, 480: 833, 486: 833, 488: 833, 493: 833, 495: 833, 502: 833, 511: 833, 531: 833, 554: 833, 556: 833, 833, 833, 833, 833, 833, 833, 833, 833, 566: 833, 833, 833, 833, 571: 833, 833, 574: 833, 576: 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, 638: 833, 640: 833, 734: 833, 833, 737: 833, 833, 833, 748: 833, 757: 833, 833, 833}, // 3265 - {948, 948, 7: 948, 53: 948, 453: 948, 455: 948, 461: 948, 463: 948, 471: 948, 948, 474: 948, 948, 948, 948, 480: 948, 484: 948}, - {1801, 1801, 53: 1801, 453: 1801, 455: 1801, 461: 1801, 463: 1801, 471: 1801, 1801, 474: 1801, 1801, 1801, 1801, 480: 1801, 484: 1801, 486: 3233, 489: 3231, 3232, 3230, 3228, 496: 1801, 714: 3229, 3227}, - {978, 978, 53: 978, 453: 978, 455: 978, 461: 978, 463: 978, 471: 978, 978, 474: 978, 978, 978, 978, 480: 978, 484: 978, 494: 978}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 504: 5736, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 5737, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 5735, 1024: 5738, 1187: 5739, 1261: 5740}, - {2: 827, 827, 827, 827, 827, 8: 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 54: 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 454: 827, 456: 827, 827, 827, 827, 464: 827, 827, 827, 827, 827, 473: 827, 481: 827, 485: 827, 487: 827, 827, 495: 827, 504: 827, 524: 827, 547: 827, 827, 827, 551: 827, 827, 827, 827, 827, 557: 827, 827, 827, 827, 827, 827, 827, 827, 567: 827, 569: 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 631: 827, 718: 827, 727: 827, 827, 730: 827, 827, 827, 738: 827, 750: 827, 827, 827}, + {2: 832, 832, 832, 832, 832, 8: 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 58: 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 461: 832, 463: 832, 832, 832, 832, 471: 832, 832, 832, 832, 832, 480: 832, 486: 832, 488: 832, 493: 832, 495: 832, 502: 832, 511: 832, 531: 832, 554: 832, 556: 832, 832, 832, 832, 832, 832, 832, 832, 832, 566: 832, 832, 832, 832, 571: 832, 832, 574: 832, 576: 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 832, 638: 832, 640: 832, 734: 832, 832, 737: 832, 832, 832, 748: 832, 757: 832, 832, 832}, + {2: 831, 831, 831, 831, 831, 8: 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 58: 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 461: 831, 463: 831, 831, 831, 831, 471: 831, 831, 831, 831, 831, 480: 831, 486: 831, 488: 831, 493: 831, 495: 831, 502: 831, 511: 831, 531: 831, 554: 831, 556: 831, 831, 831, 831, 831, 831, 831, 831, 831, 566: 831, 831, 831, 831, 571: 831, 831, 574: 831, 576: 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 638: 831, 640: 831, 734: 831, 831, 737: 831, 831, 831, 748: 831, 757: 831, 831, 831}, + {2: 830, 830, 830, 830, 830, 8: 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 58: 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 461: 830, 463: 830, 830, 830, 830, 471: 830, 830, 830, 830, 830, 480: 830, 486: 830, 488: 830, 493: 830, 495: 830, 502: 830, 511: 830, 531: 830, 554: 830, 556: 830, 830, 830, 830, 830, 830, 830, 830, 830, 566: 830, 830, 830, 830, 571: 830, 830, 574: 830, 576: 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 830, 638: 830, 640: 830, 734: 830, 830, 737: 830, 830, 830, 748: 830, 757: 830, 830, 830}, + {2: 829, 829, 829, 829, 829, 8: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 58: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 461: 829, 463: 829, 829, 829, 829, 471: 829, 829, 829, 829, 829, 480: 829, 486: 829, 488: 829, 493: 829, 495: 829, 502: 829, 511: 829, 531: 829, 554: 829, 556: 829, 829, 829, 829, 829, 829, 829, 829, 829, 566: 829, 829, 829, 829, 571: 829, 829, 574: 829, 576: 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 829, 638: 829, 640: 829, 734: 829, 829, 737: 829, 829, 829, 748: 829, 757: 829, 829, 829}, + {2: 828, 828, 828, 828, 828, 8: 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 58: 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 461: 828, 463: 828, 828, 828, 828, 471: 828, 828, 828, 828, 828, 480: 828, 486: 828, 488: 828, 493: 828, 495: 828, 502: 828, 511: 828, 531: 828, 554: 828, 556: 828, 828, 828, 828, 828, 828, 828, 828, 828, 566: 828, 828, 828, 828, 571: 828, 828, 574: 828, 576: 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 638: 828, 640: 828, 734: 828, 828, 737: 828, 828, 828, 748: 828, 757: 828, 828, 828}, // 3270 - {2: 826, 826, 826, 826, 826, 8: 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 54: 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 454: 826, 456: 826, 826, 826, 826, 464: 826, 826, 826, 826, 826, 473: 826, 481: 826, 485: 826, 487: 826, 826, 495: 826, 504: 826, 524: 826, 547: 826, 826, 826, 551: 826, 826, 826, 826, 826, 557: 826, 826, 826, 826, 826, 826, 826, 826, 567: 826, 569: 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 631: 826, 718: 826, 727: 826, 826, 730: 826, 826, 826, 738: 826, 750: 826, 826, 826}, - {2: 825, 825, 825, 825, 825, 8: 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 54: 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 454: 825, 456: 825, 825, 825, 825, 464: 825, 825, 825, 825, 825, 473: 825, 481: 825, 485: 825, 487: 825, 825, 495: 825, 504: 825, 524: 825, 547: 825, 825, 825, 551: 825, 825, 825, 825, 825, 557: 825, 825, 825, 825, 825, 825, 825, 825, 567: 825, 569: 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 825, 631: 825, 718: 825, 727: 825, 825, 730: 825, 825, 825, 738: 825, 750: 825, 825, 825}, - {2: 824, 824, 824, 824, 824, 8: 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 54: 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 454: 824, 456: 824, 824, 824, 824, 464: 824, 824, 824, 824, 824, 473: 824, 481: 824, 485: 824, 487: 824, 824, 495: 824, 504: 824, 524: 824, 547: 824, 824, 824, 551: 824, 824, 824, 824, 824, 557: 824, 824, 824, 824, 824, 824, 824, 824, 567: 824, 569: 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 631: 824, 718: 824, 727: 824, 824, 730: 824, 824, 824, 738: 824, 750: 824, 824, 824}, - {2: 823, 823, 823, 823, 823, 8: 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 54: 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 454: 823, 456: 823, 823, 823, 823, 464: 823, 823, 823, 823, 823, 473: 823, 481: 823, 485: 823, 487: 823, 823, 495: 823, 504: 823, 524: 823, 547: 823, 823, 823, 551: 823, 823, 823, 823, 823, 557: 823, 823, 823, 823, 823, 823, 823, 823, 567: 823, 569: 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 631: 823, 718: 823, 727: 823, 823, 730: 823, 823, 823, 738: 823, 750: 823, 823, 823}, - {2: 822, 822, 822, 822, 822, 8: 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 54: 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 454: 822, 456: 822, 822, 822, 822, 464: 822, 822, 822, 822, 822, 473: 822, 481: 822, 485: 822, 487: 822, 822, 495: 822, 504: 822, 524: 822, 547: 822, 822, 822, 551: 822, 822, 822, 822, 822, 557: 822, 822, 822, 822, 822, 822, 822, 822, 567: 822, 569: 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 631: 822, 718: 822, 727: 822, 822, 730: 822, 822, 822, 738: 822, 750: 822, 822, 822}, + {2: 827, 827, 827, 827, 827, 8: 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 58: 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 461: 827, 463: 827, 827, 827, 827, 471: 827, 827, 827, 827, 827, 480: 827, 486: 827, 488: 827, 493: 827, 495: 827, 502: 827, 511: 827, 531: 827, 554: 827, 556: 827, 827, 827, 827, 827, 827, 827, 827, 827, 566: 827, 827, 827, 827, 571: 827, 827, 574: 827, 576: 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 638: 827, 640: 827, 734: 827, 827, 737: 827, 827, 827, 748: 827, 757: 827, 827, 827}, + {2: 826, 826, 826, 826, 826, 8: 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 58: 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 461: 826, 463: 826, 826, 826, 826, 471: 826, 826, 826, 826, 826, 480: 826, 486: 826, 488: 826, 493: 826, 495: 826, 502: 826, 511: 826, 531: 826, 554: 826, 556: 826, 826, 826, 826, 826, 826, 826, 826, 826, 566: 826, 826, 826, 826, 571: 826, 826, 574: 826, 576: 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 638: 826, 640: 826, 734: 826, 826, 737: 826, 826, 826, 748: 826, 757: 826, 826, 826}, + {2: 824, 824, 824, 824, 824, 8: 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 58: 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 5722, 5728, 5729, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 461: 824, 463: 824, 824, 824, 824, 471: 824, 824, 824, 824, 824, 480: 824, 486: 824, 488: 824, 493: 824, 495: 824, 502: 5725, 511: 824, 531: 824, 554: 824, 556: 824, 824, 824, 824, 824, 824, 824, 824, 824, 566: 824, 824, 824, 824, 571: 824, 824, 574: 824, 576: 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, 638: 824, 640: 3440, 734: 3438, 3439, 737: 5227, 5226, 5225, 748: 5222, 757: 5721, 5724, 5720, 773: 5643, 776: 5718, 826: 5719, 854: 5717, 1103: 5730, 5723}, + {2: 822, 822, 822, 822, 822, 8: 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 58: 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 461: 822, 463: 822, 822, 822, 822, 471: 822, 822, 822, 822, 822, 480: 822, 486: 822, 488: 822, 493: 822, 495: 822, 502: 822, 511: 822, 531: 822, 554: 822, 556: 822, 822, 822, 822, 822, 822, 822, 822, 822, 566: 822, 822, 822, 822, 571: 822, 822, 574: 822, 576: 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 822, 638: 822, 640: 822, 734: 822, 822, 737: 822, 822, 822, 748: 822, 757: 822, 822, 822}, + {2: 818, 818, 818, 818, 818, 8: 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 58: 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 461: 818, 463: 818, 818, 818, 818, 471: 818, 818, 818, 818, 818, 480: 818, 486: 818, 488: 818, 493: 818, 495: 818, 502: 818, 511: 818, 531: 818, 554: 818, 556: 818, 818, 818, 818, 818, 818, 818, 818, 818, 566: 818, 818, 818, 818, 571: 818, 818, 574: 818, 576: 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 638: 818, 640: 818, 734: 818, 818, 737: 818, 818, 818, 748: 818, 757: 818, 818, 818}, // 3275 - {2: 821, 821, 821, 821, 821, 8: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 54: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 454: 821, 456: 821, 821, 821, 821, 464: 821, 821, 821, 821, 821, 473: 821, 481: 821, 485: 821, 487: 821, 821, 495: 821, 504: 821, 524: 821, 547: 821, 821, 821, 551: 821, 821, 821, 821, 821, 557: 821, 821, 821, 821, 821, 821, 821, 821, 567: 821, 569: 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, 631: 821, 718: 821, 727: 821, 821, 730: 821, 821, 821, 738: 821, 750: 821, 821, 821}, - {2: 820, 820, 820, 820, 820, 8: 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 54: 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 454: 820, 456: 820, 820, 820, 820, 464: 820, 820, 820, 820, 820, 473: 820, 481: 820, 485: 820, 487: 820, 820, 495: 820, 504: 820, 524: 820, 547: 820, 820, 820, 551: 820, 820, 820, 820, 820, 557: 820, 820, 820, 820, 820, 820, 820, 820, 567: 820, 569: 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 631: 820, 718: 820, 727: 820, 820, 730: 820, 820, 820, 738: 820, 750: 820, 820, 820}, - {2: 819, 819, 819, 819, 819, 8: 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 54: 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 454: 819, 456: 819, 819, 819, 819, 464: 819, 819, 819, 819, 819, 473: 819, 481: 819, 485: 819, 487: 819, 819, 495: 819, 504: 819, 524: 819, 547: 819, 819, 819, 551: 819, 819, 819, 819, 819, 557: 819, 819, 819, 819, 819, 819, 819, 819, 567: 819, 569: 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 819, 631: 819, 718: 819, 727: 819, 819, 730: 819, 819, 819, 738: 819, 750: 819, 819, 819}, - {2: 817, 817, 817, 817, 817, 8: 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 54: 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 5726, 5732, 5733, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 454: 817, 456: 817, 817, 817, 817, 464: 817, 817, 817, 817, 817, 473: 817, 481: 817, 485: 817, 487: 817, 817, 495: 5729, 504: 817, 524: 817, 547: 817, 817, 817, 551: 817, 817, 817, 817, 817, 557: 817, 817, 817, 817, 817, 817, 817, 817, 567: 817, 569: 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 631: 817, 718: 3431, 727: 3429, 3430, 730: 5231, 5230, 5229, 738: 5226, 750: 5725, 5728, 5724, 763: 5647, 767: 5722, 818: 5723, 842: 5721, 1100: 5734, 5727}, - {2: 815, 815, 815, 815, 815, 8: 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 54: 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 454: 815, 456: 815, 815, 815, 815, 464: 815, 815, 815, 815, 815, 473: 815, 481: 815, 485: 815, 487: 815, 815, 495: 815, 504: 815, 524: 815, 547: 815, 815, 815, 551: 815, 815, 815, 815, 815, 557: 815, 815, 815, 815, 815, 815, 815, 815, 567: 815, 569: 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 631: 815, 718: 815, 727: 815, 815, 730: 815, 815, 815, 738: 815, 750: 815, 815, 815}, + {2: 817, 817, 817, 817, 817, 8: 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 58: 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 461: 817, 463: 817, 817, 817, 817, 471: 817, 817, 817, 817, 817, 480: 817, 486: 817, 488: 817, 493: 817, 495: 817, 502: 817, 511: 817, 531: 817, 554: 817, 556: 817, 817, 817, 817, 817, 817, 817, 817, 817, 566: 817, 817, 817, 817, 571: 817, 817, 574: 817, 576: 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 817, 638: 817, 640: 817, 734: 817, 817, 737: 817, 817, 817, 748: 817, 757: 817, 817, 817}, + {2: 823, 823, 823, 823, 823, 8: 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 58: 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 461: 823, 463: 823, 823, 823, 823, 471: 823, 823, 823, 823, 823, 480: 823, 486: 823, 488: 823, 493: 823, 495: 823, 502: 823, 511: 823, 531: 823, 554: 823, 556: 823, 823, 823, 823, 823, 823, 823, 823, 823, 566: 823, 823, 823, 823, 571: 823, 823, 574: 823, 576: 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 823, 638: 823, 640: 823, 734: 823, 823, 737: 823, 823, 823, 748: 823, 757: 823, 823, 823}, + {1825, 1825, 2906, 2754, 2790, 2908, 2681, 1825, 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 1825, 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 1825, 462: 1825, 5748, 467: 5747, 1825, 470: 1825, 478: 1825, 1825, 481: 1825, 1825, 1825, 485: 1825, 489: 1825, 1825, 1825, 1825, 494: 3242, 496: 3240, 3241, 3239, 3237, 501: 1825, 652: 5746, 2670, 2671, 2669, 722: 3238, 3236, 1187: 5745, 5744}, + {1829, 1829, 7: 1829, 57: 1829, 460: 1829, 462: 1829, 468: 1829, 470: 1829, 478: 1829, 1829, 481: 1829, 1829, 1829, 485: 1829, 489: 1829, 1829, 1829, 1829, 501: 1829}, + {1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 462: 1243, 1243, 1243, 1243, 467: 1243, 1243, 1243, 1243, 473: 1243, 1243, 1243, 478: 1243, 1243, 481: 1243, 1243, 1243, 1243, 1243, 489: 1243, 1243, 1243, 1243, 494: 1243, 496: 1243, 1243, 1243, 1243, 501: 1243, 509: 1243, 511: 1243, 532: 1243, 535: 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 1243, 570: 1243, 641: 5739, 644: 1243, 1243}, // 3280 - {2: 811, 811, 811, 811, 811, 8: 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 54: 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 454: 811, 456: 811, 811, 811, 811, 464: 811, 811, 811, 811, 811, 473: 811, 481: 811, 485: 811, 487: 811, 811, 495: 811, 504: 811, 524: 811, 547: 811, 811, 811, 551: 811, 811, 811, 811, 811, 557: 811, 811, 811, 811, 811, 811, 811, 811, 567: 811, 569: 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 631: 811, 718: 811, 727: 811, 811, 730: 811, 811, 811, 738: 811, 750: 811, 811, 811}, - {2: 810, 810, 810, 810, 810, 8: 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 54: 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 454: 810, 456: 810, 810, 810, 810, 464: 810, 810, 810, 810, 810, 473: 810, 481: 810, 485: 810, 487: 810, 810, 495: 810, 504: 810, 524: 810, 547: 810, 810, 810, 551: 810, 810, 810, 810, 810, 557: 810, 810, 810, 810, 810, 810, 810, 810, 567: 810, 569: 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 631: 810, 718: 810, 727: 810, 810, 730: 810, 810, 810, 738: 810, 750: 810, 810, 810}, - {2: 816, 816, 816, 816, 816, 8: 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 54: 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 454: 816, 456: 816, 816, 816, 816, 464: 816, 816, 816, 816, 816, 473: 816, 481: 816, 485: 816, 487: 816, 816, 495: 816, 504: 816, 524: 816, 547: 816, 816, 816, 551: 816, 816, 816, 816, 816, 557: 816, 816, 816, 816, 816, 816, 816, 816, 567: 816, 569: 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 816, 631: 816, 718: 816, 727: 816, 816, 730: 816, 816, 816, 738: 816, 750: 816, 816, 816}, - {1811, 1811, 2900, 2748, 2784, 2902, 2675, 1811, 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 1811, 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 1811, 455: 1811, 5752, 460: 5751, 1811, 463: 1811, 471: 1811, 1811, 474: 1811, 1811, 1811, 1811, 479: 1811, 1811, 482: 1811, 484: 1811, 486: 3233, 489: 3231, 3232, 3230, 3228, 494: 1811, 640: 5750, 2668, 2669, 2667, 714: 3229, 3227, 1184: 5749, 5748}, - {1815, 1815, 7: 1815, 53: 1815, 453: 1815, 455: 1815, 461: 1815, 463: 1815, 471: 1815, 1815, 474: 1815, 1815, 1815, 1815, 479: 1815, 1815, 482: 1815, 484: 1815, 494: 1815}, + {1819, 1819, 7: 1819, 57: 1819, 460: 1819, 462: 1819, 468: 1819, 470: 1819, 478: 1819, 1819, 481: 1819, 1819, 1819, 485: 1819, 489: 1819, 1819, 1819, 1819, 501: 1819}, + {816, 816, 7: 5737, 57: 816, 460: 816, 462: 816, 468: 816, 470: 816, 478: 816, 816, 481: 816, 816, 816, 485: 816, 489: 816, 816, 816, 816, 501: 816}, + {986, 986, 57: 986, 460: 986, 462: 986, 468: 986, 470: 986, 478: 986, 986, 481: 986, 986, 986, 485: 986, 489: 986, 986, 986, 986, 501: 986}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 511: 5732, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 5733, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 5731, 1029: 5738}, + {1818, 1818, 7: 1818, 57: 1818, 460: 1818, 462: 1818, 468: 1818, 470: 1818, 478: 1818, 1818, 481: 1818, 1818, 1818, 485: 1818, 489: 1818, 1818, 1818, 1818, 501: 1818}, // 3285 - {1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 455: 1236, 1236, 1236, 1236, 460: 1236, 1236, 1236, 1236, 466: 1236, 1236, 1236, 471: 1236, 1236, 474: 1236, 1236, 1236, 1236, 1236, 1236, 1236, 482: 1236, 484: 1236, 486: 1236, 489: 1236, 1236, 1236, 1236, 494: 1236, 502: 1236, 504: 1236, 525: 1236, 528: 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 565: 1236, 633: 5743, 636: 1236, 1236}, - {1805, 1805, 7: 1805, 53: 1805, 453: 1805, 455: 1805, 461: 1805, 463: 1805, 471: 1805, 1805, 474: 1805, 1805, 1805, 1805, 479: 1805, 1805, 482: 1805, 484: 1805, 494: 1805}, - {809, 809, 7: 5741, 53: 809, 453: 809, 455: 809, 461: 809, 463: 809, 471: 809, 809, 474: 809, 809, 809, 809, 479: 809, 809, 482: 809, 484: 809, 494: 809}, - {979, 979, 53: 979, 453: 979, 455: 979, 461: 979, 463: 979, 471: 979, 979, 474: 979, 979, 979, 979, 479: 979, 979, 482: 979, 484: 979, 494: 979}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 504: 5736, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 5737, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 5735, 1024: 5742}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 511: 5740, 652: 5741, 2670, 2671, 2669}, + {1828, 1828, 7: 1828, 57: 1828, 460: 1828, 462: 1828, 468: 1828, 470: 1828, 478: 1828, 1828, 481: 1828, 1828, 1828, 485: 1828, 489: 1828, 1828, 1828, 1828, 501: 1828}, + {1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 3882, 1242, 1242, 1242, 1242, 467: 1242, 1242, 1242, 1242, 473: 1242, 1242, 1242, 478: 1242, 1242, 481: 1242, 1242, 1242, 1242, 1242, 489: 1242, 1242, 1242, 1242, 494: 1242, 496: 1242, 1242, 1242, 1242, 501: 1242, 509: 1242, 511: 1242, 532: 1242, 535: 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 570: 1242, 641: 5742, 644: 1242, 1242}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 511: 5743, 652: 3678, 2670, 2671, 2669}, + {1827, 1827, 7: 1827, 57: 1827, 460: 1827, 462: 1827, 468: 1827, 470: 1827, 478: 1827, 1827, 481: 1827, 1827, 1827, 485: 1827, 489: 1827, 1827, 1827, 1827, 501: 1827}, // 3290 - {1804, 1804, 7: 1804, 53: 1804, 453: 1804, 455: 1804, 461: 1804, 463: 1804, 471: 1804, 1804, 474: 1804, 1804, 1804, 1804, 479: 1804, 1804, 482: 1804, 484: 1804, 494: 1804}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 504: 5744, 640: 5745, 2668, 2669, 2667}, - {1814, 1814, 7: 1814, 53: 1814, 453: 1814, 455: 1814, 461: 1814, 463: 1814, 471: 1814, 1814, 474: 1814, 1814, 1814, 1814, 479: 1814, 1814, 482: 1814, 484: 1814, 494: 1814}, - {1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 3872, 1235, 1235, 1235, 1235, 460: 1235, 1235, 1235, 1235, 466: 1235, 1235, 1235, 471: 1235, 1235, 474: 1235, 1235, 1235, 1235, 1235, 1235, 1235, 482: 1235, 484: 1235, 486: 1235, 489: 1235, 1235, 1235, 1235, 494: 1235, 502: 1235, 504: 1235, 525: 1235, 528: 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 565: 1235, 633: 5746, 636: 1235, 1235}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 504: 5747, 640: 3669, 2668, 2669, 2667}, + {1826, 1826, 7: 1826, 57: 1826, 460: 1826, 462: 1826, 468: 1826, 470: 1826, 478: 1826, 1826, 481: 1826, 1826, 1826, 485: 1826, 489: 1826, 1826, 1826, 1826, 501: 1826}, + {1824, 1824, 7: 1824, 57: 1824, 460: 1824, 462: 1824, 468: 1824, 470: 1824, 478: 1824, 1824, 481: 1824, 1824, 1824, 485: 1824, 489: 1824, 1824, 1824, 1824, 501: 1824}, + {1823, 1823, 7: 1823, 57: 1823, 460: 1823, 462: 1823, 468: 1823, 470: 1823, 478: 1823, 1823, 481: 1823, 1823, 1823, 485: 1823, 489: 1823, 1823, 1823, 1823, 501: 1823}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 5750, 652: 5749, 2670, 2671, 2669}, + {1821, 1821, 7: 1821, 57: 1821, 460: 1821, 462: 1821, 468: 1821, 470: 1821, 478: 1821, 1821, 481: 1821, 1821, 1821, 485: 1821, 489: 1821, 1821, 1821, 1821, 501: 1821}, // 3295 - {1813, 1813, 7: 1813, 53: 1813, 453: 1813, 455: 1813, 461: 1813, 463: 1813, 471: 1813, 1813, 474: 1813, 1813, 1813, 1813, 479: 1813, 1813, 482: 1813, 484: 1813, 494: 1813}, - {1812, 1812, 7: 1812, 53: 1812, 453: 1812, 455: 1812, 461: 1812, 463: 1812, 471: 1812, 1812, 474: 1812, 1812, 1812, 1812, 479: 1812, 1812, 482: 1812, 484: 1812, 494: 1812}, - {1810, 1810, 7: 1810, 53: 1810, 453: 1810, 455: 1810, 461: 1810, 463: 1810, 471: 1810, 1810, 474: 1810, 1810, 1810, 1810, 479: 1810, 1810, 482: 1810, 484: 1810, 494: 1810}, - {1809, 1809, 7: 1809, 53: 1809, 453: 1809, 455: 1809, 461: 1809, 463: 1809, 471: 1809, 1809, 474: 1809, 1809, 1809, 1809, 479: 1809, 1809, 482: 1809, 484: 1809, 494: 1809}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 5754, 640: 5753, 2668, 2669, 2667}, + {1822, 1822, 7: 1822, 57: 1822, 460: 1822, 462: 1822, 468: 1822, 470: 1822, 478: 1822, 1822, 481: 1822, 1822, 1822, 485: 1822, 489: 1822, 1822, 1822, 1822, 501: 1822}, + {1820, 1820, 7: 1820, 57: 1820, 460: 1820, 462: 1820, 468: 1820, 470: 1820, 478: 1820, 1820, 481: 1820, 1820, 1820, 485: 1820, 489: 1820, 1820, 1820, 1820, 501: 1820}, + {987, 987}, + {997, 997}, + {81: 5758, 222: 5757}, // 3300 - {1807, 1807, 7: 1807, 53: 1807, 453: 1807, 455: 1807, 461: 1807, 463: 1807, 471: 1807, 1807, 474: 1807, 1807, 1807, 1807, 479: 1807, 1807, 482: 1807, 484: 1807, 494: 1807}, - {1808, 1808, 7: 1808, 53: 1808, 453: 1808, 455: 1808, 461: 1808, 463: 1808, 471: 1808, 1808, 474: 1808, 1808, 1808, 1808, 479: 1808, 1808, 482: 1808, 484: 1808, 494: 1808}, - {1806, 1806, 7: 1806, 53: 1806, 453: 1806, 455: 1806, 461: 1806, 463: 1806, 471: 1806, 1806, 474: 1806, 1806, 1806, 1806, 479: 1806, 1806, 482: 1806, 484: 1806, 494: 1806}, - {980, 980}, + {991, 991}, + {849: 5756}, {990, 990}, + {993, 993, 81: 5763}, + {222: 5759}, // 3305 - {76: 5762, 216: 5761}, - {984, 984}, - {838: 5760}, - {983, 983}, - {986, 986, 76: 5767}, + {992, 992, 81: 5761, 849: 5760}, + {995, 995}, + {849: 5762}, + {994, 994}, + {849: 5764}, // 3310 - {216: 5763}, - {985, 985, 76: 5765, 838: 5764}, - {988, 988}, - {838: 5766}, - {987, 987}, + {996, 996}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5766, 2670, 2671, 2669}, + {1001, 1001}, + {1005, 1005, 470: 5768}, + {557: 3245, 699: 5770, 1304: 5769}, // 3315 - {838: 5768}, - {989, 989}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5770, 2668, 2669, 2667}, - {994, 994}, - {998, 998, 463: 5772}, + {1004, 1004, 7: 5771}, + {1003, 1003, 7: 1003}, + {557: 3245, 699: 5772}, + {1002, 1002, 7: 1002}, + {489: 5774}, // 3320 - {548: 3236, 691: 5774, 1302: 5773}, - {997, 997, 7: 5775}, - {996, 996, 7: 996}, - {548: 3236, 691: 5776}, - {995, 995, 7: 995}, + {463: 5776, 557: 3245, 699: 5777, 1255: 5775}, + {1008, 1008}, + {1007, 1007}, + {1006, 1006}, + {2: 1318, 1318, 1318, 1318, 1318, 8: 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 58: 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 483: 5779, 1047: 5780}, // 3325 - {479: 5778}, - {456: 5780, 548: 3236, 691: 5781, 1253: 5779}, - {1001, 1001}, - {1000, 1000}, - {999, 999}, + {2: 1317, 1317, 1317, 1317, 1317, 8: 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 58: 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 5781}, + {152: 889, 461: 889, 889, 477: 5289, 486: 889, 500: 889, 555: 889, 633: 889, 848: 5782}, + {152: 5790, 461: 5783, 2502, 486: 5791, 500: 5789, 555: 2500, 633: 2496, 698: 5788, 740: 5786, 2497, 2498, 2499, 2508, 2506, 2505, 2504, 751: 5787, 5785, 3772, 961: 5784, 1046: 5792}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 2256, 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 461: 2503, 2502, 486: 2501, 555: 2500, 633: 2496, 652: 4033, 2670, 2671, 2669, 698: 5655, 732: 4034, 740: 3773, 2497, 2498, 2499, 2508, 2506, 2505, 2504, 751: 3775, 3774, 3772, 797: 4962, 985: 5804}, // 3330 - {2: 1311, 1311, 1311, 1311, 1311, 8: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 54: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 476: 5783, 1042: 5784}, - {2: 1310, 1310, 1310, 1310, 1310, 8: 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 54: 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310, 1310}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 5785}, - {148: 882, 454: 882, 882, 469: 5293, 481: 882, 493: 882, 550: 882, 628: 882, 837: 5786}, - {148: 5794, 454: 5787, 2500, 481: 5795, 493: 5793, 550: 2498, 628: 2494, 690: 5792, 733: 5790, 2495, 2496, 2497, 2506, 739: 2504, 2503, 2502, 745: 5791, 5789, 3763, 957: 5788, 1041: 5796}, + {461: 3789, 828: 5801, 959: 5800}, + {1310, 1310, 460: 1310, 470: 1310}, + {1309, 1309, 460: 1309, 468: 782, 470: 1309, 478: 782, 782}, + {1308, 1308, 460: 1308, 470: 1308}, + {1307, 1307, 460: 1307, 468: 781, 470: 1307, 478: 781, 781, 482: 2636, 490: 2637, 492: 2633, 755: 3783, 3784}, // 3335 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 2240, 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 454: 2501, 2500, 481: 2499, 550: 2498, 628: 2494, 640: 4023, 2668, 2669, 2667, 690: 5659, 724: 4024, 733: 3764, 2495, 2496, 2497, 2506, 739: 2504, 2503, 2502, 745: 3766, 3765, 3763, 766: 4966, 980: 5808}, - {454: 3780, 820: 5805, 955: 5804}, - {1303, 1303, 453: 1303, 463: 1303}, - {1302, 1302, 453: 1302, 461: 776, 463: 1302, 471: 776, 776}, - {1301, 1301, 453: 1301, 463: 1301}, + {1293, 1293, 2906, 2754, 2790, 2908, 2681, 1293, 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 1293, 470: 1293, 652: 4033, 2670, 2671, 2669, 732: 5794, 989: 5795, 1170: 5793}, + {461: 1305}, + {461: 1304, 563: 3788, 899: 3787, 960: 3786}, + {1288, 1288, 470: 1288}, + {1306, 1306, 7: 5798, 460: 1306, 470: 1306}, // 3340 - {1300, 1300, 453: 1300, 461: 775, 463: 1300, 471: 775, 775, 475: 2634, 480: 2635, 484: 2631, 748: 3774, 3775}, - {1286, 1286, 2900, 2748, 2784, 2902, 2675, 1286, 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 1286, 463: 1286, 640: 4023, 2668, 2669, 2667, 724: 5798, 984: 5799, 1167: 5797}, - {454: 1298}, - {454: 1297, 554: 3779, 894: 3778, 956: 3777}, - {1281, 1281, 463: 1281}, + {484: 5796}, + {1292, 1292, 7: 1292, 460: 1292, 470: 1292}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3795, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3791, 787: 5797}, + {1294, 1294, 7: 1294, 460: 1294, 470: 1294}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4033, 2670, 2671, 2669, 732: 5794, 989: 5799}, // 3345 - {1299, 1299, 7: 5802, 453: 1299, 463: 1299}, - {478: 5800}, - {1285, 1285, 7: 1285, 453: 1285, 463: 1285}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3786, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3782, 786: 5801}, - {1287, 1287, 7: 1287, 453: 1287, 463: 1287}, + {1291, 1291, 7: 1291, 460: 1291, 470: 1291}, + {1311, 1311, 7: 5802, 460: 1311, 470: 1311}, + {1303, 1303, 7: 1303, 460: 1303, 470: 1303}, + {461: 3789, 828: 5803}, + {1302, 1302, 7: 1302, 460: 1302, 470: 1302}, // 3350 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4023, 2668, 2669, 2667, 724: 5798, 984: 5803}, - {1284, 1284, 7: 1284, 453: 1284, 463: 1284}, - {1304, 1304, 7: 5806, 453: 1304, 463: 1304}, - {1296, 1296, 7: 1296, 453: 1296, 463: 1296}, - {454: 3780, 820: 5807}, + {57: 5805}, + {152: 5790, 461: 2503, 2502, 486: 5791, 555: 2500, 633: 2496, 698: 5810, 740: 5808, 2497, 2498, 2499, 2508, 2506, 2505, 2504, 751: 5809, 5807, 3772, 961: 5806}, + {461: 3789, 828: 5801, 959: 5811}, + {1315, 1315, 460: 1315, 470: 1315}, + {1314, 1314, 460: 1314, 468: 782, 470: 1314, 478: 782, 782}, // 3355 - {1295, 1295, 7: 1295, 453: 1295, 463: 1295}, - {53: 5809}, - {148: 5794, 454: 2501, 2500, 481: 5795, 550: 2498, 628: 2494, 690: 5814, 733: 5812, 2495, 2496, 2497, 2506, 739: 2504, 2503, 2502, 745: 5813, 5811, 3763, 957: 5810}, - {454: 3780, 820: 5805, 955: 5815}, - {1308, 1308, 453: 1308, 463: 1308}, + {1313, 1313, 460: 1313, 470: 1313}, + {1312, 1312, 460: 1312, 468: 781, 470: 1312, 478: 781, 781, 482: 2636, 490: 2637, 492: 2633, 755: 3783, 3784}, + {1316, 1316, 7: 5802, 460: 1316, 470: 1316}, + {2: 1022, 1022, 1022, 1022, 1022, 8: 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 58: 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 476: 1022, 483: 1022, 737: 5227, 5226, 5225, 826: 5228, 873: 5813}, + {2: 1807, 1807, 1807, 1807, 1807, 8: 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 58: 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 476: 4080, 483: 1807, 843: 5814}, // 3360 - {1307, 1307, 453: 1307, 461: 776, 463: 1307, 471: 776, 776}, - {1306, 1306, 453: 1306, 463: 1306}, - {1305, 1305, 453: 1305, 461: 775, 463: 1305, 471: 775, 775, 475: 2634, 480: 2635, 484: 2631, 748: 3774, 3775}, - {1309, 1309, 7: 5806, 453: 1309, 463: 1309}, - {2: 1015, 1015, 1015, 1015, 1015, 8: 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 54: 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 470: 1015, 476: 1015, 730: 5231, 5230, 5229, 818: 5232, 861: 5817}, + {2: 1318, 1318, 1318, 1318, 1318, 8: 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 58: 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 483: 5779, 1047: 5815}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 5816}, + {152: 889, 461: 889, 889, 477: 5289, 486: 889, 500: 889, 555: 889, 633: 889, 848: 5817}, + {152: 5790, 461: 5783, 2502, 486: 5791, 500: 5789, 555: 2500, 633: 2496, 698: 5788, 740: 5786, 2497, 2498, 2499, 2508, 2506, 2505, 2504, 751: 5787, 5785, 3772, 961: 5784, 1046: 5818}, + {1290, 1290, 460: 5820, 470: 1290, 1234: 5819}, // 3365 - {2: 1793, 1793, 1793, 1793, 1793, 8: 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 54: 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 470: 4070, 476: 1793, 832: 5818}, - {2: 1311, 1311, 1311, 1311, 1311, 8: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 54: 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 1311, 476: 5783, 1042: 5819}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 5820}, - {148: 882, 454: 882, 882, 469: 5293, 481: 882, 493: 882, 550: 882, 628: 882, 837: 5821}, - {148: 5794, 454: 5787, 2500, 481: 5795, 493: 5793, 550: 2498, 628: 2494, 690: 5792, 733: 5790, 2495, 2496, 2497, 2506, 739: 2504, 2503, 2502, 745: 5791, 5789, 3763, 957: 5788, 1041: 5822}, + {1319, 1319, 470: 1319}, + {192: 5821}, + {565: 5822}, + {643: 5823}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4033, 2670, 2671, 2669, 732: 5343, 878: 5344, 912: 5824}, // 3370 - {1283, 1283, 453: 5824, 463: 1283, 1232: 5823}, - {1312, 1312, 463: 1312}, - {187: 5825}, - {556: 5826}, - {635: 5827}, + {1289, 1289, 7: 5346, 470: 1289}, + {1323, 1323, 461: 5833, 641: 1783}, + {1324, 1324}, + {641: 5828}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5829, 2670, 2671, 2669}, // 3375 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4023, 2668, 2669, 2667, 724: 5347, 866: 5348, 907: 5828}, - {1282, 1282, 7: 5350, 463: 1282}, - {1316, 1316, 454: 5837, 633: 1769}, - {1317, 1317}, - {633: 5832}, + {1322, 1322, 461: 5830}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 1870, 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3482, 765: 3644, 814: 5831}, + {57: 5832}, + {1320, 1320}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 1870, 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 3482, 765: 3644, 814: 5834}, // 3380 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5833, 2668, 2669, 2667}, - {1315, 1315, 454: 5834}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 1856, 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3473, 756: 3635, 805: 5835}, - {53: 5836}, - {1313, 1313}, + {57: 5835}, + {1321, 1321}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5987, 2670, 2671, 2669}, + {577, 577, 491: 5984, 509: 5983, 1270: 5982}, + {16: 5970, 99: 5967, 132: 5972, 161: 5971, 185: 5969, 555: 5966, 571: 5968}, // 3385 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 1856, 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 3473, 756: 3635, 805: 5838}, - {53: 5839}, - {1314, 1314}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5990, 2668, 2669, 2667}, - {572, 572, 482: 5987, 502: 5986, 1268: 5985}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 5955, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 5956}, + {649, 649, 481: 5950}, + {125: 5949}, + {98: 3836, 107: 3835, 110: 5944, 205: 5943, 822: 5945}, + {645, 645}, // 3390 - {17: 5973, 94: 5970, 129: 5975, 155: 5974, 180: 5972, 550: 5969, 563: 5971}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 5958, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 5959}, - {643, 643, 474: 5953}, - {122: 5952}, - {95: 3827, 104: 3826, 107: 5947, 199: 5946, 814: 5948}, + {637, 637, 176: 5925, 218: 5926, 228: 5927, 231: 5924, 249: 5929, 259: 5928, 273: 5931, 278: 5930, 481: 637, 637, 490: 637, 640: 5932, 1109: 5923, 1273: 5922, 5921}, + {643, 643}, + {642, 642}, + {579, 579, 252: 5912, 481: 5911, 491: 579, 509: 579}, + {489: 620, 532: 620}, // 3395 - {639, 639}, - {631, 631, 172: 5928, 212: 5929, 222: 5930, 225: 5927, 243: 5932, 253: 5931, 268: 5934, 272: 5933, 474: 631, 631, 480: 631, 718: 5935, 1106: 5926, 1271: 5925, 5924}, - {637, 637}, - {636, 636}, - {574, 574, 246: 5915, 474: 5914, 482: 574, 502: 574}, + {489: 619, 532: 619}, + {489: 618, 532: 618}, + {615, 615, 491: 615, 509: 615}, + {614, 614, 491: 614, 509: 614}, + {613, 613, 491: 613, 509: 613}, // 3400 - {479: 614, 525: 614}, - {479: 613, 525: 613}, - {479: 612, 525: 612}, - {609, 609, 482: 609, 502: 609}, - {608, 608, 482: 608, 502: 608}, + {612, 612, 491: 612, 509: 612}, + {110: 5909}, + {489: 5885, 532: 5886, 794: 5904}, + {98: 571, 107: 571, 197: 5883, 1071: 5898}, + {604, 604, 491: 604, 509: 604}, // 3405 - {607, 607, 482: 607, 502: 607}, - {606, 606, 482: 606, 502: 606}, - {107: 5912}, - {479: 5888, 525: 5889, 787: 5907}, - {95: 566, 104: 566, 192: 5886, 1067: 5901}, + {603, 603, 491: 603, 509: 603}, + {125: 5896, 138: 5897, 189: 5895}, + {599, 599, 491: 599, 509: 599}, + {569, 569, 489: 5885, 491: 569, 509: 569, 532: 5886, 794: 5888, 830: 5894}, + {125: 5893}, // 3410 - {598, 598, 482: 598, 502: 598}, - {597, 597, 482: 597, 502: 597}, - {122: 5899, 136: 5900, 184: 5898}, - {593, 593, 482: 593, 502: 593}, - {564, 564, 479: 5888, 482: 564, 502: 564, 525: 5889, 787: 5891, 821: 5897}, + {125: 5892}, + {125: 5891}, + {125: 5890}, + {569, 569, 489: 5885, 491: 569, 509: 569, 532: 5886, 794: 5888, 830: 5887}, + {592, 592, 491: 592, 509: 592}, // 3415 - {122: 5896}, - {122: 5895}, - {122: 5894}, - {122: 5893}, - {564, 564, 479: 5888, 482: 564, 502: 564, 525: 5889, 787: 5891, 821: 5890}, + {591, 591, 491: 591, 509: 591}, + {590, 590, 491: 590, 509: 590}, + {589, 589, 491: 589, 509: 589}, + {588, 588, 491: 588, 509: 588}, + {587, 587, 491: 587, 509: 587}, // 3420 - {586, 586, 482: 586, 502: 586}, - {585, 585, 482: 585, 502: 585}, - {584, 584, 482: 584, 502: 584}, - {583, 583, 482: 583, 502: 583}, - {582, 582, 482: 582, 502: 582}, + {586, 586, 491: 586, 509: 586}, + {585, 585, 491: 585, 509: 585}, + {584, 584, 491: 584, 509: 584}, + {125: 5884}, + {582, 582, 491: 582, 509: 582}, // 3425 - {581, 581, 482: 581, 502: 581}, - {580, 580, 482: 580, 502: 580}, - {579, 579, 482: 579, 502: 579}, - {122: 5887}, - {577, 577, 482: 577, 502: 577}, + {581, 581, 491: 581, 509: 581}, + {580, 580, 491: 580, 509: 580}, + {125: 573, 138: 573, 189: 573}, + {125: 572, 138: 572, 154: 572, 189: 572}, + {98: 570, 107: 570, 110: 570, 205: 570}, // 3430 - {576, 576, 482: 576, 502: 576}, - {575, 575, 482: 575, 502: 575}, - {122: 568, 136: 568, 184: 568}, - {122: 567, 136: 567, 149: 567, 184: 567}, - {95: 565, 104: 565, 107: 565, 199: 565}, + {583, 583, 491: 583, 509: 583}, + {2: 617, 617, 617, 617, 617, 8: 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 58: 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617}, + {2: 616, 616, 616, 616, 616, 8: 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 58: 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616}, + {593, 593, 491: 593, 509: 593}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5220, 2670, 2671, 2669, 804: 5889}, // 3435 - {578, 578, 482: 578, 502: 578}, - {2: 611, 611, 611, 611, 611, 8: 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 54: 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611}, - {2: 610, 610, 610, 610, 610, 8: 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 54: 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610}, - {587, 587, 482: 587, 502: 587}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5224, 2668, 2669, 2667, 796: 5892}, + {568, 568, 491: 568, 509: 568}, + {594, 594, 491: 594, 509: 594}, + {595, 595, 491: 595, 509: 595}, + {596, 596, 491: 596, 509: 596}, + {597, 597, 491: 597, 509: 597}, // 3440 - {563, 563, 482: 563, 502: 563}, - {588, 588, 482: 588, 502: 588}, - {589, 589, 482: 589, 502: 589}, - {590, 590, 482: 590, 502: 590}, - {591, 591, 482: 591, 502: 591}, + {598, 598, 491: 598, 509: 598}, + {602, 602, 491: 602, 509: 602}, + {601, 601, 491: 601, 509: 601}, + {600, 600, 491: 600, 509: 600}, + {98: 3836, 107: 3835, 822: 5899}, // 3445 - {592, 592, 482: 592, 502: 592}, - {596, 596, 482: 596, 502: 596}, - {595, 595, 482: 595, 502: 595}, - {594, 594, 482: 594, 502: 594}, - {95: 3827, 104: 3826, 814: 5902}, + {489: 5885, 532: 5886, 794: 5901, 1111: 5900}, + {569, 569, 489: 5885, 491: 569, 509: 569, 532: 5886, 794: 5888, 830: 5903}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 5902}, + {567, 567, 489: 567, 491: 567, 509: 567, 532: 567}, + {605, 605, 491: 605, 509: 605}, // 3450 - {479: 5888, 525: 5889, 787: 5904, 1108: 5903}, - {564, 564, 479: 5888, 482: 564, 502: 564, 525: 5889, 787: 5891, 821: 5906}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 5905}, - {562, 562, 479: 562, 482: 562, 502: 562, 525: 562}, - {599, 599, 482: 599, 502: 599}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5905, 2670, 2671, 2669, 726: 5906}, + {1020, 1020, 489: 5885, 491: 1020, 509: 1020, 532: 5886, 641: 3818, 794: 5907}, + {608, 608, 491: 608, 509: 608}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5908, 2670, 2671, 2669}, + {607, 607, 491: 607, 509: 607}, // 3455 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5908, 2668, 2669, 2667, 719: 5909}, - {1013, 1013, 479: 5888, 482: 1013, 502: 1013, 525: 5889, 633: 3809, 787: 5910}, - {602, 602, 482: 602, 502: 602}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5911, 2668, 2669, 2667}, - {601, 601, 482: 601, 502: 601}, + {569, 569, 489: 5885, 491: 569, 509: 569, 532: 5886, 794: 5888, 830: 5910}, + {610, 610, 491: 610, 509: 610}, + {555: 5916, 571: 5913, 838: 5915, 1271: 5914}, + {578, 578, 491: 578, 509: 578}, + {2: 2014, 2014, 2014, 2014, 2014, 8: 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 58: 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 466: 2014, 469: 2014, 488: 2014, 511: 2014, 554: 2014, 636: 2014}, // 3460 - {564, 564, 479: 5888, 482: 564, 502: 564, 525: 5889, 787: 5891, 821: 5913}, - {604, 604, 482: 604, 502: 604}, - {550: 5919, 563: 5916, 827: 5918, 1269: 5917}, - {573, 573, 482: 573, 502: 573}, - {2: 1998, 1998, 1998, 1998, 1998, 8: 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 54: 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 1998, 459: 1998, 462: 1998, 485: 1998, 504: 1998, 547: 1998, 629: 1998}, + {641, 641}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5220, 2670, 2671, 2669, 804: 5920}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 5917}, + {639, 639, 477: 5918}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5919, 2670, 2671, 2669}, // 3465 - {635, 635}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5224, 2668, 2669, 2667, 796: 5923}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 5920}, - {633, 633, 469: 5921}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5922, 2668, 2669, 2667}, + {638, 638}, + {640, 640}, + {624, 624, 481: 5939, 624, 490: 624, 1272: 5938}, + {636, 636, 7: 5936, 481: 636, 636, 490: 636}, + {635, 635, 7: 635, 481: 635, 635, 490: 635}, // 3470 - {632, 632}, - {634, 634}, - {618, 618, 474: 5942, 618, 480: 618, 1270: 5941}, - {630, 630, 7: 5939, 474: 630, 630, 480: 630}, - {629, 629, 7: 629, 474: 629, 629, 480: 629}, + {633, 633, 7: 633, 481: 633, 633, 490: 633}, + {632, 632, 7: 632, 481: 632, 632, 490: 632}, + {335: 5935}, + {376: 5934}, + {323: 5933}, // 3475 - {627, 627, 7: 627, 474: 627, 627, 480: 627}, - {626, 626, 7: 626, 474: 626, 626, 480: 626}, - {329: 5938}, - {374: 5937}, - {317: 5936}, + {628, 628, 7: 628, 481: 628, 628, 490: 628}, + {627, 627, 7: 627, 481: 627, 627, 490: 627}, + {626, 626, 7: 626, 481: 626, 626, 490: 626}, + {625, 625, 7: 625, 481: 625, 625, 490: 625}, + {629, 629, 7: 629, 481: 629, 629, 490: 629}, // 3480 - {622, 622, 7: 622, 474: 622, 622, 480: 622}, - {621, 621, 7: 621, 474: 621, 621, 480: 621}, - {620, 620, 7: 620, 474: 620, 620, 480: 620}, - {619, 619, 7: 619, 474: 619, 619, 480: 619}, - {623, 623, 7: 623, 474: 623, 623, 480: 623}, + {630, 630, 7: 630, 481: 630, 630, 490: 630}, + {631, 631, 7: 631, 481: 631, 631, 490: 631}, + {176: 5925, 218: 5926, 228: 5927, 231: 5924, 249: 5929, 259: 5928, 273: 5931, 278: 5930, 640: 5932, 1109: 5937}, + {634, 634, 7: 634, 481: 634, 634, 490: 634}, + {836, 836, 482: 2636, 490: 2637, 756: 2638, 817: 5942}, // 3485 - {624, 624, 7: 624, 474: 624, 624, 480: 624}, - {625, 625, 7: 625, 474: 625, 625, 480: 625}, - {172: 5928, 212: 5929, 222: 5930, 225: 5927, 243: 5932, 253: 5931, 268: 5934, 272: 5933, 718: 5935, 1106: 5940}, - {628, 628, 7: 628, 474: 628, 628, 480: 628}, - {829, 829, 475: 2634, 480: 2635, 749: 2636, 809: 5945}, + {143: 5940}, + {495: 2644, 724: 3943, 750: 5941}, + {623, 623, 482: 623, 490: 623}, + {644, 644}, + {646, 646}, // 3490 - {141: 5943}, - {488: 2642, 716: 3933, 743: 5944}, - {617, 617, 475: 617, 480: 617}, - {638, 638}, - {640, 640}, + {569, 569, 489: 5885, 491: 569, 509: 569, 532: 5886, 794: 5888, 830: 5948}, + {489: 5885, 532: 5886, 794: 5901, 1111: 5946}, + {569, 569, 489: 5885, 491: 569, 509: 569, 532: 5886, 794: 5888, 830: 5947}, + {606, 606, 491: 606, 509: 606}, + {611, 611, 491: 611, 509: 611}, // 3495 - {564, 564, 479: 5888, 482: 564, 502: 564, 525: 5889, 787: 5891, 821: 5951}, - {479: 5888, 525: 5889, 787: 5904, 1108: 5949}, - {564, 564, 479: 5888, 482: 564, 502: 564, 525: 5889, 787: 5891, 821: 5950}, - {600, 600, 482: 600, 502: 600}, - {605, 605, 482: 605, 502: 605}, + {647, 647}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 558: 5121, 652: 3385, 2670, 2671, 2669, 727: 5120, 762: 5951}, + {622, 622, 470: 5953, 1305: 5952}, + {648, 648}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 5541, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 5546, 652: 3385, 2670, 2671, 2669, 727: 5075, 790: 5548, 809: 5549, 5547, 850: 5954}, // 3500 - {641, 641}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 551: 5125, 640: 3376, 2668, 2669, 2667, 720: 5124, 755: 5954}, - {616, 616, 463: 5956, 1303: 5955}, - {642, 642}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 5545, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 5550, 640: 3376, 2668, 2669, 2667, 720: 5079, 781: 5552, 800: 5553, 5551, 839: 5957}, + {621, 621, 7: 5550}, + {569, 569, 15: 1687, 156: 1687, 477: 1687, 489: 5885, 491: 569, 509: 569, 532: 5886, 637: 1687, 641: 1687, 794: 5888, 830: 5965}, + {15: 889, 156: 5958, 477: 5289, 637: 889, 848: 5957}, + {15: 5959, 637: 5960}, + {651, 651}, // 3505 - {615, 615, 7: 5554}, - {564, 564, 16: 1677, 151: 1677, 469: 1677, 479: 5888, 482: 564, 502: 564, 525: 5889, 630: 1677, 633: 1677, 787: 5891, 821: 5968}, - {16: 882, 151: 5961, 469: 5293, 630: 882, 837: 5960}, - {16: 5962, 630: 5963}, - {645, 645}, + {237, 237, 491: 2630, 779: 2631, 5964}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5961, 2670, 2671, 2669}, + {15: 5962}, + {237, 237, 491: 2630, 779: 2631, 5963}, + {650, 650}, // 3510 - {237, 237, 482: 2628, 773: 2629, 5967}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5964, 2668, 2669, 2667}, - {16: 5965}, - {237, 237, 482: 2628, 773: 2629, 5966}, - {644, 644}, + {652, 652}, + {609, 609, 491: 609, 509: 609}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 5981}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 5980}, + {2: 1809, 1809, 1809, 1809, 1809, 8: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 58: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 554: 4710, 774: 5978}, // 3515 - {646, 646}, - {603, 603, 482: 603, 502: 603}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 5984}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 5983}, - {2: 1795, 1795, 1795, 1795, 1795, 8: 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 54: 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 547: 4745, 764: 5981}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 5977}, + {157: 5975}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 558: 5121, 652: 3385, 2670, 2671, 2669, 727: 5120, 762: 5974}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5973, 2670, 2671, 2669}, + {653, 653}, // 3520 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 5980}, - {134: 5978}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 551: 5125, 640: 3376, 2668, 2669, 2667, 720: 5124, 755: 5977}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5976, 2668, 2669, 2667}, - {647, 647}, + {654, 654}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4870, 2670, 2671, 2669, 872: 5976}, + {655, 655}, + {656, 656}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5220, 2670, 2671, 2669, 804: 5979}, // 3525 - {648, 648}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4877, 2668, 2669, 2667, 860: 5979}, - {649, 649}, - {650, 650}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5224, 2668, 2669, 2667, 796: 5982}, + {657, 657}, + {658, 658}, + {659, 659}, + {660, 660}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 466: 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 3245, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 5986, 3148, 3231, 3147, 3144}, // 3530 - {651, 651}, - {652, 652}, - {653, 653}, - {654, 654}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 459: 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 3236, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 5989, 3139, 3222, 3138, 3135}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 2695, 2747, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 2776, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 2674, 2690, 2833, 2924, 2781, 2708, 2725, 2852, 2935, 2768, 2737, 2846, 2847, 2842, 2802, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 2783, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 2787, 2734, 2668, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 2706, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 2772, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 2773, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 2841, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 2659, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 2789, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 2731, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 2660, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 2684, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3058, 3059, 3108, 3107, 2961, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 2823, 2840, 2962, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3087, 3088, 3098, 3083, 3084, 3085, 3116, 2784, 461: 3155, 463: 3135, 3153, 2663, 3163, 471: 3168, 3172, 3151, 3152, 3190, 480: 3126, 486: 3164, 488: 3188, 493: 3171, 495: 3130, 531: 3159, 554: 3166, 556: 3189, 2661, 3173, 3125, 3127, 3129, 3128, 3156, 3133, 566: 3146, 3158, 3134, 3167, 571: 3165, 3157, 574: 3162, 576: 3233, 3169, 3178, 3179, 3180, 3132, 3149, 3150, 3203, 3206, 3207, 3208, 3209, 3210, 3160, 3211, 3186, 3191, 3201, 3202, 3195, 3212, 3213, 3214, 3196, 3216, 3217, 3204, 3197, 3215, 3192, 3200, 3198, 3184, 3218, 3219, 3161, 3223, 3174, 3175, 3177, 3222, 3228, 3227, 3229, 3226, 3230, 3225, 3224, 3221, 3170, 3220, 3176, 3181, 3182, 638: 2664, 652: 3139, 2670, 2671, 2669, 698: 3154, 3232, 3140, 3145, 3131, 3205, 3143, 3141, 3142, 3183, 3194, 3193, 3187, 3185, 3199, 3138, 3148, 3231, 3147, 3144, 2667, 2666, 2665, 5985}, + {575, 575, 494: 3242, 496: 3240, 3241, 3239, 3237, 722: 3238, 3236}, + {576, 576, 469: 3246, 570: 3247}, + {1906, 1906, 198: 5989, 555: 1906, 1237: 5988}, + {545, 545, 555: 5991, 953: 5990}, // 3535 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 2689, 2741, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 2770, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 2672, 2684, 2827, 2918, 2775, 2702, 2719, 2846, 2929, 2762, 2731, 2840, 2841, 2836, 2796, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 2777, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 2781, 2693, 2728, 2666, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 2700, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 2766, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 2767, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 2835, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 2657, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 2783, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 2725, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 2658, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 2678, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3050, 3051, 3099, 3098, 2955, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 2817, 2834, 2956, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3078, 3079, 3089, 3075, 3076, 3077, 2778, 454: 3146, 456: 3126, 3144, 2661, 3154, 464: 3159, 3163, 3142, 3143, 3181, 473: 3117, 481: 3155, 485: 3179, 487: 3162, 3121, 524: 3150, 547: 3157, 2659, 3180, 551: 3164, 3116, 3118, 3147, 3124, 557: 3137, 3149, 3125, 3120, 3119, 3158, 3156, 3148, 567: 3153, 569: 3224, 3160, 3169, 3170, 3171, 3123, 3140, 3141, 3194, 3197, 3198, 3199, 3200, 3201, 3151, 3202, 3177, 3182, 3192, 3193, 3186, 3203, 3204, 3205, 3187, 3207, 3208, 3195, 3188, 3206, 3183, 3191, 3189, 3175, 3209, 3210, 3152, 3214, 3165, 3166, 3168, 3213, 3219, 3218, 3220, 3217, 3221, 3216, 3215, 3212, 3161, 3211, 3167, 3172, 3173, 631: 2662, 640: 3130, 2668, 2669, 2667, 690: 3145, 3223, 3131, 3136, 3122, 3196, 3134, 3132, 3133, 3174, 3185, 3184, 3178, 3176, 3190, 3129, 3139, 3222, 3138, 3135, 2665, 2664, 2663, 5988}, - {570, 570, 486: 3233, 489: 3231, 3232, 3230, 3228, 714: 3229, 3227}, - {571, 571, 462: 3237, 565: 3238}, - {1892, 1892, 193: 5992, 550: 1892, 1235: 5991}, - {540, 540, 550: 5994, 949: 5993}, + {1905, 1905, 555: 1905}, + {1911, 1911}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 3814, 785: 5992}, + {544, 544, 7: 3816}, + {2: 1908, 1908, 1908, 1908, 1908, 8: 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 58: 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 554: 5995, 1203: 5994}, // 3540 - {1891, 1891, 550: 1891}, - {1897, 1897}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 3805, 778: 5995}, - {539, 539, 7: 3807}, - {2: 1894, 1894, 1894, 1894, 1894, 8: 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 54: 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 1894, 547: 5998, 1201: 5997}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5998, 2670, 2671, 2669}, + {464: 3979, 3978, 799: 5996}, + {183: 5997}, + {2: 1907, 1907, 1907, 1907, 1907, 8: 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 58: 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907}, + {1914, 1914}, // 3545 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 6001, 2668, 2669, 2667}, - {457: 3969, 3968, 791: 5999}, - {179: 6000}, - {2: 1893, 1893, 1893, 1893, 1893, 8: 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 54: 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893, 1893}, - {1900, 1900}, + {2: 1910, 1910, 1910, 1910, 1910, 8: 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 58: 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 1910, 554: 6001, 1204: 6000}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 6003, 2670, 2671, 2669}, + {183: 6002}, + {2: 1909, 1909, 1909, 1909, 1909, 8: 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 58: 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909}, + {1915, 1915}, // 3550 - {2: 1896, 1896, 1896, 1896, 1896, 8: 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 54: 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 1896, 547: 6004, 1202: 6003}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 6006, 2668, 2669, 2667}, - {179: 6005}, - {2: 1895, 1895, 1895, 1895, 1895, 8: 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 54: 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895, 1895}, - {1901, 1901}, + {495: 2644, 724: 6005}, + {1917, 1917}, + {489: 6015}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 511: 6010, 652: 5220, 2670, 2671, 2669, 804: 6012, 1179: 6011}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 3814, 785: 6009}, // 3555 - {488: 2642, 716: 6008}, - {1903, 1903}, - {479: 6018}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 504: 6013, 640: 5224, 2668, 2669, 2667, 796: 6015, 1176: 6014}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 3805, 778: 6012}, + {7: 3816, 489: 1964, 639: 1964}, + {489: 1966, 639: 1966}, + {7: 6013, 489: 1965, 639: 1965}, + {7: 1963, 489: 1963, 639: 1963}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5220, 2670, 2671, 2669, 804: 6014}, // 3560 - {7: 3807, 479: 1950, 632: 1950}, - {479: 1952, 632: 1952}, - {7: 6016, 479: 1951, 632: 1951}, - {7: 1949, 479: 1949, 632: 1949}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5224, 2668, 2669, 2667, 796: 6017}, + {7: 1962, 489: 1962, 639: 1962}, + {463: 6016}, + {1961, 1961, 27: 1961, 59: 1961, 61: 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 460: 1961, 642: 1961, 885: 6017}, + {1967, 1967, 27: 6044, 59: 6020, 61: 6040, 6033, 6023, 6019, 6027, 6031, 6043, 6026, 6032, 6030, 6028, 6041, 6034, 6022, 6042, 6021, 6024, 6025, 6029, 460: 6035, 642: 6045, 881: 6037, 6036, 6039, 6018, 886: 6038}, + {1960, 1960, 27: 1960, 59: 1960, 61: 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 460: 1960, 642: 1960}, // 3565 - {7: 1948, 479: 1948, 632: 1948}, - {456: 6019}, - {1947, 1947, 27: 1947, 54: 1947, 56: 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 453: 1947, 634: 1947, 874: 6020}, - {1953, 1953, 27: 6047, 54: 6023, 56: 6043, 6036, 6026, 6022, 6030, 6034, 6046, 6029, 6035, 6033, 6031, 6044, 6037, 6025, 6045, 6024, 6027, 6028, 6032, 453: 6038, 634: 6048, 870: 6040, 6039, 6042, 6021, 875: 6041}, - {1946, 1946, 27: 1946, 54: 1946, 56: 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 1946, 453: 1946, 634: 1946}, + {484: 1959, 495: 1959}, + {484: 1958, 495: 1958}, + {484: 1957, 495: 1957, 559: 1957, 1957}, + {484: 1956, 495: 1956, 559: 1956, 1956}, + {484: 1955, 495: 1955, 559: 1955, 1955}, // 3570 - {478: 1945, 488: 1945}, - {478: 1944, 488: 1944}, - {478: 1943, 488: 1943, 552: 1943, 1943}, - {478: 1942, 488: 1942, 552: 1942, 1942}, - {478: 1941, 488: 1941, 552: 1941, 1941}, + {484: 1954, 495: 1954, 559: 1954, 1954}, + {484: 1953, 495: 1953, 559: 1953, 1953}, + {484: 1952, 495: 1952, 559: 1952, 1952}, + {484: 1951, 495: 1951, 559: 1951, 1951}, + {484: 1950, 495: 1950, 559: 1950, 1950}, // 3575 - {478: 1940, 488: 1940, 552: 1940, 1940}, - {478: 1939, 488: 1939, 552: 1939, 1939}, - {478: 1938, 488: 1938, 552: 1938, 1938}, - {478: 1937, 488: 1937, 552: 1937, 1937}, - {478: 1936, 488: 1936, 552: 1936, 1936}, + {463: 1949, 484: 1949}, + {463: 1948, 484: 1948}, + {463: 1947, 484: 1947}, + {463: 1946, 484: 1946}, + {2: 1945, 1945, 1945, 1945, 1945, 8: 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 58: 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 1945, 463: 1945, 476: 1945, 484: 1945, 493: 1945}, // 3580 - {456: 1935, 478: 1935}, - {456: 1934, 478: 1934}, - {456: 1933, 478: 1933}, - {456: 1932, 478: 1932}, - {2: 1931, 1931, 1931, 1931, 1931, 8: 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 54: 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 456: 1931, 470: 1931, 478: 1931, 487: 1931}, + {2: 1944, 1944, 1944, 1944, 1944, 8: 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 58: 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 1944, 463: 1944, 476: 1944, 484: 1944, 493: 1944}, + {192: 6085}, + {484: 4180, 495: 1993, 725: 6083}, + {484: 4180, 495: 1993, 559: 1993, 1993, 725: 6081}, + {463: 1993, 484: 4180, 725: 6079}, // 3585 - {2: 1930, 1930, 1930, 1930, 1930, 8: 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 54: 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 456: 1930, 470: 1930, 478: 1930, 487: 1930}, - {187: 6088}, - {478: 4165, 488: 1977, 717: 6086}, - {478: 4165, 488: 1977, 552: 1977, 1977, 717: 6084}, - {456: 1977, 478: 4165, 717: 6082}, + {2: 1993, 1993, 1993, 1993, 1993, 8: 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 58: 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 463: 1993, 476: 1993, 484: 4180, 493: 1993, 725: 6074}, + {463: 1993, 484: 4180, 495: 1993, 725: 6069}, + {463: 1993, 484: 4180, 495: 1993, 725: 6066}, + {484: 4180, 495: 1993, 725: 6061}, + {98: 1993, 107: 1993, 484: 4180, 495: 1993, 725: 6058}, // 3590 - {2: 1977, 1977, 1977, 1977, 1977, 8: 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 54: 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 456: 1977, 470: 1977, 478: 4165, 487: 1977, 717: 6077}, - {456: 1977, 478: 4165, 488: 1977, 717: 6072}, - {456: 1977, 478: 4165, 488: 1977, 717: 6069}, - {478: 4165, 488: 1977, 717: 6064}, - {95: 1977, 104: 1977, 478: 4165, 488: 1977, 717: 6061}, + {177: 1993, 1993, 181: 1993, 484: 4180, 495: 1993, 559: 1993, 1993, 725: 6055}, + {177: 1993, 1993, 181: 1993, 484: 4180, 495: 1993, 559: 1993, 1993, 725: 6046}, + {177: 6052, 6053, 181: 6054, 495: 2644, 559: 6050, 6051, 724: 6049, 914: 6047, 1074: 6048}, + {1928, 1928, 27: 1928, 59: 1928, 61: 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 460: 1928, 642: 1928}, + {1927, 1927, 27: 1927, 59: 1927, 61: 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 460: 1927, 642: 1927}, // 3595 - {173: 1977, 1977, 177: 1977, 478: 4165, 488: 1977, 552: 1977, 1977, 717: 6058}, - {173: 1977, 1977, 177: 1977, 478: 4165, 488: 1977, 552: 1977, 1977, 717: 6049}, - {173: 6055, 6056, 177: 6057, 488: 2642, 552: 6053, 6054, 716: 6052, 909: 6050, 1070: 6051}, - {1914, 1914, 27: 1914, 54: 1914, 56: 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 1914, 453: 1914, 634: 1914}, - {1913, 1913, 27: 1913, 54: 1913, 56: 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 1913, 453: 1913, 634: 1913}, + {1923, 1923, 27: 1923, 59: 1923, 61: 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 460: 1923, 642: 1923}, + {1922, 1922, 27: 1922, 59: 1922, 61: 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 460: 1922, 642: 1922}, + {1921, 1921, 27: 1921, 59: 1921, 61: 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 460: 1921, 642: 1921}, + {1920, 1920, 27: 1920, 59: 1920, 61: 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 460: 1920, 642: 1920}, + {1919, 1919, 27: 1919, 59: 1919, 61: 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 460: 1919, 642: 1919}, // 3600 - {1909, 1909, 27: 1909, 54: 1909, 56: 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 1909, 453: 1909, 634: 1909}, - {1908, 1908, 27: 1908, 54: 1908, 56: 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 1908, 453: 1908, 634: 1908}, - {1907, 1907, 27: 1907, 54: 1907, 56: 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 1907, 453: 1907, 634: 1907}, - {1906, 1906, 27: 1906, 54: 1906, 56: 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 1906, 453: 1906, 634: 1906}, - {1905, 1905, 27: 1905, 54: 1905, 56: 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 1905, 453: 1905, 634: 1905}, + {1918, 1918, 27: 1918, 59: 1918, 61: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 460: 1918, 642: 1918}, + {177: 6052, 6053, 181: 6054, 495: 2644, 559: 6050, 6051, 724: 6049, 914: 6056, 1074: 6057}, + {1930, 1930, 27: 1930, 59: 1930, 61: 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 1930, 460: 1930, 642: 1930}, + {1929, 1929, 27: 1929, 59: 1929, 61: 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 460: 1929, 642: 1929}, + {98: 3836, 107: 3835, 495: 2644, 724: 2643, 733: 6060, 822: 6059}, // 3605 - {1904, 1904, 27: 1904, 54: 1904, 56: 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 453: 1904, 634: 1904}, - {173: 6055, 6056, 177: 6057, 488: 2642, 552: 6053, 6054, 716: 6052, 909: 6059, 1070: 6060}, - {1916, 1916, 27: 1916, 54: 1916, 56: 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 453: 1916, 634: 1916}, - {1915, 1915, 27: 1915, 54: 1915, 56: 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 453: 1915, 634: 1915}, - {95: 3827, 104: 3826, 488: 2642, 716: 2641, 725: 6063, 814: 6062}, + {1932, 1932, 27: 1932, 59: 1932, 61: 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 1932, 460: 1932, 642: 1932}, + {1931, 1931, 27: 1931, 59: 1931, 61: 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 460: 1931, 642: 1931}, + {495: 2644, 724: 2643, 733: 6062}, + {200: 6063}, + {544: 6064}, // 3610 - {1918, 1918, 27: 1918, 54: 1918, 56: 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 1918, 453: 1918, 634: 1918}, - {1917, 1917, 27: 1917, 54: 1917, 56: 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 1917, 453: 1917, 634: 1917}, - {488: 2642, 716: 2641, 725: 6065}, - {195: 6066}, - {537: 6067}, + {108: 6065}, + {1933, 1933, 27: 1933, 59: 1933, 61: 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 1933, 460: 1933, 642: 1933}, + {463: 6067, 495: 2644, 724: 2643, 733: 6068}, + {1935, 1935, 27: 1935, 59: 1935, 61: 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 1935, 460: 1935, 642: 1935}, + {1934, 1934, 27: 1934, 59: 1934, 61: 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 1934, 460: 1934, 642: 1934}, // 3615 - {105: 6068}, - {1919, 1919, 27: 1919, 54: 1919, 56: 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 1919, 453: 1919, 634: 1919}, - {456: 6070, 488: 2642, 716: 2641, 725: 6071}, - {1921, 1921, 27: 1921, 54: 1921, 56: 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 1921, 453: 1921, 634: 1921}, - {1920, 1920, 27: 1920, 54: 1920, 56: 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 1920, 453: 1920, 634: 1920}, + {463: 6071, 495: 2644, 724: 2643, 733: 6070}, + {1936, 1936, 27: 1936, 59: 1936, 61: 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 1936, 105: 3358, 3354, 108: 3351, 3366, 111: 3353, 3350, 3352, 3356, 3357, 3362, 3361, 3360, 3364, 3365, 3359, 3363, 3355, 460: 1936, 642: 1936, 795: 6072}, + {1937, 1937, 27: 1937, 59: 1937, 61: 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 1937, 460: 1937, 642: 1937}, + {292: 6073}, + {1938, 1938, 27: 1938, 59: 1938, 61: 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 1938, 460: 1938, 642: 1938}, // 3620 - {456: 6074, 488: 2642, 716: 2641, 725: 6073}, - {1922, 1922, 27: 1922, 54: 1922, 56: 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 1922, 102: 3349, 3345, 105: 3342, 3357, 108: 3344, 3341, 3343, 3347, 3348, 3353, 3352, 3351, 3355, 3356, 3350, 3354, 3346, 453: 1922, 634: 1922, 788: 6075}, - {1923, 1923, 27: 1923, 54: 1923, 56: 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 1923, 453: 1923, 634: 1923}, - {286: 6076}, - {1924, 1924, 27: 1924, 54: 1924, 56: 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 453: 1924, 634: 1924}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 476: 6077, 493: 6078, 652: 3385, 2670, 2671, 2669, 727: 6076, 1286: 6075}, + {1939, 1939, 27: 1939, 59: 1939, 61: 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 1939, 460: 1939, 642: 1939}, + {246, 246, 27: 246, 59: 246, 61: 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 460: 246, 642: 246}, + {245, 245, 27: 245, 59: 245, 61: 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 460: 245, 642: 245}, + {244, 244, 27: 244, 59: 244, 61: 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 460: 244, 642: 244}, // 3625 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 470: 6080, 487: 6081, 640: 3376, 2668, 2669, 2667, 720: 6079, 1284: 6078}, - {1925, 1925, 27: 1925, 54: 1925, 56: 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 453: 1925, 634: 1925}, - {246, 246, 27: 246, 54: 246, 56: 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 453: 246, 634: 246}, - {245, 245, 27: 245, 54: 245, 56: 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 453: 245, 634: 245}, - {244, 244, 27: 244, 54: 244, 56: 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 453: 244, 634: 244}, + {463: 6080}, + {1940, 1940, 27: 1940, 59: 1940, 61: 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 1940, 460: 1940, 642: 1940}, + {495: 2644, 559: 6050, 6051, 724: 6049, 914: 6082}, + {1941, 1941, 27: 1941, 59: 1941, 61: 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 1941, 460: 1941, 642: 1941}, + {495: 2644, 724: 2643, 733: 6084}, // 3630 - {456: 6083}, - {1926, 1926, 27: 1926, 54: 1926, 56: 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 1926, 453: 1926, 634: 1926}, - {488: 2642, 552: 6053, 6054, 716: 6052, 909: 6085}, - {1927, 1927, 27: 1927, 54: 1927, 56: 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 1927, 453: 1927, 634: 1927}, - {488: 2642, 716: 2641, 725: 6087}, + {1942, 1942, 27: 1942, 59: 1942, 61: 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 1942, 460: 1942, 642: 1942}, + {2: 1943, 1943, 1943, 1943, 1943, 8: 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 58: 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 1943, 463: 1943, 476: 1943, 484: 1943, 493: 1943}, + {639: 6087}, + {463: 6088}, + {1961, 1961, 27: 1961, 59: 1961, 61: 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 460: 1961, 642: 1961, 885: 6089}, // 3635 - {1928, 1928, 27: 1928, 54: 1928, 56: 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 453: 1928, 634: 1928}, - {2: 1929, 1929, 1929, 1929, 1929, 8: 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 54: 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 1929, 456: 1929, 470: 1929, 478: 1929, 487: 1929}, - {632: 6090}, - {456: 6091}, - {1947, 1947, 27: 1947, 54: 1947, 56: 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 453: 1947, 634: 1947, 874: 6092}, + {1968, 1968, 27: 6044, 59: 6020, 61: 6040, 6033, 6023, 6019, 6027, 6031, 6043, 6026, 6032, 6030, 6028, 6041, 6034, 6022, 6042, 6021, 6024, 6025, 6029, 460: 6035, 642: 6045, 881: 6037, 6036, 6039, 6018, 886: 6038}, + {1983, 1983, 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4033, 2670, 2671, 2669, 732: 6115}, + {1981, 1981}, + {37: 6113}, + {1720, 1720, 1720, 1720, 1720, 1720, 1720, 8: 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 58: 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 484: 6096, 641: 1720}, // 3640 - {1954, 1954, 27: 6047, 54: 6023, 56: 6043, 6036, 6026, 6022, 6030, 6034, 6046, 6029, 6035, 6033, 6031, 6044, 6037, 6025, 6045, 6024, 6027, 6028, 6032, 453: 6038, 634: 6048, 870: 6040, 6039, 6042, 6021, 875: 6041}, - {1969, 1969, 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4023, 2668, 2669, 2667, 724: 6118}, - {1967, 1967}, - {37: 6116}, - {1710, 1710, 1710, 1710, 1710, 1710, 1710, 8: 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 54: 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 1710, 478: 6099, 633: 1710}, + {461: 2503, 2502, 486: 2501, 493: 2487, 555: 2500, 2486, 633: 2496, 643: 2600, 651: 2616, 698: 2617, 731: 2470, 740: 2618, 2497, 2498, 2499, 2508, 2506, 2505, 2504, 751: 2624, 2623, 2473, 763: 2599, 2471, 768: 2621, 770: 2622, 772: 2620, 782: 2472, 786: 2619, 811: 2625, 840: 6095}, + {1975, 1975}, + {174: 6100, 298: 6103, 314: 6102, 387: 6099, 392: 6104, 463: 6097, 563: 6101, 1184: 6098}, + {461: 2503, 2502, 481: 6109, 486: 2501, 493: 2487, 555: 2500, 2486, 633: 2496, 643: 2600, 651: 2616, 698: 2617, 731: 2470, 740: 2618, 2497, 2498, 2499, 2508, 2506, 2505, 2504, 751: 2624, 2623, 2473, 763: 2599, 2471, 768: 2621, 770: 2622, 772: 2620, 782: 2472, 786: 2619, 811: 2625, 840: 6110}, + {461: 2503, 2502, 481: 6105, 486: 2501, 493: 2487, 555: 2500, 2486, 633: 2496, 643: 2600, 651: 2616, 698: 2617, 731: 2470, 740: 2618, 2497, 2498, 2499, 2508, 2506, 2505, 2504, 751: 2624, 2623, 2473, 763: 2599, 2471, 768: 2621, 770: 2622, 772: 2620, 782: 2472, 786: 2619, 811: 2625, 840: 6106}, // 3645 - {454: 2501, 2500, 481: 2499, 487: 2485, 549: 2484, 2498, 628: 2494, 635: 2598, 646: 2614, 690: 2615, 726: 2468, 733: 2616, 2495, 2496, 2497, 2506, 739: 2504, 2503, 2502, 745: 2622, 2621, 2471, 761: 2597, 2469, 769: 2619, 771: 2620, 2618, 785: 2470, 790: 2617, 802: 2623, 829: 6098}, - {1961, 1961}, - {170: 6103, 292: 6106, 308: 6105, 384: 6102, 389: 6107, 456: 6100, 554: 6104, 1181: 6101}, - {454: 2501, 2500, 474: 6112, 481: 2499, 487: 2485, 549: 2484, 2498, 628: 2494, 635: 2598, 646: 2614, 690: 2615, 726: 2468, 733: 2616, 2495, 2496, 2497, 2506, 739: 2504, 2503, 2502, 745: 2622, 2621, 2471, 761: 2597, 2469, 769: 2619, 771: 2620, 2618, 785: 2470, 790: 2617, 802: 2623, 829: 6113}, - {454: 2501, 2500, 474: 6108, 481: 2499, 487: 2485, 549: 2484, 2498, 628: 2494, 635: 2598, 646: 2614, 690: 2615, 726: 2468, 733: 2616, 2495, 2496, 2497, 2506, 739: 2504, 2503, 2502, 745: 2622, 2621, 2471, 761: 2597, 2469, 769: 2619, 771: 2620, 2618, 785: 2470, 790: 2617, 802: 2623, 829: 6109}, + {461: 1974, 1974, 481: 1974, 486: 1974, 493: 1974, 555: 1974, 1974, 633: 1974, 643: 1974, 651: 1974, 731: 1974}, + {461: 1973, 1973, 481: 1973, 486: 1973, 493: 1973, 555: 1973, 1973, 633: 1973, 643: 1973, 651: 1973, 731: 1973}, + {461: 1972, 1972, 481: 1972, 486: 1972, 493: 1972, 555: 1972, 1972, 633: 1972, 643: 1972, 651: 1972, 731: 1972}, + {461: 1971, 1971, 481: 1971, 486: 1971, 493: 1971, 555: 1971, 1971, 633: 1971, 643: 1971, 651: 1971, 731: 1971}, + {461: 1970, 1970, 481: 1970, 486: 1970, 493: 1970, 555: 1970, 1970, 633: 1970, 643: 1970, 651: 1970, 731: 1970}, // 3650 - {454: 1960, 1960, 474: 1960, 481: 1960, 487: 1960, 549: 1960, 1960, 628: 1960, 635: 1960, 646: 1960, 726: 1960}, - {454: 1959, 1959, 474: 1959, 481: 1959, 487: 1959, 549: 1959, 1959, 628: 1959, 635: 1959, 646: 1959, 726: 1959}, - {454: 1958, 1958, 474: 1958, 481: 1958, 487: 1958, 549: 1958, 1958, 628: 1958, 635: 1958, 646: 1958, 726: 1958}, - {454: 1957, 1957, 474: 1957, 481: 1957, 487: 1957, 549: 1957, 1957, 628: 1957, 635: 1957, 646: 1957, 726: 1957}, - {454: 1956, 1956, 474: 1956, 481: 1956, 487: 1956, 549: 1956, 1956, 628: 1956, 635: 1956, 646: 1956, 726: 1956}, + {461: 1969, 1969, 481: 1969, 486: 1969, 493: 1969, 555: 1969, 1969, 633: 1969, 643: 1969, 651: 1969, 731: 1969}, + {37: 6107}, + {1976, 1976}, + {495: 2644, 724: 6108}, + {1977, 1977}, // 3655 - {454: 1955, 1955, 474: 1955, 481: 1955, 487: 1955, 549: 1955, 1955, 628: 1955, 635: 1955, 646: 1955, 726: 1955}, - {37: 6110}, - {1962, 1962}, - {488: 2642, 716: 6111}, - {1963, 1963}, + {37: 6111}, + {1978, 1978}, + {495: 2644, 724: 6112}, + {1979, 1979}, + {495: 2644, 724: 6114}, // 3660 - {37: 6114}, - {1964, 1964}, - {488: 2642, 716: 6115}, - {1965, 1965}, - {488: 2642, 716: 6117}, + {1980, 1980}, + {1982, 1982}, + {1990, 1990}, + {484: 6139}, + {82: 2464, 145: 2466, 151: 2492, 153: 2463, 379: 6135, 461: 2503, 2502, 486: 2501, 493: 2487, 500: 6121, 555: 2500, 2486, 633: 2496, 643: 2600, 698: 6119, 731: 2470, 740: 6120, 2497, 2498, 2499, 2508, 2506, 2505, 2504, 751: 6127, 6126, 2473, 763: 2599, 2471, 768: 6124, 770: 6125, 772: 6123, 782: 2472, 786: 6122, 798: 6133, 833: 6129, 836: 6130, 847: 6128, 851: 6131, 6132, 907: 6134}, // 3665 - {1966, 1966}, - {1968, 1968}, - {1974, 1974}, - {478: 6136}, - {444, 444, 461: 775, 471: 775, 775, 475: 2634, 480: 2635, 484: 2631, 748: 3774, 3775}, + {449, 449, 468: 781, 478: 781, 781, 482: 2636, 490: 2637, 492: 2633, 755: 3783, 3784}, + {451, 451, 468: 782, 478: 782, 782}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 5507, 5512, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 5510, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 5509, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 5514, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 5508, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 5515, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 5511, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 488: 3729, 557: 5521, 576: 5520, 636: 3727, 652: 5518, 2670, 2671, 2669, 761: 5522, 819: 5519, 962: 5523, 1137: 5516}, + {456, 456}, + {455, 455}, // 3670 - {446, 446, 461: 776, 471: 776, 776}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 5511, 5516, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 5514, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 5513, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 5518, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 5512, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 5519, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 5515, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 485: 3720, 548: 5525, 569: 5524, 629: 3718, 640: 5522, 2668, 2669, 2667, 754: 5526, 811: 5523, 958: 5527, 1134: 5520}, - {451, 451}, + {454, 454}, + {453, 453}, + {452, 452}, {450, 450}, - {449, 449}, - // 3675 {448, 448}, + // 3675 {447, 447}, + {446, 446}, {445, 445}, - {443, 443}, - {442, 442}, + {444, 444}, + {32: 5024}, // 3680 - {441, 441}, - {440, 440}, - {439, 439}, - {32: 5028}, - {456: 6137}, + {1988, 1988}, + {484: 6136}, + {463: 6137}, + {82: 2464, 145: 2466, 151: 2492, 153: 2463, 461: 2503, 2502, 486: 2501, 493: 2487, 500: 6121, 555: 2500, 2486, 633: 2496, 643: 2600, 698: 6119, 731: 2470, 740: 6120, 2497, 2498, 2499, 2508, 2506, 2505, 2504, 751: 6127, 6126, 2473, 763: 2599, 2471, 768: 6124, 770: 6125, 772: 6123, 782: 2472, 786: 6122, 798: 6133, 833: 6129, 836: 6130, 847: 6128, 851: 6131, 6132, 907: 6138}, + {1987, 1987}, // 3685 - {77: 2462, 156: 2464, 161: 2490, 164: 2461, 454: 2501, 2500, 481: 2499, 487: 2485, 493: 6123, 549: 2484, 2498, 628: 2494, 635: 2598, 690: 6121, 726: 2468, 733: 6122, 2495, 2496, 2497, 2506, 739: 2504, 2503, 2502, 745: 6129, 6128, 2471, 761: 2597, 2469, 769: 6126, 771: 6127, 6125, 785: 2470, 790: 6124, 808: 6135, 868: 6131, 878: 6132, 883: 6130, 893: 6133, 896: 6134, 1127: 6138}, - {1973, 1973}, - {2000, 2000}, - {1999, 1999}, - {242, 242, 463: 242}, + {463: 6140}, + {82: 2464, 145: 2466, 151: 2492, 153: 2463, 461: 2503, 2502, 486: 2501, 493: 2487, 500: 6121, 555: 2500, 2486, 633: 2496, 643: 2600, 698: 6119, 731: 2470, 740: 6120, 2497, 2498, 2499, 2508, 2506, 2505, 2504, 751: 6127, 6126, 2473, 763: 2599, 2471, 768: 6124, 770: 6125, 772: 6123, 782: 2472, 786: 6122, 798: 6133, 833: 6129, 836: 6130, 847: 6128, 851: 6131, 6132, 907: 6141}, + {1989, 1989}, + {2016, 2016}, + {2015, 2015}, // 3690 - {2: 1015, 1015, 1015, 1015, 1015, 8: 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 54: 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 470: 1015, 479: 1015, 730: 5231, 5230, 5229, 818: 5232, 861: 6143}, - {2: 1003, 1003, 1003, 1003, 1003, 8: 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 54: 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 6145, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 470: 1003, 479: 1003, 1086: 6144}, - {2: 1793, 1793, 1793, 1793, 1793, 8: 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 54: 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 470: 4070, 479: 1793, 832: 6146}, - {2: 1002, 1002, 1002, 1002, 1002, 8: 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 54: 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 470: 1002, 479: 1002}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 479: 6147, 640: 6149, 2668, 2669, 2667, 900: 6150, 947: 6148}, + {242, 242, 470: 242}, + {2: 1022, 1022, 1022, 1022, 1022, 8: 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 58: 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 476: 1022, 489: 1022, 737: 5227, 5226, 5225, 826: 5228, 873: 6146}, + {2: 1010, 1010, 1010, 1010, 1010, 8: 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 58: 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 6148, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 476: 1010, 489: 1010, 1089: 6147}, + {2: 1807, 1807, 1807, 1807, 1807, 8: 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 58: 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 476: 4080, 489: 1807, 843: 6149}, + {2: 1009, 1009, 1009, 1009, 1009, 8: 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 58: 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 1009, 476: 1009, 489: 1009}, // 3695 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 6164, 2668, 2669, 2667, 719: 6162, 900: 6150, 947: 6163}, - {7: 6158, 479: 6157}, - {7: 1005, 463: 1005, 479: 1005, 633: 6152, 885: 6151}, - {7: 1007, 463: 1007, 479: 1007}, - {7: 1009, 463: 1009, 479: 1009}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 489: 6150, 652: 6152, 2670, 2671, 2669, 904: 6153, 951: 6151}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 6167, 2670, 2671, 2669, 726: 6165, 904: 6153, 951: 6166}, + {7: 6161, 489: 6160}, + {7: 1012, 470: 1012, 489: 1012, 641: 6155, 894: 6154}, + {7: 1014, 470: 1014, 489: 1014}, // 3700 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 504: 6154, 640: 6153, 2668, 2669, 2667}, - {7: 1005, 463: 1005, 479: 1005, 633: 6156, 885: 6155}, - {7: 1004, 463: 1004, 479: 1004}, - {7: 1008, 463: 1008, 479: 1008}, - {504: 6154}, + {7: 1016, 470: 1016, 489: 1016}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 511: 6157, 652: 6156, 2670, 2671, 2669}, + {7: 1012, 470: 1012, 489: 1012, 641: 6159, 894: 6158}, + {7: 1011, 470: 1011, 489: 1011}, + {7: 1015, 470: 1015, 489: 1015}, // 3705 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 454: 5243, 558: 5238, 640: 3804, 2668, 2669, 2667, 690: 5242, 719: 5241, 779: 5240, 782: 5239, 5245, 828: 5235, 864: 6160}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 6149, 2668, 2669, 2667, 900: 6159}, - {7: 1006, 463: 1006, 479: 1006}, - {237, 237, 7: 5289, 463: 237, 482: 2628, 773: 2629, 6161}, - {2004, 2004, 463: 2004}, + {511: 6157}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 461: 5239, 567: 5234, 652: 3813, 2670, 2671, 2669, 698: 5238, 726: 5237, 788: 5236, 791: 5235, 5241, 839: 5231, 876: 6163}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 6152, 2670, 2671, 2669, 904: 6162}, + {7: 1013, 470: 1013, 489: 1013}, + {237, 237, 7: 5285, 470: 237, 491: 2630, 779: 2631, 6164}, // 3710 - {882, 882, 882, 882, 882, 882, 882, 8: 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 54: 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 460: 882, 463: 882, 469: 5293, 882, 475: 882, 482: 882, 882, 882, 506: 882, 837: 6170}, - {7: 6158, 463: 6167}, - {1013, 1013, 1013, 1013, 1013, 1013, 1013, 1005, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 54: 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 1013, 460: 1013, 463: 1005, 469: 1013, 1013, 475: 1013, 482: 1013, 1013, 1013, 506: 1013, 633: 6165, 885: 6151}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 504: 6154, 640: 6166, 2668, 2669, 2667}, - {1012, 1012, 1012, 1012, 1012, 1012, 1012, 1005, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 54: 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 460: 1012, 463: 1005, 469: 1012, 1012, 475: 1012, 482: 1012, 1012, 1012, 506: 1012, 633: 6156, 885: 6155}, + {2020, 2020, 470: 2020}, + {889, 889, 889, 889, 889, 889, 889, 8: 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 58: 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 467: 889, 470: 889, 476: 889, 5289, 482: 889, 487: 889, 491: 889, 889, 513: 889, 848: 6173}, + {7: 6161, 470: 6170}, + {1020, 1020, 1020, 1020, 1020, 1020, 1020, 1012, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 58: 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 467: 1020, 470: 1012, 476: 1020, 1020, 482: 1020, 487: 1020, 491: 1020, 1020, 513: 1020, 641: 6168, 894: 6154}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 511: 6157, 652: 6169, 2670, 2671, 2669}, // 3715 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 454: 5243, 558: 5238, 640: 3804, 2668, 2669, 2667, 690: 5242, 719: 5241, 779: 5240, 782: 5239, 5245, 828: 5235, 864: 6168}, - {237, 237, 7: 5289, 482: 2628, 773: 2629, 6169}, - {2003, 2003}, - {880, 880, 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 460: 5250, 463: 880, 470: 880, 475: 880, 482: 880, 880, 880, 506: 880, 640: 5249, 2668, 2669, 2667, 898: 5248, 6171}, - {861, 861, 463: 861, 470: 5303, 475: 861, 482: 861, 5304, 861, 506: 5302, 922: 5306, 5305, 1038: 5307, 6172}, + {1019, 1019, 1019, 1019, 1019, 1019, 1019, 1012, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 58: 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 1019, 467: 1019, 470: 1012, 476: 1019, 1019, 482: 1019, 487: 1019, 491: 1019, 1019, 513: 1019, 641: 6159, 894: 6158}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 461: 5239, 567: 5234, 652: 3813, 2670, 2671, 2669, 698: 5238, 726: 5237, 788: 5236, 791: 5235, 5241, 839: 5231, 876: 6171}, + {237, 237, 7: 5285, 491: 2630, 779: 2631, 6172}, + {2019, 2019}, + {887, 887, 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 467: 5246, 470: 887, 476: 887, 482: 887, 487: 887, 491: 887, 887, 513: 887, 652: 5245, 2670, 2671, 2669, 902: 5244, 6174}, // 3720 - {237, 237, 463: 237, 475: 237, 482: 2628, 484: 237, 773: 2629, 6173}, - {1253, 1253, 463: 1253, 475: 1253, 484: 2631, 748: 2632, 792: 6174}, - {843, 843, 463: 843, 475: 5353, 1047: 6175}, - {2005, 2005, 463: 2005}, - {2006, 2006, 7: 3475}, + {868, 868, 470: 868, 476: 5299, 482: 868, 487: 5300, 491: 868, 868, 513: 5298, 927: 5302, 5301, 1043: 5303, 6175}, + {237, 237, 470: 237, 482: 237, 491: 2630, 237, 779: 2631, 6176}, + {1260, 1260, 470: 1260, 482: 1260, 492: 2633, 755: 2634, 800: 6177}, + {850, 850, 470: 850, 482: 5349, 1052: 6178}, + {2021, 2021, 470: 2021}, // 3725 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 6250, 2668, 2669, 2667}, - {2: 1797, 1797, 1797, 1797, 1797, 8: 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 54: 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 547: 4297, 758: 6248}, - {2: 1797, 1797, 1797, 1797, 1797, 8: 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 54: 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 547: 4297, 758: 6239}, - {107: 5367, 550: 5366, 1123: 6235}, - {149: 568, 153: 5416}, + {2022, 2022, 7: 3484}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 6253, 2670, 2671, 2669}, + {2: 1811, 1811, 1811, 1811, 1811, 8: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 58: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 554: 4350, 767: 6251}, + {2: 1811, 1811, 1811, 1811, 1811, 8: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 58: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 554: 4350, 767: 6242}, + {110: 5363, 555: 5362, 1127: 6238}, // 3730 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 547: 6230, 640: 3804, 2668, 2669, 2667, 719: 3805, 778: 6229}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 547: 6226, 551: 5125, 640: 3376, 2668, 2669, 2667, 720: 5124, 755: 5126, 843: 6225}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 5545, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 5550, 547: 6222, 640: 3376, 2668, 2669, 2667, 720: 5079, 781: 5552, 800: 5553, 5551, 839: 6221}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 6217}, - {2: 1797, 1797, 1797, 1797, 1797, 8: 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 54: 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 547: 4297, 758: 6215}, + {154: 573, 159: 5412}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 554: 6233, 652: 3813, 2670, 2671, 2669, 726: 3814, 785: 6232}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 554: 6229, 558: 5121, 652: 3385, 2670, 2671, 2669, 727: 5120, 762: 5122, 855: 6228}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 5541, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 5546, 554: 6225, 652: 3385, 2670, 2671, 2669, 727: 5075, 790: 5548, 809: 5549, 5547, 850: 6224}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 6220}, // 3735 - {149: 6195}, - {134: 6192}, - {2: 1797, 1797, 1797, 1797, 1797, 8: 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 54: 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 547: 4297, 758: 6190}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 3805, 778: 6191}, - {26, 26, 7: 3807}, + {2: 1811, 1811, 1811, 1811, 1811, 8: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 58: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 554: 4350, 767: 6218}, + {154: 6198}, + {157: 6195}, + {2: 1811, 1811, 1811, 1811, 1811, 8: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 58: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 554: 4350, 767: 6193}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 3814, 785: 6194}, // 3740 - {2: 1797, 1797, 1797, 1797, 1797, 8: 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 54: 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 547: 4297, 758: 6193}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4877, 2668, 2669, 2667, 860: 6194}, + {26, 26, 7: 3816}, + {2: 1811, 1811, 1811, 1811, 1811, 8: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 58: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 554: 4350, 767: 6196}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4870, 2670, 2671, 2669, 872: 6197}, {53, 53}, - {474: 6196}, - {454: 2501, 2500, 481: 2499, 487: 2485, 549: 2484, 2498, 628: 2494, 635: 2598, 690: 6199, 726: 6197, 733: 6200, 2495, 2496, 2497, 2506, 739: 2504, 2503, 2502, 745: 6202, 6201, 6198, 761: 2597, 6204, 769: 6205, 771: 6206, 6203, 869: 6207}, + {481: 6199}, // 3745 - {2: 813, 813, 813, 813, 813, 8: 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 54: 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 813, 470: 813, 479: 813, 730: 813, 813, 813, 738: 5226, 842: 5227, 901: 6210}, - {454: 2501, 481: 2499, 550: 2498, 628: 2494, 635: 2598, 690: 3771, 733: 3770, 2495, 2496, 2497, 2506, 739: 2504, 3772, 3773, 761: 6141}, - {175, 175, 461: 775, 463: 175, 471: 775, 775, 475: 2634, 480: 2635, 484: 2631, 748: 3774, 3775}, - {177, 177, 461: 776, 463: 177, 471: 776, 776}, - {178, 178, 463: 178}, + {461: 2503, 2502, 486: 2501, 493: 2487, 555: 2500, 2486, 633: 2496, 643: 2600, 698: 6202, 731: 6200, 740: 6203, 2497, 2498, 2499, 2508, 2506, 2505, 2504, 751: 6205, 6204, 6201, 763: 2599, 6207, 768: 6208, 770: 6209, 772: 6206, 880: 6210}, + {2: 820, 820, 820, 820, 820, 8: 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 58: 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 820, 476: 820, 489: 820, 737: 820, 820, 820, 748: 5222, 854: 5223, 905: 6213}, + {461: 2503, 486: 2501, 555: 2500, 633: 2496, 643: 2600, 698: 3780, 740: 3779, 2497, 2498, 2499, 2508, 2506, 3781, 3782, 763: 6144}, + {175, 175, 468: 781, 470: 175, 478: 781, 781, 482: 2636, 490: 2637, 492: 2633, 755: 3783, 3784}, + {177, 177, 468: 782, 470: 177, 478: 782, 782}, // 3750 - {176, 176, 463: 176}, - {174, 174, 463: 174}, - {173, 173, 463: 173}, - {172, 172, 463: 172}, - {171, 171, 463: 171}, + {178, 178, 470: 178}, + {176, 176, 470: 176}, + {174, 174, 470: 174}, + {173, 173, 470: 173}, + {172, 172, 470: 172}, // 3755 - {169, 169, 463: 6208}, - {454: 2501, 2500, 481: 2499, 487: 2485, 549: 2484, 2498, 628: 2494, 635: 2598, 690: 6199, 726: 6197, 733: 6200, 2495, 2496, 2497, 2506, 739: 2504, 2503, 2502, 745: 6202, 6201, 6198, 761: 2597, 6204, 769: 6205, 771: 6206, 6203, 869: 6209}, + {171, 171, 470: 171}, + {169, 169, 470: 6211}, + {461: 2503, 2502, 486: 2501, 493: 2487, 555: 2500, 2486, 633: 2496, 643: 2600, 698: 6202, 731: 6200, 740: 6203, 2497, 2498, 2499, 2508, 2506, 2505, 2504, 751: 6205, 6204, 6201, 763: 2599, 6207, 768: 6208, 770: 6209, 772: 6206, 880: 6212}, {168, 168}, - {2: 1015, 1015, 1015, 1015, 1015, 8: 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 54: 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 1015, 470: 1015, 479: 1015, 730: 5231, 5230, 5229, 818: 5232, 861: 6211}, - {2: 1003, 1003, 1003, 1003, 1003, 8: 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 54: 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 6145, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 470: 1003, 479: 1003, 1086: 6212}, + {2: 1022, 1022, 1022, 1022, 1022, 8: 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 58: 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022, 476: 1022, 489: 1022, 737: 5227, 5226, 5225, 826: 5228, 873: 6214}, // 3760 - {2: 1793, 1793, 1793, 1793, 1793, 8: 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 54: 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 470: 4070, 479: 1793, 832: 6213}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 479: 6214, 640: 6149, 2668, 2669, 2667, 900: 6150, 947: 6148}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 6162}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 6216, 2668, 2669, 2667}, - {1898, 1898}, + {2: 1010, 1010, 1010, 1010, 1010, 8: 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 58: 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 6148, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 1010, 476: 1010, 489: 1010, 1089: 6215}, + {2: 1807, 1807, 1807, 1807, 1807, 8: 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 58: 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807, 476: 4080, 489: 1807, 843: 6216}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 489: 6217, 652: 6152, 2670, 2671, 2669, 904: 6153, 951: 6151}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 6165}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 6219, 2670, 2671, 2669}, // 3765 - {1985, 1985, 157: 6219, 469: 6218}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4588, 2668, 2669, 2667, 770: 6220}, - {1983, 1983}, - {1984, 1984, 7: 4589}, - {1987, 1987, 7: 5554}, + {1912, 1912}, + {2001, 2001, 162: 6222, 477: 6221}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4634, 2670, 2671, 2669, 778: 6223}, + {1999, 1999}, + {2000, 2000, 7: 4635}, // 3770 - {564: 6223}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 5545, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 5550, 640: 3376, 2668, 2669, 2667, 720: 5079, 781: 5552, 800: 5553, 5551, 839: 6224}, - {1986, 1986, 7: 5554}, - {1989, 1989, 7: 5128}, - {564: 6227}, + {2003, 2003, 7: 5550}, + {572: 6226}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 5541, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 5546, 652: 3385, 2670, 2671, 2669, 727: 5075, 790: 5548, 809: 5549, 5547, 850: 6227}, + {2002, 2002, 7: 5550}, + {2005, 2005, 7: 5124}, // 3775 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 551: 5125, 640: 3376, 2668, 2669, 2667, 720: 5124, 755: 5126, 843: 6228}, - {1988, 1988, 7: 5128}, - {1982, 1982, 7: 3807, 651: 4704, 653: 4703, 892: 6234}, - {564: 6231}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 3805, 778: 6232}, + {572: 6230}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 558: 5121, 652: 3385, 2670, 2671, 2669, 727: 5120, 762: 5122, 855: 6231}, + {2004, 2004, 7: 5124}, + {1998, 1998, 7: 3816, 659: 4686, 661: 4685, 898: 6237}, + {572: 6234}, // 3780 - {1982, 1982, 7: 3807, 651: 4704, 653: 4703, 892: 6233}, - {1990, 1990}, - {1991, 1991}, - {2: 1797, 1797, 1797, 1797, 1797, 8: 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 54: 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 547: 4297, 758: 6236}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 3805, 778: 6237}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 3814, 785: 6235}, + {1998, 1998, 7: 3816, 659: 4686, 661: 4685, 898: 6236}, + {2006, 2006}, + {2007, 2007}, + {2: 1811, 1811, 1811, 1811, 1811, 8: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 58: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 554: 4350, 767: 6239}, // 3785 - {1982, 1982, 7: 3807, 651: 4704, 653: 4703, 892: 6238}, - {1995, 1995}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 6240, 2668, 2669, 2667}, - {453: 6241}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 6242}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 3814, 785: 6240}, + {1998, 1998, 7: 3816, 659: 4686, 661: 4685, 898: 6241}, + {2011, 2011}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 6243, 2670, 2671, 2669}, + {460: 6244}, // 3790 - {2124, 2124, 87: 4124, 477: 4125, 845: 6244, 856: 6243, 1040: 6245}, - {2123, 2123, 87: 4124, 845: 6247}, - {2122, 2122, 477: 4125, 856: 6246}, - {1996, 1996}, - {2120, 2120}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 6245}, + {2140, 2140, 92: 4134, 485: 4135, 857: 6247, 869: 6246, 1045: 6248}, + {2139, 2139, 92: 4134, 857: 6250}, + {2138, 2138, 485: 4135, 869: 6249}, + {2012, 2012}, // 3795 - {2121, 2121}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5224, 2668, 2669, 2667, 796: 6249}, - {1997, 1997}, - {2132, 2132}, - {2: 1795, 1795, 1795, 1795, 1795, 8: 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 54: 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 547: 4745, 764: 6434}, + {2136, 2136}, + {2137, 2137}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5220, 2670, 2671, 2669, 804: 6252}, + {2013, 2013}, + {2148, 2148}, // 3800 - {630: 6422}, - {630: 2118}, - {630: 2117}, - {630: 2116}, - {2: 1795, 1795, 1795, 1795, 1795, 8: 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 54: 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 547: 4745, 764: 6404}, + {2: 1809, 1809, 1809, 1809, 1809, 8: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 58: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 554: 4710, 774: 6437}, + {637: 6425}, + {637: 2134}, + {637: 2133}, + {637: 2132}, // 3805 - {87: 6366, 94: 2023, 137: 2023, 649: 2023, 1306: 6365}, - {487: 6364}, - {2: 1795, 1795, 1795, 1795, 1795, 8: 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 54: 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 547: 4745, 764: 6352}, - {2: 1795, 1795, 1795, 1795, 1795, 8: 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 54: 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 456: 1795, 547: 4745, 551: 1795, 764: 6320}, - {2: 1795, 1795, 1795, 1795, 1795, 8: 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 54: 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 456: 1795, 547: 4745, 764: 6314}, + {2: 1809, 1809, 1809, 1809, 1809, 8: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 58: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 554: 4710, 774: 6407}, + {16: 6361, 92: 6360, 99: 2039, 139: 2039, 657: 2039, 1308: 6359}, + {493: 6358}, + {2: 1809, 1809, 1809, 1809, 1809, 8: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 58: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 554: 4710, 774: 6346}, + {2: 1809, 1809, 1809, 1809, 1809, 8: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 58: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 463: 1809, 554: 4710, 558: 1809, 774: 6314}, // 3810 - {149: 6309}, - {134: 6301}, - {2: 1795, 1795, 1795, 1795, 1795, 8: 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 54: 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 547: 4745, 764: 6265}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 6266}, - {49, 49, 4: 49, 49, 49, 13: 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 76: 6274, 6271, 6277, 6278, 6279, 6272, 6270, 6280, 6276, 6273, 459: 49, 461: 49, 49, 483: 49, 485: 49, 629: 49, 49, 638: 6275, 895: 6269, 1171: 6267, 1264: 6268}, + {2: 1809, 1809, 1809, 1809, 1809, 8: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 58: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 463: 1809, 554: 4710, 774: 6308}, + {154: 6303}, + {2: 1809, 1809, 1809, 1809, 1809, 8: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 58: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 554: 4710, 774: 6267}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 6268}, + {49, 49, 4: 49, 49, 49, 13: 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 81: 6276, 6273, 6279, 6280, 6281, 6274, 6272, 6282, 6278, 6275, 466: 49, 468: 49, 49, 487: 49, 49, 636: 49, 49, 646: 6277, 900: 6271, 1174: 6269, 1266: 6270}, // 3815 - {385, 385, 4: 4130, 4132, 389, 13: 4081, 2096, 4149, 4076, 4088, 4083, 4077, 4082, 4085, 4079, 4075, 4080, 4084, 4078, 4147, 4162, 4151, 4138, 4131, 4134, 4133, 4136, 4137, 4139, 4146, 389, 4144, 4145, 4150, 4152, 4159, 4158, 4164, 4160, 4157, 4155, 4154, 4156, 4148, 459: 4129, 461: 4161, 2096, 483: 4641, 485: 2096, 629: 2096, 4135, 753: 4086, 757: 4087, 759: 4140, 775: 4142, 793: 4141, 815: 4143, 819: 4153, 822: 4163, 902: 5438, 996: 6300}, - {48, 48, 4: 48, 48, 48, 13: 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 76: 6274, 6271, 6277, 6278, 6279, 6272, 6270, 6280, 6276, 6273, 459: 48, 461: 48, 48, 483: 48, 485: 48, 629: 48, 48, 638: 6275, 895: 6299}, - {47, 47, 4: 47, 47, 47, 13: 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 76: 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 459: 47, 461: 47, 47, 483: 47, 485: 47, 629: 47, 47, 638: 47}, - {466: 1977, 1977, 478: 4165, 488: 1977, 644: 6296, 717: 6295}, - {455: 6292, 466: 1977, 1977, 478: 4165, 488: 1977, 717: 6291}, + {385, 385, 4: 4140, 4142, 389, 13: 2112, 4159, 4086, 4098, 4091, 4093, 4087, 4092, 4095, 4089, 4085, 4090, 4094, 4088, 4157, 4177, 4161, 4148, 4141, 4144, 4143, 4146, 4147, 4149, 4156, 389, 4167, 4168, 4154, 4155, 4160, 4162, 4174, 4173, 4179, 4175, 4172, 4165, 4170, 4171, 4164, 4166, 4169, 4158, 466: 4139, 468: 4176, 2112, 487: 4853, 2112, 636: 2112, 4145, 760: 4096, 766: 4097, 769: 4150, 781: 4152, 801: 4151, 823: 4153, 827: 4163, 831: 4178, 906: 5434, 1001: 6302}, + {48, 48, 4: 48, 48, 48, 13: 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 81: 6276, 6273, 6279, 6280, 6281, 6274, 6272, 6282, 6278, 6275, 466: 48, 468: 48, 48, 487: 48, 48, 636: 48, 48, 646: 6277, 900: 6301}, + {47, 47, 4: 47, 47, 47, 13: 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 81: 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 466: 47, 468: 47, 47, 487: 47, 47, 636: 47, 47, 646: 47}, + {473: 1993, 1993, 484: 4180, 495: 1993, 648: 6298, 725: 6297}, + {462: 6294, 473: 1993, 1993, 484: 4180, 495: 1993, 725: 6293}, // 3820 - {466: 1977, 1977, 478: 4165, 488: 1977, 717: 6289}, - {40, 40, 4: 40, 40, 40, 13: 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 76: 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 459: 40, 461: 40, 40, 483: 40, 485: 40, 629: 40, 40, 638: 40}, - {78: 6287, 80: 6288, 6285, 638: 6286}, - {466: 1977, 1977, 478: 4165, 488: 1977, 717: 6283}, - {37, 37, 4: 37, 37, 37, 13: 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 76: 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 459: 37, 461: 37, 37, 483: 37, 485: 37, 629: 37, 37, 638: 37}, + {473: 1993, 1993, 484: 4180, 495: 1993, 725: 6291}, + {40, 40, 4: 40, 40, 40, 13: 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 81: 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 466: 40, 468: 40, 40, 487: 40, 40, 636: 40, 40, 646: 40}, + {83: 6289, 85: 6290, 6287, 646: 6288}, + {473: 1993, 1993, 484: 4180, 495: 1993, 725: 6285}, + {37, 37, 4: 37, 37, 37, 13: 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 81: 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 466: 37, 468: 37, 37, 487: 37, 37, 636: 37, 37, 646: 37}, // 3825 - {466: 1977, 1977, 478: 4165, 488: 1977, 717: 6281}, - {34, 34, 4: 34, 34, 34, 13: 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 76: 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 459: 34, 461: 34, 34, 483: 34, 485: 34, 629: 34, 34, 638: 34}, - {32, 32, 4: 32, 32, 32, 13: 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 76: 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 459: 32, 461: 32, 32, 483: 32, 485: 32, 629: 32, 32, 638: 32}, - {31, 31, 4: 31, 31, 31, 13: 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 76: 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 459: 31, 461: 31, 31, 483: 31, 485: 31, 629: 31, 31, 638: 31}, - {466: 3937, 3936, 488: 2642, 716: 3933, 743: 3935, 794: 6282}, + {473: 1993, 1993, 484: 4180, 495: 1993, 725: 6283}, + {34, 34, 4: 34, 34, 34, 13: 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 81: 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 466: 34, 468: 34, 34, 487: 34, 34, 636: 34, 34, 646: 34}, + {32, 32, 4: 32, 32, 32, 13: 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 81: 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 466: 32, 468: 32, 32, 487: 32, 32, 636: 32, 32, 646: 32}, + {31, 31, 4: 31, 31, 31, 13: 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 81: 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 466: 31, 468: 31, 31, 487: 31, 31, 636: 31, 31, 646: 31}, + {473: 3947, 3946, 495: 2644, 724: 3943, 750: 3945, 802: 6284}, // 3830 - {35, 35, 4: 35, 35, 35, 13: 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 76: 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 459: 35, 461: 35, 35, 483: 35, 485: 35, 629: 35, 35, 638: 35}, - {466: 3937, 3936, 488: 2642, 716: 3933, 743: 3935, 794: 6284}, - {38, 38, 4: 38, 38, 38, 13: 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 76: 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 459: 38, 461: 38, 38, 483: 38, 485: 38, 629: 38, 38, 638: 38}, - {39, 39, 4: 39, 39, 39, 13: 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 76: 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 459: 39, 461: 39, 39, 483: 39, 485: 39, 629: 39, 39, 638: 39}, - {36, 36, 4: 36, 36, 36, 13: 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 76: 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 459: 36, 461: 36, 36, 483: 36, 485: 36, 629: 36, 36, 638: 36}, + {35, 35, 4: 35, 35, 35, 13: 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 81: 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 466: 35, 468: 35, 35, 487: 35, 35, 636: 35, 35, 646: 35}, + {473: 3947, 3946, 495: 2644, 724: 3943, 750: 3945, 802: 6286}, + {38, 38, 4: 38, 38, 38, 13: 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 81: 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 466: 38, 468: 38, 38, 487: 38, 38, 636: 38, 38, 646: 38}, + {39, 39, 4: 39, 39, 39, 13: 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 81: 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 466: 39, 468: 39, 39, 487: 39, 39, 636: 39, 39, 646: 39}, + {36, 36, 4: 36, 36, 36, 13: 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 81: 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 466: 36, 468: 36, 36, 487: 36, 36, 636: 36, 36, 646: 36}, // 3835 - {33, 33, 4: 33, 33, 33, 13: 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 76: 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 459: 33, 461: 33, 33, 483: 33, 485: 33, 629: 33, 33, 638: 33}, - {30, 30, 4: 30, 30, 30, 13: 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 76: 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 459: 30, 461: 30, 30, 483: 30, 485: 30, 629: 30, 30, 638: 30}, - {466: 3937, 3936, 488: 2642, 716: 3933, 743: 3935, 794: 6290}, - {41, 41, 4: 41, 41, 41, 13: 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 76: 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 459: 41, 461: 41, 41, 483: 41, 485: 41, 629: 41, 41, 638: 41}, - {466: 3937, 3936, 488: 2642, 716: 3933, 743: 3935, 794: 6294}, + {33, 33, 4: 33, 33, 33, 13: 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 81: 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 466: 33, 468: 33, 33, 487: 33, 33, 636: 33, 33, 646: 33}, + {30, 30, 4: 30, 30, 30, 13: 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 81: 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 466: 30, 468: 30, 30, 487: 30, 30, 636: 30, 30, 646: 30}, + {473: 3947, 3946, 495: 2644, 724: 3943, 750: 3945, 802: 6292}, + {41, 41, 4: 41, 41, 41, 13: 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 81: 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 466: 41, 468: 41, 41, 487: 41, 41, 636: 41, 41, 646: 41}, + {473: 3947, 3946, 495: 2644, 724: 3943, 750: 3945, 802: 6296}, // 3840 - {466: 3937, 3936, 488: 2642, 716: 3933, 743: 3935, 794: 6293}, - {42, 42, 4: 42, 42, 42, 13: 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 76: 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 459: 42, 461: 42, 42, 483: 42, 485: 42, 629: 42, 42, 638: 42}, - {43, 43, 4: 43, 43, 43, 13: 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 76: 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 459: 43, 461: 43, 43, 483: 43, 485: 43, 629: 43, 43, 638: 43}, - {466: 3937, 3936, 488: 2642, 716: 3933, 743: 3935, 794: 6298}, - {466: 3937, 3936, 488: 2642, 716: 3933, 743: 3935, 794: 6297}, + {473: 3947, 3946, 495: 2644, 724: 3943, 750: 3945, 802: 6295}, + {42, 42, 4: 42, 42, 42, 13: 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 81: 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 466: 42, 468: 42, 42, 487: 42, 42, 636: 42, 42, 646: 42}, + {43, 43, 4: 43, 43, 43, 13: 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 81: 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 466: 43, 468: 43, 43, 487: 43, 43, 636: 43, 43, 646: 43}, + {473: 3947, 3946, 495: 2644, 724: 3943, 750: 3945, 802: 6300}, + {473: 3947, 3946, 495: 2644, 724: 3943, 750: 3945, 802: 6299}, // 3845 - {44, 44, 4: 44, 44, 44, 13: 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 76: 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 459: 44, 461: 44, 44, 483: 44, 485: 44, 629: 44, 44, 638: 44}, - {45, 45, 4: 45, 45, 45, 13: 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 76: 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 459: 45, 461: 45, 45, 483: 45, 485: 45, 629: 45, 45, 638: 45}, - {46, 46, 4: 46, 46, 46, 13: 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 76: 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 459: 46, 461: 46, 46, 483: 46, 485: 46, 629: 46, 46, 638: 46}, + {44, 44, 4: 44, 44, 44, 13: 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 81: 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 466: 44, 468: 44, 44, 487: 44, 44, 636: 44, 44, 646: 44}, + {45, 45, 4: 45, 45, 45, 13: 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 81: 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 466: 45, 468: 45, 45, 487: 45, 45, 636: 45, 45, 646: 45}, + {46, 46, 4: 46, 46, 46, 13: 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 81: 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 466: 46, 468: 46, 46, 487: 46, 46, 636: 46, 46, 646: 46}, {50, 50}, - {2: 1795, 1795, 1795, 1795, 1795, 8: 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 54: 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 547: 4745, 764: 6302}, + {481: 6304}, // 3850 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4877, 2668, 2669, 2667, 860: 6303}, - {13: 4081, 16: 4076, 18: 4083, 4077, 4082, 4085, 4079, 4075, 4080, 4084, 4078, 753: 6304, 1080: 6305}, - {2441, 2441, 7: 2441, 13: 2441, 16: 2441, 18: 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441}, - {52, 52, 7: 6307, 13: 4081, 16: 4076, 18: 4083, 4077, 4082, 4085, 4079, 4075, 4080, 4084, 4078, 753: 6306}, - {2440, 2440, 7: 2440, 13: 2440, 16: 2440, 18: 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440, 2440}, - // 3855 - {13: 4081, 16: 4076, 18: 4083, 4077, 4082, 4085, 4079, 4075, 4080, 4084, 4078, 753: 6308}, - {2439, 2439, 7: 2439, 13: 2439, 16: 2439, 18: 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439, 2439}, - {474: 6310}, - {454: 2501, 2500, 481: 2499, 487: 2485, 549: 2484, 2498, 628: 2494, 635: 2598, 690: 6199, 726: 6197, 733: 6200, 2495, 2496, 2497, 2506, 739: 2504, 2503, 2502, 745: 6202, 6201, 6198, 761: 2597, 6204, 769: 6205, 771: 6206, 6203, 869: 6311}, - {463: 6312}, - // 3860 - {454: 2501, 2500, 481: 2499, 487: 2485, 549: 2484, 2498, 628: 2494, 635: 2598, 690: 6199, 726: 6197, 733: 6200, 2495, 2496, 2497, 2506, 739: 2504, 2503, 2502, 745: 6202, 6201, 6198, 761: 2597, 6204, 769: 6205, 771: 6206, 6203, 869: 6313}, + {461: 2503, 2502, 486: 2501, 493: 2487, 555: 2500, 2486, 633: 2496, 643: 2600, 698: 6202, 731: 6200, 740: 6203, 2497, 2498, 2499, 2508, 2506, 2505, 2504, 751: 6205, 6204, 6201, 763: 2599, 6207, 768: 6208, 770: 6209, 772: 6206, 880: 6305}, + {470: 6306}, + {461: 2503, 2502, 486: 2501, 493: 2487, 555: 2500, 2486, 633: 2496, 643: 2600, 698: 6202, 731: 6200, 740: 6203, 2497, 2498, 2499, 2508, 2506, 2505, 2504, 751: 6205, 6204, 6201, 763: 2599, 6207, 768: 6208, 770: 6209, 772: 6206, 880: 6307}, {170, 170}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 5545, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 5550, 640: 3376, 2668, 2669, 2667, 720: 5079, 781: 5552, 800: 6316, 5551, 1099: 6317, 1259: 6315}, - {232, 232, 7: 6318}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 5541, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 5546, 652: 3385, 2670, 2671, 2669, 727: 5075, 790: 5548, 809: 6310, 5547, 1102: 6311, 1261: 6309}, + // 3855 + {232, 232, 7: 6312}, {181, 181, 7: 181}, - // 3865 {180, 180, 7: 180}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 5545, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 5550, 640: 3376, 2668, 2669, 2667, 720: 5079, 781: 5552, 800: 6316, 5551, 1099: 6319}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 5541, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 5546, 652: 3385, 2670, 2671, 2669, 727: 5075, 790: 5548, 809: 6310, 5547, 1102: 6313}, {179, 179, 7: 179}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 551: 5125, 640: 3376, 2668, 2669, 2667, 720: 5124, 755: 5142, 865: 5143, 904: 6321}, - {215, 215, 7: 5145, 15: 215, 52: 215, 455: 215, 647: 5189, 940: 5188, 6322}, + // 3860 + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 558: 5121, 652: 3385, 2670, 2671, 2669, 727: 5120, 762: 5138, 877: 5139, 909: 6315}, + {215, 215, 7: 5141, 14: 215, 58: 215, 462: 215, 650: 5185, 944: 5184, 6316}, + {223, 223, 14: 223, 58: 223, 462: 6318, 992: 6317}, + {202, 202, 14: 6335, 58: 6333, 937: 6334, 6332, 1082: 6331, 6330}, + {126: 6323, 6321, 6322, 6324, 991: 6320, 1172: 6319}, + // 3865 + {222, 222, 14: 222, 58: 222, 126: 6323, 6321, 6322, 6324, 991: 6329}, + {221, 221, 14: 221, 58: 221, 126: 221, 221, 221, 221}, + {495: 2644, 724: 3943, 750: 6328}, + {495: 2644, 724: 3943, 750: 6327}, + {495: 2644, 724: 3943, 750: 6326}, // 3870 - {223, 223, 15: 223, 52: 223, 455: 6324, 987: 6323}, - {202, 202, 15: 6341, 52: 6339, 932: 6340, 6338, 1078: 6337, 6336}, - {123: 6329, 6327, 6328, 6330, 986: 6326, 1169: 6325}, - {222, 222, 15: 222, 52: 222, 123: 6329, 6327, 6328, 6330, 986: 6335}, - {221, 221, 15: 221, 52: 221, 123: 221, 221, 221, 221}, + {495: 2644, 724: 3943, 750: 6325}, + {216, 216, 14: 216, 58: 216, 126: 216, 216, 216, 216}, + {217, 217, 14: 217, 58: 217, 126: 217, 217, 217, 217}, + {218, 218, 14: 218, 58: 218, 126: 218, 218, 218, 218}, + {219, 219, 14: 219, 58: 219, 126: 219, 219, 219, 219}, // 3875 - {488: 2642, 716: 3933, 743: 6334}, - {488: 2642, 716: 3933, 743: 6333}, - {488: 2642, 716: 3933, 743: 6332}, - {488: 2642, 716: 3933, 743: 6331}, - {216, 216, 15: 216, 52: 216, 123: 216, 216, 216, 216}, - // 3880 - {217, 217, 15: 217, 52: 217, 123: 217, 217, 217, 217}, - {218, 218, 15: 218, 52: 218, 123: 218, 218, 218, 218}, - {219, 219, 15: 219, 52: 219, 123: 219, 219, 219, 219}, - {220, 220, 15: 220, 52: 220, 123: 220, 220, 220, 220}, + {220, 220, 14: 220, 58: 220, 126: 220, 220, 220, 220}, {233, 233}, + {201, 201, 14: 6335, 58: 6333, 937: 6334, 6345}, + {200, 200, 14: 200, 58: 200}, + {485: 6344, 957: 6343}, + // 3880 + {196, 196, 14: 196, 58: 196, 202: 6339, 466: 6340, 569: 6338}, + {320: 6336}, + {191, 191, 14: 191, 58: 191, 202: 191, 466: 191, 569: 191, 1164: 6337}, + {192, 192, 14: 192, 58: 192, 202: 192, 466: 192, 569: 192}, + {495: 2644, 724: 3943, 750: 6341}, // 3885 - {201, 201, 15: 6341, 52: 6339, 932: 6340, 6351}, - {200, 200, 15: 200, 52: 200}, - {477: 6350, 953: 6349}, - {196, 196, 15: 196, 52: 196, 197: 6345, 459: 6346, 562: 6344}, - {314: 6342}, + {194, 194, 14: 194, 58: 194}, + {193, 193, 14: 193, 58: 193}, + {106: 6342}, + {195, 195, 14: 195, 58: 195}, + {198, 198, 14: 198, 58: 198}, // 3890 - {191, 191, 15: 191, 52: 191, 197: 191, 459: 191, 562: 191, 1161: 6343}, - {192, 192, 15: 192, 52: 192, 197: 192, 459: 192, 562: 192}, - {488: 2642, 716: 3933, 743: 6347}, - {194, 194, 15: 194, 52: 194}, - {193, 193, 15: 193, 52: 193}, + {197, 197, 14: 197, 58: 197}, + {199, 199, 14: 199, 58: 199}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 6347, 2670, 2671, 2669}, + {489: 6348}, + {463: 6349}, // 3895 - {103: 6348}, - {195, 195, 15: 195, 52: 195}, - {198, 198, 15: 198, 52: 198}, - {197, 197, 15: 197, 52: 197}, - {199, 199, 15: 199, 52: 199}, + {1904, 1904, 27: 1904, 59: 1904, 61: 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 137: 6352, 460: 1904, 493: 6351, 642: 1904, 1025: 6350}, + {1961, 1961, 27: 1961, 59: 1961, 61: 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 460: 1961, 642: 1961, 885: 6357}, + {1903, 1903, 27: 1903, 59: 1903, 61: 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 1903, 460: 1903, 642: 1903}, + {192: 6355, 375: 6356, 632: 6354, 640: 6353}, + {1902, 1902, 27: 1902, 59: 1902, 61: 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 1902, 460: 1902, 642: 1902}, // 3900 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 6353, 2668, 2669, 2667}, - {479: 6354}, - {456: 6355}, - {1890, 1890, 27: 1890, 54: 1890, 56: 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 135: 6358, 453: 1890, 487: 6357, 634: 1890, 1020: 6356}, - {1947, 1947, 27: 1947, 54: 1947, 56: 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 453: 1947, 634: 1947, 874: 6363}, + {1901, 1901, 27: 1901, 59: 1901, 61: 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 1901, 460: 1901, 642: 1901}, + {1900, 1900, 27: 1900, 59: 1900, 61: 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900, 460: 1900, 642: 1900}, + {1899, 1899, 27: 1899, 59: 1899, 61: 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 460: 1899, 642: 1899}, + {1916, 1916, 27: 6044, 59: 6020, 61: 6040, 6033, 6023, 6019, 6027, 6031, 6043, 6026, 6032, 6030, 6028, 6041, 6034, 6022, 6042, 6021, 6024, 6025, 6029, 460: 6035, 642: 6045, 881: 6037, 6036, 6039, 6018, 886: 6038}, + {16: 2040, 92: 2040, 99: 2040, 139: 2040, 657: 2040}, // 3905 - {1889, 1889, 27: 1889, 54: 1889, 56: 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 1889, 453: 1889, 634: 1889}, - {187: 6361, 373: 6362, 625: 6360, 718: 6359}, - {1888, 1888, 27: 1888, 54: 1888, 56: 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 1888, 453: 1888, 634: 1888}, - {1887, 1887, 27: 1887, 54: 1887, 56: 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 1887, 453: 1887, 634: 1887}, - {1886, 1886, 27: 1886, 54: 1886, 56: 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 1886, 453: 1886, 634: 1886}, + {99: 2035, 139: 6375, 657: 2035, 1310: 6374}, + {484: 6370}, + {157: 6362}, + {2: 1809, 1809, 1809, 1809, 1809, 8: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 58: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 554: 4710, 774: 6363}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4870, 2670, 2671, 2669, 872: 6364}, // 3910 - {1885, 1885, 27: 1885, 54: 1885, 56: 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 1885, 453: 1885, 634: 1885}, - {1902, 1902, 27: 6047, 54: 6023, 56: 6043, 6036, 6026, 6022, 6030, 6034, 6046, 6029, 6035, 6033, 6031, 6044, 6037, 6025, 6045, 6024, 6027, 6028, 6032, 453: 6038, 634: 6048, 870: 6040, 6039, 6042, 6021, 875: 6041}, - {87: 2024, 94: 2024, 137: 2024, 649: 2024}, - {94: 2019, 137: 6372, 649: 2019, 1308: 6371}, - {478: 6367}, + {15: 4086, 17: 4091, 4093, 4087, 4092, 4095, 4089, 4085, 4090, 4094, 4088, 760: 6365, 1084: 6366}, + {2449, 2449, 7: 2449, 15: 2449, 17: 2449, 2449, 2449, 2449, 2449, 2449, 2449, 2449, 2449, 2449}, + {52, 52, 7: 6368, 15: 4086, 17: 4091, 4093, 4087, 4092, 4095, 4089, 4085, 4090, 4094, 4088, 760: 6367}, + {2448, 2448, 7: 2448, 15: 2448, 17: 2448, 2448, 2448, 2448, 2448, 2448, 2448, 2448, 2448, 2448}, + {15: 4086, 17: 4091, 4093, 4087, 4092, 4095, 4089, 4085, 4090, 4094, 4088, 760: 6369}, // 3915 - {339: 6369, 378: 6370, 388: 6368}, - {94: 2022, 137: 2022, 649: 2022}, - {94: 2021, 137: 2021, 649: 2021}, - {94: 2020, 137: 2020, 649: 2020}, - {94: 2017, 649: 6376, 1311: 6375}, + {2447, 2447, 7: 2447, 15: 2447, 17: 2447, 2447, 2447, 2447, 2447, 2447, 2447, 2447, 2447, 2447}, + {343: 6372, 381: 6373, 391: 6371}, + {99: 2038, 139: 2038, 657: 2038}, + {99: 2037, 139: 2037, 657: 2037}, + {99: 2036, 139: 2036, 657: 2036}, // 3920 - {478: 6373}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 551: 5125, 640: 3376, 2668, 2669, 2667, 720: 5124, 755: 6374}, - {94: 2018, 649: 2018}, - {94: 6380}, - {364: 6377}, + {99: 2033, 657: 6379, 1313: 6378}, + {484: 6376}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 558: 5121, 652: 3385, 2670, 2671, 2669, 727: 5120, 762: 6377}, + {99: 2034, 657: 2034}, + {99: 6383}, // 3925 - {137: 6378, 328: 6379}, - {94: 2016}, - {94: 2015}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 6382, 1310: 6381}, - {454: 6384, 460: 2013, 1309: 6383}, + {368: 6380}, + {139: 6381, 334: 6382}, + {99: 2032}, + {99: 2031}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 6385, 1312: 6384}, // 3930 - {454: 2014, 460: 2014}, - {460: 6390}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 6386, 2668, 2669, 2667, 1163: 6385}, - {7: 6388, 53: 6387}, - {7: 2011, 53: 2011}, + {461: 6387, 467: 2029, 1311: 6386}, + {461: 2030, 467: 2030}, + {467: 6393}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 6389, 2670, 2671, 2669, 1166: 6388}, + {7: 6391, 57: 6390}, // 3935 - {460: 2012}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 6389, 2668, 2669, 2667}, - {7: 2010, 53: 2010}, - {454: 2501, 2500, 481: 2499, 550: 2498, 628: 2494, 690: 6394, 733: 6392, 2495, 2496, 2497, 2506, 739: 2504, 2503, 2502, 745: 6393, 6391, 3763, 1173: 6395}, - {2032, 2032, 455: 2032}, + {7: 2027, 57: 2027}, + {467: 2028}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 6392, 2670, 2671, 2669}, + {7: 2026, 57: 2026}, + {461: 2503, 2502, 486: 2501, 555: 2500, 633: 2496, 698: 6397, 740: 6395, 2497, 2498, 2499, 2508, 2506, 2505, 2504, 751: 6396, 6394, 3772, 1176: 6398}, // 3940 - {2031, 2031, 455: 2031, 461: 776, 471: 776, 776}, - {2030, 2030, 455: 2030}, - {2029, 2029, 455: 2029, 461: 775, 471: 775, 775, 475: 2634, 480: 2635, 484: 2631, 748: 3774, 3775}, - {2009, 2009, 455: 6397, 1307: 6396}, - {2026, 2026}, + {2048, 2048, 462: 2048}, + {2047, 2047, 462: 2047, 468: 782, 478: 782, 782}, + {2046, 2046, 462: 2046}, + {2045, 2045, 462: 2045, 468: 781, 478: 781, 781, 482: 2636, 490: 2637, 492: 2633, 755: 3783, 3784}, + {2025, 2025, 462: 6400, 1309: 6399}, // 3945 - {133: 6399, 296: 6398}, - {566: 6402}, - {566: 6400}, - {884: 6401}, - {2007, 2007}, + {2042, 2042}, + {136: 6402, 302: 6401}, + {573: 6405}, + {573: 6403}, + {893: 6404}, // 3950 - {884: 6403}, - {2008, 2008}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 5224, 2668, 2669, 2667, 796: 6405}, - {2105, 2105, 13: 4081, 2096, 16: 4076, 2096, 4083, 4077, 4082, 4085, 4079, 4075, 4080, 4084, 4078, 28: 2096, 459: 4129, 462: 2096, 485: 2096, 629: 2096, 753: 4086, 757: 4087, 759: 6408, 775: 6407, 826: 6410, 914: 6409, 1174: 6406}, - {2113, 2113}, + {2023, 2023}, + {893: 6406}, + {2024, 2024}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5220, 2670, 2671, 2669, 804: 6408}, + {2121, 2121, 13: 2112, 15: 4086, 2112, 4091, 4093, 4087, 4092, 4095, 4089, 4085, 4090, 4094, 4088, 28: 2112, 466: 4139, 469: 2112, 488: 2112, 636: 2112, 760: 4096, 766: 4097, 769: 6411, 781: 6410, 837: 6413, 919: 6412, 1177: 6409}, // 3955 - {14: 3719, 17: 4088, 28: 6414, 462: 6413, 485: 3720, 629: 3718, 754: 6412, 757: 6415}, - {2106, 2106, 13: 2106, 2106, 16: 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106, 28: 2106, 459: 2106, 462: 2106, 485: 2106, 629: 2106}, - {2104, 2104, 13: 4081, 2096, 16: 4076, 2096, 4083, 4077, 4082, 4085, 4079, 4075, 4080, 4084, 4078, 28: 2096, 459: 4129, 462: 2096, 485: 2096, 629: 2096, 753: 4086, 757: 4087, 759: 6408, 775: 6407, 826: 6411}, - {2103, 2103, 13: 2103, 2103, 16: 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103, 28: 2103, 459: 2103, 462: 2103, 485: 2103, 629: 2103}, - {2102, 2102, 13: 2102, 2102, 16: 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 2102, 28: 2102, 459: 2102, 462: 2102, 485: 2102, 629: 2102}, + {2129, 2129}, + {13: 3728, 16: 4098, 28: 6417, 469: 6416, 488: 3729, 636: 3727, 761: 6415, 766: 6418}, + {2122, 2122, 13: 2122, 15: 2122, 2122, 2122, 2122, 2122, 2122, 2122, 2122, 2122, 2122, 2122, 2122, 28: 2122, 466: 2122, 469: 2122, 488: 2122, 636: 2122}, + {2120, 2120, 13: 2112, 15: 4086, 2112, 4091, 4093, 4087, 4092, 4095, 4089, 4085, 4090, 4094, 4088, 28: 2112, 466: 4139, 469: 2112, 488: 2112, 636: 2112, 760: 4096, 766: 4097, 769: 6411, 781: 6410, 837: 6414}, + {2119, 2119, 13: 2119, 15: 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 2119, 28: 2119, 466: 2119, 469: 2119, 488: 2119, 636: 2119}, // 3960 - {2: 1977, 1977, 1977, 1977, 1977, 8: 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 54: 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 456: 1977, 478: 4165, 524: 1977, 717: 6420}, - {2: 1977, 1977, 1977, 1977, 1977, 8: 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 54: 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 1977, 456: 1977, 478: 4165, 524: 1977, 717: 6418}, - {456: 1977, 478: 4165, 717: 6416}, - {2107, 2107, 13: 2107, 2107, 16: 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 2107, 28: 2107, 459: 2107, 462: 2107, 485: 2107, 629: 2107}, - {456: 4183, 1018: 6417}, + {2118, 2118, 13: 2118, 15: 2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118, 28: 2118, 466: 2118, 469: 2118, 488: 2118, 636: 2118}, + {2: 1993, 1993, 1993, 1993, 1993, 8: 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 58: 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 463: 1993, 484: 4180, 531: 1993, 725: 6423}, + {2: 1993, 1993, 1993, 1993, 1993, 8: 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 58: 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993, 463: 1993, 484: 4180, 531: 1993, 725: 6421}, + {463: 1993, 484: 4180, 725: 6419}, + {2123, 2123, 13: 2123, 15: 2123, 2123, 2123, 2123, 2123, 2123, 2123, 2123, 2123, 2123, 2123, 2123, 28: 2123, 466: 2123, 469: 2123, 488: 2123, 636: 2123}, // 3965 - {2108, 2108, 13: 2108, 2108, 16: 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108, 28: 2108, 459: 2108, 462: 2108, 485: 2108, 629: 2108}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 524: 3374, 640: 3376, 2668, 2669, 2667, 720: 3373, 847: 6419}, - {2109, 2109, 13: 2109, 2109, 16: 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109, 28: 2109, 459: 2109, 462: 2109, 485: 2109, 629: 2109}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 524: 3644, 640: 3376, 2668, 2669, 2667, 720: 3643, 789: 6421}, - {2110, 2110, 13: 2110, 2110, 16: 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110, 28: 2110, 459: 2110, 462: 2110, 485: 2110, 629: 2110}, + {463: 4198, 1023: 6420}, + {2124, 2124, 13: 2124, 15: 2124, 2124, 2124, 2124, 2124, 2124, 2124, 2124, 2124, 2124, 2124, 2124, 28: 2124, 466: 2124, 469: 2124, 488: 2124, 636: 2124}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 531: 3383, 652: 3385, 2670, 2671, 2669, 727: 3382, 859: 6422}, + {2125, 2125, 13: 2125, 15: 2125, 2125, 2125, 2125, 2125, 2125, 2125, 2125, 2125, 2125, 2125, 2125, 28: 2125, 466: 2125, 469: 2125, 488: 2125, 636: 2125}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 531: 3653, 652: 3385, 2670, 2671, 2669, 727: 3652, 796: 6424}, // 3970 - {2: 1795, 1795, 1795, 1795, 1795, 8: 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 54: 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 547: 4745, 764: 6423}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 6424, 2668, 2669, 2667}, - {88: 4778, 453: 1778, 463: 4777, 835: 6426, 1208: 6425}, - {453: 6427}, - {453: 1777}, + {2126, 2126, 13: 2126, 15: 2126, 2126, 2126, 2126, 2126, 2126, 2126, 2126, 2126, 2126, 2126, 2126, 28: 2126, 466: 2126, 469: 2126, 488: 2126, 636: 2126}, + {2: 1809, 1809, 1809, 1809, 1809, 8: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 58: 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 1809, 554: 4710, 774: 6426}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 6427, 2670, 2671, 2669}, + {93: 4743, 460: 1792, 470: 4742, 846: 6429, 1210: 6428}, + {460: 6430}, // 3975 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 6428}, - {454: 6429}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 454: 4463, 640: 4023, 2668, 2669, 2667, 724: 4462, 806: 4461, 816: 6430}, - {7: 4472, 53: 6431}, - {1789, 1789, 4: 1789, 29: 1789, 87: 1789, 1789, 1789, 1789, 1789, 1789, 455: 1789, 463: 1789, 477: 1789, 853: 6432}, + {460: 1791}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 6431}, + {461: 6432}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 461: 4516, 652: 4033, 2670, 2671, 2669, 732: 4515, 815: 4514, 824: 6433}, + {7: 4525, 57: 6434}, // 3980 - {2124, 2124, 4: 4774, 29: 4771, 87: 4124, 4778, 4557, 4712, 4558, 4711, 455: 4773, 463: 4777, 477: 4125, 833: 4775, 835: 4772, 844: 4776, 6244, 852: 4770, 856: 6243, 1040: 6433}, - {2131, 2131}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 6435, 2668, 2669, 2667}, - {454: 6436}, - {215: 4807, 224: 4809, 227: 4808, 1115: 6437}, + {1803, 1803, 4: 1803, 29: 1803, 92: 1803, 1803, 1803, 1803, 1803, 1803, 462: 1803, 470: 1803, 485: 1803, 866: 6435}, + {2140, 2140, 4: 4739, 29: 4736, 92: 4134, 4743, 4603, 4328, 4604, 4327, 462: 4738, 470: 4742, 485: 4135, 844: 4740, 846: 4737, 856: 4741, 6247, 865: 4735, 869: 6246, 1045: 6436}, + {2147, 2147}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 6438, 2670, 2671, 2669}, + {461: 6439}, // 3985 - {53: 6438}, - {453: 6439}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 6440}, - {454: 6441}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4023, 2668, 2669, 2667, 724: 4024, 766: 6442}, + {221: 4772, 230: 4774, 233: 4773, 1119: 6440}, + {57: 6441}, + {460: 6442}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 6443}, + {461: 6444}, // 3990 - {7: 4026, 53: 6443}, - {2133, 2133}, - {2225, 2225}, - {2250, 2250}, - {2256, 2256, 455: 6448, 652: 6447}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4033, 2670, 2671, 2669, 732: 4034, 797: 6445}, + {7: 4036, 57: 6446}, + {2149, 2149}, + {2241, 2241}, + {2266, 2266}, // 3995 - {147: 6455, 669: 6454}, - {297: 6450, 305: 6449}, - {56: 6453}, - {304: 6451}, - {147: 6452}, + {2272, 2272, 462: 6451, 660: 6450}, + {150: 6458, 676: 6457}, + {303: 6453, 311: 6452}, + {61: 6456}, + {310: 6454}, // 4000 - {2253, 2253}, - {2254, 2254}, - {2255, 2255}, - {2252, 2252, 654: 5299, 906: 6456}, - {2251, 2251}, + {150: 6455}, + {2269, 2269}, + {2270, 2270}, + {2271, 2271}, + {2268, 2268, 662: 5295, 911: 6459}, // 4005 - {2258, 2258}, - {2257, 2257}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 6472, 778: 6471}, - {550: 6461}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 6462}, + {2267, 2267}, + {2274, 2274}, + {2273, 2273}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 6475, 785: 6474}, + {555: 6464}, // 4010 - {469: 6464, 630: 6463}, - {868, 868, 2900, 2748, 2784, 2902, 2675, 868, 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 455: 868, 568: 4918, 640: 4917, 2668, 2669, 2667, 834: 6469}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4588, 2668, 2669, 2667, 770: 6465}, - {7: 4589, 630: 6466}, - {868, 868, 2900, 2748, 2784, 2902, 2675, 868, 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 455: 868, 568: 4918, 640: 4917, 2668, 2669, 2667, 834: 6467}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 6465}, + {477: 6467, 637: 6466}, + {875, 875, 2906, 2754, 2790, 2908, 2681, 875, 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 462: 875, 575: 4914, 652: 4913, 2670, 2671, 2669, 845: 6472}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4634, 2670, 2671, 2669, 778: 6468}, + {7: 4635, 637: 6469}, // 4015 - {2273, 2273, 7: 4920, 455: 4904, 784: 6468}, - {2280, 2280}, - {2273, 2273, 7: 4920, 455: 4904, 784: 6470}, - {2283, 2283}, - {2275, 2275, 7: 3807, 152: 6491, 455: 2275, 1082: 6500}, + {875, 875, 2906, 2754, 2790, 2908, 2681, 875, 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 462: 875, 575: 4914, 652: 4913, 2670, 2671, 2669, 845: 6470}, + {2290, 2290, 7: 4916, 462: 4897, 793: 6471}, + {2298, 2298}, + {2290, 2290, 7: 4916, 462: 4897, 793: 6473}, + {2301, 2301}, // 4020 - {1011, 1011, 7: 1011, 95: 6477, 152: 1011, 455: 1011, 469: 6474, 630: 6473, 635: 6475, 650: 6476}, - {868, 868, 2900, 2748, 2784, 2902, 2675, 868, 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 455: 868, 568: 4918, 640: 4917, 2668, 2669, 2667, 834: 6498}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4588, 2668, 2669, 2667, 770: 6487}, - {239: 6483}, - {239: 6480}, + {2293, 2293, 7: 3816, 158: 6495, 462: 2293, 640: 6494, 965: 6505}, + {1018, 1018, 7: 1018, 98: 6480, 158: 1018, 462: 1018, 477: 6477, 637: 6476, 640: 1018, 643: 6478, 658: 6479}, + {875, 875, 2906, 2754, 2790, 2908, 2681, 875, 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 462: 875, 575: 4914, 652: 4913, 2670, 2671, 2669, 845: 6503}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4634, 2670, 2671, 2669, 778: 6490}, + {245: 6486}, // 4025 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4023, 2668, 2669, 2667, 724: 4024, 766: 6478}, - {2273, 2273, 7: 4026, 455: 4904, 784: 6479}, - {2277, 2277}, - {453: 6481}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4023, 2668, 2669, 2667, 724: 4024, 766: 6482}, + {245: 6483}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5665, 2670, 2671, 2669, 863: 6481}, + {2290, 2290, 7: 5667, 462: 4897, 793: 6482}, + {2295, 2295}, + {460: 6484}, // 4030 - {2278, 2278, 7: 4026}, - {453: 6484}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4023, 2668, 2669, 2667, 724: 4024, 766: 6485}, - {2273, 2273, 7: 4026, 455: 4904, 784: 6486}, - {2279, 2279}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5665, 2670, 2671, 2669, 863: 6485}, + {2296, 2296, 7: 5667}, + {460: 6487}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5665, 2670, 2671, 2669, 863: 6488}, + {2290, 2290, 7: 5667, 462: 4897, 793: 6489}, // 4035 - {2275, 2275, 7: 4589, 95: 6490, 152: 6491, 455: 2275, 630: 6489, 1082: 6488}, - {2273, 2273, 455: 4904, 784: 6497}, - {868, 868, 2900, 2748, 2784, 2902, 2675, 868, 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 455: 868, 568: 4918, 640: 4917, 2668, 2669, 2667, 834: 6495}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4023, 2668, 2669, 2667, 724: 4024, 766: 6493}, - {95: 6492}, + {2297, 2297}, + {2293, 2293, 7: 4635, 98: 6493, 158: 6495, 462: 2293, 637: 6492, 640: 6494, 965: 6491}, + {2290, 2290, 462: 4897, 793: 6502}, + {875, 875, 2906, 2754, 2790, 2908, 2681, 875, 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 462: 875, 575: 4914, 652: 4913, 2670, 2671, 2669, 845: 6500}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 5665, 2670, 2671, 2669, 863: 6498}, // 4040 - {2274, 2274, 455: 2274}, - {2273, 2273, 7: 4026, 455: 4904, 784: 6494}, - {2276, 2276}, - {2273, 2273, 7: 4920, 455: 4904, 784: 6496}, - {2281, 2281}, + {98: 6497}, + {98: 6496}, + {2291, 2291, 462: 2291}, + {2292, 2292, 462: 2292}, + {2290, 2290, 7: 5667, 462: 4897, 793: 6499}, // 4045 - {2282, 2282}, - {2273, 2273, 7: 4920, 455: 4904, 784: 6499}, - {2284, 2284}, - {2273, 2273, 455: 4904, 784: 6501}, - {2285, 2285}, + {2294, 2294}, + {2290, 2290, 7: 4916, 462: 4897, 793: 6501}, + {2299, 2299}, + {2300, 2300}, + {2290, 2290, 7: 4916, 462: 4897, 793: 6504}, // 4050 - {550: 6507}, - {474: 6505}, - {550: 2287}, - {469: 6506, 550: 2288}, - {550: 2286}, + {2302, 2302}, + {2290, 2290, 462: 4897, 793: 6506}, + {2303, 2303}, + {555: 6512}, + {481: 6510}, // 4055 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 6508}, - {469: 5293, 536: 882, 630: 882, 644: 882, 837: 6509}, - {536: 6512, 630: 6511, 644: 6513, 1111: 6510}, - {2293, 2293}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 6520, 2668, 2669, 2667}, + {555: 2305}, + {477: 6511, 555: 2306}, + {555: 2304}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 6513}, + {477: 5289, 543: 889, 637: 889, 648: 889, 848: 6514}, // 4060 - {454: 3780, 820: 6515}, - {454: 3780, 820: 5805, 955: 6514}, - {2290, 2290, 7: 5806}, - {486: 6516}, - {454: 3780, 820: 6517}, + {543: 6517, 637: 6516, 648: 6518, 1114: 6515}, + {2311, 2311}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 6525, 2670, 2671, 2669}, + {461: 3789, 828: 6520}, + {461: 3789, 828: 5801, 959: 6519}, // 4065 - {16: 6518}, - {488: 2642, 716: 3933, 743: 6519}, - {2291, 2291}, - {536: 6512, 644: 6513, 1111: 6521}, - {2292, 2292}, + {2308, 2308, 7: 5802}, + {494: 6521}, + {461: 3789, 828: 6522}, + {15: 6523}, + {495: 2644, 724: 3943, 750: 6524}, // 4070 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 6523}, - {2295, 2295, 632: 6525, 1190: 6524}, - {2296, 2296}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 6526, 2668, 2669, 2667}, - {2294, 2294}, + {2309, 2309}, + {543: 6517, 648: 6518, 1114: 6526}, + {2310, 2310}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 6528}, + {2313, 2313, 639: 6530, 1193: 6529}, // 4075 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 6528, 719: 6529}, - {244: 6531}, - {2298, 2298, 488: 2642, 716: 3933, 743: 6530}, - {2297, 2297}, - {488: 2642, 716: 3933, 743: 6532}, + {2314, 2314}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 6531, 2670, 2671, 2669}, + {2312, 2312}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 648: 6533, 652: 3813, 2670, 2671, 2669, 726: 6534}, + {250: 6536}, // 4080 - {2299, 2299}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 6544, 1125: 6543, 1296: 6542}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 551: 5125, 640: 3376, 2668, 2669, 2667, 720: 5124, 755: 6537, 1131: 6536, 1301: 6535}, - {2303, 2303, 7: 6540}, - {2302, 2302, 7: 2302}, + {2316, 2316, 495: 2644, 724: 3943, 750: 6535}, + {2315, 2315}, + {495: 2644, 724: 3943, 750: 6537}, + {2317, 2317}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 6549, 1129: 6548, 1298: 6547}, // 4085 - {632: 6538}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 551: 5125, 640: 3376, 2668, 2669, 2667, 720: 5124, 755: 6539}, - {2300, 2300, 7: 2300}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 551: 5125, 640: 3376, 2668, 2669, 2667, 720: 5124, 755: 6537, 1131: 6541}, - {2301, 2301, 7: 2301}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 558: 5121, 652: 3385, 2670, 2671, 2669, 727: 5120, 762: 6542, 1134: 6541, 1303: 6540}, + {2321, 2321, 7: 6545}, + {2320, 2320, 7: 2320}, + {639: 6543}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 558: 5121, 652: 3385, 2670, 2671, 2669, 727: 5120, 762: 6544}, // 4090 - {2307, 2307, 7: 6547}, - {2306, 2306, 7: 2306}, - {632: 6545}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 6546}, - {2304, 2304, 7: 2304}, + {2318, 2318, 7: 2318}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 558: 5121, 652: 3385, 2670, 2671, 2669, 727: 5120, 762: 6542, 1134: 6546}, + {2319, 2319, 7: 2319}, + {2325, 2325, 7: 6552}, + {2324, 2324, 7: 2324}, // 4095 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 6544, 1125: 6548}, - {2305, 2305, 7: 2305}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 6603, 3254, 3259, 6598, 2096, 6605, 6599, 6604, 6607, 6601, 6597, 6602, 6606, 6600, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 459: 4129, 462: 2096, 485: 2096, 629: 2096, 640: 5224, 2668, 2669, 2667, 753: 4086, 757: 4087, 759: 6408, 775: 6407, 796: 6609, 826: 6410, 914: 6610}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 6588, 2668, 2669, 2667}, - {2: 1797, 1797, 1797, 1797, 1797, 8: 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 54: 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 456: 1797, 547: 4297, 551: 1797, 758: 6577}, + {639: 6550}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 6551}, + {2322, 2322, 7: 2322}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 6549, 1129: 6553}, + {2323, 2323, 7: 2323}, // 4100 - {259: 6571, 1210: 6570}, - {134: 6566}, - {2: 1797, 1797, 1797, 1797, 1797, 8: 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 54: 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 547: 4297, 758: 6555}, - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 3804, 2668, 2669, 2667, 719: 6556}, - {76: 6274, 6271, 6277, 6278, 6279, 6272, 6270, 6280, 6276, 6273, 6560, 638: 6275, 895: 6559, 966: 6558, 1144: 6557}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 6603, 2112, 6608, 6610, 6604, 6609, 6612, 6606, 6602, 6607, 6611, 6605, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 466: 4139, 469: 2112, 488: 2112, 636: 2112, 652: 5220, 2670, 2671, 2669, 760: 4096, 766: 4097, 769: 6411, 781: 6410, 804: 6614, 837: 6413, 919: 6615}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 6593, 2670, 2671, 2669}, + {2: 1811, 1811, 1811, 1811, 1811, 8: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 58: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 463: 1811, 554: 4350, 558: 1811, 767: 6582}, + {264: 6576, 1212: 6575}, + {157: 6571}, // 4105 - {25, 25, 76: 6274, 6271, 6277, 6278, 6279, 6272, 6270, 6280, 6276, 6273, 6560, 638: 6275, 895: 6559, 966: 6565}, - {24, 24, 76: 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 638: 24}, - {22, 22, 76: 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 638: 22}, - {21, 21, 76: 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 455: 6562, 466: 1977, 1977, 478: 4165, 488: 1977, 638: 21, 717: 6561}, - {466: 3937, 3936, 488: 2642, 716: 3933, 743: 3935, 794: 6564}, + {2: 1811, 1811, 1811, 1811, 1811, 8: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 58: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 554: 4350, 767: 6560}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 3813, 2670, 2671, 2669, 726: 6561}, + {81: 6276, 6273, 6279, 6280, 6281, 6274, 6272, 6282, 6278, 6275, 6565, 646: 6277, 900: 6564, 971: 6563, 1147: 6562}, + {25, 25, 81: 6276, 6273, 6279, 6280, 6281, 6274, 6272, 6282, 6278, 6275, 6565, 646: 6277, 900: 6564, 971: 6570}, + {24, 24, 81: 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 646: 24}, // 4110 - {466: 3937, 3936, 488: 2642, 716: 3933, 743: 3935, 794: 6563}, - {19, 19, 76: 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 638: 19}, - {20, 20, 76: 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 638: 20}, - {23, 23, 76: 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 638: 23}, - {2: 1797, 1797, 1797, 1797, 1797, 8: 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 54: 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 1797, 547: 4297, 758: 6567}, + {22, 22, 81: 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 646: 22}, + {21, 21, 81: 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 462: 6567, 473: 1993, 1993, 484: 4180, 495: 1993, 646: 21, 725: 6566}, + {473: 3947, 3946, 495: 2644, 724: 3943, 750: 3945, 802: 6569}, + {473: 3947, 3946, 495: 2644, 724: 3943, 750: 3945, 802: 6568}, + {19, 19, 81: 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 646: 19}, // 4115 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 3266, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 640: 4877, 2668, 2669, 2667, 860: 6568}, - {13: 4081, 16: 4076, 18: 4083, 4077, 4082, 4085, 4079, 4075, 4080, 4084, 4078, 753: 6304, 1080: 6569}, - {51, 51, 7: 6307, 13: 4081, 16: 4076, 18: 4083, 4077, 4082, 4085, 4079, 4075, 4080, 4084, 4078, 753: 6306}, - {229, 229}, - {382: 6572}, + {20, 20, 81: 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 646: 20}, + {23, 23, 81: 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 646: 23}, + {2: 1811, 1811, 1811, 1811, 1811, 8: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 58: 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 1811, 554: 4350, 767: 6572}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 3275, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 652: 4870, 2670, 2671, 2669, 872: 6573}, + {15: 4086, 17: 4091, 4093, 4087, 4092, 4095, 4089, 4085, 4090, 4094, 4088, 760: 6365, 1084: 6574}, // 4120 - {228, 228, 76: 6573}, - {161: 6574}, - {453: 6575}, - {190: 6576}, - {227, 227}, + {51, 51, 7: 6368, 15: 4086, 17: 4091, 4093, 4087, 4092, 4095, 4089, 4085, 4090, 4094, 4088, 760: 6367}, + {229, 229}, + {385: 6577}, + {228, 228, 81: 6578}, + {151: 6579}, // 4125 - {2: 2900, 2748, 2784, 2902, 2675, 8: 2721, 2676, 2807, 2919, 2912, 3109, 3254, 3259, 3032, 3061, 3113, 3102, 3112, 3114, 3105, 3110, 3111, 3115, 3108, 2787, 2707, 2789, 2763, 2710, 2699, 2732, 2791, 2792, 2896, 2786, 2920, 2674, 2785, 2788, 2799, 2739, 2743, 2795, 2905, 2754, 2833, 2832, 2904, 2917, 2877, 54: 2988, 2753, 2756, 2971, 2968, 2960, 2972, 2975, 2976, 2973, 2977, 2978, 2974, 2967, 2979, 2962, 2963, 2966, 2969, 2970, 2980, 3262, 2819, 2757, 2947, 2946, 2948, 2943, 2942, 2949, 2944, 2945, 2749, 2862, 2932, 2995, 2930, 2996, 2931, 2750, 2822, 2690, 2981, 2761, 3252, 2684, 2827, 2918, 3263, 3256, 2719, 3275, 2929, 2762, 3258, 3273, 3274, 3272, 3268, 2921, 2922, 2923, 2924, 2925, 2926, 2928, 3264, 2847, 2758, 2851, 2852, 2853, 2854, 2843, 2871, 2914, 2873, 2692, 2872, 2734, 2982, 2993, 2824, 2863, 2729, 2782, 2938, 2844, 2803, 2698, 2709, 2724, 2933, 2806, 2773, 2823, 2708, 3090, 3064, 2859, 2771, 6578, 2693, 2728, 3251, 2738, 2742, 2751, 2772, 2983, 2679, 2683, 2701, 3255, 2722, 2800, 2801, 2952, 2880, 2989, 2990, 2954, 2818, 2991, 2910, 3060, 2950, 2850, 3260, 2908, 2810, 2673, 2815, 2705, 2706, 2816, 2713, 2723, 2726, 2714, 2936, 2961, 2776, 2875, 2842, 2813, 2870, 2913, 2802, 2752, 3016, 2760, 3025, 3261, 2909, 2998, 2958, 2820, 2881, 2682, 2999, 3002, 2688, 2984, 3003, 3271, 2694, 2695, 2883, 3043, 3005, 2879, 2703, 3007, 2892, 2916, 2903, 2704, 3009, 2911, 2717, 2941, 3097, 2727, 2730, 2893, 2939, 3052, 3053, 2887, 3011, 3010, 2937, 2994, 2825, 3276, 3012, 3013, 2829, 2885, 3062, 3014, 2992, 2746, 2747, 2858, 2964, 2860, 3065, 3015, 2906, 2907, 2848, 2755, 2889, 3028, 3017, 3074, 2888, 3080, 3081, 3082, 3083, 3085, 3084, 3086, 3087, 3027, 2768, 2670, 2671, 2940, 2957, 2677, 2959, 2985, 2680, 2681, 3041, 3000, 3001, 2685, 2869, 2686, 2687, 2856, 3267, 3004, 2804, 2691, 2696, 2697, 3006, 3008, 3047, 3048, 2711, 2712, 2826, 2716, 2876, 3091, 2718, 2886, 3101, 3257, 2821, 2797, 2894, 2915, 2878, 2812, 2934, 3054, 2864, 2882, 2927, 2735, 3103, 3104, 2733, 2809, 2895, 2790, 2951, 2865, 2793, 2794, 3277, 2828, 2737, 2759, 3029, 3092, 2740, 2898, 2901, 2953, 2987, 3030, 2997, 2838, 2839, 2845, 3058, 3033, 3059, 2935, 3034, 2965, 2868, 2808, 2899, 2857, 3021, 3022, 3019, 3018, 3020, 3066, 2884, 2986, 2897, 3024, 2866, 2764, 2765, 3026, 3100, 3088, 2890, 2769, 2798, 2805, 2867, 3106, 3107, 2774, 3031, 2874, 3035, 2779, 3036, 3037, 3253, 3038, 3039, 3040, 3093, 3042, 3044, 3045, 3046, 2715, 2861, 3094, 2831, 3049, 2720, 3280, 3051, 3284, 3283, 3278, 3056, 3055, 2736, 3057, 3063, 2837, 2744, 2745, 2855, 3269, 3270, 3279, 2849, 2780, 2891, 2811, 2814, 3095, 3070, 3071, 3072, 3073, 3096, 3067, 3068, 3069, 2830, 3023, 3281, 3282, 3089, 3075, 3076, 3077, 3265, 456: 3375, 551: 5125, 640: 3376, 2668, 2669, 2667, 720: 5124, 755: 5142, 865: 5143, 904: 6579}, - {1654, 1654, 7: 1654, 15: 1654, 52: 1654, 139: 1654, 454: 6583, 1654, 548: 1654, 647: 1654, 1654}, - {215, 215, 7: 5145, 15: 215, 52: 215, 455: 215, 647: 5189, 940: 5188, 6580}, - {223, 223, 15: 223, 52: 223, 455: 6324, 987: 6581}, - {202, 202, 15: 6341, 52: 6339, 932: 6340, 6338, 1078: 6337, 6582}, + {460: 6580}, + {195: 6581}, + {227, 227}, + {2: 2906, 2754, 2790, 2908, 2681, 8: 2727, 2682, 2813, 2925, 2918, 3263, 3268, 3040, 3069, 3118, 3122, 3111, 3121, 3123, 3114, 3119, 3120, 3124, 3117, 2793, 2713, 2795, 2769, 2716, 2705, 2738, 2797, 2798, 2902, 2792, 2926, 3028, 3027, 2680, 2791, 2794, 2805, 2745, 2749, 2801, 2911, 2760, 2839, 2678, 2679, 2838, 2910, 2677, 2923, 58: 2883, 2994, 2759, 2762, 2977, 2974, 2966, 2978, 2981, 2982, 2979, 2983, 2984, 2980, 2973, 2985, 2968, 2969, 2972, 2975, 2976, 2986, 3271, 2825, 2763, 2953, 2952, 2954, 2949, 2948, 2955, 2950, 2951, 2755, 2868, 2938, 3001, 2936, 3002, 2937, 2696, 2828, 2767, 3261, 2690, 2833, 2924, 3272, 3265, 2725, 3284, 2935, 2768, 3267, 3282, 3283, 3281, 3277, 2927, 2928, 2929, 2930, 2931, 2932, 2934, 3273, 2853, 2764, 2857, 2858, 2859, 2860, 2849, 2877, 2920, 2879, 2698, 2878, 2740, 2999, 2830, 2869, 2735, 2788, 2944, 2850, 2809, 2699, 2704, 2715, 2730, 2939, 2812, 2757, 2779, 2685, 2829, 2714, 3099, 2988, 3072, 2865, 2777, 6583, 2734, 3260, 2744, 2748, 2756, 2778, 2989, 2689, 2707, 3264, 2728, 2806, 2807, 2958, 2886, 2995, 2996, 2960, 2824, 2997, 2916, 3068, 3022, 2956, 2856, 3269, 2914, 2816, 2675, 2821, 2711, 2712, 2822, 2719, 2729, 2732, 2720, 2942, 2967, 2782, 2881, 3070, 2848, 2819, 2876, 2919, 2808, 2758, 3023, 2766, 3033, 3270, 2915, 3004, 2964, 2826, 2887, 2688, 3005, 3008, 2694, 2990, 3009, 3280, 2700, 2701, 2889, 3051, 3011, 2885, 2709, 3013, 2898, 2922, 2909, 2710, 3015, 2917, 2723, 2947, 3106, 2733, 2736, 2899, 2945, 3060, 3061, 2893, 3017, 3016, 2943, 3000, 2831, 3285, 3018, 3019, 2835, 2891, 3020, 2998, 2752, 2753, 2864, 2970, 2866, 3073, 3021, 2912, 2913, 2854, 2761, 2895, 3036, 3024, 2676, 3082, 2894, 3089, 3090, 3091, 3092, 3094, 3093, 3095, 3096, 3035, 2774, 2672, 2673, 2946, 2963, 2683, 2965, 2991, 2686, 2687, 3049, 3006, 3007, 2691, 2875, 2692, 2693, 2862, 3276, 3010, 2810, 2697, 2702, 2703, 3012, 3014, 3055, 3056, 2717, 2718, 2832, 2722, 2882, 3100, 2724, 2892, 3266, 2827, 2803, 3030, 2900, 2921, 2884, 2818, 2940, 3062, 2870, 2888, 2933, 2741, 2739, 2815, 2901, 2796, 2957, 2871, 2799, 2800, 3286, 2834, 2743, 2765, 3037, 3101, 2746, 2904, 2907, 2959, 2993, 3038, 3003, 2844, 2845, 2851, 3066, 3041, 3067, 2941, 3042, 2971, 2874, 2814, 2905, 2863, 3029, 3026, 3025, 3074, 2890, 2992, 2903, 3086, 3032, 2872, 2770, 2771, 3034, 3109, 3097, 2896, 2775, 2804, 2811, 2873, 3115, 2780, 3039, 2880, 3043, 2785, 3044, 3045, 3262, 3046, 3047, 3048, 3102, 3050, 3052, 3053, 3054, 2721, 2867, 3103, 2837, 3057, 2726, 3110, 3289, 3059, 3293, 3292, 3287, 3112, 3113, 3064, 3063, 2742, 3065, 3071, 2843, 2750, 2751, 2987, 2861, 3278, 3279, 3288, 2855, 2786, 2897, 2817, 2820, 3104, 3078, 3079, 3080, 3081, 3105, 3075, 3076, 3077, 2836, 3031, 3290, 3291, 3098, 3083, 3084, 3085, 3116, 3274, 463: 3384, 558: 5121, 652: 3385, 2670, 2671, 2669, 727: 5120, 762: 5138, 877: 5139, 909: 6584}, + {1664, 1664, 7: 1664, 14: 1664, 58: 1664, 141: 1664, 461: 6588, 1664, 557: 1664, 650: 1664, 656: 1664}, // 4130 + {215, 215, 7: 5141, 14: 215, 58: 215, 462: 215, 650: 5185, 944: 5184, 6585}, + {223, 223, 14: 223, 58: 223, 462: 6318, 992: 6586}, + {202, 202, 14: 6335, 58: 6333, 937: 6334, 6332, 1082: 6331, 6587}, {231, 231}, - {53: 6584}, - {139: 6585}, - {644: 6586}, - {456: 5158, 867: 6587}, + {57: 6589}, // 4135 + {141: 6590}, + {648: 6591}, + {463: 5154, 879: 6592}, {230, 230}, - {1890, 1890, 27: 1890, 54: 1890, 56: 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 1890, 135: 6358, 453: 1890, 487: 6357, 634: 1890, 1020: 6589}, - {1947, 1947, 27: 1947, 54: 1947, 56: 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 1947, 453: 1947, 634: 1947, 874: 6590}, - {1884, 1884, 27: 6047, 54: 6023, 56: 6043, 6036, 6026, 6022, 6030, 6034, 6046, 6029, 6035, 6033, 6031, 6044, 6037, 6025, 6045, 6024, 6027, 6028, 6032, 6592, 453: 6038, 634: 6048, 870: 6040, 6039, 6042, 6021, 875: 6041, 1204: 6591}, - {1899, 1899}, + {1904, 1904, 27: 1904, 59: 1904, 61: 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 1904, 137: 6352, 460: 1904, 493: 6351, 642: 1904, 1025: 6594}, // 4140 - {193: 6594, 718: 6593}, - {540, 540, 550: 5994, 949: 6596}, - {540, 540, 550: 5994, 949: 6595}, - {1882, 1882}, - {1883, 1883}, + {1961, 1961, 27: 1961, 59: 1961, 61: 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 1961, 460: 1961, 642: 1961, 885: 6595}, + {1898, 1898, 27: 6044, 59: 6020, 61: 6040, 6033, 6023, 6019, 6027, 6031, 6043, 6026, 6032, 6030, 6028, 6041, 6034, 6022, 6042, 6021, 6024, 6025, 6029, 6597, 460: 6035, 642: 6045, 881: 6037, 6036, 6039, 6018, 886: 6038, 1206: 6596}, + {1913, 1913}, + {198: 6599, 640: 6598}, + {545, 545, 555: 5991, 953: 6601}, // 4145 - {13: 1323, 1323, 16: 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 1323, 28: 1323, 456: 1977, 459: 1323, 462: 1323, 478: 4165, 485: 1323, 629: 1323, 717: 4898}, - {13: 1401, 1401, 16: 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 28: 1401, 456: 1977, 459: 1401, 462: 1401, 478: 4165, 485: 1401, 629: 1401, 717: 4896}, - {13: 1331, 1331, 16: 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 28: 1331, 459: 1331, 462: 1331, 478: 4165, 485: 1331, 488: 1977, 629: 1331, 717: 4894}, - {13: 1325, 1325, 16: 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 28: 1325, 459: 1325, 462: 1325, 478: 4165, 485: 1325, 488: 1977, 629: 1325, 717: 4892}, - {13: 1328, 1328, 16: 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 28: 1328, 459: 1328, 462: 1328, 478: 4165, 485: 1328, 488: 1977, 629: 1328, 717: 4890}, + {545, 545, 555: 5991, 953: 6600}, + {1896, 1896}, + {1897, 1897}, + {13: 1330, 15: 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 1330, 28: 1330, 463: 1993, 466: 1330, 469: 1330, 484: 4180, 488: 1330, 636: 1330, 725: 4891}, + {13: 1409, 15: 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 28: 1409, 463: 1993, 466: 1409, 469: 1409, 484: 4180, 488: 1409, 636: 1409, 725: 4889}, // 4150 - {13: 1322, 1322, 16: 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 1322, 28: 1322, 456: 1977, 459: 1322, 462: 1322, 478: 4165, 485: 1322, 629: 1322, 717: 4888}, - {13: 1324, 1324, 16: 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 1324, 28: 1324, 456: 1977, 459: 1324, 462: 1324, 478: 4165, 485: 1324, 629: 1324, 717: 4886}, - {13: 1321, 1321, 16: 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 1321, 28: 1321, 456: 1977, 459: 1321, 462: 1321, 478: 4165, 485: 1321, 629: 1321, 717: 4884}, - {13: 1320, 1320, 16: 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 1320, 28: 1320, 456: 1977, 459: 1320, 462: 1320, 478: 4165, 485: 1320, 629: 1320, 717: 4882}, - {13: 1318, 1318, 16: 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 1318, 28: 1318, 456: 1977, 459: 1318, 462: 1318, 478: 4165, 485: 1318, 629: 1318, 717: 4880}, + {13: 1338, 15: 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 1338, 28: 1338, 466: 1338, 469: 1338, 484: 4180, 488: 1338, 495: 1993, 636: 1338, 725: 4887}, + {13: 1332, 15: 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 1332, 28: 1332, 466: 1332, 469: 1332, 484: 4180, 488: 1332, 495: 1993, 636: 1332, 725: 4885}, + {13: 1335, 15: 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 1335, 28: 1335, 466: 1335, 469: 1335, 484: 4180, 488: 1335, 495: 1993, 636: 1335, 725: 4883}, + {13: 1329, 15: 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 28: 1329, 463: 1993, 466: 1329, 469: 1329, 484: 4180, 488: 1329, 636: 1329, 725: 4881}, + {13: 1331, 15: 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 1331, 28: 1331, 463: 1993, 466: 1331, 469: 1331, 484: 4180, 488: 1331, 636: 1331, 725: 4879}, // 4155 - {13: 1319, 1319, 16: 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 28: 1319, 456: 1977, 459: 1319, 462: 1319, 478: 4165, 485: 1319, 629: 1319, 717: 4878}, - {13: 1372, 1372, 16: 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372, 28: 1372, 134: 4870, 459: 1372, 462: 1372, 485: 1372, 629: 1372}, - {13: 4081, 2096, 16: 4076, 2096, 4083, 4077, 4082, 4085, 4079, 4075, 4080, 4084, 4078, 28: 2096, 459: 4129, 462: 2096, 485: 2096, 629: 2096, 753: 4086, 757: 4087, 759: 6408, 775: 6407, 826: 6410, 914: 6611}, - {2114, 2114, 13: 4081, 2096, 16: 4076, 2096, 4083, 4077, 4082, 4085, 4079, 4075, 4080, 4084, 4078, 28: 2096, 459: 4129, 462: 2096, 485: 2096, 629: 2096, 753: 4086, 757: 4087, 759: 6408, 775: 6407, 826: 6411}, - {2115, 2115, 13: 4081, 2096, 16: 4076, 2096, 4083, 4077, 4082, 4085, 4079, 4075, 4080, 4084, 4078, 28: 2096, 459: 4129, 462: 2096, 485: 2096, 629: 2096, 753: 4086, 757: 4087, 759: 6408, 775: 6407, 826: 6411}, + {13: 1328, 15: 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 1328, 28: 1328, 463: 1993, 466: 1328, 469: 1328, 484: 4180, 488: 1328, 636: 1328, 725: 4877}, + {13: 1327, 15: 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 28: 1327, 463: 1993, 466: 1327, 469: 1327, 484: 4180, 488: 1327, 636: 1327, 725: 4875}, + {13: 1325, 15: 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 1325, 28: 1325, 463: 1993, 466: 1325, 469: 1325, 484: 4180, 488: 1325, 636: 1325, 725: 4873}, + {13: 1326, 15: 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 1326, 28: 1326, 463: 1993, 466: 1326, 469: 1326, 484: 4180, 488: 1326, 636: 1326, 725: 4871}, + {13: 1380, 15: 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 1380, 28: 1380, 157: 4863, 466: 1380, 469: 1380, 488: 1380, 636: 1380}, // 4160 - {1975, 1975, 54: 2481, 75: 2596, 77: 2462, 86: 2492, 156: 2464, 160: 2486, 2490, 164: 2461, 191: 2511, 200: 2457, 209: 2510, 2477, 2463, 226: 2489, 231: 2467, 234: 2487, 236: 2458, 238: 2493, 254: 2608, 256: 2479, 260: 2478, 267: 2491, 269: 2459, 271: 2480, 282: 2472, 454: 2501, 2500, 477: 2604, 481: 2499, 487: 2485, 493: 2509, 506: 2599, 510: 2475, 549: 2484, 2498, 628: 2494, 630: 2607, 634: 2460, 2598, 646: 2455, 650: 2466, 655: 2465, 661: 2508, 668: 2456, 690: 2505, 726: 2468, 733: 2507, 2495, 2496, 2497, 2506, 739: 2504, 2503, 2502, 745: 2578, 2577, 2471, 761: 2597, 2469, 769: 2561, 771: 2572, 2588, 785: 2470, 790: 2527, 802: 2515, 808: 2602, 831: 2600, 841: 2482, 868: 2522, 878: 2525, 883: 2564, 893: 2569, 896: 2579, 913: 2534, 917: 2473, 953: 2603, 960: 2513, 2514, 2517, 2518, 965: 2520, 967: 2519, 969: 2516, 971: 2521, 2523, 2524, 975: 2483, 2560, 978: 2530, 988: 2538, 2531, 2532, 2533, 2539, 2537, 2540, 2541, 997: 2536, 2535, 1000: 2526, 2488, 2474, 2542, 2554, 2543, 2544, 2545, 2547, 2551, 2548, 2552, 2553, 2546, 2550, 2549, 1017: 2512, 1021: 2528, 2529, 2476, 1027: 2556, 2555, 1031: 2558, 2559, 2557, 1036: 2594, 2562, 1044: 2606, 2605, 2563, 1051: 2565, 1053: 2591, 1081: 2566, 1083: 2567, 1085: 2568, 1087: 2573, 1090: 2570, 2571, 1093: 2593, 2574, 2601, 2576, 2575, 1103: 2581, 2580, 2584, 1107: 2585, 1109: 2592, 1112: 2582, 6613, 1116: 2583, 1128: 2586, 2587, 2590, 1132: 2589}, - {428, 428}, + {13: 2112, 15: 4086, 2112, 4091, 4093, 4087, 4092, 4095, 4089, 4085, 4090, 4094, 4088, 28: 2112, 466: 4139, 469: 2112, 488: 2112, 636: 2112, 760: 4096, 766: 4097, 769: 6411, 781: 6410, 837: 6413, 919: 6616}, + {2130, 2130, 13: 2112, 15: 4086, 2112, 4091, 4093, 4087, 4092, 4095, 4089, 4085, 4090, 4094, 4088, 28: 2112, 466: 4139, 469: 2112, 488: 2112, 636: 2112, 760: 4096, 766: 4097, 769: 6411, 781: 6410, 837: 6414}, + {2131, 2131, 13: 2112, 15: 4086, 2112, 4091, 4093, 4087, 4092, 4095, 4089, 4085, 4090, 4094, 4088, 28: 2112, 466: 4139, 469: 2112, 488: 2112, 636: 2112, 760: 4096, 766: 4097, 769: 6411, 781: 6410, 837: 6414}, + {1991, 1991, 59: 2483, 80: 2598, 82: 2464, 91: 2494, 145: 2466, 151: 2492, 153: 2463, 165: 2488, 196: 2513, 203: 2610, 206: 2459, 215: 2512, 2479, 2465, 232: 2491, 237: 2469, 240: 2489, 242: 2460, 244: 2495, 261: 2481, 265: 2480, 272: 2493, 274: 2461, 277: 2482, 288: 2474, 461: 2503, 2502, 485: 2606, 2501, 493: 2487, 500: 2511, 513: 2601, 517: 2477, 555: 2500, 2486, 633: 2496, 637: 2609, 642: 2462, 2600, 651: 2457, 658: 2468, 663: 2467, 668: 2510, 675: 2458, 698: 2507, 731: 2470, 740: 2509, 2497, 2498, 2499, 2508, 2506, 2505, 2504, 751: 2580, 2579, 2473, 763: 2599, 2471, 768: 2563, 770: 2574, 772: 2590, 782: 2472, 786: 2529, 798: 2604, 811: 2517, 833: 2524, 836: 2527, 842: 2602, 847: 2566, 851: 2571, 2581, 2484, 918: 2536, 922: 2475, 957: 2605, 964: 2515, 966: 2516, 2519, 2520, 970: 2522, 972: 2521, 974: 2518, 976: 2523, 2525, 2526, 980: 2485, 2562, 983: 2532, 993: 2540, 2533, 2534, 2535, 2541, 2539, 2542, 2543, 1002: 2538, 2537, 1005: 2528, 2490, 2476, 2544, 2556, 2545, 2546, 2547, 2549, 2553, 2550, 2554, 2555, 2548, 2552, 2551, 1022: 2514, 1026: 2530, 2531, 2478, 1032: 2558, 2557, 1036: 2560, 2561, 2559, 1041: 2596, 2564, 1049: 2608, 2607, 2565, 1056: 2567, 1058: 2593, 1085: 2568, 2569, 1088: 2570, 1090: 2575, 1093: 2572, 2573, 1096: 2595, 2576, 2603, 2578, 2577, 1106: 2583, 2582, 2586, 1110: 2587, 1112: 2594, 1115: 2584, 6618, 1120: 2585, 1131: 2588, 2589, 2592, 1135: 2591}, + {433, 433}, } ) @@ -11005,6 +11018,7 @@ type yyLexer interface { Lex(lval *yySymType) int Errorf(format string, a ...interface{}) error AppendError(err error) + AppendWarn(err error) Errors() (warns []error, errs []error) } @@ -11034,7 +11048,7 @@ func yylex1(yylex yyLexer, lval *yySymType) (n int) { } func yyParse(yylex yyLexer, parser *Parser) int { - const yyError = 1333 + const yyError = 1335 yyEx, _ := yylex.(yyLexerEx) var yyn int @@ -11235,189 +11249,94 @@ yynewstate: } } case 5: - { - parser.yyVAL.item = ast.PlacementRoleFollower - } - case 6: - { - parser.yyVAL.item = ast.PlacementRoleLeader - } - case 7: - { - parser.yyVAL.item = ast.PlacementRoleLearner - } - case 8: - { - parser.yyVAL.item = ast.PlacementRoleVoter - } - case 9: - { - cnt := yyS[yypt-0].item.(uint64) - if cnt == 0 { - yylex.AppendError(yylex.Errorf("Invalid placement option REPLICAS, it is not allowed to be 0")) - return 1 - } - parser.yyVAL.item = cnt - } - case 10: - { - parser.yyVAL.item = yyS[yypt-0].ident - } - case 11: { parser.yyVAL.item = []*ast.PlacementOption{yyS[yypt-0].item.(*ast.PlacementOption)} } - case 12: + case 6: { parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.PlacementOption), yyS[yypt-0].item.(*ast.PlacementOption)) } - case 13: + case 7: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.PlacementOption), yyS[yypt-0].item.(*ast.PlacementOption)) } - case 14: + case 8: { parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionPrimaryRegion, StrValue: yyS[yypt-0].ident} } - case 15: + case 9: { parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionRegions, StrValue: yyS[yypt-0].ident} } - case 16: + case 10: { parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionFollowerCount, UintValue: yyS[yypt-0].item.(uint64)} } - case 17: + case 11: { parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionVoterCount, UintValue: yyS[yypt-0].item.(uint64)} } - case 18: + case 12: { parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionLearnerCount, UintValue: yyS[yypt-0].item.(uint64)} } - case 19: + case 13: { parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionSchedule, StrValue: yyS[yypt-0].ident} } - case 20: + case 14: { parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionConstraints, StrValue: yyS[yypt-0].ident} } - case 21: + case 15: { parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionLeaderConstraints, StrValue: yyS[yypt-0].ident} } - case 22: + case 16: { parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionFollowerConstraints, StrValue: yyS[yypt-0].ident} } - case 23: + case 17: { parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionVoterConstraints, StrValue: yyS[yypt-0].ident} } - case 24: - { - parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionLearnerConstraints, StrValue: yyS[yypt-0].ident} - } - case 27: - { - parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionPolicy, StrValue: yyS[yypt-0].ident} - } - case 28: - { - parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionPolicy, StrValue: yyS[yypt-0].ident} - } - case 29: - { - parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionPolicy, StrValue: yyS[yypt-0].ident} - } - case 30: - { - parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionPolicy, StrValue: yyS[yypt-0].ident} - } - case 31: - { - parser.yyVAL.item = &ast.PlacementSpec{ - Replicas: yyS[yypt-0].item.(uint64), - } - } - case 32: - { - parser.yyVAL.item = &ast.PlacementSpec{ - Constraints: yyS[yypt-0].item.(string), - } - } - case 33: - { - parser.yyVAL.item = &ast.PlacementSpec{ - Role: yyS[yypt-0].item.(ast.PlacementRole), - } - } - case 34: - { - spec := yyS[yypt-1].item.(*ast.PlacementSpec) - if spec.Replicas != 0 { - yylex.AppendError(yylex.Errorf("Duplicate placement option REPLICAS")) - return 1 - } - spec.Replicas = yyS[yypt-0].item.(uint64) - parser.yyVAL.item = spec - } - case 35: - { - spec := yyS[yypt-1].item.(*ast.PlacementSpec) - if len(spec.Constraints) > 0 { - yylex.AppendError(yylex.Errorf("Duplicate placement option CONSTRAINTS")) - return 1 - } - spec.Constraints = yyS[yypt-0].item.(string) - parser.yyVAL.item = spec - } - case 36: - { - spec := yyS[yypt-1].item.(*ast.PlacementSpec) - if spec.Role != ast.PlacementRoleNone { - yylex.AppendError(yylex.Errorf("Duplicate placement option ROLE")) - return 1 - } - spec.Role = yyS[yypt-0].item.(ast.PlacementRole) - parser.yyVAL.item = spec - } - case 37: + case 18: { - spec := yyS[yypt-0].item.(*ast.PlacementSpec) - spec.Tp = ast.PlacementAdd - parser.yyVAL.item = spec + parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionLearnerConstraints, StrValue: yyS[yypt-0].ident} } - case 38: + case 21: { - spec := yyS[yypt-0].item.(*ast.PlacementSpec) - spec.Tp = ast.PlacementAlter - parser.yyVAL.item = spec + parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionPolicy, StrValue: yyS[yypt-0].ident} } - case 39: + case 22: { - spec := &ast.PlacementSpec{Role: yyS[yypt-0].item.(ast.PlacementRole)} - spec.Tp = ast.PlacementDrop - parser.yyVAL.item = spec + parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionPolicy, StrValue: yyS[yypt-0].ident} } - case 40: + case 23: { - parser.yyVAL.item = []*ast.PlacementSpec{yyS[yypt-0].item.(*ast.PlacementSpec)} + parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionPolicy, StrValue: yyS[yypt-0].ident} } - case 41: + case 24: { - parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.PlacementSpec), yyS[yypt-0].item.(*ast.PlacementSpec)) + parser.yyVAL.item = &ast.PlacementOption{Tp: ast.PlacementOptionPolicy, StrValue: yyS[yypt-0].ident} } - case 42: + case 25: { parser.yyVAL.item = &ast.AttributesSpec{Default: true} } - case 43: + case 26: { parser.yyVAL.item = &ast.AttributesSpec{Default: false, Attributes: yyS[yypt-0].ident} } - case 44: + case 27: + { + parser.yyVAL.item = &ast.StatsOptionsSpec{Default: true} + } + case 28: + { + parser.yyVAL.item = &ast.StatsOptionsSpec{Default: false, StatsOptions: yyS[yypt-0].ident} + } + case 29: { if yyS[yypt-0].item != nil { parser.yyVAL.item = &ast.AlterTableSpec{ @@ -11428,19 +11347,19 @@ yynewstate: parser.yyVAL.item = nil } } - case 45: + case 30: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableRemovePartitioning, } } - case 46: + case 31: { ret := yyS[yypt-0].item.(*ast.AlterTableSpec) ret.NoWriteToBinlog = yyS[yypt-1].item.(bool) parser.yyVAL.item = ret } - case 47: + case 32: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTablePartitionAttributes, @@ -11448,7 +11367,7 @@ yynewstate: AttributesSpec: yyS[yypt-0].item.(*ast.AttributesSpec), } } - case 48: + case 33: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTablePartitionOptions, @@ -11456,22 +11375,22 @@ yynewstate: Options: yyS[yypt-0].item.([]*ast.TableOption), } } - case 49: + case 34: { parser.yyVAL.item = []string{} } - case 50: + case 35: { parser.yyVAL.item = yyS[yypt-0].item } - case 51: + case 36: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableOption, Options: yyS[yypt-0].item.([]*ast.TableOption), } } - case 52: + case 37: { tiflashReplicaSpec := &ast.TiFlashReplicaSpec{ Count: yyS[yypt-1].item.(uint64), @@ -11482,7 +11401,7 @@ yynewstate: TiFlashReplica: tiflashReplicaSpec, } } - case 53: + case 38: { op := &ast.AlterTableSpec{ Tp: ast.AlterTableOption, @@ -11494,7 +11413,7 @@ yynewstate: } parser.yyVAL.item = op } - case 54: + case 39: { op := &ast.AlterTableSpec{ Tp: ast.AlterTableOption, @@ -11506,7 +11425,7 @@ yynewstate: } parser.yyVAL.item = op } - case 55: + case 40: { parser.yyVAL.item = &ast.AlterTableSpec{ IfNotExists: yyS[yypt-2].item.(bool), @@ -11515,7 +11434,7 @@ yynewstate: Position: yyS[yypt-0].item.(*ast.ColumnPosition), } } - case 56: + case 41: { tes := yyS[yypt-1].item.([]interface{}) var columnDefs []*ast.ColumnDef @@ -11535,7 +11454,7 @@ yynewstate: NewConstraints: constraints, } } - case 57: + case 42: { constraint := yyS[yypt-0].item.(*ast.Constraint) parser.yyVAL.item = &ast.AlterTableSpec{ @@ -11543,7 +11462,7 @@ yynewstate: Constraint: constraint, } } - case 58: + case 43: { var defs []*ast.PartitionDefinition if yyS[yypt-0].item != nil { @@ -11561,7 +11480,7 @@ yynewstate: PartDefinitions: defs, } } - case 59: + case 44: { noWriteToBinlog := yyS[yypt-2].item.(bool) if noWriteToBinlog { @@ -11575,7 +11494,7 @@ yynewstate: Num: getUint64FromNUM(yyS[yypt-0].item), } } - case 60: + case 45: { statsSpec := &ast.StatisticsSpec{ StatsName: yyS[yypt-4].ident, @@ -11588,22 +11507,21 @@ yynewstate: Statistics: statsSpec, } } - case 61: + case 46: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableAttributes, AttributesSpec: yyS[yypt-0].item.(*ast.AttributesSpec), } } - case 62: + case 47: { parser.yyVAL.item = &ast.AlterTableSpec{ - Tp: ast.AlterTableAlterPartition, - PartitionNames: []model.CIStr{model.NewCIStr(yyS[yypt-1].ident)}, - PlacementSpecs: yyS[yypt-0].item.([]*ast.PlacementSpec), + Tp: ast.AlterTableStatsOptions, + StatsOptionsSpec: yyS[yypt-0].item.(*ast.StatsOptionsSpec), } } - case 63: + case 48: { yylex.AppendError(yylex.Errorf("The CHECK PARTITIONING clause is parsed but not implement yet.")) parser.lastErrorAsWarn() @@ -11617,7 +11535,7 @@ yynewstate: } parser.yyVAL.item = ret } - case 64: + case 49: { noWriteToBinlog := yyS[yypt-1].item.(bool) if noWriteToBinlog { @@ -11630,7 +11548,7 @@ yynewstate: Num: getUint64FromNUM(yyS[yypt-0].item), } } - case 65: + case 50: { parser.yyVAL.item = &ast.AlterTableSpec{ IfExists: yyS[yypt-2].item.(bool), @@ -11638,11 +11556,11 @@ yynewstate: OldColumnName: yyS[yypt-1].item.(*ast.ColumnName), } } - case 66: + case 51: { parser.yyVAL.item = &ast.AlterTableSpec{Tp: ast.AlterTableDropPrimaryKey} } - case 67: + case 52: { parser.yyVAL.item = &ast.AlterTableSpec{ IfExists: yyS[yypt-1].item.(bool), @@ -11650,7 +11568,7 @@ yynewstate: PartitionNames: yyS[yypt-0].item.([]model.CIStr), } } - case 68: + case 53: { statsSpec := &ast.StatisticsSpec{ StatsName: yyS[yypt-0].ident, @@ -11661,7 +11579,7 @@ yynewstate: Statistics: statsSpec, } } - case 69: + case 54: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableExchangePartition, @@ -11670,7 +11588,7 @@ yynewstate: WithValidation: yyS[yypt-0].item.(bool), } } - case 70: + case 55: { ret := &ast.AlterTableSpec{ Tp: ast.AlterTableTruncatePartition, @@ -11682,7 +11600,7 @@ yynewstate: } parser.yyVAL.item = ret } - case 71: + case 56: { ret := &ast.AlterTableSpec{ NoWriteToBinlog: yyS[yypt-1].item.(bool), @@ -11695,7 +11613,7 @@ yynewstate: } parser.yyVAL.item = ret } - case 72: + case 57: { ret := &ast.AlterTableSpec{ NoWriteToBinlog: yyS[yypt-1].item.(bool), @@ -11708,7 +11626,7 @@ yynewstate: } parser.yyVAL.item = ret } - case 73: + case 58: { ret := &ast.AlterTableSpec{ Tp: ast.AlterTableImportPartitionTablespace, @@ -11722,7 +11640,7 @@ yynewstate: yylex.AppendError(yylex.Errorf("The IMPORT PARTITION TABLESPACE clause is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } - case 74: + case 59: { ret := &ast.AlterTableSpec{ Tp: ast.AlterTableDiscardPartitionTablespace, @@ -11736,7 +11654,7 @@ yynewstate: yylex.AppendError(yylex.Errorf("The DISCARD PARTITION TABLESPACE clause is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } - case 75: + case 60: { ret := &ast.AlterTableSpec{ Tp: ast.AlterTableImportTablespace, @@ -11745,7 +11663,7 @@ yynewstate: yylex.AppendError(yylex.Errorf("The IMPORT TABLESPACE clause is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } - case 76: + case 61: { ret := &ast.AlterTableSpec{ Tp: ast.AlterTableDiscardTablespace, @@ -11754,7 +11672,7 @@ yynewstate: yylex.AppendError(yylex.Errorf("The DISCARD TABLESPACE clause is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } - case 77: + case 62: { ret := &ast.AlterTableSpec{ Tp: ast.AlterTableRebuildPartition, @@ -11767,7 +11685,7 @@ yynewstate: } parser.yyVAL.item = ret } - case 78: + case 63: { parser.yyVAL.item = &ast.AlterTableSpec{ IfExists: yyS[yypt-1].item.(bool), @@ -11775,7 +11693,7 @@ yynewstate: Name: yyS[yypt-0].ident, } } - case 79: + case 64: { parser.yyVAL.item = &ast.AlterTableSpec{ IfExists: yyS[yypt-1].item.(bool), @@ -11783,26 +11701,26 @@ yynewstate: Name: yyS[yypt-0].ident, } } - case 80: + case 65: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableOrderByColumns, OrderByList: yyS[yypt-0].item.([]*ast.AlterOrderItem), } } - case 81: + case 66: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableDisableKeys, } } - case 82: + case 67: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableEnableKeys, } } - case 83: + case 68: { parser.yyVAL.item = &ast.AlterTableSpec{ IfExists: yyS[yypt-2].item.(bool), @@ -11811,7 +11729,7 @@ yynewstate: Position: yyS[yypt-0].item.(*ast.ColumnPosition), } } - case 84: + case 69: { parser.yyVAL.item = &ast.AlterTableSpec{ IfExists: yyS[yypt-3].item.(bool), @@ -11821,7 +11739,7 @@ yynewstate: Position: yyS[yypt-0].item.(*ast.ColumnPosition), } } - case 85: + case 70: { option := &ast.ColumnOption{Expr: yyS[yypt-0].expr} colDef := &ast.ColumnDef{ @@ -11833,7 +11751,7 @@ yynewstate: NewColumns: []*ast.ColumnDef{colDef}, } } - case 86: + case 71: { option := &ast.ColumnOption{Expr: yyS[yypt-1].expr} colDef := &ast.ColumnDef{ @@ -11845,7 +11763,7 @@ yynewstate: NewColumns: []*ast.ColumnDef{colDef}, } } - case 87: + case 72: { colDef := &ast.ColumnDef{ Name: yyS[yypt-2].item.(*ast.ColumnName), @@ -11855,7 +11773,7 @@ yynewstate: NewColumns: []*ast.ColumnDef{colDef}, } } - case 88: + case 73: { oldColName := &ast.ColumnName{Name: model.NewCIStr(yyS[yypt-2].ident)} newColName := &ast.ColumnName{Name: model.NewCIStr(yyS[yypt-0].ident)} @@ -11865,28 +11783,28 @@ yynewstate: NewColumnName: newColName, } } - case 89: + case 74: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableRenameTable, NewTable: yyS[yypt-0].item.(*ast.TableName), } } - case 90: + case 75: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableRenameTable, NewTable: yyS[yypt-0].item.(*ast.TableName), } } - case 91: + case 76: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableRenameTable, NewTable: yyS[yypt-0].item.(*ast.TableName), } } - case 92: + case 77: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableRenameIndex, @@ -11894,21 +11812,21 @@ yynewstate: ToKey: model.NewCIStr(yyS[yypt-0].ident), } } - case 93: + case 78: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableLock, LockType: yyS[yypt-0].item.(ast.LockType), } } - case 94: + case 79: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableWriteable, Writeable: yyS[yypt-0].item.(bool), } } - case 95: + case 80: { // Parse it and ignore it. Just for compatibility. parser.yyVAL.item = &ast.AlterTableSpec{ @@ -11916,28 +11834,28 @@ yynewstate: Algorithm: yyS[yypt-0].item.(ast.AlgorithmType), } } - case 96: + case 81: { // Parse it and ignore it. Just for compatibility. parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableForce, } } - case 97: + case 82: { // Parse it and ignore it. Just for compatibility. parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableWithValidation, } } - case 98: + case 83: { // Parse it and ignore it. Just for compatibility. parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableWithoutValidation, } } - case 99: + case 84: { // Parse it and ignore it. Just for compatibility. parser.yyVAL.item = &ast.AlterTableSpec{ @@ -11946,7 +11864,7 @@ yynewstate: yylex.AppendError(yylex.Errorf("The SECONDARY_LOAD clause is parsed but not implement yet.")) parser.lastErrorAsWarn() } - case 100: + case 85: { // Parse it and ignore it. Just for compatibility. parser.yyVAL.item = &ast.AlterTableSpec{ @@ -11955,7 +11873,7 @@ yynewstate: yylex.AppendError(yylex.Errorf("The SECONDARY_UNLOAD VALIDATION clause is parsed but not implement yet.")) parser.lastErrorAsWarn() } - case 101: + case 86: { c := &ast.Constraint{ Name: yyS[yypt-1].ident, @@ -11966,7 +11884,7 @@ yynewstate: Constraint: c, } } - case 102: + case 87: { // Parse it and ignore it. Just for compatibility. c := &ast.Constraint{ @@ -11977,7 +11895,7 @@ yynewstate: Constraint: c, } } - case 103: + case 88: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableIndexInvisible, @@ -11985,26 +11903,19 @@ yynewstate: Visibility: yyS[yypt-0].item.(ast.IndexVisibility), } } - case 104: - { - parser.yyVAL.item = &ast.AlterTableSpec{ - Tp: ast.AlterTablePlacement, - PlacementSpecs: yyS[yypt-0].item.([]*ast.PlacementSpec), - } - } - case 105: + case 89: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableCache, } } - case 106: + case 90: { parser.yyVAL.item = &ast.AlterTableSpec{ Tp: ast.AlterTableNoCache, } } - case 107: + case 91: { ret := &ast.AlterTableSpec{ Tp: ast.AlterTableReorganizePartition, @@ -12012,7 +11923,7 @@ yynewstate: } parser.yyVAL.item = ret } - case 108: + case 92: { ret := &ast.AlterTableSpec{ Tp: ast.AlterTableReorganizePartition, @@ -12021,56 +11932,56 @@ yynewstate: } parser.yyVAL.item = ret } - case 109: + case 93: { parser.yyVAL.item = nil } - case 111: + case 95: { parser.yyVAL.item = true } - case 113: + case 97: { parser.yyVAL.item = true } - case 114: + case 98: { parser.yyVAL.item = false } - case 115: + case 99: { parser.yyVAL.item = model.PrimaryKeyTypeClustered } - case 116: + case 100: { parser.yyVAL.item = model.PrimaryKeyTypeNonClustered } - case 117: + case 101: { parser.yyVAL.item = ast.AlgorithmTypeDefault } - case 118: + case 102: { parser.yyVAL.item = ast.AlgorithmTypeCopy } - case 119: + case 103: { parser.yyVAL.item = ast.AlgorithmTypeInplace } - case 120: + case 104: { parser.yyVAL.item = ast.AlgorithmTypeInstant } - case 121: + case 105: { yylex.AppendError(ErrUnknownAlterAlgorithm.GenWithStackByArgs(yyS[yypt-2].ident)) return 1 } - case 122: + case 106: { parser.yyVAL.item = ast.LockTypeDefault } - case 123: + case 107: { id := strings.ToUpper(yyS[yypt-0].ident) @@ -12085,138 +11996,138 @@ yynewstate: return 1 } } - case 124: + case 108: { parser.yyVAL.item = true } - case 125: + case 109: { parser.yyVAL.item = false } - case 132: + case 116: { parser.yyVAL.item = &ast.ColumnPosition{Tp: ast.ColumnPositionNone} } - case 133: + case 117: { parser.yyVAL.item = &ast.ColumnPosition{Tp: ast.ColumnPositionFirst} } - case 134: + case 118: { parser.yyVAL.item = &ast.ColumnPosition{ Tp: ast.ColumnPositionAfter, RelativeColumn: yyS[yypt-0].item.(*ast.ColumnName), } } - case 135: + case 119: { parser.yyVAL.item = make([]*ast.AlterTableSpec, 0, 1) } - case 137: + case 121: { parser.yyVAL.item = []*ast.AlterTableSpec{yyS[yypt-0].item.(*ast.AlterTableSpec)} } - case 138: + case 122: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.AlterTableSpec), yyS[yypt-0].item.(*ast.AlterTableSpec)) } - case 139: + case 123: { parser.yyVAL.item = []model.CIStr{model.NewCIStr(yyS[yypt-0].ident)} } - case 140: + case 124: { parser.yyVAL.item = append(yyS[yypt-2].item.([]model.CIStr), model.NewCIStr(yyS[yypt-0].ident)) } - case 141: + case 125: { parser.yyVAL.item = nil } - case 142: + case 126: { parser.yyVAL.item = nil } - case 143: + case 127: { parser.yyVAL.item = yyS[yypt-0].ident } - case 145: + case 129: { parser.yyVAL.statement = &ast.RenameTableStmt{ TableToTables: yyS[yypt-0].item.([]*ast.TableToTable), } } - case 146: + case 130: { parser.yyVAL.item = []*ast.TableToTable{yyS[yypt-0].item.(*ast.TableToTable)} } - case 147: + case 131: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.TableToTable), yyS[yypt-0].item.(*ast.TableToTable)) } - case 148: + case 132: { parser.yyVAL.item = &ast.TableToTable{ OldTable: yyS[yypt-2].item.(*ast.TableName), NewTable: yyS[yypt-0].item.(*ast.TableName), } } - case 149: + case 133: { parser.yyVAL.statement = &ast.RenameUserStmt{ UserToUsers: yyS[yypt-0].item.([]*ast.UserToUser), } } - case 150: + case 134: { parser.yyVAL.item = []*ast.UserToUser{yyS[yypt-0].item.(*ast.UserToUser)} } - case 151: + case 135: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.UserToUser), yyS[yypt-0].item.(*ast.UserToUser)) } - case 152: + case 136: { parser.yyVAL.item = &ast.UserToUser{ OldUser: yyS[yypt-2].item.(*auth.UserIdentity), NewUser: yyS[yypt-0].item.(*auth.UserIdentity), } } - case 153: + case 137: { parser.yyVAL.statement = &ast.RecoverTableStmt{ JobID: yyS[yypt-0].item.(int64), } } - case 154: + case 138: { parser.yyVAL.statement = &ast.RecoverTableStmt{ Table: yyS[yypt-0].item.(*ast.TableName), } } - case 155: + case 139: { parser.yyVAL.statement = &ast.RecoverTableStmt{ Table: yyS[yypt-1].item.(*ast.TableName), JobNum: yyS[yypt-0].item.(int64), } } - case 156: + case 140: { parser.yyVAL.statement = &ast.FlashBackTableStmt{ Table: yyS[yypt-1].item.(*ast.TableName), NewName: yyS[yypt-0].ident, } } - case 157: + case 141: { parser.yyVAL.ident = "" } - case 158: + case 142: { parser.yyVAL.ident = yyS[yypt-0].ident } - case 159: + case 143: { parser.yyVAL.statement = &ast.SplitRegionStmt{ SplitSyntaxOpt: yyS[yypt-4].item.(*ast.SplitSyntaxOption), @@ -12225,7 +12136,7 @@ yynewstate: SplitOpt: yyS[yypt-0].item.(*ast.SplitOption), } } - case 160: + case 144: { parser.yyVAL.statement = &ast.SplitRegionStmt{ SplitSyntaxOpt: yyS[yypt-6].item.(*ast.SplitSyntaxOption), @@ -12235,7 +12146,7 @@ yynewstate: SplitOpt: yyS[yypt-0].item.(*ast.SplitOption), } } - case 161: + case 145: { parser.yyVAL.item = &ast.SplitOption{ Lower: yyS[yypt-4].item.([]ast.ExprNode), @@ -12243,52 +12154,52 @@ yynewstate: Num: yyS[yypt-0].item.(int64), } } - case 162: + case 146: { parser.yyVAL.item = &ast.SplitOption{ ValueLists: yyS[yypt-0].item.([][]ast.ExprNode), } } - case 163: + case 147: { parser.yyVAL.item = &ast.SplitSyntaxOption{} } - case 164: + case 148: { parser.yyVAL.item = &ast.SplitSyntaxOption{ HasRegionFor: true, } } - case 165: + case 149: { parser.yyVAL.item = &ast.SplitSyntaxOption{ HasPartition: true, } } - case 166: + case 150: { parser.yyVAL.item = &ast.SplitSyntaxOption{ HasRegionFor: true, HasPartition: true, } } - case 167: + case 151: { - parser.yyVAL.statement = &ast.AnalyzeTableStmt{TableNames: yyS[yypt-2].item.([]*ast.TableName), PredicateColumns: yyS[yypt-1].item.(bool), AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt)} + parser.yyVAL.statement = &ast.AnalyzeTableStmt{TableNames: yyS[yypt-2].item.([]*ast.TableName), ColumnChoice: yyS[yypt-1].item.(model.ColumnChoice), AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt)} } - case 168: + case 152: { parser.yyVAL.statement = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{yyS[yypt-3].item.(*ast.TableName)}, IndexNames: yyS[yypt-1].item.([]model.CIStr), IndexFlag: true, AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt)} } - case 169: + case 153: { parser.yyVAL.statement = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{yyS[yypt-3].item.(*ast.TableName)}, IndexNames: yyS[yypt-1].item.([]model.CIStr), IndexFlag: true, Incremental: true, AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt)} } - case 170: + case 154: { - parser.yyVAL.statement = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{yyS[yypt-4].item.(*ast.TableName)}, PartitionNames: yyS[yypt-2].item.([]model.CIStr), PredicateColumns: yyS[yypt-1].item.(bool), AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt)} + parser.yyVAL.statement = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{yyS[yypt-4].item.(*ast.TableName)}, PartitionNames: yyS[yypt-2].item.([]model.CIStr), ColumnChoice: yyS[yypt-1].item.(model.ColumnChoice), AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt)} } - case 171: + case 155: { parser.yyVAL.statement = &ast.AnalyzeTableStmt{ TableNames: []*ast.TableName{yyS[yypt-5].item.(*ast.TableName)}, @@ -12298,7 +12209,7 @@ yynewstate: AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt), } } - case 172: + case 156: { parser.yyVAL.statement = &ast.AnalyzeTableStmt{ TableNames: []*ast.TableName{yyS[yypt-5].item.(*ast.TableName)}, @@ -12309,158 +12220,168 @@ yynewstate: AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt), } } - case 173: + case 157: { parser.yyVAL.statement = &ast.AnalyzeTableStmt{ TableNames: []*ast.TableName{yyS[yypt-5].item.(*ast.TableName)}, - ColumnNames: yyS[yypt-1].item.([]*ast.ColumnName), + ColumnNames: yyS[yypt-1].item.([]model.CIStr), AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt), HistogramOperation: ast.HistogramOperationUpdate, } } - case 174: + case 158: { parser.yyVAL.statement = &ast.AnalyzeTableStmt{ TableNames: []*ast.TableName{yyS[yypt-4].item.(*ast.TableName)}, - ColumnNames: yyS[yypt-0].item.([]*ast.ColumnName), + ColumnNames: yyS[yypt-0].item.([]model.CIStr), HistogramOperation: ast.HistogramOperationDrop, } } - case 175: + case 159: { parser.yyVAL.statement = &ast.AnalyzeTableStmt{ - TableNames: []*ast.TableName{yyS[yypt-3].item.(*ast.TableName)}, - ColumnNames: yyS[yypt-1].item.([]*ast.ColumnName), - AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt)} + TableNames: []*ast.TableName{yyS[yypt-3].item.(*ast.TableName)}, + ColumnNames: yyS[yypt-1].item.([]model.CIStr), + ColumnChoice: model.ColumnList, + AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt)} } - case 176: + case 160: { parser.yyVAL.statement = &ast.AnalyzeTableStmt{ TableNames: []*ast.TableName{yyS[yypt-5].item.(*ast.TableName)}, PartitionNames: yyS[yypt-3].item.([]model.CIStr), - ColumnNames: yyS[yypt-1].item.([]*ast.ColumnName), + ColumnNames: yyS[yypt-1].item.([]model.CIStr), + ColumnChoice: model.ColumnList, AnalyzeOpts: yyS[yypt-0].item.([]ast.AnalyzeOpt)} } - case 177: + case 161: { - parser.yyVAL.item = false + parser.yyVAL.item = model.DefaultChoice } - case 178: + case 162: { - parser.yyVAL.item = true + parser.yyVAL.item = model.AllColumns } - case 179: + case 163: + { + parser.yyVAL.item = model.PredicateColumns + } + case 164: { parser.yyVAL.item = []ast.AnalyzeOpt{} } - case 180: + case 165: { parser.yyVAL.item = yyS[yypt-0].item.([]ast.AnalyzeOpt) } - case 181: + case 166: { parser.yyVAL.item = []ast.AnalyzeOpt{yyS[yypt-0].item.(ast.AnalyzeOpt)} } - case 182: + case 167: { parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.AnalyzeOpt), yyS[yypt-0].item.(ast.AnalyzeOpt)) } - case 183: + case 168: { - parser.yyVAL.item = ast.AnalyzeOpt{Type: ast.AnalyzeOptNumBuckets, Value: getUint64FromNUM(yyS[yypt-1].item)} + parser.yyVAL.item = ast.AnalyzeOpt{Type: ast.AnalyzeOptNumBuckets, Value: ast.NewValueExpr(yyS[yypt-1].item, "", "")} } - case 184: + case 169: { - parser.yyVAL.item = ast.AnalyzeOpt{Type: ast.AnalyzeOptNumTopN, Value: getUint64FromNUM(yyS[yypt-1].item)} + parser.yyVAL.item = ast.AnalyzeOpt{Type: ast.AnalyzeOptNumTopN, Value: ast.NewValueExpr(yyS[yypt-1].item, "", "")} } - case 185: + case 170: { - parser.yyVAL.item = ast.AnalyzeOpt{Type: ast.AnalyzeOptCMSketchDepth, Value: getUint64FromNUM(yyS[yypt-2].item)} + parser.yyVAL.item = ast.AnalyzeOpt{Type: ast.AnalyzeOptCMSketchDepth, Value: ast.NewValueExpr(yyS[yypt-2].item, "", "")} } - case 186: + case 171: { - parser.yyVAL.item = ast.AnalyzeOpt{Type: ast.AnalyzeOptCMSketchWidth, Value: getUint64FromNUM(yyS[yypt-2].item)} + parser.yyVAL.item = ast.AnalyzeOpt{Type: ast.AnalyzeOptCMSketchWidth, Value: ast.NewValueExpr(yyS[yypt-2].item, "", "")} } - case 187: + case 172: { - parser.yyVAL.item = ast.AnalyzeOpt{Type: ast.AnalyzeOptNumSamples, Value: getUint64FromNUM(yyS[yypt-1].item)} + parser.yyVAL.item = ast.AnalyzeOpt{Type: ast.AnalyzeOptNumSamples, Value: ast.NewValueExpr(yyS[yypt-1].item, "", "")} } - case 188: + case 173: + { + parser.yyVAL.item = ast.AnalyzeOpt{Type: ast.AnalyzeOptSampleRate, Value: ast.NewValueExpr(yyS[yypt-1].item, "", "")} + } + case 174: { parser.yyVAL.item = &ast.Assignment{Column: yyS[yypt-2].item.(*ast.ColumnName), Expr: yyS[yypt-0].expr} } - case 189: + case 175: { parser.yyVAL.item = []*ast.Assignment{yyS[yypt-0].item.(*ast.Assignment)} } - case 190: + case 176: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.Assignment), yyS[yypt-0].item.(*ast.Assignment)) } - case 191: + case 177: { parser.yyVAL.item = []*ast.Assignment{} } - case 193: + case 179: { parser.yyVAL.statement = &ast.BeginStmt{} } - case 194: + case 180: { parser.yyVAL.statement = &ast.BeginStmt{ Mode: ast.Pessimistic, } } - case 195: + case 181: { parser.yyVAL.statement = &ast.BeginStmt{ Mode: ast.Optimistic, } } - case 196: + case 182: { parser.yyVAL.statement = &ast.BeginStmt{} } - case 197: + case 183: { parser.yyVAL.statement = &ast.BeginStmt{} } - case 198: + case 184: { parser.yyVAL.statement = &ast.BeginStmt{} } - case 199: + case 185: { parser.yyVAL.statement = &ast.BeginStmt{ CausalConsistencyOnly: true, } } - case 200: + case 186: { parser.yyVAL.statement = &ast.BeginStmt{ ReadOnly: true, } } - case 201: + case 187: { parser.yyVAL.statement = &ast.BeginStmt{ ReadOnly: true, AsOf: yyS[yypt-0].item.(*ast.AsOfClause), } } - case 202: + case 188: { parser.yyVAL.statement = &ast.BinlogStmt{Str: yyS[yypt-0].ident} } - case 203: + case 189: { parser.yyVAL.item = []*ast.ColumnDef{yyS[yypt-0].item.(*ast.ColumnDef)} } - case 204: + case 190: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.ColumnDef), yyS[yypt-0].item.(*ast.ColumnDef)) } - case 205: + case 191: { colDef := &ast.ColumnDef{Name: yyS[yypt-2].item.(*ast.ColumnName), Tp: yyS[yypt-1].item.(*types.FieldType), Options: yyS[yypt-0].item.([]*ast.ColumnOption)} if !colDef.Validate() { @@ -12469,7 +12390,7 @@ yynewstate: } parser.yyVAL.item = colDef } - case 206: + case 192: { // TODO: check flen 0 tp := types.NewFieldType(mysql.TypeLonglong) @@ -12483,103 +12404,103 @@ yynewstate: } parser.yyVAL.item = colDef } - case 207: + case 193: { parser.yyVAL.item = &ast.ColumnName{Name: model.NewCIStr(yyS[yypt-0].ident)} } - case 208: + case 194: { parser.yyVAL.item = &ast.ColumnName{Table: model.NewCIStr(yyS[yypt-2].ident), Name: model.NewCIStr(yyS[yypt-0].ident)} } - case 209: + case 195: { 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 210: + case 196: { parser.yyVAL.item = []*ast.ColumnName{yyS[yypt-0].item.(*ast.ColumnName)} } - case 211: + case 197: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.ColumnName), yyS[yypt-0].item.(*ast.ColumnName)) } - case 212: + case 198: { parser.yyVAL.item = []*ast.ColumnName{} } - case 214: + case 200: { parser.yyVAL.item = []model.CIStr{} } - case 215: + case 201: { parser.yyVAL.item = yyS[yypt-1].item } - case 216: + case 202: { parser.yyVAL.item = []model.CIStr{model.NewCIStr(yyS[yypt-0].ident)} } - case 217: + case 203: { parser.yyVAL.item = append(yyS[yypt-2].item.([]model.CIStr), model.NewCIStr(yyS[yypt-0].ident)) } - case 218: + case 204: { parser.yyVAL.item = []*ast.ColumnNameOrUserVar{} } - case 220: + case 206: { parser.yyVAL.item = []*ast.ColumnNameOrUserVar{yyS[yypt-0].item.(*ast.ColumnNameOrUserVar)} } - case 221: + case 207: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.ColumnNameOrUserVar), yyS[yypt-0].item.(*ast.ColumnNameOrUserVar)) } - case 222: + case 208: { parser.yyVAL.item = &ast.ColumnNameOrUserVar{ColumnName: yyS[yypt-0].item.(*ast.ColumnName)} } - case 223: + case 209: { parser.yyVAL.item = &ast.ColumnNameOrUserVar{UserVar: yyS[yypt-0].expr.(*ast.VariableExpr)} } - case 224: + case 210: { parser.yyVAL.item = []*ast.ColumnNameOrUserVar{} } - case 225: + case 211: { parser.yyVAL.item = yyS[yypt-1].item.([]*ast.ColumnNameOrUserVar) } - case 226: + case 212: { parser.yyVAL.statement = &ast.CommitStmt{} } - case 227: + case 213: { parser.yyVAL.statement = &ast.CommitStmt{CompletionType: yyS[yypt-0].item.(ast.CompletionType)} } - case 231: + case 217: { parser.yyVAL.ident = "NOT" } - case 232: + case 218: { parser.yyVAL.item = true } - case 233: + case 219: { parser.yyVAL.item = false } - case 234: + case 220: { parser.yyVAL.item = true } - case 236: + case 222: { parser.yyVAL.item = 0 } - case 237: + case 223: { if yyS[yypt-0].item.(bool) { parser.yyVAL.item = 1 @@ -12587,57 +12508,57 @@ yynewstate: parser.yyVAL.item = 2 } } - case 238: + case 224: { parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionNotNull} } - case 239: + case 225: { parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionNull} } - case 240: + case 226: { parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionAutoIncrement} } - case 241: + case 227: { // 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 242: + case 228: { // 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, PrimaryKeyTp: yyS[yypt-0].item.(model.PrimaryKeyType)} } - case 243: + case 229: { parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionUniqKey} } - case 244: + case 230: { parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionUniqKey} } - case 245: + case 231: { parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionDefaultValue, Expr: yyS[yypt-0].expr} } - case 246: + case 232: { parser.yyVAL.item = []*ast.ColumnOption{{Tp: ast.ColumnOptionNotNull}, {Tp: ast.ColumnOptionAutoIncrement}, {Tp: ast.ColumnOptionUniqKey}} } - case 247: + case 233: { parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionOnUpdate, Expr: yyS[yypt-0].expr} } - case 248: + case 234: { parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionComment, Expr: ast.NewValueExpr(yyS[yypt-0].ident, "", "")} } - case 249: + case 235: { // See https://dev.mysql.com/doc/refman/5.7/en/create-table.html // The CHECK clause is parsed but ignored by all storage engines. @@ -12664,7 +12585,7 @@ yynewstate: default: } } - case 250: + case 236: { startOffset := parser.startOffset(&yyS[yypt-2]) endOffset := parser.endOffset(&yyS[yypt-1]) @@ -12677,56 +12598,56 @@ yynewstate: Stored: yyS[yypt-0].item.(bool), } } - case 251: + case 237: { parser.yyVAL.item = &ast.ColumnOption{ Tp: ast.ColumnOptionReference, Refer: yyS[yypt-0].item.(*ast.ReferenceDef), } } - case 252: + case 238: { parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionCollate, StrValue: yyS[yypt-0].ident} } - case 253: + case 239: { parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionColumnFormat, StrValue: yyS[yypt-0].ident} } - case 254: + case 240: { parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionStorage, StrValue: yyS[yypt-0].ident} yylex.AppendError(yylex.Errorf("The STORAGE clause is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } - case 255: + case 241: { parser.yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionAutoRandom, AutoRandomBitLength: yyS[yypt-0].item.(int)} } - case 259: + case 245: { parser.yyVAL.ident = "DEFAULT" } - case 260: + case 246: { parser.yyVAL.ident = "FIXED" } - case 261: + case 247: { parser.yyVAL.ident = "DYNAMIC" } - case 264: + case 250: { parser.yyVAL.item = false } - case 265: + case 251: { parser.yyVAL.item = false } - case 266: + case 252: { parser.yyVAL.item = true } - case 267: + case 253: { if columnOption, ok := yyS[yypt-0].item.(*ast.ColumnOption); ok { parser.yyVAL.item = []*ast.ColumnOption{columnOption} @@ -12734,7 +12655,7 @@ yynewstate: parser.yyVAL.item = yyS[yypt-0].item } } - case 268: + case 254: { if columnOption, ok := yyS[yypt-0].item.(*ast.ColumnOption); ok { parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.ColumnOption), columnOption) @@ -12742,11 +12663,11 @@ yynewstate: parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.ColumnOption), yyS[yypt-0].item.([]*ast.ColumnOption)...) } } - case 269: + case 255: { parser.yyVAL.item = []*ast.ColumnOption{} } - case 271: + case 257: { c := &ast.Constraint{ Tp: ast.ConstraintPrimaryKey, @@ -12765,7 +12686,7 @@ yynewstate: } parser.yyVAL.item = c } - case 272: + case 258: { c := &ast.Constraint{ Tp: ast.ConstraintFulltext, @@ -12778,7 +12699,7 @@ yynewstate: } parser.yyVAL.item = c } - case 273: + case 259: { c := &ast.Constraint{ IfNotExists: yyS[yypt-5].item.(bool), @@ -12798,7 +12719,7 @@ yynewstate: } parser.yyVAL.item = c } - case 274: + case 260: { c := &ast.Constraint{ Tp: ast.ConstraintUniq, @@ -12818,7 +12739,7 @@ yynewstate: } parser.yyVAL.item = c } - case 275: + case 261: { parser.yyVAL.item = &ast.Constraint{ IfNotExists: yyS[yypt-5].item.(bool), @@ -12829,7 +12750,7 @@ yynewstate: IsEmptyIndex: yyS[yypt-4].item.(*ast.NullString).Empty, } } - case 276: + case 262: { parser.yyVAL.item = &ast.Constraint{ Tp: ast.ConstraintCheck, @@ -12837,29 +12758,29 @@ yynewstate: Enforced: yyS[yypt-0].item.(bool), } } - case 277: + case 263: { parser.yyVAL.item = ast.MatchFull } - case 278: + case 264: { parser.yyVAL.item = ast.MatchPartial } - case 279: + case 265: { parser.yyVAL.item = ast.MatchSimple } - case 280: + case 266: { parser.yyVAL.item = ast.MatchNone } - case 281: + case 267: { parser.yyVAL.item = yyS[yypt-0].item yylex.AppendError(yylex.Errorf("The MATCH clause is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } - case 282: + case 268: { onDeleteUpdate := yyS[yypt-0].item.([2]interface{}) parser.yyVAL.item = &ast.ReferenceDef{ @@ -12870,69 +12791,69 @@ yynewstate: Match: yyS[yypt-1].item.(ast.MatchType), } } - case 283: + case 269: { parser.yyVAL.item = &ast.OnDeleteOpt{ReferOpt: yyS[yypt-0].item.(ast.ReferOptionType)} } - case 284: + case 270: { parser.yyVAL.item = &ast.OnUpdateOpt{ReferOpt: yyS[yypt-0].item.(ast.ReferOptionType)} } - case 285: + case 271: { parser.yyVAL.item = [2]interface{}{&ast.OnDeleteOpt{}, &ast.OnUpdateOpt{}} } - case 286: + case 272: { parser.yyVAL.item = [2]interface{}{yyS[yypt-0].item, &ast.OnUpdateOpt{}} } - case 287: + case 273: { parser.yyVAL.item = [2]interface{}{&ast.OnDeleteOpt{}, yyS[yypt-0].item} } - case 288: + case 274: { parser.yyVAL.item = [2]interface{}{yyS[yypt-1].item, yyS[yypt-0].item} } - case 289: + case 275: { parser.yyVAL.item = [2]interface{}{yyS[yypt-0].item, yyS[yypt-1].item} } - case 290: + case 276: { parser.yyVAL.item = ast.ReferOptionRestrict } - case 291: + case 277: { parser.yyVAL.item = ast.ReferOptionCascade } - case 292: + case 278: { parser.yyVAL.item = ast.ReferOptionSetNull } - case 293: + case 279: { parser.yyVAL.item = ast.ReferOptionNoAction } - case 294: + case 280: { parser.yyVAL.item = ast.ReferOptionSetDefault yylex.AppendError(yylex.Errorf("The SET DEFAULT clause is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } - case 298: + case 284: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP")} } - case 299: + case 285: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP")} } - case 300: + case 286: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP"), Args: []ast.ExprNode{ast.NewValueExpr(yyS[yypt-1].item, parser.charset, parser.collation)}} } - case 301: + case 287: { objNameExpr := &ast.TableNameExpr{ Name: yyS[yypt-0].item.(*ast.TableName), @@ -12942,7 +12863,7 @@ yynewstate: Args: []ast.ExprNode{objNameExpr}, } } - case 302: + case 288: { objNameExpr := &ast.TableNameExpr{ Name: yyS[yypt-1].item.(*ast.TableName), @@ -12952,31 +12873,31 @@ yynewstate: Args: []ast.ExprNode{objNameExpr}, } } - case 310: + case 296: { parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].expr, parser.charset, parser.collation) } - case 311: + case 297: { parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Plus, V: ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation)} } - case 312: + case 298: { parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Minus, V: ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation)} } - case 316: + case 302: { parser.yyVAL.item = ast.StatsTypeCardinality } - case 317: + case 303: { parser.yyVAL.item = ast.StatsTypeDependency } - case 318: + case 304: { parser.yyVAL.item = ast.StatsTypeCorrelation } - case 319: + case 305: { parser.yyVAL.statement = &ast.CreateStatisticsStmt{ IfNotExists: yyS[yypt-9].item.(bool), @@ -12986,11 +12907,11 @@ yynewstate: Columns: yyS[yypt-1].item.([]*ast.ColumnName), } } - case 320: + case 306: { parser.yyVAL.statement = &ast.DropStatisticsStmt{StatsName: yyS[yypt-0].ident} } - case 321: + case 307: { var indexOption *ast.IndexOption if yyS[yypt-1].item != nil { @@ -13023,80 +12944,80 @@ yynewstate: LockAlg: indexLockAndAlgorithm, } } - case 322: + case 308: { parser.yyVAL.item = ([]*ast.IndexPartSpecification)(nil) } - case 323: + case 309: { parser.yyVAL.item = yyS[yypt-1].item } - case 324: + case 310: { parser.yyVAL.item = []*ast.IndexPartSpecification{yyS[yypt-0].item.(*ast.IndexPartSpecification)} } - case 325: + case 311: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.IndexPartSpecification), yyS[yypt-0].item.(*ast.IndexPartSpecification)) } - case 326: + case 312: { // Order is parsed but just ignored as MySQL did. parser.yyVAL.item = &ast.IndexPartSpecification{Column: yyS[yypt-2].item.(*ast.ColumnName), Length: yyS[yypt-1].item.(int)} } - case 327: + case 313: { parser.yyVAL.item = &ast.IndexPartSpecification{Expr: yyS[yypt-2].expr} } - case 328: + case 314: { parser.yyVAL.item = nil } - case 329: + case 315: { parser.yyVAL.item = &ast.IndexLockAndAlgorithm{ LockTp: yyS[yypt-0].item.(ast.LockType), AlgorithmTp: ast.AlgorithmTypeDefault, } } - case 330: + case 316: { parser.yyVAL.item = &ast.IndexLockAndAlgorithm{ LockTp: ast.LockTypeDefault, AlgorithmTp: yyS[yypt-0].item.(ast.AlgorithmType), } } - case 331: + case 317: { parser.yyVAL.item = &ast.IndexLockAndAlgorithm{ LockTp: yyS[yypt-1].item.(ast.LockType), AlgorithmTp: yyS[yypt-0].item.(ast.AlgorithmType), } } - case 332: + case 318: { parser.yyVAL.item = &ast.IndexLockAndAlgorithm{ LockTp: yyS[yypt-0].item.(ast.LockType), AlgorithmTp: yyS[yypt-1].item.(ast.AlgorithmType), } } - case 333: + case 319: { parser.yyVAL.item = ast.IndexKeyTypeNone } - case 334: + case 320: { parser.yyVAL.item = ast.IndexKeyTypeUnique } - case 335: + case 321: { parser.yyVAL.item = ast.IndexKeyTypeSpatial } - case 336: + case 322: { parser.yyVAL.item = ast.IndexKeyTypeFullText } - case 337: + case 323: { parser.yyVAL.statement = &ast.AlterDatabaseStmt{ Name: yyS[yypt-1].ident, @@ -13104,7 +13025,7 @@ yynewstate: Options: yyS[yypt-0].item.([]*ast.DatabaseOption), } } - case 338: + case 324: { parser.yyVAL.statement = &ast.AlterDatabaseStmt{ Name: "", @@ -13112,7 +13033,7 @@ yynewstate: Options: yyS[yypt-0].item.([]*ast.DatabaseOption), } } - case 339: + case 325: { parser.yyVAL.statement = &ast.CreateDatabaseStmt{ IfNotExists: yyS[yypt-2].item.(bool), @@ -13120,19 +13041,19 @@ yynewstate: Options: yyS[yypt-0].item.([]*ast.DatabaseOption), } } - case 342: + case 328: { parser.yyVAL.item = &ast.DatabaseOption{Tp: ast.DatabaseOptionCharset, Value: yyS[yypt-0].ident} } - case 343: + case 329: { parser.yyVAL.item = &ast.DatabaseOption{Tp: ast.DatabaseOptionCollate, Value: yyS[yypt-0].ident} } - case 344: + case 330: { parser.yyVAL.item = &ast.DatabaseOption{Tp: ast.DatabaseOptionEncryption, Value: yyS[yypt-0].ident} } - case 345: + case 331: { placementOptions := yyS[yypt-0].item.(*ast.PlacementOption) parser.yyVAL.item = &ast.DatabaseOption{ @@ -13142,7 +13063,7 @@ yynewstate: UintValue: placementOptions.UintValue, } } - case 346: + case 332: { placementOptions := yyS[yypt-0].item.(*ast.PlacementOption) parser.yyVAL.item = &ast.DatabaseOption{ @@ -13152,19 +13073,19 @@ yynewstate: UintValue: placementOptions.UintValue, } } - case 347: + case 333: { parser.yyVAL.item = []*ast.DatabaseOption{} } - case 349: + case 335: { parser.yyVAL.item = []*ast.DatabaseOption{yyS[yypt-0].item.(*ast.DatabaseOption)} } - case 350: + case 336: { parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.DatabaseOption), yyS[yypt-0].item.(*ast.DatabaseOption)) } - case 351: + case 337: { stmt := yyS[yypt-6].item.(*ast.CreateTableStmt) stmt.Table = yyS[yypt-7].item.(*ast.TableName) @@ -13185,7 +13106,7 @@ yynewstate: } parser.yyVAL.statement = stmt } - case 352: + case 338: { tmp := &ast.CreateTableStmt{ Table: yyS[yypt-2].item.(*ast.TableName), @@ -13202,23 +13123,23 @@ yynewstate: } parser.yyVAL.statement = tmp } - case 353: + case 339: { parser.yyVAL.item = nil } - case 354: + case 340: { parser.yyVAL.item = true } - case 355: + case 341: { parser.yyVAL.item = false } - case 358: + case 344: { parser.yyVAL.item = nil } - case 359: + case 345: { method := yyS[yypt-3].item.(*ast.PartitionMethod) method.Num = yyS[yypt-2].item.(uint64) @@ -13235,7 +13156,7 @@ yynewstate: } parser.yyVAL.item = opt } - case 360: + case 346: { keyAlgorithm, _ := yyS[yypt-3].item.(*ast.PartitionKeyAlgorithm) parser.yyVAL.item = &ast.PartitionMethod{ @@ -13245,7 +13166,7 @@ yynewstate: KeyAlgorithm: keyAlgorithm, } } - case 361: + case 347: { parser.yyVAL.item = &ast.PartitionMethod{ Tp: model.PartitionTypeHash, @@ -13253,11 +13174,11 @@ yynewstate: Expr: yyS[yypt-1].expr.(ast.ExprNode), } } - case 362: + case 348: { parser.yyVAL.item = nil } - case 363: + case 349: { tp := getUint64FromNUM(yyS[yypt-0].item) if tp != 1 && tp != 2 { @@ -13268,35 +13189,35 @@ yynewstate: Type: tp, } } - case 365: + case 351: { parser.yyVAL.item = &ast.PartitionMethod{ Tp: model.PartitionTypeRange, Expr: yyS[yypt-1].expr.(ast.ExprNode), } } - case 366: + case 352: { parser.yyVAL.item = &ast.PartitionMethod{ Tp: model.PartitionTypeRange, ColumnNames: yyS[yypt-1].item.([]*ast.ColumnName), } } - case 367: + case 353: { parser.yyVAL.item = &ast.PartitionMethod{ Tp: model.PartitionTypeList, Expr: yyS[yypt-1].expr.(ast.ExprNode), } } - case 368: + case 354: { parser.yyVAL.item = &ast.PartitionMethod{ Tp: model.PartitionTypeList, ColumnNames: yyS[yypt-1].item.([]*ast.ColumnName), } } - case 369: + case 355: { parser.yyVAL.item = &ast.PartitionMethod{ Tp: model.PartitionTypeSystemTime, @@ -13304,38 +13225,38 @@ yynewstate: Unit: yyS[yypt-0].item.(ast.TimeUnitType), } } - case 370: + case 356: { parser.yyVAL.item = &ast.PartitionMethod{ Tp: model.PartitionTypeSystemTime, Limit: yyS[yypt-0].item.(uint64), } } - case 371: + case 357: { parser.yyVAL.item = &ast.PartitionMethod{ Tp: model.PartitionTypeSystemTime, } } - case 372: + case 358: { parser.yyVAL.ident = "" } - case 374: + case 360: { parser.yyVAL.item = nil } - case 375: + case 361: { method := yyS[yypt-1].item.(*ast.PartitionMethod) method.Num = yyS[yypt-0].item.(uint64) parser.yyVAL.item = method } - case 376: + case 362: { parser.yyVAL.item = uint64(0) } - case 377: + case 363: { res := yyS[yypt-0].item.(uint64) if res == 0 { @@ -13344,11 +13265,11 @@ yynewstate: } parser.yyVAL.item = res } - case 378: + case 364: { parser.yyVAL.item = uint64(0) } - case 379: + case 365: { res := yyS[yypt-0].item.(uint64) if res == 0 { @@ -13357,23 +13278,23 @@ yynewstate: } parser.yyVAL.item = res } - case 380: + case 366: { parser.yyVAL.item = nil } - case 381: + case 367: { parser.yyVAL.item = yyS[yypt-1].item.([]*ast.PartitionDefinition) } - case 382: + case 368: { parser.yyVAL.item = []*ast.PartitionDefinition{yyS[yypt-0].item.(*ast.PartitionDefinition)} } - case 383: + case 369: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.PartitionDefinition), yyS[yypt-0].item.(*ast.PartitionDefinition)) } - case 384: + case 370: { parser.yyVAL.item = &ast.PartitionDefinition{ Name: model.NewCIStr(yyS[yypt-3].ident), @@ -13382,80 +13303,80 @@ yynewstate: Sub: yyS[yypt-0].item.([]*ast.SubPartitionDefinition), } } - case 385: + case 371: { parser.yyVAL.item = make([]*ast.SubPartitionDefinition, 0) } - case 386: + case 372: { parser.yyVAL.item = yyS[yypt-1].item } - case 387: + case 373: { parser.yyVAL.item = []*ast.SubPartitionDefinition{yyS[yypt-0].item.(*ast.SubPartitionDefinition)} } - case 388: + case 374: { list := yyS[yypt-2].item.([]*ast.SubPartitionDefinition) parser.yyVAL.item = append(list, yyS[yypt-0].item.(*ast.SubPartitionDefinition)) } - case 389: + case 375: { parser.yyVAL.item = &ast.SubPartitionDefinition{ Name: model.NewCIStr(yyS[yypt-1].ident), Options: yyS[yypt-0].item.([]*ast.TableOption), } } - case 390: + case 376: { parser.yyVAL.item = make([]*ast.TableOption, 0) } - case 391: + case 377: { list := yyS[yypt-1].item.([]*ast.TableOption) parser.yyVAL.item = append(list, yyS[yypt-0].item.(*ast.TableOption)) } - case 392: + case 378: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionComment, StrValue: yyS[yypt-0].ident} } - case 393: + case 379: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionEngine, StrValue: yyS[yypt-0].ident} } - case 394: + case 380: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionEngine, StrValue: yyS[yypt-0].ident} } - case 395: + case 381: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionInsertMethod, StrValue: yyS[yypt-0].ident} } - case 396: + case 382: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionDataDirectory, StrValue: yyS[yypt-0].ident} } - case 397: + case 383: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionIndexDirectory, StrValue: yyS[yypt-0].ident} } - case 398: + case 384: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionMaxRows, UintValue: yyS[yypt-0].item.(uint64)} } - case 399: + case 385: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionMinRows, UintValue: yyS[yypt-0].item.(uint64)} } - case 400: + case 386: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionTablespace, StrValue: yyS[yypt-0].ident} } - case 401: + case 387: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionNodegroup, UintValue: yyS[yypt-0].item.(uint64)} } - case 402: + case 388: { placementOptions := yyS[yypt-0].item.(*ast.PlacementOption) parser.yyVAL.item = &ast.TableOption{ @@ -13465,27 +13386,27 @@ yynewstate: UintValue: placementOptions.UintValue, } } - case 403: + case 389: { parser.yyVAL.item = &ast.PartitionDefinitionClauseNone{} } - case 404: + case 390: { parser.yyVAL.item = &ast.PartitionDefinitionClauseLessThan{ Exprs: []ast.ExprNode{&ast.MaxValueExpr{}}, } } - case 405: + case 391: { parser.yyVAL.item = &ast.PartitionDefinitionClauseLessThan{ Exprs: yyS[yypt-1].item.([]ast.ExprNode), } } - case 406: + case 392: { parser.yyVAL.item = &ast.PartitionDefinitionClauseIn{} } - case 407: + case 393: { exprs := yyS[yypt-1].item.([]ast.ExprNode) values := make([][]ast.ExprNode, 0, len(exprs)) @@ -13498,43 +13419,43 @@ yynewstate: } parser.yyVAL.item = &ast.PartitionDefinitionClauseIn{Values: values} } - case 408: + case 394: { parser.yyVAL.item = &ast.PartitionDefinitionClauseHistory{Current: false} } - case 409: + case 395: { parser.yyVAL.item = &ast.PartitionDefinitionClauseHistory{Current: true} } - case 410: + case 396: { parser.yyVAL.item = ast.OnDuplicateKeyHandlingError } - case 411: + case 397: { parser.yyVAL.item = ast.OnDuplicateKeyHandlingIgnore } - case 412: + case 398: { parser.yyVAL.item = ast.OnDuplicateKeyHandlingReplace } - case 415: + case 401: { parser.yyVAL.item = &ast.CreateTableStmt{} } - case 416: + case 402: { parser.yyVAL.item = &ast.CreateTableStmt{Select: yyS[yypt-0].statement.(ast.ResultSetNode)} } - case 417: + case 403: { parser.yyVAL.item = &ast.CreateTableStmt{Select: yyS[yypt-0].statement.(ast.ResultSetNode)} } - case 418: + case 404: { parser.yyVAL.item = &ast.CreateTableStmt{Select: yyS[yypt-0].statement.(ast.ResultSetNode)} } - case 419: + case 405: { var sel ast.ResultSetNode switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { @@ -13547,7 +13468,7 @@ yynewstate: } parser.yyVAL.item = &ast.CreateTableStmt{Select: sel} } - case 423: + case 409: { var sel ast.StmtNode switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { @@ -13560,15 +13481,15 @@ yynewstate: } parser.yyVAL.statement = sel } - case 424: + case 410: { parser.yyVAL.item = yyS[yypt-0].item } - case 425: + case 411: { parser.yyVAL.item = yyS[yypt-1].item } - case 426: + case 412: { startOffset := parser.startOffset(&yyS[yypt-1]) selStmt := yyS[yypt-1].statement.(ast.StmtNode) @@ -13593,85 +13514,85 @@ yynewstate: } parser.yyVAL.statement = x } - case 427: + case 413: { parser.yyVAL.item = false } - case 428: + case 414: { parser.yyVAL.item = true } - case 429: + case 415: { parser.yyVAL.item = model.AlgorithmUndefined } - case 430: + case 416: { parser.yyVAL.item = model.AlgorithmUndefined } - case 431: + case 417: { parser.yyVAL.item = model.AlgorithmMerge } - case 432: + case 418: { parser.yyVAL.item = model.AlgorithmTemptable } - case 433: + case 419: { parser.yyVAL.item = &auth.UserIdentity{CurrentUser: true} } - case 434: + case 420: { parser.yyVAL.item = yyS[yypt-0].item } - case 435: + case 421: { parser.yyVAL.item = model.SecurityDefiner } - case 436: + case 422: { parser.yyVAL.item = model.SecurityDefiner } - case 437: + case 423: { parser.yyVAL.item = model.SecurityInvoker } - case 439: + case 425: { parser.yyVAL.item = nil } - case 440: + case 426: { parser.yyVAL.item = yyS[yypt-1].item.([]model.CIStr) } - case 441: + case 427: { parser.yyVAL.item = []model.CIStr{model.NewCIStr(yyS[yypt-0].ident)} } - case 442: + case 428: { parser.yyVAL.item = append(yyS[yypt-2].item.([]model.CIStr), model.NewCIStr(yyS[yypt-0].ident)) } - case 443: + case 429: { parser.yyVAL.item = nil } - case 444: + case 430: { parser.yyVAL.item = model.CheckOptionCascaded } - case 445: + case 431: { parser.yyVAL.item = model.CheckOptionLocal } - case 446: + case 432: { parser.yyVAL.statement = &ast.DoStmt{ Exprs: yyS[yypt-0].item.([]ast.ExprNode), } } - case 447: + case 433: { // Single Table tn := yyS[yypt-6].item.(*ast.TableName) @@ -13699,7 +13620,7 @@ yynewstate: parser.yyVAL.statement = x } - case 448: + case 434: { // Multiple Table x := &ast.DeleteStmt{ @@ -13719,7 +13640,7 @@ yynewstate: } parser.yyVAL.statement = x } - case 449: + case 435: { // Multiple Table x := &ast.DeleteStmt{ @@ -13738,23 +13659,23 @@ yynewstate: } parser.yyVAL.statement = x } - case 452: + case 438: { d := yyS[yypt-0].statement.(*ast.DeleteStmt) d.With = yyS[yypt-1].item.(*ast.WithClause) parser.yyVAL.statement = d } - case 453: + case 439: { d := yyS[yypt-0].statement.(*ast.DeleteStmt) d.With = yyS[yypt-1].item.(*ast.WithClause) parser.yyVAL.statement = d } - case 455: + case 441: { parser.yyVAL.statement = &ast.DropDatabaseStmt{IfExists: yyS[yypt-1].item.(bool), Name: yyS[yypt-0].ident} } - case 456: + case 442: { var indexLockAndAlgorithm *ast.IndexLockAndAlgorithm if yyS[yypt-0].item != nil { @@ -13765,39 +13686,39 @@ yynewstate: } parser.yyVAL.statement = &ast.DropIndexStmt{IfExists: yyS[yypt-4].item.(bool), IndexName: yyS[yypt-3].ident, Table: yyS[yypt-1].item.(*ast.TableName), LockAlg: indexLockAndAlgorithm} } - case 457: + case 443: { parser.yyVAL.statement = &ast.DropTableStmt{IfExists: yyS[yypt-2].item.(bool), Tables: yyS[yypt-1].item.([]*ast.TableName), IsView: false, TemporaryKeyword: yyS[yypt-4].item.(ast.TemporaryKeyword)} } - case 458: + case 444: { parser.yyVAL.item = ast.TemporaryNone } - case 459: + case 445: { parser.yyVAL.item = ast.TemporaryLocal } - case 460: + case 446: { parser.yyVAL.item = ast.TemporaryGlobal } - case 461: + case 447: { parser.yyVAL.statement = &ast.DropTableStmt{Tables: yyS[yypt-1].item.([]*ast.TableName), IsView: true} } - case 462: + case 448: { parser.yyVAL.statement = &ast.DropTableStmt{IfExists: true, Tables: yyS[yypt-1].item.([]*ast.TableName), IsView: true} } - case 463: + case 449: { parser.yyVAL.statement = &ast.DropUserStmt{IsDropRole: false, IfExists: false, UserList: yyS[yypt-0].item.([]*auth.UserIdentity)} } - case 464: + case 450: { parser.yyVAL.statement = &ast.DropUserStmt{IsDropRole: false, IfExists: true, UserList: yyS[yypt-0].item.([]*auth.UserIdentity)} } - case 465: + case 451: { tmp := make([]*auth.UserIdentity, 0, 10) roleList := yyS[yypt-0].item.([]*auth.RoleIdentity) @@ -13806,7 +13727,7 @@ yynewstate: } parser.yyVAL.statement = &ast.DropUserStmt{IsDropRole: true, IfExists: false, UserList: tmp} } - case 466: + case 452: { tmp := make([]*auth.UserIdentity, 0, 10) roleList := yyS[yypt-0].item.([]*auth.RoleIdentity) @@ -13815,47 +13736,68 @@ yynewstate: } parser.yyVAL.statement = &ast.DropUserStmt{IsDropRole: true, IfExists: true, UserList: tmp} } - case 467: + case 453: { parser.yyVAL.statement = &ast.DropStatsStmt{Table: yyS[yypt-0].item.(*ast.TableName)} } - case 468: + case 454: { parser.yyVAL.statement = &ast.DropStatsStmt{ Table: yyS[yypt-2].item.(*ast.TableName), PartitionNames: yyS[yypt-0].item.([]model.CIStr), } } - case 469: + case 455: { parser.yyVAL.statement = &ast.DropStatsStmt{ Table: yyS[yypt-1].item.(*ast.TableName), IsGlobalStats: true, } } - case 477: + case 463: { parser.yyVAL.statement = nil } - case 478: + case 464: { parser.yyVAL.statement = &ast.TraceStmt{ - Stmt: yyS[yypt-0].statement, - Format: "row", + Stmt: yyS[yypt-0].statement, + Format: "row", + TracePlan: false, } startOffset := parser.startOffset(&yyS[yypt]) yyS[yypt-0].statement.SetText(string(parser.src[startOffset:])) } - case 479: + case 465: { parser.yyVAL.statement = &ast.TraceStmt{ - Stmt: yyS[yypt-0].statement, - Format: yyS[yypt-1].ident, + Stmt: yyS[yypt-0].statement, + Format: yyS[yypt-1].ident, + TracePlan: false, + } + startOffset := parser.startOffset(&yyS[yypt]) + yyS[yypt-0].statement.SetText(string(parser.src[startOffset:])) + } + case 466: + { + parser.yyVAL.statement = &ast.TraceStmt{ + Stmt: yyS[yypt-0].statement, + TracePlan: true, + } + startOffset := parser.startOffset(&yyS[yypt]) + yyS[yypt-0].statement.SetText(string(parser.src[startOffset:])) + } + case 467: + { + parser.yyVAL.statement = &ast.TraceStmt{ + Stmt: yyS[yypt-0].statement, + TracePlan: true, + TracePlanTarget: yyS[yypt-1].ident, } startOffset := parser.startOffset(&yyS[yypt]) yyS[yypt-0].statement.SetText(string(parser.src[startOffset:])) } - case 483: + case 471: { parser.yyVAL.statement = &ast.ExplainStmt{ Stmt: &ast.ShowStmt{ @@ -13864,7 +13806,7 @@ yynewstate: }, } } - case 484: + case 472: { parser.yyVAL.statement = &ast.ExplainStmt{ Stmt: &ast.ShowStmt{ @@ -13874,49 +13816,49 @@ yynewstate: }, } } - case 485: + case 473: { parser.yyVAL.statement = &ast.ExplainStmt{ Stmt: yyS[yypt-0].statement, Format: "row", } } - case 486: + case 474: { parser.yyVAL.statement = &ast.ExplainForStmt{ Format: "row", ConnectionID: getUint64FromNUM(yyS[yypt-0].item), } } - case 487: + case 475: { parser.yyVAL.statement = &ast.ExplainForStmt{ Format: yyS[yypt-3].ident, ConnectionID: getUint64FromNUM(yyS[yypt-0].item), } } - case 488: + case 476: { parser.yyVAL.statement = &ast.ExplainStmt{ Stmt: yyS[yypt-0].statement, Format: yyS[yypt-1].ident, } } - case 489: + case 477: { parser.yyVAL.statement = &ast.ExplainForStmt{ Format: yyS[yypt-3].ident, ConnectionID: getUint64FromNUM(yyS[yypt-0].item), } } - case 490: + case 478: { parser.yyVAL.statement = &ast.ExplainStmt{ Stmt: yyS[yypt-0].statement, Format: yyS[yypt-1].ident, } } - case 491: + case 479: { parser.yyVAL.statement = &ast.ExplainStmt{ Stmt: yyS[yypt-0].statement, @@ -13924,7 +13866,7 @@ yynewstate: Analyze: true, } } - case 498: + case 486: { stmt := yyS[yypt-3].item.(*ast.BRIEStmt) stmt.Kind = ast.BRIEKindBackup @@ -13932,7 +13874,7 @@ yynewstate: stmt.Options = yyS[yypt-0].item.([]*ast.BRIEOption) parser.yyVAL.statement = stmt } - case 499: + case 487: { stmt := yyS[yypt-3].item.(*ast.BRIEStmt) stmt.Kind = ast.BRIEKindRestore @@ -13940,110 +13882,110 @@ yynewstate: stmt.Options = yyS[yypt-0].item.([]*ast.BRIEOption) parser.yyVAL.statement = stmt } - case 500: + case 488: { parser.yyVAL.item = &ast.BRIEStmt{} } - case 501: + case 489: { parser.yyVAL.item = &ast.BRIEStmt{Schemas: yyS[yypt-0].item.([]string)} } - case 502: + case 490: { parser.yyVAL.item = &ast.BRIEStmt{Tables: yyS[yypt-0].item.([]*ast.TableName)} } - case 503: + case 491: { parser.yyVAL.item = []string{yyS[yypt-0].ident} } - case 504: + case 492: { parser.yyVAL.item = append(yyS[yypt-2].item.([]string), yyS[yypt-0].ident) } - case 505: + case 493: { parser.yyVAL.item = []*ast.BRIEOption{} } - case 506: + case 494: { parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.BRIEOption), yyS[yypt-0].item.(*ast.BRIEOption)) } - case 507: + case 495: { parser.yyVAL.item = ast.BRIEOptionConcurrency } - case 508: + case 496: { parser.yyVAL.item = ast.BRIEOptionResume } - case 509: + case 497: { parser.yyVAL.item = ast.BRIEOptionSendCreds } - case 510: + case 498: { parser.yyVAL.item = ast.BRIEOptionOnline } - case 511: + case 499: { parser.yyVAL.item = ast.BRIEOptionCheckpoint } - case 512: + case 500: { parser.yyVAL.item = ast.BRIEOptionSkipSchemaFiles } - case 513: + case 501: { parser.yyVAL.item = ast.BRIEOptionStrictFormat } - case 514: + case 502: { parser.yyVAL.item = ast.BRIEOptionCSVNotNull } - case 515: + case 503: { parser.yyVAL.item = ast.BRIEOptionCSVBackslashEscape } - case 516: + case 504: { parser.yyVAL.item = ast.BRIEOptionCSVTrimLastSeparators } - case 517: + case 505: { parser.yyVAL.item = ast.BRIEOptionTiKVImporter } - case 518: + case 506: { parser.yyVAL.item = ast.BRIEOptionCSVSeparator } - case 519: + case 507: { parser.yyVAL.item = ast.BRIEOptionCSVDelimiter } - case 520: + case 508: { parser.yyVAL.item = ast.BRIEOptionCSVNull } - case 521: + case 509: { parser.yyVAL.item = ast.BRIEOptionBackend } - case 522: + case 510: { parser.yyVAL.item = ast.BRIEOptionOnDuplicate } - case 523: + case 511: { parser.yyVAL.item = ast.BRIEOptionOnDuplicate } - case 524: + case 512: { parser.yyVAL.item = &ast.BRIEOption{ Tp: yyS[yypt-2].item.(ast.BRIEOptionType), UintValue: yyS[yypt-0].item.(uint64), } } - case 525: + case 513: { value := uint64(0) if yyS[yypt-0].item.(bool) { @@ -14054,21 +13996,21 @@ yynewstate: UintValue: value, } } - case 526: + case 514: { parser.yyVAL.item = &ast.BRIEOption{ Tp: yyS[yypt-2].item.(ast.BRIEOptionType), StrValue: yyS[yypt-0].ident, } } - case 527: + case 515: { parser.yyVAL.item = &ast.BRIEOption{ Tp: yyS[yypt-2].item.(ast.BRIEOptionType), StrValue: strings.ToLower(yyS[yypt-0].ident), } } - case 528: + case 516: { unit, err := yyS[yypt-1].item.(ast.TimeUnitType).Duration() if err != nil { @@ -14081,35 +14023,35 @@ yynewstate: UintValue: yyS[yypt-2].item.(uint64) * uint64(unit), } } - case 529: + case 517: { parser.yyVAL.item = &ast.BRIEOption{ Tp: ast.BRIEOptionBackupTS, StrValue: yyS[yypt-0].ident, } } - case 530: + case 518: { parser.yyVAL.item = &ast.BRIEOption{ Tp: ast.BRIEOptionBackupTSO, UintValue: yyS[yypt-0].item.(uint64), } } - case 531: + case 519: { parser.yyVAL.item = &ast.BRIEOption{ Tp: ast.BRIEOptionLastBackupTS, StrValue: yyS[yypt-0].ident, } } - case 532: + case 520: { parser.yyVAL.item = &ast.BRIEOption{ Tp: ast.BRIEOptionLastBackupTSO, UintValue: yyS[yypt-0].item.(uint64), } } - case 533: + case 521: { // TODO: check overflow? parser.yyVAL.item = &ast.BRIEOption{ @@ -14117,21 +14059,21 @@ yynewstate: UintValue: yyS[yypt-3].item.(uint64) * 1048576, } } - case 534: + case 522: { parser.yyVAL.item = &ast.BRIEOption{ Tp: ast.BRIEOptionCSVHeader, UintValue: ast.BRIECSVHeaderIsColumns, } } - case 535: + case 523: { parser.yyVAL.item = &ast.BRIEOption{ Tp: ast.BRIEOptionCSVHeader, UintValue: yyS[yypt-0].item.(uint64), } } - case 536: + case 524: { value := uint64(0) if yyS[yypt-0].item.(bool) { @@ -14142,14 +14084,14 @@ yynewstate: UintValue: value, } } - case 537: + case 525: { parser.yyVAL.item = &ast.BRIEOption{ Tp: ast.BRIEOptionChecksum, UintValue: uint64(yyS[yypt-0].item.(ast.BRIEOptionLevel)), } } - case 538: + case 526: { value := uint64(0) if yyS[yypt-0].item.(bool) { @@ -14160,18 +14102,18 @@ yynewstate: UintValue: value, } } - case 539: + case 527: { parser.yyVAL.item = &ast.BRIEOption{ Tp: ast.BRIEOptionAnalyze, UintValue: uint64(yyS[yypt-0].item.(ast.BRIEOptionLevel)), } } - case 540: + case 528: { parser.yyVAL.item = getUint64FromNUM(yyS[yypt-0].item) } - case 541: + case 529: { v, rangeErrMsg := getInt64FromNUM(yyS[yypt-0].item) if len(rangeErrMsg) != 0 { @@ -14180,35 +14122,35 @@ yynewstate: } parser.yyVAL.item = v } - case 543: + case 531: { parser.yyVAL.item = yyS[yypt-0].item.(int64) != 0 } - case 544: + case 532: { parser.yyVAL.item = false } - case 545: + case 533: { parser.yyVAL.item = true } - case 546: + case 534: { parser.yyVAL.item = ast.BRIEOptionLevelOff } - case 547: + case 535: { parser.yyVAL.item = ast.BRIEOptionLevelOptional } - case 548: + case 536: { parser.yyVAL.item = ast.BRIEOptionLevelRequired } - case 549: + case 537: { parser.yyVAL.statement = &ast.PurgeImportStmt{TaskID: getUint64FromNUM(yyS[yypt-0].item)} } - case 550: + case 538: { parser.yyVAL.statement = &ast.CreateImportStmt{ IfNotExists: yyS[yypt-5].item.(bool), @@ -14218,21 +14160,21 @@ yynewstate: Options: yyS[yypt-0].item.([]*ast.BRIEOption), } } - case 551: + case 539: { parser.yyVAL.statement = &ast.StopImportStmt{ IfRunning: yyS[yypt-1].item.(bool), Name: yyS[yypt-0].ident, } } - case 552: + case 540: { parser.yyVAL.statement = &ast.ResumeImportStmt{ IfNotRunning: yyS[yypt-1].item.(bool), Name: yyS[yypt-0].ident, } } - case 553: + case 541: { s := &ast.AlterImportStmt{ Name: yyS[yypt-3].ident, @@ -14244,14 +14186,14 @@ yynewstate: } parser.yyVAL.statement = s } - case 554: + case 542: { parser.yyVAL.statement = &ast.DropImportStmt{ IfExists: yyS[yypt-1].item.(bool), Name: yyS[yypt-0].ident, } } - case 555: + case 543: { parser.yyVAL.statement = &ast.ShowImportStmt{ Name: yyS[yypt-2].ident, @@ -14259,73 +14201,73 @@ yynewstate: TableNames: yyS[yypt-0].item.([]*ast.TableName), } } - case 556: + case 544: { parser.yyVAL.item = false } - case 557: + case 545: { parser.yyVAL.item = true } - case 558: + case 546: { parser.yyVAL.item = false } - case 559: + case 547: { parser.yyVAL.item = true } - case 560: + case 548: { parser.yyVAL.item = false } - case 561: + case 549: { parser.yyVAL.item = true } - case 562: + case 550: { parser.yyVAL.item = ast.ErrorHandleError } - case 563: + case 551: { parser.yyVAL.item = ast.ErrorHandleReplace } - case 564: + case 552: { parser.yyVAL.item = ast.ErrorHandleSkipAll } - case 565: + case 553: { parser.yyVAL.item = ast.ErrorHandleSkipConstraint } - case 566: + case 554: { parser.yyVAL.item = ast.ErrorHandleSkipDuplicate } - case 567: + case 555: { parser.yyVAL.item = ast.ErrorHandleSkipStrict } - case 568: + case 556: { parser.yyVAL.item = nil } - case 569: + case 557: { parser.yyVAL.item = &ast.ImportTruncate{ IsErrorsOnly: false, TableNames: yyS[yypt-0].item.([]*ast.TableName), } } - case 570: + case 558: { parser.yyVAL.item = &ast.ImportTruncate{ IsErrorsOnly: true, TableNames: yyS[yypt-0].item.([]*ast.TableName), } } - case 571: + case 559: { v := yyS[yypt-2].ident v = strings.TrimPrefix(v, "@") @@ -14336,19 +14278,19 @@ yynewstate: Value: yyS[yypt-0].expr, } } - case 572: + case 560: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.LogicOr, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 573: + case 561: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.LogicXor, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 574: + case 562: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.LogicAnd, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 575: + case 563: { expr, ok := yyS[yypt-0].expr.(*ast.ExistsSubqueryExpr) if ok { @@ -14358,7 +14300,7 @@ yynewstate: parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Not, V: yyS[yypt-0].expr} } } - case 576: + case 564: { parser.yyVAL.expr = &ast.MatchAgainst{ ColumnNames: yyS[yypt-6].item.([]*ast.ColumnName), @@ -14366,87 +14308,87 @@ yynewstate: Modifier: ast.FulltextSearchModifier(yyS[yypt-1].item.(int)), } } - case 577: + case 565: { parser.yyVAL.expr = &ast.IsTruthExpr{Expr: yyS[yypt-2].expr, Not: !yyS[yypt-1].item.(bool), True: int64(1)} } - case 578: + case 566: { parser.yyVAL.expr = &ast.IsTruthExpr{Expr: yyS[yypt-2].expr, Not: !yyS[yypt-1].item.(bool), True: int64(0)} } - case 579: + case 567: { /* 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 581: + case 569: { parser.yyVAL.expr = &ast.MaxValueExpr{} } - case 583: + case 571: { parser.yyVAL.item = ast.FulltextSearchModifierNaturalLanguageMode } - case 584: + case 572: { parser.yyVAL.item = ast.FulltextSearchModifierNaturalLanguageMode } - case 585: + case 573: { parser.yyVAL.item = ast.FulltextSearchModifierNaturalLanguageMode | ast.FulltextSearchModifierWithQueryExpansion } - case 586: + case 574: { parser.yyVAL.item = ast.FulltextSearchModifierBooleanMode } - case 587: + case 575: { parser.yyVAL.item = ast.FulltextSearchModifierWithQueryExpansion } - case 592: + case 580: { parser.yyVAL.item = []ast.ExprNode{yyS[yypt-0].expr} } - case 593: + case 581: { parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].expr) } - case 594: + case 582: { parser.yyVAL.item = []ast.ExprNode{yyS[yypt-0].expr} } - case 595: + case 583: { parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].expr) } - case 596: + case 584: { parser.yyVAL.item = []ast.ExprNode{} } - case 598: + case 586: { parser.yyVAL.item = []ast.ExprNode{} } - case 600: + case 588: { expr := ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation) parser.yyVAL.item = []ast.ExprNode{expr} } - case 601: + case 589: { parser.yyVAL.expr = &ast.IsNullExpr{Expr: yyS[yypt-2].expr, Not: !yyS[yypt-1].item.(bool)} } - case 602: + case 590: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: yyS[yypt-1].item.(opcode.Op), L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 603: + case 591: { 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 604: + case 592: { v := yyS[yypt-2].ident v = strings.TrimPrefix(v, "@") @@ -14458,101 +14400,101 @@ yynewstate: } parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: yyS[yypt-3].item.(opcode.Op), L: yyS[yypt-4].expr, R: variable} } - case 606: + case 594: { parser.yyVAL.item = opcode.GE } - case 607: + case 595: { parser.yyVAL.item = opcode.GT } - case 608: + case 596: { parser.yyVAL.item = opcode.LE } - case 609: + case 597: { parser.yyVAL.item = opcode.LT } - case 610: + case 598: { parser.yyVAL.item = opcode.NE } - case 611: + case 599: { parser.yyVAL.item = opcode.NE } - case 612: + case 600: { parser.yyVAL.item = opcode.EQ } - case 613: + case 601: { parser.yyVAL.item = opcode.NullEQ } - case 614: + case 602: { parser.yyVAL.item = true } - case 615: + case 603: { parser.yyVAL.item = false } - case 616: + case 604: { parser.yyVAL.item = true } - case 617: + case 605: { parser.yyVAL.item = false } - case 618: + case 606: { parser.yyVAL.item = true } - case 619: + case 607: { parser.yyVAL.item = false } - case 620: + case 608: { parser.yyVAL.item = true } - case 621: + case 609: { parser.yyVAL.item = false } - case 622: + case 610: { parser.yyVAL.item = true } - case 623: + case 611: { parser.yyVAL.item = false } - case 624: + case 612: { parser.yyVAL.item = false } - case 625: + case 613: { parser.yyVAL.item = false } - case 626: + case 614: { parser.yyVAL.item = true } - case 627: + case 615: { parser.yyVAL.expr = &ast.PatternInExpr{Expr: yyS[yypt-4].expr, Not: !yyS[yypt-3].item.(bool), List: yyS[yypt-1].item.([]ast.ExprNode)} } - case 628: + case 616: { 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 629: + case 617: { parser.yyVAL.expr = &ast.BetweenExpr{ Expr: yyS[yypt-4].expr, @@ -14561,7 +14503,7 @@ yynewstate: Not: !yyS[yypt-3].item.(bool), } } - case 630: + case 618: { escape := yyS[yypt-0].ident if len(escape) > 1 { @@ -14577,57 +14519,57 @@ yynewstate: Escape: escape[0], } } - case 631: + case 619: { parser.yyVAL.expr = &ast.PatternRegexpExpr{Expr: yyS[yypt-2].expr, Pattern: yyS[yypt-0].expr, Not: !yyS[yypt-1].item.(bool)} } - case 635: + case 623: { parser.yyVAL.ident = "\\" } - case 636: + case 624: { parser.yyVAL.ident = yyS[yypt-0].ident } - case 637: + case 625: { parser.yyVAL.item = &ast.SelectField{WildCard: &ast.WildCardField{}} } - case 638: + case 626: { wildCard := &ast.WildCardField{Table: model.NewCIStr(yyS[yypt-2].ident)} parser.yyVAL.item = &ast.SelectField{WildCard: wildCard} } - case 639: + case 627: { 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 640: + case 628: { expr := yyS[yypt-1].expr asName := yyS[yypt-0].ident parser.yyVAL.item = &ast.SelectField{Expr: expr, AsName: model.NewCIStr(asName)} } - case 641: + case 629: { parser.yyVAL.ident = "" } - case 644: + case 632: { parser.yyVAL.ident = yyS[yypt-0].ident } - case 646: + case 634: { parser.yyVAL.ident = yyS[yypt-0].ident } - case 647: + case 635: { field := yyS[yypt-0].item.(*ast.SelectField) field.Offset = parser.startOffset(&yyS[yypt]) parser.yyVAL.item = []*ast.SelectField{field} } - case 648: + case 636: { fl := yyS[yypt-2].item.([]*ast.SelectField) last := fl[len(fl)-1] @@ -14639,71 +14581,71 @@ yynewstate: newField.Offset = parser.startOffset(&yyS[yypt]) parser.yyVAL.item = append(fl, newField) } - case 649: + case 637: { parser.yyVAL.item = &ast.GroupByClause{Items: yyS[yypt-0].item.([]*ast.ByItem)} } - case 650: + case 638: { parser.yyVAL.item = nil } - case 651: + case 639: { parser.yyVAL.item = &ast.HavingClause{Expr: yyS[yypt-0].expr} } - case 652: + case 640: { parser.yyVAL.item = nil } - case 654: + case 642: { parser.yyVAL.item = &ast.AsOfClause{ TsExpr: yyS[yypt-0].expr.(ast.ExprNode), } } - case 655: + case 643: { parser.yyVAL.item = false } - case 656: + case 644: { parser.yyVAL.item = true } - case 657: + case 645: { parser.yyVAL.item = false } - case 658: + case 646: { parser.yyVAL.item = true } - case 659: + case 647: { parser.yyVAL.item = false } - case 660: + case 648: { parser.yyVAL.item = true } - case 661: + case 649: { parser.yyVAL.item = &ast.NullString{ String: "", Empty: false, } } - case 662: + case 650: { parser.yyVAL.item = &ast.NullString{ String: yyS[yypt-0].ident, Empty: len(yyS[yypt-0].ident) == 0, } } - case 663: + case 651: { parser.yyVAL.item = nil } - case 664: + case 652: { // Merge the options if yyS[yypt-1].item == nil { @@ -14727,19 +14669,19 @@ yynewstate: parser.yyVAL.item = opt1 } } - case 665: + case 653: { parser.yyVAL.item = &ast.IndexOption{ KeyBlockSize: yyS[yypt-0].item.(uint64), } } - case 666: + case 654: { parser.yyVAL.item = &ast.IndexOption{ Tp: yyS[yypt-0].item.(model.IndexType), } } - case 667: + case 655: { parser.yyVAL.item = &ast.IndexOption{ ParserName: model.NewCIStr(yyS[yypt-0].ident), @@ -14747,75 +14689,75 @@ yynewstate: yylex.AppendError(yylex.Errorf("The WITH PARASER clause is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } - case 668: + case 656: { parser.yyVAL.item = &ast.IndexOption{ Comment: yyS[yypt-0].ident, } } - case 669: + case 657: { parser.yyVAL.item = &ast.IndexOption{ Visibility: yyS[yypt-0].item.(ast.IndexVisibility), } } - case 670: + case 658: { parser.yyVAL.item = &ast.IndexOption{ PrimaryKeyTp: yyS[yypt-0].item.(model.PrimaryKeyType), } } - case 671: + case 659: { parser.yyVAL.item = []interface{}{yyS[yypt-0].item, nil} } - case 672: + case 660: { parser.yyVAL.item = []interface{}{yyS[yypt-2].item, yyS[yypt-0].item} } - case 673: + case 661: { parser.yyVAL.item = []interface{}{&ast.NullString{String: yyS[yypt-2].ident, Empty: len(yyS[yypt-2].ident) == 0}, yyS[yypt-0].item} } - case 674: + case 662: { parser.yyVAL.item = nil } - case 676: + case 664: { parser.yyVAL.item = yyS[yypt-0].item } - case 677: + case 665: { parser.yyVAL.item = yyS[yypt-0].item } - case 678: + case 666: { parser.yyVAL.item = model.IndexTypeBtree } - case 679: + case 667: { parser.yyVAL.item = model.IndexTypeHash } - case 680: + case 668: { parser.yyVAL.item = model.IndexTypeRtree } - case 681: + case 669: { parser.yyVAL.item = ast.IndexVisibilityVisible } - case 682: + case 670: { parser.yyVAL.item = ast.IndexVisibilityInvisible } - case 1135: + case 1130: { parser.yyVAL.statement = &ast.CallStmt{ Procedure: yyS[yypt-0].expr.(*ast.FuncCallExpr), } } - case 1136: + case 1131: { parser.yyVAL.expr = &ast.FuncCallExpr{ Tp: ast.FuncCallExprTypeGeneric, @@ -14823,7 +14765,7 @@ yynewstate: Args: []ast.ExprNode{}, } } - case 1137: + case 1132: { parser.yyVAL.expr = &ast.FuncCallExpr{ Tp: ast.FuncCallExprTypeGeneric, @@ -14832,7 +14774,7 @@ yynewstate: Args: []ast.ExprNode{}, } } - case 1138: + case 1133: { parser.yyVAL.expr = &ast.FuncCallExpr{ Tp: ast.FuncCallExprTypeGeneric, @@ -14840,7 +14782,7 @@ yynewstate: Args: yyS[yypt-1].item.([]ast.ExprNode), } } - case 1139: + case 1134: { parser.yyVAL.expr = &ast.FuncCallExpr{ Tp: ast.FuncCallExprTypeGeneric, @@ -14849,7 +14791,7 @@ yynewstate: Args: yyS[yypt-1].item.([]ast.ExprNode), } } - case 1140: + case 1135: { x := yyS[yypt-1].item.(*ast.InsertStmt) x.Priority = yyS[yypt-6].item.(mysql.PriorityEnum) @@ -14866,26 +14808,26 @@ yynewstate: x.PartitionNames = yyS[yypt-2].item.([]model.CIStr) parser.yyVAL.statement = x } - case 1143: + case 1138: { parser.yyVAL.item = &ast.InsertStmt{ Columns: yyS[yypt-3].item.([]*ast.ColumnName), Lists: yyS[yypt-0].item.([][]ast.ExprNode), } } - case 1144: + case 1139: { parser.yyVAL.item = &ast.InsertStmt{Columns: yyS[yypt-2].item.([]*ast.ColumnName), Select: yyS[yypt-0].statement.(ast.ResultSetNode)} } - case 1145: + case 1140: { parser.yyVAL.item = &ast.InsertStmt{Columns: yyS[yypt-2].item.([]*ast.ColumnName), Select: yyS[yypt-0].statement.(ast.ResultSetNode)} } - case 1146: + case 1141: { parser.yyVAL.item = &ast.InsertStmt{Columns: yyS[yypt-2].item.([]*ast.ColumnName), Select: yyS[yypt-0].statement.(ast.ResultSetNode)} } - case 1147: + case 1142: { var sel ast.ResultSetNode switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { @@ -14898,23 +14840,23 @@ yynewstate: } parser.yyVAL.item = &ast.InsertStmt{Columns: yyS[yypt-2].item.([]*ast.ColumnName), Select: sel} } - case 1148: + case 1143: { parser.yyVAL.item = &ast.InsertStmt{Lists: yyS[yypt-0].item.([][]ast.ExprNode)} } - case 1149: + case 1144: { parser.yyVAL.item = &ast.InsertStmt{Select: yyS[yypt-0].statement.(ast.ResultSetNode)} } - case 1150: + case 1145: { parser.yyVAL.item = &ast.InsertStmt{Select: yyS[yypt-0].statement.(ast.ResultSetNode)} } - case 1151: + case 1146: { parser.yyVAL.item = &ast.InsertStmt{Select: yyS[yypt-0].statement.(ast.ResultSetNode)} } - case 1152: + case 1147: { var sel ast.ResultSetNode switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { @@ -14927,66 +14869,66 @@ yynewstate: } parser.yyVAL.item = &ast.InsertStmt{Select: sel} } - case 1153: + case 1148: { parser.yyVAL.item = &ast.InsertStmt{Setlist: yyS[yypt-0].item.([]*ast.Assignment)} } - case 1156: + case 1151: { parser.yyVAL.item = [][]ast.ExprNode{yyS[yypt-0].item.([]ast.ExprNode)} } - case 1157: + case 1152: { parser.yyVAL.item = append(yyS[yypt-2].item.([][]ast.ExprNode), yyS[yypt-0].item.([]ast.ExprNode)) } - case 1158: + case 1153: { parser.yyVAL.item = yyS[yypt-1].item } - case 1159: + case 1154: { parser.yyVAL.item = []ast.ExprNode{} } - case 1161: + case 1156: { parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].expr) } - case 1162: + case 1157: { parser.yyVAL.item = []ast.ExprNode{yyS[yypt-0].expr} } - case 1164: + case 1159: { parser.yyVAL.expr = &ast.DefaultExpr{} } - case 1165: + case 1160: { parser.yyVAL.item = &ast.Assignment{ Column: yyS[yypt-2].item.(*ast.ColumnName), Expr: yyS[yypt-0].expr, } } - case 1166: + case 1161: { parser.yyVAL.item = []*ast.Assignment{} } - case 1167: + case 1162: { parser.yyVAL.item = []*ast.Assignment{yyS[yypt-0].item.(*ast.Assignment)} } - case 1168: + case 1163: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.Assignment), yyS[yypt-0].item.(*ast.Assignment)) } - case 1169: + case 1164: { parser.yyVAL.item = nil } - case 1170: + case 1165: { parser.yyVAL.item = yyS[yypt-0].item } - case 1171: + case 1166: { x := yyS[yypt-0].item.(*ast.InsertStmt) x.IsReplace = true @@ -14996,31 +14938,31 @@ yynewstate: x.PartitionNames = yyS[yypt-1].item.([]model.CIStr) parser.yyVAL.statement = x } - case 1172: + case 1167: { parser.yyVAL.expr = ast.NewValueExpr(false, parser.charset, parser.collation) } - case 1173: + case 1168: { parser.yyVAL.expr = ast.NewValueExpr(nil, parser.charset, parser.collation) } - case 1174: + case 1169: { parser.yyVAL.expr = ast.NewValueExpr(true, parser.charset, parser.collation) } - case 1175: + case 1170: { parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation) } - case 1176: + case 1171: { parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation) } - case 1177: + case 1172: { parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation) } - case 1179: + case 1174: { // See https://dev.mysql.com/doc/refman/5.7/en/charset-literal.html co, err := charset.GetDefaultCollationLegacy(yyS[yypt-1].ident) @@ -15037,15 +14979,15 @@ yynewstate: } parser.yyVAL.expr = expr } - case 1180: + case 1175: { parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation) } - case 1181: + case 1176: { parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation) } - case 1182: + case 1177: { co, err := charset.GetDefaultCollationLegacy(yyS[yypt-1].ident) if err != nil { @@ -15061,7 +15003,7 @@ yynewstate: } parser.yyVAL.expr = expr } - case 1183: + case 1178: { co, err := charset.GetDefaultCollationLegacy(yyS[yypt-1].ident) if err != nil { @@ -15077,12 +15019,12 @@ yynewstate: } parser.yyVAL.expr = expr } - case 1184: + case 1179: { expr := ast.NewValueExpr(yyS[yypt-0].ident, parser.charset, parser.collation) parser.yyVAL.expr = expr } - case 1185: + case 1180: { valExpr := yyS[yypt-1].expr.(ast.ValueExpr) strLit := valExpr.GetString() @@ -15095,31 +15037,31 @@ yynewstate: } parser.yyVAL.expr = expr } - case 1186: + case 1181: { parser.yyVAL.item = []*ast.AlterOrderItem{yyS[yypt-0].item.(*ast.AlterOrderItem)} } - case 1187: + case 1182: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.AlterOrderItem), yyS[yypt-0].item.(*ast.AlterOrderItem)) } - case 1188: + case 1183: { parser.yyVAL.item = &ast.AlterOrderItem{Column: yyS[yypt-1].item.(*ast.ColumnName), Desc: yyS[yypt-0].item.(bool)} } - case 1189: + case 1184: { parser.yyVAL.item = &ast.OrderByClause{Items: yyS[yypt-0].item.([]*ast.ByItem)} } - case 1190: + case 1185: { parser.yyVAL.item = []*ast.ByItem{yyS[yypt-0].item.(*ast.ByItem)} } - case 1191: + case 1186: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.ByItem), yyS[yypt-0].item.(*ast.ByItem)) } - case 1192: + case 1187: { expr := yyS[yypt-0].expr valueExpr, ok := expr.(ast.ValueExpr) @@ -15131,7 +15073,7 @@ yynewstate: } parser.yyVAL.item = &ast.ByItem{Expr: expr, NullOrder: true} } - case 1193: + case 1188: { expr := yyS[yypt-1].expr valueExpr, ok := expr.(ast.ValueExpr) @@ -15143,55 +15085,55 @@ yynewstate: } parser.yyVAL.item = &ast.ByItem{Expr: expr, Desc: yyS[yypt-0].item.(bool)} } - case 1194: + case 1189: { parser.yyVAL.item = false } - case 1195: + case 1190: { parser.yyVAL.item = true } - case 1196: + case 1191: { parser.yyVAL.item = false // ASC by default } - case 1197: + case 1192: { parser.yyVAL.item = false } - case 1198: + case 1193: { parser.yyVAL.item = true } - case 1199: + case 1194: { parser.yyVAL.item = nil } - case 1201: + case 1196: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Or, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1202: + case 1197: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.And, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1203: + case 1198: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.LeftShift, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1204: + case 1199: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.RightShift, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1205: + case 1200: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Plus, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1206: + case 1201: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Minus, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1207: + case 1202: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr("DATE_ADD"), @@ -15202,7 +15144,7 @@ yynewstate: }, } } - case 1208: + case 1203: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr("DATE_SUB"), @@ -15213,44 +15155,44 @@ yynewstate: }, } } - case 1209: + case 1204: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mul, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1210: + case 1205: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Div, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1211: + case 1206: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mod, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1212: + case 1207: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.IntDiv, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1213: + case 1208: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mod, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1214: + case 1209: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Xor, L: yyS[yypt-2].expr, R: yyS[yypt-0].expr} } - case 1216: + case 1211: { parser.yyVAL.expr = &ast.ColumnNameExpr{Name: &ast.ColumnName{ Name: model.NewCIStr(yyS[yypt-0].ident), }} } - case 1217: + case 1212: { parser.yyVAL.expr = &ast.ColumnNameExpr{Name: &ast.ColumnName{ Table: model.NewCIStr(yyS[yypt-2].ident), Name: model.NewCIStr(yyS[yypt-0].ident), }} } - case 1218: + case 1213: { parser.yyVAL.expr = &ast.ColumnNameExpr{Name: &ast.ColumnName{ Schema: model.NewCIStr(yyS[yypt-4].ident), @@ -15258,39 +15200,39 @@ yynewstate: Name: model.NewCIStr(yyS[yypt-0].ident), }} } - case 1223: + case 1218: { parser.yyVAL.expr = &ast.SetCollationExpr{Expr: yyS[yypt-2].expr, Collate: yyS[yypt-0].ident} } - case 1226: + case 1221: { parser.yyVAL.expr = ast.NewParamMarkerExpr(yyS[yypt].offset) } - case 1229: + case 1224: { parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Not2, V: yyS[yypt-0].expr} } - case 1230: + case 1225: { parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.BitNeg, V: yyS[yypt-0].expr} } - case 1231: + case 1226: { parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Minus, V: yyS[yypt-0].expr} } - case 1232: + case 1227: { parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Plus, V: yyS[yypt-0].expr} } - case 1233: + case 1228: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.Concat), Args: []ast.ExprNode{yyS[yypt-2].expr, yyS[yypt-0].expr}} } - case 1234: + case 1229: { parser.yyVAL.expr = &ast.UnaryOperationExpr{Op: opcode.Not2, V: yyS[yypt-0].expr} } - case 1236: + case 1231: { startOffset := parser.startOffset(&yyS[yypt-1]) endOffset := parser.endOffset(&yyS[yypt]) @@ -15298,23 +15240,23 @@ yynewstate: expr.SetText(parser.src[startOffset:endOffset]) parser.yyVAL.expr = &ast.ParenthesesExpr{Expr: expr} } - case 1237: + case 1232: { values := append(yyS[yypt-3].item.([]ast.ExprNode), yyS[yypt-1].expr) parser.yyVAL.expr = &ast.RowExpr{Values: values} } - case 1238: + case 1233: { values := append(yyS[yypt-3].item.([]ast.ExprNode), yyS[yypt-1].expr) parser.yyVAL.expr = &ast.RowExpr{Values: values} } - case 1239: + case 1234: { sq := yyS[yypt-0].expr.(*ast.SubqueryExpr) sq.Exists = true parser.yyVAL.expr = &ast.ExistsSubqueryExpr{Sel: sq} } - case 1240: + case 1235: { /* * ODBC escape syntax. @@ -15338,7 +15280,7 @@ yynewstate: parser.yyVAL.expr = yyS[yypt-1].expr } } - case 1241: + case 1236: { // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#operator_binary x := types.NewFieldType(mysql.TypeString) @@ -15351,7 +15293,7 @@ yynewstate: FunctionType: ast.CastBinaryOperator, } } - case 1242: + case 1237: { /* See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_cast */ tp := yyS[yypt-1].item.(*types.FieldType) @@ -15371,7 +15313,7 @@ yynewstate: ExplicitCharSet: explicitCharset, } } - case 1243: + case 1238: { x := &ast.CaseExpr{WhenClauses: yyS[yypt-2].item.([]*ast.WhenClause)} if yyS[yypt-3].expr != nil { @@ -15382,7 +15324,7 @@ yynewstate: } parser.yyVAL.expr = x } - case 1244: + case 1239: { // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_convert tp := yyS[yypt-1].item.(*types.FieldType) @@ -15402,7 +15344,7 @@ yynewstate: ExplicitCharSet: explicitCharset, } } - case 1245: + case 1240: { // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_convert charset1 := ast.NewValueExpr(yyS[yypt-1].ident, "", "") @@ -15411,62 +15353,62 @@ yynewstate: Args: []ast.ExprNode{yyS[yypt-3].expr, charset1}, } } - case 1246: + case 1241: { parser.yyVAL.expr = &ast.DefaultExpr{Name: yyS[yypt-1].expr.(*ast.ColumnNameExpr).Name} } - case 1247: + case 1242: { parser.yyVAL.expr = &ast.ValuesExpr{Column: yyS[yypt-1].expr.(*ast.ColumnNameExpr)} } - case 1248: + case 1243: { expr := ast.NewValueExpr(yyS[yypt-0].ident, parser.charset, parser.collation) parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.JSONExtract), Args: []ast.ExprNode{yyS[yypt-2].expr, expr}} } - case 1249: + case 1244: { expr := ast.NewValueExpr(yyS[yypt-0].ident, parser.charset, parser.collation) 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 1252: + case 1247: { parser.yyVAL.item = false } - case 1253: + case 1248: { parser.yyVAL.item = true } - case 1254: + case 1249: { parser.yyVAL.item = false } - case 1256: + case 1251: { parser.yyVAL.item = true } - case 1259: + case 1254: { parser.yyVAL.item = true } - case 1301: + case 1296: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} } - case 1302: + case 1297: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} } - case 1303: + case 1298: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-1].ident)} } - case 1304: + case 1299: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-2].ident)} } - case 1305: + case 1300: { args := []ast.ExprNode{} if yyS[yypt-0].item != nil { @@ -15474,7 +15416,7 @@ yynewstate: } parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-1].ident), Args: args} } - case 1306: + case 1301: { nilVal := ast.NewValueExpr(nil, parser.charset, parser.collation) args := yyS[yypt-1].item.([]ast.ExprNode) @@ -15483,7 +15425,7 @@ yynewstate: Args: append(args, nilVal), } } - case 1307: + case 1302: { charset1 := ast.NewValueExpr(yyS[yypt-1].ident, "", "") args := yyS[yypt-3].item.([]ast.ExprNode) @@ -15492,42 +15434,42 @@ yynewstate: Args: append(args, charset1), } } - case 1308: + case 1303: { expr := ast.NewValueExpr(yyS[yypt-0].ident, "", "") parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.DateLiteral), Args: []ast.ExprNode{expr}} } - case 1309: + case 1304: { expr := ast.NewValueExpr(yyS[yypt-0].ident, "", "") parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.TimeLiteral), Args: []ast.ExprNode{expr}} } - case 1310: + case 1305: { expr := ast.NewValueExpr(yyS[yypt-0].ident, "", "") parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.TimestampLiteral), Args: []ast.ExprNode{expr}} } - case 1311: + case 1306: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.InsertFunc), Args: yyS[yypt-1].item.([]ast.ExprNode)} } - case 1312: + case 1307: { parser.yyVAL.expr = &ast.BinaryOperationExpr{Op: opcode.Mod, L: yyS[yypt-3].expr, R: yyS[yypt-1].expr} } - case 1313: + case 1308: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(ast.PasswordFunc), Args: yyS[yypt-1].item.([]ast.ExprNode)} } - case 1314: + case 1309: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} } - case 1315: + case 1310: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode)} } - case 1316: + case 1311: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-5].ident), @@ -15538,7 +15480,7 @@ yynewstate: }, } } - case 1317: + case 1312: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-7].ident), @@ -15549,7 +15491,7 @@ yynewstate: }, } } - case 1318: + case 1313: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-7].ident), @@ -15560,7 +15502,7 @@ yynewstate: }, } } - case 1319: + case 1314: { timeUnit := &ast.TimeUnitExpr{Unit: yyS[yypt-3].item.(ast.TimeUnitType)} parser.yyVAL.expr = &ast.FuncCallExpr{ @@ -15568,7 +15510,7 @@ yynewstate: Args: []ast.ExprNode{timeUnit, yyS[yypt-1].expr}, } } - case 1320: + case 1315: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-5].ident), @@ -15578,67 +15520,67 @@ yynewstate: }, } } - case 1321: + case 1316: { parser.yyVAL.expr = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-5].ident), Args: []ast.ExprNode{yyS[yypt-3].expr, yyS[yypt-1].expr}} } - case 1322: + case 1317: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-5].ident), Args: []ast.ExprNode{yyS[yypt-3].expr, yyS[yypt-1].expr}, } } - case 1323: + case 1318: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-5].ident), Args: []ast.ExprNode{yyS[yypt-3].expr, yyS[yypt-1].expr}, } } - case 1324: + case 1319: { 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 1325: + case 1320: { 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 1326: + case 1321: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-7].ident), Args: []ast.ExprNode{&ast.TimeUnitExpr{Unit: yyS[yypt-5].item.(ast.TimeUnitType)}, yyS[yypt-3].expr, yyS[yypt-1].expr}, } } - case 1327: + case 1322: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-7].ident), Args: []ast.ExprNode{&ast.TimeUnitExpr{Unit: yyS[yypt-5].item.(ast.TimeUnitType)}, yyS[yypt-3].expr, yyS[yypt-1].expr}, } } - case 1328: + case 1323: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-3].ident), Args: []ast.ExprNode{yyS[yypt-1].expr}, } } - case 1329: + case 1324: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-5].ident), Args: []ast.ExprNode{yyS[yypt-1].expr, yyS[yypt-3].expr}, } } - case 1330: + case 1325: { spaceVal := ast.NewValueExpr(" ", parser.charset, parser.collation) direction := &ast.TrimDirectionExpr{Direction: yyS[yypt-3].item.(ast.TrimDirectionType)} @@ -15647,7 +15589,7 @@ yynewstate: Args: []ast.ExprNode{yyS[yypt-1].expr, spaceVal, direction}, } } - case 1331: + case 1326: { direction := &ast.TrimDirectionExpr{Direction: yyS[yypt-4].item.(ast.TrimDirectionType)} parser.yyVAL.expr = &ast.FuncCallExpr{ @@ -15655,63 +15597,63 @@ yynewstate: Args: []ast.ExprNode{yyS[yypt-1].expr, yyS[yypt-3].expr, direction}, } } - case 1332: + case 1327: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-3].ident), Args: []ast.ExprNode{yyS[yypt-1].expr}, } } - case 1333: + case 1328: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-6].ident), Args: []ast.ExprNode{yyS[yypt-4].expr, ast.NewValueExpr("CHAR", parser.charset, parser.collation), ast.NewValueExpr(yyS[yypt-1].item, parser.charset, parser.collation)}, } } - case 1334: + case 1329: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-6].ident), Args: []ast.ExprNode{yyS[yypt-4].expr, ast.NewValueExpr("BINARY", parser.charset, parser.collation), ast.NewValueExpr(yyS[yypt-1].item, parser.charset, parser.collation)}, } } - case 1336: + case 1331: { 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 1337: + case 1332: { parser.yyVAL.item = ast.GetFormatSelectorDate } - case 1338: + case 1333: { parser.yyVAL.item = ast.GetFormatSelectorDatetime } - case 1339: + case 1334: { parser.yyVAL.item = ast.GetFormatSelectorTime } - case 1340: + case 1335: { parser.yyVAL.item = ast.GetFormatSelectorDatetime } - case 1345: + case 1340: { parser.yyVAL.item = ast.TrimBoth } - case 1346: + case 1341: { parser.yyVAL.item = ast.TrimLeading } - case 1347: + case 1342: { parser.yyVAL.item = ast.TrimTrailing } - case 1348: + case 1343: { objNameExpr := &ast.TableNameExpr{ Name: yyS[yypt-1].item.(*ast.TableName), @@ -15721,7 +15663,7 @@ yynewstate: Args: []ast.ExprNode{objNameExpr}, } } - case 1349: + case 1344: { objNameExpr := &ast.TableNameExpr{ Name: yyS[yypt-3].item.(*ast.TableName), @@ -15732,7 +15674,7 @@ yynewstate: Args: []ast.ExprNode{objNameExpr, valueExpr}, } } - case 1351: + case 1346: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -15740,15 +15682,15 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} } } - case 1352: + case 1347: { parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-3].ident, Args: yyS[yypt-1].item.([]ast.ExprNode), Distinct: false} } - case 1353: + case 1348: { parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-3].ident, Args: yyS[yypt-1].item.([]ast.ExprNode)} } - case 1354: + case 1349: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -15756,7 +15698,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1355: + case 1350: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -15764,7 +15706,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1356: + case 1351: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -15772,7 +15714,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1357: + case 1352: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -15780,7 +15722,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1358: + case 1353: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -15788,7 +15730,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1359: + case 1354: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -15796,11 +15738,11 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1360: + case 1355: { parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: yyS[yypt-1].item.([]ast.ExprNode), Distinct: true} } - case 1361: + case 1356: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -15808,7 +15750,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1362: + case 1357: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -15816,7 +15758,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1363: + case 1358: { args := []ast.ExprNode{ast.NewValueExpr(1, parser.charset, parser.collation)} if yyS[yypt-0].item != nil { @@ -15825,7 +15767,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: args} } } - case 1364: + case 1359: { args := yyS[yypt-4].item.([]ast.ExprNode) args = append(args, yyS[yypt-2].item.(ast.ExprNode)) @@ -15839,7 +15781,7 @@ yynewstate: parser.yyVAL.expr = agg } } - case 1365: + case 1360: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -15847,7 +15789,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} } } - case 1366: + case 1361: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -15855,7 +15797,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} } } - case 1367: + case 1362: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -15863,7 +15805,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} } } - case 1368: + case 1363: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: ast.AggFuncStddevPop, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -15871,7 +15813,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: ast.AggFuncStddevPop, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} } } - case 1369: + case 1364: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -15879,7 +15821,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} } } - case 1370: + case 1365: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: ast.AggFuncVarPop, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool), Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -15887,11 +15829,11 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: ast.AggFuncVarPop, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} } } - case 1371: + case 1366: { parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Distinct: yyS[yypt-3].item.(bool)} } - case 1372: + case 1367: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -15899,7 +15841,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1373: + case 1368: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -15907,7 +15849,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}} } } - case 1374: + case 1369: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-6].ident, Args: []ast.ExprNode{yyS[yypt-4].expr, yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -15915,7 +15857,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-6].ident, Args: []ast.ExprNode{yyS[yypt-4].expr, yyS[yypt-2].expr}} } } - case 1375: + case 1370: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-7].ident, Args: []ast.ExprNode{yyS[yypt-4].expr, yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -15923,7 +15865,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-7].ident, Args: []ast.ExprNode{yyS[yypt-4].expr, yyS[yypt-2].expr}} } } - case 1376: + case 1371: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-7].ident, Args: []ast.ExprNode{yyS[yypt-5].expr, yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -15931,7 +15873,7 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-7].ident, Args: []ast.ExprNode{yyS[yypt-5].expr, yyS[yypt-2].expr}} } } - case 1377: + case 1372: { if yyS[yypt-0].item != nil { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-8].ident, Args: []ast.ExprNode{yyS[yypt-5].expr, yyS[yypt-2].expr}, Spec: *(yyS[yypt-0].item.(*ast.WindowSpec))} @@ -15939,22 +15881,22 @@ yynewstate: parser.yyVAL.expr = &ast.AggregateFuncExpr{F: yyS[yypt-8].ident, Args: []ast.ExprNode{yyS[yypt-5].expr, yyS[yypt-2].expr}} } } - case 1378: + case 1373: { parser.yyVAL.item = ast.NewValueExpr(",", "", "") } - case 1379: + case 1374: { parser.yyVAL.item = ast.NewValueExpr(yyS[yypt-0].ident, "", "") } - case 1380: + case 1375: { parser.yyVAL.expr = &ast.FuncCallExpr{ FnName: model.NewCIStr(yyS[yypt-3].ident), Args: yyS[yypt-1].item.([]ast.ExprNode), } } - case 1381: + case 1376: { var tp ast.FuncCallExprType if isInTokenMap(yyS[yypt-3].ident) { @@ -15969,159 +15911,159 @@ yynewstate: Args: yyS[yypt-1].item.([]ast.ExprNode), } } - case 1382: + case 1377: { parser.yyVAL.item = nil } - case 1383: + case 1378: { parser.yyVAL.item = nil } - case 1384: + case 1379: { expr := ast.NewValueExpr(yyS[yypt-1].item, parser.charset, parser.collation) parser.yyVAL.item = expr } - case 1386: + case 1381: { parser.yyVAL.item = ast.TimeUnitSecondMicrosecond } - case 1387: + case 1382: { parser.yyVAL.item = ast.TimeUnitMinuteMicrosecond } - case 1388: + case 1383: { parser.yyVAL.item = ast.TimeUnitMinuteSecond } - case 1389: + case 1384: { parser.yyVAL.item = ast.TimeUnitHourMicrosecond } - case 1390: + case 1385: { parser.yyVAL.item = ast.TimeUnitHourSecond } - case 1391: + case 1386: { parser.yyVAL.item = ast.TimeUnitHourMinute } - case 1392: + case 1387: { parser.yyVAL.item = ast.TimeUnitDayMicrosecond } - case 1393: + case 1388: { parser.yyVAL.item = ast.TimeUnitDaySecond } - case 1394: + case 1389: { parser.yyVAL.item = ast.TimeUnitDayMinute } - case 1395: + case 1390: { parser.yyVAL.item = ast.TimeUnitDayHour } - case 1396: + case 1391: { parser.yyVAL.item = ast.TimeUnitYearMonth } - case 1397: + case 1392: { parser.yyVAL.item = ast.TimeUnitMicrosecond } - case 1398: + case 1393: { parser.yyVAL.item = ast.TimeUnitSecond } - case 1399: + case 1394: { parser.yyVAL.item = ast.TimeUnitMinute } - case 1400: + case 1395: { parser.yyVAL.item = ast.TimeUnitHour } - case 1401: + case 1396: { parser.yyVAL.item = ast.TimeUnitDay } - case 1402: + case 1397: { parser.yyVAL.item = ast.TimeUnitWeek } - case 1403: + case 1398: { parser.yyVAL.item = ast.TimeUnitMonth } - case 1404: + case 1399: { parser.yyVAL.item = ast.TimeUnitQuarter } - case 1405: + case 1400: { parser.yyVAL.item = ast.TimeUnitYear } - case 1406: + case 1401: { parser.yyVAL.item = ast.TimeUnitSecond } - case 1407: + case 1402: { parser.yyVAL.item = ast.TimeUnitMinute } - case 1408: + case 1403: { parser.yyVAL.item = ast.TimeUnitHour } - case 1409: + case 1404: { parser.yyVAL.item = ast.TimeUnitDay } - case 1410: + case 1405: { parser.yyVAL.item = ast.TimeUnitWeek } - case 1411: + case 1406: { parser.yyVAL.item = ast.TimeUnitMonth } - case 1412: + case 1407: { parser.yyVAL.item = ast.TimeUnitQuarter } - case 1413: + case 1408: { parser.yyVAL.item = ast.TimeUnitYear } - case 1414: + case 1409: { parser.yyVAL.expr = nil } - case 1416: + case 1411: { parser.yyVAL.item = []*ast.WhenClause{yyS[yypt-0].item.(*ast.WhenClause)} } - case 1417: + case 1412: { parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.WhenClause), yyS[yypt-0].item.(*ast.WhenClause)) } - case 1418: + case 1413: { parser.yyVAL.item = &ast.WhenClause{ Expr: yyS[yypt-2].expr, Result: yyS[yypt-0].expr, } } - case 1419: + case 1414: { parser.yyVAL.item = nil } - case 1420: + case 1415: { parser.yyVAL.item = yyS[yypt-0].expr } - case 1421: + case 1416: { x := types.NewFieldType(mysql.TypeVarString) x.Flen = yyS[yypt-0].item.(int) // TODO: Flen should be the flen of expression @@ -16133,7 +16075,7 @@ yynewstate: x.Flag |= mysql.BinaryFlag parser.yyVAL.item = x } - case 1422: + case 1417: { x := types.NewFieldType(mysql.TypeVarString) x.Flen = yyS[yypt-1].item.(int) // TODO: Flen should be the flen of expression @@ -16156,7 +16098,7 @@ yynewstate: } parser.yyVAL.item = x } - case 1423: + case 1418: { x := types.NewFieldType(mysql.TypeDate) x.Charset = charset.CharsetBin @@ -16164,7 +16106,7 @@ yynewstate: x.Flag |= mysql.BinaryFlag parser.yyVAL.item = x } - case 1424: + case 1419: { x := types.NewFieldType(mysql.TypeYear) x.Charset = charset.CharsetBin @@ -16172,7 +16114,7 @@ yynewstate: x.Flag |= mysql.BinaryFlag parser.yyVAL.item = x } - case 1425: + case 1420: { x := types.NewFieldType(mysql.TypeDatetime) x.Flen, _ = mysql.GetDefaultFieldLengthAndDecimalForCast(mysql.TypeDatetime) @@ -16185,7 +16127,7 @@ yynewstate: x.Flag |= mysql.BinaryFlag parser.yyVAL.item = x } - case 1426: + case 1421: { fopt := yyS[yypt-0].item.(*ast.FloatOpt) x := types.NewFieldType(mysql.TypeNewDecimal) @@ -16196,7 +16138,7 @@ yynewstate: x.Flag |= mysql.BinaryFlag parser.yyVAL.item = x } - case 1427: + case 1422: { x := types.NewFieldType(mysql.TypeDuration) x.Flen, _ = mysql.GetDefaultFieldLengthAndDecimalForCast(mysql.TypeDuration) @@ -16209,7 +16151,7 @@ yynewstate: x.Flag |= mysql.BinaryFlag parser.yyVAL.item = x } - case 1428: + case 1423: { x := types.NewFieldType(mysql.TypeLonglong) x.Charset = charset.CharsetBin @@ -16217,7 +16159,7 @@ yynewstate: x.Flag |= mysql.BinaryFlag parser.yyVAL.item = x } - case 1429: + case 1424: { x := types.NewFieldType(mysql.TypeLonglong) x.Flag |= mysql.UnsignedFlag | mysql.BinaryFlag @@ -16225,7 +16167,7 @@ yynewstate: x.Collate = charset.CollationBin parser.yyVAL.item = x } - case 1430: + case 1425: { x := types.NewFieldType(mysql.TypeJSON) x.Flag |= mysql.BinaryFlag | (mysql.ParseToJSONFlag) @@ -16233,7 +16175,7 @@ yynewstate: x.Collate = mysql.DefaultCollationName parser.yyVAL.item = x } - case 1431: + case 1426: { x := types.NewFieldType(mysql.TypeDouble) x.Flen, x.Decimal = mysql.GetDefaultFieldLengthAndDecimalForCast(mysql.TypeDouble) @@ -16242,7 +16184,7 @@ yynewstate: x.Collate = charset.CollationBin parser.yyVAL.item = x } - case 1432: + case 1427: { x := types.NewFieldType(mysql.TypeFloat) fopt := yyS[yypt-0].item.(*ast.FloatOpt) @@ -16257,7 +16199,7 @@ yynewstate: x.Collate = charset.CollationBin parser.yyVAL.item = x } - case 1433: + case 1428: { var x *types.FieldType if parser.lexer.GetSQLMode().HasRealAsFloatMode() { @@ -16271,65 +16213,65 @@ yynewstate: x.Collate = charset.CollationBin parser.yyVAL.item = x } - case 1434: + case 1429: { parser.yyVAL.item = mysql.LowPriority } - case 1435: + case 1430: { parser.yyVAL.item = mysql.HighPriority } - case 1436: + case 1431: { parser.yyVAL.item = mysql.DelayedPriority } - case 1437: + case 1432: { parser.yyVAL.item = mysql.NoPriority } - case 1439: + case 1434: { parser.yyVAL.item = &ast.TableName{Name: model.NewCIStr(yyS[yypt-0].ident)} } - case 1440: + case 1435: { parser.yyVAL.item = &ast.TableName{Schema: model.NewCIStr(yyS[yypt-2].ident), Name: model.NewCIStr(yyS[yypt-0].ident)} } - case 1441: + case 1436: { tbl := []*ast.TableName{yyS[yypt-0].item.(*ast.TableName)} parser.yyVAL.item = tbl } - case 1442: + case 1437: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.TableName), yyS[yypt-0].item.(*ast.TableName)) } - case 1443: + case 1438: { parser.yyVAL.item = &ast.TableName{Name: model.NewCIStr(yyS[yypt-1].ident)} } - case 1444: + case 1439: { parser.yyVAL.item = &ast.TableName{Schema: model.NewCIStr(yyS[yypt-3].ident), Name: model.NewCIStr(yyS[yypt-1].ident)} } - case 1445: + case 1440: { tbl := []*ast.TableName{yyS[yypt-0].item.(*ast.TableName)} parser.yyVAL.item = tbl } - case 1446: + case 1441: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.TableName), yyS[yypt-0].item.(*ast.TableName)) } - case 1449: + case 1444: { parser.yyVAL.item = false } - case 1450: + case 1445: { parser.yyVAL.item = true } - case 1451: + case 1446: { var sqlText string var sqlVar *ast.VariableExpr @@ -16345,86 +16287,86 @@ yynewstate: SQLVar: sqlVar, } } - case 1452: + case 1447: { parser.yyVAL.item = yyS[yypt-0].ident } - case 1453: + case 1448: { parser.yyVAL.item = yyS[yypt-0].expr } - case 1454: + case 1449: { parser.yyVAL.statement = &ast.ExecuteStmt{Name: yyS[yypt-0].ident} } - case 1455: + case 1450: { parser.yyVAL.statement = &ast.ExecuteStmt{ Name: yyS[yypt-2].ident, UsingVars: yyS[yypt-0].item.([]ast.ExprNode), } } - case 1456: + case 1451: { parser.yyVAL.item = []ast.ExprNode{yyS[yypt-0].expr} } - case 1457: + case 1452: { parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].expr) } - case 1458: + case 1453: { parser.yyVAL.statement = &ast.DeallocateStmt{Name: yyS[yypt-0].ident} } - case 1461: + case 1456: { parser.yyVAL.statement = &ast.RollbackStmt{} } - case 1462: + case 1457: { parser.yyVAL.statement = &ast.RollbackStmt{CompletionType: yyS[yypt-0].item.(ast.CompletionType)} } - case 1463: + case 1458: { parser.yyVAL.item = ast.CompletionTypeChain } - case 1464: + case 1459: { parser.yyVAL.item = ast.CompletionTypeRelease } - case 1465: + case 1460: { parser.yyVAL.item = ast.CompletionTypeDefault } - case 1466: + case 1461: { parser.yyVAL.item = ast.CompletionTypeChain } - case 1467: + case 1462: { parser.yyVAL.item = ast.CompletionTypeDefault } - case 1468: + case 1463: { parser.yyVAL.item = ast.CompletionTypeRelease } - case 1469: + case 1464: { parser.yyVAL.item = ast.CompletionTypeDefault } - case 1470: + case 1465: { parser.yyVAL.statement = &ast.ShutdownStmt{} } - case 1471: + case 1466: { parser.yyVAL.statement = &ast.RestartStmt{} } - case 1472: + case 1467: { parser.yyVAL.statement = &ast.HelpStmt{Topic: yyS[yypt-0].ident} } - case 1473: + case 1468: { st := &ast.SelectStmt{ SelectStmtOpts: yyS[yypt-1].item.(*ast.SelectStmtOpts), @@ -16437,7 +16379,7 @@ yynewstate: } parser.yyVAL.item = st } - case 1474: + case 1469: { st := yyS[yypt-2].item.(*ast.SelectStmt) lastField := st.Fields.Fields[len(st.Fields.Fields)-1] @@ -16449,7 +16391,7 @@ yynewstate: st.Where = yyS[yypt-0].item.(ast.ExprNode) } } - case 1475: + case 1470: { st := yyS[yypt-6].item.(*ast.SelectStmt) st.From = yyS[yypt-4].item.(*ast.TableRefsClause) @@ -16472,11 +16414,11 @@ yynewstate: } parser.yyVAL.item = st } - case 1476: + case 1471: { parser.yyVAL.item = nil } - case 1477: + case 1472: { var repSeed ast.ExprNode if yyS[yypt-0].expr != nil { @@ -16489,7 +16431,7 @@ yynewstate: RepeatableSeed: repSeed, } } - case 1478: + case 1473: { var repSeed ast.ExprNode if yyS[yypt-0].expr != nil { @@ -16500,43 +16442,43 @@ yynewstate: RepeatableSeed: repSeed, } } - case 1479: + case 1474: { parser.yyVAL.item = ast.SampleMethodTypeNone } - case 1480: + case 1475: { parser.yyVAL.item = ast.SampleMethodTypeSystem } - case 1481: + case 1476: { parser.yyVAL.item = ast.SampleMethodTypeBernoulli } - case 1482: + case 1477: { parser.yyVAL.item = ast.SampleMethodTypeTiDBRegion } - case 1483: + case 1478: { parser.yyVAL.item = ast.SampleClauseUnitTypeDefault } - case 1484: + case 1479: { parser.yyVAL.item = ast.SampleClauseUnitTypeRow } - case 1485: + case 1480: { parser.yyVAL.item = ast.SampleClauseUnitTypePercent } - case 1486: + case 1481: { parser.yyVAL.expr = nil } - case 1487: + case 1482: { parser.yyVAL.expr = yyS[yypt-1].expr } - case 1488: + case 1483: { st := yyS[yypt-6].item.(*ast.SelectStmt) if yyS[yypt-1].item != nil { @@ -16583,7 +16525,7 @@ yynewstate: } parser.yyVAL.statement = st } - case 1489: + case 1484: { st := yyS[yypt-5].item.(*ast.SelectStmt) if yyS[yypt-4].item != nil { @@ -16603,7 +16545,7 @@ yynewstate: } parser.yyVAL.statement = st } - case 1490: + case 1485: { st := yyS[yypt-4].item.(*ast.SelectStmt) if yyS[yypt-1].item != nil { @@ -16620,7 +16562,7 @@ yynewstate: } parser.yyVAL.statement = st } - case 1491: + case 1486: { st := &ast.SelectStmt{ Kind: ast.SelectStmtKindTable, @@ -16642,7 +16584,7 @@ yynewstate: } parser.yyVAL.statement = st } - case 1492: + case 1487: { st := &ast.SelectStmt{ Kind: ast.SelectStmtKindValues, @@ -16663,13 +16605,13 @@ yynewstate: } parser.yyVAL.statement = st } - case 1493: + case 1488: { sel := yyS[yypt-0].statement.(*ast.SelectStmt) sel.With = yyS[yypt-1].item.(*ast.WithClause) parser.yyVAL.statement = sel } - case 1494: + case 1489: { var sel ast.StmtNode switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { @@ -16685,30 +16627,30 @@ yynewstate: } parser.yyVAL.statement = sel } - case 1495: + case 1490: { parser.yyVAL.item = yyS[yypt-0].item } - case 1496: + case 1491: { ws := yyS[yypt-0].item.(*ast.WithClause) ws.IsRecursive = true parser.yyVAL.item = ws } - case 1497: + case 1492: { ws := yyS[yypt-2].item.(*ast.WithClause) ws.CTEs = append(ws.CTEs, yyS[yypt-0].item.(*ast.CommonTableExpression)) parser.yyVAL.item = ws } - case 1498: + case 1493: { ws := &ast.WithClause{} ws.CTEs = make([]*ast.CommonTableExpression, 0, 4) ws.CTEs = append(ws.CTEs, yyS[yypt-0].item.(*ast.CommonTableExpression)) parser.yyVAL.item = ws } - case 1499: + case 1494: { cte := &ast.CommonTableExpression{} cte.Name = model.NewCIStr(yyS[yypt-3].ident) @@ -16716,37 +16658,37 @@ yynewstate: cte.Query = yyS[yypt-0].expr.(*ast.SubqueryExpr) parser.yyVAL.item = cte } - case 1501: + case 1496: { parser.yyVAL.item = nil } - case 1502: + case 1497: { parser.yyVAL.item = yyS[yypt-0].item.([]ast.WindowSpec) } - case 1503: + case 1498: { parser.yyVAL.item = []ast.WindowSpec{yyS[yypt-0].item.(ast.WindowSpec)} } - case 1504: + case 1499: { parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.WindowSpec), yyS[yypt-0].item.(ast.WindowSpec)) } - case 1505: + case 1500: { var spec = yyS[yypt-0].item.(ast.WindowSpec) spec.Name = yyS[yypt-2].item.(model.CIStr) parser.yyVAL.item = spec } - case 1506: + case 1501: { parser.yyVAL.item = model.NewCIStr(yyS[yypt-0].ident) } - case 1507: + case 1502: { parser.yyVAL.item = yyS[yypt-1].item.(ast.WindowSpec) } - case 1508: + case 1503: { spec := ast.WindowSpec{Ref: yyS[yypt-3].item.(model.CIStr)} if yyS[yypt-2].item != nil { @@ -16760,138 +16702,138 @@ yynewstate: } parser.yyVAL.item = spec } - case 1509: + case 1504: { parser.yyVAL.item = model.CIStr{} } - case 1511: + case 1506: { parser.yyVAL.item = nil } - case 1512: + case 1507: { parser.yyVAL.item = &ast.PartitionByClause{Items: yyS[yypt-0].item.([]*ast.ByItem)} } - case 1513: + case 1508: { parser.yyVAL.item = nil } - case 1514: + case 1509: { parser.yyVAL.item = &ast.OrderByClause{Items: yyS[yypt-0].item.([]*ast.ByItem)} } - case 1515: + case 1510: { parser.yyVAL.item = nil } - case 1516: + case 1511: { parser.yyVAL.item = &ast.FrameClause{ Type: yyS[yypt-1].item.(ast.FrameType), Extent: yyS[yypt-0].item.(ast.FrameExtent), } } - case 1517: + case 1512: { parser.yyVAL.item = ast.FrameType(ast.Rows) } - case 1518: + case 1513: { parser.yyVAL.item = ast.FrameType(ast.Ranges) } - case 1519: + case 1514: { parser.yyVAL.item = ast.FrameType(ast.Groups) } - case 1520: + case 1515: { parser.yyVAL.item = ast.FrameExtent{ Start: yyS[yypt-0].item.(ast.FrameBound), End: ast.FrameBound{Type: ast.CurrentRow}, } } - case 1522: + case 1517: { parser.yyVAL.item = ast.FrameBound{Type: ast.Preceding, UnBounded: true} } - case 1523: + case 1518: { parser.yyVAL.item = ast.FrameBound{Type: ast.Preceding, Expr: ast.NewValueExpr(yyS[yypt-1].item, parser.charset, parser.collation)} } - case 1524: + case 1519: { parser.yyVAL.item = ast.FrameBound{Type: ast.Preceding, Expr: ast.NewParamMarkerExpr(yyS[yypt].offset)} } - case 1525: + case 1520: { parser.yyVAL.item = ast.FrameBound{Type: ast.Preceding, Expr: yyS[yypt-2].expr, Unit: yyS[yypt-1].item.(ast.TimeUnitType)} } - case 1526: + case 1521: { parser.yyVAL.item = ast.FrameBound{Type: ast.CurrentRow} } - case 1527: + case 1522: { parser.yyVAL.item = ast.FrameExtent{Start: yyS[yypt-2].item.(ast.FrameBound), End: yyS[yypt-0].item.(ast.FrameBound)} } - case 1529: + case 1524: { parser.yyVAL.item = ast.FrameBound{Type: ast.Following, UnBounded: true} } - case 1530: + case 1525: { parser.yyVAL.item = ast.FrameBound{Type: ast.Following, Expr: ast.NewValueExpr(yyS[yypt-1].item, parser.charset, parser.collation)} } - case 1531: + case 1526: { parser.yyVAL.item = ast.FrameBound{Type: ast.Following, Expr: ast.NewParamMarkerExpr(yyS[yypt].offset)} } - case 1532: + case 1527: { parser.yyVAL.item = ast.FrameBound{Type: ast.Following, Expr: yyS[yypt-2].expr, Unit: yyS[yypt-1].item.(ast.TimeUnitType)} } - case 1533: + case 1528: { parser.yyVAL.item = nil } - case 1534: + case 1529: { spec := yyS[yypt-0].item.(ast.WindowSpec) parser.yyVAL.item = &spec } - case 1535: + case 1530: { parser.yyVAL.item = yyS[yypt-0].item.(ast.WindowSpec) } - case 1536: + case 1531: { parser.yyVAL.item = ast.WindowSpec{Name: yyS[yypt-0].item.(model.CIStr), OnlyAlias: true} } - case 1538: + case 1533: { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-3].ident, Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 1539: + case 1534: { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-3].ident, Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 1540: + case 1535: { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-3].ident, Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 1541: + case 1536: { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-3].ident, Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 1542: + case 1537: { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-3].ident, Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 1543: + case 1538: { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-4].ident, Args: []ast.ExprNode{yyS[yypt-2].expr}, Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 1544: + case 1539: { args := []ast.ExprNode{yyS[yypt-4].expr} if yyS[yypt-3].item != nil { @@ -16899,7 +16841,7 @@ yynewstate: } parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-6].ident, Args: args, IgnoreNull: yyS[yypt-1].item.(bool), Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 1545: + case 1540: { args := []ast.ExprNode{yyS[yypt-4].expr} if yyS[yypt-3].item != nil { @@ -16907,23 +16849,23 @@ yynewstate: } parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-6].ident, Args: args, IgnoreNull: yyS[yypt-1].item.(bool), Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 1546: + case 1541: { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-3].expr}, IgnoreNull: yyS[yypt-1].item.(bool), Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 1547: + case 1542: { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-5].ident, Args: []ast.ExprNode{yyS[yypt-3].expr}, IgnoreNull: yyS[yypt-1].item.(bool), Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 1548: + case 1543: { parser.yyVAL.expr = &ast.WindowFuncExpr{F: yyS[yypt-8].ident, Args: []ast.ExprNode{yyS[yypt-6].expr, yyS[yypt-4].expr}, FromLast: yyS[yypt-2].item.(bool), IgnoreNull: yyS[yypt-1].item.(bool), Spec: yyS[yypt-0].item.(ast.WindowSpec)} } - case 1549: + case 1544: { parser.yyVAL.item = nil } - case 1550: + case 1545: { args := []ast.ExprNode{ast.NewValueExpr(yyS[yypt-1].item, parser.charset, parser.collation)} if yyS[yypt-0].item != nil { @@ -16931,7 +16873,7 @@ yynewstate: } parser.yyVAL.item = args } - case 1551: + case 1546: { args := []ast.ExprNode{ast.NewValueExpr(yyS[yypt-1].item, parser.charset, parser.collation)} if yyS[yypt-0].item != nil { @@ -16939,43 +16881,43 @@ yynewstate: } parser.yyVAL.item = args } - case 1552: + case 1547: { parser.yyVAL.item = nil } - case 1553: + case 1548: { parser.yyVAL.item = yyS[yypt-0].expr } - case 1554: + case 1549: { parser.yyVAL.item = false } - case 1555: + case 1550: { parser.yyVAL.item = false } - case 1556: + case 1551: { parser.yyVAL.item = true } - case 1557: + case 1552: { parser.yyVAL.item = false } - case 1558: + case 1553: { parser.yyVAL.item = false } - case 1559: + case 1554: { parser.yyVAL.item = true } - case 1560: + case 1555: { parser.yyVAL.item = &ast.TableRefsClause{TableRefs: yyS[yypt-0].item.(*ast.Join)} } - case 1561: + case 1556: { if j, ok := yyS[yypt-0].item.(*ast.Join); ok { // if $1 is Join, use it directly @@ -16984,12 +16926,12 @@ yynewstate: parser.yyVAL.item = &ast.Join{Left: yyS[yypt-0].item.(ast.ResultSetNode), Right: nil} } } - case 1562: + case 1557: { /* 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 1564: + case 1559: { /* * ODBC escape syntax for outer join is { OJ join_table } @@ -16997,7 +16939,7 @@ yynewstate: */ parser.yyVAL.item = yyS[yypt-1].item } - case 1567: + case 1562: { tn := yyS[yypt-5].item.(*ast.TableName) tn.PartitionNames = yyS[yypt-4].item.([]model.CIStr) @@ -17010,66 +16952,66 @@ yynewstate: } parser.yyVAL.item = &ast.TableSource{Source: tn, AsName: yyS[yypt-3].item.(model.CIStr)} } - case 1568: + case 1563: { resultNode := yyS[yypt-1].expr.(*ast.SubqueryExpr).Query parser.yyVAL.item = &ast.TableSource{Source: resultNode, AsName: yyS[yypt-0].item.(model.CIStr)} } - case 1569: + case 1564: { j := yyS[yypt-1].item.(*ast.Join) j.ExplicitParens = true parser.yyVAL.item = yyS[yypt-1].item } - case 1570: + case 1565: { parser.yyVAL.item = []model.CIStr{} } - case 1571: + case 1566: { parser.yyVAL.item = yyS[yypt-1].item } - case 1572: + case 1567: { parser.yyVAL.item = model.CIStr{} } - case 1574: + case 1569: { parser.yyVAL.item = model.NewCIStr(yyS[yypt-0].ident) } - case 1575: + case 1570: { parser.yyVAL.item = model.NewCIStr(yyS[yypt-0].ident) } - case 1576: + case 1571: { parser.yyVAL.item = ast.HintUse } - case 1577: + case 1572: { parser.yyVAL.item = ast.HintIgnore } - case 1578: + case 1573: { parser.yyVAL.item = ast.HintForce } - case 1579: + case 1574: { parser.yyVAL.item = ast.HintForScan } - case 1580: + case 1575: { parser.yyVAL.item = ast.HintForJoin } - case 1581: + case 1576: { parser.yyVAL.item = ast.HintForOrderBy } - case 1582: + case 1577: { parser.yyVAL.item = ast.HintForGroupBy } - case 1583: + case 1578: { parser.yyVAL.item = &ast.IndexHint{ IndexNames: yyS[yypt-1].item.([]model.CIStr), @@ -17077,134 +17019,134 @@ yynewstate: HintScope: yyS[yypt-3].item.(ast.IndexHintScope), } } - case 1584: + case 1579: { var nameList []model.CIStr parser.yyVAL.item = nameList } - case 1585: + case 1580: { parser.yyVAL.item = []model.CIStr{model.NewCIStr(yyS[yypt-0].ident)} } - case 1586: + case 1581: { parser.yyVAL.item = append(yyS[yypt-2].item.([]model.CIStr), model.NewCIStr(yyS[yypt-0].ident)) } - case 1587: + case 1582: { parser.yyVAL.item = []model.CIStr{model.NewCIStr(yyS[yypt-0].ident)} } - case 1588: + case 1583: { parser.yyVAL.item = append(yyS[yypt-2].item.([]model.CIStr), model.NewCIStr(yyS[yypt-0].ident)) } - case 1589: + case 1584: { parser.yyVAL.item = []*ast.IndexHint{yyS[yypt-0].item.(*ast.IndexHint)} } - case 1590: + case 1585: { parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.IndexHint), yyS[yypt-0].item.(*ast.IndexHint)) } - case 1591: + case 1586: { parser.yyVAL.item = []*ast.IndexHint{} } - case 1593: + case 1588: { parser.yyVAL.item = ast.NewCrossJoin(yyS[yypt-2].item.(ast.ResultSetNode), yyS[yypt-0].item.(ast.ResultSetNode)) } - case 1594: + case 1589: { 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 1595: + case 1590: { 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 1596: + case 1591: { 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 1597: + case 1592: { 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 1598: + case 1593: { parser.yyVAL.item = &ast.Join{Left: yyS[yypt-3].item.(ast.ResultSetNode), Right: yyS[yypt-0].item.(ast.ResultSetNode), NaturalJoin: true} } - case 1599: + case 1594: { 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 1600: + case 1595: { parser.yyVAL.item = &ast.Join{Left: yyS[yypt-2].item.(ast.ResultSetNode), Right: yyS[yypt-0].item.(ast.ResultSetNode), StraightJoin: true} } - case 1601: + case 1596: { 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 1602: + case 1597: { parser.yyVAL.item = ast.LeftJoin } - case 1603: + case 1598: { parser.yyVAL.item = ast.RightJoin } - case 1609: + case 1604: { parser.yyVAL.item = nil } - case 1610: + case 1605: { parser.yyVAL.item = &ast.Limit{Count: yyS[yypt-0].item.(ast.ValueExpr)} } - case 1611: + case 1606: { parser.yyVAL.item = ast.NewValueExpr(yyS[yypt-0].item, parser.charset, parser.collation) } - case 1612: + case 1607: { parser.yyVAL.item = ast.NewParamMarkerExpr(yyS[yypt].offset) } - case 1617: + case 1612: { parser.yyVAL.item = ast.NewValueExpr(uint64(1), parser.charset, parser.collation) } - case 1619: + case 1614: { parser.yyVAL.item = &ast.Limit{Count: yyS[yypt-0].item.(ast.ExprNode)} } - case 1620: + case 1615: { parser.yyVAL.item = &ast.Limit{Offset: yyS[yypt-2].item.(ast.ExprNode), Count: yyS[yypt-0].item.(ast.ExprNode)} } - case 1621: + case 1616: { parser.yyVAL.item = &ast.Limit{Offset: yyS[yypt-0].item.(ast.ExprNode), Count: yyS[yypt-2].item.(ast.ExprNode)} } - case 1622: + case 1617: { parser.yyVAL.item = &ast.Limit{Count: yyS[yypt-2].item.(ast.ExprNode)} } - case 1623: + case 1618: { parser.yyVAL.item = nil } - case 1625: + case 1620: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true opt.TableHints = yyS[yypt-0].item.([]*ast.TableOptimizerHint) parser.yyVAL.item = opt } - case 1626: + case 1621: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true @@ -17216,61 +17158,61 @@ yynewstate: } parser.yyVAL.item = opt } - case 1627: + case 1622: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true opt.Priority = yyS[yypt-0].item.(mysql.PriorityEnum) parser.yyVAL.item = opt } - case 1628: + case 1623: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true opt.SQLSmallResult = true parser.yyVAL.item = opt } - case 1629: + case 1624: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true opt.SQLBigResult = true parser.yyVAL.item = opt } - case 1630: + case 1625: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true opt.SQLBufferResult = true parser.yyVAL.item = opt } - case 1631: + case 1626: { opt := &ast.SelectStmtOpts{} opt.SQLCache = yyS[yypt-0].item.(bool) parser.yyVAL.item = opt } - case 1632: + case 1627: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true opt.CalcFoundRows = true parser.yyVAL.item = opt } - case 1633: + case 1628: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true opt.StraightJoin = true parser.yyVAL.item = opt } - case 1634: + case 1629: { opt := &ast.SelectStmtOpts{} opt.SQLCache = true parser.yyVAL.item = opt } - case 1636: + case 1631: { opts := yyS[yypt-1].item.(*ast.SelectStmtOpts) opt := yyS[yypt-0].item.(*ast.SelectStmtOpts) @@ -17315,7 +17257,7 @@ yynewstate: parser.yyVAL.item = opts } - case 1638: + case 1633: { hints, warns := parser.parseHint(yyS[yypt-0].ident) for _, w := range warns { @@ -17324,31 +17266,31 @@ yynewstate: } parser.yyVAL.item = hints } - case 1639: + case 1634: { parser.yyVAL.item = nil } - case 1641: + case 1636: { parser.yyVAL.item = true } - case 1642: + case 1637: { parser.yyVAL.item = false } - case 1643: + case 1638: { parser.yyVAL.item = &ast.FieldList{Fields: yyS[yypt-0].item.([]*ast.SelectField)} } - case 1644: + case 1639: { parser.yyVAL.item = nil } - case 1646: + case 1641: { parser.yyVAL.item = nil } - case 1647: + case 1642: { x := &ast.SelectIntoOption{ Tp: ast.SelectIntoOutfile, @@ -17363,7 +17305,7 @@ yynewstate: parser.yyVAL.item = x } - case 1648: + case 1643: { rs := yyS[yypt-1].statement.(*ast.SelectStmt) endOffset := parser.endOffset(&yyS[yypt]) @@ -17373,14 +17315,14 @@ yynewstate: rs.SetText(src[yyS[yypt-1].offset:yyS[yypt].offset]) parser.yyVAL.expr = &ast.SubqueryExpr{Query: rs} } - case 1649: + case 1644: { rs := yyS[yypt-1].statement.(*ast.SetOprStmt) src := parser.src rs.SetText(src[yyS[yypt-1].offset:yyS[yypt].offset]) parser.yyVAL.expr = &ast.SubqueryExpr{Query: rs} } - case 1650: + case 1645: { rs := yyS[yypt-1].statement.(*ast.SelectStmt) endOffset := parser.endOffset(&yyS[yypt]) @@ -17390,32 +17332,55 @@ yynewstate: rs.SetText(src[yyS[yypt-1].offset:yyS[yypt].offset]) parser.yyVAL.expr = &ast.SubqueryExpr{Query: rs} } - case 1651: + case 1646: + { + subQuery := yyS[yypt-1].expr.(*ast.SubqueryExpr).Query + isRecursive := true + // remove redundant brackets like '((select 1))' + for isRecursive { + if _, isRecursive = subQuery.(*ast.SubqueryExpr); isRecursive { + subQuery = subQuery.(*ast.SubqueryExpr).Query + } + } + switch rs := subQuery.(type) { + case *ast.SelectStmt: + endOffset := parser.endOffset(&yyS[yypt]) + parser.setLastSelectFieldText(rs, endOffset) + src := parser.src + rs.SetText(src[yyS[yypt-1].offset:yyS[yypt].offset]) + parser.yyVAL.expr = &ast.SubqueryExpr{Query: rs} + case *ast.SetOprStmt: + src := parser.src + rs.SetText(src[yyS[yypt-1].offset:yyS[yypt].offset]) + parser.yyVAL.expr = &ast.SubqueryExpr{Query: rs} + } + } + case 1647: { parser.yyVAL.item = nil } - case 1652: + case 1648: { parser.yyVAL.item = &ast.SelectLockInfo{ LockType: ast.SelectLockForUpdate, Tables: yyS[yypt-0].item.([]*ast.TableName), } } - case 1653: + case 1649: { parser.yyVAL.item = &ast.SelectLockInfo{ LockType: ast.SelectLockForShare, Tables: yyS[yypt-0].item.([]*ast.TableName), } } - case 1654: + case 1650: { parser.yyVAL.item = &ast.SelectLockInfo{ LockType: ast.SelectLockForUpdateNoWait, Tables: yyS[yypt-1].item.([]*ast.TableName), } } - case 1655: + case 1651: { parser.yyVAL.item = &ast.SelectLockInfo{ LockType: ast.SelectLockForUpdateWaitN, @@ -17423,55 +17388,55 @@ yynewstate: Tables: yyS[yypt-2].item.([]*ast.TableName), } } - case 1656: + case 1652: { parser.yyVAL.item = &ast.SelectLockInfo{ LockType: ast.SelectLockForShareNoWait, Tables: yyS[yypt-1].item.([]*ast.TableName), } } - case 1657: + case 1653: { parser.yyVAL.item = &ast.SelectLockInfo{ LockType: ast.SelectLockForUpdateSkipLocked, Tables: yyS[yypt-2].item.([]*ast.TableName), } } - case 1658: + case 1654: { parser.yyVAL.item = &ast.SelectLockInfo{ LockType: ast.SelectLockForShareSkipLocked, Tables: yyS[yypt-2].item.([]*ast.TableName), } } - case 1659: + case 1655: { parser.yyVAL.item = &ast.SelectLockInfo{ LockType: ast.SelectLockForShare, Tables: []*ast.TableName{}, } } - case 1660: + case 1656: { parser.yyVAL.item = []*ast.TableName{} } - case 1661: + case 1657: { parser.yyVAL.item = yyS[yypt-0].item.([]*ast.TableName) } - case 1664: + case 1660: { setOpr := yyS[yypt-0].statement.(*ast.SetOprStmt) setOpr.With = yyS[yypt-1].item.(*ast.WithClause) parser.yyVAL.statement = setOpr } - case 1665: + case 1661: { setOpr := yyS[yypt-0].statement.(*ast.SetOprStmt) setOpr.With = yyS[yypt-1].item.(*ast.WithClause) parser.yyVAL.statement = setOpr } - case 1666: + case 1662: { setOprList1 := yyS[yypt-2].item.([]ast.Node) if sel, isSelect := setOprList1[len(setOprList1)-1].(*ast.SelectStmt); isSelect && !sel.IsInBraces { @@ -17488,7 +17453,7 @@ yynewstate: setOpr.SelectList.Selects = append(setOpr.SelectList.Selects, st) parser.yyVAL.statement = setOpr } - case 1667: + case 1663: { setOprList1 := yyS[yypt-2].item.([]ast.Node) if sel, isSelect := setOprList1[len(setOprList1)-1].(*ast.SelectStmt); isSelect && !sel.IsInBraces { @@ -17511,7 +17476,7 @@ yynewstate: setOpr := &ast.SetOprStmt{SelectList: &ast.SetOprSelectList{Selects: setOprList}} parser.yyVAL.statement = setOpr } - case 1668: + case 1664: { setOprList1 := yyS[yypt-3].item.([]ast.Node) if sel, isSelect := setOprList1[len(setOprList1)-1].(*ast.SelectStmt); isSelect && !sel.IsInBraces { @@ -17535,7 +17500,7 @@ yynewstate: setOpr.OrderBy = yyS[yypt-0].item.(*ast.OrderByClause) parser.yyVAL.statement = setOpr } - case 1669: + case 1665: { setOprList1 := yyS[yypt-3].item.([]ast.Node) if sel, isSelect := setOprList1[len(setOprList1)-1].(*ast.SelectStmt); isSelect && !sel.IsInBraces { @@ -17559,7 +17524,7 @@ yynewstate: setOpr.Limit = yyS[yypt-0].item.(*ast.Limit) parser.yyVAL.statement = setOpr } - case 1670: + case 1666: { setOprList1 := yyS[yypt-4].item.([]ast.Node) if sel, isSelect := setOprList1[len(setOprList1)-1].(*ast.SelectStmt); isSelect && !sel.IsInBraces { @@ -17584,7 +17549,7 @@ yynewstate: setOpr.Limit = yyS[yypt-0].item.(*ast.Limit) parser.yyVAL.statement = setOpr } - case 1671: + case 1667: { var setOprList []ast.Node var with *ast.WithClause @@ -17600,7 +17565,7 @@ yynewstate: setOpr.OrderBy = yyS[yypt-0].item.(*ast.OrderByClause) parser.yyVAL.statement = setOpr } - case 1672: + case 1668: { var setOprList []ast.Node var with *ast.WithClause @@ -17616,7 +17581,7 @@ yynewstate: setOpr.Limit = yyS[yypt-0].item.(*ast.Limit) parser.yyVAL.statement = setOpr } - case 1673: + case 1669: { var setOprList []ast.Node var with *ast.WithClause @@ -17633,7 +17598,7 @@ yynewstate: setOpr.Limit = yyS[yypt-0].item.(*ast.Limit) parser.yyVAL.statement = setOpr } - case 1675: + case 1671: { setOprList1 := yyS[yypt-2].item.([]ast.Node) setOprList2 := yyS[yypt-0].item.([]ast.Node) @@ -17649,11 +17614,11 @@ yynewstate: } parser.yyVAL.item = append(setOprList1, setOprList2...) } - case 1676: + case 1672: { parser.yyVAL.item = []ast.Node{yyS[yypt-0].statement.(*ast.SelectStmt)} } - case 1677: + case 1673: { var setOprList []ast.Node switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { @@ -17664,7 +17629,7 @@ yynewstate: } parser.yyVAL.item = setOprList } - case 1678: + case 1674: { var tp ast.SetOprType tp = ast.Union @@ -17673,7 +17638,7 @@ yynewstate: } parser.yyVAL.item = &tp } - case 1679: + case 1675: { var tp ast.SetOprType tp = ast.Except @@ -17682,7 +17647,7 @@ yynewstate: } parser.yyVAL.item = &tp } - case 1680: + case 1676: { var tp ast.SetOprType tp = ast.Intersect @@ -17691,7 +17656,7 @@ yynewstate: } parser.yyVAL.item = &tp } - case 1682: + case 1678: { parser.yyVAL.statement = &ast.ChangeStmt{ NodeType: ast.PumpType, @@ -17699,7 +17664,7 @@ yynewstate: NodeID: yyS[yypt-0].ident, } } - case 1683: + case 1679: { parser.yyVAL.statement = &ast.ChangeStmt{ NodeType: ast.DrainerType, @@ -17707,19 +17672,19 @@ yynewstate: NodeID: yyS[yypt-0].ident, } } - case 1684: + case 1680: { parser.yyVAL.statement = &ast.SetStmt{Variables: yyS[yypt-0].item.([]*ast.VariableAssignment)} } - case 1685: + case 1681: { parser.yyVAL.statement = &ast.SetPwdStmt{Password: yyS[yypt-0].ident} } - case 1686: + case 1682: { parser.yyVAL.statement = &ast.SetPwdStmt{User: yyS[yypt-2].item.(*auth.UserIdentity), Password: yyS[yypt-0].ident} } - case 1687: + case 1683: { vars := yyS[yypt-0].item.([]*ast.VariableAssignment) for _, v := range vars { @@ -17727,11 +17692,11 @@ yynewstate: } parser.yyVAL.statement = &ast.SetStmt{Variables: vars} } - case 1688: + case 1684: { parser.yyVAL.statement = &ast.SetStmt{Variables: yyS[yypt-0].item.([]*ast.VariableAssignment)} } - case 1689: + case 1685: { assigns := yyS[yypt-0].item.([]*ast.VariableAssignment) for i := 0; i < len(assigns); i++ { @@ -17742,19 +17707,19 @@ yynewstate: } parser.yyVAL.statement = &ast.SetStmt{Variables: assigns} } - case 1690: + case 1686: { parser.yyVAL.statement = &ast.SetConfigStmt{Type: strings.ToLower(yyS[yypt-3].ident), Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr} } - case 1691: + case 1687: { parser.yyVAL.statement = &ast.SetConfigStmt{Instance: yyS[yypt-3].ident, Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr} } - case 1692: + case 1688: { parser.yyVAL.statement = yyS[yypt-0].item.(*ast.SetRoleStmt) } - case 1693: + case 1689: { tmp := yyS[yypt-2].item.(*ast.SetRoleStmt) parser.yyVAL.statement = &ast.SetDefaultRoleStmt{ @@ -17763,27 +17728,27 @@ yynewstate: UserList: yyS[yypt-0].item.([]*auth.UserIdentity), } } - case 1694: + case 1690: { parser.yyVAL.item = &ast.SetRoleStmt{SetRoleOpt: ast.SetRoleNone, RoleList: nil} } - case 1695: + case 1691: { parser.yyVAL.item = &ast.SetRoleStmt{SetRoleOpt: ast.SetRoleAll, RoleList: nil} } - case 1696: + case 1692: { parser.yyVAL.item = &ast.SetRoleStmt{SetRoleOpt: ast.SetRoleRegular, RoleList: yyS[yypt-0].item.([]*auth.RoleIdentity)} } - case 1697: + case 1693: { parser.yyVAL.item = &ast.SetRoleStmt{SetRoleOpt: ast.SetRoleAllExcept, RoleList: yyS[yypt-0].item.([]*auth.RoleIdentity)} } - case 1699: + case 1695: { parser.yyVAL.item = &ast.SetRoleStmt{SetRoleOpt: ast.SetRoleDefault, RoleList: nil} } - case 1700: + case 1696: { if yyS[yypt-0].item != nil { parser.yyVAL.item = yyS[yypt-0].item @@ -17791,7 +17756,7 @@ yynewstate: parser.yyVAL.item = []*ast.VariableAssignment{} } } - case 1701: + case 1697: { if yyS[yypt-0].item != nil { varAssigns := yyS[yypt-0].item.([]*ast.VariableAssignment) @@ -17800,28 +17765,28 @@ yynewstate: parser.yyVAL.item = yyS[yypt-2].item } } - case 1702: + case 1698: { varAssigns := []*ast.VariableAssignment{} expr := ast.NewValueExpr(yyS[yypt-0].ident, parser.charset, parser.collation) varAssigns = append(varAssigns, &ast.VariableAssignment{Name: "tx_isolation", Value: expr, IsSystem: true}) parser.yyVAL.item = varAssigns } - case 1703: + case 1699: { varAssigns := []*ast.VariableAssignment{} expr := ast.NewValueExpr("0", parser.charset, parser.collation) varAssigns = append(varAssigns, &ast.VariableAssignment{Name: "tx_read_only", Value: expr, IsSystem: true}) parser.yyVAL.item = varAssigns } - case 1704: + case 1700: { varAssigns := []*ast.VariableAssignment{} expr := ast.NewValueExpr("1", parser.charset, parser.collation) varAssigns = append(varAssigns, &ast.VariableAssignment{Name: "tx_read_only", Value: expr, IsSystem: true}) parser.yyVAL.item = varAssigns } - case 1705: + case 1701: { varAssigns := []*ast.VariableAssignment{} asof := yyS[yypt-0].item.(*ast.AsOfClause) @@ -17830,59 +17795,59 @@ yynewstate: } parser.yyVAL.item = varAssigns } - case 1706: + case 1702: { parser.yyVAL.ident = ast.RepeatableRead } - case 1707: + case 1703: { parser.yyVAL.ident = ast.ReadCommitted } - case 1708: + case 1704: { parser.yyVAL.ident = ast.ReadUncommitted } - case 1709: + case 1705: { parser.yyVAL.ident = ast.Serializable } - case 1710: + case 1706: { parser.yyVAL.expr = ast.NewValueExpr("ON", parser.charset, parser.collation) } - case 1711: + case 1707: { parser.yyVAL.expr = ast.NewValueExpr("BINARY", parser.charset, parser.collation) } - case 1716: + case 1712: { parser.yyVAL.ident = yyS[yypt-2].ident + "." + yyS[yypt-0].ident } - case 1718: + case 1714: { parser.yyVAL.ident = yyS[yypt-2].ident + "." + yyS[yypt-0].ident } - case 1719: + case 1715: { parser.yyVAL.ident = yyS[yypt-2].ident + "-" + yyS[yypt-0].ident } - case 1720: + case 1716: { parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsSystem: true} } - case 1721: + case 1717: { parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsGlobal: true, IsSystem: true} } - case 1722: + case 1718: { parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsSystem: true} } - case 1723: + case 1719: { parser.yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].ident, Value: yyS[yypt-0].expr, IsSystem: true} } - case 1724: + case 1720: { v := strings.ToLower(yyS[yypt-2].ident) var isGlobal bool @@ -17898,27 +17863,27 @@ yynewstate: } parser.yyVAL.item = &ast.VariableAssignment{Name: v, Value: yyS[yypt-0].expr, IsGlobal: isGlobal, IsSystem: true} } - case 1725: + case 1721: { v := yyS[yypt-2].ident v = strings.TrimPrefix(v, "@") parser.yyVAL.item = &ast.VariableAssignment{Name: v, Value: yyS[yypt-0].expr} } - case 1726: + case 1722: { parser.yyVAL.item = &ast.VariableAssignment{ Name: ast.SetNames, Value: ast.NewValueExpr(yyS[yypt-0].ident, "", ""), } } - case 1727: + case 1723: { parser.yyVAL.item = &ast.VariableAssignment{ Name: ast.SetNames, Value: ast.NewValueExpr(yyS[yypt-2].ident, "", ""), } } - case 1728: + case 1724: { parser.yyVAL.item = &ast.VariableAssignment{ Name: ast.SetNames, @@ -17926,24 +17891,24 @@ yynewstate: ExtendValue: ast.NewValueExpr(yyS[yypt-0].ident, "", ""), } } - case 1729: + case 1725: { v := &ast.DefaultExpr{} parser.yyVAL.item = &ast.VariableAssignment{Name: ast.SetNames, Value: v} } - case 1730: + case 1726: { parser.yyVAL.item = &ast.VariableAssignment{Name: ast.SetCharset, Value: yyS[yypt-0].expr} } - case 1731: + case 1727: { parser.yyVAL.expr = ast.NewValueExpr(yyS[yypt-0].ident, "", "") } - case 1732: + case 1728: { parser.yyVAL.expr = &ast.DefaultExpr{} } - case 1733: + case 1729: { // Validate input charset name to keep the same behavior as parser of MySQL. cs, err := charset.GetCharsetInfo(yyS[yypt-0].ident) @@ -17955,11 +17920,11 @@ yynewstate: // to keep lower case of input for generated column restore. parser.yyVAL.ident = cs.Name } - case 1734: + case 1730: { parser.yyVAL.ident = charset.CharsetBin } - case 1735: + case 1731: { info, err := charset.GetCollationByName(yyS[yypt-0].ident) if err != nil { @@ -17968,19 +17933,19 @@ yynewstate: } parser.yyVAL.ident = info.Name } - case 1736: + case 1732: { parser.yyVAL.ident = charset.CollationBin } - case 1737: + case 1733: { parser.yyVAL.item = []*ast.VariableAssignment{yyS[yypt-0].item.(*ast.VariableAssignment)} } - case 1738: + case 1734: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.VariableAssignment), yyS[yypt-0].item.(*ast.VariableAssignment)) } - case 1741: + case 1737: { v := strings.ToLower(yyS[yypt-0].ident) var isGlobal bool @@ -17997,77 +17962,77 @@ yynewstate: } parser.yyVAL.expr = &ast.VariableExpr{Name: v, IsGlobal: isGlobal, IsSystem: true, ExplicitScope: explicitScope} } - case 1742: + case 1738: { v := yyS[yypt-0].ident v = strings.TrimPrefix(v, "@") parser.yyVAL.expr = &ast.VariableExpr{Name: v, IsGlobal: false, IsSystem: false} } - case 1743: + case 1739: { parser.yyVAL.item = &auth.UserIdentity{Username: yyS[yypt-0].ident, Hostname: "%"} } - case 1744: + case 1740: { parser.yyVAL.item = &auth.UserIdentity{Username: yyS[yypt-2].ident, Hostname: yyS[yypt-0].ident} } - case 1745: + case 1741: { parser.yyVAL.item = &auth.UserIdentity{Username: yyS[yypt-1].ident, Hostname: strings.TrimPrefix(yyS[yypt-0].ident, "@")} } - case 1746: + case 1742: { parser.yyVAL.item = &auth.UserIdentity{CurrentUser: true} } - case 1747: + case 1743: { parser.yyVAL.item = []*auth.UserIdentity{yyS[yypt-0].item.(*auth.UserIdentity)} } - case 1748: + case 1744: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*auth.UserIdentity), yyS[yypt-0].item.(*auth.UserIdentity)) } - case 1750: + case 1746: { parser.yyVAL.ident = yyS[yypt-1].ident } - case 1754: + case 1750: { parser.yyVAL.item = &auth.RoleIdentity{Username: yyS[yypt-2].ident, Hostname: yyS[yypt-0].ident} } - case 1755: + case 1751: { parser.yyVAL.item = &auth.RoleIdentity{Username: yyS[yypt-1].ident, Hostname: strings.TrimPrefix(yyS[yypt-0].ident, "@")} } - case 1756: + case 1752: { parser.yyVAL.item = &auth.RoleIdentity{Username: yyS[yypt-0].ident, Hostname: "%"} } - case 1757: + case 1753: { parser.yyVAL.item = yyS[yypt-0].item } - case 1758: + case 1754: { parser.yyVAL.item = &auth.RoleIdentity{Username: yyS[yypt-0].ident, Hostname: "%"} } - case 1759: + case 1755: { parser.yyVAL.item = yyS[yypt-0].item } - case 1760: + case 1756: { parser.yyVAL.item = []*auth.RoleIdentity{yyS[yypt-0].item.(*auth.RoleIdentity)} } - case 1761: + case 1757: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*auth.RoleIdentity), yyS[yypt-0].item.(*auth.RoleIdentity)) } - case 1762: + case 1758: { parser.yyVAL.statement = &ast.AdminStmt{Tp: ast.AdminShowDDL} } - case 1763: + case 1759: { stmt := &ast.AdminStmt{Tp: ast.AdminShowDDLJobs} if yyS[yypt-0].item != nil { @@ -18075,7 +18040,7 @@ yynewstate: } parser.yyVAL.statement = stmt } - case 1764: + case 1760: { stmt := &ast.AdminStmt{ Tp: ast.AdminShowDDLJobs, @@ -18086,21 +18051,21 @@ yynewstate: } parser.yyVAL.statement = stmt } - case 1765: + case 1761: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminShowNextRowID, Tables: []*ast.TableName{yyS[yypt-1].item.(*ast.TableName)}, } } - case 1766: + case 1762: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminCheckTable, Tables: yyS[yypt-0].item.([]*ast.TableName), } } - case 1767: + case 1763: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminCheckIndex, @@ -18108,7 +18073,7 @@ yynewstate: Index: string(yyS[yypt-0].ident), } } - case 1768: + case 1764: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminRecoverIndex, @@ -18116,7 +18081,7 @@ yynewstate: Index: string(yyS[yypt-0].ident), } } - case 1769: + case 1765: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminCleanupIndex, @@ -18124,7 +18089,7 @@ yynewstate: Index: string(yyS[yypt-0].ident), } } - case 1770: + case 1766: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminCheckIndexRange, @@ -18133,129 +18098,129 @@ yynewstate: HandleRanges: yyS[yypt-0].item.([]ast.HandleRange), } } - case 1771: + case 1767: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminChecksumTable, Tables: yyS[yypt-0].item.([]*ast.TableName), } } - case 1772: + case 1768: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminCancelDDLJobs, JobIDs: yyS[yypt-0].item.([]int64), } } - case 1773: + case 1769: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminShowDDLJobQueries, JobIDs: yyS[yypt-0].item.([]int64), } } - case 1774: + case 1770: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminShowSlow, ShowSlow: yyS[yypt-0].item.(*ast.ShowSlow), } } - case 1775: + case 1771: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminReloadExprPushdownBlacklist, } } - case 1776: + case 1772: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminReloadOptRuleBlacklist, } } - case 1777: + case 1773: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminPluginEnable, Plugins: yyS[yypt-0].item.([]string), } } - case 1778: + case 1774: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminPluginDisable, Plugins: yyS[yypt-0].item.([]string), } } - case 1779: + case 1775: { parser.yyVAL.statement = &ast.CleanupTableLockStmt{ Tables: yyS[yypt-0].item.([]*ast.TableName), } } - case 1780: + case 1776: { parser.yyVAL.statement = &ast.RepairTableStmt{ Table: yyS[yypt-1].item.(*ast.TableName), CreateStmt: yyS[yypt-0].statement.(*ast.CreateTableStmt), } } - case 1781: + case 1777: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminFlushBindings, } } - case 1782: + case 1778: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminCaptureBindings, } } - case 1783: + case 1779: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminEvolveBindings, } } - case 1784: + case 1780: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminReloadBindings, } } - case 1785: + case 1781: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminReloadStatistics, } } - case 1786: + case 1782: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminReloadStatistics, } } - case 1787: + case 1783: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminShowTelemetry, } } - case 1788: + case 1784: { parser.yyVAL.statement = &ast.AdminStmt{ Tp: ast.AdminResetTelemetryID, } } - case 1789: + case 1785: { parser.yyVAL.item = &ast.ShowSlow{ Tp: ast.ShowSlowRecent, Count: getUint64FromNUM(yyS[yypt-0].item), } } - case 1790: + case 1786: { parser.yyVAL.item = &ast.ShowSlow{ Tp: ast.ShowSlowTop, @@ -18263,7 +18228,7 @@ yynewstate: Count: getUint64FromNUM(yyS[yypt-0].item), } } - case 1791: + case 1787: { parser.yyVAL.item = &ast.ShowSlow{ Tp: ast.ShowSlowTop, @@ -18271,7 +18236,7 @@ yynewstate: Count: getUint64FromNUM(yyS[yypt-0].item), } } - case 1792: + case 1788: { parser.yyVAL.item = &ast.ShowSlow{ Tp: ast.ShowSlowTop, @@ -18279,27 +18244,27 @@ yynewstate: Count: getUint64FromNUM(yyS[yypt-0].item), } } - case 1793: + case 1789: { parser.yyVAL.item = []ast.HandleRange{yyS[yypt-0].item.(ast.HandleRange)} } - case 1794: + case 1790: { parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.HandleRange), yyS[yypt-0].item.(ast.HandleRange)) } - case 1795: + case 1791: { parser.yyVAL.item = ast.HandleRange{Begin: yyS[yypt-3].item.(int64), End: yyS[yypt-1].item.(int64)} } - case 1796: + case 1792: { parser.yyVAL.item = []int64{yyS[yypt-0].item.(int64)} } - case 1797: + case 1793: { parser.yyVAL.item = append(yyS[yypt-2].item.([]int64), yyS[yypt-0].item.(int64)) } - case 1798: + case 1794: { stmt := yyS[yypt-1].item.(*ast.ShowStmt) if yyS[yypt-0].item != nil { @@ -18311,21 +18276,21 @@ yynewstate: } parser.yyVAL.statement = stmt } - case 1799: + case 1795: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowCreateTable, Table: yyS[yypt-0].item.(*ast.TableName), } } - case 1800: + case 1796: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowCreateView, Table: yyS[yypt-0].item.(*ast.TableName), } } - case 1801: + case 1797: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowCreateDatabase, @@ -18333,21 +18298,21 @@ yynewstate: DBName: yyS[yypt-0].ident, } } - case 1802: + case 1798: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowCreateSequence, Table: yyS[yypt-0].item.(*ast.TableName), } } - case 1803: + case 1799: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowCreatePlacementPolicy, DBName: yyS[yypt-0].ident, } } - case 1804: + case 1800: { // See https://dev.mysql.com/doc/refman/5.7/en/show-create-user.html parser.yyVAL.statement = &ast.ShowStmt{ @@ -18355,14 +18320,14 @@ yynewstate: User: yyS[yypt-0].item.(*auth.UserIdentity), } } - case 1805: + case 1801: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowCreateImport, DBName: yyS[yypt-0].ident, // we reuse DBName of ShowStmt } } - case 1806: + case 1802: { stmt := &ast.ShowStmt{ Tp: ast.ShowRegions, @@ -18374,14 +18339,14 @@ yynewstate: } parser.yyVAL.statement = stmt } - case 1807: + case 1803: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowTableNextRowId, Table: yyS[yypt-1].item.(*ast.TableName), } } - case 1808: + case 1804: { stmt := &ast.ShowStmt{ Tp: ast.ShowRegions, @@ -18394,12 +18359,12 @@ yynewstate: } parser.yyVAL.statement = stmt } - case 1809: + case 1805: { // See https://dev.mysql.com/doc/refman/5.7/en/show-grants.html parser.yyVAL.statement = &ast.ShowStmt{Tp: ast.ShowGrants} } - case 1810: + case 1806: { // See https://dev.mysql.com/doc/refman/5.7/en/show-grants.html if yyS[yypt-0].item != nil { @@ -18416,26 +18381,26 @@ yynewstate: } } } - case 1811: + case 1807: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowMasterStatus, } } - case 1812: + case 1808: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowProcessList, Full: yyS[yypt-1].item.(bool), } } - case 1813: + case 1809: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowProfiles, } } - case 1814: + case 1810: { v := &ast.ShowStmt{ Tp: ast.ShowProfile, @@ -18451,37 +18416,37 @@ yynewstate: } parser.yyVAL.statement = v } - case 1815: + case 1811: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowPrivileges, } } - case 1816: + case 1812: { parser.yyVAL.statement = &ast.ShowStmt{ Tp: ast.ShowBuiltins, } } - case 1817: + case 1813: { parser.yyVAL.statement = yyS[yypt-0].item.(*ast.ShowStmt) } - case 1818: + case 1814: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowPlacementForDatabase, DBName: yyS[yypt-0].ident, } } - case 1819: + case 1815: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowPlacementForTable, Table: yyS[yypt-0].item.(*ast.TableName), } } - case 1820: + case 1816: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowPlacementForPartition, @@ -18489,90 +18454,90 @@ yynewstate: Partition: model.NewCIStr(yyS[yypt-0].ident), } } - case 1821: + case 1817: { parser.yyVAL.item = nil } - case 1823: + case 1819: { parser.yyVAL.item = []int{yyS[yypt-0].item.(int)} } - case 1824: + case 1820: { l := yyS[yypt-2].item.([]int) l = append(l, yyS[yypt-0].item.(int)) parser.yyVAL.item = l } - case 1825: + case 1821: { parser.yyVAL.item = ast.ProfileTypeCPU } - case 1826: + case 1822: { parser.yyVAL.item = ast.ProfileTypeMemory } - case 1827: + case 1823: { parser.yyVAL.item = ast.ProfileTypeBlockIo } - case 1828: + case 1824: { parser.yyVAL.item = ast.ProfileTypeContextSwitch } - case 1829: + case 1825: { parser.yyVAL.item = ast.ProfileTypePageFaults } - case 1830: + case 1826: { parser.yyVAL.item = ast.ProfileTypeIpc } - case 1831: + case 1827: { parser.yyVAL.item = ast.ProfileTypeSwaps } - case 1832: + case 1828: { parser.yyVAL.item = ast.ProfileTypeSource } - case 1833: + case 1829: { parser.yyVAL.item = ast.ProfileTypeAll } - case 1834: + case 1830: { parser.yyVAL.item = nil } - case 1835: + case 1831: { v := yyS[yypt-0].item.(int64) parser.yyVAL.item = &v } - case 1836: + case 1832: { parser.yyVAL.item = nil } - case 1837: + case 1833: { parser.yyVAL.item = yyS[yypt-0].item.([]*auth.RoleIdentity) } - case 1843: + case 1839: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowEngines} } - case 1844: + case 1840: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowDatabases} } - case 1845: + case 1841: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowConfig} } - case 1846: + case 1842: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowCharset} } - case 1847: + case 1843: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowTables, @@ -18580,28 +18545,28 @@ yynewstate: Full: yyS[yypt-2].item.(bool), } } - case 1848: + case 1844: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowOpenTables, DBName: yyS[yypt-0].ident, } } - case 1849: + case 1845: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowTableStatus, DBName: yyS[yypt-0].ident, } } - case 1850: + case 1846: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowIndex, Table: yyS[yypt-0].item.(*ast.TableName), } } - case 1851: + case 1847: { show := &ast.ShowStmt{ Tp: ast.ShowIndex, @@ -18609,7 +18574,7 @@ yynewstate: } parser.yyVAL.item = show } - case 1852: + case 1848: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowColumns, @@ -18618,7 +18583,7 @@ yynewstate: Full: yyS[yypt-3].item.(bool), } } - case 1853: + case 1849: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowColumns, @@ -18628,67 +18593,67 @@ yynewstate: Extended: true, } } - case 1854: + case 1850: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowWarnings} } - case 1855: + case 1851: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowErrors} } - case 1856: + case 1852: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowVariables, GlobalScope: yyS[yypt-1].item.(bool), } } - case 1857: + case 1853: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowStatus, GlobalScope: yyS[yypt-1].item.(bool), } } - case 1858: + case 1854: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowBindings, GlobalScope: yyS[yypt-1].item.(bool), } } - case 1859: + case 1855: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowCollation, } } - case 1860: + case 1856: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowTriggers, DBName: yyS[yypt-0].ident, } } - case 1861: + case 1857: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowProcedureStatus, } } - case 1862: + case 1858: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowPumpStatus, } } - case 1863: + case 1859: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowDrainerStatus, } } - case 1864: + case 1860: { // 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 @@ -18698,165 +18663,169 @@ yynewstate: Tp: ast.ShowProcedureStatus, } } - case 1865: + case 1861: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowEvents, DBName: yyS[yypt-0].ident, } } - case 1866: + case 1862: { parser.yyVAL.item = &ast.ShowStmt{ Tp: ast.ShowPlugins, } } - case 1867: + case 1863: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowStatsExtended} } - case 1868: + case 1864: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowStatsMeta} } - case 1869: + case 1865: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowStatsHistograms} } - case 1870: + case 1866: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowStatsTopN} } - case 1871: + case 1867: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowStatsBuckets} } - case 1872: + case 1868: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowStatsHealthy} } - case 1873: + case 1869: + { + parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowHistogramsInFlight} + } + case 1870: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowColumnStatsUsage} } - case 1874: + case 1871: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowAnalyzeStatus} } - case 1875: + case 1872: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowBackups} } - case 1876: + case 1873: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowRestores} } - case 1877: + case 1874: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowImports} } - case 1878: + case 1875: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowPlacement} } - case 1879: + case 1876: { parser.yyVAL.item = &ast.ShowStmt{Tp: ast.ShowPlacementLabels} } - case 1880: + case 1877: { parser.yyVAL.item = nil } - case 1881: + case 1878: { parser.yyVAL.item = &ast.PatternLikeExpr{ Pattern: yyS[yypt-0].expr, Escape: '\\', } } - case 1882: + case 1879: { parser.yyVAL.item = yyS[yypt-0].expr } - case 1883: + case 1880: { parser.yyVAL.item = false } - case 1884: + case 1881: { parser.yyVAL.item = true } - case 1885: + case 1882: { parser.yyVAL.item = false } - case 1886: + case 1883: { parser.yyVAL.item = false } - case 1887: + case 1884: { parser.yyVAL.item = true } - case 1888: + case 1885: { parser.yyVAL.ident = "" } - case 1889: + case 1886: { parser.yyVAL.ident = yyS[yypt-0].ident } - case 1890: + case 1887: { parser.yyVAL.item = yyS[yypt-0].item.(*ast.TableName) } - case 1891: + case 1888: { tmp := yyS[yypt-0].item.(*ast.FlushStmt) tmp.NoWriteToBinLog = yyS[yypt-1].item.(bool) parser.yyVAL.statement = tmp } - case 1892: + case 1889: { parser.yyVAL.item = []string{yyS[yypt-0].ident} } - case 1893: + case 1890: { parser.yyVAL.item = append(yyS[yypt-2].item.([]string), yyS[yypt-0].ident) } - case 1894: + case 1891: { parser.yyVAL.item = &ast.FlushStmt{ Tp: ast.FlushPrivileges, } } - case 1895: + case 1892: { parser.yyVAL.item = &ast.FlushStmt{ Tp: ast.FlushStatus, } } - case 1896: + case 1893: { parser.yyVAL.item = &ast.FlushStmt{ Tp: ast.FlushTiDBPlugin, Plugins: yyS[yypt-0].item.([]string), } } - case 1897: + case 1894: { parser.yyVAL.item = &ast.FlushStmt{ Tp: ast.FlushHosts, } } - case 1898: + case 1895: { parser.yyVAL.item = &ast.FlushStmt{ Tp: ast.FlushLogs, LogType: yyS[yypt-1].item.(ast.LogType), } } - case 1899: + case 1896: { parser.yyVAL.item = &ast.FlushStmt{ Tp: ast.FlushTables, @@ -18864,69 +18833,69 @@ yynewstate: ReadLock: yyS[yypt-0].item.(bool), } } - case 1900: + case 1897: { parser.yyVAL.item = &ast.FlushStmt{ Tp: ast.FlushClientErrorsSummary, } } - case 1901: + case 1898: { parser.yyVAL.item = ast.LogTypeDefault } - case 1902: + case 1899: { parser.yyVAL.item = ast.LogTypeBinary } - case 1903: + case 1900: { parser.yyVAL.item = ast.LogTypeEngine } - case 1904: + case 1901: { parser.yyVAL.item = ast.LogTypeError } - case 1905: + case 1902: { parser.yyVAL.item = ast.LogTypeGeneral } - case 1906: + case 1903: { parser.yyVAL.item = ast.LogTypeSlow } - case 1907: + case 1904: { parser.yyVAL.item = false } - case 1908: + case 1905: { parser.yyVAL.item = true } - case 1909: + case 1906: { parser.yyVAL.item = true } - case 1910: + case 1907: { parser.yyVAL.item = []*ast.TableName{} } - case 1912: + case 1909: { parser.yyVAL.item = []*ast.TableName{} } - case 1913: + case 1910: { parser.yyVAL.item = yyS[yypt-0].item } - case 1914: + case 1911: { parser.yyVAL.item = false } - case 1915: + case 1912: { parser.yyVAL.item = true } - case 1984: + case 1981: { var sel ast.StmtNode switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { @@ -18939,7 +18908,7 @@ yynewstate: } parser.yyVAL.statement = sel } - case 2008: + case 2005: { var sel ast.StmtNode switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { @@ -18952,7 +18921,7 @@ yynewstate: } parser.yyVAL.statement = sel } - case 2021: + case 2018: { var sel ast.StmtNode switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { @@ -18965,7 +18934,7 @@ yynewstate: } parser.yyVAL.statement = sel } - case 2023: + case 2020: { if yyS[yypt-0].statement != nil { s := yyS[yypt-0].statement @@ -18975,7 +18944,7 @@ yynewstate: parser.result = append(parser.result, s) } } - case 2024: + case 2021: { if yyS[yypt-0].statement != nil { s := yyS[yypt-0].statement @@ -18985,7 +18954,7 @@ yynewstate: parser.result = append(parser.result, s) } } - case 2025: + case 2022: { cst := yyS[yypt-0].item.(*ast.Constraint) if yyS[yypt-1].item != nil { @@ -18993,7 +18962,7 @@ yynewstate: } parser.yyVAL.item = cst } - case 2030: + case 2027: { if yyS[yypt-0].item != nil { parser.yyVAL.item = []interface{}{yyS[yypt-0].item.(interface{})} @@ -19001,7 +18970,7 @@ yynewstate: parser.yyVAL.item = []interface{}{} } } - case 2031: + case 2028: { if yyS[yypt-0].item != nil { parser.yyVAL.item = append(yyS[yypt-2].item.([]interface{}), yyS[yypt-0].item) @@ -19009,7 +18978,7 @@ yynewstate: parser.yyVAL.item = yyS[yypt-2].item } } - case 2032: + case 2029: { var columnDefs []*ast.ColumnDef var constraints []*ast.Constraint @@ -19018,7 +18987,7 @@ yynewstate: Constraints: constraints, } } - case 2033: + case 2030: { tes := yyS[yypt-1].item.([]interface{}) var columnDefs []*ast.ColumnDef @@ -19036,69 +19005,69 @@ yynewstate: Constraints: constraints, } } - case 2035: + case 2032: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCharset, StrValue: yyS[yypt-0].ident, UintValue: ast.TableOptionCharsetWithoutConvertTo} } - case 2036: + case 2033: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCollate, StrValue: yyS[yypt-0].ident, UintValue: ast.TableOptionCharsetWithoutConvertTo} } - case 2037: + case 2034: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionAutoIncrement, UintValue: yyS[yypt-0].item.(uint64), BoolValue: yyS[yypt-3].item.(bool)} } - case 2038: + case 2035: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionAutoIdCache, UintValue: yyS[yypt-0].item.(uint64)} } - case 2039: + case 2036: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionAutoRandomBase, UintValue: yyS[yypt-0].item.(uint64), BoolValue: yyS[yypt-3].item.(bool)} } - case 2040: + case 2037: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionAvgRowLength, UintValue: yyS[yypt-0].item.(uint64)} } - case 2041: + case 2038: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionConnection, StrValue: yyS[yypt-0].ident} } - case 2042: + case 2039: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCheckSum, UintValue: yyS[yypt-0].item.(uint64)} } - case 2043: + case 2040: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionTableCheckSum, UintValue: yyS[yypt-0].item.(uint64)} } - case 2044: + case 2041: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionPassword, StrValue: yyS[yypt-0].ident} } - case 2045: + case 2042: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCompression, StrValue: yyS[yypt-0].ident} } - case 2046: + case 2043: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionKeyBlockSize, UintValue: yyS[yypt-0].item.(uint64)} } - case 2047: + case 2044: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionDelayKeyWrite, UintValue: yyS[yypt-0].item.(uint64)} } - case 2048: + case 2045: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionRowFormat, UintValue: yyS[yypt-0].item.(uint64)} } - case 2049: + case 2046: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionStatsPersistent} } - case 2050: + case 2047: { n := yyS[yypt-0].item.(uint64) if n != 0 && n != 1 { @@ -19109,13 +19078,13 @@ yynewstate: yylex.AppendError(yylex.Errorf("The STATS_AUTO_RECALC is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } - case 2051: + case 2048: { parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionStatsAutoRecalc, Default: true} yylex.AppendError(yylex.Errorf("The STATS_AUTO_RECALC is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } - case 2052: + case 2049: { // Parse it but will ignore it. // In MySQL, STATS_SAMPLE_PAGES=N(Where 0<N<=65535) or STAS_SAMPLE_PAGES=DEFAULT. @@ -19124,7 +19093,7 @@ yynewstate: yylex.AppendError(yylex.Errorf("The STATS_SAMPLE_PAGES is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } - case 2053: + case 2050: { // Parse it but will ignore it. // In MySQL, default value of STATS_SAMPLE_PAGES is 0. @@ -19132,34 +19101,54 @@ yynewstate: yylex.AppendError(yylex.Errorf("The STATS_SAMPLE_PAGES is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } + case 2051: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionStatsBuckets, UintValue: yyS[yypt-0].item.(uint64)} + } + case 2052: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionStatsTopN, UintValue: yyS[yypt-0].item.(uint64)} + } + case 2053: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionStatsSampleRate, Value: ast.NewValueExpr(yyS[yypt-0].item, "", "")} + } case 2054: { - parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionShardRowID, UintValue: yyS[yypt-0].item.(uint64)} + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionStatsColsChoice, StrValue: yyS[yypt-0].ident} } case 2055: { - parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionPreSplitRegion, UintValue: yyS[yypt-0].item.(uint64)} + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionStatsColList, StrValue: yyS[yypt-0].ident} } case 2056: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionShardRowID, UintValue: yyS[yypt-0].item.(uint64)} + } + case 2057: + { + parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionPreSplitRegion, UintValue: yyS[yypt-0].item.(uint64)} + } + case 2058: { // Parse it but will ignore it. parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionPackKeys} } - case 2057: + case 2059: { // Parse it but will ignore it. parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionStorageMedia, StrValue: "MEMORY"} yylex.AppendError(yylex.Errorf("The STORAGE clause is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } - case 2058: + case 2060: { // Parse it but will ignore it. parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionStorageMedia, StrValue: "DISK"} yylex.AppendError(yylex.Errorf("The STORAGE clause is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } - case 2059: + case 2061: { // Parse it but will ignore it // See https://github.com/mysql/mysql-server/blob/8.0/sql/sql_yacc.yy#L5977-L5984 @@ -19167,7 +19156,7 @@ yynewstate: yylex.AppendError(yylex.Errorf("The SECONDARY_ENGINE clause is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } - case 2060: + case 2062: { // Parse it but will ignore it // See https://github.com/mysql/mysql-server/blob/8.0/sql/sql_yacc.yy#L5977-L5984 @@ -19175,7 +19164,7 @@ yynewstate: yylex.AppendError(yylex.Errorf("The SECONDARY_ENGINE clause is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } - case 2061: + case 2063: { // Parse it but will ignore it parser.yyVAL.item = &ast.TableOption{ @@ -19185,96 +19174,96 @@ yynewstate: yylex.AppendError(yylex.Errorf("The UNION option is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } - case 2062: + case 2064: { // Parse it but will ignore it parser.yyVAL.item = &ast.TableOption{Tp: ast.TableOptionEncryption, StrValue: yyS[yypt-0].ident} } - case 2063: + case 2065: { parser.yyVAL.item = false } - case 2064: + case 2066: { parser.yyVAL.item = true } - case 2067: + case 2069: { parser.yyVAL.item = []*ast.TableOption{} } - case 2069: + case 2071: { parser.yyVAL.item = []*ast.TableOption{yyS[yypt-0].item.(*ast.TableOption)} } - case 2070: + case 2072: { parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.TableOption), yyS[yypt-0].item.(*ast.TableOption)) } - case 2071: + case 2073: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.TableOption), yyS[yypt-0].item.(*ast.TableOption)) } - case 2074: + case 2076: { parser.yyVAL.statement = &ast.TruncateTableStmt{Table: yyS[yypt-0].item.(*ast.TableName)} } - case 2075: + case 2077: { parser.yyVAL.item = ast.RowFormatDefault } - case 2076: + case 2078: { parser.yyVAL.item = ast.RowFormatDynamic } - case 2077: + case 2079: { parser.yyVAL.item = ast.RowFormatFixed } - case 2078: + case 2080: { parser.yyVAL.item = ast.RowFormatCompressed } - case 2079: + case 2081: { parser.yyVAL.item = ast.RowFormatRedundant } - case 2080: + case 2082: { parser.yyVAL.item = ast.RowFormatCompact } - case 2081: + case 2083: { parser.yyVAL.item = ast.TokuDBRowFormatDefault } - case 2082: + case 2084: { parser.yyVAL.item = ast.TokuDBRowFormatFast } - case 2083: + case 2085: { parser.yyVAL.item = ast.TokuDBRowFormatSmall } - case 2084: + case 2086: { parser.yyVAL.item = ast.TokuDBRowFormatZlib } - case 2085: + case 2087: { parser.yyVAL.item = ast.TokuDBRowFormatQuickLZ } - case 2086: + case 2088: { parser.yyVAL.item = ast.TokuDBRowFormatLzma } - case 2087: + case 2089: { parser.yyVAL.item = ast.TokuDBRowFormatSnappy } - case 2088: + case 2090: { parser.yyVAL.item = ast.TokuDBRowFormatUncompressed } - case 2092: + case 2094: { // TODO: check flen 0 x := types.NewFieldType(yyS[yypt-2].item.(byte)) @@ -19293,7 +19282,7 @@ yynewstate: } parser.yyVAL.item = x } - case 2093: + case 2095: { // TODO: check flen 0 x := types.NewFieldType(yyS[yypt-1].item.(byte)) @@ -19308,7 +19297,7 @@ yynewstate: } parser.yyVAL.item = x } - case 2094: + case 2096: { fopt := yyS[yypt-1].item.(*ast.FloatOpt) x := types.NewFieldType(yyS[yypt-2].item.(byte)) @@ -19324,7 +19313,7 @@ yynewstate: } parser.yyVAL.item = x } - case 2095: + case 2097: { fopt := yyS[yypt-1].item.(*ast.FloatOpt) x := types.NewFieldType(yyS[yypt-2].item.(byte)) @@ -19353,7 +19342,7 @@ yynewstate: } parser.yyVAL.item = x } - case 2096: + case 2098: { x := types.NewFieldType(yyS[yypt-1].item.(byte)) x.Flen = yyS[yypt-0].item.(int) @@ -19362,75 +19351,75 @@ yynewstate: } parser.yyVAL.item = x } - case 2097: + case 2099: { parser.yyVAL.item = mysql.TypeTiny } - case 2098: + case 2100: { parser.yyVAL.item = mysql.TypeShort } - case 2099: + case 2101: { parser.yyVAL.item = mysql.TypeInt24 } - case 2100: + case 2102: { parser.yyVAL.item = mysql.TypeLong } - case 2101: + case 2103: { parser.yyVAL.item = mysql.TypeTiny } - case 2102: + case 2104: { parser.yyVAL.item = mysql.TypeShort } - case 2103: + case 2105: { parser.yyVAL.item = mysql.TypeInt24 } - case 2104: + case 2106: { parser.yyVAL.item = mysql.TypeLong } - case 2105: + case 2107: { parser.yyVAL.item = mysql.TypeLonglong } - case 2106: + case 2108: { parser.yyVAL.item = mysql.TypeLong } - case 2107: + case 2109: { parser.yyVAL.item = mysql.TypeLonglong } - case 2108: + case 2110: { parser.yyVAL.item = mysql.TypeTiny } - case 2109: + case 2111: { parser.yyVAL.item = mysql.TypeTiny } - case 2113: + case 2115: { parser.yyVAL.item = mysql.TypeNewDecimal } - case 2114: + case 2116: { parser.yyVAL.item = mysql.TypeNewDecimal } - case 2115: + case 2117: { parser.yyVAL.item = mysql.TypeNewDecimal } - case 2116: + case 2118: { parser.yyVAL.item = mysql.TypeFloat } - case 2117: + case 2119: { if parser.lexer.GetSQLMode().HasRealAsFloatMode() { parser.yyVAL.item = mysql.TypeFloat @@ -19438,19 +19427,19 @@ yynewstate: parser.yyVAL.item = mysql.TypeDouble } } - case 2118: + case 2120: { parser.yyVAL.item = mysql.TypeDouble } - case 2119: + case 2121: { parser.yyVAL.item = mysql.TypeDouble } - case 2120: + case 2122: { parser.yyVAL.item = mysql.TypeBit } - case 2121: + case 2123: { x := types.NewFieldType(mysql.TypeString) x.Flen = yyS[yypt-1].item.(int) @@ -19460,7 +19449,7 @@ yynewstate: } parser.yyVAL.item = x } - case 2122: + case 2124: { x := types.NewFieldType(mysql.TypeString) x.Charset = yyS[yypt-0].item.(*ast.OptBinary).Charset @@ -19469,7 +19458,7 @@ yynewstate: } parser.yyVAL.item = x } - case 2123: + case 2125: { x := types.NewFieldType(mysql.TypeString) x.Flen = yyS[yypt-1].item.(int) @@ -19479,7 +19468,7 @@ yynewstate: } parser.yyVAL.item = x } - case 2124: + case 2126: { x := types.NewFieldType(mysql.TypeString) x.Charset = yyS[yypt-0].item.(*ast.OptBinary).Charset @@ -19488,7 +19477,7 @@ yynewstate: } parser.yyVAL.item = x } - case 2125: + case 2127: { x := types.NewFieldType(mysql.TypeVarchar) x.Flen = yyS[yypt-1].item.(int) @@ -19498,7 +19487,7 @@ yynewstate: } parser.yyVAL.item = x } - case 2126: + case 2128: { x := types.NewFieldType(mysql.TypeVarchar) x.Flen = yyS[yypt-1].item.(int) @@ -19508,7 +19497,7 @@ yynewstate: } parser.yyVAL.item = x } - case 2127: + case 2129: { x := types.NewFieldType(mysql.TypeString) x.Flen = yyS[yypt-0].item.(int) @@ -19517,7 +19506,7 @@ yynewstate: x.Flag |= mysql.BinaryFlag parser.yyVAL.item = x } - case 2128: + case 2130: { x := types.NewFieldType(mysql.TypeVarchar) x.Flen = yyS[yypt-0].item.(int) @@ -19526,7 +19515,7 @@ yynewstate: x.Flag |= mysql.BinaryFlag parser.yyVAL.item = x } - case 2129: + case 2131: { x := yyS[yypt-0].item.(*types.FieldType) x.Charset = charset.CharsetBin @@ -19534,7 +19523,7 @@ yynewstate: x.Flag |= mysql.BinaryFlag parser.yyVAL.item = x } - case 2130: + case 2132: { x := yyS[yypt-1].item.(*types.FieldType) x.Charset = yyS[yypt-0].item.(*ast.OptBinary).Charset @@ -19543,7 +19532,7 @@ yynewstate: } parser.yyVAL.item = x } - case 2131: + case 2133: { x := types.NewFieldType(mysql.TypeEnum) x.Elems = yyS[yypt-2].item.([]string) @@ -19562,7 +19551,7 @@ yynewstate: } parser.yyVAL.item = x } - case 2132: + case 2134: { x := types.NewFieldType(mysql.TypeSet) x.Elems = yyS[yypt-2].item.([]string) @@ -19579,7 +19568,7 @@ yynewstate: } parser.yyVAL.item = x } - case 2133: + case 2135: { x := types.NewFieldType(mysql.TypeJSON) x.Decimal = 0 @@ -19587,7 +19576,7 @@ yynewstate: x.Collate = charset.CollationBin parser.yyVAL.item = x } - case 2134: + case 2136: { x := types.NewFieldType(mysql.TypeMediumBlob) x.Charset = yyS[yypt-0].item.(*ast.OptBinary).Charset @@ -19596,7 +19585,7 @@ yynewstate: } parser.yyVAL.item = x } - case 2135: + case 2137: { x := types.NewFieldType(mysql.TypeMediumBlob) x.Charset = yyS[yypt-0].item.(*ast.OptBinary).Charset @@ -19605,61 +19594,61 @@ yynewstate: } parser.yyVAL.item = x } - case 2155: + case 2157: { x := types.NewFieldType(mysql.TypeTinyBlob) parser.yyVAL.item = x } - case 2156: + case 2158: { x := types.NewFieldType(mysql.TypeBlob) x.Flen = yyS[yypt-0].item.(int) parser.yyVAL.item = x } - case 2157: + case 2159: { x := types.NewFieldType(mysql.TypeMediumBlob) parser.yyVAL.item = x } - case 2158: + case 2160: { x := types.NewFieldType(mysql.TypeLongBlob) parser.yyVAL.item = x } - case 2159: + case 2161: { x := types.NewFieldType(mysql.TypeMediumBlob) parser.yyVAL.item = x } - case 2160: + case 2162: { x := types.NewFieldType(mysql.TypeTinyBlob) parser.yyVAL.item = x } - case 2161: + case 2163: { x := types.NewFieldType(mysql.TypeBlob) x.Flen = yyS[yypt-0].item.(int) parser.yyVAL.item = x } - case 2162: + case 2164: { x := types.NewFieldType(mysql.TypeMediumBlob) parser.yyVAL.item = x } - case 2163: + case 2165: { x := types.NewFieldType(mysql.TypeLongBlob) parser.yyVAL.item = x } - case 2165: + case 2167: { parser.yyVAL.item = &ast.OptBinary{ IsBinary: false, Charset: charset.CharsetLatin1, } } - case 2166: + case 2168: { cs, err := charset.GetCharsetInfo("ucs2") if err != nil { @@ -19671,19 +19660,19 @@ yynewstate: Charset: cs.Name, } } - case 2167: + case 2169: { parser.yyVAL.item = &ast.OptBinary{ IsBinary: false, Charset: "", } } - case 2168: + case 2170: { x := types.NewFieldType(mysql.TypeDate) parser.yyVAL.item = x } - case 2169: + case 2171: { x := types.NewFieldType(mysql.TypeDatetime) x.Flen = mysql.MaxDatetimeWidthNoFsp @@ -19693,7 +19682,7 @@ yynewstate: } parser.yyVAL.item = x } - case 2170: + case 2172: { x := types.NewFieldType(mysql.TypeTimestamp) x.Flen = mysql.MaxDatetimeWidthNoFsp @@ -19703,7 +19692,7 @@ yynewstate: } parser.yyVAL.item = x } - case 2171: + case 2173: { x := types.NewFieldType(mysql.TypeDuration) x.Flen = mysql.MaxDurationWidthNoFsp @@ -19713,7 +19702,7 @@ yynewstate: } parser.yyVAL.item = x } - case 2172: + case 2174: { x := types.NewFieldType(mysql.TypeYear) x.Flen = yyS[yypt-1].item.(int) @@ -19723,122 +19712,122 @@ yynewstate: } parser.yyVAL.item = x } - case 2173: + case 2175: { parser.yyVAL.item = int(yyS[yypt-1].item.(uint64)) } - case 2174: + case 2176: { parser.yyVAL.item = types.UnspecifiedLength } - case 2176: + case 2178: { parser.yyVAL.item = &ast.TypeOpt{IsUnsigned: true} } - case 2177: + case 2179: { parser.yyVAL.item = &ast.TypeOpt{IsUnsigned: false} } - case 2178: + case 2180: { parser.yyVAL.item = &ast.TypeOpt{IsZerofill: true, IsUnsigned: true} } - case 2179: + case 2181: { parser.yyVAL.item = []*ast.TypeOpt{} } - case 2180: + case 2182: { parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.TypeOpt), yyS[yypt-0].item.(*ast.TypeOpt)) } - case 2181: + case 2183: { parser.yyVAL.item = &ast.FloatOpt{Flen: types.UnspecifiedLength, Decimal: types.UnspecifiedLength} } - case 2182: + case 2184: { parser.yyVAL.item = &ast.FloatOpt{Flen: yyS[yypt-0].item.(int), Decimal: types.UnspecifiedLength} } - case 2184: + case 2186: { parser.yyVAL.item = &ast.FloatOpt{Flen: int(yyS[yypt-3].item.(uint64)), Decimal: int(yyS[yypt-1].item.(uint64))} } - case 2185: + case 2187: { parser.yyVAL.item = false } - case 2186: + case 2188: { parser.yyVAL.item = true } - case 2187: + case 2189: { parser.yyVAL.item = &ast.OptBinary{ IsBinary: false, Charset: "", } } - case 2188: + case 2190: { parser.yyVAL.item = &ast.OptBinary{ IsBinary: true, Charset: yyS[yypt-0].ident, } } - case 2189: + case 2191: { parser.yyVAL.item = &ast.OptBinary{ IsBinary: yyS[yypt-0].item.(bool), Charset: yyS[yypt-1].ident, } } - case 2190: + case 2192: { parser.yyVAL.ident = "" } - case 2191: + case 2193: { parser.yyVAL.ident = yyS[yypt-0].ident } - case 2195: + case 2197: { parser.yyVAL.ident = "" } - case 2196: + case 2198: { parser.yyVAL.ident = yyS[yypt-0].ident } - case 2197: + case 2199: { parser.yyVAL.item = []string{yyS[yypt-0].ident} } - case 2198: + case 2200: { parser.yyVAL.item = append(yyS[yypt-2].item.([]string), yyS[yypt-0].ident) } - case 2200: + case 2202: { parser.yyVAL.ident = yyS[yypt-0].item.(ast.BinaryLiteral).ToString() } - case 2201: + case 2203: { parser.yyVAL.ident = yyS[yypt-0].item.(ast.BinaryLiteral).ToString() } - case 2202: + case 2204: { parser.yyVAL.item = []string{yyS[yypt-0].ident} } - case 2203: + case 2205: { parser.yyVAL.item = append(yyS[yypt-2].item.([]string), yyS[yypt-0].ident) } - case 2210: + case 2212: { u := yyS[yypt-0].statement.(*ast.UpdateStmt) u.With = yyS[yypt-1].item.(*ast.WithClause) parser.yyVAL.statement = u } - case 2211: + case 2213: { var refs *ast.Join if x, ok := yyS[yypt-5].item.(*ast.Join); ok { @@ -19866,7 +19855,7 @@ yynewstate: } parser.yyVAL.statement = st } - case 2212: + case 2214: { st := &ast.UpdateStmt{ Priority: yyS[yypt-5].item.(mysql.PriorityEnum), @@ -19882,19 +19871,19 @@ yynewstate: } parser.yyVAL.statement = st } - case 2213: + case 2215: { parser.yyVAL.statement = &ast.UseStmt{DBName: yyS[yypt-0].ident} } - case 2214: + case 2216: { parser.yyVAL.item = yyS[yypt-0].expr } - case 2215: + case 2217: { parser.yyVAL.item = nil } - case 2219: + case 2221: { // See https://dev.mysql.com/doc/refman/5.7/en/create-user.html parser.yyVAL.statement = &ast.CreateUserStmt{ @@ -19906,7 +19895,7 @@ yynewstate: PasswordOrLockOptions: yyS[yypt-0].item.([]*ast.PasswordOrLockOption), } } - case 2220: + case 2222: { // See https://dev.mysql.com/doc/refman/8.0/en/create-role.html parser.yyVAL.statement = &ast.CreateUserStmt{ @@ -19915,7 +19904,7 @@ yynewstate: Specs: yyS[yypt-0].item.([]*ast.UserSpec), } } - case 2221: + case 2223: { parser.yyVAL.statement = &ast.AlterUserStmt{ IfExists: yyS[yypt-4].item.(bool), @@ -19925,7 +19914,7 @@ yynewstate: PasswordOrLockOptions: yyS[yypt-0].item.([]*ast.PasswordOrLockOption), } } - case 2222: + case 2224: { auth := &ast.AuthOption{ AuthString: yyS[yypt-0].ident, @@ -19936,24 +19925,24 @@ yynewstate: CurrentAuth: auth, } } - case 2223: + case 2225: { parser.yyVAL.statement = yyS[yypt-0].item.(*ast.AlterInstanceStmt) } - case 2224: + case 2226: { parser.yyVAL.item = &ast.AlterInstanceStmt{ ReloadTLS: true, } } - case 2225: + case 2227: { parser.yyVAL.item = &ast.AlterInstanceStmt{ ReloadTLS: true, NoRollbackOnError: true, } } - case 2226: + case 2228: { userSpec := &ast.UserSpec{ User: yyS[yypt-1].item.(*auth.UserIdentity), @@ -19963,220 +19952,220 @@ yynewstate: } parser.yyVAL.item = userSpec } - case 2227: + case 2229: { parser.yyVAL.item = []*ast.UserSpec{yyS[yypt-0].item.(*ast.UserSpec)} } - case 2228: + case 2230: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.UserSpec), yyS[yypt-0].item.(*ast.UserSpec)) } - case 2229: + case 2231: { l := []*ast.ResourceOption{} parser.yyVAL.item = l } - case 2230: + case 2232: { parser.yyVAL.item = yyS[yypt-0].item yylex.AppendError(yylex.Errorf("TiDB does not support WITH ConnectionOptions now, they would be parsed but ignored.")) parser.lastErrorAsWarn() } - case 2231: + case 2233: { parser.yyVAL.item = []*ast.ResourceOption{yyS[yypt-0].item.(*ast.ResourceOption)} } - case 2232: + case 2234: { l := yyS[yypt-1].item.([]*ast.ResourceOption) l = append(l, yyS[yypt-0].item.(*ast.ResourceOption)) parser.yyVAL.item = l } - case 2233: + case 2235: { parser.yyVAL.item = &ast.ResourceOption{ Type: ast.MaxQueriesPerHour, Count: yyS[yypt-0].item.(int64), } } - case 2234: + case 2236: { parser.yyVAL.item = &ast.ResourceOption{ Type: ast.MaxUpdatesPerHour, Count: yyS[yypt-0].item.(int64), } } - case 2235: + case 2237: { parser.yyVAL.item = &ast.ResourceOption{ Type: ast.MaxConnectionsPerHour, Count: yyS[yypt-0].item.(int64), } } - case 2236: + case 2238: { parser.yyVAL.item = &ast.ResourceOption{ Type: ast.MaxUserConnections, Count: yyS[yypt-0].item.(int64), } } - case 2237: + case 2239: { parser.yyVAL.item = []*ast.TLSOption{} } - case 2239: + case 2241: { t := &ast.TLSOption{ Type: ast.TlsNone, } parser.yyVAL.item = []*ast.TLSOption{t} } - case 2240: + case 2242: { t := &ast.TLSOption{ Type: ast.Ssl, } parser.yyVAL.item = []*ast.TLSOption{t} } - case 2241: + case 2243: { t := &ast.TLSOption{ Type: ast.X509, } parser.yyVAL.item = []*ast.TLSOption{t} } - case 2242: + case 2244: { parser.yyVAL.item = yyS[yypt-0].item } - case 2243: + case 2245: { parser.yyVAL.item = []*ast.TLSOption{yyS[yypt-0].item.(*ast.TLSOption)} } - case 2244: + case 2246: { l := yyS[yypt-2].item.([]*ast.TLSOption) l = append(l, yyS[yypt-0].item.(*ast.TLSOption)) parser.yyVAL.item = l } - case 2245: + case 2247: { l := yyS[yypt-1].item.([]*ast.TLSOption) l = append(l, yyS[yypt-0].item.(*ast.TLSOption)) parser.yyVAL.item = l } - case 2246: + case 2248: { parser.yyVAL.item = &ast.TLSOption{ Type: ast.Issuer, Value: yyS[yypt-0].ident, } } - case 2247: + case 2249: { parser.yyVAL.item = &ast.TLSOption{ Type: ast.Subject, Value: yyS[yypt-0].ident, } } - case 2248: + case 2250: { parser.yyVAL.item = &ast.TLSOption{ Type: ast.Cipher, Value: yyS[yypt-0].ident, } } - case 2249: + case 2251: { parser.yyVAL.item = &ast.TLSOption{ Type: ast.SAN, Value: yyS[yypt-0].ident, } } - case 2250: + case 2252: { l := []*ast.PasswordOrLockOption{} parser.yyVAL.item = l } - case 2251: + case 2253: { parser.yyVAL.item = yyS[yypt-0].item yylex.AppendError(yylex.Errorf("TiDB does not support PASSWORD EXPIRE and ACCOUNT LOCK now, they would be parsed but ignored.")) parser.lastErrorAsWarn() } - case 2252: + case 2254: { parser.yyVAL.item = []*ast.PasswordOrLockOption{yyS[yypt-0].item.(*ast.PasswordOrLockOption)} } - case 2253: + case 2255: { l := yyS[yypt-1].item.([]*ast.PasswordOrLockOption) l = append(l, yyS[yypt-0].item.(*ast.PasswordOrLockOption)) parser.yyVAL.item = l } - case 2254: + case 2256: { parser.yyVAL.item = &ast.PasswordOrLockOption{ Type: ast.Unlock, } } - case 2255: + case 2257: { parser.yyVAL.item = &ast.PasswordOrLockOption{ Type: ast.Lock, } } - case 2256: + case 2258: { parser.yyVAL.item = &ast.PasswordOrLockOption{ Type: ast.PasswordExpire, } } - case 2257: + case 2259: { parser.yyVAL.item = &ast.PasswordOrLockOption{ Type: ast.PasswordExpireInterval, Count: yyS[yypt-1].item.(int64), } } - case 2258: + case 2260: { parser.yyVAL.item = &ast.PasswordOrLockOption{ Type: ast.PasswordExpireNever, } } - case 2259: + case 2261: { parser.yyVAL.item = &ast.PasswordOrLockOption{ Type: ast.PasswordExpireDefault, } } - case 2260: + case 2262: { parser.yyVAL.item = nil } - case 2261: + case 2263: { parser.yyVAL.item = nil } - case 2262: + case 2264: { parser.yyVAL.item = nil } - case 2263: + case 2265: { parser.yyVAL.item = &ast.AuthOption{ AuthString: yyS[yypt-0].ident, ByAuthString: true, } } - case 2264: + case 2266: { parser.yyVAL.item = &ast.AuthOption{ AuthPlugin: yyS[yypt-0].ident, } } - case 2265: + case 2267: { parser.yyVAL.item = &ast.AuthOption{ AuthPlugin: yyS[yypt-2].ident, @@ -20184,25 +20173,25 @@ yynewstate: ByAuthString: true, } } - case 2266: + case 2268: { parser.yyVAL.item = &ast.AuthOption{ AuthPlugin: yyS[yypt-2].ident, HashString: yyS[yypt-0].ident, } } - case 2267: + case 2269: { parser.yyVAL.item = &ast.AuthOption{ AuthPlugin: mysql.AuthNativePassword, HashString: yyS[yypt-0].ident, } } - case 2270: + case 2272: { parser.yyVAL.ident = yyS[yypt-0].item.(ast.BinaryLiteral).ToString() } - case 2271: + case 2273: { role := yyS[yypt-0].item.(*auth.RoleIdentity) roleSpec := &ast.UserSpec{ @@ -20214,15 +20203,15 @@ yynewstate: } parser.yyVAL.item = roleSpec } - case 2272: + case 2274: { parser.yyVAL.item = []*ast.UserSpec{yyS[yypt-0].item.(*ast.UserSpec)} } - case 2273: + case 2275: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.UserSpec), yyS[yypt-0].item.(*ast.UserSpec)) } - case 2277: + case 2279: { var sel ast.StmtNode switch x := yyS[yypt-0].expr.(*ast.SubqueryExpr).Query.(type) { @@ -20235,7 +20224,7 @@ yynewstate: } parser.yyVAL.statement = sel } - case 2282: + case 2284: { startOffset := parser.startOffset(&yyS[yypt-2]) endOffset := parser.startOffset(&yyS[yypt-1]) @@ -20254,7 +20243,7 @@ yynewstate: parser.yyVAL.statement = x } - case 2283: + case 2285: { startOffset := parser.startOffset(&yyS[yypt]) originStmt := yyS[yypt-0].statement @@ -20267,7 +20256,7 @@ yynewstate: parser.yyVAL.statement = x } - case 2284: + case 2286: { startOffset := parser.startOffset(&yyS[yypt-2]) endOffset := parser.startOffset(&yyS[yypt-1]) @@ -20286,7 +20275,7 @@ yynewstate: parser.yyVAL.statement = x } - case 2285: + case 2287: { p, err := convertToPriv(yyS[yypt-7].item.([]*ast.RoleOrPriv)) if err != nil { @@ -20302,7 +20291,7 @@ yynewstate: WithGrant: yyS[yypt-0].item.(bool), } } - case 2286: + case 2288: { parser.yyVAL.statement = &ast.GrantProxyStmt{ LocalUser: yyS[yypt-3].item.(*auth.UserIdentity), @@ -20310,7 +20299,7 @@ yynewstate: WithGrant: yyS[yypt-0].item.(bool), } } - case 2287: + case 2289: { r, err := convertToRole(yyS[yypt-2].item.([]*ast.RoleOrPriv)) if err != nil { @@ -20322,265 +20311,265 @@ yynewstate: Users: yyS[yypt-0].item.([]*auth.UserIdentity), } } - case 2288: + case 2290: { parser.yyVAL.item = false } - case 2289: + case 2291: { parser.yyVAL.item = true } - case 2290: + case 2292: { parser.yyVAL.item = false } - case 2291: + case 2293: { parser.yyVAL.item = false } - case 2292: + case 2294: { parser.yyVAL.item = false } - case 2293: + case 2295: { parser.yyVAL.item = false } - case 2294: + case 2296: { parser.yyVAL.item = []string{yyS[yypt-0].ident} } - case 2295: + case 2297: { parser.yyVAL.item = append(yyS[yypt-1].item.([]string), yyS[yypt-0].ident) } - case 2296: + case 2298: { parser.yyVAL.item = &ast.RoleOrPriv{ Node: yyS[yypt-0].item, } } - case 2297: + case 2299: { parser.yyVAL.item = &ast.RoleOrPriv{ Node: yyS[yypt-0].item, } } - case 2298: + case 2300: { parser.yyVAL.item = &ast.RoleOrPriv{ Symbols: strings.Join(yyS[yypt-0].item.([]string), " "), } } - case 2299: + case 2301: { parser.yyVAL.item = &ast.RoleOrPriv{ Symbols: "LOAD FROM S3", } } - case 2300: + case 2302: { parser.yyVAL.item = &ast.RoleOrPriv{ Symbols: "SELECT INTO S3", } } - case 2301: + case 2303: { parser.yyVAL.item = []*ast.RoleOrPriv{yyS[yypt-0].item.(*ast.RoleOrPriv)} } - case 2302: + case 2304: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.RoleOrPriv), yyS[yypt-0].item.(*ast.RoleOrPriv)) } - case 2303: + case 2305: { parser.yyVAL.item = &ast.PrivElem{ Priv: yyS[yypt-0].item.(mysql.PrivilegeType), } } - case 2304: + case 2306: { parser.yyVAL.item = &ast.PrivElem{ Priv: yyS[yypt-3].item.(mysql.PrivilegeType), Cols: yyS[yypt-1].item.([]*ast.ColumnName), } } - case 2305: + case 2307: { parser.yyVAL.item = mysql.AllPriv } - case 2306: + case 2308: { parser.yyVAL.item = mysql.AllPriv } - case 2307: + case 2309: { parser.yyVAL.item = mysql.AlterPriv } - case 2308: + case 2310: { parser.yyVAL.item = mysql.CreatePriv } - case 2309: + case 2311: { parser.yyVAL.item = mysql.CreateUserPriv } - case 2310: + case 2312: { parser.yyVAL.item = mysql.CreateTablespacePriv } - case 2311: + case 2313: { parser.yyVAL.item = mysql.TriggerPriv } - case 2312: + case 2314: { parser.yyVAL.item = mysql.DeletePriv } - case 2313: + case 2315: { parser.yyVAL.item = mysql.DropPriv } - case 2314: + case 2316: { parser.yyVAL.item = mysql.ProcessPriv } - case 2315: + case 2317: { parser.yyVAL.item = mysql.ExecutePriv } - case 2316: + case 2318: { parser.yyVAL.item = mysql.IndexPriv } - case 2317: + case 2319: { parser.yyVAL.item = mysql.InsertPriv } - case 2318: + case 2320: { parser.yyVAL.item = mysql.SelectPriv } - case 2319: + case 2321: { parser.yyVAL.item = mysql.SuperPriv } - case 2320: + case 2322: { parser.yyVAL.item = mysql.ShowDBPriv } - case 2321: + case 2323: { parser.yyVAL.item = mysql.UpdatePriv } - case 2322: + case 2324: { parser.yyVAL.item = mysql.GrantPriv } - case 2323: + case 2325: { parser.yyVAL.item = mysql.ReferencesPriv } - case 2324: + case 2326: { parser.yyVAL.item = mysql.ReplicationSlavePriv } - case 2325: + case 2327: { parser.yyVAL.item = mysql.ReplicationClientPriv } - case 2326: + case 2328: { parser.yyVAL.item = mysql.UsagePriv } - case 2327: + case 2329: { parser.yyVAL.item = mysql.ReloadPriv } - case 2328: + case 2330: { parser.yyVAL.item = mysql.FilePriv } - case 2329: + case 2331: { parser.yyVAL.item = mysql.ConfigPriv } - case 2330: + case 2332: { parser.yyVAL.item = mysql.CreateTMPTablePriv } - case 2331: + case 2333: { parser.yyVAL.item = mysql.LockTablesPriv } - case 2332: + case 2334: { parser.yyVAL.item = mysql.CreateViewPriv } - case 2333: + case 2335: { parser.yyVAL.item = mysql.ShowViewPriv } - case 2334: + case 2336: { parser.yyVAL.item = mysql.CreateRolePriv } - case 2335: + case 2337: { parser.yyVAL.item = mysql.DropRolePriv } - case 2336: + case 2338: { parser.yyVAL.item = mysql.CreateRoutinePriv } - case 2337: + case 2339: { parser.yyVAL.item = mysql.AlterRoutinePriv } - case 2338: + case 2340: { parser.yyVAL.item = mysql.EventPriv } - case 2339: + case 2341: { parser.yyVAL.item = mysql.ShutdownPriv } - case 2340: + case 2342: { parser.yyVAL.item = ast.ObjectTypeNone } - case 2341: + case 2343: { parser.yyVAL.item = ast.ObjectTypeTable } - case 2342: + case 2344: { parser.yyVAL.item = ast.ObjectTypeFunction } - case 2343: + case 2345: { parser.yyVAL.item = ast.ObjectTypeProcedure } - case 2344: + case 2346: { parser.yyVAL.item = &ast.GrantLevel{ Level: ast.GrantLevelDB, } } - case 2345: + case 2347: { parser.yyVAL.item = &ast.GrantLevel{ Level: ast.GrantLevelGlobal, } } - case 2346: + case 2348: { parser.yyVAL.item = &ast.GrantLevel{ Level: ast.GrantLevelDB, DBName: yyS[yypt-2].ident, } } - case 2347: + case 2349: { parser.yyVAL.item = &ast.GrantLevel{ Level: ast.GrantLevelTable, @@ -20588,14 +20577,14 @@ yynewstate: TableName: yyS[yypt-0].ident, } } - case 2348: + case 2350: { parser.yyVAL.item = &ast.GrantLevel{ Level: ast.GrantLevelTable, TableName: yyS[yypt-0].ident, } } - case 2349: + case 2351: { p, err := convertToPriv(yyS[yypt-5].item.([]*ast.RoleOrPriv)) if err != nil { @@ -20609,7 +20598,7 @@ yynewstate: Users: yyS[yypt-0].item.([]*ast.UserSpec), } } - case 2350: + case 2352: { // MySQL has special syntax for REVOKE ALL [PRIVILEGES], GRANT OPTION // which uses the RevokeRoleStmt syntax but is of type RevokeStmt. @@ -20641,7 +20630,7 @@ yynewstate: } } } - case 2351: + case 2353: { x := &ast.LoadDataStmt{ Path: yyS[yypt-10].ident, @@ -20677,23 +20666,23 @@ yynewstate: parser.yyVAL.statement = x } - case 2352: + case 2354: { parser.yyVAL.item = uint64(0) } - case 2353: + case 2355: { parser.yyVAL.item = getUint64FromNUM(yyS[yypt-1].item) } - case 2356: + case 2358: { parser.yyVAL.item = nil } - case 2357: + case 2359: { parser.yyVAL.item = yyS[yypt-0].ident } - case 2358: + case 2360: { escape := "\\" parser.yyVAL.item = &ast.FieldsClause{ @@ -20701,7 +20690,7 @@ yynewstate: Escaped: escape[0], } } - case 2359: + case 2361: { fieldsClause := &ast.FieldsClause{ Terminated: "\t", @@ -20731,25 +20720,25 @@ yynewstate: } parser.yyVAL.item = fieldsClause } - case 2362: + case 2364: { fieldItems := yyS[yypt-1].item.([]*ast.FieldItem) parser.yyVAL.item = append(fieldItems, yyS[yypt-0].item.(*ast.FieldItem)) } - case 2363: + case 2365: { fieldItems := make([]*ast.FieldItem, 1, 1) fieldItems[0] = yyS[yypt-0].item.(*ast.FieldItem) parser.yyVAL.item = fieldItems } - case 2364: + case 2366: { parser.yyVAL.item = &ast.FieldItem{ Type: ast.Terminated, Value: yyS[yypt-0].ident, } } - case 2365: + case 2367: { str := yyS[yypt-0].ident if str != "\\" && len(str) > 1 { @@ -20762,7 +20751,7 @@ yynewstate: OptEnclosed: true, } } - case 2366: + case 2368: { str := yyS[yypt-0].ident if str != "\\" && len(str) > 1 { @@ -20774,7 +20763,7 @@ yynewstate: Value: str, } } - case 2367: + case 2369: { str := yyS[yypt-0].ident if str != "\\" && len(str) > 1 { @@ -20786,118 +20775,118 @@ yynewstate: Value: str, } } - case 2369: + case 2371: { parser.yyVAL.ident = yyS[yypt-0].item.(ast.BinaryLiteral).ToString() } - case 2370: + case 2372: { parser.yyVAL.ident = yyS[yypt-0].item.(ast.BinaryLiteral).ToString() } - case 2371: + case 2373: { parser.yyVAL.item = &ast.LinesClause{Terminated: "\n"} } - case 2372: + case 2374: { parser.yyVAL.item = &ast.LinesClause{Starting: yyS[yypt-1].ident, Terminated: yyS[yypt-0].ident} } - case 2373: + case 2375: { parser.yyVAL.ident = "" } - case 2374: + case 2376: { parser.yyVAL.ident = yyS[yypt-0].ident } - case 2375: + case 2377: { parser.yyVAL.ident = "\n" } - case 2376: + case 2378: { parser.yyVAL.ident = yyS[yypt-0].ident } - case 2377: + case 2379: { parser.yyVAL.item = nil } - case 2378: + case 2380: { parser.yyVAL.item = yyS[yypt-0].item } - case 2379: + case 2381: { l := yyS[yypt-2].item.([]*ast.Assignment) parser.yyVAL.item = append(l, yyS[yypt-0].item.(*ast.Assignment)) } - case 2380: + case 2382: { parser.yyVAL.item = []*ast.Assignment{yyS[yypt-0].item.(*ast.Assignment)} } - case 2381: + case 2383: { parser.yyVAL.item = &ast.Assignment{ Column: yyS[yypt-2].expr.(*ast.ColumnNameExpr).Name, Expr: yyS[yypt-0].expr, } } - case 2382: + case 2384: { parser.yyVAL.statement = &ast.UnlockTablesStmt{} } - case 2383: + case 2385: { parser.yyVAL.statement = &ast.LockTablesStmt{ TableLocks: yyS[yypt-0].item.([]ast.TableLock), } } - case 2386: + case 2388: { parser.yyVAL.item = ast.TableLock{ Table: yyS[yypt-1].item.(*ast.TableName), Type: yyS[yypt-0].item.(model.TableLockType), } } - case 2387: + case 2389: { parser.yyVAL.item = model.TableLockRead } - case 2388: + case 2390: { parser.yyVAL.item = model.TableLockReadLocal } - case 2389: + case 2391: { parser.yyVAL.item = model.TableLockWrite } - case 2390: + case 2392: { parser.yyVAL.item = model.TableLockWriteLocal } - case 2391: + case 2393: { parser.yyVAL.item = []ast.TableLock{yyS[yypt-0].item.(ast.TableLock)} } - case 2392: + case 2394: { parser.yyVAL.item = append(yyS[yypt-2].item.([]ast.TableLock), yyS[yypt-0].item.(ast.TableLock)) } - case 2393: + case 2395: { parser.yyVAL.statement = &ast.KillStmt{ ConnectionID: getUint64FromNUM(yyS[yypt-0].item), TiDBExtension: yyS[yypt-1].item.(bool), } } - case 2394: + case 2396: { parser.yyVAL.statement = &ast.KillStmt{ ConnectionID: getUint64FromNUM(yyS[yypt-0].item), TiDBExtension: yyS[yypt-2].item.(bool), } } - case 2395: + case 2397: { parser.yyVAL.statement = &ast.KillStmt{ ConnectionID: getUint64FromNUM(yyS[yypt-0].item), @@ -20905,36 +20894,37 @@ yynewstate: TiDBExtension: yyS[yypt-2].item.(bool), } } - case 2396: + case 2398: { parser.yyVAL.item = false } - case 2397: + case 2399: { parser.yyVAL.item = true } - case 2398: + case 2400: { parser.yyVAL.statement = &ast.LoadStatsStmt{ Path: yyS[yypt-0].ident, } } - case 2399: + case 2401: { parser.yyVAL.statement = &ast.DropPlacementPolicyStmt{ IfExists: yyS[yypt-1].item.(bool), PolicyName: model.NewCIStr(yyS[yypt-0].ident), } } - case 2400: + case 2402: { parser.yyVAL.statement = &ast.CreatePlacementPolicyStmt{ + OrReplace: yyS[yypt-5].item.(bool), IfNotExists: yyS[yypt-2].item.(bool), PolicyName: model.NewCIStr(yyS[yypt-1].ident), PlacementOptions: yyS[yypt-0].item.([]*ast.PlacementOption), } } - case 2401: + case 2403: { parser.yyVAL.statement = &ast.AlterPlacementPolicyStmt{ IfExists: yyS[yypt-2].item.(bool), @@ -20942,7 +20932,7 @@ yynewstate: PlacementOptions: yyS[yypt-0].item.([]*ast.PlacementOption), } } - case 2402: + case 2404: { parser.yyVAL.statement = &ast.CreateSequenceStmt{ IfNotExists: yyS[yypt-3].item.(bool), @@ -20951,87 +20941,87 @@ yynewstate: TblOptions: yyS[yypt-0].item.([]*ast.TableOption), } } - case 2403: + case 2405: { parser.yyVAL.item = []*ast.SequenceOption{} } - case 2405: + case 2407: { parser.yyVAL.item = []*ast.SequenceOption{yyS[yypt-0].item.(*ast.SequenceOption)} } - case 2406: + case 2408: { parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.SequenceOption), yyS[yypt-0].item.(*ast.SequenceOption)) } - case 2407: + case 2409: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceOptionIncrementBy, IntValue: yyS[yypt-0].item.(int64)} } - case 2408: + case 2410: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceOptionIncrementBy, IntValue: yyS[yypt-0].item.(int64)} } - case 2409: + case 2411: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceStartWith, IntValue: yyS[yypt-0].item.(int64)} } - case 2410: + case 2412: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceStartWith, IntValue: yyS[yypt-0].item.(int64)} } - case 2411: + case 2413: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceMinValue, IntValue: yyS[yypt-0].item.(int64)} } - case 2412: + case 2414: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceNoMinValue} } - case 2413: + case 2415: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceNoMinValue} } - case 2414: + case 2416: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceMaxValue, IntValue: yyS[yypt-0].item.(int64)} } - case 2415: + case 2417: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceNoMaxValue} } - case 2416: + case 2418: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceNoMaxValue} } - case 2417: + case 2419: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceCache, IntValue: yyS[yypt-0].item.(int64)} } - case 2418: + case 2420: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceNoCache} } - case 2419: + case 2421: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceNoCache} } - case 2420: + case 2422: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceCycle} } - case 2421: + case 2423: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceNoCycle} } - case 2422: + case 2424: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceNoCycle} } - case 2424: + case 2426: { parser.yyVAL.item = yyS[yypt-0].item } - case 2425: + case 2427: { unsigned_num := getUint64FromNUM(yyS[yypt-0].item) if unsigned_num > 9223372036854775808 { @@ -21044,14 +21034,14 @@ yynewstate: parser.yyVAL.item = -int64(unsigned_num) } } - case 2426: + case 2428: { parser.yyVAL.statement = &ast.DropSequenceStmt{ IfExists: yyS[yypt-1].item.(bool), Sequences: yyS[yypt-0].item.([]*ast.TableName), } } - case 2427: + case 2429: { parser.yyVAL.statement = &ast.AlterSequenceStmt{ IfExists: yyS[yypt-2].item.(bool), @@ -21059,27 +21049,27 @@ yynewstate: SeqOptions: yyS[yypt-0].item.([]*ast.SequenceOption), } } - case 2428: + case 2430: { parser.yyVAL.item = []*ast.SequenceOption{yyS[yypt-0].item.(*ast.SequenceOption)} } - case 2429: + case 2431: { parser.yyVAL.item = append(yyS[yypt-1].item.([]*ast.SequenceOption), yyS[yypt-0].item.(*ast.SequenceOption)) } - case 2431: + case 2433: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceRestart} } - case 2432: + case 2434: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceRestartWith, IntValue: yyS[yypt-0].item.(int64)} } - case 2433: + case 2435: { parser.yyVAL.item = &ast.SequenceOption{Tp: ast.SequenceRestartWith, IntValue: yyS[yypt-0].item.(int64)} } - case 2434: + case 2436: { x := &ast.IndexAdviseStmt{ Path: yyS[yypt-3].ident, @@ -21096,42 +21086,42 @@ yynewstate: } parser.yyVAL.statement = x } - case 2435: + case 2437: { parser.yyVAL.item = uint64(ast.UnspecifiedSize) } - case 2436: + case 2438: { parser.yyVAL.item = getUint64FromNUM(yyS[yypt-0].item) } - case 2437: + case 2439: { parser.yyVAL.item = nil } - case 2438: + case 2440: { parser.yyVAL.item = &ast.MaxIndexNumClause{ PerTable: yyS[yypt-1].item.(uint64), PerDB: yyS[yypt-0].item.(uint64), } } - case 2439: + case 2441: { parser.yyVAL.item = uint64(ast.UnspecifiedSize) } - case 2440: + case 2442: { parser.yyVAL.item = getUint64FromNUM(yyS[yypt-0].item) } - case 2441: + case 2443: { parser.yyVAL.item = uint64(ast.UnspecifiedSize) } - case 2442: + case 2444: { parser.yyVAL.item = getUint64FromNUM(yyS[yypt-0].item) } - case 2443: + case 2445: { // Parse it but will ignore it switch yyS[yypt-0].ident { @@ -21146,19 +21136,19 @@ yynewstate: } parser.yyVAL.ident = yyS[yypt-0].ident } - case 2444: + case 2446: { parser.yyVAL.item = append([]*ast.RowExpr{}, yyS[yypt-0].item.(*ast.RowExpr)) } - case 2445: + case 2447: { parser.yyVAL.item = append(yyS[yypt-2].item.([]*ast.RowExpr), yyS[yypt-0].item.(*ast.RowExpr)) } - case 2446: + case 2448: { parser.yyVAL.item = &ast.RowExpr{Values: yyS[yypt-0].item.([]ast.ExprNode)} } - case 2447: + case 2449: { x := &ast.PlanReplayerStmt{ Stmt: yyS[yypt-0].statement, @@ -21174,7 +21164,7 @@ yynewstate: parser.yyVAL.statement = x } - case 2448: + case 2450: { x := &ast.PlanReplayerStmt{ Stmt: yyS[yypt-0].statement, @@ -21190,7 +21180,7 @@ yynewstate: parser.yyVAL.statement = x } - case 2449: + case 2451: { x := &ast.PlanReplayerStmt{ Stmt: nil, @@ -21210,7 +21200,7 @@ yynewstate: parser.yyVAL.statement = x } - case 2450: + case 2452: { x := &ast.PlanReplayerStmt{ Stmt: nil, @@ -21230,7 +21220,7 @@ yynewstate: parser.yyVAL.statement = x } - case 2451: + case 2453: { x := &ast.PlanReplayerStmt{ Stmt: nil, diff --git a/parser/parser.y b/parser/parser.y index 7a53f6ce8a5f7..068d9438f80cf 100644 --- a/parser/parser.y +++ b/parser/parser.y @@ -298,6 +298,10 @@ import ( any "ANY" ascii "ASCII" attributes "ATTRIBUTES" + statsOptions "STATS_OPTIONS" + statsSampleRate "STATS_SAMPLE_RATE" + statsColChoice "STATS_COL_CHOICE" + statsColList "STATS_COL_LIST" autoIdCache "AUTO_ID_CACHE" autoIncrement "AUTO_INCREMENT" autoRandom "AUTO_RANDOM" @@ -681,6 +685,7 @@ import ( subDate "SUBDATE" sum "SUM" substring "SUBSTRING" + target "TARGET" timestampAdd "TIMESTAMPADD" timestampDiff "TIMESTAMPDIFF" tls "TLS" @@ -723,6 +728,7 @@ import ( pessimistic "PESSIMISTIC" pump "PUMP" samples "SAMPLES" + sampleRate "SAMPLERATE" statistics "STATISTICS" stats "STATS" statsMeta "STATS_META" @@ -730,6 +736,7 @@ import ( statsBuckets "STATS_BUCKETS" statsHealthy "STATS_HEALTHY" statsTopN "STATS_TOPN" + histogramsInFlight "HISTOGRAMS_IN_FLIGHT" telemetry "TELEMETRY" telemetryID "TELEMETRY_ID" tidb "TIDB" @@ -1300,18 +1307,13 @@ import ( BRIEBooleanOptionName "Name of a BRIE option which takes a boolean as input" BRIEStringOptionName "Name of a BRIE option which takes a string as input" BRIEKeywordOptionName "Name of a BRIE option which takes a case-insensitive string as input" - PlacementCount "Placement rules count option" - PlacementLabelConstraints "Placement rules label constraints option" - PlacementRole "Placement rules role option" - OldPlacementOptions "Placement rules options" PlacementOption "Anonymous or direct placement option" PlacementPolicyOption "Anonymous or placement policy option" DirectPlacementOption "Subset of anonymous or direct placement option" PlacementOptionList "Anomymous or direct placement option list" - PlacementSpec "Placement rules specification" - PlacementSpecList "Placement rules specifications" AttributesOpt "Attributes options" - PredicateColumnsOpt "predicate columns option" + AllColumnsOrPredicateColumnsOpt "all columns or predicate columns option" + StatsOptionsOpt "Stats options" %type <ident> AsOpt "AS or EmptyString" @@ -1399,8 +1401,6 @@ import ( %precedence sqlBigResult %precedence sqlSmallResult %precedence sqlCache sqlNoCache -%precedence lowerThanIntervalKeyword -%precedence interval %precedence next %precedence lowerThanValueKeyword %precedence value @@ -1453,6 +1453,7 @@ import ( %precedence lowerThanNot %right not not2 %right collate +%left interval %right encryption %left labels %precedence quick @@ -1498,41 +1499,6 @@ AlterTableStmt: } } -PlacementRole: - "ROLE" "=" "FOLLOWER" - { - $$ = ast.PlacementRoleFollower - } -| "ROLE" "=" "LEADER" - { - $$ = ast.PlacementRoleLeader - } -| "ROLE" "=" "LEARNER" - { - $$ = ast.PlacementRoleLearner - } -| "ROLE" "=" "VOTER" - { - $$ = ast.PlacementRoleVoter - } - -PlacementCount: - "REPLICAS" "=" LengthNum - { - cnt := $3.(uint64) - if cnt == 0 { - yylex.AppendError(yylex.Errorf("Invalid placement option REPLICAS, it is not allowed to be 0")) - return 1 - } - $$ = cnt - } - -PlacementLabelConstraints: - "CONSTRAINTS" "=" stringLit - { - $$ = $3 - } - PlacementOptionList: DirectPlacementOption { @@ -1615,86 +1581,6 @@ PlacementPolicyOption: $$ = &ast.PlacementOption{Tp: ast.PlacementOptionPolicy, StrValue: $4} } -OldPlacementOptions: - PlacementCount - { - $$ = &ast.PlacementSpec{ - Replicas: $1.(uint64), - } - } -| PlacementLabelConstraints - { - $$ = &ast.PlacementSpec{ - Constraints: $1.(string), - } - } -| PlacementRole - { - $$ = &ast.PlacementSpec{ - Role: $1.(ast.PlacementRole), - } - } -| OldPlacementOptions PlacementCount - { - spec := $1.(*ast.PlacementSpec) - if spec.Replicas != 0 { - yylex.AppendError(yylex.Errorf("Duplicate placement option REPLICAS")) - return 1 - } - spec.Replicas = $2.(uint64) - $$ = spec - } -| OldPlacementOptions PlacementLabelConstraints - { - spec := $1.(*ast.PlacementSpec) - if len(spec.Constraints) > 0 { - yylex.AppendError(yylex.Errorf("Duplicate placement option CONSTRAINTS")) - return 1 - } - spec.Constraints = $2.(string) - $$ = spec - } -| OldPlacementOptions PlacementRole - { - spec := $1.(*ast.PlacementSpec) - if spec.Role != ast.PlacementRoleNone { - yylex.AppendError(yylex.Errorf("Duplicate placement option ROLE")) - return 1 - } - spec.Role = $2.(ast.PlacementRole) - $$ = spec - } - -PlacementSpec: - "ADD" "PLACEMENT" "POLICY" OldPlacementOptions - { - spec := $4.(*ast.PlacementSpec) - spec.Tp = ast.PlacementAdd - $$ = spec - } -| "ALTER" "PLACEMENT" "POLICY" OldPlacementOptions - { - spec := $4.(*ast.PlacementSpec) - spec.Tp = ast.PlacementAlter - $$ = spec - } -| "DROP" "PLACEMENT" "POLICY" PlacementRole - { - spec := &ast.PlacementSpec{Role: $4.(ast.PlacementRole)} - spec.Tp = ast.PlacementDrop - $$ = spec - } - -PlacementSpecList: - PlacementSpec - { - $$ = []*ast.PlacementSpec{$1.(*ast.PlacementSpec)} - } -| PlacementSpecList ',' PlacementSpec - { - $$ = append($1.([]*ast.PlacementSpec), $3.(*ast.PlacementSpec)) - } - AttributesOpt: "ATTRIBUTES" EqOpt "DEFAULT" { @@ -1705,6 +1591,16 @@ AttributesOpt: $$ = &ast.AttributesSpec{Default: false, Attributes: $3} } +StatsOptionsOpt: + "STATS_OPTIONS" EqOpt "DEFAULT" + { + $$ = &ast.StatsOptionsSpec{Default: true} + } +| "STATS_OPTIONS" EqOpt stringLit + { + $$ = &ast.StatsOptionsSpec{Default: false, StatsOptions: $3} + } + AlterTablePartitionOpt: PartitionOpt { @@ -1887,12 +1783,11 @@ AlterTableSpec: AttributesSpec: $1.(*ast.AttributesSpec), } } -| "ALTER" "PARTITION" Identifier PlacementSpecList %prec lowerThanComma +| StatsOptionsOpt { $$ = &ast.AlterTableSpec{ - Tp: ast.AlterTableAlterPartition, - PartitionNames: []model.CIStr{model.NewCIStr($3)}, - PlacementSpecs: $4.([]*ast.PlacementSpec), + Tp: ast.AlterTableStatsOptions, + StatsOptionsSpec: $1.(*ast.StatsOptionsSpec), } } | "CHECK" "PARTITION" AllOrPartitionNameList @@ -2279,13 +2174,6 @@ AlterTableSpec: Visibility: $4.(ast.IndexVisibility), } } -| PlacementSpecList %prec lowerThanComma - { - $$ = &ast.AlterTableSpec{ - Tp: ast.AlterTablePlacement, - PlacementSpecs: $1.([]*ast.PlacementSpec), - } - } // Support caching or non-caching a table in memory for tidb, It can be found in the official Oracle document, see: https://docs.oracle.com/database/121/SQLRF/statements_3001.htm | "CACHE" { @@ -2673,9 +2561,9 @@ SplitSyntaxOption: } AnalyzeTableStmt: - "ANALYZE" "TABLE" TableNameList PredicateColumnsOpt AnalyzeOptionListOpt + "ANALYZE" "TABLE" TableNameList AllColumnsOrPredicateColumnsOpt AnalyzeOptionListOpt { - $$ = &ast.AnalyzeTableStmt{TableNames: $3.([]*ast.TableName), PredicateColumns: $4.(bool), AnalyzeOpts: $5.([]ast.AnalyzeOpt)} + $$ = &ast.AnalyzeTableStmt{TableNames: $3.([]*ast.TableName), ColumnChoice: $4.(model.ColumnChoice), AnalyzeOpts: $5.([]ast.AnalyzeOpt)} } | "ANALYZE" "TABLE" TableName "INDEX" IndexNameList AnalyzeOptionListOpt { @@ -2685,9 +2573,9 @@ AnalyzeTableStmt: { $$ = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{$4.(*ast.TableName)}, IndexNames: $6.([]model.CIStr), IndexFlag: true, Incremental: true, AnalyzeOpts: $7.([]ast.AnalyzeOpt)} } -| "ANALYZE" "TABLE" TableName "PARTITION" PartitionNameList PredicateColumnsOpt AnalyzeOptionListOpt +| "ANALYZE" "TABLE" TableName "PARTITION" PartitionNameList AllColumnsOrPredicateColumnsOpt AnalyzeOptionListOpt { - $$ = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{$3.(*ast.TableName)}, PartitionNames: $5.([]model.CIStr), PredicateColumns: $6.(bool), AnalyzeOpts: $7.([]ast.AnalyzeOpt)} + $$ = &ast.AnalyzeTableStmt{TableNames: []*ast.TableName{$3.(*ast.TableName)}, PartitionNames: $5.([]model.CIStr), ColumnChoice: $6.(model.ColumnChoice), AnalyzeOpts: $7.([]ast.AnalyzeOpt)} } | "ANALYZE" "TABLE" TableName "PARTITION" PartitionNameList "INDEX" IndexNameList AnalyzeOptionListOpt { @@ -2710,47 +2598,53 @@ AnalyzeTableStmt: AnalyzeOpts: $9.([]ast.AnalyzeOpt), } } -| "ANALYZE" "TABLE" TableName "UPDATE" "HISTOGRAM" "ON" ColumnNameList AnalyzeOptionListOpt +| "ANALYZE" "TABLE" TableName "UPDATE" "HISTOGRAM" "ON" IdentList AnalyzeOptionListOpt { $$ = &ast.AnalyzeTableStmt{ TableNames: []*ast.TableName{$3.(*ast.TableName)}, - ColumnNames: $7.([]*ast.ColumnName), + ColumnNames: $7.([]model.CIStr), AnalyzeOpts: $8.([]ast.AnalyzeOpt), HistogramOperation: ast.HistogramOperationUpdate, } } -| "ANALYZE" "TABLE" TableName "DROP" "HISTOGRAM" "ON" ColumnNameList +| "ANALYZE" "TABLE" TableName "DROP" "HISTOGRAM" "ON" IdentList { $$ = &ast.AnalyzeTableStmt{ TableNames: []*ast.TableName{$3.(*ast.TableName)}, - ColumnNames: $7.([]*ast.ColumnName), + ColumnNames: $7.([]model.CIStr), HistogramOperation: ast.HistogramOperationDrop, } } -| "ANALYZE" "TABLE" TableName "COLUMNS" ColumnNameList AnalyzeOptionListOpt +| "ANALYZE" "TABLE" TableName "COLUMNS" IdentList AnalyzeOptionListOpt { $$ = &ast.AnalyzeTableStmt{ - TableNames: []*ast.TableName{$3.(*ast.TableName)}, - ColumnNames: $5.([]*ast.ColumnName), - AnalyzeOpts: $6.([]ast.AnalyzeOpt)} + TableNames: []*ast.TableName{$3.(*ast.TableName)}, + ColumnNames: $5.([]model.CIStr), + ColumnChoice: model.ColumnList, + AnalyzeOpts: $6.([]ast.AnalyzeOpt)} } -| "ANALYZE" "TABLE" TableName "PARTITION" PartitionNameList "COLUMNS" ColumnNameList AnalyzeOptionListOpt +| "ANALYZE" "TABLE" TableName "PARTITION" PartitionNameList "COLUMNS" IdentList AnalyzeOptionListOpt { $$ = &ast.AnalyzeTableStmt{ TableNames: []*ast.TableName{$3.(*ast.TableName)}, PartitionNames: $5.([]model.CIStr), - ColumnNames: $7.([]*ast.ColumnName), + ColumnNames: $7.([]model.CIStr), + ColumnChoice: model.ColumnList, AnalyzeOpts: $8.([]ast.AnalyzeOpt)} } -PredicateColumnsOpt: +AllColumnsOrPredicateColumnsOpt: /* empty */ { - $$ = false + $$ = model.DefaultChoice + } +| "ALL" "COLUMNS" + { + $$ = model.AllColumns } | "PREDICATE" "COLUMNS" { - $$ = true + $$ = model.PredicateColumns } AnalyzeOptionListOpt: @@ -2775,23 +2669,27 @@ AnalyzeOptionList: AnalyzeOption: NUM "BUCKETS" { - $$ = ast.AnalyzeOpt{Type: ast.AnalyzeOptNumBuckets, Value: getUint64FromNUM($1)} + $$ = ast.AnalyzeOpt{Type: ast.AnalyzeOptNumBuckets, Value: ast.NewValueExpr($1, "", "")} } | NUM "TOPN" { - $$ = ast.AnalyzeOpt{Type: ast.AnalyzeOptNumTopN, Value: getUint64FromNUM($1)} + $$ = ast.AnalyzeOpt{Type: ast.AnalyzeOptNumTopN, Value: ast.NewValueExpr($1, "", "")} } | NUM "CMSKETCH" "DEPTH" { - $$ = ast.AnalyzeOpt{Type: ast.AnalyzeOptCMSketchDepth, Value: getUint64FromNUM($1)} + $$ = ast.AnalyzeOpt{Type: ast.AnalyzeOptCMSketchDepth, Value: ast.NewValueExpr($1, "", "")} } | NUM "CMSKETCH" "WIDTH" { - $$ = ast.AnalyzeOpt{Type: ast.AnalyzeOptCMSketchWidth, Value: getUint64FromNUM($1)} + $$ = ast.AnalyzeOpt{Type: ast.AnalyzeOptCMSketchWidth, Value: ast.NewValueExpr($1, "", "")} } | NUM "SAMPLES" { - $$ = ast.AnalyzeOpt{Type: ast.AnalyzeOptNumSamples, Value: getUint64FromNUM($1)} + $$ = ast.AnalyzeOpt{Type: ast.AnalyzeOptNumSamples, Value: ast.NewValueExpr($1, "", "")} + } +| NumLiteral "SAMPLERATE" + { + $$ = ast.AnalyzeOpt{Type: ast.AnalyzeOptSampleRate, Value: ast.NewValueExpr($1, "", "")} } /*******************************************************************************************/ @@ -4624,8 +4522,9 @@ TraceStmt: "TRACE" TraceableStmt { $$ = &ast.TraceStmt{ - Stmt: $2, - Format: "row", + Stmt: $2, + Format: "row", + TracePlan: false, } startOffset := parser.startOffset(&yyS[yypt]) $2.SetText(string(parser.src[startOffset:])) @@ -4633,12 +4532,32 @@ TraceStmt: | "TRACE" "FORMAT" "=" stringLit TraceableStmt { $$ = &ast.TraceStmt{ - Stmt: $5, - Format: $4, + Stmt: $5, + Format: $4, + TracePlan: false, } startOffset := parser.startOffset(&yyS[yypt]) $5.SetText(string(parser.src[startOffset:])) } +| "TRACE" "PLAN" TraceableStmt + { + $$ = &ast.TraceStmt{ + Stmt: $3, + TracePlan: true, + } + startOffset := parser.startOffset(&yyS[yypt]) + $3.SetText(string(parser.src[startOffset:])) + } +| "TRACE" "PLAN" "TARGET" "=" stringLit TraceableStmt + { + $$ = &ast.TraceStmt{ + Stmt: $6, + TracePlan: true, + TracePlanTarget: $5, + } + startOffset := parser.startOffset(&yyS[yypt]) + $6.SetText(string(parser.src[startOffset:])) + } ExplainSym: "EXPLAIN" @@ -5803,6 +5722,10 @@ UnReservedKeyword: | "ADVISE" | "ASCII" | "ATTRIBUTES" +| "STATS_OPTIONS" +| "STATS_SAMPLE_RATE" +| "STATS_COL_CHOICE" +| "STATS_COL_LIST" | "AUTO_ID_CACHE" | "AUTO_INCREMENT" | "AFTER" @@ -6149,6 +6072,7 @@ TiDBKeyword: | "NODE_STATE" | "PUMP" | "SAMPLES" +| "SAMPLERATE" | "STATISTICS" | "STATS" | "STATS_META" @@ -6156,6 +6080,7 @@ TiDBKeyword: | "STATS_TOPN" | "STATS_BUCKETS" | "STATS_HEALTHY" +| "HISTOGRAMS_IN_FLIGHT" | "TELEMETRY" | "TELEMETRY_ID" | "TIDB" @@ -6213,6 +6138,7 @@ NotKeywordToken: | "VARIANCE" | "VAR_POP" | "VAR_SAMP" +| "TARGET" | "TIMESTAMPADD" | "TIMESTAMPDIFF" | "TOKUDB_DEFAULT" @@ -6822,7 +6748,7 @@ SimpleExpr: { $$ = &ast.UnaryOperationExpr{Op: opcode.Not2, V: $2} } -| SubSelect +| SubSelect %prec neg | '(' Expression ')' { startOffset := parser.startOffset(&yyS[yypt-1]) @@ -7007,7 +6933,7 @@ FunctionNameConflict: | "DAY" | "HOUR" | "IF" -| "INTERVAL" %prec lowerThanIntervalKeyword +| "INTERVAL" | "FORMAT" | "LEFT" | "MICROSECOND" @@ -9238,6 +9164,29 @@ SubSelect: rs.SetText(src[yyS[yypt-1].offset:yyS[yypt].offset]) $$ = &ast.SubqueryExpr{Query: rs} } +| '(' SubSelect ')' + { + subQuery := $2.(*ast.SubqueryExpr).Query + isRecursive := true + // remove redundant brackets like '((select 1))' + for isRecursive { + if _, isRecursive = subQuery.(*ast.SubqueryExpr); isRecursive { + subQuery = subQuery.(*ast.SubqueryExpr).Query + } + } + switch rs := subQuery.(type) { + case *ast.SelectStmt: + endOffset := parser.endOffset(&yyS[yypt]) + parser.setLastSelectFieldText(rs, endOffset) + src := parser.src + rs.SetText(src[yyS[yypt-1].offset:yyS[yypt].offset]) + $$ = &ast.SubqueryExpr{Query: rs} + case *ast.SetOprStmt: + src := parser.src + rs.SetText(src[yyS[yypt-1].offset:yyS[yypt].offset]) + $$ = &ast.SubqueryExpr{Query: rs} + } + } // See https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html SelectLockOpt: @@ -9788,7 +9737,7 @@ VariableAssignment: { $$ = &ast.VariableAssignment{Name: $2, Value: $4, IsSystem: true} } -| "LOCAL" VariableName EqOrAssignmentEq Expression +| "LOCAL" VariableName EqOrAssignmentEq SetExpr { $$ = &ast.VariableAssignment{Name: $2, Value: $4, IsSystem: true} } @@ -10718,6 +10667,10 @@ ShowTargetFilterable: { $$ = &ast.ShowStmt{Tp: ast.ShowStatsHealthy} } +| "HISTOGRAMS_IN_FLIGHT" + { + $$ = &ast.ShowStmt{Tp: ast.ShowHistogramsInFlight} + } | "COLUMN_STATS_USAGE" { $$ = &ast.ShowStmt{Tp: ast.ShowColumnStatsUsage} @@ -11266,6 +11219,26 @@ TableOption: yylex.AppendError(yylex.Errorf("The STATS_SAMPLE_PAGES is parsed but ignored by all storage engines.")) parser.lastErrorAsWarn() } +| "STATS_BUCKETS" EqOpt LengthNum + { + $$ = &ast.TableOption{Tp: ast.TableOptionStatsBuckets, UintValue: $3.(uint64)} + } +| "STATS_TOPN" EqOpt LengthNum + { + $$ = &ast.TableOption{Tp: ast.TableOptionStatsTopN, UintValue: $3.(uint64)} + } +| "STATS_SAMPLE_RATE" EqOpt NumLiteral + { + $$ = &ast.TableOption{Tp: ast.TableOptionStatsSampleRate, Value: ast.NewValueExpr($3, "", "")} + } +| "STATS_COL_CHOICE" EqOpt stringLit + { + $$ = &ast.TableOption{Tp: ast.TableOptionStatsColsChoice, StrValue: $3} + } +| "STATS_COL_LIST" EqOpt stringLit + { + $$ = &ast.TableOption{Tp: ast.TableOptionStatsColList, StrValue: $3} + } | "SHARD_ROW_ID_BITS" EqOpt LengthNum { $$ = &ast.TableOption{Tp: ast.TableOptionShardRowID, UintValue: $3.(uint64)} @@ -13377,12 +13350,13 @@ DropPolicyStmt: } CreatePolicyStmt: - "CREATE" "PLACEMENT" "POLICY" IfNotExists PolicyName PlacementOptionList + "CREATE" OrReplace "PLACEMENT" "POLICY" IfNotExists PolicyName PlacementOptionList { $$ = &ast.CreatePlacementPolicyStmt{ - IfNotExists: $4.(bool), - PolicyName: model.NewCIStr($5), - PlacementOptions: $6.([]*ast.PlacementOption), + OrReplace: $2.(bool), + IfNotExists: $5.(bool), + PolicyName: model.NewCIStr($6), + PlacementOptions: $7.([]*ast.PlacementOption), } } diff --git a/parser/parser_serial_test.go b/parser/parser_serial_test.go new file mode 100644 index 0000000000000..84dbe335d7b10 --- /dev/null +++ b/parser/parser_serial_test.go @@ -0,0 +1,58 @@ +// Copyright 2021 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, +// 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. + +package parser_test + +import ( + "runtime" + "strings" + "testing" + + "github.com/pingcap/tidb/parser" + "github.com/pingcap/tidb/parser/charset" + "github.com/stretchr/testify/require" +) + +func TestInsertStatementMemoryAllocation(t *testing.T) { + sql := "insert t values (1)" + strings.Repeat(",(1)", 1000) + var oldStats, newStats runtime.MemStats + runtime.ReadMemStats(&oldStats) + _, err := parser.New().ParseOneStmt(sql, "", "") + require.NoError(t, err) + runtime.ReadMemStats(&newStats) + require.Less(t, int(newStats.TotalAlloc-oldStats.TotalAlloc), 1024*500) +} + +func TestCharsetIntroducer(t *testing.T) { + p := parser.New() + // `_gbk` is treated as an identifier. + _, _, err := p.Parse("select _gbk 'a';", "", "") + require.NoError(t, err) + + charset.AddCharset(&charset.Charset{ + Name: "gbk", + DefaultCollation: "gbk_bin", + Collations: map[string]*charset.Collation{}, + Desc: "gbk", + Maxlen: 2, + }) + defer charset.RemoveCharset("gbk") + // `_gbk` is treated as a character set. + _, _, err = p.Parse("select _gbk 'a';", "", "") + require.EqualError(t, err, "[ddl:1115]Unsupported character introducer: 'gbk'") + _, _, err = p.Parse("select _gbk 0x1234;", "", "") + require.EqualError(t, err, "[ddl:1115]Unsupported character introducer: 'gbk'") + _, _, err = p.Parse("select _gbk 0b101001;", "", "") + require.EqualError(t, err, "[ddl:1115]Unsupported character introducer: 'gbk'") +} diff --git a/parser/parser_test.go b/parser/parser_test.go index 619870e44ef87..b1b7b5ef89f17 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -16,11 +16,9 @@ package parser_test import ( "bytes" "fmt" - "runtime" "strings" "testing" - . "github.com/pingcap/check" "github.com/pingcap/errors" "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/parser/ast" @@ -31,21 +29,11 @@ import ( "github.com/pingcap/tidb/parser/opcode" "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/parser/test_driver" + "github.com/stretchr/testify/require" ) -func TestT(t *testing.T) { - CustomVerboseFlag = true - TestingT(t) -} - -var _ = Suite(&testParserSuite{}) - -type testParserSuite struct { - enableWindowFunc bool -} - -func (s *testParserSuite) TestSimple(c *C) { - parser := parser.New() +func TestSimple(t *testing.T) { + p := parser.New() reservedKws := []string{ "add", "all", "alter", "analyze", "and", "as", "asc", "between", "bigint", @@ -77,16 +65,17 @@ func (s *testParserSuite) TestSimple(c *C) { } for _, kw := range reservedKws { src := fmt.Sprintf("SELECT * FROM db.%s;", kw) - _, err := parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil, Commentf("source %s", src)) + _, err := p.ParseOneStmt(src, "", "") + + require.NoErrorf(t, err, "source %s", src) src = fmt.Sprintf("SELECT * FROM %s.desc", kw) - _, err = parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil, Commentf("source %s", src)) + _, err = p.ParseOneStmt(src, "", "") + require.NoErrorf(t, err, "source %s", src) src = fmt.Sprintf("SELECT t.%s FROM t", kw) - _, err = parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil, Commentf("source %s", src)) + _, err = p.ParseOneStmt(src, "", "") + require.NoErrorf(t, err, "source %s", src) } // Testcase for unreserved keywords @@ -94,7 +83,7 @@ func (s *testParserSuite) TestSimple(c *C) { "auto_increment", "after", "begin", "bit", "bool", "boolean", "charset", "columns", "commit", "date", "datediff", "datetime", "deallocate", "do", "from_days", "end", "engine", "engines", "execute", "extended", "first", "file", "full", "local", "names", "offset", "password", "prepare", "quick", "rollback", "session", "signed", - "start", "global", "tables", "tablespace", "text", "time", "timestamp", "tidb", "transaction", "truncate", "unknown", + "start", "global", "tables", "tablespace", "target", "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", "quarter", "escape", "grants", "status", "fields", "triggers", "language", @@ -107,57 +96,57 @@ func (s *testParserSuite) TestSimple(c *C) { "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", "following", "preceding", "unbounded", "respect", "nulls", "current", "last", "against", "expansion", - "chain", "error", "general", "nvarchar", "pack_keys", "parser", "shard_row_id_bits", "pre_split_regions", + "chain", "error", "general", "nvarchar", "pack_keys", "p", "shard_row_id_bits", "pre_split_regions", "constraints", "role", "replicas", "policy", "s3", "strict", "running", "stop", "preserve", "placement", } for _, kw := range unreservedKws { src := fmt.Sprintf("SELECT %s FROM tbl;", kw) - _, err := parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil, Commentf("source %s", src)) + _, err := p.ParseOneStmt(src, "", "") + require.NoErrorf(t, err, "source %s", src) } // Testcase for prepared statement src := "SELECT id+?, id+? from t;" - _, err := parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil) + _, err := p.ParseOneStmt(src, "", "") + require.NoError(t, err) // 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) + stmts, _, err := p.Parse(src, "", "") + require.NoError(t, err) + require.Len(t, stmts, 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) + stmts, _, err = p.Parse(src, "", "") + require.NoError(t, err) + require.Len(t, stmts, 1) stmt := stmts[0] _, ok := stmt.(*ast.SetStmt) - c.Assert(ok, IsTrue) + require.True(t, ok) // for issue #2017 src = "insert into blobtable (a) values ('/*! truncated */');" - stmt, err = parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil) + stmt, err = p.ParseOneStmt(src, "", "") + require.NoError(t, err) is, ok := stmt.(*ast.InsertStmt) - c.Assert(ok, IsTrue) - c.Assert(is.Lists, HasLen, 1) - c.Assert(is.Lists[0], HasLen, 1) - c.Assert(is.Lists[0][0].(ast.ValueExpr).GetDatumString(), Equals, "/*! truncated */") + require.True(t, ok) + require.Len(t, is.Lists, 1) + require.Len(t, is.Lists[0], 1) + require.Equal(t, "/*! truncated */", is.Lists[0][0].(ast.ValueExpr).GetDatumString()) // Testcase for CONVERT(expr,type) src = "SELECT CONVERT('111', SIGNED);" - st, err := parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil) + st, err := p.ParseOneStmt(src, "", "") + require.NoError(t, err) ss, ok := st.(*ast.SelectStmt) - c.Assert(ok, IsTrue) - c.Assert(len(ss.Fields.Fields), Equals, 1) + require.True(t, ok) + require.Len(t, ss.Fields.Fields, 1) cv, ok := ss.Fields.Fields[0].Expr.(*ast.FuncCastExpr) - c.Assert(ok, IsTrue) - c.Assert(cv.FunctionType, Equals, ast.CastConvertFunction) + require.True(t, ok) + require.Equal(t, ast.CastConvertFunction, cv.FunctionType) // for query start with comment srcs := []string{ @@ -168,55 +157,55 @@ func (s *testParserSuite) TestSimple(c *C) { "SELECT CONVERT('111', SIGNED) /*comment*/;", } for _, src := range srcs { - st, err = parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil) + st, err = p.ParseOneStmt(src, "", "") + require.NoError(t, err) _, ok = st.(*ast.SelectStmt) - c.Assert(ok, IsTrue) + require.True(t, ok) } // for issue #961 src = "create table t (c int key);" - st, err = parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil) + st, err = p.ParseOneStmt(src, "", "") + require.NoError(t, err) 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) + require.True(t, ok) + require.Len(t, cs.Cols, 1) + require.Len(t, cs.Cols[0].Options, 1) + require.Equal(t, ast.ColumnOptionPrimaryKey, cs.Cols[0].Options[0].Tp) // for issue #4497 src = "create table t1(a NVARCHAR(100));" - _, err = parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil) + _, err = p.ParseOneStmt(src, "", "") + require.NoError(t, err) // for issue 2803 src = "use quote;" - _, err = parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil) + _, err = p.ParseOneStmt(src, "", "") + require.NoError(t, err) // issue #4354 src = "select b'';" - _, err = parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil) + _, err = p.ParseOneStmt(src, "", "") + require.NoError(t, err) src = "select B'';" - _, err = parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil) + _, err = p.ParseOneStmt(src, "", "") + require.NoError(t, err) // src = "select 0b'';" - // _, err = parser.ParseOneStmt(src, "", "") - // c.Assert(err, NotNil) + // _, err = p.ParseOneStmt(src, "", "") + // require.Error(t, err) // for #4909, support numericType `signed` filedOpt. src = "CREATE TABLE t(_sms smallint signed, _smu smallint unsigned);" - _, err = parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil) + _, err = p.ParseOneStmt(src, "", "") + require.NoError(t, err) // 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) + _, err = p.ParseOneStmt(src, "", "") + require.NoError(t, err) src = `CREATE TABLE t(a tinyint signed, b smallint signed, @@ -233,123 +222,123 @@ func (s *testParserSuite) TestSimple(c *C) { m boolean signed );` - st, err = parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil) + st, err = p.ParseOneStmt(src, "", "") + require.NoError(t, err) ct, ok := st.(*ast.CreateTableStmt) - c.Assert(ok, IsTrue) + require.True(t, ok) for _, col := range ct.Cols { - c.Assert(col.Tp.Flag&mysql.UnsignedFlag, Equals, uint(0)) + require.Equal(t, uint(0), col.Tp.Flag&mysql.UnsignedFlag) } // for issue #4006 src = `insert into tb(v) (select v from tb);` - _, err = parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil) + _, err = p.ParseOneStmt(src, "", "") + require.NoError(t, err) // for issue #9823 src = "SELECT 9223372036854775807;" - st, err = parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil) + st, err = p.ParseOneStmt(src, "", "") + require.NoError(t, err) sel, ok := st.(*ast.SelectStmt) - c.Assert(ok, IsTrue) + require.True(t, ok) expr := sel.Fields.Fields[0] vExpr := expr.Expr.(*test_driver.ValueExpr) - c.Assert(vExpr.Kind(), Equals, test_driver.KindInt64) + require.Equal(t, test_driver.KindInt64, vExpr.Kind()) src = "SELECT 9223372036854775808;" - st, err = parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil) + st, err = p.ParseOneStmt(src, "", "") + require.NoError(t, err) sel, ok = st.(*ast.SelectStmt) - c.Assert(ok, IsTrue) + require.True(t, ok) expr = sel.Fields.Fields[0] vExpr = expr.Expr.(*test_driver.ValueExpr) - c.Assert(vExpr.Kind(), Equals, test_driver.KindUint64) + require.Equal(t, test_driver.KindUint64, vExpr.Kind()) src = `select 99e+r10 from t1;` - st, err = parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil) + st, err = p.ParseOneStmt(src, "", "") + require.NoError(t, err) sel, ok = st.(*ast.SelectStmt) - c.Assert(ok, IsTrue) + require.True(t, ok) bExpr, ok := sel.Fields.Fields[0].Expr.(*ast.BinaryOperationExpr) - c.Assert(ok, IsTrue) - c.Assert(bExpr.Op, Equals, opcode.Plus) - c.Assert(bExpr.L.(*ast.ColumnNameExpr).Name.Name.O, Equals, "99e") - c.Assert(bExpr.R.(*ast.ColumnNameExpr).Name.Name.O, Equals, "r10") + require.True(t, ok) + require.Equal(t, opcode.Plus, bExpr.Op) + require.Equal(t, "99e", bExpr.L.(*ast.ColumnNameExpr).Name.Name.O) + require.Equal(t, "r10", bExpr.R.(*ast.ColumnNameExpr).Name.Name.O) src = `select t./*123*/*,@c3:=0 from t order by t.c1;` - st, err = parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil) + st, err = p.ParseOneStmt(src, "", "") + require.NoError(t, err) sel, ok = st.(*ast.SelectStmt) - c.Assert(ok, IsTrue) - c.Assert(sel.Fields.Fields[0].WildCard.Table.O, Equals, "t") + require.True(t, ok) + require.Equal(t, "t", sel.Fields.Fields[0].WildCard.Table.O) varExpr, ok := sel.Fields.Fields[1].Expr.(*ast.VariableExpr) - c.Assert(ok, IsTrue) - c.Assert(varExpr.Name, Equals, "c3") + require.True(t, ok) + require.Equal(t, "c3", varExpr.Name) src = `select t.1e from test.t;` - st, err = parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil) + st, err = p.ParseOneStmt(src, "", "") + require.NoError(t, err) sel, ok = st.(*ast.SelectStmt) - c.Assert(ok, IsTrue) + require.True(t, ok) colExpr, ok := sel.Fields.Fields[0].Expr.(*ast.ColumnNameExpr) - c.Assert(ok, IsTrue) - c.Assert(colExpr.Name.Table.O, Equals, "t") - c.Assert(colExpr.Name.Name.O, Equals, "1e") + require.True(t, ok) + require.Equal(t, "t", colExpr.Name.Table.O) + require.Equal(t, "1e", colExpr.Name.Name.O) tName := sel.From.TableRefs.Left.(*ast.TableSource).Source.(*ast.TableName) - c.Assert(tName.Schema.O, Equals, "test") - c.Assert(tName.Name.O, Equals, "t") + require.Equal(t, "test", tName.Schema.O) + require.Equal(t, "t", tName.Name.O) src = "select t. `a` > 10 from t;" - st, err = parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil) + st, err = p.ParseOneStmt(src, "", "") + require.NoError(t, err) bExpr, ok = st.(*ast.SelectStmt).Fields.Fields[0].Expr.(*ast.BinaryOperationExpr) - c.Assert(ok, IsTrue) - c.Assert(bExpr.Op, Equals, opcode.GT) - c.Assert(bExpr.L.(*ast.ColumnNameExpr).Name.Name.O, Equals, "a") - c.Assert(bExpr.L.(*ast.ColumnNameExpr).Name.Table.O, Equals, "t") - c.Assert(bExpr.R.(ast.ValueExpr).GetValue().(int64), Equals, int64(10)) + require.True(t, ok) + require.Equal(t, opcode.GT, bExpr.Op) + require.Equal(t, "a", bExpr.L.(*ast.ColumnNameExpr).Name.Name.O) + require.Equal(t, "t", bExpr.L.(*ast.ColumnNameExpr).Name.Table.O) + require.Equal(t, int64(10), bExpr.R.(ast.ValueExpr).GetValue().(int64)) - parser.SetSQLMode(mysql.ModeANSIQuotes) + p.SetSQLMode(mysql.ModeANSIQuotes) src = `select t."dot"=10 from t;` - st, err = parser.ParseOneStmt(src, "", "") - c.Assert(err, IsNil) + st, err = p.ParseOneStmt(src, "", "") + require.NoError(t, err) bExpr, ok = st.(*ast.SelectStmt).Fields.Fields[0].Expr.(*ast.BinaryOperationExpr) - c.Assert(ok, IsTrue) - c.Assert(bExpr.Op, Equals, opcode.EQ) - c.Assert(bExpr.L.(*ast.ColumnNameExpr).Name.Name.O, Equals, "dot") - c.Assert(bExpr.L.(*ast.ColumnNameExpr).Name.Table.O, Equals, "t") - c.Assert(bExpr.R.(ast.ValueExpr).GetValue().(int64), Equals, int64(10)) + require.True(t, ok) + require.Equal(t, opcode.EQ, bExpr.Op) + require.Equal(t, "dot", bExpr.L.(*ast.ColumnNameExpr).Name.Name.O) + require.Equal(t, "t", bExpr.L.(*ast.ColumnNameExpr).Name.Table.O) + require.Equal(t, int64(10), bExpr.R.(ast.ValueExpr).GetValue().(int64)) } -func (s *testParserSuite) TestSpecialComments(c *C) { - parser := parser.New() +func TestSpecialComments(t *testing.T) { + p := parser.New() // 1. Make sure /*! ... */ respects the same SQL mode. - _, err := parser.ParseOneStmt(`SELECT /*! '\' */;`, "", "") - c.Assert(err, NotNil) + _, err := p.ParseOneStmt(`SELECT /*! '\' */;`, "", "") + require.Error(t, err) - parser.SetSQLMode(mysql.ModeNoBackslashEscapes) - st, err := parser.ParseOneStmt(`SELECT /*! '\' */;`, "", "") - c.Assert(err, IsNil) - c.Assert(st, FitsTypeOf, &ast.SelectStmt{}) + p.SetSQLMode(mysql.ModeNoBackslashEscapes) + st, err := p.ParseOneStmt(`SELECT /*! '\' */;`, "", "") + require.NoError(t, err) + require.IsType(t, &ast.SelectStmt{}, st) // 2. Make sure multiple statements inside /*! ... */ will not crash // (this is issue #330) - stmts, _, err := parser.Parse("/*! SET x = 1; SELECT 2 */", "", "") - c.Assert(err, IsNil) - c.Assert(stmts, HasLen, 2) - c.Assert(stmts[0], FitsTypeOf, &ast.SetStmt{}) - c.Assert(stmts[0].Text(), Equals, "/*! SET x = 1;") - c.Assert(stmts[1], FitsTypeOf, &ast.SelectStmt{}) - c.Assert(stmts[1].Text(), Equals, " SELECT 2 */") + stmts, _, err := p.Parse("/*! SET x = 1; SELECT 2 */", "", "") + require.NoError(t, err) + require.Len(t, stmts, 2) + require.IsType(t, &ast.SetStmt{}, stmts[0]) + require.Equal(t, "/*! SET x = 1;", stmts[0].Text()) + require.IsType(t, &ast.SelectStmt{}, stmts[1]) + require.Equal(t, " SELECT 2 */", stmts[1].Text()) // ^ not sure if correct approach; having multiple statements in MySQL is a syntax error. // 3. Make sure invalid text won't cause infinite loop // (this is issue #336) - st, err = parser.ParseOneStmt("SELECT /*+ 😅 */ SLEEP(1);", "", "") - c.Assert(err, IsNil) + st, err = p.ParseOneStmt("SELECT /*+ 😅 */ SLEEP(1);", "", "") + require.NoError(t, err) sel, ok := st.(*ast.SelectStmt) - c.Assert(ok, IsTrue) - c.Assert(sel.TableHints, HasLen, 0) + require.True(t, ok) + require.Len(t, sel.TableHints, 0) } type testCase struct { @@ -363,114 +352,112 @@ type testErrMsgCase struct { err error } -func (s *testParserSuite) RunTest(c *C, table []testCase) { - parser := parser.New() - parser.EnableWindowFunc(s.enableWindowFunc) - for _, t := range table { - _, _, err := parser.Parse(t.src, "", "") - comment := Commentf("source %v", t.src) - if !t.ok { - c.Assert(err, NotNil, comment) +func RunTest(t *testing.T, table []testCase, enableWindowFunc bool) { + p := parser.New() + p.EnableWindowFunc(enableWindowFunc) + for _, tbl := range table { + _, _, err := p.Parse(tbl.src, "", "") + if !tbl.ok { + require.Errorf(t, err, "source %v", tbl.src) continue } - c.Assert(err, IsNil, comment) + require.NoErrorf(t, err, "source %v", tbl.src) // restore correctness test - if t.ok { - s.RunRestoreTest(c, t.src, t.restore) + if tbl.ok { + RunRestoreTest(t, tbl.src, tbl.restore, enableWindowFunc) } } } -func (s *testParserSuite) RunRestoreTest(c *C, sourceSQLs, expectSQLs string) { +func RunRestoreTest(t *testing.T, sourceSQLs, expectSQLs string, enableWindowFunc bool) { var sb strings.Builder - parser := parser.New() - parser.EnableWindowFunc(s.enableWindowFunc) - comment := Commentf("source %v", sourceSQLs) - stmts, _, err := parser.Parse(sourceSQLs, "", "") - c.Assert(err, IsNil, comment) + p := parser.New() + p.EnableWindowFunc(enableWindowFunc) + comment := fmt.Sprintf("source %v", sourceSQLs) + stmts, _, err := p.Parse(sourceSQLs, "", "") + require.NoErrorf(t, err, "source %v", sourceSQLs) restoreSQLs := "" for _, stmt := range stmts { sb.Reset() err = stmt.Restore(NewRestoreCtx(DefaultRestoreFlags, &sb)) - c.Assert(err, IsNil, comment) + require.NoError(t, err, comment) restoreSQL := sb.String() - comment = Commentf("source %v; restore %v", sourceSQLs, restoreSQL) - restoreStmt, err := parser.ParseOneStmt(restoreSQL, "", "") - c.Assert(err, IsNil, comment) + comment = fmt.Sprintf("source %v; restore %v", sourceSQLs, restoreSQL) + restoreStmt, err := p.ParseOneStmt(restoreSQL, "", "") + require.NoError(t, err, comment) CleanNodeText(stmt) CleanNodeText(restoreStmt) - c.Assert(restoreStmt, DeepEquals, stmt, comment) + require.Equal(t, stmt, restoreStmt, comment) if restoreSQLs != "" { restoreSQLs += "; " } restoreSQLs += restoreSQL + } - comment = Commentf("restore %v; expect %v", restoreSQLs, expectSQLs) - c.Assert(restoreSQLs, Equals, expectSQLs, comment) + require.Equalf(t, expectSQLs, restoreSQLs, "restore %v; expect %v", restoreSQLs, expectSQLs) } -func (s *testParserSuite) RunTestInRealAsFloatMode(c *C, table []testCase) { - parser := parser.New() - parser.EnableWindowFunc(s.enableWindowFunc) - parser.SetSQLMode(mysql.ModeRealAsFloat) - for _, t := range table { - _, _, err := parser.Parse(t.src, "", "") - comment := Commentf("source %v", t.src) - if !t.ok { - c.Assert(err, NotNil, comment) +func RunTestInRealAsFloatMode(t *testing.T, table []testCase, enableWindowFunc bool) { + p := parser.New() + p.EnableWindowFunc(enableWindowFunc) + p.SetSQLMode(mysql.ModeRealAsFloat) + for _, tbl := range table { + _, _, err := p.Parse(tbl.src, "", "") + comment := fmt.Sprintf("source %v", tbl.src) + if !tbl.ok { + require.Error(t, err, comment) continue } - c.Assert(err, IsNil, comment) + require.NoError(t, err, comment) // restore correctness test - if t.ok { - s.RunRestoreTestInRealAsFloatMode(c, t.src, t.restore) + if tbl.ok { + RunRestoreTestInRealAsFloatMode(t, tbl.src, tbl.restore, enableWindowFunc) } } } -func (s *testParserSuite) RunRestoreTestInRealAsFloatMode(c *C, sourceSQLs, expectSQLs string) { +func RunRestoreTestInRealAsFloatMode(t *testing.T, sourceSQLs, expectSQLs string, enableWindowFunc bool) { var sb strings.Builder - parser := parser.New() - parser.EnableWindowFunc(s.enableWindowFunc) - parser.SetSQLMode(mysql.ModeRealAsFloat) - comment := Commentf("source %v", sourceSQLs) - stmts, _, err := parser.Parse(sourceSQLs, "", "") - c.Assert(err, IsNil, comment) + p := parser.New() + p.EnableWindowFunc(enableWindowFunc) + p.SetSQLMode(mysql.ModeRealAsFloat) + comment := fmt.Sprintf("source %v", sourceSQLs) + stmts, _, err := p.Parse(sourceSQLs, "", "") + require.NoError(t, err, comment) restoreSQLs := "" for _, stmt := range stmts { sb.Reset() err = stmt.Restore(NewRestoreCtx(DefaultRestoreFlags, &sb)) - c.Assert(err, IsNil, comment) + require.NoError(t, err, comment) restoreSQL := sb.String() - comment = Commentf("source %v; restore %v", sourceSQLs, restoreSQL) - restoreStmt, err := parser.ParseOneStmt(restoreSQL, "", "") - c.Assert(err, IsNil, comment) + comment = fmt.Sprintf("source %v; restore %v", sourceSQLs, restoreSQL) + restoreStmt, err := p.ParseOneStmt(restoreSQL, "", "") + require.NoError(t, err, comment) CleanNodeText(stmt) CleanNodeText(restoreStmt) - c.Assert(restoreStmt, DeepEquals, stmt, comment) + require.Equal(t, stmt, restoreStmt, comment) if restoreSQLs != "" { restoreSQLs += "; " } restoreSQLs += restoreSQL } - comment = Commentf("restore %v; expect %v", restoreSQLs, expectSQLs) - c.Assert(restoreSQLs, Equals, expectSQLs, comment) + require.Equal(t, expectSQLs, restoreSQLs, "restore %v; expect %v", restoreSQLs, expectSQLs) } -func (s *testParserSuite) RunErrMsgTest(c *C, table []testErrMsgCase) { - parser := 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) +func RunErrMsgTest(t *testing.T, table []testErrMsgCase) { + p := parser.New() + for _, tbl := range table { + _, _, err := p.Parse(tbl.src, "", "") + comment := fmt.Sprintf("source %v", tbl.src) + if tbl.err != nil { + require.True(t, terror.ErrorEqual(err, tbl.err), comment) } else { - c.Assert(err, IsNil, comment) + require.NoError(t, err, comment) } } } -func (s *testParserSuite) TestDMLStmt(c *C) { +func TestDMLStmt(t *testing.T) { table := []testCase{ {"", true, ""}, {";", true, ""}, @@ -1035,10 +1022,10 @@ AAAAAAAAAAAA5gm5Mg== {"SHOW PLACEMENT LABELS LIKE '%zone%'", true, "SHOW PLACEMENT LABELS LIKE _UTF8MB4'%zone%'"}, {"SHOW PLACEMENT LABELS WHERE label='l123'", true, "SHOW PLACEMENT LABELS WHERE `label`=_UTF8MB4'l123'"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestDBAStmt(c *C) { +func TestDBAStmt(t *testing.T) { table := []testCase{ // for SHOW statement {"SHOW VARIABLES LIKE 'character_set_results'", true, "SHOW SESSION VARIABLES LIKE _UTF8MB4'character_set_results'"}, @@ -1133,6 +1120,8 @@ func (s *testParserSuite) TestDBAStmt(c *C) { // for show stats_topn. {"show stats_topn", true, "SHOW STATS_TOPN"}, {"show stats_topn where table_name = 't'", true, "SHOW STATS_TOPN WHERE `table_name`=_UTF8MB4't'"}, + // for show histograms_in_flight. + {"show histograms_in_flight", true, "SHOW HISTOGRAMS_IN_FLIGHT"}, // for show column_stats_usage. {"show column_stats_usage", true, "SHOW COLUMN_STATS_USAGE"}, {"show column_stats_usage where table_name = 't'", true, "SHOW COLUMN_STATS_USAGE WHERE `table_name`=_UTF8MB4't'"}, @@ -1286,10 +1275,10 @@ func (s *testParserSuite) TestDBAStmt(c *C) { {"call `x`.`y`();", true, "CALL `x`.`y`()"}, {"call `x`.`y`('p', 'q', 'r');", true, "CALL `x`.`y`(_UTF8MB4'p', _UTF8MB4'q', _UTF8MB4'r')"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestSetVariable(c *C) { +func TestSetVariable(t *testing.T) { table := []struct { Input string Name string @@ -1301,56 +1290,58 @@ func (s *testParserSuite) TestSetVariable(c *C) { {"set xx.xx = 666", "xx.xx", false, true}, // Set session system variable xx.xx {"set session xx.xx = 666", "xx.xx", false, true}, + {"set local xx.xx = 666", "xx.xx", false, true}, {"set global xx.xx = 666", "xx.xx", true, true}, {"set @@xx.xx = 666", "xx.xx", false, true}, {"set @@session.xx.xx = 666", "xx.xx", false, true}, + {"set @@local.xx.xx = 666", "xx.xx", false, true}, {"set @@global.xx.xx = 666", "xx.xx", true, true}, // Set user defined variable xx.xx {"set @xx.xx = 666", "xx.xx", false, false}, } - parser := parser.New() - for _, t := range table { - stmt, err := parser.ParseOneStmt(t.Input, "", "") - c.Assert(err, IsNil) + p := parser.New() + for _, tbl := range table { + stmt, err := p.ParseOneStmt(tbl.Input, "", "") + require.NoError(t, err) setStmt, ok := stmt.(*ast.SetStmt) - c.Assert(ok, IsTrue) - c.Assert(setStmt.Variables, HasLen, 1) + require.True(t, ok) + require.Len(t, setStmt.Variables, 1) v := setStmt.Variables[0] - c.Assert(v.Name, Equals, t.Name) - c.Assert(v.IsGlobal, Equals, t.IsGlobal) - c.Assert(v.IsSystem, Equals, t.IsSystem) + require.Equal(t, tbl.Name, v.Name) + require.Equal(t, tbl.IsGlobal, v.IsGlobal) + require.Equal(t, tbl.IsSystem, v.IsSystem) } - _, err := parser.ParseOneStmt("set xx.xx.xx = 666", "", "") - c.Assert(err, NotNil) + _, err := p.ParseOneStmt("set xx.xx.xx = 666", "", "") + require.Error(t, err) } -func (s *testParserSuite) TestFlushTable(c *C) { - parser := parser.New() - stmt, _, err := parser.Parse("flush local tables tbl1,tbl2 with read lock", "", "") - c.Assert(err, IsNil) +func TestFlushTable(t *testing.T) { + p := parser.New() + stmt, _, err := p.Parse("flush local tables tbl1,tbl2 with read lock", "", "") + require.NoError(t, err) 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) + require.Equal(t, ast.FlushTables, flushTable.Tp) + require.Equal(t, "tbl1", flushTable.Tables[0].Name.L) + require.Equal(t, "tbl2", flushTable.Tables[1].Name.L) + require.True(t, flushTable.NoWriteToBinLog) + require.True(t, flushTable.ReadLock) } -func (s *testParserSuite) TestFlushPrivileges(c *C) { - parser := parser.New() - stmt, _, err := parser.Parse("flush privileges", "", "") - c.Assert(err, IsNil) +func TestFlushPrivileges(t *testing.T) { + p := parser.New() + stmt, _, err := p.Parse("flush privileges", "", "") + require.NoError(t, err) flushPrivilege := stmt[0].(*ast.FlushStmt) - c.Assert(flushPrivilege.Tp, Equals, ast.FlushPrivileges) + require.Equal(t, ast.FlushPrivileges, flushPrivilege.Tp) } -func (s *testParserSuite) TestExpression(c *C) { +func TestExpression(t *testing.T) { table := []testCase{ // sign expression {"SELECT ++1", true, "SELECT ++1"}, @@ -1402,10 +1393,11 @@ func (s *testParserSuite) TestExpression(c *C) { {"select * from t where a > {ts123 '1989-09-10 11:11:11'}", true, "SELECT * FROM `t` WHERE `a`>_UTF8MB4'1989-09-10 11:11:11'"}, {"select .t.a from t", false, ""}, } - s.RunTest(c, table) + + RunTest(t, table, false) } -func (s *testParserSuite) TestBuiltin(c *C) { +func TestBuiltin(t *testing.T) { table := []testCase{ // for builtin functions {"SELECT POW(1, 2)", true, "SELECT POW(1, 2)"}, @@ -1486,6 +1478,8 @@ func (s *testParserSuite) TestBuiltin(c *C) { {"SELECT LEAST(), LEAST(1, 2, 3);", true, "SELECT LEAST(),LEAST(1, 2, 3)"}, {"SELECT INTERVAL(1, 0, 1, 2)", true, "SELECT INTERVAL(1, 0, 1, 2)"}, + {"SELECT (INTERVAL(1, 0, 1, 2)+5)*7+INTERVAL(1, 0, 1, 2)/2", true, "SELECT (INTERVAL(1, 0, 1, 2)+5)*7+INTERVAL(1, 0, 1, 2)/2"}, + {"SELECT INTERVAL(0, (1*5)/2)+INTERVAL(5, 4, 3)", true, "SELECT INTERVAL(0, (1*5)/2)+INTERVAL(5, 4, 3)"}, {"SELECT DATE_ADD('2008-01-02', INTERVAL INTERVAL(1, 0, 1) DAY);", true, "SELECT DATE_ADD(_UTF8MB4'2008-01-02', INTERVAL INTERVAL(1, 0, 1) DAY)"}, // information functions @@ -2121,7 +2115,7 @@ func (s *testParserSuite) TestBuiltin(c *C) { {"select next value for sequence", true, "SELECT NEXTVAL(`sequence`)"}, {"select NeXt vAluE for seQuEncE2", true, "SELECT NEXTVAL(`seQuEncE2`)"}, } - s.RunTest(c, table) + RunTest(t, table, false) // Test in REAL_AS_FLOAT SQL mode. table2 := []testCase{ @@ -2136,10 +2130,10 @@ func (s *testParserSuite) TestBuiltin(c *C) { // for cast as real {"select cast(1 as real);", true, "SELECT CAST(1 AS FLOAT)"}, } - s.RunTestInRealAsFloatMode(c, table2) + RunTestInRealAsFloatMode(t, table2, false) } -func (s *testParserSuite) TestIdentifier(c *C) { +func TestIdentifier(t *testing.T) { table := []testCase{ // for quote identifier {"select `a`, `a.b`, `a b` from t", true, "SELECT `a`,`a.b`,`a b` FROM `t`"}, @@ -2191,10 +2185,10 @@ func (s *testParserSuite) TestIdentifier(c *C) { {"select .78`123`", true, "SELECT 0.78 AS `123`"}, {`select .78"123"`, true, "SELECT 0.78 AS `123`"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestDDL(c *C) { +func TestDDL(t *testing.T) { table := []testCase{ {"CREATE", false, ""}, {"CREATE TABLE", false, ""}, @@ -2909,26 +2903,6 @@ func (s *testParserSuite) TestDDL(c *C) { {"alter table t reorganize partition remove partition;", false, ""}, {"alter table t reorganize partition no_write_to_binlog remove into (partition p0 VALUES LESS THAN (1991));", true, "ALTER TABLE `t` REORGANIZE PARTITION NO_WRITE_TO_BINLOG `remove` INTO (PARTITION `p0` VALUES LESS THAN (1991))"}, - // alter placement rules - {"ALTER TABLE t ALTER PARTITION p ADD PLACEMENT POLICY CONSTRAINTS='str' ROLE=LEADER REPLICAS=1", true, "ALTER TABLE `t` ALTER PARTITION `p` ADD PLACEMENT POLICY CONSTRAINTS='str' ROLE=LEADER REPLICAS=1"}, - {"ALTER TABLE t ALTER PARTITION p ADD PLACEMENT POLICY CONSTRAINTS='str,str2' ROLE=LEADER REPLICAS=1", true, "ALTER TABLE `t` ALTER PARTITION `p` ADD PLACEMENT POLICY CONSTRAINTS='str,str2' ROLE=LEADER REPLICAS=1"}, - {"ALTER TABLE t ALTER PARTITION p ADD PLACEMENT POLICY CONSTRAINTS='str' ROLE=FOLLOWER REPLICAS=1", true, "ALTER TABLE `t` ALTER PARTITION `p` ADD PLACEMENT POLICY CONSTRAINTS='str' ROLE=FOLLOWER REPLICAS=1"}, - {"ALTER TABLE t ALTER PARTITION p ADD PLACEMENT POLICY ROLE=LEARNER CONSTRAINTS='str' REPLICAS=1", true, "ALTER TABLE `t` ALTER PARTITION `p` ADD PLACEMENT POLICY CONSTRAINTS='str' ROLE=LEARNER REPLICAS=1"}, - {"ALTER TABLE t ALTER PARTITION p ADD PLACEMENT POLICY REPLICAS=1 CONSTRAINTS='str' ROLE=VOTER", true, "ALTER TABLE `t` ALTER PARTITION `p` ADD PLACEMENT POLICY CONSTRAINTS='str' ROLE=VOTER REPLICAS=1"}, - {"ALTER TABLE t ALTER PARTITION p ADD PLACEMENT POLICY CONSTRAINTS='str1' ROLE=leader REPLICAS=1, ADD PLACEMENT POLICY CONSTRAINTS='str2' ROLE=leader REPLICAS=1", true, "ALTER TABLE `t` ALTER PARTITION `p` ADD PLACEMENT POLICY CONSTRAINTS='str1' ROLE=LEADER REPLICAS=1, ADD PLACEMENT POLICY CONSTRAINTS='str2' ROLE=LEADER REPLICAS=1"}, - {"ALTER TABLE t ALTER PARTITION p ADD PLACEMENT POLICY CONSTRAINTS= ROLE=follower REPLICAS=1;", false, ""}, - {"ALTER TABLE t ALTER PARTITION p ADD PLACEMENT POLICY CONSTRAINTS='str' ROLE=follower REPLICAS=0;", false, ""}, - {"ALTER TABLE t ALTER PARTITION p ADD PLACEMENT POLICY CONSTRAINTS='str' ROLE=follower REPLICAS=1 REPLICAS=2;", false, ""}, - {"ALTER TABLE t ALTER PARTITION p ADD PLACEMENT POLICY CONSTRAINTS='str' ROLE=follower REPLICAS=1 ROLE=voter;", false, ""}, - {"ALTER TABLE t ALTER PARTITION p ADD PLACEMENT POLICY CONSTRAINTS='str' ROLE=follower REPLICAS=1 CONSTRAINTS='ttt';", false, ""}, - {"ALTER TABLE t ALTER PARTITION p", false, ""}, - {"ALTER TABLE t ALTER PARTITION p ALTER PLACEMENT POLICY CONSTRAINTS='str' ROLE=LEADER REPLICAS=1", true, "ALTER TABLE `t` ALTER PARTITION `p` ALTER PLACEMENT POLICY CONSTRAINTS='str' ROLE=LEADER REPLICAS=1"}, - {"ALTER TABLE t ALTER PARTITION p DROP PLACEMENT POLICY", false, ""}, - {"ALTER TABLE t ALTER PARTITION p DROP PLACEMENT POLICY ROLE=voter", true, "ALTER TABLE `t` ALTER PARTITION `p` DROP PLACEMENT POLICY ROLE=VOTER"}, - {"ALTER TABLE t ADD PLACEMENT POLICY CONSTRAINTS='str' ROLE=leader REPLICAS=1", true, "ALTER TABLE `t` ADD PLACEMENT POLICY CONSTRAINTS='str' ROLE=LEADER REPLICAS=1"}, - {"ALTER TABLE t ALTER PLACEMENT POLICY CONSTRAINTS='str' ROLE=leader REPLICAS=1", true, "ALTER TABLE `t` ALTER PLACEMENT POLICY CONSTRAINTS='str' ROLE=LEADER REPLICAS=1"}, - {"ALTER TABLE t ADD PLACEMENT POLICY CONSTRAINTS='str1' ROLE=leader REPLICAS=1, ADD PLACEMENT POLICY CONSTRAINTS='str2' ROLE=leader REPLICAS=1", true, "ALTER TABLE `t` ADD PLACEMENT POLICY CONSTRAINTS='str1' ROLE=LEADER REPLICAS=1, ADD PLACEMENT POLICY CONSTRAINTS='str2' ROLE=LEADER REPLICAS=1"}, - // alter attributes {"ALTER TABLE t ATTRIBUTES='str'", true, "ALTER TABLE `t` ATTRIBUTES='str'"}, {"ALTER TABLE t ATTRIBUTES='str1,str2'", true, "ALTER TABLE `t` ATTRIBUTES='str1,str2'"}, @@ -3413,6 +3387,7 @@ func (s *testParserSuite) TestDDL(c *C) { {"create placement policy x primary_region='cn' regions='us' schedule='even'", true, "CREATE PLACEMENT POLICY `x` PRIMARY_REGION = 'cn' REGIONS = 'us' SCHEDULE = 'even'"}, {"create placement policy x primary_region='cn', leader_constraints='ww', leader_constraints='yy'", true, "CREATE PLACEMENT POLICY `x` PRIMARY_REGION = 'cn' LEADER_CONSTRAINTS = 'ww' LEADER_CONSTRAINTS = 'yy'"}, {"create placement policy if not exists x regions = 'us', follower_constraints='yy'", true, "CREATE PLACEMENT POLICY IF NOT EXISTS `x` REGIONS = 'us' FOLLOWER_CONSTRAINTS = 'yy'"}, + {"create or replace placement policy x regions='us'", true, "CREATE OR REPLACE PLACEMENT POLICY `x` REGIONS = 'us'"}, {"create placement policy x placement policy y", false, ""}, {"alter placement policy x primary_region='us'", true, "ALTER PLACEMENT POLICY `x` PRIMARY_REGION = 'us'"}, @@ -3430,389 +3405,417 @@ func (s *testParserSuite) TestDDL(c *C) { {"alter placement policy x primary_region='cn', leader_constraints='ww', leader_constraints='yy'", true, "ALTER PLACEMENT POLICY `x` PRIMARY_REGION = 'cn' LEADER_CONSTRAINTS = 'ww' LEADER_CONSTRAINTS = 'yy'"}, {"alter placement policy if exists x regions = 'us', follower_constraints='yy'", true, "ALTER PLACEMENT POLICY IF EXISTS `x` REGIONS = 'us' FOLLOWER_CONSTRAINTS = 'yy'"}, {"alter placement policy x placement policy y", false, ""}, + + // for table stats options + // 1. create table with options + {"CREATE TABLE t (a int) STATS_BUCKETS=1", true, "CREATE TABLE `t` (`a` INT) STATS_BUCKETS = 1"}, + {"CREATE TABLE t (a int) STATS_BUCKETS='abc'", false, ""}, + {"CREATE TABLE t (a int) STATS_BUCKETS=", false, ""}, + {"CREATE TABLE t (a int) STATS_TOPN=1", true, "CREATE TABLE `t` (`a` INT) STATS_TOPN = 1"}, + {"CREATE TABLE t (a int) STATS_TOPN='abc'", false, ""}, + {"CREATE TABLE t (a int) STATS_AUTO_RECALC=1", true, "CREATE TABLE `t` (`a` INT) STATS_AUTO_RECALC = 1"}, + {"CREATE TABLE t (a int) STATS_AUTO_RECALC='abc'", false, ""}, + {"CREATE TABLE t(a int) STATS_SAMPLE_RATE=0.1", true, "CREATE TABLE `t` (`a` INT) STATS_SAMPLE_RATE = 0.1"}, + {"CREATE TABLE t (a int) STATS_SAMPLE_RATE='abc'", false, ""}, + {"CREATE TABLE t (a int) STATS_COL_CHOICE='all'", true, "CREATE TABLE `t` (`a` INT) STATS_COL_CHOICE = 'all'"}, + {"CREATE TABLE t (a int) STATS_COL_CHOICE='list'", true, "CREATE TABLE `t` (`a` INT) STATS_COL_CHOICE = 'list'"}, + {"CREATE TABLE t (a int) STATS_COL_CHOICE=1", false, ""}, + {"CREATE TABLE t (a int, b int) STATS_COL_LIST='a,b'", true, "CREATE TABLE `t` (`a` INT,`b` INT) STATS_COL_LIST = 'a,b'"}, + {"CREATE TABLE t (a int, b int) STATS_COL_LIST=1", false, ""}, + {"CREATE TABLE t (a int) STATS_BUCKETS=1,STATS_TOPN=1", true, "CREATE TABLE `t` (`a` INT) STATS_BUCKETS = 1 STATS_TOPN = 1"}, + // 2. create partition table with options + {"CREATE TABLE t (a int) STATS_BUCKETS=1,STATS_TOPN=1 PARTITION BY RANGE (a) (PARTITION p1 VALUES LESS THAN (200))", true, "CREATE TABLE `t` (`a` INT) STATS_BUCKETS = 1 STATS_TOPN = 1 PARTITION BY RANGE (`a`) (PARTITION `p1` VALUES LESS THAN (200))"}, + // 3. alter table with options + {"ALTER TABLE t STATS_OPTIONS='str'", true, "ALTER TABLE `t` STATS_OPTIONS='str'"}, + {"ALTER TABLE t STATS_OPTIONS='str1,str2'", true, "ALTER TABLE `t` STATS_OPTIONS='str1,str2'"}, + {"ALTER TABLE t STATS_OPTIONS=\"str1,str2\"", true, "ALTER TABLE `t` STATS_OPTIONS='str1,str2'"}, + {"ALTER TABLE t STATS_OPTIONS 'str1,str2'", true, "ALTER TABLE `t` STATS_OPTIONS='str1,str2'"}, + {"ALTER TABLE t STATS_OPTIONS \"str1,str2\"", true, "ALTER TABLE `t` STATS_OPTIONS='str1,str2'"}, + {"ALTER TABLE t STATS_OPTIONS=DEFAULT", true, "ALTER TABLE `t` STATS_OPTIONS=DEFAULT"}, + {"ALTER TABLE t STATS_OPTIONS=default", true, "ALTER TABLE `t` STATS_OPTIONS=DEFAULT"}, + {"ALTER TABLE t STATS_OPTIONS=DeFaUlT", true, "ALTER TABLE `t` STATS_OPTIONS=DEFAULT"}, + {"ALTER TABLE t STATS_OPTIONS", false, ""}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestHintError(c *C) { - parser := parser.New() - stmt, warns, err := parser.Parse("select /*+ tidb_unknown(T1,t2) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") - c.Assert(err, IsNil) - c.Assert(len(warns), Equals, 1) - c.Assert(warns[0], ErrorMatches, `.*Optimizer hint syntax error at line 1 column 23 near "tidb_unknown\(T1,t2\) \*/" `) - c.Assert(len(stmt[0].(*ast.SelectStmt).TableHints), Equals, 0) - stmt, warns, err = parser.Parse("select /*+ TIDB_INLJ(t1, T2) tidb_unknow(T1,t2, 1) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") - c.Assert(len(stmt[0].(*ast.SelectStmt).TableHints), Equals, 0) - c.Assert(err, IsNil) - c.Assert(len(warns), Equals, 1) - c.Assert(warns[0], ErrorMatches, `.*Optimizer hint syntax error at line 1 column 40 near "tidb_unknow\(T1,t2, 1\) \*/" `) - _, _, err = parser.Parse("select c1, c2 from /*+ tidb_unknow(T1,t2) */ t1, t2 where t1.c1 = t2.c1", "", "") - c.Assert(err, IsNil) // Hints are ignored after the "FROM" keyword! - _, _, err = parser.Parse("select1 /*+ TIDB_INLJ(t1, T2) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "line 1 column 7 near \"select1 /*+ TIDB_INLJ(t1, T2) */ c1, c2 from t1, t2 where t1.c1 = t2.c1\" ") - _, _, err = parser.Parse("select /*+ TIDB_INLJ(t1, T2) */ c1, c2 fromt t1, t2 where t1.c1 = t2.c1", "", "") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "line 1 column 47 near \"t1, t2 where t1.c1 = t2.c1\" ") - _, _, err = parser.Parse("SELECT 1 FROM DUAL WHERE 1 IN (SELECT /*+ DEBUG_HINT3 */ 1)", "", "") - c.Assert(err, IsNil) - stmt, _, err = parser.Parse("insert into t select /*+ memory_quota(1 MB) */ * from t;", "", "") - c.Assert(err, IsNil) - c.Assert(len(stmt[0].(*ast.InsertStmt).TableHints), Equals, 0) - c.Assert(len(stmt[0].(*ast.InsertStmt).Select.(*ast.SelectStmt).TableHints), Equals, 1) - stmt, _, err = parser.Parse("insert /*+ memory_quota(1 MB) */ into t select * from t;", "", "") - c.Assert(err, IsNil) - c.Assert(len(stmt[0].(*ast.InsertStmt).TableHints), Equals, 1) - - _, warns, err = parser.Parse("SELECT id FROM tbl WHERE id = 0 FOR UPDATE /*+ xyz */", "", "") - c.Assert(err, IsNil) - c.Assert(len(warns), Equals, 1) - c.Assert(warns[0], ErrorMatches, `.*near '/\*\+' at line 1`) - - _, warns, err = parser.Parse("create global binding for select /*+ max_execution_time(1) */ 1 using select /*+ max_execution_time(1) */ 1;\n", "", "") - c.Assert(err, IsNil) - c.Assert(len(warns), Equals, 0) +func TestHintError(t *testing.T) { + p := parser.New() + stmt, warns, err := p.Parse("select /*+ tidb_unknown(T1,t2) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) + require.Len(t, warns, 1) + require.Regexp(t, `Optimizer hint syntax error at line 1 column 23 near "tidb_unknown\(T1,t2\) \*/" $`, warns[0].Error()) + require.Len(t, stmt[0].(*ast.SelectStmt).TableHints, 0) + stmt, warns, err = p.Parse("select /*+ TIDB_INLJ(t1, T2) tidb_unknow(T1,t2, 1) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.Len(t, stmt[0].(*ast.SelectStmt).TableHints, 0) + require.NoError(t, err) + require.Len(t, warns, 1) + require.Regexp(t, `Optimizer hint syntax error at line 1 column 40 near "tidb_unknow\(T1,t2, 1\) \*/" $`, warns[0].Error()) + _, _, err = p.Parse("select c1, c2 from /*+ tidb_unknow(T1,t2) */ t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) // Hints are ignored after the "FROM" keyword! + _, _, err = p.Parse("select1 /*+ TIDB_INLJ(t1, T2) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.EqualError(t, err, "line 1 column 7 near \"select1 /*+ TIDB_INLJ(t1, T2) */ c1, c2 from t1, t2 where t1.c1 = t2.c1\" ") + _, _, err = p.Parse("select /*+ TIDB_INLJ(t1, T2) */ c1, c2 fromt t1, t2 where t1.c1 = t2.c1", "", "") + require.EqualError(t, err, "line 1 column 47 near \"t1, t2 where t1.c1 = t2.c1\" ") + _, _, err = p.Parse("SELECT 1 FROM DUAL WHERE 1 IN (SELECT /*+ DEBUG_HINT3 */ 1)", "", "") + require.NoError(t, err) + stmt, _, err = p.Parse("insert into t select /*+ memory_quota(1 MB) */ * from t;", "", "") + require.NoError(t, err) + require.Len(t, stmt[0].(*ast.InsertStmt).TableHints, 0) + require.Len(t, stmt[0].(*ast.InsertStmt).Select.(*ast.SelectStmt).TableHints, 1) + stmt, _, err = p.Parse("insert /*+ memory_quota(1 MB) */ into t select * from t;", "", "") + require.NoError(t, err) + require.Len(t, stmt[0].(*ast.InsertStmt).TableHints, 1) + + _, warns, err = p.Parse("SELECT id FROM tbl WHERE id = 0 FOR UPDATE /*+ xyz */", "", "") + require.NoError(t, err) + require.Len(t, warns, 1) + require.Regexp(t, `near '/\*\+' at line 1$`, warns[0].Error()) + + _, warns, err = p.Parse("create global binding for select /*+ max_execution_time(1) */ 1 using select /*+ max_execution_time(1) */ 1;\n", "", "") + require.NoError(t, err) + require.Len(t, warns, 0) } -func (s *testParserSuite) TestErrorMsg(c *C) { - parser := parser.New() - _, _, err := parser.Parse("select1 1", "", "") - c.Assert(err.Error(), Equals, "line 1 column 7 near \"select1 1\" ") - _, _, err = parser.Parse("select 1 from1 dual", "", "") - c.Assert(err.Error(), Equals, "line 1 column 19 near \"dual\" ") - _, _, err = parser.Parse("select * from t1 join t2 from t1.a = t2.a;", "", "") - c.Assert(err.Error(), Equals, "line 1 column 29 near \"from t1.a = t2.a;\" ") - _, _, err = parser.Parse("select * from t1 join t2 one t1.a = t2.a;", "", "") - c.Assert(err.Error(), Equals, "line 1 column 31 near \"t1.a = t2.a;\" ") - _, _, err = parser.Parse("select * from t1 join t2 on t1.a >>> t2.a;", "", "") - c.Assert(err.Error(), Equals, "line 1 column 36 near \"> t2.a;\" ") +func TestErrorMsg(t *testing.T) { + p := parser.New() + _, _, err := p.Parse("select1 1", "", "") + require.EqualError(t, err, "line 1 column 7 near \"select1 1\" ") + _, _, err = p.Parse("select 1 from1 dual", "", "") + require.EqualError(t, err, "line 1 column 19 near \"dual\" ") + _, _, err = p.Parse("select * from t1 join t2 from t1.a = t2.a;", "", "") + require.EqualError(t, err, "line 1 column 29 near \"from t1.a = t2.a;\" ") + _, _, err = p.Parse("select * from t1 join t2 one t1.a = t2.a;", "", "") + require.EqualError(t, err, "line 1 column 31 near \"t1.a = t2.a;\" ") + _, _, err = p.Parse("select * from t1 join t2 on t1.a >>> t2.a;", "", "") + require.EqualError(t, err, "line 1 column 36 near \"> t2.a;\" ") - _, _, err = parser.Parse("create table t(f_year year(5))ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;", "", "") - c.Assert(err.Error(), Equals, "[parser:1818]Supports only YEAR or YEAR(4) column") + _, _, err = p.Parse("create table t(f_year year(5))ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;", "", "") + require.EqualError(t, err, "[parser:1818]Supports only YEAR or YEAR(4) column") - _, _, err = parser.Parse("select ifnull(a,0) & ifnull(a,0) like '55' ESCAPE '\\\\a' from t;", "", "") - c.Assert(err.Error(), Equals, "[parser:1210]Incorrect arguments to ESCAPE") + _, _, err = p.Parse("select ifnull(a,0) & ifnull(a,0) like '55' ESCAPE '\\\\a' from t;", "", "") + require.EqualError(t, err, "[parser:1210]Incorrect arguments to ESCAPE") - _, _, err = parser.Parse("load data infile 'aaa' into table aaa FIELDS Enclosed by '\\\\b';", "", "") - c.Assert(err.Error(), Equals, "[parser:1083]Field separator argument is not what is expected; check the manual") + _, _, err = p.Parse("load data infile 'aaa' into table aaa FIELDS Enclosed by '\\\\b';", "", "") + require.EqualError(t, err, "[parser:1083]Field separator argument is not what is expected; check the manual") - _, _, err = parser.Parse("load data infile 'aaa' into table aaa FIELDS Escaped by '\\\\b';", "", "") - c.Assert(err.Error(), Equals, "[parser:1083]Field separator argument is not what is expected; check the manual") + _, _, err = p.Parse("load data infile 'aaa' into table aaa FIELDS Escaped by '\\\\b';", "", "") + require.EqualError(t, err, "[parser:1083]Field separator argument is not what is expected; check the manual") - _, _, err = parser.Parse("load data infile 'aaa' into table aaa FIELDS Enclosed by '\\\\b' Escaped by '\\\\b' ;", "", "") - c.Assert(err.Error(), Equals, "[parser:1083]Field separator argument is not what is expected; check the manual") + _, _, err = p.Parse("load data infile 'aaa' into table aaa FIELDS Enclosed by '\\\\b' Escaped by '\\\\b' ;", "", "") + require.EqualError(t, err, "[parser:1083]Field separator argument is not what is expected; check the manual") - _, _, err = parser.Parse("ALTER DATABASE `` CHARACTER SET = ''", "", "") - c.Assert(err.Error(), Equals, "[parser:1115]Unknown character set: ''") + _, _, err = p.Parse("ALTER DATABASE `` CHARACTER SET = ''", "", "") + require.EqualError(t, err, "[parser:1115]Unknown character set: ''") - _, _, err = parser.Parse("ALTER DATABASE t CHARACTER SET = ''", "", "") - c.Assert(err.Error(), Equals, "[parser:1115]Unknown character set: ''") + _, _, err = p.Parse("ALTER DATABASE t CHARACTER SET = ''", "", "") + require.EqualError(t, err, "[parser:1115]Unknown character set: ''") - _, _, err = parser.Parse("ALTER SCHEMA t CHARACTER SET = 'SOME_INVALID_CHARSET'", "", "") - c.Assert(err.Error(), Equals, "[parser:1115]Unknown character set: 'SOME_INVALID_CHARSET'") + _, _, err = p.Parse("ALTER SCHEMA t CHARACTER SET = 'SOME_INVALID_CHARSET'", "", "") + require.EqualError(t, err, "[parser:1115]Unknown character set: 'SOME_INVALID_CHARSET'") - _, _, err = parser.Parse("ALTER DATABASE t COLLATE = ''", "", "") - c.Assert(err.Error(), Equals, "[ddl:1273]Unknown collation: ''") + _, _, err = p.Parse("ALTER DATABASE t COLLATE = ''", "", "") + require.EqualError(t, err, "[ddl:1273]Unknown collation: ''") - _, _, err = parser.Parse("ALTER SCHEMA t COLLATE = 'SOME_INVALID_COLLATION'", "", "") - c.Assert(err.Error(), Equals, "[ddl:1273]Unknown collation: 'SOME_INVALID_COLLATION'") + _, _, err = p.Parse("ALTER SCHEMA t COLLATE = 'SOME_INVALID_COLLATION'", "", "") + require.EqualError(t, err, "[ddl:1273]Unknown collation: 'SOME_INVALID_COLLATION'") - _, _, err = parser.Parse("ALTER DATABASE CHARSET = 'utf8mb4' COLLATE = 'utf8_bin'", "", "") - c.Assert(err.Error(), Equals, "line 1 column 24 near \"= 'utf8mb4' COLLATE = 'utf8_bin'\" ") + _, _, err = p.Parse("ALTER DATABASE CHARSET = 'utf8mb4' COLLATE = 'utf8_bin'", "", "") + require.EqualError(t, err, "line 1 column 24 near \"= 'utf8mb4' COLLATE = 'utf8_bin'\" ") - _, _, err = parser.Parse("ALTER DATABASE t ENCRYPTION = ''", "", "") - c.Assert(err.Error(), Equals, "[parser:1525]Incorrect argument (should be Y or N) value: ''") + _, _, err = p.Parse("ALTER DATABASE t ENCRYPTION = ''", "", "") + require.EqualError(t, err, "[parser:1525]Incorrect argument (should be Y or N) value: ''") - _, _, err = parser.Parse("ALTER DATABASE", "", "") - c.Assert(err.Error(), Equals, "line 1 column 14 near \"\" ") + _, _, err = p.Parse("ALTER DATABASE", "", "") + require.EqualError(t, err, "line 1 column 14 near \"\" ") - _, _, err = parser.Parse("ALTER SCHEMA `ANY_DB_NAME`", "", "") - c.Assert(err.Error(), Equals, "line 1 column 26 near \"\" ") + _, _, err = p.Parse("ALTER SCHEMA `ANY_DB_NAME`", "", "") + require.EqualError(t, err, "line 1 column 26 near \"\" ") - _, _, err = parser.Parse("alter table t partition by range FIELDS(a)", "", "") - c.Assert(err.Error(), Equals, "[ddl:1492]For RANGE partitions each partition must be defined") + _, _, err = p.Parse("alter table t partition by range FIELDS(a)", "", "") + require.EqualError(t, err, "[ddl:1492]For RANGE partitions each partition must be defined") - _, _, err = parser.Parse("alter table t partition by list FIELDS(a)", "", "") - c.Assert(err.Error(), Equals, "[ddl:1492]For LIST partitions each partition must be defined") + _, _, err = p.Parse("alter table t partition by list FIELDS(a)", "", "") + require.EqualError(t, err, "[ddl:1492]For LIST partitions each partition must be defined") - _, _, err = parser.Parse("alter table t partition by list FIELDS(a)", "", "") - c.Assert(err.Error(), Equals, "[ddl:1492]For LIST partitions each partition must be defined") + _, _, err = p.Parse("alter table t partition by list FIELDS(a)", "", "") + require.EqualError(t, err, "[ddl:1492]For LIST partitions each partition must be defined") - _, _, err = parser.Parse("alter table t partition by list FIELDS(a,b,c)", "", "") - c.Assert(err.Error(), Equals, "[ddl:1492]For LIST partitions each partition must be defined") + _, _, err = p.Parse("alter table t partition by list FIELDS(a,b,c)", "", "") + require.EqualError(t, err, "[ddl:1492]For LIST partitions each partition must be defined") - _, _, err = parser.Parse("alter table t lock = first", "", "") - c.Assert(err.Error(), Equals, "[parser:1801]Unknown LOCK type 'first'") + _, _, err = p.Parse("alter table t lock = first", "", "") + require.EqualError(t, err, "[parser:1801]Unknown LOCK type 'first'") - _, _, err = parser.Parse("alter table t lock = start", "", "") - c.Assert(err.Error(), Equals, "[parser:1801]Unknown LOCK type 'start'") + _, _, err = p.Parse("alter table t lock = start", "", "") + require.EqualError(t, err, "[parser:1801]Unknown LOCK type 'start'") - _, _, err = parser.Parse("alter table t lock = commit", "", "") - c.Assert(err.Error(), Equals, "[parser:1801]Unknown LOCK type 'commit'") + _, _, err = p.Parse("alter table t lock = commit", "", "") + require.EqualError(t, err, "[parser:1801]Unknown LOCK type 'commit'") - _, _, err = parser.Parse("alter table t lock = binlog", "", "") - c.Assert(err.Error(), Equals, "[parser:1801]Unknown LOCK type 'binlog'") + _, _, err = p.Parse("alter table t lock = binlog", "", "") + require.EqualError(t, err, "[parser:1801]Unknown LOCK type 'binlog'") - _, _, err = parser.Parse("alter table t lock = randomStr123", "", "") - c.Assert(err.Error(), Equals, "[parser:1801]Unknown LOCK type 'randomStr123'") + _, _, err = p.Parse("alter table t lock = randomStr123", "", "") + require.EqualError(t, err, "[parser:1801]Unknown LOCK type 'randomStr123'") - _, _, err = parser.Parse("create table t (a longtext unicode)", "", "") - c.Assert(err.Error(), Equals, "[parser:1115]Unknown character set: 'ucs2'") + _, _, err = p.Parse("create table t (a longtext unicode)", "", "") + require.EqualError(t, err, "[parser:1115]Unknown character set: 'ucs2'") - _, _, err = parser.Parse("create table t (a long byte, b text unicode)", "", "") - c.Assert(err.Error(), Equals, "[parser:1115]Unknown character set: 'ucs2'") + _, _, err = p.Parse("create table t (a long byte, b text unicode)", "", "") + require.EqualError(t, err, "[parser:1115]Unknown character set: 'ucs2'") - _, _, err = parser.Parse("create table t (a long ascii, b long unicode)", "", "") - c.Assert(err.Error(), Equals, "[parser:1115]Unknown character set: 'ucs2'") + _, _, err = p.Parse("create table t (a long ascii, b long unicode)", "", "") + require.EqualError(t, err, "[parser:1115]Unknown character set: 'ucs2'") - _, _, err = parser.Parse("create table t (a text unicode, b mediumtext ascii, c int)", "", "") - c.Assert(err.Error(), Equals, "[parser:1115]Unknown character set: 'ucs2'") + _, _, err = p.Parse("create table t (a text unicode, b mediumtext ascii, c int)", "", "") + require.EqualError(t, err, "[parser:1115]Unknown character set: 'ucs2'") - _, _, err = parser.Parse("select 1 collate some_unknown_collation", "", "") - c.Assert(err.Error(), Equals, "[ddl:1273]Unknown collation: 'some_unknown_collation'") + _, _, err = p.Parse("select 1 collate some_unknown_collation", "", "") + require.EqualError(t, err, "[ddl:1273]Unknown collation: 'some_unknown_collation'") } -func (s *testParserSuite) TestOptimizerHints(c *C) { - parser := parser.New() +func TestOptimizerHints(t *testing.T) { + p := parser.New() // Test USE_INDEX - stmt, _, err := parser.Parse("select /*+ USE_INDEX(T1,T2), use_index(t3,t4) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") - c.Assert(err, IsNil) + stmt, _, err := p.Parse("select /*+ USE_INDEX(T1,T2), use_index(t3,t4) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) selectStmt := stmt[0].(*ast.SelectStmt) hints := selectStmt.TableHints - c.Assert(hints, HasLen, 2) - c.Assert(hints[0].HintName.L, Equals, "use_index") - c.Assert(hints[0].Tables, HasLen, 1) - c.Assert(hints[0].Tables[0].TableName.L, Equals, "t1") - c.Assert(hints[0].Indexes, HasLen, 1) - c.Assert(hints[0].Indexes[0].L, Equals, "t2") - - c.Assert(hints[1].HintName.L, Equals, "use_index") - c.Assert(hints[1].Tables, HasLen, 1) - c.Assert(hints[1].Tables[0].TableName.L, Equals, "t3") - c.Assert(hints[1].Indexes, HasLen, 1) - c.Assert(hints[1].Indexes[0].L, Equals, "t4") + require.Len(t, hints, 2) + require.Equal(t, "use_index", hints[0].HintName.L) + require.Len(t, hints[0].Tables, 1) + require.Equal(t, "t1", hints[0].Tables[0].TableName.L) + require.Len(t, hints[0].Indexes, 1) + require.Equal(t, "t2", hints[0].Indexes[0].L) + + require.Equal(t, "use_index", hints[1].HintName.L) + require.Len(t, hints[1].Tables, 1) + require.Equal(t, "t3", hints[1].Tables[0].TableName.L) + require.Len(t, hints[1].Indexes, 1) + require.Equal(t, "t4", hints[1].Indexes[0].L) // Test FORCE_INDEX - stmt, _, err = parser.Parse("select /*+ FORCE_INDEX(T1,T2), force_index(t3,t4) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") - c.Assert(err, IsNil) + stmt, _, err = p.Parse("select /*+ FORCE_INDEX(T1,T2), force_index(t3,t4) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) selectStmt = stmt[0].(*ast.SelectStmt) hints = selectStmt.TableHints - c.Assert(hints, HasLen, 2) - c.Assert(hints[0].HintName.L, Equals, "force_index") - c.Assert(hints[0].Tables, HasLen, 1) - c.Assert(hints[0].Tables[0].TableName.L, Equals, "t1") - c.Assert(hints[0].Indexes, HasLen, 1) - c.Assert(hints[0].Indexes[0].L, Equals, "t2") - - c.Assert(hints[1].HintName.L, Equals, "force_index") - c.Assert(hints[1].Tables, HasLen, 1) - c.Assert(hints[1].Tables[0].TableName.L, Equals, "t3") - c.Assert(hints[1].Indexes, HasLen, 1) - c.Assert(hints[1].Indexes[0].L, Equals, "t4") + require.Len(t, hints, 2) + require.Equal(t, "force_index", hints[0].HintName.L) + require.Len(t, hints[0].Tables, 1) + require.Equal(t, "t1", hints[0].Tables[0].TableName.L) + require.Len(t, hints[0].Indexes, 1) + require.Equal(t, "t2", hints[0].Indexes[0].L) + + require.Equal(t, "force_index", hints[1].HintName.L) + require.Len(t, hints[1].Tables, 1) + require.Equal(t, "t3", hints[1].Tables[0].TableName.L) + require.Len(t, hints[1].Indexes, 1) + require.Equal(t, "t4", hints[1].Indexes[0].L) // Test IGNORE_INDEX - stmt, _, err = parser.Parse("select /*+ IGNORE_INDEX(T1,T2), ignore_index(t3,t4) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") - c.Assert(err, IsNil) + stmt, _, err = p.Parse("select /*+ IGNORE_INDEX(T1,T2), ignore_index(t3,t4) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) selectStmt = stmt[0].(*ast.SelectStmt) hints = selectStmt.TableHints - c.Assert(hints, HasLen, 2) - c.Assert(hints[0].HintName.L, Equals, "ignore_index") - c.Assert(hints[0].Tables, HasLen, 1) - c.Assert(hints[0].Tables[0].TableName.L, Equals, "t1") - c.Assert(hints[0].Indexes, HasLen, 1) - c.Assert(hints[0].Indexes[0].L, Equals, "t2") - - c.Assert(hints[1].HintName.L, Equals, "ignore_index") - c.Assert(hints[1].Tables, HasLen, 1) - c.Assert(hints[1].Tables[0].TableName.L, Equals, "t3") - c.Assert(hints[1].Indexes, HasLen, 1) - c.Assert(hints[1].Indexes[0].L, Equals, "t4") + require.Len(t, hints, 2) + require.Equal(t, "ignore_index", hints[0].HintName.L) + require.Len(t, hints[0].Tables, 1) + require.Equal(t, "t1", hints[0].Tables[0].TableName.L) + require.Len(t, hints[0].Indexes, 1) + require.Equal(t, "t2", hints[0].Indexes[0].L) + + require.Equal(t, "ignore_index", hints[1].HintName.L) + require.Len(t, hints[1].Tables, 1) + require.Equal(t, "t3", hints[1].Tables[0].TableName.L) + require.Len(t, hints[1].Indexes, 1) + require.Equal(t, "t4", hints[1].Indexes[0].L) // Test TIDB_SMJ - 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) + stmt, _, err = p.Parse("select /*+ TIDB_SMJ(T1,t2), tidb_smj(T3,t4) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) selectStmt = stmt[0].(*ast.SelectStmt) hints = selectStmt.TableHints - c.Assert(hints, HasLen, 2) - c.Assert(hints[0].HintName.L, Equals, "tidb_smj") - c.Assert(hints[0].Tables, HasLen, 2) - c.Assert(hints[0].Tables[0].TableName.L, Equals, "t1") - c.Assert(hints[0].Tables[1].TableName.L, Equals, "t2") + require.Len(t, hints, 2) + require.Equal(t, "tidb_smj", hints[0].HintName.L) + require.Len(t, hints[0].Tables, 2) + require.Equal(t, "t1", hints[0].Tables[0].TableName.L) + require.Equal(t, "t2", hints[0].Tables[1].TableName.L) - c.Assert(hints[1].HintName.L, Equals, "tidb_smj") - c.Assert(hints[1].Tables, HasLen, 2) - c.Assert(hints[1].Tables[0].TableName.L, Equals, "t3") - c.Assert(hints[1].Tables[1].TableName.L, Equals, "t4") + require.Equal(t, "tidb_smj", hints[1].HintName.L) + require.Len(t, hints[1].Tables, 2) + require.Equal(t, "t3", hints[1].Tables[0].TableName.L) + require.Equal(t, "t4", hints[1].Tables[1].TableName.L) // Test MERGE_JOIN - stmt, _, err = parser.Parse("select /*+ MERGE_JOIN(t1, T2), merge_join(t3, t4) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") - c.Assert(err, IsNil) + stmt, _, err = p.Parse("select /*+ MERGE_JOIN(t1, T2), merge_join(t3, t4) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) selectStmt = stmt[0].(*ast.SelectStmt) hints = selectStmt.TableHints - c.Assert(hints, HasLen, 2) - c.Assert(hints[0].HintName.L, Equals, "merge_join") - c.Assert(hints[0].Tables, HasLen, 2) - c.Assert(hints[0].Tables[0].TableName.L, Equals, "t1") - c.Assert(hints[0].Tables[1].TableName.L, Equals, "t2") + require.Len(t, hints, 2) + require.Equal(t, "merge_join", hints[0].HintName.L) + require.Len(t, hints[0].Tables, 2) + require.Equal(t, "t1", hints[0].Tables[0].TableName.L) + require.Equal(t, "t2", hints[0].Tables[1].TableName.L) - c.Assert(hints[1].HintName.L, Equals, "merge_join") - c.Assert(hints[1].Tables, HasLen, 2) - c.Assert(hints[1].Tables[0].TableName.L, Equals, "t3") - c.Assert(hints[1].Tables[1].TableName.L, Equals, "t4") + require.Equal(t, "merge_join", hints[1].HintName.L) + require.Len(t, hints[1].Tables, 2) + require.Equal(t, "t3", hints[1].Tables[0].TableName.L) + require.Equal(t, "t4", hints[1].Tables[1].TableName.L) // TEST BROADCAST_JOIN - stmt, _, err = parser.Parse("select /*+ BROADCAST_JOIN(t1, T2), broadcast_join(t3, t4), BROADCAST_JOIN_LOCAL(t2) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") - c.Assert(err, IsNil) + stmt, _, err = p.Parse("select /*+ BROADCAST_JOIN(t1, T2), broadcast_join(t3, t4), BROADCAST_JOIN_LOCAL(t2) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) selectStmt = stmt[0].(*ast.SelectStmt) hints = selectStmt.TableHints - c.Assert(hints, HasLen, 3) - c.Assert(hints[0].HintName.L, Equals, "broadcast_join") - c.Assert(hints[0].Tables, HasLen, 2) - c.Assert(hints[0].Tables[0].TableName.L, Equals, "t1") - c.Assert(hints[0].Tables[1].TableName.L, Equals, "t2") + require.Len(t, hints, 3) + require.Equal(t, "broadcast_join", hints[0].HintName.L) + require.Len(t, hints[0].Tables, 2) + require.Equal(t, "t1", hints[0].Tables[0].TableName.L) + require.Equal(t, "t2", hints[0].Tables[1].TableName.L) - c.Assert(hints[1].HintName.L, Equals, "broadcast_join") - c.Assert(hints[1].Tables, HasLen, 2) - c.Assert(hints[1].Tables[0].TableName.L, Equals, "t3") - c.Assert(hints[1].Tables[1].TableName.L, Equals, "t4") + require.Equal(t, "broadcast_join", hints[1].HintName.L) + require.Len(t, hints[1].Tables, 2) + require.Equal(t, "t3", hints[1].Tables[0].TableName.L) + require.Equal(t, "t4", hints[1].Tables[1].TableName.L) - c.Assert(hints[2].HintName.L, Equals, "broadcast_join_local") - c.Assert(hints[2].Tables, HasLen, 1) - c.Assert(hints[2].Tables[0].TableName.L, Equals, "t2") + require.Equal(t, "broadcast_join_local", hints[2].HintName.L) + require.Len(t, hints[2].Tables, 1) + require.Equal(t, "t2", hints[2].Tables[0].TableName.L) // Test TIDB_INLJ - 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) + stmt, _, err = p.Parse("select /*+ TIDB_INLJ(t1, T2), tidb_inlj(t3, t4) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) selectStmt = stmt[0].(*ast.SelectStmt) hints = selectStmt.TableHints - c.Assert(hints, HasLen, 2) - c.Assert(hints[0].HintName.L, Equals, "tidb_inlj") - c.Assert(hints[0].Tables, HasLen, 2) - c.Assert(hints[0].Tables[0].TableName.L, Equals, "t1") - c.Assert(hints[0].Tables[1].TableName.L, Equals, "t2") + require.Len(t, hints, 2) + require.Equal(t, "tidb_inlj", hints[0].HintName.L) + require.Len(t, hints[0].Tables, 2) + require.Equal(t, "t1", hints[0].Tables[0].TableName.L) + require.Equal(t, "t2", hints[0].Tables[1].TableName.L) - c.Assert(hints[1].HintName.L, Equals, "tidb_inlj") - c.Assert(hints[1].Tables, HasLen, 2) - c.Assert(hints[1].Tables[0].TableName.L, Equals, "t3") - c.Assert(hints[1].Tables[1].TableName.L, Equals, "t4") + require.Equal(t, "tidb_inlj", hints[1].HintName.L) + require.Len(t, hints[1].Tables, 2) + require.Equal(t, "t3", hints[1].Tables[0].TableName.L) + require.Equal(t, "t4", hints[1].Tables[1].TableName.L) // Test INL_JOIN - stmt, _, err = parser.Parse("select /*+ INL_JOIN(t1, T2), inl_join(t3, t4) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") - c.Assert(err, IsNil) + stmt, _, err = p.Parse("select /*+ INL_JOIN(t1, T2), inl_join(t3, t4) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) selectStmt = stmt[0].(*ast.SelectStmt) hints = selectStmt.TableHints - c.Assert(hints, HasLen, 2) - c.Assert(hints[0].HintName.L, Equals, "inl_join") - c.Assert(hints[0].Tables, HasLen, 2) - c.Assert(hints[0].Tables[0].TableName.L, Equals, "t1") - c.Assert(hints[0].Tables[1].TableName.L, Equals, "t2") + require.Len(t, hints, 2) + require.Equal(t, "inl_join", hints[0].HintName.L) + require.Len(t, hints[0].Tables, 2) + require.Equal(t, "t1", hints[0].Tables[0].TableName.L) + require.Equal(t, "t2", hints[0].Tables[1].TableName.L) - c.Assert(hints[1].HintName.L, Equals, "inl_join") - c.Assert(hints[1].Tables, HasLen, 2) - c.Assert(hints[1].Tables[0].TableName.L, Equals, "t3") - c.Assert(hints[1].Tables[1].TableName.L, Equals, "t4") + require.Equal(t, "inl_join", hints[1].HintName.L) + require.Len(t, hints[1].Tables, 2) + require.Equal(t, "t3", hints[1].Tables[0].TableName.L) + require.Equal(t, "t4", hints[1].Tables[1].TableName.L) // Test INL_HASH_JOIN - stmt, _, err = parser.Parse("select /*+ INL_HASH_JOIN(t1, T2), inl_hash_join(t3, t4) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") - c.Assert(err, IsNil) + stmt, _, err = p.Parse("select /*+ INL_HASH_JOIN(t1, T2), inl_hash_join(t3, t4) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) selectStmt = stmt[0].(*ast.SelectStmt) hints = selectStmt.TableHints - c.Assert(hints, HasLen, 2) - c.Assert(hints[0].HintName.L, Equals, "inl_hash_join") - c.Assert(hints[0].Tables, HasLen, 2) - c.Assert(hints[0].Tables[0].TableName.L, Equals, "t1") - c.Assert(hints[0].Tables[1].TableName.L, Equals, "t2") + require.Len(t, hints, 2) + require.Equal(t, "inl_hash_join", hints[0].HintName.L) + require.Len(t, hints[0].Tables, 2) + require.Equal(t, "t1", hints[0].Tables[0].TableName.L) + require.Equal(t, "t2", hints[0].Tables[1].TableName.L) - c.Assert(hints[1].HintName.L, Equals, "inl_hash_join") - c.Assert(hints[1].Tables, HasLen, 2) - c.Assert(hints[1].Tables[0].TableName.L, Equals, "t3") - c.Assert(hints[1].Tables[1].TableName.L, Equals, "t4") + require.Equal(t, "inl_hash_join", hints[1].HintName.L) + require.Len(t, hints[1].Tables, 2) + require.Equal(t, "t3", hints[1].Tables[0].TableName.L) + require.Equal(t, "t4", hints[1].Tables[1].TableName.L) // Test INL_MERGE_JOIN - stmt, _, err = parser.Parse("select /*+ INL_MERGE_JOIN(t1, T2), inl_merge_join(t3, t4) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") - c.Assert(err, IsNil) + stmt, _, err = p.Parse("select /*+ INL_MERGE_JOIN(t1, T2), inl_merge_join(t3, t4) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) selectStmt = stmt[0].(*ast.SelectStmt) hints = selectStmt.TableHints - c.Assert(hints, HasLen, 2) - c.Assert(hints[0].HintName.L, Equals, "inl_merge_join") - c.Assert(hints[0].Tables, HasLen, 2) - c.Assert(hints[0].Tables[0].TableName.L, Equals, "t1") - c.Assert(hints[0].Tables[1].TableName.L, Equals, "t2") + require.Len(t, hints, 2) + require.Equal(t, "inl_merge_join", hints[0].HintName.L) + require.Len(t, hints[0].Tables, 2) + require.Equal(t, "t1", hints[0].Tables[0].TableName.L) + require.Equal(t, "t2", hints[0].Tables[1].TableName.L) - c.Assert(hints[1].HintName.L, Equals, "inl_merge_join") - c.Assert(hints[1].Tables, HasLen, 2) - c.Assert(hints[1].Tables[0].TableName.L, Equals, "t3") - c.Assert(hints[1].Tables[1].TableName.L, Equals, "t4") + require.Equal(t, "inl_merge_join", hints[1].HintName.L) + require.Len(t, hints[1].Tables, 2) + require.Equal(t, "t3", hints[1].Tables[0].TableName.L) + require.Equal(t, "t4", hints[1].Tables[1].TableName.L) // Test TIDB_HJ - 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) + stmt, _, err = p.Parse("select /*+ TIDB_HJ(t1, T2), tidb_hj(t3, t4) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) selectStmt = stmt[0].(*ast.SelectStmt) hints = selectStmt.TableHints - c.Assert(hints, HasLen, 2) - c.Assert(hints[0].HintName.L, Equals, "tidb_hj") - c.Assert(hints[0].Tables, HasLen, 2) - c.Assert(hints[0].Tables[0].TableName.L, Equals, "t1") - c.Assert(hints[0].Tables[1].TableName.L, Equals, "t2") + require.Len(t, hints, 2) + require.Equal(t, "tidb_hj", hints[0].HintName.L) + require.Len(t, hints[0].Tables, 2) + require.Equal(t, "t1", hints[0].Tables[0].TableName.L) + require.Equal(t, "t2", hints[0].Tables[1].TableName.L) - c.Assert(hints[1].HintName.L, Equals, "tidb_hj") - c.Assert(hints[1].Tables, HasLen, 2) - c.Assert(hints[1].Tables[0].TableName.L, Equals, "t3") - c.Assert(hints[1].Tables[1].TableName.L, Equals, "t4") + require.Equal(t, "tidb_hj", hints[1].HintName.L) + require.Len(t, hints[1].Tables, 2) + require.Equal(t, "t3", hints[1].Tables[0].TableName.L) + require.Equal(t, "t4", hints[1].Tables[1].TableName.L) // Test HASH_JOIN - stmt, _, err = parser.Parse("select /*+ HASH_JOIN(t1, T2), hash_join(t3, t4) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") - c.Assert(err, IsNil) + stmt, _, err = p.Parse("select /*+ HASH_JOIN(t1, T2), hash_join(t3, t4) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) selectStmt = stmt[0].(*ast.SelectStmt) hints = selectStmt.TableHints - c.Assert(hints, HasLen, 2) - c.Assert(hints[0].HintName.L, Equals, "hash_join") - c.Assert(hints[0].Tables, HasLen, 2) - c.Assert(hints[0].Tables[0].TableName.L, Equals, "t1") - c.Assert(hints[0].Tables[1].TableName.L, Equals, "t2") + require.Len(t, hints, 2) + require.Equal(t, "hash_join", hints[0].HintName.L) + require.Len(t, hints[0].Tables, 2) + require.Equal(t, "t1", hints[0].Tables[0].TableName.L) + require.Equal(t, "t2", hints[0].Tables[1].TableName.L) - c.Assert(hints[1].HintName.L, Equals, "hash_join") - c.Assert(hints[1].Tables, HasLen, 2) - c.Assert(hints[1].Tables[0].TableName.L, Equals, "t3") - c.Assert(hints[1].Tables[1].TableName.L, Equals, "t4") + require.Equal(t, "hash_join", hints[1].HintName.L) + require.Len(t, hints[1].Tables, 2) + require.Equal(t, "t3", hints[1].Tables[0].TableName.L) + require.Equal(t, "t4", hints[1].Tables[1].TableName.L) // Test HASH_JOIN with SWAP_JOIN_INPUTS/NO_SWAP_JOIN_INPUTS // t1 for build, t4 for probe - stmt, _, err = parser.Parse("select /*+ HASH_JOIN(t1, T2), hash_join(t3, t4), SWAP_JOIN_INPUTS(t1), NO_SWAP_JOIN_INPUTS(t4) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") - c.Assert(err, IsNil) + stmt, _, err = p.Parse("select /*+ HASH_JOIN(t1, T2), hash_join(t3, t4), SWAP_JOIN_INPUTS(t1), NO_SWAP_JOIN_INPUTS(t4) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) selectStmt = stmt[0].(*ast.SelectStmt) hints = selectStmt.TableHints - c.Assert(hints, HasLen, 4) - c.Assert(hints[0].HintName.L, Equals, "hash_join") - c.Assert(hints[0].Tables, HasLen, 2) - c.Assert(hints[0].Tables[0].TableName.L, Equals, "t1") - c.Assert(hints[0].Tables[1].TableName.L, Equals, "t2") + require.Len(t, hints, 4) + require.Equal(t, "hash_join", hints[0].HintName.L) + require.Len(t, hints[0].Tables, 2) + require.Equal(t, "t1", hints[0].Tables[0].TableName.L) + require.Equal(t, "t2", hints[0].Tables[1].TableName.L) - c.Assert(hints[1].HintName.L, Equals, "hash_join") - c.Assert(hints[1].Tables, HasLen, 2) - c.Assert(hints[1].Tables[0].TableName.L, Equals, "t3") - c.Assert(hints[1].Tables[1].TableName.L, Equals, "t4") + require.Equal(t, "hash_join", hints[1].HintName.L) + require.Len(t, hints[1].Tables, 2) + require.Equal(t, "t3", hints[1].Tables[0].TableName.L) + require.Equal(t, "t4", hints[1].Tables[1].TableName.L) - c.Assert(hints[2].HintName.L, Equals, "swap_join_inputs") - c.Assert(hints[2].Tables, HasLen, 1) - c.Assert(hints[2].Tables[0].TableName.L, Equals, "t1") + require.Equal(t, "swap_join_inputs", hints[2].HintName.L) + require.Len(t, hints[2].Tables, 1) + require.Equal(t, "t1", hints[2].Tables[0].TableName.L) - c.Assert(hints[3].HintName.L, Equals, "no_swap_join_inputs") - c.Assert(hints[3].Tables, HasLen, 1) - c.Assert(hints[3].Tables[0].TableName.L, Equals, "t4") + require.Equal(t, "no_swap_join_inputs", hints[3].HintName.L) + require.Len(t, hints[3].Tables, 1) + require.Equal(t, "t4", hints[3].Tables[0].TableName.L) // Test MAX_EXECUTION_TIME queries := []string{ @@ -3822,13 +3825,13 @@ func (s *testParserSuite) TestOptimizerHints(c *C) { "SELECT /*+ MAX_EXECUTION_TIME(1000) */ 1 FROM DUAL", } for i, query := range queries { - stmt, _, err = parser.Parse(query, "", "") - c.Assert(err, IsNil) + stmt, _, err = p.Parse(query, "", "") + require.NoError(t, err) selectStmt = stmt[0].(*ast.SelectStmt) hints = selectStmt.TableHints - c.Assert(len(hints), Equals, 1) - c.Assert(hints[0].HintName.L, Equals, "max_execution_time", Commentf("case", i)) - c.Assert(hints[0].HintData.(uint64), Equals, uint64(1000)) + require.Len(t, hints, 1) + require.Equal(t, "max_execution_time", hints[0].HintName.L, "case", i) + require.Equal(t, uint64(1000), hints[0].HintData.(uint64)) } // Test NTH_PLAN @@ -3839,209 +3842,209 @@ func (s *testParserSuite) TestOptimizerHints(c *C) { "SELECT /*+ NTH_PLAN(10) */ 1 FROM DUAL", } for i, query := range queries { - stmt, _, err = parser.Parse(query, "", "") - c.Assert(err, IsNil) + stmt, _, err = p.Parse(query, "", "") + require.NoError(t, err) selectStmt = stmt[0].(*ast.SelectStmt) hints = selectStmt.TableHints - c.Assert(len(hints), Equals, 1) - c.Assert(hints[0].HintName.L, Equals, "nth_plan", Commentf("case", i)) - c.Assert(hints[0].HintData.(int64), Equals, int64(10)) + require.Len(t, hints, 1) + require.Equal(t, "nth_plan", hints[0].HintName.L, "case", i) + require.Equal(t, int64(10), hints[0].HintData.(int64)) } // Test USE_INDEX_MERGE - stmt, _, err = parser.Parse("select /*+ USE_INDEX_MERGE(t1, c1), use_index_merge(t2, c1), use_index_merge(t3, c1, primary, c2) */ c1, c2 from t1, t2, t3 where t1.c1 = t2.c1 and t3.c2 = t1.c2", "", "") - c.Assert(err, IsNil) + stmt, _, err = p.Parse("select /*+ USE_INDEX_MERGE(t1, c1), use_index_merge(t2, c1), use_index_merge(t3, c1, primary, c2) */ c1, c2 from t1, t2, t3 where t1.c1 = t2.c1 and t3.c2 = t1.c2", "", "") + require.NoError(t, err) selectStmt = stmt[0].(*ast.SelectStmt) hints = selectStmt.TableHints - c.Assert(hints, HasLen, 3) - c.Assert(hints[0].HintName.L, Equals, "use_index_merge") - c.Assert(hints[0].Tables, HasLen, 1) - c.Assert(hints[0].Tables[0].TableName.L, Equals, "t1") - c.Assert(hints[0].Indexes, HasLen, 1) - c.Assert(hints[0].Indexes[0].L, Equals, "c1") - - c.Assert(hints[1].HintName.L, Equals, "use_index_merge") - c.Assert(hints[1].Tables, HasLen, 1) - c.Assert(hints[1].Tables[0].TableName.L, Equals, "t2") - c.Assert(hints[1].Indexes, HasLen, 1) - c.Assert(hints[1].Indexes[0].L, Equals, "c1") - - c.Assert(hints[2].HintName.L, Equals, "use_index_merge") - c.Assert(hints[2].Tables, HasLen, 1) - c.Assert(hints[2].Tables[0].TableName.L, Equals, "t3") - c.Assert(hints[2].Indexes, HasLen, 3) - c.Assert(hints[2].Indexes[0].L, Equals, "c1") - c.Assert(hints[2].Indexes[1].L, Equals, "primary") - c.Assert(hints[2].Indexes[2].L, Equals, "c2") + require.Len(t, hints, 3) + require.Equal(t, "use_index_merge", hints[0].HintName.L) + require.Len(t, hints[0].Tables, 1) + require.Equal(t, "t1", hints[0].Tables[0].TableName.L) + require.Len(t, hints[0].Indexes, 1) + require.Equal(t, "c1", hints[0].Indexes[0].L) + + require.Equal(t, "use_index_merge", hints[1].HintName.L) + require.Len(t, hints[1].Tables, 1) + require.Equal(t, "t2", hints[1].Tables[0].TableName.L) + require.Len(t, hints[1].Indexes, 1) + require.Equal(t, "c1", hints[1].Indexes[0].L) + + require.Equal(t, "use_index_merge", hints[2].HintName.L) + require.Len(t, hints[2].Tables, 1) + require.Equal(t, "t3", hints[2].Tables[0].TableName.L) + require.Len(t, hints[2].Indexes, 3) + require.Equal(t, "c1", hints[2].Indexes[0].L) + require.Equal(t, "primary", hints[2].Indexes[1].L) + require.Equal(t, "c2", hints[2].Indexes[2].L) // Test READ_FROM_STORAGE - stmt, _, err = parser.Parse("select /*+ READ_FROM_STORAGE(tiflash[t1, t2], tikv[t3]) */ c1, c2 from t1, t2, t1 t3 where t1.c1 = t2.c1 and t2.c1 = t3.c1", "", "") - c.Assert(err, IsNil) + stmt, _, err = p.Parse("select /*+ READ_FROM_STORAGE(tiflash[t1, t2], tikv[t3]) */ c1, c2 from t1, t2, t1 t3 where t1.c1 = t2.c1 and t2.c1 = t3.c1", "", "") + require.NoError(t, err) selectStmt = stmt[0].(*ast.SelectStmt) hints = selectStmt.TableHints - c.Assert(hints, HasLen, 2) - c.Assert(hints[0].HintName.L, Equals, "read_from_storage") - c.Assert(hints[0].HintData.(model.CIStr).L, Equals, "tiflash") - c.Assert(hints[0].Tables, HasLen, 2) - c.Assert(hints[0].Tables[0].TableName.L, Equals, "t1") - c.Assert(hints[0].Tables[1].TableName.L, Equals, "t2") - c.Assert(hints[1].HintName.L, Equals, "read_from_storage") - c.Assert(hints[1].HintData.(model.CIStr).L, Equals, "tikv") - c.Assert(hints[1].Tables, HasLen, 1) - c.Assert(hints[1].Tables[0].TableName.L, Equals, "t3") + require.Len(t, hints, 2) + require.Equal(t, "read_from_storage", hints[0].HintName.L) + require.Equal(t, "tiflash", hints[0].HintData.(model.CIStr).L) + require.Len(t, hints[0].Tables, 2) + require.Equal(t, "t1", hints[0].Tables[0].TableName.L) + require.Equal(t, "t2", hints[0].Tables[1].TableName.L) + require.Equal(t, "read_from_storage", hints[1].HintName.L) + require.Equal(t, "tikv", hints[1].HintData.(model.CIStr).L) + require.Len(t, hints[1].Tables, 1) + require.Equal(t, "t3", hints[1].Tables[0].TableName.L) // Test USE_TOJA - stmt, _, err = parser.Parse("select /*+ USE_TOJA(true), use_toja(false) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") - c.Assert(err, IsNil) + stmt, _, err = p.Parse("select /*+ USE_TOJA(true), use_toja(false) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) selectStmt = stmt[0].(*ast.SelectStmt) hints = selectStmt.TableHints - c.Assert(hints, HasLen, 2) - c.Assert(hints[0].HintName.L, Equals, "use_toja") - c.Assert(hints[0].HintData.(bool), IsTrue) + require.Len(t, hints, 2) + require.Equal(t, "use_toja", hints[0].HintName.L) + require.True(t, hints[0].HintData.(bool)) - c.Assert(hints[1].HintName.L, Equals, "use_toja") - c.Assert(hints[1].HintData.(bool), IsFalse) + require.Equal(t, "use_toja", hints[1].HintName.L) + require.False(t, hints[1].HintData.(bool)) // Test IGNORE_PLAN_CACHE - stmt, _, err = parser.Parse("select /*+ IGNORE_PLAN_CACHE(), ignore_plan_cache() */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") - c.Assert(err, IsNil) + stmt, _, err = p.Parse("select /*+ IGNORE_PLAN_CACHE(), ignore_plan_cache() */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) selectStmt = stmt[0].(*ast.SelectStmt) hints = selectStmt.TableHints - c.Assert(hints, HasLen, 2) - c.Assert(hints[0].HintName.L, Equals, "ignore_plan_cache") - c.Assert(hints[1].HintName.L, Equals, "ignore_plan_cache") + require.Len(t, hints, 2) + require.Equal(t, "ignore_plan_cache", hints[0].HintName.L) + require.Equal(t, "ignore_plan_cache", hints[1].HintName.L) - stmt, _, err = parser.Parse("delete /*+ IGNORE_PLAN_CACHE(), ignore_plan_cache() */ from t where a = 1", "", "") - c.Assert(err, IsNil) + stmt, _, err = p.Parse("delete /*+ IGNORE_PLAN_CACHE(), ignore_plan_cache() */ from t where a = 1", "", "") + require.NoError(t, err) deleteStmt := stmt[0].(*ast.DeleteStmt) hints = deleteStmt.TableHints - c.Assert(hints, HasLen, 2) - c.Assert(hints[0].HintName.L, Equals, "ignore_plan_cache") - c.Assert(hints[1].HintName.L, Equals, "ignore_plan_cache") + require.Len(t, hints, 2) + require.Equal(t, "ignore_plan_cache", hints[0].HintName.L) + require.Equal(t, "ignore_plan_cache", hints[1].HintName.L) - stmt, _, err = parser.Parse("update /*+ IGNORE_PLAN_CACHE(), ignore_plan_cache() */ t set a = 1 where a = 10", "", "") - c.Assert(err, IsNil) + stmt, _, err = p.Parse("update /*+ IGNORE_PLAN_CACHE(), ignore_plan_cache() */ t set a = 1 where a = 10", "", "") + require.NoError(t, err) updateStmt := stmt[0].(*ast.UpdateStmt) hints = updateStmt.TableHints - c.Assert(hints, HasLen, 2) - c.Assert(hints[0].HintName.L, Equals, "ignore_plan_cache") - c.Assert(hints[1].HintName.L, Equals, "ignore_plan_cache") + require.Len(t, hints, 2) + require.Equal(t, "ignore_plan_cache", hints[0].HintName.L) + require.Equal(t, "ignore_plan_cache", hints[1].HintName.L) // Test USE_CASCADES - stmt, _, err = parser.Parse("select /*+ USE_CASCADES(true), use_cascades(false) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") - c.Assert(err, IsNil) + stmt, _, err = p.Parse("select /*+ USE_CASCADES(true), use_cascades(false) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) selectStmt = stmt[0].(*ast.SelectStmt) hints = selectStmt.TableHints - c.Assert(hints, HasLen, 2) - c.Assert(hints[0].HintName.L, Equals, "use_cascades") - c.Assert(hints[0].HintData.(bool), IsTrue) + require.Len(t, hints, 2) + require.Equal(t, "use_cascades", hints[0].HintName.L) + require.True(t, hints[0].HintData.(bool)) - c.Assert(hints[1].HintName.L, Equals, "use_cascades") - c.Assert(hints[1].HintData.(bool), IsFalse) + require.Equal(t, "use_cascades", hints[1].HintName.L) + require.False(t, hints[1].HintData.(bool)) // Test USE_PLAN_CACHE - stmt, _, err = parser.Parse("select /*+ USE_PLAN_CACHE(), use_plan_cache() */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") - c.Assert(err, IsNil) + stmt, _, err = p.Parse("select /*+ USE_PLAN_CACHE(), use_plan_cache() */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) selectStmt = stmt[0].(*ast.SelectStmt) hints = selectStmt.TableHints - c.Assert(hints, HasLen, 2) - c.Assert(hints[0].HintName.L, Equals, "use_plan_cache") - c.Assert(hints[1].HintName.L, Equals, "use_plan_cache") + require.Len(t, hints, 2) + require.Equal(t, "use_plan_cache", hints[0].HintName.L) + require.Equal(t, "use_plan_cache", hints[1].HintName.L) // Test QUERY_TYPE - stmt, _, err = parser.Parse("select /*+ QUERY_TYPE(OLAP), query_type(OLTP) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") - c.Assert(err, IsNil) + stmt, _, err = p.Parse("select /*+ QUERY_TYPE(OLAP), query_type(OLTP) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) selectStmt = stmt[0].(*ast.SelectStmt) hints = selectStmt.TableHints - c.Assert(hints, HasLen, 2) - c.Assert(hints[0].HintName.L, Equals, "query_type") - c.Assert(hints[0].HintData.(model.CIStr).L, Equals, "olap") - c.Assert(hints[1].HintName.L, Equals, "query_type") - c.Assert(hints[1].HintData.(model.CIStr).L, Equals, "oltp") + require.Len(t, hints, 2) + require.Equal(t, "query_type", hints[0].HintName.L) + require.Equal(t, "olap", hints[0].HintData.(model.CIStr).L) + require.Equal(t, "query_type", hints[1].HintName.L) + require.Equal(t, "oltp", hints[1].HintData.(model.CIStr).L) // Test MEMORY_QUOTA - stmt, _, err = parser.Parse("select /*+ MEMORY_QUOTA(1 MB), memory_quota(1 GB) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") - c.Assert(err, IsNil) + stmt, _, err = p.Parse("select /*+ MEMORY_QUOTA(1 MB), memory_quota(1 GB) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) selectStmt = stmt[0].(*ast.SelectStmt) hints = selectStmt.TableHints - c.Assert(hints, HasLen, 2) - c.Assert(hints[0].HintName.L, Equals, "memory_quota") - c.Assert(hints[0].HintData.(int64), Equals, int64(1024*1024)) - c.Assert(hints[1].HintName.L, Equals, "memory_quota") - c.Assert(hints[1].HintData.(int64), Equals, int64(1024*1024*1024)) + require.Len(t, hints, 2) + require.Equal(t, "memory_quota", hints[0].HintName.L) + require.Equal(t, int64(1024*1024), hints[0].HintData.(int64)) + require.Equal(t, "memory_quota", hints[1].HintName.L) + require.Equal(t, int64(1024*1024*1024), hints[1].HintData.(int64)) - _, _, err = parser.Parse("select /*+ MEMORY_QUOTA(18446744073709551612 MB), memory_quota(8689934592 GB) */ 1", "", "") - c.Assert(err, IsNil) + _, _, err = p.Parse("select /*+ MEMORY_QUOTA(18446744073709551612 MB), memory_quota(8689934592 GB) */ 1", "", "") + require.NoError(t, err) // Test HASH_AGG - stmt, _, err = parser.Parse("select /*+ HASH_AGG(), hash_agg() */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") - c.Assert(err, IsNil) + stmt, _, err = p.Parse("select /*+ HASH_AGG(), hash_agg() */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) selectStmt = stmt[0].(*ast.SelectStmt) hints = selectStmt.TableHints - c.Assert(hints, HasLen, 2) - c.Assert(hints[0].HintName.L, Equals, "hash_agg") - c.Assert(hints[1].HintName.L, Equals, "hash_agg") + require.Len(t, hints, 2) + require.Equal(t, "hash_agg", hints[0].HintName.L) + require.Equal(t, "hash_agg", hints[1].HintName.L) // Test STREAM_AGG - stmt, _, err = parser.Parse("select /*+ STREAM_AGG(), stream_agg() */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") - c.Assert(err, IsNil) + stmt, _, err = p.Parse("select /*+ STREAM_AGG(), stream_agg() */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) selectStmt = stmt[0].(*ast.SelectStmt) hints = selectStmt.TableHints - c.Assert(hints, HasLen, 2) - c.Assert(hints[0].HintName.L, Equals, "stream_agg") - c.Assert(hints[1].HintName.L, Equals, "stream_agg") + require.Len(t, hints, 2) + require.Equal(t, "stream_agg", hints[0].HintName.L) + require.Equal(t, "stream_agg", hints[1].HintName.L) // Test AGG_TO_COP - stmt, _, err = parser.Parse("select /*+ AGG_TO_COP(), agg_to_cop() */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") - c.Assert(err, IsNil) + stmt, _, err = p.Parse("select /*+ AGG_TO_COP(), agg_to_cop() */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) selectStmt = stmt[0].(*ast.SelectStmt) hints = selectStmt.TableHints - c.Assert(hints, HasLen, 2) - c.Assert(hints[0].HintName.L, Equals, "agg_to_cop") - c.Assert(hints[1].HintName.L, Equals, "agg_to_cop") + require.Len(t, hints, 2) + require.Equal(t, "agg_to_cop", hints[0].HintName.L) + require.Equal(t, "agg_to_cop", hints[1].HintName.L) // Test NO_INDEX_MERGE - stmt, _, err = parser.Parse("select /*+ NO_INDEX_MERGE(), no_index_merge() */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") - c.Assert(err, IsNil) + stmt, _, err = p.Parse("select /*+ NO_INDEX_MERGE(), no_index_merge() */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) selectStmt = stmt[0].(*ast.SelectStmt) hints = selectStmt.TableHints - c.Assert(hints, HasLen, 2) - c.Assert(hints[0].HintName.L, Equals, "no_index_merge") - c.Assert(hints[1].HintName.L, Equals, "no_index_merge") + require.Len(t, hints, 2) + require.Equal(t, "no_index_merge", hints[0].HintName.L) + require.Equal(t, "no_index_merge", hints[1].HintName.L) // Test READ_CONSISTENT_REPLICA - stmt, _, err = parser.Parse("select /*+ READ_CONSISTENT_REPLICA(), read_consistent_replica() */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") - c.Assert(err, IsNil) + stmt, _, err = p.Parse("select /*+ READ_CONSISTENT_REPLICA(), read_consistent_replica() */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) selectStmt = stmt[0].(*ast.SelectStmt) hints = selectStmt.TableHints - c.Assert(hints, HasLen, 2) - c.Assert(hints[0].HintName.L, Equals, "read_consistent_replica") - c.Assert(hints[1].HintName.L, Equals, "read_consistent_replica") + require.Len(t, hints, 2) + require.Equal(t, "read_consistent_replica", hints[0].HintName.L) + require.Equal(t, "read_consistent_replica", hints[1].HintName.L) // Test LIMIT_TO_COP - stmt, _, err = parser.Parse("select /*+ LIMIT_TO_COP(), limit_to_cop() */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") - c.Assert(err, IsNil) + stmt, _, err = p.Parse("select /*+ LIMIT_TO_COP(), limit_to_cop() */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + require.NoError(t, err) selectStmt = stmt[0].(*ast.SelectStmt) hints = selectStmt.TableHints - c.Assert(hints, HasLen, 2) - c.Assert(hints[0].HintName.L, Equals, "limit_to_cop") - c.Assert(hints[1].HintName.L, Equals, "limit_to_cop") + require.Len(t, hints, 2) + require.Equal(t, "limit_to_cop", hints[0].HintName.L) + require.Equal(t, "limit_to_cop", hints[1].HintName.L) } -func (s *testParserSuite) TestType(c *C) { +func TestType(t *testing.T) { table := []testCase{ // for time fsp {"CREATE TABLE t( c1 TIME(2), c2 DATETIME(2), c3 TIMESTAMP(2) );", true, "CREATE TABLE `t` (`c1` TIME(2),`c2` DATETIME(2),`c3` TIMESTAMP(2))"}, @@ -4081,10 +4084,10 @@ func (s *testParserSuite) TestType(c *C) { // for json type {`create table t (a JSON);`, true, "CREATE TABLE `t` (`a` JSON)"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestPrivilege(c *C) { +func TestPrivilege(t *testing.T) { table := []testCase{ // for create user {`CREATE USER 'ttt' REQUIRE X509;`, true, "CREATE USER `ttt`@`%` REQUIRE X509"}, @@ -4220,10 +4223,10 @@ func (s *testParserSuite) TestPrivilege(c *C) { {"revoke all privileges, grant option from u1", true, "REVOKE ALL, GRANT OPTION ON *.* FROM `u1`@`%`"}, // special case syntax {"revoke all privileges, grant option from u1, u2, u3", true, "REVOKE ALL, GRANT OPTION ON *.* FROM `u1`@`%`, `u2`@`%`, `u3`@`%`"}, // special case syntax } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestComment(c *C) { +func TestComment(t *testing.T) { table := []testCase{ {"create table t (c int comment 'comment')", true, "CREATE TABLE `t` (`c` INT COMMENT 'comment')"}, {"create table t (c int) comment = 'comment'", true, "CREATE TABLE `t` (`c` INT) COMMENT = 'comment'"}, @@ -4246,10 +4249,10 @@ func (s *testParserSuite) TestComment(c *C) { {"create table t (subject int)", true, "CREATE TABLE `t` (`subject` INT)"}, {"create table t (x509 int)", true, "CREATE TABLE `t` (`x509` INT)"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestParserErrMsg(c *C) { +func TestParserErrMsg(t *testing.T) { commentMsgCases := []testErrMsgCase{ {"delete from t where a = 7 or 1=1/*' and b = 'p'", errors.New("near '/*' and b = 'p'' at line 1")}, {"delete from t where a = 7 or\n 1=1/*' and b = 'p'", errors.New("near '/*' and b = 'p'' at line 2")}, @@ -4260,19 +4263,19 @@ func (s *testParserSuite) TestParserErrMsg(c *C) { {"select a.b()", nil}, {"SELECT foo.bar('baz');", nil}, } - s.RunErrMsgTest(c, commentMsgCases) - s.RunErrMsgTest(c, funcCallMsgCases) + RunErrMsgTest(t, commentMsgCases) + RunErrMsgTest(t, funcCallMsgCases) } type subqueryChecker struct { text string - c *C + t *testing.T } // 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) + require.Equal(sc.t, sc.text, expr.Query.Text()) return inNode, true } return inNode, false @@ -4283,7 +4286,7 @@ func (sc *subqueryChecker) Leave(inNode ast.Node) (node ast.Node, ok bool) { return inNode, true } -func (s *testParserSuite) TestSubquery(c *C) { +func TestSubquery(t *testing.T) { table := []testCase{ // for compare subquery {"SELECT 1 > (select 1)", true, "SELECT 1>(SELECT 1)"}, @@ -4306,10 +4309,15 @@ func (s *testParserSuite) TestSubquery(c *C) { {"SELECT t1.a AS a FROM ((SELECT a FROM t) AS t1)", true, "SELECT `t1`.`a` AS `a` FROM (SELECT `a` FROM `t`) AS `t1`"}, {"select count(*) from (select a, b from x1 union all select a, b from x3 union all (select x1.a, x3.b from (select * from x3 union all select * from x2) x3 left join x1 on x3.a = x1.b))", true, "SELECT COUNT(1) FROM (SELECT `a`,`b` FROM `x1` UNION ALL SELECT `a`,`b` FROM `x3` UNION ALL (SELECT `x1`.`a`,`x3`.`b` FROM (SELECT * FROM `x3` UNION ALL SELECT * FROM `x2`) AS `x3` LEFT JOIN `x1` ON `x3`.`a`=`x1`.`b`))"}, {"(SELECT 1 a,3 b) UNION (SELECT 2,1) ORDER BY (SELECT 2)", true, "(SELECT 1 AS `a`,3 AS `b`) UNION (SELECT 2,1) ORDER BY (SELECT 2)"}, + {"((select * from t1)) union (select * from t1)", true, "(SELECT * FROM `t1`) UNION (SELECT * FROM `t1`)"}, + {"(((select * from t1))) union (select * from t1)", true, "(SELECT * FROM `t1`) UNION (SELECT * FROM `t1`)"}, + {"select * from (((select * from t1)) union (select * from t1) union (select * from t1)) a", true, "SELECT * FROM ((SELECT * FROM `t1`) UNION (SELECT * FROM `t1`) UNION (SELECT * FROM `t1`)) AS `a`"}, + {"SELECT COUNT(*) FROM plan_executions WHERE (EXISTS((SELECT * FROM triggers WHERE plan_executions.trigger_id=triggers.id AND triggers.type='CRON')))", true, "SELECT COUNT(1) FROM `plan_executions` WHERE (EXISTS (SELECT * FROM `triggers` WHERE `plan_executions`.`trigger_id`=`triggers`.`id` AND `triggers`.`type`=_UTF8MB4'CRON'))"}, + {"select exists((select 1));", true, "SELECT EXISTS (SELECT 1)"}, {"select * from ((SELECT 1 a,3 b) UNION (SELECT 2,1) ORDER BY (SELECT 2)) t order by a,b", true, "SELECT * FROM ((SELECT 1 AS `a`,3 AS `b`) UNION (SELECT 2,1) ORDER BY (SELECT 2)) AS `t` ORDER BY `a`,`b`"}, {"select (select * from t1 where a != t.a union all (select * from t2 where a != t.a) order by a limit 1) from t1 t", true, "SELECT (SELECT * FROM `t1` WHERE `a`!=`t`.`a` UNION ALL (SELECT * FROM `t2` WHERE `a`!=`t`.`a`) ORDER BY `a` LIMIT 1) FROM `t1` AS `t`"}, } - s.RunTest(c, table) + RunTest(t, table, false) tests := []struct { input string @@ -4318,17 +4326,18 @@ func (s *testParserSuite) TestSubquery(c *C) { {"SELECT 1 > (select 1)", "select 1"}, {"SELECT 1 > (select 1 union select 2)", "select 1 union select 2"}, } - parser := parser.New() - for _, t := range tests { - stmt, err := parser.ParseOneStmt(t.input, "", "") - c.Assert(err, IsNil) + p := parser.New() + for _, tbl := range tests { + stmt, err := p.ParseOneStmt(tbl.input, "", "") + require.NoError(t, err) stmt.Accept(&subqueryChecker{ - text: t.text, - c: c, + text: tbl.text, + t: t, }) } } -func (s *testParserSuite) TestSetOperator(c *C) { + +func TestSetOperator(t *testing.T) { table := []testCase{ // union and union all {"select c1 from t1 union select c2 from t2", true, "SELECT `c1` FROM `t1` UNION SELECT `c2` FROM `t2`"}, @@ -4436,26 +4445,26 @@ func (s *testParserSuite) TestSetOperator(c *C) { {"((select c1 from t1) except select c2 from t2) intersect all (select c3 from t3) order by c1 limit 1", true, "((SELECT `c1` FROM `t1`) EXCEPT SELECT `c2` FROM `t2`) INTERSECT ALL (SELECT `c3` FROM `t3`) ORDER BY `c1` LIMIT 1"}, {"select 1 union distinct (select 1 except all select 1 intersect select 1)", true, "SELECT 1 UNION (SELECT 1 EXCEPT ALL SELECT 1 INTERSECT SELECT 1)"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func checkOrderBy(c *C, s ast.Node, hasOrderBy []bool, i int) int { +func checkOrderBy(t *testing.T, s ast.Node, hasOrderBy []bool, i int) int { switch x := s.(type) { case *ast.SelectStmt: - c.Assert(x.OrderBy != nil, Equals, hasOrderBy[i]) + require.Equal(t, hasOrderBy[i], x.OrderBy != nil) return i + 1 case *ast.SetOprSelectList: for _, sel := range x.Selects { - i = checkOrderBy(c, sel, hasOrderBy, i) + i = checkOrderBy(t, sel, hasOrderBy, i) } return i } return i } -func (s *testParserSuite) TestUnionOrderBy(c *C) { - parser := parser.New() - parser.EnableWindowFunc(s.enableWindowFunc) +func TestUnionOrderBy(t *testing.T) { + p := parser.New() + p.EnableWindowFunc(false) tests := []struct { src string @@ -4468,25 +4477,25 @@ func (s *testParserSuite) TestUnionOrderBy(c *C) { {"select 1 a, 2 b from dual", []bool{false}}, } - for _, t := range tests { - stmt, _, err := parser.Parse(t.src, "", "") - c.Assert(err, IsNil) + for _, tbl := range tests { + stmt, _, err := p.Parse(tbl.src, "", "") + require.NoError(t, err) us, ok := stmt[0].(*ast.SetOprStmt) if ok { var i int for _, s := range us.SelectList.Selects { - i = checkOrderBy(c, s, t.hasOrderBy, i) + i = checkOrderBy(t, s, tbl.hasOrderBy, i) } - c.Assert(us.OrderBy != nil, Equals, t.hasOrderBy[i]) + require.Equal(t, tbl.hasOrderBy[i], us.OrderBy != nil) } ss, ok := stmt[0].(*ast.SelectStmt) if ok { - c.Assert(ss.OrderBy != nil, Equals, t.hasOrderBy[0]) + require.Equal(t, tbl.hasOrderBy[0], ss.OrderBy != nil) } } } -func (s *testParserSuite) TestLikeEscape(c *C) { +func TestLikeEscape(t *testing.T) { table := []testCase{ // for like escape {`select "abc_" like "abc\\_" escape ''`, true, "SELECT _UTF8MB4'abc_' LIKE _UTF8MB4'abc\\_'"}, @@ -4496,10 +4505,10 @@ func (s *testParserSuite) TestLikeEscape(c *C) { {"select '''_' like '''_' escape ''''", true, "SELECT _UTF8MB4'''_' LIKE _UTF8MB4'''_' ESCAPE ''''"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestLockUnlockTables(c *C) { +func TestLockUnlockTables(t *testing.T) { table := []testCase{ {`UNLOCK TABLES;`, true, "UNLOCK TABLES"}, {`LOCK TABLES t1 READ;`, true, "LOCK TABLES `t1` READ"}, @@ -4528,10 +4537,11 @@ func (s *testParserSuite) TestLockUnlockTables(c *C) { {"ALTER TABLE t READ ONLY", true, "ALTER TABLE `t` READ ONLY"}, {"ALTER TABLE t READ WRITE", true, "ALTER TABLE `t` READ WRITE"}, } - s.RunTest(c, table) + + RunTest(t, table, false) } -func (s *testParserSuite) TestIndexHint(c *C) { +func TestIndexHint(t *testing.T) { table := []testCase{ {`select * from t use index (primary)`, true, "SELECT * FROM `t` USE INDEX (`primary`)"}, {"select * from t use index (`primary`)", true, "SELECT * FROM `t` USE INDEX (`primary`)"}, @@ -4544,10 +4554,11 @@ func (s *testParserSuite) TestIndexHint(c *C) { {`select * from t force index for group by (idx1)`, true, "SELECT * FROM `t` FORCE INDEX FOR GROUP BY (`idx1`)"}, {`select * from t use index for group by (idx1) use index for order by (idx2), t2`, true, "SELECT * FROM (`t` USE INDEX FOR GROUP BY (`idx1`) USE INDEX FOR ORDER BY (`idx2`)) JOIN `t2`"}, } - s.RunTest(c, table) + + RunTest(t, table, false) } -func (s *testParserSuite) TestPriority(c *C) { +func TestPriority(t *testing.T) { table := []testCase{ {`select high_priority * from t`, true, "SELECT HIGH_PRIORITY * FROM `t`"}, {`select low_priority * from t`, true, "SELECT LOW_PRIORITY * FROM `t`"}, @@ -4565,16 +4576,16 @@ func (s *testParserSuite) TestPriority(c *C) { {`replace LOW_PRIORITY into t values (1)`, true, "REPLACE LOW_PRIORITY INTO `t` VALUES (1)"}, {`replace delayed into t values (1)`, true, "REPLACE DELAYED INTO `t` VALUES (1)"}, } - s.RunTest(c, table) + RunTest(t, table, false) - parser := parser.New() - stmt, _, err := parser.Parse("select HIGH_PRIORITY * from t", "", "") - c.Assert(err, IsNil) + p := parser.New() + stmt, _, err := p.Parse("select HIGH_PRIORITY * from t", "", "") + require.NoError(t, err) sel := stmt[0].(*ast.SelectStmt) - c.Assert(sel.SelectStmtOpts.Priority, Equals, mysql.HighPriority) + require.Equal(t, mysql.HighPriority, sel.SelectStmtOpts.Priority) } -func (s *testParserSuite) TestSQLResult(c *C) { +func TestSQLResult(t *testing.T) { table := []testCase{ {`select SQL_BIG_RESULT c1 from t group by c1`, true, "SELECT SQL_BIG_RESULT `c1` FROM `t` GROUP BY `c1`"}, {`select SQL_SMALL_RESULT c1 from t group by c1`, true, "SELECT SQL_SMALL_RESULT `c1` FROM `t` GROUP BY `c1`"}, @@ -4583,27 +4594,28 @@ func (s *testParserSuite) TestSQLResult(c *C) { {`select STRAIGHT_JOIN SQL_SMALL_RESULT * from t`, true, "SELECT SQL_SMALL_RESULT STRAIGHT_JOIN * FROM `t`"}, {`select SQL_CALC_FOUND_ROWS DISTINCT * from t`, true, "SELECT SQL_CALC_FOUND_ROWS DISTINCT * FROM `t`"}, } - s.RunTest(c, table) + + RunTest(t, table, false) } -func (s *testParserSuite) TestSQLNoCache(c *C) { +func TestSQLNoCache(t *testing.T) { table := []testCase{ {`select SQL_NO_CACHE * from t`, false, ""}, {`select SQL_CACHE * from t`, true, "SELECT * FROM `t`"}, {`select * from t`, true, "SELECT * FROM `t`"}, } - parser := parser.New() - for _, tt := range table { - stmt, _, err := parser.Parse(tt.src, "", "") - c.Assert(err, IsNil) + p := parser.New() + for _, tbl := range table { + stmt, _, err := p.Parse(tbl.src, "", "") + require.NoError(t, err) sel := stmt[0].(*ast.SelectStmt) - c.Assert(sel.SelectStmtOpts.SQLCache, Equals, tt.ok) + require.Equal(t, tbl.ok, sel.SelectStmtOpts.SQLCache) } } -func (s *testParserSuite) TestEscape(c *C) { +func TestEscape(t *testing.T) { table := []testCase{ {`select """;`, false, ""}, {`select """";`, true, "SELECT _UTF8MB4'\"'"}, @@ -4613,20 +4625,10 @@ func (s *testParserSuite) TestEscape(c *C) { {`select "\a\r\n"`, true, "SELECT _UTF8MB4'a\r\n'"}, {`select "\xFF"`, true, "SELECT _UTF8MB4'xFF'"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestInsertStatementMemoryAllocation(c *C) { - sql := "insert t values (1)" + strings.Repeat(",(1)", 1000) - var oldStats, newStats runtime.MemStats - runtime.ReadMemStats(&oldStats) - _, err := parser.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) { +func TestExplain(t *testing.T) { table := []testCase{ {"explain select c1 from t1", true, "EXPLAIN FORMAT = 'row' SELECT `c1` FROM `t1`"}, {"explain delete t1, t2 from t1 inner join t2 inner join t3 where t1.id=t2.id and t2.id=t3.id;", true, "EXPLAIN FORMAT = 'row' DELETE `t1`,`t2` FROM (`t1` JOIN `t2`) JOIN `t3` WHERE `t1`.`id`=`t2`.`id` AND `t2`.`id`=`t3`.`id`"}, @@ -4670,36 +4672,36 @@ func (s *testParserSuite) TestExplain(c *C) { {"EXPLAIN ALTER TABLE t1 ADD INDEX (a)", true, "EXPLAIN FORMAT = 'row' ALTER TABLE `t1` ADD INDEX(`a`)"}, {"EXPLAIN ALTER TABLE t1 ADD a varchar(255)", true, "EXPLAIN FORMAT = 'row' ALTER TABLE `t1` ADD COLUMN `a` VARCHAR(255)"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestPrepare(c *C) { +func TestPrepare(t *testing.T) { table := []testCase{ {"PREPARE pname FROM 'SELECT ?'", true, "PREPARE `pname` FROM 'SELECT ?'"}, {"PREPARE pname FROM @test", true, "PREPARE `pname` FROM @`test`"}, {"PREPARE `` FROM @test", true, "PREPARE `` FROM @`test`"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestDeallocate(c *C) { +func TestDeallocate(t *testing.T) { table := []testCase{ {"DEALLOCATE PREPARE test", true, "DEALLOCATE PREPARE `test`"}, {"DEALLOCATE PREPARE ``", true, "DEALLOCATE PREPARE ``"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestExecute(c *C) { +func TestExecute(t *testing.T) { table := []testCase{ {"EXECUTE test", true, "EXECUTE `test`"}, {"EXECUTE test USING @var1,@var2", true, "EXECUTE `test` USING @`var1`,@`var2`"}, {"EXECUTE `` USING @var1,@var2", true, "EXECUTE `` USING @`var1`,@`var2`"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestTrace(c *C) { +func TestTrace(t *testing.T) { table := []testCase{ {"trace begin", true, "TRACE START TRANSACTION"}, {"trace commit", true, "TRACE COMMIT"}, @@ -4713,11 +4715,14 @@ func (s *testParserSuite) TestTrace(c *C) { {"trace select c1 from t1 union (select c2 from t2) limit 1, 1", true, "TRACE SELECT `c1` FROM `t1` UNION (SELECT `c2` FROM `t2`) LIMIT 1,1"}, {"trace format = 'row' select c1 from t1 union (select c2 from t2) limit 1, 1", true, "TRACE SELECT `c1` FROM `t1` UNION (SELECT `c2` FROM `t2`) LIMIT 1,1"}, {"trace format = 'json' update t set id = id + 1 order by id desc;", true, "TRACE FORMAT = 'json' UPDATE `t` SET `id`=`id`+1 ORDER BY `id` DESC"}, + {"trace plan select c1 from t1", true, "TRACE PLAN SELECT `c1` FROM `t1`"}, + {"trace plan target = 'estimation' select c1 from t1", true, "TRACE PLAN TARGET = 'estimation' SELECT `c1` FROM `t1`"}, + {"trace plan target = 'arandomstring' select c1 from t1", true, "TRACE PLAN TARGET = 'arandomstring' SELECT `c1` FROM `t1`"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestBinding(c *C) { +func TestBinding(t *testing.T) { table := []testCase{ {"create global binding for select * from t using select * from t use index(a)", true, "CREATE GLOBAL BINDING FOR SELECT * FROM `t` USING SELECT * FROM `t` USE INDEX (`a`)"}, {"create session binding for select * from t using select * from t use index(a)", true, "CREATE SESSION BINDING FOR SELECT * FROM `t` USING SELECT * FROM `t` USE INDEX (`a`)"}, @@ -4778,19 +4783,19 @@ func (s *testParserSuite) TestBinding(c *C) { {"DROP GLOBAL BINDING FOR REPLACE INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING REPLACE INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1", true, "DROP GLOBAL BINDING FOR REPLACE INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING REPLACE INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1"}, {"DROP SESSION BINDING FOR REPLACE INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING REPLACE INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1", true, "DROP SESSION BINDING FOR REPLACE INTO `t1` SELECT * FROM `t2` WHERE `t2`.`a`=1 USING REPLACE INTO `t1` SELECT /*+ USE_INDEX(`t2` `a`)*/ * FROM `t2` WHERE `t2`.`a`=1"}, } - s.RunTest(c, table) + RunTest(t, table, false) p := parser.New() sms, _, err := p.Parse("create global binding for select * from t using select * from t use index(a)", "", "") - c.Assert(err, IsNil) + require.NoError(t, err) v, ok := sms[0].(*ast.CreateBindingStmt) - c.Assert(ok, IsTrue) - c.Assert(v.OriginNode.Text(), Equals, "select * from t") - c.Assert(v.HintedNode.Text(), Equals, "select * from t use index(a)") - c.Assert(v.GlobalScope, IsTrue) + require.True(t, ok) + require.Equal(t, "select * from t", v.OriginNode.Text()) + require.Equal(t, "select * from t use index(a)", v.HintedNode.Text()) + require.True(t, v.GlobalScope) } -func (s *testParserSuite) TestView(c *C) { +func TestView(t *testing.T) { table := []testCase{ {"create view v as select * from t", true, "CREATE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t`"}, {"create or replace view v as select * from t", true, "CREATE OR REPLACE ALGORITHM = UNDEFINED DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t`"}, @@ -4861,18 +4866,18 @@ func (s *testParserSuite) TestView(c *C) { {"create or replace algorithm = merge definer = 'root' sql security invoker view v(a,b) as (select * from t union all select * from t) with cascaded check option", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = `root`@`%` SQL SECURITY INVOKER VIEW `v` (`a`,`b`) AS (SELECT * FROM `t` UNION ALL SELECT * FROM `t`)"}, {"create or replace algorithm = merge definer = current_user view v as select * from t union all select * from t", true, "CREATE OR REPLACE ALGORITHM = MERGE DEFINER = CURRENT_USER SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM `t` UNION ALL SELECT * FROM `t`"}, } - s.RunTest(c, table) + RunTest(t, table, false) // Test case for the text of the select statement in create view statement. p := parser.New() sms, _, err := p.Parse("create view v as select * from t", "", "") - c.Assert(err, IsNil) + require.NoError(t, err) v, ok := sms[0].(*ast.CreateViewStmt) - c.Assert(ok, IsTrue) - c.Assert(v.Algorithm, Equals, model.AlgorithmUndefined) - c.Assert(v.Select.Text(), Equals, "select * from t") - c.Assert(v.Security, Equals, model.SecurityDefiner) - c.Assert(v.CheckOption, Equals, model.CheckOptionCascaded) + require.True(t, ok) + require.Equal(t, model.AlgorithmUndefined, v.Algorithm) + require.Equal(t, "select * from t", v.Select.Text()) + require.Equal(t, model.SecurityDefiner, v.Security) + require.Equal(t, model.CheckOptionCascaded, v.CheckOption) src := `CREATE OR REPLACE ALGORITHM = UNDEFINED DEFINER = root@localhost SQL SECURITY DEFINER @@ -4881,39 +4886,39 @@ func (s *testParserSuite) TestView(c *C) { var st ast.StmtNode st, err = p.ParseOneStmt(src, "", "") - c.Assert(err, IsNil) + require.NoError(t, err) v, ok = st.(*ast.CreateViewStmt) - c.Assert(ok, IsTrue) - c.Assert(v.OrReplace, IsTrue) - c.Assert(v.Algorithm, Equals, model.AlgorithmUndefined) - c.Assert(v.Definer.Username, Equals, "root") - c.Assert(v.Definer.Hostname, Equals, "localhost") - c.Assert(v.Cols[0], Equals, model.NewCIStr("a")) - c.Assert(v.Cols[1], Equals, model.NewCIStr("b")) - c.Assert(v.Cols[2], Equals, model.NewCIStr("c")) - c.Assert(v.Select.Text(), Equals, "select c,d,e from t") - c.Assert(v.Security, Equals, model.SecurityDefiner) - c.Assert(v.CheckOption, Equals, model.CheckOptionCascaded) + require.True(t, ok) + require.True(t, v.OrReplace) + require.Equal(t, model.AlgorithmUndefined, v.Algorithm) + require.Equal(t, "root", v.Definer.Username) + require.Equal(t, "localhost", v.Definer.Hostname) + require.Equal(t, model.NewCIStr("a"), v.Cols[0]) + require.Equal(t, model.NewCIStr("b"), v.Cols[1]) + require.Equal(t, model.NewCIStr("c"), v.Cols[2]) + require.Equal(t, "select c,d,e from t", v.Select.Text()) + require.Equal(t, model.SecurityDefiner, v.Security) + require.Equal(t, model.CheckOptionCascaded, v.CheckOption) } -func (s *testParserSuite) TestTimestampDiffUnit(c *C) { +func TestTimestampDiffUnit(t *testing.T) { // Test case for timestampdiff unit. // TimeUnit should be unified to upper case. - parser := 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) + p := parser.New() + stmt, _, err := p.Parse("SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01'), TIMESTAMPDIFF(month,'2003-02-01','2003-05-01');", "", "") + require.NoError(t, err) ss := stmt[0].(*ast.SelectStmt) fields := ss.Fields.Fields - c.Assert(len(fields), Equals, 2) + require.Len(t, fields, 2) expr := fields[0].Expr f, ok := expr.(*ast.FuncCallExpr) - c.Assert(ok, IsTrue) - c.Assert(f.Args[0].(*ast.TimeUnitExpr).Unit, Equals, ast.TimeUnitMonth) + require.True(t, ok) + require.Equal(t, ast.TimeUnitMonth, f.Args[0].(*ast.TimeUnitExpr).Unit) expr = fields[1].Expr f, ok = expr.(*ast.FuncCallExpr) - c.Assert(ok, IsTrue) - c.Assert(f.Args[0].(*ast.TimeUnitExpr).Unit, Equals, ast.TimeUnitMonth) + require.True(t, ok) + require.Equal(t, ast.TimeUnitMonth, f.Args[0].(*ast.TimeUnitExpr).Unit) // Test Illegal TimeUnit for TimestampDiff table := []testCase{ @@ -4929,36 +4934,36 @@ func (s *testParserSuite) TestTimestampDiffUnit(c *C) { {"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) + RunTest(t, table, false) } -func (s *testParserSuite) TestFuncCallExprOffset(c *C) { +func TestFuncCallExprOffset(t *testing.T) { // Test case for offset field on func call expr. p := parser.New() stmt, _, err := p.Parse("SELECT s.a(), b();", "", "") - c.Assert(err, IsNil) + require.NoError(t, err) ss := stmt[0].(*ast.SelectStmt) fields := ss.Fields.Fields - c.Assert(len(fields), Equals, 2) + require.Len(t, fields, 2) { // s.a() expr := fields[0].Expr f, ok := expr.(*ast.FuncCallExpr) - c.Assert(ok, IsTrue) - c.Assert(f.OriginTextPosition(), Equals, 7) + require.True(t, ok) + require.Equal(t, 7, f.OriginTextPosition()) } { // b() expr := fields[1].Expr f, ok := expr.(*ast.FuncCallExpr) - c.Assert(ok, IsTrue) - c.Assert(f.OriginTextPosition(), Equals, 14) + require.True(t, ok) + require.Equal(t, 14, f.OriginTextPosition()) } } -func (s *testParserSuite) TestSessionManage(c *C) { +func TestSessionManage(t *testing.T) { table := []testCase{ // Kill statement. // See https://dev.mysql.com/doc/refman/5.7/en/kill.html @@ -4973,64 +4978,64 @@ func (s *testParserSuite) TestSessionManage(c *C) { {"shutdown", true, "SHUTDOWN"}, {"restart", true, "RESTART"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestParseShowOpenTables(c *C) { +func TestParseShowOpenTables(t *testing.T) { table := []testCase{ {"SHOW OPEN TABLES", true, "SHOW OPEN TABLES"}, {"SHOW OPEN TABLES IN test", true, "SHOW OPEN TABLES IN `test`"}, {"SHOW OPEN TABLES FROM test", true, "SHOW OPEN TABLES IN `test`"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestSQLModeANSIQuotes(c *C) { - parser := parser.New() - parser.SetSQLMode(mysql.ModeANSIQuotes) +func TestSQLModeANSIQuotes(t *testing.T) { + p := parser.New() + p.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) + _, _, err := p.Parse(test, "", "") + require.NoError(t, err) } } -func (s *testParserSuite) TestDDLStatements(c *C) { - parser := parser.New() +func TestDDLStatements(t *testing.T) { + p := 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) + stmts, _, err := p.Parse(createTableStr, "", "") + require.NoError(t, err) stmt := stmts[0].(*ast.CreateTableStmt) - c.Assert(mysql.HasBinaryFlag(stmt.Cols[0].Tp.Flag), IsTrue) + require.True(t, mysql.HasBinaryFlag(stmt.Cols[0].Tp.Flag)) for _, colDef := range stmt.Cols[1:] { - c.Assert(mysql.HasBinaryFlag(colDef.Tp.Flag), IsFalse) + require.False(t, mysql.HasBinaryFlag(colDef.Tp.Flag)) } for _, tblOpt := range stmt.Options { switch tblOpt.Tp { case ast.TableOptionCharset: - c.Assert(tblOpt.StrValue, Equals, "utf8") + require.Equal(t, "utf8", tblOpt.StrValue) case ast.TableOptionCollate: - c.Assert(tblOpt.StrValue, Equals, "utf8_bin") + require.Equal(t, "utf8_bin", tblOpt.StrValue) } } createTableStr = `CREATE TABLE t ( a varbinary(64), b binary(10), c blob)` - stmts, _, err = parser.Parse(createTableStr, "", "") - c.Assert(err, IsNil) + stmts, _, err = p.Parse(createTableStr, "", "") + require.NoError(t, err) 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) + require.Equal(t, charset.CharsetBin, colDef.Tp.Charset) + require.Equal(t, charset.CollationBin, colDef.Tp.Collate) + require.True(t, mysql.HasBinaryFlag(colDef.Tp.Flag)) } // Test set collate for all column types createTableStr = `CREATE TABLE t ( @@ -5061,24 +5066,23 @@ func (s *testParserSuite) TestDDLStatements(c *C) { c_enum enum('1') collate utf8_bin, c_set set('1') collate utf8_bin, c_json json collate utf8_bin)` - _, _, err = parser.Parse(createTableStr, "", "") - c.Assert(err, IsNil) + _, _, err = p.Parse(createTableStr, "", "") + require.NoError(t, err) createTableStr = `CREATE TABLE t (c_double double(10))` - _, _, err = parser.Parse(createTableStr, "", "") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[parser:1149]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use") - parser.SetStrictDoubleTypeCheck(false) - _, _, err = parser.Parse(createTableStr, "", "") - c.Assert(err, IsNil) - parser.SetStrictDoubleTypeCheck(true) + _, _, err = p.Parse(createTableStr, "", "") + require.EqualError(t, err, "[parser:1149]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use") + p.SetStrictDoubleTypeCheck(false) + _, _, err = p.Parse(createTableStr, "", "") + require.NoError(t, err) + p.SetStrictDoubleTypeCheck(true) createTableStr = `CREATE TABLE t (c_double double(10, 2))` - _, _, err = parser.Parse(createTableStr, "", "") - c.Assert(err, IsNil) + _, _, err = p.Parse(createTableStr, "", "") + require.NoError(t, err) } -func (s *testParserSuite) TestAnalyze(c *C) { +func TestAnalyze(t *testing.T) { table := []testCase{ {"analyze table t1", true, "ANALYZE TABLE `t1`"}, {"analyze table t1.*", false, ""}, @@ -5103,21 +5107,32 @@ func (s *testParserSuite) TestAnalyze(c *C) { {"analyze table t drop histogram on b", true, "ANALYZE TABLE `t` DROP HISTOGRAM ON `b`"}, {"analyze table t update histogram on c1, c2;", true, "ANALYZE TABLE `t` UPDATE HISTOGRAM ON `c1`,`c2`"}, {"analyze table t drop histogram on c1, c2;", true, "ANALYZE TABLE `t` DROP HISTOGRAM ON `c1`,`c2`"}, + {"analyze table t update histogram on t.c1, t.c2", false, ""}, + {"analyze table t drop histogram on t.c1, t.c2", false, ""}, + {"analyze table t1,t2 all columns", true, "ANALYZE TABLE `t1`,`t2` ALL COLUMNS"}, + {"analyze table t partition a all columns", true, "ANALYZE TABLE `t` PARTITION `a` ALL COLUMNS"}, + {"analyze table t1,t2 all columns with 4 topn", true, "ANALYZE TABLE `t1`,`t2` ALL COLUMNS WITH 4 TOPN"}, + {"analyze table t partition a all columns with 1024 buckets", true, "ANALYZE TABLE `t` PARTITION `a` ALL COLUMNS WITH 1024 BUCKETS"}, {"analyze table t1,t2 predicate columns", true, "ANALYZE TABLE `t1`,`t2` PREDICATE COLUMNS"}, {"analyze table t partition a predicate columns", true, "ANALYZE TABLE `t` PARTITION `a` PREDICATE COLUMNS"}, {"analyze table t1,t2 predicate columns with 4 topn", true, "ANALYZE TABLE `t1`,`t2` PREDICATE COLUMNS WITH 4 TOPN"}, {"analyze table t partition a predicate columns with 1024 buckets", true, "ANALYZE TABLE `t` PARTITION `a` PREDICATE COLUMNS WITH 1024 BUCKETS"}, {"analyze table t columns c1,c2", true, "ANALYZE TABLE `t` COLUMNS `c1`,`c2`"}, {"analyze table t partition a columns c1,c2", true, "ANALYZE TABLE `t` PARTITION `a` COLUMNS `c1`,`c2`"}, + {"analyze table t columns t.c1,t.c2", false, ""}, + {"analyze table t partition a columns t.c1,t.c2", false, ""}, {"analyze table t columns c1,c2 with 4 topn", true, "ANALYZE TABLE `t` COLUMNS `c1`,`c2` WITH 4 TOPN"}, {"analyze table t partition a columns c1,c2 with 1024 buckets", true, "ANALYZE TABLE `t` PARTITION `a` COLUMNS `c1`,`c2` WITH 1024 BUCKETS"}, {"analyze table t index a columns c", false, ""}, + {"analyze table t index a all columns", false, ""}, {"analyze table t index a predicate columns", false, ""}, + {"analyze table t with 10 samplerate", true, "ANALYZE TABLE `t` WITH 10 SAMPLERATE"}, + {"analyze table t with 0.1 samplerate", true, "ANALYZE TABLE `t` WITH 0.1 SAMPLERATE"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestTableSample(c *C) { +func TestTableSample(t *testing.T) { table := []testCase{ // positive test cases {"select * from tbl tablesample system (50);", true, "SELECT * FROM `tbl` TABLESAMPLE SYSTEM (50)"}, @@ -5152,7 +5167,7 @@ func (s *testParserSuite) TestTableSample(c *C) { {"select * from tbl tablesample system (33) repeatable;", false, ""}, {"select 1 from dual tablesample system (50);", false, ""}, } - s.RunTest(c, table) + RunTest(t, table, false) p := parser.New() cases := []string{ "select * from tbl tablesample (33.3 + 44.4);", @@ -5169,13 +5184,12 @@ func (s *testParserSuite) TestTableSample(c *C) { "update tbl tablesample regions() set id = '1'", } for _, sql := range cases { - comment := Commentf("source %v", sql) _, err := p.ParseOneStmt(sql, "", "") - c.Assert(err, IsNil, comment) + require.NoErrorf(t, err, "source %v", sql) } } -func (s *testParserSuite) TestGeneratedColumn(c *C) { +func TestGeneratedColumn(t *testing.T) { tests := []struct { input string ok bool @@ -5185,27 +5199,26 @@ func (s *testParserSuite) TestGeneratedColumn(c *C) { {"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 := parser.New() - for _, tt := range tests { - stmtNodes, _, err := parser.Parse(tt.input, "", "") - if tt.ok { - c.Assert(err, IsNil) + p := parser.New() + for _, tbl := range tests { + stmtNodes, _, err := p.Parse(tbl.input, "", "") + if tbl.ok { + require.NoError(t, err) 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) + require.Equal(t, tbl.expr, opt.Expr.Text()) } } } } else { - c.Assert(err, NotNil) + require.Error(t, err) } } - } -func (s *testParserSuite) TestSetTransaction(c *C) { +func TestSetTransaction(t *testing.T) { // Set transaction is equivalent to setting the global or session value of tx_isolation. // For example: // SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED @@ -5224,31 +5237,31 @@ func (s *testParserSuite) TestSetTransaction(c *C) { true, "REPEATABLE-READ", }, } - parser := parser.New() - for _, t := range tests { - stmt1, err := parser.ParseOneStmt(t.input, "", "") - c.Assert(err, IsNil) + p := parser.New() + for _, tbl := range tests { + stmt1, err := p.ParseOneStmt(tbl.input, "", "") + require.NoError(t, err) setStmt := stmt1.(*ast.SetStmt) vars := setStmt.Variables[0] - c.Assert(vars.Name, Equals, "tx_isolation") - c.Assert(vars.IsGlobal, Equals, t.isGlobal) - c.Assert(vars.IsSystem, Equals, true) - c.Assert(vars.Value.(ast.ValueExpr).GetValue(), Equals, t.value) + require.Equal(t, "tx_isolation", vars.Name) + require.Equal(t, tbl.isGlobal, vars.IsGlobal) + require.Equal(t, true, vars.IsSystem) + require.Equal(t, tbl.value, vars.Value.(ast.ValueExpr).GetValue()) } } -func (s *testParserSuite) TestSideEffect(c *C) { +func TestSideEffect(t *testing.T) { // 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 := parser.New() - _, err := parser.ParseOneStmt("create table t /*!50100 'abc', 'abc' */;", "", "") - c.Assert(err, NotNil) + p := parser.New() + _, err := p.ParseOneStmt("create table t /*!50100 'abc', 'abc' */;", "", "") + require.Error(t, err) - _, err = parser.ParseOneStmt("show tables;", "", "") - c.Assert(err, IsNil) + _, err = p.ParseOneStmt("show tables;", "", "") + require.NoError(t, err) } -func (s *testParserSuite) TestTablePartition(c *C) { +func TestTablePartition(t *testing.T) { table := []testCase{ {"ALTER TABLE t1 TRUNCATE PARTITION p0", true, "ALTER TABLE `t1` TRUNCATE PARTITION `p0`"}, {"ALTER TABLE t1 TRUNCATE PARTITION p0, p1", true, "ALTER TABLE `t1` TRUNCATE PARTITION `p0`,`p1`"}, @@ -5436,72 +5449,70 @@ ENGINE=INNODB PARTITION BY LINEAR HASH (a) PARTITIONS 1;`, true, "CREATE TABLE ` "CREATE TABLE `t1` (`a` INT,`b` INT) PARTITION BY RANGE (`a`) SUBPARTITION BY HASH (`b`) SUBPARTITIONS 1 (PARTITION `x` VALUES LESS THAN (MAXVALUE) (SUBPARTITION `y` ENGINE = InnoDB COMMENT = 'xxxx' DATA DIRECTORY = '/var/data' INDEX DIRECTORY = '/var/index' MAX_ROWS = 70000 MIN_ROWS = 50 TABLESPACE = `innodb_file_per_table` NODEGROUP = 255))", }, } - s.RunTest(c, table) + RunTest(t, table, false) // Check comment content. - parser := 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) + p := parser.New() + stmt, err := p.ParseOneStmt("create table t (id int) partition by range (id) (partition p0 values less than (10) comment 'check')", "", "") + require.NoError(t, err) createTable := stmt.(*ast.CreateTableStmt) comment, ok := createTable.Partition.Definitions[0].Comment() - c.Assert(ok, IsTrue) - c.Assert(comment, Equals, "check") + require.True(t, ok) + require.Equal(t, "check", comment) } -func (s *testParserSuite) TestTablePartitionNameList(c *C) { +func TestTablePartitionNameList(t *testing.T) { table := []testCase{ {`select * from t partition (p0,p1)`, true, ""}, } - parser := parser.New() - for _, tt := range table { - stmt, _, err := parser.Parse(tt.src, "", "") - c.Assert(err, IsNil) + p := parser.New() + for _, tbl := range table { + stmt, _, err := p.Parse(tbl.src, "", "") + require.NoError(t, err) sel := stmt[0].(*ast.SelectStmt) source, ok := sel.From.TableRefs.Left.(*ast.TableSource) - c.Assert(ok, IsTrue) + require.True(t, ok) tableName, ok := source.Source.(*ast.TableName) - c.Assert(ok, IsTrue) - c.Assert(len(tableName.PartitionNames), Equals, 2) - c.Assert(tableName.PartitionNames[0], Equals, model.CIStr{O: "p0", L: "p0"}) - c.Assert(tableName.PartitionNames[1], Equals, model.CIStr{O: "p1", L: "p1"}) + require.True(t, ok) + require.Len(t, tableName.PartitionNames, 2) + require.Equal(t, model.CIStr{O: "p0", L: "p0"}, tableName.PartitionNames[0]) + require.Equal(t, model.CIStr{O: "p1", L: "p1"}, tableName.PartitionNames[1]) } } -func (s *testParserSuite) TestNotExistsSubquery(c *C) { +func TestNotExistsSubquery(t *testing.T) { table := []testCase{ {`select * from t1 where not exists (select * from t2 where t1.a = t2.a)`, true, ""}, } - parser := parser.New() - for _, tt := range table { - stmt, _, err := parser.Parse(tt.src, "", "") - c.Assert(err, IsNil) + p := parser.New() + for _, tbl := range table { + stmt, _, err := p.Parse(tbl.src, "", "") + require.NoError(t, err) sel := stmt[0].(*ast.SelectStmt) exists, ok := sel.Where.(*ast.ExistsSubqueryExpr) - c.Assert(ok, IsTrue) - c.Assert(exists.Not, Equals, tt.ok) + require.True(t, ok) + require.Equal(t, tbl.ok, exists.Not) } } -func (s *testParserSuite) TestWindowFunctionIdentifier(c *C) { +func TestWindowFunctionIdentifier(t *testing.T) { var table []testCase - s.enableWindowFunc = true for key := range parser.WindowFuncTokenMapForTest { table = append(table, testCase{fmt.Sprintf("select 1 %s", key), false, fmt.Sprintf("SELECT 1 AS `%s`", key)}) } - s.RunTest(c, table) + RunTest(t, table, true) - s.enableWindowFunc = false for i := range table { table[i].ok = true } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestWindowFunctions(c *C) { +func TestWindowFunctions(t *testing.T) { table := []testCase{ // For window function descriptions. // See https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html @@ -5570,15 +5581,14 @@ func (s *testParserSuite) TestWindowFunctions(c *C) { {`select from_unixtime(404411537129996288)`, true, "SELECT FROM_UNIXTIME(404411537129996288)"}, {`select from_unixtime(404411537129996288.22)`, true, "SELECT FROM_UNIXTIME(404411537129996288.22)"}, } - s.enableWindowFunc = true - s.RunTest(c, table) + RunTest(t, table, true) } type windowFrameBoundChecker struct { fb *ast.FrameBound exprRc int unit ast.TimeUnitType - c *C + t *testing.T } // Enter implements ast.Visitor interface. @@ -5587,7 +5597,7 @@ func (wfc *windowFrameBoundChecker) Enter(inNode ast.Node) (outNode ast.Node, sk wfc.fb = inNode.(*ast.FrameBound) if wfc.fb.Unit != ast.TimeUnitInvalid { _, ok := wfc.fb.Expr.(ast.ValueExpr) - wfc.c.Assert(ok, IsFalse) + require.False(wfc.t, ok) } } return inNode, false @@ -5609,9 +5619,9 @@ func (wfc *windowFrameBoundChecker) Leave(inNode ast.Node) (node ast.Node, ok bo // For issue #51 // See https://github.com/pingcap/parser/pull/51 for details -func (s *testParserSuite) TestVisitFrameBound(c *C) { - parser := parser.New() - parser.EnableWindowFunc(true) +func TestVisitFrameBound(t *testing.T) { + p := parser.New() + p.EnableWindowFunc(true) table := []struct { s string exprRc int @@ -5621,23 +5631,23 @@ func (s *testParserSuite) TestVisitFrameBound(c *C) { {`SELECT AVG(val) OVER (RANGE 5 PRECEDING) FROM t;`, 1, ast.TimeUnitInvalid}, {`SELECT AVG(val) OVER () FROM t;`, 0, ast.TimeUnitInvalid}, } - for _, t := range table { - stmt, err := parser.ParseOneStmt(t.s, "", "") - c.Assert(err, IsNil) - checker := windowFrameBoundChecker{c: c} + for _, tbl := range table { + stmt, err := p.ParseOneStmt(tbl.s, "", "") + require.NoError(t, err) + checker := windowFrameBoundChecker{t: t} stmt.Accept(&checker) - c.Assert(checker.exprRc, Equals, t.exprRc) - c.Assert(checker.unit, Equals, t.unit) + require.Equal(t, tbl.exprRc, checker.exprRc) + require.Equal(t, tbl.unit, checker.unit) } } -func (s *testParserSuite) TestFieldText(c *C) { - parser := parser.New() - stmts, _, err := parser.Parse("select a from t", "", "") - c.Assert(err, IsNil) +func TestFieldText(t *testing.T) { + p := parser.New() + stmts, _, err := p.Parse("select a from t", "", "") + require.NoError(t, err) tmp := stmts[0].(*ast.SelectStmt) - c.Assert(tmp.Fields.Fields[0].Text(), Equals, "a") + require.Equal(t, "a", tmp.Fields.Fields[0].Text()) sqls := []string{ "trace select a from t", @@ -5645,24 +5655,24 @@ func (s *testParserSuite) TestFieldText(c *C) { "trace format = 'json' select a from t", } for _, sql := range sqls { - stmts, _, err = parser.Parse(sql, "", "") - c.Assert(err, IsNil) + stmts, _, err = p.Parse(sql, "", "") + require.NoError(t, err) traceStmt := stmts[0].(*ast.TraceStmt) - c.Assert(traceStmt.Text(), Equals, sql) - c.Assert(traceStmt.Stmt.Text(), Equals, "select a from t") + require.Equal(t, sql, traceStmt.Text()) + require.Equal(t, "select a from t", traceStmt.Stmt.Text()) } } // See https://github.com/pingcap/parser/issue/94 -func (s *testParserSuite) TestQuotedSystemVariables(c *C) { - parser := parser.New() +func TestQuotedSystemVariables(t *testing.T) { + p := parser.New() - st, err := parser.ParseOneStmt( + st, err := p.ParseOneStmt( "select @@Sql_Mode, @@`SQL_MODE`, @@session.`sql_mode`, @@global.`s ql``mode`, @@session.'sql\\nmode', @@local.\"sql\\\"mode\";", "", "", ) - c.Assert(err, IsNil) + require.NoError(t, err) ss := st.(*ast.SelectStmt) expected := []*ast.VariableExpr{ { @@ -5703,27 +5713,27 @@ func (s *testParserSuite) TestQuotedSystemVariables(c *C) { }, } - c.Assert(len(ss.Fields.Fields), Equals, len(expected)) + require.Len(t, ss.Fields.Fields, len(expected)) for i, field := range ss.Fields.Fields { ve := field.Expr.(*ast.VariableExpr) - cmt := Commentf("field %d, ve = %v", i, ve) - c.Assert(ve.Name, Equals, expected[i].Name, cmt) - c.Assert(ve.IsGlobal, Equals, expected[i].IsGlobal, cmt) - c.Assert(ve.IsSystem, Equals, expected[i].IsSystem, cmt) - c.Assert(ve.ExplicitScope, Equals, expected[i].ExplicitScope, cmt) + comment := fmt.Sprintf("field %d, ve = %v", i, ve) + require.Equal(t, expected[i].Name, ve.Name, comment) + require.Equal(t, expected[i].IsGlobal, ve.IsGlobal, comment) + require.Equal(t, expected[i].IsSystem, ve.IsSystem, comment) + require.Equal(t, expected[i].ExplicitScope, ve.ExplicitScope, comment) } } // See https://github.com/pingcap/parser/issue/95 -func (s *testParserSuite) TestQuotedVariableColumnName(c *C) { - parser := parser.New() +func TestQuotedVariableColumnName(t *testing.T) { + p := parser.New() - st, err := parser.ParseOneStmt( + st, err := p.ParseOneStmt( "select @abc, @`abc`, @'aBc', @\"AbC\", @6, @`6`, @'6', @\"6\", @@sql_mode, @@`sql_mode`, @;", "", "", ) - c.Assert(err, IsNil) + require.NoError(t, err) ss := st.(*ast.SelectStmt) expected := []string{ "@abc", @@ -5739,72 +5749,72 @@ func (s *testParserSuite) TestQuotedVariableColumnName(c *C) { "@", } - c.Assert(len(ss.Fields.Fields), Equals, len(expected)) + require.Len(t, ss.Fields.Fields, len(expected)) for i, field := range ss.Fields.Fields { - c.Assert(field.Text(), Equals, expected[i]) + require.Equal(t, expected[i], field.Text()) } } -func (s *testParserSuite) TestCharset(c *C) { - parser := parser.New() - - st, err := parser.ParseOneStmt("ALTER SCHEMA GLOBAL DEFAULT CHAR SET utf8mb4", "", "") - c.Assert(err, IsNil) - c.Assert(st.(*ast.AlterDatabaseStmt), NotNil) - st, err = parser.ParseOneStmt("ALTER DATABASE CHAR SET = utf8mb4", "", "") - c.Assert(err, IsNil) - c.Assert(st.(*ast.AlterDatabaseStmt), NotNil) - st, err = parser.ParseOneStmt("ALTER DATABASE DEFAULT CHAR SET = utf8mb4", "", "") - c.Assert(err, IsNil) - c.Assert(st.(*ast.AlterDatabaseStmt), NotNil) +func TestCharset(t *testing.T) { + p := parser.New() + + st, err := p.ParseOneStmt("ALTER SCHEMA GLOBAL DEFAULT CHAR SET utf8mb4", "", "") + require.NoError(t, err) + require.NotNil(t, st.(*ast.AlterDatabaseStmt)) + st, err = p.ParseOneStmt("ALTER DATABASE CHAR SET = utf8mb4", "", "") + require.NoError(t, err) + require.NotNil(t, st.(*ast.AlterDatabaseStmt)) + st, err = p.ParseOneStmt("ALTER DATABASE DEFAULT CHAR SET = utf8mb4", "", "") + require.NoError(t, err) + require.NotNil(t, st.(*ast.AlterDatabaseStmt)) } -func (s *testParserSuite) TestFulltextSearch(c *C) { - parser := parser.New() +func TestFulltextSearch(t *testing.T) { + p := parser.New() - st, err := parser.ParseOneStmt("SELECT * FROM fulltext_test WHERE MATCH(content) AGAINST('search')", "", "") - c.Assert(err, IsNil) - c.Assert(st.(*ast.SelectStmt), NotNil) + st, err := p.ParseOneStmt("SELECT * FROM fulltext_test WHERE MATCH(content) AGAINST('search')", "", "") + require.NoError(t, err) + require.NotNil(t, st.(*ast.SelectStmt)) - st, err = parser.ParseOneStmt("SELECT * FROM fulltext_test WHERE MATCH() AGAINST('search')", "", "") - c.Assert(err, NotNil) - c.Assert(st, IsNil) + st, err = p.ParseOneStmt("SELECT * FROM fulltext_test WHERE MATCH() AGAINST('search')", "", "") + require.Error(t, err) + require.Nil(t, st) - st, err = parser.ParseOneStmt("SELECT * FROM fulltext_test WHERE MATCH(content) AGAINST()", "", "") - c.Assert(err, NotNil) - c.Assert(st, IsNil) + st, err = p.ParseOneStmt("SELECT * FROM fulltext_test WHERE MATCH(content) AGAINST()", "", "") + require.Error(t, err) + require.Nil(t, st) - st, err = parser.ParseOneStmt("SELECT * FROM fulltext_test WHERE MATCH(content) AGAINST('search' IN)", "", "") - c.Assert(err, NotNil) - c.Assert(st, IsNil) + st, err = p.ParseOneStmt("SELECT * FROM fulltext_test WHERE MATCH(content) AGAINST('search' IN)", "", "") + require.Error(t, err) + require.Nil(t, st) - st, err = parser.ParseOneStmt("SELECT * FROM fulltext_test WHERE MATCH(content) AGAINST('search' IN BOOLEAN MODE WITH QUERY EXPANSION)", "", "") - c.Assert(err, NotNil) - c.Assert(st, IsNil) + st, err = p.ParseOneStmt("SELECT * FROM fulltext_test WHERE MATCH(content) AGAINST('search' IN BOOLEAN MODE WITH QUERY EXPANSION)", "", "") + require.Error(t, err) + require.Nil(t, st) - st, err = parser.ParseOneStmt("SELECT * FROM fulltext_test WHERE MATCH(title,content) AGAINST('search' IN NATURAL LANGUAGE MODE)", "", "") - c.Assert(err, IsNil) - c.Assert(st.(*ast.SelectStmt), NotNil) + st, err = p.ParseOneStmt("SELECT * FROM fulltext_test WHERE MATCH(title,content) AGAINST('search' IN NATURAL LANGUAGE MODE)", "", "") + require.NoError(t, err) + require.NotNil(t, st.(*ast.SelectStmt)) writer := bytes.NewBufferString("") st.(*ast.SelectStmt).Where.Format(writer) - c.Assert(writer.String(), Equals, "MATCH(title,content) AGAINST(\"search\")") + require.Equal(t, "MATCH(title,content) AGAINST(\"search\")", writer.String()) - st, err = parser.ParseOneStmt("SELECT * FROM fulltext_test WHERE MATCH(title,content) AGAINST('search' IN BOOLEAN MODE)", "", "") - c.Assert(err, IsNil) - c.Assert(st.(*ast.SelectStmt), NotNil) + st, err = p.ParseOneStmt("SELECT * FROM fulltext_test WHERE MATCH(title,content) AGAINST('search' IN BOOLEAN MODE)", "", "") + require.NoError(t, err) + require.NotNil(t, st.(*ast.SelectStmt)) writer.Reset() st.(*ast.SelectStmt).Where.Format(writer) - c.Assert(writer.String(), Equals, "MATCH(title,content) AGAINST(\"search\" IN BOOLEAN MODE)") + require.Equal(t, "MATCH(title,content) AGAINST(\"search\" IN BOOLEAN MODE)", writer.String()) - st, err = parser.ParseOneStmt("SELECT * FROM fulltext_test WHERE MATCH(title,content) AGAINST('search' WITH QUERY EXPANSION)", "", "") - c.Assert(err, IsNil) - c.Assert(st.(*ast.SelectStmt), NotNil) + st, err = p.ParseOneStmt("SELECT * FROM fulltext_test WHERE MATCH(title,content) AGAINST('search' WITH QUERY EXPANSION)", "", "") + require.NoError(t, err) + require.NotNil(t, st.(*ast.SelectStmt)) writer.Reset() st.(*ast.SelectStmt).Where.Format(writer) - c.Assert(writer.String(), Equals, "MATCH(title,content) AGAINST(\"search\" WITH QUERY EXPANSION)") + require.Equal(t, "MATCH(title,content) AGAINST(\"search\" WITH QUERY EXPANSION)", writer.String()) } -func (s *testParserSuite) TestStartTransaction(c *C) { +func TestStartTransaction(t *testing.T) { cases := []testCase{ {"START TRANSACTION READ WRITE", true, "START TRANSACTION"}, {"START TRANSACTION WITH CONSISTENT SNAPSHOT", true, "START TRANSACTION"}, @@ -5818,10 +5828,10 @@ func (s *testParserSuite) TestStartTransaction(c *C) { {"START TRANSACTION READ ONLY AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(_UTF8MB4'2015-09-21 00:07:01', '2021-04-27 11:26:13')", true, "START TRANSACTION READ ONLY AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(_UTF8MB4'2015-09-21 00:07:01', _UTF8MB4'2021-04-27 11:26:13')"}, } - s.RunTest(c, cases) + RunTest(t, cases, false) } -func (s *testParserSuite) TestSignedInt64OutOfRange(c *C) { +func TestSignedInt64OutOfRange(t *testing.T) { p := parser.New() cases := []string{ "recover table by job 18446744073709551612", @@ -5832,8 +5842,8 @@ func (s *testParserSuite) TestSignedInt64OutOfRange(c *C) { for _, s := range cases { _, err := p.ParseOneStmt(s, "", "") - c.Assert(err, NotNil) - c.Assert(strings.Contains(err.Error(), "out of range"), IsTrue) + require.Error(t, err) + require.Contains(t, err.Error(), "out of range") } } @@ -5900,7 +5910,7 @@ func (checker *nodeTextCleaner) Enter(in ast.Node) (out ast.Node, skipChildren b node.Offset = 0 case *test_driver.ValueExpr: if node.Kind() == test_driver.KindMysqlDecimal { - node.GetMysqlDecimal().FromString(node.GetMysqlDecimal().ToString()) + _ = node.GetMysqlDecimal().FromString(node.GetMysqlDecimal().ToString()) } case *ast.GrantStmt: var privs []*ast.PrivElem @@ -5930,7 +5940,7 @@ func (checker *nodeTextCleaner) Leave(in ast.Node) (out ast.Node, ok bool) { } // For index advisor -func (s *testParserSuite) TestIndexAdviseStmt(c *C) { +func TestIndexAdviseStmt(t *testing.T) { table := []testCase{ {"INDEX ADVISE INFILE '/tmp/t.sql'", true, "INDEX ADVISE INFILE '/tmp/t.sql'"}, {"INDEX ADVISE LOCAL INFILE '/tmp/t.sql'", true, "INDEX ADVISE LOCAL INFILE '/tmp/t.sql'"}, @@ -5986,11 +5996,11 @@ func (s *testParserSuite) TestIndexAdviseStmt(c *C) { {"INDEX ADVISE INFILE '/tmp/t.sql' MAX_MINUTES -1 MAX_IDXNUM PER_TABLE 8 PER_DB 4 LINES STARTING BY 'ab' TERMINATED BY 'cd'", false, ""}, } - s.RunTest(c, table) + RunTest(t, table, false) } // For BRIE -func (s *testParserSuite) TestBRIE(c *C) { +func TestBRIE(t *testing.T) { table := []testCase{ {"BACKUP DATABASE a TO 'local:///tmp/archive01/'", true, "BACKUP DATABASE `a` TO 'local:///tmp/archive01/'"}, {"BACKUP SCHEMA a TO 'local:///tmp/archive01/'", true, "BACKUP DATABASE `a` TO 'local:///tmp/archive01/'"}, @@ -6034,18 +6044,18 @@ func (s *testParserSuite) TestBRIE(c *C) { {"restore table g from 'noop://' checksum optional", true, "RESTORE TABLE `g` FROM 'noop://' CHECKSUM = OPTIONAL"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestPurge(c *C) { +func TestPurge(t *testing.T) { cases := []testCase{ {"purge import 100", true, "PURGE IMPORT 100"}, {"purge import abc", false, ""}, } - s.RunTest(c, cases) + RunTest(t, cases, false) } -func (s *testParserSuite) TestAsyncImport(c *C) { +func TestAsyncImport(t *testing.T) { cases := []testCase{ {"create import test from 'file:///d/'", true, "CREATE IMPORT `test` FROM 'file:///d/'"}, { @@ -6098,10 +6108,10 @@ func (s *testParserSuite) TestAsyncImport(c *C) { {"show import test errors table tbl", true, "SHOW IMPORT `test` ERRORS TABLE `tbl`"}, {"show import test errors table tb1, db.tb2", true, "SHOW IMPORT `test` ERRORS TABLE `tb1`, `db`.`tb2`"}, } - s.RunTest(c, cases) + RunTest(t, cases, false) } -func (s *testParserSuite) TestStatisticsOps(c *C) { +func TestStatisticsOps(t *testing.T) { table := []testCase{ {"create statistics stats1 (cardinality) on t(a,b,c)", true, "CREATE STATISTICS `stats1` (CARDINALITY) ON `t`(`a`, `b`, `c`)"}, {"create statistics stats2 (dependency) on t(a,b)", true, "CREATE STATISTICS `stats2` (DEPENDENCY) ON `t`(`a`, `b`)"}, @@ -6114,68 +6124,68 @@ func (s *testParserSuite) TestStatisticsOps(c *C) { {"create statistics stats1(cardinality) on t(a,b,c)", true, "CREATE STATISTICS `stats1` (CARDINALITY) ON `t`(`a`, `b`, `c`)"}, {"drop statistics stats1", true, "DROP STATISTICS `stats1`"}, } - s.RunTest(c, table) + RunTest(t, table, false) p := parser.New() sms, _, err := p.Parse("create statistics if not exists stats1 (cardinality) on t(a,b,c)", "", "") - c.Assert(err, IsNil) + require.NoError(t, err) v, ok := sms[0].(*ast.CreateStatisticsStmt) - c.Assert(ok, IsTrue) - c.Assert(v.IfNotExists, IsTrue) - c.Assert(v.StatsName, Equals, "stats1") - c.Assert(v.StatsType, Equals, ast.StatsTypeCardinality) - c.Assert(v.Table.Name, Equals, model.CIStr{O: "t", L: "t"}) - c.Assert(len(v.Columns), Equals, 3) - c.Assert(v.Columns[0].Name, Equals, model.CIStr{O: "a", L: "a"}) - c.Assert(v.Columns[1].Name, Equals, model.CIStr{O: "b", L: "b"}) - c.Assert(v.Columns[2].Name, Equals, model.CIStr{O: "c", L: "c"}) + require.True(t, ok) + require.True(t, v.IfNotExists) + require.Equal(t, "stats1", v.StatsName) + require.Equal(t, ast.StatsTypeCardinality, v.StatsType) + require.Equal(t, model.CIStr{O: "t", L: "t"}, v.Table.Name) + require.Len(t, v.Columns, 3) + require.Equal(t, model.CIStr{O: "a", L: "a"}, v.Columns[0].Name) + require.Equal(t, model.CIStr{O: "b", L: "b"}, v.Columns[1].Name) + require.Equal(t, model.CIStr{O: "c", L: "c"}, v.Columns[2].Name) } -func (s *testParserSuite) TestHighNotPrecedenceMode(c *C) { +func TestHighNotPrecedenceMode(t *testing.T) { p := parser.New() var sb strings.Builder sms, _, err := p.Parse("SELECT NOT 1 BETWEEN -5 AND 5", "", "") - c.Assert(err, IsNil) + require.NoError(t, err) v, ok := sms[0].(*ast.SelectStmt) - c.Assert(ok, IsTrue) + require.True(t, ok) v1, ok := v.Fields.Fields[0].Expr.(*ast.UnaryOperationExpr) - c.Assert(ok, IsTrue) - c.Assert(v1.Op, Equals, opcode.Not) + require.True(t, ok) + require.Equal(t, opcode.Not, v1.Op) err = sms[0].Restore(NewRestoreCtx(DefaultRestoreFlags, &sb)) - c.Assert(err, IsNil) + require.NoError(t, err) restoreSQL := sb.String() - c.Assert(restoreSQL, Equals, "SELECT NOT 1 BETWEEN -5 AND 5") + require.Equal(t, "SELECT NOT 1 BETWEEN -5 AND 5", restoreSQL) sb.Reset() sms, _, err = p.Parse("SELECT !1 BETWEEN -5 AND 5", "", "") - c.Assert(err, IsNil) + require.NoError(t, err) v, ok = sms[0].(*ast.SelectStmt) - c.Assert(ok, IsTrue) + require.True(t, ok) _, ok = v.Fields.Fields[0].Expr.(*ast.BetweenExpr) - c.Assert(ok, IsTrue) + require.True(t, ok) err = sms[0].Restore(NewRestoreCtx(DefaultRestoreFlags, &sb)) - c.Assert(err, IsNil) + require.NoError(t, err) restoreSQL = sb.String() - c.Assert(restoreSQL, Equals, "SELECT !1 BETWEEN -5 AND 5") + require.Equal(t, "SELECT !1 BETWEEN -5 AND 5", restoreSQL) sb.Reset() p = parser.New() p.SetSQLMode(mysql.ModeHighNotPrecedence) sms, _, err = p.Parse("SELECT NOT 1 BETWEEN -5 AND 5", "", "") - c.Assert(err, IsNil) + require.NoError(t, err) v, ok = sms[0].(*ast.SelectStmt) - c.Assert(ok, IsTrue) + require.True(t, ok) _, ok = v.Fields.Fields[0].Expr.(*ast.BetweenExpr) - c.Assert(ok, IsTrue) + require.True(t, ok) err = sms[0].Restore(NewRestoreCtx(DefaultRestoreFlags, &sb)) - c.Assert(err, IsNil) + require.NoError(t, err) restoreSQL = sb.String() - c.Assert(restoreSQL, Equals, "SELECT !1 BETWEEN -5 AND 5") + require.Equal(t, "SELECT !1 BETWEEN -5 AND 5", restoreSQL) } // For CTE -func (s *testParserSuite) TestCTE(c *C) { +func TestCTE(t *testing.T) { table := []testCase{ {"WITH `cte` AS (SELECT 1,2) SELECT `col1`,`col2` FROM `cte`", true, "WITH `cte` AS (SELECT 1,2) SELECT `col1`,`col2` FROM `cte`"}, {"WITH `cte` (col1, col2) AS (SELECT 1,2 UNION ALL SELECT 3,4) SELECT col1, col2 FROM cte;", true, "WITH `cte` (`col1`, `col2`) AS (SELECT 1,2 UNION ALL SELECT 3,4) SELECT `col1`,`col2` FROM `cte`"}, @@ -6196,10 +6206,10 @@ func (s *testParserSuite) TestCTE(c *C) { {"( with cte(n) as ( select 1 ) (select n+1 from cte)) union select 1", true, "(WITH `cte` (`n`) AS (SELECT 1) (SELECT `n`+1 FROM `cte`)) UNION SELECT 1"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestAsOfClause(c *C) { +func TestAsOfClause(t *testing.T) { table := []testCase{ {"SELECT * FROM `t` AS /* comment */ a;", true, "SELECT * FROM `t` AS `a`"}, {"SELECT * FROM `t` AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(DATE_SUB(NOW(), INTERVAL 3 SECOND), NOW());", true, "SELECT * FROM `t` AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(DATE_SUB(NOW(), INTERVAL 3 SECOND), NOW())"}, @@ -6212,11 +6222,11 @@ func (s *testParserSuite) TestAsOfClause(c *C) { {"START TRANSACTION READ ONLY AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(DATE_SUB(NOW(), INTERVAL 3 SECOND), NOW())", true, "START TRANSACTION READ ONLY AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(DATE_SUB(NOW(), INTERVAL 3 SECOND), NOW())"}, {"START TRANSACTION READ ONLY AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(_UTF8MB4'2015-09-21 00:07:01', '2021-04-27 11:26:13')", true, "START TRANSACTION READ ONLY AS OF TIMESTAMP TIDB_BOUNDED_STALENESS(_UTF8MB4'2015-09-21 00:07:01', _UTF8MB4'2021-04-27 11:26:13')"}, } - s.RunTest(c, table) + RunTest(t, table, false) } // For `PARTITION BY [LINEAR] KEY ALGORITHM` syntax -func (s *testParserSuite) TestPartitionKeyAlgorithm(c *C) { +func TestPartitionKeyAlgorithm(t *testing.T) { table := []testCase{ {"CREATE TABLE t (c1 integer ,c2 integer) PARTITION BY LINEAR KEY ALGORITHM = 1 (c1,c2) PARTITIONS 4", true, "CREATE TABLE `t` (`c1` INT,`c2` INT) PARTITION BY LINEAR KEY ALGORITHM = 1 (`c1`,`c2`) PARTITIONS 4"}, {"CREATE TABLE t (c1 integer ,c2 integer) PARTITION BY LINEAR KEY ALGORITHM = -1 (c1,c2) PARTITIONS 4", false, ""}, @@ -6224,62 +6234,62 @@ func (s *testParserSuite) TestPartitionKeyAlgorithm(c *C) { {"CREATE TABLE t (c1 integer ,c2 integer) PARTITION BY LINEAR KEY ALGORITHM = 3 (c1,c2) PARTITIONS 4", false, ""}, } - s.RunTest(c, table) + RunTest(t, table, false) } // server side help syntax -func (s *testParserSuite) TestHelp(c *C) { +func TestHelp(t *testing.T) { table := []testCase{ {"HELP 'select'", true, "HELP 'select'"}, } - s.RunTest(c, table) + RunTest(t, table, false) } -func (s *testParserSuite) TestRestoreBinOpWithBrackets(c *C) { +func TestRestoreBinOpWithBrackets(t *testing.T) { cases := []testCase{ {"select mod(a+b, 4)+1", true, "SELECT (((`a` + `b`) % 4) + 1)"}, {"select mod( year(a) - abs(weekday(a) + dayofweek(a)), 4) + 1", true, "SELECT (((year(`a`) - abs((weekday(`a`) + dayofweek(`a`)))) % 4) + 1)"}, } - parser := parser.New() - parser.EnableWindowFunc(s.enableWindowFunc) - for _, t := range cases { - _, _, err := parser.Parse(t.src, "", "") - comment := Commentf("source %v", t.src) - if !t.ok { - c.Assert(err, NotNil, comment) + p := parser.New() + p.EnableWindowFunc(false) + for _, tbl := range cases { + _, _, err := p.Parse(tbl.src, "", "") + comment := fmt.Sprintf("source %v", tbl.src) + if !tbl.ok { + require.Error(t, err, comment) continue } - c.Assert(err, IsNil, comment) + require.NoError(t, err, comment) // restore correctness test - if t.ok { + if tbl.ok { var sb strings.Builder - comment := Commentf("source %v", t.src) - stmts, _, err := parser.Parse(t.src, "", "") - c.Assert(err, IsNil, comment) + comment := fmt.Sprintf("source %v", tbl.src) + stmts, _, err := p.Parse(tbl.src, "", "") + require.NoError(t, err, comment) restoreSQLs := "" for _, stmt := range stmts { sb.Reset() ctx := NewRestoreCtx(RestoreStringSingleQuotes|RestoreSpacesAroundBinaryOperation|RestoreBracketAroundBinaryOperation|RestoreStringWithoutCharset|RestoreNameBackQuotes, &sb) ctx.DefaultDB = "test" err = stmt.Restore(ctx) - c.Assert(err, IsNil, comment) + require.NoError(t, err, comment) restoreSQL := sb.String() - comment = Commentf("source %v; restore %v", t.src, restoreSQL) + comment = fmt.Sprintf("source %v; restore %v", tbl.src, restoreSQL) if restoreSQLs != "" { restoreSQLs += "; " } restoreSQLs += restoreSQL } - comment = Commentf("restore %v; expect %v", restoreSQLs, t.restore) - c.Assert(restoreSQLs, Equals, t.restore, comment) + comment = fmt.Sprintf("restore %v; expect %v", restoreSQLs, tbl.restore) + require.Equal(t, tbl.restore, restoreSQLs, comment) } } } // For CTE bindings. -func (s *testParserSuite) TestCTEBindings(c *C) { +func TestCTEBindings(t *testing.T) { table := []testCase{ {"WITH `cte` AS (SELECT * from t) SELECT `col1`,`col2` FROM `cte`", true, "WITH `cte` AS (SELECT * FROM `test`.`t`) SELECT `col1`,`col2` FROM `cte`"}, {"WITH `cte` (col1, col2) AS (SELECT * from t UNION ALL SELECT 3,4) SELECT col1, col2 FROM cte;", true, "WITH `cte` (`col1`, `col2`) AS (SELECT * FROM `test`.`t` UNION ALL SELECT 3,4) SELECT `col1`,`col2` FROM `cte`"}, @@ -6300,43 +6310,43 @@ func (s *testParserSuite) TestCTEBindings(c *C) { {"with cte as (select * from t union select * from cte) select * from cte", true, "WITH `cte` AS (SELECT * FROM `test`.`t` UNION SELECT * FROM `test`.`cte`) SELECT * FROM `cte`"}, } - parser := parser.New() - parser.EnableWindowFunc(s.enableWindowFunc) - for _, t := range table { - _, _, err := parser.Parse(t.src, "", "") - comment := Commentf("source %v", t.src) - if !t.ok { - c.Assert(err, NotNil, comment) + p := parser.New() + p.EnableWindowFunc(false) + for _, tbl := range table { + _, _, err := p.Parse(tbl.src, "", "") + comment := fmt.Sprintf("source %v", tbl.src) + if !tbl.ok { + require.Error(t, err, comment) continue } - c.Assert(err, IsNil, comment) + require.NoError(t, err, comment) // restore correctness test - if t.ok { + if tbl.ok { var sb strings.Builder - comment := Commentf("source %v", t.src) - stmts, _, err := parser.Parse(t.src, "", "") - c.Assert(err, IsNil, comment) + comment := fmt.Sprintf("source %v", tbl.src) + stmts, _, err := p.Parse(tbl.src, "", "") + require.NoError(t, err, comment) restoreSQLs := "" for _, stmt := range stmts { sb.Reset() ctx := NewRestoreCtx(RestoreStringSingleQuotes|RestoreSpacesAroundBinaryOperation|RestoreStringWithoutCharset|RestoreNameBackQuotes, &sb) ctx.DefaultDB = "test" err = stmt.Restore(ctx) - c.Assert(err, IsNil, comment) + require.NoError(t, err, comment) restoreSQL := sb.String() - comment = Commentf("source %v; restore %v", t.src, restoreSQL) + comment = fmt.Sprintf("source %v; restore %v", tbl.src, restoreSQL) if restoreSQLs != "" { restoreSQLs += "; " } restoreSQLs += restoreSQL } - comment = Commentf("restore %v; expect %v", restoreSQLs, t.restore) - c.Assert(restoreSQLs, Equals, t.restore, comment) + comment = fmt.Sprintf("restore %v; expect %v", restoreSQLs, tbl.restore) + require.Equal(t, tbl.restore, restoreSQLs, comment) } } } -func (s *testParserSuite) TestPlanReplayer(c *C) { +func TestPlanReplayer(t *testing.T) { table := []testCase{ {"PLAN REPLAYER DUMP EXPLAIN SELECT a FROM t", true, "PLAN REPLAYER DUMP EXPLAIN SELECT `a` FROM `t`"}, {"PLAN REPLAYER DUMP EXPLAIN SELECT * FROM t WHERE a > 10", true, "PLAN REPLAYER DUMP EXPLAIN SELECT * FROM `t` WHERE `a`>10"}, @@ -6351,84 +6361,58 @@ func (s *testParserSuite) TestPlanReplayer(c *C) { {"PLAN REPLAYER DUMP EXPLAIN ANALYZE SLOW QUERY", true, "PLAN REPLAYER DUMP EXPLAIN ANALYZE SLOW QUERY"}, {"PLAN REPLAYER LOAD '/tmp/sdfaalskdjf.zip'", true, "PLAN REPLAYER LOAD '/tmp/sdfaalskdjf.zip'"}, } - s.RunTest(c, table) + RunTest(t, table, false) p := parser.New() sms, _, err := p.Parse("PLAN REPLAYER DUMP EXPLAIN SELECT a FROM t", "", "") - c.Assert(err, IsNil) + require.NoError(t, err) v, ok := sms[0].(*ast.PlanReplayerStmt) - c.Assert(ok, IsTrue) - c.Assert(v.Stmt.Text(), Equals, "SELECT a FROM t") - c.Assert(v.Analyze, IsFalse) + require.True(t, ok) + require.Equal(t, "SELECT a FROM t", v.Stmt.Text()) + require.False(t, v.Analyze) sms, _, err = p.Parse("PLAN REPLAYER DUMP EXPLAIN ANALYZE SELECT a FROM t", "", "") - c.Assert(err, IsNil) + require.NoError(t, err) v, ok = sms[0].(*ast.PlanReplayerStmt) - c.Assert(ok, IsTrue) - c.Assert(v.Stmt.Text(), Equals, "SELECT a FROM t") - c.Assert(v.Analyze, IsTrue) -} - -func (s *testParserSuite) TestCharsetIntroducer(c *C) { - p := parser.New() - // `_gbk` is treated as an identifier. - _, _, err := p.Parse("select _gbk 'a';", "", "") - c.Assert(err, IsNil) - - charset.AddCharset(&charset.Charset{ - Name: "gbk", - DefaultCollation: "gbk_bin", - Collations: map[string]*charset.Collation{}, - Desc: "gbk", - Maxlen: 2, - }) - defer charset.RemoveCharset("gbk") - // `_gbk` is treated as a character set. - _, _, err = p.Parse("select _gbk 'a';", "", "") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[ddl:1115]Unsupported character introducer: 'gbk'") - _, _, err = p.Parse("select _gbk 0x1234;", "", "") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[ddl:1115]Unsupported character introducer: 'gbk'") - _, _, err = p.Parse("select _gbk 0b101001;", "", "") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[ddl:1115]Unsupported character introducer: 'gbk'") + require.True(t, ok) + require.Equal(t, "SELECT a FROM t", v.Stmt.Text()) + require.True(t, v.Analyze) } -func (s *testParserSuite) TestGBKEncoding(c *C) { +func TestGBKEncoding(t *testing.T) { p := parser.New() gbkEncoding, _ := charset.Lookup("gbk") encoder := gbkEncoding.NewEncoder() sql, err := encoder.String("create table 测试表 (测试列 varchar(255) default 'GBK测试用例');") - c.Assert(err, IsNil) + require.NoError(t, err) stmt, _, err := p.ParseSQL(sql) - c.Assert(err, IsNil) + require.NoError(t, err) checker := &gbkEncodingChecker{} _, _ = stmt[0].Accept(checker) - c.Assert(checker.tblName, Not(Equals), "测试表") - c.Assert(checker.colName, Not(Equals), "测试列") + require.NotEqual(t, "测试表", checker.tblName) + require.NotEqual(t, "测试列", checker.colName) gbkOpt := parser.CharsetClient("gbk") stmt, _, err = p.ParseSQL(sql, gbkOpt) - c.Assert(err, IsNil) + require.NoError(t, err) _, _ = stmt[0].Accept(checker) - c.Assert(checker.tblName, Equals, "测试表") - c.Assert(checker.colName, Equals, "测试列") - c.Assert(checker.expr, Equals, "GBK测试用例") + require.Equal(t, "测试表", checker.tblName) + require.Equal(t, "测试列", checker.colName) + require.Equal(t, "GBK测试用例", checker.expr) utf8SQL := "select '芢' from `玚`;" sql, err = encoder.String(utf8SQL) - c.Assert(err, IsNil) + require.NoError(t, err) stmt, _, err = p.ParseSQL(sql, gbkOpt) - c.Assert(err, IsNil) + require.NoError(t, err) stmt, _, err = p.ParseSQL("select '\xc6\x5c' from `\xab\x60`;", gbkOpt) - c.Assert(err, IsNil) + require.NoError(t, err) stmt, _, err = p.ParseSQL(`prepare p1 from "insert into t values ('中文');";`, gbkOpt) - c.Assert(err, IsNil) + require.NoError(t, err) stmt, _, err = p.ParseSQL("select _gbk '\xc6\x5c' from dual;") - c.Assert(err, NotNil) + require.Error(t, err) } type gbkEncodingChecker struct { diff --git a/parser/reserved_words_test.go b/parser/reserved_words_test.go index 8839427ad97c7..28821c3def11e 100644 --- a/parser/reserved_words_test.go +++ b/parser/reserved_words_test.go @@ -11,7 +11,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -//+build reserved_words_test +//go:build reserved_words_test +// +build reserved_words_test // This file ensures that the set of reserved keywords is the same as that of // MySQL. To run: @@ -19,29 +20,56 @@ // 1. Set up a MySQL server listening at 127.0.0.1:3306 using root and no password // 2. Run this test with: // -// go test -tags reserved_words_test -check.f TestReservedWords +// go test -tags reserved_words_test -run '^TestCompareReservedWordsWithMySQL$' + package parser import ( + // needed to connect to MySQL + dbsql "database/sql" + "io/ioutil" + "os" + "path" + "runtime" + "testing" - // needed to connect to MySQL _ "github.com/go-sql-driver/mysql" - . "github.com/pingcap/check" - "github.com/pingcap/tidb/parser/ast" + requires "github.com/stretchr/testify/require" ) -func (s *testConsistentSuite) TestCompareReservedWordsWithMySQL(c *C) { +func TestCompareReservedWordsWithMySQL(t *testing.T) { + _, filename, _, _ := runtime.Caller(0) + parserFilename := path.Join(path.Dir(filename), "parser.y") + parserFile, err := os.Open(parserFilename) + requires.NoError(t, err) + data, err := ioutil.ReadAll(parserFile) + requires.NoError(t, err) + content := string(data) + + reservedKeywordStartMarker := "\t/* The following tokens belong to ReservedKeyword. Notice: make sure these tokens are contained in ReservedKeyword. */" + unreservedKeywordStartMarker := "\t/* The following tokens belong to UnReservedKeyword. Notice: make sure these tokens are contained in UnReservedKeyword. */" + notKeywordTokenStartMarker := "\t/* The following tokens belong to NotKeywordToken. Notice: make sure these tokens are contained in NotKeywordToken. */" + tidbKeywordStartMarker := "\t/* The following tokens belong to TiDBKeyword. Notice: make sure these tokens are contained in TiDBKeyword. */" + identTokenEndMarker := "%token\t<item>" + + reservedKeywords := extractKeywords(content, reservedKeywordStartMarker, unreservedKeywordStartMarker) + unreservedKeywords := extractKeywords(content, unreservedKeywordStartMarker, notKeywordTokenStartMarker) + notKeywordTokens := extractKeywords(content, notKeywordTokenStartMarker, tidbKeywordStartMarker) + tidbKeywords := extractKeywords(content, tidbKeywordStartMarker, identTokenEndMarker) + p := New() db, err := dbsql.Open("mysql", "root@tcp(127.0.0.1:3306)/") - c.Assert(err, IsNil) - defer db.Close() + requires.NoError(t, err) + defer func() { + requires.NoError(t, db.Close()) + }() - for _, kw := range s.reservedKeywords { + for _, kw := range reservedKeywords { switch kw { - case "CURRENT_ROLE": - // special case: we do reserve CURRENT_ROLE but MySQL didn't, + case "CURRENT_ROLE", "INTERSECT", "STATS_EXTENDED", "TABLESAMPLE": + // special case: we do reserve these words but MySQL didn't, // and unreservering it causes legit parser conflict. continue } @@ -54,29 +82,32 @@ func (s *testConsistentSuite) TestCompareReservedWordsWithMySQL(c *C) { if _, ok := windowFuncTokenMap[kw]; !ok { // for some reason the query does parse even then the keyword is reserved in TiDB. _, _, err = p.Parse(query, "", "") - c.Assert(err, ErrorMatches, errRegexp) + requires.Error(t, err) + requires.Regexp(t, errRegexp, err.Error()) } _, err = db.Exec(query) - c.Assert(err, ErrorMatches, errRegexp, Commentf("MySQL suggests that '%s' should *not* be reserved!", kw)) + requires.Error(t, err) + requires.Regexp(t, errRegexp, err.Error(), "MySQL suggests that '%s' should *not* be reserved!", kw) } - for _, kws := range [][]string{s.unreservedKeywords, s.notKeywordTokens, s.tidbKeywords} { + for _, kws := range [][]string{unreservedKeywords, notKeywordTokens, tidbKeywords} { for _, kw := range kws { switch kw { case "FUNCTION", // reserved in 8.0.1 - "SEPARATOR": // ? + "PURGE", "SYSTEM", "SEPARATOR": // ? continue } query := "do (select 1 as " + kw + ")" stmts, _, err := p.Parse(query, "", "") - c.Assert(err, IsNil) - c.Assert(stmts, HasLen, 1) - c.Assert(stmts[0], FitsTypeOf, &ast.DoStmt{}) + requires.NoError(t, err) + requires.Len(t, stmts, 1) + requires.IsType(t, &ast.DoStmt{}, stmts[0]) _, err = db.Exec(query) - c.Assert(err, IsNil, Commentf("MySQL suggests that '%s' should be reserved!", kw)) + println(query) + requires.NoErrorf(t, err, "MySQL suggests that '%s' should be reserved!", kw) } } } diff --git a/parser/terror/terror_serial_test.go b/parser/terror/terror_serial_test.go new file mode 100644 index 0000000000000..d8f536a8440f5 --- /dev/null +++ b/parser/terror/terror_serial_test.go @@ -0,0 +1,154 @@ +// Copyright 2021 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" + "os" + "runtime" + "strings" + "testing" + + "github.com/pingcap/errors" + "github.com/stretchr/testify/require" +) + +func TestErrCode(t *testing.T) { + require.Equal(t, ErrCode(1), CodeMissConnectionID) + require.Equal(t, ErrCode(2), CodeResultUndetermined) +} + +func TestTError(t *testing.T) { + require.NotEmpty(t, ClassParser.String()) + require.NotEmpty(t, ClassOptimizer.String()) + require.NotEmpty(t, ClassKV.String()) + require.NotEmpty(t, ClassServer.String()) + + parserErr := ClassParser.New(ErrCode(100), "error 100") + require.NotEmpty(t, parserErr.Error()) + require.True(t, ClassParser.EqualClass(parserErr)) + require.False(t, ClassParser.NotEqualClass(parserErr)) + + require.False(t, ClassOptimizer.EqualClass(parserErr)) + optimizerErr := ClassOptimizer.New(ErrCode(2), "abc") + require.False(t, ClassOptimizer.EqualClass(errors.New("abc"))) + require.False(t, ClassOptimizer.EqualClass(nil)) + require.True(t, optimizerErr.Equal(optimizerErr.GenWithStack("def"))) + require.False(t, optimizerErr.Equal(nil)) + require.False(t, optimizerErr.Equal(errors.New("abc"))) + + // Test case for FastGen. + require.True(t, optimizerErr.Equal(optimizerErr.FastGen("def"))) + require.True(t, optimizerErr.Equal(optimizerErr.FastGen("def: %s", "def"))) + kvErr := ClassKV.New(1062, "key already exist") + e := kvErr.FastGen("Duplicate entry '%d' for key 'PRIMARY'", 1) + require.Equal(t, "[kv:1062]Duplicate entry '1' for key 'PRIMARY'", e.Error()) + sqlErr := ToSQLError(errors.Cause(e).(*Error)) + require.Equal(t, "Duplicate entry '1' for key 'PRIMARY'", sqlErr.Message) + require.Equal(t, uint16(1062), sqlErr.Code) + + err := errors.Trace(ErrCritical.GenWithStackByArgs("test")) + require.True(t, ErrCritical.Equal(err)) + + err = errors.Trace(ErrCritical) + require.True(t, ErrCritical.Equal(err)) +} + +func TestJson(t *testing.T) { + prevTErr := errors.Normalize("json test", errors.MySQLErrorCode(int(CodeExecResultIsEmpty))) + buf, err := json.Marshal(prevTErr) + require.NoError(t, err) + var curTErr errors.Error + err = json.Unmarshal(buf, &curTErr) + require.NoError(t, err) + isEqual := prevTErr.Equal(&curTErr) + require.True(t, isEqual) +} + +var predefinedErr = ClassExecutor.New(ErrCode(123), "predefiend error") + +func example() error { + err := call() + return errors.Trace(err) +} + +func call() error { + return predefinedErr.GenWithStack("error message:%s", "abc") +} + +func TestErrorEqual(t *testing.T) { + e1 := errors.New("test error") + require.NotNil(t, e1) + + e2 := errors.Trace(e1) + require.NotNil(t, e2) + + e3 := errors.Trace(e2) + require.NotNil(t, e3) + + require.Equal(t, e1, errors.Cause(e2)) + require.Equal(t, e1, errors.Cause(e3)) + require.Equal(t, errors.Cause(e3), errors.Cause(e2)) + + e4 := errors.New("test error") + require.NotEqual(t, e1, errors.Cause(e4)) + + e5 := errors.Errorf("test error") + require.NotEqual(t, e1, errors.Cause(e5)) + + require.True(t, ErrorEqual(e1, e2)) + require.True(t, ErrorEqual(e1, e3)) + require.True(t, ErrorEqual(e1, e4)) + require.True(t, ErrorEqual(e1, e5)) + + var e6 error + + require.True(t, ErrorEqual(nil, nil)) + require.True(t, ErrorNotEqual(e1, e6)) + code1 := ErrCode(9001) + code2 := ErrCode(9002) + te1 := ClassParser.Synthesize(code1, "abc") + te3 := ClassKV.New(code1, "abc") + te4 := ClassKV.New(code2, "abc") + require.False(t, ErrorEqual(te1, te3)) + require.False(t, ErrorEqual(te3, te4)) +} + +func TestLog(t *testing.T) { + err := fmt.Errorf("xxx") + Log(err) +} + +func TestTraceAndLocation(t *testing.T) { + err := example() + stack := errors.ErrorStack(err) + lines := strings.Split(stack, "\n") + goroot := strings.ReplaceAll(runtime.GOROOT(), string(os.PathSeparator), "/") + var sysStack = 0 + for _, line := range lines { + if strings.Contains(line, goroot) { + sysStack++ + } + } + require.Equalf(t, 11, len(lines)-(2*sysStack), "stack =\n%s", stack) + var containTerr bool + for _, v := range lines { + if strings.Contains(v, "terror_serial_test.go") { + containTerr = true + break + } + } + require.True(t, containTerr) +} diff --git a/parser/terror/terror_test.go b/parser/terror/terror_test.go deleted file mode 100644 index 450e9172713dd..0000000000000 --- a/parser/terror/terror_test.go +++ /dev/null @@ -1,164 +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 terror - -import ( - "encoding/json" - "fmt" - "os" - "runtime" - "strings" - "testing" - - . "github.com/pingcap/check" - "github.com/pingcap/errors" -) - -func TestT(t *testing.T) { - CustomVerboseFlag = true - TestingT(t) -} - -var _ = Suite(&testTErrorSuite{}) - -type testTErrorSuite struct { -} - -func (s *testTErrorSuite) TestErrCode(c *C) { - c.Assert(CodeMissConnectionID, Equals, ErrCode(1)) - c.Assert(CodeResultUndetermined, Equals, ErrCode(2)) -} - -func (s *testTErrorSuite) TestTError(c *C) { - c.Assert(ClassParser.String(), Not(Equals), "") - c.Assert(ClassOptimizer.String(), Not(Equals), "") - c.Assert(ClassKV.String(), Not(Equals), "") - c.Assert(ClassServer.String(), Not(Equals), "") - - parserErr := ClassParser.New(ErrCode(100), "error 100") - c.Assert(parserErr.Error(), Not(Equals), "") - c.Assert(ClassParser.EqualClass(parserErr), IsTrue) - c.Assert(ClassParser.NotEqualClass(parserErr), IsFalse) - - c.Assert(ClassOptimizer.EqualClass(parserErr), IsFalse) - optimizerErr := ClassOptimizer.New(ErrCode(2), "abc") - c.Assert(ClassOptimizer.EqualClass(errors.New("abc")), IsFalse) - c.Assert(ClassOptimizer.EqualClass(nil), IsFalse) - c.Assert(optimizerErr.Equal(optimizerErr.GenWithStack("def")), IsTrue) - c.Assert(optimizerErr.Equal(nil), IsFalse) - c.Assert(optimizerErr.Equal(errors.New("abc")), IsFalse) - - // Test case for FastGen. - c.Assert(optimizerErr.Equal(optimizerErr.FastGen("def")), IsTrue) - c.Assert(optimizerErr.Equal(optimizerErr.FastGen("def: %s", "def")), IsTrue) - kvErr := ClassKV.New(1062, "key already exist") - e := kvErr.FastGen("Duplicate entry '%d' for key 'PRIMARY'", 1) - c.Assert(e.Error(), Equals, "[kv:1062]Duplicate entry '1' for key 'PRIMARY'") - sqlErr := ToSQLError(errors.Cause(e).(*Error)) - c.Assert(sqlErr.Message, Equals, "Duplicate entry '1' for key 'PRIMARY'") - c.Assert(sqlErr.Code, Equals, uint16(1062)) - - err := errors.Trace(ErrCritical.GenWithStackByArgs("test")) - c.Assert(ErrCritical.Equal(err), IsTrue) - - err = errors.Trace(ErrCritical) - c.Assert(ErrCritical.Equal(err), IsTrue) -} - -func (s *testTErrorSuite) TestJson(c *C) { - prevTErr := errors.Normalize("json test", errors.MySQLErrorCode(int(CodeExecResultIsEmpty))) - buf, err := json.Marshal(prevTErr) - c.Assert(err, IsNil) - var curTErr errors.Error - err = json.Unmarshal(buf, &curTErr) - c.Assert(err, IsNil) - isEqual := prevTErr.Equal(&curTErr) - c.Assert(isEqual, IsTrue) -} - -var predefinedErr = ClassExecutor.New(ErrCode(123), "predefiend error") - -func example() error { - err := call() - return errors.Trace(err) -} - -func call() error { - return predefinedErr.GenWithStack("error message:%s", "abc") -} - -func (s *testTErrorSuite) TestTraceAndLocation(c *C) { - err := example() - stack := errors.ErrorStack(err) - lines := strings.Split(stack, "\n") - goroot := strings.ReplaceAll(runtime.GOROOT(), string(os.PathSeparator), "/") - var sysStack = 0 - for _, line := range lines { - if strings.Contains(line, goroot) { - sysStack++ - } - } - c.Assert(len(lines)-(2*sysStack), Equals, 15, Commentf("stack =\n%s", stack)) - var containTerr bool - for _, v := range lines { - if strings.Contains(v, "terror_test.go") { - containTerr = true - break - } - } - c.Assert(containTerr, IsTrue) -} - -func (s *testTErrorSuite) TestErrorEqual(c *C) { - e1 := errors.New("test error") - c.Assert(e1, NotNil) - - e2 := errors.Trace(e1) - c.Assert(e2, NotNil) - - e3 := errors.Trace(e2) - c.Assert(e3, NotNil) - - c.Assert(errors.Cause(e2), Equals, e1) - c.Assert(errors.Cause(e3), Equals, e1) - c.Assert(errors.Cause(e2), Equals, errors.Cause(e3)) - - e4 := errors.New("test error") - c.Assert(errors.Cause(e4), Not(Equals), e1) - - e5 := errors.Errorf("test error") - c.Assert(errors.Cause(e5), Not(Equals), e1) - - c.Assert(ErrorEqual(e1, e2), IsTrue) - c.Assert(ErrorEqual(e1, e3), IsTrue) - c.Assert(ErrorEqual(e1, e4), IsTrue) - c.Assert(ErrorEqual(e1, e5), IsTrue) - - var e6 error - - c.Assert(ErrorEqual(nil, nil), IsTrue) - c.Assert(ErrorNotEqual(e1, e6), IsTrue) - code1 := ErrCode(9001) - code2 := ErrCode(9002) - te1 := ClassParser.Synthesize(code1, "abc") - te3 := ClassKV.New(code1, "abc") - te4 := ClassKV.New(code2, "abc") - c.Assert(ErrorEqual(te1, te3), IsFalse) - c.Assert(ErrorEqual(te3, te4), IsFalse) -} - -func (s *testTErrorSuite) TestLog(c *C) { - err := fmt.Errorf("xxx") - Log(err) -} diff --git a/parser/test.sh b/parser/test.sh index ce4ae4cb1f9ce..3f2b18cdf6e49 100644 --- a/parser/test.sh +++ b/parser/test.sh @@ -1,14 +1,3 @@ #!/bin/sh -# If 'check.TestingT' is not used in any of the *_test.go files in a subdir no tests will run. - -for f in $(git grep -l 'github.com/pingcap/check' | grep '/' | cut -d/ -f1 | uniq) -do - if ! grep -r TestingT "$f" > /dev/null - then - echo "check.TestingT missing from $f" - exit 1 - fi -done - GO111MODULE=on go test -p 1 -race -covermode=atomic -coverprofile=coverage.txt -coverpkg=./... ./... diff --git a/parser/test_driver/test_driver.go b/parser/test_driver/test_driver.go index 857cdeb320f4c..5a4ae2ae13681 100644 --- a/parser/test_driver/test_driver.go +++ b/parser/test_driver/test_driver.go @@ -11,7 +11,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -//+build !codes +//go:build !codes +// +build !codes package test_driver diff --git a/parser/test_driver/test_driver_datum.go b/parser/test_driver/test_driver_datum.go index 46bda5cce08d3..9caa494b2153d 100644 --- a/parser/test_driver/test_driver_datum.go +++ b/parser/test_driver/test_driver_datum.go @@ -11,7 +11,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -//+build !codes +//go:build !codes +// +build !codes package test_driver diff --git a/parser/test_driver/test_driver_helper.go b/parser/test_driver/test_driver_helper.go index 3ecd2653cf9b9..5ea4f5ca1dd8c 100644 --- a/parser/test_driver/test_driver_helper.go +++ b/parser/test_driver/test_driver_helper.go @@ -11,7 +11,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -//+build !codes +//go:build !codes +// +build !codes package test_driver diff --git a/parser/test_driver/test_driver_mydecimal.go b/parser/test_driver/test_driver_mydecimal.go index abd3f9403ebee..9632cf6db5134 100644 --- a/parser/test_driver/test_driver_mydecimal.go +++ b/parser/test_driver/test_driver_mydecimal.go @@ -11,7 +11,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -//+build !codes +//go:build !codes +// +build !codes package test_driver diff --git a/parser/types/etc.go b/parser/types/etc.go index 3488300c56a48..2fe3d113e8820 100644 --- a/parser/types/etc.go +++ b/parser/types/etc.go @@ -70,6 +70,36 @@ var type2Str = map[byte]string{ mysql.TypeYear: "year", } +var str2Type = map[string]byte{ + "bit": mysql.TypeBit, + "text": mysql.TypeBlob, + "date": mysql.TypeDate, + "datetime": mysql.TypeDatetime, + "unspecified": mysql.TypeUnspecified, + "decimal": mysql.TypeNewDecimal, + "double": mysql.TypeDouble, + "enum": mysql.TypeEnum, + "float": mysql.TypeFloat, + "geometry": mysql.TypeGeometry, + "mediumint": mysql.TypeInt24, + "json": mysql.TypeJSON, + "int": mysql.TypeLong, + "bigint": mysql.TypeLonglong, + "longtext": mysql.TypeLongBlob, + "mediumtext": mysql.TypeMediumBlob, + "null": mysql.TypeNull, + "set": mysql.TypeSet, + "smallint": mysql.TypeShort, + "char": mysql.TypeString, + "time": mysql.TypeDuration, + "timestamp": mysql.TypeTimestamp, + "tinyint": mysql.TypeTiny, + "tinytext": mysql.TypeTinyBlob, + "varchar": mysql.TypeVarchar, + "var_string": mysql.TypeVarString, + "year": mysql.TypeYear, +} + // TypeStr converts tp to a string. func TypeStr(tp byte) (r string) { return type2Str[tp] @@ -94,6 +124,23 @@ func TypeToStr(tp byte, cs string) (r string) { return ts } +// StrToType convert a string to type enum. +// Args: +// ts: type string +func StrToType(ts string) (tp byte) { + if strings.Contains(ts, "blob") { + ts = strings.Replace(ts, "blob", "text", 1) + } else if strings.Contains(ts, "binary") { + ts = strings.Replace(ts, "binary", "char", 1) + } + + if tp, ok := str2Type[ts]; ok { + return tp + } + + return mysql.TypeUnspecified +} + var ( dig2bytes = [10]int{0, 1, 1, 2, 2, 3, 3, 4, 4, 4} ) @@ -104,5 +151,13 @@ const ( wordSize = 4 // A word is 4 bytes int32. ) -// ErrInvalidDefault is returned when meet a invalid default value. -var ErrInvalidDefault = terror.ClassTypes.NewStd(mysql.ErrInvalidDefault) +var ( + // ErrInvalidDefault is returned when meet a invalid default value. + ErrInvalidDefault = terror.ClassTypes.NewStd(mysql.ErrInvalidDefault) + // ErrDataOutOfRange is returned when meet a value out of range. + ErrDataOutOfRange = terror.ClassTypes.NewStd(mysql.ErrDataOutOfRange) + // ErrTruncatedWrongValue is returned when meet a value bigger than 99999999999999999999999999999999999999999999999999999999999999999 during parsing. + ErrTruncatedWrongValue = terror.ClassTypes.NewStd(mysql.ErrTruncatedWrongValue) + // ErrIllegalValueForType is returned when strconv.ParseFloat meet strconv.ErrRange during parsing. + ErrIllegalValueForType = terror.ClassTypes.NewStd(mysql.ErrIllegalValueForType) +) diff --git a/parser/types/etc_test.go b/parser/types/etc_test.go new file mode 100644 index 0000000000000..5ed4269eb887e --- /dev/null +++ b/parser/types/etc_test.go @@ -0,0 +1,34 @@ +// Copyright 2021 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 ( + "testing" + + "github.com/pingcap/tidb/parser/mysql" + "github.com/stretchr/testify/require" +) + +func TestStrToType(t *testing.T) { + for tp, str := range type2Str { + a := StrToType(str) + require.Equal(t, tp, a) + } + + tp := StrToType("blob") + require.Equal(t, tp, mysql.TypeBlob) + + tp = StrToType("binary") + require.Equal(t, tp, mysql.TypeString) +} diff --git a/parser/types/field_type_test.go b/parser/types/field_type_test.go index 9a25eebc72a0d..b552c7aa0a3fd 100644 --- a/parser/types/field_type_test.go +++ b/parser/types/field_type_test.go @@ -17,195 +17,185 @@ import ( "fmt" "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/charset" "github.com/pingcap/tidb/parser/mysql" . "github.com/pingcap/tidb/parser/types" + "github.com/stretchr/testify/require" // import parser_driver _ "github.com/pingcap/tidb/parser/test_driver" ) -func TestT(t *testing.T) { - CustomVerboseFlag = true - TestingT(t) -} - -var _ = Suite(&testFieldTypeSuite{}) - -type testFieldTypeSuite struct { -} - -func (s *testFieldTypeSuite) TestFieldType(c *C) { +func TestFieldType(t *testing.T) { ft := NewFieldType(mysql.TypeDuration) - c.Assert(ft.Flen, Equals, UnspecifiedLength) - c.Assert(ft.Decimal, Equals, UnspecifiedLength) + require.Equal(t, UnspecifiedLength, ft.Flen) + require.Equal(t, UnspecifiedLength, ft.Decimal) ft.Decimal = 5 - c.Assert(ft.String(), Equals, "time(5)") - c.Assert(HasCharset(ft), IsFalse) + require.Equal(t, "time(5)", ft.String()) + require.False(t, HasCharset(ft)) ft = NewFieldType(mysql.TypeLong) ft.Flen = 5 ft.Flag = mysql.UnsignedFlag | mysql.ZerofillFlag - c.Assert(ft.String(), Equals, "int(5) UNSIGNED ZEROFILL") - c.Assert(ft.InfoSchemaStr(), Equals, "int(5) unsigned") - c.Assert(HasCharset(ft), IsFalse) + require.Equal(t, "int(5) UNSIGNED ZEROFILL", ft.String()) + require.Equal(t, "int(5) unsigned", ft.InfoSchemaStr()) + require.False(t, HasCharset(ft)) ft = NewFieldType(mysql.TypeFloat) ft.Flen = 12 // Default ft.Decimal = 3 // Not Default - c.Assert(ft.String(), Equals, "float(12,3)") + require.Equal(t, "float(12,3)", ft.String()) ft = NewFieldType(mysql.TypeFloat) ft.Flen = 12 // Default ft.Decimal = -1 // Default - c.Assert(ft.String(), Equals, "float") + require.Equal(t, "float", ft.String()) ft = NewFieldType(mysql.TypeFloat) ft.Flen = 5 // Not Default ft.Decimal = -1 // Default - c.Assert(ft.String(), Equals, "float") + require.Equal(t, "float", ft.String()) ft = NewFieldType(mysql.TypeFloat) ft.Flen = 7 // Not Default ft.Decimal = 3 // Not Default - c.Assert(ft.String(), Equals, "float(7,3)") - c.Assert(HasCharset(ft), IsFalse) + require.Equal(t, "float(7,3)", ft.String()) + require.False(t, HasCharset(ft)) ft = NewFieldType(mysql.TypeDouble) ft.Flen = 22 // Default ft.Decimal = 3 // Not Default - c.Assert(ft.String(), Equals, "double(22,3)") + require.Equal(t, "double(22,3)", ft.String()) ft = NewFieldType(mysql.TypeDouble) ft.Flen = 22 // Default ft.Decimal = -1 // Default - c.Assert(ft.String(), Equals, "double") + require.Equal(t, "double", ft.String()) ft = NewFieldType(mysql.TypeDouble) ft.Flen = 5 // Not Default ft.Decimal = -1 // Default - c.Assert(ft.String(), Equals, "double") + require.Equal(t, "double", ft.String()) ft = NewFieldType(mysql.TypeDouble) ft.Flen = 7 // Not Default ft.Decimal = 3 // Not Default - c.Assert(ft.String(), Equals, "double(7,3)") - c.Assert(HasCharset(ft), IsFalse) + require.Equal(t, "double(7,3)", ft.String()) + require.False(t, HasCharset(ft)) ft = NewFieldType(mysql.TypeBlob) ft.Flen = 10 ft.Charset = "UTF8" ft.Collate = "UTF8_UNICODE_GI" - c.Assert(ft.String(), Equals, "text CHARACTER SET UTF8 COLLATE UTF8_UNICODE_GI") - c.Assert(HasCharset(ft), IsTrue) + require.Equal(t, "text CHARACTER SET UTF8 COLLATE UTF8_UNICODE_GI", ft.String()) + require.True(t, HasCharset(ft)) ft = NewFieldType(mysql.TypeVarchar) ft.Flen = 10 ft.Flag |= mysql.BinaryFlag - c.Assert(ft.String(), Equals, "varchar(10) BINARY") - c.Assert(HasCharset(ft), IsFalse) + require.Equal(t, "varchar(10) BINARY", ft.String()) + require.False(t, HasCharset(ft)) ft = NewFieldType(mysql.TypeString) ft.Charset = charset.CollationBin ft.Flag |= mysql.BinaryFlag - c.Assert(ft.String(), Equals, "binary(1)") - c.Assert(HasCharset(ft), IsFalse) + require.Equal(t, "binary(1)", ft.String()) + require.False(t, HasCharset(ft)) ft = NewFieldType(mysql.TypeEnum) ft.Elems = []string{"a", "b"} - c.Assert(ft.String(), Equals, "enum('a','b')") - c.Assert(HasCharset(ft), IsTrue) + require.Equal(t, "enum('a','b')", ft.String()) + require.True(t, HasCharset(ft)) ft = NewFieldType(mysql.TypeEnum) ft.Elems = []string{"'a'", "'b'"} - c.Assert(ft.String(), Equals, "enum('''a''','''b''')") - c.Assert(HasCharset(ft), IsTrue) + require.Equal(t, "enum('''a''','''b''')", ft.String()) + require.True(t, HasCharset(ft)) ft = NewFieldType(mysql.TypeEnum) ft.Elems = []string{"a\nb", "a\tb", "a\rb"} - c.Assert(ft.String(), Equals, "enum('a\\nb','a\tb','a\\rb')") - c.Assert(HasCharset(ft), IsTrue) + require.Equal(t, "enum('a\\nb','a\tb','a\\rb')", ft.String()) + require.True(t, HasCharset(ft)) ft = NewFieldType(mysql.TypeEnum) ft.Elems = []string{"a\nb", "a'\t\r\nb", "a\rb"} - c.Assert(ft.String(), Equals, "enum('a\\nb','a'' \\r\\nb','a\\rb')") - c.Assert(HasCharset(ft), IsTrue) + require.Equal(t, "enum('a\\nb','a'' \\r\\nb','a\\rb')", ft.String()) + require.True(t, HasCharset(ft)) ft = NewFieldType(mysql.TypeSet) ft.Elems = []string{"a", "b"} - c.Assert(ft.String(), Equals, "set('a','b')") - c.Assert(HasCharset(ft), IsTrue) + require.Equal(t, "set('a','b')", ft.String()) + require.True(t, HasCharset(ft)) ft = NewFieldType(mysql.TypeSet) ft.Elems = []string{"'a'", "'b'"} - c.Assert(ft.String(), Equals, "set('''a''','''b''')") - c.Assert(HasCharset(ft), IsTrue) + require.Equal(t, "set('''a''','''b''')", ft.String()) + require.True(t, HasCharset(ft)) ft = NewFieldType(mysql.TypeSet) ft.Elems = []string{"a\nb", "a'\t\r\nb", "a\rb"} - c.Assert(ft.String(), Equals, "set('a\\nb','a'' \\r\\nb','a\\rb')") - c.Assert(HasCharset(ft), IsTrue) + require.Equal(t, "set('a\\nb','a'' \\r\\nb','a\\rb')", ft.String()) + require.True(t, HasCharset(ft)) ft = NewFieldType(mysql.TypeSet) ft.Elems = []string{"a'\nb", "a'b\tc"} - c.Assert(ft.String(), Equals, "set('a''\\nb','a''b c')") - c.Assert(HasCharset(ft), IsTrue) + require.Equal(t, "set('a''\\nb','a''b c')", ft.String()) + require.True(t, HasCharset(ft)) ft = NewFieldType(mysql.TypeTimestamp) ft.Flen = 8 ft.Decimal = 2 - c.Assert(ft.String(), Equals, "timestamp(2)") - c.Assert(HasCharset(ft), IsFalse) + require.Equal(t, "timestamp(2)", ft.String()) + require.False(t, HasCharset(ft)) ft = NewFieldType(mysql.TypeTimestamp) ft.Flen = 8 ft.Decimal = 0 - c.Assert(ft.String(), Equals, "timestamp") - c.Assert(HasCharset(ft), IsFalse) + require.Equal(t, "timestamp", ft.String()) + require.False(t, HasCharset(ft)) ft = NewFieldType(mysql.TypeDatetime) ft.Flen = 8 ft.Decimal = 2 - c.Assert(ft.String(), Equals, "datetime(2)") - c.Assert(HasCharset(ft), IsFalse) + require.Equal(t, "datetime(2)", ft.String()) + require.False(t, HasCharset(ft)) ft = NewFieldType(mysql.TypeDatetime) ft.Flen = 8 ft.Decimal = 0 - c.Assert(ft.String(), Equals, "datetime") - c.Assert(HasCharset(ft), IsFalse) + require.Equal(t, "datetime", ft.String()) + require.False(t, HasCharset(ft)) ft = NewFieldType(mysql.TypeDate) ft.Flen = 8 ft.Decimal = 2 - c.Assert(ft.String(), Equals, "date") - c.Assert(HasCharset(ft), IsFalse) + require.Equal(t, "date", ft.String()) + require.False(t, HasCharset(ft)) ft = NewFieldType(mysql.TypeDate) ft.Flen = 8 ft.Decimal = 0 - c.Assert(ft.String(), Equals, "date") - c.Assert(HasCharset(ft), IsFalse) + require.Equal(t, "date", ft.String()) + require.False(t, HasCharset(ft)) ft = NewFieldType(mysql.TypeYear) ft.Flen = 4 ft.Decimal = 0 - c.Assert(ft.String(), Equals, "year(4)") - c.Assert(HasCharset(ft), IsFalse) + require.Equal(t, "year(4)", ft.String()) + require.False(t, HasCharset(ft)) ft = NewFieldType(mysql.TypeYear) ft.Flen = 2 ft.Decimal = 2 - c.Assert(ft.String(), Equals, "year(2)") // Note: Invalid year. - c.Assert(HasCharset(ft), IsFalse) + require.Equal(t, "year(2)", ft.String()) + require.False(t, HasCharset(ft)) ft = NewFieldType(mysql.TypeVarchar) ft.Flen = 0 ft.Decimal = 0 - c.Assert(ft.String(), Equals, "varchar(0)") - c.Assert(HasCharset(ft), IsTrue) + require.Equal(t, "varchar(0)", ft.String()) + require.True(t, HasCharset(ft)) ft = NewFieldType(mysql.TypeString) ft.Flen = 0 ft.Decimal = 0 - c.Assert(ft.String(), Equals, "char(0)") - c.Assert(HasCharset(ft), IsTrue) + require.Equal(t, "char(0)", ft.String()) + require.True(t, HasCharset(ft)) } -func (s *testFieldTypeSuite) TestHasCharsetFromStmt(c *C) { +func TestHasCharsetFromStmt(t *testing.T) { template := "CREATE TABLE t(a %s)" types := []struct { @@ -243,17 +233,17 @@ func (s *testFieldTypeSuite) TestHasCharsetFromStmt(c *C) { } p := parser.New() - for _, t := range types { - sql := fmt.Sprintf(template, t.strType) + for _, typ := range types { + sql := fmt.Sprintf(template, typ.strType) stmt, err := p.ParseOneStmt(sql, "", "") - c.Assert(err, IsNil) + require.NoError(t, err) col := stmt.(*ast.CreateTableStmt).Cols[0] - c.Assert(HasCharset(col.Tp), Equals, t.hasCharset) + require.Equal(t, typ.hasCharset, HasCharset(col.Tp)) } } -func (s *testFieldTypeSuite) TestEnumSetFlen(c *C) { +func TestEnumSetFlen(t *testing.T) { p := parser.New() cases := []struct { sql string @@ -278,37 +268,36 @@ func (s *testFieldTypeSuite) TestEnumSetFlen(c *C) { for _, ca := range cases { stmt, err := p.ParseOneStmt(fmt.Sprintf("create table t (e %v)", ca.sql), "", "") - c.Assert(err, IsNil) + require.NoError(t, err) col := stmt.(*ast.CreateTableStmt).Cols[0] - c.Assert(col.Tp.Flen, Equals, ca.ex) + require.Equal(t, ca.ex, col.Tp.Flen) } } -func (s *testFieldTypeSuite) TestFieldTypeEqual(c *C) { - +func TestFieldTypeEqual(t *testing.T) { // Tp not equal ft1 := NewFieldType(mysql.TypeDouble) ft2 := NewFieldType(mysql.TypeFloat) - c.Assert(ft1.Equal(ft2), Equals, false) + require.Equal(t, false, ft1.Equal(ft2)) // Decimal not equal ft2 = NewFieldType(mysql.TypeDouble) ft2.Decimal = 5 - c.Assert(ft1.Equal(ft2), Equals, false) + require.Equal(t, false, ft1.Equal(ft2)) // Flen not equal and decimal not -1 ft1.Decimal = 5 ft1.Flen = 22 - c.Assert(ft1.Equal(ft2), Equals, false) + require.Equal(t, false, ft1.Equal(ft2)) // Flen equal ft2.Flen = 22 - c.Assert(ft1.Equal(ft2), Equals, true) + require.Equal(t, true, ft1.Equal(ft2)) // Decimal is -1 ft1.Decimal = -1 ft2.Decimal = -1 ft1.Flen = 23 - c.Assert(ft1.Equal(ft2), Equals, true) + require.Equal(t, true, ft1.Equal(ft2)) } diff --git a/parser/yy_parser.go b/parser/yy_parser.go index ba11258a8d040..df3f416fad2e7 100644 --- a/parser/yy_parser.go +++ b/parser/yy_parser.go @@ -26,6 +26,7 @@ import ( "github.com/pingcap/tidb/parser/charset" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" + "github.com/pingcap/tidb/parser/types" ) var ( @@ -272,7 +273,12 @@ func toInt(l yyLexer, lval *yySymType, str string) int { func toDecimal(l yyLexer, lval *yySymType, str string) int { dec, err := ast.NewDecimal(str) if err != nil { - l.AppendError(l.Errorf("decimal literal: %v", err)) + if terror.ErrorEqual(err, types.ErrDataOutOfRange) { + l.AppendWarn(types.ErrTruncatedWrongValue.FastGenByArgs("DECIMAL", dec)) + dec, _ = ast.NewDecimal(mysql.DefaultDecimal) + } else { + l.AppendError(l.Errorf("decimal literal: %v", err)) + } } lval.item = dec return decLit @@ -281,6 +287,11 @@ func toDecimal(l yyLexer, lval *yySymType, str string) int { func toFloat(l yyLexer, lval *yySymType, str string) int { n, err := strconv.ParseFloat(str, 64) if err != nil { + e := err.(*strconv.NumError) + if e.Err == strconv.ErrRange { + l.AppendError(types.ErrIllegalValueForType.GenWithStackByArgs("double", str)) + return int(unicode.ReplacementChar) + } l.AppendError(l.Errorf("float literal: %v", err)) return int(unicode.ReplacementChar) } @@ -385,7 +396,7 @@ var ( func resetParams(p *Parser) { p.charset = mysql.DefaultCharset p.collation = mysql.DefaultCollationName - p.lexer.encoding = charset.Encoding{} + p.lexer.encoding = charset.UTF8Encoding } // ParseParam represents the parameter of parsing. @@ -425,6 +436,6 @@ type CharsetClient string // ApplyOn implements ParseParam interface. func (c CharsetClient) ApplyOn(p *Parser) error { - p.lexer.encoding = *charset.NewEncoding(string(c)) + p.lexer.encoding = charset.NewEncoding(string(c)) return nil } diff --git a/planner/cascades/enforcer_rules_test.go b/planner/cascades/enforcer_rules_test.go index cd971149629d9..a71a7cbd9c680 100644 --- a/planner/cascades/enforcer_rules_test.go +++ b/planner/cascades/enforcer_rules_test.go @@ -24,8 +24,6 @@ import ( ) func TestGetEnforcerRules(t *testing.T) { - t.Parallel() - prop := &property.PhysicalProperty{} group := memo.NewGroupWithSchema(nil, expression.NewSchema()) enforcers := GetEnforcerRules(group, prop) @@ -42,7 +40,6 @@ func TestGetEnforcerRules(t *testing.T) { } func TestNewProperties(t *testing.T) { - t.Parallel() prop := &property.PhysicalProperty{} col := &expression.Column{} group := memo.NewGroupWithSchema(nil, expression.NewSchema()) diff --git a/planner/cascades/integration_test.go b/planner/cascades/integration_test.go index 144f00863b43a..426a4d467fa3b 100644 --- a/planner/cascades/integration_test.go +++ b/planner/cascades/integration_test.go @@ -25,8 +25,6 @@ import ( ) func TestSimpleProjDual(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -40,8 +38,6 @@ func TestSimpleProjDual(t *testing.T) { } func TestPKIsHandleRangeScan(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -72,8 +68,6 @@ func TestPKIsHandleRangeScan(t *testing.T) { } func TestIndexScan(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -104,8 +98,6 @@ func TestIndexScan(t *testing.T) { } func TestBasicShow(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -121,8 +113,6 @@ func TestBasicShow(t *testing.T) { } func TestSort(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -152,8 +142,6 @@ func TestSort(t *testing.T) { } func TestAggregation(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -186,8 +174,6 @@ func TestAggregation(t *testing.T) { } func TestPushdownDistinctEnable(t *testing.T) { - t.Parallel() - var input []string var output []struct { SQL string @@ -203,8 +189,6 @@ func TestPushdownDistinctEnable(t *testing.T) { } func TestPushdownDistinctDisable(t *testing.T) { - t.Parallel() - var input []string var output []struct { SQL string @@ -253,8 +237,6 @@ func doTestPushdownDistinct(t *testing.T, vars, input []string, output []struct } func TestSimplePlans(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -284,8 +266,6 @@ func TestSimplePlans(t *testing.T) { } func TestJoin(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -321,8 +301,6 @@ func TestJoin(t *testing.T) { } func TestApply(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -354,8 +332,6 @@ func TestApply(t *testing.T) { } func TestMemTableScan(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -382,8 +358,6 @@ func TestMemTableScan(t *testing.T) { } func TestTopN(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -413,8 +387,6 @@ func TestTopN(t *testing.T) { } func TestCascadePlannerHashedPartTable(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -449,8 +421,6 @@ func TestCascadePlannerHashedPartTable(t *testing.T) { } func TestInlineProjection(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() diff --git a/planner/cascades/optimize_test.go b/planner/cascades/optimize_test.go index 505f7bcf41e1d..104e1bd59b3e2 100644 --- a/planner/cascades/optimize_test.go +++ b/planner/cascades/optimize_test.go @@ -19,6 +19,7 @@ import ( "math" "testing" + "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/parser" @@ -30,11 +31,10 @@ import ( ) func TestImplGroupZeroCost(t *testing.T) { - t.Parallel() - p := parser.New() ctx := plannercore.MockContext() is := infoschema.MockInfoSchema([]*model.TableInfo{plannercore.MockSignedTable()}) + domain.GetDomain(ctx).MockInfoCacheAndLoadInfoSchema(is) stmt, err := p.ParseOneStmt("select t1.a, t2.a from t as t1 left join t as t2 on t1.a = t2.a where t1.a < 1.0", "", "") require.NoError(t, err) @@ -55,11 +55,10 @@ func TestImplGroupZeroCost(t *testing.T) { } func TestInitGroupSchema(t *testing.T) { - t.Parallel() - p := parser.New() ctx := plannercore.MockContext() is := infoschema.MockInfoSchema([]*model.TableInfo{plannercore.MockSignedTable()}) + domain.GetDomain(ctx).MockInfoCacheAndLoadInfoSchema(is) stmt, err := p.ParseOneStmt("select a from t", "", "") require.NoError(t, err) @@ -78,11 +77,10 @@ func TestInitGroupSchema(t *testing.T) { } func TestFillGroupStats(t *testing.T) { - t.Parallel() - p := parser.New() ctx := plannercore.MockContext() is := infoschema.MockInfoSchema([]*model.TableInfo{plannercore.MockSignedTable()}) + domain.GetDomain(ctx).MockInfoCacheAndLoadInfoSchema(is) stmt, err := p.ParseOneStmt("select * from t t1 join t t2 on t1.a = t2.a", "", "") require.NoError(t, err) @@ -100,11 +98,10 @@ func TestFillGroupStats(t *testing.T) { } func TestPreparePossibleProperties(t *testing.T) { - t.Parallel() - p := parser.New() ctx := plannercore.MockContext() is := infoschema.MockInfoSchema([]*model.TableInfo{plannercore.MockSignedTable()}) + domain.GetDomain(ctx).MockInfoCacheAndLoadInfoSchema(is) optimizer := NewOptimizer() optimizer.ResetTransformationRules(map[memo.Operand][]Transformation{ @@ -193,11 +190,10 @@ func (rule *fakeTransformation) OnTransform(old *memo.ExprIter) (newExprs []*mem } func TestAppliedRuleSet(t *testing.T) { - t.Parallel() - p := parser.New() ctx := plannercore.MockContext() is := infoschema.MockInfoSchema([]*model.TableInfo{plannercore.MockSignedTable()}) + domain.GetDomain(ctx).MockInfoCacheAndLoadInfoSchema(is) optimizer := NewOptimizer() rule := fakeTransformation{} diff --git a/planner/cascades/stringer_test.go b/planner/cascades/stringer_test.go index c0ebdb54d7fec..bdc4abb8486b6 100644 --- a/planner/cascades/stringer_test.go +++ b/planner/cascades/stringer_test.go @@ -18,6 +18,7 @@ import ( "context" "testing" + "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/parser/model" @@ -28,8 +29,6 @@ import ( ) func TestGroupStringer(t *testing.T) { - t.Parallel() - optimizer := NewOptimizer() optimizer.ResetTransformationRules(map[memo.Operand][]Transformation{ memo.OperandSelection: { @@ -54,6 +53,7 @@ func TestGroupStringer(t *testing.T) { p := parser.New() ctx := plannercore.MockContext() is := infoschema.MockInfoSchema([]*model.TableInfo{plannercore.MockSignedTable()}) + domain.GetDomain(ctx).MockInfoCacheAndLoadInfoSchema(is) for i, sql := range input { stmt, err := p.ParseOneStmt(sql, "", "") require.NoError(t, err) diff --git a/planner/cascades/transformation_rules.go b/planner/cascades/transformation_rules.go index 14cf33a6410d5..6a0d12eb977c0 100644 --- a/planner/cascades/transformation_rules.go +++ b/planner/cascades/transformation_rules.go @@ -920,7 +920,7 @@ func (r *pushDownJoin) predicatePushDown( leftCond = append(join.LeftConditions, derivedLeftJoinCond...) join.LeftConditions = nil remainCond = append(expression.ScalarFuncs2Exprs(equalCond), otherCond...) - remainCond = append(remainCond, leftPushCond...) + remainCond = append(remainCond, leftPushCond...) // nozero } else { remainCond = expression.ExtractFiltersFromDNFs(join.SCtx(), remainCond) // Only derive left where condition, because right where condition cannot be pushed down @@ -931,7 +931,7 @@ func (r *pushDownJoin) predicatePushDown( rightCond = append(join.RightConditions, derivedRightJoinCond...) join.RightConditions = nil remainCond = append(expression.ScalarFuncs2Exprs(equalCond), otherCond...) - remainCond = append(remainCond, rightPushCond...) + remainCond = append(remainCond, rightPushCond...) // nozero } default: // TODO: Enhance this rule to deal with Semi/SmiAnti Joins. diff --git a/planner/cascades/transformation_rules_test.go b/planner/cascades/transformation_rules_test.go index 51fbae0d48e0f..cfd25f42c1c38 100644 --- a/planner/cascades/transformation_rules_test.go +++ b/planner/cascades/transformation_rules_test.go @@ -18,6 +18,7 @@ import ( "context" "testing" + "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/parser/model" @@ -34,6 +35,7 @@ func testGroupToString(t *testing.T, input []string, output []struct { p := parser.New() ctx := plannercore.MockContext() is := infoschema.MockInfoSchema([]*model.TableInfo{plannercore.MockSignedTable()}) + domain.GetDomain(ctx).MockInfoCacheAndLoadInfoSchema(is) for i, sql := range input { stmt, err := p.ParseOneStmt(sql, "", "") @@ -60,8 +62,6 @@ func testGroupToString(t *testing.T, input []string, output []struct { } func TestAggPushDownGather(t *testing.T) { - t.Parallel() - optimizer := NewOptimizer() optimizer.ResetTransformationRules(TransformationRuleBatch{ memo.OperandAggregation: { @@ -85,6 +85,7 @@ func TestAggPushDownGather(t *testing.T) { p := parser.New() ctx := plannercore.MockContext() is := infoschema.MockInfoSchema([]*model.TableInfo{plannercore.MockSignedTable()}) + domain.GetDomain(ctx).MockInfoCacheAndLoadInfoSchema(is) for i, sql := range input { stmt, err := p.ParseOneStmt(sql, "", "") require.NoError(t, err) @@ -113,8 +114,6 @@ func TestAggPushDownGather(t *testing.T) { } func TestPredicatePushDown(t *testing.T) { - t.Parallel() - optimizer := NewOptimizer() optimizer.ResetTransformationRules( TransformationRuleBatch{ // TiDB layer @@ -156,8 +155,6 @@ func TestPredicatePushDown(t *testing.T) { } func TestTopNRules(t *testing.T) { - t.Parallel() - optimizer := NewOptimizer() optimizer.ResetTransformationRules( TransformationRuleBatch{ // TiDB layer @@ -197,8 +194,6 @@ func TestTopNRules(t *testing.T) { } func TestProjectionElimination(t *testing.T) { - t.Parallel() - optimizer := NewOptimizer() optimizer.ResetTransformationRules(TransformationRuleBatch{ memo.OperandProjection: { @@ -219,8 +214,6 @@ func TestProjectionElimination(t *testing.T) { } func TestEliminateMaxMin(t *testing.T) { - t.Parallel() - optimizer := NewOptimizer() optimizer.ResetTransformationRules(map[memo.Operand][]Transformation{ memo.OperandAggregation: { @@ -240,8 +233,6 @@ func TestEliminateMaxMin(t *testing.T) { } func TestMergeAggregationProjection(t *testing.T) { - t.Parallel() - optimizer := NewOptimizer() optimizer.ResetTransformationRules(map[memo.Operand][]Transformation{ memo.OperandAggregation: { @@ -261,8 +252,6 @@ func TestMergeAggregationProjection(t *testing.T) { } func TestMergeAdjacentTopN(t *testing.T) { - t.Parallel() - optimizer := NewOptimizer() optimizer.ResetTransformationRules(map[memo.Operand][]Transformation{ memo.OperandLimit: { @@ -289,8 +278,6 @@ func TestMergeAdjacentTopN(t *testing.T) { } func TestMergeAdjacentLimit(t *testing.T) { - t.Parallel() - optimizer := NewOptimizer() optimizer.ResetTransformationRules(TransformationRuleBatch{ memo.OperandLimit: { @@ -311,8 +298,6 @@ func TestMergeAdjacentLimit(t *testing.T) { } func TestTransformLimitToTableDual(t *testing.T) { - t.Parallel() - optimizer := NewOptimizer() optimizer.ResetTransformationRules(TransformationRuleBatch{ memo.OperandLimit: { @@ -332,8 +317,6 @@ func TestTransformLimitToTableDual(t *testing.T) { } func TestPostTransformationRules(t *testing.T) { - t.Parallel() - optimizer := NewOptimizer() optimizer.ResetTransformationRules(TransformationRuleBatch{ memo.OperandLimit: { @@ -353,8 +336,6 @@ func TestPostTransformationRules(t *testing.T) { } func TestPushLimitDownTiKVSingleGather(t *testing.T) { - t.Parallel() - optimizer := NewOptimizer() optimizer.ResetTransformationRules(map[memo.Operand][]Transformation{ memo.OperandLimit: { @@ -380,8 +361,6 @@ func TestPushLimitDownTiKVSingleGather(t *testing.T) { } func TestEliminateOuterJoin(t *testing.T) { - t.Parallel() - optimizer := NewOptimizer() optimizer.ResetTransformationRules(map[memo.Operand][]Transformation{ memo.OperandAggregation: { @@ -404,8 +383,6 @@ func TestEliminateOuterJoin(t *testing.T) { } func TestTransformAggregateCaseToSelection(t *testing.T) { - t.Parallel() - optimizer := NewOptimizer() optimizer.ResetTransformationRules(map[memo.Operand][]Transformation{ memo.OperandAggregation: { @@ -425,8 +402,6 @@ func TestTransformAggregateCaseToSelection(t *testing.T) { } func TestTransformAggToProj(t *testing.T) { - t.Parallel() - optimizer := NewOptimizer() optimizer.ResetTransformationRules(map[memo.Operand][]Transformation{ memo.OperandAggregation: { @@ -449,8 +424,6 @@ func TestTransformAggToProj(t *testing.T) { } func TestDecorrelate(t *testing.T) { - t.Parallel() - optimizer := NewOptimizer() optimizer.ResetTransformationRules(map[memo.Operand][]Transformation{ memo.OperandApply: { @@ -471,8 +444,6 @@ func TestDecorrelate(t *testing.T) { } func TestInjectProj(t *testing.T) { - t.Parallel() - optimizer := NewOptimizer() optimizer.ResetTransformationRules(map[memo.Operand][]Transformation{ memo.OperandLimit: { diff --git a/planner/core/cache.go b/planner/core/cache.go index 1e81ba7573c2c..a386c4a5a3649 100644 --- a/planner/core/cache.go +++ b/planner/core/cache.go @@ -38,7 +38,7 @@ var ( // The value is false unless "prepared-plan-cache-enabled" is true in configuration. preparedPlanCacheEnabledValue int32 = 0 // PreparedPlanCacheCapacity stores the global config "prepared-plan-cache-capacity". - PreparedPlanCacheCapacity uint = 100 + PreparedPlanCacheCapacity uint = 1000 // PreparedPlanCacheMemoryGuardRatio stores the global config "prepared-plan-cache-memory-guard-ratio". PreparedPlanCacheMemoryGuardRatio = 0.1 // PreparedPlanCacheMaxMemory stores the max memory size defined in the global config "performance-server-memory-quota". @@ -74,6 +74,7 @@ type pstmtPlanCacheKey struct { timezoneOffset int isolationReadEngines map[kv.StoreType]struct{} selectLimit uint64 + bindSQL string hash []byte } @@ -104,6 +105,7 @@ func (key *pstmtPlanCacheKey) Hash() []byte { key.hash = append(key.hash, kv.TiFlash.Name()...) } key.hash = codec.EncodeInt(key.hash, int64(key.selectLimit)) + key.hash = append(key.hash, hack.Slice(key.bindSQL)...) } return key.hash } @@ -125,7 +127,7 @@ func SetPstmtIDSchemaVersion(key kvcache.Key, pstmtID uint32, schemaVersion int6 } // NewPSTMTPlanCacheKey creates a new pstmtPlanCacheKey object. -func NewPSTMTPlanCacheKey(sessionVars *variable.SessionVars, pstmtID uint32, schemaVersion int64) kvcache.Key { +func NewPSTMTPlanCacheKey(sessionVars *variable.SessionVars, pstmtID uint32, schemaVersion int64, bindSQL string) kvcache.Key { timezoneOffset := 0 if sessionVars.TimeZone != nil { _, timezoneOffset = time.Now().In(sessionVars.TimeZone).Zone() @@ -139,6 +141,7 @@ func NewPSTMTPlanCacheKey(sessionVars *variable.SessionVars, pstmtID uint32, sch timezoneOffset: timezoneOffset, isolationReadEngines: make(map[kv.StoreType]struct{}), selectLimit: sessionVars.SelectLimit, + bindSQL: bindSQL, } for k, v := range sessionVars.IsolationReadEngines { key.isolationReadEngines[k] = v diff --git a/planner/core/cache_test.go b/planner/core/cache_test.go index 5255fe68c2f91..074d1e4cf2828 100644 --- a/planner/core/cache_test.go +++ b/planner/core/cache_test.go @@ -23,12 +23,11 @@ import ( ) func TestCacheKey(t *testing.T) { - t.Parallel() ctx := MockContext() ctx.GetSessionVars().SnapshotTS = 0 ctx.GetSessionVars().SQLMode = mysql.ModeNone ctx.GetSessionVars().TimeZone = time.UTC ctx.GetSessionVars().ConnectionID = 0 - key := NewPSTMTPlanCacheKey(ctx.GetSessionVars(), 1, 1) + key := NewPSTMTPlanCacheKey(ctx.GetSessionVars(), 1, 1, "") require.Equal(t, []byte{0x74, 0x65, 0x73, 0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x74, 0x69, 0x64, 0x62, 0x74, 0x69, 0x6b, 0x76, 0x74, 0x69, 0x66, 0x6c, 0x61, 0x73, 0x68, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, key.Hash()) } diff --git a/planner/core/cacheable_checker.go b/planner/core/cacheable_checker.go index 52364c451ac83..ace4e45a3e074 100644 --- a/planner/core/cacheable_checker.go +++ b/planner/core/cacheable_checker.go @@ -18,6 +18,7 @@ import ( "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/sessionctx" driver "github.com/pingcap/tidb/types/parser_driver" "github.com/pingcap/tidb/util/logutil" @@ -138,6 +139,10 @@ func (checker *cacheableChecker) Enter(in ast.Node) (out ast.Node, skipChildren checker.cacheable = false return in, true } + if checker.isTempTable(node) { + checker.cacheable = false + return in, true + } } } return in, false @@ -157,6 +162,18 @@ func (checker *cacheableChecker) hasGeneratedCol(tn *ast.TableName) bool { return false } +func (checker *cacheableChecker) isTempTable(tn *ast.TableName) bool { + tb, err := checker.schema.TableByName(tn.Schema, tn.Name) + if err != nil { + logutil.BgLogger().Error("Error occur in checking cacheable", zap.Error(err)) + return false + } + if tb.Meta().TempTableType != model.TempTableNone { + return true + } + return false +} + func (checker *cacheableChecker) isPartitionTable(tn *ast.TableName) bool { tb, err := checker.schema.TableByName(tn.Schema, tn.Name) if err != nil { diff --git a/planner/core/cacheable_checker_test.go b/planner/core/cacheable_checker_test.go index 64d087ec31722..d4802db30f183 100644 --- a/planner/core/cacheable_checker_test.go +++ b/planner/core/cacheable_checker_test.go @@ -28,8 +28,6 @@ import ( ) func TestCacheable(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() diff --git a/planner/core/cbo_test.go b/planner/core/cbo_test.go index 93772785a1e69..603dfd030611a 100644 --- a/planner/core/cbo_test.go +++ b/planner/core/cbo_test.go @@ -441,20 +441,24 @@ func (s *testAnalyzeSuite) TestOutdatedAnalyze(c *C) { c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) c.Assert(h.Update(dom.InfoSchema()), IsNil) var input []struct { - SQL string - RatioOfPseudoEstimate float64 + SQL string + EnablePseudoForOutdatedStats bool + RatioOfPseudoEstimate float64 } var output []struct { - SQL string - RatioOfPseudoEstimate float64 - Plan []string + SQL string + EnablePseudoForOutdatedStats bool + RatioOfPseudoEstimate float64 + Plan []string } s.testData.GetTestCases(c, &input, &output) for i, tt := range input { + testKit.Se.GetSessionVars().SetEnablePseudoForOutdatedStats(tt.EnablePseudoForOutdatedStats) statistics.RatioOfPseudoEstimate.Store(tt.RatioOfPseudoEstimate) plan := testKit.MustQuery(tt.SQL) s.testData.OnRecord(func() { output[i].SQL = tt.SQL + output[i].EnablePseudoForOutdatedStats = tt.EnablePseudoForOutdatedStats output[i].RatioOfPseudoEstimate = tt.RatioOfPseudoEstimate output[i].Plan = s.testData.ConvertRowsToStrings(plan.Rows()) }) diff --git a/planner/core/collect_column_stats_usage.go b/planner/core/collect_column_stats_usage.go new file mode 100644 index 0000000000000..6396b1ddad34f --- /dev/null +++ b/planner/core/collect_column_stats_usage.go @@ -0,0 +1,252 @@ +// Copyright 2021 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, +// 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. + +package core + +import ( + "github.com/pingcap/tidb/expression" + "github.com/pingcap/tidb/parser/model" +) + +// predicateColumnCollector collects predicate columns from logical plan. Predicate columns are the columns whose statistics +// are utilized when making query plans, which usually occur in where conditions, join conditions and so on. +type predicateColumnCollector struct { + // colMap maps expression.Column.UniqueID to the table columns whose statistics are utilized to calculate statistics of the column. + colMap map[int64]map[model.TableColumnID]struct{} + // predicateCols records predicate columns. + predicateCols map[model.TableColumnID]struct{} + // cols is used to store columns collected from expressions and saves some allocation. + cols []*expression.Column +} + +func newPredicateColumnCollector() *predicateColumnCollector { + return &predicateColumnCollector{ + colMap: make(map[int64]map[model.TableColumnID]struct{}), + predicateCols: make(map[model.TableColumnID]struct{}), + // Pre-allocate a slice to reduce allocation, 8 doesn't have special meaning. + cols: make([]*expression.Column, 0, 8), + } +} + +func (c *predicateColumnCollector) addPredicateColumn(col *expression.Column) { + tblColIDs, ok := c.colMap[col.UniqueID] + if !ok { + // It may happen if some leaf of logical plan is LogicalMemTable/LogicalShow/LogicalShowDDLJobs. + return + } + for tblColID := range tblColIDs { + c.predicateCols[tblColID] = struct{}{} + } +} + +func (c *predicateColumnCollector) addPredicateColumnsFromExpression(expr expression.Expression) { + cols := expression.ExtractColumnsAndCorColumns(c.cols[:0], expr) + for _, col := range cols { + c.addPredicateColumn(col) + } +} + +func (c *predicateColumnCollector) addPredicateColumnsFromExpressions(list []expression.Expression) { + cols := expression.ExtractColumnsAndCorColumnsFromExpressions(c.cols[:0], list) + for _, col := range cols { + c.addPredicateColumn(col) + } +} + +func (c *predicateColumnCollector) updateColMap(col *expression.Column, relatedCols []*expression.Column) { + if _, ok := c.colMap[col.UniqueID]; !ok { + c.colMap[col.UniqueID] = map[model.TableColumnID]struct{}{} + } + for _, relatedCol := range relatedCols { + tblColIDs, ok := c.colMap[relatedCol.UniqueID] + if !ok { + // It may happen if some leaf of logical plan is LogicalMemTable/LogicalShow/LogicalShowDDLJobs. + continue + } + for tblColID := range tblColIDs { + c.colMap[col.UniqueID][tblColID] = struct{}{} + } + } +} + +func (c *predicateColumnCollector) updateColMapFromExpression(col *expression.Column, expr expression.Expression) { + c.updateColMap(col, expression.ExtractColumnsAndCorColumns(c.cols[:0], expr)) +} + +func (c *predicateColumnCollector) updateColMapFromExpressions(col *expression.Column, list []expression.Expression) { + c.updateColMap(col, expression.ExtractColumnsAndCorColumnsFromExpressions(c.cols[:0], list)) +} + +func (ds *DataSource) updateColMapAndAddPredicateColumns(c *predicateColumnCollector) { + tblID := ds.TableInfo().ID + for _, col := range ds.Schema().Columns { + tblColID := model.TableColumnID{TableID: tblID, ColumnID: col.ID} + c.colMap[col.UniqueID] = map[model.TableColumnID]struct{}{tblColID: {}} + } + // We should use `pushedDownConds` here. `allConds` is used for partition pruning, which doesn't need stats. + c.addPredicateColumnsFromExpressions(ds.pushedDownConds) +} + +func (p *LogicalJoin) updateColMapAndAddPredicateColumns(c *predicateColumnCollector) { + // The only schema change is merging two schemas so there is no new column. + // Assume statistics of all the columns in EqualConditions/LeftConditions/RightConditions/OtherConditions are needed. + exprs := make([]expression.Expression, 0, len(p.EqualConditions)+len(p.LeftConditions)+len(p.RightConditions)+len(p.OtherConditions)) + for _, cond := range p.EqualConditions { + exprs = append(exprs, cond) + } + for _, cond := range p.LeftConditions { + exprs = append(exprs, cond) + } + for _, cond := range p.RightConditions { + exprs = append(exprs, cond) + } + for _, cond := range p.OtherConditions { + exprs = append(exprs, cond) + } + c.addPredicateColumnsFromExpressions(exprs) +} + +func (p *LogicalUnionAll) updateColMapAndAddPredicateColumns(c *predicateColumnCollector) { + // statistics of the ith column of UnionAll come from statistics of the ith column of each child. + schemas := make([]*expression.Schema, 0, len(p.Children())) + relatedCols := make([]*expression.Column, 0, len(p.Children())) + for _, child := range p.Children() { + schemas = append(schemas, child.Schema()) + } + for i, col := range p.Schema().Columns { + relatedCols = relatedCols[:0] + for j := range p.Children() { + relatedCols = append(relatedCols, schemas[j].Columns[i]) + } + c.updateColMap(col, relatedCols) + } +} + +func (c *predicateColumnCollector) collectFromPlan(lp LogicalPlan) { + for _, child := range lp.Children() { + c.collectFromPlan(child) + } + switch x := lp.(type) { + case *DataSource: + x.updateColMapAndAddPredicateColumns(c) + case *LogicalIndexScan: + x.Source.updateColMapAndAddPredicateColumns(c) + // TODO: Is it redundant to add predicate columns from LogicalIndexScan.AccessConds? Is LogicalIndexScan.AccessConds a subset of LogicalIndexScan.Source.pushedDownConds. + c.addPredicateColumnsFromExpressions(x.AccessConds) + case *LogicalTableScan: + x.Source.updateColMapAndAddPredicateColumns(c) + // TODO: Is it redundant to add predicate columns from LogicalTableScan.AccessConds? Is LogicalTableScan.AccessConds a subset of LogicalTableScan.Source.pushedDownConds. + c.addPredicateColumnsFromExpressions(x.AccessConds) + case *TiKVSingleGather: + // TODO: Is it redundant? + x.Source.updateColMapAndAddPredicateColumns(c) + case *LogicalProjection: + // Schema change from children to self. + schema := x.Schema() + for i, expr := range x.Exprs { + c.updateColMapFromExpression(schema.Columns[i], expr) + } + case *LogicalSelection: + // Though the conditions in LogicalSelection are complex conditions which cannot be pushed down to DataSource, we still + // regard statistics of the columns in the conditions as needed. + c.addPredicateColumnsFromExpressions(x.Conditions) + case *LogicalAggregation: + // Just assume statistics of all the columns in GroupByItems are needed. + c.addPredicateColumnsFromExpressions(x.GroupByItems) + // Schema change from children to self. + schema := x.Schema() + for i, aggFunc := range x.AggFuncs { + c.updateColMapFromExpressions(schema.Columns[i], aggFunc.Args) + } + case *LogicalWindow: + // Statistics of the columns in LogicalWindow.PartitionBy are used in optimizeByShuffle4Window. + // It seems that we don't use statistics of the columns in LogicalWindow.OrderBy currently? + for _, item := range x.PartitionBy { + c.addPredicateColumn(item.Col) + } + // Schema change from children to self. + windowColumns := x.GetWindowResultColumns() + for i, col := range windowColumns { + c.updateColMapFromExpressions(col, x.WindowFuncDescs[i].Args) + } + case *LogicalJoin: + x.updateColMapAndAddPredicateColumns(c) + case *LogicalApply: + x.updateColMapAndAddPredicateColumns(c) + // Assume statistics of correlated columns are needed. + // Correlated columns can be found in LogicalApply.Children()[0].Schema(). Since we already visit LogicalApply.Children()[0], + // correlated columns must have existed in predicateColumnCollector.colMap. + for _, corCols := range x.CorCols { + c.addPredicateColumn(&corCols.Column) + } + case *LogicalSort: + // Assume statistics of all the columns in ByItems are needed. + for _, item := range x.ByItems { + c.addPredicateColumnsFromExpression(item.Expr) + } + case *LogicalTopN: + // Assume statistics of all the columns in ByItems are needed. + for _, item := range x.ByItems { + c.addPredicateColumnsFromExpression(item.Expr) + } + case *LogicalUnionAll: + x.updateColMapAndAddPredicateColumns(c) + case *LogicalPartitionUnionAll: + x.updateColMapAndAddPredicateColumns(c) + case *LogicalCTE: + // Visit seedPartLogicalPlan and recursivePartLogicalPlan first. + c.collectFromPlan(x.cte.seedPartLogicalPlan) + if x.cte.recursivePartLogicalPlan != nil { + c.collectFromPlan(x.cte.recursivePartLogicalPlan) + } + // Schema change from seedPlan/recursivePlan to self. + columns := x.Schema().Columns + seedColumns := x.cte.seedPartLogicalPlan.Schema().Columns + var recursiveColumns []*expression.Column + if x.cte.recursivePartLogicalPlan != nil { + recursiveColumns = x.cte.recursivePartLogicalPlan.Schema().Columns + } + relatedCols := make([]*expression.Column, 0, 2) + for i, col := range columns { + relatedCols = append(relatedCols[:0], seedColumns[i]) + if recursiveColumns != nil { + relatedCols = append(relatedCols, recursiveColumns[i]) + } + c.updateColMap(col, relatedCols) + } + // If IsDistinct is true, then we use getColsNDV to calculate row count(see (*LogicalCTE).DeriveStat). In this case + // statistics of all the columns are needed. + if x.cte.IsDistinct { + for _, col := range columns { + c.addPredicateColumn(col) + } + } + case *LogicalCTETable: + // Schema change from seedPlan to self. + for i, col := range x.Schema().Columns { + c.updateColMap(col, []*expression.Column{x.seedSchema.Columns[i]}) + } + } +} + +// CollectPredicateColumnsForTest collects predicate columns from logical plan. It is only for test. +func CollectPredicateColumnsForTest(lp LogicalPlan) []model.TableColumnID { + collector := newPredicateColumnCollector() + collector.collectFromPlan(lp) + tblColIDs := make([]model.TableColumnID, 0, len(collector.predicateCols)) + for tblColID := range collector.predicateCols { + tblColIDs = append(tblColIDs, tblColID) + } + return tblColIDs +} diff --git a/planner/core/collect_column_stats_usage_test.go b/planner/core/collect_column_stats_usage_test.go new file mode 100644 index 0000000000000..b270b6f7c1bfc --- /dev/null +++ b/planner/core/collect_column_stats_usage_test.go @@ -0,0 +1,221 @@ +// Copyright 2021 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, +// 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. + +package core_test + +import ( + "context" + "fmt" + "testing" + + "github.com/pingcap/tidb/parser/model" + plannercore "github.com/pingcap/tidb/planner/core" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/util/hint" + "github.com/pingcap/tidb/util/logutil" + "github.com/stretchr/testify/require" +) + +func TestCollectPredicateColumns(t *testing.T) { + store, dom, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("set @@session.tidb_partition_prune_mode = 'static'") + tk.MustExec("create table t1(a int, b int, c int)") + tk.MustExec("create table t2(a int, b int, c int)") + tk.MustExec("create table t3(a int, b int, c int) partition by range(a) (partition p0 values less than (10), partition p1 values less than (20), partition p2 values less than maxvalue)") + + tests := []struct { + sql string + res []string + }{ + { + // DataSource + sql: "select * from t1 where a > 2", + res: []string{"t1.a"}, + }, + { + // DataSource + sql: "select * from t1 where b in (2, 5) or c = 5", + res: []string{"t1.b", "t1.c"}, + }, + { + // LogicalProjection + sql: "select * from (select a + b as ab, c from t1) as tmp where ab > 4", + res: []string{"t1.a", "t1.b"}, + }, + { + // LogicalAggregation + sql: "select b, count(*) from t1 group by b", + res: []string{"t1.b"}, + }, + { + // LogicalAggregation + sql: "select b, sum(a) from t1 group by b having sum(a) > 3", + res: []string{"t1.a", "t1.b"}, + }, + { + // LogicalAggregation + sql: "select count(*), sum(a), sum(c) from t1", + res: []string{}, + }, + { + // LogicalAggregation + sql: "(select a, b from t1) union (select a, c from t2)", + res: []string{"t1.a", "t1.b", "t2.a", "t2.c"}, + }, + { + // LogicalWindow + sql: "select avg(b) over(partition by a) from t1", + res: []string{"t1.a"}, + }, + { + // LogicalWindow + sql: "select * from (select avg(b) over(partition by a) as w from t1) as tmp where w > 4", + res: []string{"t1.a", "t1.b"}, + }, + { + // LogicalWindow + sql: "select row_number() over(partition by a order by c) from t1", + res: []string{"t1.a"}, + }, + { + // LogicalJoin + sql: "select * from t1, t2 where t1.a = t2.a", + res: []string{"t1.a", "t2.a"}, + }, + { + // LogicalJoin + sql: "select * from t1 as x join t2 as y on x.b + y.c > 2", + res: []string{"t1.b", "t2.c"}, + }, + { + // LogicalJoin + sql: "select * from t1 as x join t2 as y on x.a = y.a and x.b < 3 and y.c > 2", + res: []string{"t1.a", "t1.b", "t2.a", "t2.c"}, + }, + { + // LogicalJoin + sql: "select x.b, y.c, sum(x.c), sum(y.b) from t1 as x join t2 as y on x.a = y.a group by x.b, y.c order by x.b", + res: []string{"t1.a", "t1.b", "t2.a", "t2.c"}, + }, + { + // LogicalApply + sql: "select * from t1 where t1.b > all(select b from t2 where t2.c > 2)", + res: []string{"t1.b", "t2.b", "t2.c"}, + }, + { + // LogicalApply + sql: "select * from t1 where t1.b > (select count(b) from t2 where t2.c > t1.a)", + res: []string{"t1.a", "t1.b", "t2.b", "t2.c"}, + }, + { + // LogicalApply + sql: "select * from t1 where t1.b > (select count(*) from t2 where t2.c > t1.a)", + res: []string{"t1.a", "t1.b", "t2.c"}, + }, + { + // LogicalSort + sql: "select * from t1 order by c", + res: []string{"t1.c"}, + }, + { + // LogicalTopN + sql: "select * from t1 order by a + b limit 10", + res: []string{"t1.a", "t1.b"}, + }, + { + // LogicalUnionAll + sql: "select * from ((select a, b from t1) union all (select a, c from t2)) as tmp where tmp.b > 2", + res: []string{"t1.b", "t2.c"}, + }, + { + // LogicalPartitionUnionAll + sql: "select * from t3 where a < 15 and b > 1", + res: []string{"t3.a", "t3.b"}, + }, + { + // LogicalCTE + sql: "with cte(x, y) as (select a + 1, b from t1 where b > 1) select * from cte where x > 3", + res: []string{"t1.a", "t1.b"}, + }, + { + // LogicalCTE, LogicalCTETable + sql: "with recursive cte(x, y) as (select c, 1 from t1 union all select x + 1, y from cte where x < 5) select * from cte", + res: []string{"t1.c"}, + }, + { + // LogicalCTE, LogicalCTETable + sql: "with recursive cte(x, y) as (select 1, c from t1 union all select x + 1, y from cte where x < 5) select * from cte where y > 1", + res: []string{"t1.c"}, + }, + { + // LogicalCTE, LogicalCTETable + sql: "with recursive cte(x, y) as (select a, b from t1 union select x + 1, y from cte where x < 5) select * from cte", + res: []string{"t1.a", "t1.b"}, + }, + } + + ctx := context.Background() + sctx := tk.Session() + is := dom.InfoSchema() + getColName := func(tblColID model.TableColumnID) (string, bool) { + tbl, ok := is.TableByID(tblColID.TableID) + if !ok { + return "", false + } + tblInfo := tbl.Meta() + for _, col := range tblInfo.Columns { + if tblColID.ColumnID == col.ID { + return tblInfo.Name.L + "." + col.Name.L, true + } + } + return "", false + } + checkPredicateColumns := func(lp plannercore.LogicalPlan, expected []string, comment string) { + tblColIDs := plannercore.CollectPredicateColumnsForTest(lp) + cols := make([]string, 0, len(tblColIDs)) + for _, tblColID := range tblColIDs { + col, ok := getColName(tblColID) + require.True(t, ok, comment) + cols = append(cols, col) + } + require.ElementsMatch(t, expected, cols, comment) + } + + for _, tt := range tests { + comment := fmt.Sprintf("for %s", tt.sql) + logutil.BgLogger().Info(comment) + stmts, err := tk.Session().Parse(ctx, tt.sql) + require.NoError(t, err, comment) + stmt := stmts[0] + err = plannercore.Preprocess(sctx, stmt, plannercore.WithPreprocessorReturn(&plannercore.PreprocessorReturn{InfoSchema: is})) + require.NoError(t, err, comment) + builder, _ := plannercore.NewPlanBuilder().Init(sctx, is, &hint.BlockHintProcessor{}) + p, err := builder.Build(ctx, stmt) + require.NoError(t, err, comment) + lp, ok := p.(plannercore.LogicalPlan) + require.True(t, ok, comment) + // We check predicate columns twice, before and after logical optimization. Some logical plan patterns may occur before + // logical optimization while others may occur after logical optimization. + // logutil.BgLogger().Info("before logical opt", zap.String("lp", plannercore.ToString(lp))) + checkPredicateColumns(lp, tt.res, comment) + lp, err = plannercore.LogicalOptimize(ctx, builder.GetOptFlag(), lp) + require.NoError(t, err, comment) + // logutil.BgLogger().Info("after logical opt", zap.String("lp", plannercore.ToString(lp))) + checkPredicateColumns(lp, tt.res, comment) + } +} diff --git a/planner/core/common_plans.go b/planner/core/common_plans.go index fbcf238dbe46a..d3e56600b2c25 100644 --- a/planner/core/common_plans.go +++ b/planner/core/common_plans.go @@ -365,7 +365,8 @@ func (e *Execute) handleExecuteBuilderOption(sctx sessionctx.Context, func (e *Execute) checkPreparedPriv(ctx context.Context, sctx sessionctx.Context, preparedObj *CachedPrepareStmt, is infoschema.InfoSchema) error { if pm := privilege.GetPrivilegeManager(sctx); pm != nil { - if err := CheckPrivilege(sctx.GetSessionVars().ActiveRoles, pm, preparedObj.VisitInfos); err != nil { + visitInfo := VisitInfo4PrivCheck(is, preparedObj.PreparedAst.Stmt, preparedObj.VisitInfos) + if err := CheckPrivilege(sctx.GetSessionVars().ActiveRoles, pm, visitInfo); err != nil { return err } } @@ -380,13 +381,30 @@ func (e *Execute) setFoundInPlanCache(sctx sessionctx.Context, opt bool) error { } func (e *Execute) getPhysicalPlan(ctx context.Context, sctx sessionctx.Context, is infoschema.InfoSchema, preparedStmt *CachedPrepareStmt) error { + var cacheKey kvcache.Key sessVars := sctx.GetSessionVars() stmtCtx := sessVars.StmtCtx prepared := preparedStmt.PreparedAst + if prepared.UseCache { + // disable the cache if cache table in prepared statement + for _, vInfo := range preparedStmt.VisitInfos { + tbl, err := is.TableByName(model.NewCIStr(vInfo.db), model.NewCIStr(vInfo.table)) + // if table does not exist, skip it, maybe it is a `create table` statement + if err != nil { + continue + } + if tbl.Meta().TableCacheStatusType == model.TableCacheStatusEnable { + prepared.UseCache = false + break + } + } + } stmtCtx.UseCache = prepared.UseCache - var cacheKey kvcache.Key + + var bindSQL string if prepared.UseCache { - cacheKey = NewPSTMTPlanCacheKey(sctx.GetSessionVars(), e.ExecID, prepared.SchemaVersion) + bindSQL = GetBindSQL4PlanCache(sctx, prepared.Stmt) + cacheKey = NewPSTMTPlanCacheKey(sctx.GetSessionVars(), e.ExecID, prepared.SchemaVersion, bindSQL) } tps := make([]*types.FieldType, len(e.UsingVars)) for i, param := range e.UsingVars { @@ -452,6 +470,14 @@ func (e *Execute) getPhysicalPlan(ctx context.Context, sctx sessionctx.Context, if err != nil { return err } + if len(bindSQL) > 0 { + // When the `len(bindSQL) > 0`, it means we use the binding. + // So we need to record this. + err = sessVars.SetSystemVar(variable.TiDBFoundInBinding, variable.BoolToOnOff(true)) + if err != nil { + return err + } + } if metrics.ResettablePlanCacheCounterFortTest { metrics.PlanCacheCounter.WithLabelValues("prepare").Inc() } else { @@ -468,7 +494,7 @@ func (e *Execute) getPhysicalPlan(ctx context.Context, sctx sessionctx.Context, } REBUILD: - stmt := TryAddExtraLimit(sctx, prepared.Stmt) + stmt := prepared.Stmt p, names, err := OptimizeAstNode(ctx, sctx, stmt, is) if err != nil { return err @@ -480,12 +506,15 @@ REBUILD: e.names = names e.Plan = p _, isTableDual := p.(*PhysicalTableDual) - if !isTableDual && prepared.UseCache && !stmtCtx.MaybeOverOptimized4PlanCache { + if !isTableDual && prepared.UseCache && !stmtCtx.SkipPlanCache { // rebuild key to exclude kv.TiFlash when stmt is not read only if _, isolationReadContainTiFlash := sessVars.IsolationReadEngines[kv.TiFlash]; isolationReadContainTiFlash && !IsReadOnly(stmt, sessVars) { delete(sessVars.IsolationReadEngines, kv.TiFlash) - cacheKey = NewPSTMTPlanCacheKey(sctx.GetSessionVars(), e.ExecID, prepared.SchemaVersion) + cacheKey = NewPSTMTPlanCacheKey(sessVars, e.ExecID, prepared.SchemaVersion, sessVars.StmtCtx.BindSQL) sessVars.IsolationReadEngines[kv.TiFlash] = struct{}{} + } else { + // We need to reconstruct the plan cache key based on the bindSQL. + cacheKey = NewPSTMTPlanCacheKey(sessVars, e.ExecID, prepared.SchemaVersion, sessVars.StmtCtx.BindSQL) } cached := NewPSTMTPlanCacheValue(p, names, stmtCtx.TblInfo2UnionScan, tps) preparedStmt.NormalizedPlan, preparedStmt.PlanDigest = NormalizePlan(p) @@ -515,7 +544,7 @@ REBUILD: // short paths for these executions, currently "point select" and "point update" func (e *Execute) tryCachePointPlan(ctx context.Context, sctx sessionctx.Context, preparedStmt *CachedPrepareStmt, is infoschema.InfoSchema, p Plan) error { - if sctx.GetSessionVars().StmtCtx.MaybeOverOptimized4PlanCache { + if sctx.GetSessionVars().StmtCtx.SkipPlanCache { return nil } var ( @@ -547,6 +576,20 @@ func (e *Execute) rebuildRange(p Plan) error { sc := p.SCtx().GetSessionVars().StmtCtx var err error switch x := p.(type) { + case *PhysicalIndexHashJoin: + return e.rebuildRange(&x.PhysicalIndexJoin) + case *PhysicalIndexMergeJoin: + return e.rebuildRange(&x.PhysicalIndexJoin) + case *PhysicalIndexJoin: + if err := x.Ranges.Rebuild(); err != nil { + return err + } + for _, child := range x.Children() { + err = e.rebuildRange(child) + if err != nil { + return err + } + } case *PhysicalTableScan: err = e.buildRangeForTableScan(sctx, x) if err != nil { @@ -580,6 +623,9 @@ func (e *Execute) rebuildRange(p Plan) error { if err != nil { return err } + if len(ranges.Ranges) == 0 || len(ranges.AccessConds) != len(x.AccessConditions) { + return errors.New("failed to rebuild range: the length of the range has changed") + } for i := range x.IndexValues { x.IndexValues[i] = ranges.Ranges[0].LowVal[i] } @@ -591,10 +637,13 @@ func (e *Execute) rebuildRange(p Plan) error { } } if pkCol != nil { - ranges, err := ranger.BuildTableRange(x.AccessConditions, x.ctx.GetSessionVars().StmtCtx, pkCol.RetType) + ranges, err := ranger.BuildTableRange(x.AccessConditions, x.ctx, pkCol.RetType) if err != nil { return err } + if len(ranges) == 0 { + return errors.New("failed to rebuild range: the length of the range has changed") + } x.Handle = kv.IntHandle(ranges[0].LowVal[0].GetInt64()) } } @@ -628,6 +677,9 @@ func (e *Execute) rebuildRange(p Plan) error { if err != nil { return err } + if len(ranges.Ranges) != len(x.IndexValues) || len(ranges.AccessConds) != len(x.AccessConditions) { + return errors.New("failed to rebuild range: the length of the range has changed") + } for i := range x.IndexValues { for j := range ranges.Ranges[i].LowVal { x.IndexValues[i][j] = ranges.Ranges[i].LowVal[j] @@ -641,10 +693,13 @@ func (e *Execute) rebuildRange(p Plan) error { } } if pkCol != nil { - ranges, err := ranger.BuildTableRange(x.AccessConditions, x.ctx.GetSessionVars().StmtCtx, pkCol.RetType) + ranges, err := ranger.BuildTableRange(x.AccessConditions, x.ctx, pkCol.RetType) if err != nil { return err } + if len(ranges) != len(x.Handles) { + return errors.New("failed to rebuild range: the length of the range has changed") + } for i := range ranges { x.Handles[i] = kv.IntHandle(ranges[i].LowVal[0].GetInt64()) } @@ -712,7 +767,16 @@ func (e *Execute) buildRangeForTableScan(sctx sessionctx.Context, ts *PhysicalTa for _, colInfo := range pk.Columns { if pkCol := expression.ColInfo2Col(ts.schema.Columns, ts.Table.Columns[colInfo.Offset]); pkCol != nil { pkCols = append(pkCols, pkCol) - pkColsLen = append(pkColsLen, colInfo.Length) + // We need to consider the prefix index. + // For example: when we have 'a varchar(50), index idx(a(10))' + // So we will get 'colInfo.Length = 50' and 'pkCol.RetType.Flen = 10'. + // In 'hasPrefix' function from 'util/ranger/ranger.go' file, + // we use 'columnLength == types.UnspecifiedLength' to check whether we have prefix index. + if colInfo.Length != types.UnspecifiedLength && colInfo.Length == pkCol.RetType.Flen { + pkColsLen = append(pkColsLen, types.UnspecifiedLength) + } else { + pkColsLen = append(pkColsLen, colInfo.Length) + } } } if len(pkCols) > 0 { @@ -720,6 +784,9 @@ func (e *Execute) buildRangeForTableScan(sctx sessionctx.Context, ts *PhysicalTa if err != nil { return err } + if len(res.AccessConds) != len(ts.AccessCondition) { + return errors.New("rebuild range for cached plan failed") + } ts.Ranges = res.Ranges } else { ts.Ranges = ranger.FullRange() @@ -732,7 +799,7 @@ func (e *Execute) buildRangeForTableScan(sctx sessionctx.Context, ts *PhysicalTa } } if pkCol != nil { - ts.Ranges, err = ranger.BuildTableRange(ts.AccessCondition, sctx.GetSessionVars().StmtCtx, pkCol.RetType) + ts.Ranges, err = ranger.BuildTableRange(ts.AccessCondition, sctx, pkCol.RetType) if err != nil { return err } @@ -752,6 +819,9 @@ func (e *Execute) buildRangeForIndexScan(sctx sessionctx.Context, is *PhysicalIn if err != nil { return err } + if len(res.AccessConds) != len(is.AccessCondition) { + return errors.New("rebuild range for cached plan failed") + } is.Ranges = res.Ranges return } @@ -965,8 +1035,8 @@ type LoadStats struct { Path string } -// PlanReplayerSingle represents a plan replayer plan. -type PlanReplayerSingle struct { +// PlanReplayer represents a plan replayer plan. +type PlanReplayer struct { baseSchemaProducer ExecStmt ast.StmtNode Analyze bool @@ -1253,6 +1323,8 @@ func (e *Explain) explainPlanInRowFormat(p Plan, taskType, driverSide, indent st } case *PhysicalCTE: e.ctes = append(e.ctes, x) + case *PhysicalShuffleReceiverStub: + err = e.explainPlanInRowFormat(x.DataSource, "root", "", childIndent, true) } return } @@ -1439,10 +1511,10 @@ func IsPointGetWithPKOrUniqueKeyByAutoCommit(ctx sessionctx.Context, p Plan) (bo switch v := p.(type) { case *PhysicalIndexReader: indexScan := v.IndexPlans[0].(*PhysicalIndexScan) - return indexScan.IsPointGetByUniqueKey(ctx.GetSessionVars().StmtCtx), nil + return indexScan.IsPointGetByUniqueKey(ctx), nil case *PhysicalTableReader: tableScan := v.TablePlans[0].(*PhysicalTableScan) - isPointRange := len(tableScan.Ranges) == 1 && tableScan.Ranges[0].IsPoint(ctx.GetSessionVars().StmtCtx) + isPointRange := len(tableScan.Ranges) == 1 && tableScan.Ranges[0].IsPointNonNullable(ctx) if !isPointRange { return false, nil } @@ -1456,8 +1528,16 @@ func IsPointGetWithPKOrUniqueKeyByAutoCommit(ctx sessionctx.Context, p Plan) (bo // If the PointGetPlan needs to read data using unique index (double read), we // can't use max uint64, because using math.MaxUint64 can't guarantee repeatable-read // and the data and index would be inconsistent! - isPointGet := v.IndexInfo == nil || (v.IndexInfo.Primary && v.TblInfo.IsCommonHandle) - return isPointGet, nil + // If the PointGetPlan needs to read data from Cache Table, we can't use max uint64, + // because math.MaxUint64 always make cacheData invalid. + noSecondRead := v.IndexInfo == nil || (v.IndexInfo.Primary && v.TblInfo.IsCommonHandle) + if !noSecondRead { + return false, nil + } + if v.TblInfo != nil && (v.TblInfo.TableCacheStatusType != model.TableCacheStatusDisable) { + return false, nil + } + return true, nil default: return false, nil } diff --git a/planner/core/enforce_mpp_test.go b/planner/core/enforce_mpp_test.go index 209de814fd779..f9eb265c1313f 100644 --- a/planner/core/enforce_mpp_test.go +++ b/planner/core/enforce_mpp_test.go @@ -143,7 +143,7 @@ func (s *testEnforceMPPSuite) TestEnforceMPPWarning1(c *C) { // test query tk.MustExec("use test") tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a int, b int as (a+1), c time)") + tk.MustExec("create table t(a int, b int as (a+1), c enum('xx', 'yy'), d bit(1))") tk.MustExec("create index idx on t(a)") var input []string diff --git a/planner/core/errors.go b/planner/core/errors.go index 3b9668289dc12..6670d64d0b1fd 100644 --- a/planner/core/errors.go +++ b/planner/core/errors.go @@ -23,6 +23,7 @@ import ( var ( ErrUnsupportedType = dbterror.ClassOptimizer.NewStd(mysql.ErrUnsupportedType) ErrAnalyzeMissIndex = dbterror.ClassOptimizer.NewStd(mysql.ErrAnalyzeMissIndex) + ErrAnalyzeMissColumn = dbterror.ClassOptimizer.NewStd(mysql.ErrAnalyzeMissColumn) ErrWrongParamCount = dbterror.ClassOptimizer.NewStd(mysql.ErrWrongParamCount) ErrSchemaChanged = dbterror.ClassOptimizer.NewStd(mysql.ErrSchemaChanged) ErrTablenameNotAllowedHere = dbterror.ClassOptimizer.NewStd(mysql.ErrTablenameNotAllowedHere) @@ -101,8 +102,10 @@ var ( ErrNotSupportedWithSem = dbterror.ClassOptimizer.NewStd(mysql.ErrNotSupportedWithSem) ErrAsOf = dbterror.ClassOptimizer.NewStd(mysql.ErrAsOf) ErrOptOnTemporaryTable = dbterror.ClassOptimizer.NewStd(mysql.ErrOptOnTemporaryTable) + ErrOptOnCacheTable = dbterror.ClassOptimizer.NewStd(mysql.ErrOptOnCacheTable) ErrDropTableOnTemporaryTable = dbterror.ClassOptimizer.NewStd(mysql.ErrDropTableOnTemporaryTable) // ErrPartitionNoTemporary returns when partition at temporary mode ErrPartitionNoTemporary = dbterror.ClassOptimizer.NewStd(mysql.ErrPartitionNoTemporary) ErrViewSelectTemporaryTable = dbterror.ClassOptimizer.NewStd(mysql.ErrViewSelectTmptable) + ErrSubqueryMoreThan1Row = dbterror.ClassOptimizer.NewStd(mysql.ErrSubqueryNo1Row) ) diff --git a/planner/core/errors_test.go b/planner/core/errors_test.go index c11feecbd39ed..b5afcbc616cb5 100644 --- a/planner/core/errors_test.go +++ b/planner/core/errors_test.go @@ -28,6 +28,7 @@ func (s testErrorSuite) TestError(c *C) { kvErrs := []*terror.Error{ ErrUnsupportedType, ErrAnalyzeMissIndex, + ErrAnalyzeMissColumn, ErrWrongParamCount, ErrSchemaChanged, ErrTablenameNotAllowedHere, diff --git a/planner/core/exhaust_physical_plans.go b/planner/core/exhaust_physical_plans.go index 181eb144d17a5..fb6a02d34b484 100644 --- a/planner/core/exhaust_physical_plans.go +++ b/planner/core/exhaust_physical_plans.go @@ -51,6 +51,7 @@ func (p *LogicalUnionScan) exhaustPhysicalPlans(prop *property.PhysicalProperty) us := PhysicalUnionScan{ Conditions: p.conditions, HandleCols: p.handleCols, + CacheTable: p.cacheTable, }.Init(p.ctx, p.stats, p.blockOffset, childProp) return []PhysicalPlan{us}, true, nil } @@ -414,12 +415,16 @@ func (p *LogicalJoin) constructIndexJoin( prop *property.PhysicalProperty, outerIdx int, innerTask task, - ranges []*ranger.Range, + ranges ranger.MutableRanges, keyOff2IdxOff []int, path *util.AccessPath, compareFilters *ColWithCmpFuncManager, extractOtherEQ bool, ) []PhysicalPlan { + if ranges == nil { + ranges = ranger.Ranges{} // empty range + } + joinType := p.JoinType var ( innerJoinKeys []*expression.Column @@ -478,11 +483,11 @@ func (p *LogicalJoin) constructIndexJoin( } outerSchema, innerSchema := p.Children()[outerIdx].Schema(), p.Children()[1-outerIdx].Schema() if outerSchema.Contains(lhs) && innerSchema.Contains(rhs) { - outerHashKeys = append(outerHashKeys, lhs) - innerHashKeys = append(innerHashKeys, rhs) + outerHashKeys = append(outerHashKeys, lhs) // nozero + innerHashKeys = append(innerHashKeys, rhs) // nozero } else if innerSchema.Contains(lhs) && outerSchema.Contains(rhs) { - outerHashKeys = append(outerHashKeys, rhs) - innerHashKeys = append(innerHashKeys, lhs) + outerHashKeys = append(outerHashKeys, rhs) // nozero + innerHashKeys = append(innerHashKeys, lhs) // nozero } newOtherConds = append(newOtherConds[:i], newOtherConds[i+1:]...) } @@ -524,7 +529,7 @@ func (p *LogicalJoin) constructIndexMergeJoin( prop *property.PhysicalProperty, outerIdx int, innerTask task, - ranges []*ranger.Range, + ranges ranger.MutableRanges, keyOff2IdxOff []int, path *util.AccessPath, compareFilters *ColWithCmpFuncManager, @@ -631,7 +636,7 @@ func (p *LogicalJoin) constructIndexHashJoin( prop *property.PhysicalProperty, outerIdx int, innerTask task, - ranges []*ranger.Range, + ranges ranger.MutableRanges, keyOff2IdxOff []int, path *util.AccessPath, compareFilters *ColWithCmpFuncManager, @@ -707,7 +712,7 @@ func (p *LogicalJoin) getIndexJoinBuildHelper(ds *DataSource, innerJoinKeys []*e } for _, path := range ds.possibleAccessPaths { if checkPathValid(path) { - emptyRange, err := helper.analyzeLookUpFilters(path, ds, innerJoinKeys, outerJoinKeys) + emptyRange, err := helper.analyzeLookUpFilters(path, ds, innerJoinKeys, outerJoinKeys, false) if emptyRange { return nil, nil } @@ -751,7 +756,7 @@ func (p *LogicalJoin) buildIndexJoinInner2TableScan( } keyOff2IdxOff := make([]int, len(innerJoinKeys)) newOuterJoinKeys := make([]*expression.Column, 0) - var ranges []*ranger.Range + var ranges ranger.MutableRanges = ranger.Ranges{} var innerTask, innerTask2 task var helper *indexJoinBuildHelper if ds.tableInfo.IsCommonHandle { @@ -873,7 +878,7 @@ type indexJoinBuildHelper struct { chosenRemained []expression.Expression idxOff2KeyOff []int lastColManager *ColWithCmpFuncManager - chosenRanges []*ranger.Range + chosenRanges ranger.MutableRanges chosenPath *util.AccessPath curPossibleUsedKeys []*expression.Column @@ -1199,9 +1204,9 @@ func (cwc *ColWithCmpFuncManager) BuildRangesByRow(ctx sessionctx.Context, row c if err != nil { return nil, err } - exprs = append(exprs, newExpr) + exprs = append(exprs, newExpr) // nozero } - ranges, err := ranger.BuildColumnRange(exprs, ctx.GetSessionVars().StmtCtx, cwc.TargetCol.RetType, cwc.colLength) + ranges, err := ranger.BuildColumnRange(exprs, ctx, cwc.TargetCol.RetType, cwc.colLength) if err != nil { return nil, err } @@ -1256,18 +1261,18 @@ func (ijHelper *indexJoinBuildHelper) resetContextForIndex(innerKeys []*expressi // usefulEqOrInFilters is the continuous eq/in conditions on current unused index columns. // uselessFilters is the conditions which cannot be used for building ranges. // remainingRangeCandidates is the other conditions for future use. -func (ijHelper *indexJoinBuildHelper) findUsefulEqAndInFilters(innerPlan *DataSource) (usefulEqOrInFilters, uselessFilters, remainingRangeCandidates []expression.Expression) { +func (ijHelper *indexJoinBuildHelper) findUsefulEqAndInFilters(innerPlan *DataSource) (usefulEqOrInFilters, uselessFilters, remainingRangeCandidates []expression.Expression, emptyRange bool) { uselessFilters = make([]expression.Expression, 0, len(innerPlan.pushedDownConds)) var remainedEqOrIn []expression.Expression // Extract the eq/in functions of possible join key. // you can see the comment of ExtractEqAndInCondition to get the meaning of the second return value. - usefulEqOrInFilters, remainedEqOrIn, remainingRangeCandidates, _, _ = ranger.ExtractEqAndInCondition( + usefulEqOrInFilters, remainedEqOrIn, remainingRangeCandidates, _, emptyRange = ranger.ExtractEqAndInCondition( innerPlan.ctx, innerPlan.pushedDownConds, ijHelper.curNotUsedIndexCols, ijHelper.curNotUsedColLens, ) uselessFilters = append(uselessFilters, remainedEqOrIn...) - return usefulEqOrInFilters, uselessFilters, remainingRangeCandidates + return usefulEqOrInFilters, uselessFilters, remainingRangeCandidates, emptyRange } // buildLastColManager analyze the `OtherConditions` of join to see whether there're some filters can be used in manager. @@ -1337,13 +1342,62 @@ func (ijHelper *indexJoinBuildHelper) removeUselessEqAndInFunc(idxCols []*expres return notKeyEqAndIn, nil } -func (ijHelper *indexJoinBuildHelper) analyzeLookUpFilters(path *util.AccessPath, innerPlan *DataSource, innerJoinKeys []*expression.Column, outerJoinKeys []*expression.Column) (emptyRange bool, err error) { +type mutableIndexJoinRange struct { + ranges []*ranger.Range + + buildHelper *indexJoinBuildHelper + path *util.AccessPath + innerJoinKeys []*expression.Column + outerJoinKeys []*expression.Column +} + +func (mr *mutableIndexJoinRange) Range() []*ranger.Range { + return mr.ranges +} + +func (mr *mutableIndexJoinRange) Rebuild() error { + empty, err := mr.buildHelper.analyzeLookUpFilters(mr.path, mr.buildHelper.innerPlan, mr.innerJoinKeys, mr.outerJoinKeys, true) + if err != nil { + return err + } + if empty { // empty ranges are dangerous for plan-cache, it's better to optimize the whole plan again in this case + return errors.New("failed to rebuild range: empty range") + } + newRanges := mr.buildHelper.chosenRanges.Range() + if len(mr.ranges) != len(newRanges) || (len(mr.ranges) > 0 && mr.ranges[0].Width() != newRanges[0].Width()) { + // some access conditions cannot be used to calculate the range after parameters change, return an error in this case for safety. + return errors.New("failed to rebuild range: range width changed") + } + mr.ranges = mr.buildHelper.chosenRanges.Range() + return nil +} + +func (ijHelper *indexJoinBuildHelper) createMutableIndexJoinRange(relatedExprs []expression.Expression, ranges []*ranger.Range, path *util.AccessPath, innerKeys, outerKeys []*expression.Column) ranger.MutableRanges { + // if the plan-cache is enabled and these ranges depend on some parameters, we have to rebuild these ranges after changing parameters + if expression.MaybeOverOptimized4PlanCache(ijHelper.join.ctx, relatedExprs) { + // assume that path, innerKeys and outerKeys will not be modified in the follow-up process + return &mutableIndexJoinRange{ + ranges: ranges, + buildHelper: &indexJoinBuildHelper{innerPlan: ijHelper.innerPlan, join: ijHelper.join}, + path: path, + innerJoinKeys: innerKeys, + outerJoinKeys: outerKeys, + } + } + return ranger.Ranges(ranges) +} + +func (ijHelper *indexJoinBuildHelper) analyzeLookUpFilters(path *util.AccessPath, innerPlan *DataSource, innerJoinKeys []*expression.Column, outerJoinKeys []*expression.Column, rebuildMode bool) (emptyRange bool, err error) { if len(path.IdxCols) == 0 { return false, nil } accesses := make([]expression.Expression, 0, len(path.IdxCols)) + relatedExprs := make([]expression.Expression, 0, len(path.IdxCols)) // all expressions related to the chosen range ijHelper.resetContextForIndex(innerJoinKeys, path.IdxCols, path.IdxColLens, outerJoinKeys) - notKeyEqAndIn, remained, rangeFilterCandidates := ijHelper.findUsefulEqAndInFilters(innerPlan) + notKeyEqAndIn, remained, rangeFilterCandidates, emptyRange := ijHelper.findUsefulEqAndInFilters(innerPlan) + if emptyRange { + return true, nil + } var remainedEqAndIn []expression.Expression notKeyEqAndIn, remainedEqAndIn = ijHelper.removeUselessEqAndInFunc(path.IdxCols, notKeyEqAndIn, outerJoinKeys) matchedKeyCnt := len(ijHelper.curPossibleUsedKeys) @@ -1352,6 +1406,7 @@ func (ijHelper *indexJoinBuildHelper) analyzeLookUpFilters(path *util.AccessPath return false, nil } accesses = append(accesses, notKeyEqAndIn...) + relatedExprs = append(relatedExprs, notKeyEqAndIn...) remained = append(remained, remainedEqAndIn...) lastColPos := matchedKeyCnt + len(notKeyEqAndIn) // There should be some equal conditions. But we don't need that there must be some join key in accesses here. @@ -1375,7 +1430,8 @@ func (ijHelper *indexJoinBuildHelper) analyzeLookUpFilters(path *util.AccessPath if emptyRange { return true, nil } - ijHelper.updateBestChoice(ranges, path, accesses, remained, nil, lastColPos) + mutableRange := ijHelper.createMutableIndexJoinRange(relatedExprs, ranges, path, innerJoinKeys, outerJoinKeys) + ijHelper.updateBestChoice(mutableRange, path, accesses, remained, nil, lastColPos, rebuildMode) return false, nil } lastPossibleCol := path.IdxCols[lastColPos] @@ -1397,10 +1453,11 @@ func (ijHelper *indexJoinBuildHelper) analyzeLookUpFilters(path *util.AccessPath var ranges, nextColRange []*ranger.Range var err error if len(colAccesses) > 0 { - nextColRange, err = ranger.BuildColumnRange(colAccesses, ijHelper.join.ctx.GetSessionVars().StmtCtx, lastPossibleCol.RetType, path.IdxColLens[lastColPos]) + nextColRange, err = ranger.BuildColumnRange(colAccesses, ijHelper.join.ctx, lastPossibleCol.RetType, path.IdxColLens[lastColPos]) if err != nil { return false, err } + relatedExprs = append(relatedExprs, colAccesses...) } ranges, emptyRange, err = ijHelper.buildTemplateRange(matchedKeyCnt, notKeyEqAndIn, nextColRange, false) if err != nil { @@ -1417,7 +1474,8 @@ func (ijHelper *indexJoinBuildHelper) analyzeLookUpFilters(path *util.AccessPath if len(colAccesses) > 0 { lastColPos = lastColPos + 1 } - ijHelper.updateBestChoice(ranges, path, accesses, remained, nil, lastColPos) + mutableRange := ijHelper.createMutableIndexJoinRange(relatedExprs, ranges, path, innerJoinKeys, outerJoinKeys) + ijHelper.updateBestChoice(mutableRange, path, accesses, remained, nil, lastColPos, rebuildMode) return false, nil } accesses = append(accesses, lastColAccess...) @@ -1429,15 +1487,21 @@ func (ijHelper *indexJoinBuildHelper) analyzeLookUpFilters(path *util.AccessPath if emptyRange { return true, nil } - ijHelper.updateBestChoice(ranges, path, accesses, remained, lastColManager, lastColPos+1) + mutableRange := ijHelper.createMutableIndexJoinRange(relatedExprs, ranges, path, innerJoinKeys, outerJoinKeys) + ijHelper.updateBestChoice(mutableRange, path, accesses, remained, lastColManager, lastColPos+1, rebuildMode) return false, nil } -func (ijHelper *indexJoinBuildHelper) updateBestChoice(ranges []*ranger.Range, path *util.AccessPath, accesses, - remained []expression.Expression, lastColManager *ColWithCmpFuncManager, usedColsLen int) { +func (ijHelper *indexJoinBuildHelper) updateBestChoice(ranges ranger.MutableRanges, path *util.AccessPath, accesses, + remained []expression.Expression, lastColManager *ColWithCmpFuncManager, usedColsLen int, rebuildMode bool) { + if rebuildMode { // rebuild the range for plan-cache, update the chosenRanges anyway + ijHelper.chosenRanges = ranges + return + } + // Notice that there may be the cases like `t1.a = t2.a and b > 2 and b < 1`, so ranges can be nil though the conditions are valid. // Obviously when the range is nil, we don't need index join. - if len(ranges) == 0 { + if len(ranges.Range()) == 0 { return } var innerNDV float64 @@ -1454,7 +1518,7 @@ func (ijHelper *indexJoinBuildHelper) updateBestChoice(ranges []*ranger.Range, p return } ijHelper.chosenPath = path - ijHelper.usedColsLen = len(ranges[0].LowVal) + ijHelper.usedColsLen = len(ranges.Range()[0].LowVal) ijHelper.usedColsNDV = innerNDV ijHelper.chosenRanges = ranges ijHelper.chosenAccess = accesses @@ -1498,16 +1562,16 @@ func (ijHelper *indexJoinBuildHelper) buildTemplateRange(matchedKeyCnt int, eqAn continue } exprs := []expression.Expression{eqAndInFuncs[j]} - if !sc.MaybeOverOptimized4PlanCache && expression.MaybeOverOptimized4PlanCache(ijHelper.join.ctx, exprs) { - sc.MaybeOverOptimized4PlanCache = true - } - oneColumnRan, err := ranger.BuildColumnRange(exprs, sc, ijHelper.curNotUsedIndexCols[j].RetType, ijHelper.curNotUsedColLens[j]) + oneColumnRan, err := ranger.BuildColumnRange(exprs, ijHelper.join.ctx, ijHelper.curNotUsedIndexCols[j].RetType, ijHelper.curNotUsedColLens[j]) if err != nil { return nil, false, err } if len(oneColumnRan) == 0 { return nil, true, nil } + if sc.MemTracker != nil { + sc.MemTracker.Consume(2 * types.EstimatedMemUsage(oneColumnRan[0].LowVal, len(oneColumnRan))) + } for _, ran := range ranges { ran.LowVal[i] = oneColumnRan[0].LowVal[0] ran.HighVal[i] = oneColumnRan[0].HighVal[0] @@ -1521,6 +1585,9 @@ func (ijHelper *indexJoinBuildHelper) buildTemplateRange(matchedKeyCnt int, eqAn newRange.HighVal[i] = oneColumnRan[ranIdx].HighVal[0] newRanges = append(newRanges, newRange) } + if sc.MemTracker != nil && len(newRanges) != 0 { + sc.MemTracker.Consume(2 * types.EstimatedMemUsage(newRanges[0].LowVal, len(newRanges))) + } ranges = append(ranges, newRanges...) } j++ @@ -1866,7 +1933,7 @@ func (p *LogicalJoin) tryToGetMppHashJoin(prop *property.PhysicalProperty, useBC baseJoin.InnerChildIdx = preferredBuildIndex childrenProps := make([]*property.PhysicalProperty, 2) if useBCJ { - childrenProps[preferredBuildIndex] = &property.PhysicalProperty{TaskTp: property.MppTaskType, ExpectedCnt: math.MaxFloat64, MPPPartitionTp: property.BroadcastType, CanAddEnforcer: true} + childrenProps[preferredBuildIndex] = &property.PhysicalProperty{TaskTp: property.MppTaskType, ExpectedCnt: math.MaxFloat64, MPPPartitionTp: property.BroadcastType, CanAddEnforcer: true, RejectSort: true} expCnt := math.MaxFloat64 if prop.ExpectedCnt < p.stats.RowCount { expCntScale := prop.ExpectedCnt / p.stats.RowCount @@ -1879,12 +1946,12 @@ func (p *LogicalJoin) tryToGetMppHashJoin(prop *property.PhysicalProperty, useBC hashKeys = lPartitionKeys } if matches := prop.IsSubsetOf(hashKeys); len(matches) != 0 { - childrenProps[1-preferredBuildIndex] = &property.PhysicalProperty{TaskTp: property.MppTaskType, ExpectedCnt: expCnt, MPPPartitionTp: property.HashType, MPPPartitionCols: prop.MPPPartitionCols} + childrenProps[1-preferredBuildIndex] = &property.PhysicalProperty{TaskTp: property.MppTaskType, ExpectedCnt: expCnt, MPPPartitionTp: property.HashType, MPPPartitionCols: prop.MPPPartitionCols, RejectSort: true} } else { return nil } } else { - childrenProps[1-preferredBuildIndex] = &property.PhysicalProperty{TaskTp: property.MppTaskType, ExpectedCnt: expCnt, MPPPartitionTp: property.AnyType} + childrenProps[1-preferredBuildIndex] = &property.PhysicalProperty{TaskTp: property.MppTaskType, ExpectedCnt: expCnt, MPPPartitionTp: property.AnyType, RejectSort: true} } } else { lPartitionKeys, rPartitionKeys := p.GetPotentialPartitionKeys() @@ -1913,8 +1980,8 @@ func (p *LogicalJoin) tryToGetMppHashJoin(prop *property.PhysicalProperty, useBC lPartitionKeys = choosePartitionKeys(lPartitionKeys, matches) rPartitionKeys = choosePartitionKeys(rPartitionKeys, matches) } - childrenProps[0] = &property.PhysicalProperty{TaskTp: property.MppTaskType, ExpectedCnt: math.MaxFloat64, MPPPartitionTp: property.HashType, MPPPartitionCols: lPartitionKeys, CanAddEnforcer: true} - childrenProps[1] = &property.PhysicalProperty{TaskTp: property.MppTaskType, ExpectedCnt: math.MaxFloat64, MPPPartitionTp: property.HashType, MPPPartitionCols: rPartitionKeys, CanAddEnforcer: true} + childrenProps[0] = &property.PhysicalProperty{TaskTp: property.MppTaskType, ExpectedCnt: math.MaxFloat64, MPPPartitionTp: property.HashType, MPPPartitionCols: lPartitionKeys, CanAddEnforcer: true, RejectSort: true} + childrenProps[1] = &property.PhysicalProperty{TaskTp: property.MppTaskType, ExpectedCnt: math.MaxFloat64, MPPPartitionTp: property.HashType, MPPPartitionCols: rPartitionKeys, CanAddEnforcer: true, RejectSort: true} } join := PhysicalHashJoin{ basePhysicalJoin: baseJoin, @@ -2261,16 +2328,20 @@ func (p *baseLogicalPlan) canPushToCopImpl(storeTp kv.StoreType, considerDual bo switch c := ch.(type) { case *DataSource: validDs := false + considerIndexMerge := false for _, path := range c.possibleAccessPaths { if path.StoreType == storeTp { validDs = true } + if len(path.PartialIndexPaths) > 0 { + considerIndexMerge = true + } } ret = ret && validDs _, isTopN := p.self.(*LogicalTopN) _, isLimit := p.self.(*LogicalLimit) - if (isTopN || isLimit) && len(c.indexMergeHints) != 0 { + if (isTopN || isLimit) && considerIndexMerge { return false // TopN and Limit cannot be pushed down to IndexMerge } case *LogicalUnionAll: @@ -2279,6 +2350,12 @@ func (p *baseLogicalPlan) canPushToCopImpl(storeTp kv.StoreType, considerDual bo } else { return false } + case *LogicalSort: + if storeTp == kv.TiFlash { + ret = ret && c.canPushToCopImpl(storeTp, true) + } else { + return false + } case *LogicalProjection: if storeTp == kv.TiFlash { ret = ret && c.canPushToCopImpl(storeTp, considerDual) @@ -2482,7 +2559,7 @@ func (la *LogicalAggregation) tryToGetMppHashAggs(prop *property.PhysicalPropert // If there are no available partition cols, but still have group by items, that means group by items are all expressions or constants. // To avoid mess, we don't do any one-phase aggregation in this case. if len(partitionCols) != 0 { - childProp := &property.PhysicalProperty{TaskTp: property.MppTaskType, ExpectedCnt: math.MaxFloat64, MPPPartitionTp: property.HashType, MPPPartitionCols: partitionCols, CanAddEnforcer: true} + childProp := &property.PhysicalProperty{TaskTp: property.MppTaskType, ExpectedCnt: math.MaxFloat64, MPPPartitionTp: property.HashType, MPPPartitionCols: partitionCols, CanAddEnforcer: true, RejectSort: true} agg := NewPhysicalHashAgg(la, la.stats.ScaleByExpectCnt(prop.ExpectedCnt), childProp) agg.SetSchema(la.schema.Clone()) agg.MppRunMode = Mpp1Phase @@ -2490,7 +2567,7 @@ func (la *LogicalAggregation) tryToGetMppHashAggs(prop *property.PhysicalPropert } // 2-phase agg - childProp := &property.PhysicalProperty{TaskTp: property.MppTaskType, ExpectedCnt: math.MaxFloat64, MPPPartitionTp: property.AnyType} + childProp := &property.PhysicalProperty{TaskTp: property.MppTaskType, ExpectedCnt: math.MaxFloat64, MPPPartitionTp: property.AnyType, RejectSort: true} agg := NewPhysicalHashAgg(la, la.stats.ScaleByExpectCnt(prop.ExpectedCnt), childProp) agg.SetSchema(la.schema.Clone()) agg.MppRunMode = Mpp2Phase @@ -2499,7 +2576,7 @@ func (la *LogicalAggregation) tryToGetMppHashAggs(prop *property.PhysicalPropert // agg runs on TiDB with a partial agg on TiFlash if possible if prop.TaskTp == property.RootTaskType { - childProp := &property.PhysicalProperty{TaskTp: property.MppTaskType, ExpectedCnt: math.MaxFloat64} + childProp := &property.PhysicalProperty{TaskTp: property.MppTaskType, ExpectedCnt: math.MaxFloat64, RejectSort: true} agg := NewPhysicalHashAgg(la, la.stats.ScaleByExpectCnt(prop.ExpectedCnt), childProp) agg.SetSchema(la.schema.Clone()) agg.MppRunMode = MppTiDB @@ -2507,7 +2584,7 @@ func (la *LogicalAggregation) tryToGetMppHashAggs(prop *property.PhysicalPropert } } else { // TODO: support scalar agg in MPP, merge the final result to one node - childProp := &property.PhysicalProperty{TaskTp: property.MppTaskType, ExpectedCnt: math.MaxFloat64} + childProp := &property.PhysicalProperty{TaskTp: property.MppTaskType, ExpectedCnt: math.MaxFloat64, RejectSort: true} agg := NewPhysicalHashAgg(la, la.stats.ScaleByExpectCnt(prop.ExpectedCnt), childProp) agg.SetSchema(la.schema.Clone()) if la.HasDistinct() || la.HasOrderBy() { @@ -2537,9 +2614,6 @@ func (la *LogicalAggregation) getHashAggs(prop *property.PhysicalProperty) []Phy if la.HasDistinct() { // TODO: remove after the cost estimation of distinct pushdown is implemented. if !la.ctx.GetSessionVars().AllowDistinctAggPushDown { - if la.ctx.GetSessionVars().StmtCtx.InExplainStmt { - la.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.New("Aggregation can not be pushed to storage layer in non-mpp mode because it contains agg function with distinct")) - } taskTypes = []property.TaskType{property.RootTaskType} } } else if !la.aggHints.preferAggToCop { @@ -2685,9 +2759,10 @@ func (p *LogicalUnionAll) exhaustPhysicalPlans(prop *property.PhysicalProperty) chReqProps = append(chReqProps, &property.PhysicalProperty{ ExpectedCnt: prop.ExpectedCnt, TaskTp: property.MppTaskType, + RejectSort: true, }) } else { - chReqProps = append(chReqProps, &property.PhysicalProperty{ExpectedCnt: prop.ExpectedCnt}) + chReqProps = append(chReqProps, &property.PhysicalProperty{ExpectedCnt: prop.ExpectedCnt, RejectSort: true}) } } ua := PhysicalUnionAll{ @@ -2700,6 +2775,7 @@ func (p *LogicalUnionAll) exhaustPhysicalPlans(prop *property.PhysicalProperty) chReqProps = append(chReqProps, &property.PhysicalProperty{ ExpectedCnt: prop.ExpectedCnt, TaskTp: property.MppTaskType, + RejectSort: true, }) } mppUA := PhysicalUnionAll{mpp: true}.Init(p.ctx, p.stats.ScaleByExpectCnt(prop.ExpectedCnt), p.blockOffset, chReqProps...) @@ -2721,7 +2797,7 @@ func (p *LogicalPartitionUnionAll) exhaustPhysicalPlans(prop *property.PhysicalP } func (ls *LogicalSort) getPhysicalSort(prop *property.PhysicalProperty) *PhysicalSort { - ps := PhysicalSort{ByItems: ls.ByItems}.Init(ls.ctx, ls.stats.ScaleByExpectCnt(prop.ExpectedCnt), ls.blockOffset, &property.PhysicalProperty{ExpectedCnt: math.MaxFloat64}) + ps := PhysicalSort{ByItems: ls.ByItems}.Init(ls.ctx, ls.stats.ScaleByExpectCnt(prop.ExpectedCnt), ls.blockOffset, &property.PhysicalProperty{TaskTp: prop.TaskTp, ExpectedCnt: math.MaxFloat64, RejectSort: true}) return ps } @@ -2730,6 +2806,7 @@ func (ls *LogicalSort) getNominalSort(reqProp *property.PhysicalProperty) *Nomin if !canPass { return nil } + prop.RejectSort = true prop.ExpectedCnt = reqProp.ExpectedCnt ps := NominalSort{OnlyColumn: onlyColumn, ByItems: ls.ByItems}.Init( ls.ctx, ls.stats.ScaleByExpectCnt(prop.ExpectedCnt), ls.blockOffset, prop) @@ -2737,14 +2814,24 @@ func (ls *LogicalSort) getNominalSort(reqProp *property.PhysicalProperty) *Nomin } func (ls *LogicalSort) exhaustPhysicalPlans(prop *property.PhysicalProperty) ([]PhysicalPlan, bool, error) { - if MatchItems(prop, ls.ByItems) { - ret := make([]PhysicalPlan, 0, 2) - ret = append(ret, ls.getPhysicalSort(prop)) - ns := ls.getNominalSort(prop) - if ns != nil { - ret = append(ret, ns) - } - return ret, true, nil + if prop.TaskTp == property.RootTaskType { + if MatchItems(prop, ls.ByItems) { + ret := make([]PhysicalPlan, 0, 2) + ret = append(ret, ls.getPhysicalSort(prop)) + ns := ls.getNominalSort(prop) + if ns != nil { + ret = append(ret, ns) + } + return ret, true, nil + } + } else if prop.TaskTp == property.MppTaskType && prop.RejectSort { + if ls.canPushToCopImpl(kv.TiFlash, true) { + newProp := prop.CloneEssentialFields() + newProp.RejectSort = true + ps := NominalSort{OnlyColumn: true, ByItems: ls.ByItems}.Init( + ls.ctx, ls.stats.ScaleByExpectCnt(prop.ExpectedCnt), ls.blockOffset, newProp) + return []PhysicalPlan{ps}, true, nil + } } return nil, true, nil } diff --git a/planner/core/exhaust_physical_plans_test.go b/planner/core/exhaust_physical_plans_test.go index 4c45e6a7f7889..2232d27e40621 100644 --- a/planner/core/exhaust_physical_plans_test.go +++ b/planner/core/exhaust_physical_plans_test.go @@ -16,8 +16,8 @@ package core import ( "fmt" + "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/charset" @@ -25,15 +25,18 @@ import ( "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/planner/property" "github.com/pingcap/tidb/planner/util" + "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/ranger" + "github.com/stretchr/testify/require" ) -func (s *testUnitTestSuit) rewriteSimpleExpr(str string, schema *expression.Schema, names types.NameSlice) ([]expression.Expression, error) { +func rewriteSimpleExpr(ctx sessionctx.Context, str string, schema *expression.Schema, names types.NameSlice) ([]expression.Expression, error) { if str == "" { return nil, nil } - filters, err := expression.ParseSimpleExprsWithNames(s.ctx, str, schema, names) + filters, err := expression.ParseSimpleExprsWithNames(ctx, str, schema, names) if err != nil { return nil, err } @@ -43,14 +46,16 @@ func (s *testUnitTestSuit) rewriteSimpleExpr(str string, schema *expression.Sche return filters, nil } -func (s *testUnitTestSuit) TestIndexJoinAnalyzeLookUpFilters(c *C) { - s.ctx.GetSessionVars().PlanID = -1 - joinNode := LogicalJoin{}.Init(s.ctx, 0) - dataSourceNode := DataSource{}.Init(s.ctx, 0) +func TestIndexJoinAnalyzeLookUpFilters(t *testing.T) { + ctx := MockContext() + + ctx.GetSessionVars().PlanID = -1 + joinNode := LogicalJoin{}.Init(ctx, 0) + dataSourceNode := DataSource{}.Init(ctx, 0) dsSchema := expression.NewSchema() var dsNames types.NameSlice dsSchema.Append(&expression.Column{ - UniqueID: s.ctx.GetSessionVars().AllocPlanColumnID(), + UniqueID: ctx.GetSessionVars().AllocPlanColumnID(), RetType: types.NewFieldType(mysql.TypeLonglong), }) dsNames = append(dsNames, &types.FieldName{ @@ -59,7 +64,7 @@ func (s *testUnitTestSuit) TestIndexJoinAnalyzeLookUpFilters(c *C) { DBName: model.NewCIStr("test"), }) dsSchema.Append(&expression.Column{ - UniqueID: s.ctx.GetSessionVars().AllocPlanColumnID(), + UniqueID: ctx.GetSessionVars().AllocPlanColumnID(), RetType: types.NewFieldType(mysql.TypeLonglong), }) dsNames = append(dsNames, &types.FieldName{ @@ -68,7 +73,7 @@ func (s *testUnitTestSuit) TestIndexJoinAnalyzeLookUpFilters(c *C) { DBName: model.NewCIStr("test"), }) dsSchema.Append(&expression.Column{ - UniqueID: s.ctx.GetSessionVars().AllocPlanColumnID(), + UniqueID: ctx.GetSessionVars().AllocPlanColumnID(), RetType: types.NewFieldTypeWithCollation(mysql.TypeVarchar, mysql.DefaultCollationName, types.UnspecifiedLength), }) dsNames = append(dsNames, &types.FieldName{ @@ -77,7 +82,7 @@ func (s *testUnitTestSuit) TestIndexJoinAnalyzeLookUpFilters(c *C) { DBName: model.NewCIStr("test"), }) dsSchema.Append(&expression.Column{ - UniqueID: s.ctx.GetSessionVars().AllocPlanColumnID(), + UniqueID: ctx.GetSessionVars().AllocPlanColumnID(), RetType: types.NewFieldType(mysql.TypeLonglong), }) dsNames = append(dsNames, &types.FieldName{ @@ -86,7 +91,7 @@ func (s *testUnitTestSuit) TestIndexJoinAnalyzeLookUpFilters(c *C) { DBName: model.NewCIStr("test"), }) dsSchema.Append(&expression.Column{ - UniqueID: s.ctx.GetSessionVars().AllocPlanColumnID(), + UniqueID: ctx.GetSessionVars().AllocPlanColumnID(), RetType: types.NewFieldTypeWithCollation(mysql.TypeVarchar, charset.CollationASCII, types.UnspecifiedLength), }) dsNames = append(dsNames, &types.FieldName{ @@ -99,7 +104,7 @@ func (s *testUnitTestSuit) TestIndexJoinAnalyzeLookUpFilters(c *C) { outerChildSchema := expression.NewSchema() var outerChildNames types.NameSlice outerChildSchema.Append(&expression.Column{ - UniqueID: s.ctx.GetSessionVars().AllocPlanColumnID(), + UniqueID: ctx.GetSessionVars().AllocPlanColumnID(), RetType: types.NewFieldType(mysql.TypeLonglong), }) outerChildNames = append(outerChildNames, &types.FieldName{ @@ -108,7 +113,7 @@ func (s *testUnitTestSuit) TestIndexJoinAnalyzeLookUpFilters(c *C) { DBName: model.NewCIStr("test"), }) outerChildSchema.Append(&expression.Column{ - UniqueID: s.ctx.GetSessionVars().AllocPlanColumnID(), + UniqueID: ctx.GetSessionVars().AllocPlanColumnID(), RetType: types.NewFieldType(mysql.TypeLonglong), }) outerChildNames = append(outerChildNames, &types.FieldName{ @@ -117,7 +122,7 @@ func (s *testUnitTestSuit) TestIndexJoinAnalyzeLookUpFilters(c *C) { DBName: model.NewCIStr("test"), }) outerChildSchema.Append(&expression.Column{ - UniqueID: s.ctx.GetSessionVars().AllocPlanColumnID(), + UniqueID: ctx.GetSessionVars().AllocPlanColumnID(), RetType: types.NewFieldTypeWithCollation(mysql.TypeVarchar, mysql.DefaultCollationName, types.UnspecifiedLength), }) outerChildNames = append(outerChildNames, &types.FieldName{ @@ -126,7 +131,7 @@ func (s *testUnitTestSuit) TestIndexJoinAnalyzeLookUpFilters(c *C) { DBName: model.NewCIStr("test"), }) outerChildSchema.Append(&expression.Column{ - UniqueID: s.ctx.GetSessionVars().AllocPlanColumnID(), + UniqueID: ctx.GetSessionVars().AllocPlanColumnID(), RetType: types.NewFieldType(mysql.TypeLonglong), }) outerChildNames = append(outerChildNames, &types.FieldName{ @@ -272,19 +277,22 @@ func (s *testUnitTestSuit) TestIndexJoinAnalyzeLookUpFilters(c *C) { }, } for i, tt := range tests { - pushed, err := s.rewriteSimpleExpr(tt.pushedDownConds, dsSchema, dsNames) - c.Assert(err, IsNil) + pushed, err := rewriteSimpleExpr(ctx, tt.pushedDownConds, dsSchema, dsNames) + require.NoError(t, err) dataSourceNode.pushedDownConds = pushed - others, err := s.rewriteSimpleExpr(tt.otherConds, joinNode.schema, joinColNames) - c.Assert(err, IsNil) + others, err := rewriteSimpleExpr(ctx, tt.otherConds, joinNode.schema, joinColNames) + require.NoError(t, err) joinNode.OtherConditions = others helper := &indexJoinBuildHelper{join: joinNode, lastColManager: nil, innerPlan: dataSourceNode} - _, err = helper.analyzeLookUpFilters(path, dataSourceNode, tt.innerKeys, tt.innerKeys) - c.Assert(err, IsNil) - c.Assert(fmt.Sprintf("%v", helper.chosenAccess), Equals, tt.accesses) - c.Assert(fmt.Sprintf("%v", helper.chosenRanges), Equals, tt.ranges, Commentf("test case: #%v", i)) - c.Assert(fmt.Sprintf("%v", helper.idxOff2KeyOff), Equals, tt.idxOff2KeyOff) - c.Assert(fmt.Sprintf("%v", helper.chosenRemained), Equals, tt.remained) - c.Assert(fmt.Sprintf("%v", helper.lastColManager), Equals, tt.compareFilters) + _, err = helper.analyzeLookUpFilters(path, dataSourceNode, tt.innerKeys, tt.innerKeys, false) + if helper.chosenRanges == nil { + helper.chosenRanges = ranger.Ranges{} + } + require.NoError(t, err) + require.Equal(t, tt.accesses, fmt.Sprintf("%v", helper.chosenAccess)) + require.Equal(t, tt.ranges, fmt.Sprintf("%v", helper.chosenRanges.Range()), "test case: ", i) + require.Equal(t, tt.idxOff2KeyOff, fmt.Sprintf("%v", helper.idxOff2KeyOff)) + require.Equal(t, tt.remained, fmt.Sprintf("%v", helper.chosenRemained)) + require.Equal(t, tt.compareFilters, fmt.Sprintf("%v", helper.lastColManager)) } } diff --git a/planner/core/explain.go b/planner/core/explain.go index eda39f413a10e..26bfa775fc417 100644 --- a/planner/core/explain.go +++ b/planner/core/explain.go @@ -332,8 +332,7 @@ func (p *PhysicalTableReader) ExplainNormalizedInfo() string { return "" } -func (p *PhysicalTableReader) accessObject(sctx sessionctx.Context) string { - ts := p.TablePlans[0].(*PhysicalTableScan) +func getAccessObjectForTableScan(sctx sessionctx.Context, ts *PhysicalTableScan, partitionInfo PartitionInfo) string { pi := ts.Table.GetPartitionInfo() if pi == nil || !sctx.GetSessionVars().UseDynamicPartitionPrune() { return "" @@ -346,7 +345,51 @@ func (p *PhysicalTableReader) accessObject(sctx sessionctx.Context) string { } tbl := tmp.(table.PartitionedTable) - return partitionAccessObject(sctx, tbl, pi, &p.PartitionInfo) + return partitionAccessObject(sctx, tbl, pi, &partitionInfo) +} + +func (p *PhysicalTableReader) accessObject(sctx sessionctx.Context) string { + if !sctx.GetSessionVars().UseDynamicPartitionPrune() { + return "" + } + if len(p.PartitionInfos) == 0 { + ts := p.TablePlans[0].(*PhysicalTableScan) + return getAccessObjectForTableScan(sctx, ts, p.PartitionInfo) + } + if len(p.PartitionInfos) == 1 { + return getAccessObjectForTableScan(sctx, p.PartitionInfos[0].tableScan, p.PartitionInfos[0].partitionInfo) + } + containsPartitionTable := false + for _, info := range p.PartitionInfos { + if info.tableScan.Table.GetPartitionInfo() != nil { + containsPartitionTable = true + break + } + } + if !containsPartitionTable { + return "" + } + var buffer bytes.Buffer + for index, info := range p.PartitionInfos { + if index > 0 { + buffer.WriteString(", ") + } + + tblName := info.tableScan.Table.Name.O + if info.tableScan.TableAsName != nil && info.tableScan.TableAsName.O != "" { + tblName = info.tableScan.TableAsName.O + } + + if info.tableScan.Table.GetPartitionInfo() == nil { + buffer.WriteString("table of ") + buffer.WriteString(tblName) + continue + } + buffer.WriteString(getAccessObjectForTableScan(sctx, info.tableScan, info.partitionInfo)) + buffer.WriteString(" of ") + buffer.WriteString(tblName) + } + return buffer.String() } func partitionAccessObject(sctx sessionctx.Context, tbl table.PartitionedTable, pi *model.PartitionInfo, partTable *PartitionInfo) string { diff --git a/planner/core/expression_rewriter.go b/planner/core/expression_rewriter.go index 8dce004adad58..775aeda6a880f 100644 --- a/planner/core/expression_rewriter.go +++ b/planner/core/expression_rewriter.go @@ -618,6 +618,7 @@ func (er *expressionRewriter) handleOtherComparableSubq(lexpr, rexpr expression. UniqueID: er.sctx.GetSessionVars().AllocPlanColumnID(), RetType: funcMaxOrMin.RetTp, } + colMaxOrMin.SetCoercibility(rexpr.Coercibility()) schema := expression.NewSchema(colMaxOrMin) plan4Agg.names = append(plan4Agg.names, types.EmptyName) @@ -735,6 +736,7 @@ func (er *expressionRewriter) handleNEAny(lexpr, rexpr expression.Expression, np UniqueID: er.sctx.GetSessionVars().AllocPlanColumnID(), RetType: maxFunc.RetTp, } + maxResultCol.SetCoercibility(rexpr.Coercibility()) count := &expression.Column{ UniqueID: er.sctx.GetSessionVars().AllocPlanColumnID(), RetType: countFunc.RetTp, @@ -772,6 +774,7 @@ func (er *expressionRewriter) handleEQAll(lexpr, rexpr expression.Expression, np UniqueID: er.sctx.GetSessionVars().AllocPlanColumnID(), RetType: firstRowFunc.RetTp, } + firstRowResultCol.SetCoercibility(rexpr.Coercibility()) plan4Agg.names = append(plan4Agg.names, types.EmptyName) count := &expression.Column{ UniqueID: er.sctx.GetSessionVars().AllocPlanColumnID(), @@ -1008,9 +1011,11 @@ func (er *expressionRewriter) handleScalarSubquery(ctx context.Context, v *ast.S if np.Schema().Len() > 1 { newCols := make([]expression.Expression, 0, np.Schema().Len()) for i, data := range row { - newCols = append(newCols, &expression.Constant{ + constant := &expression.Constant{ Value: data, - RetType: np.Schema().Columns[i].GetType()}) + RetType: np.Schema().Columns[i].GetType()} + constant.SetCoercibility(np.Schema().Columns[i].Coercibility()) + newCols = append(newCols, constant) } expr, err1 := er.newFunction(ast.RowFunc, newCols[0].GetType(), newCols...) if err1 != nil { @@ -1019,10 +1024,12 @@ func (er *expressionRewriter) handleScalarSubquery(ctx context.Context, v *ast.S } er.ctxStackAppend(expr, types.EmptyName) } else { - er.ctxStackAppend(&expression.Constant{ + constant := &expression.Constant{ Value: row[0], RetType: np.Schema().Columns[0].GetType(), - }, types.EmptyName) + } + constant.SetCoercibility(np.Schema().Columns[0].Coercibility()) + er.ctxStackAppend(constant, types.EmptyName) } return v, true } @@ -1281,11 +1288,11 @@ func (er *expressionRewriter) rewriteVariable(v *ast.VariableExpr) { } if v.ExplicitScope && !sysVar.HasNoneScope() { if v.IsGlobal && !sysVar.HasGlobalScope() { - er.err = variable.ErrIncorrectScope.GenWithStackByArgs(name, "GLOBAL") + er.err = variable.ErrIncorrectScope.GenWithStackByArgs(name, "SESSION") return } if !v.IsGlobal && !sysVar.HasSessionScope() { - er.err = variable.ErrIncorrectScope.GenWithStackByArgs(name, "SESSION") + er.err = variable.ErrIncorrectScope.GenWithStackByArgs(name, "GLOBAL") return } } @@ -1446,11 +1453,23 @@ func (er *expressionRewriter) inToExpression(lLen int, not bool, tp *types.Field er.ctxStackAppend(expression.NewNull(), types.EmptyName) return } - maybeOverOptimized := expression.MaybeOverOptimized4PlanCache(er.sctx, args) - if !maybeOverOptimized && leftEt == types.ETInt { + if leftEt == types.ETInt { for i := 1; i < len(args); i++ { if c, ok := args[i].(*expression.Constant); ok { var isExceptional bool + if expression.MaybeOverOptimized4PlanCache(er.sctx, []expression.Expression{c}) { + if c.GetType().EvalType() == types.ETString { + // To keep the result be compatible with MySQL, refine `int non-constant <cmp> str constant` + // here and skip this refine operation in all other cases for safety. + er.sctx.GetSessionVars().StmtCtx.SkipPlanCache = true + expression.RemoveMutableConst(er.sctx, []expression.Expression{c}) + } else { + continue + } + } else if er.sctx.GetSessionVars().StmtCtx.SkipPlanCache { + // We should remove the mutable constant for correctness, because its value may be changed. + expression.RemoveMutableConst(er.sctx, []expression.Expression{c}) + } args[i], isExceptional = expression.RefineComparedConstant(er.sctx, *leftFt, c, opcode.EQ) if isExceptional { args[i] = c @@ -1856,13 +1875,13 @@ func findFieldNameFromNaturalUsingJoin(p LogicalPlan, v *ast.ColumnName) (col *e case *LogicalLimit, *LogicalSelection, *LogicalTopN, *LogicalSort, *LogicalMaxOneRow: return findFieldNameFromNaturalUsingJoin(p.Children()[0], v) case *LogicalJoin: - if x.redundantSchema != nil { - idx, err := expression.FindFieldName(x.redundantNames, v) + if x.fullSchema != nil { + idx, err := expression.FindFieldName(x.fullNames, v) if err != nil { return nil, nil, err } if idx >= 0 { - return x.redundantSchema.Columns[idx], x.redundantNames[idx], nil + return x.fullSchema.Columns[idx], x.fullNames[idx], nil } } } @@ -1998,6 +2017,13 @@ func decodeKeyFromString(ctx sessionctx.Context, s string) string { return s } return ret + } else if tablecodec.IsTableKey(key) { + ret, err := decodeTableKey(key, tableID, tbl, loc) + if err != nil { + ctx.GetSessionVars().StmtCtx.AppendWarning(err) + return s + } + return ret } ctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("invalid record/index key: %X", key)) return s @@ -2011,7 +2037,12 @@ func decodeRecordKey(key []byte, tableID int64, tbl table.Table, loc *time.Locat if handle.IsInt() { ret := make(map[string]interface{}) ret["table_id"] = strconv.FormatInt(tableID, 10) - ret["_tidb_rowid"] = handle.IntValue() + // When the clustered index is enabled, we should show the PK name. + if tbl.Meta().HasClusteredIndex() { + ret[tbl.Meta().GetPkName().String()] = handle.IntValue() + } else { + ret["_tidb_rowid"] = handle.IntValue() + } retStr, err := json.Marshal(ret) if err != nil { return "", errors.Trace(err) @@ -2043,7 +2074,8 @@ func decodeRecordKey(key []byte, tableID int64, tbl table.Table, loc *time.Locat ret := make(map[string]interface{}) ret["table_id"] = tableID handleRet := make(map[string]interface{}) - for colID, dt := range datumMap { + for colID := range datumMap { + dt := datumMap[colID] dtStr, err := datumToJSONObject(&dt) if err != nil { return "", errors.Trace(err) @@ -2141,6 +2173,15 @@ func decodeIndexKey(key []byte, tableID int64, tbl table.Table, loc *time.Locati return string(retStr), nil } +func decodeTableKey(key []byte, tableID int64, tbl table.Table, loc *time.Location) (string, error) { + ret := map[string]int64{"table_id": tableID} + retStr, err := json.Marshal(ret) + if err != nil { + return "", errors.Trace(err) + } + return string(retStr), nil +} + func datumToJSONObject(d *types.Datum) (interface{}, error) { if d.IsNull() { return nil, nil diff --git a/planner/core/expression_rewriter_test.go b/planner/core/expression_rewriter_test.go index 3df48371d9779..a26c85cbce50d 100644 --- a/planner/core/expression_rewriter_test.go +++ b/planner/core/expression_rewriter_test.go @@ -16,6 +16,7 @@ package core_test import ( . "github.com/pingcap/check" + "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/util/collate" @@ -466,6 +467,31 @@ func (s *testExpressionRewriterSuiteSerial) TestBetweenExprCollation(c *C) { tk.MustGetErrMsg("select * from t1 where a between 'B' collate utf8mb4_general_ci and c collate utf8mb4_unicode_ci;", "[expression:1270]Illegal mix of collations (latin1_bin,IMPLICIT), (utf8mb4_general_ci,EXPLICIT), (utf8mb4_unicode_ci,EXPLICIT) for operation 'BETWEEN'") } +func (s *testExpressionRewriterSuite) TestInsertOnDuplicateLazyMoreThan1Row(c *C) { + defer testleak.AfterTest(c)() + store, dom, err := newStoreWithBootstrap() + c.Assert(err, IsNil) + tk := testkit.NewTestKit(c, store) + defer func() { + dom.Close() + store.Close() + }() + + tk.MustExec("use test") + tk.MustExec("DROP TABLE if exists t1, t2, source;") + tk.MustExec("CREATE TABLE t1(a INTEGER PRIMARY KEY);") + tk.MustExec("CREATE TABLE t2(a INTEGER);") + tk.MustExec("CREATE TABLE source (b INTEGER);") + tk.MustExec("INSERT INTO t1 VALUES (1);") + tk.MustExec("INSERT INTO t2 VALUES (1);") + tk.MustExec("INSERT INTO source VALUES (1),(1);") + // the on duplicate is not triggered by t1's primary key. + tk.MustGetErrCode("INSERT INTO t1 (a) VALUES (1) ON DUPLICATE KEY UPDATE a= (SELECT b FROM source);", mysql.ErrSubqueryNo1Row) + // the on duplicate is not triggered. + tk.MustExec("INSERT INTO t2 (a) VALUES (1) ON DUPLICATE KEY UPDATE a= (SELECT b FROM source);") + tk.MustExec("DROP TABLE if exists t1, t2, source;") +} + func (s *testExpressionRewriterSuite) TestMultiColInExpression(c *C) { store, dom, err := newStoreWithBootstrap() c.Assert(err, IsNil) diff --git a/planner/core/expression_test.go b/planner/core/expression_test.go index a2dc8f7f3f4ae..0b207b7141c80 100644 --- a/planner/core/expression_test.go +++ b/planner/core/expression_test.go @@ -52,7 +52,6 @@ func runTests(t *testing.T, tests []testCase) { } func TestBetween(t *testing.T) { - t.Parallel() tests := []testCase{ {exprStr: "1 between 2 and 3", resultStr: "0"}, {exprStr: "1 not between 2 and 3", resultStr: "1"}, @@ -64,7 +63,6 @@ func TestBetween(t *testing.T) { } func TestCaseWhen(t *testing.T) { - t.Parallel() tests := []testCase{ { exprStr: "case 1 when 1 then 'str1' when 2 then 'str2' end", @@ -103,7 +101,6 @@ func TestCaseWhen(t *testing.T) { } func TestCast(t *testing.T) { - t.Parallel() f := types.NewFieldType(mysql.TypeLonglong) expr := &ast.FuncCastExpr{ @@ -142,7 +139,6 @@ func TestCast(t *testing.T) { } func TestPatternIn(t *testing.T) { - t.Parallel() tests := []testCase{ { exprStr: "1 not in (1, 2, 3)", @@ -189,7 +185,6 @@ func TestPatternIn(t *testing.T) { } func TestIsNull(t *testing.T) { - t.Parallel() tests := []testCase{ { exprStr: "1 IS NULL", @@ -212,7 +207,6 @@ func TestIsNull(t *testing.T) { } func TestCompareRow(t *testing.T) { - t.Parallel() tests := []testCase{ { exprStr: "row(1,2,3)=row(1,2,3)", @@ -255,7 +249,6 @@ func TestCompareRow(t *testing.T) { } func TestIsTruth(t *testing.T) { - t.Parallel() tests := []testCase{ { exprStr: "1 IS TRUE", diff --git a/planner/core/find_best_task.go b/planner/core/find_best_task.go index 675e704cb38d3..59a182f9f8e7c 100644 --- a/planner/core/find_best_task.go +++ b/planner/core/find_best_task.go @@ -27,7 +27,7 @@ import ( "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/planner/property" "github.com/pingcap/tidb/planner/util" - "github.com/pingcap/tidb/sessionctx/stmtctx" + "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/types" tidbutil "github.com/pingcap/tidb/util" @@ -37,7 +37,6 @@ import ( "github.com/pingcap/tidb/util/ranger" "github.com/pingcap/tidb/util/set" "go.uber.org/zap" - "golang.org/x/tools/container/intsets" ) const ( @@ -417,30 +416,10 @@ func (ds *DataSource) tryToGetDualTask() (task, error) { // candidatePath is used to maintain required info for skyline pruning. type candidatePath struct { - path *util.AccessPath - accessCondsColSet *intsets.Sparse // accessCondsColSet is the set of columns that occurred in the access conditions. - indexFiltersColSet *intsets.Sparse // indexFiltersColSet is the set of columns that occurred in the index filters. - isMatchProp bool -} - -// compareColumnSet will compares the two set. The last return value is used to indicate -// if they are comparable, it is false when both two sets have columns that do not occur in the other. -// When the second return value is true, the value of first: -// (1) -1 means that `l` is a strict subset of `r`; -// (2) 0 means that `l` equals to `r`; -// (3) 1 means that `l` is a strict superset of `r`. -func compareColumnSet(l, r *intsets.Sparse) (int, bool) { - lLen, rLen := l.Len(), r.Len() - if lLen < rLen { - // -1 is meaningful only when l.SubsetOf(r) is true. - return -1, l.SubsetOf(r) - } - if lLen == rLen { - // 0 is meaningful only when l.SubsetOf(r) is true. - return 0, l.SubsetOf(r) - } - // 1 is meaningful only when r.SubsetOf(l) is true. - return 1, r.SubsetOf(l) + path *util.AccessPath + accessCondsColMap util.Col2Len // accessCondsColMap maps Column.UniqueID to column length for the columns in AccessConds. + indexCondsColMap util.Col2Len // indexCondsColMap maps Column.UniqueID to column length for the columns in AccessConds and indexFilters. + isMatchProp bool } func compareBool(l, r bool) int { @@ -456,21 +435,21 @@ func compareBool(l, r bool) int { func compareIndexBack(lhs, rhs *candidatePath) (int, bool) { result := compareBool(lhs.path.IsSingleScan, rhs.path.IsSingleScan) if result == 0 && !lhs.path.IsSingleScan { - // if both lhs and rhs need to access table after IndexScan, we use the set of columns that occurred in IndexFilters + // if both lhs and rhs need to access table after IndexScan, we utilize the set of columns that occurred in AccessConds and IndexFilters // to compare how many table rows will be accessed. - return compareColumnSet(lhs.indexFiltersColSet, rhs.indexFiltersColSet) + return util.CompareCol2Len(lhs.indexCondsColMap, rhs.indexCondsColMap) } return result, true } // compareCandidates is the core of skyline pruning. It compares the two candidate paths on three dimensions: // (1): the set of columns that occurred in the access condition, -// (2): whether or not it matches the physical property -// (3): does it require a double scan. +// (2): does it require a double scan, +// (3): whether or not it matches the physical property. // If `x` is not worse than `y` at all factors, // and there exists one factor that `x` is better than `y`, then `x` is better than `y`. func compareCandidates(lhs, rhs *candidatePath) int { - setsResult, comparable := compareColumnSet(lhs.accessCondsColSet, rhs.accessCondsColSet) + accessResult, comparable := util.CompareCol2Len(lhs.accessCondsColMap, rhs.accessCondsColMap) if !comparable { return 0 } @@ -479,11 +458,11 @@ func compareCandidates(lhs, rhs *candidatePath) int { return 0 } matchResult := compareBool(lhs.isMatchProp, rhs.isMatchProp) - sum := setsResult + scanResult + matchResult - if setsResult >= 0 && scanResult >= 0 && matchResult >= 0 && sum > 0 { + sum := accessResult + scanResult + matchResult + if accessResult >= 0 && scanResult >= 0 && matchResult >= 0 && sum > 0 { return 1 } - if setsResult <= 0 && scanResult <= 0 && matchResult <= 0 && sum < 0 { + if accessResult <= 0 && scanResult <= 0 && matchResult <= 0 && sum < 0 { return -1 } return 0 @@ -543,15 +522,15 @@ func (ds *DataSource) isMatchProp(path *util.AccessPath, prop *property.Physical func (ds *DataSource) getTableCandidate(path *util.AccessPath, prop *property.PhysicalProperty) *candidatePath { candidate := &candidatePath{path: path} candidate.isMatchProp = ds.isMatchProp(path, prop) - candidate.accessCondsColSet = expression.ExtractColumnSet(path.AccessConds) + candidate.accessCondsColMap = util.ExtractCol2Len(path.AccessConds, nil, nil) return candidate } func (ds *DataSource) getIndexCandidate(path *util.AccessPath, prop *property.PhysicalProperty) *candidatePath { candidate := &candidatePath{path: path} candidate.isMatchProp = ds.isMatchProp(path, prop) - candidate.accessCondsColSet = expression.ExtractColumnSet(path.AccessConds) - candidate.indexFiltersColSet = expression.ExtractColumnSet(path.IndexFilters) + candidate.accessCondsColMap = util.ExtractCol2Len(path.AccessConds, path.IdxCols, path.IdxColLens) + candidate.indexCondsColMap = util.ExtractCol2Len(append(path.AccessConds, path.IndexFilters...), path.FullIdxCols, path.FullIdxColLens) return candidate } @@ -803,7 +782,11 @@ func (ds *DataSource) findBestTask(prop *property.PhysicalProperty, planCounter continue } // if we already know the range of the scan is empty, just return a TableDual - if len(path.Ranges) == 0 && !ds.ctx.GetSessionVars().StmtCtx.UseCache { + if len(path.Ranges) == 0 { + // We should uncache the tableDual plan. + if expression.MaybeOverOptimized4PlanCache(ds.ctx, path.AccessConds) { + ds.ctx.GetSessionVars().StmtCtx.SkipPlanCache = true + } dual := PhysicalTableDual{}.Init(ds.ctx, ds.stats, ds.blockOffset) dual.SetSchema(ds.schema) cntPlan += 1 @@ -812,10 +795,12 @@ func (ds *DataSource) findBestTask(prop *property.PhysicalProperty, planCounter p: dual, }, cntPlan, nil } - canConvertPointGet := len(path.Ranges) > 0 && path.StoreType == kv.TiKV && ds.isPointGetConvertableSchema() && - // to avoid the over-optimized risk, do not generate PointGet for plan cache, for example, - // `pk>=$a and pk<=$b` can be optimized to a PointGet when `$a==$b`, but it can cause wrong results when `$a!=$b`. - !ds.ctx.GetSessionVars().StmtCtx.UseCache + canConvertPointGet := len(path.Ranges) > 0 && path.StoreType == kv.TiKV && ds.isPointGetConvertableSchema() + + if canConvertPointGet && expression.MaybeOverOptimized4PlanCache(ds.ctx, path.AccessConds) { + canConvertPointGet = ds.canConvertToPointGetForPlanCache(path) + } + if canConvertPointGet && !path.IsIntHandlePath { // We simply do not build [batch] point get for prefix indexes. This can be optimized. canConvertPointGet = path.Index.Unique && !path.Index.HasPrefixIndex() @@ -858,7 +843,8 @@ func (ds *DataSource) findBestTask(prop *property.PhysicalProperty, planCounter if canConvertPointGet { allRangeIsPoint := true for _, ran := range path.Ranges { - if !ran.IsPoint(ds.ctx.GetSessionVars().StmtCtx) { + if !ran.IsPointNonNullable(ds.ctx) { + // unique indexes can have duplicated NULL rows so we cannot use PointGet if there is NULL allRangeIsPoint = false break } @@ -934,6 +920,27 @@ func (ds *DataSource) findBestTask(prop *property.PhysicalProperty, planCounter return } +func (ds *DataSource) canConvertToPointGetForPlanCache(path *util.AccessPath) bool { + // PointGet might contain some over-optimized assumptions, like `a>=1 and a<=1` --> `a=1`, but + // these assumptions may be broken after parameters change. + // So for safety, we narrow down the scope and just generate PointGet in some particular and simple scenarios. + + // scenario 1: each column corresponds to a single EQ, `a=1 and b=2 and c=3` --> `[1, 2, 3]` + if len(path.Ranges) > 0 && path.Ranges[0].Width() == len(path.AccessConds) { + for _, accessCond := range path.AccessConds { + f, ok := accessCond.(*expression.ScalarFunction) + if !ok { + return false + } + if f.FuncName.L != ast.EQ { + return false + } + } + return true + } + return false +} + func (ds *DataSource) convertToIndexMergeScan(prop *property.PhysicalProperty, candidate *candidatePath) (task task, err error) { if prop.TaskTp != property.RootTaskType || !prop.IsEmpty() { return invalidTask, nil @@ -1177,8 +1184,11 @@ func (ts *PhysicalTableScan) appendExtraHandleCol(ds *DataSource) (*expression.C // addSelection4PlanCache adds an extra safeguard selection upon this root task for safety. // When reusing cached plans and rebuilding range for them, the range builder may return an loose range after parameters change. +// When we add the extra selection, it should meet two conditions: +// 1. The length of 'ds.pushedDownConds` should not be zero. +// 2. The result of function `MaybeOverOptimized4PlanCache(ds.pushedDownConds)` call needs to return true. func (ds *DataSource) addSelection4PlanCache(task *rootTask, stats *property.StatsInfo, prop *property.PhysicalProperty) { - if !ds.ctx.GetSessionVars().StmtCtx.UseCache || ds.ctx.GetSessionVars().StmtCtx.MaybeOverOptimized4PlanCache { + if !expression.MaybeOverOptimized4PlanCache(ds.ctx, ds.pushedDownConds) || len(ds.pushedDownConds) == 0 { return } sel := PhysicalSelection{Conditions: ds.pushedDownConds}.Init(ds.ctx, stats, ds.blockOffset, prop) @@ -1468,7 +1478,7 @@ func getMostCorrCol4Handle(exprs []expression.Expression, histColl *statistics.T } // getColumnRangeCounts estimates row count for each range respectively. -func getColumnRangeCounts(sc *stmtctx.StatementContext, colID int64, ranges []*ranger.Range, histColl *statistics.HistColl, idxID int64) ([]float64, bool) { +func getColumnRangeCounts(sctx sessionctx.Context, colID int64, ranges []*ranger.Range, histColl *statistics.HistColl, idxID int64) ([]float64, bool) { var err error var count float64 rangeCounts := make([]float64, len(ranges)) @@ -1478,13 +1488,13 @@ func getColumnRangeCounts(sc *stmtctx.StatementContext, colID int64, ranges []*r if idxHist == nil || idxHist.IsInvalid(false) { return nil, false } - count, err = histColl.GetRowCountByIndexRanges(sc, idxID, []*ranger.Range{ran}) + count, err = histColl.GetRowCountByIndexRanges(sctx, idxID, []*ranger.Range{ran}) } else { colHist, ok := histColl.Columns[colID] - if !ok || colHist.IsInvalid(sc, false) { + if !ok || colHist.IsInvalid(sctx, false) { return nil, false } - count, err = histColl.GetRowCountByColumnRanges(sc, colID, []*ranger.Range{ran}) + count, err = histColl.GetRowCountByColumnRanges(sctx, colID, []*ranger.Range{ran}) } if err != nil { return nil, false @@ -1554,8 +1564,7 @@ func (ds *DataSource) crossEstimateRowCount(path *util.AccessPath, conds []expre if len(accessConds) == 0 { return 0, false, corr } - sc := ds.ctx.GetSessionVars().StmtCtx - ranges, err := ranger.BuildColumnRange(accessConds, sc, col.RetType, types.UnspecifiedLength) + ranges, err := ranger.BuildColumnRange(accessConds, ds.ctx, col.RetType, types.UnspecifiedLength) if len(ranges) == 0 || err != nil { return 0, err == nil, corr } @@ -1563,7 +1572,7 @@ func (ds *DataSource) crossEstimateRowCount(path *util.AccessPath, conds []expre if !idxExists { idxID = -1 } - rangeCounts, ok := getColumnRangeCounts(sc, colID, ranges, ds.tableStats.HistColl, idxID) + rangeCounts, ok := getColumnRangeCounts(ds.ctx, colID, ranges, ds.tableStats.HistColl, idxID) if !ok { return 0, false, corr } @@ -1573,9 +1582,9 @@ func (ds *DataSource) crossEstimateRowCount(path *util.AccessPath, conds []expre } var rangeCount float64 if idxExists { - rangeCount, err = ds.tableStats.HistColl.GetRowCountByIndexRanges(sc, idxID, convertedRanges) + rangeCount, err = ds.tableStats.HistColl.GetRowCountByIndexRanges(ds.ctx, idxID, convertedRanges) } else { - rangeCount, err = ds.tableStats.HistColl.GetRowCountByColumnRanges(sc, colID, convertedRanges) + rangeCount, err = ds.tableStats.HistColl.GetRowCountByColumnRanges(ds.ctx, colID, convertedRanges) } if err != nil { return 0, false, corr @@ -1821,7 +1830,8 @@ func (ds *DataSource) convertToPointGet(prop *property.PhysicalProperty, candida var partitionInfo *model.PartitionDefinition if ds.isPartition { if pi := ds.tableInfo.GetPartitionInfo(); pi != nil { - for _, def := range pi.Definitions { + for i := range pi.Definitions { + def := pi.Definitions[i] if def.ID == ds.physicalTableID { partitionInfo = &def break diff --git a/planner/core/fragment.go b/planner/core/fragment.go index 55f2bbbfaabb5..c8eae1c63d148 100644 --- a/planner/core/fragment.go +++ b/planner/core/fragment.go @@ -348,9 +348,7 @@ func (e *mppTaskGenerator) constructMPPTasksImpl(ctx context.Context, ts *Physic func (e *mppTaskGenerator) constructMPPTasksForSinglePartitionTable(ctx context.Context, kvRanges []kv.KeyRange, tableID int64) ([]*kv.MPPTask, error) { req := &kv.MPPBuildTasksRequest{ - KeyRanges: kvRanges, - BalanceWithContinuity: e.ctx.GetSessionVars().EnableMPPBalanceWithContinuousRegion, - BalanceContinuousRegionCount: e.ctx.GetSessionVars().EnableMPPBalanceWithContinuousRegionCount, + KeyRanges: kvRanges, } ttl, err := time.ParseDuration(e.ctx.GetSessionVars().MPPStoreFailTTL) if err != nil { diff --git a/planner/core/handle_cols.go b/planner/core/handle_cols.go index c1bca6eec7ddf..48d6ab2444edd 100644 --- a/planner/core/handle_cols.go +++ b/planner/core/handle_cols.go @@ -26,6 +26,7 @@ import ( "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/util/collate" ) // HandleCols is the interface that holds handle columns. @@ -48,7 +49,7 @@ type HandleCols interface { // NumCols returns the number of columns. NumCols() int // Compare compares two datum rows by handle order. - Compare(a, b []types.Datum) (int, error) + Compare(a, b []types.Datum, ctors []collate.Collator) (int, error) // GetFieldTypes return field types of columns. GetFieldsTypes() []*types.FieldType } @@ -145,11 +146,11 @@ func (cb *CommonHandleCols) String() string { } // Compare implements the kv.HandleCols interface. -func (cb *CommonHandleCols) Compare(a, b []types.Datum) (int, error) { - for _, col := range cb.columns { +func (cb *CommonHandleCols) Compare(a, b []types.Datum, ctors []collate.Collator) (int, error) { + for i, col := range cb.columns { aDatum := &a[col.Index] bDatum := &b[col.Index] - cmp, err := aDatum.CompareDatum(cb.sc, bDatum) + cmp, err := aDatum.Compare(cb.sc, bDatum, ctors[i]) if err != nil { return 0, err } @@ -237,7 +238,7 @@ func (ib *IntHandleCols) NumCols() int { } // Compare implements the kv.HandleCols interface. -func (ib *IntHandleCols) Compare(a, b []types.Datum) (int, error) { +func (ib *IntHandleCols) Compare(a, b []types.Datum, ctors []collate.Collator) (int, error) { aInt := a[ib.col.Index].GetInt64() bInt := b[ib.col.Index].GetInt64() if aInt == bInt { diff --git a/planner/core/indexmerge_test.go b/planner/core/indexmerge_test.go index c69215b52a173..28118728b41e7 100644 --- a/planner/core/indexmerge_test.go +++ b/planner/core/indexmerge_test.go @@ -16,42 +16,17 @@ package core import ( "context" + "testing" - . "github.com/pingcap/check" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/planner/util" - "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/testkit/testdata" "github.com/pingcap/tidb/util/hint" - "github.com/pingcap/tidb/util/testleak" - "github.com/pingcap/tidb/util/testutil" + "github.com/stretchr/testify/require" ) -var _ = Suite(&testIndexMergeSuite{}) - -type testIndexMergeSuite struct { - *parser.Parser - - is infoschema.InfoSchema - ctx sessionctx.Context - - testdata testutil.TestData -} - -func (s *testIndexMergeSuite) SetUpSuite(c *C) { - s.is = infoschema.MockInfoSchema([]*model.TableInfo{MockSignedTable(), MockView()}) - s.ctx = MockContext() - s.Parser = parser.New() - var err error - s.testdata, err = testutil.LoadTestSuiteData("testdata", "index_merge_suite") - c.Assert(err, IsNil) -} - -func (s *testIndexMergeSuite) TearDownSuite(c *C) { - c.Assert(s.testdata.GenerateOutputIfNeeded(), IsNil) -} - func getIndexMergePathDigest(paths []*util.AccessPath, startIndex int) string { if len(paths) == startIndex { return "[]" @@ -82,31 +57,33 @@ func getIndexMergePathDigest(paths []*util.AccessPath, startIndex int) string { return idxMergeDisgest } -func (s *testIndexMergeSuite) TestIndexMergePathGeneration(c *C) { - defer testleak.AfterTest(c)() +func TestIndexMergePathGeneration(t *testing.T) { var input, output []string - s.testdata.GetTestCases(c, &input, &output) + indexMergeSuiteData.GetTestCases(t, &input, &output) ctx := context.TODO() + sctx := MockContext() + is := infoschema.MockInfoSchema([]*model.TableInfo{MockSignedTable(), MockView()}) + + parser := parser.New() + for i, tc := range input { - comment := Commentf("case:%v sql:%s", i, tc) - stmt, err := s.ParseOneStmt(tc, "", "") - c.Assert(err, IsNil, comment) - err = Preprocess(s.ctx, stmt, WithPreprocessorReturn(&PreprocessorReturn{InfoSchema: s.is})) - c.Assert(err, IsNil) - builder, _ := NewPlanBuilder().Init(MockContext(), s.is, &hint.BlockHintProcessor{}) + stmt, err := parser.ParseOneStmt(tc, "", "") + require.NoErrorf(t, err, "case:%v sql:%s", i, tc) + err = Preprocess(sctx, stmt, WithPreprocessorReturn(&PreprocessorReturn{InfoSchema: is})) + require.NoError(t, err) + builder, _ := NewPlanBuilder().Init(MockContext(), is, &hint.BlockHintProcessor{}) p, err := builder.Build(ctx, stmt) if err != nil { - s.testdata.OnRecord(func() { + testdata.OnRecord(func() { output[i] = err.Error() }) - c.Assert(err.Error(), Equals, output[i], comment) + require.Equal(t, output[i], err.Error(), "case:%v sql:%s", i, tc) continue } - c.Assert(err, IsNil) + require.NoError(t, err) p, err = logicalOptimize(ctx, builder.optFlag, p.(LogicalPlan)) - c.Assert(err, IsNil) + require.NoError(t, err) lp := p.(LogicalPlan) - c.Assert(err, IsNil) var ds *DataSource for ds == nil { switch v := lp.(type) { @@ -119,11 +96,11 @@ func (s *testIndexMergeSuite) TestIndexMergePathGeneration(c *C) { ds.ctx.GetSessionVars().SetEnableIndexMerge(true) idxMergeStartIndex := len(ds.possibleAccessPaths) _, err = lp.recursiveDeriveStats(nil) - c.Assert(err, IsNil) + require.NoError(t, err) result := getIndexMergePathDigest(ds.possibleAccessPaths, idxMergeStartIndex) - s.testdata.OnRecord(func() { + testdata.OnRecord(func() { output[i] = result }) - c.Assert(result, Equals, output[i], comment) + require.Equalf(t, output[i], result, "case:%v sql:%s", i, tc) } } diff --git a/planner/core/integration_partition_test.go b/planner/core/integration_partition_test.go index f61912b0a4df5..d463d05c45754 100644 --- a/planner/core/integration_partition_test.go +++ b/planner/core/integration_partition_test.go @@ -31,7 +31,6 @@ import ( ) func TestListPartitionPushDown(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() tk := testkit.NewTestKit(t, store) @@ -64,7 +63,6 @@ func TestListPartitionPushDown(t *testing.T) { } func TestListColVariousTypes(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() @@ -79,10 +77,12 @@ func TestListColVariousTypes(t *testing.T) { tk.MustExec(`create table tstring (a varchar(32)) partition by list columns(a) (partition p0 values in ('a', 'b'), partition p1 values in ('c', 'd'))`) err := tk.ExecToErr(`create table tdouble (a double) partition by list columns(a) (partition p0 values in (0, 1), partition p1 values in (2, 3))`) - require.Regexp(t, ".*not allowed.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "not allowed") err = tk.ExecToErr(`create table tdecimal (a decimal(30, 10)) partition by list columns(a) (partition p0 values in (0, 1), partition p1 values in (2, 3))`) - require.Regexp(t, ".*not allowed.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "not allowed") tk.MustExec(`insert into tint values (0), (1), (2), (3)`) tk.MustExec(`insert into tdate values ('2000-01-01'), ('2000-01-02'), ('2000-01-03'), ('2000-01-04')`) @@ -105,7 +105,6 @@ func TestListColVariousTypes(t *testing.T) { } func TestListPartitionPruning(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() @@ -149,7 +148,6 @@ func TestListPartitionPruning(t *testing.T) { } func TestListPartitionFunctions(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() @@ -188,7 +186,6 @@ func TestListPartitionOrderLimit(t *testing.T) { t.Skip("skip race test") } - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() @@ -252,7 +249,6 @@ func TestListPartitionAgg(t *testing.T) { t.Skip("skip race test") } - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() @@ -312,7 +308,6 @@ func TestListPartitionAgg(t *testing.T) { } func TestListPartitionDML(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() @@ -330,10 +325,12 @@ func TestListPartitionDML(t *testing.T) { tk.MustExec("insert into tlist partition(p0, p1) values (2), (3), (8), (9)") err := tk.ExecToErr("insert into tlist partition(p0) values (9)") - require.Regexp(t, ".*Found a row not matching the given partition set.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "Found a row not matching the given partition set") err = tk.ExecToErr("insert into tlist partition(p3) values (20)") - require.Regexp(t, ".*Unknown partition.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "Unknown partition") tk.MustExec("update tlist partition(p0) set a=a+1") tk.MustQuery("select a from tlist order by a").Check(testkit.Rows("1", "2", "3", "4", "8", "9")) @@ -353,10 +350,12 @@ func TestListPartitionDML(t *testing.T) { tk.MustExec("insert into tcollist partition(p0, p1) values (2), (3), (8), (9)") err = tk.ExecToErr("insert into tcollist partition(p0) values (9)") - require.Regexp(t, ".*Found a row not matching the given partition set.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "Found a row not matching the given partition set") err = tk.ExecToErr("insert into tcollist partition(p3) values (20)") - require.Regexp(t, ".*Unknown partition.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "Unknown partition") tk.MustExec("update tcollist partition(p0) set a=a+1") tk.MustQuery("select a from tcollist order by a").Check(testkit.Rows("1", "2", "3", "4", "8", "9")) @@ -370,7 +369,6 @@ func TestListPartitionDML(t *testing.T) { } func TestListPartitionCreation(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() @@ -384,18 +382,22 @@ func TestListPartitionCreation(t *testing.T) { tk.MustExec("create table tuk1 (a int, b int, unique key(a)) partition by list (a) (partition p0 values in (0))") err := tk.ExecToErr("create table tuk2 (a int, b int, unique key(a)) partition by list (b) (partition p0 values in (0))") - require.Regexp(t, ".*UNIQUE INDEX must include all columns.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "UNIQUE INDEX must include all columns") err = tk.ExecToErr("create table tuk2 (a int, b int, unique key(a), unique key(b)) partition by list (a) (partition p0 values in (0))") - require.Regexp(t, ".*UNIQUE INDEX must include all columns.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "UNIQUE INDEX must include all columns") tk.MustExec("create table tcoluk1 (a int, b int, unique key(a)) partition by list columns(a) (partition p0 values in (0))") err = tk.ExecToErr("create table tcoluk2 (a int, b int, unique key(a)) partition by list columns(b) (partition p0 values in (0))") - require.Regexp(t, ".*UNIQUE INDEX must include all columns.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "UNIQUE INDEX must include all columns") err = tk.ExecToErr("create table tcoluk2 (a int, b int, unique key(a), unique key(b)) partition by list columns(a) (partition p0 values in (0))") - require.Regexp(t, ".*UNIQUE INDEX must include all columns.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "UNIQUE INDEX must include all columns") // with PK tk.MustExec("create table tpk1 (a int, b int, primary key(a)) partition by list (a) (partition p0 values in (0))") @@ -417,17 +419,19 @@ func TestListPartitionCreation(t *testing.T) { tk.MustExec("create table texp3 (a int, b int) partition by list(a*b) (partition p0 values in (0))") err = tk.ExecToErr("create table texp4 (a int, b int) partition by list(a|b) (partition p0 values in (0))") - require.Regexp(t, ".*This partition function is not allowed.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "This partition function is not allowed") err = tk.ExecToErr("create table texp4 (a int, b int) partition by list(a^b) (partition p0 values in (0))") - require.Regexp(t, ".*This partition function is not allowed.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "This partition function is not allowed") err = tk.ExecToErr("create table texp4 (a int, b int) partition by list(a&b) (partition p0 values in (0))") - require.Regexp(t, ".*This partition function is not allowed.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "This partition function is not allowed") } func TestListPartitionDDL(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() @@ -440,20 +444,24 @@ func TestListPartitionDDL(t *testing.T) { // index tk.MustExec(`create table tlist (a int, b int) partition by list (a) (partition p0 values in (0))`) err := tk.ExecToErr(`alter table tlist add primary key (b)`) // add pk - require.Regexp(t, ".*must include all.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "must include all") tk.MustExec(`alter table tlist add primary key (a)`) err = tk.ExecToErr(`alter table tlist add unique key (b)`) // add uk - require.Regexp(t, ".*must include all.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "must include all") tk.MustExec(`alter table tlist add key (b)`) // add index tk.MustExec(`alter table tlist rename index b to bb`) tk.MustExec(`alter table tlist drop index bb`) tk.MustExec(`create table tcollist (a int, b int) partition by list columns (a) (partition p0 values in (0))`) err = tk.ExecToErr(`alter table tcollist add primary key (b)`) // add pk - require.Regexp(t, ".*must include all.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "must include all") tk.MustExec(`alter table tcollist add primary key (a)`) err = tk.ExecToErr(`alter table tcollist add unique key (b)`) // add uk - require.Regexp(t, ".*must include all.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "must include all") tk.MustExec(`alter table tcollist add key (b)`) // add index tk.MustExec(`alter table tcollist rename index b to bb`) tk.MustExec(`alter table tcollist drop index bb`) @@ -478,7 +486,6 @@ func TestListPartitionDDL(t *testing.T) { } func TestListPartitionOperations(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() @@ -520,26 +527,32 @@ func TestListPartitionOperations(t *testing.T) { tk.MustExec("alter table tlist drop partition p0") tk.MustQuery("select * from tlist").Sort().Check(testkit.Rows("10", "15", "5")) err := tk.ExecToErr("select * from tlist partition (p0)") - require.Regexp(t, ".*Unknown partition.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "Unknown partition") tk.MustExec("alter table tlist drop partition p1, p2") tk.MustQuery("select * from tlist").Sort().Check(testkit.Rows("15")) err = tk.ExecToErr("select * from tlist partition (p1)") - require.Regexp(t, ".*Unknown partition.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "Unknown partition") err = tk.ExecToErr("alter table tlist drop partition p3") - require.Regexp(t, ".*Cannot remove all partitions.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "Cannot remove all partitions") tk.MustExec("insert into tcollist values (0), (5), (10)") tk.MustQuery("select * from tcollist").Sort().Check(testkit.Rows("0", "10", "15", "5")) tk.MustExec("alter table tcollist drop partition p0") tk.MustQuery("select * from tcollist").Sort().Check(testkit.Rows("10", "15", "5")) err = tk.ExecToErr("select * from tcollist partition (p0)") - require.Regexp(t, ".*Unknown partition.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "Unknown partition") tk.MustExec("alter table tcollist drop partition p1, p2") tk.MustQuery("select * from tcollist").Sort().Check(testkit.Rows("15")) err = tk.ExecToErr("select * from tcollist partition (p1)") - require.Regexp(t, ".*Unknown partition.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "Unknown partition") err = tk.ExecToErr("alter table tcollist drop partition p3") - require.Regexp(t, ".*Cannot remove all partitions.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "Cannot remove all partitions") // add partition tk.MustExec("alter table tlist add partition (partition p0 values in (0, 1, 2, 3, 4))") @@ -547,18 +560,19 @@ func TestListPartitionOperations(t *testing.T) { tk.MustExec("insert into tlist values (0), (5), (10)") tk.MustQuery("select * from tlist").Sort().Check(testkit.Rows("0", "10", "15", "5")) err = tk.ExecToErr("alter table tlist add partition (partition pxxx values in (4))") - require.Regexp(t, ".*Multiple definition.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "Multiple definition") tk.MustExec("alter table tcollist add partition (partition p0 values in (0, 1, 2, 3, 4))") tk.MustExec("alter table tcollist add partition (partition p1 values in (5, 6, 7, 8, 9), partition p2 values in (10, 11, 12, 13, 14))") tk.MustExec("insert into tcollist values (0), (5), (10)") tk.MustQuery("select * from tcollist").Sort().Check(testkit.Rows("0", "10", "15", "5")) err = tk.ExecToErr("alter table tcollist add partition (partition pxxx values in (4))") - require.Regexp(t, ".*Multiple definition.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "Multiple definition") } func TestListPartitionPrivilege(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() @@ -584,17 +598,20 @@ func TestListPartitionPrivilege(t *testing.T) { tk1.SetSession(se) tk1.MustExec(`use list_partition_pri`) err = tk1.ExecToErr(`alter table tlist truncate partition p0`) - require.Regexp(t, ".*denied.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "denied") err = tk1.ExecToErr(`alter table tlist drop partition p0`) - require.Regexp(t, ".*denied.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "denied") err = tk1.ExecToErr(`alter table tlist add partition (partition p2 values in (2))`) - require.Regexp(t, ".*denied.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "denied") err = tk1.ExecToErr(`insert into tlist values (1)`) - require.Regexp(t, ".*denied.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "denied") } func TestListPartitionShardBits(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() @@ -626,7 +643,6 @@ func TestListPartitionShardBits(t *testing.T) { } func TestListPartitionSplitRegion(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() @@ -660,7 +676,6 @@ func TestListPartitionSplitRegion(t *testing.T) { } func TestListPartitionView(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() @@ -705,7 +720,6 @@ func TestListPartitionView(t *testing.T) { } func TestListPartitionAutoIncre(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() @@ -719,7 +733,8 @@ func TestListPartitionAutoIncre(t *testing.T) { partition p0 values in (0, 1, 2, 3, 4), partition p1 values in (5, 6, 7, 8, 9), partition p2 values in (10, 11, 12, 13, 14))`) - require.Regexp(t, ".*it must be defined as a key.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "it must be defined as a key") tk.MustExec(`create table tlist (a int, b int AUTO_INCREMENT, key(b)) partition by list (a) ( partition p0 values in (0, 1, 2, 3, 4), @@ -735,7 +750,8 @@ func TestListPartitionAutoIncre(t *testing.T) { partition p0 values in (0, 1, 2, 3, 4), partition p1 values in (5, 6, 7, 8, 9), partition p2 values in (10, 11, 12, 13, 14))`) - require.Regexp(t, ".*it must be defined as a key.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "it must be defined as a key") tk.MustExec(`create table tcollist (a int, b int AUTO_INCREMENT, key(b)) partition by list (a) ( partition p0 values in (0, 1, 2, 3, 4), @@ -749,7 +765,6 @@ func TestListPartitionAutoIncre(t *testing.T) { } func TestListPartitionAutoRandom(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() @@ -763,7 +778,8 @@ func TestListPartitionAutoRandom(t *testing.T) { partition p0 values in (0, 1, 2, 3, 4), partition p1 values in (5, 6, 7, 8, 9), partition p2 values in (10, 11, 12, 13, 14))`) - require.Regexp(t, ".*Invalid auto random.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "Invalid auto random") tk.MustExec(`create table tlist (a bigint auto_random, primary key(a)) partition by list (a) ( partition p0 values in (0, 1, 2, 3, 4), @@ -774,7 +790,8 @@ func TestListPartitionAutoRandom(t *testing.T) { partition p0 values in (0, 1, 2, 3, 4), partition p1 values in (5, 6, 7, 8, 9), partition p2 values in (10, 11, 12, 13, 14))`) - require.Regexp(t, ".*Invalid auto random.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "Invalid auto random") tk.MustExec(`create table tcollist (a bigint auto_random, primary key(a)) partition by list columns (a) ( partition p0 values in (0, 1, 2, 3, 4), @@ -783,7 +800,6 @@ func TestListPartitionAutoRandom(t *testing.T) { } func TestListPartitionInvisibleIdx(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() @@ -803,7 +819,6 @@ func TestListPartitionInvisibleIdx(t *testing.T) { } func TestListPartitionCTE(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() @@ -831,7 +846,6 @@ func TestListPartitionCTE(t *testing.T) { } func TestListPartitionTempTable(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() @@ -841,13 +855,14 @@ func TestListPartitionTempTable(t *testing.T) { tk.MustExec("drop table if exists tlist") tk.MustExec(`set tidb_enable_list_partition = 1`) err := tk.ExecToErr("create global temporary table t(a int, b int) partition by list(a) (partition p0 values in (0)) on commit delete rows") - require.Regexp(t, ".*Cannot create temporary table with partitions.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "Cannot create temporary table with partitions") err = tk.ExecToErr("create global temporary table t(a int, b int) partition by list columns (a) (partition p0 values in (0)) on commit delete rows") - require.Regexp(t, ".*Cannot create temporary table with partitions.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "Cannot create temporary table with partitions") } func TestListPartitionAlterPK(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() @@ -863,7 +878,8 @@ func TestListPartitionAlterPK(t *testing.T) { tk.MustExec(`alter table tlist add primary key(a)`) tk.MustExec(`alter table tlist drop primary key`) err := tk.ExecToErr(`alter table tlist add primary key(b)`) - require.Regexp(t, ".*must include all columns.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "must include all columns") tk.MustExec(`create table tcollist (a int, b int) partition by list columns (a) ( partition p0 values in (0, 1, 2, 3, 4), @@ -872,7 +888,8 @@ func TestListPartitionAlterPK(t *testing.T) { tk.MustExec(`alter table tcollist add primary key(a)`) tk.MustExec(`alter table tcollist drop primary key`) err = tk.ExecToErr(`alter table tcollist add primary key(b)`) - require.Regexp(t, ".*must include all columns.*", err) + require.Error(t, err) + require.Contains(t, err.Error(), "must include all columns") } func TestListPartitionRandomTransaction(t *testing.T) { @@ -880,7 +897,6 @@ func TestListPartitionRandomTransaction(t *testing.T) { t.Skip("skip race test") } - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() @@ -934,7 +950,6 @@ func TestListPartitionRandomTransaction(t *testing.T) { } func TestIssue27018(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() @@ -962,7 +977,6 @@ PARTITION BY LIST COLUMNS(col1) ( } func TestIssue27017(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() @@ -992,7 +1006,6 @@ PARTITION BY LIST COLUMNS(col1) ( } func TestIssue27544(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() @@ -1010,7 +1023,6 @@ func TestIssue27544(t *testing.T) { } func TestIssue27012(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() @@ -1041,7 +1053,6 @@ PARTITION BY LIST COLUMNS(col1) ( } func TestIssue27030(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() @@ -1064,7 +1075,6 @@ PARTITION BY LIST COLUMNS(col1) ( } func TestIssue27070(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() @@ -1076,7 +1086,6 @@ func TestIssue27070(t *testing.T) { } func TestIssue27031(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() @@ -1095,7 +1104,6 @@ PARTITION BY LIST COLUMNS(col1) ( } func TestIssue27493(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() @@ -1123,3 +1131,21 @@ func genListPartition(begin, end int) string { buf.WriteString(fmt.Sprintf("%v)", end-1)) return buf.String() } + +func TestIssue27532(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("create database issue_27532") + defer tk.MustExec(`drop database issue_27532`) + tk.MustExec("use issue_27532") + tk.MustExec(`set tidb_enable_list_partition = 1`) + tk.MustExec(`create table t2 (c1 int primary key, c2 int, c3 int, c4 int, key k2 (c2), key k3 (c3)) partition by hash(c1) partitions 10`) + tk.MustExec(`insert into t2 values (1,1,1,1),(2,2,2,2),(3,3,3,3),(4,4,4,4)`) + tk.MustExec(`set @@tidb_partition_prune_mode="dynamic"`) + tk.MustExec(`set autocommit = 0`) + tk.MustQuery(`select * from t2`).Sort().Check(testkit.Rows("1 1 1 1", "2 2 2 2", "3 3 3 3", "4 4 4 4")) + tk.MustQuery(`select * from t2`).Sort().Check(testkit.Rows("1 1 1 1", "2 2 2 2", "3 3 3 3", "4 4 4 4")) + tk.MustExec(`drop table t2`) +} diff --git a/planner/core/integration_test.go b/planner/core/integration_test.go index 02860e7c8c84c..c3e09b82c2409 100644 --- a/planner/core/integration_test.go +++ b/planner/core/integration_test.go @@ -235,6 +235,28 @@ func (s *testIntegrationSuite) TestIssue24571(c *C) { tk.MustExec("update (select 1 as a) as t, test.t set test.t.a=1;") } +func (s *testIntegrationSuite) TestBuildUpdateListResolver(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + + // For issue https://github.com/pingcap/tidb/issues/24567 + tk.MustExec("drop table if exists t") + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t(a int)") + tk.MustExec("create table t1(b int)") + tk.MustGetErrCode("update (select 1 as a) as t set a=1", mysql.ErrNonUpdatableTable) + tk.MustGetErrCode("update (select 1 as a) as t, t1 set a=1", mysql.ErrNonUpdatableTable) + tk.MustExec("drop table if exists t") + tk.MustExec("drop table if exists t1") + + // For issue https://github.com/pingcap/tidb/issues/30031 + tk.MustExec("create table t(a int default -1, c int as (a+10) stored)") + tk.MustExec("insert into t(a) values(1)") + tk.MustExec("update test.t, (select 1 as b) as t set test.t.a=default") + tk.MustQuery("select * from t").Check(testkit.Rows("-1 9")) + tk.MustExec("drop table if exists t") +} + func (s *testIntegrationSuite) TestIssue22828(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") @@ -363,7 +385,7 @@ func (s *testIntegrationSerialSuite) TestNoneAccessPathsFoundByIsolationRead(c * _, err := tk.Exec("select * from t") c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[planner:1815]Internal : Can not find access path matching 'tidb_isolation_read_engines'(value: 'tiflash'). Available values are 'tikv'.") + c.Assert(err.Error(), Equals, "[planner:1815]Internal : No access path for table 't' is found with 'tidb_isolation_read_engines' = 'tiflash', valid values can be 'tikv'. Please check tiflash replica or ensure the query is readonly.") tk.MustExec("set @@session.tidb_isolation_read_engines = 'tiflash, tikv'") tk.MustExec("select * from t") @@ -2238,17 +2260,17 @@ func (s *testIntegrationSerialSuite) TestNotReadOnlySQLOnTiFlash(c *C) { } err := tk.ExecToErr("select * from t for update") c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, `[planner:1815]Internal : Can not find access path matching 'tidb_isolation_read_engines'(value: 'tiflash'). Available values are 'tiflash, tikv'.`) + c.Assert(err.Error(), Equals, `[planner:1815]Internal : No access path for table 't' is found with 'tidb_isolation_read_engines' = 'tiflash', valid values can be 'tiflash, tikv'. Please check tiflash replica or ensure the query is readonly.`) err = tk.ExecToErr("insert into t select * from t") c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, `[planner:1815]Internal : Can not find access path matching 'tidb_isolation_read_engines'(value: 'tiflash'). Available values are 'tiflash, tikv'.`) + c.Assert(err.Error(), Equals, `[planner:1815]Internal : No access path for table 't' is found with 'tidb_isolation_read_engines' = 'tiflash', valid values can be 'tiflash, tikv'. Please check tiflash replica or ensure the query is readonly.`) tk.MustExec("prepare stmt_insert from 'insert into t select * from t where t.a = ?'") tk.MustExec("set @a=1") err = tk.ExecToErr("execute stmt_insert using @a") c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, `[planner:1815]Internal : Can not find access path matching 'tidb_isolation_read_engines'(value: 'tiflash'). Available values are 'tiflash, tikv'.`) + c.Assert(err.Error(), Equals, `[planner:1815]Internal : No access path for table 't' is found with 'tidb_isolation_read_engines' = 'tiflash', valid values can be 'tiflash, tikv'. Please check tiflash replica or ensure the query is readonly.`) } func (s *testIntegrationSuite) TestSelectLimit(c *C) { @@ -3289,7 +3311,7 @@ func (s *testIntegrationSuite) TestCreateViewIsolationRead(c *C) { tk.MustExec("set session tidb_isolation_read_engines='tiflash,tidb';") // No error for CreateView. tk.MustExec("create view v0 (a, avg_b) as select a, avg(b) from t group by a;") - tk.MustGetErrMsg("select * from v0;", "[planner:1815]Internal : Can not find access path matching 'tidb_isolation_read_engines'(value: 'tiflash,tidb'). Available values are 'tikv'.") + tk.MustGetErrMsg("select * from v0;", "[planner:1815]Internal : No access path for table 't' is found with 'tidb_isolation_read_engines' = 'tiflash,tidb', valid values can be 'tikv'.") tk.MustExec("set session tidb_isolation_read_engines='tikv,tiflash,tidb';") tk.MustQuery("select * from v0;").Check(testkit.Rows()) } @@ -3997,9 +4019,10 @@ func (s *testIntegrationSuite) TestIncrementalAnalyzeStatsVer2(c *C) { c.Assert(rows[0][0], Equals, "3") tk.MustExec("insert into t values(4,4),(5,5),(6,6)") tk.MustExec("analyze incremental table t index idx_b") - c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 2) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 3) c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings()[0].Err.Error(), Equals, "The version 2 would collect all statistics not only the selected indexes") c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings()[1].Err.Error(), Equals, "The version 2 stats would ignore the INCREMENTAL keyword and do full sampling") + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings()[2].Err.Error(), Equals, "Analyze use auto adjusted sample rate 1.000000 for table test.t.") rows = tk.MustQuery(fmt.Sprintf("select distinct_count from mysql.stats_histograms where table_id = %d and is_index = 1", tblID)).Rows() c.Assert(len(rows), Equals, 1) c.Assert(rows[0][0], Equals, "6") @@ -4310,6 +4333,62 @@ func (s *testIntegrationSuite) TestCreateViewWithWindowFunc(c *C) { rows.Check(testkit.Rows("1 1")) } +func (s *testIntegrationSuite) TestIssue29834(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists IDT_MC21814;") + tk.MustExec("CREATE TABLE `IDT_MC21814` (`COL1` year(4) DEFAULT NULL,`COL2` year(4) DEFAULT NULL,KEY `U_M_COL` (`COL1`,`COL2`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;") + tk.MustExec("insert into IDT_MC21814 values(1901, 2119), (2155, 2000);") + tk.MustQuery("SELECT/*+ INL_JOIN(t1, t2), nth_plan(1) */ t2.* FROM IDT_MC21814 t1 LEFT JOIN IDT_MC21814 t2 ON t1.col1 = t2.col1 WHERE t2.col2 BETWEEN 2593 AND 1971 AND t1.col1 IN (2155, 1901, 1967);").Check(testkit.Rows()) + tk.MustQuery("SELECT/*+ INL_JOIN(t1, t2), nth_plan(2) */ t2.* FROM IDT_MC21814 t1 LEFT JOIN IDT_MC21814 t2 ON t1.col1 = t2.col1 WHERE t2.col2 BETWEEN 2593 AND 1971 AND t1.col1 IN (2155, 1901, 1967);").Check(testkit.Rows()) + // Only can generate one index join plan. Because the index join inner child can not be tableDual. + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1105 The parameter of nth_plan() is out of range.")) +} + +func (s *testIntegrationSuite) TestIssue29221(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("set tidb_enable_index_merge=on;") + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a int, b int, index idx_a(a), index idx_b(b));") + tk.MustExec("set @@session.sql_select_limit=3;") + tk.MustQuery("explain format = 'brief' select * from t where a = 1 or b = 1;").Check(testkit.Rows( + "Limit 3.00 root offset:0, count:3", + "└─IndexMerge 3.00 root ", + " ├─IndexRangeScan(Build) 1.50 cop[tikv] table:t, index:idx_a(a) range:[1,1], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 1.50 cop[tikv] table:t, index:idx_b(b) range:[1,1], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 3.00 cop[tikv] table:t keep order:false, stats:pseudo")) + tk.MustQuery("explain format = 'brief' select /*+ use_index_merge(t) */ * from t where a = 1 or b = 1;").Check(testkit.Rows( + "Limit 3.00 root offset:0, count:3", + "└─IndexMerge 3.00 root ", + " ├─IndexRangeScan(Build) 1.50 cop[tikv] table:t, index:idx_a(a) range:[1,1], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 1.50 cop[tikv] table:t, index:idx_b(b) range:[1,1], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 3.00 cop[tikv] table:t keep order:false, stats:pseudo")) + tk.MustExec("set @@session.sql_select_limit=18446744073709551615;") + tk.MustQuery("explain format = 'brief' select * from t where a = 1 or b = 1;").Check(testkit.Rows( + "IndexMerge 19.99 root ", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx_a(a) range:[1,1], keep order:false, stats:pseudo", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx_b(b) range:[1,1], keep order:false, stats:pseudo", + "└─TableRowIDScan(Probe) 19.99 cop[tikv] table:t keep order:false, stats:pseudo")) + tk.MustQuery("explain format = 'brief' select * from t where a = 1 or b = 1 limit 3;").Check(testkit.Rows( + "Limit 3.00 root offset:0, count:3", + "└─IndexMerge 3.00 root ", + " ├─IndexRangeScan(Build) 1.50 cop[tikv] table:t, index:idx_a(a) range:[1,1], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 1.50 cop[tikv] table:t, index:idx_b(b) range:[1,1], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 3.00 cop[tikv] table:t keep order:false, stats:pseudo")) + tk.MustQuery("explain format = 'brief' select /*+ use_index_merge(t) */ * from t where a = 1 or b = 1;").Check(testkit.Rows( + "IndexMerge 19.99 root ", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx_a(a) range:[1,1], keep order:false, stats:pseudo", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx_b(b) range:[1,1], keep order:false, stats:pseudo", + "└─TableRowIDScan(Probe) 19.99 cop[tikv] table:t keep order:false, stats:pseudo")) + tk.MustQuery("explain format = 'brief' select /*+ use_index_merge(t) */ * from t where a = 1 or b = 1 limit 3;").Check(testkit.Rows( + "Limit 3.00 root offset:0, count:3", + "└─IndexMerge 3.00 root ", + " ├─IndexRangeScan(Build) 1.50 cop[tikv] table:t, index:idx_a(a) range:[1,1], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 1.50 cop[tikv] table:t, index:idx_b(b) range:[1,1], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 3.00 cop[tikv] table:t keep order:false, stats:pseudo")) +} + func (s *testIntegrationSerialSuite) TestLimitPushDown(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") @@ -4352,6 +4431,24 @@ func (s *testIntegrationSuite) TestIssue26559(c *C) { tk.MustQuery("select greatest(a, b) from t union select null;").Sort().Check(testkit.Rows("2020-07-29 09:07:01", "<nil>")) } +func (s *testIntegrationSuite) TestIssue29503(c *C) { + tk := testkit.NewTestKit(c, s.store) + defer config.RestoreFunc()() + config.UpdateGlobal(func(conf *config.Config) { + conf.Status.RecordQPSbyDB = true + }) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a int);") + err := tk.ExecToErr("create binding for select 1 using select 1;") + c.Assert(err, Equals, nil) + err = tk.ExecToErr("create binding for select a from t using select a from t;") + c.Assert(err, Equals, nil) + res := tk.MustQuery("show session bindings;") + c.Assert(len(res.Rows()), Equals, 2) +} + func (s *testIntegrationSuite) TestHeuristicIndexSelection(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") @@ -4507,10 +4604,48 @@ func (s *testIntegrationSuite) TestIssue27242(c *C) { tk.MustExec("use test") tk.MustExec("drop table if exists UK_MU16407") tk.MustExec("CREATE TABLE UK_MU16407 (COL3 timestamp NULL DEFAULT NULL, UNIQUE KEY U3(COL3));") + defer tk.MustExec("DROP TABLE UK_MU16407") tk.MustExec(`insert into UK_MU16407 values("1985-08-31 18:03:27");`) - err := tk.ExecToErr(`SELECT COL3 FROM UK_MU16407 WHERE COL3>_utf8mb4'2039-1-19 3:14:40';`) - c.Assert(err, NotNil) - c.Assert(err.Error(), Matches, ".*Incorrect timestamp value.*") + tk.MustExec(`SELECT COL3 FROM UK_MU16407 WHERE COL3>_utf8mb4'2039-1-19 3:14:40';`) +} + +func verifyTimestampOutOfRange(tk *testkit.TestKit) { + tk.MustQuery(`select * from t28424 where t != "2038-1-19 3:14:08"`).Sort().Check(testkit.Rows("1970-01-01 00:00:01]\n[2038-01-19 03:14:07")) + tk.MustQuery(`select * from t28424 where t < "2038-1-19 3:14:08"`).Sort().Check(testkit.Rows("1970-01-01 00:00:01]\n[2038-01-19 03:14:07")) + tk.MustQuery(`select * from t28424 where t <= "2038-1-19 3:14:08"`).Sort().Check(testkit.Rows("1970-01-01 00:00:01]\n[2038-01-19 03:14:07")) + tk.MustQuery(`select * from t28424 where t >= "2038-1-19 3:14:08"`).Check(testkit.Rows()) + tk.MustQuery(`select * from t28424 where t > "2038-1-19 3:14:08"`).Check(testkit.Rows()) + tk.MustQuery(`select * from t28424 where t != "1970-1-1 0:0:0"`).Sort().Check(testkit.Rows("1970-01-01 00:00:01]\n[2038-01-19 03:14:07")) + tk.MustQuery(`select * from t28424 where t < "1970-1-1 0:0:0"`).Check(testkit.Rows()) + tk.MustQuery(`select * from t28424 where t <= "1970-1-1 0:0:0"`).Check(testkit.Rows()) + tk.MustQuery(`select * from t28424 where t >= "1970-1-1 0:0:0"`).Sort().Check(testkit.Rows("1970-01-01 00:00:01]\n[2038-01-19 03:14:07")) + tk.MustQuery(`select * from t28424 where t > "1970-1-1 0:0:0"`).Sort().Check(testkit.Rows("1970-01-01 00:00:01]\n[2038-01-19 03:14:07")) +} + +func (s *testIntegrationSuite) TestIssue28424(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t28424, dt28242") + + tk.MustExec(`set time_zone='+00:00'`) + tk.MustExec(`drop table if exists t28424,dt28424`) + tk.MustExec(`create table t28424 (t timestamp)`) + defer tk.MustExec("DROP TABLE t28424") + tk.MustExec(`insert into t28424 values ("2038-01-19 03:14:07"), ("1970-01-01 00:00:01")`) + + verifyTimestampOutOfRange(tk) + tk.MustExec(`alter table t28424 add unique index (t)`) + verifyTimestampOutOfRange(tk) + tk.MustExec(`create table dt28424 (dt datetime)`) + defer tk.MustExec("DROP TABLE dt28424") + tk.MustExec(`insert into dt28424 values ("2038-01-19 03:14:07"), ("1970-01-01 00:00:01")`) + tk.MustExec(`insert into dt28424 values ("1969-12-31 23:59:59"), ("1970-01-01 00:00:00"), ("2038-03-19 03:14:08")`) + tk.MustQuery(`select * from t28424 right join dt28424 on t28424.t = dt28424.dt`).Sort().Check(testkit.Rows( + "1970-01-01 00:00:01 1970-01-01 00:00:01]\n" + + "[2038-01-19 03:14:07 2038-01-19 03:14:07]\n" + + "[<nil> 1969-12-31 23:59:59]\n" + + "[<nil> 1970-01-01 00:00:00]\n" + + "[<nil> 2038-03-19 03:14:08")) } func (s *testIntegrationSerialSuite) TestTemporaryTableForCte(c *C) { @@ -4579,8 +4714,9 @@ func (s *testIntegrationSerialSuite) TestPushDownGroupConcatToTiFlash(c *C) { var input []string var output []struct { - SQL string - Plan []string + SQL string + Plan []string + Warning []string } s.testData.GetTestCases(c, &input, &output) for i, tt := range input { @@ -4590,11 +4726,37 @@ func (s *testIntegrationSerialSuite) TestPushDownGroupConcatToTiFlash(c *C) { }) res := tk.MustQuery(tt) res.Check(testkit.Rows(output[i].Plan...)) + + comment := Commentf("case:%v sql:%s", i, tt) + warnings := tk.Se.GetSessionVars().StmtCtx.GetWarnings() + s.testData.OnRecord(func() { + if len(warnings) > 0 { + output[i].Warning = make([]string, len(warnings)) + for j, warning := range warnings { + output[i].Warning[j] = warning.Err.Error() + } + } + }) + if len(output[i].Warning) == 0 { + c.Assert(len(warnings), Equals, 0, comment) + } else { + c.Assert(len(warnings), Equals, len(output[i].Warning), comment) + for j, warning := range warnings { + c.Assert(warning.Level, Equals, stmtctx.WarnLevelWarning, comment) + c.Assert(warning.Err.Error(), Equals, output[i].Warning[j], comment) + } + } } } func (s *testIntegrationSuite) TestIssue27797(c *C) { tk := testkit.NewTestKit(c, s.store) + origin := tk.MustQuery("SELECT @@session.tidb_partition_prune_mode") + originStr := origin.Rows()[0][0].(string) + defer func() { + tk.MustExec("set @@session.tidb_partition_prune_mode = '" + originStr + "'") + }() + tk.MustExec("set @@session.tidb_partition_prune_mode = 'static'") tk.MustExec("use test") tk.MustExec("drop table if exists t27797") tk.MustExec("create table t27797(a int, b int, c int, d int) " + @@ -4623,6 +4785,35 @@ func (s *testIntegrationSuite) TestIssue27797(c *C) { result.Check(testkit.Rows("<nil>")) } +func (s *testIntegrationSuite) TestIssue27949(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t27949") + tk.MustExec("create table t27949 (a int, b int, key(b))") + tk.MustQuery("explain format = 'brief' select * from t27949 where b=1").Check(testkit.Rows("IndexLookUp 10.00 root ", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t27949, index:b(b) range:[1,1], keep order:false, stats:pseudo", + "└─TableRowIDScan(Probe) 10.00 cop[tikv] table:t27949 keep order:false, stats:pseudo")) + tk.MustExec("create global binding for select * from t27949 where b=1 using select * from t27949 ignore index(b) where b=1") + tk.MustQuery("explain format = 'brief' select * from t27949 where b=1").Check(testkit.Rows("TableReader 10.00 root data:Selection", + "└─Selection 10.00 cop[tikv] eq(test.t27949.b, 1)", + " └─TableFullScan 10000.00 cop[tikv] table:t27949 keep order:false, stats:pseudo")) + tk.MustExec("set @@sql_select_limit=100") + tk.MustQuery("explain format = 'brief' select * from t27949 where b=1").Check(testkit.Rows("Limit 10.00 root offset:0, count:100", + "└─TableReader 10.00 root data:Limit", + " └─Limit 10.00 cop[tikv] offset:0, count:100", + " └─Selection 10.00 cop[tikv] eq(test.t27949.b, 1)", + " └─TableFullScan 10000.00 cop[tikv] table:t27949 keep order:false, stats:pseudo")) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, index idx_a(a));") + tk.MustExec("create binding for select * from t using select * from t use index(idx_a);") + tk.MustExec("select * from t;") + tk.MustQuery("select @@last_plan_from_binding;").Check(testkit.Rows("1")) + tk.MustExec("prepare stmt from 'select * from t';") + tk.MustExec("execute stmt;") + tk.MustQuery("select @@last_plan_from_binding;").Check(testkit.Rows("1")) +} + func (s *testIntegrationSuite) TestIssue28154(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") @@ -4648,3 +4839,184 @@ func (s *testIntegrationSuite) TestIssue28154(c *C) { result = tk.MustQuery("select * from t") result.Check(testkit.Rows("abc")) } + +func (s *testIntegrationSerialSuite) TestRejectSortForMPP(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (id int, value decimal(6,3), name char(128))") + tk.MustExec("analyze table t") + + // Create virtual tiflash replica info. + dom := domain.GetDomain(tk.Se) + is := dom.InfoSchema() + db, exists := is.SchemaByName(model.NewCIStr("test")) + c.Assert(exists, IsTrue) + for _, tblInfo := range db.Tables { + if tblInfo.Name.L == "t" { + tblInfo.TiFlashReplica = &model.TiFlashReplicaInfo{ + Count: 1, + Available: true, + } + } + } + + tk.MustExec("set @@tidb_allow_mpp=1; set @@tidb_opt_broadcast_join=0; set @@tidb_enforce_mpp=1;") + + var input []string + var output []struct { + SQL string + Plan []string + } + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + }) + res := tk.MustQuery(tt) + res.Check(testkit.Rows(output[i].Plan...)) + } +} + +func (s *testIntegrationSerialSuite) TestRegardNULLAsPoint(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + + tk.MustExec("drop table if exists tpk") + tk.MustExec(`create table tuk (a int, b int, c int, unique key (a, b, c))`) + tk.MustExec(`create table tik (a int, b int, c int, key (a, b, c))`) + for _, va := range []string{"NULL", "1"} { + for _, vb := range []string{"NULL", "1"} { + for _, vc := range []string{"NULL", "1"} { + tk.MustExec(fmt.Sprintf(`insert into tuk values (%v, %v, %v)`, va, vb, vc)) + tk.MustExec(fmt.Sprintf(`insert into tik values (%v, %v, %v)`, va, vb, vc)) + if va == "1" && vb == "1" && vc == "1" { + continue + } + // duplicated NULL rows + tk.MustExec(fmt.Sprintf(`insert into tuk values (%v, %v, %v)`, va, vb, vc)) + tk.MustExec(fmt.Sprintf(`insert into tik values (%v, %v, %v)`, va, vb, vc)) + } + } + } + + var input []string + var output []struct { + SQL string + PlanEnabled []string + PlanDisabled []string + Result []string + } + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i].SQL = tt + tk.MustExec(`set @@session.tidb_regard_null_as_point=true`) + output[i].PlanEnabled = s.testData.ConvertRowsToStrings(tk.MustQuery("explain " + tt).Rows()) + output[i].Result = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + + tk.MustExec(`set @@session.tidb_regard_null_as_point=false`) + output[i].PlanDisabled = s.testData.ConvertRowsToStrings(tk.MustQuery("explain " + tt).Rows()) + }) + tk.MustExec(`set @@session.tidb_regard_null_as_point=true`) + tk.MustQuery("explain " + tt).Check(testkit.Rows(output[i].PlanEnabled...)) + tk.MustQuery(tt).Check(testkit.Rows(output[i].Result...)) + + tk.MustExec(`set @@session.tidb_regard_null_as_point=false`) + tk.MustQuery("explain " + tt).Check(testkit.Rows(output[i].PlanDisabled...)) + tk.MustQuery(tt).Check(testkit.Rows(output[i].Result...)) + } +} + +func (s *testIntegrationSuite) TestIssues29711(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + + tk.MustExec("drop table if exists tbl_29711") + tk.MustExec("CREATE TABLE `tbl_29711` (" + + "`col_250` text COLLATE utf8_unicode_ci NOT NULL," + + "`col_251` enum('Alice','Bob','Charlie','David') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'Charlie'," + + "PRIMARY KEY (`col_251`,`col_250`(1)) NONCLUSTERED);") + tk.MustQuery("explain format=brief " + + "select col_250,col_251 from tbl_29711 where col_251 between 'Bob' and 'David' order by col_250,col_251 limit 6;"). + Check(testkit.Rows( + "TopN 6.00 root test.tbl_29711.col_250, test.tbl_29711.col_251, offset:0, count:6", + "└─IndexLookUp 6.00 root ", + " ├─IndexRangeScan(Build) 30.00 cop[tikv] table:tbl_29711, index:PRIMARY(col_251, col_250) range:[\"Bob\",\"Bob\"], [\"Charlie\",\"Charlie\"], [\"David\",\"David\"], keep order:false, stats:pseudo", + " └─TopN(Probe) 6.00 cop[tikv] test.tbl_29711.col_250, test.tbl_29711.col_251, offset:0, count:6", + " └─TableRowIDScan 30.00 cop[tikv] table:tbl_29711 keep order:false, stats:pseudo", + )) + + tk.MustExec("drop table if exists t29711") + tk.MustExec("CREATE TABLE `t29711` (" + + "`a` varchar(10) DEFAULT NULL," + + "`b` int(11) DEFAULT NULL," + + "`c` int(11) DEFAULT NULL," + + "KEY `ia` (`a`(2)))") + tk.MustQuery("explain format=brief select * from t29711 use index (ia) order by a limit 10;"). + Check(testkit.Rows( + "TopN 10.00 root test.t29711.a, offset:0, count:10", + "└─IndexLookUp 10.00 root ", + " ├─IndexFullScan(Build) 10000.00 cop[tikv] table:t29711, index:ia(a) keep order:false, stats:pseudo", + " └─TopN(Probe) 10.00 cop[tikv] test.t29711.a, offset:0, count:10", + " └─TableRowIDScan 10000.00 cop[tikv] table:t29711 keep order:false, stats:pseudo", + )) +} + +func (s *testIntegrationSuite) TestIssue27313(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 varchar(100), b int, c int, index idx1(a(2), b), index idx2(a))") + tk.MustExec("explain format = 'verbose' select * from t where a = 'abcdefghijk' and b > 4") + // no warning indicates that idx2 is not pruned by idx1. + tk.MustQuery("show warnings").Check(testkit.Rows()) +} + +func (s *testIntegrationSuite) TestIssue30094(c *C) { + tk := testkit.NewTestKit(c, s.store) + + tk.MustExec("use test") + tk.MustExec(`drop table if exists t30094;`) + tk.MustExec(`create table t30094(a varchar(10));`) + tk.MustQuery(`explain format = 'brief' select * from t30094 where cast(a as float) and cast(a as char);`).Check(testkit.Rows( + "TableReader 8000.00 root data:Selection", + "└─Selection 8000.00 cop[tikv] cast(test.t30094.a, float BINARY), cast(test.t30094.a, var_string(5))", + " └─TableFullScan 10000.00 cop[tikv] table:t30094 keep order:false, stats:pseudo", + )) + tk.MustQuery(`explain format = 'brief' select * from t30094 where concat(a,'1') = _binary 0xe59388e59388e59388 collate binary and concat(a,'1') = _binary 0xe598bfe598bfe598bf collate binary;`).Check(testkit.Rows( + "TableReader 8000.00 root data:Selection", + "└─Selection 8000.00 cop[tikv] eq(to_binary(concat(test.t30094.a, \"1\")), \"0xe59388e59388e59388\"), eq(to_binary(concat(test.t30094.a, \"1\")), \"0xe598bfe598bfe598bf\")", + " └─TableFullScan 10000.00 cop[tikv] table:t30094 keep order:false, stats:pseudo", + )) +} + +func (s *testIntegrationSuite) TestIssue29705(c *C) { + tk := testkit.NewTestKit(c, s.store) + origin := tk.MustQuery("SELECT @@session.tidb_partition_prune_mode") + originStr := origin.Rows()[0][0].(string) + defer func() { + tk.MustExec("set @@session.tidb_partition_prune_mode = '" + originStr + "'") + }() + tk.MustExec("set @@session.tidb_partition_prune_mode = 'static'") + tk.MustExec("use test") + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(id int) partition by hash(id) partitions 4;") + tk.MustExec("insert into t values(1);") + result := tk.MustQuery("SELECT COUNT(1) FROM ( SELECT COUNT(1) FROM t b GROUP BY id) a;") + result.Check(testkit.Rows("1")) +} + +func (s *testIntegrationSerialSuite) TestIssue30271(c *C) { + defer collate.SetNewCollationEnabledForTest(false) + collate.SetNewCollationEnabledForTest(true) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a char(10), b char(10), c char(10), index (a, b, c)) collate utf8mb4_bin;") + tk.MustExec("insert into t values ('b', 'a', '1'), ('b', 'A', '2'), ('c', 'a', '3');") + tk.MustExec("set names utf8mb4 collate utf8mb4_general_ci;") + tk.MustQuery("select * from t where (a>'a' and b='a') or (b = 'A' and a < 'd') order by a,c;").Check(testkit.Rows("b a 1", "b A 2", "c a 3")) + +} diff --git a/planner/core/logical_plan_builder.go b/planner/core/logical_plan_builder.go index 759995d422f97..84149462965e1 100644 --- a/planner/core/logical_plan_builder.go +++ b/planner/core/logical_plan_builder.go @@ -27,6 +27,7 @@ import ( "github.com/cznic/mathutil" "github.com/pingcap/errors" + "github.com/pingcap/log" "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/expression" @@ -276,8 +277,8 @@ func (b *PlanBuilder) buildAggregation(ctx context.Context, p LogicalPlan, aggFu schema4Agg.Append(newCol) names = append(names, p.OutputNames()[i]) } - if join, isJoin := p.(*LogicalJoin); isJoin && join.redundantSchema != nil { - for i, col := range join.redundantSchema.Columns { + if join, isJoin := p.(*LogicalJoin); isJoin && join.fullSchema != nil { + for i, col := range join.fullSchema.Columns { if p.Schema().Contains(col) { continue } @@ -289,7 +290,7 @@ func (b *PlanBuilder) buildAggregation(ctx context.Context, p LogicalPlan, aggFu newCol, _ := col.Clone().(*expression.Column) newCol.RetType = newFunc.RetTp schema4Agg.Append(newCol) - names = append(names, join.redundantNames[i]) + names = append(names, join.fullNames[i]) } } hasGroupBy := len(gbyItems) > 0 @@ -720,25 +721,50 @@ func (b *PlanBuilder) buildJoin(ctx context.Context, joinNode *ast.Join) (Logica joinPlan.JoinType = InnerJoin } - // Merge sub join's redundantSchema into this join plan. When handle query like - // select t2.a from (t1 join t2 using (a)) join t3 using (a); - // we can simply search in the top level join plan to find redundant column. + // Merge sub-plan's fullSchema into this join plan. + // Please read the comment of LogicalJoin.fullSchema for the details. var ( - lRedundantSchema, rRedundantSchema *expression.Schema - lRedundantNames, rRedundantNames types.NameSlice + lFullSchema, rFullSchema *expression.Schema + lFullNames, rFullNames types.NameSlice ) - if left, ok := leftPlan.(*LogicalJoin); ok && left.redundantSchema != nil { - lRedundantSchema = left.redundantSchema - lRedundantNames = left.redundantNames + if left, ok := leftPlan.(*LogicalJoin); ok && left.fullSchema != nil { + lFullSchema = left.fullSchema + lFullNames = left.fullNames + } else { + lFullSchema = leftPlan.Schema() + lFullNames = leftPlan.OutputNames() + } + if right, ok := rightPlan.(*LogicalJoin); ok && right.fullSchema != nil { + rFullSchema = right.fullSchema + rFullNames = right.fullNames + } else { + rFullSchema = rightPlan.Schema() + rFullNames = rightPlan.OutputNames() } - if right, ok := rightPlan.(*LogicalJoin); ok && right.redundantSchema != nil { - rRedundantSchema = right.redundantSchema - rRedundantNames = right.redundantNames + if joinNode.Tp == ast.RightJoin { + // Make sure lFullSchema means outer full schema and rFullSchema means inner full schema. + lFullSchema, rFullSchema = rFullSchema, lFullSchema + lFullNames, rFullNames = rFullNames, lFullNames + } + joinPlan.fullSchema = expression.MergeSchema(lFullSchema, rFullSchema) + + // Clear NotNull flag for the inner side schema if it's an outer join. + if joinNode.Tp == ast.LeftJoin || joinNode.Tp == ast.RightJoin { + resetNotNullFlag(joinPlan.fullSchema, lFullSchema.Len(), joinPlan.fullSchema.Len()) + } + + // Merge sub-plan's fullNames into this join plan, similar to the fullSchema logic above. + joinPlan.fullNames = make([]*types.FieldName, 0, len(lFullNames)+len(rFullNames)) + for _, lName := range lFullNames { + name := *lName + name.Redundant = true + joinPlan.fullNames = append(joinPlan.fullNames, &name) + } + for _, rName := range rFullNames { + name := *rName + name.Redundant = true + joinPlan.fullNames = append(joinPlan.fullNames, &name) } - joinPlan.redundantSchema = expression.MergeSchema(lRedundantSchema, rRedundantSchema) - joinPlan.redundantNames = make([]*types.FieldName, len(lRedundantNames)+len(rRedundantNames)) - copy(joinPlan.redundantNames, lRedundantNames) - copy(joinPlan.redundantNames[len(lRedundantNames):], rRedundantNames) // Set preferred join algorithm if some join hints is specified by user. joinPlan.setPreferredJoinType(b.TableHints()) @@ -941,21 +967,7 @@ func (b *PlanBuilder) coalesceCommonColumns(p *LogicalJoin, leftPlan, rightPlan p.SetSchema(expression.NewSchema(schemaCols...)) p.names = names - // We record the full `rightPlan.Schema` as `redundantSchema` in order to - // record the redundant column in `rightPlan` and the output columns order - // of the `rightPlan`. - // For SQL like `select t1.*, t2.* from t1 left join t2 using(a)`, we can - // retrieve the column order of `t2.*` from the `redundantSchema`. - p.redundantSchema = expression.MergeSchema(p.redundantSchema, expression.NewSchema(rightPlan.Schema().Clone().Columns...)) - p.redundantNames = p.redundantNames.Shallow() - for _, name := range rightPlan.OutputNames() { - cpyName := *name - cpyName.Redundant = true - p.redundantNames = append(p.redundantNames, &cpyName) - } - if joinTp == ast.RightJoin || joinTp == ast.LeftJoin { - resetNotNullFlag(p.redundantSchema, 0, p.redundantSchema.Len()) - } + p.OtherConditions = append(conds, p.OtherConditions...) return nil @@ -1208,9 +1220,9 @@ func findColFromNaturalUsingJoin(p LogicalPlan, col *expression.Column) (name *t case *LogicalLimit, *LogicalSelection, *LogicalTopN, *LogicalSort, *LogicalMaxOneRow: return findColFromNaturalUsingJoin(p.Children()[0], col) case *LogicalJoin: - if x.redundantSchema != nil { - idx := x.redundantSchema.ColumnIndex(col) - return x.redundantNames[idx] + if x.fullSchema != nil { + idx := x.fullSchema.ColumnIndex(col) + return x.fullNames[idx] } } return nil @@ -1996,9 +2008,9 @@ func (a *havingWindowAndOrderbyExprResolver) resolveFromPlan(v *ast.ColumnNameEx case *LogicalLimit, *LogicalSelection, *LogicalTopN, *LogicalSort, *LogicalMaxOneRow: return a.resolveFromPlan(v, p.Children()[0]) case *LogicalJoin: - if len(x.redundantNames) != 0 { - idx, err = expression.FindFieldName(x.redundantNames, v.Name) - schemaCols, outputNames = x.redundantSchema.Columns, x.redundantNames + if len(x.fullNames) != 0 { + idx, err = expression.FindFieldName(x.fullNames, v.Name) + schemaCols, outputNames = x.fullSchema.Columns, x.fullNames } } if err != nil || idx < 0 { @@ -3146,14 +3158,11 @@ func (b *PlanBuilder) unfoldWildStar(p LogicalPlan, selectFields []*ast.SelectFi return nil, ErrInvalidWildCard } list := unfoldWildStar(field, p.OutputNames(), p.Schema().Columns) - // For sql like `select t1.*, t2.* from t1 join t2 using(a)`, we should - // not coalesce the `t2.a` in the output result. Thus we need to unfold - // the wildstar from the underlying join.redundantSchema. - if isJoin && join.redundantSchema != nil && field.WildCard.Table.L != "" { - redundantList := unfoldWildStar(field, join.redundantNames, join.redundantSchema.Columns) - if len(redundantList) > len(list) { - list = redundantList - } + // For sql like `select t1.*, t2.* from t1 join t2 using(a)` or `select t1.*, t2.* from t1 natual join t2`, + // the schema of the Join doesn't contain enough columns because the join keys are coalesced in this schema. + // We should collect the columns from the fullSchema. + if isJoin && join.fullSchema != nil && field.WildCard.Table.L != "" { + list = unfoldWildStar(field, join.fullNames, join.fullSchema.Columns) } if len(list) == 0 { return nil, ErrBadTable.GenWithStackByArgs(field.WildCard.Table) @@ -3189,7 +3198,8 @@ func unfoldWildStar(field *ast.SelectField, outputName types.NameSlice, column [ return resultList } -func (b *PlanBuilder) addAliasName(ctx context.Context, selectFields []*ast.SelectField, p LogicalPlan) (resultList []*ast.SelectField, err error) { +func (b *PlanBuilder) addAliasName(ctx context.Context, selectStmt *ast.SelectStmt, p LogicalPlan) (resultList []*ast.SelectField, err error) { + selectFields := selectStmt.Fields.Fields projOutNames := make([]*types.FieldName, 0, len(selectFields)) for _, field := range selectFields { colNameField, isColumnNameExpr := field.Expr.(*ast.ColumnNameExpr) @@ -3216,13 +3226,49 @@ func (b *PlanBuilder) addAliasName(ctx context.Context, selectFields []*ast.Sele } } + // dedupMap is used for renaming a duplicated anonymous column + dedupMap := make(map[string]int) + anonymousFields := make([]bool, len(selectFields)) + for i, field := range selectFields { newField := *field if newField.AsName.L == "" { newField.AsName = projOutNames[i].ColName } + + if _, ok := field.Expr.(*ast.ColumnNameExpr); !ok && field.AsName.L == "" { + anonymousFields[i] = true + } else { + anonymousFields[i] = false + // dedupMap should be inited with all non-anonymous fields before renaming other duplicated anonymous fields + dedupMap[newField.AsName.L] = 0 + } + resultList = append(resultList, &newField) } + + // We should rename duplicated anonymous fields in the first SelectStmt of CreateViewStmt + // See: https://github.com/pingcap/tidb/issues/29326 + if selectStmt.AsViewSchema { + for i, field := range resultList { + if !anonymousFields[i] { + continue + } + + oldName := field.AsName + if dup, ok := dedupMap[field.AsName.L]; ok { + if dup == 0 { + field.AsName = model.NewCIStr(fmt.Sprintf("Name_exp_%s", field.AsName.O)) + } else { + field.AsName = model.NewCIStr(fmt.Sprintf("Name_exp_%d_%s", dup, field.AsName.O)) + } + dedupMap[oldName.L] = dup + 1 + } else { + dedupMap[oldName.L] = 0 + } + } + } + return resultList, nil } @@ -3516,7 +3562,7 @@ func (b *PlanBuilder) buildSelect(ctx context.Context, sel *ast.SelectStmt) (p L } if b.capFlag&canExpandAST != 0 { // To be compabitle with MySQL, we add alias name for each select field when creating view. - sel.Fields.Fields, err = b.addAliasName(ctx, sel.Fields.Fields, p) + sel.Fields.Fields, err = b.addAliasName(ctx, sel, p) if err != nil { return nil, err } @@ -3793,11 +3839,13 @@ func getStatsTable(ctx sessionctx.Context, tblInfo *model.TableInfo, pid int64) } // 3. statistics is outdated. - if statsTbl.IsOutdated() { - tbl := *statsTbl - tbl.Pseudo = true - statsTbl = &tbl - pseudoEstimationOutdate.Inc() + if ctx.GetSessionVars().GetEnablePseudoForOutdatedStats() { + if statsTbl.IsOutdated() { + tbl := *statsTbl + tbl.Pseudo = true + statsTbl = &tbl + pseudoEstimationOutdate.Inc() + } } return statsTbl } @@ -3823,7 +3871,7 @@ func (b *PlanBuilder) tryBuildCTE(ctx context.Context, tn *ast.TableName, asName } cte.recursiveRef = true - p := LogicalCTETable{name: cte.def.Name.String(), idForStorage: cte.storageID, seedStat: cte.seedStat}.Init(b.ctx, b.getSelectOffset()) + p := LogicalCTETable{name: cte.def.Name.String(), idForStorage: cte.storageID, seedStat: cte.seedStat, seedSchema: cte.seedLP.Schema()}.Init(b.ctx, b.getSelectOffset()) p.SetSchema(getResultCTESchema(cte.seedLP.Schema(), b.ctx.GetSessionVars())) p.SetOutputNames(cte.seedLP.OutputNames()) return p, nil @@ -3968,7 +4016,7 @@ func (b *PlanBuilder) buildDataSource(ctx context.Context, tn *ast.TableName, as } // Skip storage engine check for CreateView. if b.capFlag&canExpandAST == 0 { - possiblePaths, err = filterPathByIsolationRead(b.ctx, possiblePaths, dbName) + possiblePaths, err = filterPathByIsolationRead(b.ctx, possiblePaths, tblName, dbName) if err != nil { return nil, err } @@ -4004,11 +4052,6 @@ func (b *PlanBuilder) buildDataSource(ctx context.Context, tn *ast.TableName, as } else { columns = tbl.Cols() } - var statisticTable *statistics.Table - if _, ok := tbl.(table.PartitionedTable); !ok || b.ctx.GetSessionVars().UseDynamicPartitionPrune() { - statisticTable = getStatsTable(b.ctx, tbl.Meta(), tbl.Meta().ID) - } - // extract the IndexMergeHint var indexMergeHints []indexHintInfo if hints := b.TableHints(); hints != nil { @@ -4053,7 +4096,7 @@ func (b *PlanBuilder) buildDataSource(ctx context.Context, tn *ast.TableName, as TableAsName: asName, table: tbl, tableInfo: tableInfo, - statisticTable: statisticTable, + physicalTableID: tableInfo.ID, astIndexHints: tn.IndexHints, IndexHints: b.TableHints().indexHintList, indexMergeHints: indexMergeHints, @@ -4140,6 +4183,38 @@ func (b *PlanBuilder) buildDataSource(ctx context.Context, tn *ast.TableName, as us.SetChildren(ds) result = us } + // If a table is a cache table, it is judged whether it satisfies the conditions of read cache. + if tableInfo.TableCacheStatusType == model.TableCacheStatusEnable && b.ctx.GetSessionVars().SnapshotTS == 0 && !b.ctx.GetSessionVars().StmtCtx.IsStaleness { + cachedTable := tbl.(table.CachedTable) + txn, err := b.ctx.Txn(true) + if err != nil { + return nil, err + } + // Use the TS of the transaction to determine whether the cache can be used. + cacheData := cachedTable.TryReadFromCache(txn.StartTS()) + if cacheData != nil { + sessionVars.StmtCtx.ReadFromTableCache = true + us := LogicalUnionScan{handleCols: handleCols, cacheTable: cacheData}.Init(b.ctx, b.getSelectOffset()) + us.SetChildren(ds) + result = us + } else { + if !b.inUpdateStmt && !b.inDeleteStmt && !sessionVars.StmtCtx.InExplainStmt { + startTS := txn.StartTS() + store := b.ctx.GetStore() + go func() { + defer func() { + if r := recover(); r != nil { + } + }() + err := cachedTable.UpdateLockForRead(ctx, store, startTS) + if err != nil { + log.Warn("Update Lock Info Error") + } + }() + } + } + } + if sessionVars.StmtCtx.TblInfo2UnionScan == nil { sessionVars.StmtCtx.TblInfo2UnionScan = make(map[*model.TableInfo]bool) } @@ -4653,13 +4728,9 @@ func (b *PlanBuilder) buildUpdate(ctx context.Context, update *ast.UpdateStmt) ( proj.SetChildren(p) p = proj - // update subquery table should be forbidden - var notUpdatableTbl []string - notUpdatableTbl = extractTableSourceAsNames(update.TableRefs.TableRefs, notUpdatableTbl, true) - - var updateTableList []*ast.TableName - updateTableList = extractTableList(update.TableRefs.TableRefs, updateTableList, true) - orderedList, np, allAssignmentsAreConstant, err := b.buildUpdateLists(ctx, updateTableList, update.List, p, notUpdatableTbl) + utlr := &updatableTableListResolver{} + update.Accept(utlr) + orderedList, np, allAssignmentsAreConstant, err := b.buildUpdateLists(ctx, utlr.updatableTableList, update.List, p) if err != nil { return nil, err } @@ -4742,8 +4813,7 @@ func isCTE(tl *ast.TableName) bool { return tl.TableInfo == nil } -func (b *PlanBuilder) buildUpdateLists(ctx context.Context, tableList []*ast.TableName, list []*ast.Assignment, p LogicalPlan, - notUpdatableTbl []string) (newList []*expression.Assignment, po LogicalPlan, allAssignmentsAreConstant bool, e error) { +func (b *PlanBuilder) buildUpdateLists(ctx context.Context, tableList []*ast.TableName, list []*ast.Assignment, p LogicalPlan) (newList []*expression.Assignment, po LogicalPlan, allAssignmentsAreConstant bool, e error) { b.curClause = fieldList // modifyColumns indicates which columns are in set list, // and if it is set to `DEFAULT` @@ -4766,21 +4836,22 @@ func (b *PlanBuilder) buildUpdateLists(ctx context.Context, tableList []*ast.Tab columnsIdx[assign.Column] = idx } name := p.OutputNames()[idx] + foundListItem := false for _, tl := range tableList { if (tl.Schema.L == "" || tl.Schema.L == name.DBName.L) && (tl.Name.L == name.TblName.L) { if isCTE(tl) || tl.TableInfo.IsView() || tl.TableInfo.IsSequence() { return nil, nil, false, ErrNonUpdatableTable.GenWithStackByArgs(name.TblName.O, "UPDATE") } - // may be a subquery - if tl.Schema.L == "" { - for _, nTbl := range notUpdatableTbl { - if nTbl == name.TblName.L { - return nil, nil, false, ErrNonUpdatableTable.GenWithStackByArgs(name.TblName.O, "UPDATE") - } - } - } + foundListItem = true } } + if !foundListItem { + // For case like: + // 1: update (select * from t1) t1 set b = 1111111 ----- (no updatable table here) + // 2: update (select 1 as a) as t, t1 set a=1 ----- (updatable t1 don't have column a) + // --- subQuery is not counted as updatable table. + return nil, nil, false, ErrNonUpdatableTable.GenWithStackByArgs(name.TblName.O, "UPDATE") + } columnFullName := fmt.Sprintf("%s.%s.%s", name.DBName.L, name.TblName.L, name.ColName.L) // We save a flag for the column in map `modifyColumns` // This flag indicated if assign keyword `DEFAULT` to the column @@ -4795,15 +4866,7 @@ func (b *PlanBuilder) buildUpdateLists(ctx context.Context, tableList []*ast.Tab // And, fill virtualAssignments here; that's for generated columns. virtualAssignments := make([]*ast.Assignment, 0) for _, tn := range tableList { - // Only generate virtual to updatable table, skip not updatable table(i.e. table in update's subQuery) - updatable := true - for _, nTbl := range notUpdatableTbl { - if tn.Name.L == nTbl { - updatable = false - break - } - } - if !updatable || isCTE(tn) || tn.TableInfo.IsView() || tn.TableInfo.IsSequence() { + if isCTE(tn) || tn.TableInfo.IsView() || tn.TableInfo.IsSequence() { continue } @@ -5906,6 +5969,35 @@ func unfoldSelectList(list *ast.SetOprSelectList, unfoldList *ast.SetOprSelectLi } } +type updatableTableListResolver struct { + updatableTableList []*ast.TableName +} + +func (u *updatableTableListResolver) Enter(inNode ast.Node) (ast.Node, bool) { + switch v := inNode.(type) { + case *ast.UpdateStmt, *ast.TableRefsClause, *ast.Join, *ast.TableSource, *ast.TableName: + return v, false + } + return inNode, true +} + +func (u *updatableTableListResolver) Leave(inNode ast.Node) (ast.Node, bool) { + switch v := inNode.(type) { + case *ast.TableSource: + if s, ok := v.Source.(*ast.TableName); ok { + if v.AsName.L != "" { + newTableName := *s + newTableName.Name = v.AsName + newTableName.Schema = model.NewCIStr("") + u.updatableTableList = append(u.updatableTableList, &newTableName) + } else { + u.updatableTableList = append(u.updatableTableList, s) + } + } + } + return inNode, true +} + // extractTableList extracts all the TableNames from node. // If asName is true, extract AsName prior to OrigName. // Privilege check should use OrigName, while expression may use AsName. @@ -5913,7 +6005,9 @@ func unfoldSelectList(list *ast.SetOprSelectList, unfoldList *ast.SetOprSelectLi func extractTableList(node ast.Node, input []*ast.TableName, asName bool) []*ast.TableName { switch x := node.(type) { case *ast.SelectStmt: - input = extractTableList(x.From.TableRefs, input, asName) + if x.From != nil { + input = extractTableList(x.From.TableRefs, input, asName) + } if x.Where != nil { input = extractTableList(x.Where, input, asName) } @@ -6034,28 +6128,6 @@ func collectTableName(node ast.ResultSetNode, updatableName *map[string]bool, in } } -// extractTableSourceAsNames extracts TableSource.AsNames from node. -// if onlySelectStmt is set to be true, only extracts AsNames when TableSource.Source.(type) == *ast.SelectStmt -func extractTableSourceAsNames(node ast.ResultSetNode, input []string, onlySelectStmt bool) []string { - switch x := node.(type) { - case *ast.Join: - input = extractTableSourceAsNames(x.Left, input, onlySelectStmt) - input = extractTableSourceAsNames(x.Right, input, onlySelectStmt) - case *ast.TableSource: - if _, ok := x.Source.(*ast.SelectStmt); !ok && onlySelectStmt { - break - } - if s, ok := x.Source.(*ast.TableName); ok { - if x.AsName.L == "" { - input = append(input, s.Name.L) - break - } - } - input = append(input, x.AsName.L) - } - return input -} - func appendDynamicVisitInfo(vi []visitInfo, priv string, withGrant bool, err error) []visitInfo { return append(vi, visitInfo{ privilege: mysql.ExtendedPriv, diff --git a/planner/core/logical_plan_test.go b/planner/core/logical_plan_test.go index 943185b714a7b..a0bb8a8070726 100644 --- a/planner/core/logical_plan_test.go +++ b/planner/core/logical_plan_test.go @@ -22,6 +22,7 @@ import ( "testing" . "github.com/pingcap/check" + "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/parser" @@ -60,6 +61,7 @@ type testPlanSuite struct { func (s *testPlanSuite) SetUpSuite(c *C) { s.is = infoschema.MockInfoSchema([]*model.TableInfo{MockSignedTable(), MockUnsignedTable(), MockView(), MockNoPKTable()}) s.ctx = MockContext() + domain.GetDomain(s.ctx).MockInfoCacheAndLoadInfoSchema(s.is) s.ctx.GetSessionVars().EnableWindowFunction = true s.Parser = parser.New() s.Parser.SetParserConfig(parser.ParserConfig{EnableWindowFunction: true, EnableStrictDoubleTypeCheck: true}) @@ -93,6 +95,23 @@ func (s *testPlanSuite) TestPredicatePushDown(c *C) { } } +func (s *testPlanSuite) TestEliminateProjectionUnderUnion(c *C) { + defer testleak.AfterTest(c)() + ctx := context.Background() + ca := "Select a from t3 join ( (select 127 as IDD from t3) union all (select 1 as IDD from t3) ) u on t3.b = u.IDD;" + comment := Commentf("for %s", ca) + stmt, err := s.ParseOneStmt(ca, "", "") + c.Assert(err, IsNil, comment) + p, _, err := BuildLogicalPlanForTest(ctx, s.ctx, stmt, s.is) + c.Assert(err, IsNil) + p, err = logicalOptimize(context.TODO(), flagPredicatePushDown|flagJoinReOrder|flagPrunColumns|flagEliminateProjection, p.(LogicalPlan)) + c.Assert(err, IsNil) + // after folding constants, the null flag should keep the same with the old one's (i.e., the schema's). + schemaNullFlag := p.(*LogicalProjection).children[0].(*LogicalJoin).children[1].Children()[1].(*LogicalProjection).schema.Columns[0].RetType.Flag & mysql.NotNullFlag + exprNullFlag := p.(*LogicalProjection).children[0].(*LogicalJoin).children[1].Children()[1].(*LogicalProjection).Exprs[0].GetType().Flag & mysql.NotNullFlag + c.Assert(schemaNullFlag, Equals, exprNullFlag) +} + func (s *testPlanSuite) TestJoinPredicatePushDown(c *C) { defer testleak.AfterTest(c)() var ( @@ -605,6 +624,9 @@ func (s *testPlanSuite) TestProjectionEliminator(c *C) { { sql: "select 1+num from (select 1+a as num from t) t1;", best: "DataScan(t)->Projection", + }, { + sql: "select count(*) from t where a in (select b from t2 where a is null);", + best: "Join{DataScan(t)->Dual->Aggr(firstrow(test.t2.b))}(test.t.a,test.t2.b)->Aggr(count(1))->Projection", }, } @@ -622,6 +644,29 @@ func (s *testPlanSuite) TestProjectionEliminator(c *C) { } } +func (s *testPlanSuite) TestCS3389(c *C) { + defer testleak.AfterTest(c)() + + ctx := context.Background() + stmt, err := s.ParseOneStmt("select count(*) from t where a in (select b from t2 where a is null);", "", "") + c.Assert(err, IsNil) + p, _, err := BuildLogicalPlanForTest(ctx, s.ctx, stmt, s.is) + c.Assert(err, IsNil) + p, err = logicalOptimize(context.TODO(), flagBuildKeyInfo|flagPrunColumns|flagPrunColumnsAgain|flagEliminateProjection|flagJoinReOrder, p.(LogicalPlan)) + c.Assert(err, IsNil) + + // Assert that all Projection is not empty and there is no Projection between Aggregation and Join. + proj, isProj := p.(*LogicalProjection) + c.Assert(isProj, IsTrue) + c.Assert(len(proj.Exprs) > 0, IsTrue) + child := proj.Children()[0] + agg, isAgg := child.(*LogicalAggregation) + c.Assert(isAgg, IsTrue) + child = agg.Children()[0] + _, isJoin := child.(*LogicalJoin) + c.Assert(isJoin, IsTrue) +} + func (s *testPlanSuite) TestAllocID(c *C) { ctx := MockContext() pA := DataSource{}.Init(ctx, 0) @@ -923,7 +968,7 @@ func (s *testPlanSuite) TestAggPrune(c *C) { comment := Commentf("for %s", tt) stmt, err := s.ParseOneStmt(tt, "", "") c.Assert(err, IsNil, comment) - + domain.GetDomain(s.ctx).MockInfoCacheAndLoadInfoSchema(s.is) p, _, err := BuildLogicalPlanForTest(ctx, s.ctx, stmt, s.is) c.Assert(err, IsNil) @@ -1342,8 +1387,9 @@ func (s *testPlanSuite) TestVisitInfo(c *C) { // TODO: to fix, Table 'test.ttt' doesn't exist _ = Preprocess(s.ctx, stmt, WithPreprocessorReturn(&PreprocessorReturn{InfoSchema: s.is})) - - builder, _ := NewPlanBuilder().Init(MockContext(), s.is, &hint.BlockHintProcessor{}) + sctx := MockContext() + builder, _ := NewPlanBuilder().Init(sctx, s.is, &hint.BlockHintProcessor{}) + domain.GetDomain(sctx).MockInfoCacheAndLoadInfoSchema(s.is) builder.ctx.GetSessionVars().SetHashJoinConcurrency(1) _, err = builder.Build(context.TODO(), stmt) c.Assert(err, IsNil, comment) @@ -1424,7 +1470,9 @@ func (s *testPlanSuite) TestUnion(c *C) { c.Assert(err, IsNil, comment) err = Preprocess(s.ctx, stmt, WithPreprocessorReturn(&PreprocessorReturn{InfoSchema: s.is})) c.Assert(err, IsNil) - builder, _ := NewPlanBuilder().Init(MockContext(), s.is, &hint.BlockHintProcessor{}) + sctx := MockContext() + builder, _ := NewPlanBuilder().Init(sctx, s.is, &hint.BlockHintProcessor{}) + domain.GetDomain(sctx).MockInfoCacheAndLoadInfoSchema(s.is) plan, err := builder.Build(ctx, stmt) s.testData.OnRecord(func() { output[i].Err = err != nil @@ -1457,7 +1505,9 @@ func (s *testPlanSuite) TestTopNPushDown(c *C) { c.Assert(err, IsNil, comment) err = Preprocess(s.ctx, stmt, WithPreprocessorReturn(&PreprocessorReturn{InfoSchema: s.is})) c.Assert(err, IsNil) - builder, _ := NewPlanBuilder().Init(MockContext(), s.is, &hint.BlockHintProcessor{}) + sctx := MockContext() + builder, _ := NewPlanBuilder().Init(sctx, s.is, &hint.BlockHintProcessor{}) + domain.GetDomain(sctx).MockInfoCacheAndLoadInfoSchema(s.is) p, err := builder.Build(ctx, stmt) c.Assert(err, IsNil) p, err = logicalOptimize(ctx, builder.optFlag, p.(LogicalPlan)) @@ -1532,7 +1582,9 @@ func (s *testPlanSuite) TestOuterJoinEliminator(c *C) { c.Assert(err, IsNil, comment) err = Preprocess(s.ctx, stmt, WithPreprocessorReturn(&PreprocessorReturn{InfoSchema: s.is})) c.Assert(err, IsNil) - builder, _ := NewPlanBuilder().Init(MockContext(), s.is, &hint.BlockHintProcessor{}) + sctx := MockContext() + builder, _ := NewPlanBuilder().Init(sctx, s.is, &hint.BlockHintProcessor{}) + domain.GetDomain(sctx).MockInfoCacheAndLoadInfoSchema(s.is) p, err := builder.Build(ctx, stmt) c.Assert(err, IsNil) p, err = logicalOptimize(ctx, builder.optFlag, p.(LogicalPlan)) @@ -1651,6 +1703,7 @@ func (s *testPlanSuite) optimize(ctx context.Context, sql string) (PhysicalPlan, } } builder, _ := NewPlanBuilder().Init(sctx, s.is, &hint.BlockHintProcessor{}) + domain.GetDomain(sctx).MockInfoCacheAndLoadInfoSchema(s.is) p, err := builder.Build(ctx, stmt) if err != nil { return nil, nil, err @@ -1749,7 +1802,9 @@ func (s *testPlanSuite) TestSkylinePruning(c *C) { c.Assert(err, IsNil, comment) err = Preprocess(s.ctx, stmt, WithPreprocessorReturn(&PreprocessorReturn{InfoSchema: s.is})) c.Assert(err, IsNil) - builder, _ := NewPlanBuilder().Init(MockContext(), s.is, &hint.BlockHintProcessor{}) + sctx := MockContext() + builder, _ := NewPlanBuilder().Init(sctx, s.is, &hint.BlockHintProcessor{}) + domain.GetDomain(sctx).MockInfoCacheAndLoadInfoSchema(s.is) p, err := builder.Build(ctx, stmt) if err != nil { c.Assert(err.Error(), Equals, tt.result, comment) @@ -1852,7 +1907,9 @@ func (s *testPlanSuite) TestUpdateEQCond(c *C) { c.Assert(err, IsNil, comment) err = Preprocess(s.ctx, stmt, WithPreprocessorReturn(&PreprocessorReturn{InfoSchema: s.is})) c.Assert(err, IsNil) - builder, _ := NewPlanBuilder().Init(MockContext(), s.is, &hint.BlockHintProcessor{}) + sctx := MockContext() + builder, _ := NewPlanBuilder().Init(sctx, s.is, &hint.BlockHintProcessor{}) + domain.GetDomain(sctx).MockInfoCacheAndLoadInfoSchema(s.is) p, err := builder.Build(ctx, stmt) c.Assert(err, IsNil) p, err = logicalOptimize(ctx, builder.optFlag, p.(LogicalPlan)) @@ -1869,7 +1926,9 @@ func (s *testPlanSuite) TestConflictedJoinTypeHints(c *C) { c.Assert(err, IsNil) err = Preprocess(s.ctx, stmt, WithPreprocessorReturn(&PreprocessorReturn{InfoSchema: s.is})) c.Assert(err, IsNil) - builder, _ := NewPlanBuilder().Init(MockContext(), s.is, &hint.BlockHintProcessor{}) + sctx := MockContext() + builder, _ := NewPlanBuilder().Init(sctx, s.is, &hint.BlockHintProcessor{}) + domain.GetDomain(sctx).MockInfoCacheAndLoadInfoSchema(s.is) p, err := builder.Build(ctx, stmt) c.Assert(err, IsNil) p, err = logicalOptimize(ctx, builder.optFlag, p.(LogicalPlan)) @@ -1890,7 +1949,9 @@ func (s *testPlanSuite) TestSimplyOuterJoinWithOnlyOuterExpr(c *C) { c.Assert(err, IsNil) err = Preprocess(s.ctx, stmt, WithPreprocessorReturn(&PreprocessorReturn{InfoSchema: s.is})) c.Assert(err, IsNil) - builder, _ := NewPlanBuilder().Init(MockContext(), s.is, &hint.BlockHintProcessor{}) + sctx := MockContext() + builder, _ := NewPlanBuilder().Init(sctx, s.is, &hint.BlockHintProcessor{}) + domain.GetDomain(sctx).MockInfoCacheAndLoadInfoSchema(s.is) p, err := builder.Build(ctx, stmt) c.Assert(err, IsNil) p, err = logicalOptimize(ctx, builder.optFlag, p.(LogicalPlan)) diff --git a/planner/core/logical_plan_trace_test.go b/planner/core/logical_plan_trace_test.go new file mode 100644 index 0000000000000..f0c6d5718eaae --- /dev/null +++ b/planner/core/logical_plan_trace_test.go @@ -0,0 +1,261 @@ +// Copyright 2021 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, +// 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. + +package core + +import ( + "context" + + . "github.com/pingcap/check" + "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/util/hint" + "github.com/pingcap/tidb/util/testleak" +) + +func (s *testPlanSuite) TestLogicalOptimizeWithTraceEnabled(c *C) { + sql := "select * from t where a in (1,2)" + defer testleak.AfterTest(c)() + tt := []struct { + flags []uint64 + steps int + }{ + { + flags: []uint64{ + flagEliminateAgg, + flagPushDownAgg}, + steps: 2, + }, + { + flags: []uint64{ + flagEliminateAgg, + flagPushDownAgg, + flagPrunColumns, + flagBuildKeyInfo, + }, + steps: 4, + }, + { + flags: []uint64{}, + steps: 0, + }, + } + + for i, tc := range tt { + comment := Commentf("case:%v sql:%s", i, sql) + stmt, err := s.ParseOneStmt(sql, "", "") + c.Assert(err, IsNil, comment) + err = Preprocess(s.ctx, stmt, WithPreprocessorReturn(&PreprocessorReturn{InfoSchema: s.is})) + c.Assert(err, IsNil, comment) + sctx := MockContext() + sctx.GetSessionVars().StmtCtx.EnableOptimizeTrace = true + builder, _ := NewPlanBuilder().Init(sctx, s.is, &hint.BlockHintProcessor{}) + domain.GetDomain(sctx).MockInfoCacheAndLoadInfoSchema(s.is) + ctx := context.TODO() + p, err := builder.Build(ctx, stmt) + c.Assert(err, IsNil) + flag := uint64(0) + for _, f := range tc.flags { + flag = flag | f + } + p, err = logicalOptimize(ctx, flag, p.(LogicalPlan)) + c.Assert(err, IsNil) + _, ok := p.(*LogicalProjection) + c.Assert(ok, IsTrue) + otrace := sctx.GetSessionVars().StmtCtx.LogicalOptimizeTrace + c.Assert(otrace, NotNil) + c.Assert(len(otrace.Steps), Equals, tc.steps) + } +} + +func (s *testPlanSuite) TestSingleRuleTraceStep(c *C) { + defer testleak.AfterTest(c)() + tt := []struct { + sql string + flags []uint64 + assertRuleName string + assertRuleSteps []assertTraceStep + }{ + { + sql: "select * from (t t1, t t2, t t3,t t4) union all select * from (t t5, t t6, t t7,t t8)", + flags: []uint64{flagBuildKeyInfo, flagPrunColumns, flagDecorrelate, flagPredicatePushDown, flagEliminateOuterJoin, flagJoinReOrder}, + assertRuleName: "join_reorder", + assertRuleSteps: []assertTraceStep{ + { + assertAction: "join order becomes [((t1*t2)*(t3*t4)),((t5*t6)*(t7*t8))] from original [(((t1*t2)*t3)*t4),(((t5*t6)*t7)*t8)]", + assertReason: "join cost during reorder: [[t1, cost:10000],[t2, cost:10000],[t3, cost:10000],[t4, cost:10000],[t5, cost:10000],[t6, cost:10000],[t7, cost:10000],[t8, cost:10000]]", + }, + }, + }, + { + sql: "select * from t t1, t t2, t t3 where t1.a=t2.a and t3.a=t2.a and t1.a=t3.a", + flags: []uint64{flagBuildKeyInfo, flagPrunColumns, flagDecorrelate, flagPredicatePushDown, flagEliminateOuterJoin, flagJoinReOrder}, + assertRuleName: "join_reorder", + assertRuleSteps: []assertTraceStep{ + { + assertAction: "join order becomes ((t1*t2)*t3) from original ((t1*t2)*t3)", + assertReason: "join cost during reorder: [[((t1*t2)*t3), cost:58125],[(t1*t2), cost:32500],[(t1*t3), cost:32500],[t1, cost:10000],[t2, cost:10000],[t3, cost:10000]]", + }, + }, + }, + { + sql: "select min(distinct a) from t group by a", + flags: []uint64{flagBuildKeyInfo, flagEliminateAgg}, + assertRuleName: "aggregation_eliminate", + assertRuleSteps: []assertTraceStep{ + { + assertReason: "[test.t.a] is a unique key", + assertAction: "min(distinct ...) is simplified to min(...)", + }, + { + assertReason: "[test.t.a] is a unique key", + assertAction: "aggregation is simplified to a projection", + }, + }, + }, + { + sql: "select 1+num from (select 1+a as num from t) t1;", + flags: []uint64{flagEliminateProjection}, + assertRuleName: "projection_eliminate", + assertRuleSteps: []assertTraceStep{ + { + assertAction: "Proj[2] is eliminated, Proj[3]'s expressions changed into[plus(1, plus(1, test.t.a))]", + assertReason: "Proj[3]'s child proj[2] is redundant", + }, + }, + }, + { + sql: "select count(*) from t a , t b, t c", + flags: []uint64{flagBuildKeyInfo, flagPrunColumns, flagPushDownAgg}, + assertRuleName: "aggregation_push_down", + assertRuleSteps: []assertTraceStep{ + { + assertAction: "agg[6] pushed down across join[5], and join right path becomes agg[8]", + assertReason: "agg[6]'s functions[count(Column#38)] are decomposable with join", + }, + }, + }, + { + sql: "select sum(c1) from (select c c1, d c2 from t a union all select a c1, b c2 from t b) x group by c2", + flags: []uint64{flagBuildKeyInfo, flagPrunColumns, flagPushDownAgg}, + assertRuleName: "aggregation_push_down", + assertRuleSteps: []assertTraceStep{ + { + assertAction: "agg[8] pushed down, and union[5]'s children changed into[[id:11,tp:Aggregation],[id:12,tp:Aggregation]]", + assertReason: "agg[8] functions[sum(Column#28)] are decomposable with union", + }, + { + assertAction: "proj[6] is eliminated, and agg[11]'s functions changed into[sum(test.t.c),firstrow(test.t.d)]", + assertReason: "Proj[6] is directly below an agg[11] and has no side effects", + }, + { + assertAction: "proj[7] is eliminated, and agg[12]'s functions changed into[sum(test.t.a),firstrow(test.t.b)]", + assertReason: "Proj[7] is directly below an agg[12] and has no side effects", + }, + }, + }, + { + sql: "select max(a)-min(a) from t", + flags: []uint64{flagBuildKeyInfo, flagPrunColumns, flagMaxMinEliminate}, + assertRuleName: "max_min_eliminate", + assertRuleSteps: []assertTraceStep{ + { + assertAction: "add sort[8],add limit[9] during eliminating agg[4] max function", + assertReason: "agg[4] has only one function[max] without group by, the columns in agg[4] should be sorted", + }, + { + assertAction: "add sort[10],add limit[11] during eliminating agg[6] min function", + assertReason: "agg[6] has only one function[min] without group by, the columns in agg[6] should be sorted", + }, + { + assertAction: "agg[2] splited into aggs[4,6], and add joins[12] to connect them during eliminating agg[2] multi min/max functions", + assertReason: "each column is sorted and can benefit from index/primary key in agg[4,6] and none of them has group by clause", + }, + }, + }, + { + sql: "select max(e) from t", + flags: []uint64{flagBuildKeyInfo, flagPrunColumns, flagMaxMinEliminate}, + assertRuleName: "max_min_eliminate", + assertRuleSteps: []assertTraceStep{ + { + assertAction: "add selection[4],add sort[5],add limit[6] during eliminating agg[2] max function", + assertReason: "agg[2] has only one function[max] without group by, the columns in agg[2] shouldn't be NULL and needs NULL to be filtered out, the columns in agg[2] should be sorted", + }, + }, + }, + { + sql: "select t1.b,t1.c from t as t1 left join t as t2 on t1.a = t2.a;", + flags: []uint64{flagBuildKeyInfo, flagEliminateOuterJoin}, + assertRuleName: "outer_join_eliminate", + assertRuleSteps: []assertTraceStep{ + { + assertAction: "Outer join[3] is eliminated and become DataSource[1]", + assertReason: "The columns[test.t.b,test.t.c] are from outer table, and the inner join keys[test.t.a] are unique", + }, + }, + }, + { + sql: "select count(distinct t1.a, t1.b) from t t1 left join t t2 on t1.b = t2.b", + flags: []uint64{flagPrunColumns, flagBuildKeyInfo, flagEliminateOuterJoin}, + assertRuleName: "outer_join_eliminate", + assertRuleSteps: []assertTraceStep{ + { + assertAction: "Outer join[3] is eliminated and become DataSource[1]", + assertReason: "The columns[test.t.a,test.t.b] in agg are from outer table, and the agg functions are duplicate agnostic", + }, + }, + }, + } + + for i, tc := range tt { + sql := tc.sql + comment := Commentf("case:%v sql:%s", i, sql) + stmt, err := s.ParseOneStmt(sql, "", "") + c.Assert(err, IsNil, comment) + err = Preprocess(s.ctx, stmt, WithPreprocessorReturn(&PreprocessorReturn{InfoSchema: s.is})) + c.Assert(err, IsNil, comment) + sctx := MockContext() + sctx.GetSessionVars().StmtCtx.EnableOptimizeTrace = true + sctx.GetSessionVars().AllowAggPushDown = true + builder, _ := NewPlanBuilder().Init(sctx, s.is, &hint.BlockHintProcessor{}) + domain.GetDomain(sctx).MockInfoCacheAndLoadInfoSchema(s.is) + ctx := context.TODO() + p, err := builder.Build(ctx, stmt) + c.Assert(err, IsNil) + flag := uint64(0) + for _, f := range tc.flags { + flag = flag | f + } + _, err = logicalOptimize(ctx, flag, p.(LogicalPlan)) + c.Assert(err, IsNil) + otrace := sctx.GetSessionVars().StmtCtx.LogicalOptimizeTrace + c.Assert(otrace, NotNil) + assert := false + for _, step := range otrace.Steps { + if step.RuleName == tc.assertRuleName { + assert = true + for i, ruleStep := range step.Steps { + c.Assert(ruleStep.Action, Equals, tc.assertRuleSteps[i].assertAction) + c.Assert(ruleStep.Reason, Equals, tc.assertRuleSteps[i].assertReason) + } + } + } + c.Assert(assert, IsTrue) + } +} + +type assertTraceStep struct { + assertReason string + assertAction string +} diff --git a/planner/core/logical_plans.go b/planner/core/logical_plans.go index 173de775558bb..5fe0426b5c15b 100644 --- a/planner/core/logical_plans.go +++ b/planner/core/logical_plans.go @@ -20,6 +20,7 @@ import ( "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/expression/aggregation" "github.com/pingcap/tidb/infoschema" + "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/auth" "github.com/pingcap/tidb/parser/model" @@ -146,10 +147,22 @@ type LogicalJoin struct { // Currently, only `aggregation push down` phase will set this. DefaultValues []types.Datum - // redundantSchema contains columns which are eliminated in join. - // For select * from a join b using (c); a.c will in output schema, and b.c will only in redundantSchema. - redundantSchema *expression.Schema - redundantNames types.NameSlice + // fullSchema contains all the columns that the Join can output. It's ordered as [outer schema..., inner schema...]. + // This is useful for natural joins and "using" joins. In these cases, the join key columns from the + // inner side (or the right side when it's an inner join) will not be in the schema of Join. + // But upper operators should be able to find those "redundant" columns, and the user also can specifically select + // those columns, so we put the "redundant" columns here to make them be able to be found. + // + // For example: + // create table t1(a int, b int); create table t2(a int, b int); + // select * from t1 join t2 using (b); + // schema of the Join will be [t1.b, t1.a, t2.a]; fullSchema will be [t1.a, t1.b, t2.a, t2.b]. + // + // We record all columns and keep them ordered is for correctly handling SQLs like + // select t1.*, t2.* from t1 join t2 using (b); + // (*PlanBuilder).unfoldWildStar() handles the schema for such case. + fullSchema *expression.Schema + fullNames types.NameSlice // equalCondOutCnt indicates the estimated count of joined rows after evaluating `EqualConditions`. equalCondOutCnt float64 @@ -178,7 +191,7 @@ func (p *LogicalJoin) GetJoinKeys() (leftKeys, rightKeys []*expression.Column, i // the join keys of EqualConditions func (p *LogicalJoin) GetPotentialPartitionKeys() (leftKeys, rightKeys []*property.MPPPartitionColumn) { for _, expr := range p.EqualConditions { - _, coll := expr.CharsetAndCollation(p.ctx) + _, coll := expr.CharsetAndCollation() collateID := property.GetCollateIDByNameForPartition(coll) leftKeys = append(leftKeys, &property.MPPPartitionColumn{Col: expr.GetArgs()[0].(*expression.Column), CollateID: collateID}) rightKeys = append(rightKeys, &property.MPPPartitionColumn{Col: expr.GetArgs()[1].(*expression.Column), CollateID: collateID}) @@ -514,6 +527,9 @@ type LogicalUnionScan struct { conditions []expression.Expression handleCols HandleCols + + // cacheTable not nil means it's reading from cached table. + cacheTable kv.MemBuffer } // DataSource represents a tableScan without condition push down. @@ -710,7 +726,6 @@ func (ds *DataSource) deriveCommonHandleTablePathStats(path *util.AccessPath, co if len(conds) == 0 { return nil } - sc := ds.ctx.GetSessionVars().StmtCtx if len(path.IdxCols) != 0 { res, err := ranger.DetachCondAndBuildRangeForIndex(ds.ctx, conds, path.IdxCols, path.IdxColLens) if err != nil { @@ -728,7 +743,7 @@ func (ds *DataSource) deriveCommonHandleTablePathStats(path *util.AccessPath, co path.ConstCols[i] = res.ColumnValues[i] != nil } } - path.CountAfterAccess, err = ds.tableStats.HistColl.GetRowCountByIndexRanges(sc, path.Index.ID, path.Ranges) + path.CountAfterAccess, err = ds.tableStats.HistColl.GetRowCountByIndexRanges(ds.ctx, path.Index.ID, path.Ranges) if err != nil { return err } @@ -769,7 +784,6 @@ func (ds *DataSource) deriveTablePathStats(path *util.AccessPath, conds []expres return ds.deriveCommonHandleTablePathStats(path, conds, isIm) } var err error - sc := ds.ctx.GetSessionVars().StmtCtx path.CountAfterAccess = float64(ds.statisticTable.Count) path.TableFilters = conds var pkCol *expression.Column @@ -828,11 +842,11 @@ func (ds *DataSource) deriveTablePathStats(path *util.AccessPath, conds []expres path.CountAfterAccess = 1 return nil } - path.Ranges, err = ranger.BuildTableRange(path.AccessConds, sc, pkCol.RetType) + path.Ranges, err = ranger.BuildTableRange(path.AccessConds, ds.ctx, pkCol.RetType) if err != nil { return err } - path.CountAfterAccess, err = ds.statisticTable.GetRowCountByIntColumnRanges(sc, pkCol.ID, path.Ranges) + path.CountAfterAccess, err = ds.statisticTable.GetRowCountByIntColumnRanges(ds.ctx, pkCol.ID, path.Ranges) // If the `CountAfterAccess` is less than `stats.RowCount`, there must be some inconsistent stats info. // We prefer the `stats.RowCount` because it could use more stats info to calculate the selectivity. if path.CountAfterAccess < ds.stats.RowCount && !isIm { @@ -842,7 +856,6 @@ func (ds *DataSource) deriveTablePathStats(path *util.AccessPath, conds []expres } func (ds *DataSource) fillIndexPath(path *util.AccessPath, conds []expression.Expression) error { - sc := ds.ctx.GetSessionVars().StmtCtx path.Ranges = ranger.FullRange() path.CountAfterAccess = float64(ds.statisticTable.Count) path.IdxCols, path.IdxColLens = expression.IndexInfo2PrefixCols(ds.Columns, ds.schema.Columns, path.Index) @@ -884,7 +897,7 @@ func (ds *DataSource) fillIndexPath(path *util.AccessPath, conds []expression.Ex path.ConstCols[i] = res.ColumnValues[i] != nil } } - path.CountAfterAccess, err = ds.tableStats.HistColl.GetRowCountByIndexRanges(sc, path.Index.ID, path.Ranges) + path.CountAfterAccess, err = ds.tableStats.HistColl.GetRowCountByIndexRanges(ds.ctx, path.Index.ID, path.Ranges) if err != nil { return err } @@ -1293,6 +1306,9 @@ type LogicalCTETable struct { seedStat *property.StatsInfo name string idForStorage int + + // seedSchema is only used in predicateColumnCollector to get column mapping + seedSchema *expression.Schema } // ExtractCorrelatedCols implements LogicalPlan interface. diff --git a/planner/core/main_test.go b/planner/core/main_test.go index df250425aaaf4..236d154ff8934 100644 --- a/planner/core/main_test.go +++ b/planner/core/main_test.go @@ -24,7 +24,8 @@ import ( "go.uber.org/goleak" ) -var testDataMap = make(testdata.BookKeeper, 1) +var testDataMap = make(testdata.BookKeeper, 2) +var indexMergeSuiteData testdata.TestData func TestMain(m *testing.M) { testbridge.WorkaroundGoCheckFlags() @@ -32,6 +33,8 @@ func TestMain(m *testing.M) { flag.Parse() testDataMap.LoadTestSuiteData("testdata", "integration_partition_suite") + testDataMap.LoadTestSuiteData("testdata", "index_merge_suite") + indexMergeSuiteData = testDataMap["index_merge_suite"] opts := []goleak.Option{ goleak.IgnoreTopFunction("go.etcd.io/etcd/pkg/logutil.(*MergeLogger).outputLoop"), diff --git a/planner/core/memtable_predicate_extractor.go b/planner/core/memtable_predicate_extractor.go index 7fd2e787dae11..923d025ac7d13 100644 --- a/planner/core/memtable_predicate_extractor.go +++ b/planner/core/memtable_predicate_extractor.go @@ -541,6 +541,24 @@ func (helper extractHelper) convertToTime(t int64) time.Time { return time.Unix(0, t) } +func (helper extractHelper) convertToBoolSlice(uint64Slice []uint64) []bool { + if len(uint64Slice) == 0 { + return []bool{false, true} + } + var res []bool + // use to keep res unique + b := make(map[bool]struct{}, 2) + for _, l := range uint64Slice { + tmpBool := (l == 1) + _, ok := b[tmpBool] + if !ok { + b[tmpBool] = struct{}{} + res = append(res, tmpBool) + } + } + return res +} + // ClusterTableExtractor is used to extract some predicates of cluster table. type ClusterTableExtractor struct { extractHelper @@ -697,6 +715,13 @@ func (e *ClusterLogTableExtractor) explainInfo(p *PhysicalMemTable) string { return s } +const ( + // HotRegionTypeRead hot read region. + HotRegionTypeRead = "read" + // HotRegionTypeWrite hot write region. + HotRegionTypeWrite = "write" +) + // HotRegionsHistoryTableExtractor is used to extract some predicates of `tidb_hot_regions_history` type HotRegionsHistoryTableExtractor struct { extractHelper @@ -723,8 +748,8 @@ type HotRegionsHistoryTableExtractor struct { // e.g: // 1. SELECT * FROM tidb_hot_regions_history WHERE is_learner=1 // 2. SELECT * FROM tidb_hot_regions_history WHERE is_learner in (0,1) -> request all - IsLearners []uint64 - IsLeaders []uint64 + IsLearners []bool + IsLeaders []bool // HotRegionTypes represents all hot region types we should filter in PD to reduce network IO. // e.g: @@ -741,7 +766,7 @@ func (e *HotRegionsHistoryTableExtractor) Extract( names []*types.FieldName, predicates []expression.Expression, ) []expression.Expression { - // Extract the `region_id/store_id/peer_id` columns. + // Extract the `region_id/store_id/peer_id` columns remained, regionIDSkipRequest, regionIDs := e.extractCol(schema, names, predicates, "region_id", false) remained, storeIDSkipRequest, storeIDs := e.extractCol(schema, names, remained, "store_id", false) remained, peerIDSkipRequest, peerIDs := e.extractCol(schema, names, remained, "peer_id", false) @@ -751,25 +776,34 @@ func (e *HotRegionsHistoryTableExtractor) Extract( return nil } - // Extract the is_learner/is_leader columns. + // Extract the is_learner/is_leader columns remained, isLearnerSkipRequest, isLearners := e.extractCol(schema, names, remained, "is_learner", false) remained, isLeaderSkipRequest, isLeaders := e.extractCol(schema, names, remained, "is_leader", false) - e.IsLearners, e.IsLeaders = e.parseUint64(isLearners), e.parseUint64(isLeaders) + isLearnersUint64, isLeadersUint64 := e.parseUint64(isLearners), e.parseUint64(isLeaders) e.SkipRequest = isLearnerSkipRequest || isLeaderSkipRequest if e.SkipRequest { return nil } + // uint64 slice to unique bool slice + e.IsLearners = e.convertToBoolSlice(isLearnersUint64) + e.IsLeaders = e.convertToBoolSlice(isLeadersUint64) - // Extract the `type` column. + // Extract the `type` column remained, typeSkipRequest, types := e.extractCol(schema, names, remained, "type", false) e.HotRegionTypes = types e.SkipRequest = typeSkipRequest if e.SkipRequest { return nil } + // Divide read-write into two requests because of time range overlap, + // PD use [type,time] as key of hot regions. + if e.HotRegionTypes.Count() == 0 { + e.HotRegionTypes.Insert(HotRegionTypeRead) + e.HotRegionTypes.Insert(HotRegionTypeWrite) + } remained, startTime, endTime := e.extractTimeRange(ctx, schema, names, remained, "update_time", ctx.GetSessionVars().StmtCtx.TimeZone) - // The time unit for search hot regions is millisecond. + // The time unit for search hot regions is millisecond startTime = startTime / int64(time.Millisecond) endTime = endTime / int64(time.Millisecond) e.StartTime = startTime @@ -808,10 +842,10 @@ func (e *HotRegionsHistoryTableExtractor) explainInfo(p *PhysicalMemTable) strin r.WriteString(fmt.Sprintf("peer_ids:[%s], ", extractStringFromUint64Slice(e.PeerIDs))) } if len(e.IsLearners) > 0 { - r.WriteString(fmt.Sprintf("roles:[%s], ", extractStringFromUint64Slice(e.IsLearners))) + r.WriteString(fmt.Sprintf("learner_roles:[%s], ", extractStringFromBoolSlice(e.IsLearners))) } if len(e.IsLeaders) > 0 { - r.WriteString(fmt.Sprintf("roles:[%s], ", extractStringFromUint64Slice(e.IsLeaders))) + r.WriteString(fmt.Sprintf("leader_roles:[%s], ", extractStringFromBoolSlice(e.IsLeaders))) } if len(e.HotRegionTypes) > 0 { r.WriteString(fmt.Sprintf("hot_region_types:[%s], ", extractStringFromStringSet(e.HotRegionTypes))) diff --git a/planner/core/memtable_predicate_extractor_test.go b/planner/core/memtable_predicate_extractor_test.go index 15f468d33a5c3..311b9ae4a8838 100644 --- a/planner/core/memtable_predicate_extractor_test.go +++ b/planner/core/memtable_predicate_extractor_test.go @@ -1058,7 +1058,7 @@ func (s *extractorSuite) TestTiDBHotRegionsHistoryTableExtractor(c *C) { skipRequest bool startTime, endTime int64 regionIDs, storeIDs, peerIDs []uint64 - isLearners, isLeaders []uint64 + isLearners, isLeaders []bool hotRegionTypes set.StringSet }{ // Test full data, it will not call Extract() and executor(retriver) will panic and remind user to add conditions to save network IO. @@ -1071,114 +1071,180 @@ func (s *extractorSuite) TestTiDBHotRegionsHistoryTableExtractor(c *C) { sql: "select * from information_schema.tidb_hot_regions_history where update_time='2019-10-10 10::10'", }, { - sql: "select * from information_schema.tidb_hot_regions_history where update_time='2019-10-10 10:10:10'", - startTime: timestamp(c, "2019-10-10 10:10:10"), - endTime: timestamp(c, "2019-10-10 10:10:10"), + sql: "select * from information_schema.tidb_hot_regions_history where update_time='2019-10-10 10:10:10'", + startTime: timestamp(c, "2019-10-10 10:10:10"), + endTime: timestamp(c, "2019-10-10 10:10:10"), + isLearners: []bool{false, true}, + isLeaders: []bool{false, true}, + hotRegionTypes: set.NewStringSet(plannercore.HotRegionTypeRead, plannercore.HotRegionTypeWrite), }, { - sql: "select * from information_schema.tidb_hot_regions_history where update_time>='2019-10-10 10:10:10' and update_time<='2019-10-11 10:10:10'", - startTime: timestamp(c, "2019-10-10 10:10:10"), - endTime: timestamp(c, "2019-10-11 10:10:10"), + sql: "select * from information_schema.tidb_hot_regions_history where update_time>='2019-10-10 10:10:10' and update_time<='2019-10-11 10:10:10'", + startTime: timestamp(c, "2019-10-10 10:10:10"), + endTime: timestamp(c, "2019-10-11 10:10:10"), + isLearners: []bool{false, true}, + isLeaders: []bool{false, true}, + hotRegionTypes: set.NewStringSet(plannercore.HotRegionTypeRead, plannercore.HotRegionTypeWrite), }, { - sql: "select * from information_schema.tidb_hot_regions_history where update_time>'2019-10-10 10:10:10' and update_time<'2019-10-11 10:10:10'", - startTime: timestamp(c, "2019-10-10 10:10:10") + 1, - endTime: timestamp(c, "2019-10-11 10:10:10") - 1, + sql: "select * from information_schema.tidb_hot_regions_history where update_time>'2019-10-10 10:10:10' and update_time<'2019-10-11 10:10:10'", + startTime: timestamp(c, "2019-10-10 10:10:10") + 1, + endTime: timestamp(c, "2019-10-11 10:10:10") - 1, + isLearners: []bool{false, true}, + isLeaders: []bool{false, true}, + hotRegionTypes: set.NewStringSet(plannercore.HotRegionTypeRead, plannercore.HotRegionTypeWrite), }, { - sql: "select * from information_schema.tidb_hot_regions_history where update_time>='2019-10-10 10:10:10' and update_time<'2019-10-11 10:10:10'", - startTime: timestamp(c, "2019-10-10 10:10:10"), - endTime: timestamp(c, "2019-10-11 10:10:10") - 1, + sql: "select * from information_schema.tidb_hot_regions_history where update_time>='2019-10-10 10:10:10' and update_time<'2019-10-11 10:10:10'", + startTime: timestamp(c, "2019-10-10 10:10:10"), + endTime: timestamp(c, "2019-10-11 10:10:10") - 1, + isLearners: []bool{false, true}, + isLeaders: []bool{false, true}, + hotRegionTypes: set.NewStringSet(plannercore.HotRegionTypeRead, plannercore.HotRegionTypeWrite), }, { - sql: "select * from information_schema.tidb_hot_regions_history where update_time>='2019-10-12 10:10:10' and update_time<'2019-10-11 10:10:10'", - startTime: timestamp(c, "2019-10-12 10:10:10"), - endTime: timestamp(c, "2019-10-11 10:10:10") - 1, - skipRequest: true, + sql: "select * from information_schema.tidb_hot_regions_history where update_time>='2019-10-12 10:10:10' and update_time<'2019-10-11 10:10:10'", + startTime: timestamp(c, "2019-10-12 10:10:10"), + endTime: timestamp(c, "2019-10-11 10:10:10") - 1, + isLearners: []bool{false, true}, + isLeaders: []bool{false, true}, + hotRegionTypes: set.NewStringSet(plannercore.HotRegionTypeRead, plannercore.HotRegionTypeWrite), + skipRequest: true, }, { - sql: "select * from information_schema.tidb_hot_regions_history where update_time>='2019-10-10 10:10:10'", - startTime: timestamp(c, "2019-10-10 10:10:10"), + sql: "select * from information_schema.tidb_hot_regions_history where update_time>='2019-10-10 10:10:10'", + startTime: timestamp(c, "2019-10-10 10:10:10"), + isLearners: []bool{false, true}, + isLeaders: []bool{false, true}, + hotRegionTypes: set.NewStringSet(plannercore.HotRegionTypeRead, plannercore.HotRegionTypeWrite), }, { - sql: "select * from information_schema.tidb_hot_regions_history where update_time>='2019-10-10 10:10:10' and update_time>='2019-10-11 10:10:10' and update_time>='2019-10-12 10:10:10'", - startTime: timestamp(c, "2019-10-12 10:10:10"), + sql: "select * from information_schema.tidb_hot_regions_history where update_time>='2019-10-10 10:10:10' and update_time>='2019-10-11 10:10:10' and update_time>='2019-10-12 10:10:10'", + startTime: timestamp(c, "2019-10-12 10:10:10"), + isLearners: []bool{false, true}, + isLeaders: []bool{false, true}, + hotRegionTypes: set.NewStringSet(plannercore.HotRegionTypeRead, plannercore.HotRegionTypeWrite), }, { - sql: "select * from information_schema.tidb_hot_regions_history where update_time>='2019-10-10 10:10:10' and update_time>='2019-10-11 10:10:10' and update_time>='2019-10-12 10:10:10' and update_time='2019-10-13 10:10:10'", - startTime: timestamp(c, "2019-10-13 10:10:10"), - endTime: timestamp(c, "2019-10-13 10:10:10"), + sql: "select * from information_schema.tidb_hot_regions_history where update_time>='2019-10-10 10:10:10' and update_time>='2019-10-11 10:10:10' and update_time>='2019-10-12 10:10:10' and update_time='2019-10-13 10:10:10'", + startTime: timestamp(c, "2019-10-13 10:10:10"), + endTime: timestamp(c, "2019-10-13 10:10:10"), + isLearners: []bool{false, true}, + isLeaders: []bool{false, true}, + hotRegionTypes: set.NewStringSet(plannercore.HotRegionTypeRead, plannercore.HotRegionTypeWrite), }, { - sql: "select * from information_schema.tidb_hot_regions_history where update_time<='2019-10-10 10:10:10' and update_time='2019-10-13 10:10:10'", - startTime: timestamp(c, "2019-10-13 10:10:10"), - endTime: timestamp(c, "2019-10-10 10:10:10"), - skipRequest: true, + sql: "select * from information_schema.tidb_hot_regions_history where update_time<='2019-10-10 10:10:10' and update_time='2019-10-13 10:10:10'", + startTime: timestamp(c, "2019-10-13 10:10:10"), + endTime: timestamp(c, "2019-10-10 10:10:10"), + isLearners: []bool{false, true}, + isLeaders: []bool{false, true}, + hotRegionTypes: set.NewStringSet(plannercore.HotRegionTypeRead, plannercore.HotRegionTypeWrite), + skipRequest: true, }, { - sql: "select * from information_schema.tidb_hot_regions_history where update_time='2019-10-10 10:10:10' and update_time<='2019-10-13 10:10:10'", - startTime: timestamp(c, "2019-10-10 10:10:10"), - endTime: timestamp(c, "2019-10-10 10:10:10"), + sql: "select * from information_schema.tidb_hot_regions_history where update_time='2019-10-10 10:10:10' and update_time<='2019-10-13 10:10:10'", + startTime: timestamp(c, "2019-10-10 10:10:10"), + endTime: timestamp(c, "2019-10-10 10:10:10"), + isLearners: []bool{false, true}, + isLeaders: []bool{false, true}, + hotRegionTypes: set.NewStringSet(plannercore.HotRegionTypeRead, plannercore.HotRegionTypeWrite), }, // Test `region_id`, `store_id`, `peer_id` columns. { - sql: "select * from information_schema.tidb_hot_regions_history where region_id=100", - regionIDs: []uint64{100}, + sql: "select * from information_schema.tidb_hot_regions_history where region_id=100", + regionIDs: []uint64{100}, + isLearners: []bool{false, true}, + isLeaders: []bool{false, true}, + hotRegionTypes: set.NewStringSet(plannercore.HotRegionTypeRead, plannercore.HotRegionTypeWrite), }, { - sql: "select * from information_schema.tidb_hot_regions_history where 100=region_id", - regionIDs: []uint64{100}, + sql: "select * from information_schema.tidb_hot_regions_history where 100=region_id", + regionIDs: []uint64{100}, + isLearners: []bool{false, true}, + isLeaders: []bool{false, true}, + hotRegionTypes: set.NewStringSet(plannercore.HotRegionTypeRead, plannercore.HotRegionTypeWrite), }, { - sql: "select * from information_schema.tidb_hot_regions_history where 100=region_id or region_id=101", - regionIDs: []uint64{100, 101}, + sql: "select * from information_schema.tidb_hot_regions_history where 100=region_id or region_id=101", + regionIDs: []uint64{100, 101}, + isLearners: []bool{false, true}, + isLeaders: []bool{false, true}, + hotRegionTypes: set.NewStringSet(plannercore.HotRegionTypeRead, plannercore.HotRegionTypeWrite), }, { - sql: "select * from information_schema.tidb_hot_regions_history where 100=region_id or region_id=101 or region_id=102 or 103 = region_id", - regionIDs: []uint64{100, 101, 102, 103}, + sql: "select * from information_schema.tidb_hot_regions_history where 100=region_id or region_id=101 or region_id=102 or 103 = region_id", + regionIDs: []uint64{100, 101, 102, 103}, + isLearners: []bool{false, true}, + isLeaders: []bool{false, true}, + hotRegionTypes: set.NewStringSet(plannercore.HotRegionTypeRead, plannercore.HotRegionTypeWrite), }, { - sql: "select * from information_schema.tidb_hot_regions_history where (region_id=100 or region_id=101) and (store_id=200 or store_id=201)", - regionIDs: []uint64{100, 101}, - storeIDs: []uint64{200, 201}, + sql: "select * from information_schema.tidb_hot_regions_history where (region_id=100 or region_id=101) and (store_id=200 or store_id=201)", + regionIDs: []uint64{100, 101}, + storeIDs: []uint64{200, 201}, + isLearners: []bool{false, true}, + isLeaders: []bool{false, true}, + hotRegionTypes: set.NewStringSet(plannercore.HotRegionTypeRead, plannercore.HotRegionTypeWrite), }, { - sql: "select * from information_schema.tidb_hot_regions_history where region_id in (100, 101)", - regionIDs: []uint64{100, 101}, + sql: "select * from information_schema.tidb_hot_regions_history where region_id in (100, 101)", + regionIDs: []uint64{100, 101}, + isLearners: []bool{false, true}, + isLeaders: []bool{false, true}, + hotRegionTypes: set.NewStringSet(plannercore.HotRegionTypeRead, plannercore.HotRegionTypeWrite), }, { - sql: "select * from information_schema.tidb_hot_regions_history where region_id in (100, 101) and store_id=200", - regionIDs: []uint64{100, 101}, - storeIDs: []uint64{200}, + sql: "select * from information_schema.tidb_hot_regions_history where region_id in (100, 101) and store_id=200", + regionIDs: []uint64{100, 101}, + storeIDs: []uint64{200}, + isLearners: []bool{false, true}, + isLeaders: []bool{false, true}, + hotRegionTypes: set.NewStringSet(plannercore.HotRegionTypeRead, plannercore.HotRegionTypeWrite), }, { - sql: "select * from information_schema.tidb_hot_regions_history where region_id in (100, 101) and store_id in (200, 201)", - regionIDs: []uint64{100, 101}, - storeIDs: []uint64{200, 201}, + sql: "select * from information_schema.tidb_hot_regions_history where region_id in (100, 101) and store_id in (200, 201)", + regionIDs: []uint64{100, 101}, + storeIDs: []uint64{200, 201}, + isLearners: []bool{false, true}, + isLeaders: []bool{false, true}, + hotRegionTypes: set.NewStringSet(plannercore.HotRegionTypeRead, plannercore.HotRegionTypeWrite), }, { - sql: "select * from information_schema.tidb_hot_regions_history where region_id=100 and store_id in (200, 201)", - regionIDs: []uint64{100}, - storeIDs: []uint64{200, 201}, + sql: "select * from information_schema.tidb_hot_regions_history where region_id=100 and store_id in (200, 201)", + regionIDs: []uint64{100}, + storeIDs: []uint64{200, 201}, + isLearners: []bool{false, true}, + isLeaders: []bool{false, true}, + hotRegionTypes: set.NewStringSet(plannercore.HotRegionTypeRead, plannercore.HotRegionTypeWrite), }, { - sql: "select * from information_schema.tidb_hot_regions_history where region_id=100 and store_id=200", - regionIDs: []uint64{100}, - storeIDs: []uint64{200}, + sql: "select * from information_schema.tidb_hot_regions_history where region_id=100 and store_id=200", + regionIDs: []uint64{100}, + storeIDs: []uint64{200}, + isLearners: []bool{false, true}, + isLeaders: []bool{false, true}, + hotRegionTypes: set.NewStringSet(plannercore.HotRegionTypeRead, plannercore.HotRegionTypeWrite), }, { sql: "select * from information_schema.tidb_hot_regions_history where region_id=100 and region_id=101", skipRequest: true, }, { - sql: "select * from information_schema.tidb_hot_regions_history where region_id=100 and region_id in (100,101)", - regionIDs: []uint64{100}, + sql: "select * from information_schema.tidb_hot_regions_history where region_id=100 and region_id in (100,101)", + regionIDs: []uint64{100}, + isLearners: []bool{false, true}, + isLeaders: []bool{false, true}, + hotRegionTypes: set.NewStringSet(plannercore.HotRegionTypeRead, plannercore.HotRegionTypeWrite), }, { - sql: "select * from information_schema.tidb_hot_regions_history where region_id=100 and region_id in (100,101) and store_id=200 and store_id in (200,201)", - regionIDs: []uint64{100}, - storeIDs: []uint64{200}, + sql: "select * from information_schema.tidb_hot_regions_history where region_id=100 and region_id in (100,101) and store_id=200 and store_id in (200,201)", + regionIDs: []uint64{100}, + storeIDs: []uint64{200}, + isLearners: []bool{false, true}, + isLeaders: []bool{false, true}, + hotRegionTypes: set.NewStringSet(plannercore.HotRegionTypeRead, plannercore.HotRegionTypeWrite), }, { sql: "select * from information_schema.tidb_hot_regions_history where region_id=100 and region_id in (101,102)", @@ -1193,52 +1259,61 @@ func (s *extractorSuite) TestTiDBHotRegionsHistoryTableExtractor(c *C) { skipRequest: true, }, { - sql: `select * from information_schema.tidb_hot_regions_history - where region_id=100 and region_id in (100,101) + sql: `select * from information_schema.tidb_hot_regions_history + where region_id=100 and region_id in (100,101) and store_id=200 and store_id in (201,202)`, skipRequest: true, }, { - sql: "select * from information_schema.tidb_hot_regions_history where region_id in (100,101) and region_id in (101,102)", - regionIDs: []uint64{101}, + sql: "select * from information_schema.tidb_hot_regions_history where region_id in (100,101) and region_id in (101,102)", + regionIDs: []uint64{101}, + isLearners: []bool{false, true}, + isLeaders: []bool{false, true}, + hotRegionTypes: set.NewStringSet(plannercore.HotRegionTypeRead, plannercore.HotRegionTypeWrite), }, { - sql: `select * from information_schema.tidb_hot_regions_history - where region_id in (100,101) - and region_id in (101,102) - and store_id in (200,201) + sql: `select * from information_schema.tidb_hot_regions_history + where region_id in (100,101) + and region_id in (101,102) + and store_id in (200,201) and store_id in (201,202)`, - regionIDs: []uint64{101}, - storeIDs: []uint64{201}, + regionIDs: []uint64{101}, + storeIDs: []uint64{201}, + isLearners: []bool{false, true}, + isLeaders: []bool{false, true}, + hotRegionTypes: set.NewStringSet(plannercore.HotRegionTypeRead, plannercore.HotRegionTypeWrite), }, { - sql: `select * from information_schema.tidb_hot_regions_history - where region_id in (100,101) - and region_id in (101,102) - and store_id in (200,201) + sql: `select * from information_schema.tidb_hot_regions_history + where region_id in (100,101) + and region_id in (101,102) + and store_id in (200,201) and store_id in (201,202) and peer_id in (3000,3001) and peer_id in (3001,3002)`, - regionIDs: []uint64{101}, - storeIDs: []uint64{201}, - peerIDs: []uint64{3001}, - }, - { - sql: `select * from information_schema.tidb_hot_regions_history - where region_id in (100,101) - and region_id in (100,102) - and region_id in (102,103) + regionIDs: []uint64{101}, + storeIDs: []uint64{201}, + peerIDs: []uint64{3001}, + isLearners: []bool{false, true}, + isLeaders: []bool{false, true}, + hotRegionTypes: set.NewStringSet(plannercore.HotRegionTypeRead, plannercore.HotRegionTypeWrite), + }, + { + sql: `select * from information_schema.tidb_hot_regions_history + where region_id in (100,101) + and region_id in (100,102) + and region_id in (102,103) and region_id in (103,104)`, skipRequest: true, }, // Test `type` column. { sql: "select * from information_schema.tidb_hot_regions_history where type='read'", - hotRegionTypes: set.NewStringSet("read"), + hotRegionTypes: set.NewStringSet(plannercore.HotRegionTypeRead), }, { sql: "select * from information_schema.tidb_hot_regions_history where type in('read')", - hotRegionTypes: set.NewStringSet("read"), + hotRegionTypes: set.NewStringSet(plannercore.HotRegionTypeRead), }, { sql: "select * from information_schema.tidb_hot_regions_history where type='read' and type='write'", @@ -1246,11 +1321,11 @@ func (s *extractorSuite) TestTiDBHotRegionsHistoryTableExtractor(c *C) { }, { sql: "select * from information_schema.tidb_hot_regions_history where type in ('read', 'write')", - hotRegionTypes: set.NewStringSet("read", "write"), + hotRegionTypes: set.NewStringSet(plannercore.HotRegionTypeRead, plannercore.HotRegionTypeWrite), }, { sql: "select * from information_schema.tidb_hot_regions_history where type='read' and type in ('read', 'write')", - hotRegionTypes: set.NewStringSet("read"), + hotRegionTypes: set.NewStringSet(plannercore.HotRegionTypeRead), }, { sql: "select * from information_schema.tidb_hot_regions_history where type in ('read') and type in ('write')", @@ -1258,33 +1333,45 @@ func (s *extractorSuite) TestTiDBHotRegionsHistoryTableExtractor(c *C) { }, // Test `is_learner`, `is_leaeder` columns. { - sql: "select * from information_schema.tidb_hot_regions_history where is_learner=1", - isLearners: []uint64{1}, + sql: "select * from information_schema.tidb_hot_regions_history where is_learner=1", + isLearners: []bool{true}, + isLeaders: []bool{false, true}, + hotRegionTypes: set.NewStringSet(plannercore.HotRegionTypeRead, plannercore.HotRegionTypeWrite), }, { - sql: "select * from information_schema.tidb_hot_regions_history where is_leader=0", - isLeaders: []uint64{0}, + sql: "select * from information_schema.tidb_hot_regions_history where is_leader=0", + isLearners: []bool{false, true}, + isLeaders: []bool{false}, + hotRegionTypes: set.NewStringSet(plannercore.HotRegionTypeRead, plannercore.HotRegionTypeWrite), }, { - sql: "select * from information_schema.tidb_hot_regions_history where is_learner=true", - isLearners: []uint64{1}, + sql: "select * from information_schema.tidb_hot_regions_history where is_learner=true", + isLearners: []bool{true}, + isLeaders: []bool{false, true}, + hotRegionTypes: set.NewStringSet(plannercore.HotRegionTypeRead, plannercore.HotRegionTypeWrite), }, { sql: "select * from information_schema.tidb_hot_regions_history where is_learner in(0,1)", - isLearners: []uint64{0, 1}, + isLearners: []bool{false, true}, + isLeaders: []bool{false, true}, }, { - sql: "select * from information_schema.tidb_hot_regions_history where is_learner in(true,false)", - isLearners: []uint64{0, 1}, + sql: "select * from information_schema.tidb_hot_regions_history where is_learner in(true,false)", + isLearners: []bool{false, true}, + isLeaders: []bool{false, true}, + hotRegionTypes: set.NewStringSet(plannercore.HotRegionTypeRead, plannercore.HotRegionTypeWrite), }, { - sql: "select * from information_schema.tidb_hot_regions_history where is_learner in(3,4)", - isLearners: []uint64{3, 4}, + sql: "select * from information_schema.tidb_hot_regions_history where is_learner in(3,4)", + isLearners: []bool{false}, + isLeaders: []bool{false, true}, + hotRegionTypes: set.NewStringSet(plannercore.HotRegionTypeRead, plannercore.HotRegionTypeWrite), }, { - sql: "select * from information_schema.tidb_hot_regions_history where is_learner in(3,4) and is_leader in(0,1,true,false,3,4)", - isLearners: []uint64{3, 4}, - isLeaders: []uint64{0, 1, 3, 4}, + sql: "select * from information_schema.tidb_hot_regions_history where is_learner in(3,4) and is_leader in(0,1,true,false,3,4)", + hotRegionTypes: set.NewStringSet(plannercore.HotRegionTypeRead, plannercore.HotRegionTypeWrite), + isLearners: []bool{false}, + isLeaders: []bool{false, true}, }, { sql: "select * from information_schema.tidb_hot_regions_history where is_learner=1 and is_learner=0", @@ -1322,7 +1409,6 @@ func (s *extractorSuite) TestTiDBHotRegionsHistoryTableExtractor(c *C) { if ca.hotRegionTypes.Count() > 0 { c.Assert(hotRegionsHistoryExtractor.HotRegionTypes, DeepEquals, ca.hotRegionTypes, Commentf("SQL: %v", ca.sql)) } - // ues length to avoid case uint64{} != uint64(nil) if len(ca.regionIDs) > 0 { c.Assert(hotRegionsHistoryExtractor.RegionIDs, DeepEquals, ca.regionIDs, Commentf("SQL: %v", ca.sql)) } diff --git a/planner/core/optimizer.go b/planner/core/optimizer.go index d9a81baea3c77..89b156e632cea 100644 --- a/planner/core/optimizer.go +++ b/planner/core/optimizer.go @@ -26,6 +26,7 @@ import ( "github.com/pingcap/tidb/lock" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/auth" + "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/planner/property" "github.com/pingcap/tidb/privilege" @@ -33,13 +34,19 @@ import ( "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/types" utilhint "github.com/pingcap/tidb/util/hint" + "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/set" + "github.com/pingcap/tidb/util/tracing" "go.uber.org/atomic" + "go.uber.org/zap" ) // OptimizeAstNode optimizes the query to a physical plan directly. var OptimizeAstNode func(ctx context.Context, sctx sessionctx.Context, node ast.Node, is infoschema.InfoSchema) (Plan, types.NameSlice, error) +// GetBindSQL4PlanCache get the bindSQL for the ast.StmtNode +var GetBindSQL4PlanCache func(sctx sessionctx.Context, stmtNode ast.StmtNode) (bindSQL string) + // AllowCartesianProduct means whether tidb allows cartesian join without equal conditions. var AllowCartesianProduct = atomic.NewBool(true) @@ -82,9 +89,44 @@ var optRuleList = []logicalOptRule{ &columnPruner{}, // column pruning again at last, note it will mess up the results of buildKeySolver } +type logicalOptimizeOp struct { + // tracer is goring to track optimize steps during rule optimizing + tracer *tracing.LogicalOptimizeTracer +} + +func defaultLogicalOptimizeOption() *logicalOptimizeOp { + return &logicalOptimizeOp{} +} + +func (op *logicalOptimizeOp) withEnableOptimizeTracer(tracer *tracing.LogicalOptimizeTracer) *logicalOptimizeOp { + op.tracer = tracer + return op +} + +func (op *logicalOptimizeOp) appendBeforeRuleOptimize(index int, name string, before LogicalPlan) { + if op.tracer == nil { + return + } + op.tracer.AppendRuleTracerBeforeRuleOptimize(index, name, before.buildLogicalPlanTrace(before)) +} + +func (op *logicalOptimizeOp) appendStepToCurrent(id int, tp, reason, action string) { + if op.tracer == nil { + return + } + op.tracer.AppendRuleTracerStepToCurrent(id, tp, reason, action) +} + +func (op *logicalOptimizeOp) recordFinalLogicalPlan(final LogicalPlan) { + if op.tracer == nil { + return + } + op.tracer.RecordFinalLogicalPlan(final.buildLogicalPlanTrace(final)) +} + // logicalOptRule means a logical optimizing rule, which contains decorrelate, ppd, column pruning, etc. type logicalOptRule interface { - optimize(context.Context, LogicalPlan) (LogicalPlan, error) + optimize(context.Context, LogicalPlan, *logicalOptimizeOp) (LogicalPlan, error) name() string } @@ -120,14 +162,89 @@ func CheckPrivilege(activeRoles []*auth.RoleIdentity, pm privilege.Manager, vs [ return nil } +// VisitInfo4PrivCheck generates privilege check infos because privilege check of local temporary tables is different +// with normal tables. `CREATE` statement needs `CREATE TEMPORARY TABLE` privilege from the database, and subsequent +// statements do not need any privileges. +func VisitInfo4PrivCheck(is infoschema.InfoSchema, node ast.Node, vs []visitInfo) (privVisitInfo []visitInfo) { + if node == nil { + return vs + } + + switch stmt := node.(type) { + case *ast.CreateTableStmt: + privVisitInfo = make([]visitInfo, 0, len(vs)) + for _, v := range vs { + if v.privilege == mysql.CreatePriv { + if stmt.TemporaryKeyword == ast.TemporaryLocal { + // `CREATE TEMPORARY TABLE` privilege is required from the database, not the table. + newVisitInfo := v + newVisitInfo.privilege = mysql.CreateTMPTablePriv + newVisitInfo.table = "" + privVisitInfo = append(privVisitInfo, newVisitInfo) + } else { + // If both the normal table and temporary table already exist, we need to check the privilege. + privVisitInfo = append(privVisitInfo, v) + } + } else { + // `CREATE TABLE LIKE tmp` or `CREATE TABLE FROM SELECT tmp` in the future. + if needCheckTmpTablePriv(is, v) { + privVisitInfo = append(privVisitInfo, v) + } + } + } + case *ast.DropTableStmt: + // Dropping a local temporary table doesn't need any privileges. + if stmt.IsView { + privVisitInfo = vs + } else { + privVisitInfo = make([]visitInfo, 0, len(vs)) + if stmt.TemporaryKeyword != ast.TemporaryLocal { + for _, v := range vs { + if needCheckTmpTablePriv(is, v) { + privVisitInfo = append(privVisitInfo, v) + } + } + } + } + case *ast.GrantStmt, *ast.DropSequenceStmt, *ast.DropPlacementPolicyStmt: + // Some statements ignore local temporary tables, so they should check the privileges on normal tables. + privVisitInfo = vs + default: + privVisitInfo = make([]visitInfo, 0, len(vs)) + for _, v := range vs { + if needCheckTmpTablePriv(is, v) { + privVisitInfo = append(privVisitInfo, v) + } + } + } + return +} + +func needCheckTmpTablePriv(is infoschema.InfoSchema, v visitInfo) bool { + if v.db != "" && v.table != "" { + // Other statements on local temporary tables except `CREATE` do not check any privileges. + tb, err := is.TableByName(model.NewCIStr(v.db), model.NewCIStr(v.table)) + // If the table doesn't exist, we do not report errors to avoid leaking the existence of the table. + if err == nil && tb.Meta().TempTableType == model.TempTableLocal { + return false + } + } + return true +} + // CheckTableLock checks the table lock. func CheckTableLock(ctx sessionctx.Context, is infoschema.InfoSchema, vs []visitInfo) error { if !config.TableLockEnabled() { return nil } + checker := lock.NewChecker(ctx, is) for i := range vs { err := checker.CheckTableLock(vs[i].db, vs[i].table, vs[i].privilege, vs[i].alterWritable) + // if table with lock-write table dropped, we can access other table, such as `rename` operation + if err == lock.ErrLockedTableDropped { + break + } if err != nil { return err } @@ -166,9 +283,31 @@ func DoOptimize(ctx context.Context, sctx sessionctx.Context, flag uint64, logic return nil, 0, err } finalPlan := postOptimize(sctx, physical) + + if sctx.GetSessionVars().StmtCtx.EnableOptimizerCETrace { + refineCETrace(sctx) + } + return finalPlan, cost, nil } +// refineCETrace will adjust the content of CETrace. +// Currently, it will (1) deduplicate trace records and (2) fill in the table name. +func refineCETrace(sctx sessionctx.Context) { + stmtCtx := sctx.GetSessionVars().StmtCtx + stmtCtx.OptimizerCETrace = tracing.DedupCETrace(stmtCtx.OptimizerCETrace) + traceRecords := stmtCtx.OptimizerCETrace + is := sctx.GetInfoSchema().(infoschema.InfoSchema) + for _, rec := range traceRecords { + tbl, ok := is.TableByID(rec.TableID) + if !ok { + logutil.BgLogger().Warn("[OptimizerTrace] Failed to find table in infoschema", + zap.Int64("table id", rec.TableID)) + } + rec.TableName = tbl.Meta().Name.O + } +} + // mergeContinuousSelections merge continuous selections which may occur after changing plans. func mergeContinuousSelections(p PhysicalPlan) { if sel, ok := p.(*PhysicalSelection); ok { @@ -209,7 +348,7 @@ func postOptimize(sctx sessionctx.Context, plan PhysicalPlan) PhysicalPlan { // Todo: make more careful check here. func checkPlanCacheable(sctx sessionctx.Context, plan PhysicalPlan) { if sctx.GetSessionVars().StmtCtx.UseCache && useTiFlash(plan) { - sctx.GetSessionVars().StmtCtx.MaybeOverOptimized4PlanCache = true + sctx.GetSessionVars().StmtCtx.SkipPlanCache = true } } @@ -264,6 +403,17 @@ func enableParallelApply(sctx sessionctx.Context, plan PhysicalPlan) PhysicalPla } func logicalOptimize(ctx context.Context, flag uint64, logic LogicalPlan) (LogicalPlan, error) { + opt := defaultLogicalOptimizeOption() + vars := logic.SCtx().GetSessionVars() + if vars.StmtCtx.EnableOptimizeTrace { + tracer := &tracing.LogicalOptimizeTracer{ + Steps: make([]*tracing.LogicalRuleOptimizeTracer, 0), + } + opt = opt.withEnableOptimizeTracer(tracer) + defer func() { + vars.StmtCtx.LogicalOptimizeTrace = tracer + }() + } var err error for i, rule := range optRuleList { // The order of flags is same as the order of optRule in the list. @@ -272,11 +422,13 @@ func logicalOptimize(ctx context.Context, flag uint64, logic LogicalPlan) (Logic if flag&(1<<uint(i)) == 0 || isLogicalRuleDisabled(rule) { continue } - logic, err = rule.optimize(ctx, logic) + opt.appendBeforeRuleOptimize(i, rule.name(), logic) + logic, err = rule.optimize(ctx, logic, opt) if err != nil { return nil, err } } + opt.recordFinalLogicalPlan(logic) return logic, err } diff --git a/planner/core/partition_pruner_test.go b/planner/core/partition_pruner_test.go index c2cefeeb405e4..ec8e9e92a9556 100644 --- a/planner/core/partition_pruner_test.go +++ b/planner/core/partition_pruner_test.go @@ -93,6 +93,7 @@ func (s *testPartitionPruneSuit) TestListPartitionPruner(c *C) { tk.MustExec("use test_partition") tk.Se.GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeIntOnly tk.MustExec("set @@session.tidb_enable_list_partition = ON") + tk.MustExec(`set @@session.tidb_regard_null_as_point=false`) tk.MustExec("create table t1 (id int, a int, b int ) partition by list ( a ) (partition p0 values in (1,2,3,4,5), partition p1 values in (6,7,8,9,10,null));") tk.MustExec("create table t2 (a int, id int, b int) partition by list (a*3 + b - 2*a - b) (partition p0 values in (1,2,3,4,5), partition p1 values in (6,7,8,9,10,null));") tk.MustExec("create table t3 (b int, id int, a int) partition by list columns (a) (partition p0 values in (1,2,3,4,5), partition p1 values in (6,7,8,9,10,null));") @@ -169,6 +170,7 @@ func (s *testPartitionPruneSuit) TestListColumnsPartitionPruner(c *C) { // tk1 use to test partition table with index. tk1 := testkit.NewTestKit(c, s.store) tk1.MustExec("drop database if exists test_partition_1;") + tk1.MustExec(`set @@session.tidb_regard_null_as_point=false`) tk1.MustExec("create database test_partition_1") tk1.MustExec("use test_partition_1") tk1.MustExec("set @@session.tidb_enable_list_partition = ON") @@ -180,6 +182,7 @@ func (s *testPartitionPruneSuit) TestListColumnsPartitionPruner(c *C) { // tk2 use to compare the result with normal table. tk2 := testkit.NewTestKit(c, s.store) tk2.MustExec("drop database if exists test_partition_2;") + tk2.MustExec(`set @@session.tidb_regard_null_as_point=false`) tk2.MustExec("create database test_partition_2") tk2.MustExec("use test_partition_2") tk2.MustExec("create table t1 (id int, a int, b int)") diff --git a/planner/core/physical_plan_test.go b/planner/core/physical_plan_test.go index e1773a2f98c93..1b3d13c02cc03 100644 --- a/planner/core/physical_plan_test.go +++ b/planner/core/physical_plan_test.go @@ -17,6 +17,7 @@ package core_test import ( "context" "fmt" + "math" . "github.com/pingcap/check" "github.com/pingcap/tidb/domain" @@ -24,6 +25,7 @@ import ( "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser" + "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/planner" @@ -111,6 +113,121 @@ func (s *testPlanSuite) TestDAGPlanBuilderSimpleCase(c *C) { } } +func (s *testPlanSuite) TestAnalyzeBuildSucc(c *C) { + defer testleak.AfterTest(c)() + store, dom, err := newStoreWithBootstrap() + c.Assert(err, IsNil) + defer func() { + dom.Close() + store.Close() + }() + se, err := session.CreateSession4Test(store) + c.Assert(err, IsNil) + _, err = se.Execute(context.Background(), "use test") + c.Assert(err, IsNil) + sctx := se.(sessionctx.Context) + _, err = se.Execute(context.Background(), "create table t(a int)") + c.Assert(err, IsNil) + tests := []struct { + sql string + succ bool + statsVer int + }{ + { + sql: "analyze table t with 0.1 samplerate", + succ: true, + statsVer: 2, + }, + { + sql: "analyze table t with 0.1 samplerate", + succ: false, + statsVer: 1, + }, + { + sql: "analyze table t with 10 samplerate", + succ: false, + statsVer: 2, + }, + { + sql: "analyze table t with 0.1 samplerate, 100000 samples", + succ: false, + statsVer: 2, + }, + { + sql: "analyze table t with 0.1 samplerate, 100000 samples", + succ: false, + statsVer: 1, + }, + } + for i, tt := range tests { + comment := Commentf("The %v-th test failed", i) + _, err := se.Execute(context.Background(), fmt.Sprintf("set @@tidb_analyze_version=%v", tt.statsVer)) + c.Assert(err, IsNil) + + stmt, err := s.ParseOneStmt(tt.sql, "", "") + if tt.succ { + c.Assert(err, IsNil, comment) + } else if err != nil { + continue + } + err = core.Preprocess(se, stmt, core.WithPreprocessorReturn(&core.PreprocessorReturn{InfoSchema: s.is})) + c.Assert(err, IsNil) + _, _, err = planner.Optimize(context.Background(), sctx, stmt, s.is) + if tt.succ { + c.Assert(err, IsNil, comment) + } else { + c.Assert(err, NotNil, comment) + } + } +} + +func (s *testPlanSuite) TestAnalyzeSetRate(c *C) { + defer testleak.AfterTest(c)() + store, dom, err := newStoreWithBootstrap() + c.Assert(err, IsNil) + defer func() { + dom.Close() + store.Close() + }() + se, err := session.CreateSession4Test(store) + c.Assert(err, IsNil) + _, err = se.Execute(context.Background(), "use test") + c.Assert(err, IsNil) + sctx := se.(sessionctx.Context) + _, err = se.Execute(context.Background(), "create table t(a int)") + c.Assert(err, IsNil) + tests := []struct { + sql string + rate float64 + }{ + { + sql: "analyze table t", + rate: -1, + }, + { + sql: "analyze table t with 0.1 samplerate", + rate: 0.1, + }, + { + sql: "analyze table t with 10000 samples", + rate: -1, + }, + } + for i, tt := range tests { + comment := Commentf("The %v-th test failed", i) + c.Assert(err, IsNil) + + stmt, err := s.ParseOneStmt(tt.sql, "", "") + c.Assert(err, IsNil, comment) + err = core.Preprocess(se, stmt, core.WithPreprocessorReturn(&core.PreprocessorReturn{InfoSchema: s.is})) + c.Assert(err, IsNil) + p, _, err := planner.Optimize(context.Background(), sctx, stmt, s.is) + c.Assert(err, IsNil, comment) + ana := p.(*core.Analyze) + c.Assert(math.Float64frombits(ana.Opts[ast.AnalyzeOptSampleRate]), Equals, tt.rate) + } +} + func (s *testPlanSuite) TestDAGPlanBuilderJoin(c *C) { defer testleak.AfterTest(c)() store, dom, err := newStoreWithBootstrap() @@ -1870,3 +1987,32 @@ func (s *testPlanSuite) TestSelectionPartialPushDown(c *C) { tk.MustQuery("explain format='brief' " + ts).Check(testkit.Rows(output[i].Plan...)) } } + +func (s *testPlanSuite) TestIssue28316(c *C) { + var ( + input []string + output []struct { + SQL string + Plan []string + } + ) + s.testData.GetTestCases(c, &input, &output) + store, dom, err := newStoreWithBootstrap() + c.Assert(err, IsNil) + defer func() { + dom.Close() + store.Close() + }() + tk := testkit.NewTestKit(c, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int)") + + for i, ts := range input { + s.testData.OnRecord(func() { + output[i].SQL = ts + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery("explain format='brief'" + ts).Rows()) + }) + tk.MustQuery("explain format='brief' " + ts).Check(testkit.Rows(output[i].Plan...)) + } +} diff --git a/planner/core/physical_plans.go b/planner/core/physical_plans.go index 04f32a96d0959..17e84b6efcf47 100644 --- a/planner/core/physical_plans.go +++ b/planner/core/physical_plans.go @@ -28,7 +28,6 @@ import ( "github.com/pingcap/tidb/planner/property" "github.com/pingcap/tidb/planner/util" "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/table/tables" @@ -69,6 +68,11 @@ var ( _ PhysicalPlan = &PhysicalTableSample{} ) +type tableScanAndPartitionInfo struct { + tableScan *PhysicalTableScan + partitionInfo PartitionInfo +} + // PhysicalTableReader is the table reader in tidb. type PhysicalTableReader struct { physicalSchemaProducer @@ -87,6 +91,8 @@ type PhysicalTableReader struct { // Used by partition table. PartitionInfo PartitionInfo + // Used by MPP, because MPP plan may contain join/union/union all, it is possible that a physical table reader contains more than 1 table scan + PartitionInfos []tableScanAndPartitionInfo } // PartitionInfo indicates partition helper info in physical plan. @@ -548,7 +554,7 @@ func (ts *PhysicalTableScan) ResolveCorrelatedColumns() ([]*ranger.Range, error) } else { var err error pkTP := ts.Table.GetPkColInfo().FieldType - ts.Ranges, err = ranger.BuildTableRange(access, ts.SCtx().GetSessionVars().StmtCtx, &pkTP) + ts.Ranges, err = ranger.BuildTableRange(access, ts.SCtx(), &pkTP) if err != nil { return nil, err } @@ -579,13 +585,13 @@ func ExpandVirtualColumn(columns []*model.ColumnInfo, schema *expression.Schema, for _, baseCol := range baseCols { if !schema.Contains(baseCol) { schema.Columns = append(schema.Columns, baseCol) - copyColumn = append(copyColumn, FindColumnInfoByID(colsInfo, baseCol.ID)) + copyColumn = append(copyColumn, FindColumnInfoByID(colsInfo, baseCol.ID)) // nozero } } } if extraColumn != nil { schema.Columns = append(schema.Columns, extraColumn) - copyColumn = append(copyColumn, extraColumnModel) + copyColumn = append(copyColumn, extraColumnModel) // nozero } return copyColumn } @@ -832,7 +838,7 @@ type PhysicalIndexJoin struct { innerTask task // Ranges stores the IndexRanges when the inner plan is index scan. - Ranges []*ranger.Range + Ranges ranger.MutableRanges // KeyOff2IdxOff maps the offsets in join key to the offsets in the index. KeyOff2IdxOff []int // IdxColLens stores the length of each index column. @@ -1179,6 +1185,8 @@ type PhysicalUnionScan struct { Conditions []expression.Expression HandleCols HandleCols + + CacheTable kv.MemBuffer } // ExtractCorrelatedCols implements PhysicalPlan interface. @@ -1196,11 +1204,11 @@ func (p *PhysicalIndexScan) IsPartition() (bool, int64) { } // IsPointGetByUniqueKey checks whether is a point get by unique key. -func (p *PhysicalIndexScan) IsPointGetByUniqueKey(sc *stmtctx.StatementContext) bool { +func (p *PhysicalIndexScan) IsPointGetByUniqueKey(sctx sessionctx.Context) bool { return len(p.Ranges) == 1 && p.Index.Unique && len(p.Ranges[0].LowVal) == len(p.Index.Columns) && - p.Ranges[0].IsPoint(sc) + p.Ranges[0].IsPointNonNullable(sctx) } // PhysicalSelection represents a filter. @@ -1324,8 +1332,10 @@ const ( type PhysicalShuffleReceiverStub struct { physicalSchemaProducer - // Worker points to `executor.shuffleReceiver`. + // Receiver points to `executor.shuffleReceiver`. Receiver unsafe.Pointer + // DataSource is the PhysicalPlan of the Receiver. + DataSource PhysicalPlan } // CollectPlanStatsVersion uses to collect the statistics version of the plan. diff --git a/planner/core/plan.go b/planner/core/plan.go index 458da3f632590..3515f44e91750 100644 --- a/planner/core/plan.go +++ b/planner/core/plan.go @@ -28,6 +28,7 @@ import ( "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/stringutil" + "github.com/pingcap/tidb/util/tracing" "github.com/pingcap/tipb/go-tipb" ) @@ -305,6 +306,9 @@ type LogicalPlan interface { // canPushToCop check if we might push this plan to a specific store. canPushToCop(store kv.StoreType) bool + + // buildLogicalPlanTrace clone necessary information from LogicalPlan + buildLogicalPlanTrace(p Plan) *tracing.LogicalPlanTrace } // PhysicalPlan is a tree of the physical operators. @@ -377,6 +381,15 @@ func (p *baseLogicalPlan) ExplainInfo() string { return "" } +// buildLogicalPlanTrace implements LogicalPlan +func (p *baseLogicalPlan) buildLogicalPlanTrace(plan Plan) *tracing.LogicalPlanTrace { + planTrace := &tracing.LogicalPlanTrace{ID: p.ID(), TP: p.TP(), ExplainInfo: plan.ExplainInfo()} + for _, child := range p.Children() { + planTrace.Children = append(planTrace.Children, child.buildLogicalPlanTrace(child)) + } + return planTrace +} + type basePhysicalPlan struct { basePlan diff --git a/planner/core/plan_test.go b/planner/core/plan_test.go index 3a49c6da6b128..4437a354b1757 100644 --- a/planner/core/plan_test.go +++ b/planner/core/plan_test.go @@ -20,6 +20,7 @@ import ( "strings" . "github.com/pingcap/check" + "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/model" @@ -593,6 +594,9 @@ func (s *testPlanNormalize) BenchmarkEncodePlan(c *C) { // Close issue 25729 func (s *testPlanNormalize) TestIssue25729(c *C) { + config.UpdateGlobal(func(conf *config.Config) { + conf.Experimental.AllowsExpressionIndex = true + }) tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") tk.MustExec("drop table if exists tt") diff --git a/planner/core/plan_to_pb.go b/planner/core/plan_to_pb.go index d77692869e672..27056a8937c20 100644 --- a/planner/core/plan_to_pb.go +++ b/planner/core/plan_to_pb.go @@ -212,6 +212,18 @@ func checkCoverIndex(idx *model.IndexInfo, ranges []*ranger.Range) bool { if len(rg.LowVal) != len(idx.Columns) { return false } + for _, v := range rg.LowVal { + if v.IsNull() { + // a unique index may have duplicated rows with NULLs, so we cannot set the unique attribute to true when the range has NULL + // please see https://github.com/pingcap/tidb/issues/29650 for more details + return false + } + } + for _, v := range rg.HighVal { + if v.IsNull() { + return false + } + } } return true } @@ -244,12 +256,17 @@ func (e *PhysicalExchangeSender) ToPB(ctx sessionctx.Context, storeType kv.Store } hashCols := make([]expression.Expression, 0, len(e.HashCols)) - types := make([]*tipb.FieldType, 0, len(e.HashCols)) + hashColTypes := make([]*tipb.FieldType, 0, len(e.HashCols)) for _, col := range e.HashCols { hashCols = append(hashCols, col.Col) tp := expression.ToPBFieldType(col.Col.RetType) tp.Collate = col.CollateID - types = append(types, tp) + hashColTypes = append(hashColTypes, tp) + } + allFieldTypes := make([]*tipb.FieldType, 0, len(e.Schema().Columns)) + for _, column := range e.Schema().Columns { + pbType := expression.ToPBFieldType(column.RetType) + allFieldTypes = append(allFieldTypes, pbType) } hashColPb, err := expression.ExpressionsToPBList(ctx.GetSessionVars().StmtCtx, hashCols, ctx.GetClient()) if err != nil { @@ -260,7 +277,8 @@ func (e *PhysicalExchangeSender) ToPB(ctx sessionctx.Context, storeType kv.Store EncodedTaskMeta: encodedTask, PartitionKeys: hashColPb, Child: child, - Types: types, + Types: hashColTypes, + AllFieldTypes: allFieldTypes, } executorID := e.ExplainID().String() return &tipb.Executor{ @@ -411,7 +429,7 @@ func (p *PhysicalHashJoin) ToPB(ctx sessionctx.Context, storeType kv.StoreType) buildFiledTypes := make([]*tipb.FieldType, 0, len(p.EqualConditions)) for _, equalCondition := range p.EqualConditions { retType := equalCondition.RetType.Clone() - chs, coll := equalCondition.CharsetAndCollation(ctx) + chs, coll := equalCondition.CharsetAndCollation() retType.Charset = chs retType.Collate = coll probeFiledTypes = append(probeFiledTypes, expression.ToPBFieldType(retType)) diff --git a/planner/core/plan_to_pb_test.go b/planner/core/plan_to_pb_serial_test.go similarity index 99% rename from planner/core/plan_to_pb_test.go rename to planner/core/plan_to_pb_serial_test.go index dd02258d55fb0..866f104887fef 100644 --- a/planner/core/plan_to_pb_test.go +++ b/planner/core/plan_to_pb_serial_test.go @@ -27,7 +27,6 @@ import ( ) func TestColumnToProto(t *testing.T) { - t.Parallel() // Make sure the Flag is set in tipb.ColumnInfo tp := types.NewFieldType(mysql.TypeLong) tp.Flag = 10 diff --git a/planner/core/planbuilder.go b/planner/core/planbuilder.go index d25538e972e81..b830d26da025d 100644 --- a/planner/core/planbuilder.go +++ b/planner/core/planbuilder.go @@ -19,6 +19,7 @@ import ( "context" "encoding/binary" "fmt" + "math" "strings" "time" @@ -36,6 +37,7 @@ import ( "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/opcode" + "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/planner/property" "github.com/pingcap/tidb/planner/util" "github.com/pingcap/tidb/privilege" @@ -958,7 +960,7 @@ func getPathByIndexName(paths []*util.AccessPath, idxName model.CIStr, tblInfo * return path } } - if isPrimaryIndex(idxName) && (tblInfo.PKIsHandle || tblInfo.IsCommonHandle) { + if isPrimaryIndex(idxName) && tblInfo.HasClusteredIndex() { return tablePath } return nil @@ -1157,7 +1159,7 @@ func getPossibleAccessPaths(ctx sessionctx.Context, tableHints *tableHintInfo, i return available, nil } -func filterPathByIsolationRead(ctx sessionctx.Context, paths []*util.AccessPath, dbName model.CIStr) ([]*util.AccessPath, error) { +func filterPathByIsolationRead(ctx sessionctx.Context, paths []*util.AccessPath, tblName model.CIStr, dbName model.CIStr) ([]*util.AccessPath, error) { // TODO: filter paths with isolation read locations. if dbName.L == mysql.SystemDB { return paths, nil @@ -1180,8 +1182,12 @@ func filterPathByIsolationRead(ctx sessionctx.Context, paths []*util.AccessPath, var err error engineVals, _ := ctx.GetSessionVars().GetSystemVar(variable.TiDBIsolationReadEngines) if len(paths) == 0 { - err = ErrInternal.GenWithStackByArgs(fmt.Sprintf("Can not find access path matching '%v'(value: '%v'). Available values are '%v'.", - variable.TiDBIsolationReadEngines, engineVals, availableEngineStr)) + helpMsg := "" + if engineVals == "tiflash" { + helpMsg = ". Please check tiflash replica or ensure the query is readonly" + } + err = ErrInternal.GenWithStackByArgs(fmt.Sprintf("No access path for table '%s' is found with '%v' = '%v', valid values can be '%s'%s.", tblName.String(), + variable.TiDBIsolationReadEngines, engineVals, availableEngineStr, helpMsg)) } if _, ok := isolationReadEngines[kv.TiFlash]; !ok { ctx.GetSessionVars().RaiseWarningWhenMPPEnforced( @@ -1701,7 +1707,7 @@ func getColsInfo(tn *ast.TableName) (indicesInfo []*model.IndexInfo, colsInfo [] if col.IsGenerated() && !col.GeneratedStored { continue } - if mysql.HasPriKeyFlag(col.Flag) && (tbl.PKIsHandle || tbl.IsCommonHandle) { + if mysql.HasPriKeyFlag(col.Flag) && tbl.HasClusteredIndex() { continue } colsInfo = append(colsInfo, col) @@ -1714,16 +1720,24 @@ func getColsInfo(tn *ast.TableName) (indicesInfo []*model.IndexInfo, colsInfo [] return } -// BuildHandleColsForAnalyze is exported for test. -func BuildHandleColsForAnalyze(ctx sessionctx.Context, tblInfo *model.TableInfo) HandleCols { +// BuildHandleColsForAnalyze returns HandleCols for ANALYZE. +func BuildHandleColsForAnalyze(ctx sessionctx.Context, tblInfo *model.TableInfo, allColumns bool, colsInfo []*model.ColumnInfo) HandleCols { var handleCols HandleCols switch { case tblInfo.PKIsHandle: pkCol := tblInfo.GetPkColInfo() + var index int + if allColumns { + // If all the columns need to be analyzed, we just set index to pkCol.Offset. + index = pkCol.Offset + } else { + // If only a part of the columns need to be analyzed, we need to set index according to colsInfo. + index = getColOffsetForAnalyze(colsInfo, pkCol.ID) + } handleCols = &IntHandleCols{col: &expression.Column{ ID: pkCol.ID, RetType: &pkCol.FieldType, - Index: pkCol.Offset, + Index: index, }} case tblInfo.IsCommonHandle: pkIdx := tables.FindPrimaryIndex(tblInfo) @@ -1731,12 +1745,26 @@ func BuildHandleColsForAnalyze(ctx sessionctx.Context, tblInfo *model.TableInfo) columns := make([]*expression.Column, pkColLen) for i := 0; i < pkColLen; i++ { colInfo := tblInfo.Columns[pkIdx.Columns[i].Offset] + var index int + if allColumns { + // If all the columns need to be analyzed, we just set index to colInfo.Offset. + index = colInfo.Offset + } else { + // If only a part of the columns need to be analyzed, we need to set index according to colsInfo. + index = getColOffsetForAnalyze(colsInfo, colInfo.ID) + } columns[i] = &expression.Column{ ID: colInfo.ID, RetType: &colInfo.FieldType, - Index: colInfo.Offset, + Index: index, } } + // We don't modify IndexColumn.Offset for CommonHandleCols.idxInfo according to colsInfo. There are two reasons. + // The first reason is that we use Column.Index of CommonHandleCols.columns, rather than IndexColumn.Offset, to get + // column value from row samples when calling (*CommonHandleCols).BuildHandleByDatums in (*AnalyzeColumnsExec).buildSamplingStats. + // The second reason is that in (cb *CommonHandleCols).BuildHandleByDatums, tablecodec.TruncateIndexValues(cb.tblInfo, cb.idxInfo, datumBuf) + // is called, which asks that IndexColumn.Offset of cb.idxInfo must be according to cb,tblInfo. + // TODO: find a better way to find handle columns in ANALYZE rather than use Column.Index handleCols = &CommonHandleCols{ tblInfo: tblInfo, idxInfo: pkIdx, @@ -1784,6 +1812,141 @@ func GetPhysicalIDsAndPartitionNames(tblInfo *model.TableInfo, partitionNames [] return ids, names, nil } +// getAnalyzeColumnsInfo returns the columns whose stats need to be collected. +// 1. For `ANALYZE TABLE t PREDICATE COLUMNS`, it returns union of the predicate columns and the columns in index/primary key/extended stats. +// 2. For `ANALYZE TABLE t COLUMNS c1, c2, ..., cn`, it returns union of the specified columns(c1, c2, ..., cn) and the columns in index/primary key/extended stats. +// 3. Otherwise it returns all the columns. +func (b *PlanBuilder) getAnalyzeColumnsInfo(as *ast.AnalyzeTableStmt, tbl *ast.TableName) ([]*model.ColumnInfo, error) { + tblInfo := tbl.TableInfo + if len(as.ColumnNames) == 0 { + return tblInfo.Columns, nil + } + columnIDs := make(map[int64]struct{}, len(tblInfo.Columns)) + for _, colName := range as.ColumnNames { + colInfo := model.FindColumnInfo(tblInfo.Columns, colName.L) + if colInfo == nil { + return nil, ErrAnalyzeMissColumn.GenWithStackByArgs(colName.O, tblInfo.Name.O) + } + columnIDs[colInfo.ID] = struct{}{} + } + missingCols := make(map[int64]struct{}, len(tblInfo.Columns)-len(columnIDs)) + if len(tblInfo.Indices) > 0 { + // add indexed columns + // Some indexed columns are generated columns so we also need to add the columns that make up those generated columns. + columns, _, err := expression.ColumnInfos2ColumnsAndNames(b.ctx, tbl.Schema, tbl.Name, tblInfo.Columns, tblInfo) + if err != nil { + return nil, err + } + virtualExprs := make([]expression.Expression, 0, len(tblInfo.Columns)) + for _, idx := range tblInfo.Indices { + if idx.State != model.StatePublic { + continue + } + for _, idxCol := range idx.Columns { + colInfo := tblInfo.Columns[idxCol.Offset] + if _, ok := columnIDs[colInfo.ID]; !ok { + columnIDs[colInfo.ID] = struct{}{} + missingCols[colInfo.ID] = struct{}{} + } + if expr := columns[idxCol.Offset].VirtualExpr; expr != nil { + virtualExprs = append(virtualExprs, expr) + } + } + } + relatedCols := make([]*expression.Column, 0, len(tblInfo.Columns)) + for len(virtualExprs) > 0 { + relatedCols = expression.ExtractColumnsFromExpressions(relatedCols, virtualExprs, nil) + virtualExprs = virtualExprs[:0] + for _, col := range relatedCols { + if _, ok := columnIDs[col.ID]; !ok { + columnIDs[col.ID] = struct{}{} + missingCols[col.ID] = struct{}{} + } + if col.VirtualExpr != nil { + virtualExprs = append(virtualExprs, col.VirtualExpr) + } + } + relatedCols = relatedCols[:0] + } + } + if tblInfo.PKIsHandle { + pkCol := tblInfo.GetPkColInfo() + if _, ok := columnIDs[pkCol.ID]; !ok { + columnIDs[pkCol.ID] = struct{}{} + missingCols[pkCol.ID] = struct{}{} + } + } + if b.ctx.GetSessionVars().EnableExtendedStats { + // add the columns related to extended stats + // TODO: column_ids read from mysql.stats_extended in optimization phase may be different from that in execution phase((*Handle).BuildExtendedStats) + // if someone inserts data into mysql.stats_extended between the two time points, the new added extended stats may not be computed. + statsHandle := domain.GetDomain(b.ctx).StatsHandle() + extendedStatsColIDs, err := statsHandle.CollectColumnsInExtendedStats(tblInfo.ID) + if err != nil { + return nil, err + } + for _, colID := range extendedStatsColIDs { + if _, ok := columnIDs[colID]; !ok { + columnIDs[colID] = struct{}{} + missingCols[colID] = struct{}{} + } + } + } + if len(missingCols) > 0 { + missingNames := make([]string, 0, len(missingCols)) + for _, col := range tblInfo.Columns { + if _, ok := missingCols[col.ID]; ok { + missingNames = append(missingNames, col.Name.O) + } + } + b.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("Columns %s are missing in ANALYZE but their stats are needed for calculating stats for indexes/primary key/extended stats.", strings.Join(missingNames, ","))) + } + columnsInfo := make([]*model.ColumnInfo, 0, len(columnIDs)) + for _, col := range tblInfo.Columns { + if _, ok := columnIDs[col.ID]; ok { + columnsInfo = append(columnsInfo, col) + } + } + return columnsInfo, nil +} + +func getColOffsetForAnalyze(colsInfo []*model.ColumnInfo, colID int64) int { + for i, col := range colsInfo { + if colID == col.ID { + return i + } + } + return -1 +} + +// getModifiedIndexesInfoForAnalyze returns indexesInfo for ANALYZE. +// 1. If allColumns is true, we just return public indexes in tblInfo.Indices. +// 2. If allColumns is false, colsInfo indicate the columns whose stats need to be collected. colsInfo is a subset of tbl.Columns. For each public index +// in tblInfo.Indices, index.Columns[i].Offset is set according to tblInfo.Columns. Since we decode row samples according to colsInfo rather than tbl.Columns +// in the execution phase of ANALYZE, we need to modify index.Columns[i].Offset according to colInfos. +// TODO: find a better way to find indexed columns in ANALYZE rather than use IndexColumn.Offset +func getModifiedIndexesInfoForAnalyze(tblInfo *model.TableInfo, allColumns bool, colsInfo []*model.ColumnInfo) []*model.IndexInfo { + idxsInfo := make([]*model.IndexInfo, 0, len(tblInfo.Indices)) + for _, originIdx := range tblInfo.Indices { + if originIdx.State != model.StatePublic { + continue + } + if allColumns { + // If all the columns need to be analyzed, we don't need to modify IndexColumn.Offset. + idxsInfo = append(idxsInfo, originIdx) + continue + } + // If only a part of the columns need to be analyzed, we need to set IndexColumn.Offset according to colsInfo. + idx := originIdx.Clone() + for i, idxCol := range idx.Columns { + colID := tblInfo.Columns[idxCol.Offset].ID + idx.Columns[i].Offset = getColOffsetForAnalyze(colsInfo, colID) + } + idxsInfo = append(idxsInfo, idx) + } + return idxsInfo +} + func (b *PlanBuilder) buildAnalyzeFullSamplingTask( as *ast.AnalyzeTableStmt, taskSlice []AnalyzeColumnsTask, @@ -1791,17 +1954,17 @@ func (b *PlanBuilder) buildAnalyzeFullSamplingTask( names []string, tbl *ast.TableName, version int, -) []AnalyzeColumnsTask { - idxInfos := make([]*model.IndexInfo, 0, len(tbl.TableInfo.Indices)) - for _, idx := range tbl.TableInfo.Indices { - if idx.State != model.StatePublic { - continue - } - idxInfos = append(idxInfos, idx) - } +) ([]AnalyzeColumnsTask, error) { if as.Incremental { b.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("The version 2 stats would ignore the INCREMENTAL keyword and do full sampling")) } + colsInfo, err := b.getAnalyzeColumnsInfo(as, tbl) + if err != nil { + return nil, err + } + allColumns := len(tbl.TableInfo.Columns) == len(colsInfo) + indexes := getModifiedIndexesInfoForAnalyze(tbl.TableInfo, allColumns, colsInfo) + handleCols := BuildHandleColsForAnalyze(b.ctx, tbl.TableInfo, allColumns, colsInfo) for i, id := range physicalIDs { if id == tbl.TableInfo.ID { id = -1 @@ -1815,11 +1978,11 @@ func (b *PlanBuilder) buildAnalyzeFullSamplingTask( StatsVersion: version, } newTask := AnalyzeColumnsTask{ - HandleCols: BuildHandleColsForAnalyze(b.ctx, tbl.TableInfo), - ColsInfo: tbl.TableInfo.Columns, + HandleCols: handleCols, + ColsInfo: colsInfo, AnalyzeInfo: info, TblInfo: tbl.TableInfo, - Indexes: idxInfos, + Indexes: indexes, } if newTask.HandleCols == nil { extraCol := model.NewExtraHandleColInfo() @@ -1829,7 +1992,7 @@ func (b *PlanBuilder) buildAnalyzeFullSamplingTask( } taskSlice = append(taskSlice, newTask) } - return taskSlice + return taskSlice, nil } func (b *PlanBuilder) buildAnalyzeTable(as *ast.AnalyzeTableStmt, opts map[ast.AnalyzeOptionType]uint64, version int) (Plan, error) { @@ -1859,9 +2022,15 @@ func (b *PlanBuilder) buildAnalyzeTable(as *ast.AnalyzeTableStmt, opts map[ast.A } } if version == statistics.Version2 { - p.ColTasks = b.buildAnalyzeFullSamplingTask(as, p.ColTasks, physicalIDs, names, tbl, version) + p.ColTasks, err = b.buildAnalyzeFullSamplingTask(as, p.ColTasks, physicalIDs, names, tbl, version) + if err != nil { + return nil, err + } continue } + if len(as.ColumnNames) > 0 { + return nil, errors.Errorf("Only the analyze version 2 supports analyzing the specified columns") + } for _, idx := range idxInfo { // For prefix common handle. We don't use analyze mixed to handle it with columns. Because the full value // is read by coprocessor, the prefix index would get wrong stats in this case. @@ -1888,7 +2057,7 @@ func (b *PlanBuilder) buildAnalyzeTable(as *ast.AnalyzeTableStmt, opts map[ast.A }) } } - handleCols := BuildHandleColsForAnalyze(b.ctx, tbl.TableInfo) + handleCols := BuildHandleColsForAnalyze(b.ctx, tbl.TableInfo, true, nil) if len(colInfo) > 0 || handleCols != nil { for i, id := range physicalIDs { if id == tbl.TableInfo.ID { @@ -1939,7 +2108,7 @@ func (b *PlanBuilder) buildAnalyzeIndex(as *ast.AnalyzeTableStmt, opts map[ast.A } for _, idxName := range as.IndexNames { if isPrimaryIndex(idxName) { - handleCols := BuildHandleColsForAnalyze(b.ctx, tblInfo) + handleCols := BuildHandleColsForAnalyze(b.ctx, tblInfo, true, nil) // Fast analyze use analyze column to solve int handle. if handleCols != nil && handleCols.IsInt() && b.ctx.GetSessionVars().EnableFastAnalyze { for i, id := range physicalIDs { @@ -2020,7 +2189,7 @@ func (b *PlanBuilder) buildAnalyzeAllIndex(as *ast.AnalyzeTableStmt, opts map[as } } } - handleCols := BuildHandleColsForAnalyze(b.ctx, tblInfo) + handleCols := BuildHandleColsForAnalyze(b.ctx, tblInfo, true, nil) if handleCols != nil { for i, id := range physicalIDs { if id == tblInfo.ID { @@ -2049,6 +2218,7 @@ var analyzeOptionLimit = map[ast.AnalyzeOptionType]uint64{ ast.AnalyzeOptCMSketchWidth: CMSketchSizeLimit, ast.AnalyzeOptCMSketchDepth: CMSketchSizeLimit, ast.AnalyzeOptNumSamples: 500000, + ast.AnalyzeOptSampleRate: math.Float64bits(1), } var analyzeOptionDefault = map[ast.AnalyzeOptionType]uint64{ @@ -2057,6 +2227,7 @@ var analyzeOptionDefault = map[ast.AnalyzeOptionType]uint64{ ast.AnalyzeOptCMSketchWidth: 2048, ast.AnalyzeOptCMSketchDepth: 5, ast.AnalyzeOptNumSamples: 10000, + ast.AnalyzeOptSampleRate: math.Float64bits(0), } var analyzeOptionDefaultV2 = map[ast.AnalyzeOptionType]uint64{ @@ -2064,7 +2235,8 @@ var analyzeOptionDefaultV2 = map[ast.AnalyzeOptionType]uint64{ ast.AnalyzeOptNumTopN: 500, ast.AnalyzeOptCMSketchWidth: 2048, ast.AnalyzeOptCMSketchDepth: 5, - ast.AnalyzeOptNumSamples: 100000, + ast.AnalyzeOptNumSamples: 0, + ast.AnalyzeOptSampleRate: math.Float64bits(-1), } func handleAnalyzeOptions(opts []ast.AnalyzeOpt, statsVer int) (map[ast.AnalyzeOptionType]uint64, error) { @@ -2078,17 +2250,44 @@ func handleAnalyzeOptions(opts []ast.AnalyzeOpt, statsVer int) (map[ast.AnalyzeO optMap[key] = val } } + sampleNum, sampleRate := uint64(0), 0.0 for _, opt := range opts { - if opt.Type == ast.AnalyzeOptNumTopN { - if opt.Value > analyzeOptionLimit[opt.Type] { - return nil, errors.Errorf("value of analyze option %s should not larger than %d", ast.AnalyzeOptionString[opt.Type], analyzeOptionLimit[opt.Type]) + datumValue := opt.Value.(*driver.ValueExpr).Datum + switch opt.Type { + case ast.AnalyzeOptNumTopN: + v := datumValue.GetUint64() + if v > analyzeOptionLimit[opt.Type] { + return nil, errors.Errorf("Value of analyze option %s should not be larger than %d", ast.AnalyzeOptionString[opt.Type], analyzeOptionLimit[opt.Type]) } - } else { - if opt.Value == 0 || opt.Value > analyzeOptionLimit[opt.Type] { - return nil, errors.Errorf("value of analyze option %s should be positive and not larger than %d", ast.AnalyzeOptionString[opt.Type], analyzeOptionLimit[opt.Type]) + optMap[opt.Type] = v + case ast.AnalyzeOptSampleRate: + // Only Int/Float/Decimal is accepted, so pass nil here is safe. + fVal, err := datumValue.ToFloat64(nil) + if err != nil { + return nil, err + } + if fVal > 0 && statsVer == statistics.Version1 { + return nil, errors.Errorf("Version 1's statistics doesn't support the SAMPLERATE option, please set tidb_analyze_version to 2") + } + limit := math.Float64frombits(analyzeOptionLimit[opt.Type]) + if fVal <= 0 || fVal > limit { + return nil, errors.Errorf("Value of analyze option %s should not larger than %f, and should be greater than 0", ast.AnalyzeOptionString[opt.Type], limit) + } + sampleRate = fVal + optMap[opt.Type] = math.Float64bits(fVal) + default: + v := datumValue.GetUint64() + if opt.Type == ast.AnalyzeOptNumSamples { + sampleNum = v } + if v == 0 || v > analyzeOptionLimit[opt.Type] { + return nil, errors.Errorf("Value of analyze option %s should be positive and not larger than %d", ast.AnalyzeOptionString[opt.Type], analyzeOptionLimit[opt.Type]) + } + optMap[opt.Type] = v } - optMap[opt.Type] = opt.Value + } + if sampleNum > 0 && sampleRate > 0 { + return nil, errors.Errorf("You can only either set the value of the sample num or set the value of the sample rate. Don't set both of them.") } if optMap[ast.AnalyzeOptCMSketchWidth]*optMap[ast.AnalyzeOptCMSketchDepth] > CMSketchSizeLimit { return nil, errors.Errorf("cm sketch size(depth * width) should not larger than %d", CMSketchSizeLimit) @@ -2390,7 +2589,7 @@ func (b *PlanBuilder) buildShow(ctx context.Context, show *ast.ShowStmt) (Plan, p.setSchemaAndNames(buildShowNextRowID()) b.visitInfo = appendVisitInfo(b.visitInfo, mysql.SelectPriv, show.Table.Schema.L, show.Table.Name.L, "", ErrPrivilegeCheckFail) return p, nil - case ast.ShowStatsBuckets, ast.ShowStatsHistograms, ast.ShowStatsMeta, ast.ShowStatsExtended, ast.ShowStatsHealthy, ast.ShowStatsTopN, ast.ShowColumnStatsUsage: + case ast.ShowStatsBuckets, ast.ShowStatsHistograms, ast.ShowStatsMeta, ast.ShowStatsExtended, ast.ShowStatsHealthy, ast.ShowStatsTopN, ast.ShowHistogramsInFlight, ast.ShowColumnStatsUsage: user := b.ctx.GetSessionVars().User var err error if user != nil { @@ -2479,10 +2678,6 @@ func (b *PlanBuilder) buildSimple(ctx context.Context, node ast.StmtNode) (Plan, } case *ast.BRIEStmt: p.setSchemaAndNames(buildBRIESchema()) - if sem.IsEnabled() && strings.EqualFold(raw.Storage[:8], "local://") { - // Local storage is not permitted to be local when SEM is enabled. - return nil, ErrNotSupportedWithSem.GenWithStackByArgs("local://") - } if raw.Kind == ast.BRIEKindRestore { err := ErrSpecificAccessDenied.GenWithStackByArgs("SUPER or RESTORE_ADMIN") b.visitInfo = appendDynamicVisitInfo(b.visitInfo, "RESTORE_ADMIN", false, err) @@ -2948,13 +3143,18 @@ func (p *Insert) resolveOnDuplicate(onDup []*ast.Assignment, tblInfo *model.Tabl expr, err := yield(assign.Expr) if err != nil { - return nil, err + // Throw other error as soon as possible except ErrSubqueryMoreThan1Row which need duplicate in insert in triggered. + // Refer to https://github.com/pingcap/tidb/issues/29260 for more information. + if terr, ok := errors.Cause(err).(*terror.Error); !(ok && ErrSubqueryMoreThan1Row.Code() == terr.Code()) { + return nil, err + } } p.OnDuplicate = append(p.OnDuplicate, &expression.Assignment{ Col: p.tableSchema.Columns[idx], ColName: p.tableColNames[idx].ColName, Expr: expr, + LazyErr: err, }) } return onDupColSet, nil @@ -3678,8 +3878,15 @@ func (b *PlanBuilder) buildDDL(ctx context.Context, node ast.DDLNode) (Plan, err } } if b.ctx.GetSessionVars().User != nil { - authErr = ErrTableaccessDenied.GenWithStackByArgs("CREATE", b.ctx.GetSessionVars().User.AuthUsername, - b.ctx.GetSessionVars().User.AuthHostname, v.Table.Name.L) + // This is tricky here: we always need the visitInfo because it's not only used in privilege checks, and we + // must pass the table name. However, the privilege check is towards the database. We'll deal with it later. + if v.TemporaryKeyword == ast.TemporaryLocal { + authErr = ErrDBaccessDenied.GenWithStackByArgs(b.ctx.GetSessionVars().User.AuthUsername, + b.ctx.GetSessionVars().User.AuthHostname, v.Table.Schema.L) + } else { + authErr = ErrTableaccessDenied.GenWithStackByArgs("CREATE", b.ctx.GetSessionVars().User.AuthUsername, + b.ctx.GetSessionVars().User.AuthHostname, v.Table.Name.L) + } } b.visitInfo = appendVisitInfo(b.visitInfo, mysql.CreatePriv, v.Table.Schema.L, v.Table.Name.L, "", authErr) @@ -3700,6 +3907,11 @@ func (b *PlanBuilder) buildDDL(ctx context.Context, node ast.DDLNode) (Plan, err b.capFlag &= ^renameView b.isCreateView = false }() + + if stmt := findStmtAsViewSchema(v); stmt != nil { + stmt.AsViewSchema = true + } + plan, err := b.Build(ctx, v.Select) if err != nil { return nil, err @@ -3746,7 +3958,7 @@ func (b *PlanBuilder) buildDDL(ctx context.Context, node ast.DDLNode) (Plan, err "", "", authErr) case *ast.DropIndexStmt: if b.ctx.GetSessionVars().User != nil { - authErr = ErrTableaccessDenied.GenWithStackByArgs("INDEx", b.ctx.GetSessionVars().User.AuthUsername, + authErr = ErrTableaccessDenied.GenWithStackByArgs("INDEX", b.ctx.GetSessionVars().User.AuthUsername, b.ctx.GetSessionVars().User.AuthHostname, v.Table.Name.L) } b.visitInfo = appendVisitInfo(b.visitInfo, mysql.IndexPriv, v.Table.Schema.L, @@ -3830,13 +4042,39 @@ const ( TraceFormatJSON = "json" // TraceFormatLog indicates log tracing format. TraceFormatLog = "log" + + // TracePlanTargetEstimation indicates CE trace target for optimizer trace. + TracePlanTargetEstimation = "estimation" ) // buildTrace builds a trace plan. Inside this method, it first optimize the // underlying query and then constructs a schema, which will be used to constructs // rows result. func (b *PlanBuilder) buildTrace(trace *ast.TraceStmt) (Plan, error) { - p := &Trace{StmtNode: trace.Stmt, Format: trace.Format} + p := &Trace{ + StmtNode: trace.Stmt, + Format: trace.Format, + OptimizerTrace: trace.TracePlan, + OptimizerTraceTarget: trace.TracePlanTarget, + } + // TODO: forbid trace plan if the statement isn't select read-only statement + if trace.TracePlan { + if trace.TracePlanTarget != "" && trace.TracePlanTarget != TracePlanTargetEstimation { + return nil, errors.New("trace plan target should only be 'estimation'") + } + if trace.TracePlanTarget == TracePlanTargetEstimation { + schema := newColumnsWithNames(1) + schema.Append(buildColumnWithName("", "CE_trace", mysql.TypeVarchar, mysql.MaxBlobWidth)) + p.SetSchema(schema.col2Schema()) + p.names = schema.names + } else { + schema := newColumnsWithNames(1) + schema.Append(buildColumnWithName("", "Dump_link", mysql.TypeVarchar, 128)) + p.SetSchema(schema.col2Schema()) + p.names = schema.names + } + return p, nil + } switch trace.Format { case TraceFormatRow: schema := newColumnsWithNames(3) @@ -4114,6 +4352,9 @@ func buildShowSchema(s *ast.ShowStmt, isView bool, isSequence bool) (schema *exp case ast.ShowStatsHealthy: names = []string{"Db_name", "Table_name", "Partition_name", "Healthy"} ftypes = []byte{mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeLonglong} + case ast.ShowHistogramsInFlight: + names = []string{"HistogramsInFlight"} + ftypes = []byte{mysql.TypeLonglong} case ast.ShowColumnStatsUsage: names = []string{"Db_name", "Table_name", "Partition_name", "Column_name", "Last_used_at", "Last_analyzed_at"} ftypes = []byte{mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeDatetime, mysql.TypeDatetime} @@ -4142,8 +4383,8 @@ func buildShowSchema(s *ast.ShowStmt, isView bool, isSequence bool) (schema *exp names = []string{"Key", "Values"} ftypes = []byte{mysql.TypeVarchar, mysql.TypeJSON} case ast.ShowPlacement, ast.ShowPlacementForDatabase, ast.ShowPlacementForTable, ast.ShowPlacementForPartition: - names = []string{"Target", "Placement"} - ftypes = []byte{mysql.TypeVarchar, mysql.TypeVarchar} + names = []string{"Target", "Placement", "Scheduling_State"} + ftypes = []byte{mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar} } schema = expression.NewSchema(make([]*expression.Column, 0, len(names))...) @@ -4166,7 +4407,11 @@ func buildShowSchema(s *ast.ShowStmt, isView bool, isSequence bool) (schema *exp } func (b *PlanBuilder) buildPlanReplayer(pc *ast.PlanReplayerStmt) Plan { - p := &PlanReplayerSingle{ExecStmt: pc.Stmt, Analyze: pc.Analyze, Load: pc.Load, File: pc.File} + p := &PlanReplayer{ExecStmt: pc.Stmt, Analyze: pc.Analyze, Load: pc.Load, File: pc.File} + schema := newColumnsWithNames(1) + schema.Append(buildColumnWithName("", "File_token", mysql.TypeVarchar, 128)) + p.SetSchema(schema.col2Schema()) + p.names = schema.names return p } @@ -4191,3 +4436,18 @@ func adjustOverlongViewColname(plan LogicalPlan) { } } } + +// findStmtAsViewSchema finds the first SelectStmt as the schema for the view +func findStmtAsViewSchema(stmt ast.Node) *ast.SelectStmt { + switch x := stmt.(type) { + case *ast.CreateViewStmt: + return findStmtAsViewSchema(x.Select) + case *ast.SetOprStmt: + return findStmtAsViewSchema(x.SelectList) + case *ast.SetOprSelectList: + return findStmtAsViewSchema(x.Selects[0]) + case *ast.SelectStmt: + return x + } + return nil +} diff --git a/planner/core/point_get_plan.go b/planner/core/point_get_plan.go index c9beca4d054ec..05ecb5c18eb41 100644 --- a/planner/core/point_get_plan.go +++ b/planner/core/point_get_plan.go @@ -40,6 +40,7 @@ import ( "github.com/pingcap/tidb/types" driver "github.com/pingcap/tidb/types/parser_driver" tidbutil "github.com/pingcap/tidb/util" + "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/math" "github.com/pingcap/tidb/util/plancodec" @@ -556,6 +557,7 @@ func newBatchPointGetPlan( handleCol *model.ColumnInfo, tbl *model.TableInfo, schema *expression.Schema, names []*types.FieldName, whereColNames []string, indexHints []*ast.IndexHint, ) *BatchPointGetPlan { + stmtCtx := ctx.GetSessionVars().StmtCtx statsInfo := &property.StatsInfo{RowCount: float64(len(patternInExpr.List))} var partitionExpr *tables.PartitionExpr if tbl.GetPartitionInfo() != nil { @@ -593,16 +595,8 @@ func newBatchPointGetPlan( if d.IsNull() { return nil } - if !checkCanConvertInPointGet(handleCol, d) { - return nil - } - intDatum, err := d.ConvertTo(ctx.GetSessionVars().StmtCtx, &handleCol.FieldType) - if err != nil { - return nil - } - // The converted result must be same as original datum - cmp, err := intDatum.CompareDatum(ctx.GetSessionVars().StmtCtx, &d) - if err != nil || cmp != 0 { + intDatum := getPointGetValue(stmtCtx, handleCol, &d) + if intDatum == nil { return nil } handles[i] = kv.IntHandle(intDatum.GetInt64()) @@ -686,12 +680,14 @@ func newBatchPointGetPlan( permIndex := permutations[index] switch innerX := inner.(type) { case *driver.ValueExpr: - if !checkCanConvertInPointGet(colInfos[index], innerX.Datum) { + dval := getPointGetValue(stmtCtx, colInfos[index], &innerX.Datum) + if dval == nil { return nil } values[permIndex] = innerX.Datum case *driver.ParamMarkerExpr: - if !checkCanConvertInPointGet(colInfos[index], innerX.Datum) { + dval := getPointGetValue(stmtCtx, colInfos[index], &innerX.Datum) + if dval == nil { return nil } values[permIndex] = innerX.Datum @@ -706,18 +702,20 @@ func newBatchPointGetPlan( if len(whereColNames) != 1 { return nil } - if !checkCanConvertInPointGet(colInfos[0], x.Datum) { + dval := getPointGetValue(stmtCtx, colInfos[0], &x.Datum) + if dval == nil { return nil } - values = []types.Datum{x.Datum} + values = []types.Datum{*dval} case *driver.ParamMarkerExpr: if len(whereColNames) != 1 { return nil } - if !checkCanConvertInPointGet(colInfos[0], x.Datum) { + dval := getPointGetValue(stmtCtx, colInfos[0], &x.Datum) + if dval == nil { return nil } - values = []types.Datum{x.Datum} + values = []types.Datum{*dval} valuesParams = []*driver.ParamMarkerExpr{x} default: return nil @@ -1216,8 +1214,7 @@ func getNameValuePairs(stmtCtx *stmtctx.StatementContext, tbl *model.TableInfo, } } // The converted result must be same as original datum. - // Compare them based on the dVal's type. - cmp, err := dVal.CompareDatum(stmtCtx, &d) + cmp, err := dVal.Compare(stmtCtx, &d, collate.GetCollator(col.Collate)) if err != nil { return nil, false } else if cmp != 0 { @@ -1229,6 +1226,22 @@ func getNameValuePairs(stmtCtx *stmtctx.StatementContext, tbl *model.TableInfo, return nil, false } +func getPointGetValue(stmtCtx *stmtctx.StatementContext, col *model.ColumnInfo, d *types.Datum) *types.Datum { + if !checkCanConvertInPointGet(col, *d) { + return nil + } + dVal, err := d.ConvertTo(stmtCtx, &col.FieldType) + if err != nil { + return nil + } + // The converted result must be same as original datum. + cmp, err := dVal.Compare(stmtCtx, d, collate.GetCollator(col.Collate)) + if err != nil || cmp != 0 { + return nil + } + return &dVal +} + func checkCanConvertInPointGet(col *model.ColumnInfo, d types.Datum) bool { kind := d.Kind() switch col.FieldType.EvalType() { diff --git a/planner/core/point_get_plan_test.go b/planner/core/point_get_plan_test.go index 9d426ed719cfc..300370b60dee6 100644 --- a/planner/core/point_get_plan_test.go +++ b/planner/core/point_get_plan_test.go @@ -899,6 +899,36 @@ func (s *testPointGetSuite) TestIssue18042(c *C) { tk.MustExec("drop table t") } +func (s *testPointGetSuite) TestIssue26638(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 float, unique index uidx(a));") + tk.MustExec("insert into t values(9.46347e37), (1.1);") + // If we do not define the precision for the float type. We can not use the equal/ in conditions to find the result. We can only use like to find the result. There is no such restriction for the double type. + tk.MustQuery("explain format='brief' select * from t where a = 9.46347e37;").Check(testkit.Rows("TableDual 0.00 root rows:0")) + tk.MustQuery("explain format='brief' select * from t where a in (-1.56018e38, -1.96716e38, 9.46347e37);").Check(testkit.Rows("TableDual 0.00 root rows:0")) + tk.MustQuery("explain format='brief' select * from t where a in (1.1, 9.46347e37);").Check(testkit.Rows("TableDual 0.00 root rows:0")) + tk.MustExec("prepare stmt from 'select * from t where a in (?, ?, ?);';") + tk.MustExec("prepare stmt1 from 'select * from t where a = ?;';") + tk.MustExec("prepare stmt2 from 'select * from t where a in (?, ?);';") + tk.MustExec("set @a=-1.56018e38, @b=-1.96716e38, @c=9.46347e37, @d=1.1, @e=0, @f=-1, @g=1, @h=2, @i=-1.1;") + tk.MustQuery("execute stmt using @a,@b,@c;").Check(testkit.Rows()) + tk.MustQuery("execute stmt1 using @c;").Check(testkit.Rows()) + tk.MustQuery("execute stmt2 using @c, @d;").Check(testkit.Rows()) + tk.MustExec("drop table if exists t2;") + tk.MustExec("create table t2(a float, b float, c float, primary key(a, b, c));") + tk.MustExec("insert into t2 values(-1, 0, 1), (-1.1, 0, 1.1), (-1.56018e38, -1.96716e38, 9.46347e37), (0, 1, 2);") + tk.MustQuery("explain format='brief' select * from t2 where (a, b, c) in ((-1.1, 0, 1.1), (-1.56018e38, -1.96716e38, 9.46347e37));").Check(testkit.Rows("TableDual 0.00 root rows:0")) + tk.MustQuery("select * from t2 where (a, b, c) in ((-1.1, 0, 1.1), (-1.56018e38, -1.96716e38, 9.46347e37), (-1, 0, 1));").Check(testkit.Rows("-1 0 1")) + tk.MustQuery("select * from t2 where (a, b, c) in ((-1.1, 0, 1.1), (-1.56018e38, -1.96716e38, 9.46347e37), (0, 1, 2));").Check(testkit.Rows("0 1 2")) + tk.MustExec("prepare stmt3 from 'select * from t2 where (a, b, c) in ((?, ?, ?), (?, ?, ?));';") + tk.MustExec("prepare stmt4 from 'select * from t2 where (a, b, c) in ((?, ?, ?), (?, ?, ?), (?, ?, ?));';") + tk.MustQuery("execute stmt3 using @i,@e,@d,@a,@b,@c;").Check(testkit.Rows()) + tk.MustQuery("execute stmt4 using @i,@e,@d,@a,@b,@c,@f,@e,@g;").Check(testkit.Rows("-1 0 1")) + tk.MustQuery("execute stmt4 using @i,@e,@d,@a,@b,@c,@e,@g,@h;").Check(testkit.Rows("0 1 2")) +} + func (s *testPointGetSuite) TestIssue23511(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") diff --git a/planner/core/prepare_test.go b/planner/core/prepare_test.go index c663e5b7823a7..d633896e7b718 100644 --- a/planner/core/prepare_test.go +++ b/planner/core/prepare_test.go @@ -167,6 +167,207 @@ func (s *testPrepareSerialSuite) TestPrepareCacheIndexScan(c *C) { tk.MustQuery("execute stmt1 using @a, @b").Check(testkit.Rows("1 3", "1 3")) } +// dtype: tinyint, unsigned, float, decimal, year +// rtype: null, valid, out-of-range, invalid, str, exists +func randValue(tk *testkit.TestKit, tbl, col, dtype, rtype string) string { + if rtype == "" { + rtypes := []string{"null", "valid", "out-of-range", "invalid", "str", "exists"} + rtype = rtypes[rand.Intn(len(rtypes))] + } + if rtype == "null" { + return "null" + } + if rtype == "exists" { + res := tk.MustQuery(fmt.Sprintf("select %v from %v limit 1", col, tbl)).Rows()[0][0].(string) + if res == "<nil>" { + res = "null" + } + return res + } + switch dtype { + case "tinyint": + switch rtype { + case "valid": + return fmt.Sprintf("%v", -128+rand.Intn(256)) + case "out-of-range": + return fmt.Sprintf("%v", 128+rand.Intn(1024)) + case "invalid": + return "'invalid-tinyint'" + case "str": + return fmt.Sprintf("'%v'", -128+rand.Intn(256)) + } + case "unsigned": + switch rtype { + case "valid": + return fmt.Sprintf("%v", rand.Intn(4294967295)) + case "out-of-range": + return fmt.Sprintf("-%v", rand.Intn(4294967295)) + case "invalid": + return "'invalid-unsigned-int'" + case "str": + return fmt.Sprintf("'%v'", rand.Intn(4294967295)) + } + case "float": + switch rtype { + case "valid": + return fmt.Sprintf("%v%.4fE%v", []string{"+", "-"}[rand.Intn(2)], rand.Float32(), rand.Intn(38)) + case "out-of-range": + return fmt.Sprintf("%v%.4fE%v", []string{"+", "-"}[rand.Intn(2)], rand.Float32(), rand.Intn(100)+38) + case "invalid": + return "'invalid-float'" + case "str": + return fmt.Sprintf("'%v%.4fE%v'", []string{"+", "-"}[rand.Intn(2)], rand.Float32(), rand.Intn(38)) + } + case "decimal": // (10,2) + switch rtype { + case "valid": + return fmt.Sprintf("%v%v.%v", []string{"+", "-"}[rand.Intn(2)], rand.Intn(99999999), rand.Intn(100)) + case "out-of-range": + switch rand.Intn(2) { + case 0: + return fmt.Sprintf("%v%v.%v", []string{"+", "-"}[rand.Intn(2)], rand.Intn(99999999), rand.Intn(100000)+100000) + case 1: + return fmt.Sprintf("%v%v.%v", []string{"+", "-"}[rand.Intn(2)], rand.Intn(99999999)+99999999+1, rand.Intn(100)) + } + case "invalid": + return "'invalid-decimal'" + case "str": + return fmt.Sprintf("'%v%v.%v'", []string{"+", "-"}[rand.Intn(2)], rand.Intn(99999999), rand.Intn(100)) + } + case "year": + switch rtype { + case "valid": + return fmt.Sprintf("%v", 1901+rand.Intn(2155-1901)) + case "out-of-range": + return fmt.Sprintf("%v", 2156+rand.Intn(2155-1901)) + case "invalid": + return "'invalid-year'" + case "str": + return fmt.Sprintf("'%v'", 1901+rand.Intn(2155-1901)) + } + } + return "'invalid-type-" + dtype + "'" +} + +func (s *testPrepareSerialSuite) TestPrepareCacheChangingParamType(c *C) { + defer testleak.AfterTest(c)() + store, dom, err := newStoreWithBootstrap() + c.Assert(err, IsNil) + tk := testkit.NewTestKit(c, store) + orgEnable := core.PreparedPlanCacheEnabled() + defer func() { + dom.Close() + err = store.Close() + c.Assert(err, IsNil) + core.SetPreparedPlanCache(orgEnable) + }() + core.SetPreparedPlanCache(true) + tk.Se, err = session.CreateSession4TestWithOpt(store, &session.Opt{ + PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), + }) + c.Assert(err, IsNil) + + tk.MustExec(`use test`) + tk.MustExec(`drop table if exists t_tinyint, t_unsigned, t_float, t_decimal, t_year`) + tk.MustExec(`create table t_tinyint (a tinyint, b tinyint, key(a))`) + tk.MustExec(`create table t_unsigned (a int unsigned, b int unsigned, key(a))`) + tk.MustExec(`create table t_float(a float, b float, key(a))`) + tk.MustExec(`create table t_decimal(a decimal(10,2), b decimal(10,2), key(a))`) + tk.MustExec(`create table t_year(a year, b year, key(a))`) + for _, dtype := range []string{"tinyint", "unsigned", "float", "decimal", "year"} { + tbl := "t_" + dtype + for i := 0; i < 10; i++ { + tk.MustExec(fmt.Sprintf("insert into %v values (%v, %v)", tbl, randValue(nil, "", "", dtype, "valid"), randValue(nil, "", "", dtype, "valid"))) + } + tk.MustExec(fmt.Sprintf("insert into %v values (null, null)", tbl)) + tk.MustExec(fmt.Sprintf("insert into %v values (%v, null)", tbl, randValue(nil, "", "", dtype, "valid"))) + tk.MustExec(fmt.Sprintf("insert into %v values (null, %v)", tbl, randValue(nil, "", "", dtype, "valid"))) + + for round := 0; round < 10; round++ { + tk.MustExec(fmt.Sprintf(`prepare s1 from 'select * from %v where a=?'`, tbl)) + tk.MustExec(fmt.Sprintf(`prepare s2 from 'select * from %v where b=?'`, tbl)) + tk.MustExec(fmt.Sprintf(`prepare s3 from 'select * from %v where a in (?, ?, ?)'`, tbl)) + tk.MustExec(fmt.Sprintf(`prepare s4 from 'select * from %v where b in (?, ?, ?)'`, tbl)) + tk.MustExec(fmt.Sprintf(`prepare s5 from 'select * from %v where a>?'`, tbl)) + tk.MustExec(fmt.Sprintf(`prepare s6 from 'select * from %v where b>?'`, tbl)) + tk.MustExec(fmt.Sprintf(`prepare s7 from 'select * from %v where a>? and b>?'`, tbl)) + + for query := 0; query < 10; query++ { + a1, a2, a3 := randValue(tk, tbl, "a", dtype, ""), randValue(tk, tbl, "a", dtype, ""), randValue(tk, tbl, "a", dtype, "") + b1, b2, b3 := randValue(tk, tbl, "b", dtype, ""), randValue(tk, tbl, "b", dtype, ""), randValue(tk, tbl, "b", dtype, "") + tk.MustExec(fmt.Sprintf(`set @a1=%v,@a2=%v,@a3=%v`, a1, a2, a3)) + tk.MustExec(fmt.Sprintf(`set @b1=%v,@b2=%v,@b3=%v`, b1, b2, b3)) + + compareResult := func(sql1, sql2 string) { + raw, err := tk.Exec(sql1) + if err != nil { + err := tk.ExecToErr(sql2) + c.Assert(err, NotNil) + return + } + rs := tk.ResultSetToResult(raw, Commentf("sql1:%s, sql2:%v", sql1, sql2)) + rs.Sort().Check(tk.MustQuery(sql2).Sort().Rows()) + } + + compareResult(`execute s1 using @a1`, fmt.Sprintf(`select * from %v where a=%v`, tbl, a1)) + compareResult(`execute s2 using @b1`, fmt.Sprintf(`select * from %v where b=%v`, tbl, b1)) + compareResult(`execute s3 using @a1,@a2,@a3`, fmt.Sprintf(`select * from %v where a in (%v,%v,%v)`, tbl, a1, a2, a3)) + compareResult(`execute s4 using @b1,@b2,@b3`, fmt.Sprintf(`select * from %v where b in (%v,%v,%v)`, tbl, b1, b2, b3)) + compareResult(`execute s5 using @a1`, fmt.Sprintf(`select * from %v where a>%v`, tbl, a1)) + compareResult(`execute s6 using @b1`, fmt.Sprintf(`select * from %v where b>%v`, tbl, b1)) + compareResult(`execute s7 using @a1,@b1`, fmt.Sprintf(`select * from %v where a>%v and b>%v`, tbl, a1, b1)) + } + } + } +} + +func (s *testPrepareSerialSuite) TestPrepareCacheChangeCharsetCollation(c *C) { + defer testleak.AfterTest(c)() + store, dom, err := newStoreWithBootstrap() + c.Assert(err, IsNil) + tk := testkit.NewTestKit(c, store) + orgEnable := core.PreparedPlanCacheEnabled() + defer func() { + dom.Close() + err = store.Close() + c.Assert(err, IsNil) + core.SetPreparedPlanCache(orgEnable) + }() + core.SetPreparedPlanCache(true) + tk.Se, err = session.CreateSession4TestWithOpt(store, &session.Opt{ + PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), + }) + c.Assert(err, IsNil) + + tk.MustExec(`use test`) + tk.MustExec(`drop table if exists t`) + tk.MustExec(`create table t (a varchar(64))`) + tk.MustExec(`set character_set_connection=utf8`) + + tk.MustExec(`prepare s from 'select * from t where a=?'`) + tk.MustExec(`set @x='a'`) + tk.MustExec(`execute s using @x`) + tk.MustExec(`set @x='b'`) + tk.MustExec(`execute s using @x`) + tk.MustQuery(`select @@last_plan_from_cache`).Check(testkit.Rows("1")) + + tk.MustExec(`set character_set_connection=latin1`) + tk.MustExec(`set @x='c'`) + tk.MustExec(`execute s using @x`) + tk.MustQuery(`select @@last_plan_from_cache`).Check(testkit.Rows("0")) // cannot reuse the previous plan since the charset is changed + tk.MustExec(`set @x='d'`) + tk.MustExec(`execute s using @x`) + tk.MustQuery(`select @@last_plan_from_cache`).Check(testkit.Rows("1")) + + tk.MustExec(`set collation_connection=binary`) + tk.MustExec(`set @x='e'`) + tk.MustExec(`execute s using @x`) + tk.MustQuery(`select @@last_plan_from_cache`).Check(testkit.Rows("0")) // cannot reuse the previous plan since the collation is changed + tk.MustExec(`set @x='f'`) + tk.MustExec(`execute s using @x`) + tk.MustQuery(`select @@last_plan_from_cache`).Check(testkit.Rows("1")) +} + func (s *testPlanSerialSuite) TestPrepareCacheDeferredFunction(c *C) { defer testleak.AfterTest(c)() store, dom, err := newStoreWithBootstrap() @@ -900,6 +1101,40 @@ func (s *testPlanSerialSuite) TestPlanCacheHitInfo(c *C) { tk.MustQuery(`select @@last_plan_from_cache`).Check(testkit.Rows("0")) } +func (s *testPlanSerialSuite) TestIssue29303(c *C) { + defer testleak.AfterTest(c)() + store, dom, err := newStoreWithBootstrap() + c.Assert(err, IsNil) + tk := testkit.NewTestKit(c, store) + orgEnable := core.PreparedPlanCacheEnabled() + defer func() { + dom.Close() + err = store.Close() + c.Assert(err, IsNil) + core.SetPreparedPlanCache(orgEnable) + }() + core.SetPreparedPlanCache(true) + + tk.Se, err = session.CreateSession4TestWithOpt(store, &session.Opt{ + PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), + }) + + tk.MustExec(`set tidb_enable_clustered_index=on`) + tk.MustExec(`use test`) + tk.MustExec(`drop table if exists PK_MULTI_COL_360`) + tk.MustExec(`CREATE TABLE PK_MULTI_COL_360 ( + COL1 blob NOT NULL, + COL2 char(1) NOT NULL, + PRIMARY KEY (COL1(5),COL2) /*T![clustered_index] CLUSTERED */)`) + tk.MustExec(`INSERT INTO PK_MULTI_COL_360 VALUES ('�', '龂')`) + tk.MustExec(`prepare stmt from 'SELECT/*+ INL_JOIN(t1, t2) */ * FROM PK_MULTI_COL_360 t1 JOIN PK_MULTI_COL_360 t2 ON t1.col1 = t2.col1 WHERE t2.col2 BETWEEN ? AND ? AND t1.col2 BETWEEN ? AND ?'`) + tk.MustExec(`set @a="捲", @b="颽", @c="睭", @d="詼"`) + tk.MustQuery(`execute stmt using @a,@b,@c,@d`).Check(testkit.Rows()) + tk.MustExec(`set @a="龂", @b="龂", @c="龂", @d="龂"`) + tk.MustQuery(`execute stmt using @a,@b,@c,@d`).Check(testkit.Rows("� 龂 � 龂")) + tk.MustQuery(`select @@last_plan_from_cache`).Check(testkit.Rows("0")) +} + func (s *testPlanSerialSuite) TestIssue28942(c *C) { defer testleak.AfterTest(c)() store, dom, err := newStoreWithBootstrap() @@ -1001,6 +1236,43 @@ func (s *testPlanSerialSuite) TestIssue28254(c *C) { tk.MustQuery("execute stmt using @a").Check(testkit.Rows("1")) } +func (s *testPlanSerialSuite) TestIssue29486(c *C) { + defer testleak.AfterTest(c)() + store, dom, err := newStoreWithBootstrap() + c.Assert(err, IsNil) + tk := testkit.NewTestKit(c, store) + orgEnable := core.PreparedPlanCacheEnabled() + defer func() { + dom.Close() + err = store.Close() + c.Assert(err, IsNil) + core.SetPreparedPlanCache(orgEnable) + }() + core.SetPreparedPlanCache(true) + + tk.Se, err = session.CreateSession4TestWithOpt(store, &session.Opt{ + PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), + }) + + tk.MustExec(`use test`) + tk.MustExec(`drop table if exists UK_MULTI_COL_11691`) + tk.MustExec(`CREATE TABLE UK_MULTI_COL_11691 ( + COL1 binary(20) DEFAULT NULL, + COL2 tinyint(16) DEFAULT NULL, + COL3 time DEFAULT NULL, + UNIQUE KEY U_M_COL (COL1(10),COL2,COL3))`) + tk.MustExec(`insert into UK_MULTI_COL_11691 values(0x340C604874B52E8D30440E8DC2BB170621D8A088, 126, "-105:17:32"), + (0x28EC2EDBAC7DF99045BDD0FCEAADAFBAC2ACF76F, 126, "102:54:04"), + (0x11C38221B3B1E463C94EC39F0D481303A58A50DC, 118, "599:13:47"), + (0x03E2FC9E0C846FF1A926BF829FA9D7BAED3FD7B1, 118, "-257:45:13")`) + + tk.MustExec(`prepare stmt from 'SELECT/*+ INL_JOIN(t1, t2) */ t2.COL2 FROM UK_MULTI_COL_11691 t1 JOIN UK_MULTI_COL_11691 t2 ON t1.col1 = t2.col1 WHERE t1.col2 BETWEEN ? AND ? AND t2.col2 BETWEEN ? AND ?'`) + tk.MustExec(`set @a=-29408, @b=-9254, @c=-1849, @d=-2346`) + tk.MustQuery(`execute stmt using @a,@b,@c,@d`).Check(testkit.Rows()) + tk.MustExec(`set @a=126, @b=126, @c=-125, @d=707`) + tk.MustQuery(`execute stmt using @a,@b,@c,@d`).Check(testkit.Rows("126", "126")) +} + func (s *testPlanSerialSuite) TestIssue28867(c *C) { defer testleak.AfterTest(c)() store, dom, err := newStoreWithBootstrap() @@ -1041,17 +1313,87 @@ func (s *testPlanSerialSuite) TestIssue28867(c *C) { tk.MustExec(`set @a=1`) tk.MustExec(`execute stmt using @a`) tk.MustExec(`execute stmt using @a`) - // the index range [a, b] depends on parameters, so it cannot use plan-cache - tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) tk.MustExec(`prepare stmt from 'select /*+ INL_JOIN(t1,t2) */ * from t1, t2 where t1.a=t2.a and t1.c=?'`) tk.MustExec(`set @a=1`) tk.MustExec(`execute stmt using @a`) tk.MustExec(`execute stmt using @a`) - // the index range [a] doesn't depend on parameters, so it can use plan-cache tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) } +func (s *testPlanSerialSuite) TestIssue29565(c *C) { + store, dom, err := newStoreWithBootstrap() + c.Assert(err, IsNil) + tk := testkit.NewTestKit(c, store) + defer func() { + dom.Close() + store.Close() + }() + orgEnable := core.PreparedPlanCacheEnabled() + defer func() { + core.SetPreparedPlanCache(orgEnable) + }() + core.SetPreparedPlanCache(true) + + tk.MustExec(`use test`) + tk.MustExec(`drop table if exists PK_SIGNED_10094`) + tk.MustExec(`CREATE TABLE PK_SIGNED_10094 (COL1 decimal(55,0) NOT NULL, PRIMARY KEY (COL1))`) + tk.MustExec(`insert into PK_SIGNED_10094 values(-9999999999999999999999999999999999999999999999999999999)`) + tk.MustExec(`prepare stmt from 'select * from PK_SIGNED_10094 where col1 != ? and col1 + 10 <=> ? + 10'`) + tk.MustExec(`set @a=7309027171262036496, @b=-9798213896406520625`) + tk.MustQuery(`execute stmt using @a,@b`).Check(testkit.Rows()) + tk.MustExec(`set @a=5408499810319315618, @b=-9999999999999999999999999999999999999999999999999999999`) + tk.MustQuery(`execute stmt using @a,@b`).Check(testkit.Rows("-9999999999999999999999999999999999999999999999999999999")) + tk.MustQuery(`select @@last_plan_from_cache`).Check(testkit.Rows("1")) +} + +func (s *testPlanSerialSuite) TestIssue28828(c *C) { + store, dom, err := newStoreWithBootstrap() + c.Assert(err, IsNil) + tk := testkit.NewTestKit(c, store) + defer func() { + dom.Close() + store.Close() + }() + orgEnable := core.PreparedPlanCacheEnabled() + defer func() { + core.SetPreparedPlanCache(orgEnable) + }() + core.SetPreparedPlanCache(true) + tk.MustExec("use test") + tk.MustExec("set @@tidb_enable_collect_execution_info=0;") + tk.MustExec("CREATE TABLE t (" + + "id bigint(20) NOT NULL," + + "audit_id bigint(20) NOT NULL," + + "PRIMARY KEY (id) /*T![clustered_index] CLUSTERED */," + + "KEY index_audit_id (audit_id)" + + ");") + tk.MustExec("insert into t values(1,9941971237863475), (2,9941971237863476), (3, 0);") + tk.MustExec("prepare stmt from 'select * from t where audit_id=?';") + tk.MustExec("set @a='9941971237863475', @b=9941971237863475, @c='xayh7vrWVNqZtzlJmdJQUwAHnkI8Ec', @d='0.0', @e='0.1', @f = '9941971237863476';") + + tk.MustQuery("execute stmt using @a;").Check(testkit.Rows("1 9941971237863475")) + tk.MustQuery("execute stmt using @b;").Check(testkit.Rows("1 9941971237863475")) + // When the type of parameters have been changed, the plan cache can not be used. + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) + tk.MustQuery("execute stmt using @c;").Check(testkit.Rows("3 0")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) + tk.MustQuery("execute stmt using @d;").Check(testkit.Rows("3 0")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) + tk.MustQuery("execute stmt using @e;").Check(testkit.Rows()) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) + tk.MustQuery("execute stmt using @d;").Check(testkit.Rows("3 0")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) + tk.MustQuery("execute stmt using @f;").Check(testkit.Rows("2 9941971237863476")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) + tk.MustExec("prepare stmt from 'select count(*) from t where audit_id in (?, ?, ?, ?, ?)';") + tk.MustQuery("execute stmt using @a, @b, @c, @d, @e;").Check(testkit.Rows("2")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) + tk.MustQuery("execute stmt using @f, @b, @c, @d, @e;").Check(testkit.Rows("3")) + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) +} + func (s *testPlanSerialSuite) TestIssue28920(c *C) { store, dom, err := newStoreWithBootstrap() c.Assert(err, IsNil) @@ -1345,19 +1687,17 @@ func (s *testPlanSerialSuite) TestPlanCachePointGetAndTableDual(c *C) { tk.MustExec("insert into t4 values(2,1,1)") tk.MustExec("prepare s4 from 'select /*+ use_index_merge(t4) */ * from t4 where (c1 >= ? and c1 <= ?) or c2 > 1'") tk.MustExec("set @a4=1,@b4=3") - // IndexMerge plan would be built, we should not cache it. tk.MustQuery("execute s4 using @a4,@a4").Check(testkit.Rows()) tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) tk.MustQuery("execute s4 using @a4,@b4").Check(testkit.Rows("2 1 1")) - tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) tk.MustExec("prepare s4 from 'select /*+ use_index_merge(t4) */ * from t4 where (c1 >= ? and c1 <= ?) or c2 > 1'") tk.MustExec("set @a4=1,@b4=3") - // IndexMerge plan would be built, we should not cache it. tk.MustQuery("execute s4 using @b4,@a4").Check(testkit.Rows()) tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) tk.MustQuery("execute s4 using @a4,@b4").Check(testkit.Rows("2 1 1")) - tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) } func (s *testPrepareSuite) TestIssue26873(c *C) { @@ -1389,6 +1729,33 @@ func (s *testPrepareSuite) TestIssue26873(c *C) { tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) } +func (s *testPrepareSuite) TestIssue29511(c *C) { + store, dom, err := newStoreWithBootstrap() + c.Assert(err, IsNil) + tk := testkit.NewTestKit(c, store) + orgEnable := core.PreparedPlanCacheEnabled() + defer func() { + dom.Close() + c.Assert(store.Close(), IsNil) + core.SetPreparedPlanCache(orgEnable) + }() + core.SetPreparedPlanCache(true) + + tk.Se, err = session.CreateSession4TestWithOpt(store, &session.Opt{ + PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), + }) + c.Assert(err, IsNil) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + + tk.MustExec("CREATE TABLE `t` (`COL1` bigint(20) DEFAULT NULL COMMENT 'WITH DEFAULT', UNIQUE KEY `UK_COL1` (`COL1`))") + tk.MustExec("insert into t values(-3865356285544170443),(9223372036854775807);") + tk.MustExec("prepare stmt from 'select/*+ hash_agg() */ max(col1) from t where col1 = ? and col1 > ?;';") + tk.MustExec("set @a=-3865356285544170443, @b=-4055949188488870713;") + tk.MustQuery("execute stmt using @a,@b;").Check(testkit.Rows("-3865356285544170443")) +} + func (s *testPlanSerialSuite) TestIssue23671(c *C) { store, dom, err := newStoreWithBootstrap() c.Assert(err, IsNil) @@ -1419,6 +1786,45 @@ func (s *testPlanSerialSuite) TestIssue23671(c *C) { tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) } +func (s *testPrepareSerialSuite) TestIssue29296(c *C) { + defer testleak.AfterTest(c)() + store, dom, err := newStoreWithBootstrap() + c.Assert(err, IsNil) + tk := testkit.NewTestKit(c, store) + orgEnable := core.PreparedPlanCacheEnabled() + defer func() { + dom.Close() + err = store.Close() + c.Assert(err, IsNil) + core.SetPreparedPlanCache(orgEnable) + }() + core.SetPreparedPlanCache(true) + tk.Se, err = session.CreateSession4TestWithOpt(store, &session.Opt{ + PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), + }) + c.Assert(err, IsNil) + + tk.MustExec(`use test`) + tk.MustExec(`drop table if exists UK_MU14722`) + tk.MustExec(`CREATE TABLE UK_MU14722 ( + COL1 tinytext DEFAULT NULL, + COL2 tinyint(16) DEFAULT NULL, + COL3 datetime DEFAULT NULL, + COL4 int(11) DEFAULT NULL, + UNIQUE KEY U_M_COL (COL1(10)), + UNIQUE KEY U_M_COL2 (COL2), + UNIQUE KEY U_M_COL3 (COL3))`) + tk.MustExec(`insert into UK_MU14722 values("輮睅麤敜溺她晁瀪襄頮鹛涓誗钷廔筪惌嶙鎢塴", -121, "3383-02-19 07:58:28" , -639457963), + ("偧孇鱓鼂瘠钻篝醗時鷷聽箌磇砀玸眞扦鸇祈灇", 127, "7902-03-05 08:54:04", -1094128660), + ("浀玡慃淛漉围甧鴎史嬙砊齄w章炢忲噑硓哈樘", -127, "5813-04-16 03:07:20", -333397107), + ("鑝粼啎鸼贖桖弦簼赭蠅鏪鐥蕿捐榥疗耹岜鬓槊", -117, "7753-11-24 10:14:24", 654872077)`) + tk.MustExec(`prepare stmt from 'SELECT * FROM UK_MU14722 WHERE col2 > ? OR col2 BETWEEN ? AND ? ORDER BY COL2 + ? LIMIT 3'`) + tk.MustExec(`set @a=30410, @b=3937, @c=22045, @d=-4374`) + tk.MustQuery(`execute stmt using @a,@b,@c,@d`).Check(testkit.Rows()) + tk.MustExec(`set @a=127, @b=127, @c=127, @d=127`) + tk.MustQuery(`execute stmt using @a,@b,@c,@d`).Check(testkit.Rows(`偧孇鱓鼂瘠钻篝醗時鷷聽箌磇砀玸眞扦鸇祈灇 127 7902-03-05 08:54:04 -1094128660`)) +} + func (s *testPrepareSerialSuite) TestIssue28246(c *C) { defer testleak.AfterTest(c)() store, dom, err := newStoreWithBootstrap() @@ -1444,12 +1850,161 @@ func (s *testPrepareSerialSuite) TestIssue28246(c *C) { tk.MustExec("set @a=9223372036854775807, @b=1") tk.MustExec(`prepare stmt from 'select min(col1) from PK_AUTO_RANDOM9111 where col1 > ?;';`) tk.MustQuery("execute stmt using @a").Check(testkit.Rows("<nil>")) + // The plan contains the tableDual, so it will not be cached. + tk.MustQuery("execute stmt using @a").Check(testkit.Rows("<nil>")) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) tk.MustQuery("execute stmt using @b").Check(testkit.Rows("9223372036854775807")) - tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) tk.MustQuery("execute stmt using @a").Check(testkit.Rows("<nil>")) tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) } +func (s *testPrepareSerialSuite) TestIssue29805(c *C) { + defer testleak.AfterTest(c)() + store, dom, err := newStoreWithBootstrap() + c.Assert(err, IsNil) + tk := testkit.NewTestKit(c, store) + orgEnable := core.PreparedPlanCacheEnabled() + defer func() { + dom.Close() + err = store.Close() + c.Assert(err, IsNil) + core.SetPreparedPlanCache(orgEnable) + }() + core.SetPreparedPlanCache(true) + tk.Se, err = session.CreateSession4TestWithOpt(store, &session.Opt{ + PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), + }) + c.Assert(err, IsNil) + + tk.MustExec("use test") + tk.MustExec("set tidb_enable_clustered_index=on;") + tk.MustExec("drop table if exists PK_TCOLLATION10197;") + tk.MustExec("CREATE TABLE `PK_TCOLLATION10197` (`COL1` char(1) NOT NULL, PRIMARY KEY (`COL1`(1)) /*T![clustered_index] CLUSTERED */) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;") + tk.MustExec("insert into PK_TCOLLATION10197 values('龺');") + tk.MustExec("set @a='畻', @b='龺';") + tk.MustExec(`prepare stmt from 'select/*+ hash_agg() */ count(distinct col1) from PK_TCOLLATION10197 where col1 > ?;';`) + tk.MustQuery("execute stmt using @a").Check(testkit.Rows("1")) + tk.MustQuery("execute stmt using @b").Check(testkit.Rows("0")) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + + tk.MustExec(`prepare stmt from 'select/*+ hash_agg() */ count(distinct col1) from PK_TCOLLATION10197 where col1 > ?;';`) + tk.MustQuery("execute stmt using @b").Check(testkit.Rows("0")) + + tk.MustQuery("select/*+ hash_agg() */ count(distinct col1) from PK_TCOLLATION10197 where col1 > '龺';").Check(testkit.Rows("0")) +} + +func (s *testPrepareSerialSuite) TestIssue29993(c *C) { + defer testleak.AfterTest(c)() + store, dom, err := newStoreWithBootstrap() + c.Assert(err, IsNil) + tk := testkit.NewTestKit(c, store) + orgEnable := core.PreparedPlanCacheEnabled() + defer func() { + dom.Close() + err = store.Close() + c.Assert(err, IsNil) + core.SetPreparedPlanCache(orgEnable) + }() + core.SetPreparedPlanCache(true) + tk.Se, err = session.CreateSession4TestWithOpt(store, &session.Opt{ + PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), + }) + c.Assert(err, IsNil) + + tk.MustExec("use test") + + // test PointGet + cluster index + tk.MustExec("set tidb_enable_clustered_index=on;") + tk.MustExec("drop table if exists t;") + tk.MustExec("CREATE TABLE `t` (`COL1` enum('a', 'b') NOT NULL PRIMARY KEY, col2 int) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;") + tk.MustExec("insert into t values('a', 1), ('b', 2);") + tk.MustExec("set @a='a', @b='b', @z='z';") + tk.MustExec(`prepare stmt from 'select col1 from t where col1 = ? and col2 in (1, 2);';`) + tk.MustQuery("execute stmt using @a").Check(testkit.Rows("a")) + tk.MustQuery("execute stmt using @b").Check(testkit.Rows("b")) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + tk.MustQuery("execute stmt using @z").Check(testkit.Rows()) + // The length of range have been changed, so the plan can not be cached. + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) + tk.MustQuery("execute stmt using @z").Check(testkit.Rows()) + + // test batchPointGet + cluster index + tk.MustExec("drop table if exists t;") + tk.MustExec("CREATE TABLE `t` (`COL1` enum('a', 'b') NOT NULL, col2 int, PRIMARY KEY(col1, col2)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;") + tk.MustExec("insert into t values('a', 1), ('b', 2);") + tk.MustExec("set @a='a', @b='b', @z='z';") + tk.MustExec(`prepare stmt from 'select col1 from t where (col1, col2) in ((?, 1));';`) + tk.MustQuery("execute stmt using @a").Check(testkit.Rows("a")) + tk.MustQuery("execute stmt using @b").Check(testkit.Rows()) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + tk.MustQuery("execute stmt using @z").Check(testkit.Rows()) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + tk.MustQuery("execute stmt using @z").Check(testkit.Rows()) + + // test PointGet + non cluster index + tk.MustExec("set tidb_enable_clustered_index=off;") + tk.MustExec("drop table if exists t;") + tk.MustExec("CREATE TABLE `t` (`COL1` enum('a', 'b') NOT NULL PRIMARY KEY, col2 int) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;") + tk.MustExec("insert into t values('a', 1), ('b', 2);") + tk.MustExec("set @a='a', @b='b', @z='z';") + tk.MustExec(`prepare stmt from 'select col1 from t where col1 = ? and col2 in (1, 2);';`) + tk.MustQuery("execute stmt using @a").Check(testkit.Rows("a")) + tk.MustQuery("execute stmt using @b").Check(testkit.Rows("b")) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + tk.MustQuery("execute stmt using @z").Check(testkit.Rows()) + // The length of range have been changed, so the plan can not be cached. + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) + tk.MustQuery("execute stmt using @z").Check(testkit.Rows()) + + // test batchPointGet + non cluster index + tk.MustExec("drop table if exists t;") + tk.MustExec("CREATE TABLE `t` (`COL1` enum('a', 'b') NOT NULL, col2 int, PRIMARY KEY(col1, col2)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;") + tk.MustExec("insert into t values('a', 1), ('b', 2);") + tk.MustExec("set @a='a', @b='b', @z='z';") + tk.MustExec(`prepare stmt from 'select col1 from t where (col1, col2) in ((?, 1));';`) + tk.MustQuery("execute stmt using @a").Check(testkit.Rows("a")) + tk.MustQuery("execute stmt using @b").Check(testkit.Rows()) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + tk.MustQuery("execute stmt using @z").Check(testkit.Rows()) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + tk.MustQuery("execute stmt using @z").Check(testkit.Rows()) +} + +func (s *testPrepareSerialSuite) TestIssue30100(c *C) { + defer testleak.AfterTest(c)() + store, dom, err := newStoreWithBootstrap() + c.Assert(err, IsNil) + tk := testkit.NewTestKit(c, store) + orgEnable := core.PreparedPlanCacheEnabled() + defer func() { + dom.Close() + err = store.Close() + c.Assert(err, IsNil) + core.SetPreparedPlanCache(orgEnable) + }() + core.SetPreparedPlanCache(true) + tk.Se, err = session.CreateSession4TestWithOpt(store, &session.Opt{ + PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), + }) + c.Assert(err, IsNil) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(col1 enum('aa', 'bb'), col2 int, index(col1, col2));") + tk.MustExec("insert into t values('aa', 333);") + tk.MustExec(`prepare stmt from 'SELECT * FROM t t1 JOIN t t2 ON t1.col1 = t2.col1 WHERE t1.col1 <=> NULL';`) + tk.MustQuery("execute stmt").Check(testkit.Rows()) + tk.MustQuery("execute stmt").Check(testkit.Rows()) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + + tk.MustExec(`prepare stmt from 'SELECT * FROM t t1 JOIN t t2 ON t1.col1 = t2.col1 WHERE t1.col1 <=> NULL and t2.col2 > ?';`) + tk.MustExec("set @a=0;") + tk.MustQuery("execute stmt using @a").Check(testkit.Rows()) + tk.MustQuery("execute stmt using @a").Check(testkit.Rows()) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) +} + func (s *testPlanSerialSuite) TestPartitionTable(c *C) { if israce.RaceEnabled { c.Skip("exhaustive types test, skip race test") @@ -1667,9 +2222,6 @@ func (s *testPlanSerialSuite) TestPartitionWithVariedDatasources(c *C) { var rscan, rpoint, rbatch [][]interface{} for id, tbl := range []string{`trangePK`, `thashPK`, `tnormalPK`} { scan := tk.MustQuery(fmt.Sprintf(`execute stmt%v_tablescan using @mina, @maxa`, tbl)).Sort() - if i > 0 { - tk.MustQuery(`select @@last_plan_from_cache`).Check(testkit.Rows("1")) - } if id == 0 { rscan = scan.Rows() } else { @@ -1677,11 +2229,6 @@ func (s *testPlanSerialSuite) TestPartitionWithVariedDatasources(c *C) { } point := tk.MustQuery(fmt.Sprintf(`execute stmt%v_pointget using @pointa`, tbl)).Sort() - if tbl == `tnormalPK` && i > 0 { - // PlanCache cannot support PointGet now since we haven't relocated partition after rebuilding range. - // Please see Execute.rebuildRange for more details. - tk.MustQuery(`select @@last_plan_from_cache`).Check(testkit.Rows("1")) - } if id == 0 { rpoint = point.Rows() } else { @@ -1689,9 +2236,6 @@ func (s *testPlanSerialSuite) TestPartitionWithVariedDatasources(c *C) { } batch := tk.MustQuery(fmt.Sprintf(`execute stmt%v_batchget using @a0, @a1, @a2`, tbl)).Sort() - if i > 0 { - tk.MustQuery(`select @@last_plan_from_cache`).Check(testkit.Rows("1")) - } if id == 0 { rbatch = batch.Rows() } else { diff --git a/planner/core/preprocess.go b/planner/core/preprocess.go index 15c43c4006418..101e2a0c53479 100644 --- a/planner/core/preprocess.go +++ b/planner/core/preprocess.go @@ -299,6 +299,21 @@ func (p *preprocessor) Enter(in ast.Node) (out ast.Node, skipChildren bool) { for _, cte := range node.CTEs { p.withName[cte.Name.L] = struct{}{} } + case *ast.BeginStmt: + // If the begin statement was like following: + // start transaction read only as of timestamp .... + // then we need set StmtCtx.IsStaleness as true in order to avoid take tso in PrepareTSFuture. + if node.AsOf != nil { + p.ctx.GetSessionVars().StmtCtx.IsStaleness = true + p.IsStaleness = true + } else if p.ctx.GetSessionVars().TxnReadTS.PeakTxnReadTS() > 0 { + // If the begin statement was like following: + // set transaction read only as of timestamp ... + // begin + // then we need set StmtCtx.IsStaleness as true in order to avoid take tso in PrepareTSFuture. + p.ctx.GetSessionVars().StmtCtx.IsStaleness = true + p.IsStaleness = true + } default: p.flag &= ^parentIsJoin } @@ -438,6 +453,10 @@ func (p *preprocessor) checkBindGrammar(originNode, hintedNode ast.StmtNode, def p.err = ddl.ErrOptOnTemporaryTable.GenWithStackByArgs("create binding") return } + tableInfo := tbl.Meta() + dbInfo, _ := p.ensureInfoSchema().SchemaByTable(tableInfo) + tn.TableInfo = tableInfo + tn.DBInfo = dbInfo } originSQL := parser.Normalize(utilparser.RestoreWithDefaultDB(originNode, defaultDB, originNode.Text())) @@ -1406,7 +1425,7 @@ func (p *preprocessor) handleTableName(tn *ast.TableName) { } tableInfo := table.Meta() - dbInfo, _ := p.ensureInfoSchema().SchemaByName(tn.Schema) + dbInfo, _ := p.ensureInfoSchema().SchemaByTable(tableInfo) // tableName should be checked as sequence object. if p.flag&inSequenceFunction > 0 { if !tableInfo.IsSequence() { @@ -1531,6 +1550,17 @@ func (p *preprocessor) checkFuncCastExpr(node *ast.FuncCastExpr) { // handleAsOfAndReadTS tries to handle as of closure, or possibly read_ts. func (p *preprocessor) handleAsOfAndReadTS(node *ast.AsOfClause) { + if p.stmtTp != TypeSelect { + return + } + defer func() { + // If the select statement was like 'select * from t as of timestamp ...' or in a stale read transaction + // or is affected by the tidb_read_staleness session variable, then the statement will be makred as isStaleness + // in stmtCtx + if p.flag&inPrepare == 0 && p.IsStaleness { + p.ctx.GetSessionVars().StmtCtx.IsStaleness = true + } + }() // When statement is during the Txn, we check whether there exists AsOfClause. If exists, we will return error, // otherwise we should directly set the return param from TxnCtx. p.ReadReplicaScope = kv.GlobalReplicaScope @@ -1597,6 +1627,10 @@ func (p *preprocessor) handleAsOfAndReadTS(node *ast.AsOfClause) { p.IsStaleness = true } case readTS == 0 && node == nil && readStaleness != 0: + // If both readTS and node is empty while the readStaleness isn't, it means we meet following situation: + // set @@tidb_read_staleness='-5'; + // select * from t; + // Then the following select statement should be affected by the tidb_read_staleness in session. ts, p.err = calculateTsWithReadStaleness(p.ctx, readStaleness) if p.err != nil { return @@ -1613,6 +1647,8 @@ func (p *preprocessor) handleAsOfAndReadTS(node *ast.AsOfClause) { p.IsStaleness = true } } + + // If the select statement is related to multi tables, we should grantee that all tables use the same timestamp if p.LastSnapshotTS != ts { p.err = ErrAsOf.GenWithStack("can not set different time in the as of") return @@ -1631,9 +1667,6 @@ func (p *preprocessor) handleAsOfAndReadTS(node *ast.AsOfClause) { } p.InfoSchema = temptable.AttachLocalTemporaryTableInfoSchema(p.ctx, is) } - if p.flag&inPrepare == 0 { - p.ctx.GetSessionVars().StmtCtx.IsStaleness = p.IsStaleness - } p.initedLastSnapshotTS = true } diff --git a/planner/core/property_cols_prune.go b/planner/core/property_cols_prune.go index 65c15a6c8d66c..f5cbf17fcfc3f 100644 --- a/planner/core/property_cols_prune.go +++ b/planner/core/property_cols_prune.go @@ -167,27 +167,13 @@ func (p *LogicalProjection) PreparePossibleProperties(schema *expression.Schema, return newProperties } -func clonePossibleProperties(props [][]*expression.Column) [][]*expression.Column { - res := make([][]*expression.Column, len(props)) - for i, prop := range props { - clonedProp := make([]*expression.Column, len(prop)) - for j, col := range prop { - clonedProp[j] = col.Clone().(*expression.Column) - } - res[i] = clonedProp - } - return res -} - // PreparePossibleProperties implements LogicalPlan PreparePossibleProperties interface. func (p *LogicalJoin) PreparePossibleProperties(schema *expression.Schema, childrenProperties ...[][]*expression.Column) [][]*expression.Column { leftProperties := childrenProperties[0] rightProperties := childrenProperties[1] // TODO: We should consider properties propagation. - // Clone the Columns in the property before saving them, otherwise the upper Projection may - // modify them and lead to unexpected results. - p.leftProperties = clonePossibleProperties(leftProperties) - p.rightProperties = clonePossibleProperties(rightProperties) + p.leftProperties = leftProperties + p.rightProperties = rightProperties if p.JoinType == LeftOuterJoin || p.JoinType == LeftOuterSemiJoin { rightProperties = nil } else if p.JoinType == RightOuterJoin { @@ -216,22 +202,14 @@ func (la *LogicalAggregation) PreparePossibleProperties(schema *expression.Schem return nil } resultProperties := make([][]*expression.Column, 0, len(childProps)) - clonedProperties := make([][]*expression.Column, 0, len(childProps)) groupByCols := la.GetGroupByCols() for _, possibleChildProperty := range childProps { sortColOffsets := getMaxSortPrefix(possibleChildProperty, groupByCols) if len(sortColOffsets) == len(groupByCols) { prop := possibleChildProperty[:len(groupByCols)] resultProperties = append(resultProperties, prop) - // Clone the Columns in the property before saving them, otherwise the upper Projection may - // modify them and lead to unexpected results. - clonedProp := make([]*expression.Column, len(prop)) - for i, col := range prop { - clonedProp[i] = col.Clone().(*expression.Column) - } - clonedProperties = append(clonedProperties, clonedProp) } } - la.possibleProperties = clonedProperties + la.possibleProperties = resultProperties return resultProperties } diff --git a/planner/core/resolve_indices.go b/planner/core/resolve_indices.go index 59af155d05a57..fa8708c960759 100644 --- a/planner/core/resolve_indices.go +++ b/planner/core/resolve_indices.go @@ -600,9 +600,12 @@ func (p *Insert) ResolveIndices() (err error) { return err } asgn.Col = newCol.(*expression.Column) - asgn.Expr, err = asgn.Expr.ResolveIndices(p.Schema4OnDuplicate) - if err != nil { - return err + // Once the asgn.lazyErr exists, asgn.Expr here is nil. + if asgn.Expr != nil { + asgn.Expr, err = asgn.Expr.ResolveIndices(p.Schema4OnDuplicate) + if err != nil { + return err + } } } for _, set := range p.SetList { diff --git a/planner/core/rule_aggregation_elimination.go b/planner/core/rule_aggregation_elimination.go index d05760c34164a..61d9e0f117e0d 100644 --- a/planner/core/rule_aggregation_elimination.go +++ b/planner/core/rule_aggregation_elimination.go @@ -16,6 +16,7 @@ package core import ( "context" + "fmt" "math" "github.com/pingcap/tidb/expression" @@ -37,7 +38,7 @@ type aggregationEliminateChecker struct { // e.g. select min(b) from t group by a. If a is a unique key, then this sql is equal to `select b from t group by a`. // For count(expr), sum(expr), avg(expr), count(distinct expr, [expr...]) we may need to rewrite the expr. Details are shown below. // If we can eliminate agg successful, we return a projection. Else we return a nil pointer. -func (a *aggregationEliminateChecker) tryToEliminateAggregation(agg *LogicalAggregation) *LogicalProjection { +func (a *aggregationEliminateChecker) tryToEliminateAggregation(agg *LogicalAggregation, opt *logicalOptimizeOp) *LogicalProjection { for _, af := range agg.AggFuncs { // TODO(issue #9968): Actually, we can rewrite GROUP_CONCAT when all the // arguments it accepts are promised to be NOT-NULL. @@ -54,9 +55,11 @@ func (a *aggregationEliminateChecker) tryToEliminateAggregation(agg *LogicalAggr } schemaByGroupby := expression.NewSchema(agg.GetGroupByCols()...) coveredByUniqueKey := false + var uniqueKey expression.KeyInfo for _, key := range agg.children[0].Schema().Keys { if schemaByGroupby.ColumnsIndices(key) != nil { coveredByUniqueKey = true + uniqueKey = key break } } @@ -64,13 +67,16 @@ func (a *aggregationEliminateChecker) tryToEliminateAggregation(agg *LogicalAggr // GroupByCols has unique key, so this aggregation can be removed. if ok, proj := ConvertAggToProj(agg, agg.schema); ok { proj.SetChildren(agg.children[0]) + appendAggregationEliminateTraceStep(agg, uniqueKey, opt) return proj } } return nil } -func (a *aggregationEliminateChecker) tryToEliminateDistinct(agg *LogicalAggregation) { +// tryToEliminateDistinct will eliminate distinct in the aggregation function if the aggregation args +// have unique key column. see detail example in https://github.com/pingcap/tidb/issues/23436 +func (a *aggregationEliminateChecker) tryToEliminateDistinct(agg *LogicalAggregation, opt *logicalOptimizeOp) { for _, af := range agg.AggFuncs { if af.HasDistinct { cols := make([]*expression.Column, 0, len(af.Args)) @@ -86,26 +92,43 @@ func (a *aggregationEliminateChecker) tryToEliminateDistinct(agg *LogicalAggrega if canEliminate { distinctByUniqueKey := false schemaByDistinct := expression.NewSchema(cols...) + var uniqueKey expression.KeyInfo for _, key := range agg.children[0].Schema().Keys { if schemaByDistinct.ColumnsIndices(key) != nil { distinctByUniqueKey = true + uniqueKey = key break } } for _, key := range agg.children[0].Schema().UniqueKeys { if schemaByDistinct.ColumnsIndices(key) != nil { distinctByUniqueKey = true + uniqueKey = key break } } if distinctByUniqueKey { af.HasDistinct = false + appendDistinctEliminateTraceStep(agg, uniqueKey, af, opt) } } } } } +func appendAggregationEliminateTraceStep(agg *LogicalAggregation, uniqueKey expression.KeyInfo, opt *logicalOptimizeOp) { + opt.appendStepToCurrent(agg.ID(), agg.TP(), + fmt.Sprintf("%s is a unique key", uniqueKey.String()), + "aggregation is simplified to a projection") +} + +func appendDistinctEliminateTraceStep(agg *LogicalAggregation, uniqueKey expression.KeyInfo, af *aggregation.AggFuncDesc, + opt *logicalOptimizeOp) { + opt.appendStepToCurrent(agg.ID(), agg.TP(), + fmt.Sprintf("%s is a unique key", uniqueKey.String()), + fmt.Sprintf("%s(distinct ...) is simplified to %s(...)", af.Name, af.Name)) +} + // ConvertAggToProj convert aggregation to projection. func ConvertAggToProj(agg *LogicalAggregation, schema *expression.Schema) (bool, *LogicalProjection) { proj := LogicalProjection{ @@ -179,10 +202,10 @@ func wrapCastFunction(ctx sessionctx.Context, arg expression.Expression, targetT return expression.BuildCastFunction(ctx, arg, targetTp) } -func (a *aggregationEliminator) optimize(ctx context.Context, p LogicalPlan) (LogicalPlan, error) { +func (a *aggregationEliminator) optimize(ctx context.Context, p LogicalPlan, opt *logicalOptimizeOp) (LogicalPlan, error) { newChildren := make([]LogicalPlan, 0, len(p.Children())) for _, child := range p.Children() { - newChild, err := a.optimize(ctx, child) + newChild, err := a.optimize(ctx, child, opt) if err != nil { return nil, err } @@ -193,8 +216,8 @@ func (a *aggregationEliminator) optimize(ctx context.Context, p LogicalPlan) (Lo if !ok { return p, nil } - a.tryToEliminateDistinct(agg) - if proj := a.tryToEliminateAggregation(agg); proj != nil { + a.tryToEliminateDistinct(agg, opt) + if proj := a.tryToEliminateAggregation(agg, opt); proj != nil { return proj, nil } return p, nil diff --git a/planner/core/rule_aggregation_push_down.go b/planner/core/rule_aggregation_push_down.go index a7f29d02d24c7..7cc0548a7f57d 100644 --- a/planner/core/rule_aggregation_push_down.go +++ b/planner/core/rule_aggregation_push_down.go @@ -15,7 +15,9 @@ package core import ( + "bytes" "context" + "fmt" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/expression/aggregation" @@ -32,6 +34,7 @@ type aggregationPushDownSolver struct { // isDecomposable checks if an aggregate function is decomposable. An aggregation function $F$ is decomposable // if there exist aggregation functions F_1 and F_2 such that F(S_1 union all S_2) = F_2(F_1(S_1),F_1(S_2)), // where S_1 and S_2 are two sets of values. We call S_1 and S_2 partial groups. +// For example, Max(S_1 union S_2) = Max(Max(S_1) union Max(S_2)), thus we think Max is decomposable. // It's easy to see that max, min, first row is decomposable, no matter whether it's distinct, but sum(distinct) and // count(distinct) is not. // Currently we don't support avg and concat. @@ -207,7 +210,8 @@ func (a *aggregationPushDownSolver) decompose(ctx sessionctx.Context, aggFunc *a // tryToPushDownAgg tries to push down an aggregate function into a join path. If all aggFuncs are first row, we won't // process it temporarily. If not, We will add additional group by columns and first row functions. We make a new aggregation operator. // If the pushed aggregation is grouped by unique key, it's no need to push it down. -func (a *aggregationPushDownSolver) tryToPushDownAgg(aggFuncs []*aggregation.AggFuncDesc, gbyCols []*expression.Column, join *LogicalJoin, childIdx int, aggHints aggHintInfo, blockOffset int) (_ LogicalPlan, err error) { +func (a *aggregationPushDownSolver) tryToPushDownAgg(oldAgg *LogicalAggregation, aggFuncs []*aggregation.AggFuncDesc, gbyCols []*expression.Column, + join *LogicalJoin, childIdx int, aggHints aggHintInfo, blockOffset int, opt *logicalOptimizeOp) (_ LogicalPlan, err error) { child := join.children[childIdx] if aggregation.IsAllFirstRow(aggFuncs) { return child, nil @@ -241,6 +245,7 @@ func (a *aggregationPushDownSolver) tryToPushDownAgg(aggFuncs []*aggregation.Agg return child, nil } } + appendAggPushDownAcrossJoinTraceStep(oldAgg, agg, aggFuncs, join, childIdx, opt) return agg, nil } @@ -367,11 +372,11 @@ func (a *aggregationPushDownSolver) pushAggCrossUnion(agg *LogicalAggregation, u return newAgg, nil } -func (a *aggregationPushDownSolver) optimize(ctx context.Context, p LogicalPlan) (LogicalPlan, error) { - return a.aggPushDown(p) +func (a *aggregationPushDownSolver) optimize(ctx context.Context, p LogicalPlan, opt *logicalOptimizeOp) (LogicalPlan, error) { + return a.aggPushDown(p, opt) } -func (a *aggregationPushDownSolver) tryAggPushDownForUnion(union *LogicalUnionAll, agg *LogicalAggregation) error { +func (a *aggregationPushDownSolver) tryAggPushDownForUnion(union *LogicalUnionAll, agg *LogicalAggregation, opt *logicalOptimizeOp) error { for _, aggFunc := range agg.AggFuncs { if !a.isDecomposableWithUnion(aggFunc) { return nil @@ -391,17 +396,21 @@ func (a *aggregationPushDownSolver) tryAggPushDownForUnion(union *LogicalUnionAl } union.SetSchema(expression.NewSchema(newChildren[0].Schema().Clone().Columns...)) union.SetChildren(newChildren...) + appendAggPushDownAcrossUnionTraceStep(union, agg, opt) return nil } // aggPushDown tries to push down aggregate functions to join paths. -func (a *aggregationPushDownSolver) aggPushDown(p LogicalPlan) (_ LogicalPlan, err error) { +func (a *aggregationPushDownSolver) aggPushDown(p LogicalPlan, opt *logicalOptimizeOp) (_ LogicalPlan, err error) { if agg, ok := p.(*LogicalAggregation); ok { - proj := a.tryToEliminateAggregation(agg) + proj := a.tryToEliminateAggregation(agg, opt) if proj != nil { p = proj } else { child := agg.children[0] + // For example, we can optimize 'select sum(a.id) from t as a,t as b where a.id = b.id;' as + // 'select sum(agg) from (select sum(id) as agg,id from t group by id) as a, t as b where a.id = b.id;' + // by pushing down sum aggregation functions. if join, ok1 := child.(*LogicalJoin); ok1 && a.checkValidJoin(join) && p.SCtx().GetSessionVars().AllowAggPushDown { if valid, leftAggFuncs, rightAggFuncs, leftGbyCols, rightGbyCols := a.splitAggFuncsAndGbyCols(agg, join); valid { var lChild, rChild LogicalPlan @@ -412,7 +421,7 @@ func (a *aggregationPushDownSolver) aggPushDown(p LogicalPlan) (_ LogicalPlan, e if rightInvalid { rChild = join.children[1] } else { - rChild, err = a.tryToPushDownAgg(rightAggFuncs, rightGbyCols, join, 1, agg.aggHints, agg.blockOffset) + rChild, err = a.tryToPushDownAgg(agg, rightAggFuncs, rightGbyCols, join, 1, agg.aggHints, agg.blockOffset, opt) if err != nil { return nil, err } @@ -420,7 +429,7 @@ func (a *aggregationPushDownSolver) aggPushDown(p LogicalPlan) (_ LogicalPlan, e if leftInvalid { lChild = join.children[0] } else { - lChild, err = a.tryToPushDownAgg(leftAggFuncs, leftGbyCols, join, 0, agg.aggHints, agg.blockOffset) + lChild, err = a.tryToPushDownAgg(agg, leftAggFuncs, leftGbyCols, join, 0, agg.aggHints, agg.blockOffset, opt) if err != nil { return nil, err } @@ -428,11 +437,12 @@ func (a *aggregationPushDownSolver) aggPushDown(p LogicalPlan) (_ LogicalPlan, e join.SetChildren(lChild, rChild) join.SetSchema(expression.MergeSchema(lChild.Schema(), rChild.Schema())) buildKeyInfo(join) - proj := a.tryToEliminateAggregation(agg) + proj := a.tryToEliminateAggregation(agg, opt) if proj != nil { p = proj } } + // push aggregation across projection } else if proj, ok1 := child.(*LogicalProjection); ok1 { // TODO: This optimization is not always reasonable. We have not supported pushing projection to kv layer yet, // so we must do this optimization. @@ -445,9 +455,11 @@ func (a *aggregationPushDownSolver) aggPushDown(p LogicalPlan) (_ LogicalPlan, e break } } + oldAggFuncsArgs := make([][]expression.Expression, 0, len(agg.AggFuncs)) newAggFuncsArgs := make([][]expression.Expression, 0, len(agg.AggFuncs)) if noSideEffects { for _, aggFunc := range agg.AggFuncs { + oldAggFuncsArgs = append(oldAggFuncsArgs, aggFunc.Args) newArgs := make([]expression.Expression, 0, len(aggFunc.Args)) for _, arg := range aggFunc.Args { newArgs = append(newArgs, expression.ColumnSubstitute(arg, proj.schema, proj.Exprs)) @@ -470,15 +482,16 @@ func (a *aggregationPushDownSolver) aggPushDown(p LogicalPlan) (_ LogicalPlan, e // And then push the new 'Aggregation' below the 'Union All' . // The final plan tree should be 'Aggregation->Union All->Aggregation->X'. child = projChild + appendAggPushDownAcrossProjTraceStep(agg, proj, opt) } } if union, ok1 := child.(*LogicalUnionAll); ok1 && p.SCtx().GetSessionVars().AllowAggPushDown { - err := a.tryAggPushDownForUnion(union, agg) + err := a.tryAggPushDownForUnion(union, agg, opt) if err != nil { return nil, err } } else if union, ok1 := child.(*LogicalPartitionUnionAll); ok1 { - err := a.tryAggPushDownForUnion(&union.LogicalUnionAll, agg) + err := a.tryAggPushDownForUnion(&union.LogicalUnionAll, agg, opt) if err != nil { return nil, err } @@ -487,7 +500,7 @@ func (a *aggregationPushDownSolver) aggPushDown(p LogicalPlan) (_ LogicalPlan, e } newChildren := make([]LogicalPlan, 0, len(p.Children())) for _, child := range p.Children() { - newChild, err := a.aggPushDown(child) + newChild, err := a.aggPushDown(child, opt) if err != nil { return nil, err } @@ -500,3 +513,71 @@ func (a *aggregationPushDownSolver) aggPushDown(p LogicalPlan) (_ LogicalPlan, e func (*aggregationPushDownSolver) name() string { return "aggregation_push_down" } + +func appendAggPushDownAcrossJoinTraceStep(oldAgg, newAgg *LogicalAggregation, aggFuncs []*aggregation.AggFuncDesc, join *LogicalJoin, + childIdx int, opt *logicalOptimizeOp) { + reason := func() string { + buffer := bytes.NewBufferString(fmt.Sprintf("agg[%v]'s functions[", oldAgg.ID())) + for i, aggFunc := range aggFuncs { + if i > 0 { + buffer.WriteString(",") + } + buffer.WriteString(aggFunc.String()) + } + buffer.WriteString("] are decomposable with join") + return buffer.String() + }() + action := func() string { + buffer := bytes.NewBufferString(fmt.Sprintf("agg[%v] pushed down across join[%v], ", oldAgg.ID(), join.ID())) + buffer.WriteString(fmt.Sprintf("and join %v path becomes agg[%v]", func() string { + if childIdx == 0 { + return "left" + } + return "right" + }(), newAgg.ID())) + return buffer.String() + }() + opt.appendStepToCurrent(join.ID(), join.TP(), reason, action) +} + +func appendAggPushDownAcrossProjTraceStep(agg *LogicalAggregation, proj *LogicalProjection, opt *logicalOptimizeOp) { + action := func() string { + buffer := bytes.NewBufferString(fmt.Sprintf("proj[%v] is eliminated, and agg[%v]'s functions changed into[", proj.ID(), agg.ID())) + for i, aggFunc := range agg.AggFuncs { + if i > 0 { + buffer.WriteString(",") + } + buffer.WriteString(aggFunc.String()) + } + buffer.WriteString("]") + return buffer.String() + }() + reason := fmt.Sprintf("Proj[%v] is directly below an agg[%v] and has no side effects", proj.ID(), agg.ID()) + opt.appendStepToCurrent(agg.ID(), agg.TP(), reason, action) +} + +func appendAggPushDownAcrossUnionTraceStep(union *LogicalUnionAll, agg *LogicalAggregation, opt *logicalOptimizeOp) { + reason := func() string { + buffer := bytes.NewBufferString(fmt.Sprintf("agg[%v] functions[", agg.ID())) + for i, aggFunc := range agg.AggFuncs { + if i > 0 { + buffer.WriteString(",") + } + buffer.WriteString(aggFunc.String()) + } + buffer.WriteString("] are decomposable with union") + return buffer.String() + }() + action := func() string { + buffer := bytes.NewBufferString(fmt.Sprintf("agg[%v] pushed down, and union[%v]'s children changed into[", agg.ID(), union.ID())) + for i, child := range union.Children() { + if i > 0 { + buffer.WriteString(",") + } + buffer.WriteString(fmt.Sprintf("[id:%v,tp:%s]", child.ID(), child.TP())) + } + buffer.WriteString("]") + return buffer.String() + }() + opt.appendStepToCurrent(union.ID(), union.TP(), reason, action) +} diff --git a/planner/core/rule_build_key_info.go b/planner/core/rule_build_key_info.go index bee4abd149a25..ae8a0a1d3a566 100644 --- a/planner/core/rule_build_key_info.go +++ b/planner/core/rule_build_key_info.go @@ -25,9 +25,9 @@ import ( type buildKeySolver struct{} -func (s *buildKeySolver) optimize(ctx context.Context, lp LogicalPlan) (LogicalPlan, error) { - buildKeyInfo(lp) - return lp, nil +func (s *buildKeySolver) optimize(ctx context.Context, p LogicalPlan, opt *logicalOptimizeOp) (LogicalPlan, error) { + buildKeyInfo(p) + return p, nil } // buildKeyInfo recursively calls LogicalPlan's BuildKeyInfo method. @@ -264,11 +264,26 @@ func checkIndexCanBeKey(idx *model.IndexInfo, columns []*model.ColumnInfo, schem // BuildKeyInfo implements LogicalPlan BuildKeyInfo interface. func (ds *DataSource) BuildKeyInfo(selfSchema *expression.Schema, childSchema []*expression.Schema) { selfSchema.Keys = nil - for _, path := range ds.possibleAccessPaths { - if path.IsIntHandlePath { + var latestIndexes map[int64]*model.IndexInfo + var changed bool + var err error + // we should check index valid while forUpdateRead, see detail in https://github.com/pingcap/tidb/pull/22152 + if ds.isForUpdateRead { + latestIndexes, changed, err = getLatestIndexInfo(ds.ctx, ds.table.Meta().ID, 0) + if err != nil { + return + } + } + for _, index := range ds.table.Meta().Indices { + if ds.isForUpdateRead && changed { + latestIndex, ok := latestIndexes[index.ID] + if !ok || latestIndex.State != model.StatePublic { + continue + } + } else if index.State != model.StatePublic { continue } - if uniqueKey, newKey := checkIndexCanBeKey(path.Index, ds.Columns, selfSchema); newKey != nil { + if uniqueKey, newKey := checkIndexCanBeKey(index, ds.Columns, selfSchema); newKey != nil { selfSchema.Keys = append(selfSchema.Keys, newKey) } else if uniqueKey != nil { selfSchema.UniqueKeys = append(selfSchema.UniqueKeys, uniqueKey) diff --git a/planner/core/rule_column_pruning.go b/planner/core/rule_column_pruning.go index 9ae9481530a68..1d144c72807f9 100644 --- a/planner/core/rule_column_pruning.go +++ b/planner/core/rule_column_pruning.go @@ -29,7 +29,7 @@ import ( type columnPruner struct { } -func (s *columnPruner) optimize(ctx context.Context, lp LogicalPlan) (LogicalPlan, error) { +func (s *columnPruner) optimize(ctx context.Context, lp LogicalPlan, opt *logicalOptimizeOp) (LogicalPlan, error) { err := lp.PruneColumns(lp.Schema().Columns) return lp, err } @@ -149,7 +149,21 @@ func (la *LogicalAggregation) PruneColumns(parentUsedCols []*expression.Column) la.GroupByItems = []expression.Expression{expression.NewOne()} } } - return child.PruneColumns(selfUsedCols) + err := child.PruneColumns(selfUsedCols) + if err != nil { + return err + } + // Do an extra Projection Elimination here. This is specially for empty Projection below Aggregation. + // This kind of Projection would cause some bugs for MPP plan and is safe to be removed. + // This kind of Projection should be removed in Projection Elimination, but currently PrunColumnsAgain is + // the last rule. So we specially handle this case here. + if childProjection, isProjection := child.(*LogicalProjection); isProjection { + if len(childProjection.Exprs) == 0 && childProjection.Schema().Len() == 0 { + childOfChild := childProjection.children[0] + la.SetChildren(childOfChild) + } + } + return nil } func pruneByItems(old []*util.ByItems) (new []*util.ByItems, parentUsedCols []*expression.Column) { @@ -227,6 +241,23 @@ func (p *LogicalUnionAll) PruneColumns(parentUsedCols []*expression.Column) erro p.schema.Columns = append(p.schema.Columns[:i], p.schema.Columns[i+1:]...) } } + // It's possible that the child operator adds extra columns to the schema. + // Currently, (*LogicalAggregation).PruneColumns() might do this. + // But we don't need such columns, so we add an extra Projection to prune this column when this happened. + for i, child := range p.Children() { + if p.schema.Len() < child.Schema().Len() { + schema := p.schema.Clone() + exprs := make([]expression.Expression, len(p.schema.Columns)) + for j, col := range schema.Columns { + exprs[j] = col + } + proj := LogicalProjection{Exprs: exprs, AvoidColumnEvaluator: true}.Init(p.ctx, p.blockOffset) + proj.SetSchema(schema) + + proj.SetChildren(child) + p.children[i] = proj + } + } } return nil } diff --git a/planner/core/rule_decorrelate.go b/planner/core/rule_decorrelate.go index b803e746fa604..a8835d57448b9 100644 --- a/planner/core/rule_decorrelate.go +++ b/planner/core/rule_decorrelate.go @@ -119,7 +119,7 @@ func (s *decorrelateSolver) aggDefaultValueMap(agg *LogicalAggregation) map[int] } // optimize implements logicalOptRule interface. -func (s *decorrelateSolver) optimize(ctx context.Context, p LogicalPlan) (LogicalPlan, error) { +func (s *decorrelateSolver) optimize(ctx context.Context, p LogicalPlan, opt *logicalOptimizeOp) (LogicalPlan, error) { if apply, ok := p.(*LogicalApply); ok { outerPlan := apply.children[0] innerPlan := apply.children[1] @@ -139,12 +139,12 @@ func (s *decorrelateSolver) optimize(ctx context.Context, p LogicalPlan) (Logica apply.AttachOnConds(newConds) innerPlan = sel.children[0] apply.SetChildren(outerPlan, innerPlan) - return s.optimize(ctx, p) + return s.optimize(ctx, p, opt) } else if m, ok := innerPlan.(*LogicalMaxOneRow); ok { if m.children[0].MaxOneRow() { innerPlan = m.children[0] apply.SetChildren(outerPlan, innerPlan) - return s.optimize(ctx, p) + return s.optimize(ctx, p, opt) } } else if proj, ok := innerPlan.(*LogicalProjection); ok { for i, expr := range proj.Exprs { @@ -157,14 +157,14 @@ func (s *decorrelateSolver) optimize(ctx context.Context, p LogicalPlan) (Logica proj.SetSchema(apply.Schema()) proj.Exprs = append(expression.Column2Exprs(outerPlan.Schema().Clone().Columns), proj.Exprs...) apply.SetSchema(expression.MergeSchema(outerPlan.Schema(), innerPlan.Schema())) - np, err := s.optimize(ctx, p) + np, err := s.optimize(ctx, p, opt) if err != nil { return nil, err } proj.SetChildren(np) return proj, nil } - return s.optimize(ctx, p) + return s.optimize(ctx, p, opt) } else if agg, ok := innerPlan.(*LogicalAggregation); ok { if apply.canPullUpAgg() && agg.canPullUp() { innerPlan = agg.children[0] @@ -214,7 +214,7 @@ func (s *decorrelateSolver) optimize(ctx context.Context, p LogicalPlan) (Logica newAggFuncs = append(newAggFuncs, desc) } agg.AggFuncs = newAggFuncs - np, err := s.optimize(ctx, p) + np, err := s.optimize(ctx, p, opt) if err != nil { return nil, err } @@ -283,7 +283,7 @@ func (s *decorrelateSolver) optimize(ctx context.Context, p LogicalPlan) (Logica proj.SetChildren(apply) p = proj } - return s.optimize(ctx, p) + return s.optimize(ctx, p, opt) } sel.Conditions = originalExpr apply.CorCols = extractCorColumnsBySchema4LogicalPlan(apply.children[1], apply.children[0].Schema()) @@ -294,12 +294,12 @@ func (s *decorrelateSolver) optimize(ctx context.Context, p LogicalPlan) (Logica // the top level Sort has no effect on the subquery's result. innerPlan = sort.children[0] apply.SetChildren(outerPlan, innerPlan) - return s.optimize(ctx, p) + return s.optimize(ctx, p, opt) } } newChildren := make([]LogicalPlan, 0, len(p.Children())) for _, child := range p.Children() { - np, err := s.optimize(ctx, child) + np, err := s.optimize(ctx, child, opt) if err != nil { return nil, err } diff --git a/planner/core/rule_eliminate_projection.go b/planner/core/rule_eliminate_projection.go index 608cb7ec88486..0c377bd974703 100644 --- a/planner/core/rule_eliminate_projection.go +++ b/planner/core/rule_eliminate_projection.go @@ -15,10 +15,13 @@ package core import ( + "bytes" "context" + "fmt" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/parser/mysql" ) // canProjectionBeEliminatedLoose checks whether a projection can be eliminated, @@ -144,13 +147,13 @@ type projectionEliminator struct { } // optimize implements the logicalOptRule interface. -func (pe *projectionEliminator) optimize(ctx context.Context, lp LogicalPlan) (LogicalPlan, error) { - root := pe.eliminate(lp, make(map[string]*expression.Column), false) +func (pe *projectionEliminator) optimize(ctx context.Context, lp LogicalPlan, opt *logicalOptimizeOp) (LogicalPlan, error) { + root := pe.eliminate(lp, make(map[string]*expression.Column), false, opt) return root, nil } // eliminate eliminates the redundant projection in a logical plan. -func (pe *projectionEliminator) eliminate(p LogicalPlan, replace map[string]*expression.Column, canEliminate bool) LogicalPlan { +func (pe *projectionEliminator) eliminate(p LogicalPlan, replace map[string]*expression.Column, canEliminate bool, opt *logicalOptimizeOp) LogicalPlan { proj, isProj := p.(*LogicalProjection) childFlag := canEliminate if _, isUnion := p.(*LogicalUnionAll); isUnion { @@ -161,7 +164,7 @@ func (pe *projectionEliminator) eliminate(p LogicalPlan, replace map[string]*exp childFlag = true } for i, child := range p.Children() { - p.Children()[i] = pe.eliminate(child, replace, childFlag) + p.Children()[i] = pe.eliminate(child, replace, childFlag, opt) } switch x := p.(type) { @@ -178,9 +181,14 @@ func (pe *projectionEliminator) eliminate(p LogicalPlan, replace map[string]*exp if isProj { if child, ok := p.Children()[0].(*LogicalProjection); ok && !ExprsHasSideEffects(child.Exprs) { for i := range proj.Exprs { - proj.Exprs[i] = expression.FoldConstant(ReplaceColumnOfExpr(proj.Exprs[i], child, child.Schema())) + proj.Exprs[i] = ReplaceColumnOfExpr(proj.Exprs[i], child, child.Schema()) + foldedExpr := expression.FoldConstant(proj.Exprs[i]) + // the folded expr should have the same null flag with the original expr, especially for the projection under union, so forcing it here. + foldedExpr.GetType().Flag = (foldedExpr.GetType().Flag & ^mysql.NotNullFlag) | (proj.Exprs[i].GetType().Flag & mysql.NotNullFlag) + proj.Exprs[i] = foldedExpr } p.Children()[0] = child.Children()[0] + appendDupProjEliminateTraceStep(proj, child, opt) } } @@ -191,6 +199,7 @@ func (pe *projectionEliminator) eliminate(p LogicalPlan, replace map[string]*exp for i, col := range proj.Schema().Columns { replace[string(col.HashCode(nil))] = exprs[i].(*expression.Column) } + appendProjEliminateTraceStep(proj, opt) return p.Children()[0] } @@ -287,3 +296,26 @@ func (p *LogicalWindow) replaceExprColumns(replace map[string]*expression.Column func (*projectionEliminator) name() string { return "projection_eliminate" } + +func appendDupProjEliminateTraceStep(parent, child *LogicalProjection, opt *logicalOptimizeOp) { + action := func() string { + buffer := bytes.NewBufferString( + fmt.Sprintf("Proj[%v] is eliminated, Proj[%v]'s expressions changed into[", child.ID(), parent.ID())) + for i, expr := range parent.Exprs { + if i > 0 { + buffer.WriteString(",") + } + buffer.WriteString(expr.String()) + } + buffer.WriteString("]") + return buffer.String() + }() + reason := fmt.Sprintf("Proj[%v]'s child proj[%v] is redundant", parent.ID(), child.ID()) + opt.appendStepToCurrent(child.ID(), child.TP(), reason, action) +} + +func appendProjEliminateTraceStep(proj *LogicalProjection, opt *logicalOptimizeOp) { + reason := fmt.Sprintf("Proj[%v]'s Exprs are all Columns", proj.ID()) + action := fmt.Sprintf("Proj[%v] is eliminated", proj.ID()) + opt.appendStepToCurrent(proj.ID(), proj.TP(), reason, action) +} diff --git a/planner/core/rule_generate_column_substitute.go b/planner/core/rule_generate_column_substitute.go index b300db5ee73b0..d3ec3d5c7960c 100644 --- a/planner/core/rule_generate_column_substitute.go +++ b/planner/core/rule_generate_column_substitute.go @@ -37,7 +37,7 @@ type ExprColumnMap map[expression.Expression]*expression.Column // For example: select a+1 from t order by a+1, with a virtual generate column c as (a+1) and // an index on c. We need to replace a+1 with c so that we can use the index on c. // See also https://dev.mysql.com/doc/refman/8.0/en/generated-column-index-optimizations.html -func (gc *gcSubstituter) optimize(ctx context.Context, lp LogicalPlan) (LogicalPlan, error) { +func (gc *gcSubstituter) optimize(ctx context.Context, lp LogicalPlan, opt *logicalOptimizeOp) (LogicalPlan, error) { exprToColumn := make(ExprColumnMap) collectGenerateColumn(lp, exprToColumn) if len(exprToColumn) == 0 { diff --git a/planner/core/rule_inject_extra_projection.go b/planner/core/rule_inject_extra_projection.go index 3b6c6d798e0e0..044da6b072058 100644 --- a/planner/core/rule_inject_extra_projection.go +++ b/planner/core/rule_inject_extra_projection.go @@ -106,7 +106,6 @@ func injectProjBelowUnion(un *PhysicalUnionAll) *PhysicalUnionAll { // since the types of the args are already the expected. func wrapCastForAggFuncs(sctx sessionctx.Context, aggFuncs []*aggregation.AggFuncDesc) { for i := range aggFuncs { - aggFuncs[i].WrapCastAsDecimalForAggArgs(sctx) if aggFuncs[i].Mode != aggregation.FinalMode && aggFuncs[i].Mode != aggregation.Partial2Mode { aggFuncs[i].WrapCastForAggArgs(sctx) } diff --git a/planner/core/rule_join_elimination.go b/planner/core/rule_join_elimination.go index 025d538aafbc3..6d4a750ea4356 100644 --- a/planner/core/rule_join_elimination.go +++ b/planner/core/rule_join_elimination.go @@ -15,7 +15,9 @@ package core import ( + "bytes" "context" + "fmt" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/parser/ast" @@ -32,7 +34,7 @@ type outerJoinEliminator struct { // 2. outer join elimination with duplicate agnostic aggregate functions: For example left outer join. // If the parent only use the columns from left table with 'distinct' label. The left outer join can // be eliminated. -func (o *outerJoinEliminator) tryToEliminateOuterJoin(p *LogicalJoin, aggCols []*expression.Column, parentCols []*expression.Column) (LogicalPlan, bool, error) { +func (o *outerJoinEliminator) tryToEliminateOuterJoin(p *LogicalJoin, aggCols []*expression.Column, parentCols []*expression.Column, opt *logicalOptimizeOp) (LogicalPlan, bool, error) { var innerChildIdx int switch p.JoinType { case LeftOuterJoin: @@ -56,6 +58,7 @@ func (o *outerJoinEliminator) tryToEliminateOuterJoin(p *LogicalJoin, aggCols [] // outer join elimination with duplicate agnostic aggregate functions matched = IsColsAllFromOuterTable(aggCols, outerUniqueIDs) if matched { + appendOuterJoinEliminateAggregationTraceStep(p, outerPlan, aggCols, opt) return outerPlan, true, nil } // outer join elimination without duplicate agnostic aggregate functions @@ -65,6 +68,7 @@ func (o *outerJoinEliminator) tryToEliminateOuterJoin(p *LogicalJoin, aggCols [] return p, false, err } if contain { + appendOuterJoinEliminateTraceStep(p, outerPlan, parentCols, innerJoinKeys, opt) return outerPlan, true, nil } contain, err = o.isInnerJoinKeysContainIndex(innerPlan, innerJoinKeys) @@ -72,6 +76,7 @@ func (o *outerJoinEliminator) tryToEliminateOuterJoin(p *LogicalJoin, aggCols [] return p, false, err } if contain { + appendOuterJoinEliminateTraceStep(p, outerPlan, parentCols, innerJoinKeys, opt) return outerPlan, true, nil } @@ -178,11 +183,11 @@ func GetDupAgnosticAggCols( return true, newAggCols } -func (o *outerJoinEliminator) doOptimize(p LogicalPlan, aggCols []*expression.Column, parentCols []*expression.Column) (LogicalPlan, error) { +func (o *outerJoinEliminator) doOptimize(p LogicalPlan, aggCols []*expression.Column, parentCols []*expression.Column, opt *logicalOptimizeOp) (LogicalPlan, error) { var err error var isEliminated bool for join, isJoin := p.(*LogicalJoin); isJoin; join, isJoin = p.(*LogicalJoin) { - p, isEliminated, err = o.tryToEliminateOuterJoin(join, aggCols, parentCols) + p, isEliminated, err = o.tryToEliminateOuterJoin(join, aggCols, parentCols, opt) if err != nil { return p, err } @@ -216,7 +221,7 @@ func (o *outerJoinEliminator) doOptimize(p LogicalPlan, aggCols []*expression.Co } for i, child := range p.Children() { - newChild, err := o.doOptimize(child, aggCols, parentCols) + newChild, err := o.doOptimize(child, aggCols, parentCols, opt) if err != nil { return nil, err } @@ -225,10 +230,51 @@ func (o *outerJoinEliminator) doOptimize(p LogicalPlan, aggCols []*expression.Co return p, nil } -func (o *outerJoinEliminator) optimize(ctx context.Context, p LogicalPlan) (LogicalPlan, error) { - return o.doOptimize(p, nil, nil) +func (o *outerJoinEliminator) optimize(ctx context.Context, p LogicalPlan, opt *logicalOptimizeOp) (LogicalPlan, error) { + p, err := o.doOptimize(p, nil, nil, opt) + return p, err } func (*outerJoinEliminator) name() string { return "outer_join_eliminate" } + +func appendOuterJoinEliminateTraceStep(join *LogicalJoin, outerPlan LogicalPlan, parentCols []*expression.Column, + innerJoinKeys *expression.Schema, opt *logicalOptimizeOp) { + reason := func() string { + buffer := bytes.NewBufferString("The columns[") + for i, col := range parentCols { + if i > 0 { + buffer.WriteString(",") + } + buffer.WriteString(col.String()) + } + buffer.WriteString("] are from outer table, and the inner join keys[") + for i, key := range innerJoinKeys.Columns { + if i > 0 { + buffer.WriteString(",") + } + buffer.WriteString(key.String()) + } + buffer.WriteString("] are unique") + return buffer.String() + }() + action := fmt.Sprintf("Outer join[%v] is eliminated and become %v[%v]", join.ID(), outerPlan.TP(), outerPlan.ID()) + opt.appendStepToCurrent(join.ID(), join.TP(), reason, action) +} + +func appendOuterJoinEliminateAggregationTraceStep(join *LogicalJoin, outerPlan LogicalPlan, aggCols []*expression.Column, opt *logicalOptimizeOp) { + reason := func() string { + buffer := bytes.NewBufferString("The columns[") + for i, col := range aggCols { + if i > 0 { + buffer.WriteString(",") + } + buffer.WriteString(col.String()) + } + buffer.WriteString("] in agg are from outer table, and the agg functions are duplicate agnostic") + return buffer.String() + }() + action := fmt.Sprintf("Outer join[%v] is eliminated and become %v[%v]", join.ID(), outerPlan.TP(), outerPlan.ID()) + opt.appendStepToCurrent(join.ID(), join.TP(), reason, action) +} diff --git a/planner/core/rule_join_reorder.go b/planner/core/rule_join_reorder.go index 2c2d87b87219b..dd29f7d3f1f30 100644 --- a/planner/core/rule_join_reorder.go +++ b/planner/core/rule_join_reorder.go @@ -15,10 +15,15 @@ package core import ( + "bytes" "context" + "fmt" + "sort" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/util/plancodec" + "github.com/pingcap/tidb/util/tracing" ) // extractJoinGroup extracts all the join nodes connected with continuous @@ -55,17 +60,22 @@ type jrNode struct { cumCost float64 } -func (s *joinReOrderSolver) optimize(ctx context.Context, p LogicalPlan) (LogicalPlan, error) { - return s.optimizeRecursive(p.SCtx(), p) +func (s *joinReOrderSolver) optimize(ctx context.Context, p LogicalPlan, opt *logicalOptimizeOp) (LogicalPlan, error) { + tracer := &joinReorderTrace{cost: map[string]float64{}, opt: opt} + tracer.traceJoinReorder(p) + p, err := s.optimizeRecursive(p.SCtx(), p, tracer) + tracer.traceJoinReorder(p) + appendJoinReorderTraceStep(tracer, p, opt) + return p, err } // optimizeRecursive recursively collects join groups and applies join reorder algorithm for each group. -func (s *joinReOrderSolver) optimizeRecursive(ctx sessionctx.Context, p LogicalPlan) (LogicalPlan, error) { +func (s *joinReOrderSolver) optimizeRecursive(ctx sessionctx.Context, p LogicalPlan, tracer *joinReorderTrace) (LogicalPlan, error) { var err error curJoinGroup, eqEdges, otherConds := extractJoinGroup(p) if len(curJoinGroup) > 1 { for i := range curJoinGroup { - curJoinGroup[i], err = s.optimizeRecursive(ctx, curJoinGroup[i]) + curJoinGroup[i], err = s.optimizeRecursive(ctx, curJoinGroup[i], tracer) if err != nil { return nil, err } @@ -80,13 +90,13 @@ func (s *joinReOrderSolver) optimizeRecursive(ctx sessionctx.Context, p LogicalP baseSingleGroupJoinOrderSolver: baseGroupSolver, eqEdges: eqEdges, } - p, err = groupSolver.solve(curJoinGroup) + p, err = groupSolver.solve(curJoinGroup, tracer) } else { dpSolver := &joinReorderDPSolver{ baseSingleGroupJoinOrderSolver: baseGroupSolver, } dpSolver.newJoin = dpSolver.newJoinWithEdges - p, err = dpSolver.solve(curJoinGroup, expression.ScalarFuncs2Exprs(eqEdges)) + p, err = dpSolver.solve(curJoinGroup, expression.ScalarFuncs2Exprs(eqEdges), tracer) } if err != nil { return nil, err @@ -114,7 +124,7 @@ func (s *joinReOrderSolver) optimizeRecursive(ctx sessionctx.Context, p LogicalP } newChildren := make([]LogicalPlan, 0, len(p.Children())) for _, child := range p.Children() { - newChild, err := s.optimizeRecursive(ctx, child) + newChild, err := s.optimizeRecursive(ctx, child, tracer) if err != nil { return nil, err } @@ -194,3 +204,135 @@ func (s *baseSingleGroupJoinOrderSolver) calcJoinCumCost(join LogicalPlan, lNode func (*joinReOrderSolver) name() string { return "join_reorder" } + +func appendJoinReorderTraceStep(tracer *joinReorderTrace, plan LogicalPlan, opt *logicalOptimizeOp) { + if len(tracer.initial) < 1 || len(tracer.final) < 1 { + return + } + action := fmt.Sprintf("join order becomes %v from original %v", tracer.final, tracer.initial) + reason := func() string { + buffer := bytes.NewBufferString("join cost during reorder: [") + var joins []string + for join := range tracer.cost { + joins = append(joins, join) + } + sort.Strings(joins) + for i, join := range joins { + if i > 0 { + buffer.WriteString(",") + } + buffer.WriteString(fmt.Sprintf("[%s, cost:%v]", join, tracer.cost[join])) + } + buffer.WriteString("]") + return buffer.String() + }() + opt.appendStepToCurrent(plan.ID(), plan.TP(), reason, action) +} + +func allJoinOrderToString(tt []*tracing.LogicalPlanTrace) string { + if len(tt) == 1 { + return joinOrderToString(tt[0]) + } + buffer := bytes.NewBufferString("[") + for i, t := range tt { + if i > 0 { + buffer.WriteString(",") + } + buffer.WriteString(joinOrderToString(t)) + } + buffer.WriteString("]") + return buffer.String() +} + +// joinOrderToString let Join(DataSource, DataSource) become '(t1*t2)' +func joinOrderToString(t *tracing.LogicalPlanTrace) string { + if t.TP == plancodec.TypeJoin { + buffer := bytes.NewBufferString("(") + for i, child := range t.Children { + if i > 0 { + buffer.WriteString("*") + } + buffer.WriteString(joinOrderToString(child)) + } + buffer.WriteString(")") + return buffer.String() + } else if t.TP == plancodec.TypeDataSource { + return t.ExplainInfo[6:] + } + return "" +} + +// extractJoinAndDataSource will only keep join and dataSource operator and remove other operators. +// For example: Proj->Join->(Proj->DataSource, DataSource) will become Join->(DataSource, DataSource) +func extractJoinAndDataSource(t *tracing.LogicalPlanTrace) []*tracing.LogicalPlanTrace { + roots := findRoots(t) + if len(roots) < 1 { + return nil + } + var rr []*tracing.LogicalPlanTrace + for _, root := range roots { + simplify(root) + rr = append(rr, root) + } + return rr +} + +// simplify only keeps Join and DataSource operators, and discard other operators. +func simplify(node *tracing.LogicalPlanTrace) { + if len(node.Children) < 1 { + return + } + for valid := false; !valid; { + valid = true + newChildren := make([]*tracing.LogicalPlanTrace, 0) + for _, child := range node.Children { + if child.TP != plancodec.TypeDataSource && child.TP != plancodec.TypeJoin { + newChildren = append(newChildren, child.Children...) + valid = false + } else { + newChildren = append(newChildren, child) + } + } + node.Children = newChildren + } + for _, child := range node.Children { + simplify(child) + } +} + +func findRoots(t *tracing.LogicalPlanTrace) []*tracing.LogicalPlanTrace { + if t.TP == plancodec.TypeJoin || t.TP == plancodec.TypeDataSource { + return []*tracing.LogicalPlanTrace{t} + } + var r []*tracing.LogicalPlanTrace + for _, child := range t.Children { + r = append(r, findRoots(child)...) + } + return r +} + +type joinReorderTrace struct { + opt *logicalOptimizeOp + initial string + final string + cost map[string]float64 +} + +func (t *joinReorderTrace) traceJoinReorder(p LogicalPlan) { + if t == nil || t.opt == nil || t.opt.tracer == nil { + return + } + if len(t.initial) > 0 { + t.final = allJoinOrderToString(extractJoinAndDataSource(p.buildLogicalPlanTrace(p))) + return + } + t.initial = allJoinOrderToString(extractJoinAndDataSource(p.buildLogicalPlanTrace(p))) +} + +func (t *joinReorderTrace) appendLogicalJoinCost(join LogicalPlan, cost float64) { + if t == nil || t.opt == nil || t.opt.tracer == nil { + return + } + joinMapKey := allJoinOrderToString(extractJoinAndDataSource(join.buildLogicalPlanTrace(join))) + t.cost[joinMapKey] = cost +} diff --git a/planner/core/rule_join_reorder_dp.go b/planner/core/rule_join_reorder_dp.go index 560aa5848b54d..d5db965667258 100644 --- a/planner/core/rule_join_reorder_dp.go +++ b/planner/core/rule_join_reorder_dp.go @@ -37,16 +37,18 @@ type joinGroupNonEqEdge struct { expr expression.Expression } -func (s *joinReorderDPSolver) solve(joinGroup []LogicalPlan, eqConds []expression.Expression) (LogicalPlan, error) { +func (s *joinReorderDPSolver) solve(joinGroup []LogicalPlan, eqConds []expression.Expression, tracer *joinReorderTrace) (LogicalPlan, error) { for _, node := range joinGroup { _, err := node.recursiveDeriveStats(nil) if err != nil { return nil, err } + cost := s.baseNodeCumCost(node) s.curJoinGroup = append(s.curJoinGroup, &jrNode{ p: node, - cumCost: s.baseNodeCumCost(node), + cumCost: cost, }) + tracer.appendLogicalJoinCost(node, cost) } adjacents := make([][]int, len(s.curJoinGroup)) totalEqEdges := make([]joinGroupEqEdge, 0, len(eqConds)) @@ -120,7 +122,7 @@ func (s *joinReorderDPSolver) solve(joinGroup []LogicalPlan, eqConds []expressio totalNonEqEdges = append(totalNonEqEdges[:i], totalNonEqEdges[i+1:]...) } // Do DP on each sub graph. - join, err := s.dpGraph(visitID2NodeID, nodeID2VisitID, joinGroup, totalEqEdges, subNonEqEdges) + join, err := s.dpGraph(visitID2NodeID, nodeID2VisitID, joinGroup, totalEqEdges, subNonEqEdges, tracer) if err != nil { return nil, err } @@ -159,7 +161,7 @@ func (s *joinReorderDPSolver) bfsGraph(startNode int, visited []bool, adjacents // It implements the traditional join reorder algorithm: DP by subset using the following formula: // bestPlan[S:set of node] = the best one among Join(bestPlan[S1:subset of S], bestPlan[S2: S/S1]) func (s *joinReorderDPSolver) dpGraph(visitID2NodeID, nodeID2VisitID []int, joinGroup []LogicalPlan, - totalEqEdges []joinGroupEqEdge, totalNonEqEdges []joinGroupNonEqEdge) (LogicalPlan, error) { + totalEqEdges []joinGroupEqEdge, totalNonEqEdges []joinGroupNonEqEdge, tracer *joinReorderTrace) (LogicalPlan, error) { nodeCnt := uint(len(visitID2NodeID)) bestPlan := make([]*jrNode, 1<<nodeCnt) // bestPlan[s] is nil can be treated as bestCost[s] = +inf. @@ -192,6 +194,7 @@ func (s *joinReorderDPSolver) dpGraph(visitID2NodeID, nodeID2VisitID []int, join return nil, err } curCost := s.calcJoinCumCost(join, bestPlan[sub], bestPlan[remain]) + tracer.appendLogicalJoinCost(join, curCost) if bestPlan[nodeBitmap] == nil { bestPlan[nodeBitmap] = &jrNode{ p: join, diff --git a/planner/core/rule_join_reorder_dp_test.go b/planner/core/rule_join_reorder_dp_test.go index 4c6b849d9c0b7..5d674dca9e66a 100644 --- a/planner/core/rule_join_reorder_dp_test.go +++ b/planner/core/rule_join_reorder_dp_test.go @@ -195,7 +195,7 @@ func (s *testJoinReorderDPSuite) TestDPReorderTPCHQ5(c *C) { }, newJoin: s.newMockJoin, } - result, err := solver.solve(joinGroups, eqConds) + result, err := solver.solve(joinGroups, eqConds, nil) c.Assert(err, IsNil) c.Assert(s.planToString(result), Equals, "MockJoin{supplier, MockJoin{lineitem, MockJoin{orders, MockJoin{customer, MockJoin{nation, region}}}}}") } @@ -212,7 +212,7 @@ func (s *testJoinReorderDPSuite) TestDPReorderAllCartesian(c *C) { }, newJoin: s.newMockJoin, } - result, err := solver.solve(joinGroup, nil) + result, err := solver.solve(joinGroup, nil, nil) c.Assert(err, IsNil) c.Assert(s.planToString(result), Equals, "MockJoin{MockJoin{a, b}, MockJoin{c, d}}") } diff --git a/planner/core/rule_join_reorder_greedy.go b/planner/core/rule_join_reorder_greedy.go index 94fcd2e026517..70b287125e3b9 100644 --- a/planner/core/rule_join_reorder_greedy.go +++ b/planner/core/rule_join_reorder_greedy.go @@ -41,16 +41,18 @@ type joinReorderGreedySolver struct { // // For the nodes and join trees which don't have a join equal condition to // connect them, we make a bushy join tree to do the cartesian joins finally. -func (s *joinReorderGreedySolver) solve(joinNodePlans []LogicalPlan) (LogicalPlan, error) { +func (s *joinReorderGreedySolver) solve(joinNodePlans []LogicalPlan, tracer *joinReorderTrace) (LogicalPlan, error) { for _, node := range joinNodePlans { _, err := node.recursiveDeriveStats(nil) if err != nil { return nil, err } + cost := s.baseNodeCumCost(node) s.curJoinGroup = append(s.curJoinGroup, &jrNode{ p: node, - cumCost: s.baseNodeCumCost(node), + cumCost: cost, }) + tracer.appendLogicalJoinCost(node, cost) } sort.SliceStable(s.curJoinGroup, func(i, j int) bool { return s.curJoinGroup[i].cumCost < s.curJoinGroup[j].cumCost @@ -58,7 +60,7 @@ func (s *joinReorderGreedySolver) solve(joinNodePlans []LogicalPlan) (LogicalPla var cartesianGroup []LogicalPlan for len(s.curJoinGroup) > 0 { - newNode, err := s.constructConnectedJoinTree() + newNode, err := s.constructConnectedJoinTree(tracer) if err != nil { return nil, err } @@ -68,7 +70,7 @@ func (s *joinReorderGreedySolver) solve(joinNodePlans []LogicalPlan) (LogicalPla return s.makeBushyJoin(cartesianGroup), nil } -func (s *joinReorderGreedySolver) constructConnectedJoinTree() (*jrNode, error) { +func (s *joinReorderGreedySolver) constructConnectedJoinTree(tracer *joinReorderTrace) (*jrNode, error) { curJoinTree := s.curJoinGroup[0] s.curJoinGroup = s.curJoinGroup[1:] for { @@ -86,6 +88,7 @@ func (s *joinReorderGreedySolver) constructConnectedJoinTree() (*jrNode, error) return nil, err } curCost := s.calcJoinCumCost(newJoin, curJoinTree, node) + tracer.appendLogicalJoinCost(newJoin, curCost) if bestCost > curCost { bestCost = curCost bestJoin = newJoin diff --git a/planner/core/rule_max_min_eliminate.go b/planner/core/rule_max_min_eliminate.go index 70f8c7da9d7ec..858f9005c2273 100644 --- a/planner/core/rule_max_min_eliminate.go +++ b/planner/core/rule_max_min_eliminate.go @@ -15,7 +15,9 @@ package core import ( + "bytes" "context" + "fmt" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/expression/aggregation" @@ -34,21 +36,24 @@ import ( type maxMinEliminator struct { } -func (a *maxMinEliminator) optimize(ctx context.Context, p LogicalPlan) (LogicalPlan, error) { - return a.eliminateMaxMin(p), nil +func (a *maxMinEliminator) optimize(ctx context.Context, p LogicalPlan, opt *logicalOptimizeOp) (LogicalPlan, error) { + return a.eliminateMaxMin(p, opt), nil } // composeAggsByInnerJoin composes the scalar aggregations by cartesianJoin. -func (a *maxMinEliminator) composeAggsByInnerJoin(aggs []*LogicalAggregation) (plan LogicalPlan) { +func (a *maxMinEliminator) composeAggsByInnerJoin(originAgg *LogicalAggregation, aggs []*LogicalAggregation, opt *logicalOptimizeOp) (plan LogicalPlan) { plan = aggs[0] sctx := plan.SCtx() + joins := make([]*LogicalJoin, 0) for i := 1; i < len(aggs); i++ { join := LogicalJoin{JoinType: InnerJoin}.Init(sctx, plan.SelectBlockOffset()) join.SetChildren(plan, aggs[i]) join.schema = buildLogicalJoinSchema(InnerJoin, join) join.cartesianJoin = true plan = join + joins = append(joins, join) } + appendEliminateMultiMinMaxTraceStep(originAgg, aggs, joins, opt) return } @@ -132,7 +137,7 @@ func (a *maxMinEliminator) cloneSubPlans(plan LogicalPlan) LogicalPlan { // `select max(a) from t` + `select min(a) from t` + `select max(b) from t`. // Then we check whether `a` and `b` have indices. If any of the used column has no index, we cannot eliminate // this aggregation. -func (a *maxMinEliminator) splitAggFuncAndCheckIndices(agg *LogicalAggregation) (aggs []*LogicalAggregation, canEliminate bool) { +func (a *maxMinEliminator) splitAggFuncAndCheckIndices(agg *LogicalAggregation, opt *logicalOptimizeOp) (aggs []*LogicalAggregation, canEliminate bool) { for _, f := range agg.AggFuncs { // We must make sure the args of max/min is a simple single column. col, ok := f.Args[0].(*expression.Column) @@ -158,16 +163,18 @@ func (a *maxMinEliminator) splitAggFuncAndCheckIndices(agg *LogicalAggregation) } // eliminateSingleMaxMin tries to convert a single max/min to Limit+Sort operators. -func (a *maxMinEliminator) eliminateSingleMaxMin(agg *LogicalAggregation) *LogicalAggregation { +func (a *maxMinEliminator) eliminateSingleMaxMin(agg *LogicalAggregation, opt *logicalOptimizeOp) *LogicalAggregation { f := agg.AggFuncs[0] child := agg.Children()[0] ctx := agg.SCtx() + var sel *LogicalSelection + var sort *LogicalSort // If there's no column in f.GetArgs()[0], we still need limit and read data from real table because the result should be NULL if the input is empty. if len(expression.ExtractColumns(f.Args[0])) > 0 { // If it can be NULL, we need to filter NULL out first. if !mysql.HasNotNullFlag(f.Args[0].GetType().Flag) { - sel := LogicalSelection{}.Init(ctx, agg.blockOffset) + sel = LogicalSelection{}.Init(ctx, agg.blockOffset) isNullFunc := expression.NewFunctionInternal(ctx, ast.IsNull, types.NewFieldType(mysql.TypeTiny), f.Args[0]) notNullFunc := expression.NewFunctionInternal(ctx, ast.UnaryNot, types.NewFieldType(mysql.TypeTiny), isNullFunc) sel.Conditions = []expression.Expression{notNullFunc} @@ -179,7 +186,7 @@ func (a *maxMinEliminator) eliminateSingleMaxMin(agg *LogicalAggregation) *Logic // For max function, the sort order should be desc. desc := f.Name == ast.AggFuncMax // Compose Sort operator. - sort := LogicalSort{}.Init(ctx, agg.blockOffset) + sort = LogicalSort{}.Init(ctx, agg.blockOffset) sort.ByItems = append(sort.ByItems, &util.ByItems{Expr: f.Args[0], Desc: desc}) sort.SetChildren(child) child = sort @@ -192,14 +199,15 @@ func (a *maxMinEliminator) eliminateSingleMaxMin(agg *LogicalAggregation) *Logic // If no data in the child, we need to return NULL instead of empty. This cannot be done by sort and limit themselves. // Since now there would be at most one row returned, the remained agg operator is not expensive anymore. agg.SetChildren(li) + appendEliminateSingleMaxMinTrace(agg, sel, sort, li, opt) return agg } // eliminateMaxMin tries to convert max/min to Limit+Sort operators. -func (a *maxMinEliminator) eliminateMaxMin(p LogicalPlan) LogicalPlan { +func (a *maxMinEliminator) eliminateMaxMin(p LogicalPlan, opt *logicalOptimizeOp) LogicalPlan { newChildren := make([]LogicalPlan, 0, len(p.Children())) for _, child := range p.Children() { - newChildren = append(newChildren, a.eliminateMaxMin(child)) + newChildren = append(newChildren, a.eliminateMaxMin(child, opt)) } p.SetChildren(newChildren...) if agg, ok := p.(*LogicalAggregation); ok { @@ -222,18 +230,18 @@ func (a *maxMinEliminator) eliminateMaxMin(p LogicalPlan) LogicalPlan { if len(agg.AggFuncs) == 1 { // If there is only one aggFunc, we don't need to guarantee that the child of it is a data // source, or whether the sort can be eliminated. This transformation won't be worse than previous. - return a.eliminateSingleMaxMin(agg) + return a.eliminateSingleMaxMin(agg, opt) } // If we have more than one aggFunc, we can eliminate this agg only if all of the aggFuncs can benefit from // their column's index. - aggs, canEliminate := a.splitAggFuncAndCheckIndices(agg) + aggs, canEliminate := a.splitAggFuncAndCheckIndices(agg, opt) if !canEliminate { return agg } for i := range aggs { - aggs[i] = a.eliminateSingleMaxMin(aggs[i]) + aggs[i] = a.eliminateSingleMaxMin(aggs[i], opt) } - return a.composeAggsByInnerJoin(aggs) + return a.composeAggsByInnerJoin(agg, aggs, opt) } return p } @@ -241,3 +249,61 @@ func (a *maxMinEliminator) eliminateMaxMin(p LogicalPlan) LogicalPlan { func (*maxMinEliminator) name() string { return "max_min_eliminate" } + +func appendEliminateSingleMaxMinTrace(agg *LogicalAggregation, sel *LogicalSelection, sort *LogicalSort, limit *LogicalLimit, opt *logicalOptimizeOp) { + action := func() string { + buffer := bytes.NewBufferString("") + if sel != nil { + buffer.WriteString(fmt.Sprintf("add selection[%v],", sel.ID())) + } + if sort != nil { + buffer.WriteString(fmt.Sprintf("add sort[%v],", sort.ID())) + } + buffer.WriteString(fmt.Sprintf("add limit[%v] during eliminating agg[%v] %s function", limit.ID(), agg.ID(), agg.AggFuncs[0].Name)) + return buffer.String() + }() + reason := func() string { + buffer := bytes.NewBufferString(fmt.Sprintf("agg[%v] has only one function[%s] without group by", agg.ID(), agg.AggFuncs[0].Name)) + if sel != nil { + buffer.WriteString(fmt.Sprintf(", the columns in agg[%v] shouldn't be NULL and needs NULL to be filtered out", agg.ID())) + } + if sort != nil { + buffer.WriteString(fmt.Sprintf(", the columns in agg[%v] should be sorted", agg.ID())) + } + return buffer.String() + }() + opt.appendStepToCurrent(agg.ID(), agg.TP(), reason, action) +} + +func appendEliminateMultiMinMaxTraceStep(originAgg *LogicalAggregation, aggs []*LogicalAggregation, joins []*LogicalJoin, opt *logicalOptimizeOp) { + action := func() string { + buffer := bytes.NewBufferString(fmt.Sprintf("agg[%v] splited into aggs[", originAgg.ID())) + for i, agg := range aggs { + if i > 0 { + buffer.WriteString(",") + } + buffer.WriteString(fmt.Sprintf("%v", agg.ID())) + } + buffer.WriteString("], and add joins[") + for i, join := range joins { + if i > 0 { + buffer.WriteString(",") + } + buffer.WriteString(fmt.Sprintf("%v", join.ID())) + } + buffer.WriteString(fmt.Sprintf("] to connect them during eliminating agg[%v] multi min/max functions", originAgg.ID())) + return buffer.String() + }() + reason := func() string { + buffer := bytes.NewBufferString("each column is sorted and can benefit from index/primary key in agg[") + for i, agg := range aggs { + if i > 0 { + buffer.WriteString(",") + } + buffer.WriteString(fmt.Sprintf("%v", agg.ID())) + } + buffer.WriteString("] and none of them has group by clause") + return buffer.String() + }() + opt.appendStepToCurrent(originAgg.ID(), originAgg.TP(), reason, action) +} diff --git a/planner/core/rule_partition_processor.go b/planner/core/rule_partition_processor.go index f88ff67b4241c..1264a47ac97bc 100644 --- a/planner/core/rule_partition_processor.go +++ b/planner/core/rule_partition_processor.go @@ -57,8 +57,9 @@ const FullRange = -1 // partitionProcessor is here because it's easier to prune partition after predicate push down. type partitionProcessor struct{} -func (s *partitionProcessor) optimize(ctx context.Context, lp LogicalPlan) (LogicalPlan, error) { - return s.rewriteDataSource(lp) +func (s *partitionProcessor) optimize(ctx context.Context, lp LogicalPlan, opt *logicalOptimizeOp) (LogicalPlan, error) { + p, err := s.rewriteDataSource(lp) + return p, err } func (s *partitionProcessor) rewriteDataSource(lp LogicalPlan) (LogicalPlan, error) { @@ -139,7 +140,7 @@ func (s *partitionProcessor) findUsedPartitions(ctx sessionctx.Context, tbl tabl ranges := detachedResult.Ranges used := make([]int, 0, len(ranges)) for _, r := range ranges { - if r.IsPointNullable(ctx.GetSessionVars().StmtCtx) { + if r.IsPointNullable(ctx) { if !r.HighVal[0].IsNull() { if len(r.HighVal) != len(partIdx) { used = []int{-1} @@ -472,7 +473,7 @@ func (l *listPartitionPruner) locateColumnPartitionsByCondition(cond expression. return nil, true, nil } var locations []tables.ListPartitionLocation - if r.IsPointNullable(sc) { + if r.IsPointNullable(l.ctx) { location, err := colPrune.LocatePartition(sc, r.HighVal[0]) if types.ErrOverflow.Equal(err) { return nil, true, nil // return full-scan if over-flow @@ -554,7 +555,7 @@ func (l *listPartitionPruner) findUsedListPartitions(conds []expression.Expressi } used := make(map[int]struct{}, len(ranges)) for _, r := range ranges { - if r.IsPointNullable(l.ctx.GetSessionVars().StmtCtx) { + if r.IsPointNullable(l.ctx) { if len(r.HighVal) != len(exprCols) { return l.fullRange, nil } @@ -1282,7 +1283,7 @@ func (s *partitionProcessor) resolveAccessPaths(ds *DataSource) error { if err != nil { return err } - possiblePaths, err = filterPathByIsolationRead(ds.ctx, possiblePaths, ds.DBName) + possiblePaths, err = filterPathByIsolationRead(ds.ctx, possiblePaths, ds.tableInfo.Name, ds.DBName) if err != nil { return err } @@ -1414,9 +1415,6 @@ func (s *partitionProcessor) makeUnionAllChildren(ds *DataSource, pi *model.Part // id as FromID. So we set the id of the newDataSource with the original one to // avoid traversing the whole plan tree to update the references. newDataSource.id = ds.id - if !ds.ctx.GetSessionVars().UseDynamicPartitionPrune() { - newDataSource.statisticTable = getStatsTable(ds.SCtx(), ds.table.Meta(), pi.Definitions[i].ID) - } err := s.resolveOptimizeHint(&newDataSource, pi.Definitions[i].Name) partitionNameSet.Insert(pi.Definitions[i].Name.L) if err != nil { @@ -1533,7 +1531,7 @@ func (p *rangeColumnsPruner) pruneUseBinarySearch(sctx sessionctx.Context, op st } var expr expression.Expression expr, err = expression.NewFunctionBase(sctx, op, types.NewFieldType(mysql.TypeLonglong), p.data[ith], v) - expr.SetCharsetAndCollation(f.CharsetAndCollation(sctx)) + expr.SetCharsetAndCollation(f.CharsetAndCollation()) var val int64 val, isNull, err = expr.EvalInt(sctx, chunk.Row{}) return val > 0 diff --git a/planner/core/rule_predicate_push_down.go b/planner/core/rule_predicate_push_down.go index 3b7be4fbee6be..f59fedc25ba28 100644 --- a/planner/core/rule_predicate_push_down.go +++ b/planner/core/rule_predicate_push_down.go @@ -27,7 +27,7 @@ import ( type ppdSolver struct{} -func (s *ppdSolver) optimize(ctx context.Context, lp LogicalPlan) (LogicalPlan, error) { +func (s *ppdSolver) optimize(ctx context.Context, lp LogicalPlan, opt *logicalOptimizeOp) (LogicalPlan, error) { _, p := lp.PredicatePushDown(nil) return p, nil } @@ -288,10 +288,14 @@ func (p *LogicalProjection) appendExpr(expr expression.Expression) *expression.C col := &expression.Column{ UniqueID: p.ctx.GetSessionVars().AllocPlanColumnID(), - RetType: expr.GetType(), + RetType: expr.GetType().Clone(), } col.SetCoercibility(expr.Coercibility()) p.schema.Append(col) + // reset ParseToJSONFlag in order to keep the flag away from json column + if col.GetType().Tp == mysql.TypeJSON { + col.GetType().Flag &= ^mysql.ParseToJSONFlag + } return col } diff --git a/planner/core/rule_result_reorder.go b/planner/core/rule_result_reorder.go index 3a4069e9945fc..7ea7d73556b4d 100644 --- a/planner/core/rule_result_reorder.go +++ b/planner/core/rule_result_reorder.go @@ -37,7 +37,7 @@ import ( type resultReorder struct { } -func (rs *resultReorder) optimize(ctx context.Context, lp LogicalPlan) (LogicalPlan, error) { +func (rs *resultReorder) optimize(ctx context.Context, lp LogicalPlan, opt *logicalOptimizeOp) (LogicalPlan, error) { ordered := rs.completeSort(lp) if !ordered { lp = rs.injectSort(lp) diff --git a/planner/core/rule_topn_push_down.go b/planner/core/rule_topn_push_down.go index 60a8fb92b39af..e6234bbc3f3dc 100644 --- a/planner/core/rule_topn_push_down.go +++ b/planner/core/rule_topn_push_down.go @@ -26,7 +26,7 @@ import ( type pushDownTopNOptimizer struct { } -func (s *pushDownTopNOptimizer) optimize(ctx context.Context, p LogicalPlan) (LogicalPlan, error) { +func (s *pushDownTopNOptimizer) optimize(ctx context.Context, p LogicalPlan, opt *logicalOptimizeOp) (LogicalPlan, error) { return p.pushDownTopN(nil), nil } diff --git a/planner/core/stats.go b/planner/core/stats.go index a1ad2cdeebd31..d3f23427b2f40 100644 --- a/planner/core/stats.go +++ b/planner/core/stats.go @@ -33,7 +33,6 @@ import ( "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/ranger" "go.uber.org/zap" - "golang.org/x/tools/container/intsets" ) func (p *basePhysicalPlan) StatsCount() float64 { @@ -227,7 +226,7 @@ func (ds *DataSource) initStats(colGroups [][]*expression.Column) { return } if ds.statisticTable == nil { - ds.statisticTable = getStatsTable(ds.ctx, ds.tableInfo, ds.table.Meta().ID) + ds.statisticTable = getStatsTable(ds.ctx, ds.tableInfo, ds.physicalTableID) } tableStats := &property.StatsInfo{ RowCount: float64(ds.statisticTable.Count), @@ -254,7 +253,7 @@ func (ds *DataSource) deriveStatsByFilter(conds expression.CNFExprs, filledPaths } stats := ds.tableStats.Scale(selectivity) if ds.ctx.GetSessionVars().OptimizerSelectivityLevel >= 1 { - stats.HistColl = stats.HistColl.NewHistCollBySelectivity(ds.ctx.GetSessionVars().StmtCtx, nodes) + stats.HistColl = stats.HistColl.NewHistCollBySelectivity(ds.ctx, nodes) } return stats } @@ -284,7 +283,7 @@ func (ds *DataSource) derivePathStatsAndTryHeuristics() error { selected = path break } - if path.OnlyPointRange(ds.SCtx().GetSessionVars().StmtCtx) { + if path.OnlyPointRange(ds.SCtx()) { if path.IsTablePath() || path.Index.Unique { if path.IsSingleScan { selected = path @@ -297,9 +296,9 @@ func (ds *DataSource) derivePathStatsAndTryHeuristics() error { } } if selected == nil && len(uniqueIdxsWithDoubleScan) > 0 { - uniqueIdxColumnSets := make([]*intsets.Sparse, 0, len(uniqueIdxsWithDoubleScan)) + uniqueIdxAccessCols := make([]util.Col2Len, 0, len(uniqueIdxsWithDoubleScan)) for _, uniqueIdx := range uniqueIdxsWithDoubleScan { - uniqueIdxColumnSets = append(uniqueIdxColumnSets, expression.ExtractColumnSet(uniqueIdx.AccessConds)) + uniqueIdxAccessCols = append(uniqueIdxAccessCols, uniqueIdx.GetCol2LenFromAccessConds()) // Find the unique index with the minimal number of ranges as `uniqueBest`. if uniqueBest == nil || len(uniqueIdx.Ranges) < len(uniqueBest.Ranges) { uniqueBest = uniqueIdx @@ -314,10 +313,10 @@ func (ds *DataSource) derivePathStatsAndTryHeuristics() error { // Hence, for each index in `singleScanIdxs`, we check whether it is better than some index in `uniqueIdxsWithDoubleScan`. // If yes, the index is a refined one. We find the refined index with the minimal number of ranges as `refineBest`. for _, singleScanIdx := range singleScanIdxs { - columnSet := expression.ExtractColumnSet(singleScanIdx.AccessConds) - for _, uniqueIdxColumnSet := range uniqueIdxColumnSets { - setsResult, comparable := compareColumnSet(columnSet, uniqueIdxColumnSet) - if comparable && setsResult == 1 { + col2Len := singleScanIdx.GetCol2LenFromAccessConds() + for _, uniqueIdxCol2Len := range uniqueIdxAccessCols { + accessResult, comparable := util.CompareCol2Len(col2Len, uniqueIdxCol2Len) + if comparable && accessResult == 1 { if refinedBest == nil || len(singleScanIdx.Ranges) < len(refinedBest.Ranges) { refinedBest = singleScanIdx } @@ -409,15 +408,6 @@ func (ds *DataSource) DeriveStats(childStats []*property.StatsInfo, selfSchema * return nil, err } - // TODO: implement UnionScan + IndexMerge - isReadOnlyTxn := true - txn, err := ds.ctx.Txn(false) - if err != nil { - return nil, err - } - if txn.Valid() && !txn.IsReadOnly() { - isReadOnlyTxn = false - } // Consider the IndexMergePath. Now, we just generate `IndexMergePath` in DNF case. isPossibleIdxMerge := len(ds.pushedDownConds) > 0 && len(ds.possibleAccessPaths) > 1 sessionAndStmtPermission := (ds.ctx.GetSessionVars().GetEnableIndexMerge() || len(ds.indexMergeHints) > 0) && !ds.ctx.GetSessionVars().StmtCtx.NoIndexMergeHint @@ -431,7 +421,9 @@ func (ds *DataSource) DeriveStats(childStats []*property.StatsInfo, selfSchema * } } } - if isPossibleIdxMerge && sessionAndStmtPermission && needConsiderIndexMerge && isReadOnlyTxn && ds.tableInfo.TempTableType != model.TempTableLocal { + + readFromTableCache := ds.ctx.GetSessionVars().StmtCtx.ReadFromTableCache + if isPossibleIdxMerge && sessionAndStmtPermission && needConsiderIndexMerge && ds.tableInfo.TempTableType != model.TempTableLocal && !readFromTableCache { err := ds.generateAndPruneIndexMergePath(ds.indexMergeHints != nil) if err != nil { return nil, err @@ -476,11 +468,10 @@ func (ts *LogicalTableScan) DeriveStats(childStats []*property.StatsInfo, selfSc ts.AccessConds[i] = expression.PushDownNot(ts.ctx, expr) } ts.stats = ts.Source.deriveStatsByFilter(ts.AccessConds, nil) - sc := ts.SCtx().GetSessionVars().StmtCtx // ts.Handle could be nil if PK is Handle, and PK column has been pruned. // TODO: support clustered index. if ts.HandleCols != nil { - ts.Ranges, err = ranger.BuildTableRange(ts.AccessConds, sc, ts.HandleCols.GetCol(0).RetType) + ts.Ranges, err = ranger.BuildTableRange(ts.AccessConds, ts.ctx, ts.HandleCols.GetCol(0).RetType) } else { isUnsigned := false if ts.Source.tableInfo.PKIsHandle { @@ -632,14 +623,13 @@ func (ds *DataSource) accessPathsForConds(conditions []expression.Expression, us continue } // If we have point or empty range, just remove other possible paths. - if len(path.Ranges) == 0 || path.OnlyPointRange(ds.SCtx().GetSessionVars().StmtCtx) { + if len(path.Ranges) == 0 || path.OnlyPointRange(ds.SCtx()) { if len(results) == 0 { results = append(results, path) } else { results[0] = path results = results[:1] } - ds.ctx.GetSessionVars().StmtCtx.MaybeOverOptimized4PlanCache = true break } } else { @@ -658,14 +648,13 @@ func (ds *DataSource) accessPathsForConds(conditions []expression.Expression, us continue } // If we have empty range, or point range on unique index, just remove other possible paths. - if len(path.Ranges) == 0 || (path.OnlyPointRange(ds.SCtx().GetSessionVars().StmtCtx) && path.Index.Unique) { + if len(path.Ranges) == 0 || (path.OnlyPointRange(ds.SCtx()) && path.Index.Unique) { if len(results) == 0 { results = append(results, path) } else { results[0] = path results = results[:1] } - ds.ctx.GetSessionVars().StmtCtx.MaybeOverOptimized4PlanCache = true break } } diff --git a/planner/core/task.go b/planner/core/task.go index b3ddfde9f623d..187140c613aa5 100644 --- a/planner/core/task.go +++ b/planner/core/task.go @@ -294,7 +294,7 @@ func (p *PhysicalIndexMergeJoin) GetCost(outerTask, innerTask task) float64 { batchSize := math.Min(float64(p.ctx.GetSessionVars().IndexJoinBatchSize), outerCnt) sortFactor := 0.0 if p.NeedOuterSort { - sortFactor = math.Log2(float64(batchSize)) + sortFactor = math.Log2(batchSize) } if batchSize > 2 { innerCPUCost += outerCnt * (sortFactor + 1.0) * sessVars.CPUFactor @@ -1295,6 +1295,23 @@ func (p *PhysicalTopN) getPushedDownTopN(childPlan PhysicalPlan) *PhysicalTopN { return topN } +// canPushToIndexPlan checks if this TopN can be pushed to the index side of copTask. +// It can be pushed to the index side when all columns used by ByItems are available from the index side and +// there's no prefix index column. +func (p *PhysicalTopN) canPushToIndexPlan(indexPlan PhysicalPlan, byItemCols []*expression.Column) bool { + schema := indexPlan.Schema() + for _, col := range byItemCols { + pos := schema.ColumnIndex(col) + if pos == -1 { + return false + } + if schema.Columns[pos].IsPrefix { + return false + } + } + return true +} + func (p *PhysicalTopN) attach2Task(tasks ...task) task { t := tasks[0].copy() inputCount := t.count() @@ -1307,7 +1324,7 @@ func (p *PhysicalTopN) attach2Task(tasks ...task) task { // If all columns in topN are from index plan, we push it to index plan, otherwise we finish the index plan and // push it to table plan. var pushedDownTopN *PhysicalTopN - if !copTask.indexPlanFinished && len(copTask.indexPlan.Schema().ColumnsIndices(cols)) > 0 { + if !copTask.indexPlanFinished && p.canPushToIndexPlan(copTask.indexPlan, cols) { pushedDownTopN = p.getPushedDownTopN(copTask.indexPlan) copTask.indexPlan = pushedDownTopN } else { @@ -1458,6 +1475,18 @@ func CheckAggCanPushCop(sctx sessionctx.Context, aggFuncs []*aggregation.AggFunc ret = false break } + orderBySize := len(aggFunc.OrderByItems) + if orderBySize > 0 { + exprs := make([]expression.Expression, 0, orderBySize) + for _, item := range aggFunc.OrderByItems { + exprs = append(exprs, item.Expr) + } + if !expression.CanExprsPushDownWithExtraInfo(sc, exprs, client, storeType, false) { + reason = "arguments of AggFunc `" + aggFunc.Name + "` contains unsupported exprs in order-by clause" + ret = false + break + } + } pb := aggregation.AggFuncToPBExpr(sctx, client, aggFunc) if pb == nil { reason = "AggFunc `" + aggFunc.Name + "` can not be converted to pb expr" @@ -1546,6 +1575,7 @@ func BuildFinalModeAggregation( for i, aggFunc := range original.AggFuncs { finalAggFunc := &aggregation.AggFuncDesc{HasDistinct: false} finalAggFunc.Name = aggFunc.Name + finalAggFunc.OrderByItems = aggFunc.OrderByItems args := make([]expression.Expression, 0, len(aggFunc.Args)) if aggFunc.HasDistinct { /* @@ -1563,7 +1593,8 @@ func BuildFinalModeAggregation( // 1. add all args to partial.GroupByItems foundInGroupBy := false for j, gbyExpr := range partial.GroupByItems { - if gbyExpr.Equal(sctx, distinctArg) { + if gbyExpr.Equal(sctx, distinctArg) && gbyExpr.GetType().Equal(distinctArg.GetType()) { + // if the two expressions exactly the same in terms of data types and collation, then can avoid it. foundInGroupBy = true ret = partialGbySchema.Columns[j] break @@ -1673,12 +1704,18 @@ func BuildFinalModeAggregation( if aggFunc.Name == ast.AggFuncAvg { cntAgg := aggFunc.Clone() cntAgg.Name = ast.AggFuncCount - cntAgg.RetTp = partial.Schema.Columns[partialCursor-2].GetType() - cntAgg.RetTp.Flag = aggFunc.RetTp.Flag + err := cntAgg.TypeInfer(sctx) + if err != nil { // must not happen + partial = nil + final = original + return + } + partial.Schema.Columns[partialCursor-2].RetType = cntAgg.RetTp // we must call deep clone in this case, to avoid sharing the arguments. sumAgg := aggFunc.Clone() sumAgg.Name = ast.AggFuncSum - sumAgg.RetTp = partial.Schema.Columns[partialCursor-1].GetType() + sumAgg.TypeInfer4AvgSum(sumAgg.RetTp) + partial.Schema.Columns[partialCursor-1].RetType = sumAgg.RetTp partial.AggFuncs = append(partial.AggFuncs, cntAgg, sumAgg) } else if aggFunc.Name == ast.AggFuncApproxCountDistinct || aggFunc.Name == ast.AggFuncGroupConcat { newAggFunc := *aggFunc @@ -1700,7 +1737,6 @@ func BuildFinalModeAggregation( finalAggFunc.Args = args finalAggFunc.RetTp = aggFunc.RetTp final.AggFuncs[i] = finalAggFunc - finalAggFunc.OrderByItems = aggFunc.OrderByItems } partial.Schema.Append(partialGbySchema.Columns...) return @@ -1715,8 +1751,6 @@ func (p *basePhysicalAgg) convertAvgForMPP() *PhysicalProjection { newSchema.Keys = p.schema.Keys newSchema.UniqueKeys = p.schema.UniqueKeys newAggFuncs := make([]*aggregation.AggFuncDesc, 0, 2*len(p.AggFuncs)) - ft := types.NewFieldType(mysql.TypeLonglong) - ft.Flen, ft.Decimal, ft.Charset, ft.Collate = 20, 0, charset.CharsetBin, charset.CollationBin exprs := make([]expression.Expression, 0, 2*len(p.schema.Columns)) // add agg functions schema for i, aggFunc := range p.AggFuncs { @@ -1724,24 +1758,31 @@ func (p *basePhysicalAgg) convertAvgForMPP() *PhysicalProjection { // inset a count(column) avgCount := aggFunc.Clone() avgCount.Name = ast.AggFuncCount + err := avgCount.TypeInfer(p.ctx) + if err != nil { // must not happen + return nil + } newAggFuncs = append(newAggFuncs, avgCount) - avgCount.RetTp = ft avgCountCol := &expression.Column{ UniqueID: p.SCtx().GetSessionVars().AllocPlanColumnID(), - RetType: ft, + RetType: avgCount.RetTp, } newSchema.Append(avgCountCol) // insert a sum(column) avgSum := aggFunc.Clone() avgSum.Name = ast.AggFuncSum + avgSum.TypeInfer4AvgSum(avgSum.RetTp) newAggFuncs = append(newAggFuncs, avgSum) - newSchema.Append(p.schema.Columns[i]) - avgSumCol := p.schema.Columns[i] + avgSumCol := &expression.Column{ + UniqueID: p.schema.Columns[i].UniqueID, + RetType: avgSum.RetTp, + } + newSchema.Append(avgSumCol) // avgSumCol/(case when avgCountCol=0 then 1 else avgCountCol end) eq := expression.NewFunctionInternal(p.ctx, ast.EQ, types.NewFieldType(mysql.TypeTiny), avgCountCol, expression.NewZero()) caseWhen := expression.NewFunctionInternal(p.ctx, ast.Case, avgCountCol.RetType, eq, expression.NewOne(), avgCountCol) divide := expression.NewFunctionInternal(p.ctx, ast.Div, avgSumCol.RetType, avgSumCol, caseWhen) - divide.(*expression.ScalarFunction).RetType = avgSumCol.RetType + divide.(*expression.ScalarFunction).RetType = p.schema.Columns[i].RetType exprs = append(exprs, divide) } else { newAggFuncs = append(newAggFuncs, aggFunc) @@ -2213,6 +2254,17 @@ func (t *mppTask) convertToRootTask(ctx sessionctx.Context) *rootTask { return t.copy().(*mppTask).convertToRootTaskImpl(ctx) } +func collectPartitionInfosFromMPPPlan(p *PhysicalTableReader, mppPlan PhysicalPlan) { + switch x := mppPlan.(type) { + case *PhysicalTableScan: + p.PartitionInfos = append(p.PartitionInfos, tableScanAndPartitionInfo{x, x.PartitionInfo}) + default: + for _, ch := range mppPlan.Children() { + collectPartitionInfosFromMPPPlan(p, ch) + } + } +} + func (t *mppTask) convertToRootTaskImpl(ctx sessionctx.Context) *rootTask { sender := PhysicalExchangeSender{ ExchangeType: tipb.ExchangeType_PassThrough, @@ -2225,6 +2277,7 @@ func (t *mppTask) convertToRootTaskImpl(ctx sessionctx.Context) *rootTask { StoreType: kv.TiFlash, }.Init(ctx, t.p.SelectBlockOffset()) p.stats = t.p.statsInfo() + collectPartitionInfosFromMPPPlan(p, t.p) cst := t.cst + t.count()*ctx.GetSessionVars().GetNetworkFactor(nil) p.cost = cst / p.ctx.GetSessionVars().CopTiFlashConcurrencyFactor diff --git a/planner/core/testdata/analyze_suite_in.json b/planner/core/testdata/analyze_suite_in.json index 5e8c5bba00632..cd7aa614ebbf8 100644 --- a/planner/core/testdata/analyze_suite_in.json +++ b/planner/core/testdata/analyze_suite_in.json @@ -24,10 +24,22 @@ "cases": [ { "SQL": "explain format = 'brief' select * from t where a <= 5 and b <= 5", + "EnablePseudoForOutdatedStats": true, "RatioOfPseudoEstimate": 10.0 }, { "SQL": "explain format = 'brief' select * from t where a <= 5 and b <= 5", + "EnablePseudoForOutdatedStats": true, + "RatioOfPseudoEstimate": 0.7 + }, + { + "SQL": "explain format = 'brief' select * from t where a <= 5 and b <= 5", + "EnablePseudoForOutdatedStats": false, + "RatioOfPseudoEstimate": 10.0 + }, + { + "SQL": "explain format = 'brief' select * from t where a <= 5 and b <= 5", + "EnablePseudoForOutdatedStats": false, "RatioOfPseudoEstimate": 0.7 } ] diff --git a/planner/core/testdata/analyze_suite_out.json b/planner/core/testdata/analyze_suite_out.json index ac434e5d18f25..71a54e4d86f28 100644 --- a/planner/core/testdata/analyze_suite_out.json +++ b/planner/core/testdata/analyze_suite_out.json @@ -58,6 +58,7 @@ "Cases": [ { "SQL": "explain format = 'brief' select * from t where a <= 5 and b <= 5", + "EnablePseudoForOutdatedStats": true, "RatioOfPseudoEstimate": 10, "Plan": [ "TableReader 28.80 root data:Selection", @@ -67,12 +68,33 @@ }, { "SQL": "explain format = 'brief' select * from t where a <= 5 and b <= 5", + "EnablePseudoForOutdatedStats": true, "RatioOfPseudoEstimate": 0.7, "Plan": [ "TableReader 8.84 root data:Selection", "└─Selection 8.84 cop[tikv] le(test.t.a, 5), le(test.t.b, 5)", " └─TableFullScan 80.00 cop[tikv] table:t keep order:false, stats:pseudo" ] + }, + { + "SQL": "explain format = 'brief' select * from t where a <= 5 and b <= 5", + "EnablePseudoForOutdatedStats": false, + "RatioOfPseudoEstimate": 10, + "Plan": [ + "TableReader 28.80 root data:Selection", + "└─Selection 28.80 cop[tikv] le(test.t.a, 5), le(test.t.b, 5)", + " └─TableFullScan 80.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a <= 5 and b <= 5", + "EnablePseudoForOutdatedStats": false, + "RatioOfPseudoEstimate": 0.7, + "Plan": [ + "TableReader 28.80 root data:Selection", + "└─Selection 28.80 cop[tikv] le(test.t.a, 5), le(test.t.b, 5)", + " └─TableFullScan 80.00 cop[tikv] table:t keep order:false" + ] } ] }, diff --git a/planner/core/testdata/enforce_mpp_suite_in.json b/planner/core/testdata/enforce_mpp_suite_in.json index a85200a48c7f6..70f519b80192f 100644 --- a/planner/core/testdata/enforce_mpp_suite_in.json +++ b/planner/core/testdata/enforce_mpp_suite_in.json @@ -41,7 +41,8 @@ "EXPLAIN SELECT count(b) from t where a=1; -- 7. agg func has virtual column", "EXPLAIN SELECT count(*) from t group by b; -- 8. group by virtual column", "EXPLAIN SELECT count(a) from t group by md5(a); -- 10. scalar func not supported", - "EXPLAIN SELECT count(a) from t where c=1; -- 11. type not supported" + "EXPLAIN SELECT count(a) from t where c=1; -- 11. type not supported", + "EXPLAIN SELECT count(a) from t where d=1; -- 11.1. type not supported" ] }, { diff --git a/planner/core/testdata/enforce_mpp_suite_out.json b/planner/core/testdata/enforce_mpp_suite_out.json index 428be48f548d6..d93fd15e63968 100644 --- a/planner/core/testdata/enforce_mpp_suite_out.json +++ b/planner/core/testdata/enforce_mpp_suite_out.json @@ -194,9 +194,9 @@ { "SQL": "explain select count(*) from t where a=1 -- 1. no replica", "Plan": [ - "StreamAgg_17 1.00 root funcs:count(Column#7)->Column#5", + "StreamAgg_17 1.00 root funcs:count(Column#8)->Column#6", "└─IndexReader_18 1.00 root index:StreamAgg_9", - " └─StreamAgg_9 1.00 cop[tikv] funcs:count(1)->Column#7", + " └─StreamAgg_9 1.00 cop[tikv] funcs:count(1)->Column#8", " └─IndexRangeScan_16 10.00 cop[tikv] table:t, index:idx(a) range:[1,1], keep order:false, stats:pseudo" ], "Warn": [ @@ -211,9 +211,9 @@ { "SQL": "explain select count(*) from t where a=1 -- 2. replica not ready", "Plan": [ - "StreamAgg_17 1.00 root funcs:count(Column#7)->Column#5", + "StreamAgg_17 1.00 root funcs:count(Column#8)->Column#6", "└─IndexReader_18 1.00 root index:StreamAgg_9", - " └─StreamAgg_9 1.00 cop[tikv] funcs:count(1)->Column#7", + " └─StreamAgg_9 1.00 cop[tikv] funcs:count(1)->Column#8", " └─IndexRangeScan_16 10.00 cop[tikv] table:t, index:idx(a) range:[1,1], keep order:false, stats:pseudo" ], "Warn": [ @@ -233,9 +233,9 @@ { "SQL": "explain select count(*) from t where a=1 -- 3. isolation_engine not match", "Plan": [ - "StreamAgg_17 1.00 root funcs:count(Column#7)->Column#5", + "StreamAgg_17 1.00 root funcs:count(Column#8)->Column#6", "└─IndexReader_18 1.00 root index:StreamAgg_9", - " └─StreamAgg_9 1.00 cop[tikv] funcs:count(1)->Column#7", + " └─StreamAgg_9 1.00 cop[tikv] funcs:count(1)->Column#8", " └─IndexRangeScan_16 10.00 cop[tikv] table:t, index:idx(a) range:[1,1], keep order:false, stats:pseudo" ], "Warn": [ @@ -250,9 +250,9 @@ { "SQL": "explain select /*+ read_from_storage(tikv[t]) */ count(*) from t where a=1 -- 4. hint use tikv", "Plan": [ - "StreamAgg_19 1.00 root funcs:count(Column#7)->Column#5", + "StreamAgg_19 1.00 root funcs:count(Column#8)->Column#6", "└─IndexReader_20 1.00 root index:StreamAgg_11", - " └─StreamAgg_11 1.00 cop[tikv] funcs:count(1)->Column#7", + " └─StreamAgg_11 1.00 cop[tikv] funcs:count(1)->Column#8", " └─IndexRangeScan_18 10.00 cop[tikv] table:t, index:idx(a) range:[1,1], keep order:false, stats:pseudo" ], "Warn": [ @@ -262,7 +262,7 @@ { "SQL": "explain SELECT a, ROW_NUMBER() OVER (ORDER BY a) FROM t; -- 5. window unsupported", "Plan": [ - "Window_7 10000.00 root row_number()->Column#6 over(order by test.t.a rows between current row and current row)", + "Window_7 10000.00 root row_number()->Column#7 over(order by test.t.a rows between current row and current row)", "└─IndexReader_9 10000.00 root index:IndexFullScan_8", " └─IndexFullScan_8 10000.00 cop[tikv] table:t, index:idx(a) keep order:true, stats:pseudo" ], @@ -289,7 +289,7 @@ { "SQL": "EXPLAIN SELECT count(b) from t where a=1; -- 7. agg func has virtual column", "Plan": [ - "StreamAgg_11 1.00 root funcs:count(test.t.b)->Column#5", + "StreamAgg_11 1.00 root funcs:count(test.t.b)->Column#6", "└─IndexLookUp_42 10.00 root ", " ├─IndexRangeScan_40(Build) 10.00 cop[tikv] table:t, index:idx(a) range:[1,1], keep order:false, stats:pseudo", " └─TableRowIDScan_41(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo" @@ -305,7 +305,7 @@ { "SQL": "EXPLAIN SELECT count(*) from t group by b; -- 8. group by virtual column", "Plan": [ - "HashAgg_6 8000.00 root group by:test.t.b, funcs:count(1)->Column#5", + "HashAgg_6 8000.00 root group by:test.t.b, funcs:count(1)->Column#6", "└─Projection_12 10000.00 root test.t.b", " └─TableReader_11 10000.00 root data:TableFullScan_10", " └─TableFullScan_10 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" @@ -319,34 +319,47 @@ { "SQL": "EXPLAIN SELECT count(a) from t group by md5(a); -- 10. scalar func not supported", "Plan": [ - "HashAgg_6 8000.00 root group by:Column#7, funcs:count(Column#6)->Column#5", - "└─Projection_19 10000.00 root test.t.a, md5(cast(test.t.a, var_string(20)))->Column#7", + "HashAgg_6 8000.00 root group by:Column#8, funcs:count(Column#7)->Column#6", + "└─Projection_19 10000.00 root test.t.a, md5(cast(test.t.a, var_string(20)))->Column#8", " └─TableReader_12 10000.00 root data:TableFullScan_10", " └─TableFullScan_10 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" ], "Warn": [ - "Scalar function 'md5'(signature: MD5, return type: var_string(32)) can not be pushed to tiflash", + "Scalar function 'md5'(signature: MD5, return type: var_string(32)) is not supported to push down to tiflash now.", "Aggregation can not be pushed to tiflash because groupByItems contain unsupported exprs", - "Scalar function 'md5'(signature: MD5, return type: var_string(32)) can not be pushed to tiflash", + "Scalar function 'md5'(signature: MD5, return type: var_string(32)) is not supported to push down to tiflash now.", "Aggregation can not be pushed to tiflash because groupByItems contain unsupported exprs", - "Scalar function 'md5'(signature: MD5, return type: var_string(32)) can not be pushed to tiflash", + "Scalar function 'md5'(signature: MD5, return type: var_string(32)) is not supported to push down to tiflash now.", "Aggregation can not be pushed to tiflash because groupByItems contain unsupported exprs" ] }, { "SQL": "EXPLAIN SELECT count(a) from t where c=1; -- 11. type not supported", "Plan": [ - "StreamAgg_11 1.00 root funcs:count(test.t.a)->Column#5", - "└─Selection_29 10.00 root eq(test.t.c, 00:00:01.000000)", + "StreamAgg_11 1.00 root funcs:count(test.t.a)->Column#6", + "└─Selection_29 10.00 root eq(test.t.c, 1)", " └─TableReader_28 10000.00 root data:TableFullScan_27", " └─TableFullScan_27 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" ], "Warn": [ - "Expr 'test.t.c' can not be pushed to TiFlash because it contains Duration type", - "Expr 'test.t.c' can not be pushed to TiFlash because it contains Duration type", - "Expr 'test.t.c' can not be pushed to TiFlash because it contains Duration type", - "Expr 'test.t.c' can not be pushed to TiFlash because it contains Duration type", - "Expr 'test.t.c' can not be pushed to TiFlash because it contains Duration type" + "Expression about 'test.t.c' can not be pushed to TiFlash because it contains unsupported calculation of type 'enum'.", + "Expression about 'test.t.c' can not be pushed to TiFlash because it contains unsupported calculation of type 'enum'.", + "Expression about 'test.t.c' can not be pushed to TiFlash because it contains unsupported calculation of type 'enum'.", + "Expression about 'test.t.c' can not be pushed to TiFlash because it contains unsupported calculation of type 'enum'.", + "Expression about 'test.t.c' can not be pushed to TiFlash because it contains unsupported calculation of type 'enum'." + ] + }, + { + "SQL": "EXPLAIN SELECT count(a) from t where d=1; -- 11.1. type not supported", + "Plan": [ + "HashAgg_9 1.00 root funcs:count(test.t.a)->Column#6", + "└─Selection_19 8000.00 root eq(test.t.d, 1)", + " └─TableReader_22 10000.00 root data:ExchangeSender_21", + " └─ExchangeSender_21 10000.00 cop[tiflash] ExchangeType: PassThrough", + " └─TableFullScan_20 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + ], + "Warn": [ + "Expression about 'test.t.d' can not be pushed to TiFlash because it contains unsupported calculation of type 'bit'." ] } ] diff --git a/planner/core/testdata/integration_serial_suite_in.json b/planner/core/testdata/integration_serial_suite_in.json index cae3db289d566..aece551a5b991 100644 --- a/planner/core/testdata/integration_serial_suite_in.json +++ b/planner/core/testdata/integration_serial_suite_in.json @@ -29,6 +29,25 @@ ] }, + { + "name": "TestRegardNULLAsPoint", + "cases": [ + "select * from tuk where a<=>null and b=1", + "select * from tik where a<=>null and b=1", + "select * from tuk where a<=>null and b>0 and b<2", + "select * from tik where a<=>null and b>0 and b<2", + "select * from tuk where a<=>null and b>=1 and b<2", + "select * from tik where a<=>null and b>=1 and b<2", + "select * from tuk where a<=>null and b=1 and c=1", + "select * from tik where a<=>null and b=1 and c=1", + "select * from tuk where a=1 and b<=>null and c=1", + "select * from tik where a=1 and b<=>null and c=1", + "select * from tuk where a<=>null and b<=>null and c=1", + "select * from tik where a<=>null and b<=>null and c=1", + "select * from tuk where a<=>null and b<=>null and c<=>null", + "select * from tik where a<=>null and b<=>null and c<=>null" + ] + }, { "name": "TestPushDownToTiFlashWithKeepOrder", "cases": [ @@ -369,7 +388,37 @@ "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(col_0, id),count(distinct id),group_concat(col_1, id order by 1,2),min(col_0),avg(id) from ts", "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct col_0, col_1, id),count(distinct id),group_concat(col_1, id order by 1,2),max(col_1),avg(id) from ts", "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct col_0, col_1, id),count(distinct col_2),group_concat(col_1, id),max(col_1),avg(id) from ts", - "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct col_0, col_1, id),count(distinct col_2),group_concat(col_1, id),max(col_1),avg(id) from ts group by col_0" + "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct col_0, col_1, id),count(distinct col_2),group_concat(col_1, id),max(col_1),avg(id) from ts group by col_0", + "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct 0,'GG') from ts", + "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct 0,'01') from ts", + "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct 0,1) from ts", + "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct 0,0) from ts", + "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct 0,10) from ts group by '010'", + "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct 0,0) from ts group by '011'", + "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct 0,'GG') from ts group by 'GG'", + "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct 'GG','GG') from ts", + "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct 'Gg','GG') from ts", + "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct 'GG-10','GG') from ts", + "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct '1200-01-01 00:00:00.023',1200) from ts", + "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(col_0, col_0) from ts group by id", + "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(col_0, col_0,id) from ts group by id", + "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct col_0 order by id<10) from ts", + "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct col_0 order by id<10) from ts group by col_1", + "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct col_0>10 order by id<10) from ts group by col_1", + "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct col_0 order by col_0<=>null) from ts" + ] + }, + { + "name": "TestRejectSortForMPP", + "cases": [ + "desc format = 'brief' select count(*) from (select * from t order by id)a group by name,id order by id", + "desc format = 'brief' select count(*) from (select * from t order by id)a group by name order by 1", + "desc format = 'brief' select count(*) from (select id,name from t group by id,name order by id,name)a group by name order by 1", + "desc format = 'brief' select * from (select id from t group by id order by id)a join t on a.id=t.id order by 1", + "desc format = 'brief' select * from (select * from t order by id)a join t on a.id=t.id order by 1", + "desc format = 'brief' select * from ((select id from t order by 1) union all (select id+1 from t order by 1))c", + "desc format = 'brief' select * from ((select count(*) from (select id,name from t order by id)a group by name,id order by id) union all (select id+1 from t order by 1))c", + "desc format = 'brief' select * from (select * from t order by id)a order by name" ] } ] diff --git a/planner/core/testdata/integration_serial_suite_out.json b/planner/core/testdata/integration_serial_suite_out.json index 20d3a375f1024..fa07e7323f022 100644 --- a/planner/core/testdata/integration_serial_suite_out.json +++ b/planner/core/testdata/integration_serial_suite_out.json @@ -220,6 +220,247 @@ } ] }, + { + "Name": "TestRegardNULLAsPoint", + "Cases": [ + { + "SQL": "select * from tuk where a<=>null and b=1", + "PlanEnabled": [ + "IndexReader_6 0.10 root index:IndexRangeScan_5", + "└─IndexRangeScan_5 0.10 cop[tikv] table:tuk, index:a(a, b, c) range:[NULL 1,NULL 1], keep order:false, stats:pseudo" + ], + "PlanDisabled": [ + "IndexReader_7 0.01 root index:Selection_6", + "└─Selection_6 0.01 cop[tikv] eq(test.tuk.b, 1)", + " └─IndexRangeScan_5 10.00 cop[tikv] table:tuk, index:a(a, b, c) range:[NULL,NULL], keep order:false, stats:pseudo" + ], + "Result": [ + "<nil> 1 <nil>", + "<nil> 1 <nil>", + "<nil> 1 1", + "<nil> 1 1" + ] + }, + { + "SQL": "select * from tik where a<=>null and b=1", + "PlanEnabled": [ + "IndexReader_6 0.10 root index:IndexRangeScan_5", + "└─IndexRangeScan_5 0.10 cop[tikv] table:tik, index:a(a, b, c) range:[NULL 1,NULL 1], keep order:false, stats:pseudo" + ], + "PlanDisabled": [ + "IndexReader_7 0.01 root index:Selection_6", + "└─Selection_6 0.01 cop[tikv] eq(test.tik.b, 1)", + " └─IndexRangeScan_5 10.00 cop[tikv] table:tik, index:a(a, b, c) range:[NULL,NULL], keep order:false, stats:pseudo" + ], + "Result": [ + "<nil> 1 <nil>", + "<nil> 1 <nil>", + "<nil> 1 1", + "<nil> 1 1" + ] + }, + { + "SQL": "select * from tuk where a<=>null and b>0 and b<2", + "PlanEnabled": [ + "IndexReader_6 0.10 root index:IndexRangeScan_5", + "└─IndexRangeScan_5 0.10 cop[tikv] table:tuk, index:a(a, b, c) range:[NULL 1,NULL 1], keep order:false, stats:pseudo" + ], + "PlanDisabled": [ + "IndexReader_7 0.25 root index:Selection_6", + "└─Selection_6 0.25 cop[tikv] eq(test.tuk.b, 1)", + " └─IndexRangeScan_5 10.00 cop[tikv] table:tuk, index:a(a, b, c) range:[NULL,NULL], keep order:false, stats:pseudo" + ], + "Result": [ + "<nil> 1 <nil>", + "<nil> 1 <nil>", + "<nil> 1 1", + "<nil> 1 1" + ] + }, + { + "SQL": "select * from tik where a<=>null and b>0 and b<2", + "PlanEnabled": [ + "IndexReader_6 0.10 root index:IndexRangeScan_5", + "└─IndexRangeScan_5 0.10 cop[tikv] table:tik, index:a(a, b, c) range:[NULL 1,NULL 1], keep order:false, stats:pseudo" + ], + "PlanDisabled": [ + "IndexReader_7 0.25 root index:Selection_6", + "└─Selection_6 0.25 cop[tikv] eq(test.tik.b, 1)", + " └─IndexRangeScan_5 10.00 cop[tikv] table:tik, index:a(a, b, c) range:[NULL,NULL], keep order:false, stats:pseudo" + ], + "Result": [ + "<nil> 1 <nil>", + "<nil> 1 <nil>", + "<nil> 1 1", + "<nil> 1 1" + ] + }, + { + "SQL": "select * from tuk where a<=>null and b>=1 and b<2", + "PlanEnabled": [ + "IndexReader_6 0.10 root index:IndexRangeScan_5", + "└─IndexRangeScan_5 0.10 cop[tikv] table:tuk, index:a(a, b, c) range:[NULL 1,NULL 1], keep order:false, stats:pseudo" + ], + "PlanDisabled": [ + "IndexReader_7 0.25 root index:Selection_6", + "└─Selection_6 0.25 cop[tikv] eq(test.tuk.b, 1)", + " └─IndexRangeScan_5 10.00 cop[tikv] table:tuk, index:a(a, b, c) range:[NULL,NULL], keep order:false, stats:pseudo" + ], + "Result": [ + "<nil> 1 <nil>", + "<nil> 1 <nil>", + "<nil> 1 1", + "<nil> 1 1" + ] + }, + { + "SQL": "select * from tik where a<=>null and b>=1 and b<2", + "PlanEnabled": [ + "IndexReader_6 0.10 root index:IndexRangeScan_5", + "└─IndexRangeScan_5 0.10 cop[tikv] table:tik, index:a(a, b, c) range:[NULL 1,NULL 1], keep order:false, stats:pseudo" + ], + "PlanDisabled": [ + "IndexReader_7 0.25 root index:Selection_6", + "└─Selection_6 0.25 cop[tikv] eq(test.tik.b, 1)", + " └─IndexRangeScan_5 10.00 cop[tikv] table:tik, index:a(a, b, c) range:[NULL,NULL], keep order:false, stats:pseudo" + ], + "Result": [ + "<nil> 1 <nil>", + "<nil> 1 <nil>", + "<nil> 1 1", + "<nil> 1 1" + ] + }, + { + "SQL": "select * from tuk where a<=>null and b=1 and c=1", + "PlanEnabled": [ + "IndexReader_6 1.00 root index:IndexRangeScan_5", + "└─IndexRangeScan_5 1.00 cop[tikv] table:tuk, index:a(a, b, c) range:[NULL 1 1,NULL 1 1], keep order:false, stats:pseudo" + ], + "PlanDisabled": [ + "IndexReader_7 0.00 root index:Selection_6", + "└─Selection_6 0.00 cop[tikv] eq(test.tuk.b, 1), eq(test.tuk.c, 1)", + " └─IndexRangeScan_5 10.00 cop[tikv] table:tuk, index:a(a, b, c) range:[NULL,NULL], keep order:false, stats:pseudo" + ], + "Result": [ + "<nil> 1 1", + "<nil> 1 1" + ] + }, + { + "SQL": "select * from tik where a<=>null and b=1 and c=1", + "PlanEnabled": [ + "IndexReader_6 0.00 root index:IndexRangeScan_5", + "└─IndexRangeScan_5 0.00 cop[tikv] table:tik, index:a(a, b, c) range:[NULL 1 1,NULL 1 1], keep order:false, stats:pseudo" + ], + "PlanDisabled": [ + "IndexReader_7 0.00 root index:Selection_6", + "└─Selection_6 0.00 cop[tikv] eq(test.tik.b, 1), eq(test.tik.c, 1)", + " └─IndexRangeScan_5 10.00 cop[tikv] table:tik, index:a(a, b, c) range:[NULL,NULL], keep order:false, stats:pseudo" + ], + "Result": [ + "<nil> 1 1", + "<nil> 1 1" + ] + }, + { + "SQL": "select * from tuk where a=1 and b<=>null and c=1", + "PlanEnabled": [ + "IndexReader_6 1.00 root index:IndexRangeScan_5", + "└─IndexRangeScan_5 1.00 cop[tikv] table:tuk, index:a(a, b, c) range:[1 NULL 1,1 NULL 1], keep order:false, stats:pseudo" + ], + "PlanDisabled": [ + "IndexReader_7 0.00 root index:Selection_6", + "└─Selection_6 0.00 cop[tikv] eq(test.tuk.c, 1)", + " └─IndexRangeScan_5 0.10 cop[tikv] table:tuk, index:a(a, b, c) range:[1 NULL,1 NULL], keep order:false, stats:pseudo" + ], + "Result": [ + "1 <nil> 1", + "1 <nil> 1" + ] + }, + { + "SQL": "select * from tik where a=1 and b<=>null and c=1", + "PlanEnabled": [ + "IndexReader_6 0.00 root index:IndexRangeScan_5", + "└─IndexRangeScan_5 0.00 cop[tikv] table:tik, index:a(a, b, c) range:[1 NULL 1,1 NULL 1], keep order:false, stats:pseudo" + ], + "PlanDisabled": [ + "IndexReader_7 0.00 root index:Selection_6", + "└─Selection_6 0.00 cop[tikv] eq(test.tik.c, 1)", + " └─IndexRangeScan_5 0.10 cop[tikv] table:tik, index:a(a, b, c) range:[1 NULL,1 NULL], keep order:false, stats:pseudo" + ], + "Result": [ + "1 <nil> 1", + "1 <nil> 1" + ] + }, + { + "SQL": "select * from tuk where a<=>null and b<=>null and c=1", + "PlanEnabled": [ + "IndexReader_6 1.00 root index:IndexRangeScan_5", + "└─IndexRangeScan_5 1.00 cop[tikv] table:tuk, index:a(a, b, c) range:[NULL NULL 1,NULL NULL 1], keep order:false, stats:pseudo" + ], + "PlanDisabled": [ + "IndexReader_7 0.00 root index:Selection_6", + "└─Selection_6 0.00 cop[tikv] eq(test.tuk.c, 1), nulleq(test.tuk.b, NULL)", + " └─IndexRangeScan_5 10.00 cop[tikv] table:tuk, index:a(a, b, c) range:[NULL,NULL], keep order:false, stats:pseudo" + ], + "Result": [ + "<nil> <nil> 1", + "<nil> <nil> 1" + ] + }, + { + "SQL": "select * from tik where a<=>null and b<=>null and c=1", + "PlanEnabled": [ + "IndexReader_6 0.00 root index:IndexRangeScan_5", + "└─IndexRangeScan_5 0.00 cop[tikv] table:tik, index:a(a, b, c) range:[NULL NULL 1,NULL NULL 1], keep order:false, stats:pseudo" + ], + "PlanDisabled": [ + "IndexReader_7 0.00 root index:Selection_6", + "└─Selection_6 0.00 cop[tikv] eq(test.tik.c, 1), nulleq(test.tik.b, NULL)", + " └─IndexRangeScan_5 10.00 cop[tikv] table:tik, index:a(a, b, c) range:[NULL,NULL], keep order:false, stats:pseudo" + ], + "Result": [ + "<nil> <nil> 1", + "<nil> <nil> 1" + ] + }, + { + "SQL": "select * from tuk where a<=>null and b<=>null and c<=>null", + "PlanEnabled": [ + "IndexReader_6 1.00 root index:IndexRangeScan_5", + "└─IndexRangeScan_5 1.00 cop[tikv] table:tuk, index:a(a, b, c) range:[NULL NULL NULL,NULL NULL NULL], keep order:false, stats:pseudo" + ], + "PlanDisabled": [ + "IndexReader_7 0.00 root index:Selection_6", + "└─Selection_6 0.00 cop[tikv] nulleq(test.tuk.b, NULL), nulleq(test.tuk.c, NULL)", + " └─IndexRangeScan_5 10.00 cop[tikv] table:tuk, index:a(a, b, c) range:[NULL,NULL], keep order:false, stats:pseudo" + ], + "Result": [ + "<nil> <nil> <nil>", + "<nil> <nil> <nil>" + ] + }, + { + "SQL": "select * from tik where a<=>null and b<=>null and c<=>null", + "PlanEnabled": [ + "IndexReader_6 0.00 root index:IndexRangeScan_5", + "└─IndexRangeScan_5 0.00 cop[tikv] table:tik, index:a(a, b, c) range:[NULL NULL NULL,NULL NULL NULL], keep order:false, stats:pseudo" + ], + "PlanDisabled": [ + "IndexReader_7 0.00 root index:Selection_6", + "└─Selection_6 0.00 cop[tikv] nulleq(test.tik.b, NULL), nulleq(test.tik.c, NULL)", + " └─IndexRangeScan_5 10.00 cop[tikv] table:tik, index:a(a, b, c) range:[NULL,NULL], keep order:false, stats:pseudo" + ], + "Result": [ + "<nil> <nil> <nil>", + "<nil> <nil> <nil>" + ] + } + ] + }, { "Name": "TestPushDownToTiFlashWithKeepOrder", "Cases": [ @@ -251,59 +492,56 @@ { "SQL": "explain format = 'brief' select count(*) from fact_t, d1_t where fact_t.d1_k = d1_t.d1_k", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#12)->Column#11", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#12", - " └─HashJoin 8.00 batchCop[tiflash] inner join, equal:[eq(test.d1_t.d1_k, test.fact_t.d1_k)]", - " ├─ExchangeReceiver(Build) 2.00 batchCop[tiflash] ", - " │ └─ExchangeSender 2.00 batchCop[tiflash] ExchangeType: Broadcast", - " │ └─Selection 2.00 batchCop[tiflash] not(isnull(test.d1_t.d1_k))", - " │ └─TableFullScan 2.00 batchCop[tiflash] table:d1_t keep order:false", - " └─Selection(Probe) 8.00 batchCop[tiflash] not(isnull(test.fact_t.d1_k))", - " └─TableFullScan 8.00 batchCop[tiflash] table:fact_t keep order:false" + "StreamAgg 1.00 root funcs:count(1)->Column#11", + "└─TableReader 8.00 root data:ExchangeSender", + " └─ExchangeSender 8.00 cop[tiflash] ExchangeType: PassThrough", + " └─HashJoin 8.00 cop[tiflash] inner join, equal:[eq(test.d1_t.d1_k, test.fact_t.d1_k)]", + " ├─ExchangeReceiver(Build) 2.00 cop[tiflash] ", + " │ └─ExchangeSender 2.00 cop[tiflash] ExchangeType: Broadcast", + " │ └─Selection 2.00 cop[tiflash] not(isnull(test.d1_t.d1_k))", + " │ └─TableFullScan 2.00 cop[tiflash] table:d1_t keep order:false", + " └─Selection(Probe) 8.00 cop[tiflash] not(isnull(test.fact_t.d1_k))", + " └─TableFullScan 8.00 cop[tiflash] table:fact_t keep order:false" ] }, { "SQL": "explain format = 'brief' select count(*) from fact_t, d1_t, d2_t, d3_t where fact_t.d1_k = d1_t.d1_k and fact_t.d2_k = d2_t.d2_k and fact_t.d3_k = d3_t.d3_k", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#18)->Column#17", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#18", - " └─HashJoin 8.00 batchCop[tiflash] inner join, equal:[eq(test.fact_t.d3_k, test.d3_t.d3_k)]", - " ├─ExchangeReceiver(Build) 2.00 batchCop[tiflash] ", - " │ └─ExchangeSender 2.00 batchCop[tiflash] ExchangeType: Broadcast", - " │ └─Selection 2.00 batchCop[tiflash] not(isnull(test.d3_t.d3_k))", - " │ └─TableFullScan 2.00 batchCop[tiflash] table:d3_t keep order:false", - " └─HashJoin(Probe) 8.00 batchCop[tiflash] inner join, equal:[eq(test.fact_t.d2_k, test.d2_t.d2_k)]", - " ├─ExchangeReceiver(Build) 2.00 batchCop[tiflash] ", - " │ └─ExchangeSender 2.00 batchCop[tiflash] ExchangeType: Broadcast", - " │ └─Selection 2.00 batchCop[tiflash] not(isnull(test.d2_t.d2_k))", - " │ └─TableFullScan 2.00 batchCop[tiflash] table:d2_t keep order:false", - " └─HashJoin(Probe) 8.00 batchCop[tiflash] inner join, equal:[eq(test.d1_t.d1_k, test.fact_t.d1_k)]", - " ├─ExchangeReceiver(Build) 2.00 batchCop[tiflash] ", - " │ └─ExchangeSender 2.00 batchCop[tiflash] ExchangeType: Broadcast", - " │ └─Selection 2.00 batchCop[tiflash] not(isnull(test.d1_t.d1_k))", - " │ └─TableFullScan 2.00 batchCop[tiflash] table:d1_t keep order:false", - " └─Selection(Probe) 8.00 batchCop[tiflash] not(isnull(test.fact_t.d1_k)), not(isnull(test.fact_t.d2_k)), not(isnull(test.fact_t.d3_k))", - " └─TableFullScan 8.00 batchCop[tiflash] table:fact_t keep order:false" + "StreamAgg 1.00 root funcs:count(1)->Column#17", + "└─TableReader 8.00 root data:ExchangeSender", + " └─ExchangeSender 8.00 cop[tiflash] ExchangeType: PassThrough", + " └─HashJoin 8.00 cop[tiflash] inner join, equal:[eq(test.fact_t.d3_k, test.d3_t.d3_k)]", + " ├─ExchangeReceiver(Build) 2.00 cop[tiflash] ", + " │ └─ExchangeSender 2.00 cop[tiflash] ExchangeType: Broadcast", + " │ └─Selection 2.00 cop[tiflash] not(isnull(test.d3_t.d3_k))", + " │ └─TableFullScan 2.00 cop[tiflash] table:d3_t keep order:false", + " └─HashJoin(Probe) 8.00 cop[tiflash] inner join, equal:[eq(test.fact_t.d2_k, test.d2_t.d2_k)]", + " ├─ExchangeReceiver(Build) 2.00 cop[tiflash] ", + " │ └─ExchangeSender 2.00 cop[tiflash] ExchangeType: Broadcast", + " │ └─Selection 2.00 cop[tiflash] not(isnull(test.d2_t.d2_k))", + " │ └─TableFullScan 2.00 cop[tiflash] table:d2_t keep order:false", + " └─HashJoin(Probe) 8.00 cop[tiflash] inner join, equal:[eq(test.d1_t.d1_k, test.fact_t.d1_k)]", + " ├─ExchangeReceiver(Build) 2.00 cop[tiflash] ", + " │ └─ExchangeSender 2.00 cop[tiflash] ExchangeType: Broadcast", + " │ └─Selection 2.00 cop[tiflash] not(isnull(test.d1_t.d1_k))", + " │ └─TableFullScan 2.00 cop[tiflash] table:d1_t keep order:false", + " └─Selection(Probe) 8.00 cop[tiflash] not(isnull(test.fact_t.d1_k)), not(isnull(test.fact_t.d2_k)), not(isnull(test.fact_t.d3_k))", + " └─TableFullScan 8.00 cop[tiflash] table:fact_t keep order:false" ] }, { "SQL": "explain format = 'brief' select count(*) from fact_t, d1_t where fact_t.d1_k = d1_t.d1_k", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#12)->Column#11", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#12", - " └─HashJoin 8.00 batchCop[tiflash] inner join, equal:[eq(test.d1_t.d1_k, test.fact_t.d1_k)]", - " ├─ExchangeReceiver(Build) 2.00 batchCop[tiflash] ", - " │ └─ExchangeSender 2.00 batchCop[tiflash] ExchangeType: Broadcast", - " │ └─Selection 2.00 batchCop[tiflash] not(isnull(test.d1_t.d1_k))", - " │ └─TableFullScan 2.00 batchCop[tiflash] table:d1_t keep order:false", - " └─Selection(Probe) 8.00 batchCop[tiflash] not(isnull(test.fact_t.d1_k))", - " └─TableFullScan 8.00 batchCop[tiflash] table:fact_t keep order:false" + "StreamAgg 1.00 root funcs:count(1)->Column#11", + "└─TableReader 8.00 root data:ExchangeSender", + " └─ExchangeSender 8.00 cop[tiflash] ExchangeType: PassThrough", + " └─HashJoin 8.00 cop[tiflash] inner join, equal:[eq(test.d1_t.d1_k, test.fact_t.d1_k)]", + " ├─ExchangeReceiver(Build) 2.00 cop[tiflash] ", + " │ └─ExchangeSender 2.00 cop[tiflash] ExchangeType: Broadcast", + " │ └─Selection 2.00 cop[tiflash] not(isnull(test.d1_t.d1_k))", + " │ └─TableFullScan 2.00 cop[tiflash] table:d1_t keep order:false", + " └─Selection(Probe) 8.00 cop[tiflash] not(isnull(test.fact_t.d1_k))", + " └─TableFullScan 8.00 cop[tiflash] table:fact_t keep order:false" ] }, { @@ -337,17 +575,16 @@ { "SQL": "explain format = 'brief' select count(*) from fact_t join d1_t on fact_t.d1_k = d1_t.d1_k and fact_t.col1 > d1_t.value", "Plan": [ - "HashAgg 1.00 root funcs:count(Column#12)->Column#11", - "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#12", - " └─HashJoin 8.00 batchCop[tiflash] inner join, equal:[eq(test.d1_t.d1_k, test.fact_t.d1_k)], other cond:gt(test.fact_t.col1, test.d1_t.value)", - " ├─ExchangeReceiver(Build) 2.00 batchCop[tiflash] ", - " │ └─ExchangeSender 2.00 batchCop[tiflash] ExchangeType: Broadcast", - " │ └─Selection 2.00 batchCop[tiflash] not(isnull(test.d1_t.d1_k)), not(isnull(test.d1_t.value))", - " │ └─TableFullScan 2.00 batchCop[tiflash] table:d1_t keep order:false", - " └─Selection(Probe) 8.00 batchCop[tiflash] not(isnull(test.fact_t.col1)), not(isnull(test.fact_t.d1_k))", - " └─TableFullScan 8.00 batchCop[tiflash] table:fact_t keep order:false" + "StreamAgg 1.00 root funcs:count(1)->Column#11", + "└─TableReader 8.00 root data:ExchangeSender", + " └─ExchangeSender 8.00 cop[tiflash] ExchangeType: PassThrough", + " └─HashJoin 8.00 cop[tiflash] inner join, equal:[eq(test.d1_t.d1_k, test.fact_t.d1_k)], other cond:gt(test.fact_t.col1, test.d1_t.value)", + " ├─ExchangeReceiver(Build) 2.00 cop[tiflash] ", + " │ └─ExchangeSender 2.00 cop[tiflash] ExchangeType: Broadcast", + " │ └─Selection 2.00 cop[tiflash] not(isnull(test.d1_t.d1_k)), not(isnull(test.d1_t.value))", + " │ └─TableFullScan 2.00 cop[tiflash] table:d1_t keep order:false", + " └─Selection(Probe) 8.00 cop[tiflash] not(isnull(test.fact_t.col1)), not(isnull(test.fact_t.d1_k))", + " └─TableFullScan 8.00 cop[tiflash] table:fact_t keep order:false" ] }, { @@ -1226,7 +1463,7 @@ "StreamAgg 1.00 root funcs:avg(Column#7, Column#8)->Column#4", "└─TableReader 1.00 root data:StreamAgg", " └─StreamAgg 1.00 batchCop[tiflash] funcs:count(Column#9)->Column#7, funcs:sum(Column#10)->Column#8", - " └─Projection 10000.00 batchCop[tiflash] test.t.a, cast(test.t.a, decimal(15,4) BINARY)->Column#10", + " └─Projection 10000.00 batchCop[tiflash] test.t.a, cast(test.t.a, decimal(37,4) BINARY)->Column#10", " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" ], "Warn": null @@ -1237,7 +1474,7 @@ "StreamAgg 1.00 root funcs:avg(Column#7, Column#8)->Column#4", "└─TableReader 1.00 root data:StreamAgg", " └─StreamAgg 1.00 batchCop[tiflash] funcs:count(Column#9)->Column#7, funcs:sum(Column#10)->Column#8", - " └─Projection 10000.00 batchCop[tiflash] test.t.a, cast(test.t.a, decimal(15,4) BINARY)->Column#10", + " └─Projection 10000.00 batchCop[tiflash] test.t.a, cast(test.t.a, decimal(37,4) BINARY)->Column#10", " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" ], "Warn": null @@ -2821,23 +3058,23 @@ { "SQL": "desc format='brief' select /*+ use_index_merge(t) */ * from t where a =1 or (b=1 and length(b)=1)", "Plan": [ - "IndexMerge 1.72 root ", + "IndexMerge 8.00 root ", "├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:a(a) range:[1,1], keep order:false", - "├─Selection(Build) 0.80 cop[tikv] eq(length(cast(1, var_string(20))), 1)", + "├─Selection(Build) 0.80 cop[tikv] 1", "│ └─IndexRangeScan 1.00 cop[tikv] table:t, index:b(b) range:[1,1], keep order:false", - "└─TableRowIDScan(Probe) 1.72 cop[tikv] table:t keep order:false" + "└─TableRowIDScan(Probe) 8.00 cop[tikv] table:t keep order:false" ], "Warnings": null }, { "SQL": "desc format='brief' select /*+ use_index_merge(t) */ * from t where (a=1 and length(a)=1) or (b=1 and length(b)=1)", "Plan": [ - "IndexMerge 1.54 root ", - "├─Selection(Build) 0.80 cop[tikv] eq(length(cast(1, var_string(20))), 1)", + "IndexMerge 8.00 root ", + "├─Selection(Build) 0.80 cop[tikv] 1", "│ └─IndexRangeScan 1.00 cop[tikv] table:t, index:a(a) range:[1,1], keep order:false", - "├─Selection(Build) 0.80 cop[tikv] eq(length(cast(1, var_string(20))), 1)", + "├─Selection(Build) 0.80 cop[tikv] 1", "│ └─IndexRangeScan 1.00 cop[tikv] table:t, index:b(b) range:[1,1], keep order:false", - "└─TableRowIDScan(Probe) 1.54 cop[tikv] table:t keep order:false" + "└─TableRowIDScan(Probe) 8.00 cop[tikv] table:t keep order:false" ], "Warnings": null }, @@ -2947,6 +3184,9 @@ " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(Column#9, Column#10, Column#11 separator \",\")->Column#7", " └─Projection 10000.00 batchCop[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#11", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" ] }, { @@ -2961,6 +3201,9 @@ " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 batchCop[tiflash] group by:test.ts.col_0, test.ts.col_1, test.ts.id, ", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" ] }, { @@ -2974,6 +3217,9 @@ " └─ExchangeReceiver 10000.00 batchCop[tiflash] ", " └─ExchangeSender 10000.00 batchCop[tiflash] ExchangeType: PassThrough", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" ] }, { @@ -2988,6 +3234,9 @@ " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 batchCop[tiflash] group by:test.ts.col_0, test.ts.col_1, test.ts.id, ", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" ] }, { @@ -3001,6 +3250,9 @@ " └─ExchangeReceiver 10000.00 batchCop[tiflash] ", " └─ExchangeSender 10000.00 batchCop[tiflash] ExchangeType: PassThrough", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" ] }, { @@ -3015,6 +3267,9 @@ " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 batchCop[tiflash] group by:test.ts.col_0, test.ts.col_1, test.ts.id, funcs:count(1)->Column#12, funcs:max(test.ts.col_0)->Column#13", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" ] }, { @@ -3029,6 +3284,9 @@ " └─HashAgg 8000.00 batchCop[tiflash] group by:Column#13, funcs:group_concat(Column#10, Column#11, Column#12 separator \",\")->Column#9", " └─Projection 10000.00 batchCop[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#12, test.ts.col_2", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" ] }, { @@ -3043,6 +3301,9 @@ " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.col_2, collate: N/A]", " └─HashAgg 8000.00 batchCop[tiflash] group by:test.ts.col_0, test.ts.col_1, test.ts.col_2, test.ts.id, ", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" ] }, { @@ -3056,6 +3317,9 @@ " └─ExchangeReceiver 10000.00 batchCop[tiflash] ", " └─ExchangeSender 10000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.col_2, collate: N/A]", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" ] }, { @@ -3070,6 +3334,9 @@ " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.col_2, collate: N/A]", " └─HashAgg 8000.00 batchCop[tiflash] group by:test.ts.col_0, test.ts.col_1, test.ts.col_2, test.ts.id, ", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" ] }, { @@ -3083,6 +3350,9 @@ " └─ExchangeReceiver 10000.00 batchCop[tiflash] ", " └─ExchangeSender 10000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.col_2, collate: N/A]", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" ] }, { @@ -3097,6 +3367,9 @@ " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.col_2, collate: N/A]", " └─HashAgg 8000.00 batchCop[tiflash] group by:test.ts.col_1, test.ts.col_2, test.ts.id, funcs:firstrow(test.ts.col_0)->test.ts.col_0", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" ] }, { @@ -3106,10 +3379,13 @@ "└─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 batchCop[tiflash] Column#5, Column#6, Column#7, div(Column#8, cast(case(eq(Column#11, 0), 1, Column#11), decimal(20,0) BINARY))->Column#8", " └─HashAgg 8000.00 batchCop[tiflash] group by:Column#20, funcs:group_concat(Column#13, Column#14, Column#15 order by Column#16 separator \",\")->Column#5, funcs:count(1)->Column#6, funcs:min(Column#17)->Column#7, funcs:count(Column#18)->Column#11, funcs:sum(Column#19)->Column#8", - " └─Projection 10000.00 batchCop[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#15, test.ts.col_0, test.ts.col_0, test.ts.id, cast(test.ts.id, decimal(15,4) BINARY)->Column#19, test.ts.col_2", + " └─Projection 10000.00 batchCop[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#15, test.ts.col_0, test.ts.col_0, test.ts.id, cast(test.ts.id, decimal(37,4) BINARY)->Column#19, test.ts.col_2", " └─ExchangeReceiver 10000.00 batchCop[tiflash] ", " └─ExchangeSender 10000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.col_2, collate: N/A]", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" ] }, { @@ -3123,8 +3399,11 @@ " └─ExchangeReceiver 8000.00 batchCop[tiflash] ", " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.col_2, collate: N/A]", " └─HashAgg 8000.00 batchCop[tiflash] group by:Column#32, Column#33, Column#34, Column#35, funcs:count(1)->Column#25, funcs:max(Column#29)->Column#26, funcs:count(Column#30)->Column#27, funcs:sum(Column#31)->Column#28", - " └─Projection 10000.00 batchCop[tiflash] test.ts.col_1, test.ts.id, cast(test.ts.id, decimal(15,4) BINARY)->Column#31, test.ts.col_2, test.ts.col_0, test.ts.col_1, test.ts.id", + " └─Projection 10000.00 batchCop[tiflash] test.ts.col_1, test.ts.id, cast(test.ts.id, decimal(37,4) BINARY)->Column#31, test.ts.col_2, test.ts.col_0, test.ts.col_1, test.ts.id", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" ] }, { @@ -3134,10 +3413,13 @@ "└─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 batchCop[tiflash] Column#5, Column#6, Column#7, div(Column#8, cast(case(eq(Column#10, 0), 1, Column#10), decimal(20,0) BINARY))->Column#8", " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(Column#11, Column#12, Column#13 order by Column#14 separator \",\")->Column#5, funcs:count(Column#15)->Column#6, funcs:min(Column#16)->Column#7, funcs:count(Column#17)->Column#10, funcs:sum(Column#18)->Column#8", - " └─Projection 10000.00 batchCop[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#13, test.ts.col_0, test.ts.id, test.ts.col_0, test.ts.id, cast(test.ts.id, decimal(15,4) BINARY)->Column#18", + " └─Projection 10000.00 batchCop[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#13, test.ts.col_0, test.ts.id, test.ts.col_0, test.ts.id, cast(test.ts.id, decimal(37,4) BINARY)->Column#18", " └─ExchangeReceiver 10000.00 batchCop[tiflash] ", " └─ExchangeSender 10000.00 batchCop[tiflash] ExchangeType: PassThrough", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" ] }, { @@ -3151,8 +3433,11 @@ " └─ExchangeReceiver 1.00 batchCop[tiflash] ", " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 batchCop[tiflash] group by:Column#27, Column#28, Column#29, funcs:count(Column#23)->Column#19, funcs:max(Column#24)->Column#20, funcs:count(Column#25)->Column#21, funcs:sum(Column#26)->Column#22", - " └─Projection 10000.00 batchCop[tiflash] test.ts.id, test.ts.col_1, test.ts.id, cast(test.ts.id, decimal(15,4) BINARY)->Column#26, test.ts.col_0, test.ts.col_1, test.ts.id", + " └─Projection 10000.00 batchCop[tiflash] test.ts.id, test.ts.col_1, test.ts.id, cast(test.ts.id, decimal(37,4) BINARY)->Column#26, test.ts.col_0, test.ts.col_1, test.ts.id", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" ] }, { @@ -3165,8 +3450,11 @@ " └─ExchangeReceiver 8000.00 batchCop[tiflash] ", " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.col_2, collate: N/A]", " └─HashAgg 8000.00 batchCop[tiflash] group by:Column#40, funcs:group_concat(Column#33, Column#34, Column#35 separator \",\")->Column#28, funcs:count(Column#36)->Column#29, funcs:min(Column#37)->Column#30, funcs:count(Column#38)->Column#31, funcs:sum(Column#39)->Column#32", - " └─Projection 10000.00 batchCop[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#35, test.ts.id, test.ts.col_0, test.ts.id, cast(test.ts.id, decimal(15,4) BINARY)->Column#39, test.ts.col_2", + " └─Projection 10000.00 batchCop[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#35, test.ts.id, test.ts.col_0, test.ts.id, cast(test.ts.id, decimal(37,4) BINARY)->Column#39, test.ts.col_2", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" ] }, { @@ -3180,8 +3468,11 @@ " └─ExchangeReceiver 8000.00 batchCop[tiflash] ", " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.col_2, collate: N/A]", " └─HashAgg 8000.00 batchCop[tiflash] group by:Column#33, Column#34, Column#35, Column#36, funcs:count(Column#29)->Column#25, funcs:max(Column#30)->Column#26, funcs:count(Column#31)->Column#27, funcs:sum(Column#32)->Column#28", - " └─Projection 10000.00 batchCop[tiflash] test.ts.id, test.ts.col_1, test.ts.id, cast(test.ts.id, decimal(15,4) BINARY)->Column#32, test.ts.col_2, test.ts.col_0, test.ts.col_1, test.ts.id", + " └─Projection 10000.00 batchCop[tiflash] test.ts.id, test.ts.col_1, test.ts.id, cast(test.ts.id, decimal(37,4) BINARY)->Column#32, test.ts.col_2, test.ts.col_0, test.ts.col_1, test.ts.id", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" ] }, { @@ -3191,8 +3482,11 @@ "└─TableReader 1.00 root data:ExchangeSender", " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(Column#24, Column#25, Column#26 separator \",\")->Column#14, funcs:count(Column#27)->Column#15, funcs:min(Column#28)->Column#16, funcs:count(Column#29)->Column#17, funcs:sum(Column#30)->Column#18", - " └─Projection 10000.00 batchCop[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#26, test.ts.id, test.ts.col_0, test.ts.id, cast(test.ts.id, decimal(15,4) BINARY)->Column#30", + " └─Projection 10000.00 batchCop[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#26, test.ts.id, test.ts.col_0, test.ts.id, cast(test.ts.id, decimal(37,4) BINARY)->Column#30", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" ] }, { @@ -3206,8 +3500,11 @@ " └─ExchangeReceiver 1.00 batchCop[tiflash] ", " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 batchCop[tiflash] group by:Column#27, Column#28, Column#29, funcs:count(Column#23)->Column#19, funcs:max(Column#24)->Column#20, funcs:count(Column#25)->Column#21, funcs:sum(Column#26)->Column#22", - " └─Projection 10000.00 batchCop[tiflash] test.ts.id, test.ts.col_1, test.ts.id, cast(test.ts.id, decimal(15,4) BINARY)->Column#26, test.ts.col_0, test.ts.col_1, test.ts.id", + " └─Projection 10000.00 batchCop[tiflash] test.ts.id, test.ts.col_1, test.ts.id, cast(test.ts.id, decimal(37,4) BINARY)->Column#26, test.ts.col_0, test.ts.col_1, test.ts.id", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" ] }, { @@ -3217,10 +3514,13 @@ "└─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 batchCop[tiflash] Column#5, Column#6, Column#7, div(Column#8, cast(case(eq(Column#17, 0), 1, Column#17), decimal(20,0) BINARY))->Column#8", " └─HashAgg 8000.00 batchCop[tiflash] group by:Column#29, funcs:group_concat(Column#21, Column#22, Column#23 separator \",\")->Column#5, funcs:count(Column#24)->Column#6, funcs:group_concat(Column#25 order by Column#26 separator \",\")->Column#7, funcs:count(Column#27)->Column#17, funcs:sum(Column#28)->Column#8", - " └─Projection 10000.00 batchCop[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#23, test.ts.id, test.ts.col_0, test.ts.col_0, test.ts.id, cast(test.ts.id, decimal(15,4) BINARY)->Column#28, test.ts.col_2", + " └─Projection 10000.00 batchCop[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#23, test.ts.id, test.ts.col_0, test.ts.col_0, test.ts.id, cast(test.ts.id, decimal(37,4) BINARY)->Column#28, test.ts.col_2", " └─ExchangeReceiver 10000.00 batchCop[tiflash] ", " └─ExchangeSender 10000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.col_2, collate: N/A]", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" ] }, { @@ -3230,10 +3530,13 @@ "└─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 batchCop[tiflash] Column#5, Column#6, Column#7, div(Column#8, cast(case(eq(Column#14, 0), 1, Column#14), decimal(20,0) BINARY))->Column#8", " └─HashAgg 8000.00 batchCop[tiflash] group by:Column#25, funcs:group_concat(distinct Column#17 separator \",\")->Column#5, funcs:count(Column#18)->Column#6, funcs:group_concat(Column#19, Column#20 order by Column#21, Column#22 separator \",\")->Column#7, funcs:count(Column#23)->Column#14, funcs:sum(Column#24)->Column#8", - " └─Projection 10000.00 batchCop[tiflash] test.ts.col_0, test.ts.id, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#20, test.ts.col_1, test.ts.id, test.ts.id, cast(test.ts.id, decimal(15,4) BINARY)->Column#24, test.ts.col_2", + " └─Projection 10000.00 batchCop[tiflash] test.ts.col_0, test.ts.id, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#20, test.ts.col_1, test.ts.id, test.ts.id, cast(test.ts.id, decimal(37,4) BINARY)->Column#24, test.ts.col_2", " └─ExchangeReceiver 10000.00 batchCop[tiflash] ", " └─ExchangeSender 10000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.col_2, collate: N/A]", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" ] }, { @@ -3243,10 +3546,13 @@ "└─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 batchCop[tiflash] Column#5, Column#6, Column#7, Column#8, div(Column#9, cast(case(eq(Column#15, 0), 1, Column#15), decimal(20,0) BINARY))->Column#9", " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(Column#18, Column#19 separator \",\")->Column#5, funcs:count(Column#20)->Column#6, funcs:group_concat(Column#21, Column#22 order by Column#23, Column#24 separator \",\")->Column#7, funcs:min(Column#25)->Column#8, funcs:count(Column#26)->Column#15, funcs:sum(Column#27)->Column#9", - " └─Projection 10000.00 batchCop[tiflash] test.ts.col_0, cast(test.ts.id, var_string(20))->Column#19, test.ts.id, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#22, test.ts.col_1, test.ts.id, test.ts.col_0, test.ts.id, cast(test.ts.id, decimal(15,4) BINARY)->Column#27", + " └─Projection 10000.00 batchCop[tiflash] test.ts.col_0, cast(test.ts.id, var_string(20))->Column#19, test.ts.id, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#22, test.ts.col_1, test.ts.id, test.ts.col_0, test.ts.id, cast(test.ts.id, decimal(37,4) BINARY)->Column#27", " └─ExchangeReceiver 10000.00 batchCop[tiflash] ", " └─ExchangeSender 10000.00 batchCop[tiflash] ExchangeType: PassThrough", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" ] }, { @@ -3256,10 +3562,13 @@ "└─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 batchCop[tiflash] Column#5, Column#6, Column#7, Column#8, div(Column#9, cast(case(eq(Column#13, 0), 1, Column#13), decimal(20,0) BINARY))->Column#9", " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct Column#15, Column#16, Column#17 separator \",\")->Column#5, funcs:count(Column#18)->Column#6, funcs:group_concat(Column#19, Column#20 order by Column#21, Column#22 separator \",\")->Column#7, funcs:max(Column#23)->Column#8, funcs:count(Column#24)->Column#13, funcs:sum(Column#25)->Column#9", - " └─Projection 10000.00 batchCop[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#17, test.ts.id, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#20, test.ts.col_1, test.ts.id, test.ts.col_1, test.ts.id, cast(test.ts.id, decimal(15,4) BINARY)->Column#25", + " └─Projection 10000.00 batchCop[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#17, test.ts.id, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#20, test.ts.col_1, test.ts.id, test.ts.col_1, test.ts.id, cast(test.ts.id, decimal(37,4) BINARY)->Column#25", " └─ExchangeReceiver 10000.00 batchCop[tiflash] ", " └─ExchangeSender 10000.00 batchCop[tiflash] ExchangeType: PassThrough", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" ] }, { @@ -3273,8 +3582,11 @@ " └─ExchangeReceiver 1.00 batchCop[tiflash] ", " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 batchCop[tiflash] group by:Column#29, Column#30, Column#31, Column#32, funcs:group_concat(Column#24, Column#25 separator \",\")->Column#20, funcs:max(Column#26)->Column#21, funcs:count(Column#27)->Column#22, funcs:sum(Column#28)->Column#23", - " └─Projection 10000.00 batchCop[tiflash] test.ts.col_1, cast(test.ts.id, var_string(20))->Column#25, test.ts.col_1, test.ts.id, cast(test.ts.id, decimal(15,4) BINARY)->Column#28, test.ts.col_0, test.ts.col_1, test.ts.id, test.ts.col_2", + " └─Projection 10000.00 batchCop[tiflash] test.ts.col_1, cast(test.ts.id, var_string(20))->Column#25, test.ts.col_1, test.ts.id, cast(test.ts.id, decimal(37,4) BINARY)->Column#28, test.ts.col_0, test.ts.col_1, test.ts.id, test.ts.col_2", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" ] }, { @@ -3288,8 +3600,439 @@ " └─ExchangeReceiver 8000.00 batchCop[tiflash] ", " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.col_0, collate: N/A]", " └─HashAgg 8000.00 batchCop[tiflash] group by:Column#35, Column#36, Column#37, Column#38, funcs:group_concat(Column#30, Column#31 separator \",\")->Column#26, funcs:max(Column#32)->Column#27, funcs:count(Column#33)->Column#28, funcs:sum(Column#34)->Column#29", - " └─Projection 10000.00 batchCop[tiflash] test.ts.col_1, cast(test.ts.id, var_string(20))->Column#31, test.ts.col_1, test.ts.id, cast(test.ts.id, decimal(15,4) BINARY)->Column#34, test.ts.col_0, test.ts.col_1, test.ts.id, test.ts.col_2", + " └─Projection 10000.00 batchCop[tiflash] test.ts.col_1, cast(test.ts.id, var_string(20))->Column#31, test.ts.col_1, test.ts.id, cast(test.ts.id, decimal(37,4) BINARY)->Column#34, test.ts.col_0, test.ts.col_1, test.ts.id, test.ts.col_2", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" + ] + }, + { + "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct 0,'GG') from ts", + "Plan": [ + "TableReader 1.00 root data:ExchangeSender", + "└─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─Projection 1.00 batchCop[tiflash] Column#5", + " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct Column#12, Column#13 separator \",\")->Column#5", + " └─Projection 1.00 batchCop[tiflash] cast(Column#10, var_string(20))->Column#12, Column#11", + " └─ExchangeReceiver 1.00 batchCop[tiflash] ", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] group by:\"GG\", 0, ", + " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable", + "[types:1292]Truncated incorrect DOUBLE value: 'GG'", + "[types:1292]Truncated incorrect DOUBLE value: 'GG'", + "[types:1292]Truncated incorrect DOUBLE value: 'GG'" + ] + }, + { + "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct 0,'01') from ts", + "Plan": [ + "TableReader 1.00 root data:ExchangeSender", + "└─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─Projection 1.00 batchCop[tiflash] Column#5", + " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct Column#12, Column#13 separator \",\")->Column#5", + " └─Projection 1.00 batchCop[tiflash] cast(Column#10, var_string(20))->Column#12, Column#11", + " └─ExchangeReceiver 1.00 batchCop[tiflash] ", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] group by:\"01\", 0, ", + " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" + ] + }, + { + "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct 0,1) from ts", + "Plan": [ + "TableReader 1.00 root data:ExchangeSender", + "└─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─Projection 1.00 batchCop[tiflash] Column#5", + " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct Column#12, Column#13 separator \",\")->Column#5", + " └─Projection 1.00 batchCop[tiflash] cast(Column#10, var_string(20))->Column#12, cast(Column#11, var_string(20))->Column#13", + " └─ExchangeReceiver 1.00 batchCop[tiflash] ", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] group by:0, 1, ", + " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" + ] + }, + { + "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct 0,0) from ts", + "Plan": [ + "TableReader 1.00 root data:ExchangeSender", + "└─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─Projection 1.00 batchCop[tiflash] Column#5", + " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct Column#9, Column#10 separator \",\")->Column#5", + " └─Projection 1.00 batchCop[tiflash] cast(Column#8, var_string(20))->Column#9, cast(Column#8, var_string(20))->Column#10", + " └─ExchangeReceiver 1.00 batchCop[tiflash] ", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] group by:0, ", + " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" + ] + }, + { + "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct 0,10) from ts group by '010'", + "Plan": [ + "TableReader 1.00 root data:ExchangeSender", + "└─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─Projection 1.00 batchCop[tiflash] Column#5", + " └─HashAgg 1.00 batchCop[tiflash] group by:Column#20, funcs:group_concat(distinct Column#18, Column#19 separator \",\")->Column#5", + " └─Projection 1.00 batchCop[tiflash] cast(Column#16, var_string(20))->Column#18, cast(Column#17, var_string(20))->Column#19, Column#15", + " └─ExchangeReceiver 1.00 batchCop[tiflash] ", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#15, collate: N/A]", + " └─HashAgg 1.00 batchCop[tiflash] group by:0, 1, 10, ", + " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" + ] + }, + { + "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct 0,0) from ts group by '011'", + "Plan": [ + "TableReader 1.00 root data:ExchangeSender", + "└─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─Projection 1.00 batchCop[tiflash] Column#5", + " └─HashAgg 1.00 batchCop[tiflash] group by:Column#16, funcs:group_concat(distinct Column#14, Column#15 separator \",\")->Column#5", + " └─Projection 1.00 batchCop[tiflash] cast(Column#13, var_string(20))->Column#14, cast(Column#13, var_string(20))->Column#15, Column#12", + " └─ExchangeReceiver 1.00 batchCop[tiflash] ", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#12, collate: N/A]", + " └─HashAgg 1.00 batchCop[tiflash] group by:0, 1, ", + " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" + ] + }, + { + "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct 0,'GG') from ts group by 'GG'", + "Plan": [ + "TableReader 1.00 root data:ExchangeSender", + "└─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─Projection 1.00 batchCop[tiflash] Column#5", + " └─HashAgg 1.00 batchCop[tiflash] group by:Column#20, funcs:group_concat(distinct Column#18, Column#19 separator \",\")->Column#5", + " └─Projection 1.00 batchCop[tiflash] cast(Column#16, var_string(20))->Column#18, Column#17, Column#15", + " └─ExchangeReceiver 1.00 batchCop[tiflash] ", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#15, collate: N/A]", + " └─HashAgg 1.00 batchCop[tiflash] group by:\"GG\", 0, 1, ", + " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable", + "[types:1292]Truncated incorrect DOUBLE value: 'GG'", + "[types:1292]Truncated incorrect DOUBLE value: 'GG'", + "[types:1292]Truncated incorrect DOUBLE value: 'GG'", + "[types:1292]Truncated incorrect DOUBLE value: 'GG'", + "[types:1292]Truncated incorrect DOUBLE value: 'GG'", + "[types:1292]Truncated incorrect DOUBLE value: 'GG'", + "[types:1292]Truncated incorrect DOUBLE value: 'GG'", + "[types:1292]Truncated incorrect DOUBLE value: 'GG'" + ] + }, + { + "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct 'GG','GG') from ts", + "Plan": [ + "TableReader 1.00 root data:ExchangeSender", + "└─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─Projection 1.00 batchCop[tiflash] Column#5", + " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct Column#8, Column#8 separator \",\")->Column#5", + " └─ExchangeReceiver 1.00 batchCop[tiflash] ", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] group by:\"GG\", ", + " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" + ] + }, + { + "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct 'Gg','GG') from ts", + "Plan": [ + "TableReader 1.00 root data:ExchangeSender", + "└─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─Projection 1.00 batchCop[tiflash] Column#5", + " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct Column#10, Column#11 separator \",\")->Column#5", + " └─ExchangeReceiver 1.00 batchCop[tiflash] ", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] group by:\"GG\", \"Gg\", ", + " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" + ] + }, + { + "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct 'GG-10','GG') from ts", + "Plan": [ + "TableReader 1.00 root data:ExchangeSender", + "└─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─Projection 1.00 batchCop[tiflash] Column#5", + " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct Column#10, Column#11 separator \",\")->Column#5", + " └─ExchangeReceiver 1.00 batchCop[tiflash] ", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] group by:\"GG\", \"GG-10\", ", + " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" + ] + }, + { + "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct '1200-01-01 00:00:00.023',1200) from ts", + "Plan": [ + "TableReader 1.00 root data:ExchangeSender", + "└─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─Projection 1.00 batchCop[tiflash] Column#5", + " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct Column#12, Column#13 separator \",\")->Column#5", + " └─Projection 1.00 batchCop[tiflash] Column#10, cast(Column#11, var_string(20))->Column#13", + " └─ExchangeReceiver 1.00 batchCop[tiflash] ", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] group by:\"1200-01-01 00:00:00.023\", 1200, ", + " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable", + "[types:1292]Truncated incorrect DOUBLE value: '1200-01-01 00:00:00.023'", + "[types:1292]Truncated incorrect DOUBLE value: '1200-01-01 00:00:00.023'", + "[types:1292]Truncated incorrect DOUBLE value: '1200-01-01 00:00:00.023'" + ] + }, + { + "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(col_0, col_0) from ts group by id", + "Plan": [ + "TableReader 8000.00 root data:ExchangeSender", + "└─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─Projection 8000.00 batchCop[tiflash] Column#5", + " └─HashAgg 8000.00 batchCop[tiflash] group by:test.ts.id, funcs:group_concat(Column#9 separator \",\")->Column#5", + " └─ExchangeReceiver 8000.00 batchCop[tiflash] ", + " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.id, collate: N/A]", + " └─HashAgg 8000.00 batchCop[tiflash] group by:test.ts.id, funcs:group_concat(test.ts.col_0, test.ts.col_0 separator \",\")->Column#9", + " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" + ] + }, + { + "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(col_0, col_0,id) from ts group by id", + "Plan": [ + "TableReader 8000.00 root data:ExchangeSender", + "└─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─Projection 8000.00 batchCop[tiflash] Column#5", + " └─HashAgg 8000.00 batchCop[tiflash] group by:test.ts.id, funcs:group_concat(Column#9 separator \",\")->Column#5", + " └─ExchangeReceiver 8000.00 batchCop[tiflash] ", + " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.id, collate: N/A]", + " └─HashAgg 8000.00 batchCop[tiflash] group by:Column#13, funcs:group_concat(Column#10, Column#11, Column#12 separator \",\")->Column#9", + " └─Projection 10000.00 batchCop[tiflash] test.ts.col_0, test.ts.col_0, cast(test.ts.id, var_string(20))->Column#12, test.ts.id", + " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" + ] + }, + { + "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct col_0 order by id<10) from ts", + "Plan": [ + "TableReader 1.00 root data:ExchangeSender", + "└─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─Projection 1.00 batchCop[tiflash] Column#5", + " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct test.ts.col_0 order by Column#8 separator \",\")->Column#5", + " └─ExchangeReceiver 1.00 batchCop[tiflash] ", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] group by:Column#10, funcs:firstrow(Column#9)->Column#8", + " └─Projection 10000.00 batchCop[tiflash] lt(test.ts.id, 10)->Column#9, test.ts.col_0", + " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" + ] + }, + { + "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct col_0 order by id<10) from ts group by col_1", + "Plan": [ + "TableReader 8000.00 root data:ExchangeSender", + "└─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─Projection 8000.00 batchCop[tiflash] Column#5", + " └─HashAgg 8000.00 batchCop[tiflash] group by:test.ts.col_1, funcs:group_concat(distinct test.ts.col_0 order by Column#9 separator \",\")->Column#5", + " └─ExchangeReceiver 8000.00 batchCop[tiflash] ", + " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.col_1, collate: N/A]", + " └─HashAgg 8000.00 batchCop[tiflash] group by:Column#11, Column#12, funcs:firstrow(Column#10)->Column#9", + " └─Projection 10000.00 batchCop[tiflash] lt(test.ts.id, 10)->Column#10, test.ts.col_1, test.ts.col_0", + " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" + ] + }, + { + "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct col_0>10 order by id<10) from ts group by col_1", + "Plan": [ + "TableReader 8000.00 root data:ExchangeSender", + "└─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─Projection 8000.00 batchCop[tiflash] Column#5", + " └─HashAgg 8000.00 batchCop[tiflash] group by:Column#19, funcs:group_concat(distinct Column#17 order by Column#18 separator \",\")->Column#5", + " └─Projection 8000.00 batchCop[tiflash] cast(Column#12, var_string(20))->Column#17, Column#13, test.ts.col_1", + " └─ExchangeReceiver 8000.00 batchCop[tiflash] ", + " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.col_1, collate: N/A]", + " └─HashAgg 8000.00 batchCop[tiflash] group by:Column#15, Column#16, funcs:firstrow(Column#14)->Column#13", + " └─Projection 10000.00 batchCop[tiflash] lt(test.ts.id, 10)->Column#14, test.ts.col_1, gt(cast(test.ts.col_0, double BINARY), 10)->Column#16", + " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable" + ] + }, + { + "SQL": "desc format = 'brief' select /*+ hash_agg(),agg_to_cop() */ group_concat(distinct col_0 order by col_0<=>null) from ts", + "Plan": [ + "HashAgg 1.00 root funcs:group_concat(distinct Column#6 order by Column#7 separator \",\")->Column#5", + "└─Projection 10000.00 root test.ts.col_0, nulleq(test.ts.col_0, <nil>)->Column#7", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tiflash] table:ts keep order:false, stats:pseudo" + ], + "Warning": [ + "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable", + "Scalar function 'nulleq'(signature: NullEQString, return type: bigint(1)) is not supported to push down to tiflash now.", + "Aggregation can not be pushed to tiflash because arguments of AggFunc `group_concat` contains unsupported exprs in order-by clause", + "Scalar function 'nulleq'(signature: NullEQString, return type: bigint(1)) is not supported to push down to tiflash now.", + "Aggregation can not be pushed to tiflash because arguments of AggFunc `group_concat` contains unsupported exprs in order-by clause", + "Scalar function 'nulleq'(signature: NullEQString, return type: bigint(1)) is not supported to push down to tiflash now.", + "Aggregation can not be pushed to tiflash because arguments of AggFunc `group_concat` contains unsupported exprs in order-by clause" + ] + } + ] + }, + { + "Name": "TestRejectSortForMPP", + "Cases": [ + { + "SQL": "desc format = 'brief' select count(*) from (select * from t order by id)a group by name,id order by id", + "Plan": [ + "Projection 8000.00 root Column#5", + "└─Sort 8000.00 root test.t.id", + " └─TableReader 8000.00 root data:ExchangeSender", + " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─Projection 8000.00 batchCop[tiflash] Column#5, test.t.id", + " └─HashAgg 8000.00 batchCop[tiflash] group by:test.t.id, test.t.name, funcs:sum(Column#7)->Column#5, funcs:firstrow(test.t.id)->test.t.id", + " └─ExchangeReceiver 8000.00 batchCop[tiflash] ", + " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.name, collate: N/A], [name: test.t.id, collate: N/A]", + " └─HashAgg 8000.00 batchCop[tiflash] group by:test.t.id, test.t.name, funcs:count(1)->Column#7", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select count(*) from (select * from t order by id)a group by name order by 1", + "Plan": [ + "Sort 8000.00 root Column#5", + "└─TableReader 8000.00 root data:ExchangeSender", + " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─Projection 8000.00 batchCop[tiflash] Column#5", + " └─HashAgg 8000.00 batchCop[tiflash] group by:test.t.name, funcs:sum(Column#8)->Column#5", + " └─ExchangeReceiver 8000.00 batchCop[tiflash] ", + " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.name, collate: N/A]", + " └─HashAgg 8000.00 batchCop[tiflash] group by:test.t.name, funcs:count(1)->Column#8", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select count(*) from (select id,name from t group by id,name order by id,name)a group by name order by 1", + "Plan": [ + "Sort 8000.00 root Column#5", + "└─TableReader 8000.00 root data:ExchangeSender", + " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─Projection 8000.00 batchCop[tiflash] Column#5", + " └─HashAgg 8000.00 batchCop[tiflash] group by:test.t.name, funcs:count(1)->Column#5", + " └─Projection 8000.00 batchCop[tiflash] test.t.id, test.t.name", + " └─HashAgg 8000.00 batchCop[tiflash] group by:test.t.id, test.t.name, funcs:firstrow(test.t.id)->test.t.id, funcs:firstrow(test.t.name)->test.t.name", + " └─ExchangeReceiver 8000.00 batchCop[tiflash] ", + " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.name, collate: N/A]", + " └─HashAgg 8000.00 batchCop[tiflash] group by:test.t.id, test.t.name, ", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select * from (select id from t group by id order by id)a join t on a.id=t.id order by 1", + "Plan": [ + "Sort 9990.00 root test.t.id", + "└─TableReader 9990.00 root data:ExchangeSender", + " └─ExchangeSender 9990.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─Projection 9990.00 batchCop[tiflash] test.t.id, test.t.id, test.t.value, test.t.name", + " └─HashJoin 9990.00 batchCop[tiflash] inner join, equal:[eq(test.t.id, test.t.id)]", + " ├─ExchangeReceiver(Build) 7992.00 batchCop[tiflash] ", + " │ └─ExchangeSender 7992.00 batchCop[tiflash] ExchangeType: Broadcast", + " │ └─Projection 7992.00 batchCop[tiflash] test.t.id", + " │ └─HashAgg 7992.00 batchCop[tiflash] group by:test.t.id, funcs:firstrow(test.t.id)->test.t.id", + " │ └─ExchangeReceiver 7992.00 batchCop[tiflash] ", + " │ └─ExchangeSender 7992.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: N/A]", + " │ └─HashAgg 7992.00 batchCop[tiflash] group by:test.t.id, ", + " │ └─Selection 9990.00 batchCop[tiflash] not(isnull(test.t.id))", + " │ └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 batchCop[tiflash] not(isnull(test.t.id))", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select * from (select * from t order by id)a join t on a.id=t.id order by 1", + "Plan": [ + "Sort 12487.50 root test.t.id", + "└─TableReader 12487.50 root data:ExchangeSender", + " └─ExchangeSender 12487.50 cop[tiflash] ExchangeType: PassThrough", + " └─Projection 12487.50 cop[tiflash] test.t.id, test.t.value, test.t.name, test.t.id, test.t.value, test.t.name", + " └─HashJoin 12487.50 cop[tiflash] inner join, equal:[eq(test.t.id, test.t.id)]", + " ├─ExchangeReceiver(Build) 9990.00 cop[tiflash] ", + " │ └─ExchangeSender 9990.00 cop[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 cop[tiflash] not(isnull(test.t.id))", + " │ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 cop[tiflash] not(isnull(test.t.id))", + " └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select * from ((select id from t order by 1) union all (select id+1 from t order by 1))c", + "Plan": [ + "TableReader 20000.00 root data:ExchangeSender", + "└─ExchangeSender 20000.00 cop[tiflash] ExchangeType: PassThrough", + " └─Union 20000.00 cop[tiflash] ", + " ├─Projection 10000.00 cop[tiflash] cast(test.t.id, bigint(20) BINARY)->Column#10", + " │ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", + " └─Projection 10000.00 cop[tiflash] plus(test.t.id, 1)->Column#10", + " └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select * from ((select count(*) from (select id,name from t order by id)a group by name,id order by id) union all (select id+1 from t order by 1))c", + "Plan": [ + "TableReader 18000.00 root data:ExchangeSender", + "└─ExchangeSender 18000.00 cop[tiflash] ExchangeType: PassThrough", + " └─Union 18000.00 cop[tiflash] ", + " ├─Projection 8000.00 cop[tiflash] cast(Column#12, bigint(21) BINARY)->Column#12", + " │ └─Projection 8000.00 cop[tiflash] Column#5", + " │ └─Projection 8000.00 cop[tiflash] Column#5, test.t.id", + " │ └─HashAgg 8000.00 cop[tiflash] group by:test.t.id, test.t.name, funcs:sum(Column#19)->Column#5, funcs:firstrow(test.t.id)->test.t.id", + " │ └─ExchangeReceiver 8000.00 cop[tiflash] ", + " │ └─ExchangeSender 8000.00 cop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.name, collate: N/A], [name: test.t.id, collate: N/A]", + " │ └─HashAgg 8000.00 cop[tiflash] group by:test.t.id, test.t.name, funcs:count(1)->Column#19", + " │ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", + " └─Projection 10000.00 cop[tiflash] cast(Column#11, bigint(21) BINARY)->Column#12", + " └─Projection 10000.00 cop[tiflash] plus(test.t.id, 1)->Column#11", + " └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select * from (select * from t order by id)a order by name", + "Plan": [ + "Sort 10000.00 root test.t.name", + "└─TableReader 10000.00 root data:ExchangeSender", + " └─ExchangeSender 10000.00 cop[tiflash] ExchangeType: PassThrough", + " └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" ] } ] diff --git a/planner/core/testdata/integration_suite_out.json b/planner/core/testdata/integration_suite_out.json index 47fb9e613358d..6c946cdac4d2d 100644 --- a/planner/core/testdata/integration_suite_out.json +++ b/planner/core/testdata/integration_suite_out.json @@ -675,19 +675,19 @@ { "SQL": "select /*+ USE_INDEX() */ * from t1, t2 where t1.a=t2.a", "Warnings": [ - "[parser:1064]You have an error in your SQL syntax; check the manual that corresponds to your TiDB version for the right syntax to use [parser:8064]Optimizer hint syntax error at line 1 column 22 near \") */\" " + "[parser:1064]Optimizer hint syntax error at line 1 column 22 near \") */\" " ] }, { "SQL": "select /*+ IGNORE_INDEX() */ * from t1, t2 where t1.a=t2.a", "Warnings": [ - "[parser:1064]You have an error in your SQL syntax; check the manual that corresponds to your TiDB version for the right syntax to use [parser:8064]Optimizer hint syntax error at line 1 column 25 near \") */\" " + "[parser:1064]Optimizer hint syntax error at line 1 column 25 near \") */\" " ] }, { "SQL": "select /*+ USE_INDEX_MERGE() */ * from t1, t2 where t1.a=t2.a", "Warnings": [ - "[parser:1064]You have an error in your SQL syntax; check the manual that corresponds to your TiDB version for the right syntax to use [parser:8064]Optimizer hint syntax error at line 1 column 28 near \") */\" " + "[parser:1064]Optimizer hint syntax error at line 1 column 28 near \") */\" " ] } ] diff --git a/planner/core/testdata/plan_suite_in.json b/planner/core/testdata/plan_suite_in.json index 526c7af78b2b1..09233f05dd121 100644 --- a/planner/core/testdata/plan_suite_in.json +++ b/planner/core/testdata/plan_suite_in.json @@ -740,5 +740,11 @@ // Make sure row_count(tikv_selection) == row_count(index_lookup) and row_count(index_lookup) > row_count(tidb_selection) "select * from t2 use index(idx_a) where a > 1 and b > 1 and c > 1" ] + }, + { + "name": "TestIssue28316", + "cases": [ + "select * from t where t.a < 3 and t.a < 3" + ] } ] diff --git a/planner/core/testdata/plan_suite_out.json b/planner/core/testdata/plan_suite_out.json index 4d2c468590362..75db6cb736e99 100644 --- a/planner/core/testdata/plan_suite_out.json +++ b/planner/core/testdata/plan_suite_out.json @@ -1476,14 +1476,12 @@ ], "Plan": [ "Sort 12500.00 root test.t1.c_int, test.t2.c_str", - "└─MergeJoin 12500.00 root inner join, left key:test.t1.c_int, test.t1.c_int, right key:test.t2.c_int, test.t2.c_int", - " ├─Sort(Build) 10000.00 root test.t2.c_int, test.t2.c_int", - " │ └─UnionScan 10000.00 root ", - " │ └─TableReader 10000.00 root data:TableFullScan", - " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - " └─Sort(Probe) 10000.00 root test.t1.c_int, test.t1.c_int", - " └─TableReader 10000.00 root data:TableFullScan", - " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "└─MergeJoin 12500.00 root inner join, left key:test.t1.c_int, right key:test.t2.c_int", + " ├─UnionScan(Build) 10000.00 root ", + " │ └─TableReader 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:true, stats:pseudo", + " └─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:true, stats:pseudo" ] } ] @@ -1580,7 +1578,7 @@ " └─IndexFullScan 1.00 cop[tikv] table:tn, index:a(a, b, c, d) keep order:true, stats:pseudo" ], "Warning": [ - "Scalar function 'intdiv'(signature: IntDivideInt, return type: bigint(20)) can not be pushed to storage layer", + "Scalar function 'intdiv'(signature: IntDivideInt, return type: bigint(20)) is not supported to push down to storage layer now.", "[planner:1815]Optimizer Hint LIMIT_TO_COP is inapplicable" ] }, @@ -2666,5 +2664,18 @@ ] } ] + }, + { + "Name": "TestIssue28316", + "Cases": [ + { + "SQL": "select * from t where t.a < 3 and t.a < 3", + "Plan": [ + "TableReader 3323.33 root data:Selection", + "└─Selection 3323.33 cop[tikv] lt(test.t.a, 3)", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + } + ] } ] diff --git a/planner/core/trace.go b/planner/core/trace.go index 29ed57539d479..759adcf6bb67c 100644 --- a/planner/core/trace.go +++ b/planner/core/trace.go @@ -24,4 +24,8 @@ type Trace struct { StmtNode ast.StmtNode Format string + + // OptimizerTrace indicates `trace plan target = 'xxx' <statement>` case + OptimizerTrace bool + OptimizerTraceTarget string } diff --git a/planner/core/util.go b/planner/core/util.go index 517bb24bf7864..480c4bdfabd0c 100644 --- a/planner/core/util.go +++ b/planner/core/util.go @@ -308,6 +308,19 @@ func extractStringFromUint64Slice(slice []uint64) string { return strings.Join(l, ",") } +// extractStringFromBoolSlice helps extract string info from bool slice. +func extractStringFromBoolSlice(slice []bool) string { + if len(slice) < 1 { + return "" + } + l := make([]string, 0, len(slice)) + for _, k := range slice { + l = append(l, fmt.Sprintf(`%t`, k)) + } + sort.Strings(l) + return strings.Join(l, ",") +} + func tableHasDirtyContent(ctx sessionctx.Context, tableInfo *model.TableInfo) bool { pi := tableInfo.GetPartitionInfo() if pi == nil { diff --git a/planner/memo/expr_iterator_test.go b/planner/memo/expr_iterator_test.go index d0cec2ac2a659..6722466661c66 100644 --- a/planner/memo/expr_iterator_test.go +++ b/planner/memo/expr_iterator_test.go @@ -23,8 +23,6 @@ import ( ) func TestNewExprIterFromGroupElem(t *testing.T) { - t.Parallel() - ctx := plannercore.MockContext() schema := expression.NewSchema() @@ -67,8 +65,6 @@ func TestNewExprIterFromGroupElem(t *testing.T) { } func TestExprIterNext(t *testing.T) { - t.Parallel() - ctx := plannercore.MockContext() schema := expression.NewSchema() @@ -116,8 +112,6 @@ func TestExprIterNext(t *testing.T) { } func TestExprIterReset(t *testing.T) { - t.Parallel() - ctx := plannercore.MockContext() schema := expression.NewSchema() @@ -190,8 +184,6 @@ func TestExprIterReset(t *testing.T) { } func TestExprIterWithEngineType(t *testing.T) { - t.Parallel() - ctx := plannercore.MockContext() schema := expression.NewSchema() diff --git a/planner/memo/group_expr_test.go b/planner/memo/group_expr_test.go index 5257a96a8511b..8744e55f9f4e4 100644 --- a/planner/memo/group_expr_test.go +++ b/planner/memo/group_expr_test.go @@ -25,7 +25,6 @@ import ( ) func TestNewGroupExpr(t *testing.T) { - t.Parallel() p := &plannercore.LogicalLimit{} expr := NewGroupExpr(p) require.Equal(t, p, expr.ExprNode) @@ -34,7 +33,6 @@ func TestNewGroupExpr(t *testing.T) { } func TestGroupExprFingerprint(t *testing.T) { - t.Parallel() p := &plannercore.LogicalLimit{Count: 3} expr := NewGroupExpr(p) childGroup := NewGroupWithSchema(nil, expression.NewSchema()) diff --git a/planner/memo/group_test.go b/planner/memo/group_test.go index 43521c15933db..c7d377f38d08b 100644 --- a/planner/memo/group_test.go +++ b/planner/memo/group_test.go @@ -18,6 +18,7 @@ import ( "context" "testing" + "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/parser" @@ -28,8 +29,6 @@ import ( ) func TestNewGroup(t *testing.T) { - t.Parallel() - p := &plannercore.LogicalLimit{} expr := NewGroupExpr(p) g := NewGroupWithSchema(expr, expression.NewSchema()) @@ -41,7 +40,6 @@ func TestNewGroup(t *testing.T) { } func TestGroupInsert(t *testing.T) { - t.Parallel() p := &plannercore.LogicalLimit{} expr := NewGroupExpr(p) g := NewGroupWithSchema(expr, expression.NewSchema()) @@ -51,8 +49,6 @@ func TestGroupInsert(t *testing.T) { } func TestGroupDelete(t *testing.T) { - t.Parallel() - p := &plannercore.LogicalLimit{} expr := NewGroupExpr(p) g := NewGroupWithSchema(expr, expression.NewSchema()) @@ -66,8 +62,6 @@ func TestGroupDelete(t *testing.T) { } func TestGroupDeleteAll(t *testing.T) { - t.Parallel() - ctx := plannercore.MockContext() expr := NewGroupExpr(plannercore.LogicalSelection{}.Init(ctx, 0)) g := NewGroupWithSchema(expr, expression.NewSchema()) @@ -84,8 +78,6 @@ func TestGroupDeleteAll(t *testing.T) { } func TestGroupExists(t *testing.T) { - t.Parallel() - p := &plannercore.LogicalLimit{} expr := NewGroupExpr(p) g := NewGroupWithSchema(expr, expression.NewSchema()) @@ -96,8 +88,6 @@ func TestGroupExists(t *testing.T) { } func TestGroupFingerPrint(t *testing.T) { - t.Parallel() - p := parser.New() stmt1, err := p.ParseOneStmt("select * from t where a > 1 and a < 100", "", "") require.NoError(t, err) @@ -153,8 +143,6 @@ func TestGroupFingerPrint(t *testing.T) { } func TestGroupGetFirstElem(t *testing.T) { - t.Parallel() - ctx := plannercore.MockContext() expr0 := NewGroupExpr(plannercore.LogicalProjection{}.Init(ctx, 0)) expr1 := NewGroupExpr(plannercore.LogicalLimit{}.Init(ctx, 0)) @@ -185,8 +173,6 @@ func (impl *fakeImpl) AttachChildren(...Implementation) Implementation { return func (impl *fakeImpl) GetCostLimit(float64, ...Implementation) float64 { return 0 } func TestGetInsertGroupImpl(t *testing.T) { - t.Parallel() - g := NewGroupWithSchema(NewGroupExpr(plannercore.LogicalLimit{}.Init(plannercore.MockContext(), 0)), expression.NewSchema()) emptyProp := &property.PhysicalProperty{} require.Nil(t, g.GetImpl(emptyProp)) @@ -200,8 +186,6 @@ func TestGetInsertGroupImpl(t *testing.T) { } func TestEngineTypeSet(t *testing.T) { - t.Parallel() - require.True(t, EngineAll.Contains(EngineTiDB)) require.True(t, EngineAll.Contains(EngineTiKV)) require.True(t, EngineAll.Contains(EngineTiFlash)) @@ -224,8 +208,6 @@ func TestEngineTypeSet(t *testing.T) { } func TestFirstElemAfterDelete(t *testing.T) { - t.Parallel() - ctx := plannercore.MockContext() oldExpr := NewGroupExpr(plannercore.LogicalLimit{Count: 10}.Init(ctx, 0)) g := NewGroupWithSchema(oldExpr, expression.NewSchema()) @@ -241,11 +223,10 @@ func TestFirstElemAfterDelete(t *testing.T) { } func TestBuildKeyInfo(t *testing.T) { - t.Parallel() - p := parser.New() ctx := plannercore.MockContext() is := infoschema.MockInfoSchema([]*model.TableInfo{plannercore.MockSignedTable()}) + domain.GetDomain(ctx).MockInfoCacheAndLoadInfoSchema(is) // case 1: primary key has constant constraint stmt1, err := p.ParseOneStmt("select a from t where a = 10", "", "") @@ -289,8 +270,6 @@ func TestBuildKeyInfo(t *testing.T) { } func TestExploreMark(t *testing.T) { - t.Parallel() - mark := ExploreMark(0) require.False(t, mark.Explored(0)) require.False(t, mark.Explored(1)) diff --git a/planner/memo/pattern_test.go b/planner/memo/pattern_test.go index 9d0ee17039d49..b326fb8a97290 100644 --- a/planner/memo/pattern_test.go +++ b/planner/memo/pattern_test.go @@ -22,7 +22,6 @@ import ( ) func TestGetOperand(t *testing.T) { - t.Parallel() require.Equal(t, OperandJoin, GetOperand(&plannercore.LogicalJoin{})) require.Equal(t, OperandAggregation, GetOperand(&plannercore.LogicalAggregation{})) require.Equal(t, OperandProjection, GetOperand(&plannercore.LogicalProjection{})) @@ -40,8 +39,6 @@ func TestGetOperand(t *testing.T) { } func TestOperandMatch(t *testing.T) { - t.Parallel() - require.True(t, OperandAny.Match(OperandLimit)) require.True(t, OperandAny.Match(OperandSelection)) require.True(t, OperandAny.Match(OperandJoin)) @@ -66,8 +63,6 @@ func TestOperandMatch(t *testing.T) { } func TestNewPattern(t *testing.T) { - t.Parallel() - p := NewPattern(OperandAny, EngineAll) require.Equal(t, OperandAny, p.Operand) require.Nil(t, p.Children) @@ -78,8 +73,6 @@ func TestNewPattern(t *testing.T) { } func TestPatternSetChildren(t *testing.T) { - t.Parallel() - p := NewPattern(OperandAny, EngineAll) p.SetChildren(NewPattern(OperandLimit, EngineAll)) require.Len(t, p.Children, 1) diff --git a/planner/optimize.go b/planner/optimize.go index 4a096adc56734..b16fc09a238f0 100644 --- a/planner/optimize.go +++ b/planner/optimize.go @@ -32,6 +32,7 @@ import ( "github.com/pingcap/tidb/metrics" "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/planner/cascades" "github.com/pingcap/tidb/planner/core" plannercore "github.com/pingcap/tidb/planner/core" @@ -39,6 +40,7 @@ import ( "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/table/temptable" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/hint" "github.com/pingcap/tidb/util/logutil" @@ -89,13 +91,36 @@ func GetExecuteForUpdateReadIS(node ast.Node, sctx sessionctx.Context) infoschem } if preparedPointer, ok := vars.PreparedStmts[execID]; ok { if preparedObj, ok := preparedPointer.(*core.CachedPrepareStmt); ok && preparedObj.ForUpdateRead { - return domain.GetDomain(sctx).InfoSchema() + is := domain.GetDomain(sctx).InfoSchema() + return temptable.AttachLocalTemporaryTableInfoSchema(sctx, is) } } } return nil } +// GetBindSQL4PlanCache used to get the bindSQL for plan cache to build the plan cache key. +func GetBindSQL4PlanCache(sctx sessionctx.Context, stmtNode ast.StmtNode) (bindSQL string) { + bindRecord, _, match := matchSQLBinding(sctx, stmtNode) + if match { + bindSQL = bindRecord.Bindings[0].BindSQL + } + return bindSQL +} + +func matchSQLBinding(sctx sessionctx.Context, stmtNode ast.StmtNode) (bindRecord *bindinfo.BindRecord, scope string, matched bool) { + useBinding := sctx.GetSessionVars().UsePlanBaselines + if !useBinding || stmtNode == nil { + return nil, "", false + } + var err error + bindRecord, scope, err = getBindRecord(sctx, stmtNode) + if err != nil || bindRecord == nil || len(bindRecord.Bindings) == 0 { + return nil, "", false + } + return bindRecord, scope, true +} + // Optimize does optimization and creates a Plan. // The node must be prepared first. func Optimize(ctx context.Context, sctx sessionctx.Context, node ast.Node, is infoschema.InfoSchema) (plannercore.Plan, types.NameSlice, error) { @@ -146,30 +171,25 @@ func Optimize(ctx context.Context, sctx sessionctx.Context, node ast.Node, is in if !ok { useBinding = false } - var ( - bindRecord *bindinfo.BindRecord - scope string - err error - ) - if useBinding { - bindRecord, scope, err = getBindRecord(sctx, stmtNode) - if err != nil || bindRecord == nil || len(bindRecord.Bindings) == 0 { - useBinding = false - } - } - if useBinding && sessVars.SelectLimit != math.MaxUint64 { - sessVars.StmtCtx.AppendWarning(errors.New("sql_select_limit is set, ignore SQL bindings")) + bindRecord, scope, match := matchSQLBinding(sctx, stmtNode) + if !match { useBinding = false } + if ok { + // add the extra Limit after matching the bind record + stmtNode = plannercore.TryAddExtraLimit(sctx, stmtNode) + node = stmtNode + } - var names types.NameSlice - var bestPlan, bestPlanFromBind plannercore.Plan + var ( + names types.NameSlice + bestPlan, bestPlanFromBind plannercore.Plan + chosenBinding bindinfo.Binding + err error + ) if useBinding { minCost := math.MaxFloat64 - var ( - bindStmtHints stmtctx.StmtHints - chosenBinding bindinfo.Binding - ) + var bindStmtHints stmtctx.StmtHints originHints := hint.CollectHint(stmtNode) // bindRecord must be not nil when coming here, try to find the best binding. for _, binding := range bindRecord.Bindings { @@ -202,7 +222,7 @@ func Optimize(ctx context.Context, sctx sessionctx.Context, node ast.Node, is in for _, warn := range warns { sessVars.StmtCtx.AppendWarning(warn) } - if err := setFoundInBinding(sctx, true); err != nil { + if err := setFoundInBinding(sctx, true, chosenBinding.BindSQL); err != nil { logutil.BgLogger().Warn("set tidb_found_in_binding failed", zap.Error(err)) } if sessVars.StmtCtx.InVerboseExplain { @@ -231,7 +251,8 @@ func Optimize(ctx context.Context, sctx sessionctx.Context, node ast.Node, is in defer func() { sessVars.StmtCtx.StmtHints = savedStmtHints }() - if sessVars.EvolvePlanBaselines && bestPlanFromBind != nil { + if sessVars.EvolvePlanBaselines && bestPlanFromBind != nil && + sessVars.SelectLimit == math.MaxUint64 { // do not evolve this query if sql_select_limit is enabled // Check bestPlanFromBind firstly to avoid nil stmtNode. if _, ok := stmtNode.(*ast.SelectStmt); ok && !bindRecord.Bindings[0].Hint.ContainTableHint(plannercore.HintReadFromStorage) { sessVars.StmtCtx.StmtHints = originStmtHints @@ -343,7 +364,8 @@ func optimize(ctx context.Context, sctx sessionctx.Context, node ast.Node, is in // we need the table information to check privilege, which is collected // into the visitInfo in the logical plan builder. if pm := privilege.GetPrivilegeManager(sctx); pm != nil { - if err := plannercore.CheckPrivilege(activeRoles, pm, builder.GetVisitInfo()); err != nil { + visitInfo := plannercore.VisitInfo4PrivCheck(is, node, builder.GetVisitInfo()) + if err := plannercore.CheckPrivilege(activeRoles, pm, visitInfo); err != nil { return nil, nil, 0, err } } @@ -497,13 +519,24 @@ func handleEvolveTasks(ctx context.Context, sctx sessionctx.Context, br *bindinf // useMaxTS returns true when meets following conditions: // 1. ctx is auto commit tagged. // 2. plan is point get by pk. +// 3. not a cache table. func useMaxTS(ctx sessionctx.Context, p plannercore.Plan) bool { if !plannercore.IsAutoCommitTxn(ctx) { return false } - v, ok := p.(*plannercore.PointGetPlan) - return ok && (v.IndexInfo == nil || (v.IndexInfo.Primary && v.TblInfo.IsCommonHandle)) + if !ok { + return false + } + noSecondRead := v.IndexInfo == nil || (v.IndexInfo.Primary && v.TblInfo.IsCommonHandle) + if !noSecondRead { + return false + } + + if v.TblInfo != nil && (v.TblInfo.TableCacheStatusType != model.TableCacheStatusDisable) { + return false + } + return true } // OptimizeExecStmt to optimize prepare statement protocol "execute" statement @@ -677,13 +710,15 @@ func handleStmtHints(hints []*ast.TableOptimizerHint) (stmtHints stmtctx.StmtHin return } -func setFoundInBinding(sctx sessionctx.Context, opt bool) error { +func setFoundInBinding(sctx sessionctx.Context, opt bool, bindSQL string) error { vars := sctx.GetSessionVars() + vars.StmtCtx.BindSQL = bindSQL err := vars.SetSystemVar(variable.TiDBFoundInBinding, variable.BoolToOnOff(opt)) return err } func init() { plannercore.OptimizeAstNode = Optimize + plannercore.GetBindSQL4PlanCache = GetBindSQL4PlanCache plannercore.IsReadOnly = IsReadOnly } diff --git a/planner/property/physical_property.go b/planner/property/physical_property.go index 4a48e091c4d56..1e6e3aaeefae1 100644 --- a/planner/property/physical_property.go +++ b/planner/property/physical_property.go @@ -145,6 +145,10 @@ type PhysicalProperty struct { // which types the exchange sender belongs to, only take effects when it's a mpp task. MPPPartitionTp MPPPartitionType + + // RejectSort means rejecting the sort property from its children, but it only works for MPP tasks. + // Non-MPP tasks do not care about it. + RejectSort bool } // NewPhysicalProperty builds property from columns. @@ -276,6 +280,7 @@ func (p *PhysicalProperty) CloneEssentialFields() *PhysicalProperty { ExpectedCnt: p.ExpectedCnt, MPPPartitionTp: p.MPPPartitionTp, MPPPartitionCols: p.MPPPartitionCols, + RejectSort: p.RejectSort, } return prop } diff --git a/util/filesort/main_test.go b/planner/util/main_test.go similarity index 66% rename from util/filesort/main_test.go rename to planner/util/main_test.go index 6a3378a2187d7..1b930670688d0 100644 --- a/util/filesort/main_test.go +++ b/planner/util/main_test.go @@ -12,13 +12,11 @@ // See the License for the specific language governing permissions and // limitations under the License. -package filesort +package util import ( - "math/rand" "testing" - "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/testbridge" "go.uber.org/goleak" ) @@ -27,18 +25,3 @@ func TestMain(m *testing.M) { testbridge.WorkaroundGoCheckFlags() goleak.VerifyTestMain(m) } - -func nextRow(r *rand.Rand, keySize int, valSize int) (key []types.Datum, val []types.Datum, handle int64) { - key = make([]types.Datum, keySize) - for i := range key { - key[i] = types.NewDatum(r.Int()) - } - - val = make([]types.Datum, valSize) - for j := range val { - val[j] = types.NewDatum(r.Int()) - } - - handle = r.Int63() - return -} diff --git a/planner/util/path.go b/planner/util/path.go index 62c60547a7dfc..9a0b4207d1314 100644 --- a/planner/util/path.go +++ b/planner/util/path.go @@ -20,7 +20,6 @@ import ( "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/ranger" @@ -73,7 +72,14 @@ func (path *AccessPath) IsTablePath() bool { } // SplitCorColAccessCondFromFilters move the necessary filter in the form of index_col = corrlated_col to access conditions. +// The function consider the `idx_col_1 = const and index_col_2 = cor_col and index_col_3 = const` case. +// It enables more index columns to be considered. The range will be rebuilt in 'ResolveCorrelatedColumns'. func (path *AccessPath) SplitCorColAccessCondFromFilters(ctx sessionctx.Context, eqOrInCount int) (access, remained []expression.Expression) { + // The plan cache do not support subquery now. So we skip this function when + // 'MaybeOverOptimized4PlanCache' function return true . + if expression.MaybeOverOptimized4PlanCache(ctx, path.TableFilters) { + return nil, path.TableFilters + } access = make([]expression.Expression, len(path.IdxCols)-eqOrInCount) used := make([]bool, len(path.TableFilters)) for i := eqOrInCount; i < len(path.IdxCols); i++ { @@ -96,7 +102,7 @@ func (path *AccessPath) SplitCorColAccessCondFromFilters(ctx sessionctx.Context, } for i, ok := range used { if !ok { - remained = append(remained, path.TableFilters[i]) + remained = append(remained, path.TableFilters[i]) // nozero } } return access, remained @@ -109,7 +115,7 @@ func isColEqCorColOrConstant(ctx sessionctx.Context, filter expression.Expressio if !ok || f.FuncName.L != ast.EQ { return false } - _, collation := f.CharsetAndCollation(ctx) + _, collation := f.CharsetAndCollation() if c, ok := f.GetArgs()[0].(*expression.Column); ok { if c.RetType.EvalType() == types.ETString && !collate.CompatibleCollate(collation, c.RetType.Collate) { return false @@ -144,34 +150,124 @@ func isColEqCorColOrConstant(ctx sessionctx.Context, filter expression.Expressio } // OnlyPointRange checks whether each range is a point(no interval range exists). -func (path *AccessPath) OnlyPointRange(sc *stmtctx.StatementContext) bool { - noIntervalRange := true +func (path *AccessPath) OnlyPointRange(sctx sessionctx.Context) bool { if path.IsIntHandlePath { for _, ran := range path.Ranges { - if !ran.IsPoint(sc) { - noIntervalRange = false - break + if !ran.IsPointNullable(sctx) { + return false } } - return noIntervalRange + return true } - haveNullVal := false for _, ran := range path.Ranges { // Not point or the not full matched. - if !ran.IsPoint(sc) || len(ran.HighVal) != len(path.Index.Columns) { - noIntervalRange = false - break + if !ran.IsPointNonNullable(sctx) || len(ran.HighVal) != len(path.Index.Columns) { + return false } - // Check whether there's null value. - for i := 0; i < len(path.Index.Columns); i++ { - if ran.HighVal[i].IsNull() { - haveNullVal = true - break + } + return true +} + +// Col2Len maps expression.Column.UniqueID to column length +type Col2Len map[int64]int + +// ExtractCol2Len collects index/table columns with lengths from expressions. If idxCols and idxColLens are not nil, it collects index columns with lengths(maybe prefix lengths). +// Otherwise it collects table columns with full lengths. +func ExtractCol2Len(exprs []expression.Expression, idxCols []*expression.Column, idxColLens []int) Col2Len { + col2len := make(Col2Len, len(idxCols)) + for _, expr := range exprs { + extractCol2LenFromExpr(expr, idxCols, idxColLens, col2len) + } + return col2len +} + +func extractCol2LenFromExpr(expr expression.Expression, idxCols []*expression.Column, idxColLens []int, col2Len Col2Len) { + switch v := expr.(type) { + case *expression.Column: + if idxCols == nil { + col2Len[v.UniqueID] = types.UnspecifiedLength + } else { + for i, col := range idxCols { + if col != nil && v.EqualByExprAndID(nil, col) { + col2Len[v.UniqueID] = idxColLens[i] + break + } } } - if haveNullVal { - break + case *expression.ScalarFunction: + for _, arg := range v.GetArgs() { + extractCol2LenFromExpr(arg, idxCols, idxColLens, col2Len) } } - return noIntervalRange && !haveNullVal +} + +// compareLength will compare the two column lengths. The return value: +// (1) -1 means that l is shorter than r; +// (2) 0 means that l equals to r; +// (3) 1 means that l is longer than r; +func compareLength(l, r int) int { + if l == r { + return 0 + } + if l == types.UnspecifiedLength { + return 1 + } + if r == types.UnspecifiedLength { + return -1 + } + if l > r { + return 1 + } + return -1 +} + +// dominate return true if each column of c2 exists in c1 and c2's column length is no longer than c1's column length. +func (c1 Col2Len) dominate(c2 Col2Len) bool { + if len(c2) > len(c1) { + return false + } + for colID, len2 := range c2 { + len1, ok := c1[colID] + if !ok || compareLength(len2, len1) == 1 { + return false + } + } + return true +} + +// CompareCol2Len will compare the two Col2Len maps. The last return value is used to indicate whether they are comparable. +// When the second return value is true, the first return value: +// (1) -1 means that c1 is worse than c2; +// (2) 0 means that c1 equals to c2; +// (3) 1 means that c1 is better than c2; +func CompareCol2Len(c1, c2 Col2Len) (int, bool) { + l1, l2 := len(c1), len(c2) + if l1 > l2 { + if c1.dominate(c2) { + return 1, true + } + return 0, false + } + if l1 < l2 { + if c2.dominate(c1) { + return -1, true + } + return 0, false + } + // If c1 and c2 have the same columns but have different lengths on some column, we regard c1 and c2 incomparable. + for colID, colLen2 := range c2 { + colLen1, ok := c1[colID] + if !ok || colLen1 != colLen2 { + return 0, false + } + } + return 0, true +} + +// GetCol2LenFromAccessConds returns columns with lengths from path.AccessConds. +func (path *AccessPath) GetCol2LenFromAccessConds() Col2Len { + if path.IsTablePath() { + return ExtractCol2Len(path.AccessConds, nil, nil) + } + return ExtractCol2Len(path.AccessConds, path.IdxCols, path.IdxColLens) } diff --git a/planner/util/path_test.go b/planner/util/path_test.go new file mode 100644 index 0000000000000..c9053dcd4d114 --- /dev/null +++ b/planner/util/path_test.go @@ -0,0 +1,113 @@ +// Copyright 2021 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, +// 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. + +package util_test + +import ( + "testing" + + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/planner/core" + "github.com/pingcap/tidb/planner/util" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/ranger" + "github.com/stretchr/testify/require" +) + +func TestCompareCol2Len(t *testing.T) { + tests := []struct { + c1 util.Col2Len + c2 util.Col2Len + res int + comparable bool + }{ + { + c1: util.Col2Len{1: -1, 2: -1, 3: -1}, + c2: util.Col2Len{1: -1, 2: 10}, + res: 1, + comparable: true, + }, + { + c1: util.Col2Len{1: 5}, + c2: util.Col2Len{1: 10, 2: -1}, + res: -1, + comparable: true, + }, + { + c1: util.Col2Len{1: -1, 2: -1}, + c2: util.Col2Len{1: -1, 2: 5, 3: -1}, + res: 0, + comparable: false, + }, + { + c1: util.Col2Len{1: -1, 2: 10}, + c2: util.Col2Len{1: -1, 2: 5, 3: -1}, + res: 0, + comparable: false, + }, + { + c1: util.Col2Len{1: -1, 2: 10}, + c2: util.Col2Len{1: -1, 2: 10}, + res: 0, + comparable: true, + }, + { + c1: util.Col2Len{1: -1, 2: -1}, + c2: util.Col2Len{1: -1, 2: 10}, + res: 0, + comparable: false, + }, + } + for _, tt := range tests { + res, comparable := util.CompareCol2Len(tt.c1, tt.c2) + require.Equal(t, tt.res, res) + require.Equal(t, tt.comparable, comparable) + } +} + +func TestOnlyPointRange(t *testing.T) { + sctx := core.MockContext() + nullDatum := types.MinNotNullDatum() + nullDatum.SetNull() + nullPointRange := ranger.Range{ + LowVal: []types.Datum{*nullDatum.Clone()}, + HighVal: []types.Datum{*nullDatum.Clone()}, + } + onePointRange := ranger.Range{ + LowVal: []types.Datum{types.NewIntDatum(1)}, + HighVal: []types.Datum{types.NewIntDatum(1)}, + } + one2TwoRange := ranger.Range{ + LowVal: []types.Datum{types.NewIntDatum(1)}, + HighVal: []types.Datum{types.NewIntDatum(2)}, + } + + intHandlePath := &util.AccessPath{IsIntHandlePath: true} + intHandlePath.Ranges = []*ranger.Range{&nullPointRange, &onePointRange} + require.True(t, intHandlePath.OnlyPointRange(sctx)) + intHandlePath.Ranges = []*ranger.Range{&onePointRange, &one2TwoRange} + require.False(t, intHandlePath.OnlyPointRange(sctx)) + + indexPath := &util.AccessPath{Index: &model.IndexInfo{Columns: make([]*model.IndexColumn, 1)}} + indexPath.Ranges = []*ranger.Range{&onePointRange} + require.True(t, indexPath.OnlyPointRange(sctx)) + indexPath.Ranges = []*ranger.Range{&nullPointRange, &onePointRange} + require.False(t, indexPath.OnlyPointRange(sctx)) + indexPath.Ranges = []*ranger.Range{&onePointRange, &one2TwoRange} + require.False(t, indexPath.OnlyPointRange(sctx)) + + indexPath.Index.Columns = make([]*model.IndexColumn, 2) + indexPath.Ranges = []*ranger.Range{&onePointRange} + require.False(t, indexPath.OnlyPointRange(sctx)) +} diff --git a/plugin/const_test.go b/plugin/const_test.go index 89985068bc8a2..05b498eab50b4 100644 --- a/plugin/const_test.go +++ b/plugin/const_test.go @@ -22,7 +22,6 @@ import ( ) func TestConstToString(t *testing.T) { - t.Parallel() kinds := map[fmt.Stringer]string{ Audit: "Audit", Authentication: "Authentication", diff --git a/plugin/helper_test.go b/plugin/helper_test.go index 3bf7d14cc600c..99a310fa69b2f 100644 --- a/plugin/helper_test.go +++ b/plugin/helper_test.go @@ -21,7 +21,6 @@ import ( ) func TestPluginDeclare(t *testing.T) { - t.Parallel() auditRaw := &AuditManifest{Manifest: Manifest{}} auditExport := ExportManifest(auditRaw) audit2 := DeclareAuditManifest(auditExport) @@ -44,7 +43,6 @@ func TestPluginDeclare(t *testing.T) { } func TestDecode(t *testing.T) { - t.Parallel() failID := ID("fail") _, _, err := failID.Decode() require.Error(t, err) diff --git a/plugin/integration_test.go b/plugin/integration_test.go index d00e8587bba98..eac32e58707df 100644 --- a/plugin/integration_test.go +++ b/plugin/integration_test.go @@ -15,40 +15,731 @@ package plugin_test import ( - "bytes" "context" "fmt" "strconv" + "strings" "testing" - "github.com/pingcap/tidb/config" - "github.com/pingcap/tidb/domain" - "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/plugin" + "github.com/pingcap/tidb/server" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/testkit" "github.com/stretchr/testify/require" - "github.com/tikv/client-go/v2/testutils" ) -type testAuditLogSuite struct { - cluster testutils.Cluster - store kv.Storage - dom *domain.Domain +// Audit tests cannot run in parallel. +func TestAuditLogNormal(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + sv := server.CreateMockServer(t, store) + defer sv.Close() + conn := server.CreateMockConn(t, store, sv) + defer conn.Close() + session.DisableStats4Test() + session.SetSchemaLease(0) + + type normalTest struct { + sql string + text string + rows uint64 + stmtType string + dbs string + tables string + cmd string + event plugin.GeneralEvent + } + + tests := []normalTest{ + { + sql: "CREATE DATABASE mynewdatabase", + stmtType: "CreateDatabase", + dbs: "mynewdatabase", + }, + { + sql: "CREATE TABLE t1 (a INT NOT NULL)", + stmtType: "CreateTable", + dbs: "test", + tables: "t1", + }, + { + sql: "CREATE TABLE t2 LIKE t1", + stmtType: "CreateTable", + dbs: "test,test", + tables: "t2,t1", + }, + { + sql: "CREATE INDEX a ON t1 (a)", + stmtType: "CreateIndex", + dbs: "test", + tables: "t1", + }, + { + sql: "CREATE SEQUENCE seq", + stmtType: "other", + dbs: "test", + tables: "seq", + }, + { + sql: " create temporary table t3 (a int)", + stmtType: "CreateTable", + dbs: "test", + tables: "t3", + }, + { + sql: "create global temporary table t4 (a int) on commit delete rows", + stmtType: "CreateTable", + dbs: "test", + tables: "t4", + }, + { + sql: "CREATE VIEW v1 AS SELECT * FROM t1 WHERE a> 2", + stmtType: "CreateView", + dbs: "test,test", + tables: "t1,v1", + }, + { + sql: "USE test", + stmtType: "Use", + }, + { + sql: "DROP DATABASE mynewdatabase", + stmtType: "DropDatabase", + dbs: "mynewdatabase", + }, + { + sql: "SHOW CREATE SEQUENCE seq", + stmtType: "Show", + dbs: "test", + tables: "seq", + }, + { + sql: "DROP SEQUENCE seq", + stmtType: "other", + dbs: "test", + tables: "seq", + }, + { + sql: "DROP TABLE t4", + stmtType: "DropTable", + dbs: "test", + tables: "t4", + }, + { + sql: "DROP VIEW v1", + stmtType: "DropView", + dbs: "test", + tables: "v1", + }, + { + sql: "ALTER TABLE t1 ADD COLUMN c1 INT NOT NULL", + stmtType: "AlterTable", + dbs: "test", + tables: "t1", + }, + { + sql: "ALTER TABLE t1 MODIFY c1 BIGINT", + stmtType: "AlterTable", + dbs: "test", + tables: "t1", + }, + { + sql: "ALTER TABLE t1 ADD INDEX (c1)", + stmtType: "AlterTable", + dbs: "test", + tables: "t1", + }, + { + sql: "ALTER TABLE t1 ALTER INDEX c1 INVISIBLE", + stmtType: "AlterTable", + dbs: "test", + tables: "t1", + }, + { + sql: "ALTER TABLE t1 RENAME INDEX c1 TO c2", + stmtType: "AlterTable", + dbs: "test", + tables: "t1", + }, + { + sql: "ALTER TABLE t1 DROP INDEX c2", + stmtType: "AlterTable", + dbs: "test", + tables: "t1", + }, + { + sql: "ALTER TABLE t1 CHANGE c1 c2 INT", + stmtType: "AlterTable", + dbs: "test", + tables: "t1", + }, + { + sql: "ALTER TABLE t1 DROP COLUMN c2", + stmtType: "AlterTable", + dbs: "test", + tables: "t1", + }, + { + sql: "CREATE SESSION BINDING FOR SELECT * FROM t1 WHERE a = 123 USING SELECT * FROM t1 IGNORE INDEX (a) WHERE a = 123", + stmtType: "CreateBinding", + }, + { + sql: "DROP SESSION BINDING FOR SELECT * FROM t1 WHERE a = 123", + stmtType: "DropBinding", + }, + //{ + // sql: "LOAD STATS '/tmp/stats.json'", + // stmtType: "other", + //}, + //{ + // sql: "DROP STATS t", + // stmtType: "other", + //}, + { + sql: "RENAME TABLE t2 TO t5", + stmtType: "other", + dbs: "test,test", + tables: "t2,t5", + }, + { + sql: "TRUNCATE t1", + stmtType: "TruncateTable", + dbs: "test", + tables: "t1", + }, + //{ + // sql: "FLASHBACK TABLE t TO t1", + // stmtType: "other", + // dbs: "test", + // tables: "t1", + //}, + //{ + // sql: "RECOVER TABLE t1", + // stmtType: "other", + // dbs: "test", + // tables: "t1,t2", + //}, + { + sql: "ALTER DATABASE test DEFAULT CHARACTER SET = utf8mb4", + stmtType: "other", + dbs: "test", + }, + { + sql: "ADMIN RELOAD opt_rule_blacklist", + stmtType: "other", + }, + //{ + // sql: "ADMIN PLUGINS ENABLE audit_test", + // stmtType: "other", + //}, + { + sql: "ADMIN FLUSH bindings", + stmtType: "other", + }, + //{ + // sql: "ADMIN REPAIR TABLE t1 CREATE TABLE (id int)", + // stmtType: "other", + // dbs: "test", + // tables: "t1", + //}, + { + sql: "ADMIN SHOW SLOW RECENT 10", + stmtType: "other", + }, + { + sql: "ADMIN SHOW DDL JOBS", + stmtType: "other", + }, + //{ + // sql: "ADMIN CANCEL DDL JOBS 1", + // stmtType: "other", + //}, + { + sql: "ADMIN CHECKSUM TABLE t1", + stmtType: "other", + //dbs: "test", + //tables: "t1", + }, + { + sql: "ADMIN CHECK TABLE t1", + stmtType: "other", + //dbs: "test", + //tables: "t1", + }, + { + sql: "ADMIN CHECK INDEX t1 a", + stmtType: "other", + //dbs: "test", + //tables: "t1", + }, + { + sql: "CREATE USER 'newuser' IDENTIFIED BY 'newuserpassword'", + stmtType: "CreateUser", + }, + { + sql: "ALTER USER 'newuser' IDENTIFIED BY 'newnewpassword'", + stmtType: "other", + }, + { + sql: "CREATE ROLE analyticsteam", + stmtType: "CreateUser", + }, + { + sql: "GRANT SELECT ON test.* TO analyticsteam", + stmtType: "Grant", + dbs: "test", + }, + { + sql: "GRANT analyticsteam TO 'newuser'", + stmtType: "other", + }, + { + sql: "SET DEFAULT ROLE analyticsteam TO newuser;", + stmtType: "other", + }, + { + sql: "REVOKE SELECT ON test.* FROM 'analyticsteam'", + stmtType: "Revoke", + dbs: "test", + }, + { + sql: "DROP ROLE analyticsteam", + stmtType: "other", + }, + { + sql: "FLUSH PRIVILEGES", + stmtType: "other", + }, + { + sql: "SET PASSWORD FOR 'newuser' = 'test'", + stmtType: "Set", + }, + //{ + // sql: "SET ROLE ALL", + // stmtType: "other", + //}, + { + sql: "DROP USER 'newuser'", + stmtType: "other", + }, + { + sql: "analyze table t1", + stmtType: "AnalyzeTable", + dbs: "test", + tables: "t1", + }, + { + sql: "SPLIT TABLE t1 BETWEEN (0) AND (1000000000) REGIONS 16", + stmtType: "other", + //dbs: "test", + //tables: "t1", + }, + //{ + // sql: "BACKUP DATABASE `test` TO '.'", + // stmtType: "other", + // dbs: "test", + //}, + //{ + // sql: "RESTORE DATABASE * FROM '.'", + // stmtType: "other", + //}, + //{ + // sql: "CHANGE DRAINER TO NODE_STATE ='paused' FOR NODE_ID 'drainer1'", + // stmtType: "other", + //}, + //{ + // sql: "CHANGE PUMP TO NODE_STATE ='paused' FOR NODE_ID 'pump1'", + // stmtType: "other", + //}, + { + sql: "BEGIN", + stmtType: "Begin", + }, + { + sql: "ROLLBACK", + stmtType: "RollBack", + }, + { + sql: "START TRANSACTION", + stmtType: "Begin", + }, + { + sql: "COMMIT", + stmtType: "Commit", + }, + //{ + // sql: "SHOW DRAINER STATUS", + // stmtType: "Show", + //}, + //{ + // sql: "SHOW PUMP STATUS", + // stmtType: "Show", + //}, + //{ + // sql: "SHOW GRANTS", + // stmtType: "Show", + //}, + { + sql: "SHOW PROCESSLIST", + stmtType: "Show", + }, + //{ + // sql: "SHOW BACKUPS", + // stmtType: "Show", + //}, + //{ + // sql: "SHOW RESTORES", + // stmtType: "Show", + //}, + { + sql: "show analyze status", + stmtType: "Show", + }, + { + sql: "SHOW SESSION BINDINGS", + stmtType: "Show", + }, + { + sql: "SHOW BUILTINS", + stmtType: "Show", + }, + { + sql: "SHOW CHARACTER SET", + stmtType: "Show", + }, + { + sql: "SHOW COLLATION", + stmtType: "Show", + }, + { + sql: "show columns from t1", + stmtType: "Show", + }, + { + sql: "show fields from t1", + stmtType: "Show", + }, + //{ + // sql: "SHOW CONFIG", + // stmtType: "Show", + //}, + { + sql: "SHOW CREATE TABLE t1", + stmtType: "Show", + dbs: "test", + tables: "t1", + }, + { + sql: "SHOW CREATE USER 'root'", + stmtType: "Show", + }, + { + sql: "SHOW DATABASES", + stmtType: "Show", + }, + { + sql: "SHOW ENGINES", + stmtType: "Show", + }, + { + sql: "SHOW ERRORS", + stmtType: "Show", + }, + { + sql: "SHOW INDEXES FROM t1", + stmtType: "Show", + }, + { + sql: "SHOW MASTER STATUS", + stmtType: "Show", + }, + { + sql: "SHOW PLUGINS", + stmtType: "Show", + }, + { + sql: "show privileges", + stmtType: "Show", + }, + { + sql: "SHOW PROFILES", + stmtType: "Show", + }, + //{ + // sql: "SHOW PUMP STATUS", + // stmtType: "Show", + //}, + { + sql: "SHOW SCHEMAS", + stmtType: "Show", + }, + { + sql: "SHOW STATS_HEALTHY", + stmtType: "Show", + dbs: "mysql", + }, + { + sql: "show stats_histograms", + stmtType: "Show", + dbs: "mysql", + }, + { + sql: "show stats_meta", + stmtType: "Show", + dbs: "mysql", + }, + { + sql: "show status", + stmtType: "Show", + }, + { + sql: "show table t1 next_row_id", + stmtType: "Show", + dbs: "test", + tables: "t1", + }, + { + sql: "show table t1 regions", + stmtType: "Show", + }, + { + sql: "SHOW TABLE STATUS LIKE 't1'", + stmtType: "Show", + }, + { + sql: "SHOW TABLES", + stmtType: "Show", + }, + { + sql: "SHOW VARIABLES", + stmtType: "Show", + }, + { + sql: "SHOW WARNINGS", + stmtType: "Show", + }, + { + sql: "SET @number = 5", + stmtType: "Set", + }, + { + sql: "SET NAMES utf8", + stmtType: "Set", + }, + { + sql: "SET CHARACTER SET utf8mb4", + stmtType: "Set", + }, + { + sql: "SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED", + stmtType: "Set", + }, + { + sql: "SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER'", + stmtType: "Set", + }, + { + sql: "PREPARE mystmt FROM 'SELECT ? as num FROM DUAL'", + stmtType: "Prepare", + }, + { + sql: "EXECUTE mystmt USING @number", + text: "SELECT ? as num FROM DUAL", + stmtType: "Select", + }, + { + sql: "DEALLOCATE PREPARE mystmt", + stmtType: "Deallocate", + }, + { + sql: "INSERT INTO t1 VALUES (1), (2)", + stmtType: "Insert", + dbs: "test", + tables: "t1", + rows: 2, + }, + { + sql: "DELETE FROM t1 WHERE a = 2", + stmtType: "Delete", + dbs: "test", + tables: "t1", + rows: 1, + }, + { + sql: "REPLACE INTO t1 VALUES(3)", + stmtType: "Replace", + dbs: "test", + tables: "t1", + rows: 1, + }, + { + sql: "UPDATE t1 SET a=5 WHERE a=1", + stmtType: "Update", + dbs: "test", + tables: "t1", + rows: 1, + }, + { + sql: "DO 1", + stmtType: "other", + }, + //{ + // sql: "LOAD DATA LOCAL INFILE 'data.csv' INTO TABLE t1 FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (id)", + // stmtType: "LoadData", + // dbs: "test", + // tables: "t1", + //}, + { + sql: "SELECT * FROM t1", + stmtType: "Select", + dbs: "test", + tables: "t1", + }, + { + sql: "SELECT 1", + stmtType: "Select", + }, + { + sql: "TABLE t1", + stmtType: "Select", + dbs: "test", + tables: "t1", + }, + { + sql: "EXPLAIN ANALYZE SELECT * FROM t1 WHERE a = 1", + stmtType: "Explain", + //dbs: "test", + //tables: "t1", + }, + { + sql: "EXPLAIN SELECT * FROM t1", + stmtType: "Explain", + //dbs: "test", + //tables: "t1", + }, + { + sql: "EXPLAIN SELECT * FROM t1 WHERE a = 1", + stmtType: "Explain", + //dbs: "test", + //tables: "t1", + }, + { + sql: "DESC SELECT * FROM t1 WHERE a = 1", + stmtType: "Explain", + //dbs: "test", + //tables: "t1", + }, + { + sql: "DESCRIBE SELECT * FROM t1 WHERE a = 1", + stmtType: "Explain", + //dbs: "test", + //tables: "t1", + }, + { + sql: "trace format='row' select * from t1", + stmtType: "Trace", + //dbs: "test", + //tables: "t1", + }, + { + sql: "flush status", + stmtType: "other", + }, + { + sql: "FLUSH TABLES", + stmtType: "other", + }, + //{ + // sql: "KILL TIDB 2", + // stmtType: "other", + //}, + //{ + // sql: "SHUTDOWN", + // stmtType: "Shutdow", + //}, + //{ + // sql: "ALTER INSTANCE RELOAD TLS", + // stmtType: "other", + //}, + } - bytes.Buffer + testResults := make([]normalTest, 0) + dbNames := make([]string, 0) + tableNames := make([]string, 0) + onGeneralEvent := func(ctx context.Context, sctx *variable.SessionVars, event plugin.GeneralEvent, cmd string) { + dbNames = dbNames[:0] + tableNames = tableNames[:0] + for _, value := range sctx.StmtCtx.Tables { + dbNames = append(dbNames, value.DB) + tableNames = append(tableNames, value.Table) + } + audit := normalTest{ + text: sctx.StmtCtx.OriginalSQL, + rows: sctx.StmtCtx.AffectedRows(), + stmtType: sctx.StmtCtx.StmtType, + dbs: strings.Join(dbNames, ","), + tables: strings.Join(tableNames, ","), + cmd: cmd, + event: event, + } + testResults = append(testResults, audit) + } + loadPlugin(t, onGeneralEvent) + defer plugin.Shutdown(context.Background()) + + require.NoError(t, conn.HandleQuery(context.Background(), "use test")) + for _, test := range tests { + testResults = testResults[:0] + errMsg := fmt.Sprintf("statement: %s", test.sql) + query := append([]byte{mysql.ComQuery}, []byte(test.sql)...) + err := conn.Dispatch(context.Background(), query) + require.NoError(t, err, errMsg) + require.Equal(t, 2, len(testResults), errMsg) + result := testResults[0] + // TODO: currently, result.text is wrong. + require.Equal(t, "Query", result.cmd, errMsg) + require.Equal(t, plugin.Starting, result.event, errMsg) + result = testResults[1] + if test.text == "" { + require.Equal(t, test.sql, result.text, errMsg) + } else { + require.Equal(t, test.text, result.text, errMsg) + } + require.Equal(t, test.rows, result.rows, errMsg) + require.Equal(t, test.stmtType, result.stmtType, errMsg) + require.Equal(t, test.dbs, result.dbs, errMsg) + require.Equal(t, test.tables, result.tables, errMsg) + require.Equal(t, "Query", result.cmd, errMsg) + require.Equal(t, plugin.Completed, result.event, errMsg) + } } -func (s *testAuditLogSuite) setup(t *testing.T) { - pluginName := "test_audit_log" +func loadPlugin(t *testing.T, onGeneralEvent func(context.Context, *variable.SessionVars, plugin.GeneralEvent, string)) { + ctx := context.Background() + pluginName := "audit_test" pluginVersion := uint16(1) pluginSign := pluginName + "-" + strconv.Itoa(int(pluginVersion)) - config.UpdateGlobal(func(conf *config.Config) { - conf.Plugin.Load = pluginSign - }) + cfg := plugin.Config{ + Plugins: []string{pluginSign}, + PluginDir: "", + EnvVersion: map[string]uint16{"go": 1112}, + } + + validate := func(ctx context.Context, manifest *plugin.Manifest) error { + return nil + } + onInit := func(ctx context.Context, manifest *plugin.Manifest) error { + return nil + } + onShutdown := func(ctx context.Context, manifest *plugin.Manifest) error { + return nil + } + onConnectionEvent := func(ctx context.Context, event plugin.ConnectionEvent, info *variable.ConnectionInfo) error { + return nil + } // setup load test hook. loadOne := func(p *plugin.Plugin, dir string, pluginID plugin.ID) (manifest func() *plugin.Manifest, err error) { @@ -58,106 +749,22 @@ func (s *testAuditLogSuite) setup(t *testing.T) { Kind: plugin.Audit, Name: pluginName, Version: pluginVersion, - OnInit: OnInit, - OnShutdown: OnShutdown, - Validate: Validate, + OnInit: onInit, + OnShutdown: onShutdown, + Validate: validate, }, - OnGeneralEvent: s.OnGeneralEvent, - OnConnectionEvent: OnConnectionEvent, + OnGeneralEvent: onGeneralEvent, + OnConnectionEvent: onConnectionEvent, } return plugin.ExportManifest(m) }, nil } plugin.SetTestHook(loadOne) - store, err := mockstore.NewMockStore( - mockstore.WithClusterInspector(func(c testutils.Cluster) { - mockstore.BootstrapWithSingleStore(c) - s.cluster = c - }), - ) - require.NoError(t, err) - s.store = store - session.SetSchemaLease(0) - session.DisableStats4Test() - - d, err := session.BootstrapSession(s.store) - require.NoError(t, err) - d.SetStatsUpdating(true) - s.dom = d -} - -func (s *testAuditLogSuite) teardown() { - s.dom.Close() - s.store.Close() -} - -func TestAuditLog(t *testing.T) { - var s testAuditLogSuite - s.setup(t) - defer s.teardown() - - var buf1 bytes.Buffer - tk := testkit.NewAsyncTestKit(t, s.store) - ctx := tk.OpenSession(context.Background(), "test") - buf1.WriteString("Use use `test`\n") // Workaround for the testing framework. - - tk.MustExec(ctx, "use test") - buf1.WriteString("Use use `test`\n") - - tk.MustExec(ctx, "create table t (id int primary key, a int, b int unique)") - buf1.WriteString("CreateTable create table `t` ( `id` int primary key , `a` int , `b` int unique )\n") - - tk.MustExec(ctx, "create view v1 as select * from t where id > 2") - buf1.WriteString("CreateView create view `v1` as select * from `t` where `id` > ?\n") - - tk.MustExec(ctx, "drop view v1") - buf1.WriteString("DropView drop view `v1`\n") - - tk.MustExec(ctx, "create session binding for select * from t where b = 123 using select * from t ignore index(b) where b = 123") - buf1.WriteString("CreateBinding create session binding for select * from `t` where `b` = ? using select * from `t` where `b` = ?\n") - - tk.MustExec(ctx, "prepare mystmt from 'select ? as num from DUAL'") - buf1.WriteString("Prepare prepare `mystmt` from ?\n") - - tk.MustExec(ctx, "set @number = 5") - buf1.WriteString("Set set @number = ?\n") - - tk.MustExec(ctx, "execute mystmt using @number") - buf1.WriteString("Select select ? as `num` from dual\n") - - tk.MustQuery(ctx, "trace format = 'row' select * from t") - buf1.WriteString("Trace trace format = ? select * from `t`\n") - - tk.MustExec(ctx, "shutdown") - buf1.WriteString("Shutdown shutdown\n") - - require.Equal(t, buf1.String(), s.Buffer.String()) -} - -func Validate(ctx context.Context, m *plugin.Manifest) error { - return nil -} - -// OnInit implements TiDB plugin's OnInit SPI. -func OnInit(ctx context.Context, manifest *plugin.Manifest) error { - return nil -} - -// OnShutdown implements TiDB plugin's OnShutdown SPI. -func OnShutdown(ctx context.Context, manifest *plugin.Manifest) error { - return nil -} - -// OnGeneralEvent implements TiDB Audit plugin's OnGeneralEvent SPI. -func (s *testAuditLogSuite) OnGeneralEvent(ctx context.Context, sctx *variable.SessionVars, event plugin.GeneralEvent, cmd string) { - if sctx != nil { - normalized, _ := sctx.StmtCtx.SQLDigest() - fmt.Fprintln(&s.Buffer, sctx.StmtCtx.StmtType, normalized) - } -} + // trigger load. + err := plugin.Load(ctx, cfg) + require.NoErrorf(t, err, "load plugin [%s] fail, error [%s]\n", pluginSign, err) -// OnConnectionEvent implements TiDB Audit plugin's OnConnectionEvent SPI. -func OnConnectionEvent(ctx context.Context, event plugin.ConnectionEvent, info *variable.ConnectionInfo) error { - return nil + err = plugin.Init(ctx, cfg) + require.NoErrorf(t, err, "init plugin [%s] fail, error [%s]\n", pluginSign, err) } diff --git a/plugin/spi_test.go b/plugin/spi_test.go index 672656f6a200d..d5f8fbdcd4d25 100644 --- a/plugin/spi_test.go +++ b/plugin/spi_test.go @@ -24,7 +24,6 @@ import ( ) func TestExportManifest(t *testing.T) { - t.Parallel() callRecorder := struct { OnInitCalled bool NotifyEventCalled bool diff --git a/privilege/privilege.go b/privilege/privilege.go index e0b9d41f41b1d..af5ff9924ffe9 100644 --- a/privilege/privilege.go +++ b/privilege/privilege.go @@ -59,10 +59,15 @@ type Manager interface { RequestDynamicVerificationWithUser(privName string, grantable bool, user *auth.UserIdentity) bool // ConnectionVerification verifies user privilege for connection. - ConnectionVerification(user, host string, auth, salt []byte, tlsState *tls.ConnectionState) (string, string, bool) + // Requires exact match on user name and host name. + ConnectionVerification(user, host string, auth, salt []byte, tlsState *tls.ConnectionState) bool // GetAuthWithoutVerification uses to get auth name without verification. - GetAuthWithoutVerification(user, host string) (string, string, bool) + // Requires exact match on user name and host name. + GetAuthWithoutVerification(user, host string) bool + + // MatchIdentity matches an identity + MatchIdentity(user, host string, skipNameResolve bool) (string, string, bool) // DBIsVisible returns true is the database is visible to current user. DBIsVisible(activeRole []*auth.RoleIdentity, db string) bool diff --git a/privilege/privileges/cache.go b/privilege/privileges/cache.go index d60d078ca45e3..26e06ec85769b 100644 --- a/privilege/privileges/cache.go +++ b/privilege/privileges/cache.go @@ -31,6 +31,7 @@ import ( "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/chunk" @@ -268,6 +269,18 @@ type MySQLPrivilege struct { RoleGraph map[string]roleGraphEdgesTable } +// FindAllUserEffectiveRoles is used to find all effective roles grant to this user. +// This method will filter out the roles that are not granted to the user but are still in activeRoles +func (p *MySQLPrivilege) FindAllUserEffectiveRoles(user, host string, activeRoles []*auth.RoleIdentity) []*auth.RoleIdentity { + grantedActiveRoles := make([]*auth.RoleIdentity, 0, len(activeRoles)) + for _, role := range activeRoles { + if p.FindRole(user, host, role) { + grantedActiveRoles = append(grantedActiveRoles, role) + } + } + return p.FindAllRole(grantedActiveRoles) +} + // FindAllRole is used to find all roles grant to this user. func (p *MySQLPrivilege) FindAllRole(activeRoles []*auth.RoleIdentity) []*auth.RoleIdentity { queue, head := make([]*auth.RoleIdentity, 0, len(activeRoles)), 0 @@ -560,7 +573,7 @@ func (p *MySQLPrivilege) loadTable(sctx sessionctx.Context, sql string, } defer terror.Call(rs.Close) fs := rs.Fields() - req := rs.NewChunk() + req := rs.NewChunk(nil) for { err = rs.Next(context.TODO(), req) if err != nil { @@ -848,6 +861,9 @@ func decodeSetToPrivilege(s types.Set) mysql.PrivilegeType { // See https://dev.mysql.com/doc/refman/5.7/en/account-names.html func (record *baseRecord) hostMatch(s string) bool { if record.hostIPNet == nil { + if record.Host == "localhost" && net.ParseIP(s).IsLoopback() { + return true + } return false } ip := net.ParseIP(s).To4() @@ -890,14 +906,54 @@ func patternMatch(str string, patChars, patTypes []byte) bool { return stringutil.DoMatchBytes(str, patChars, patTypes) } -// connectionVerification verifies the connection have access to TiDB server. -func (p *MySQLPrivilege) connectionVerification(user, host string) *UserRecord { +// matchIdentity finds an identity to match a user + host +// using the correct rules according to MySQL. +func (p *MySQLPrivilege) matchIdentity(user, host string, skipNameResolve bool) *UserRecord { for i := 0; i < len(p.User); i++ { record := &p.User[i] if record.match(user, host) { return record } } + + // If skip-name resolve is not enabled, and the host is not localhost + // we can fallback and try to resolve with all addrs that match. + // TODO: this is imported from previous code in session.Auth(), and can be improved in future. + if !skipNameResolve && host != variable.DefHostname { + addrs, err := net.LookupAddr(host) + if err != nil { + logutil.BgLogger().Warn( + "net.LookupAddr returned an error during auth check", + zap.String("host", host), + zap.Error(err), + ) + return nil + } + for _, addr := range addrs { + for i := 0; i < len(p.User); i++ { + record := &p.User[i] + if record.match(user, addr) { + return record + } + } + } + } + return nil +} + +// connectionVerification verifies the username + hostname according to exact +// match from the mysql.user privilege table. call matchIdentity() first if you +// do not have an exact match yet. +func (p *MySQLPrivilege) connectionVerification(user, host string) *UserRecord { + records, exists := p.UserMap[user] + if exists { + for i := 0; i < len(records); i++ { + record := &records[i] + if record.Host == host { // exact match + return record + } + } + } return nil } @@ -968,7 +1024,7 @@ func (p *MySQLPrivilege) matchColumns(user, host, db, table, column string) *col // without accepting SUPER privilege as a fallback. func (p *MySQLPrivilege) HasExplicitlyGrantedDynamicPrivilege(activeRoles []*auth.RoleIdentity, user, host, privName string, withGrant bool) bool { privName = strings.ToUpper(privName) - roleList := p.FindAllRole(activeRoles) + roleList := p.FindAllUserEffectiveRoles(user, host, activeRoles) roleList = append(roleList, &auth.RoleIdentity{Username: user, Hostname: host}) // Loop through each of the roles and return on first match // If grantable is required, ensure the record has the GrantOption set. @@ -1016,7 +1072,7 @@ func (p *MySQLPrivilege) RequestVerification(activeRoles []*auth.RoleIdentity, u return true } - roleList := p.FindAllRole(activeRoles) + roleList := p.FindAllUserEffectiveRoles(user, host, activeRoles) roleList = append(roleList, &auth.RoleIdentity{Username: user, Hostname: host}) var userPriv, dbPriv, tablePriv, columnPriv mysql.PrivilegeType @@ -1117,7 +1173,7 @@ func (p *MySQLPrivilege) showGrants(user, host string, roles []*auth.RoleIdentit var hasGlobalGrant = false // Some privileges may granted from role inheritance. // We should find these inheritance relationship. - allRoles := p.FindAllRole(roles) + allRoles := p.FindAllUserEffectiveRoles(user, host, roles) // Show global grants. var currentPriv mysql.PrivilegeType var userExists = false @@ -1257,7 +1313,8 @@ func (p *MySQLPrivilege) showGrants(user, host string, roles []*auth.RoleIdentit // A map of "DB.Table" => Priv(col1, col2 ...) sortFromIdx = len(gs) columnPrivTable := make(map[string]privOnColumns) - for _, record := range p.ColumnsPriv { + for i := range p.ColumnsPriv { + record := p.ColumnsPriv[i] if !collectColumnGrant(&record, user, host, columnPrivTable) { for _, r := range allRoles { collectColumnGrant(&record, r.Username, r.Hostname, columnPrivTable) @@ -1357,7 +1414,7 @@ func privOnColumnsToString(p privOnColumns) string { if idx > 0 { buf.WriteString(", ") } - privStr := privToString(priv, mysql.AllColumnPrivs, mysql.Priv2Str) + privStr := PrivToString(priv, mysql.AllColumnPrivs, mysql.Priv2Str) fmt.Fprintf(&buf, "%s(", privStr) for i, col := range v { if i > 0 { @@ -1395,24 +1452,25 @@ func userPrivToString(privs mysql.PrivilegeType) string { if (privs & ^mysql.GrantPriv) == userTablePrivilegeMask { return mysql.AllPrivilegeLiteral } - return privToString(privs, mysql.AllGlobalPrivs, mysql.Priv2Str) + return PrivToString(privs, mysql.AllGlobalPrivs, mysql.Priv2Str) } func dbPrivToString(privs mysql.PrivilegeType) string { if (privs & ^mysql.GrantPriv) == dbTablePrivilegeMask { return mysql.AllPrivilegeLiteral } - return privToString(privs, mysql.AllDBPrivs, mysql.Priv2SetStr) + return PrivToString(privs, mysql.AllDBPrivs, mysql.Priv2SetStr) } func tablePrivToString(privs mysql.PrivilegeType) string { if (privs & ^mysql.GrantPriv) == tablePrivMask { return mysql.AllPrivilegeLiteral } - return privToString(privs, mysql.AllTablePrivs, mysql.Priv2Str) + return PrivToString(privs, mysql.AllTablePrivs, mysql.Priv2Str) } -func privToString(priv mysql.PrivilegeType, allPrivs []mysql.PrivilegeType, allPrivNames map[mysql.PrivilegeType]string) string { +// PrivToString converts the privileges to string. +func PrivToString(priv mysql.PrivilegeType, allPrivs []mysql.PrivilegeType, allPrivNames map[mysql.PrivilegeType]string) string { pstrs := make([]string, 0, 20) for _, p := range allPrivs { if priv&p == 0 { diff --git a/privilege/privileges/cache_test.go b/privilege/privileges/cache_test.go index 307ac7defc315..4d796333664e5 100644 --- a/privilege/privileges/cache_test.go +++ b/privilege/privileges/cache_test.go @@ -28,7 +28,6 @@ import ( ) func TestLoadUserTable(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -63,7 +62,6 @@ func TestLoadUserTable(t *testing.T) { } func TestLoadGlobalPrivTable(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -91,7 +89,6 @@ func TestLoadGlobalPrivTable(t *testing.T) { } func TestLoadDBTable(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -114,7 +111,6 @@ func TestLoadDBTable(t *testing.T) { } func TestLoadTablesPrivTable(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -140,7 +136,6 @@ func TestLoadTablesPrivTable(t *testing.T) { } func TestLoadColumnsPrivTable(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -166,7 +161,6 @@ func TestLoadColumnsPrivTable(t *testing.T) { } func TestLoadDefaultRoleTable(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -189,7 +183,6 @@ func TestLoadDefaultRoleTable(t *testing.T) { } func TestPatternMatch(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -230,7 +223,6 @@ func TestPatternMatch(t *testing.T) { } func TestHostMatch(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -288,7 +280,6 @@ func TestHostMatch(t *testing.T) { } func TestCaseInsensitive(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -310,7 +301,6 @@ func TestCaseInsensitive(t *testing.T) { } func TestLoadRoleGraph(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -344,7 +334,6 @@ func TestLoadRoleGraph(t *testing.T) { } func TestRoleGraphBFS(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -381,8 +370,46 @@ func TestRoleGraphBFS(t *testing.T) { require.Len(t, ret, 6) } +func TestFindAllUserEffectiveRoles(t *testing.T) { + store, clean := newStore(t) + defer clean() + + se, err := session.CreateSession4Test(store) + require.NoError(t, err) + defer se.Close() + mustExec(t, se, `CREATE USER u1`) + mustExec(t, se, `CREATE ROLE r_1, r_2, r_3, r_4;`) + mustExec(t, se, `GRANT r_3 to r_1`) + mustExec(t, se, `GRANT r_4 to r_2`) + mustExec(t, se, `GRANT r_1 to u1`) + mustExec(t, se, `GRANT r_2 to u1`) + + var p privileges.MySQLPrivilege + err = p.LoadAll(se) + require.NoError(t, err) + ret := p.FindAllUserEffectiveRoles("u1", "%", []*auth.RoleIdentity{ + {Username: "r_1", Hostname: "%"}, + {Username: "r_2", Hostname: "%"}, + }) + require.Equal(t, 4, len(ret)) + require.Equal(t, "r_1", ret[0].Username) + require.Equal(t, "r_2", ret[1].Username) + require.Equal(t, "r_3", ret[2].Username) + require.Equal(t, "r_4", ret[3].Username) + + mustExec(t, se, `REVOKE r_2 from u1`) + err = p.LoadAll(se) + require.NoError(t, err) + ret = p.FindAllUserEffectiveRoles("u1", "%", []*auth.RoleIdentity{ + {Username: "r_1", Hostname: "%"}, + {Username: "r_2", Hostname: "%"}, + }) + require.Equal(t, 2, len(ret)) + require.Equal(t, "r_1", ret[0].Username) + require.Equal(t, "r_3", ret[1].Username) +} + func TestAbnormalMySQLTable(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -461,7 +488,6 @@ func TestAbnormalMySQLTable(t *testing.T) { } func TestSortUserTable(t *testing.T) { - t.Parallel() var p privileges.MySQLPrivilege p.User = []privileges.UserRecord{ privileges.NewUserRecord(`%`, "root"), @@ -502,7 +528,6 @@ func TestSortUserTable(t *testing.T) { } func TestGlobalPrivValueRequireStr(t *testing.T) { - t.Parallel() var ( none = privileges.GlobalPrivValue{SSLType: privileges.SslTypeNone} tls = privileges.GlobalPrivValue{SSLType: privileges.SslTypeAny} @@ -530,7 +555,6 @@ func checkUserRecord(t *testing.T, x, y []privileges.UserRecord) { } func TestDBIsVisible(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() diff --git a/privilege/privileges/privileges.go b/privilege/privileges/privileges.go index 104c2c3782387..7b499bdd64100 100644 --- a/privilege/privileges/privileges.go +++ b/privilege/privileges/privileges.go @@ -256,8 +256,21 @@ func (p *UserPrivileges) GetAuthPlugin(user, host string) (string, error) { return "", errors.New("Failed to get plugin for user") } +// MatchIdentity implements the Manager interface. +func (p *UserPrivileges) MatchIdentity(user, host string, skipNameResolve bool) (u string, h string, success bool) { + if SkipWithGrant { + return user, host, true + } + mysqlPriv := p.Handle.Get() + record := mysqlPriv.matchIdentity(user, host, skipNameResolve) + if record != nil { + return record.User, record.Host, true + } + return "", "", false +} + // GetAuthWithoutVerification implements the Manager interface. -func (p *UserPrivileges) GetAuthWithoutVerification(user, host string) (u string, h string, success bool) { +func (p *UserPrivileges) GetAuthWithoutVerification(user, host string) (success bool) { if SkipWithGrant { p.user = user p.host = host @@ -273,16 +286,14 @@ func (p *UserPrivileges) GetAuthWithoutVerification(user, host string) (u string return } - u = record.User - h = record.Host p.user = user - p.host = h + p.host = record.Host success = true return } // ConnectionVerification implements the Manager interface. -func (p *UserPrivileges) ConnectionVerification(user, host string, authentication, salt []byte, tlsState *tls.ConnectionState) (u string, h string, success bool) { +func (p *UserPrivileges) ConnectionVerification(user, host string, authentication, salt []byte, tlsState *tls.ConnectionState) (success bool) { if SkipWithGrant { p.user = user p.host = host @@ -298,9 +309,6 @@ func (p *UserPrivileges) ConnectionVerification(user, host string, authenticatio return } - u = record.User - h = record.Host - globalPriv := mysqlPriv.matchGlobalPriv(user, host) if globalPriv != nil { if !p.checkSSL(globalPriv, tlsState) { @@ -328,7 +336,7 @@ func (p *UserPrivileges) ConnectionVerification(user, host string, authenticatio // empty password if len(pwd) == 0 && len(authentication) == 0 { p.user = user - p.host = h + p.host = record.Host success = true return } @@ -371,7 +379,7 @@ func (p *UserPrivileges) ConnectionVerification(user, host string, authenticatio } p.user = user - p.host = h + p.host = record.Host success = true return } @@ -542,7 +550,7 @@ func (p *UserPrivileges) DBIsVisible(activeRoles []*auth.RoleIdentity, db string if mysqlPriv.DBIsVisible(p.user, p.host, db) { return true } - allRoles := mysqlPriv.FindAllRole(activeRoles) + allRoles := mysqlPriv.FindAllUserEffectiveRoles(p.user, p.host, activeRoles) for _, role := range allRoles { if mysqlPriv.DBIsVisible(role.Username, role.Hostname, db) { return true diff --git a/privilege/privileges/privileges_test.go b/privilege/privileges/privileges_test.go index a12076c4ae815..d9b7d94b64b33 100644 --- a/privilege/privileges/privileges_test.go +++ b/privilege/privileges/privileges_test.go @@ -26,6 +26,8 @@ import ( "strings" "testing" + "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/executor" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/auth" @@ -48,7 +50,6 @@ import ( const dbName = "test" func TestCheckDBPrivilege(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() rootSe := newSession(t, store, dbName) @@ -78,7 +79,6 @@ func TestCheckDBPrivilege(t *testing.T) { } func TestCheckPointGetDBPrivilege(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() rootSe := newSession(t, store, dbName) @@ -98,7 +98,6 @@ func TestCheckPointGetDBPrivilege(t *testing.T) { } func TestIssue22946(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() rootSe := newSession(t, store, dbName) @@ -125,7 +124,6 @@ func TestIssue22946(t *testing.T) { } func TestCheckTablePrivilege(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -162,7 +160,6 @@ func TestCheckTablePrivilege(t *testing.T) { } func TestCheckViewPrivilege(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() rootSe := newSession(t, store, dbName) @@ -185,7 +182,6 @@ func TestCheckViewPrivilege(t *testing.T) { } func TestCheckPrivilegeWithRoles(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() rootSe := newSession(t, store, dbName) @@ -220,7 +216,6 @@ func TestCheckPrivilegeWithRoles(t *testing.T) { } func TestShowGrants(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -370,8 +365,35 @@ func TestShowGrants(t *testing.T) { require.Len(t, gs, 3) } +// TestErrorMessage checks that the identity in error messages matches the mysql.user table one. +// MySQL is inconsistent in its error messages, as some match the loginHost and others the +// identity from mysql.user. In TiDB we now use the identity from mysql.user in error messages +// for consistency. +func TestErrorMessage(t *testing.T) { + store, clean := newStore(t) + defer clean() + + rootSe := newSession(t, store, dbName) + mustExec(t, rootSe, `CREATE USER wildcard`) + mustExec(t, rootSe, `CREATE USER specifichost@192.168.1.1`) + mustExec(t, rootSe, `GRANT SELECT on test.* TO wildcard`) + mustExec(t, rootSe, `GRANT SELECT on test.* TO specifichost@192.168.1.1`) + + wildSe := newSession(t, store, dbName) + + // The session.Auth() func will populate the AuthUsername and AuthHostname fields. + // We don't have to explicitly specify them. + require.True(t, wildSe.Auth(&auth.UserIdentity{Username: "wildcard", Hostname: "192.168.1.1"}, nil, nil)) + _, err := wildSe.ExecuteInternal(context.Background(), "use mysql;") + require.Equal(t, "[executor:1044]Access denied for user 'wildcard'@'%' to database 'mysql'", err.Error()) + + specificSe := newSession(t, store, dbName) + require.True(t, specificSe.Auth(&auth.UserIdentity{Username: "specifichost", Hostname: "192.168.1.1"}, nil, nil)) + _, err = specificSe.ExecuteInternal(context.Background(), "use mysql;") + require.Equal(t, "[executor:1044]Access denied for user 'specifichost'@'192.168.1.1' to database 'mysql'", err.Error()) +} + func TestShowColumnGrants(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() se := newSession(t, store, dbName) @@ -387,7 +409,6 @@ func TestShowColumnGrants(t *testing.T) { } func TestDropTablePrivileges(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -415,7 +436,6 @@ func TestDropTablePrivileges(t *testing.T) { } func TestSetPasswdStmt(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() se := newSession(t, store, dbName) @@ -536,7 +556,6 @@ func TestAlterUserStmt(t *testing.T) { } func TestSelectViewSecurity(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -563,7 +582,6 @@ func TestSelectViewSecurity(t *testing.T) { } func TestShowViewPriv(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -599,9 +617,9 @@ func TestShowViewPriv(t *testing.T) { {"vshowview", "[planner:1142]SELECT command denied to user 'vshowview'@'%' for table 'v'", "", + "[executor:1142]SELECT command denied to user 'vshowview'@'%' for table 'v'", "", - "", - "", + "[executor:1142]SELECT command denied to user 'vshowview'@'%' for table 'v'", "", "1", "0", @@ -646,24 +664,20 @@ func TestShowViewPriv(t *testing.T) { err = tk.QueryToErr("explain test.v") require.EqualError(t, err, test.explainErr, test) } else { - // TODO: expecting empty set but got one row for vshowview. - // tk.MustQuery("explain test.v").Check(testkit.Rows(test.explainRes)) + tk.MustQuery("explain test.v").Check(testkit.Rows(test.explainRes)) } if test.descErr != "" { err = tk.QueryToErr("explain test.v") require.EqualError(t, err, test.descErr, test) } else { - // TODO: expecting empty set but got one row for vshowview. - // tk.MustQuery("desc test.v").Check(testkit.Rows(test.descRes)) + tk.MustQuery("desc test.v").Check(testkit.Rows(test.descRes)) } tk.MustQuery("select count(*) from information_schema.tables where table_schema='test' and table_name='v'").Check(testkit.Rows(test.tablesNum)) - // TODO: expecting 0 but got 1 for vshowview. - // tk.MustQuery("select count(*) from information_schema.columns where table_schema='test' and table_name='v'").Check(testkit.Rows(test.columnsNum)) + tk.MustQuery("select count(*) from information_schema.columns where table_schema='test' and table_name='v'").Check(testkit.Rows(test.columnsNum)) } } func TestRoleAdminSecurity(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -686,7 +700,6 @@ func TestRoleAdminSecurity(t *testing.T) { } func TestCheckCertBasedAuth(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -923,7 +936,6 @@ func connectionState(issuer, subject pkix.Name, cipher uint16, opt ...func(c *x5 } func TestCheckAuthenticate(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -966,7 +978,6 @@ func TestCheckAuthenticate(t *testing.T) { } func TestUseDB(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -1013,7 +1024,6 @@ func TestUseDB(t *testing.T) { } func TestRevokePrivileges(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -1041,7 +1051,6 @@ func TestRevokePrivileges(t *testing.T) { } func TestSetGlobal(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() se := newSession(t, store, dbName) @@ -1058,7 +1067,6 @@ func TestSetGlobal(t *testing.T) { } func TestCreateDropUser(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -1087,7 +1095,6 @@ func TestCreateDropUser(t *testing.T) { } func TestConfigPrivilege(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -1106,15 +1113,14 @@ func TestConfigPrivilege(t *testing.T) { require.True(t, se.Auth(&auth.UserIdentity{Username: "tcd2", Hostname: "localhost", AuthHostname: "tcd2", AuthUsername: "%"}, nil, nil)) _, err := se.ExecuteInternal(context.Background(), `SHOW CONFIG`) require.Error(t, err) - require.Regexp(t, ".*you need \\(at least one of\\) the CONFIG privilege\\(s\\) for this operation", err.Error()) + require.Regexp(t, "you need \\(at least one of\\) the CONFIG privilege\\(s\\) for this operation$", err.Error()) _, err = se.ExecuteInternal(context.Background(), `SET CONFIG TIKV testkey="testval"`) require.Error(t, err) - require.Regexp(t, ".*you need \\(at least one of\\) the CONFIG privilege\\(s\\) for this operation", err.Error()) + require.Regexp(t, "you need \\(at least one of\\) the CONFIG privilege\\(s\\) for this operation$", err.Error()) mustExec(t, se, `DROP USER tcd1, tcd2`) } func TestShowCreateTable(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -1133,7 +1139,6 @@ func TestShowCreateTable(t *testing.T) { } func TestReplaceAndInsertOnDuplicate(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -1176,7 +1181,6 @@ func TestReplaceAndInsertOnDuplicate(t *testing.T) { } func TestAnalyzeTable(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -1217,7 +1221,6 @@ func TestAnalyzeTable(t *testing.T) { } func TestSystemSchema(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -1255,7 +1258,6 @@ func TestSystemSchema(t *testing.T) { } func TestPerformanceSchema(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -1290,7 +1292,6 @@ func TestPerformanceSchema(t *testing.T) { } func TestMetricsSchema(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -1402,7 +1403,6 @@ func TestMetricsSchema(t *testing.T) { } func TestAdminCommand(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -1425,7 +1425,6 @@ func TestAdminCommand(t *testing.T) { } func TestTableNotExistNoPermissions(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -1474,7 +1473,6 @@ func TestTableNotExistNoPermissions(t *testing.T) { } func TestLoadDataPrivilege(t *testing.T) { - t.Parallel() // Create file. path := "/tmp/load_data_priv.csv" fp, err := os.Create(path) @@ -1509,7 +1507,6 @@ func TestLoadDataPrivilege(t *testing.T) { } func TestSelectIntoNoPermissions(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -1522,7 +1519,6 @@ func TestSelectIntoNoPermissions(t *testing.T) { } func TestGetEncodedPassword(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -1533,7 +1529,6 @@ func TestGetEncodedPassword(t *testing.T) { } func TestAuthHost(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -1555,7 +1550,6 @@ func TestAuthHost(t *testing.T) { } func TestDefaultRoles(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -1580,7 +1574,6 @@ func TestDefaultRoles(t *testing.T) { } func TestUserTableConsistency(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() @@ -1610,7 +1603,6 @@ func TestUserTableConsistency(t *testing.T) { } func TestFieldList(t *testing.T) { // Issue #14237 List fields RPC - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() @@ -1653,7 +1645,6 @@ func newSession(t *testing.T, store kv.Storage, dbName string) session.Session { } func TestDynamicPrivs(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -1700,7 +1691,6 @@ func TestDynamicPrivs(t *testing.T) { } func TestDynamicGrantOption(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -1790,7 +1780,6 @@ func TestSecurityEnhancedModeInfoschema(t *testing.T) { } func TestClusterConfigInfoschema(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -1878,7 +1867,6 @@ func TestSecurityEnhancedModeStatusVars(t *testing.T) { // So we can only test that the dynamic privilege is grantable. // We will have to use an integration test to run SHOW STATUS LIKE 'tidb_gc_leader_desc' // and verify if it appears. - t.Parallel() store, clean := newStore(t) defer clean() tk := testkit.NewTestKit(t, store) @@ -1914,16 +1902,27 @@ func TestSecurityEnhancedLocalBackupRestore(t *testing.T) { defer sem.Disable() // With SEM enabled nolocal does not have permission, but yeslocal does. - _, err = tk.Session().ExecuteInternal(context.Background(), "BACKUP DATABASE * TO 'Local:///tmp/test';") - require.EqualError(t, err, "[planner:8132]Feature 'local://' is not supported when security enhanced mode is enabled") + _, err = tk.Session().ExecuteInternal(context.Background(), "BACKUP DATABASE * TO 'local:///tmp/test';") + require.EqualError(t, err, "[planner:8132]Feature 'local storage' is not supported when security enhanced mode is enabled") + + _, err = tk.Session().ExecuteInternal(context.Background(), "BACKUP DATABASE * TO 'file:///tmp/test';") + require.EqualError(t, err, "[planner:8132]Feature 'local storage' is not supported when security enhanced mode is enabled") + + _, err = tk.Session().ExecuteInternal(context.Background(), "BACKUP DATABASE * TO '/tmp/test';") + require.EqualError(t, err, "[planner:8132]Feature 'local storage' is not supported when security enhanced mode is enabled") _, err = tk.Session().ExecuteInternal(context.Background(), "RESTORE DATABASE * FROM 'LOCAl:///tmp/test';") - require.EqualError(t, err, "[planner:8132]Feature 'local://' is not supported when security enhanced mode is enabled") + require.EqualError(t, err, "[planner:8132]Feature 'local storage' is not supported when security enhanced mode is enabled") + + _, err = tk.Session().ExecuteInternal(context.Background(), "BACKUP DATABASE * TO 'hdfs:///tmp/test';") + require.EqualError(t, err, "[planner:8132]Feature 'hdfs storage' is not supported when security enhanced mode is enabled") + + _, err = tk.Session().ExecuteInternal(context.Background(), "RESTORE DATABASE * FROM 'HDFS:///tmp/test';") + require.EqualError(t, err, "[planner:8132]Feature 'hdfs storage' is not supported when security enhanced mode is enabled") } func TestRenameUser(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -1940,11 +1939,11 @@ func TestRenameUser(t *testing.T) { // Check privileges (need CREATE USER) _, err := se1.ExecuteInternal(context.Background(), "RENAME USER ru3 TO ru4") require.Error(t, err) - require.Regexp(t, ".*Access denied; you need .at least one of. the CREATE USER privilege.s. for this operation", err.Error()) + require.Regexp(t, "Access denied; you need .at least one of. the CREATE USER privilege.s. for this operation$", err.Error()) mustExec(t, rootSe, "GRANT UPDATE ON mysql.user TO 'ru1'@'localhost'") _, err = se1.ExecuteInternal(context.Background(), "RENAME USER ru3 TO ru4") require.Error(t, err) - require.Regexp(t, ".*Access denied; you need .at least one of. the CREATE USER privilege.s. for this operation", err.Error()) + require.Regexp(t, "Access denied; you need .at least one of. the CREATE USER privilege.s. for this operation$", err.Error()) mustExec(t, rootSe, "GRANT CREATE USER ON *.* TO 'ru1'@'localhost'") _, err = se1.ExecuteInternal(context.Background(), "RENAME USER ru3 TO ru4") require.NoError(t, err) @@ -1957,19 +1956,19 @@ func TestRenameUser(t *testing.T) { // Including negative tests, i.e. non existing from user and existing to user _, err = rootSe.ExecuteInternal(context.Background(), "RENAME USER ru3 TO ru1@localhost") require.Error(t, err) - require.Regexp(t, ".*Operation RENAME USER failed for ru3@%.*", err.Error()) + require.Contains(t, err.Error(), "Operation RENAME USER failed for ru3@%") _, err = se1.ExecuteInternal(context.Background(), "RENAME USER ru4 TO ru5@localhost") require.Error(t, err) - require.Regexp(t, ".*Operation RENAME USER failed for ru4@%.*", err.Error()) + require.Contains(t, err.Error(), "Operation RENAME USER failed for ru4@%") _, err = se1.ExecuteInternal(context.Background(), "RENAME USER ru3 TO ru3") require.Error(t, err) - require.Regexp(t, ".*Operation RENAME USER failed for ru3@%.*", err.Error()) + require.Contains(t, err.Error(), "Operation RENAME USER failed for ru3@%") _, err = se1.ExecuteInternal(context.Background(), "RENAME USER ru3 TO ru5@localhost, ru4 TO ru7") require.Error(t, err) - require.Regexp(t, ".*Operation RENAME USER failed for ru4@%.*", err.Error()) + require.Contains(t, err.Error(), "Operation RENAME USER failed for ru4@%") _, err = se1.ExecuteInternal(context.Background(), "RENAME USER ru3 TO ru5@localhost, ru6@localhost TO ru1@localhost") require.Error(t, err) - require.Regexp(t, ".*Operation RENAME USER failed for ru6@localhost.*", err.Error()) + require.Contains(t, err.Error(), "Operation RENAME USER failed for ru6@localhost") // Test multi rename, this is a full swap of ru3 and ru6, i.e. need to read its previous state in the same transaction. _, err = se1.ExecuteInternal(context.Background(), "RENAME USER 'ru3' TO 'ru3_tmp', ru6@localhost TO ru3, 'ru3_tmp' to ru6@localhost") @@ -2035,7 +2034,6 @@ func TestSecurityEnhancedModeSysVars(t *testing.T) { // TestViewDefiner tests that default roles are correctly applied in the algorithm definer // See: https://github.com/pingcap/tidb/issues/24414 func TestViewDefiner(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -2113,7 +2111,6 @@ func TestSecurityEnhancedModeRestrictedUsers(t *testing.T) { } func TestDynamicPrivsRegistration(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -2156,7 +2153,6 @@ func TestDynamicPrivsRegistration(t *testing.T) { func TestInfoSchemaUserPrivileges(t *testing.T) { // Being able to read all privileges from information_schema.user_privileges requires a very specific set of permissions. // SUPER user is not sufficient. It was observed in MySQL to require SELECT on mysql.* - t.Parallel() store, clean := newStore(t) defer clean() @@ -2215,7 +2211,6 @@ func TestInfoSchemaUserPrivileges(t *testing.T) { // Issues https://github.com/pingcap/tidb/issues/25972 and https://github.com/pingcap/tidb/issues/26451 func TestGrantOptionAndRevoke(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -2293,7 +2288,6 @@ func tearDownTest(t *testing.T, store kv.Storage, dbName string) { } func TestGrantReferences(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -2319,7 +2313,6 @@ func TestGrantReferences(t *testing.T) { } func TestDashboardClientDynamicPriv(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -2364,8 +2357,6 @@ func TestDashboardClientDynamicPriv(t *testing.T) { // https://github.com/pingcap/tidb/issues/27213 func TestShowGrantsWithRolesAndDynamicPrivs(t *testing.T) { - t.Parallel() - store, clean := newStore(t) defer clean() @@ -2454,7 +2445,6 @@ func TestShowGrantsWithRolesAndDynamicPrivs(t *testing.T) { } func TestGrantLockTables(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -2479,8 +2469,6 @@ func TestGrantLockTables(t *testing.T) { // https://github.com/pingcap/tidb/issues/27560 func TestShowGrantsForCurrentUserUsingRole(t *testing.T) { - t.Parallel() - store, clean := newStore(t) defer clean() @@ -2532,7 +2520,6 @@ func TestShowGrantsForCurrentUserUsingRole(t *testing.T) { } func TestGrantPlacementAdminDynamicPriv(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -2592,7 +2579,6 @@ func TestDBNameCaseSensitivityInTableLevel(t *testing.T) { } func TestInformationSchemaPlacmentRulesPrivileges(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -2609,6 +2595,7 @@ func TestInformationSchemaPlacmentRulesPrivileges(t *testing.T) { }() tk.MustExec("CREATE DATABASE placement_rule_db") tk.MustExec("USE placement_rule_db") + tk.Session().GetSessionVars().EnableAlterPlacement = true tk.MustExec(`CREATE TABLE placement_rule_table_se (a int) PRIMARY_REGION="se" REGIONS="se,nl"`) tk.MustExec(`CREATE TABLE placement_rule_table_nl (a int) PRIMARY_REGION="nl" REGIONS="se,nl"`) tk.MustQuery(`SELECT * FROM information_schema.placement_rules WHERE SCHEMA_NAME = "placement_rule_db"`).Sort().Check(testkit.Rows( @@ -2645,7 +2632,6 @@ func TestInformationSchemaPlacmentRulesPrivileges(t *testing.T) { } func TestGrantCreateTmpTables(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -2656,7 +2642,8 @@ func TestGrantCreateTmpTables(t *testing.T) { tk.MustExec("CREATE TABLE create_tmp_table_table (a int)") tk.MustExec("GRANT CREATE TEMPORARY TABLES on create_tmp_table_db.* to u1") tk.MustExec("GRANT CREATE TEMPORARY TABLES on *.* to u1") - // Must set a session user to avoid null pointer dereferencing + tk.MustGetErrCode("GRANT CREATE TEMPORARY TABLES on create_tmp_table_db.tmp to u1", mysql.ErrIllegalGrantForTable) + // Must set a session user to avoid null pointer dereference tk.Session().Auth(&auth.UserIdentity{ Username: "root", Hostname: "localhost", @@ -2668,8 +2655,164 @@ func TestGrantCreateTmpTables(t *testing.T) { tk.MustExec("DROP DATABASE create_tmp_table_db") } +func TestCreateTmpTablesPriv(t *testing.T) { + store, clean := newStore(t) + defer clean() + + createStmt := "CREATE TEMPORARY TABLE test.tmp(id int)" + dropStmt := "DROP TEMPORARY TABLE IF EXISTS test.tmp" + + tk := testkit.NewTestKit(t, store) + tk.MustExec(dropStmt) + tk.MustExec("CREATE TABLE test.t(id int primary key)") + tk.MustExec("CREATE SEQUENCE test.tmp") + tk.MustExec("CREATE USER vcreate, vcreate_tmp, vcreate_tmp_all") + tk.MustExec("GRANT CREATE, USAGE ON test.* TO vcreate") + tk.MustExec("GRANT CREATE TEMPORARY TABLES, USAGE ON test.* TO vcreate_tmp") + tk.MustExec("GRANT CREATE TEMPORARY TABLES, USAGE ON *.* TO vcreate_tmp_all") + + tk.Session().Auth(&auth.UserIdentity{Username: "vcreate", Hostname: "localhost"}, nil, nil) + err := tk.ExecToErr(createStmt) + require.EqualError(t, err, "[planner:1044]Access denied for user 'vcreate'@'%' to database 'test'") + tk.Session().Auth(&auth.UserIdentity{Username: "vcreate_tmp", Hostname: "localhost"}, nil, nil) + tk.MustExec(createStmt) + tk.MustExec(dropStmt) + tk.Session().Auth(&auth.UserIdentity{Username: "vcreate_tmp_all", Hostname: "localhost"}, nil, nil) + // TODO: issue #29280 to be fixed. + //err = tk.ExecToErr(createStmt) + //require.EqualError(t, err, "[planner:1044]Access denied for user 'vcreate_tmp_all'@'%' to database 'test'") + + tests := []struct { + sql string + errcode int + }{ + { + sql: "create temporary table tmp(id int primary key)", + }, + { + sql: "insert into tmp value(1)", + }, + { + sql: "insert into tmp value(1) on duplicate key update id=1", + }, + { + sql: "replace tmp values(1)", + }, + { + sql: "insert into tmp select * from t", + errcode: mysql.ErrTableaccessDenied, + }, + { + sql: "update tmp set id=1 where id=1", + }, + { + sql: "update tmp t1, t t2 set t1.id=t2.id where t1.id=t2.id", + errcode: mysql.ErrTableaccessDenied, + }, + { + sql: "delete from tmp where id=1", + }, + { + sql: "delete t1 from tmp t1 join t t2 where t1.id=t2.id", + errcode: mysql.ErrTableaccessDenied, + }, + { + sql: "select * from tmp where id=1", + }, + { + sql: "select * from tmp where id in (1,2)", + }, + { + sql: "select * from tmp", + }, + { + sql: "select * from tmp join t where tmp.id=t.id", + errcode: mysql.ErrTableaccessDenied, + }, + { + sql: "(select * from tmp) union (select * from t)", + errcode: mysql.ErrTableaccessDenied, + }, + { + sql: "create temporary table tmp1 like t", + errcode: mysql.ErrTableaccessDenied, + }, + { + sql: "create table tmp(id int primary key)", + errcode: mysql.ErrTableaccessDenied, + }, + { + sql: "create table t(id int primary key)", + errcode: mysql.ErrTableaccessDenied, + }, + { + sql: "analyze table tmp", + }, + { + sql: "analyze table tmp, t", + errcode: mysql.ErrTableaccessDenied, + }, + { + sql: "show create table tmp", + }, + // TODO: issue #29281 to be fixed. + //{ + // sql: "show create table t", + // errcode: mysql.ErrTableaccessDenied, + //}, + { + sql: "drop sequence tmp", + errcode: mysql.ErrTableaccessDenied, + }, + { + sql: "alter table tmp add column c1 char(10)", + errcode: errno.ErrUnsupportedDDLOperation, + }, + { + sql: "truncate table tmp", + }, + { + sql: "drop temporary table t", + errcode: mysql.ErrBadTable, + }, + { + sql: "drop table t", + errcode: mysql.ErrTableaccessDenied, + }, + { + sql: "drop table t, tmp", + errcode: mysql.ErrTableaccessDenied, + }, + { + sql: "drop temporary table tmp", + }, + } + + tk.Session().Auth(&auth.UserIdentity{Username: "vcreate_tmp", Hostname: "localhost"}, nil, nil) + tk.MustExec("use test") + tk.MustExec(dropStmt) + for _, test := range tests { + if test.errcode == 0 { + tk.MustExec(test.sql) + } else { + tk.MustGetErrCode(test.sql, test.errcode) + } + } + + // TODO: issue #29282 to be fixed. + //for i, test := range tests { + // preparedStmt := fmt.Sprintf("prepare stmt%d from '%s'", i, test.sql) + // executeStmt := fmt.Sprintf("execute stmt%d", i) + // tk.MustExec(preparedStmt) + // if test.errcode == 0 { + // tk.MustExec(executeStmt) + // } else { + // tk.MustGetErrCode(executeStmt, test.errcode) + // } + //} +} + func TestRevokeSecondSyntax(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -2686,7 +2829,6 @@ func TestRevokeSecondSyntax(t *testing.T) { } func TestGrantEvent(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -2710,7 +2852,6 @@ func TestGrantEvent(t *testing.T) { } func TestGrantRoutine(t *testing.T) { - t.Parallel() store, clean := newStore(t) defer clean() @@ -2734,3 +2875,98 @@ func TestGrantRoutine(t *testing.T) { tk.MustExec("DROP USER u1") tk.MustExec("DROP DATABASE routine_db") } + +func TestIssue28675(t *testing.T) { + store, clean := newStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec(`DROP VIEW IF EXISTS test.v`) + tk.MustExec(`create user test_user`) + tk.MustExec("create view test.v as select 1") + tk.MustExec("grant show view on test.v to test_user") + require.True(t, tk.Session().Auth(&auth.UserIdentity{Username: "test_user", Hostname: "localhost"}, nil, nil)) + tk.MustQuery("select count(*) from information_schema.columns where table_schema='test' and table_name='v'").Check(testkit.Rows("0")) + tk.ExecToErr("desc test.v") + tk.ExecToErr("explain test.v") + + require.True(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "localhost"}, nil, nil)) + tk.MustExec("grant update on test.v to test_user") + tk.MustExec("grant select on test.v to test_user") + require.True(t, tk.Session().Auth(&auth.UserIdentity{Username: "test_user", Hostname: "localhost"}, nil, nil)) + tk.MustQuery("select count(*) from information_schema.columns where table_schema='test' and table_name='v'").Check(testkit.Rows("1")) + tk.MustQuery("select privileges from information_schema.columns where table_schema='test' and table_name='v'").Check(testkit.Rows("select,update")) + require.Equal(t, 1, len(tk.MustQuery("desc test.v").Rows())) + require.Equal(t, 1, len(tk.MustQuery("explain test.v").Rows())) +} + +func TestSkipGrantTable(t *testing.T) { + save := config.GetGlobalConfig() + config.UpdateGlobal(func(c *config.Config) { c.Security.SkipGrantTable = true }) + defer config.StoreGlobalConfig(save) + + store, clean := newStore(t) + defer clean() + + // Issue 29317 + tk := testkit.NewTestKit(t, store) + tk.MustExec(`CREATE USER 'test1'@'%';`) + tk.MustExec(`GRANT BACKUP_ADMIN ON *.* TO 'test1'@'%';`) + tk.MustExec(`GRANT RESTORE_ADMIN ON *.* TO 'test1'@'%';`) + tk.MustExec(`GRANT RELOAD ON *.* TO 'test1'@'%';`) + tk.MustExec(`GRANT SHUTDOWN ON *.* TO 'test1'@'%';`) + tk.MustExec(`GRANT SYSTEM_VARIABLES_ADMIN ON *.* TO 'test1'@'%';`) + tk.MustExec(`GRANT RESTRICTED_VARIABLES_ADMIN ON *.* TO 'test1'@'%';`) + tk.MustExec(`GRANT RESTRICTED_STATUS_ADMIN ON *.* TO 'test1'@'%';`) + tk.MustExec(`GRANT RESTRICTED_CONNECTION_ADMIN, CONNECTION_ADMIN ON *.* TO 'test1'@'%';`) + tk.MustExec(`GRANT RESTRICTED_USER_ADMIN ON *.* TO 'test1'@'%';`) + tk.MustExec(`GRANT RESTRICTED_TABLES_ADMIN ON *.* TO 'test1'@'%';`) + tk.MustExec(`GRANT PROCESS ON *.* TO 'test1'@'%';`) + tk.MustExec(`GRANT SHUTDOWN ON *.* TO 'test1'@'%';`) + tk.MustExec(`GRANT SELECT, INSERT, UPDATE, DELETE ON mysql.* TO 'test1'@'%';`) + tk.MustExec(`GRANT SELECT ON information_schema.* TO 'test1'@'%';`) + tk.MustExec(`GRANT SELECT ON performance_schema.* TO 'test1'@'%';`) + tk.MustExec(`GRANT ALL PRIVILEGES ON *.* TO root;`) + tk.MustExec(`revoke SHUTDOWN on *.* from root;`) + tk.MustExec(`revoke CONFIG on *.* from root;`) + + tk.MustExec(`CREATE USER 'test2'@'%' IDENTIFIED BY '12345';`) + tk.MustExec(`GRANT PROCESS, CONFIG ON *.* TO 'test2'@'%';`) + tk.MustExec(`GRANT SHOW DATABASES ON *.* TO 'test2'@'%';`) + tk.MustExec(`GRANT DASHBOARD_CLIENT ON *.* TO 'test2'@'%';`) + tk.MustExec(`GRANT SYSTEM_VARIABLES_ADMIN ON *.* TO 'test2'@'%';`) + tk.MustExec(`GRANT RESTRICTED_VARIABLES_ADMIN ON *.* TO 'test2'@'%';`) + tk.MustExec(`GRANT RESTRICTED_STATUS_ADMIN ON *.* TO 'test2'@'%';`) + tk.MustExec(`GRANT RESTRICTED_TABLES_ADMIN ON *.* TO 'test2'@'%';`) + tk.MustExec(`GRANT RESTRICTED_USER_ADMIN ON *.* TO 'test2'@'%';`) +} + +func TestIssue29823(t *testing.T) { + store, clean := newStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1") + tk.MustExec("create user u1") + tk.MustExec("create role r1") + tk.MustExec("create table t1 (c1 int)") + tk.MustExec("grant select on t1 to r1") + tk.MustExec("grant r1 to u1") + + tk2 := testkit.NewTestKit(t, store) + require.True(t, tk2.Session().Auth(&auth.UserIdentity{Username: "u1", Hostname: "%"}, nil, nil)) + tk2.MustExec("set role all") + tk2.MustQuery("select current_role()").Check(testkit.Rows("`r1`@`%`")) + tk2.MustQuery("select * from test.t1").Check(testkit.Rows()) + tk2.MustQuery("show databases like 'test'").Check(testkit.Rows("test")) + tk2.MustQuery("show tables from test").Check(testkit.Rows("t1")) + + tk.MustExec("revoke r1 from u1") + tk2.MustQuery("select current_role()").Check(testkit.Rows("`r1`@`%`")) + err := tk2.ExecToErr("select * from test.t1") + require.EqualError(t, err, "[planner:1142]SELECT command denied to user 'u1'@'%' for table 't1'") + tk2.MustQuery("show databases like 'test'").Check(testkit.Rows()) + err = tk2.QueryToErr("show tables from test") + require.EqualError(t, err, "[executor:1044]Access denied for user 'u1'@'%' to database 'test'") +} diff --git a/server/column.go b/server/column.go index a142221b6acdc..2ef6323d83b5f 100644 --- a/server/column.go +++ b/server/column.go @@ -15,6 +15,7 @@ package server import ( + "github.com/pingcap/tidb/parser/charset" "github.com/pingcap/tidb/parser/mysql" ) @@ -39,7 +40,7 @@ type ColumnInfo struct { // Dump dumps ColumnInfo to bytes. func (column *ColumnInfo) Dump(buffer []byte, d *resultEncoder) []byte { if d == nil { - d = &resultEncoder{} + d = newResultEncoder(charset.CharsetUTF8MB4) } nameDump, orgnameDump := []byte(column.Name), []byte(column.OrgName) if len(nameDump) > maxColumnNameSize { diff --git a/server/column_test.go b/server/column_test.go index 7e17c2facb414..9d54a643f7f7b 100644 --- a/server/column_test.go +++ b/server/column_test.go @@ -22,8 +22,6 @@ import ( ) func TestDumpColumn(t *testing.T) { - t.Parallel() - info := ColumnInfo{ Schema: "testSchema", Table: "testTable", @@ -52,8 +50,6 @@ func TestDumpColumn(t *testing.T) { } func TestColumnNameLimit(t *testing.T) { - t.Parallel() - aLongName := make([]byte, 0, 300) for i := 0; i < 300; i++ { aLongName = append(aLongName, 'a') diff --git a/server/conn.go b/server/conn.go index dad7878a6afa1..e9325a6dd97d6 100644 --- a/server/conn.go +++ b/server/conn.go @@ -158,6 +158,7 @@ func newClientConn(s *Server) *clientConn { connectionID: s.globalConnID.NextID(), collation: mysql.DefaultCollationID, alloc: arena.NewAllocator(32 * 1024), + chunkAlloc: chunk.NewAllocator(), status: connStatusDispatching, lastActive: time.Now(), authPlugin: mysql.AuthNativePassword, @@ -177,6 +178,7 @@ type clientConn struct { dbname string // default database name. salt []byte // random bytes used for authentication. alloc arena.Allocator // an memory allocator for reducing memory allocation. + chunkAlloc chunk.Allocator lastPacket []byte // latest sql query string, currently used for logging error. ctx *TiDBContext // an interface to execute sql statements. attrs map[string]string // attributes parsed from client handshake response, not used for now. @@ -189,6 +191,7 @@ type clientConn struct { authPlugin string // default authentication plugin isUnixSocket bool // connection is Unix Socket file rsEncoder *resultEncoder // rsEncoder is used to encode the string result to different charsets. + inputDecoder *inputDecoder // inputDecoder is used to decode the different charsets of incoming strings to utf-8. socketCredUID uint32 // UID from the other end of the Unix Socket // mu is used for cancelling the execution of current transaction. mu struct { @@ -211,6 +214,9 @@ func (cc *clientConn) String() string { // https://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::AuthSwitchRequest // https://bugs.mysql.com/bug.php?id=93044 func (cc *clientConn) authSwitchRequest(ctx context.Context, plugin string) ([]byte, error) { + failpoint.Inject("FakeAuthSwitch", func() { + failpoint.Return([]byte(plugin), nil) + }) enclen := 1 + len(plugin) + 1 + len(cc.salt) + 1 data := cc.alloc.AllocWithLen(4, enclen) data = append(data, mysql.AuthSwitchRequest) // switch request @@ -308,8 +314,10 @@ func (cc *clientConn) Close() error { func closeConn(cc *clientConn, connections int) error { metrics.ConnGauge.Set(float64(connections)) - err := cc.bufReadConn.Close() - terror.Log(err) + if cc.bufReadConn != nil { + err := cc.bufReadConn.Close() + terror.Log(err) + } if cc.ctx != nil { return cc.ctx.Close() } @@ -358,8 +366,7 @@ func (cc *clientConn) writeInitialHandshake(ctx context.Context) error { data = append(data, 0) // auth-plugin name if cc.ctx == nil { - err := cc.openSession() - if err != nil { + if err := cc.openSession(); err != nil { return err } } @@ -372,15 +379,13 @@ func (cc *clientConn) writeInitialHandshake(ctx context.Context) error { // Close the session to force this to be re-opened after we parse the response. This is needed // to ensure we use the collation and client flags from the response for the session. - err = cc.ctx.Close() - if err != nil { + if err = cc.ctx.Close(); err != nil { return err } cc.ctx = nil data = append(data, 0) - err = cc.writePacket(data) - if err != nil { + if err = cc.writePacket(data); err != nil { return err } return cc.flush(ctx) @@ -708,9 +713,10 @@ func (cc *clientConn) readOptionalSSLRequestAndHandshakeResponse(ctx context.Con func (cc *clientConn) handleAuthPlugin(ctx context.Context, resp *handshakeResponse41) error { if resp.Capability&mysql.ClientPluginAuth > 0 { - newAuth, err := cc.checkAuthPlugin(ctx, &resp.AuthPlugin) + newAuth, err := cc.checkAuthPlugin(ctx, resp) if err != nil { logutil.Logger(ctx).Warn("failed to check the user authplugin", zap.Error(err)) + return err } if len(newAuth) > 0 { resp.Auth = newAuth @@ -718,30 +724,35 @@ func (cc *clientConn) handleAuthPlugin(ctx context.Context, resp *handshakeRespo switch resp.AuthPlugin { case mysql.AuthCachingSha2Password: - resp.Auth, err = cc.authSha(ctx) - if err != nil { - return err - } case mysql.AuthNativePassword: case mysql.AuthSocket: default: logutil.Logger(ctx).Warn("Unknown Auth Plugin", zap.String("plugin", resp.AuthPlugin)) } } else { + // MySQL 5.1 and older clients don't support authentication plugins. logutil.Logger(ctx).Warn("Client without Auth Plugin support; Please upgrade client") + _, err := cc.checkAuthPlugin(ctx, resp) + if err != nil { + return err + } + resp.AuthPlugin = mysql.AuthNativePassword } return nil } +// authSha implements the caching_sha2_password specific part of the protocol. func (cc *clientConn) authSha(ctx context.Context) ([]byte, error) { const ( ShaCommand = 1 - RequestRsaPubKey = 2 + RequestRsaPubKey = 2 // Not supported yet, only TLS is supported as secure channel. FastAuthOk = 3 FastAuthFail = 4 ) + // Currently we always send a "FastAuthFail" as the cached part of the protocol isn't implemented yet. + // This triggers the client to send the full response. err := cc.writePacket([]byte{0, 0, 0, 0, ShaCommand, FastAuthFail}) if err != nil { logutil.Logger(ctx).Error("authSha packet write failed", zap.Error(err)) @@ -831,7 +842,7 @@ func (cc *clientConn) openSessionAndDoAuth(authData []byte, authPlugin string) e } // Check if the Authentication Plugin of the server, client and user configuration matches -func (cc *clientConn) checkAuthPlugin(ctx context.Context, authPlugin *string) ([]byte, error) { +func (cc *clientConn) checkAuthPlugin(ctx context.Context, resp *handshakeResponse41) ([]byte, error) { // Open a context unless this was done before. if cc.ctx == nil { err := cc.openSession() @@ -840,12 +851,34 @@ func (cc *clientConn) checkAuthPlugin(ctx context.Context, authPlugin *string) ( } } - userplugin, err := cc.ctx.AuthPluginForUser(&auth.UserIdentity{Username: cc.user, Hostname: cc.peerHost}) + authData := resp.Auth + hasPassword := "YES" + if len(authData) == 0 { + hasPassword = "NO" + } + host, _, err := cc.PeerHost(hasPassword) if err != nil { return nil, err } + // Find the identity of the user based on username and peer host. + identity, err := cc.ctx.MatchIdentity(cc.user, host) + if err != nil { + return nil, errAccessDenied.FastGenByArgs(cc.user, host, hasPassword) + } + // Get the plugin for the identity. + userplugin, err := cc.ctx.AuthPluginForUser(identity) + if err != nil { + logutil.Logger(ctx).Warn("Failed to get authentication method for user", + zap.String("user", cc.user), zap.String("host", host)) + } + failpoint.Inject("FakeUser", func(val failpoint.Value) { + userplugin = val.(string) + }) if userplugin == mysql.AuthSocket { - *authPlugin = mysql.AuthSocket + if !cc.isUnixSocket { + return nil, errAccessDenied.FastGenByArgs(cc.user, host, hasPassword) + } + resp.AuthPlugin = mysql.AuthSocket user, err := user.LookupId(fmt.Sprint(cc.socketCredUID)) if err != nil { return nil, err @@ -853,9 +886,19 @@ func (cc *clientConn) checkAuthPlugin(ctx context.Context, authPlugin *string) ( return []byte(user.Username), nil } if len(userplugin) == 0 { - logutil.Logger(ctx).Warn("No user plugin set, assuming MySQL Native Password", - zap.String("user", cc.user), zap.String("host", cc.peerHost)) - *authPlugin = mysql.AuthNativePassword + // No user plugin set, assuming MySQL Native Password + // This happens if the account doesn't exist or if the account doesn't have + // a password set. + if resp.AuthPlugin != mysql.AuthNativePassword { + if resp.Capability&mysql.ClientPluginAuth > 0 { + resp.AuthPlugin = mysql.AuthNativePassword + authData, err := cc.authSwitchRequest(ctx, mysql.AuthNativePassword) + if err != nil { + return nil, err + } + return authData, nil + } + } return nil, nil } @@ -864,13 +907,18 @@ func (cc *clientConn) checkAuthPlugin(ctx context.Context, authPlugin *string) ( // or if the authentication method send by the server doesn't match the authentication // method send by the client (*authPlugin) then we need to switch the authentication // method to match the one configured for that specific user. - if (cc.authPlugin != userplugin) || (cc.authPlugin != *authPlugin) { - authData, err := cc.authSwitchRequest(ctx, userplugin) - if err != nil { - return nil, err + if (cc.authPlugin != userplugin) || (cc.authPlugin != resp.AuthPlugin) { + if resp.Capability&mysql.ClientPluginAuth > 0 { + authData, err := cc.authSwitchRequest(ctx, userplugin) + if err != nil { + return nil, err + } + resp.AuthPlugin = userplugin + return authData, nil + } else if userplugin != mysql.AuthNativePassword { + // MySQL 5.1 and older don't support authentication plugins yet + return nil, errNotSupportedAuthMode } - *authPlugin = userplugin - return authData, nil } return nil, nil @@ -878,7 +926,7 @@ func (cc *clientConn) checkAuthPlugin(ctx context.Context, authPlugin *string) ( func (cc *clientConn) PeerHost(hasPassword string) (host, port string, err error) { if len(cc.peerHost) > 0 { - return cc.peerHost, "", nil + return cc.peerHost, cc.peerPort, nil } host = variable.DefHostname if cc.isUnixSocket { @@ -917,6 +965,15 @@ func (cc *clientConn) initResultEncoder(ctx context.Context) { cc.rsEncoder = newResultEncoder(chs) } +func (cc *clientConn) initInputEncoder(ctx context.Context) { + chs, err := variable.GetSessionOrGlobalSystemVar(cc.ctx.GetSessionVars(), variable.CharacterSetClient) + if err != nil { + chs = "" + logutil.Logger(ctx).Warn("get character_set_client system variable failed", zap.Error(err)) + } + cc.inputDecoder = newInputDecoder(chs) +} + // initConnect runs the initConnect SQL statement if it has been specified. // The semantics are MySQL compatible. func (cc *clientConn) initConnect(ctx context.Context) error { @@ -940,7 +997,7 @@ func (cc *clientConn) initConnect(ctx context.Context) error { // init_connect does not care about the results, // but they need to be drained because of lazy loading. if rs != nil { - req := rs.NewChunk() + req := rs.NewChunk(nil) for { if err = rs.Next(ctx, req); err != nil { return err @@ -983,6 +1040,7 @@ func (cc *clientConn) Run(ctx context.Context) { terror.Log(err) } }() + // Usually, client connection status changes between [dispatching] <=> [reading]. // When some event happens, server may notify this client connection by setting // the status to special values, for example: kill or graceful shutdown. @@ -1028,7 +1086,9 @@ func (cc *clientConn) Run(ctx context.Context) { } startTime := time.Now() - if err = cc.dispatch(ctx, data); err != nil { + err = cc.dispatch(ctx, data) + cc.chunkAlloc.Reset() + if err != nil { cc.audit(plugin.Error) // tell the plugin API there was a dispatch error if terror.ErrorEqual(err, io.EOF) { cc.addMetrics(data[0], startTime, nil) @@ -1287,7 +1347,6 @@ func (cc *clientConn) dispatch(ctx context.Context, data []byte) error { // ComProcessInfo, ComConnect, ComProcessKill, ComDebug case mysql.ComPing: return cc.writeOK(ctx) - // ComTime, ComDelayedInsert case mysql.ComChangeUser: return cc.handleChangeUser(ctx, data) // ComBinlogDump, ComTableDump, ComConnectOut, ComRegisterSlave @@ -1543,11 +1602,11 @@ func processStream(ctx context.Context, cc *clientConn, loadDataInfo *executor.L } if err != nil { logutil.Logger(ctx).Error("load data process stream error", zap.Error(err)) - } else { - err = loadDataInfo.EnqOneTask(ctx) - if err != nil { - logutil.Logger(ctx).Error("load data process stream error", zap.Error(err)) - } + return + } + if err = loadDataInfo.EnqOneTask(ctx); err != nil { + logutil.Logger(ctx).Error("load data process stream error", zap.Error(err)) + return } } @@ -1676,13 +1735,21 @@ func (cc *clientConn) handleIndexAdvise(ctx context.Context, indexAdviseInfo *ex return nil } -// handlePlanReplayer dose the export/import work for reproducing sql queries. -func (cc *clientConn) handlePlanReplayer(ctx context.Context, info executor.PlanReplayerInfo) (string, error) { - switch info.(type) { - case *executor.PlanReplayerSingleInfo: - return info.Process() +func (cc *clientConn) handlePlanReplayerLoad(ctx context.Context, planReplayerLoadInfo *executor.PlanReplayerLoadInfo) error { + if cc.capability&mysql.ClientLocalFiles == 0 { + return errNotAllowedCommand + } + if planReplayerLoadInfo == nil { + return errors.New("plan replayer load: info is empty") + } + data, err := cc.getDataFromPath(ctx, planReplayerLoadInfo.Path) + if err != nil { + return err + } + if len(data) == 0 { + return nil } - return "", errors.New("plan replayer: not supporting info type") + return planReplayerLoadInfo.Update(data) } func (cc *clientConn) audit(eventType plugin.GeneralEvent) { @@ -1756,7 +1823,7 @@ func (cc *clientConn) handleQuery(ctx context.Context, sql string) (err error) { var retryable bool for i, stmt := range stmts { if len(pointPlans) > 0 { - // Save the point plan in Session so we don't need to build the point plan again. + // Save the point plan in Session, so we don't need to build the point plan again. cc.ctx.SetValue(plannercore.PointPlanKey, plannercore.PointPlanVal{Plan: pointPlans[i]}) } retryable, err = cc.handleStmt(ctx, stmt, parserWarns, i == len(stmts)-1) @@ -1884,7 +1951,7 @@ func (cc *clientConn) prefetchPointPlanKeys(ctx context.Context, stmts []ast.Stm } // The first return value indicates whether the call of handleStmt has no side effect and can be retried. -// Currently the first return value is used to fallback to TiKV when TiFlash is down. +// Currently, the first return value is used to fall back to TiKV when TiFlash is down. func (cc *clientConn) handleStmt(ctx context.Context, stmt ast.StmtNode, warns []stmtctx.SQLWarn, lastStmt bool) (bool, error) { ctx = context.WithValue(ctx, execdetails.StmtExecDetailKey, &execdetails.StmtExecDetails{}) ctx = context.WithValue(ctx, util.ExecDetailsKey, &util.ExecDetails{}) @@ -1901,37 +1968,33 @@ func (cc *clientConn) handleStmt(ctx context.Context, stmt ast.StmtNode, warns [ return true, err } + status := cc.ctx.Status() if lastStmt { cc.ctx.GetSessionVars().StmtCtx.AppendWarnings(warns) - } - - status := cc.ctx.Status() - if !lastStmt { + } else { status |= mysql.ServerMoreResultsExists } if rs != nil { - connStatus := atomic.LoadInt32(&cc.status) - if connStatus == connStatusShutdown { + if connStatus := atomic.LoadInt32(&cc.status); connStatus == connStatusShutdown { return false, executor.ErrQueryInterrupted } - - retryable, err := cc.writeResultset(ctx, rs, false, status, 0) - if err != nil { + if retryable, err := cc.writeResultset(ctx, rs, false, status, 0); err != nil { return retryable, err } - } else { - handled, err := cc.handleQuerySpecial(ctx, status) - if handled { - execStmt := cc.ctx.Value(session.ExecStmtVarKey) - if execStmt != nil { - execStmt.(*executor.ExecStmt).FinishExecuteStmt(0, err, false) - } - } - if err != nil { - return false, err + return false, nil + } + + handled, err := cc.handleQuerySpecial(ctx, status) + if handled { + if execStmt := cc.ctx.Value(session.ExecStmtVarKey); execStmt != nil { + execStmt.(*executor.ExecStmt).FinishExecuteStmt(0, err, false) } } + if err != nil { + return false, err + } + return false, nil } @@ -1964,17 +2027,13 @@ func (cc *clientConn) handleQuerySpecial(ctx context.Context, status uint16) (bo } } - planReplayer := cc.ctx.Value(executor.PlanReplayerVarKey) - if planReplayer != nil { + planReplayerLoad := cc.ctx.Value(executor.PlanReplayerLoadVarKey) + if planReplayerLoad != nil { handled = true - defer cc.ctx.SetValue(executor.PlanReplayerVarKey, nil) - token, err := cc.handlePlanReplayer(ctx, planReplayer.(executor.PlanReplayerInfo)) - if err != nil { + defer cc.ctx.SetValue(executor.PlanReplayerLoadVarKey, nil) + if err := cc.handlePlanReplayerLoad(ctx, planReplayerLoad.(*executor.PlanReplayerLoadInfo)); err != nil { return handled, err } - if token != "" { - return handled, cc.writeOkWith(ctx, token, cc.ctx.AffectedRows(), cc.ctx.LastInsertID(), status, cc.ctx.WarningCount()) - } } return handled, cc.writeOkWith(ctx, cc.ctx.LastMessage(), cc.ctx.AffectedRows(), cc.ctx.LastInsertID(), status, cc.ctx.WarningCount()) @@ -2036,13 +2095,13 @@ func (cc *clientConn) writeResultset(ctx context.Context, rs ResultSet, binary b }() cc.initResultEncoder(ctx) defer cc.rsEncoder.clean() - var err error if mysql.HasCursorExistsFlag(serverStatus) { - err = cc.writeChunksWithFetchSize(ctx, rs, serverStatus, fetchSize) - } else { - retryable, err = cc.writeChunks(ctx, rs, binary, serverStatus) + if err := cc.writeChunksWithFetchSize(ctx, rs, serverStatus, fetchSize); err != nil { + return false, err + } + return false, cc.flush(ctx) } - if err != nil { + if retryable, err := cc.writeChunks(ctx, rs, binary, serverStatus); err != nil { return retryable, err } @@ -2071,7 +2130,7 @@ func (cc *clientConn) writeColumnInfo(columns []*ColumnInfo, serverStatus uint16 // The first return value indicates whether error occurs at the first call of ResultSet.Next. func (cc *clientConn) writeChunks(ctx context.Context, rs ResultSet, binary bool, serverStatus uint16) (bool, error) { data := cc.alloc.AllocWithLen(4, 1024) - req := rs.NewChunk() + req := rs.NewChunk(cc.chunkAlloc) gotColumnInfo := false firstNext := true var stmtDetail *execdetails.StmtExecDetails @@ -2100,8 +2159,7 @@ func (cc *clientConn) writeChunks(ctx context.Context, rs ResultSet, binary bool // We need to call Next before we get columns. // Otherwise, we will get incorrect columns info. columns := rs.Columns() - err = cc.writeColumnInfo(columns, serverStatus) - if err != nil { + if err = cc.writeColumnInfo(columns, serverStatus); err != nil { return false, err } gotColumnInfo = true @@ -2142,13 +2200,16 @@ func (cc *clientConn) writeChunks(ctx context.Context, rs ResultSet, binary bool // fetchSize, the desired number of rows to be fetched each time when client uses cursor. func (cc *clientConn) writeChunksWithFetchSize(ctx context.Context, rs ResultSet, serverStatus uint16, fetchSize int) error { fetchedRows := rs.GetFetchedRows() - // if fetchedRows is not enough, getting data from recordSet. - req := rs.NewChunk() + req := rs.NewChunk(nil) for len(fetchedRows) < fetchSize { + // NOTE: chunk should not be allocated from the allocator + // the allocator will reset every statement + // but it maybe stored in the result set among statements + // ref https://github.com/pingcap/tidb/blob/7fc6ebbda4ddf84c0ba801ca7ebb636b934168cf/server/conn_stmt.go#L233-L239 // Here server.tidbResultSet implements Next method. - err := rs.Next(ctx, req) - if err != nil { + req.Reset() + if err := rs.Next(ctx, req); err != nil { return err } rowCount := req.NumRows() @@ -2159,7 +2220,6 @@ func (cc *clientConn) writeChunksWithFetchSize(ctx context.Context, rs ResultSet for i := 0; i < rowCount; i++ { fetchedRows = append(fetchedRows, req.GetRow(i)) } - req = chunk.Renew(req, cc.ctx.GetSessionVars().MaxChunkSize) } // tell the client COM_STMT_FETCH has finished by setting proper serverStatus, @@ -2246,12 +2306,10 @@ func (cc *clientConn) handleChangeUser(ctx context.Context, data []byte) error { dbName, _ := parseNullTermString(data) cc.dbname = string(hack.String(dbName)) - err := cc.ctx.Close() - if err != nil { + if err := cc.ctx.Close(); err != nil { logutil.Logger(ctx).Debug("close old context failed", zap.Error(err)) } - err = cc.openSessionAndDoAuth(pass, "") - if err != nil { + if err := cc.openSessionAndDoAuth(pass, ""); err != nil { return err } return cc.handleCommonConnectionReset(ctx) diff --git a/server/conn_stmt.go b/server/conn_stmt.go index 980de55c6c896..07e4699d52738 100644 --- a/server/conn_stmt.go +++ b/server/conn_stmt.go @@ -46,6 +46,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/parser/charset" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" plannercore "github.com/pingcap/tidb/planner/core" @@ -167,6 +168,8 @@ func (cc *clientConn) handleStmtExecute(ctx context.Context, data []byte) (err e paramTypes []byte paramValues []byte ) + cc.initInputEncoder(ctx) + defer cc.inputDecoder.clean() numParams := stmt.NumParams() args := make([]types.Datum, numParams) if numParams > 0 { @@ -194,7 +197,7 @@ func (cc *clientConn) handleStmtExecute(ctx context.Context, data []byte) (err e paramValues = data[pos+1:] } - err = parseExecArgs(cc.ctx.GetSessionVars().StmtCtx, args, stmt.BoundParams(), nullBitmaps, stmt.GetParamsType(), paramValues) + err = parseExecArgs(cc.ctx.GetSessionVars().StmtCtx, args, stmt.BoundParams(), nullBitmaps, stmt.GetParamsType(), paramValues, cc.inputDecoder) stmt.Reset() if err != nil { return errors.Annotate(err, cc.preparedStmt2String(stmtID)) @@ -310,7 +313,8 @@ func parseStmtFetchCmd(data []byte) (uint32, uint32, error) { return stmtID, fetchSize, nil } -func parseExecArgs(sc *stmtctx.StatementContext, args []types.Datum, boundParams [][]byte, nullBitmap, paramTypes, paramValues []byte) (err error) { +func parseExecArgs(sc *stmtctx.StatementContext, args []types.Datum, boundParams [][]byte, + nullBitmap, paramTypes, paramValues []byte, enc *inputDecoder) (err error) { pos := 0 var ( tmp interface{} @@ -318,6 +322,9 @@ func parseExecArgs(sc *stmtctx.StatementContext, args []types.Datum, boundParams n int isNull bool ) + if enc == nil { + enc = newInputDecoder(charset.CharsetUTF8) + } for i := 0; i < len(args); i++ { // if params had received via ComStmtSendLongData, use them directly. @@ -543,6 +550,7 @@ func parseExecArgs(sc *stmtctx.StatementContext, args []types.Datum, boundParams } if !isNull { + v = enc.decodeInput(v) tmp = string(hack.String(v)) } else { tmp = nil diff --git a/server/conn_stmt_test.go b/server/conn_stmt_test.go index 512093e85098a..cd63aea7e66bf 100644 --- a/server/conn_stmt_test.go +++ b/server/conn_stmt_test.go @@ -197,12 +197,25 @@ func TestParseExecArgs(t *testing.T) { }, } for _, tt := range tests { - err := parseExecArgs(&stmtctx.StatementContext{}, tt.args.args, tt.args.boundParams, tt.args.nullBitmap, tt.args.paramTypes, tt.args.paramValues) + err := parseExecArgs(&stmtctx.StatementContext{}, tt.args.args, tt.args.boundParams, tt.args.nullBitmap, tt.args.paramTypes, tt.args.paramValues, nil) require.Truef(t, terror.ErrorEqual(err, tt.err), "err %v", err) require.Equal(t, tt.expect, tt.args.args[0].GetValue()) } } +func TestParseExecArgsAndEncode(t *testing.T) { + dt := make([]types.Datum, 1) + err := parseExecArgs(&stmtctx.StatementContext{}, + dt, + [][]byte{nil}, + []byte{0x0}, + []byte{mysql.TypeVarchar, 0}, + []byte{4, 178, 226, 202, 212}, + newInputDecoder("gbk")) + require.NoError(t, err) + require.Equal(t, "测试", dt[0].GetValue()) +} + func TestParseStmtFetchCmd(t *testing.T) { tests := []struct { arg []byte diff --git a/server/conn_test.go b/server/conn_test.go index 02d4337c890f0..a599ccee48702 100644 --- a/server/conn_test.go +++ b/server/conn_test.go @@ -37,12 +37,13 @@ import ( "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/util/arena" + "github.com/pingcap/tidb/util/chunk" "github.com/stretchr/testify/require" + tikverr "github.com/tikv/client-go/v2/error" "github.com/tikv/client-go/v2/testutils" ) func TestMalformHandshakeHeader(t *testing.T) { - t.Parallel() data := []byte{0x00} var p handshakeResponse41 _, err := parseHandshakeResponseHeader(context.Background(), &p, data) @@ -50,7 +51,6 @@ func TestMalformHandshakeHeader(t *testing.T) { } func TestParseHandshakeResponse(t *testing.T) { - t.Parallel() // test data from http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::HandshakeResponse41 data := []byte{ 0x85, 0xa2, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x40, 0x08, 0x00, 0x00, 0x00, @@ -118,7 +118,6 @@ func TestParseHandshakeResponse(t *testing.T) { } func TestIssue1768(t *testing.T) { - t.Parallel() // this data is from captured handshake packet, using mysql client. // TiDB should handle authorization correctly, even mysql client set // the ClientPluginAuthLenencClientData capability. @@ -145,7 +144,6 @@ func TestIssue1768(t *testing.T) { } func TestAuthSwitchRequest(t *testing.T) { - t.Parallel() // this data is from a MySQL 8.0 client data := []byte{ 0x85, 0xa6, 0xff, 0x1, 0x0, 0x0, 0x0, 0x1, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, @@ -171,14 +169,11 @@ func TestAuthSwitchRequest(t *testing.T) { } func TestInitialHandshake(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() var outBuffer bytes.Buffer cfg := newTestConfig() - cfg.Socket = "" cfg.Port = 0 cfg.Status.StatusPort = 0 drv := NewTiDBDriver(store) @@ -226,8 +221,6 @@ type dispatchInput struct { } func TestDispatch(t *testing.T) { - t.Parallel() - userData := append([]byte("root"), 0x0, 0x0) userData = append(userData, []byte("test")...) userData = append(userData, 0x0) @@ -347,8 +340,6 @@ func TestDispatch(t *testing.T) { } func TestDispatchClientProtocol41(t *testing.T) { - t.Parallel() - userData := append([]byte("root"), 0x0, 0x0) userData = append(userData, []byte("test")...) userData = append(userData, 0x0) @@ -487,7 +478,6 @@ func testDispatch(t *testing.T, inputs []dispatchInput, capability uint32) { var outBuffer bytes.Buffer tidbdrv := NewTiDBDriver(store) cfg := newTestConfig() - cfg.Socket = "" cfg.Port, cfg.Status.StatusPort = 0, 0 cfg.Status.ReportStatus = false server, err := NewServer(cfg, tidbdrv) @@ -504,6 +494,7 @@ func testDispatch(t *testing.T, inputs []dispatchInput, capability uint32) { collation: mysql.DefaultCollationID, peerHost: "localhost", alloc: arena.NewAllocator(512), + chunkAlloc: chunk.NewAllocator(), ctx: tc, capability: capability, } @@ -523,8 +514,6 @@ func testDispatch(t *testing.T, inputs []dispatchInput, capability uint32) { } func TestGetSessionVarsWaitTimeout(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -541,7 +530,7 @@ func TestGetSessionVarsWaitTimeout(t *testing.T) { }, ctx: tc, } - require.Equal(t, uint64(0), cc.getSessionVarsWaitTimeout(context.Background())) + require.Equal(t, uint64(variable.DefWaitTimeout), cc.getSessionVarsWaitTimeout(context.Background())) } func mapIdentical(m1, m2 map[string]string) bool { @@ -559,8 +548,6 @@ func mapBelong(m1, m2 map[string]string) bool { } func TestConnExecutionTimeout(t *testing.T) { - t.Parallel() - store, dom, clean := testkit.CreateMockStoreAndDomain(t) defer clean() @@ -581,8 +568,9 @@ func TestConnExecutionTimeout(t *testing.T) { server: &Server{ capability: defaultCapability, }, - ctx: tc, - alloc: arena.NewAllocator(32 * 1024), + ctx: tc, + alloc: arena.NewAllocator(32 * 1024), + chunkAlloc: chunk.NewAllocator(), } srv := &Server{ clients: map[uint64]*clientConn{ @@ -635,8 +623,6 @@ func TestConnExecutionTimeout(t *testing.T) { } func TestShutDown(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -652,8 +638,6 @@ func TestShutDown(t *testing.T) { } func TestShutdownOrNotify(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() se, err := session.CreateSession4Test(store) @@ -684,13 +668,12 @@ type snapshotCache interface { } func TestPrefetchPointKeys(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() cc := &clientConn{ - alloc: arena.NewAllocator(1024), + alloc: arena.NewAllocator(1024), + chunkAlloc: chunk.NewAllocator(), pkt: &packetIO{ bufWriter: bufio.NewWriter(bytes.NewBuffer(nil)), }, @@ -746,8 +729,6 @@ func testGetTableByName(t *testing.T, ctx sessionctx.Context, db, table string) } func TestTiFlashFallback(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t, mockstore.WithClusterInspector(func(c testutils.Cluster) { mockCluster := c.(*unistore.Cluster) @@ -762,7 +743,8 @@ func TestTiFlashFallback(t *testing.T) { defer clean() cc := &clientConn{ - alloc: arena.NewAllocator(1024), + alloc: arena.NewAllocator(1024), + chunkAlloc: chunk.NewAllocator(), pkt: &packetIO{ bufWriter: bufio.NewWriter(bytes.NewBuffer(nil)), }, @@ -853,6 +835,16 @@ func TestTiFlashFallback(t *testing.T) { require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/store/mockstore/unistore/establishMppConnectionErr", "return(true)")) testFallbackWork(t, tk, cc, "select * from t t1 join t t2 on t1.a = t2.a") require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/store/mockstore/unistore/establishMppConnectionErr")) + + // When fallback is not set, TiFlash mpp will return the original error message + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/store/mockstore/unistore/mppDispatchTimeout", "return(true)")) + tk.MustExec("set @@tidb_allow_fallback_to_tikv=''") + tk.MustExec("set @@tidb_allow_mpp=ON") + tk.MustExec("set @@tidb_enforce_mpp=ON") + tk.MustExec("set @@tidb_isolation_read_engines='tiflash,tidb'") + err = cc.handleQuery(ctx, "select count(*) from t") + require.Error(t, err) + require.NotEqual(t, err.Error(), tikverr.ErrTiFlashServerTimeout.Error()) } func testFallbackWork(t *testing.T, tk *testkit.TestKit, cc *clientConn, sql string) { @@ -867,12 +859,11 @@ func testFallbackWork(t *testing.T, tk *testkit.TestKit, cc *clientConn, sql str // For issue https://github.com/pingcap/tidb/issues/25069 func TestShowErrors(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() cc := &clientConn{ - alloc: arena.NewAllocator(1024), + alloc: arena.NewAllocator(1024), + chunkAlloc: chunk.NewAllocator(), pkt: &packetIO{ bufWriter: bufio.NewWriter(bytes.NewBuffer(nil)), }, @@ -894,8 +885,6 @@ func TestShowErrors(t *testing.T) { } func TestHandleAuthPlugin(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -905,23 +894,254 @@ func TestHandleAuthPlugin(t *testing.T) { drv := NewTiDBDriver(store) srv, err := NewServer(cfg, drv) require.NoError(t, err) + ctx := context.Background() + tk := testkit.NewTestKit(t, store) + tk.MustExec("CREATE USER unativepassword") + defer func() { + tk.MustExec("DROP USER unativepassword") + }() + + // 5.7 or newer client trying to authenticate with mysql_native_password cc := &clientConn{ connectionID: 1, alloc: arena.NewAllocator(1024), + chunkAlloc: chunk.NewAllocator(), + collation: mysql.DefaultCollationID, + peerHost: "localhost", pkt: &packetIO{ bufWriter: bufio.NewWriter(bytes.NewBuffer(nil)), }, server: srv, + user: "unativepassword", } - ctx := context.Background() resp := handshakeResponse41{ Capability: mysql.ClientProtocol41 | mysql.ClientPluginAuth, + AuthPlugin: mysql.AuthNativePassword, + } + err = cc.handleAuthPlugin(ctx, &resp) + require.NoError(t, err) + + // 8.0 or newer client trying to authenticate with caching_sha2_password + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/server/FakeAuthSwitch", "return(1)")) + cc = &clientConn{ + connectionID: 1, + alloc: arena.NewAllocator(1024), + chunkAlloc: chunk.NewAllocator(), + collation: mysql.DefaultCollationID, + peerHost: "localhost", + pkt: &packetIO{ + bufWriter: bufio.NewWriter(bytes.NewBuffer(nil)), + }, + server: srv, + user: "unativepassword", + } + resp = handshakeResponse41{ + Capability: mysql.ClientProtocol41 | mysql.ClientPluginAuth, + AuthPlugin: mysql.AuthCachingSha2Password, + } + err = cc.handleAuthPlugin(ctx, &resp) + require.NoError(t, err) + require.Equal(t, resp.Auth, []byte(mysql.AuthNativePassword)) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/server/FakeAuthSwitch")) + + // MySQL 5.1 or older client, without authplugin support + cc = &clientConn{ + connectionID: 1, + alloc: arena.NewAllocator(1024), + chunkAlloc: chunk.NewAllocator(), + collation: mysql.DefaultCollationID, + peerHost: "localhost", + pkt: &packetIO{ + bufWriter: bufio.NewWriter(bytes.NewBuffer(nil)), + }, + server: srv, + user: "unativepassword", + } + resp = handshakeResponse41{ + Capability: mysql.ClientProtocol41, + } + err = cc.handleAuthPlugin(ctx, &resp) + require.NoError(t, err) + + // === Target account has mysql_native_password === + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/server/FakeUser", "return(\"mysql_native_password\")")) + + // 5.7 or newer client trying to authenticate with mysql_native_password + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/server/FakeAuthSwitch", "return(1)")) + cc = &clientConn{ + connectionID: 1, + alloc: arena.NewAllocator(1024), + chunkAlloc: chunk.NewAllocator(), + collation: mysql.DefaultCollationID, + peerHost: "localhost", + pkt: &packetIO{ + bufWriter: bufio.NewWriter(bytes.NewBuffer(nil)), + }, + server: srv, + user: "unativepassword", + } + resp = handshakeResponse41{ + Capability: mysql.ClientProtocol41 | mysql.ClientPluginAuth, + AuthPlugin: mysql.AuthNativePassword, } err = cc.handleAuthPlugin(ctx, &resp) require.NoError(t, err) + require.Equal(t, []byte(mysql.AuthNativePassword), resp.Auth) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/server/FakeAuthSwitch")) - resp.Capability = mysql.ClientProtocol41 + // 8.0 or newer client trying to authenticate with caching_sha2_password + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/server/FakeAuthSwitch", "return(1)")) + cc = &clientConn{ + connectionID: 1, + alloc: arena.NewAllocator(1024), + chunkAlloc: chunk.NewAllocator(), + collation: mysql.DefaultCollationID, + peerHost: "localhost", + pkt: &packetIO{ + bufWriter: bufio.NewWriter(bytes.NewBuffer(nil)), + }, + server: srv, + user: "unativepassword", + } + resp = handshakeResponse41{ + Capability: mysql.ClientProtocol41 | mysql.ClientPluginAuth, + AuthPlugin: mysql.AuthCachingSha2Password, + } err = cc.handleAuthPlugin(ctx, &resp) require.NoError(t, err) + require.Equal(t, []byte(mysql.AuthNativePassword), resp.Auth) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/server/FakeAuthSwitch")) + + // MySQL 5.1 or older client, without authplugin support + cc = &clientConn{ + connectionID: 1, + alloc: arena.NewAllocator(1024), + chunkAlloc: chunk.NewAllocator(), + collation: mysql.DefaultCollationID, + peerHost: "localhost", + pkt: &packetIO{ + bufWriter: bufio.NewWriter(bytes.NewBuffer(nil)), + }, + server: srv, + user: "unativepassword", + } + resp = handshakeResponse41{ + Capability: mysql.ClientProtocol41, + } + err = cc.handleAuthPlugin(ctx, &resp) + require.NoError(t, err) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/server/FakeUser")) + + // === Target account has caching_sha2_password === + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/server/FakeUser", "return(\"caching_sha2_password\")")) + + // 5.7 or newer client trying to authenticate with mysql_native_password + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/server/FakeAuthSwitch", "return(1)")) + cc = &clientConn{ + connectionID: 1, + alloc: arena.NewAllocator(1024), + chunkAlloc: chunk.NewAllocator(), + collation: mysql.DefaultCollationID, + peerHost: "localhost", + pkt: &packetIO{ + bufWriter: bufio.NewWriter(bytes.NewBuffer(nil)), + }, + server: srv, + user: "unativepassword", + } + resp = handshakeResponse41{ + Capability: mysql.ClientProtocol41 | mysql.ClientPluginAuth, + AuthPlugin: mysql.AuthNativePassword, + } + err = cc.handleAuthPlugin(ctx, &resp) + require.NoError(t, err) + require.Equal(t, []byte(mysql.AuthCachingSha2Password), resp.Auth) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/server/FakeAuthSwitch")) + + // 8.0 or newer client trying to authenticate with caching_sha2_password + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/server/FakeAuthSwitch", "return(1)")) + cc = &clientConn{ + connectionID: 1, + alloc: arena.NewAllocator(1024), + chunkAlloc: chunk.NewAllocator(), + collation: mysql.DefaultCollationID, + peerHost: "localhost", + pkt: &packetIO{ + bufWriter: bufio.NewWriter(bytes.NewBuffer(nil)), + }, + server: srv, + user: "unativepassword", + } + resp = handshakeResponse41{ + Capability: mysql.ClientProtocol41 | mysql.ClientPluginAuth, + AuthPlugin: mysql.AuthCachingSha2Password, + } + err = cc.handleAuthPlugin(ctx, &resp) + require.NoError(t, err) + require.Equal(t, []byte(mysql.AuthCachingSha2Password), resp.Auth) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/server/FakeAuthSwitch")) + + // MySQL 5.1 or older client, without authplugin support + cc = &clientConn{ + connectionID: 1, + alloc: arena.NewAllocator(1024), + chunkAlloc: chunk.NewAllocator(), + collation: mysql.DefaultCollationID, + peerHost: "localhost", + pkt: &packetIO{ + bufWriter: bufio.NewWriter(bytes.NewBuffer(nil)), + }, + server: srv, + user: "unativepassword", + } + resp = handshakeResponse41{ + Capability: mysql.ClientProtocol41, + } + err = cc.handleAuthPlugin(ctx, &resp) + require.Error(t, err) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/server/FakeUser")) +} + +func TestAuthPlugin2(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + cfg := newTestConfig() + cfg.Port = 0 + cfg.Status.StatusPort = 0 + + drv := NewTiDBDriver(store) + srv, err := NewServer(cfg, drv) + require.NoError(t, err) + + cc := &clientConn{ + connectionID: 1, + alloc: arena.NewAllocator(1024), + chunkAlloc: chunk.NewAllocator(), + pkt: &packetIO{ + bufWriter: bufio.NewWriter(bytes.NewBuffer(nil)), + }, + server: srv, + user: "root", + } + ctx := context.Background() + se, _ := session.CreateSession4Test(store) + tc := &TiDBContext{ + Session: se, + stmts: make(map[int]*TiDBStatement), + } + cc.ctx = tc + + resp := handshakeResponse41{ + Capability: mysql.ClientProtocol41 | mysql.ClientPluginAuth, + } + + cc.isUnixSocket = true + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/server/FakeAuthSwitch", "return(1)")) + respAuthSwitch, err := cc.checkAuthPlugin(ctx, &resp) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/server/FakeAuthSwitch")) + require.Equal(t, respAuthSwitch, []byte(mysql.AuthNativePassword)) + require.NoError(t, err) + } diff --git a/server/driver.go b/server/driver.go index c937cf07f963b..0363758e3e47b 100644 --- a/server/driver.go +++ b/server/driver.go @@ -67,7 +67,7 @@ type PreparedStatement interface { // ResultSet is the result set of an query. type ResultSet interface { Columns() []*ColumnInfo - NewChunk() *chunk.Chunk + NewChunk(chunk.Allocator) *chunk.Chunk Next(context.Context, *chunk.Chunk) error StoreFetchedRows(rows []chunk.Row) GetFetchedRows() []chunk.Row diff --git a/server/driver_tidb.go b/server/driver_tidb.go index fb2482d81c03a..9a13eea632962 100644 --- a/server/driver_tidb.go +++ b/server/driver_tidb.go @@ -25,6 +25,7 @@ import ( "github.com/pingcap/tidb/parser/charset" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" + "github.com/pingcap/tidb/planner" "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx/stmtctx" @@ -164,8 +165,10 @@ func (ts *TiDBStatement) Close() error { if !ok { return errors.Errorf("invalid CachedPrepareStmt type") } + preparedAst := preparedObj.PreparedAst + bindSQL := planner.GetBindSQL4PlanCache(ts.ctx, preparedAst.Stmt) ts.ctx.PreparedPlanCache().Delete(core.NewPSTMTPlanCacheKey( - ts.ctx.GetSessionVars(), ts.id, preparedObj.PreparedAst.SchemaVersion)) + ts.ctx.GetSessionVars(), ts.id, preparedObj.PreparedAst.SchemaVersion, bindSQL)) } ts.ctx.GetSessionVars().RemovePreparedStmt(ts.id) } @@ -298,8 +301,8 @@ type tidbResultSet struct { preparedStmt *core.CachedPrepareStmt } -func (trs *tidbResultSet) NewChunk() *chunk.Chunk { - return trs.recordSet.NewChunk() +func (trs *tidbResultSet) NewChunk(alloc chunk.Allocator) *chunk.Chunk { + return trs.recordSet.NewChunk(alloc) } func (trs *tidbResultSet) Next(ctx context.Context, req *chunk.Chunk) error { diff --git a/server/driver_tidb_test.go b/server/driver_tidb_test.go index 4842466cd509d..b7126b31e00b4 100644 --- a/server/driver_tidb_test.go +++ b/server/driver_tidb_test.go @@ -42,8 +42,6 @@ func createColumnByTypeAndLen(tp byte, len uint32) *ColumnInfo { } } func TestConvertColumnInfo(t *testing.T) { - t.Parallel() - // Test "mysql.TypeBit", for: https://github.com/pingcap/tidb/issues/5405. resultField := ast.ResultField{ Column: &model.ColumnInfo{ diff --git a/server/http_handler.go b/server/http_handler.go index d591e1e1320fe..3fe4ac8587cd7 100644 --- a/server/http_handler.go +++ b/server/http_handler.go @@ -85,6 +85,7 @@ const ( pColumnLen = "colLen" pRowBin = "rowBin" pSnapshot = "snapshot" + pFileName = "filename" ) // For query string @@ -978,7 +979,7 @@ func getSchemaTablesStorageInfo(h *schemaStorageHandler, schema *model.CIStr, ta messages = make([]*schemaTableStorage, 0) defer terror.Call(results.Close) for { - req := results.NewChunk() + req := results.NewChunk(nil) if err = results.Next(context.TODO(), req); err != nil { break } diff --git a/server/http_handler_serial_test.go b/server/http_handler_serial_test.go new file mode 100644 index 0000000000000..2cbd9bb7c3fb3 --- /dev/null +++ b/server/http_handler_serial_test.go @@ -0,0 +1,582 @@ +// Copyright 2021 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, +// 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. + +package server + +import ( + "bytes" + "database/sql" + "encoding/json" + "fmt" + "io" + "net/http" + "net/url" + "os" + "sort" + "strings" + "sync/atomic" + "testing" + "time" + + "github.com/pingcap/failpoint" + "github.com/pingcap/log" + "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/session" + "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/util/deadlockhistory" + "github.com/pingcap/tidb/util/versioninfo" + "github.com/stretchr/testify/require" + "go.uber.org/zap" +) + +func TestPostSettings(t *testing.T) { + ts := createBasicHTTPHandlerTestSuite() + ts.startServer(t) + ts.prepareData(t) + defer ts.stopServer(t) + se, err := session.CreateSession(ts.store) + require.NoError(t, err) + + form := make(url.Values) + form.Set("log_level", "error") + form.Set("tidb_general_log", "1") + form.Set("tidb_enable_async_commit", "1") + form.Set("tidb_enable_1pc", "1") + resp, err := ts.formStatus("/settings", form) + require.NoError(t, err) + require.Equal(t, http.StatusOK, resp.StatusCode) + require.NoError(t, resp.Body.Close()) + require.Equal(t, zap.ErrorLevel, log.GetLevel()) + require.Equal(t, "error", config.GetGlobalConfig().Log.Level) + require.True(t, variable.ProcessGeneralLog.Load()) + val, err := variable.GetGlobalSystemVar(se.GetSessionVars(), variable.TiDBEnableAsyncCommit) + require.NoError(t, err) + require.Equal(t, variable.On, val) + val, err = variable.GetGlobalSystemVar(se.GetSessionVars(), variable.TiDBEnable1PC) + require.NoError(t, err) + require.Equal(t, variable.On, val) + + form = make(url.Values) + form.Set("log_level", "fatal") + form.Set("tidb_general_log", "0") + form.Set("tidb_enable_async_commit", "0") + form.Set("tidb_enable_1pc", "0") + resp, err = ts.formStatus("/settings", form) + require.NoError(t, err) + require.Equal(t, http.StatusOK, resp.StatusCode) + require.NoError(t, resp.Body.Close()) + require.False(t, variable.ProcessGeneralLog.Load()) + require.Equal(t, zap.FatalLevel, log.GetLevel()) + require.Equal(t, "fatal", config.GetGlobalConfig().Log.Level) + val, err = variable.GetGlobalSystemVar(se.GetSessionVars(), variable.TiDBEnableAsyncCommit) + require.NoError(t, err) + require.Equal(t, variable.Off, val) + val, err = variable.GetGlobalSystemVar(se.GetSessionVars(), variable.TiDBEnable1PC) + require.NoError(t, err) + require.Equal(t, variable.Off, val) + form.Set("log_level", os.Getenv("log_level")) + + // test ddl_slow_threshold + form = make(url.Values) + form.Set("ddl_slow_threshold", "200") + resp, err = ts.formStatus("/settings", form) + require.NoError(t, err) + require.Equal(t, http.StatusOK, resp.StatusCode) + require.NoError(t, resp.Body.Close()) + require.Equal(t, uint32(200), atomic.LoadUint32(&variable.DDLSlowOprThreshold)) + + // test check_mb4_value_in_utf8 + db, err := sql.Open("mysql", ts.getDSN()) + require.NoError(t, err) + defer func() { + err := db.Close() + require.NoError(t, err) + }() + dbt := testkit.NewDBTestKit(t, db) + + dbt.MustExec("create database tidb_test;") + dbt.MustExec("use tidb_test;") + dbt.MustExec("drop table if exists t2;") + dbt.MustExec("create table t2(a varchar(100) charset utf8);") + form.Set("check_mb4_value_in_utf8", "1") + resp, err = ts.formStatus("/settings", form) + require.NoError(t, err) + require.Equal(t, http.StatusOK, resp.StatusCode) + require.NoError(t, resp.Body.Close()) + require.Equal(t, true, config.GetGlobalConfig().CheckMb4ValueInUTF8) + txn1, err := dbt.GetDB().Begin() + require.NoError(t, err) + _, err = txn1.Exec("insert t2 values (unhex('F0A48BAE'));") + require.Error(t, err) + err = txn1.Commit() + require.NoError(t, err) + + // Disable CheckMb4ValueInUTF8. + form = make(url.Values) + form.Set("check_mb4_value_in_utf8", "0") + resp, err = ts.formStatus("/settings", form) + require.NoError(t, err) + require.Equal(t, http.StatusOK, resp.StatusCode) + require.NoError(t, resp.Body.Close()) + require.Equal(t, false, config.GetGlobalConfig().CheckMb4ValueInUTF8) + dbt.MustExec("insert t2 values (unhex('f09f8c80'));") + + // test deadlock_history_capacity + deadlockhistory.GlobalDeadlockHistory.Resize(10) + for i := 0; i < 10; i++ { + deadlockhistory.GlobalDeadlockHistory.Push(dummyRecord()) + } + form = make(url.Values) + form.Set("deadlock_history_capacity", "5") + resp, err = ts.formStatus("/settings", form) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) + require.Equal(t, 5, len(deadlockhistory.GlobalDeadlockHistory.GetAll())) + require.Equal(t, uint64(6), deadlockhistory.GlobalDeadlockHistory.GetAll()[0].ID) + require.Equal(t, uint64(10), deadlockhistory.GlobalDeadlockHistory.GetAll()[4].ID) + deadlockhistory.GlobalDeadlockHistory.Push(dummyRecord()) + require.Equal(t, 5, len(deadlockhistory.GlobalDeadlockHistory.GetAll())) + require.Equal(t, uint64(7), deadlockhistory.GlobalDeadlockHistory.GetAll()[0].ID) + require.Equal(t, uint64(11), deadlockhistory.GlobalDeadlockHistory.GetAll()[4].ID) + form = make(url.Values) + form.Set("deadlock_history_capacity", "6") + resp, err = ts.formStatus("/settings", form) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) + deadlockhistory.GlobalDeadlockHistory.Push(dummyRecord()) + require.Equal(t, 6, len(deadlockhistory.GlobalDeadlockHistory.GetAll())) + require.Equal(t, uint64(7), deadlockhistory.GlobalDeadlockHistory.GetAll()[0].ID) + require.Equal(t, uint64(12), deadlockhistory.GlobalDeadlockHistory.GetAll()[5].ID) + + // test deadlock_history_collect_retryable + form = make(url.Values) + form.Set("deadlock_history_collect_retryable", "true") + resp, err = ts.formStatus("/settings", form) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) + require.True(t, config.GetGlobalConfig().PessimisticTxn.DeadlockHistoryCollectRetryable) + form = make(url.Values) + form.Set("deadlock_history_collect_retryable", "false") + resp, err = ts.formStatus("/settings", form) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) + require.False(t, config.GetGlobalConfig().PessimisticTxn.DeadlockHistoryCollectRetryable) + form = make(url.Values) + form.Set("deadlock_history_collect_retryable", "123") + resp, err = ts.formStatus("/settings", form) + require.NoError(t, err) + require.Equal(t, 400, resp.StatusCode) + require.NoError(t, resp.Body.Close()) + + // restore original value. + config.GetGlobalConfig().CheckMb4ValueInUTF8 = true +} + +func TestAllServerInfo(t *testing.T) { + ts := createBasicHTTPHandlerTestSuite() + ts.startServer(t) + defer ts.stopServer(t) + resp, err := ts.fetchStatus("/info/all") + require.NoError(t, err) + defer func() { require.NoError(t, resp.Body.Close()) }() + require.Equal(t, http.StatusOK, resp.StatusCode) + decoder := json.NewDecoder(resp.Body) + + clusterInfo := clusterServerInfo{} + err = decoder.Decode(&clusterInfo) + require.NoError(t, err) + + require.True(t, clusterInfo.IsAllServerVersionConsistent) + require.Equal(t, 1, clusterInfo.ServersNum) + + store := ts.server.newTikvHandlerTool().Store.(kv.Storage) + do, err := session.GetDomain(store) + require.NoError(t, err) + ddl := do.DDL() + require.Equal(t, ddl.GetID(), clusterInfo.OwnerID) + serverInfo, ok := clusterInfo.AllServersInfo[ddl.GetID()] + require.Equal(t, true, ok) + + cfg := config.GetGlobalConfig() + require.Equal(t, cfg.AdvertiseAddress, serverInfo.IP) + require.Equal(t, cfg.Status.StatusPort, serverInfo.StatusPort) + require.Equal(t, cfg.Lease, serverInfo.Lease) + require.Equal(t, mysql.ServerVersion, serverInfo.Version) + require.Equal(t, versioninfo.TiDBGitHash, serverInfo.GitHash) + require.Equal(t, ddl.GetID(), serverInfo.ID) +} + +func TestRegionsFromMeta(t *testing.T) { + ts := createBasicHTTPHandlerTestSuite() + ts.startServer(t) + defer ts.stopServer(t) + resp, err := ts.fetchStatus("/regions/meta") + require.NoError(t, err) + defer func() { require.NoError(t, resp.Body.Close()) }() + require.Equal(t, http.StatusOK, resp.StatusCode) + + // Verify the resp body. + decoder := json.NewDecoder(resp.Body) + metas := make([]RegionMeta, 0) + err = decoder.Decode(&metas) + require.NoError(t, err) + for _, m := range metas { + require.True(t, m.ID != 0) + } + + // test no panic + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/server/errGetRegionByIDEmpty", `return(true)`)) + defer func() { require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/server/errGetRegionByIDEmpty")) }() + resp1, err := ts.fetchStatus("/regions/meta") + require.NoError(t, err) + defer func() { require.NoError(t, resp1.Body.Close()) }() +} + +func TestTiFlashReplica(t *testing.T) { + ts := createBasicHTTPHandlerTestSuite() + ts.startServer(t) + ts.prepareData(t) + defer ts.stopServer(t) + + db, err := sql.Open("mysql", ts.getDSN()) + require.NoError(t, err) + defer func() { + err := db.Close() + require.NoError(t, err) + }() + dbt := testkit.NewDBTestKit(t, db) + + defer func(originGC bool) { + if originGC { + ddl.EmulatorGCEnable() + } else { + ddl.EmulatorGCDisable() + } + }(ddl.IsEmulatorGCEnable()) + + // Disable emulator GC. + // Otherwise emulator GC will delete table record as soon as possible after execute drop table DDL. + ddl.EmulatorGCDisable() + gcTimeFormat := "20060102-15:04:05 -0700 MST" + timeBeforeDrop := time.Now().Add(0 - 48*60*60*time.Second).Format(gcTimeFormat) + safePointSQL := `INSERT HIGH_PRIORITY INTO mysql.tidb VALUES ('tikv_gc_safe_point', '%[1]s', ''),('tikv_gc_enable','true','') + ON DUPLICATE KEY + UPDATE variable_value = '%[1]s'` + // Set GC safe point and enable GC. + dbt.MustExec(fmt.Sprintf(safePointSQL, timeBeforeDrop)) + + resp, err := ts.fetchStatus("/tiflash/replica") + require.NoError(t, err) + decoder := json.NewDecoder(resp.Body) + var data []tableFlashReplicaInfo + err = decoder.Decode(&data) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) + require.Equal(t, 0, len(data)) + + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/infoschema/mockTiFlashStoreCount", `return(true)`)) + defer func() { + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/infoschema/mockTiFlashStoreCount")) + }() + + dbt.MustExec("use tidb") + dbt.MustExec("alter table test set tiflash replica 2 location labels 'a','b';") + + resp, err = ts.fetchStatus("/tiflash/replica") + require.NoError(t, err) + decoder = json.NewDecoder(resp.Body) + err = decoder.Decode(&data) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) + require.Equal(t, 1, len(data)) + require.Equal(t, uint64(2), data[0].ReplicaCount) + require.Equal(t, "a,b", strings.Join(data[0].LocationLabels, ",")) + require.Equal(t, false, data[0].Available) + + resp, err = ts.postStatus("/tiflash/replica", "application/json", bytes.NewBuffer([]byte(`{"id":84,"region_count":3,"flash_region_count":3}`))) + require.NoError(t, err) + require.NotNil(t, resp) + body, err := io.ReadAll(resp.Body) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) + require.Equal(t, "[schema:1146]Table which ID = 84 does not exist.", string(body)) + + tbl, err := ts.domain.InfoSchema().TableByName(model.NewCIStr("tidb"), model.NewCIStr("test")) + require.NoError(t, err) + req := fmt.Sprintf(`{"id":%d,"region_count":3,"flash_region_count":3}`, tbl.Meta().ID) + resp, err = ts.postStatus("/tiflash/replica", "application/json", bytes.NewBuffer([]byte(req))) + require.NoError(t, err) + require.NotNil(t, resp) + body, err = io.ReadAll(resp.Body) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) + require.Equal(t, "", string(body)) + + resp, err = ts.fetchStatus("/tiflash/replica") + require.NoError(t, err) + decoder = json.NewDecoder(resp.Body) + err = decoder.Decode(&data) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) + require.Equal(t, 1, len(data)) + require.Equal(t, uint64(2), data[0].ReplicaCount) + require.Equal(t, "a,b", strings.Join(data[0].LocationLabels, ",")) + require.Equal(t, true, data[0].Available) + + // Should not take effect. + dbt.MustExec("alter table test set tiflash replica 2 location labels 'a','b';") + checkFunc := func() { + resp, err := ts.fetchStatus("/tiflash/replica") + require.NoError(t, err) + decoder = json.NewDecoder(resp.Body) + err = decoder.Decode(&data) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) + require.Equal(t, 1, len(data)) + require.Equal(t, uint64(2), data[0].ReplicaCount) + require.Equal(t, "a,b", strings.Join(data[0].LocationLabels, ",")) + require.Equal(t, true, data[0].Available) + } + + // Test for get dropped table tiflash replica info. + dbt.MustExec("drop table test") + checkFunc() + + // Test unique table id replica info. + dbt.MustExec("flashback table test") + checkFunc() + dbt.MustExec("drop table test") + checkFunc() + dbt.MustExec("flashback table test") + checkFunc() + + // Test for partition table. + dbt.MustExec("alter table pt set tiflash replica 2 location labels 'a','b';") + dbt.MustExec("alter table test set tiflash replica 0;") + resp, err = ts.fetchStatus("/tiflash/replica") + require.NoError(t, err) + decoder = json.NewDecoder(resp.Body) + err = decoder.Decode(&data) + require.NoError(t, err) + err = resp.Body.Close() + require.NoError(t, err) + require.Equal(t, 3, len(data)) + require.Equal(t, uint64(2), data[0].ReplicaCount) + require.Equal(t, "a,b", strings.Join(data[0].LocationLabels, ",")) + require.Equal(t, false, data[0].Available) + + pid0 := data[0].ID + pid1 := data[1].ID + pid2 := data[2].ID + + // Mock for partition 1 replica was available. + req = fmt.Sprintf(`{"id":%d,"region_count":3,"flash_region_count":3}`, pid1) + resp, err = ts.postStatus("/tiflash/replica", "application/json", bytes.NewBuffer([]byte(req))) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) + resp, err = ts.fetchStatus("/tiflash/replica") + require.NoError(t, err) + decoder = json.NewDecoder(resp.Body) + err = decoder.Decode(&data) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) + require.Equal(t, 3, len(data)) + require.Equal(t, false, data[0].Available) + require.Equal(t, true, data[1].Available) + require.Equal(t, false, data[2].Available) + + // Mock for partition 0,2 replica was available. + req = fmt.Sprintf(`{"id":%d,"region_count":3,"flash_region_count":3}`, pid0) + resp, err = ts.postStatus("/tiflash/replica", "application/json", bytes.NewBuffer([]byte(req))) + require.NoError(t, err) + err = resp.Body.Close() + require.NoError(t, err) + req = fmt.Sprintf(`{"id":%d,"region_count":3,"flash_region_count":3}`, pid2) + resp, err = ts.postStatus("/tiflash/replica", "application/json", bytes.NewBuffer([]byte(req))) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) + checkFunc = func() { + resp, err := ts.fetchStatus("/tiflash/replica") + require.NoError(t, err) + decoder = json.NewDecoder(resp.Body) + err = decoder.Decode(&data) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) + require.Equal(t, 3, len(data)) + require.Equal(t, true, data[0].Available) + require.Equal(t, true, data[1].Available) + require.Equal(t, true, data[2].Available) + } + + // Test for get truncated table tiflash replica info. + dbt.MustExec("truncate table pt") + dbt.MustExec("alter table pt set tiflash replica 0;") + checkFunc() +} + +func TestFailpointHandler(t *testing.T) { + ts := createBasicHTTPHandlerTestSuite() + + // start server without enabling failpoint integration + ts.startServer(t) + defer ts.stopServer(t) + resp, err := ts.fetchStatus("/fail/") + require.NoError(t, err) + require.Equal(t, http.StatusNotFound, resp.StatusCode) + require.NoError(t, resp.Body.Close()) + ts.stopServer(t) + + // enable failpoint integration and start server + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/server/enableTestAPI", "return")) + defer func() { require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/server/enableTestAPI")) }() + ts.startServer(t) + resp, err = ts.fetchStatus("/fail/") + require.NoError(t, err) + require.Equal(t, http.StatusOK, resp.StatusCode) + b, err := io.ReadAll(resp.Body) + require.NoError(t, err) + require.True(t, strings.Contains(string(b), "github.com/pingcap/tidb/server/enableTestAPI=return")) + require.NoError(t, resp.Body.Close()) +} + +func TestTestHandler(t *testing.T) { + ts := createBasicHTTPHandlerTestSuite() + + // start server without enabling failpoint integration + ts.startServer(t) + defer ts.stopServer(t) + resp, err := ts.fetchStatus("/test") + require.NoError(t, err) + require.Equal(t, http.StatusNotFound, resp.StatusCode) + require.NoError(t, resp.Body.Close()) + ts.stopServer(t) + + // enable failpoint integration and start server + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/server/enableTestAPI", "return")) + defer func() { require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/server/enableTestAPI")) }() + ts.startServer(t) + + resp, err = ts.fetchStatus("/test/gc/gc") + require.NoError(t, err) + err = resp.Body.Close() + require.NoError(t, err) + require.Equal(t, http.StatusBadRequest, resp.StatusCode) + + resp, err = ts.fetchStatus("/test/gc/resolvelock") + require.NoError(t, err) + err = resp.Body.Close() + require.NoError(t, err) + require.Equal(t, http.StatusBadRequest, resp.StatusCode) + + resp, err = ts.fetchStatus("/test/gc/resolvelock?safepoint=a") + require.NoError(t, err) + err = resp.Body.Close() + require.NoError(t, err) + require.Equal(t, http.StatusBadRequest, resp.StatusCode) + + resp, err = ts.fetchStatus("/test/gc/resolvelock?physical=1") + require.NoError(t, err) + err = resp.Body.Close() + require.NoError(t, err) + require.Equal(t, http.StatusBadRequest, resp.StatusCode) + + resp, err = ts.fetchStatus("/test/gc/resolvelock?physical=true") + require.NoError(t, err) + err = resp.Body.Close() + require.NoError(t, err) + require.Equal(t, http.StatusBadRequest, resp.StatusCode) + + resp, err = ts.fetchStatus("/test/gc/resolvelock?safepoint=10000&physical=true") + require.NoError(t, err) + err = resp.Body.Close() + require.NoError(t, err) + require.Equal(t, http.StatusOK, resp.StatusCode) +} + +func TestServerInfo(t *testing.T) { + ts := createBasicHTTPHandlerTestSuite() + ts.startServer(t) + defer ts.stopServer(t) + resp, err := ts.fetchStatus("/info") + require.NoError(t, err) + defer func() { require.NoError(t, resp.Body.Close()) }() + require.Equal(t, http.StatusOK, resp.StatusCode) + decoder := json.NewDecoder(resp.Body) + + info := serverInfo{} + err = decoder.Decode(&info) + require.NoError(t, err) + + cfg := config.GetGlobalConfig() + require.True(t, info.IsOwner) + require.Equal(t, cfg.AdvertiseAddress, info.IP) + require.Equal(t, cfg.Status.StatusPort, info.StatusPort) + require.Equal(t, cfg.Lease, info.Lease) + require.Equal(t, mysql.ServerVersion, info.Version) + require.Equal(t, versioninfo.TiDBGitHash, info.GitHash) + + store := ts.server.newTikvHandlerTool().Store.(kv.Storage) + do, err := session.GetDomain(store) + require.NoError(t, err) + d := do.DDL() + require.Equal(t, d.GetID(), info.ID) +} + +func TestGetSchemaStorage(t *testing.T) { + ts := createBasicHTTPHandlerTestSuite() + ts.startServer(t) + ts.prepareData(t) + defer ts.stopServer(t) + + do := ts.domain + h := do.StatsHandle() + do.SetStatsUpdating(true) + + tk := testkit.NewTestKit(t, ts.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (c int, d int, e char(5), index idx(e))") + tk.MustExec(`insert into t(c, d, e) values(1, 2, "c"), (2, 3, "d"), (3, 4, "e")`) + h.FlushStats() + + resp, err := ts.fetchStatus("/schema_storage/test") + require.NoError(t, err) + decoder := json.NewDecoder(resp.Body) + var tables []*schemaTableStorage + err = decoder.Decode(&tables) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) + require.Len(t, tables, 1) + expects := []string{`t`} + names := make([]string, len(tables)) + for i, v := range tables { + names[i] = v.TableName + } + + sort.Strings(names) + require.Equal(t, expects, names) + require.Equal(t, []int64{3, 18, 54, 0, 6, 0}, []int64{ + tables[0].TableRows, + tables[0].AvgRowLength, + tables[0].DataLength, + tables[0].MaxDataLength, + tables[0].IndexLength, + tables[0].DataFree, + }) +} diff --git a/server/http_handler_test.go b/server/http_handler_test.go index d78642b1651a0..48205c192c11e 100644 --- a/server/http_handler_test.go +++ b/server/http_handler_test.go @@ -27,19 +27,13 @@ import ( "net" "net/http" "net/http/httputil" - "net/url" - "os" "sort" - "strings" - "sync/atomic" + "testing" "time" - . "github.com/pingcap/check" - "github.com/pingcap/failpoint" "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/log" "github.com/pingcap/tidb/config" - "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" @@ -49,16 +43,15 @@ import ( "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/binloginfo" "github.com/pingcap/tidb/sessionctx/stmtctx" - "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/store/helper" "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/tablecodec" + "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/codec" "github.com/pingcap/tidb/util/deadlockhistory" "github.com/pingcap/tidb/util/rowcodec" - "github.com/pingcap/tidb/util/testkit" - "github.com/pingcap/tidb/util/versioninfo" + "github.com/stretchr/testify/require" "github.com/tikv/client-go/v2/tikv" "go.uber.org/zap" ) @@ -72,23 +65,13 @@ type basicHTTPHandlerTestSuite struct { sh *StatsHandler } -type HTTPHandlerTestSuite struct { - *basicHTTPHandlerTestSuite -} - -type HTTPHandlerTestSerialSuite struct { - *basicHTTPHandlerTestSuite -} - -var _ = Suite(&HTTPHandlerTestSuite{&basicHTTPHandlerTestSuite{}}) - -var _ = SerialSuites(&HTTPHandlerTestSerialSuite{&basicHTTPHandlerTestSuite{}}) - -func (ts *basicHTTPHandlerTestSuite) SetUpSuite(c *C) { +func createBasicHTTPHandlerTestSuite() *basicHTTPHandlerTestSuite { + ts := &basicHTTPHandlerTestSuite{} ts.testServerClient = newTestServerClient() + return ts } -func (ts *HTTPHandlerTestSuite) TestRegionIndexRange(c *C) { +func TestRegionIndexRange(t *testing.T) { sTableID := int64(3) sIndex := int64(11) eTableID := int64(9) @@ -107,7 +90,7 @@ func (ts *HTTPHandlerTestSuite) TestRegionIndexRange(c *C) { expectIndexValues = append(expectIndexValues, str) } encodedValue, err := codec.EncodeKey(&stmtctx.StatementContext{TimeZone: time.Local}, nil, indexValues...) - c.Assert(err, IsNil) + require.NoError(t, err) startKey := tablecodec.EncodeIndexSeekKey(sTableID, sIndex, encodedValue) recordPrefix := tablecodec.GenTableRecordPrefix(eTableID) @@ -119,13 +102,13 @@ func (ts *HTTPHandlerTestSuite) TestRegionIndexRange(c *C) { EndKey: endKey, } r, err := helper.NewRegionFrameRange(region) - c.Assert(err, IsNil) - c.Assert(r.First.IndexID, Equals, sIndex) - c.Assert(r.First.IsRecord, IsFalse) - c.Assert(r.First.RecordID, Equals, int64(0)) - c.Assert(r.First.IndexValues, DeepEquals, expectIndexValues) - c.Assert(r.Last.RecordID, Equals, recordID) - c.Assert(r.Last.IndexValues, IsNil) + require.NoError(t, err) + require.Equal(t, sIndex, r.First.IndexID) + require.False(t, r.First.IsRecord) + require.Equal(t, int64(0), r.First.RecordID) + require.Equal(t, expectIndexValues, r.First.IndexValues) + require.Equal(t, recordID, r.Last.RecordID) + require.Nil(t, r.Last.IndexValues) testCases := []struct { tableID int64 @@ -143,22 +126,22 @@ func (ts *HTTPHandlerTestSuite) TestRegionIndexRange(c *C) { {9, 10, true}, {10, 1, false}, } - for _, t := range testCases { + for _, c := range testCases { var f *helper.FrameItem - if t.indexID == 0 { - f = r.GetRecordFrame(t.tableID, "", "", false) + if c.indexID == 0 { + f = r.GetRecordFrame(c.tableID, "", "", false) } else { - f = r.GetIndexFrame(t.tableID, t.indexID, "", "", "") + f = r.GetIndexFrame(c.tableID, c.indexID, "", "", "") } - if t.isCover { - c.Assert(f, NotNil) + if c.isCover { + require.NotNil(t, f) } else { - c.Assert(f, IsNil) + require.Nil(t, f) } } } -func (ts *HTTPHandlerTestSuite) TestRegionCommonHandleRange(c *C) { +func TestRegionCommonHandleRange(t *testing.T) { sTableID := int64(3) indexValues := []types.Datum{ types.NewIntDatum(100), @@ -174,7 +157,7 @@ func (ts *HTTPHandlerTestSuite) TestRegionCommonHandleRange(c *C) { expectIndexValues = append(expectIndexValues, str) } encodedValue, err := codec.EncodeKey(&stmtctx.StatementContext{TimeZone: time.Local}, nil, indexValues...) - c.Assert(err, IsNil) + require.NoError(t, err) startKey := tablecodec.EncodeRowKey(sTableID, encodedValue) @@ -184,16 +167,16 @@ func (ts *HTTPHandlerTestSuite) TestRegionCommonHandleRange(c *C) { EndKey: nil, } r, err := helper.NewRegionFrameRange(region) - c.Assert(err, IsNil) - c.Assert(r.First.IsRecord, IsTrue) - c.Assert(r.First.RecordID, Equals, int64(0)) - c.Assert(r.First.IndexValues, DeepEquals, expectIndexValues) - c.Assert(r.First.IndexName, Equals, "PRIMARY") - c.Assert(r.Last.RecordID, Equals, int64(0)) - c.Assert(r.Last.IndexValues, IsNil) + require.NoError(t, err) + require.True(t, r.First.IsRecord) + require.Equal(t, int64(0), r.First.RecordID) + require.Equal(t, expectIndexValues, r.First.IndexValues) + require.Equal(t, "PRIMARY", r.First.IndexName) + require.Equal(t, int64(0), r.Last.RecordID) + require.Nil(t, r.Last.IndexValues) } -func (ts *HTTPHandlerTestSuite) TestRegionIndexRangeWithEndNoLimit(c *C) { +func TestRegionIndexRangeWithEndNoLimit(t *testing.T) { sTableID := int64(15) startKey := tablecodec.GenTableRecordPrefix(sTableID) endKey := []byte("z_aaaaafdfd") @@ -203,14 +186,14 @@ func (ts *HTTPHandlerTestSuite) TestRegionIndexRangeWithEndNoLimit(c *C) { EndKey: endKey, } r, err := helper.NewRegionFrameRange(region) - c.Assert(err, IsNil) - c.Assert(r.First.IsRecord, IsTrue) - c.Assert(r.Last.IsRecord, IsTrue) - c.Assert(r.GetRecordFrame(300, "", "", false), NotNil) - c.Assert(r.GetIndexFrame(200, 100, "", "", ""), NotNil) + require.NoError(t, err) + require.True(t, r.First.IsRecord) + require.True(t, r.Last.IsRecord) + require.NotNil(t, r.GetRecordFrame(300, "", "", false)) + require.NotNil(t, r.GetIndexFrame(200, 100, "", "", "")) } -func (ts *HTTPHandlerTestSuite) TestRegionIndexRangeWithStartNoLimit(c *C) { +func TestRegionIndexRangeWithStartNoLimit(t *testing.T) { eTableID := int64(9) startKey := []byte("m_aaaaafdfd") endKey := tablecodec.GenTableRecordPrefix(eTableID) @@ -220,56 +203,58 @@ func (ts *HTTPHandlerTestSuite) TestRegionIndexRangeWithStartNoLimit(c *C) { EndKey: endKey, } r, err := helper.NewRegionFrameRange(region) - c.Assert(err, IsNil) - c.Assert(r.First.IsRecord, IsFalse) - c.Assert(r.Last.IsRecord, IsTrue) - c.Assert(r.GetRecordFrame(3, "", "", false), NotNil) - c.Assert(r.GetIndexFrame(8, 1, "", "", ""), NotNil) + require.NoError(t, err) + require.False(t, r.First.IsRecord) + require.True(t, r.Last.IsRecord) + require.NotNil(t, r.GetRecordFrame(3, "", "", false)) + require.NotNil(t, r.GetIndexFrame(8, 1, "", "", "")) } -func (ts *HTTPHandlerTestSuite) TestRegionsAPI(c *C) { - ts.startServer(c) - defer ts.stopServer(c) - ts.prepareData(c) +func TestRegionsAPI(t *testing.T) { + ts := createBasicHTTPHandlerTestSuite() + ts.startServer(t) + defer ts.stopServer(t) + ts.prepareData(t) resp, err := ts.fetchStatus("/tables/tidb/t/regions") - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusOK) - defer resp.Body.Close() + require.NoError(t, err) + require.Equal(t, http.StatusOK, resp.StatusCode) + defer func() { require.NoError(t, resp.Body.Close()) }() decoder := json.NewDecoder(resp.Body) var data TableRegions err = decoder.Decode(&data) - c.Assert(err, IsNil) - c.Assert(len(data.RecordRegions) > 0, IsTrue) + require.NoError(t, err) + require.True(t, len(data.RecordRegions) > 0) // list region for _, region := range data.RecordRegions { - c.Assert(ts.regionContainsTable(c, region.ID, data.TableID), IsTrue) + require.True(t, ts.regionContainsTable(t, region.ID, data.TableID)) } } -func (ts *HTTPHandlerTestSuite) TestRegionsAPIForClusterIndex(c *C) { - ts.startServer(c) - defer ts.stopServer(c) - ts.prepareData(c) +func TestRegionsAPIForClusterIndex(t *testing.T) { + ts := createBasicHTTPHandlerTestSuite() + ts.startServer(t) + defer ts.stopServer(t) + ts.prepareData(t) resp, err := ts.fetchStatus("/tables/tidb/t/regions") - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusOK) - defer resp.Body.Close() + require.NoError(t, err) + require.Equal(t, http.StatusOK, resp.StatusCode) + defer func() { require.NoError(t, resp.Body.Close()) }() decoder := json.NewDecoder(resp.Body) var data TableRegions err = decoder.Decode(&data) - c.Assert(err, IsNil) - c.Assert(len(data.RecordRegions) > 0, IsTrue) + require.NoError(t, err) + require.True(t, len(data.RecordRegions) > 0) // list region for _, region := range data.RecordRegions { resp, err := ts.fetchStatus(fmt.Sprintf("/regions/%d", region.ID)) - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusOK) + require.NoError(t, err) + require.Equal(t, http.StatusOK, resp.StatusCode) decoder := json.NewDecoder(resp.Body) var data RegionDetail err = decoder.Decode(&data) - c.Assert(err, IsNil) + require.NoError(t, err) frameCnt := 0 for _, f := range data.Frames { if f.DBName == "tidb" && f.TableName == "t" { @@ -277,41 +262,42 @@ func (ts *HTTPHandlerTestSuite) TestRegionsAPIForClusterIndex(c *C) { } } // frameCnt = clustered primary key + secondary index(idx) = 2. - c.Assert(frameCnt, Equals, 2) - c.Assert(resp.Body.Close(), IsNil) + require.Equal(t, 2, frameCnt) + require.NoError(t, resp.Body.Close()) } } -func (ts *HTTPHandlerTestSuite) TestRangesAPI(c *C) { - ts.startServer(c) - defer ts.stopServer(c) - ts.prepareData(c) +func TestRangesAPI(t *testing.T) { + ts := createBasicHTTPHandlerTestSuite() + ts.startServer(t) + defer ts.stopServer(t) + ts.prepareData(t) resp, err := ts.fetchStatus("/tables/tidb/t/ranges") - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusOK) - defer resp.Body.Close() + require.NoError(t, err) + require.Equal(t, http.StatusOK, resp.StatusCode) + defer func() { require.NoError(t, resp.Body.Close()) }() decoder := json.NewDecoder(resp.Body) var data TableRanges err = decoder.Decode(&data) - c.Assert(err, IsNil) - c.Assert(data.TableName, Equals, "t") - c.Assert(len(data.Indices), Equals, 2) + require.NoError(t, err) + require.Equal(t, "t", data.TableName) + require.Equal(t, 2, len(data.Indices)) _, ok := data.Indices["PRIMARY"] - c.Assert(ok, IsTrue) + require.True(t, ok) _, ok = data.Indices["idx"] - c.Assert(ok, IsTrue) + require.True(t, ok) } -func (ts *HTTPHandlerTestSuite) regionContainsTable(c *C, regionID uint64, tableID int64) bool { +func (ts *basicHTTPHandlerTestSuite) regionContainsTable(t *testing.T, regionID uint64, tableID int64) bool { resp, err := ts.fetchStatus(fmt.Sprintf("/regions/%d", regionID)) - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusOK) - defer resp.Body.Close() + require.NoError(t, err) + require.Equal(t, http.StatusOK, resp.StatusCode) + defer func() { require.NoError(t, resp.Body.Close()) }() decoder := json.NewDecoder(resp.Body) var data RegionDetail err = decoder.Decode(&data) - c.Assert(err, IsNil) + require.NoError(t, err) for _, index := range data.Frames { if index.TableID == tableID { return true @@ -320,162 +306,141 @@ func (ts *HTTPHandlerTestSuite) regionContainsTable(c *C, regionID uint64, table return false } -func (ts *HTTPHandlerTestSuite) TestListTableRegions(c *C) { - ts.startServer(c) - defer ts.stopServer(c) - ts.prepareData(c) +func TestListTableRegions(t *testing.T) { + ts := createBasicHTTPHandlerTestSuite() + ts.startServer(t) + defer ts.stopServer(t) + ts.prepareData(t) // Test list table regions with error resp, err := ts.fetchStatus("/tables/fdsfds/aaa/regions") - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusBadRequest) - c.Assert(resp.Body.Close(), IsNil) + require.NoError(t, err) + require.Equal(t, http.StatusBadRequest, resp.StatusCode) + require.NoError(t, resp.Body.Close()) resp, err = ts.fetchStatus("/tables/tidb/pt/regions") - c.Assert(err, IsNil) + require.NoError(t, err) var data []*TableRegions dec := json.NewDecoder(resp.Body) err = dec.Decode(&data) - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) region := data[1] resp, err = ts.fetchStatus(fmt.Sprintf("/regions/%d", region.TableID)) - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) } -func (ts *HTTPHandlerTestSuite) TestListTableRanges(c *C) { - ts.startServer(c) - defer ts.stopServer(c) - ts.prepareData(c) +func TestListTableRanges(t *testing.T) { + ts := createBasicHTTPHandlerTestSuite() + ts.startServer(t) + defer ts.stopServer(t) + ts.prepareData(t) // Test list table regions with error resp, err := ts.fetchStatus("/tables/fdsfds/aaa/ranges") - c.Assert(err, IsNil) - defer resp.Body.Close() - c.Assert(resp.StatusCode, Equals, http.StatusBadRequest) + require.NoError(t, err) + defer func() { require.NoError(t, resp.Body.Close()) }() + require.Equal(t, http.StatusBadRequest, resp.StatusCode) resp, err = ts.fetchStatus("/tables/tidb/pt/ranges") - c.Assert(err, IsNil) - defer resp.Body.Close() + require.NoError(t, err) + defer func() { require.NoError(t, resp.Body.Close()) }() var data []*TableRanges dec := json.NewDecoder(resp.Body) err = dec.Decode(&data) - c.Assert(err, IsNil) - c.Assert(len(data), Equals, 3) + require.NoError(t, err) + require.Equal(t, 3, len(data)) for i, partition := range data { - c.Assert(partition.TableName, Equals, fmt.Sprintf("p%d", i)) + require.Equal(t, fmt.Sprintf("p%d", i), partition.TableName) } } -func (ts *HTTPHandlerTestSuite) TestGetRegionByIDWithError(c *C) { - ts.startServer(c) - defer ts.stopServer(c) +func TestGetRegionByIDWithError(t *testing.T) { + ts := createBasicHTTPHandlerTestSuite() + ts.startServer(t) + defer ts.stopServer(t) resp, err := ts.fetchStatus("/regions/xxx") - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusBadRequest) - defer resp.Body.Close() + require.NoError(t, err) + require.Equal(t, http.StatusBadRequest, resp.StatusCode) + defer func() { require.NoError(t, resp.Body.Close()) }() } -func (ts *HTTPHandlerTestSuite) TestBinlogRecover(c *C) { - ts.startServer(c) - defer ts.stopServer(c) +func TestBinlogRecover(t *testing.T) { + ts := createBasicHTTPHandlerTestSuite() + ts.startServer(t) + defer ts.stopServer(t) binloginfo.EnableSkipBinlogFlag() - c.Assert(binloginfo.IsBinlogSkipped(), Equals, true) + require.Equal(t, true, binloginfo.IsBinlogSkipped()) resp, err := ts.fetchStatus("/binlog/recover") - c.Assert(err, IsNil) - defer resp.Body.Close() - c.Assert(resp.StatusCode, Equals, http.StatusOK) - c.Assert(binloginfo.IsBinlogSkipped(), Equals, false) + require.NoError(t, err) + defer func() { require.NoError(t, resp.Body.Close()) }() + require.Equal(t, http.StatusOK, resp.StatusCode) + require.Equal(t, false, binloginfo.IsBinlogSkipped()) // Invalid operation will use the default operation. binloginfo.EnableSkipBinlogFlag() - c.Assert(binloginfo.IsBinlogSkipped(), Equals, true) + require.Equal(t, true, binloginfo.IsBinlogSkipped()) resp, err = ts.fetchStatus("/binlog/recover?op=abc") - c.Assert(err, IsNil) - defer resp.Body.Close() - c.Assert(resp.StatusCode, Equals, http.StatusOK) - c.Assert(binloginfo.IsBinlogSkipped(), Equals, false) + require.NoError(t, err) + defer func() { require.NoError(t, resp.Body.Close()) }() + require.Equal(t, http.StatusOK, resp.StatusCode) + require.Equal(t, false, binloginfo.IsBinlogSkipped()) binloginfo.EnableSkipBinlogFlag() - c.Assert(binloginfo.IsBinlogSkipped(), Equals, true) + require.Equal(t, true, binloginfo.IsBinlogSkipped()) resp, err = ts.fetchStatus("/binlog/recover?op=abc&seconds=1") - c.Assert(err, IsNil) - defer resp.Body.Close() - c.Assert(resp.StatusCode, Equals, http.StatusOK) - c.Assert(binloginfo.IsBinlogSkipped(), Equals, false) + require.NoError(t, err) + defer func() { require.NoError(t, resp.Body.Close()) }() + require.Equal(t, http.StatusOK, resp.StatusCode) + require.Equal(t, false, binloginfo.IsBinlogSkipped()) binloginfo.EnableSkipBinlogFlag() - c.Assert(binloginfo.IsBinlogSkipped(), Equals, true) + require.Equal(t, true, binloginfo.IsBinlogSkipped()) binloginfo.AddOneSkippedCommitter() resp, err = ts.fetchStatus("/binlog/recover?op=abc&seconds=1") - c.Assert(err, IsNil) - defer resp.Body.Close() - c.Assert(resp.StatusCode, Equals, http.StatusBadRequest) - c.Assert(binloginfo.IsBinlogSkipped(), Equals, false) + require.NoError(t, err) + defer func() { require.NoError(t, resp.Body.Close()) }() + require.Equal(t, http.StatusBadRequest, resp.StatusCode) + require.Equal(t, false, binloginfo.IsBinlogSkipped()) binloginfo.RemoveOneSkippedCommitter() binloginfo.AddOneSkippedCommitter() - c.Assert(binloginfo.SkippedCommitterCount(), Equals, int32(1)) + require.Equal(t, int32(1), binloginfo.SkippedCommitterCount()) resp, err = ts.fetchStatus("/binlog/recover?op=reset") - c.Assert(err, IsNil) - defer resp.Body.Close() - c.Assert(resp.StatusCode, Equals, http.StatusOK) - c.Assert(binloginfo.SkippedCommitterCount(), Equals, int32(0)) + require.NoError(t, err) + defer func() { require.NoError(t, resp.Body.Close()) }() + require.Equal(t, http.StatusOK, resp.StatusCode) + require.Equal(t, int32(0), binloginfo.SkippedCommitterCount()) binloginfo.EnableSkipBinlogFlag() resp, err = ts.fetchStatus("/binlog/recover?op=nowait") - c.Assert(err, IsNil) - defer resp.Body.Close() - c.Assert(resp.StatusCode, Equals, http.StatusOK) - c.Assert(binloginfo.IsBinlogSkipped(), Equals, false) + require.NoError(t, err) + defer func() { require.NoError(t, resp.Body.Close()) }() + require.Equal(t, http.StatusOK, resp.StatusCode) + require.Equal(t, false, binloginfo.IsBinlogSkipped()) // Only the first should work. binloginfo.EnableSkipBinlogFlag() resp, err = ts.fetchStatus("/binlog/recover?op=nowait&op=reset") - c.Assert(err, IsNil) - defer resp.Body.Close() - c.Assert(resp.StatusCode, Equals, http.StatusOK) - c.Assert(binloginfo.IsBinlogSkipped(), Equals, false) + require.NoError(t, err) + defer func() { require.NoError(t, resp.Body.Close()) }() + require.Equal(t, http.StatusOK, resp.StatusCode) + require.Equal(t, false, binloginfo.IsBinlogSkipped()) resp, err = ts.fetchStatus("/binlog/recover?op=status") - c.Assert(err, IsNil) - defer resp.Body.Close() - c.Assert(resp.StatusCode, Equals, http.StatusOK) + require.NoError(t, err) + defer func() { require.NoError(t, resp.Body.Close()) }() + require.Equal(t, http.StatusOK, resp.StatusCode) } -func (ts *HTTPHandlerTestSuite) TestRegionsFromMeta(c *C) { - ts.startServer(c) - defer ts.stopServer(c) - resp, err := ts.fetchStatus("/regions/meta") - c.Assert(err, IsNil) - defer resp.Body.Close() - c.Assert(resp.StatusCode, Equals, http.StatusOK) - - // Verify the resp body. - decoder := json.NewDecoder(resp.Body) - metas := make([]RegionMeta, 0) - err = decoder.Decode(&metas) - c.Assert(err, IsNil) - for _, meta := range metas { - c.Assert(meta.ID != 0, IsTrue) - } - - // test no panic - c.Assert(failpoint.Enable("github.com/pingcap/tidb/server/errGetRegionByIDEmpty", `return(true)`), IsNil) - resp1, err := ts.fetchStatus("/regions/meta") - c.Assert(err, IsNil) - defer resp1.Body.Close() - c.Assert(failpoint.Disable("github.com/pingcap/tidb/server/errGetRegionByIDEmpty"), IsNil) -} - -func (ts *basicHTTPHandlerTestSuite) startServer(c *C) { +func (ts *basicHTTPHandlerTestSuite) startServer(t *testing.T) { var err error ts.store, err = mockstore.NewMockStore() - c.Assert(err, IsNil) + require.NoError(t, err) ts.domain, err = session.BootstrapSession(ts.store) - c.Assert(err, IsNil) + require.NoError(t, err) ts.tidbdrv = NewTiDBDriver(ts.store) cfg := newTestConfig() @@ -485,18 +450,18 @@ func (ts *basicHTTPHandlerTestSuite) startServer(c *C) { cfg.Status.ReportStatus = true server, err := NewServer(cfg, ts.tidbdrv) - c.Assert(err, IsNil) + require.NoError(t, err) ts.port = getPortFromTCPAddr(server.listener.Addr()) ts.statusPort = getPortFromTCPAddr(server.statusListener.Addr()) ts.server = server go func() { err := server.Run() - c.Assert(err, IsNil) + require.NoError(t, err) }() ts.waitUntilServerOnline() do, err := session.GetDomain(ts.store) - c.Assert(err, IsNil) + require.NoError(t, err) ts.sh = &StatsHandler{do} } @@ -504,7 +469,7 @@ func getPortFromTCPAddr(addr net.Addr) uint { return uint(addr.(*net.TCPAddr).Port) } -func (ts *basicHTTPHandlerTestSuite) stopServer(c *C) { +func (ts *basicHTTPHandlerTestSuite) stopServer(t *testing.T) { if ts.server != nil { ts.server.Close() } @@ -512,90 +477,91 @@ func (ts *basicHTTPHandlerTestSuite) stopServer(c *C) { ts.domain.Close() } if ts.store != nil { - ts.store.Close() + require.NoError(t, ts.store.Close()) } } -func (ts *basicHTTPHandlerTestSuite) prepareData(c *C) { +func (ts *basicHTTPHandlerTestSuite) prepareData(t *testing.T) { db, err := sql.Open("mysql", ts.getDSN()) - c.Assert(err, IsNil, Commentf("Error connecting")) + require.NoError(t, err) defer func() { err := db.Close() - c.Assert(err, IsNil) + require.NoError(t, err) }() - dbt := &DBTest{c, db} - - dbt.mustExec("create database tidb;") - dbt.mustExec("use tidb;") - dbt.mustExec("create table tidb.test (a int auto_increment primary key, b varchar(20));") - dbt.mustExec("insert tidb.test values (1, 1);") - txn1, err := dbt.db.Begin() - c.Assert(err, IsNil) + dbt := testkit.NewDBTestKit(t, db) + + dbt.MustExec("create database tidb;") + dbt.MustExec("use tidb;") + dbt.MustExec("create table tidb.test (a int auto_increment primary key, b varchar(20));") + dbt.MustExec("insert tidb.test values (1, 1);") + txn1, err := dbt.GetDB().Begin() + require.NoError(t, err) _, err = txn1.Exec("update tidb.test set b = b + 1 where a = 1;") - c.Assert(err, IsNil) + require.NoError(t, err) _, err = txn1.Exec("insert tidb.test values (2, 2);") - c.Assert(err, IsNil) + require.NoError(t, err) _, err = txn1.Exec("insert tidb.test (a) values (3);") - c.Assert(err, IsNil) + require.NoError(t, err) _, err = txn1.Exec("insert tidb.test values (4, '');") - c.Assert(err, IsNil) + require.NoError(t, err) err = txn1.Commit() - c.Assert(err, IsNil) - dbt.mustExec("alter table tidb.test add index idx1 (a, b);") - dbt.mustExec("alter table tidb.test add unique index idx2 (a, b);") + require.NoError(t, err) + dbt.MustExec("alter table tidb.test add index idx1 (a, b);") + dbt.MustExec("alter table tidb.test add unique index idx2 (a, b);") - dbt.mustExec(`create table tidb.pt (a int primary key, b varchar(20), key idx(a, b)) + dbt.MustExec(`create table tidb.pt (a int primary key, b varchar(20), key idx(a, b)) partition by range (a) (partition p0 values less than (256), partition p1 values less than (512), partition p2 values less than (1024))`) - txn2, err := dbt.db.Begin() - c.Assert(err, IsNil) + txn2, err := dbt.GetDB().Begin() + require.NoError(t, err) _, err = txn2.Exec("insert into tidb.pt values (42, '123')") - c.Assert(err, IsNil) + require.NoError(t, err) _, err = txn2.Exec("insert into tidb.pt values (256, 'b')") - c.Assert(err, IsNil) + require.NoError(t, err) _, err = txn2.Exec("insert into tidb.pt values (666, 'def')") - c.Assert(err, IsNil) + require.NoError(t, err) err = txn2.Commit() - c.Assert(err, IsNil) - dbt.mustExec("drop table if exists t") - dbt.mustExec("create table t (a double, b varchar(20), c int, primary key(a,b) clustered, key idx(c))") - dbt.mustExec("insert into t values(1.1,'111',1),(2.2,'222',2)") + require.NoError(t, err) + dbt.MustExec("drop table if exists t") + dbt.MustExec("create table t (a double, b varchar(20), c int, primary key(a,b) clustered, key idx(c))") + dbt.MustExec("insert into t values(1.1,'111',1),(2.2,'222',2)") } -func decodeKeyMvcc(closer io.ReadCloser, c *C, valid bool) { +func decodeKeyMvcc(closer io.ReadCloser, t *testing.T, valid bool) { decoder := json.NewDecoder(closer) var data helper.MvccKV err := decoder.Decode(&data) - c.Assert(err, IsNil) + require.NoError(t, err) if valid { - c.Assert(data.Value.Info, NotNil) - c.Assert(len(data.Value.Info.Writes), Greater, 0) + require.NotNil(t, data.Value.Info) + require.Greater(t, len(data.Value.Info.Writes), 0) } else { - c.Assert(data.Value.Info.Lock, IsNil) - c.Assert(data.Value.Info.Writes, IsNil) - c.Assert(data.Value.Info.Values, IsNil) + require.Nil(t, data.Value.Info.Lock) + require.Nil(t, data.Value.Info.Writes) + require.Nil(t, data.Value.Info.Values) } } -func (ts *HTTPHandlerTestSuite) TestGetTableMVCC(c *C) { - ts.startServer(c) - ts.prepareData(c) - defer ts.stopServer(c) +func TestGetTableMVCC(t *testing.T) { + ts := createBasicHTTPHandlerTestSuite() + ts.startServer(t) + ts.prepareData(t) + defer ts.stopServer(t) resp, err := ts.fetchStatus("/mvcc/key/tidb/test/1") - c.Assert(err, IsNil) + require.NoError(t, err) decoder := json.NewDecoder(resp.Body) var data helper.MvccKV err = decoder.Decode(&data) - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) - c.Assert(data.Value, NotNil) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) + require.NotNil(t, data.Value) info := data.Value.Info - c.Assert(info, NotNil) - c.Assert(len(info.Writes), Greater, 0) + require.NotNil(t, info) + require.Greater(t, len(info.Writes), 0) // TODO: Unistore will not return Op_Lock. // Use this workaround to support two backend, we can remove this hack after deprecated mocktikv. @@ -609,276 +575,96 @@ func (ts *HTTPHandlerTestSuite) TestGetTableMVCC(c *C) { } resp, err = ts.fetchStatus(fmt.Sprintf("/mvcc/txn/%d/tidb/test", startTs)) - c.Assert(err, IsNil) + require.NoError(t, err) var p2 helper.MvccKV decoder = json.NewDecoder(resp.Body) err = decoder.Decode(&p2) - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) for i, expect := range info.Values { v2 := p2.Value.Info.Values[i].Value - c.Assert(v2, BytesEquals, expect.Value) + require.Equal(t, expect.Value, v2) } hexKey := p2.Key resp, err = ts.fetchStatus("/mvcc/hex/" + hexKey) - c.Assert(err, IsNil) + require.NoError(t, err) decoder = json.NewDecoder(resp.Body) var data2 helper.MvccKV err = decoder.Decode(&data2) - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) - c.Assert(data2, DeepEquals, data) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) + require.Equal(t, data, data2) resp, err = ts.fetchStatus("/mvcc/key/tidb/test/1?decode=true") - c.Assert(err, IsNil) + require.NoError(t, err) decoder = json.NewDecoder(resp.Body) var data3 map[string]interface{} err = decoder.Decode(&data3) - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) - c.Assert(data3["key"], NotNil) - c.Assert(data3["info"], NotNil) - c.Assert(data3["data"], NotNil) - c.Assert(data3["decode_error"], IsNil) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) + require.NotNil(t, data3["key"]) + require.NotNil(t, data3["info"]) + require.NotNil(t, data3["data"]) + require.Nil(t, data3["decode_error"]) resp, err = ts.fetchStatus("/mvcc/key/tidb/pt(p0)/42?decode=true") - c.Assert(err, IsNil) + require.NoError(t, err) decoder = json.NewDecoder(resp.Body) var data4 map[string]interface{} err = decoder.Decode(&data4) - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) - c.Assert(data4["key"], NotNil) - c.Assert(data4["info"], NotNil) - c.Assert(data4["data"], NotNil) - c.Assert(data4["decode_error"], IsNil) - c.Assert(resp.Body.Close(), IsNil) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) + require.NotNil(t, data4["key"]) + require.NotNil(t, data4["info"]) + require.NotNil(t, data4["data"]) + require.Nil(t, data4["decode_error"]) + require.NoError(t, resp.Body.Close()) resp, err = ts.fetchStatus("/mvcc/key/tidb/t/42") - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusBadRequest) - c.Assert(resp.Body.Close(), IsNil) + require.NoError(t, err) + require.Equal(t, http.StatusBadRequest, resp.StatusCode) + require.NoError(t, resp.Body.Close()) resp, err = ts.fetchStatus("/mvcc/key/tidb/t?a=1.1") - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusBadRequest) - c.Assert(resp.Body.Close(), IsNil) + require.NoError(t, err) + require.Equal(t, http.StatusBadRequest, resp.StatusCode) + require.NoError(t, resp.Body.Close()) resp, err = ts.fetchStatus("/mvcc/key/tidb/t?a=1.1&b=111&decode=1") - c.Assert(err, IsNil) + require.NoError(t, err) decoder = json.NewDecoder(resp.Body) var data5 map[string]interface{} err = decoder.Decode(&data5) - c.Assert(err, IsNil) - c.Assert(data4["key"], NotNil) - c.Assert(data4["info"], NotNil) - c.Assert(data4["data"], NotNil) - c.Assert(data4["decode_error"], IsNil) - c.Assert(resp.Body.Close(), IsNil) + require.NoError(t, err) + require.NotNil(t, data4["key"]) + require.NotNil(t, data4["info"]) + require.NotNil(t, data4["data"]) + require.Nil(t, data4["decode_error"]) + require.NoError(t, resp.Body.Close()) } -func (ts *HTTPHandlerTestSuite) TestGetMVCCNotFound(c *C) { - ts.startServer(c) - ts.prepareData(c) - defer ts.stopServer(c) +func TestGetMVCCNotFound(t *testing.T) { + ts := createBasicHTTPHandlerTestSuite() + ts.startServer(t) + ts.prepareData(t) + defer ts.stopServer(t) resp, err := ts.fetchStatus("/mvcc/key/tidb/test/1234") - c.Assert(err, IsNil) + require.NoError(t, err) decoder := json.NewDecoder(resp.Body) var data helper.MvccKV err = decoder.Decode(&data) - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) - c.Assert(data.Value.Info.Lock, IsNil) - c.Assert(data.Value.Info.Writes, IsNil) - c.Assert(data.Value.Info.Values, IsNil) -} - -func (ts *HTTPHandlerTestSuite) TestTiFlashReplica(c *C) { - ts.startServer(c) - ts.prepareData(c) - defer ts.stopServer(c) - - db, err := sql.Open("mysql", ts.getDSN()) - c.Assert(err, IsNil, Commentf("Error connecting")) - defer func() { - err := db.Close() - c.Assert(err, IsNil) - }() - dbt := &DBTest{c, db} - - defer func(originGC bool) { - if originGC { - ddl.EmulatorGCEnable() - } else { - ddl.EmulatorGCDisable() - } - }(ddl.IsEmulatorGCEnable()) - - // Disable emulator GC. - // Otherwise emulator GC will delete table record as soon as possible after execute drop table DDL. - ddl.EmulatorGCDisable() - gcTimeFormat := "20060102-15:04:05 -0700 MST" - timeBeforeDrop := time.Now().Add(0 - 48*60*60*time.Second).Format(gcTimeFormat) - safePointSQL := `INSERT HIGH_PRIORITY INTO mysql.tidb VALUES ('tikv_gc_safe_point', '%[1]s', ''),('tikv_gc_enable','true','') - ON DUPLICATE KEY - UPDATE variable_value = '%[1]s'` - // Set GC safe point and enable GC. - dbt.mustExec(fmt.Sprintf(safePointSQL, timeBeforeDrop)) - - resp, err := ts.fetchStatus("/tiflash/replica") - c.Assert(err, IsNil) - decoder := json.NewDecoder(resp.Body) - var data []tableFlashReplicaInfo - err = decoder.Decode(&data) - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) - c.Assert(len(data), Equals, 0) - - c.Assert(failpoint.Enable("github.com/pingcap/tidb/infoschema/mockTiFlashStoreCount", `return(true)`), IsNil) - defer func() { - err = failpoint.Disable("github.com/pingcap/tidb/infoschema/mockTiFlashStoreCount") - c.Assert(err, IsNil) - }() - - dbt.mustExec("use tidb") - dbt.mustExec("alter table test set tiflash replica 2 location labels 'a','b';") - - resp, err = ts.fetchStatus("/tiflash/replica") - c.Assert(err, IsNil) - decoder = json.NewDecoder(resp.Body) - err = decoder.Decode(&data) - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) - c.Assert(len(data), Equals, 1) - c.Assert(data[0].ReplicaCount, Equals, uint64(2)) - c.Assert(strings.Join(data[0].LocationLabels, ","), Equals, "a,b") - c.Assert(data[0].Available, Equals, false) - - resp, err = ts.postStatus("/tiflash/replica", "application/json", bytes.NewBuffer([]byte(`{"id":84,"region_count":3,"flash_region_count":3}`))) - c.Assert(err, IsNil) - c.Assert(resp, NotNil) - body, err := io.ReadAll(resp.Body) - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) - c.Assert(string(body), Equals, "[schema:1146]Table which ID = 84 does not exist.") - - t, err := ts.domain.InfoSchema().TableByName(model.NewCIStr("tidb"), model.NewCIStr("test")) - c.Assert(err, IsNil) - req := fmt.Sprintf(`{"id":%d,"region_count":3,"flash_region_count":3}`, t.Meta().ID) - resp, err = ts.postStatus("/tiflash/replica", "application/json", bytes.NewBuffer([]byte(req))) - c.Assert(err, IsNil) - c.Assert(resp, NotNil) - body, err = io.ReadAll(resp.Body) - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) - c.Assert(string(body), Equals, "") - - resp, err = ts.fetchStatus("/tiflash/replica") - c.Assert(err, IsNil) - decoder = json.NewDecoder(resp.Body) - err = decoder.Decode(&data) - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) - c.Assert(len(data), Equals, 1) - c.Assert(data[0].ReplicaCount, Equals, uint64(2)) - c.Assert(strings.Join(data[0].LocationLabels, ","), Equals, "a,b") - c.Assert(data[0].Available, Equals, true) // The status should be true now. - - // Should not take effect. - dbt.mustExec("alter table test set tiflash replica 2 location labels 'a','b';") - checkFunc := func() { - resp, err := ts.fetchStatus("/tiflash/replica") - c.Assert(err, IsNil) - decoder = json.NewDecoder(resp.Body) - err = decoder.Decode(&data) - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) - c.Assert(len(data), Equals, 1) - c.Assert(data[0].ReplicaCount, Equals, uint64(2)) - c.Assert(strings.Join(data[0].LocationLabels, ","), Equals, "a,b") - c.Assert(data[0].Available, Equals, true) // The status should be true now. - } - - // Test for get dropped table tiflash replica info. - dbt.mustExec("drop table test") - checkFunc() - - // Test unique table id replica info. - dbt.mustExec("flashback table test") - checkFunc() - dbt.mustExec("drop table test") - checkFunc() - dbt.mustExec("flashback table test") - checkFunc() - - // Test for partition table. - dbt.mustExec("alter table pt set tiflash replica 2 location labels 'a','b';") - dbt.mustExec("alter table test set tiflash replica 0;") - resp, err = ts.fetchStatus("/tiflash/replica") - c.Assert(err, IsNil) - decoder = json.NewDecoder(resp.Body) - err = decoder.Decode(&data) - c.Assert(err, IsNil) - err = resp.Body.Close() - c.Assert(err, IsNil) - c.Assert(len(data), Equals, 3) - c.Assert(data[0].ReplicaCount, Equals, uint64(2)) - c.Assert(strings.Join(data[0].LocationLabels, ","), Equals, "a,b") - c.Assert(data[0].Available, Equals, false) - - pid0 := data[0].ID - pid1 := data[1].ID - pid2 := data[2].ID - - // Mock for partition 1 replica was available. - req = fmt.Sprintf(`{"id":%d,"region_count":3,"flash_region_count":3}`, pid1) - resp, err = ts.postStatus("/tiflash/replica", "application/json", bytes.NewBuffer([]byte(req))) - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) - resp, err = ts.fetchStatus("/tiflash/replica") - c.Assert(err, IsNil) - decoder = json.NewDecoder(resp.Body) - err = decoder.Decode(&data) - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) - c.Assert(len(data), Equals, 3) - c.Assert(data[0].Available, Equals, false) - c.Assert(data[1].Available, Equals, true) - c.Assert(data[2].Available, Equals, false) - - // Mock for partition 0,2 replica was available. - req = fmt.Sprintf(`{"id":%d,"region_count":3,"flash_region_count":3}`, pid0) - resp, err = ts.postStatus("/tiflash/replica", "application/json", bytes.NewBuffer([]byte(req))) - c.Assert(err, IsNil) - err = resp.Body.Close() - c.Assert(err, IsNil) - req = fmt.Sprintf(`{"id":%d,"region_count":3,"flash_region_count":3}`, pid2) - resp, err = ts.postStatus("/tiflash/replica", "application/json", bytes.NewBuffer([]byte(req))) - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) - checkFunc = func() { - resp, err := ts.fetchStatus("/tiflash/replica") - c.Assert(err, IsNil) - decoder = json.NewDecoder(resp.Body) - err = decoder.Decode(&data) - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) - c.Assert(len(data), Equals, 3) - c.Assert(data[0].Available, Equals, true) - c.Assert(data[1].Available, Equals, true) - c.Assert(data[2].Available, Equals, true) - } - - // Test for get truncated table tiflash replica info. - dbt.mustExec("truncate table pt") - dbt.mustExec("alter table pt set tiflash replica 0;") - checkFunc() + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) + require.Nil(t, data.Value.Info.Lock) + require.Nil(t, data.Value.Info.Writes) + require.Nil(t, data.Value.Info.Values) } -func (ts *HTTPHandlerTestSuite) TestDecodeColumnValue(c *C) { - ts.startServer(c) - ts.prepareData(c) - defer ts.stopServer(c) +func TestDecodeColumnValue(t *testing.T) { + ts := createBasicHTTPHandlerTestSuite() + ts.startServer(t) + ts.prepareData(t) + defer ts.stopServer(t) // column is a structure used for test type column struct { @@ -905,22 +691,22 @@ func (ts *HTTPHandlerTestSuite) TestDecodeColumnValue(c *C) { rd := rowcodec.Encoder{Enable: true} sc := &stmtctx.StatementContext{TimeZone: time.UTC} bs, err := tablecodec.EncodeRow(sc, row, colIDs, nil, nil, &rd) - c.Assert(err, IsNil) - c.Assert(bs, NotNil) + require.NoError(t, err) + require.NotNil(t, bs) bin := base64.StdEncoding.EncodeToString(bs) unitTest := func(col *column) { path := fmt.Sprintf("/tables/%d/%v/%d/%d?rowBin=%s", col.id, col.tp.Tp, col.tp.Flag, col.tp.Flen, bin) resp, err := ts.fetchStatus(path) - c.Assert(err, IsNil, Commentf("url:%s", ts.statusURL(path))) + require.NoErrorf(t, err, "url: %v", ts.statusURL(path)) decoder := json.NewDecoder(resp.Body) var data interface{} err = decoder.Decode(&data) - c.Assert(err, IsNil, Commentf("url:%v\ndata%v", ts.statusURL(path), data)) - c.Assert(resp.Body.Close(), IsNil) + require.NoErrorf(t, err, "url: %v\ndata: %v", ts.statusURL(path), data) + require.NoError(t, resp.Body.Close()) colVal, err := types.DatumsToString([]types.Datum{row[col.id-1]}, false) - c.Assert(err, IsNil) - c.Assert(data, Equals, colVal, Commentf("url:%v", ts.statusURL(path))) + require.NoError(t, err) + require.Equalf(t, colVal, data, "url: %v", ts.statusURL(path)) } for _, col := range cols { @@ -940,192 +726,195 @@ func (ts *HTTPHandlerTestSuite) TestDecodeColumnValue(c *C) { unitTest(cols[3]) } -func (ts *HTTPHandlerTestSuite) TestGetIndexMVCC(c *C) { - ts.startServer(c) - ts.prepareData(c) - defer ts.stopServer(c) +func TestGetIndexMVCC(t *testing.T) { + ts := createBasicHTTPHandlerTestSuite() + ts.startServer(t) + ts.prepareData(t) + defer ts.stopServer(t) // tests for normal index key resp, err := ts.fetchStatus("/mvcc/index/tidb/test/idx1/1?a=1&b=2") - c.Assert(err, IsNil) - decodeKeyMvcc(resp.Body, c, true) - c.Assert(resp.Body.Close(), IsNil) + require.NoError(t, err) + decodeKeyMvcc(resp.Body, t, true) + require.NoError(t, resp.Body.Close()) resp, err = ts.fetchStatus("/mvcc/index/tidb/test/idx2/1?a=1&b=2") - c.Assert(err, IsNil) - decodeKeyMvcc(resp.Body, c, true) - c.Assert(resp.Body.Close(), IsNil) + require.NoError(t, err) + decodeKeyMvcc(resp.Body, t, true) + require.NoError(t, resp.Body.Close()) // tests for index key which includes null resp, err = ts.fetchStatus("/mvcc/index/tidb/test/idx1/3?a=3&b") - c.Assert(err, IsNil) - decodeKeyMvcc(resp.Body, c, true) - c.Assert(resp.Body.Close(), IsNil) + require.NoError(t, err) + decodeKeyMvcc(resp.Body, t, true) + require.NoError(t, resp.Body.Close()) resp, err = ts.fetchStatus("/mvcc/index/tidb/test/idx2/3?a=3&b") - c.Assert(err, IsNil) - decodeKeyMvcc(resp.Body, c, true) - c.Assert(resp.Body.Close(), IsNil) + require.NoError(t, err) + decodeKeyMvcc(resp.Body, t, true) + require.NoError(t, resp.Body.Close()) // tests for index key which includes empty string resp, err = ts.fetchStatus("/mvcc/index/tidb/test/idx1/4?a=4&b=") - c.Assert(err, IsNil) - decodeKeyMvcc(resp.Body, c, true) - c.Assert(resp.Body.Close(), IsNil) + require.NoError(t, err) + decodeKeyMvcc(resp.Body, t, true) + require.NoError(t, resp.Body.Close()) resp, err = ts.fetchStatus("/mvcc/index/tidb/test/idx2/3?a=4&b=") - c.Assert(err, IsNil) - decodeKeyMvcc(resp.Body, c, true) - c.Assert(resp.Body.Close(), IsNil) + require.NoError(t, err) + decodeKeyMvcc(resp.Body, t, true) + require.NoError(t, resp.Body.Close()) resp, err = ts.fetchStatus("/mvcc/index/tidb/t/idx?a=1.1&b=111&c=1") - c.Assert(err, IsNil) - decodeKeyMvcc(resp.Body, c, true) - c.Assert(resp.Body.Close(), IsNil) + require.NoError(t, err) + decodeKeyMvcc(resp.Body, t, true) + require.NoError(t, resp.Body.Close()) // tests for wrong key resp, err = ts.fetchStatus("/mvcc/index/tidb/test/idx1/5?a=5&b=1") - c.Assert(err, IsNil) - decodeKeyMvcc(resp.Body, c, false) - c.Assert(resp.Body.Close(), IsNil) + require.NoError(t, err) + decodeKeyMvcc(resp.Body, t, false) + require.NoError(t, resp.Body.Close()) resp, err = ts.fetchStatus("/mvcc/index/tidb/test/idx2/5?a=5&b=1") - c.Assert(err, IsNil) - decodeKeyMvcc(resp.Body, c, false) - c.Assert(resp.Body.Close(), IsNil) + require.NoError(t, err) + decodeKeyMvcc(resp.Body, t, false) + require.NoError(t, resp.Body.Close()) // tests for missing column value resp, err = ts.fetchStatus("/mvcc/index/tidb/test/idx1/1?a=1") - c.Assert(err, IsNil) + require.NoError(t, err) decoder := json.NewDecoder(resp.Body) var data1 helper.MvccKV err = decoder.Decode(&data1) - c.Assert(err, NotNil) - c.Assert(resp.Body.Close(), IsNil) + require.Error(t, err) + require.NoError(t, resp.Body.Close()) resp, err = ts.fetchStatus("/mvcc/index/tidb/test/idx2/1?a=1") - c.Assert(err, IsNil) + require.NoError(t, err) decoder = json.NewDecoder(resp.Body) var data2 helper.MvccKV err = decoder.Decode(&data2) - c.Assert(err, NotNil) - c.Assert(resp.Body.Close(), IsNil) + require.Error(t, err) + require.NoError(t, resp.Body.Close()) resp, err = ts.fetchStatus("/mvcc/index/tidb/pt(p2)/idx/666?a=666&b=def") - c.Assert(err, IsNil) - decodeKeyMvcc(resp.Body, c, true) - c.Assert(resp.Body.Close(), IsNil) + require.NoError(t, err) + decodeKeyMvcc(resp.Body, t, true) + require.NoError(t, resp.Body.Close()) } -func (ts *HTTPHandlerTestSuite) TestGetSettings(c *C) { - ts.startServer(c) - ts.prepareData(c) - defer ts.stopServer(c) +func TestGetSettings(t *testing.T) { + ts := createBasicHTTPHandlerTestSuite() + ts.startServer(t) + ts.prepareData(t) + defer ts.stopServer(t) resp, err := ts.fetchStatus("/settings") - c.Assert(err, IsNil) + require.NoError(t, err) decoder := json.NewDecoder(resp.Body) var settings *config.Config err = decoder.Decode(&settings) - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) var configBytes []byte configBytes, err = json.Marshal(config.GetGlobalConfig()) - c.Assert(err, IsNil) + require.NoError(t, err) var settingBytes []byte settingBytes, err = json.Marshal(settings) - c.Assert(err, IsNil) - c.Assert(settingBytes, DeepEquals, configBytes) + require.NoError(t, err) + require.Equal(t, configBytes, settingBytes) } -func (ts *HTTPHandlerTestSuite) TestGetSchema(c *C) { - ts.startServer(c) - ts.prepareData(c) - defer ts.stopServer(c) +func TestGetSchema(t *testing.T) { + ts := createBasicHTTPHandlerTestSuite() + ts.startServer(t) + ts.prepareData(t) + defer ts.stopServer(t) resp, err := ts.fetchStatus("/schema") - c.Assert(err, IsNil) + require.NoError(t, err) decoder := json.NewDecoder(resp.Body) var dbs []*model.DBInfo err = decoder.Decode(&dbs) - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) expects := []string{"information_schema", "metrics_schema", "mysql", "performance_schema", "test", "tidb"} names := make([]string, len(dbs)) for i, v := range dbs { names[i] = v.Name.L } sort.Strings(names) - c.Assert(names, DeepEquals, expects) + require.Equal(t, expects, names) resp, err = ts.fetchStatus("/schema?table_id=5") - c.Assert(err, IsNil) - var t *model.TableInfo + require.NoError(t, err) + var ti *model.TableInfo decoder = json.NewDecoder(resp.Body) - err = decoder.Decode(&t) - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) - c.Assert(t.Name.L, Equals, "user") + err = decoder.Decode(&ti) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) + require.Equal(t, "user", ti.Name.L) resp, err = ts.fetchStatus("/schema?table_id=a") - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) resp, err = ts.fetchStatus("/schema?table_id=1") - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) resp, err = ts.fetchStatus("/schema?table_id=-1") - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) resp, err = ts.fetchStatus("/schema/tidb") - c.Assert(err, IsNil) + require.NoError(t, err) var lt []*model.TableInfo decoder = json.NewDecoder(resp.Body) err = decoder.Decode(<) - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) - c.Assert(len(lt), Greater, 0) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) + require.Greater(t, len(lt), 0) resp, err = ts.fetchStatus("/schema/abc") - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) resp, err = ts.fetchStatus("/schema/tidb/test") - c.Assert(err, IsNil) + require.NoError(t, err) decoder = json.NewDecoder(resp.Body) - err = decoder.Decode(&t) - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) - c.Assert(t.Name.L, Equals, "test") + err = decoder.Decode(&ti) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) + require.Equal(t, "test", ti.Name.L) resp, err = ts.fetchStatus("/schema/tidb/abc") - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) resp, err = ts.fetchStatus("/db-table/5") - c.Assert(err, IsNil) + require.NoError(t, err) var dbtbl *dbTableInfo decoder = json.NewDecoder(resp.Body) err = decoder.Decode(&dbtbl) - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) - c.Assert(dbtbl.TableInfo.Name.L, Equals, "user") - c.Assert(dbtbl.DBInfo.Name.L, Equals, "mysql") + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) + require.Equal(t, "user", dbtbl.TableInfo.Name.L) + require.Equal(t, "mysql", dbtbl.DBInfo.Name.L) se, err := session.CreateSession(ts.store) - c.Assert(err, IsNil) - c.Assert(dbtbl.SchemaVersion, Equals, domain.GetDomain(se.(sessionctx.Context)).InfoSchema().SchemaMetaVersion()) + require.NoError(t, err) + require.Equal(t, domain.GetDomain(se.(sessionctx.Context)).InfoSchema().SchemaMetaVersion(), dbtbl.SchemaVersion) db, err := sql.Open("mysql", ts.getDSN()) - c.Assert(err, IsNil, Commentf("Error connecting")) + require.NoError(t, err) defer func() { err := db.Close() - c.Assert(err, IsNil) + require.NoError(t, err) }() - dbt := &DBTest{c, db} + dbt := testkit.NewDBTestKit(t, db) - dbt.mustExec("create database if not exists test;") - dbt.mustExec("use test;") - dbt.mustExec(` create table t1 (id int KEY) + dbt.MustExec("create database if not exists test;") + dbt.MustExec("use test;") + dbt.MustExec(` create table t1 (id int KEY) partition by range (id) ( PARTITION p0 VALUES LESS THAN (3), PARTITION p1 VALUES LESS THAN (5), @@ -1133,84 +922,38 @@ func (ts *HTTPHandlerTestSuite) TestGetSchema(c *C) { PARTITION p3 VALUES LESS THAN (9))`) resp, err = ts.fetchStatus("/schema/test/t1") - c.Assert(err, IsNil) + require.NoError(t, err) decoder = json.NewDecoder(resp.Body) - err = decoder.Decode(&t) - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) - c.Assert(t.Name.L, Equals, "t1") + err = decoder.Decode(&ti) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) + require.Equal(t, "t1", ti.Name.L) - resp, err = ts.fetchStatus(fmt.Sprintf("/db-table/%v", t.GetPartitionInfo().Definitions[0].ID)) - c.Assert(err, IsNil) + resp, err = ts.fetchStatus(fmt.Sprintf("/db-table/%v", ti.GetPartitionInfo().Definitions[0].ID)) + require.NoError(t, err) decoder = json.NewDecoder(resp.Body) err = decoder.Decode(&dbtbl) - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) - c.Assert(dbtbl.TableInfo.Name.L, Equals, "t1") - c.Assert(dbtbl.DBInfo.Name.L, Equals, "test") - c.Assert(dbtbl.TableInfo, DeepEquals, t) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) + require.Equal(t, "t1", dbtbl.TableInfo.Name.L) + require.Equal(t, "test", dbtbl.DBInfo.Name.L) + require.Equal(t, ti, dbtbl.TableInfo) } -func (ts *HTTPHandlerTestSuite) TestGetSchemaStorage(c *C) { - ts.startServer(c) - ts.prepareData(c) - defer ts.stopServer(c) - - do := ts.domain - h := do.StatsHandle() - do.SetStatsUpdating(true) - - tk := testkit.NewTestKitWithInit(c, ts.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t (c int, d int, e char(5), index idx(e))") - tk.MustExec(`insert into t(c, d, e) values(1, 2, "c"), (2, 3, "d"), (3, 4, "e")`) - h.FlushStats() - - resp, err := ts.fetchStatus("/schema_storage/test") - c.Assert(err, IsNil) - decoder := json.NewDecoder(resp.Body) - var tables []*schemaTableStorage - err = decoder.Decode(&tables) - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) - c.Assert(len(tables), Equals, 1) - expects := []string{`t`} - names := make([]string, len(tables)) - for i, v := range tables { - names[i] = v.TableName - } - - sort.Strings(names) - c.Assert(names, DeepEquals, expects) - - c.Assert( - []int64{ - tables[0].TableRows, - tables[0].AvgRowLength, - tables[0].DataLength, - tables[0].MaxDataLength, - tables[0].IndexLength, - tables[0].DataFree, - }, - DeepEquals, - []int64{3, 18, 54, 0, 6, 0}, - ) -} - -func (ts *HTTPHandlerTestSuite) TestAllHistory(c *C) { - ts.startServer(c) - ts.prepareData(c) - defer ts.stopServer(c) +func TestAllHistory(t *testing.T) { + ts := createBasicHTTPHandlerTestSuite() + ts.startServer(t) + ts.prepareData(t) + defer ts.stopServer(t) resp, err := ts.fetchStatus("/ddl/history/?limit=3") - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) resp, err = ts.fetchStatus("/ddl/history/?limit=-1") - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) resp, err = ts.fetchStatus("/ddl/history") - c.Assert(err, IsNil) + require.NoError(t, err) decoder := json.NewDecoder(resp.Body) var jobs []*model.Job @@ -1220,172 +963,31 @@ func (ts *HTTPHandlerTestSuite) TestAllHistory(c *C) { txn, _ := store.Begin() txnMeta := meta.NewMeta(txn) _, err = txnMeta.GetAllHistoryDDLJobs() - c.Assert(err, IsNil) + require.NoError(t, err) data, _ := txnMeta.GetAllHistoryDDLJobs() err = decoder.Decode(&jobs) - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) - c.Assert(jobs, DeepEquals, data) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) + require.Equal(t, data, jobs) } func dummyRecord() *deadlockhistory.DeadlockRecord { return &deadlockhistory.DeadlockRecord{} } -func (ts *HTTPHandlerTestSerialSuite) TestPostSettings(c *C) { - ts.startServer(c) - ts.prepareData(c) - defer ts.stopServer(c) - se, err := session.CreateSession(ts.store) - c.Assert(err, IsNil) - - form := make(url.Values) - form.Set("log_level", "error") - form.Set("tidb_general_log", "1") - form.Set("tidb_enable_async_commit", "1") - form.Set("tidb_enable_1pc", "1") - resp, err := ts.formStatus("/settings", form) - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusOK) - c.Assert(resp.Body.Close(), IsNil) - c.Assert(log.GetLevel(), Equals, zap.ErrorLevel) - c.Assert(config.GetGlobalConfig().Log.Level, Equals, "error") - c.Assert(variable.ProcessGeneralLog.Load(), IsTrue) - val, err := variable.GetGlobalSystemVar(se.GetSessionVars(), variable.TiDBEnableAsyncCommit) - c.Assert(err, IsNil) - c.Assert(val, Equals, variable.On) - val, err = variable.GetGlobalSystemVar(se.GetSessionVars(), variable.TiDBEnable1PC) - c.Assert(err, IsNil) - c.Assert(val, Equals, variable.On) - - form = make(url.Values) - form.Set("log_level", "fatal") - form.Set("tidb_general_log", "0") - form.Set("tidb_enable_async_commit", "0") - form.Set("tidb_enable_1pc", "0") - resp, err = ts.formStatus("/settings", form) - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusOK) - c.Assert(resp.Body.Close(), IsNil) - c.Assert(variable.ProcessGeneralLog.Load(), IsFalse) - c.Assert(log.GetLevel(), Equals, zap.FatalLevel) - c.Assert(config.GetGlobalConfig().Log.Level, Equals, "fatal") - val, err = variable.GetGlobalSystemVar(se.GetSessionVars(), variable.TiDBEnableAsyncCommit) - c.Assert(err, IsNil) - c.Assert(val, Equals, variable.Off) - val, err = variable.GetGlobalSystemVar(se.GetSessionVars(), variable.TiDBEnable1PC) - c.Assert(err, IsNil) - c.Assert(val, Equals, variable.Off) - form.Set("log_level", os.Getenv("log_level")) - - // test ddl_slow_threshold - form = make(url.Values) - form.Set("ddl_slow_threshold", "200") - resp, err = ts.formStatus("/settings", form) - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusOK) - c.Assert(resp.Body.Close(), IsNil) - c.Assert(atomic.LoadUint32(&variable.DDLSlowOprThreshold), Equals, uint32(200)) - - // test check_mb4_value_in_utf8 - db, err := sql.Open("mysql", ts.getDSN()) - c.Assert(err, IsNil, Commentf("Error connecting")) - defer func() { - err := db.Close() - c.Assert(err, IsNil) - }() - dbt := &DBTest{c, db} - - dbt.mustExec("create database tidb_test;") - dbt.mustExec("use tidb_test;") - dbt.mustExec("drop table if exists t2;") - dbt.mustExec("create table t2(a varchar(100) charset utf8);") - form.Set("check_mb4_value_in_utf8", "1") - resp, err = ts.formStatus("/settings", form) - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusOK) - c.Assert(resp.Body.Close(), IsNil) - c.Assert(config.GetGlobalConfig().CheckMb4ValueInUTF8, Equals, true) - txn1, err := dbt.db.Begin() - c.Assert(err, IsNil) - _, err = txn1.Exec("insert t2 values (unhex('F0A48BAE'));") - c.Assert(err, NotNil) - err = txn1.Commit() - c.Assert(err, IsNil) - - // Disable CheckMb4ValueInUTF8. - form = make(url.Values) - form.Set("check_mb4_value_in_utf8", "0") - resp, err = ts.formStatus("/settings", form) - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusOK) - c.Assert(resp.Body.Close(), IsNil) - c.Assert(config.GetGlobalConfig().CheckMb4ValueInUTF8, Equals, false) - dbt.mustExec("insert t2 values (unhex('f09f8c80'));") - - // test deadlock_history_capacity - deadlockhistory.GlobalDeadlockHistory.Resize(10) - for i := 0; i < 10; i++ { - deadlockhistory.GlobalDeadlockHistory.Push(dummyRecord()) - } - form = make(url.Values) - form.Set("deadlock_history_capacity", "5") - resp, err = ts.formStatus("/settings", form) - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) - c.Assert(len(deadlockhistory.GlobalDeadlockHistory.GetAll()), Equals, 5) - c.Assert(deadlockhistory.GlobalDeadlockHistory.GetAll()[0].ID, Equals, uint64(6)) - c.Assert(deadlockhistory.GlobalDeadlockHistory.GetAll()[4].ID, Equals, uint64(10)) - deadlockhistory.GlobalDeadlockHistory.Push(dummyRecord()) - c.Assert(len(deadlockhistory.GlobalDeadlockHistory.GetAll()), Equals, 5) - c.Assert(deadlockhistory.GlobalDeadlockHistory.GetAll()[0].ID, Equals, uint64(7)) - c.Assert(deadlockhistory.GlobalDeadlockHistory.GetAll()[4].ID, Equals, uint64(11)) - form = make(url.Values) - form.Set("deadlock_history_capacity", "6") - resp, err = ts.formStatus("/settings", form) - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) - deadlockhistory.GlobalDeadlockHistory.Push(dummyRecord()) - c.Assert(len(deadlockhistory.GlobalDeadlockHistory.GetAll()), Equals, 6) - c.Assert(deadlockhistory.GlobalDeadlockHistory.GetAll()[0].ID, Equals, uint64(7)) - c.Assert(deadlockhistory.GlobalDeadlockHistory.GetAll()[5].ID, Equals, uint64(12)) - - // test deadlock_history_collect_retryable - form = make(url.Values) - form.Set("deadlock_history_collect_retryable", "true") - resp, err = ts.formStatus("/settings", form) - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) - c.Assert(config.GetGlobalConfig().PessimisticTxn.DeadlockHistoryCollectRetryable, IsTrue) - form = make(url.Values) - form.Set("deadlock_history_collect_retryable", "false") - resp, err = ts.formStatus("/settings", form) - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) - c.Assert(config.GetGlobalConfig().PessimisticTxn.DeadlockHistoryCollectRetryable, IsFalse) - form = make(url.Values) - form.Set("deadlock_history_collect_retryable", "123") - resp, err = ts.formStatus("/settings", form) - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, 400) - c.Assert(resp.Body.Close(), IsNil) - - // restore original value. - config.GetGlobalConfig().CheckMb4ValueInUTF8 = true -} - -func (ts *HTTPHandlerTestSuite) TestPprof(c *C) { - ts.startServer(c) - defer ts.stopServer(c) +func TestPprof(t *testing.T) { + ts := createBasicHTTPHandlerTestSuite() + ts.startServer(t) + defer ts.stopServer(t) retryTime := 100 for retry := 0; retry < retryTime; retry++ { resp, err := ts.fetchStatus("/debug/pprof/heap") if err == nil { _, err = io.ReadAll(resp.Body) - c.Assert(err, IsNil) + require.NoError(t, err) err = resp.Body.Close() - c.Assert(err, IsNil) + require.NoError(t, err) return } time.Sleep(time.Millisecond * 10) @@ -1393,200 +995,67 @@ func (ts *HTTPHandlerTestSuite) TestPprof(c *C) { log.Fatal("failed to get profile for %d retries in every 10 ms", zap.Int("retryTime", retryTime)) } -func (ts *HTTPHandlerTestSuite) TestServerInfo(c *C) { - ts.startServer(c) - defer ts.stopServer(c) - resp, err := ts.fetchStatus("/info") - c.Assert(err, IsNil) - defer resp.Body.Close() - c.Assert(resp.StatusCode, Equals, http.StatusOK) - decoder := json.NewDecoder(resp.Body) - - info := serverInfo{} - err = decoder.Decode(&info) - c.Assert(err, IsNil) - - cfg := config.GetGlobalConfig() - c.Assert(info.IsOwner, IsTrue) - c.Assert(info.IP, Equals, cfg.AdvertiseAddress) - c.Assert(info.StatusPort, Equals, cfg.Status.StatusPort) - c.Assert(info.Lease, Equals, cfg.Lease) - c.Assert(info.Version, Equals, mysql.ServerVersion) - c.Assert(info.GitHash, Equals, versioninfo.TiDBGitHash) - - store := ts.server.newTikvHandlerTool().Store.(kv.Storage) - do, err := session.GetDomain(store) - c.Assert(err, IsNil) - ddl := do.DDL() - c.Assert(info.ID, Equals, ddl.GetID()) -} - -func (ts *HTTPHandlerTestSerialSuite) TestAllServerInfo(c *C) { - ts.startServer(c) - defer ts.stopServer(c) - resp, err := ts.fetchStatus("/info/all") - c.Assert(err, IsNil) - defer resp.Body.Close() - c.Assert(resp.StatusCode, Equals, http.StatusOK) - decoder := json.NewDecoder(resp.Body) - - clusterInfo := clusterServerInfo{} - err = decoder.Decode(&clusterInfo) - c.Assert(err, IsNil) - - c.Assert(clusterInfo.IsAllServerVersionConsistent, IsTrue) - c.Assert(clusterInfo.ServersNum, Equals, 1) - - store := ts.server.newTikvHandlerTool().Store.(kv.Storage) - do, err := session.GetDomain(store) - c.Assert(err, IsNil) - ddl := do.DDL() - c.Assert(clusterInfo.OwnerID, Equals, ddl.GetID()) - serverInfo, ok := clusterInfo.AllServersInfo[ddl.GetID()] - c.Assert(ok, Equals, true) - - cfg := config.GetGlobalConfig() - c.Assert(serverInfo.IP, Equals, cfg.AdvertiseAddress) - c.Assert(serverInfo.StatusPort, Equals, cfg.Status.StatusPort) - c.Assert(serverInfo.Lease, Equals, cfg.Lease) - c.Assert(serverInfo.Version, Equals, mysql.ServerVersion) - c.Assert(serverInfo.GitHash, Equals, versioninfo.TiDBGitHash) - c.Assert(serverInfo.ID, Equals, ddl.GetID()) -} - -func (ts *HTTPHandlerTestSuite) TestHotRegionInfo(c *C) { - ts.startServer(c) - defer ts.stopServer(c) +func TestHotRegionInfo(t *testing.T) { + ts := createBasicHTTPHandlerTestSuite() + ts.startServer(t) + defer ts.stopServer(t) resp, err := ts.fetchStatus("/regions/hot") - c.Assert(err, IsNil) - defer resp.Body.Close() - c.Assert(resp.StatusCode, Equals, http.StatusBadRequest) + require.NoError(t, err) + defer func() { require.NoError(t, resp.Body.Close()) }() + require.Equal(t, http.StatusBadRequest, resp.StatusCode) } -func (ts *HTTPHandlerTestSuite) TestDebugZip(c *C) { - ts.startServer(c) - defer ts.stopServer(c) +func TestDebugZip(t *testing.T) { + ts := createBasicHTTPHandlerTestSuite() + ts.startServer(t) + defer ts.stopServer(t) resp, err := ts.fetchStatus("/debug/zip?seconds=1") - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusOK) + require.NoError(t, err) + require.Equal(t, http.StatusOK, resp.StatusCode) b, err := httputil.DumpResponse(resp, true) - c.Assert(err, IsNil) - c.Assert(len(b), Greater, 0) - c.Assert(resp.Body.Close(), IsNil) + require.NoError(t, err) + require.Greater(t, len(b), 0) + require.NoError(t, resp.Body.Close()) } -func (ts *HTTPHandlerTestSuite) TestCheckCN(c *C) { +func TestCheckCN(t *testing.T) { s := &Server{cfg: &config.Config{Security: config.Security{ClusterVerifyCN: []string{"a ", "b", "c"}}}} tlsConfig := &tls.Config{} s.setCNChecker(tlsConfig) - c.Assert(tlsConfig.VerifyPeerCertificate, NotNil) + require.NotNil(t, tlsConfig.VerifyPeerCertificate) err := tlsConfig.VerifyPeerCertificate(nil, [][]*x509.Certificate{{{Subject: pkix.Name{CommonName: "a"}}}}) - c.Assert(err, IsNil) + require.NoError(t, err) err = tlsConfig.VerifyPeerCertificate(nil, [][]*x509.Certificate{{{Subject: pkix.Name{CommonName: "b"}}}}) - c.Assert(err, IsNil) + require.NoError(t, err) err = tlsConfig.VerifyPeerCertificate(nil, [][]*x509.Certificate{{{Subject: pkix.Name{CommonName: "d"}}}}) - c.Assert(err, NotNil) -} - -func (ts *HTTPHandlerTestSuite) TestFailpointHandler(c *C) { - defer ts.stopServer(c) - - // start server without enabling failpoint integration - ts.startServer(c) - resp, err := ts.fetchStatus("/fail/") - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusNotFound) - c.Assert(resp.Body.Close(), IsNil) - ts.stopServer(c) - - // enable failpoint integration and start server - c.Assert(failpoint.Enable("github.com/pingcap/tidb/server/enableTestAPI", "return"), IsNil) - ts.startServer(c) - resp, err = ts.fetchStatus("/fail/") - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusOK) - b, err := io.ReadAll(resp.Body) - c.Assert(err, IsNil) - c.Assert(strings.Contains(string(b), "github.com/pingcap/tidb/server/enableTestAPI=return"), IsTrue) - c.Assert(resp.Body.Close(), IsNil) -} - -func (ts *HTTPHandlerTestSuite) TestTestHandler(c *C) { - defer ts.stopServer(c) - - // start server without enabling failpoint integration - ts.startServer(c) - resp, err := ts.fetchStatus("/test") - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusNotFound) - c.Assert(resp.Body.Close(), IsNil) - ts.stopServer(c) - - // enable failpoint integration and start server - c.Assert(failpoint.Enable("github.com/pingcap/tidb/server/enableTestAPI", "return"), IsNil) - ts.startServer(c) - - resp, err = ts.fetchStatus("/test/gc/gc") - c.Assert(err, IsNil) - err = resp.Body.Close() - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusBadRequest) - - resp, err = ts.fetchStatus("/test/gc/resolvelock") - c.Assert(err, IsNil) - err = resp.Body.Close() - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusBadRequest) - - resp, err = ts.fetchStatus("/test/gc/resolvelock?safepoint=a") - c.Assert(err, IsNil) - err = resp.Body.Close() - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusBadRequest) - - resp, err = ts.fetchStatus("/test/gc/resolvelock?physical=1") - c.Assert(err, IsNil) - err = resp.Body.Close() - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusBadRequest) - - resp, err = ts.fetchStatus("/test/gc/resolvelock?physical=true") - c.Assert(err, IsNil) - err = resp.Body.Close() - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusBadRequest) - - resp, err = ts.fetchStatus("/test/gc/resolvelock?safepoint=10000&physical=true") - c.Assert(err, IsNil) - err = resp.Body.Close() - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusOK) + require.Error(t, err) } -func (ts *HTTPHandlerTestSuite) TestDDLHookHandler(c *C) { - defer ts.stopServer(c) +func TestDDLHookHandler(t *testing.T) { + ts := createBasicHTTPHandlerTestSuite() - ts.startServer(c) + ts.startServer(t) + defer ts.stopServer(t) resp, err := ts.fetchStatus("/test/ddl/hook") - c.Assert(err, IsNil) - c.Assert(resp.StatusCode, Equals, http.StatusBadRequest) - c.Assert(resp.Body.Close(), IsNil) + require.NoError(t, err) + require.Equal(t, http.StatusBadRequest, resp.StatusCode) + require.NoError(t, resp.Body.Close()) resp, err = ts.postStatus("/test/ddl/hook", "application/x-www-form-urlencoded", bytes.NewBuffer([]byte(`ddl_hook=ctc_hook`))) - c.Assert(err, IsNil) - c.Assert(resp, NotNil) + require.NoError(t, err) + require.NotNil(t, resp) body, err := io.ReadAll(resp.Body) - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) - c.Assert(string(body), Equals, "\"success!\"") - c.Assert(resp.StatusCode, Equals, http.StatusOK) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) + require.Equal(t, "\"success!\"", string(body)) + require.Equal(t, http.StatusOK, resp.StatusCode) resp, err = ts.postStatus("/test/ddl/hook", "application/x-www-form-urlencoded", bytes.NewBuffer([]byte(`ddl_hook=default_hook`))) - c.Assert(err, IsNil) - c.Assert(resp, NotNil) + require.NoError(t, err) + require.NotNil(t, resp) body, err = io.ReadAll(resp.Body) - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) - c.Assert(string(body), Equals, "\"success!\"") - c.Assert(resp.StatusCode, Equals, http.StatusOK) + require.NoError(t, err) + require.NoError(t, resp.Body.Close()) + require.Equal(t, "\"success!\"", string(body)) + require.Equal(t, http.StatusOK, resp.StatusCode) } diff --git a/server/http_status.go b/server/http_status.go index e0c0bf66fba37..8248e7c54e3de 100644 --- a/server/http_status.go +++ b/server/http_status.go @@ -31,6 +31,7 @@ import ( rpprof "runtime/pprof" "strconv" "strings" + "sync" "time" "github.com/gorilla/mux" @@ -43,6 +44,7 @@ import ( "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/memory" "github.com/pingcap/tidb/util/printer" "github.com/pingcap/tidb/util/topsql/tracecpu" "github.com/pingcap/tidb/util/versioninfo" @@ -107,6 +109,87 @@ func (s *Server) listenStatusHTTPServer() error { return nil } +// Ballast try to reduce the GC frequency by using Ballast Object +type Ballast struct { + ballast []byte + ballastLock sync.Mutex + + maxSize int +} + +func newBallast(maxSize int) *Ballast { + var b Ballast + b.maxSize = 1024 * 1024 * 1024 * 2 + if maxSize > 0 { + b.maxSize = maxSize + } else { + // we try to use the total amount of ram as a reference to set the default ballastMaxSz + // since the fatal throw "runtime: out of memory" would never yield to `recover` + totalRAMSz, err := memory.MemTotal() + if err != nil { + logutil.BgLogger().Error("failed to get the total amount of RAM on this system", zap.Error(err)) + } else { + maxSzAdvice := totalRAMSz >> 2 + if uint64(b.maxSize) > maxSzAdvice { + b.maxSize = int(maxSzAdvice) + } + } + } + return &b +} + +// GetSize get the size of ballast object +func (b *Ballast) GetSize() int { + var sz int + b.ballastLock.Lock() + sz = len(b.ballast) + b.ballastLock.Unlock() + return sz +} + +// SetSize set the size of ballast object +func (b *Ballast) SetSize(newSz int) error { + if newSz < 0 { + return fmt.Errorf("newSz cannot be negative: %d", newSz) + } + if newSz > b.maxSize { + return fmt.Errorf("newSz cannot be bigger than %d but it has value %d", b.maxSize, newSz) + } + b.ballastLock.Lock() + b.ballast = make([]byte, newSz) + b.ballastLock.Unlock() + return nil +} + +// GenHTTPHandler generate a HTTP handler to get/set the size of this ballast object +func (b *Ballast) GenHTTPHandler() func(w http.ResponseWriter, r *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + switch r.Method { + case http.MethodGet: + _, err := w.Write([]byte(strconv.Itoa(b.GetSize()))) + terror.Log(err) + case http.MethodPost: + body, err := io.ReadAll(r.Body) + if err != nil { + terror.Log(err) + return + } + newSz, err := strconv.Atoi(string(body)) + if err == nil { + err = b.SetSize(newSz) + } + if err != nil { + w.WriteHeader(http.StatusBadRequest) + errStr := err.Error() + if _, err := w.Write([]byte(errStr)); err != nil { + terror.Log(err) + } + return + } + } + } +} + func (s *Server) startHTTPServer() { router := mux.NewRouter() @@ -118,6 +201,10 @@ func (s *Server) startHTTPServer() { router.Handle("/stats/dump/{db}/{table}", s.newStatsHandler()).Name("StatsDump") router.Handle("/stats/dump/{db}/{table}/{snapshot}", s.newStatsHistoryHandler()).Name("StatsHistoryDump") + router.Handle("/plan_replayer/dump/{filename}", s.newPlanReplayerHandler()).Name("PlanReplayerDump") + + router.Handle("/optimize_trace/dump/{filename}", s.newOptimizeTraceHandler()).Name("OptimizeTraceDump") + tikvHandlerTool := s.newTikvHandlerTool() router.Handle("/settings", settingsHandler{tikvHandlerTool}).Name("Settings") router.Handle("/binlog/recover", binlogRecover{}).Name("BinlogRecover") @@ -194,6 +281,16 @@ func (s *Server) startHTTPServer() { serverMux.HandleFunc("/debug/pprof/profile", tracecpu.ProfileHTTPHandler) serverMux.HandleFunc("/debug/pprof/symbol", pprof.Symbol) serverMux.HandleFunc("/debug/pprof/trace", pprof.Trace) + + ballast := newBallast(s.cfg.MaxBallastObjectSize) + { + err := ballast.SetSize(s.cfg.BallastObjectSize) + if err != nil { + logutil.BgLogger().Error("set initial ballast object size failed", zap.Error(err)) + } + } + serverMux.HandleFunc("/debug/ballast-object-sz", ballast.GenHTTPHandler()) + serverMux.HandleFunc("/debug/gogc", func(w http.ResponseWriter, r *http.Request) { switch r.Method { case http.MethodGet: diff --git a/server/main_test.go b/server/main_test.go index a7fd224a9f130..155d9f9b7294e 100644 --- a/server/main_test.go +++ b/server/main_test.go @@ -15,15 +15,41 @@ package server import ( + "fmt" + "os" + "reflect" "testing" + "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/metrics" + "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/util/testbridge" + "github.com/tikv/client-go/v2/tikv" "go.uber.org/goleak" ) func TestMain(m *testing.M) { testbridge.WorkaroundGoCheckFlags() + runInGoTest = true // flag for NewServer to known it is running in test environment + + // AsyncCommit will make DDL wait 2.5s before changing to the next state. + // Set schema lease to avoid it from making CI slow. + session.SetSchemaLease(0) + + tikv.EnableFailpoints() + + metrics.RegisterMetrics() + + // sanity check: the global config should not be changed by other pkg init function. + // see also https://github.com/pingcap/tidb/issues/22162 + defaultConfig := config.NewConfig() + globalConfig := config.GetGlobalConfig() + if !reflect.DeepEqual(defaultConfig, globalConfig) { + _, _ = fmt.Fprintf(os.Stderr, "server: the global config has been changed.\n") + _, _ = fmt.Fprintf(os.Stderr, "default: %#v\nglobal: %#v", defaultConfig, globalConfig) + } + opts := []goleak.Option{ goleak.IgnoreTopFunction("time.Sleep"), goleak.IgnoreTopFunction("database/sql.(*Tx).awaitDone"), diff --git a/server/mock_conn.go b/server/mock_conn.go new file mode 100644 index 0000000000000..14e4daacf059e --- /dev/null +++ b/server/mock_conn.go @@ -0,0 +1,111 @@ +// Copyright 2021 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, +// 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. + +package server + +import ( + "bufio" + "bytes" + "context" + "flag" + "testing" + + "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/session" + "github.com/pingcap/tidb/util/arena" + "github.com/pingcap/tidb/util/chunk" + "github.com/stretchr/testify/require" +) + +// MockConn is a mock connection. +type MockConn interface { + // HandleQuery executes a statement + HandleQuery(ctx context.Context, sql string) error + // Context gets the TiDBContext + Context() *TiDBContext + // Dispatch executes command according to the command type + Dispatch(ctx context.Context, data []byte) error + // Close releases resources + Close() +} + +type mockConn struct { + *clientConn + t *testing.T +} + +// HandleQuery implements MockConn.HandleQuery +func (mc *mockConn) HandleQuery(ctx context.Context, sql string) error { + return mc.handleQuery(ctx, sql) +} + +// Context implements MockConn.Context +func (mc *mockConn) Context() *TiDBContext { + return mc.ctx +} + +// Dispatch implements MockConn.Dispatch +func (mc *mockConn) Dispatch(ctx context.Context, data []byte) error { + return mc.dispatch(ctx, data) +} + +// Close implements MockConn.Close +func (mc *mockConn) Close() { + require.NoError(mc.t, mc.clientConn.Close()) +} + +// CreateMockServer creates a mock server. +func CreateMockServer(t *testing.T, store kv.Storage) *Server { + if !runInGoTest { + // If CreateMockServer is called in another package, runInGoTest is not initialized. + runInGoTest = flag.Lookup("test.v") != nil || flag.Lookup("check.v") != nil + } + tidbdrv := NewTiDBDriver(store) + cfg := config.NewConfig() + cfg.Socket = "" + cfg.Port, cfg.Status.StatusPort = 0, 0 + cfg.Status.ReportStatus = false + cfg.Security.AutoTLS = false + server, err := NewServer(cfg, tidbdrv) + require.NoError(t, err) + return server +} + +// CreateMockConn creates a mock connection together with a session. +func CreateMockConn(t *testing.T, store kv.Storage, server *Server) MockConn { + se, err := session.CreateSession4Test(store) + require.NoError(t, err) + tc := &TiDBContext{ + Session: se, + stmts: make(map[int]*TiDBStatement), + } + + cc := &clientConn{ + server: server, + ctx: tc, + salt: []byte{}, + collation: mysql.DefaultCollationID, + alloc: arena.NewAllocator(1024), + chunkAlloc: chunk.NewAllocator(), + pkt: &packetIO{ + bufWriter: bufio.NewWriter(bytes.NewBuffer(nil)), + }, + } + return &mockConn{ + clientConn: cc, + t: t, + } +} diff --git a/server/mock_conn_test.go b/server/mock_conn_test.go new file mode 100644 index 0000000000000..8bcadd0da1c06 --- /dev/null +++ b/server/mock_conn_test.go @@ -0,0 +1,46 @@ +// Copyright 2021 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, +// 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. + +package server + +import ( + "context" + "testing" + + "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/testkit" + "github.com/stretchr/testify/require" +) + +func TestMockConn(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + server := CreateMockServer(t, store) + defer server.Close() + conn := CreateMockConn(t, store, server) + defer conn.Close() + + require.NoError(t, conn.HandleQuery(context.Background(), "select 1")) + require.Equal(t, "select 1", conn.Context().GetSessionVars().StmtCtx.OriginalSQL) + + require.Error(t, conn.HandleQuery(context.Background(), "select")) + + inBytes := append([]byte{mysql.ComQuery}, []byte("select 1")...) + require.NoError(t, conn.Dispatch(context.Background(), inBytes)) + require.Equal(t, "select 1", conn.Context().GetSessionVars().StmtCtx.OriginalSQL) + + inBytes = append([]byte{mysql.ComStmtPrepare}, []byte("select 1")...) + require.NoError(t, conn.Dispatch(context.Background(), inBytes)) + require.Equal(t, "select 1", conn.Context().GetSessionVars().StmtCtx.OriginalSQL) +} diff --git a/server/optimize_trace.go b/server/optimize_trace.go new file mode 100644 index 0000000000000..dcd0184fd87e9 --- /dev/null +++ b/server/optimize_trace.go @@ -0,0 +1,60 @@ +// Copyright 2021 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, +// 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. + +package server + +import ( + "fmt" + "net/http" + "path/filepath" + + "github.com/gorilla/mux" + "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/domain/infosync" +) + +// OptimizeTraceHandler serve http +type OptimizeTraceHandler struct { + infoGetter *infosync.InfoSyncer + address string + statusPort uint +} + +func (s *Server) newOptimizeTraceHandler() *OptimizeTraceHandler { + cfg := config.GetGlobalConfig() + oth := &OptimizeTraceHandler{ + address: cfg.AdvertiseAddress, + statusPort: cfg.Status.StatusPort, + } + if s.dom != nil && s.dom.InfoSyncer() != nil { + oth.infoGetter = s.dom.InfoSyncer() + } + return oth +} + +func (oth OptimizeTraceHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { + params := mux.Vars(req) + name := params[pFileName] + handler := downloadFileHandler{ + filePath: filepath.Join(domain.GetOptimizerTraceDirName(), name), + fileName: name, + infoGetter: oth.infoGetter, + address: oth.address, + statusPort: oth.statusPort, + urlPath: fmt.Sprintf("optimize_trace/dump/%s", name), + downloadedFilename: "optimize_trace", + } + handleDownloadFile(handler, w, req) +} diff --git a/server/optimize_trace_test.go b/server/optimize_trace_test.go new file mode 100644 index 0000000000000..4ed0a2a0e0826 --- /dev/null +++ b/server/optimize_trace_test.go @@ -0,0 +1,91 @@ +// Copyright 2021 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, +// 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. + +package server + +import ( + "database/sql" + "net/http" + "path/filepath" + "testing" + + "github.com/gorilla/mux" + "github.com/pingcap/tidb/session" + "github.com/pingcap/tidb/testkit" + "github.com/stretchr/testify/require" +) + +func TestDumpOptimizeTraceAPI(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + driver := NewTiDBDriver(store) + client := newTestServerClient() + cfg := newTestConfig() + cfg.Port = client.port + cfg.Status.StatusPort = client.statusPort + cfg.Status.ReportStatus = true + + server, err := NewServer(cfg, driver) + require.NoError(t, err) + defer server.Close() + + client.port = getPortFromTCPAddr(server.listener.Addr()) + client.statusPort = getPortFromTCPAddr(server.statusListener.Addr()) + go func() { + err := server.Run() + require.NoError(t, err) + }() + client.waitUntilServerOnline() + + dom, err := session.GetDomain(store) + require.NoError(t, err) + statsHandler := &StatsHandler{dom} + + otHandler := &OptimizeTraceHandler{} + filename := prepareData4OptimizeTrace(t, client, statsHandler) + + router := mux.NewRouter() + router.Handle("/optimize_trace/dump/{filename}", otHandler) + + resp0, err := client.fetchStatus(filepath.Join("/optimize_trace/dump/", filename)) + require.NoError(t, err) + defer func() { + require.NoError(t, resp0.Body.Close()) + }() + require.Equal(t, http.StatusOK, resp0.StatusCode) +} + +func prepareData4OptimizeTrace(t *testing.T, client *testServerClient, statHandle *StatsHandler) string { + db, err := sql.Open("mysql", client.getDSN()) + require.NoError(t, err, "Error connecting") + defer func() { + err := db.Close() + require.NoError(t, err) + }() + tk := testkit.NewDBTestKit(t, db) + + h := statHandle.do.StatsHandle() + tk.MustExec("create database optimizeTrace") + tk.MustExec("use optimizeTrace") + tk.MustExec("create table t(a int)") + err = h.HandleDDLEvent(<-h.DDLEventCh()) + require.NoError(t, err) + rows := tk.MustQuery("trace plan select * from t") + require.True(t, rows.Next(), "unexpected data") + var filename string + err = rows.Scan(&filename) + require.NoError(t, err) + return filename +} diff --git a/server/packetio_test.go b/server/packetio_test.go index fbb5c7c2651eb..3f85059fe4b83 100644 --- a/server/packetio_test.go +++ b/server/packetio_test.go @@ -26,8 +26,6 @@ import ( ) func TestPacketIOWrite(t *testing.T) { - t.Parallel() - // Test write one packet var outBuffer bytes.Buffer pkt := &packetIO{bufWriter: bufio.NewWriter(&outBuffer)} @@ -53,8 +51,6 @@ func TestPacketIOWrite(t *testing.T) { } func TestPacketIORead(t *testing.T) { - t.Parallel() - var inBuffer bytes.Buffer _, err := inBuffer.Write([]byte{0x01, 0x00, 0x00, 0x00, 0x01}) require.NoError(t, err) diff --git a/server/plan_replayer.go b/server/plan_replayer.go new file mode 100644 index 0000000000000..1d9a6a957f06e --- /dev/null +++ b/server/plan_replayer.go @@ -0,0 +1,182 @@ +// Copyright 2021 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, +// 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. + +package server + +import ( + "fmt" + "io/ioutil" + "net/http" + "os" + "path/filepath" + + "github.com/gorilla/mux" + "github.com/pingcap/errors" + "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/domain/infosync" + "github.com/pingcap/tidb/parser/terror" + "github.com/pingcap/tidb/util/logutil" + "go.uber.org/zap" +) + +// PlanReplayerHandler is the handler for dumping plan replayer file. +type PlanReplayerHandler struct { + infoGetter *infosync.InfoSyncer + address string + statusPort uint +} + +func (s *Server) newPlanReplayerHandler() *PlanReplayerHandler { + cfg := config.GetGlobalConfig() + prh := &PlanReplayerHandler{ + address: cfg.AdvertiseAddress, + statusPort: cfg.Status.StatusPort, + } + if s.dom != nil && s.dom.InfoSyncer() != nil { + prh.infoGetter = s.dom.InfoSyncer() + } + return prh +} + +func (prh PlanReplayerHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { + params := mux.Vars(req) + name := params[pFileName] + handler := downloadFileHandler{ + filePath: filepath.Join(domain.GetPlanReplayerDirName(), name), + fileName: name, + infoGetter: prh.infoGetter, + address: prh.address, + statusPort: prh.statusPort, + urlPath: fmt.Sprintf("plan_replyaer/dump/%s", name), + downloadedFilename: "plan_replayer", + } + handleDownloadFile(handler, w, req) +} + +func handleDownloadFile(handler downloadFileHandler, w http.ResponseWriter, req *http.Request) { + params := mux.Vars(req) + name := params[pFileName] + path := handler.filePath + exist, err := isExists(path) + if err != nil { + writeError(w, err) + return + } + if exist { + file, err := os.Open(path) + if err != nil { + writeError(w, err) + return + } + content, err := ioutil.ReadAll(file) + if err != nil { + writeError(w, err) + return + } + err = file.Close() + if err != nil { + writeError(w, err) + return + } + err = os.Remove(path) + if err != nil { + writeError(w, err) + return + } + _, err = w.Write(content) + if err != nil { + writeError(w, err) + return + } + w.Header().Set("Content-Type", "application/zip") + w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s.zip\"", handler.downloadedFilename)) + return + } + if handler.infoGetter == nil { + w.WriteHeader(http.StatusNotFound) + return + } + // we didn't find file for forward request, return 404 + forwarded := req.URL.Query().Get("forward") + if len(forwarded) > 0 { + w.WriteHeader(http.StatusNotFound) + return + } + // If we didn't find file in origin request, try to broadcast the request to all remote tidb-servers + topos, err := handler.infoGetter.GetAllTiDBTopology(req.Context()) + if err != nil { + writeError(w, err) + return + } + // transfer each remote tidb-server and try to find dump file + for _, topo := range topos { + if topo.IP == handler.address && topo.StatusPort == handler.statusPort { + continue + } + url := fmt.Sprintf("http://%s:%v/%s?forward=true", topo.IP, topo.StatusPort, handler.urlPath) + resp, err := http.Get(url) // #nosec G107 + if err != nil { + terror.Log(errors.Trace(err)) + logutil.BgLogger().Error("forward request failed", zap.String("addr", topo.IP), zap.Uint("port", topo.StatusPort), zap.Error(err)) + continue + } + if resp.StatusCode != http.StatusOK { + continue + } + content, err := ioutil.ReadAll(resp.Body) + if err != nil { + writeError(w, err) + return + } + err = resp.Body.Close() + if err != nil { + writeError(w, err) + return + } + _, err = w.Write(content) + if err != nil { + writeError(w, err) + return + } + // find dump file in one remote tidb-server, return file directly + w.Header().Set("Content-Type", "application/zip") + w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s.zip\"", handler.downloadedFilename)) + return + } + // we can't find dump file in any tidb-server, return 404 directly + logutil.BgLogger().Error("can't find dump file in any remote server", zap.String("filename", name)) + w.WriteHeader(http.StatusNotFound) +} + +type downloadFileHandler struct { + filePath string + fileName string + infoGetter *infosync.InfoSyncer + address string + statusPort uint + urlPath string + downloadedFilename string +} + +func isExists(path string) (bool, error) { + _, err := os.Stat(path) + if err != nil { + if os.IsNotExist(err) { + return false, nil + } + return false, err + } + return true, nil +} diff --git a/server/plan_replayer_test.go b/server/plan_replayer_test.go new file mode 100644 index 0000000000000..903f771463ee8 --- /dev/null +++ b/server/plan_replayer_test.go @@ -0,0 +1,141 @@ +// Copyright 2021 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, +// 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. + +package server + +import ( + "bytes" + "database/sql" + "io" + "io/ioutil" + "os" + "path/filepath" + "testing" + + "github.com/go-sql-driver/mysql" + "github.com/gorilla/mux" + "github.com/pingcap/tidb/session" + "github.com/pingcap/tidb/statistics/handle" + "github.com/pingcap/tidb/testkit" + "github.com/stretchr/testify/require" +) + +func TestDumpPlanReplayerAPI(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + driver := NewTiDBDriver(store) + client := newTestServerClient() + cfg := newTestConfig() + cfg.Port = client.port + cfg.Status.StatusPort = client.statusPort + cfg.Status.ReportStatus = true + + server, err := NewServer(cfg, driver) + require.NoError(t, err) + defer server.Close() + + client.port = getPortFromTCPAddr(server.listener.Addr()) + client.statusPort = getPortFromTCPAddr(server.statusListener.Addr()) + go func() { + err := server.Run() + require.NoError(t, err) + }() + client.waitUntilServerOnline() + + dom, err := session.GetDomain(store) + require.NoError(t, err) + statsHandler := &StatsHandler{dom} + + planReplayerHandler := &PlanReplayerHandler{} + filename := prepareData4PlanReplayer(t, client, statsHandler) + + router := mux.NewRouter() + router.Handle("/plan_replayer/dump/{filename}", planReplayerHandler) + + resp0, err := client.fetchStatus(filepath.Join("/plan_replayer/dump/", filename)) + require.NoError(t, err) + defer func() { + require.NoError(t, resp0.Body.Close()) + }() + + body, err := ioutil.ReadAll(resp0.Body) + require.NoError(t, err) + + path := "/tmp/plan_replayer.zip" + fp, err := os.Create(path) + require.NoError(t, err) + require.NotNil(t, fp) + defer func() { + require.NoError(t, fp.Close()) + require.NoError(t, os.Remove(path)) + }() + + _, err = io.Copy(fp, bytes.NewReader(body)) + require.NoError(t, err) + require.NoError(t, fp.Sync()) + + db, err := sql.Open("mysql", client.getDSN(func(config *mysql.Config) { + config.AllowAllFiles = true + })) + require.NoError(t, err, "Error connecting") + defer func() { + err := db.Close() + require.NoError(t, err) + }() + tk := testkit.NewDBTestKit(t, db) + + tk.MustExec("use planReplayer") + tk.MustExec("drop table planReplayer.t") + tk.MustExec(`plan replayer load "/tmp/plan_replayer.zip"`) + rows := tk.MustQuery("show stats_meta") + require.True(t, rows.Next(), "unexpected data") + var dbName, tableName string + var modifyCount, count int64 + var other interface{} + err = rows.Scan(&dbName, &tableName, &other, &other, &modifyCount, &count) + require.NoError(t, err) + require.Equal(t, "planReplayer", dbName) + require.Equal(t, "t", tableName) + require.Equal(t, int64(4), modifyCount) + require.Equal(t, int64(8), count) +} + +func prepareData4PlanReplayer(t *testing.T, client *testServerClient, statHandle *StatsHandler) string { + db, err := sql.Open("mysql", client.getDSN()) + require.NoError(t, err, "Error connecting") + defer func() { + err := db.Close() + require.NoError(t, err) + }() + tk := testkit.NewDBTestKit(t, db) + + h := statHandle.do.StatsHandle() + tk.MustExec("create database planReplayer") + tk.MustExec("use planReplayer") + tk.MustExec("create table t(a int)") + err = h.HandleDDLEvent(<-h.DDLEventCh()) + require.NoError(t, err) + tk.MustExec("insert into t values(1), (2), (3), (4)") + require.NoError(t, h.DumpStatsDeltaToKV(handle.DumpAll)) + tk.MustExec("analyze table t") + tk.MustExec("insert into t values(5), (6), (7), (8)") + require.NoError(t, h.DumpStatsDeltaToKV(handle.DumpAll)) + rows := tk.MustQuery("plan replayer dump explain select * from t") + require.True(t, rows.Next(), "unexpected data") + var filename string + err = rows.Scan(&filename) + require.NoError(t, err) + return filename +} diff --git a/server/server.go b/server/server.go index c2a2ea8966fba..ce4ef41a2151d 100644 --- a/server/server.go +++ b/server/server.go @@ -32,7 +32,6 @@ package server import ( "context" "crypto/tls" - "flag" "fmt" "math/rand" "net" @@ -88,7 +87,6 @@ func init() { if err != nil { osVersion = "" } - runInGoTest = flag.Lookup("test.v") != nil || flag.Lookup("check.v") != nil } var ( @@ -102,6 +100,7 @@ var ( errSecureTransportRequired = dbterror.ClassServer.NewStd(errno.ErrSecureTransportRequired) errMultiStatementDisabled = dbterror.ClassServer.NewStd(errno.ErrMultiStatementDisabled) errNewAbortingConnection = dbterror.ClassServer.NewStd(errno.ErrNewAbortingConnection) + errNotSupportedAuthMode = dbterror.ClassServer.NewStd(errno.ErrNotSupportedAuthMode) ) // DefaultCapability is the capability of the server when it is created using the default configuration. @@ -225,7 +224,8 @@ func NewServer(cfg *config.Config, driver IDriver) (*Server, error) { if tlsConfig != nil { setSSLVariable(s.cfg.Security.SSLCA, s.cfg.Security.SSLKey, s.cfg.Security.SSLCert) atomic.StorePointer(&s.tlsConfig, unsafe.Pointer(tlsConfig)) - logutil.BgLogger().Info("mysql protocol server secure connection is enabled", zap.Bool("client verification enabled", len(variable.GetSysVar("ssl_ca").Value) > 0)) + logutil.BgLogger().Info("mysql protocol server secure connection is enabled", + zap.Bool("client verification enabled", len(variable.GetSysVar("ssl_ca").Value) > 0)) } else if cfg.Security.RequireSecureTransport { return nil, errSecureTransportRequired.FastGenByArgs() } @@ -250,9 +250,7 @@ func NewServer(cfg *config.Config, driver IDriver) (*Server, error) { } if s.cfg.Socket != "" { - - err := cleanupStaleSocket(s.cfg.Socket) - if err != nil { + if err := cleanupStaleSocket(s.cfg.Socket); err != nil { return nil, errors.Trace(err) } @@ -272,24 +270,23 @@ func NewServer(cfg *config.Config, driver IDriver) (*Server, error) { if proxyTarget == nil { proxyTarget = s.socket } - pplistener, err := proxyprotocol.NewListener(proxyTarget, s.cfg.ProxyProtocol.Networks, + ppListener, err := proxyprotocol.NewListener(proxyTarget, s.cfg.ProxyProtocol.Networks, int(s.cfg.ProxyProtocol.HeaderTimeout)) if err != nil { logutil.BgLogger().Error("ProxyProtocol networks parameter invalid") return nil, errors.Trace(err) } if s.listener != nil { - s.listener = pplistener + s.listener = ppListener logutil.BgLogger().Info("server is running MySQL protocol (through PROXY protocol)", zap.String("host", s.cfg.Host)) } else { - s.socket = pplistener + s.socket = ppListener logutil.BgLogger().Info("server is running MySQL protocol (through PROXY protocol)", zap.String("socket", s.cfg.Socket)) } } if s.cfg.Status.ReportStatus { - err = s.listenStatusHTTPServer() - if err != nil { + if err = s.listenStatusHTTPServer(); err != nil { return nil, errors.Trace(err) } } @@ -304,25 +301,26 @@ func NewServer(cfg *config.Config, driver IDriver) (*Server, error) { func cleanupStaleSocket(socket string) error { sockStat, err := os.Stat(socket) - if err == nil { - if sockStat.Mode().Type() != os.ModeSocket { - return fmt.Errorf( - "the specified socket file %s is a %s instead of a socket file", - socket, sockStat.Mode().String()) - } + if err != nil { + return nil + } - _, err = net.Dial("unix", socket) - if err != nil { - logutil.BgLogger().Warn("Unix socket exists and is nonfunctional, removing it", - zap.String("socket", socket), zap.Error(err)) - err = os.Remove(socket) - if err != nil { - return fmt.Errorf("failed to remove socket file %s", socket) - } - } else { - return fmt.Errorf("unix socket %s exists and is functional, not removing it", socket) - } + if sockStat.Mode().Type() != os.ModeSocket { + return fmt.Errorf( + "the specified socket file %s is a %s instead of a socket file", + socket, sockStat.Mode().String()) + } + + if _, err = net.Dial("unix", socket); err == nil { + return fmt.Errorf("unix socket %s exists and is functional, not removing it", socket) } + + logutil.BgLogger().Warn("Unix socket exists and is nonfunctional, removing it", + zap.String("socket", socket), zap.Error(err)) + if err = os.Remove(socket); err != nil { + return fmt.Errorf("failed to remove socket file %s", socket) + } + return nil } @@ -363,7 +361,7 @@ func (s *Server) Run() error { s.startStatusHTTP() } // If error should be reported and exit the server it can be sent on this - // channel. Otherwise end with sending a nil error to signal "done" + // channel. Otherwise, end with sending a nil error to signal "done" errChan := make(chan error) go s.startNetworkListener(s.listener, false, errChan) go s.startNetworkListener(s.socket, true, errChan) @@ -393,7 +391,7 @@ func (s *Server) startNetworkListener(listener net.Listener, isUnixSocket bool, } } - // If we got PROXY protocol error, we should continue accept. + // If we got PROXY protocol error, we should continue to accept. if proxyprotocol.IsProxyProtocolError(err) { logutil.BgLogger().Error("PROXY protocol failed", zap.Error(err)) continue @@ -406,7 +404,6 @@ func (s *Server) startNetworkListener(listener net.Listener, isUnixSocket bool, clientConn := s.newConn(conn) if isUnixSocket { - uc, ok := conn.(*net.UnixConn) if !ok { logutil.BgLogger().Error("Expected UNIX socket, but got something else") @@ -424,19 +421,20 @@ func (s *Server) startNetworkListener(listener net.Listener, isUnixSocket bool, err = plugin.ForeachPlugin(plugin.Audit, func(p *plugin.Plugin) error { authPlugin := plugin.DeclareAuditManifest(p.Manifest) - if authPlugin.OnConnectionEvent != nil { - host, _, err := clientConn.PeerHost("") - if err != nil { - logutil.BgLogger().Error("get peer host failed", zap.Error(err)) - terror.Log(clientConn.Close()) - return errors.Trace(err) - } - err = authPlugin.OnConnectionEvent(context.Background(), plugin.PreAuth, &variable.ConnectionInfo{Host: host}) - if err != nil { - logutil.BgLogger().Info("do connection event failed", zap.Error(err)) - terror.Log(clientConn.Close()) - return errors.Trace(err) - } + if authPlugin.OnConnectionEvent == nil { + return nil + } + host, _, err := clientConn.PeerHost("") + if err != nil { + logutil.BgLogger().Error("get peer host failed", zap.Error(err)) + terror.Log(clientConn.Close()) + return errors.Trace(err) + } + if err = authPlugin.OnConnectionEvent(context.Background(), plugin.PreAuth, + &variable.ConnectionInfo{Host: host}); err != nil { + logutil.BgLogger().Info("do connection event failed", zap.Error(err)) + terror.Log(clientConn.Close()) + return errors.Trace(err) } return nil }) @@ -619,6 +617,9 @@ func (s *Server) ShowProcessList() map[uint64]*util.ProcessInfo { defer s.rwlock.RUnlock() rs := make(map[uint64]*util.ProcessInfo, len(s.clients)) for _, client := range s.clients { + if atomic.LoadInt32(&client.status) == connStatusWaitShutdown { + continue + } if pi := client.ctx.ShowProcess(); pi != nil { rs[pi.ID] = pi } diff --git a/server/server_test.go b/server/server_test.go index b45f99d42f7f2..034587d7be1f7 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -25,7 +25,6 @@ import ( "net/url" "os" "path/filepath" - "reflect" "regexp" "strconv" "strings" @@ -33,18 +32,15 @@ import ( "time" "github.com/go-sql-driver/mysql" - . "github.com/pingcap/check" "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/log" - "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/kv" tmysql "github.com/pingcap/tidb/parser/mysql" - "github.com/pingcap/tidb/session" - "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/util/versioninfo" - "github.com/tikv/client-go/v2/tikv" + "github.com/stretchr/testify/require" "go.uber.org/zap" ) @@ -52,27 +48,6 @@ var ( regression = true ) -func TestT(t *testing.T) { - defaultConfig := config.NewConfig() - globalConfig := config.GetGlobalConfig() - // Test for issue 22162. the global config shouldn't be changed by other pkg init function. - if !reflect.DeepEqual(defaultConfig, globalConfig) { - t.Fatalf("%#v != %#v\n", defaultConfig, globalConfig) - } - - // AsyncCommit will make DDL wait 2.5s before changing to the next state. - // Set schema lease to avoid it from making CI slow. - session.SetSchemaLease(0) - CustomVerboseFlag = true - logLevel := os.Getenv("log_level") - err := logutil.InitLogger(logutil.NewLogConfig(logLevel, logutil.DefaultLogFormat, "", logutil.EmptyFileLogConfig, false)) - if err != nil { - t.Fatal(err) - } - tikv.EnableFailpoints() - TestingT(t) -} - type configOverrider func(*mysql.Config) // testServerClient config server connect parameters and provider several @@ -129,343 +104,311 @@ func (cli *testServerClient) getDSN(overriders ...configOverrider) string { } // runTests runs tests using the default database `test`. -func (cli *testServerClient) runTests(c *C, overrider configOverrider, tests ...func(dbt *DBTest)) { +func (cli *testServerClient) runTests(t *testing.T, overrider configOverrider, tests ...func(dbt *testkit.DBTestKit)) { db, err := sql.Open("mysql", cli.getDSN(overrider)) - c.Assert(err, IsNil, Commentf("Error connecting")) + require.NoError(t, err) defer func() { err := db.Close() - c.Assert(err, IsNil) + require.NoError(t, err) }() - dbt := &DBTest{c, db} + dbt := testkit.NewDBTestKit(t, db) for _, test := range tests { test(dbt) } } // runTestsOnNewDB runs tests using a specified database which will be created before the test and destroyed after the test. -func (cli *testServerClient) runTestsOnNewDB(c *C, overrider configOverrider, dbName string, tests ...func(dbt *DBTest)) { +func (cli *testServerClient) runTestsOnNewDB(t *testing.T, overrider configOverrider, dbName string, tests ...func(dbt *testkit.DBTestKit)) { dsn := cli.getDSN(overrider, func(config *mysql.Config) { config.DBName = "" }) db, err := sql.Open("mysql", dsn) - c.Assert(err, IsNil, Commentf("Error connecting")) + require.NoError(t, err) defer func() { err := db.Close() - c.Assert(err, IsNil) + require.NoError(t, err) }() - _, err = db.Exec(fmt.Sprintf("DROP DATABASE IF EXISTS `%s`;", dbName)) if err != nil { fmt.Println(err) } - c.Assert(err, IsNil, Commentf("Error drop database %s: %s", dbName, err)) + require.NoErrorf(t, err, "Error drop database %s: %s", dbName, err) _, err = db.Exec(fmt.Sprintf("CREATE DATABASE `%s`;", dbName)) - c.Assert(err, IsNil, Commentf("Error create database %s: %s", dbName, err)) + require.NoErrorf(t, err, "Error create database %s: %s", dbName, err) defer func() { _, err = db.Exec(fmt.Sprintf("DROP DATABASE IF EXISTS `%s`;", dbName)) - c.Assert(err, IsNil, Commentf("Error drop database %s: %s", dbName, err)) + require.NoErrorf(t, err, "Error drop database %s: %s", dbName, err) }() _, err = db.Exec(fmt.Sprintf("USE `%s`;", dbName)) - c.Assert(err, IsNil, Commentf("Error use database %s: %s", dbName, err)) + require.NoErrorf(t, err, "Error use database %s: %s", dbName, err) - dbt := &DBTest{c, db} + dbt := testkit.NewDBTestKit(t, db) for _, test := range tests { test(dbt) // to fix : no db selected - _, _ = dbt.db.Exec("DROP TABLE IF EXISTS test") + _, _ = dbt.GetDB().Exec("DROP TABLE IF EXISTS test") } } -type DBTest struct { - *C - db *sql.DB -} - -func (dbt *DBTest) mustPrepare(query string) *sql.Stmt { - stmt, err := dbt.db.Prepare(query) - dbt.Assert(err, IsNil, Commentf("Prepare %s", query)) - return stmt -} - -func (dbt *DBTest) mustExecPrepared(stmt *sql.Stmt, args ...interface{}) sql.Result { - res, err := stmt.Exec(args...) - dbt.Assert(err, IsNil, Commentf("Execute prepared with args: %s", args)) - return res -} - -func (dbt *DBTest) mustQueryPrepared(stmt *sql.Stmt, args ...interface{}) *sql.Rows { - rows, err := stmt.Query(args...) - dbt.Assert(err, IsNil, Commentf("Query prepared with args: %s", args)) - return rows -} - -func (dbt *DBTest) mustExec(query string, args ...interface{}) (res sql.Result) { - res, err := dbt.db.Exec(query, args...) - dbt.Assert(err, IsNil, Commentf("Exec %s", query)) - return res -} - -func (dbt *DBTest) mustQuery(query string, args ...interface{}) (rows *sql.Rows) { - rows, err := dbt.db.Query(query, args...) - dbt.Assert(err, IsNil, Commentf("Query %s", query)) - return rows -} - -func (dbt *DBTest) mustQueryRows(query string, args ...interface{}) { - rows := dbt.mustQuery(query, args...) - dbt.Assert(rows.Next(), IsTrue) - rows.Close() -} - -func (cli *testServerClient) runTestRegression(c *C, overrider configOverrider, dbName string) { - cli.runTestsOnNewDB(c, overrider, dbName, func(dbt *DBTest) { +func (cli *testServerClient) runTestRegression(t *testing.T, overrider configOverrider, dbName string) { + cli.runTestsOnNewDB(t, overrider, dbName, func(dbt *testkit.DBTestKit) { // Show the user - dbt.mustExec("select user()") + dbt.MustExec("select user()") // Create Table - dbt.mustExec("CREATE TABLE test (val TINYINT)") + dbt.MustExec("CREATE TABLE test (val TINYINT)") // Test for unexpected data var out bool - rows := dbt.mustQuery("SELECT * FROM test") - dbt.Assert(rows.Next(), IsFalse, Commentf("unexpected data in empty table")) - + rows := dbt.MustQuery("SELECT * FROM test") + require.Falsef(t, rows.Next(), "unexpected data in empty table") + require.NoError(t, rows.Close()) // Create Data - res := dbt.mustExec("INSERT INTO test VALUES (1)") + res := dbt.MustExec("INSERT INTO test VALUES (1)") // res := dbt.mustExec("INSERT INTO test VALUES (?)", 1) count, err := res.RowsAffected() - dbt.Assert(err, IsNil) - dbt.Check(count, Equals, int64(1)) + require.NoError(t, err) + require.Equal(t, int64(1), count) id, err := res.LastInsertId() - dbt.Assert(err, IsNil) - dbt.Check(id, Equals, int64(0)) + require.NoError(t, err) + require.Equal(t, int64(0), id) // Read - rows = dbt.mustQuery("SELECT val FROM test") + rows = dbt.MustQuery("SELECT val FROM test") if rows.Next() { err = rows.Scan(&out) - c.Assert(err, IsNil) - dbt.Check(out, IsTrue) - dbt.Check(rows.Next(), IsFalse, Commentf("unexpected data")) + require.NoError(t, err) + require.True(t, out) + require.Falsef(t, rows.Next(), "unexpected data") } else { - dbt.Error("no data") + require.Fail(t, "no data") } - rows.Close() + require.NoError(t, rows.Close()) // Update - res = dbt.mustExec("UPDATE test SET val = 0 WHERE val = ?", 1) + res = dbt.MustExec("UPDATE test SET val = 0 WHERE val = ?", 1) count, err = res.RowsAffected() - dbt.Assert(err, IsNil) - dbt.Check(count, Equals, int64(1)) + require.NoError(t, err) + require.Equal(t, int64(1), count) // Check Update - rows = dbt.mustQuery("SELECT val FROM test") + rows = dbt.MustQuery("SELECT val FROM test") if rows.Next() { err = rows.Scan(&out) - c.Assert(err, IsNil) - dbt.Check(out, IsFalse) - dbt.Check(rows.Next(), IsFalse, Commentf("unexpected data")) + require.NoError(t, err) + require.False(t, out) + require.Falsef(t, rows.Next(), "unexpected data") } else { - dbt.Error("no data") + require.Fail(t, "no data") } - rows.Close() + require.NoError(t, rows.Close()) // Delete - res = dbt.mustExec("DELETE FROM test WHERE val = 0") + res = dbt.MustExec("DELETE FROM test WHERE val = 0") // res = dbt.mustExec("DELETE FROM test WHERE val = ?", 0) count, err = res.RowsAffected() - dbt.Assert(err, IsNil) - dbt.Check(count, Equals, int64(1)) + require.NoError(t, err) + require.Equal(t, int64(1), count) // Check for unexpected rows - res = dbt.mustExec("DELETE FROM test") + res = dbt.MustExec("DELETE FROM test") count, err = res.RowsAffected() - dbt.Assert(err, IsNil) - dbt.Check(count, Equals, int64(0)) + require.NoError(t, err) + require.Equal(t, int64(0), count) - dbt.mustQueryRows("SELECT 1") + dbt.MustQueryRows("SELECT 1") var b = make([]byte, 0) - if err := dbt.db.QueryRow("SELECT ?", b).Scan(&b); err != nil { - dbt.Fatal(err) + if err := dbt.GetDB().QueryRow("SELECT ?", b).Scan(&b); err != nil { + t.Fatal(err) } if b == nil { - dbt.Error("nil echo from non-nil input") + require.Fail(t, "nil echo from non-nil input") } }) } -func (cli *testServerClient) runTestPrepareResultFieldType(t *C) { +func (cli *testServerClient) runTestPrepareResultFieldType(t *testing.T) { var param int64 = 83 - cli.runTests(t, nil, func(dbt *DBTest) { - stmt, err := dbt.db.Prepare(`SELECT ?`) + cli.runTests(t, nil, func(dbt *testkit.DBTestKit) { + stmt, err := dbt.GetDB().Prepare(`SELECT ?`) if err != nil { - dbt.Fatal(err) + t.Fatal(err) } - defer stmt.Close() + defer func() { + err = stmt.Close() + require.NoError(t, err) + }() row := stmt.QueryRow(param) var result int64 err = row.Scan(&result) if err != nil { - dbt.Fatal(err) + t.Fatal(err) } if result != param { - dbt.Fatal("Unexpected result value") + t.Fatal("Unexpected result value") } }) } -func (cli *testServerClient) runTestSpecialType(t *C) { - cli.runTestsOnNewDB(t, nil, "SpecialType", func(dbt *DBTest) { - dbt.mustExec("create table test (a decimal(10, 5), b datetime, c time, d bit(8))") - dbt.mustExec("insert test values (1.4, '2012-12-21 12:12:12', '4:23:34', b'1000')") - rows := dbt.mustQuery("select * from test where a > ?", 0) - t.Assert(rows.Next(), IsTrue) +func (cli *testServerClient) runTestSpecialType(t *testing.T) { + cli.runTestsOnNewDB(t, nil, "SpecialType", func(dbt *testkit.DBTestKit) { + dbt.MustExec("create table test (a decimal(10, 5), b datetime, c time, d bit(8))") + dbt.MustExec("insert test values (1.4, '2012-12-21 12:12:12', '4:23:34', b'1000')") + rows := dbt.MustQuery("select * from test where a > ?", 0) + require.True(t, rows.Next()) var outA float64 var outB, outC string var outD []byte err := rows.Scan(&outA, &outB, &outC, &outD) - t.Assert(err, IsNil) - t.Assert(outA, Equals, 1.4) - t.Assert(outB, Equals, "2012-12-21 12:12:12") - t.Assert(outC, Equals, "04:23:34") - t.Assert(outD, BytesEquals, []byte{8}) + require.NoError(t, err) + require.Equal(t, 1.4, outA) + require.Equal(t, "2012-12-21 12:12:12", outB) + require.Equal(t, "04:23:34", outC) + require.Equal(t, []byte{8}, outD) + require.NoError(t, rows.Close()) }) } -func (cli *testServerClient) runTestClientWithCollation(t *C) { +func (cli *testServerClient) runTestClientWithCollation(t *testing.T) { cli.runTests(t, func(config *mysql.Config) { config.Collation = "utf8mb4_general_ci" - }, func(dbt *DBTest) { + }, func(dbt *testkit.DBTestKit) { var name, charset, collation string // check session variable collation_connection - rows := dbt.mustQuery("show variables like 'collation_connection'") - t.Assert(rows.Next(), IsTrue) - err := rows.Scan(&name, &collation) - t.Assert(err, IsNil) - t.Assert(collation, Equals, "utf8mb4_general_ci") + rows := dbt.MustQuery("show variables like 'collation_connection'") + require.True(t, rows.Next()) + err := rows.Scan(&name, &collation) + require.NoError(t, err) + require.Equal(t, "utf8mb4_general_ci", collation) + require.NoError(t, rows.Close()) // check session variable character_set_client - rows = dbt.mustQuery("show variables like 'character_set_client'") - t.Assert(rows.Next(), IsTrue) + rows = dbt.MustQuery("show variables like 'character_set_client'") + require.True(t, rows.Next()) err = rows.Scan(&name, &charset) - t.Assert(err, IsNil) - t.Assert(charset, Equals, "utf8mb4") - + require.NoError(t, err) + require.Equal(t, "utf8mb4", charset) + require.NoError(t, rows.Close()) // check session variable character_set_results - rows = dbt.mustQuery("show variables like 'character_set_results'") - t.Assert(rows.Next(), IsTrue) + rows = dbt.MustQuery("show variables like 'character_set_results'") + require.True(t, rows.Next()) err = rows.Scan(&name, &charset) - t.Assert(err, IsNil) - t.Assert(charset, Equals, "utf8mb4") + require.NoError(t, err) + require.Equal(t, "utf8mb4", charset) + require.NoError(t, rows.Close()) // check session variable character_set_connection - rows = dbt.mustQuery("show variables like 'character_set_connection'") - t.Assert(rows.Next(), IsTrue) + rows = dbt.MustQuery("show variables like 'character_set_connection'") + require.True(t, rows.Next()) err = rows.Scan(&name, &charset) - t.Assert(err, IsNil) - t.Assert(charset, Equals, "utf8mb4") + require.NoError(t, err) + require.Equal(t, "utf8mb4", charset) + require.NoError(t, rows.Close()) }) } -func (cli *testServerClient) runTestPreparedString(t *C) { - cli.runTestsOnNewDB(t, nil, "PreparedString", func(dbt *DBTest) { - dbt.mustExec("create table test (a char(10), b char(10))") - dbt.mustExec("insert test values (?, ?)", "abcdeabcde", "abcde") - rows := dbt.mustQuery("select * from test where 1 = ?", 1) - t.Assert(rows.Next(), IsTrue) +func (cli *testServerClient) runTestPreparedString(t *testing.T) { + cli.runTestsOnNewDB(t, nil, "PreparedString", func(dbt *testkit.DBTestKit) { + dbt.MustExec("create table test (a char(10), b char(10))") + dbt.MustExec("insert test values (?, ?)", "abcdeabcde", "abcde") + rows := dbt.MustQuery("select * from test where 1 = ?", 1) + require.True(t, rows.Next()) var outA, outB string err := rows.Scan(&outA, &outB) - t.Assert(err, IsNil) - t.Assert(outA, Equals, "abcdeabcde") - t.Assert(outB, Equals, "abcde") + require.NoError(t, err) + require.Equal(t, "abcdeabcde", outA) + require.Equal(t, "abcde", outB) + require.NoError(t, rows.Close()) }) } // runTestPreparedTimestamp does not really cover binary timestamp format, because MySQL driver in golang // does not use this format. MySQL driver in golang will convert the timestamp to a string. // This case guarantees it could work. -func (cli *testServerClient) runTestPreparedTimestamp(t *C) { - cli.runTestsOnNewDB(t, nil, "prepared_timestamp", func(dbt *DBTest) { - dbt.mustExec("create table test (a timestamp, b time)") - dbt.mustExec("set time_zone='+00:00'") - insertStmt := dbt.mustPrepare("insert test values (?, ?)") - defer insertStmt.Close() +func (cli *testServerClient) runTestPreparedTimestamp(t *testing.T) { + cli.runTestsOnNewDB(t, nil, "prepared_timestamp", func(dbt *testkit.DBTestKit) { + dbt.MustExec("create table test (a timestamp, b time)") + dbt.MustExec("set time_zone='+00:00'") + insertStmt := dbt.MustPrepare("insert test values (?, ?)") vts := time.Unix(1, 1) vt := time.Unix(-1, 1) - dbt.mustExecPrepared(insertStmt, vts, vt) - selectStmt := dbt.mustPrepare("select * from test where a = ? and b = ?") - defer selectStmt.Close() - rows := dbt.mustQueryPrepared(selectStmt, vts, vt) - t.Assert(rows.Next(), IsTrue) + dbt.MustExecPrepared(insertStmt, vts, vt) + require.NoError(t, insertStmt.Close()) + selectStmt := dbt.MustPrepare("select * from test where a = ? and b = ?") + rows := dbt.MustQueryPrepared(selectStmt, vts, vt) + require.True(t, rows.Next()) var outA, outB string err := rows.Scan(&outA, &outB) - t.Assert(err, IsNil) - t.Assert(outA, Equals, "1970-01-01 00:00:01") - t.Assert(outB, Equals, "23:59:59") + require.NoError(t, err) + require.Equal(t, "1970-01-01 00:00:01", outA) + require.Equal(t, "23:59:59", outB) + require.NoError(t, rows.Close()) + require.NoError(t, selectStmt.Close()) }) } -func (cli *testServerClient) runTestLoadDataWithSelectIntoOutfile(c *C, server *Server) { - cli.runTestsOnNewDB(c, func(config *mysql.Config) { +func (cli *testServerClient) runTestLoadDataWithSelectIntoOutfile(t *testing.T, server *Server) { + cli.runTestsOnNewDB(t, func(config *mysql.Config) { config.AllowAllFiles = true config.Params["sql_mode"] = "''" - }, "SelectIntoOutfile", func(dbt *DBTest) { - dbt.mustExec("create table t (i int, r real, d decimal(10, 5), s varchar(100), dt datetime, ts timestamp, j json)") - dbt.mustExec("insert into t values (1, 1.1, 0.1, 'a', '2000-01-01', '01:01:01', '[1]')") - dbt.mustExec("insert into t values (2, 2.2, 0.2, 'b', '2000-02-02', '02:02:02', '[1,2]')") - dbt.mustExec("insert into t values (null, null, null, null, '2000-03-03', '03:03:03', '[1,2,3]')") - dbt.mustExec("insert into t values (4, 4.4, 0.4, 'd', null, null, null)") + }, "SelectIntoOutfile", func(dbt *testkit.DBTestKit) { + dbt.MustExec("create table t (i int, r real, d decimal(10, 5), s varchar(100), dt datetime, ts timestamp, j json)") + dbt.MustExec("insert into t values (1, 1.1, 0.1, 'a', '2000-01-01', '01:01:01', '[1]')") + dbt.MustExec("insert into t values (2, 2.2, 0.2, 'b', '2000-02-02', '02:02:02', '[1,2]')") + dbt.MustExec("insert into t values (null, null, null, null, '2000-03-03', '03:03:03', '[1,2,3]')") + dbt.MustExec("insert into t values (4, 4.4, 0.4, 'd', null, null, null)") outfile := filepath.Join(os.TempDir(), fmt.Sprintf("select_into_outfile_%v_%d.csv", time.Now().UnixNano(), rand.Int())) // On windows use fmt.Sprintf("%q") to escape \ for SQL, // outfile may be 'C:\Users\genius\AppData\Local\Temp\select_into_outfile_1582732846769492000_8074605509026837941.csv' // Without quote, after SQL escape it would become: // 'C:UsersgeniusAppDataLocalTempselect_into_outfile_1582732846769492000_8074605509026837941.csv' - dbt.mustExec(fmt.Sprintf("select * from t into outfile %q", outfile)) + dbt.MustExec(fmt.Sprintf("select * from t into outfile %q", outfile)) defer func() { - c.Assert(os.Remove(outfile), IsNil) + require.NoError(t, os.Remove(outfile)) }() - dbt.mustExec("create table t1 (i int, r real, d decimal(10, 5), s varchar(100), dt datetime, ts timestamp, j json)") - dbt.mustExec(fmt.Sprintf("load data local infile %q into table t1", outfile)) + dbt.MustExec("create table t1 (i int, r real, d decimal(10, 5), s varchar(100), dt datetime, ts timestamp, j json)") + dbt.MustExec(fmt.Sprintf("load data local infile %q into table t1", outfile)) fetchResults := func(table string) [][]interface{} { var res [][]interface{} - row := dbt.mustQuery("select * from " + table + " order by i") + row := dbt.MustQuery("select * from " + table + " order by i") for row.Next() { r := make([]interface{}, 7) - c.Assert(row.Scan(&r[0], &r[1], &r[2], &r[3], &r[4], &r[5], &r[6]), IsNil) + require.NoError(t, row.Scan(&r[0], &r[1], &r[2], &r[3], &r[4], &r[5], &r[6])) res = append(res, r) } - c.Assert(row.Close(), IsNil) + require.NoError(t, row.Close()) return res } res := fetchResults("t") res1 := fetchResults("t1") - c.Assert(len(res), Equals, len(res1)) + require.Equal(t, len(res1), len(res)) for i := range res { for j := range res[i] { // using Sprintf to avoid some uncomparable types - c.Assert(fmt.Sprintf("%v", res[i][j]), Equals, fmt.Sprintf("%v", res1[i][j])) + require.Equal(t, fmt.Sprintf("%v", res1[i][j]), fmt.Sprintf("%v", res[i][j])) } } }) } -func (cli *testServerClient) runTestLoadDataForSlowLog(c *C, server *Server) { + +func (cli *testServerClient) runTestLoadDataForSlowLog(t *testing.T, server *Server) { path := "/tmp/load_data_test.csv" fp, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) - c.Assert(err, IsNil) - c.Assert(fp, NotNil) + require.NoError(t, err) + require.NotNil(t, fp) defer func() { err = fp.Close() - c.Assert(err, IsNil) + require.NoError(t, err) err = os.Remove(path) - c.Assert(err, IsNil) + require.NoError(t, err) }() _, err = fp.WriteString( "1 1\n" + @@ -473,69 +416,72 @@ func (cli *testServerClient) runTestLoadDataForSlowLog(c *C, server *Server) { "3 3\n" + "4 4\n" + "5 5\n") - c.Assert(err, IsNil) + require.NoError(t, err) - cli.runTestsOnNewDB(c, func(config *mysql.Config) { + cli.runTestsOnNewDB(t, func(config *mysql.Config) { config.AllowAllFiles = true config.Params["sql_mode"] = "''" - }, "load_data_slow_query", func(dbt *DBTest) { - dbt.mustExec("create table t_slow (a int key, b int)") + }, "load_data_slow_query", func(dbt *testkit.DBTestKit) { + dbt.MustExec("create table t_slow (a int key, b int)") defer func() { - dbt.mustExec("set tidb_slow_log_threshold=300;") - dbt.mustExec("set @@global.tidb_enable_stmt_summary=0") + dbt.MustExec("set tidb_slow_log_threshold=300;") + dbt.MustExec("set @@global.tidb_enable_stmt_summary=0") }() - dbt.mustExec("set tidb_slow_log_threshold=0;") - dbt.mustExec("set @@global.tidb_enable_stmt_summary=1") + dbt.MustExec("set tidb_slow_log_threshold=0;") + dbt.MustExec("set @@global.tidb_enable_stmt_summary=1") query := fmt.Sprintf("load data local infile %q into table t_slow", path) - dbt.mustExec(query) - dbt.mustExec("insert ignore into t_slow values (1,1);") + dbt.MustExec(query) + dbt.MustExec("insert ignore into t_slow values (1,1);") checkPlan := func(rows *sql.Rows, expectPlan string) { - dbt.Check(rows.Next(), IsTrue, Commentf("unexpected data")) + require.Truef(t, rows.Next(), "unexpected data") var plan sql.NullString err = rows.Scan(&plan) - dbt.Check(err, IsNil) + require.NoError(t, err) planStr := strings.ReplaceAll(plan.String, "\t", " ") planStr = strings.ReplaceAll(planStr, "\n", " ") - c.Assert(planStr, Matches, expectPlan) + require.Regexp(t, expectPlan, planStr) } // Test for record slow log for load data statement. - rows := dbt.mustQuery("select plan from information_schema.slow_query where query like 'load data local infile % into table t_slow;' order by time desc limit 1") + rows := dbt.MustQuery("select plan from information_schema.slow_query where query like 'load data local infile % into table t_slow;' order by time desc limit 1") expectedPlan := ".*LoadData.* time.* loops.* prepare.* check_insert.* mem_insert_time:.* prefetch.* rpc.* commit_txn.*" checkPlan(rows, expectedPlan) + require.NoError(t, rows.Close()) // Test for record statements_summary for load data statement. - rows = dbt.mustQuery("select plan from information_schema.STATEMENTS_SUMMARY where QUERY_SAMPLE_TEXT like 'load data local infile %' limit 1") + rows = dbt.MustQuery("select plan from information_schema.STATEMENTS_SUMMARY where QUERY_SAMPLE_TEXT like 'load data local infile %' limit 1") checkPlan(rows, expectedPlan) + require.NoError(t, rows.Close()) // Test log normal statement after executing load date. - rows = dbt.mustQuery("select plan from information_schema.slow_query where query = 'insert ignore into t_slow values (1,1);' order by time desc limit 1") + rows = dbt.MustQuery("select plan from information_schema.slow_query where query = 'insert ignore into t_slow values (1,1);' order by time desc limit 1") expectedPlan = ".*Insert.* time.* loops.* prepare.* check_insert.* mem_insert_time:.* prefetch.* rpc.*" checkPlan(rows, expectedPlan) + require.NoError(t, rows.Close()) }) } -func (cli *testServerClient) prepareLoadDataFile(c *C, path string, rows ...string) { +func (cli *testServerClient) prepareLoadDataFile(t *testing.T, path string, rows ...string) { fp, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) - c.Assert(err, IsNil) - c.Assert(fp, NotNil) + require.NoError(t, err) + require.NotNil(t, fp) defer func() { err = fp.Close() - c.Assert(err, IsNil) + require.NoError(t, err) }() for _, row := range rows { fields := strings.Split(row, " ") _, err = fp.WriteString(strings.Join(fields, "\t")) _, err = fp.WriteString("\n") } - c.Assert(err, IsNil) + require.NoError(t, err) } -func (cli *testServerClient) runTestLoadDataAutoRandom(c *C) { +func (cli *testServerClient) runTestLoadDataAutoRandom(t *testing.T) { path := "/tmp/load_data_txn_error.csv" fp, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) - c.Assert(err, IsNil) - c.Assert(fp, NotNil) + require.NoError(t, err) + require.NotNil(t, fp) defer func() { _ = os.Remove(path) @@ -550,9 +496,9 @@ func (cli *testServerClient) runTestLoadDataAutoRandom(c *C) { str2 := strconv.Itoa(n2) row := str1 + "\t" + str2 _, err := fp.WriteString(row) - c.Assert(err, IsNil) + require.NoError(t, err) _, err = fp.WriteString("\n") - c.Assert(err, IsNil) + require.NoError(t, err) if i == 0 { cksum1 = n1 @@ -564,33 +510,35 @@ func (cli *testServerClient) runTestLoadDataAutoRandom(c *C) { } err = fp.Close() - c.Assert(err, IsNil) + require.NoError(t, err) - cli.runTestsOnNewDB(c, func(config *mysql.Config) { + cli.runTestsOnNewDB(t, func(config *mysql.Config) { config.AllowAllFiles = true config.Params["sql_mode"] = "''" - }, "load_data_batch_dml", func(dbt *DBTest) { + }, "load_data_batch_dml", func(dbt *testkit.DBTestKit) { // Set batch size, and check if load data got a invalid txn error. - dbt.mustExec("set @@session.tidb_dml_batch_size = 128") - dbt.mustExec("drop table if exists t") - dbt.mustExec("create table t(c1 bigint auto_random primary key, c2 bigint, c3 bigint)") - dbt.mustExec(fmt.Sprintf("load data local infile %q into table t (c2, c3)", path)) - rows := dbt.mustQuery("select count(*) from t") - cli.checkRows(c, rows, "50000") - rows = dbt.mustQuery("select bit_xor(c2), bit_xor(c3) from t") + dbt.MustExec("set @@session.tidb_dml_batch_size = 128") + dbt.MustExec("drop table if exists t") + dbt.MustExec("create table t(c1 bigint auto_random primary key, c2 bigint, c3 bigint)") + dbt.MustExec(fmt.Sprintf("load data local infile %q into table t (c2, c3)", path)) + rows := dbt.MustQuery("select count(*) from t") + cli.checkRows(t, rows, "50000") + require.NoError(t, rows.Close()) + rows = dbt.MustQuery("select bit_xor(c2), bit_xor(c3) from t") res := strconv.Itoa(cksum1) res = res + " " res = res + strconv.Itoa(cksum2) - cli.checkRows(c, rows, res) + cli.checkRows(t, rows, res) + require.NoError(t, rows.Close()) }) } -func (cli *testServerClient) runTestLoadDataAutoRandomWithSpecialTerm(c *C) { +func (cli *testServerClient) runTestLoadDataAutoRandomWithSpecialTerm(t *testing.T) { path := "/tmp/load_data_txn_error_term.csv" fp, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) - c.Assert(err, IsNil) - c.Assert(fp, NotNil) + require.NoError(t, err) + require.NotNil(t, fp) defer func() { _ = os.Remove(path) @@ -605,11 +553,11 @@ func (cli *testServerClient) runTestLoadDataAutoRandomWithSpecialTerm(c *C) { str2 := strconv.Itoa(n2) row := "'" + str1 + "','" + str2 + "'" _, err := fp.WriteString(row) - c.Assert(err, IsNil) + require.NoError(t, err) if i != 49999 { _, err = fp.WriteString("|") } - c.Assert(err, IsNil) + require.NoError(t, err) if i == 0 { cksum1 = n1 @@ -621,39 +569,39 @@ func (cli *testServerClient) runTestLoadDataAutoRandomWithSpecialTerm(c *C) { } err = fp.Close() - c.Assert(err, IsNil) + require.NoError(t, err) - cli.runTestsOnNewDB(c, func(config *mysql.Config) { + cli.runTestsOnNewDB(t, func(config *mysql.Config) { config.AllowAllFiles = true config.Params = map[string]string{"sql_mode": "''"} - }, "load_data_batch_dml", func(dbt *DBTest) { + }, "load_data_batch_dml", func(dbt *testkit.DBTestKit) { // Set batch size, and check if load data got a invalid txn error. - dbt.mustExec("set @@session.tidb_dml_batch_size = 128") - dbt.mustExec("drop table if exists t1") - dbt.mustExec("create table t1(c1 bigint auto_random primary key, c2 bigint, c3 bigint)") - dbt.mustExec(fmt.Sprintf("load data local infile %q into table t1 fields terminated by ',' enclosed by '\\'' lines terminated by '|' (c2, c3)", path)) - rows := dbt.mustQuery("select count(*) from t1") - cli.checkRows(c, rows, "50000") - rows = dbt.mustQuery("select bit_xor(c2), bit_xor(c3) from t1") + dbt.MustExec("set @@session.tidb_dml_batch_size = 128") + dbt.MustExec("drop table if exists t1") + dbt.MustExec("create table t1(c1 bigint auto_random primary key, c2 bigint, c3 bigint)") + dbt.MustExec(fmt.Sprintf("load data local infile %q into table t1 fields terminated by ',' enclosed by '\\'' lines terminated by '|' (c2, c3)", path)) + rows := dbt.MustQuery("select count(*) from t1") + cli.checkRows(t, rows, "50000") + rows = dbt.MustQuery("select bit_xor(c2), bit_xor(c3) from t1") res := strconv.Itoa(cksum1) res = res + " " res = res + strconv.Itoa(cksum2) - cli.checkRows(c, rows, res) + cli.checkRows(t, rows, res) }) } -func (cli *testServerClient) runTestLoadDataForListPartition(c *C) { +func (cli *testServerClient) runTestLoadDataForListPartition(t *testing.T) { path := "/tmp/load_data_list_partition.csv" defer func() { _ = os.Remove(path) }() - cli.runTestsOnNewDB(c, func(config *mysql.Config) { + cli.runTestsOnNewDB(t, func(config *mysql.Config) { config.AllowAllFiles = true config.Params["sql_mode"] = "''" - }, "load_data_list_partition", func(dbt *DBTest) { - dbt.mustExec("set @@session.tidb_enable_list_partition = ON") - dbt.mustExec(`create table t (id int, name varchar(10), + }, "load_data_list_partition", func(dbt *testkit.DBTestKit) { + dbt.MustExec("set @@session.tidb_enable_list_partition = ON") + dbt.MustExec(`create table t (id int, name varchar(10), unique index idx (id)) partition by list (id) ( partition p0 values in (3,5,6,9,17), partition p1 values in (1,2,10,11,19,20), @@ -661,48 +609,53 @@ func (cli *testServerClient) runTestLoadDataForListPartition(c *C) { partition p3 values in (7,8,15,16,null) );`) // Test load data into 1 partition. - cli.prepareLoadDataFile(c, path, "1 a", "2 b") - dbt.mustExec(fmt.Sprintf("load data local infile %q into table t", path)) - rows := dbt.mustQuery("select * from t partition(p1) order by id") - cli.checkRows(c, rows, "1 a", "2 b") + cli.prepareLoadDataFile(t, path, "1 a", "2 b") + dbt.MustExec(fmt.Sprintf("load data local infile %q into table t", path)) + rows := dbt.MustQuery("select * from t partition(p1) order by id") + cli.checkRows(t, rows, "1 a", "2 b") // Test load data into multi-partitions. - dbt.mustExec("delete from t") - cli.prepareLoadDataFile(c, path, "1 a", "3 c", "4 e") - dbt.mustExec(fmt.Sprintf("load data local infile %q into table t", path)) - rows = dbt.mustQuery("select * from t order by id") - cli.checkRows(c, rows, "1 a", "3 c", "4 e") + dbt.MustExec("delete from t") + cli.prepareLoadDataFile(t, path, "1 a", "3 c", "4 e") + dbt.MustExec(fmt.Sprintf("load data local infile %q into table t", path)) + require.NoError(t, rows.Close()) + rows = dbt.MustQuery("select * from t order by id") + cli.checkRows(t, rows, "1 a", "3 c", "4 e") + require.NoError(t, rows.Close()) // Test load data meet duplicate error. - cli.prepareLoadDataFile(c, path, "1 x", "2 b", "2 x", "7 a") - dbt.mustExec(fmt.Sprintf("load data local infile %q into table t", path)) - rows = dbt.mustQuery("show warnings") - cli.checkRows(c, rows, + cli.prepareLoadDataFile(t, path, "1 x", "2 b", "2 x", "7 a") + dbt.MustExec(fmt.Sprintf("load data local infile %q into table t", path)) + rows = dbt.MustQuery("show warnings") + cli.checkRows(t, rows, "Warning 1062 Duplicate entry '1' for key 'idx'", "Warning 1062 Duplicate entry '2' for key 'idx'") - rows = dbt.mustQuery("select * from t order by id") - cli.checkRows(c, rows, "1 a", "2 b", "3 c", "4 e", "7 a") + require.NoError(t, rows.Close()) + rows = dbt.MustQuery("select * from t order by id") + cli.checkRows(t, rows, "1 a", "2 b", "3 c", "4 e", "7 a") // Test load data meet no partition warning. - cli.prepareLoadDataFile(c, path, "5 a", "100 x") - _, err := dbt.db.Exec(fmt.Sprintf("load data local infile %q into table t", path)) - c.Assert(err, IsNil) - rows = dbt.mustQuery("show warnings") - cli.checkRows(c, rows, "Warning 1526 Table has no partition for value 100") - rows = dbt.mustQuery("select * from t order by id") - cli.checkRows(c, rows, "1 a", "2 b", "3 c", "4 e", "5 a", "7 a") + cli.prepareLoadDataFile(t, path, "5 a", "100 x") + _, err := dbt.GetDB().Exec(fmt.Sprintf("load data local infile %q into table t", path)) + require.NoError(t, err) + rows = dbt.MustQuery("show warnings") + cli.checkRows(t, rows, "Warning 1526 Table has no partition for value 100") + require.NoError(t, rows.Close()) + rows = dbt.MustQuery("select * from t order by id") + cli.checkRows(t, rows, "1 a", "2 b", "3 c", "4 e", "5 a", "7 a") + require.NoError(t, rows.Close()) }) } -func (cli *testServerClient) runTestLoadDataForListPartition2(c *C) { +func (cli *testServerClient) runTestLoadDataForListPartition2(t *testing.T) { path := "/tmp/load_data_list_partition.csv" defer func() { _ = os.Remove(path) }() - cli.runTestsOnNewDB(c, func(config *mysql.Config) { + cli.runTestsOnNewDB(t, func(config *mysql.Config) { config.AllowAllFiles = true config.Params["sql_mode"] = "''" - }, "load_data_list_partition", func(dbt *DBTest) { - dbt.mustExec("set @@session.tidb_enable_list_partition = ON") - dbt.mustExec(`create table t (id int, name varchar(10),b int generated always as (length(name)+1) virtual, + }, "load_data_list_partition", func(dbt *testkit.DBTestKit) { + dbt.MustExec("set @@session.tidb_enable_list_partition = ON") + dbt.MustExec(`create table t (id int, name varchar(10),b int generated always as (length(name)+1) virtual, unique index idx (id,b)) partition by list (id*2 + b*b + b*b - b*b*2 - abs(id)) ( partition p0 values in (3,5,6,9,17), partition p1 values in (1,2,10,11,19,20), @@ -710,48 +663,54 @@ func (cli *testServerClient) runTestLoadDataForListPartition2(c *C) { partition p3 values in (7,8,15,16,null) );`) // Test load data into 1 partition. - cli.prepareLoadDataFile(c, path, "1 a", "2 b") - dbt.mustExec(fmt.Sprintf("load data local infile %q into table t (id,name)", path)) - rows := dbt.mustQuery("select id,name from t partition(p1) order by id") - cli.checkRows(c, rows, "1 a", "2 b") + cli.prepareLoadDataFile(t, path, "1 a", "2 b") + dbt.MustExec(fmt.Sprintf("load data local infile %q into table t (id,name)", path)) + rows := dbt.MustQuery("select id,name from t partition(p1) order by id") + cli.checkRows(t, rows, "1 a", "2 b") // Test load data into multi-partitions. - dbt.mustExec("delete from t") - cli.prepareLoadDataFile(c, path, "1 a", "3 c", "4 e") - dbt.mustExec(fmt.Sprintf("load data local infile %q into table t (id,name)", path)) - rows = dbt.mustQuery("select id,name from t order by id") - cli.checkRows(c, rows, "1 a", "3 c", "4 e") + dbt.MustExec("delete from t") + cli.prepareLoadDataFile(t, path, "1 a", "3 c", "4 e") + dbt.MustExec(fmt.Sprintf("load data local infile %q into table t (id,name)", path)) + require.NoError(t, rows.Close()) + rows = dbt.MustQuery("select id,name from t order by id") + cli.checkRows(t, rows, "1 a", "3 c", "4 e") // Test load data meet duplicate error. - cli.prepareLoadDataFile(c, path, "1 x", "2 b", "2 x", "7 a") - dbt.mustExec(fmt.Sprintf("load data local infile %q into table t (id,name)", path)) - rows = dbt.mustQuery("show warnings") - cli.checkRows(c, rows, + cli.prepareLoadDataFile(t, path, "1 x", "2 b", "2 x", "7 a") + require.NoError(t, rows.Close()) + dbt.MustExec(fmt.Sprintf("load data local infile %q into table t (id,name)", path)) + rows = dbt.MustQuery("show warnings") + cli.checkRows(t, rows, "Warning 1062 Duplicate entry '1-2' for key 'idx'", "Warning 1062 Duplicate entry '2-2' for key 'idx'") - rows = dbt.mustQuery("select id,name from t order by id") - cli.checkRows(c, rows, "1 a", "2 b", "3 c", "4 e", "7 a") + require.NoError(t, rows.Close()) + rows = dbt.MustQuery("select id,name from t order by id") + cli.checkRows(t, rows, "1 a", "2 b", "3 c", "4 e", "7 a") + require.NoError(t, rows.Close()) // Test load data meet no partition warning. - cli.prepareLoadDataFile(c, path, "5 a", "100 x") - _, err := dbt.db.Exec(fmt.Sprintf("load data local infile %q into table t (id,name)", path)) - c.Assert(err, IsNil) - rows = dbt.mustQuery("show warnings") - cli.checkRows(c, rows, "Warning 1526 Table has no partition for value 100") - rows = dbt.mustQuery("select id,name from t order by id") - cli.checkRows(c, rows, "1 a", "2 b", "3 c", "4 e", "5 a", "7 a") + cli.prepareLoadDataFile(t, path, "5 a", "100 x") + _, err := dbt.GetDB().Exec(fmt.Sprintf("load data local infile %q into table t (id,name)", path)) + require.NoError(t, err) + rows = dbt.MustQuery("show warnings") + cli.checkRows(t, rows, "Warning 1526 Table has no partition for value 100") + require.NoError(t, rows.Close()) + rows = dbt.MustQuery("select id,name from t order by id") + cli.checkRows(t, rows, "1 a", "2 b", "3 c", "4 e", "5 a", "7 a") + require.NoError(t, rows.Close()) }) } -func (cli *testServerClient) runTestLoadDataForListColumnPartition(c *C) { +func (cli *testServerClient) runTestLoadDataForListColumnPartition(t *testing.T) { path := "/tmp/load_data_list_partition.csv" defer func() { _ = os.Remove(path) }() - cli.runTestsOnNewDB(c, func(config *mysql.Config) { + cli.runTestsOnNewDB(t, func(config *mysql.Config) { config.AllowAllFiles = true config.Params["sql_mode"] = "''" - }, "load_data_list_partition", func(dbt *DBTest) { - dbt.mustExec("set @@session.tidb_enable_list_partition = ON") - dbt.mustExec(`create table t (id int, name varchar(10), + }, "load_data_list_partition", func(dbt *testkit.DBTestKit) { + dbt.MustExec("set @@session.tidb_enable_list_partition = ON") + dbt.MustExec(`create table t (id int, name varchar(10), unique index idx (id)) partition by list columns (id) ( partition p0 values in (3,5,6,9,17), partition p1 values in (1,2,10,11,19,20), @@ -759,96 +718,109 @@ func (cli *testServerClient) runTestLoadDataForListColumnPartition(c *C) { partition p3 values in (7,8,15,16,null) );`) // Test load data into 1 partition. - cli.prepareLoadDataFile(c, path, "1 a", "2 b") - dbt.mustExec(fmt.Sprintf("load data local infile %q into table t", path)) - rows := dbt.mustQuery("select * from t partition(p1) order by id") - cli.checkRows(c, rows, "1 a", "2 b") + cli.prepareLoadDataFile(t, path, "1 a", "2 b") + dbt.MustExec(fmt.Sprintf("load data local infile %q into table t", path)) + rows := dbt.MustQuery("select * from t partition(p1) order by id") + cli.checkRows(t, rows, "1 a", "2 b") // Test load data into multi-partitions. - dbt.mustExec("delete from t") - cli.prepareLoadDataFile(c, path, "1 a", "3 c", "4 e") - dbt.mustExec(fmt.Sprintf("load data local infile %q into table t", path)) - rows = dbt.mustQuery("select * from t order by id") - cli.checkRows(c, rows, "1 a", "3 c", "4 e") + dbt.MustExec("delete from t") + cli.prepareLoadDataFile(t, path, "1 a", "3 c", "4 e") + dbt.MustExec(fmt.Sprintf("load data local infile %q into table t", path)) + require.NoError(t, rows.Close()) + rows = dbt.MustQuery("select * from t order by id") + cli.checkRows(t, rows, "1 a", "3 c", "4 e") + require.NoError(t, rows.Close()) // Test load data meet duplicate error. - cli.prepareLoadDataFile(c, path, "1 x", "2 b", "2 x", "7 a") - dbt.mustExec(fmt.Sprintf("load data local infile %q into table t", path)) - rows = dbt.mustQuery("show warnings") - cli.checkRows(c, rows, + cli.prepareLoadDataFile(t, path, "1 x", "2 b", "2 x", "7 a") + dbt.MustExec(fmt.Sprintf("load data local infile %q into table t", path)) + rows = dbt.MustQuery("show warnings") + cli.checkRows(t, rows, "Warning 1062 Duplicate entry '1' for key 'idx'", "Warning 1062 Duplicate entry '2' for key 'idx'") - rows = dbt.mustQuery("select * from t order by id") - cli.checkRows(c, rows, "1 a", "2 b", "3 c", "4 e", "7 a") + require.NoError(t, rows.Close()) + rows = dbt.MustQuery("select * from t order by id") + cli.checkRows(t, rows, "1 a", "2 b", "3 c", "4 e", "7 a") // Test load data meet no partition warning. - cli.prepareLoadDataFile(c, path, "5 a", "100 x") - _, err := dbt.db.Exec(fmt.Sprintf("load data local infile %q into table t", path)) - c.Assert(err, IsNil) - rows = dbt.mustQuery("show warnings") - cli.checkRows(c, rows, "Warning 1526 Table has no partition for value from column_list") - rows = dbt.mustQuery("select id,name from t order by id") - cli.checkRows(c, rows, "1 a", "2 b", "3 c", "4 e", "5 a", "7 a") + cli.prepareLoadDataFile(t, path, "5 a", "100 x") + _, err := dbt.GetDB().Exec(fmt.Sprintf("load data local infile %q into table t", path)) + require.NoError(t, err) + require.NoError(t, rows.Close()) + rows = dbt.MustQuery("show warnings") + cli.checkRows(t, rows, "Warning 1526 Table has no partition for value from column_list") + require.NoError(t, rows.Close()) + rows = dbt.MustQuery("select id,name from t order by id") + cli.checkRows(t, rows, "1 a", "2 b", "3 c", "4 e", "5 a", "7 a") + require.NoError(t, rows.Close()) }) } -func (cli *testServerClient) runTestLoadDataForListColumnPartition2(c *C) { +func (cli *testServerClient) runTestLoadDataForListColumnPartition2(t *testing.T) { path := "/tmp/load_data_list_partition.csv" defer func() { _ = os.Remove(path) }() - cli.runTestsOnNewDB(c, func(config *mysql.Config) { + cli.runTestsOnNewDB(t, func(config *mysql.Config) { config.AllowAllFiles = true config.Params["sql_mode"] = "''" - }, "load_data_list_partition", func(dbt *DBTest) { - dbt.mustExec("set @@session.tidb_enable_list_partition = ON") - dbt.mustExec(`create table t (location varchar(10), id int, a int, unique index idx (location,id)) partition by list columns (location,id) ( + }, "load_data_list_partition", func(dbt *testkit.DBTestKit) { + dbt.MustExec("set @@session.tidb_enable_list_partition = ON") + dbt.MustExec(`create table t (location varchar(10), id int, a int, unique index idx (location,id)) partition by list columns (location,id) ( partition p_west values in (('w', 1),('w', 2),('w', 3),('w', 4)), partition p_east values in (('e', 5),('e', 6),('e', 7),('e', 8)), partition p_north values in (('n', 9),('n',10),('n',11),('n',12)), partition p_south values in (('s',13),('s',14),('s',15),('s',16)) );`) // Test load data into 1 partition. - cli.prepareLoadDataFile(c, path, "w 1 1", "w 2 2") - dbt.mustExec(fmt.Sprintf("load data local infile %q into table t", path)) - rows := dbt.mustQuery("select * from t partition(p_west) order by id") - cli.checkRows(c, rows, "w 1 1", "w 2 2") + cli.prepareLoadDataFile(t, path, "w 1 1", "w 2 2") + dbt.MustExec(fmt.Sprintf("load data local infile %q into table t", path)) + rows := dbt.MustQuery("select * from t partition(p_west) order by id") + cli.checkRows(t, rows, "w 1 1", "w 2 2") // Test load data into multi-partitions. - dbt.mustExec("delete from t") - cli.prepareLoadDataFile(c, path, "w 1 1", "e 5 5", "n 9 9") - dbt.mustExec(fmt.Sprintf("load data local infile %q into table t", path)) - rows = dbt.mustQuery("select * from t order by id") - cli.checkRows(c, rows, "w 1 1", "e 5 5", "n 9 9") + dbt.MustExec("delete from t") + cli.prepareLoadDataFile(t, path, "w 1 1", "e 5 5", "n 9 9") + dbt.MustExec(fmt.Sprintf("load data local infile %q into table t", path)) + require.NoError(t, rows.Close()) + rows = dbt.MustQuery("select * from t order by id") + cli.checkRows(t, rows, "w 1 1", "e 5 5", "n 9 9") // Test load data meet duplicate error. - cli.prepareLoadDataFile(c, path, "w 1 2", "w 2 2") - _, err := dbt.db.Exec(fmt.Sprintf("load data local infile %q into table t", path)) - c.Assert(err, IsNil) - rows = dbt.mustQuery("show warnings") - cli.checkRows(c, rows, "Warning 1062 Duplicate entry 'w-1' for key 'idx'") - rows = dbt.mustQuery("select * from t order by id") - cli.checkRows(c, rows, "w 1 1", "w 2 2", "e 5 5", "n 9 9") + cli.prepareLoadDataFile(t, path, "w 1 2", "w 2 2") + _, err := dbt.GetDB().Exec(fmt.Sprintf("load data local infile %q into table t", path)) + require.NoError(t, err) + require.NoError(t, rows.Close()) + rows = dbt.MustQuery("show warnings") + cli.checkRows(t, rows, "Warning 1062 Duplicate entry 'w-1' for key 'idx'") + require.NoError(t, rows.Close()) + rows = dbt.MustQuery("select * from t order by id") + cli.checkRows(t, rows, "w 1 1", "w 2 2", "e 5 5", "n 9 9") // Test load data meet no partition warning. - cli.prepareLoadDataFile(c, path, "w 3 3", "w 5 5", "e 8 8") - _, err = dbt.db.Exec(fmt.Sprintf("load data local infile %q into table t", path)) - c.Assert(err, IsNil) - rows = dbt.mustQuery("show warnings") - cli.checkRows(c, rows, "Warning 1526 Table has no partition for value from column_list") - cli.prepareLoadDataFile(c, path, "x 1 1", "w 1 1") - _, err = dbt.db.Exec(fmt.Sprintf("load data local infile %q into table t", path)) - c.Assert(err, IsNil) - rows = dbt.mustQuery("show warnings") - cli.checkRows(c, rows, + cli.prepareLoadDataFile(t, path, "w 3 3", "w 5 5", "e 8 8") + _, err = dbt.GetDB().Exec(fmt.Sprintf("load data local infile %q into table t", path)) + require.NoError(t, err) + require.NoError(t, rows.Close()) + rows = dbt.MustQuery("show warnings") + cli.checkRows(t, rows, "Warning 1526 Table has no partition for value from column_list") + cli.prepareLoadDataFile(t, path, "x 1 1", "w 1 1") + _, err = dbt.GetDB().Exec(fmt.Sprintf("load data local infile %q into table t", path)) + require.NoError(t, err) + require.NoError(t, rows.Close()) + rows = dbt.MustQuery("show warnings") + cli.checkRows(t, rows, "Warning 1526 Table has no partition for value from column_list", "Warning 1062 Duplicate entry 'w-1' for key 'idx'") - rows = dbt.mustQuery("select * from t order by id") - cli.checkRows(c, rows, "w 1 1", "w 2 2", "w 3 3", "e 5 5", "e 8 8", "n 9 9") + require.NoError(t, rows.Close()) + rows = dbt.MustQuery("select * from t order by id") + cli.checkRows(t, rows, "w 1 1", "w 2 2", "w 3 3", "e 5 5", "e 8 8", "n 9 9") + require.NoError(t, rows.Close()) }) } -func (cli *testServerClient) checkRows(c *C, rows *sql.Rows, expectedRows ...string) { +func (cli *testServerClient) Rows(t *testing.T, rows *sql.Rows) []string { buf := bytes.NewBuffer(nil) result := make([]string, 0, 2) for rows.Next() { cols, err := rows.Columns() - c.Assert(err, IsNil) + require.NoError(t, err) rawResult := make([][]byte, len(cols)) dest := make([]interface{}, len(cols)) for i := range rawResult { @@ -856,7 +828,7 @@ func (cli *testServerClient) checkRows(c *C, rows *sql.Rows, expectedRows ...str } err = rows.Scan(dest...) - c.Assert(err, IsNil) + require.NoError(t, err) buf.Reset() for i, raw := range rawResult { if i > 0 { @@ -870,20 +842,25 @@ func (cli *testServerClient) checkRows(c *C, rows *sql.Rows, expectedRows ...str } result = append(result, buf.String()) } - c.Assert(strings.Join(result, "\n"), Equals, strings.Join(expectedRows, "\n")) + return result +} + +func (cli *testServerClient) checkRows(t *testing.T, rows *sql.Rows, expectedRows ...string) { + result := cli.Rows(t, rows) + require.Equal(t, strings.Join(expectedRows, "\n"), strings.Join(result, "\n")) } -func (cli *testServerClient) runTestLoadData(c *C, server *Server) { +func (cli *testServerClient) runTestLoadData(t *testing.T, server *Server) { // create a file and write data. path := "/tmp/load_data_test.csv" fp, err := os.Create(path) - c.Assert(err, IsNil) - c.Assert(fp, NotNil) + require.NoError(t, err) + require.NotNil(t, fp) defer func() { err = fp.Close() - c.Assert(err, IsNil) + require.NoError(t, err) err = os.Remove(path) - c.Assert(err, IsNil) + require.NoError(t, err) }() _, err = fp.WriteString("\n" + "xxx row1_col1 - row1_col2 1abc\n" + @@ -891,7 +868,7 @@ func (cli *testServerClient) runTestLoadData(c *C, server *Server) { "xxxy row3_col1 - row3_col2 \n" + "xxx row4_col1 - 900\n" + "xxx row5_col1 - row5_col3") - c.Assert(err, IsNil) + require.NoError(t, err) originalTxnTotalSizeLimit := kv.TxnTotalSizeLimit // If the MemBuffer can't be committed once in each batch, it will return an error like "transaction is too large". @@ -899,650 +876,654 @@ func (cli *testServerClient) runTestLoadData(c *C, server *Server) { defer func() { kv.TxnTotalSizeLimit = originalTxnTotalSizeLimit }() // support ClientLocalFiles capability - cli.runTestsOnNewDB(c, func(config *mysql.Config) { + cli.runTestsOnNewDB(t, func(config *mysql.Config) { config.AllowAllFiles = true config.Params["sql_mode"] = "''" - }, "LoadData", func(dbt *DBTest) { - dbt.mustExec("set @@tidb_dml_batch_size = 3") - dbt.mustExec("create table test (a varchar(255), b varchar(255) default 'default value', c int not null auto_increment, primary key(c))") - dbt.mustExec("create view v1 as select 1") - dbt.mustExec("create sequence s1") + }, "LoadData", func(dbt *testkit.DBTestKit) { + dbt.MustExec("set @@tidb_dml_batch_size = 3") + dbt.MustExec("create table test (a varchar(255), b varchar(255) default 'default value', c int not null auto_increment, primary key(c))") + dbt.MustExec("create view v1 as select 1") + dbt.MustExec("create sequence s1") // can't insert into views (in TiDB) or sequences. issue #20880 - _, err = dbt.db.Exec("load data local infile '/tmp/load_data_test.csv' into table v1") - dbt.Assert(err, NotNil) - dbt.Assert(err.Error(), Equals, "Error 1105: can only load data into base tables") - _, err = dbt.db.Exec("load data local infile '/tmp/load_data_test.csv' into table s1") - dbt.Assert(err, NotNil) - dbt.Assert(err.Error(), Equals, "Error 1105: can only load data into base tables") - - rs, err1 := dbt.db.Exec("load data local infile '/tmp/load_data_test.csv' into table test") - dbt.Assert(err1, IsNil) + _, err = dbt.GetDB().Exec("load data local infile '/tmp/load_data_test.csv' into table v1") + require.Error(t, err) + require.Equal(t, "Error 1105: can only load data into base tables", err.Error()) + _, err = dbt.GetDB().Exec("load data local infile '/tmp/load_data_test.csv' into table s1") + require.Error(t, err) + require.Equal(t, "Error 1105: can only load data into base tables", err.Error()) + + rs, err1 := dbt.GetDB().Exec("load data local infile '/tmp/load_data_test.csv' into table test") + require.NoError(t, err1) lastID, err1 := rs.LastInsertId() - dbt.Assert(err1, IsNil) - dbt.Assert(lastID, Equals, int64(1)) + require.NoError(t, err1) + require.Equal(t, int64(1), lastID) affectedRows, err1 := rs.RowsAffected() - dbt.Assert(err1, IsNil) - dbt.Assert(affectedRows, Equals, int64(5)) + require.NoError(t, err1) + require.Equal(t, int64(5), affectedRows) var ( a string b string bb sql.NullString cc int ) - rows := dbt.mustQuery("select * from test") - dbt.Check(rows.Next(), IsTrue, Commentf("unexpected data")) + rows := dbt.MustQuery("select * from test") + require.Truef(t, rows.Next(), "unexpected data") err = rows.Scan(&a, &bb, &cc) - dbt.Check(err, IsNil) - dbt.Check(a, DeepEquals, "") - dbt.Check(bb.String, DeepEquals, "") - dbt.Check(cc, DeepEquals, 1) - dbt.Check(rows.Next(), IsTrue, Commentf("unexpected data")) + require.NoError(t, err) + require.Empty(t, a) + require.Empty(t, bb.String) + require.Equal(t, 1, cc) + require.Truef(t, rows.Next(), "unexpected data") err = rows.Scan(&a, &b, &cc) - c.Assert(err, IsNil) - dbt.Check(a, DeepEquals, "xxx row2_col1") - dbt.Check(b, DeepEquals, "- row2_col2") - dbt.Check(cc, DeepEquals, 2) - dbt.Check(rows.Next(), IsTrue, Commentf("unexpected data")) + require.NoError(t, err) + require.Equal(t, "xxx row2_col1", a) + require.Equal(t, "- row2_col2", b) + require.Equal(t, 2, cc) + require.Truef(t, rows.Next(), "unexpected data") err = rows.Scan(&a, &b, &cc) - c.Assert(err, IsNil) - dbt.Check(a, DeepEquals, "xxxy row3_col1") - dbt.Check(b, DeepEquals, "- row3_col2") - dbt.Check(cc, DeepEquals, 3) - dbt.Check(rows.Next(), IsTrue, Commentf("unexpected data")) + require.NoError(t, err) + require.Equal(t, "xxxy row3_col1", a) + require.Equal(t, "- row3_col2", b) + require.Equal(t, 3, cc) + require.Truef(t, rows.Next(), "unexpected data") err = rows.Scan(&a, &b, &cc) - c.Assert(err, IsNil) - dbt.Check(a, DeepEquals, "xxx row4_col1") - dbt.Check(b, DeepEquals, "- ") - dbt.Check(cc, DeepEquals, 4) - dbt.Check(rows.Next(), IsTrue, Commentf("unexpected data")) + require.NoError(t, err) + require.Equal(t, "xxx row4_col1", a) + require.Equal(t, "- ", b) + require.Equal(t, 4, cc) + require.Truef(t, rows.Next(), "unexpected data") err = rows.Scan(&a, &b, &cc) - c.Assert(err, IsNil) - dbt.Check(a, DeepEquals, "xxx row5_col1") - dbt.Check(b, DeepEquals, "- ") - dbt.Check(cc, DeepEquals, 5) - dbt.Check(rows.Next(), IsFalse, Commentf("unexpected data")) - rows.Close() + require.NoError(t, err) + require.Equal(t, "xxx row5_col1", a) + require.Equal(t, "- ", b) + require.Equal(t, 5, cc) + require.Falsef(t, rows.Next(), "unexpected data") + require.NoError(t, rows.Close()) // specify faileds and lines - dbt.mustExec("delete from test") - dbt.mustExec("set @@tidb_dml_batch_size = 3") - rs, err = dbt.db.Exec("load data local infile '/tmp/load_data_test.csv' into table test fields terminated by '\t- ' lines starting by 'xxx ' terminated by '\n'") - dbt.Assert(err, IsNil) + dbt.MustExec("delete from test") + dbt.MustExec("set @@tidb_dml_batch_size = 3") + rs, err = dbt.GetDB().Exec("load data local infile '/tmp/load_data_test.csv' into table test fields terminated by '\t- ' lines starting by 'xxx ' terminated by '\n'") + require.NoError(t, err) lastID, err = rs.LastInsertId() - dbt.Assert(err, IsNil) - dbt.Assert(lastID, Equals, int64(6)) + require.NoError(t, err) + require.Equal(t, int64(6), lastID) affectedRows, err = rs.RowsAffected() - dbt.Assert(err, IsNil) - dbt.Assert(affectedRows, Equals, int64(4)) - rows = dbt.mustQuery("select * from test") - dbt.Check(rows.Next(), IsTrue, Commentf("unexpected data")) + require.NoError(t, err) + require.Equal(t, int64(4), affectedRows) + rows = dbt.MustQuery("select * from test") + require.Truef(t, rows.Next(), "unexpected data") err = rows.Scan(&a, &b, &cc) - c.Assert(err, IsNil) - dbt.Check(a, DeepEquals, "row1_col1") - dbt.Check(b, DeepEquals, "row1_col2\t1abc") - dbt.Check(cc, DeepEquals, 6) - dbt.Check(rows.Next(), IsTrue, Commentf("unexpected data")) + require.NoError(t, err) + require.Equal(t, "row1_col1", a) + require.Equal(t, "row1_col2\t1abc", b) + require.Equal(t, 6, cc) + require.Truef(t, rows.Next(), "unexpected data") err = rows.Scan(&a, &b, &cc) - c.Assert(err, IsNil) - dbt.Check(a, DeepEquals, "row2_col1") - dbt.Check(b, DeepEquals, "row2_col2\t") - dbt.Check(cc, DeepEquals, 7) - dbt.Check(rows.Next(), IsTrue, Commentf("unexpected data")) + require.NoError(t, err) + require.Equal(t, "row2_col1", a) + require.Equal(t, "row2_col2\t", b) + require.Equal(t, 7, cc) + require.Truef(t, rows.Next(), "unexpected data") err = rows.Scan(&a, &b, &cc) - c.Assert(err, IsNil) - dbt.Check(a, DeepEquals, "row4_col1") - dbt.Check(b, DeepEquals, "\t\t900") - dbt.Check(cc, DeepEquals, 8) - dbt.Check(rows.Next(), IsTrue, Commentf("unexpected data")) + require.NoError(t, err) + require.Equal(t, "row4_col1", a) + require.Equal(t, "\t\t900", b) + require.Equal(t, 8, cc) + require.Truef(t, rows.Next(), "unexpected data") err = rows.Scan(&a, &b, &cc) - c.Assert(err, IsNil) - dbt.Check(a, DeepEquals, "row5_col1") - dbt.Check(b, DeepEquals, "\trow5_col3") - dbt.Check(cc, DeepEquals, 9) - dbt.Check(rows.Next(), IsFalse, Commentf("unexpected data")) - + require.NoError(t, err) + require.Equal(t, "row5_col1", a) + require.Equal(t, "\trow5_col3", b) + require.Equal(t, 9, cc) + require.Falsef(t, rows.Next(), "unexpected data") + require.NoError(t, rows.Close()) // infile size more than a packet size(16K) - dbt.mustExec("delete from test") + dbt.MustExec("delete from test") _, err = fp.WriteString("\n") - dbt.Assert(err, IsNil) + require.NoError(t, err) for i := 6; i <= 800; i++ { _, err = fp.WriteString(fmt.Sprintf("xxx row%d_col1 - row%d_col2\n", i, i)) - dbt.Assert(err, IsNil) + require.NoError(t, err) } - dbt.mustExec("set @@tidb_dml_batch_size = 3") - rs, err = dbt.db.Exec("load data local infile '/tmp/load_data_test.csv' into table test fields terminated by '\t- ' lines starting by 'xxx ' terminated by '\n'") - dbt.Assert(err, IsNil) + dbt.MustExec("set @@tidb_dml_batch_size = 3") + rs, err = dbt.GetDB().Exec("load data local infile '/tmp/load_data_test.csv' into table test fields terminated by '\t- ' lines starting by 'xxx ' terminated by '\n'") + require.NoError(t, err) lastID, err = rs.LastInsertId() - dbt.Assert(err, IsNil) - dbt.Assert(lastID, Equals, int64(10)) + require.NoError(t, err) + require.Equal(t, int64(10), lastID) affectedRows, err = rs.RowsAffected() - dbt.Assert(err, IsNil) - dbt.Assert(affectedRows, Equals, int64(799)) - rows = dbt.mustQuery("select * from test") - dbt.Check(rows.Next(), IsTrue, Commentf("unexpected data")) - + require.NoError(t, err) + require.Equal(t, int64(799), affectedRows) + rows = dbt.MustQuery("select * from test") + require.Truef(t, rows.Next(), "unexpected data") + require.NoError(t, rows.Close()) // don't support lines terminated is "" - dbt.mustExec("set @@tidb_dml_batch_size = 3") - _, err = dbt.db.Exec("load data local infile '/tmp/load_data_test.csv' into table test lines terminated by ''") - dbt.Assert(err, NotNil) + dbt.MustExec("set @@tidb_dml_batch_size = 3") + _, err = dbt.GetDB().Exec("load data local infile '/tmp/load_data_test.csv' into table test lines terminated by ''") + require.NotNil(t, err) // infile doesn't exist - dbt.mustExec("set @@tidb_dml_batch_size = 3") - _, err = dbt.db.Exec("load data local infile '/tmp/nonexistence.csv' into table test") - dbt.Assert(err, NotNil) + dbt.MustExec("set @@tidb_dml_batch_size = 3") + _, err = dbt.GetDB().Exec("load data local infile '/tmp/nonexistence.csv' into table test") + require.NotNil(t, err) }) err = fp.Close() - c.Assert(err, IsNil) + require.NoError(t, err) err = os.Remove(path) - c.Assert(err, IsNil) + require.NoError(t, err) fp, err = os.Create(path) - c.Assert(err, IsNil) - c.Assert(fp, NotNil) + require.NoError(t, err) + require.NotNil(t, fp) // Test mixed unenclosed and enclosed fields. _, err = fp.WriteString( "\"abc\",123\n" + "def,456,\n" + "hig,\"789\",") - c.Assert(err, IsNil) + require.NoError(t, err) - cli.runTestsOnNewDB(c, func(config *mysql.Config) { + cli.runTestsOnNewDB(t, func(config *mysql.Config) { config.AllowAllFiles = true config.Params["sql_mode"] = "''" - }, "LoadData", func(dbt *DBTest) { - dbt.mustExec("create table test (str varchar(10) default null, i int default null)") - dbt.mustExec("set @@tidb_dml_batch_size = 3") - _, err1 := dbt.db.Exec(`load data local infile '/tmp/load_data_test.csv' into table test FIELDS TERMINATED BY ',' enclosed by '"'`) - dbt.Assert(err1, IsNil) + }, "LoadData", func(dbt *testkit.DBTestKit) { + dbt.MustExec("create table test (str varchar(10) default null, i int default null)") + dbt.MustExec("set @@tidb_dml_batch_size = 3") + _, err1 := dbt.GetDB().Exec(`load data local infile '/tmp/load_data_test.csv' into table test FIELDS TERMINATED BY ',' enclosed by '"'`) + require.NoError(t, err1) var ( str string id int ) - rows := dbt.mustQuery("select * from test") - dbt.Check(rows.Next(), IsTrue, Commentf("unexpected data")) + rows := dbt.MustQuery("select * from test") + require.Truef(t, rows.Next(), "unexpected data") err = rows.Scan(&str, &id) - dbt.Check(err, IsNil) - dbt.Check(str, DeepEquals, "abc") - dbt.Check(id, DeepEquals, 123) - dbt.Check(rows.Next(), IsTrue, Commentf("unexpected data")) + require.NoError(t, err) + require.Equal(t, "abc", str) + require.Equal(t, 123, id) + require.Truef(t, rows.Next(), "unexpected data") err = rows.Scan(&str, &id) - c.Assert(err, IsNil) - dbt.Check(str, DeepEquals, "def") - dbt.Check(id, DeepEquals, 456) - dbt.Check(rows.Next(), IsTrue, Commentf("unexpected data")) + require.NoError(t, err) + require.Equal(t, "def", str) + require.Equal(t, 456, id) + require.Truef(t, rows.Next(), "unexpected data") err = rows.Scan(&str, &id) - c.Assert(err, IsNil) - dbt.Check(str, DeepEquals, "hig") - dbt.Check(id, DeepEquals, 789) - dbt.Check(rows.Next(), IsFalse, Commentf("unexpected data")) - dbt.mustExec("delete from test") + require.NoError(t, err) + require.Equal(t, "hig", str) + require.Equal(t, 789, id) + require.Falsef(t, rows.Next(), "unexpected data") + dbt.MustExec("delete from test") + require.NoError(t, rows.Close()) }) err = fp.Close() - c.Assert(err, IsNil) + require.NoError(t, err) err = os.Remove(path) - c.Assert(err, IsNil) + require.NoError(t, err) fp, err = os.Create(path) - c.Assert(err, IsNil) - c.Assert(fp, NotNil) + require.NoError(t, err) + require.NotNil(t, fp) // Test irregular csv file. _, err = fp.WriteString( `,\N,NULL,,` + "\n" + "00,0,000000,,\n" + `2003-03-03, 20030303,030303,\N` + "\n") - c.Assert(err, IsNil) + require.NoError(t, err) - cli.runTestsOnNewDB(c, func(config *mysql.Config) { + cli.runTestsOnNewDB(t, func(config *mysql.Config) { config.AllowAllFiles = true config.Params["sql_mode"] = "''" - }, "LoadData", func(dbt *DBTest) { - dbt.mustExec("create table test (a date, b date, c date not null, d date)") - dbt.mustExec("set @@tidb_dml_batch_size = 3") - _, err1 := dbt.db.Exec(`load data local infile '/tmp/load_data_test.csv' into table test FIELDS TERMINATED BY ','`) - dbt.Assert(err1, IsNil) + }, "LoadData", func(dbt *testkit.DBTestKit) { + dbt.MustExec("create table test (a date, b date, c date not null, d date)") + dbt.MustExec("set @@tidb_dml_batch_size = 3") + _, err1 := dbt.GetDB().Exec(`load data local infile '/tmp/load_data_test.csv' into table test FIELDS TERMINATED BY ','`) + require.NoError(t, err1) var ( a sql.NullString b sql.NullString d sql.NullString c sql.NullString ) - rows := dbt.mustQuery("select * from test") - dbt.Check(rows.Next(), IsTrue, Commentf("unexpected data")) + rows := dbt.MustQuery("select * from test") + require.Truef(t, rows.Next(), "unexpected data") err = rows.Scan(&a, &b, &c, &d) - dbt.Check(err, IsNil) - dbt.Check(a.String, Equals, "0000-00-00") - dbt.Check(b.String, Equals, "") - dbt.Check(c.String, Equals, "0000-00-00") - dbt.Check(d.String, Equals, "0000-00-00") - dbt.Check(rows.Next(), IsTrue, Commentf("unexpected data")) + require.NoError(t, err) + require.Equal(t, "0000-00-00", a.String) + require.Empty(t, b.String) + require.Equal(t, "0000-00-00", c.String) + require.Equal(t, "0000-00-00", d.String) + require.Truef(t, rows.Next(), "unexpected data") err = rows.Scan(&a, &b, &c, &d) - dbt.Check(err, IsNil) - dbt.Check(a.String, Equals, "0000-00-00") - dbt.Check(b.String, Equals, "0000-00-00") - dbt.Check(c.String, Equals, "0000-00-00") - dbt.Check(d.String, Equals, "0000-00-00") - dbt.Check(rows.Next(), IsTrue, Commentf("unexpected data")) + require.NoError(t, err) + require.Equal(t, "0000-00-00", a.String) + require.Equal(t, "0000-00-00", b.String) + require.Equal(t, "0000-00-00", c.String) + require.Equal(t, "0000-00-00", d.String) + require.Truef(t, rows.Next(), "unexpected data") err = rows.Scan(&a, &b, &c, &d) - dbt.Check(err, IsNil) - dbt.Check(a.String, Equals, "2003-03-03") - dbt.Check(b.String, Equals, "2003-03-03") - dbt.Check(c.String, Equals, "2003-03-03") - dbt.Check(d.String, Equals, "") - dbt.Check(rows.Next(), IsFalse, Commentf("unexpected data")) - dbt.mustExec("delete from test") + require.NoError(t, err) + require.Equal(t, "2003-03-03", a.String) + require.Equal(t, "2003-03-03", b.String) + require.Equal(t, "2003-03-03", c.String) + require.Equal(t, "", d.String) + require.Falsef(t, rows.Next(), "unexpected data") + dbt.MustExec("delete from test") + require.NoError(t, rows.Close()) }) err = fp.Close() - c.Assert(err, IsNil) + require.NoError(t, err) err = os.Remove(path) - c.Assert(err, IsNil) + require.NoError(t, err) fp, err = os.Create(path) - c.Assert(err, IsNil) - c.Assert(fp, NotNil) + require.NoError(t, err) + require.NotNil(t, fp) // Test double enclosed. _, err = fp.WriteString( `"field1","field2"` + "\n" + `"a""b","cd""ef"` + "\n" + `"a"b",c"d"e` + "\n") - c.Assert(err, IsNil) + require.NoError(t, err) - cli.runTestsOnNewDB(c, func(config *mysql.Config) { + cli.runTestsOnNewDB(t, func(config *mysql.Config) { config.AllowAllFiles = true config.Params["sql_mode"] = "''" - }, "LoadData", func(dbt *DBTest) { - dbt.mustExec("create table test (a varchar(20), b varchar(20))") - dbt.mustExec("set @@tidb_dml_batch_size = 3") - _, err1 := dbt.db.Exec(`load data local infile '/tmp/load_data_test.csv' into table test FIELDS TERMINATED BY ',' enclosed by '"'`) - dbt.Assert(err1, IsNil) + }, "LoadData", func(dbt *testkit.DBTestKit) { + dbt.MustExec("create table test (a varchar(20), b varchar(20))") + dbt.MustExec("set @@tidb_dml_batch_size = 3") + _, err1 := dbt.GetDB().Exec(`load data local infile '/tmp/load_data_test.csv' into table test FIELDS TERMINATED BY ',' enclosed by '"'`) + require.NoError(t, err1) var ( a sql.NullString b sql.NullString ) - rows := dbt.mustQuery("select * from test") - dbt.Check(rows.Next(), IsTrue, Commentf("unexpected data")) + rows := dbt.MustQuery("select * from test") + require.Truef(t, rows.Next(), "unexpected data") err = rows.Scan(&a, &b) - dbt.Check(err, IsNil) - dbt.Check(a.String, Equals, "field1") - dbt.Check(b.String, Equals, "field2") - dbt.Check(rows.Next(), IsTrue, Commentf("unexpected data")) + require.NoError(t, err) + require.Equal(t, "field1", a.String) + require.Equal(t, "field2", b.String) + require.Truef(t, rows.Next(), "unexpected data") err = rows.Scan(&a, &b) - c.Assert(err, IsNil) - dbt.Check(a.String, Equals, `a"b`) - dbt.Check(b.String, Equals, `cd"ef`) - dbt.Check(rows.Next(), IsTrue, Commentf("unexpected data")) + require.NoError(t, err) + require.Equal(t, `a"b`, a.String) + require.Equal(t, `cd"ef`, b.String) + require.Truef(t, rows.Next(), "unexpected data") err = rows.Scan(&a, &b) - c.Assert(err, IsNil) - dbt.Check(a.String, Equals, `a"b`) - dbt.Check(b.String, Equals, `c"d"e`) - dbt.Check(rows.Next(), IsFalse, Commentf("unexpected data")) - dbt.mustExec("delete from test") + require.NoError(t, err) + require.Equal(t, `a"b`, a.String) + require.Equal(t, `c"d"e`, b.String) + require.Falsef(t, rows.Next(), "unexpected data") + dbt.MustExec("delete from test") + require.NoError(t, rows.Close()) }) err = fp.Close() - c.Assert(err, IsNil) + require.NoError(t, err) err = os.Remove(path) - c.Assert(err, IsNil) + require.NoError(t, err) fp, err = os.Create(path) - c.Assert(err, IsNil) - c.Assert(fp, NotNil) + require.NoError(t, err) + require.NotNil(t, fp) // Test OPTIONALLY _, err = fp.WriteString( `"a,b,c` + "\n" + `"1",2,"3"` + "\n") - c.Assert(err, IsNil) + require.NoError(t, err) - cli.runTestsOnNewDB(c, func(config *mysql.Config) { + cli.runTestsOnNewDB(t, func(config *mysql.Config) { config.AllowAllFiles = true - }, "LoadData", func(dbt *DBTest) { - dbt.mustExec("create table test (id INT NOT NULL PRIMARY KEY, b INT, c varchar(10))") - dbt.mustExec("set @@tidb_dml_batch_size = 3") - _, err1 := dbt.db.Exec(`load data local infile '/tmp/load_data_test.csv' into table test FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' IGNORE 1 LINES`) - dbt.Assert(err1, IsNil) + }, "LoadData", func(dbt *testkit.DBTestKit) { + dbt.MustExec("create table test (id INT NOT NULL PRIMARY KEY, b INT, c varchar(10))") + dbt.MustExec("set @@tidb_dml_batch_size = 3") + _, err1 := dbt.GetDB().Exec(`load data local infile '/tmp/load_data_test.csv' into table test FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' IGNORE 1 LINES`) + require.NoError(t, err1) var ( a int b int c sql.NullString ) - rows := dbt.mustQuery("select * from test") - dbt.Check(rows.Next(), IsTrue, Commentf("unexpected data")) + rows := dbt.MustQuery("select * from test") + require.Truef(t, rows.Next(), "unexpected data") err = rows.Scan(&a, &b, &c) - dbt.Check(err, IsNil) - dbt.Check(a, Equals, 1) - dbt.Check(b, Equals, 2) - dbt.Check(c.String, Equals, "3") - dbt.Check(rows.Next(), IsFalse, Commentf("unexpected data")) - dbt.mustExec("delete from test") + require.NoError(t, err) + require.Equal(t, 1, a) + require.Equal(t, 2, b) + require.Equal(t, "3", c.String) + require.Falsef(t, rows.Next(), "unexpected data") + dbt.MustExec("delete from test") + require.NoError(t, rows.Close()) }) // unsupport ClientLocalFiles capability server.capability ^= tmysql.ClientLocalFiles - cli.runTestsOnNewDB(c, func(config *mysql.Config) { + cli.runTestsOnNewDB(t, func(config *mysql.Config) { config.AllowAllFiles = true - }, "LoadData", func(dbt *DBTest) { - dbt.mustExec("create table test (a varchar(255), b varchar(255) default 'default value', c int not null auto_increment, primary key(c))") - dbt.mustExec("set @@tidb_dml_batch_size = 3") - _, err = dbt.db.Exec("load data local infile '/tmp/load_data_test.csv' into table test") - dbt.Assert(err, NotNil) - checkErrorCode(c, err, errno.ErrNotAllowedCommand) + }, "LoadData", func(dbt *testkit.DBTestKit) { + dbt.MustExec("create table test (a varchar(255), b varchar(255) default 'default value', c int not null auto_increment, primary key(c))") + dbt.MustExec("set @@tidb_dml_batch_size = 3") + _, err = dbt.GetDB().Exec("load data local infile '/tmp/load_data_test.csv' into table test") + require.Error(t, err) + checkErrorCode(t, err, errno.ErrNotAllowedCommand) }) server.capability |= tmysql.ClientLocalFiles err = fp.Close() - c.Assert(err, IsNil) + require.NoError(t, err) err = os.Remove(path) - c.Assert(err, IsNil) + require.NoError(t, err) fp, err = os.Create(path) - c.Assert(err, IsNil) - c.Assert(fp, NotNil) + require.NoError(t, err) + require.NotNil(t, fp) // Test OPTIONALLY _, err = fp.WriteString( `1,2` + "\n" + `3,4` + "\n") - c.Assert(err, IsNil) + require.NoError(t, err) - cli.runTestsOnNewDB(c, func(config *mysql.Config) { + cli.runTestsOnNewDB(t, func(config *mysql.Config) { config.AllowAllFiles = true config.Params["sql_mode"] = "''" - }, "LoadData", func(dbt *DBTest) { - dbt.mustExec("drop table if exists pn") - dbt.mustExec("create table pn (c1 int, c2 int)") - dbt.mustExec("set @@tidb_dml_batch_size = 1") - _, err1 := dbt.db.Exec(`load data local infile '/tmp/load_data_test.csv' into table pn FIELDS TERMINATED BY ','`) - dbt.Assert(err1, IsNil) + }, "LoadData", func(dbt *testkit.DBTestKit) { + dbt.MustExec("drop table if exists pn") + dbt.MustExec("create table pn (c1 int, c2 int)") + dbt.MustExec("set @@tidb_dml_batch_size = 1") + _, err1 := dbt.GetDB().Exec(`load data local infile '/tmp/load_data_test.csv' into table pn FIELDS TERMINATED BY ','`) + require.NoError(t, err1) var ( a int b int ) - rows := dbt.mustQuery("select * from pn") - dbt.Check(rows.Next(), IsTrue, Commentf("unexpected data")) + rows := dbt.MustQuery("select * from pn") + require.Truef(t, rows.Next(), "unexpected data") err = rows.Scan(&a, &b) - dbt.Check(err, IsNil) - dbt.Check(a, Equals, 1) - dbt.Check(b, Equals, 2) - dbt.Check(rows.Next(), IsTrue, Commentf("unexpected data")) + require.NoError(t, err) + require.Equal(t, 1, a) + require.Equal(t, 2, b) + require.Truef(t, rows.Next(), "unexpected data") err = rows.Scan(&a, &b) - dbt.Check(err, IsNil) - dbt.Check(a, Equals, 3) - dbt.Check(b, Equals, 4) - dbt.Check(rows.Next(), IsFalse, Commentf("unexpected data")) - + require.NoError(t, err) + require.Equal(t, 3, a) + require.Equal(t, 4, b) + require.Falsef(t, rows.Next(), "unexpected data") + require.NoError(t, rows.Close()) // fail error processing test - dbt.Assert(failpoint.Enable("github.com/pingcap/tidb/executor/commitOneTaskErr", "return"), IsNil) - _, err1 = dbt.db.Exec(`load data local infile '/tmp/load_data_test.csv' into table pn FIELDS TERMINATED BY ','`) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/executor/commitOneTaskErr", "return")) + _, err1 = dbt.GetDB().Exec(`load data local infile '/tmp/load_data_test.csv' into table pn FIELDS TERMINATED BY ','`) mysqlErr, ok := err1.(*mysql.MySQLError) - dbt.Assert(ok, IsTrue) - dbt.Assert(mysqlErr.Message, Equals, "mock commit one task error") - dbt.Assert(failpoint.Disable("github.com/pingcap/tidb/executor/commitOneTaskErr"), IsNil) + require.True(t, ok) + require.Equal(t, "mock commit one task error", mysqlErr.Message) + require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/executor/commitOneTaskErr")) - dbt.mustExec("drop table if exists pn") + dbt.MustExec("drop table if exists pn") }) err = fp.Close() - c.Assert(err, IsNil) + require.NoError(t, err) err = os.Remove(path) - c.Assert(err, IsNil) + require.NoError(t, err) fp, err = os.Create(path) - c.Assert(err, IsNil) - c.Assert(fp, NotNil) + require.NoError(t, err) + require.NotNil(t, fp) // Test Column List Specification _, err = fp.WriteString( `1,2` + "\n" + `3,4` + "\n") - c.Assert(err, IsNil) + require.NoError(t, err) - cli.runTestsOnNewDB(c, func(config *mysql.Config) { + cli.runTestsOnNewDB(t, func(config *mysql.Config) { config.AllowAllFiles = true config.Params["sql_mode"] = "''" - }, "LoadData", func(dbt *DBTest) { - dbt.mustExec("drop table if exists pn") - dbt.mustExec("create table pn (c1 int, c2 int)") - dbt.mustExec("set @@tidb_dml_batch_size = 1") - _, err1 := dbt.db.Exec(`load data local infile '/tmp/load_data_test.csv' into table pn FIELDS TERMINATED BY ',' (c1, c2)`) - dbt.Assert(err1, IsNil) + }, "LoadData", func(dbt *testkit.DBTestKit) { + dbt.MustExec("drop table if exists pn") + dbt.MustExec("create table pn (c1 int, c2 int)") + dbt.MustExec("set @@tidb_dml_batch_size = 1") + _, err1 := dbt.GetDB().Exec(`load data local infile '/tmp/load_data_test.csv' into table pn FIELDS TERMINATED BY ',' (c1, c2)`) + require.NoError(t, err1) var ( a int b int ) - rows := dbt.mustQuery("select * from pn") - dbt.Check(rows.Next(), IsTrue, Commentf("unexpected data")) + rows := dbt.MustQuery("select * from pn") + require.Truef(t, rows.Next(), "unexpected data") err = rows.Scan(&a, &b) - dbt.Check(err, IsNil) - dbt.Check(a, Equals, 1) - dbt.Check(b, Equals, 2) - dbt.Check(rows.Next(), IsTrue, Commentf("unexpected data")) + require.NoError(t, err) + require.Equal(t, 1, a) + require.Equal(t, 2, b) + require.Truef(t, rows.Next(), "unexpected data") err = rows.Scan(&a, &b) - dbt.Check(err, IsNil) - dbt.Check(a, Equals, 3) - dbt.Check(b, Equals, 4) - dbt.Check(rows.Next(), IsFalse, Commentf("unexpected data")) - - dbt.mustExec("drop table if exists pn") + require.NoError(t, err) + require.Equal(t, 3, a) + require.Equal(t, 4, b) + require.Falsef(t, rows.Next(), "unexpected data") + require.NoError(t, rows.Close()) + dbt.MustExec("drop table if exists pn") }) err = fp.Close() - c.Assert(err, IsNil) + require.NoError(t, err) err = os.Remove(path) - c.Assert(err, IsNil) + require.NoError(t, err) fp, err = os.Create(path) - c.Assert(err, IsNil) - c.Assert(fp, NotNil) + require.NoError(t, err) + require.NotNil(t, fp) // Test Column List Specification _, err = fp.WriteString( `1,2,3` + "\n" + `4,5,6` + "\n") - c.Assert(err, IsNil) + require.NoError(t, err) - cli.runTestsOnNewDB(c, func(config *mysql.Config) { + cli.runTestsOnNewDB(t, func(config *mysql.Config) { config.AllowAllFiles = true config.Params["sql_mode"] = "''" - }, "LoadData", func(dbt *DBTest) { - dbt.mustExec("drop table if exists pn") - dbt.mustExec("create table pn (c1 int, c2 int, c3 int)") - dbt.mustExec("set @@tidb_dml_batch_size = 1") - _, err1 := dbt.db.Exec(`load data local infile '/tmp/load_data_test.csv' into table pn FIELDS TERMINATED BY ',' (c1, @dummy)`) - dbt.Assert(err1, IsNil) + }, "LoadData", func(dbt *testkit.DBTestKit) { + dbt.MustExec("drop table if exists pn") + dbt.MustExec("create table pn (c1 int, c2 int, c3 int)") + dbt.MustExec("set @@tidb_dml_batch_size = 1") + _, err1 := dbt.GetDB().Exec(`load data local infile '/tmp/load_data_test.csv' into table pn FIELDS TERMINATED BY ',' (c1, @dummy)`) + require.NoError(t, err1) var ( a int b sql.NullString c sql.NullString ) - rows := dbt.mustQuery("select * from pn") - dbt.Check(rows.Next(), IsTrue, Commentf("unexpected data")) + rows := dbt.MustQuery("select * from pn") + require.Truef(t, rows.Next(), "unexpected data") err = rows.Scan(&a, &b, &c) - dbt.Check(err, IsNil) - dbt.Check(a, Equals, 1) - dbt.Check(b.String, Equals, "") - dbt.Check(c.String, Equals, "") - dbt.Check(rows.Next(), IsTrue, Commentf("unexpected data")) + require.NoError(t, err) + require.Equal(t, 1, a) + require.Empty(t, b.String) + require.Empty(t, c.String) + require.Truef(t, rows.Next(), "unexpected data") err = rows.Scan(&a, &b, &c) - dbt.Check(err, IsNil) - dbt.Check(a, Equals, 4) - dbt.Check(b.String, Equals, "") - dbt.Check(c.String, Equals, "") - dbt.Check(rows.Next(), IsFalse, Commentf("unexpected data")) - - dbt.mustExec("drop table if exists pn") + require.NoError(t, err) + require.Equal(t, 4, a) + require.Empty(t, b.String) + require.Empty(t, c.String) + require.Falsef(t, rows.Next(), "unexpected data") + require.NoError(t, rows.Close()) + dbt.MustExec("drop table if exists pn") }) err = fp.Close() - c.Assert(err, IsNil) + require.NoError(t, err) err = os.Remove(path) - c.Assert(err, IsNil) + require.NoError(t, err) fp, err = os.Create(path) - c.Assert(err, IsNil) - c.Assert(fp, NotNil) + require.NoError(t, err) + require.NotNil(t, fp) // Test Input Preprocessing _, err = fp.WriteString( `1,2,3` + "\n" + `4,5,6` + "\n") - c.Assert(err, IsNil) + require.NoError(t, err) - cli.runTestsOnNewDB(c, func(config *mysql.Config) { + cli.runTestsOnNewDB(t, func(config *mysql.Config) { config.AllowAllFiles = true config.Params["sql_mode"] = "''" - }, "LoadData", func(dbt *DBTest) { - dbt.mustExec("drop table if exists pn") - dbt.mustExec("create table pn (c1 int, c2 int, c3 int)") - dbt.mustExec("set @@tidb_dml_batch_size = 1") - _, err1 := dbt.db.Exec(`load data local infile '/tmp/load_data_test.csv' into table pn FIELDS TERMINATED BY ',' (c1, @val1, @val2) SET c3 = @val2 * 100, c2 = CAST(@val1 AS UNSIGNED)`) - dbt.Assert(err1, IsNil) + }, "LoadData", func(dbt *testkit.DBTestKit) { + dbt.MustExec("drop table if exists pn") + dbt.MustExec("create table pn (c1 int, c2 int, c3 int)") + dbt.MustExec("set @@tidb_dml_batch_size = 1") + _, err1 := dbt.GetDB().Exec(`load data local infile '/tmp/load_data_test.csv' into table pn FIELDS TERMINATED BY ',' (c1, @val1, @val2) SET c3 = @val2 * 100, c2 = CAST(@val1 AS UNSIGNED)`) + require.NoError(t, err1) var ( a int b int c int ) - rows := dbt.mustQuery("select * from pn") - dbt.Check(rows.Next(), IsTrue, Commentf("unexpected data")) + rows := dbt.MustQuery("select * from pn") + require.Truef(t, rows.Next(), "unexpected data") err = rows.Scan(&a, &b, &c) - dbt.Check(err, IsNil) - dbt.Check(a, Equals, 1) - dbt.Check(b, Equals, 2) - dbt.Check(c, Equals, 300) - dbt.Check(rows.Next(), IsTrue, Commentf("unexpected data")) + require.NoError(t, err) + require.Equal(t, 1, a) + require.Equal(t, 2, b) + require.Equal(t, 300, c) + require.Truef(t, rows.Next(), "unexpected data") err = rows.Scan(&a, &b, &c) - dbt.Check(err, IsNil) - dbt.Check(a, Equals, 4) - dbt.Check(b, Equals, 5) - dbt.Check(c, Equals, 600) - dbt.Check(rows.Next(), IsFalse, Commentf("unexpected data")) - - dbt.mustExec("drop table if exists pn") + require.NoError(t, err) + require.Equal(t, 4, a) + require.Equal(t, 5, b) + require.Equal(t, 600, c) + require.Falsef(t, rows.Next(), "unexpected data") + require.NoError(t, rows.Close()) + dbt.MustExec("drop table if exists pn") }) } -func (cli *testServerClient) runTestConcurrentUpdate(c *C) { +func (cli *testServerClient) runTestConcurrentUpdate(t *testing.T) { dbName := "Concurrent" - cli.runTestsOnNewDB(c, func(config *mysql.Config) { + cli.runTestsOnNewDB(t, func(config *mysql.Config) { config.Params["sql_mode"] = "''" - }, dbName, func(dbt *DBTest) { - dbt.mustExec("drop table if exists test2") - dbt.mustExec("create table test2 (a int, b int)") - dbt.mustExec("insert test2 values (1, 1)") - dbt.mustExec("set @@tidb_disable_txn_auto_retry = 0") - - txn1, err := dbt.db.Begin() - c.Assert(err, IsNil) + }, dbName, func(dbt *testkit.DBTestKit) { + dbt.MustExec("drop table if exists test2") + dbt.MustExec("create table test2 (a int, b int)") + dbt.MustExec("insert test2 values (1, 1)") + dbt.MustExec("set @@tidb_disable_txn_auto_retry = 0") + + txn1, err := dbt.GetDB().Begin() + require.NoError(t, err) _, err = txn1.Exec(fmt.Sprintf("USE `%s`;", dbName)) - c.Assert(err, IsNil) + require.NoError(t, err) - txn2, err := dbt.db.Begin() - c.Assert(err, IsNil) + txn2, err := dbt.GetDB().Begin() + require.NoError(t, err) _, err = txn2.Exec(fmt.Sprintf("USE `%s`;", dbName)) - c.Assert(err, IsNil) + require.NoError(t, err) _, err = txn2.Exec("update test2 set a = a + 1 where b = 1") - c.Assert(err, IsNil) + require.NoError(t, err) err = txn2.Commit() - c.Assert(err, IsNil) + require.NoError(t, err) _, err = txn1.Exec("update test2 set a = a + 1 where b = 1") - c.Assert(err, IsNil) + require.NoError(t, err) err = txn1.Commit() - c.Assert(err, IsNil) + require.NoError(t, err) }) } -func (cli *testServerClient) runTestExplainForConn(c *C) { - cli.runTestsOnNewDB(c, nil, "explain_for_conn", func(dbt *DBTest) { - dbt.mustExec("drop table if exists t") - dbt.mustExec("create table t (a int key, b int)") - dbt.mustExec("insert t values (1, 1)") - rows := dbt.mustQuery("select connection_id();") - c.Assert(rows.Next(), IsTrue) +func (cli *testServerClient) runTestExplainForConn(t *testing.T) { + cli.runTestsOnNewDB(t, nil, "explain_for_conn", func(dbt *testkit.DBTestKit) { + dbt.MustExec("drop table if exists t") + dbt.MustExec("create table t (a int key, b int)") + dbt.MustExec("insert t values (1, 1)") + rows := dbt.MustQuery("select connection_id();") + require.True(t, rows.Next()) var connID int64 err := rows.Scan(&connID) - c.Assert(err, IsNil) - c.Assert(rows.Close(), IsNil) - dbt.mustQuery("select * from t where a=1") - rows = dbt.mustQuery("explain for connection " + strconv.Itoa(int(connID))) - c.Assert(rows.Next(), IsTrue) + require.NoError(t, err) + require.NoError(t, rows.Close()) + dbt.MustQuery("select * from t where a=1") + rows = dbt.MustQuery("explain for connection " + strconv.Itoa(int(connID))) + require.True(t, rows.Next()) row := make([]string, 9) err = rows.Scan(&row[0], &row[1], &row[2], &row[3], &row[4], &row[5], &row[6], &row[7], &row[8]) - c.Assert(err, IsNil) - c.Assert(strings.Join(row, ","), Matches, "Point_Get_1,1.00,1,root,table:t,time.*loop.*handle:1.*") - c.Assert(rows.Close(), IsNil) + require.NoError(t, err) + require.Regexp(t, "^Point_Get_1,1.00,1,root,table:t,time.*loop.*handle:1", strings.Join(row, ",")) + require.NoError(t, rows.Close()) }) } -func (cli *testServerClient) runTestErrorCode(c *C) { - cli.runTestsOnNewDB(c, nil, "ErrorCode", func(dbt *DBTest) { - dbt.mustExec("create table test (c int PRIMARY KEY);") - dbt.mustExec("insert into test values (1);") - txn1, err := dbt.db.Begin() - c.Assert(err, IsNil) +func (cli *testServerClient) runTestErrorCode(t *testing.T) { + cli.runTestsOnNewDB(t, nil, "ErrorCode", func(dbt *testkit.DBTestKit) { + dbt.MustExec("create table test (c int PRIMARY KEY);") + dbt.MustExec("insert into test values (1);") + txn1, err := dbt.GetDB().Begin() + require.NoError(t, err) _, err = txn1.Exec("insert into test values(1)") - c.Assert(err, IsNil) + require.NoError(t, err) err = txn1.Commit() - checkErrorCode(c, err, errno.ErrDupEntry) + checkErrorCode(t, err, errno.ErrDupEntry) // Schema errors - txn2, err := dbt.db.Begin() - c.Assert(err, IsNil) + txn2, err := dbt.GetDB().Begin() + require.NoError(t, err) _, err = txn2.Exec("use db_not_exists;") - checkErrorCode(c, err, errno.ErrBadDB) + checkErrorCode(t, err, errno.ErrBadDB) _, err = txn2.Exec("select * from tbl_not_exists;") - checkErrorCode(c, err, errno.ErrNoSuchTable) + checkErrorCode(t, err, errno.ErrNoSuchTable) _, err = txn2.Exec("create database test;") // Make tests stable. Some times the error may be the ErrInfoSchemaChanged. - checkErrorCode(c, err, errno.ErrDBCreateExists, errno.ErrInfoSchemaChanged) + checkErrorCode(t, err, errno.ErrDBCreateExists, errno.ErrInfoSchemaChanged) _, err = txn2.Exec("create database aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;") - checkErrorCode(c, err, errno.ErrTooLongIdent, errno.ErrInfoSchemaChanged) + checkErrorCode(t, err, errno.ErrTooLongIdent, errno.ErrInfoSchemaChanged) _, err = txn2.Exec("create table test (c int);") - checkErrorCode(c, err, errno.ErrTableExists, errno.ErrInfoSchemaChanged) + checkErrorCode(t, err, errno.ErrTableExists, errno.ErrInfoSchemaChanged) _, err = txn2.Exec("drop table unknown_table;") - checkErrorCode(c, err, errno.ErrBadTable, errno.ErrInfoSchemaChanged) + checkErrorCode(t, err, errno.ErrBadTable, errno.ErrInfoSchemaChanged) _, err = txn2.Exec("drop database unknown_db;") - checkErrorCode(c, err, errno.ErrDBDropExists, errno.ErrInfoSchemaChanged) + checkErrorCode(t, err, errno.ErrDBDropExists, errno.ErrInfoSchemaChanged) _, err = txn2.Exec("create table aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa (a int);") - checkErrorCode(c, err, errno.ErrTooLongIdent, errno.ErrInfoSchemaChanged) + checkErrorCode(t, err, errno.ErrTooLongIdent, errno.ErrInfoSchemaChanged) _, err = txn2.Exec("create table long_column_table (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa int);") - checkErrorCode(c, err, errno.ErrTooLongIdent, errno.ErrInfoSchemaChanged) + checkErrorCode(t, err, errno.ErrTooLongIdent, errno.ErrInfoSchemaChanged) _, err = txn2.Exec("alter table test add aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa int;") - checkErrorCode(c, err, errno.ErrTooLongIdent, errno.ErrInfoSchemaChanged) + checkErrorCode(t, err, errno.ErrTooLongIdent, errno.ErrInfoSchemaChanged) // Optimizer errors _, err = txn2.Exec("select *, * from test;") - checkErrorCode(c, err, errno.ErrInvalidWildCard) + checkErrorCode(t, err, errno.ErrInvalidWildCard) _, err = txn2.Exec("select row(1, 2) > 1;") - checkErrorCode(c, err, errno.ErrOperandColumns) + checkErrorCode(t, err, errno.ErrOperandColumns) _, err = txn2.Exec("select * from test order by row(c, c);") - checkErrorCode(c, err, errno.ErrOperandColumns) + checkErrorCode(t, err, errno.ErrOperandColumns) // Variable errors _, err = txn2.Exec("select @@unknown_sys_var;") - checkErrorCode(c, err, errno.ErrUnknownSystemVariable) + checkErrorCode(t, err, errno.ErrUnknownSystemVariable) _, err = txn2.Exec("set @@unknown_sys_var='1';") - checkErrorCode(c, err, errno.ErrUnknownSystemVariable) + checkErrorCode(t, err, errno.ErrUnknownSystemVariable) // Expression errors _, err = txn2.Exec("select greatest(2);") - checkErrorCode(c, err, errno.ErrWrongParamcountToNativeFct) + checkErrorCode(t, err, errno.ErrWrongParamcountToNativeFct) }) } -func checkErrorCode(c *C, e error, codes ...uint16) { +func checkErrorCode(t *testing.T, e error, codes ...uint16) { me, ok := e.(*mysql.MySQLError) - c.Assert(ok, IsTrue, Commentf("err: %v", e)) + require.Truef(t, ok, "err: %v", e) if len(codes) == 1 { - c.Assert(me.Number, Equals, codes[0]) + require.Equal(t, codes[0], me.Number) } isMatchCode := false for _, code := range codes { @@ -1551,341 +1532,334 @@ func checkErrorCode(c *C, e error, codes ...uint16) { break } } - c.Assert(isMatchCode, IsTrue, Commentf("got err %v, expected err codes %v", me, codes)) + require.Truef(t, isMatchCode, "got err %v, expected err codes %v", me, codes) } -func (cli *testServerClient) runTestAuth(c *C) { - cli.runTests(c, nil, func(dbt *DBTest) { - dbt.mustExec(`CREATE USER 'authtest'@'%' IDENTIFIED BY '123';`) - dbt.mustExec(`CREATE ROLE 'authtest_r1'@'%';`) - dbt.mustExec(`GRANT ALL on test.* to 'authtest'`) - dbt.mustExec(`GRANT authtest_r1 to 'authtest'`) - dbt.mustExec(`SET DEFAULT ROLE authtest_r1 TO authtest`) +func (cli *testServerClient) runTestAuth(t *testing.T) { + cli.runTests(t, nil, func(dbt *testkit.DBTestKit) { + dbt.MustExec(`CREATE USER 'authtest'@'%' IDENTIFIED BY '123';`) + dbt.MustExec(`CREATE ROLE 'authtest_r1'@'%';`) + dbt.MustExec(`GRANT ALL on test.* to 'authtest'`) + dbt.MustExec(`GRANT authtest_r1 to 'authtest'`) + dbt.MustExec(`SET DEFAULT ROLE authtest_r1 TO authtest`) }) - cli.runTests(c, func(config *mysql.Config) { + cli.runTests(t, func(config *mysql.Config) { config.User = "authtest" config.Passwd = "123" - }, func(dbt *DBTest) { - dbt.mustExec(`USE information_schema;`) + }, func(dbt *testkit.DBTestKit) { + dbt.MustExec(`USE information_schema;`) }) db, err := sql.Open("mysql", cli.getDSN(func(config *mysql.Config) { config.User = "authtest" config.Passwd = "456" })) - c.Assert(err, IsNil) - _, err = db.Query("USE information_schema;") - c.Assert(err, NotNil, Commentf("Wrong password should be failed")) - err = db.Close() - c.Assert(err, IsNil) + require.NoError(t, err) + _, err = db.Exec("USE information_schema;") + require.NotNilf(t, err, "Wrong password should be failed") + require.NoError(t, db.Close()) // Test for loading active roles. db, err = sql.Open("mysql", cli.getDSN(func(config *mysql.Config) { config.User = "authtest" config.Passwd = "123" })) - c.Assert(err, IsNil) + require.NoError(t, err) rows, err := db.Query("select current_role;") - c.Assert(err, IsNil) - c.Assert(rows.Next(), IsTrue) + require.NoError(t, err) + require.True(t, rows.Next()) var outA string err = rows.Scan(&outA) - c.Assert(err, IsNil) - c.Assert(outA, Equals, "`authtest_r1`@`%`") + require.NoError(t, err) + require.NoError(t, rows.Close()) + require.Equal(t, "`authtest_r1`@`%`", outA) err = db.Close() - c.Assert(err, IsNil) + require.NoError(t, err) // Test login use IP that not exists in mysql.user. - cli.runTests(c, nil, func(dbt *DBTest) { - dbt.mustExec(`CREATE USER 'authtest2'@'localhost' IDENTIFIED BY '123';`) - dbt.mustExec(`GRANT ALL on test.* to 'authtest2'@'localhost'`) + cli.runTests(t, nil, func(dbt *testkit.DBTestKit) { + dbt.MustExec(`CREATE USER 'authtest2'@'localhost' IDENTIFIED BY '123';`) + dbt.MustExec(`GRANT ALL on test.* to 'authtest2'@'localhost'`) }) - cli.runTests(c, func(config *mysql.Config) { + cli.runTests(t, func(config *mysql.Config) { config.User = "authtest2" config.Passwd = "123" - }, func(dbt *DBTest) { - dbt.mustExec(`USE information_schema;`) + }, func(dbt *testkit.DBTestKit) { + dbt.MustExec(`USE information_schema;`) }) } -func (cli *testServerClient) runTestIssue3662(c *C) { +func (cli *testServerClient) runTestIssue3662(t *testing.T) { db, err := sql.Open("mysql", cli.getDSN(func(config *mysql.Config) { config.DBName = "non_existing_schema" })) - c.Assert(err, IsNil) + require.NoError(t, err) defer func() { err := db.Close() - c.Assert(err, IsNil) + require.NoError(t, err) }() // According to documentation, "Open may just validate its arguments without // creating a connection to the database. To verify that the data source name // is valid, call Ping." err = db.Ping() - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "Error 1049: Unknown database 'non_existing_schema'") + require.Error(t, err) + require.Equal(t, "Error 1049: Unknown database 'non_existing_schema'", err.Error()) } -func (cli *testServerClient) runTestIssue3680(c *C) { +func (cli *testServerClient) runTestIssue3680(t *testing.T) { db, err := sql.Open("mysql", cli.getDSN(func(config *mysql.Config) { config.User = "non_existing_user" })) - c.Assert(err, IsNil) + require.NoError(t, err) defer func() { err := db.Close() - c.Assert(err, IsNil) + require.NoError(t, err) }() // According to documentation, "Open may just validate its arguments without // creating a connection to the database. To verify that the data source name // is valid, call Ping." err = db.Ping() - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "Error 1045: Access denied for user 'non_existing_user'@'127.0.0.1' (using password: NO)") + require.Error(t, err) + require.Equal(t, "Error 1045: Access denied for user 'non_existing_user'@'127.0.0.1' (using password: NO)", err.Error()) } -func (cli *testServerClient) runTestIssue22646(c *C) { - cli.runTests(c, nil, func(dbt *DBTest) { - c1 := make(chan string, 1) - go func() { - dbt.mustExec(``) // empty query. - c1 <- "success" - }() - select { - case res := <-c1: - fmt.Println(res) - case <-time.After(30 * time.Second): - panic("read empty query statement timed out.") +func (cli *testServerClient) runTestIssue22646(t *testing.T) { + cli.runTests(t, nil, func(dbt *testkit.DBTestKit) { + now := time.Now() + dbt.MustExec(``) + if time.Since(now) > 30*time.Second { + t.Fatal("read empty query statement timed out.") } }) } -func (cli *testServerClient) runTestIssue3682(c *C) { - cli.runTests(c, nil, func(dbt *DBTest) { - dbt.mustExec(`CREATE USER 'issue3682'@'%' IDENTIFIED BY '123';`) - dbt.mustExec(`GRANT ALL on test.* to 'issue3682'`) - dbt.mustExec(`GRANT ALL on mysql.* to 'issue3682'`) +func (cli *testServerClient) runTestIssue3682(t *testing.T) { + cli.runTests(t, nil, func(dbt *testkit.DBTestKit) { + dbt.MustExec(`CREATE USER 'issue3682'@'%' IDENTIFIED BY '123';`) + dbt.MustExec(`GRANT ALL on test.* to 'issue3682'`) + dbt.MustExec(`GRANT ALL on mysql.* to 'issue3682'`) }) - cli.runTests(c, func(config *mysql.Config) { + cli.runTests(t, func(config *mysql.Config) { config.User = "issue3682" config.Passwd = "123" - }, func(dbt *DBTest) { - dbt.mustExec(`USE mysql;`) + }, func(dbt *testkit.DBTestKit) { + dbt.MustExec(`USE mysql;`) }) db, err := sql.Open("mysql", cli.getDSN(func(config *mysql.Config) { config.User = "issue3682" config.Passwd = "wrong_password" config.DBName = "non_existing_schema" })) - c.Assert(err, IsNil) + require.NoError(t, err) defer func() { err := db.Close() - c.Assert(err, IsNil) + require.NoError(t, err) }() err = db.Ping() - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "Error 1045: Access denied for user 'issue3682'@'127.0.0.1' (using password: YES)") + require.Error(t, err) + require.Equal(t, "Error 1045: Access denied for user 'issue3682'@'127.0.0.1' (using password: YES)", err.Error()) } -func (cli *testServerClient) runTestDBNameEscape(c *C) { - cli.runTests(c, nil, func(dbt *DBTest) { - dbt.mustExec("CREATE DATABASE `aa-a`;") +func (cli *testServerClient) runTestDBNameEscape(t *testing.T) { + cli.runTests(t, nil, func(dbt *testkit.DBTestKit) { + dbt.MustExec("CREATE DATABASE `aa-a`;") }) - cli.runTests(c, func(config *mysql.Config) { + cli.runTests(t, func(config *mysql.Config) { config.DBName = "aa-a" - }, func(dbt *DBTest) { - dbt.mustExec(`USE mysql;`) - dbt.mustExec("DROP DATABASE `aa-a`") + }, func(dbt *testkit.DBTestKit) { + dbt.MustExec(`USE mysql;`) + dbt.MustExec("DROP DATABASE `aa-a`") }) } -func (cli *testServerClient) runTestResultFieldTableIsNull(c *C) { - cli.runTestsOnNewDB(c, func(config *mysql.Config) { +func (cli *testServerClient) runTestResultFieldTableIsNull(t *testing.T) { + cli.runTestsOnNewDB(t, func(config *mysql.Config) { config.Params["sql_mode"] = "''" - }, "ResultFieldTableIsNull", func(dbt *DBTest) { - dbt.mustExec("drop table if exists test;") - dbt.mustExec("create table test (c int);") - dbt.mustExec("explain select * from test;") + }, "ResultFieldTableIsNull", func(dbt *testkit.DBTestKit) { + dbt.MustExec("drop table if exists test;") + dbt.MustExec("create table test (c int);") + dbt.MustExec("explain select * from test;") }) } -func (cli *testServerClient) runTestStatusAPI(c *C) { +func (cli *testServerClient) runTestStatusAPI(t *testing.T) { resp, err := cli.fetchStatus("/status") - c.Assert(err, IsNil) + require.NoError(t, err) defer resp.Body.Close() decoder := json.NewDecoder(resp.Body) var data status err = decoder.Decode(&data) - c.Assert(err, IsNil) - c.Assert(data.Version, Equals, tmysql.ServerVersion) - c.Assert(data.GitHash, Equals, versioninfo.TiDBGitHash) + require.NoError(t, err) + require.Equal(t, tmysql.ServerVersion, data.Version) + require.Equal(t, versioninfo.TiDBGitHash, data.GitHash) } // The golang sql driver (and most drivers) should have multi-statement // disabled by default for security reasons. Lets ensure that the behavior // is correct. -func (cli *testServerClient) runFailedTestMultiStatements(c *C) { - cli.runTestsOnNewDB(c, nil, "FailedMultiStatements", func(dbt *DBTest) { +func (cli *testServerClient) runFailedTestMultiStatements(t *testing.T) { + cli.runTestsOnNewDB(t, nil, "FailedMultiStatements", func(dbt *testkit.DBTestKit) { // Default is now OFF in new installations. // It is still WARN in upgrade installations (for now) - _, err := dbt.db.Exec("SELECT 1; SELECT 1; SELECT 2; SELECT 3;") - c.Assert(err.Error(), Equals, "Error 8130: client has multi-statement capability disabled. Run SET GLOBAL tidb_multi_statement_mode='ON' after you understand the security risk") + _, err := dbt.GetDB().Exec("SELECT 1; SELECT 1; SELECT 2; SELECT 3;") + require.Equal(t, "Error 8130: client has multi-statement capability disabled. Run SET GLOBAL tidb_multi_statement_mode='ON' after you understand the security risk", err.Error()) // Change to WARN (legacy mode) - dbt.mustExec("SET tidb_multi_statement_mode='WARN'") - dbt.mustExec("CREATE TABLE `test` (`id` int(11) NOT NULL, `value` int(11) NOT NULL) ") - res := dbt.mustExec("INSERT INTO test VALUES (1, 1)") + dbt.MustExec("SET tidb_multi_statement_mode='WARN'") + dbt.MustExec("CREATE TABLE `test` (`id` int(11) NOT NULL, `value` int(11) NOT NULL) ") + res := dbt.MustExec("INSERT INTO test VALUES (1, 1)") count, err := res.RowsAffected() - c.Assert(err, IsNil, Commentf("res.RowsAffected() returned error")) - c.Assert(count, Equals, int64(1)) - res = dbt.mustExec("UPDATE test SET value = 3 WHERE id = 1; UPDATE test SET value = 4 WHERE id = 1; UPDATE test SET value = 5 WHERE id = 1;") + require.NoErrorf(t, err, "res.RowsAffected() returned error") + require.Equal(t, int64(1), count) + res = dbt.MustExec("UPDATE test SET value = 3 WHERE id = 1; UPDATE test SET value = 4 WHERE id = 1; UPDATE test SET value = 5 WHERE id = 1;") count, err = res.RowsAffected() - c.Assert(err, IsNil, Commentf("res.RowsAffected() returned error")) - c.Assert(count, Equals, int64(1)) - rows := dbt.mustQuery("show warnings") - cli.checkRows(c, rows, "Warning 8130 client has multi-statement capability disabled. Run SET GLOBAL tidb_multi_statement_mode='ON' after you understand the security risk") + require.NoErrorf(t, err, "res.RowsAffected() returned error") + require.Equal(t, int64(1), count) + rows := dbt.MustQuery("show warnings") + cli.checkRows(t, rows, "Warning 8130 client has multi-statement capability disabled. Run SET GLOBAL tidb_multi_statement_mode='ON' after you understand the security risk") var out int - rows = dbt.mustQuery("SELECT value FROM test WHERE id=1;") + rows = dbt.MustQuery("SELECT value FROM test WHERE id=1;") if rows.Next() { err = rows.Scan(&out) - c.Assert(err, IsNil) - c.Assert(out, Equals, 5) + require.NoError(t, err) + require.Equal(t, 5, out) if rows.Next() { - dbt.Error("unexpected data") + require.Fail(t, "unexpected data") } } else { - dbt.Error("no data") + require.Fail(t, "no data") } // Change to ON = Fully supported, TiDB legacy. No warnings or Errors. - dbt.mustExec("SET tidb_multi_statement_mode='ON';") - dbt.mustExec("DROP TABLE IF EXISTS test") - dbt.mustExec("CREATE TABLE `test` (`id` int(11) NOT NULL, `value` int(11) NOT NULL) ") - res = dbt.mustExec("INSERT INTO test VALUES (1, 1)") + dbt.MustExec("SET tidb_multi_statement_mode='ON';") + dbt.MustExec("DROP TABLE IF EXISTS test") + dbt.MustExec("CREATE TABLE `test` (`id` int(11) NOT NULL, `value` int(11) NOT NULL) ") + res = dbt.MustExec("INSERT INTO test VALUES (1, 1)") count, err = res.RowsAffected() - c.Assert(err, IsNil, Commentf("res.RowsAffected() returned error")) - c.Assert(count, Equals, int64(1)) - res = dbt.mustExec("update test SET value = 3 WHERE id = 1; UPDATE test SET value = 4 WHERE id = 1; UPDATE test SET value = 5 WHERE id = 1;") + require.NoErrorf(t, err, "res.RowsAffected() returned error") + require.Equal(t, int64(1), count) + res = dbt.MustExec("update test SET value = 3 WHERE id = 1; UPDATE test SET value = 4 WHERE id = 1; UPDATE test SET value = 5 WHERE id = 1;") count, err = res.RowsAffected() - c.Assert(err, IsNil, Commentf("res.RowsAffected() returned error")) - c.Assert(count, Equals, int64(1)) - rows = dbt.mustQuery("SELECT value FROM test WHERE id=1;") + require.NoErrorf(t, err, "res.RowsAffected() returned error") + require.Equal(t, int64(1), count) + rows = dbt.MustQuery("SELECT value FROM test WHERE id=1;") if rows.Next() { err = rows.Scan(&out) - c.Assert(err, IsNil) - c.Assert(out, Equals, 5) + require.NoError(t, err) + require.Equal(t, 5, out) if rows.Next() { - dbt.Error("unexpected data") + require.Fail(t, "unexpected data") } } else { - dbt.Error("no data") + require.Fail(t, "no data") } - }) } -func (cli *testServerClient) runTestMultiStatements(c *C) { +func (cli *testServerClient) runTestMultiStatements(t *testing.T) { - cli.runTestsOnNewDB(c, func(config *mysql.Config) { + cli.runTestsOnNewDB(t, func(config *mysql.Config) { config.Params["multiStatements"] = "true" - }, "MultiStatements", func(dbt *DBTest) { + }, "MultiStatements", func(dbt *testkit.DBTestKit) { // Create Table - dbt.mustExec("CREATE TABLE `test` (`id` int(11) NOT NULL, `value` int(11) NOT NULL) ") + dbt.MustExec("CREATE TABLE `test` (`id` int(11) NOT NULL, `value` int(11) NOT NULL) ") // Create Data - res := dbt.mustExec("INSERT INTO test VALUES (1, 1)") + res := dbt.MustExec("INSERT INTO test VALUES (1, 1)") count, err := res.RowsAffected() - c.Assert(err, IsNil, Commentf("res.RowsAffected() returned error")) - c.Assert(count, Equals, int64(1)) + require.NoErrorf(t, err, "res.RowsAffected() returned error") + require.Equal(t, int64(1), count) // Update - res = dbt.mustExec("UPDATE test SET value = 3 WHERE id = 1; UPDATE test SET value = 4 WHERE id = 1; UPDATE test SET value = 5 WHERE id = 1;") + res = dbt.MustExec("UPDATE test SET value = 3 WHERE id = 1; UPDATE test SET value = 4 WHERE id = 1; UPDATE test SET value = 5 WHERE id = 1;") count, err = res.RowsAffected() - c.Assert(err, IsNil, Commentf("res.RowsAffected() returned error")) - c.Assert(count, Equals, int64(1)) + require.NoErrorf(t, err, "res.RowsAffected() returned error") + require.Equal(t, int64(1), count) // Read var out int - rows := dbt.mustQuery("SELECT value FROM test WHERE id=1;") + rows := dbt.MustQuery("SELECT value FROM test WHERE id=1;") if rows.Next() { err = rows.Scan(&out) - c.Assert(err, IsNil) - c.Assert(out, Equals, 5) + require.NoError(t, err) + require.Equal(t, 5, out) if rows.Next() { - dbt.Error("unexpected data") + require.Fail(t, "unexpected data") } } else { - dbt.Error("no data") + require.Fail(t, "no data") } // Test issue #26688 // First we "reset" the CurrentDB by using a database and then dropping it. - dbt.mustExec("CREATE DATABASE dropme") - dbt.mustExec("USE dropme") - dbt.mustExec("DROP DATABASE dropme") + dbt.MustExec("CREATE DATABASE dropme") + dbt.MustExec("USE dropme") + dbt.MustExec("DROP DATABASE dropme") var usedb string - rows = dbt.mustQuery("SELECT IFNULL(DATABASE(),'success')") + rows = dbt.MustQuery("SELECT IFNULL(DATABASE(),'success')") if rows.Next() { err = rows.Scan(&usedb) - c.Assert(err, IsNil) - c.Assert(usedb, Equals, "success") + require.NoError(t, err) + require.Equal(t, "success", usedb) } else { - dbt.Error("no database() result") + require.Fail(t, "no database() result") } // Because no DB is selected, if the use multistmtuse is not successful, then // the create table + drop table statements will return errors. - dbt.mustExec("CREATE DATABASE multistmtuse") - dbt.mustExec("use multistmtuse; create table if not exists t1 (id int); drop table t1;") + dbt.MustExec("CREATE DATABASE multistmtuse") + dbt.MustExec("use multistmtuse; create table if not exists t1 (id int); drop table t1;") }) } -func (cli *testServerClient) runTestStmtCount(t *C) { - cli.runTestsOnNewDB(t, nil, "StatementCount", func(dbt *DBTest) { +func (cli *testServerClient) runTestStmtCount(t *testing.T) { + cli.runTestsOnNewDB(t, nil, "StatementCount", func(dbt *testkit.DBTestKit) { originStmtCnt := getStmtCnt(string(cli.getMetrics(t))) - dbt.mustExec("create table test (a int)") + dbt.MustExec("create table test (a int)") - dbt.mustExec("insert into test values(1)") - dbt.mustExec("insert into test values(2)") - dbt.mustExec("insert into test values(3)") - dbt.mustExec("insert into test values(4)") - dbt.mustExec("insert into test values(5)") + dbt.MustExec("insert into test values(1)") + dbt.MustExec("insert into test values(2)") + dbt.MustExec("insert into test values(3)") + dbt.MustExec("insert into test values(4)") + dbt.MustExec("insert into test values(5)") - dbt.mustExec("delete from test where a = 3") - dbt.mustExec("update test set a = 2 where a = 1") - dbt.mustExec("select * from test") - dbt.mustExec("select 2") + dbt.MustExec("delete from test where a = 3") + dbt.MustExec("update test set a = 2 where a = 1") + dbt.MustExec("select * from test") + dbt.MustExec("select 2") - dbt.mustExec("prepare stmt1 from 'update test set a = 1 where a = 2'") - dbt.mustExec("execute stmt1") - dbt.mustExec("prepare stmt2 from 'select * from test'") - dbt.mustExec("execute stmt2") - dbt.mustExec("replace into test(a) values(6);") + dbt.MustExec("prepare stmt1 from 'update test set a = 1 where a = 2'") + dbt.MustExec("execute stmt1") + dbt.MustExec("prepare stmt2 from 'select * from test'") + dbt.MustExec("execute stmt2") + dbt.MustExec("replace into test(a) values(6);") currentStmtCnt := getStmtCnt(string(cli.getMetrics(t))) - t.Assert(currentStmtCnt["CreateTable"], Equals, originStmtCnt["CreateTable"]+1) - t.Assert(currentStmtCnt["Insert"], Equals, originStmtCnt["Insert"]+5) - t.Assert(currentStmtCnt["Delete"], Equals, originStmtCnt["Delete"]+1) - t.Assert(currentStmtCnt["Update"], Equals, originStmtCnt["Update"]+1) - t.Assert(currentStmtCnt["Select"], Equals, originStmtCnt["Select"]+2) - t.Assert(currentStmtCnt["Prepare"], Equals, originStmtCnt["Prepare"]+2) - t.Assert(currentStmtCnt["Execute"], Equals, originStmtCnt["Execute"]+2) - t.Assert(currentStmtCnt["Replace"], Equals, originStmtCnt["Replace"]+1) + require.Equal(t, originStmtCnt["CreateTable"]+1, currentStmtCnt["CreateTable"]) + require.Equal(t, originStmtCnt["Insert"]+5, currentStmtCnt["Insert"]) + require.Equal(t, originStmtCnt["Delete"]+1, currentStmtCnt["Delete"]) + require.Equal(t, originStmtCnt["Update"]+1, currentStmtCnt["Update"]) + require.Equal(t, originStmtCnt["Select"]+2, currentStmtCnt["Select"]) + require.Equal(t, originStmtCnt["Prepare"]+2, currentStmtCnt["Prepare"]) + require.Equal(t, originStmtCnt["Execute"]+2, currentStmtCnt["Execute"]) + require.Equal(t, originStmtCnt["Replace"]+1, currentStmtCnt["Replace"]) }) } -func (cli *testServerClient) runTestTLSConnection(t *C, overrider configOverrider) error { +func (cli *testServerClient) runTestTLSConnection(t *testing.T, overrider configOverrider) error { dsn := cli.getDSN(overrider) db, err := sql.Open("mysql", dsn) - t.Assert(err, IsNil) + require.NoError(t, err) defer func() { err := db.Close() - t.Assert(err, IsNil) + require.NoError(t, err) }() _, err = db.Exec("USE test") if err != nil { @@ -1894,12 +1868,12 @@ func (cli *testServerClient) runTestTLSConnection(t *C, overrider configOverride return err } -func (cli *testServerClient) runReloadTLS(t *C, overrider configOverrider, errorNoRollback bool) error { +func (cli *testServerClient) runReloadTLS(t *testing.T, overrider configOverrider, errorNoRollback bool) error { db, err := sql.Open("mysql", cli.getDSN(overrider)) - t.Assert(err, IsNil) + require.NoError(t, err) defer func() { err := db.Close() - t.Assert(err, IsNil) + require.NoError(t, err) }() sql := "alter instance reload tls" if errorNoRollback { @@ -1909,35 +1883,35 @@ func (cli *testServerClient) runReloadTLS(t *C, overrider configOverrider, error return err } -func (cli *testServerClient) runTestSumAvg(c *C) { - cli.runTests(c, nil, func(dbt *DBTest) { - dbt.mustExec("create table sumavg (a int, b decimal, c double)") - dbt.mustExec("insert sumavg values (1, 1, 1)") - rows := dbt.mustQuery("select sum(a), sum(b), sum(c) from sumavg") - c.Assert(rows.Next(), IsTrue) +func (cli *testServerClient) runTestSumAvg(t *testing.T) { + cli.runTests(t, nil, func(dbt *testkit.DBTestKit) { + dbt.MustExec("create table sumavg (a int, b decimal, c double)") + dbt.MustExec("insert sumavg values (1, 1, 1)") + rows := dbt.MustQuery("select sum(a), sum(b), sum(c) from sumavg") + require.True(t, rows.Next()) var outA, outB, outC float64 err := rows.Scan(&outA, &outB, &outC) - c.Assert(err, IsNil) - c.Assert(outA, Equals, 1.0) - c.Assert(outB, Equals, 1.0) - c.Assert(outC, Equals, 1.0) - rows = dbt.mustQuery("select avg(a), avg(b), avg(c) from sumavg") - c.Assert(rows.Next(), IsTrue) + require.NoError(t, err) + require.Equal(t, 1.0, outA) + require.Equal(t, 1.0, outB) + require.Equal(t, 1.0, outC) + rows = dbt.MustQuery("select avg(a), avg(b), avg(c) from sumavg") + require.True(t, rows.Next()) err = rows.Scan(&outA, &outB, &outC) - c.Assert(err, IsNil) - c.Assert(outA, Equals, 1.0) - c.Assert(outB, Equals, 1.0) - c.Assert(outC, Equals, 1.0) + require.NoError(t, err) + require.Equal(t, 1.0, outA) + require.Equal(t, 1.0, outB) + require.Equal(t, 1.0, outC) }) } -func (cli *testServerClient) getMetrics(t *C) []byte { +func (cli *testServerClient) getMetrics(t *testing.T) []byte { resp, err := cli.fetchStatus("/metrics") - t.Assert(err, IsNil) + require.NoError(t, err) content, err := io.ReadAll(resp.Body) - t.Assert(err, IsNil) + require.NoError(t, err) err = resp.Body.Close() - t.Assert(err, IsNil) + require.NoError(t, err) return content } @@ -1954,25 +1928,38 @@ func getStmtCnt(content string) (stmtCnt map[string]int) { const retryTime = 100 -func (cli *testServerClient) waitUntilServerOnline() { +func (cli *testServerClient) waitUntilCustomServerCanConnect(overriders ...configOverrider) { // connect server retry := 0 + dsn := cli.getDSN(overriders...) for ; retry < retryTime; retry++ { time.Sleep(time.Millisecond * 10) - db, err := sql.Open("mysql", cli.getDSN()) + db, err := sql.Open("mysql", dsn) if err == nil { - err = db.Close() - if err != nil { - panic(err) + succeed := db.Ping() == nil + if err = db.Close(); err != nil { + log.Error("fail to connect db", zap.String("err", err.Error()), zap.String("DSN", dsn)) + continue + } + if succeed { + break } - break } } if retry == retryTime { - log.Fatal("failed to connect DB in every 10 ms", zap.Int("retryTime", retryTime)) + log.Fatal("failed to connect DB in every 10 ms", zap.String("DSN", dsn), zap.Int("retryTime", retryTime)) } +} +func (cli *testServerClient) waitUntilServerCanConnect() { + cli.waitUntilCustomServerCanConnect(nil) +} + +func (cli *testServerClient) waitUntilServerOnline() { + // connect server + cli.waitUntilServerCanConnect() - for retry = 0; retry < retryTime; retry++ { + retry := 0 + for ; retry < retryTime; retry++ { // fetch http status resp, err := cli.fetchStatus("/status") if err == nil { @@ -1993,65 +1980,65 @@ func (cli *testServerClient) waitUntilServerOnline() { } } -func (cli *testServerClient) runTestInitConnect(c *C) { +func (cli *testServerClient) runTestInitConnect(t *testing.T) { - cli.runTests(c, nil, func(dbt *DBTest) { - dbt.mustExec(`SET GLOBAL init_connect="insert into test.ts VALUES (NOW());SET @a=1;"`) - dbt.mustExec(`CREATE USER init_nonsuper`) - dbt.mustExec(`CREATE USER init_super`) - dbt.mustExec(`GRANT SELECT, INSERT, DROP ON test.* TO init_nonsuper`) - dbt.mustExec(`GRANT SELECT, INSERT, DROP, SUPER ON *.* TO init_super`) - dbt.mustExec(`CREATE TABLE ts (a TIMESTAMP)`) + cli.runTests(t, nil, func(dbt *testkit.DBTestKit) { + dbt.MustExec(`SET GLOBAL init_connect="insert into test.ts VALUES (NOW());SET @a=1;"`) + dbt.MustExec(`CREATE USER init_nonsuper`) + dbt.MustExec(`CREATE USER init_super`) + dbt.MustExec(`GRANT SELECT, INSERT, DROP ON test.* TO init_nonsuper`) + dbt.MustExec(`GRANT SELECT, INSERT, DROP, SUPER ON *.* TO init_super`) + dbt.MustExec(`CREATE TABLE ts (a TIMESTAMP)`) }) // test init_nonsuper - cli.runTests(c, func(config *mysql.Config) { + cli.runTests(t, func(config *mysql.Config) { config.User = "init_nonsuper" - }, func(dbt *DBTest) { - rows := dbt.mustQuery(`SELECT @a`) - c.Assert(rows.Next(), IsTrue) + }, func(dbt *testkit.DBTestKit) { + rows := dbt.MustQuery(`SELECT @a`) + require.True(t, rows.Next()) var a int err := rows.Scan(&a) - c.Assert(err, IsNil) - dbt.Check(a, Equals, 1) - c.Assert(rows.Close(), IsNil) + require.NoError(t, err) + require.Equal(t, 1, a) + require.NoError(t, rows.Close()) }) // test init_super - cli.runTests(c, func(config *mysql.Config) { + cli.runTests(t, func(config *mysql.Config) { config.User = "init_super" - }, func(dbt *DBTest) { - rows := dbt.mustQuery(`SELECT IFNULL(@a,"")`) - c.Assert(rows.Next(), IsTrue) + }, func(dbt *testkit.DBTestKit) { + rows := dbt.MustQuery(`SELECT IFNULL(@a,"")`) + require.True(t, rows.Next()) var a string err := rows.Scan(&a) - c.Assert(err, IsNil) - dbt.Check(a, Equals, "") // null - c.Assert(rows.Close(), IsNil) + require.NoError(t, err) + require.Equal(t, "", a) + require.NoError(t, rows.Close()) // change the init-connect to invalid. - dbt.mustExec(`SET GLOBAL init_connect="invalidstring"`) + dbt.MustExec(`SET GLOBAL init_connect="invalidstring"`) }) // set global init_connect to empty to avoid fail other tests - defer cli.runTests(c, func(config *mysql.Config) { + defer cli.runTests(t, func(config *mysql.Config) { config.User = "init_super" - }, func(dbt *DBTest) { + }, func(dbt *testkit.DBTestKit) { // set init_connect to empty to avoid fail other tests - dbt.mustExec(`SET GLOBAL init_connect=""`) + dbt.MustExec(`SET GLOBAL init_connect=""`) }) db, err := sql.Open("mysql", cli.getDSN(func(config *mysql.Config) { config.User = "init_nonsuper" })) - c.Assert(err, IsNil, Commentf("Error connecting")) // doesn't fail because of lazy loading - defer db.Close() // may already be closed - _, err = db.Exec("SELECT 1") // fails because of init sql - c.Assert(err, NotNil) + require.NoError(t, err) // doesn't fail because of lazy loading + defer db.Close() // may already be closed + _, err = db.Exec("SELECT 1") // fails because of init sql + require.Error(t, err) } // Client errors are only incremented when using the TiDB Server protocol, // and not internal SQL statements. Thus, this test is in the server-test suite. -func (cli *testServerClient) runTestInfoschemaClientErrors(t *C) { - cli.runTestsOnNewDB(t, nil, "clientErrors", func(dbt *DBTest) { +func (cli *testServerClient) runTestInfoschemaClientErrors(t *testing.T) { + cli.runTestsOnNewDB(t, nil, "clientErrors", func(dbt *testkit.DBTestKit) { clientErrors := []struct { stmt string @@ -2065,9 +2052,10 @@ func (cli *testServerClient) runTestInfoschemaClientErrors(t *C) { errCode: 1365, // div by zero }, { - stmt: "CREATE TABLE test_client_errors2 (a int primary key, b int primary key)", - incrementErrors: true, - errCode: 1068, // multiple pkeys + stmt: "CREATE TABLE test_client_errors2 (a int primary key, b int primary key)", + incrementWarnings: true, + incrementErrors: true, + errCode: 1068, // multiple pkeys }, { stmt: "gibberish", @@ -2082,11 +2070,11 @@ func (cli *testServerClient) runTestInfoschemaClientErrors(t *C) { for _, tbl := range sources { var errors, warnings int - rows := dbt.mustQuery("SELECT SUM(error_count), SUM(warning_count) FROM information_schema."+tbl+" WHERE error_number = ? GROUP BY error_number", test.errCode) + rows := dbt.MustQuery("SELECT SUM(error_count), SUM(warning_count) FROM information_schema."+tbl+" WHERE error_number = ? GROUP BY error_number", test.errCode) if rows.Next() { rows.Scan(&errors, &warnings) } - rows.Close() + require.NoError(t, rows.Close()) if test.incrementErrors { errors++ @@ -2095,23 +2083,24 @@ func (cli *testServerClient) runTestInfoschemaClientErrors(t *C) { warnings++ } var err error - rows, err = dbt.db.Query(test.stmt) + rows, err = dbt.GetDB().Query(test.stmt) if err == nil { // make sure to read the result since the error/warnings are populated in the network send code. if rows.Next() { var fake string rows.Scan(&fake) } - rows.Close() + require.NoError(t, rows.Close()) } + var newErrors, newWarnings int - rows = dbt.mustQuery("SELECT SUM(error_count), SUM(warning_count) FROM information_schema."+tbl+" WHERE error_number = ? GROUP BY error_number", test.errCode) + rows = dbt.MustQuery("SELECT SUM(error_count), SUM(warning_count) FROM information_schema."+tbl+" WHERE error_number = ? GROUP BY error_number", test.errCode) if rows.Next() { rows.Scan(&newErrors, &newWarnings) } - rows.Close() - dbt.Check(newErrors, Equals, errors) - dbt.Check(newWarnings, Equals, warnings, Commentf("source=information_schema.%s code=%d statement=%s", tbl, test.errCode, test.stmt)) + require.NoError(t, rows.Close()) + require.Equal(t, errors, newErrors) + require.Equalf(t, warnings, newWarnings, "source=information_schema.%s code=%d statement=%s", tbl, test.errCode, test.stmt) } } diff --git a/server/statistics_handler_serial_test.go b/server/statistics_handler_serial_test.go index 7c56cf2186831..1f4324d3a54f5 100644 --- a/server/statistics_handler_serial_test.go +++ b/server/statistics_handler_serial_test.go @@ -40,6 +40,7 @@ func TestDumpStatsAPI(t *testing.T) { cfg.Port = client.port cfg.Status.StatusPort = client.statusPort cfg.Status.ReportStatus = true + cfg.Socket = fmt.Sprintf("/tmp/tidb-mock-%d.sock", time.Now().UnixNano()) server, err := NewServer(cfg, driver) require.NoError(t, err) @@ -228,4 +229,5 @@ func checkData(t *testing.T, path string, client *testServerClient) { require.Equal(t, "test", tableName) require.Equal(t, int64(3), modifyCount) require.Equal(t, int64(4), count) + require.NoError(t, rows.Close()) } diff --git a/server/tidb_serial_test.go b/server/tidb_serial_test.go new file mode 100644 index 0000000000000..5bbf88ad0e392 --- /dev/null +++ b/server/tidb_serial_test.go @@ -0,0 +1,497 @@ +// Copyright 2021 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, +// 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. +//go:build !race +// +build !race + +package server + +import ( + "context" + "crypto/x509" + "os" + "sync/atomic" + "testing" + "time" + + "github.com/go-sql-driver/mysql" + "github.com/pingcap/errors" + "github.com/pingcap/tidb/config" + tmysql "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/util" + "github.com/pingcap/tidb/util/collate" + "github.com/stretchr/testify/require" +) + +// this test will change `kv.TxnTotalSizeLimit` which may affect other test suites, +// so we must make it running in serial. +func TestLoadData(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + + ts.runTestLoadData(t, ts.server) + ts.runTestLoadDataWithSelectIntoOutfile(t, ts.server) + ts.runTestLoadDataForSlowLog(t, ts.server) +} + +func TestConfigDefaultValue(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + + ts.runTestsOnNewDB(t, nil, "config", func(dbt *testkit.DBTestKit) { + rows := dbt.MustQuery("select @@tidb_slow_log_threshold;") + ts.checkRows(t, rows, "300") + }) +} + +// Fix issue#22540. Change tidb_dml_batch_size, +// then check if load data into table with auto random column works properly. +func TestLoadDataAutoRandom(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + + ts.runTestLoadDataAutoRandom(t) +} + +func TestLoadDataAutoRandomWithSpecialTerm(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + + ts.runTestLoadDataAutoRandomWithSpecialTerm(t) +} + +func TestExplainFor(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + + ts.runTestExplainForConn(t) +} + +func TestStmtCount(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + + ts.runTestStmtCount(t) +} + +func TestLoadDataListPartition(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + + ts.runTestLoadDataForListPartition(t) + ts.runTestLoadDataForListPartition2(t) + ts.runTestLoadDataForListColumnPartition(t) + ts.runTestLoadDataForListColumnPartition2(t) +} + +func TestTLSAuto(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + + // Start the server without TLS configure, letting the server create these as AutoTLS is enabled + connOverrider := func(config *mysql.Config) { + config.TLSConfig = "skip-verify" + } + cli := newTestServerClient() + cfg := newTestConfig() + cfg.Port = cli.port + cfg.Status.ReportStatus = false + cfg.Security.AutoTLS = true + cfg.Security.RSAKeySize = 528 // Reduces unittest runtime + err := os.MkdirAll(cfg.TempStoragePath, 0700) + require.NoError(t, err) + server, err := NewServer(cfg, ts.tidbdrv) + require.NoError(t, err) + cli.port = getPortFromTCPAddr(server.listener.Addr()) + go func() { + err := server.Run() + require.NoError(t, err) + }() + time.Sleep(time.Millisecond * 100) + err = cli.runTestTLSConnection(t, connOverrider) // Relying on automatically created TLS certificates + require.NoError(t, err) + + server.Close() +} + +func TestTLSBasic(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + + // Generate valid TLS certificates. + caCert, caKey, err := generateCert(0, "TiDB CA", nil, nil, "/tmp/ca-key.pem", "/tmp/ca-cert.pem") + require.NoError(t, err) + serverCert, _, err := generateCert(1, "tidb-server", caCert, caKey, "/tmp/server-key.pem", "/tmp/server-cert.pem") + require.NoError(t, err) + _, _, err = generateCert(2, "SQL Client Certificate", caCert, caKey, "/tmp/client-key.pem", "/tmp/client-cert.pem") + require.NoError(t, err) + err = registerTLSConfig("client-certificate", "/tmp/ca-cert.pem", "/tmp/client-cert.pem", "/tmp/client-key.pem", "tidb-server", true) + require.NoError(t, err) + + defer func() { + err := os.Remove("/tmp/ca-key.pem") + require.NoError(t, err) + err = os.Remove("/tmp/ca-cert.pem") + require.NoError(t, err) + err = os.Remove("/tmp/server-key.pem") + require.NoError(t, err) + err = os.Remove("/tmp/server-cert.pem") + require.NoError(t, err) + err = os.Remove("/tmp/client-key.pem") + require.NoError(t, err) + err = os.Remove("/tmp/client-cert.pem") + require.NoError(t, err) + }() + + // Start the server with TLS but without CA, in this case the server will not verify client's certificate. + connOverrider := func(config *mysql.Config) { + config.TLSConfig = "skip-verify" + } + cli := newTestServerClient() + cfg := newTestConfig() + cfg.Port = cli.port + cfg.Status.ReportStatus = false + cfg.Security = config.Security{ + SSLCert: "/tmp/server-cert.pem", + SSLKey: "/tmp/server-key.pem", + } + server, err := NewServer(cfg, ts.tidbdrv) + require.NoError(t, err) + cli.port = getPortFromTCPAddr(server.listener.Addr()) + go func() { + err := server.Run() + require.NoError(t, err) + }() + time.Sleep(time.Millisecond * 100) + err = cli.runTestTLSConnection(t, connOverrider) // We should establish connection successfully. + require.NoError(t, err) + cli.runTestRegression(t, connOverrider, "TLSRegression") + // Perform server verification. + connOverrider = func(config *mysql.Config) { + config.TLSConfig = "client-certificate" + } + err = cli.runTestTLSConnection(t, connOverrider) // We should establish connection successfully. + require.NoError(t, err, "%v", errors.ErrorStack(err)) + cli.runTestRegression(t, connOverrider, "TLSRegression") + + // Test SSL/TLS session vars + var v *variable.SessionVars + stats, err := server.Stats(v) + require.NoError(t, err) + _, hasKey := stats["Ssl_server_not_after"] + require.True(t, hasKey) + _, hasKey = stats["Ssl_server_not_before"] + require.True(t, hasKey) + require.Equal(t, serverCert.NotAfter.Format("Jan _2 15:04:05 2006 MST"), stats["Ssl_server_not_after"]) + require.Equal(t, serverCert.NotBefore.Format("Jan _2 15:04:05 2006 MST"), stats["Ssl_server_not_before"]) + + server.Close() +} + +func TestTLSVerify(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + + // Generate valid TLS certificates. + caCert, caKey, err := generateCert(0, "TiDB CA", nil, nil, "/tmp/ca-key.pem", "/tmp/ca-cert.pem") + require.NoError(t, err) + _, _, err = generateCert(1, "tidb-server", caCert, caKey, "/tmp/server-key.pem", "/tmp/server-cert.pem") + require.NoError(t, err) + _, _, err = generateCert(2, "SQL Client Certificate", caCert, caKey, "/tmp/client-key.pem", "/tmp/client-cert.pem") + require.NoError(t, err) + err = registerTLSConfig("client-certificate", "/tmp/ca-cert.pem", "/tmp/client-cert.pem", "/tmp/client-key.pem", "tidb-server", true) + require.NoError(t, err) + + defer func() { + err := os.Remove("/tmp/ca-key.pem") + require.NoError(t, err) + err = os.Remove("/tmp/ca-cert.pem") + require.NoError(t, err) + err = os.Remove("/tmp/server-key.pem") + require.NoError(t, err) + err = os.Remove("/tmp/server-cert.pem") + require.NoError(t, err) + err = os.Remove("/tmp/client-key.pem") + require.NoError(t, err) + err = os.Remove("/tmp/client-cert.pem") + require.NoError(t, err) + }() + + // Start the server with TLS & CA, if the client presents its certificate, the certificate will be verified. + cli := newTestServerClient() + cfg := newTestConfig() + cfg.Port = cli.port + cfg.Status.ReportStatus = false + cfg.Security = config.Security{ + SSLCA: "/tmp/ca-cert.pem", + SSLCert: "/tmp/server-cert.pem", + SSLKey: "/tmp/server-key.pem", + } + server, err := NewServer(cfg, ts.tidbdrv) + require.NoError(t, err) + cli.port = getPortFromTCPAddr(server.listener.Addr()) + go func() { + err := server.Run() + require.NoError(t, err) + }() + time.Sleep(time.Millisecond * 100) + // The client does not provide a certificate, the connection should succeed. + err = cli.runTestTLSConnection(t, nil) + require.NoError(t, err) + connOverrider := func(config *mysql.Config) { + config.TLSConfig = "client-certificate" + } + cli.runTestRegression(t, connOverrider, "TLSRegression") + // The client provides a valid certificate. + connOverrider = func(config *mysql.Config) { + config.TLSConfig = "client-certificate" + } + err = cli.runTestTLSConnection(t, connOverrider) + require.NoError(t, err) + cli.runTestRegression(t, connOverrider, "TLSRegression") + server.Close() + + require.False(t, util.IsTLSExpiredError(errors.New("unknown test"))) + require.False(t, util.IsTLSExpiredError(x509.CertificateInvalidError{Reason: x509.CANotAuthorizedForThisName})) + require.True(t, util.IsTLSExpiredError(x509.CertificateInvalidError{Reason: x509.Expired})) + + _, _, err = util.LoadTLSCertificates("", "wrong key", "wrong cert", true, 528) + require.Error(t, err) + _, _, err = util.LoadTLSCertificates("wrong ca", "/tmp/server-key.pem", "/tmp/server-cert.pem", true, 528) + require.Error(t, err) +} + +func TestErrorNoRollback(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + + // Generate valid TLS certificates. + caCert, caKey, err := generateCert(0, "TiDB CA", nil, nil, "/tmp/ca-key-rollback.pem", "/tmp/ca-cert-rollback.pem") + require.NoError(t, err) + _, _, err = generateCert(1, "tidb-server", caCert, caKey, "/tmp/server-key-rollback.pem", "/tmp/server-cert-rollback.pem") + require.NoError(t, err) + _, _, err = generateCert(2, "SQL Client Certificate", caCert, caKey, "/tmp/client-key-rollback.pem", "/tmp/client-cert-rollback.pem") + require.NoError(t, err) + err = registerTLSConfig("client-cert-rollback-test", "/tmp/ca-cert-rollback.pem", "/tmp/client-cert-rollback.pem", "/tmp/client-key-rollback.pem", "tidb-server", true) + require.NoError(t, err) + + defer func() { + os.Remove("/tmp/ca-key-rollback.pem") + os.Remove("/tmp/ca-cert-rollback.pem") + + os.Remove("/tmp/server-key-rollback.pem") + os.Remove("/tmp/server-cert-rollback.pem") + os.Remove("/tmp/client-key-rollback.pem") + os.Remove("/tmp/client-cert-rollback.pem") + }() + + cli := newTestServerClient() + cfg := newTestConfig() + cfg.Port = cli.port + cfg.Status.ReportStatus = false + + cfg.Security = config.Security{ + RequireSecureTransport: true, + SSLCA: "wrong path", + SSLCert: "wrong path", + SSLKey: "wrong path", + } + _, err = NewServer(cfg, ts.tidbdrv) + require.Error(t, err) + + // test reload tls fail with/without "error no rollback option" + cfg.Security = config.Security{ + SSLCA: "/tmp/ca-cert-rollback.pem", + SSLCert: "/tmp/server-cert-rollback.pem", + SSLKey: "/tmp/server-key-rollback.pem", + } + server, err := NewServer(cfg, ts.tidbdrv) + require.NoError(t, err) + cli.port = getPortFromTCPAddr(server.listener.Addr()) + go func() { + err := server.Run() + require.NoError(t, err) + }() + defer server.Close() + time.Sleep(time.Millisecond * 100) + connOverrider := func(config *mysql.Config) { + config.TLSConfig = "client-cert-rollback-test" + } + err = cli.runTestTLSConnection(t, connOverrider) + require.NoError(t, err) + os.Remove("/tmp/server-key-rollback.pem") + err = cli.runReloadTLS(t, connOverrider, false) + require.Error(t, err) + tlsCfg := server.getTLSConfig() + require.NotNil(t, tlsCfg) + err = cli.runReloadTLS(t, connOverrider, true) + require.NoError(t, err) + tlsCfg = server.getTLSConfig() + require.Nil(t, tlsCfg) +} + +func TestPrepareCount(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + + qctx, err := ts.tidbdrv.OpenCtx(uint64(0), 0, uint8(tmysql.DefaultCollationID), "test", nil) + require.NoError(t, err) + prepareCnt := atomic.LoadInt64(&variable.PreparedStmtCount) + ctx := context.Background() + _, err = Execute(ctx, qctx, "use test;") + require.NoError(t, err) + _, err = Execute(ctx, qctx, "drop table if exists t1") + require.NoError(t, err) + _, err = Execute(ctx, qctx, "create table t1 (id int)") + require.NoError(t, err) + stmt, _, _, err := qctx.Prepare("insert into t1 values (?)") + require.NoError(t, err) + require.Equal(t, prepareCnt+1, atomic.LoadInt64(&variable.PreparedStmtCount)) + require.NoError(t, err) + err = qctx.GetStatement(stmt.ID()).Close() + require.NoError(t, err) + require.Equal(t, prepareCnt, atomic.LoadInt64(&variable.PreparedStmtCount)) + require.NoError(t, qctx.Close()) +} + +func TestDefaultCharacterAndCollation(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + + // issue #21194 + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + // 255 is the collation id of mysql client 8 default collation_connection + qctx, err := ts.tidbdrv.OpenCtx(uint64(0), 0, uint8(255), "test", nil) + require.NoError(t, err) + testCase := []struct { + variable string + except string + }{ + {"collation_connection", "utf8mb4_bin"}, + {"character_set_connection", "utf8mb4"}, + {"character_set_client", "utf8mb4"}, + } + + for _, tc := range testCase { + sVars, b := qctx.GetSessionVars().GetSystemVar(tc.variable) + require.True(t, b) + require.Equal(t, tc.except, sVars) + } +} + +func TestReloadTLS(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + + // Generate valid TLS certificates. + caCert, caKey, err := generateCert(0, "TiDB CA", nil, nil, "/tmp/ca-key-reload.pem", "/tmp/ca-cert-reload.pem") + require.NoError(t, err) + _, _, err = generateCert(1, "tidb-server", caCert, caKey, "/tmp/server-key-reload.pem", "/tmp/server-cert-reload.pem") + require.NoError(t, err) + _, _, err = generateCert(2, "SQL Client Certificate", caCert, caKey, "/tmp/client-key-reload.pem", "/tmp/client-cert-reload.pem") + require.NoError(t, err) + err = registerTLSConfig("client-certificate-reload", "/tmp/ca-cert-reload.pem", "/tmp/client-cert-reload.pem", "/tmp/client-key-reload.pem", "tidb-server", true) + require.NoError(t, err) + + defer func() { + os.Remove("/tmp/ca-key-reload.pem") + os.Remove("/tmp/ca-cert-reload.pem") + + os.Remove("/tmp/server-key-reload.pem") + os.Remove("/tmp/server-cert-reload.pem") + os.Remove("/tmp/client-key-reload.pem") + os.Remove("/tmp/client-cert-reload.pem") + }() + + // try old cert used in startup configuration. + cli := newTestServerClient() + cfg := newTestConfig() + cfg.Port = cli.port + cfg.Status.ReportStatus = false + cfg.Security = config.Security{ + SSLCA: "/tmp/ca-cert-reload.pem", + SSLCert: "/tmp/server-cert-reload.pem", + SSLKey: "/tmp/server-key-reload.pem", + } + server, err := NewServer(cfg, ts.tidbdrv) + require.NoError(t, err) + cli.port = getPortFromTCPAddr(server.listener.Addr()) + go func() { + err := server.Run() + require.NoError(t, err) + }() + time.Sleep(time.Millisecond * 100) + // The client provides a valid certificate. + connOverrider := func(config *mysql.Config) { + config.TLSConfig = "client-certificate-reload" + } + err = cli.runTestTLSConnection(t, connOverrider) + require.NoError(t, err) + + // try reload a valid cert. + tlsCfg := server.getTLSConfig() + cert, err := x509.ParseCertificate(tlsCfg.Certificates[0].Certificate[0]) + require.NoError(t, err) + oldExpireTime := cert.NotAfter + _, _, err = generateCert(1, "tidb-server", caCert, caKey, "/tmp/server-key-reload2.pem", "/tmp/server-cert-reload2.pem", func(c *x509.Certificate) { + c.NotBefore = time.Now().Add(-24 * time.Hour).UTC() + c.NotAfter = time.Now().Add(1 * time.Hour).UTC() + }) + require.NoError(t, err) + err = os.Rename("/tmp/server-key-reload2.pem", "/tmp/server-key-reload.pem") + require.NoError(t, err) + err = os.Rename("/tmp/server-cert-reload2.pem", "/tmp/server-cert-reload.pem") + require.NoError(t, err) + connOverrider = func(config *mysql.Config) { + config.TLSConfig = "skip-verify" + } + err = cli.runReloadTLS(t, connOverrider, false) + require.NoError(t, err) + connOverrider = func(config *mysql.Config) { + config.TLSConfig = "client-certificate-reload" + } + err = cli.runTestTLSConnection(t, connOverrider) + require.NoError(t, err) + + tlsCfg = server.getTLSConfig() + cert, err = x509.ParseCertificate(tlsCfg.Certificates[0].Certificate[0]) + require.NoError(t, err) + newExpireTime := cert.NotAfter + require.True(t, newExpireTime.After(oldExpireTime)) + + // try reload a expired cert. + _, _, err = generateCert(1, "tidb-server", caCert, caKey, "/tmp/server-key-reload3.pem", "/tmp/server-cert-reload3.pem", func(c *x509.Certificate) { + c.NotBefore = time.Now().Add(-24 * time.Hour).UTC() + c.NotAfter = c.NotBefore.Add(1 * time.Hour).UTC() + }) + require.NoError(t, err) + err = os.Rename("/tmp/server-key-reload3.pem", "/tmp/server-key-reload.pem") + require.NoError(t, err) + err = os.Rename("/tmp/server-cert-reload3.pem", "/tmp/server-cert-reload.pem") + require.NoError(t, err) + connOverrider = func(config *mysql.Config) { + config.TLSConfig = "skip-verify" + } + err = cli.runReloadTLS(t, connOverrider, false) + require.NoError(t, err) + connOverrider = func(config *mysql.Config) { + config.TLSConfig = "client-certificate-reload" + } + err = cli.runTestTLSConnection(t, connOverrider) + require.NotNil(t, err) + require.Truef(t, util.IsTLSExpiredError(err), "real error is %+v", err) + server.Close() +} diff --git a/server/tidb_test.go b/server/tidb_test.go index 638fe17d20606..5c0c2e9e189e1 100644 --- a/server/tidb_test.go +++ b/server/tidb_test.go @@ -11,6 +11,7 @@ // 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. +//go:build !race // +build !race package server @@ -31,46 +32,31 @@ import ( "os" "path/filepath" "strings" - "sync/atomic" + "testing" "time" "github.com/go-sql-driver/mysql" - . "github.com/pingcap/check" "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/metrics" "github.com/pingcap/tidb/parser" tmysql "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/session" - "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/store/mockstore" + "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/util" - "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/plancodec" - "github.com/pingcap/tidb/util/testkit" "github.com/pingcap/tidb/util/topsql/reporter" mockTopSQLReporter "github.com/pingcap/tidb/util/topsql/reporter/mock" "github.com/pingcap/tidb/util/topsql/tracecpu" mockTopSQLTraceCPU "github.com/pingcap/tidb/util/topsql/tracecpu/mock" + "github.com/stretchr/testify/require" ) type tidbTestSuite struct { - *tidbTestSuiteBase -} - -type tidbTestSerialSuite struct { - *tidbTestSuiteBase -} - -type tidbTestTopSQLSuite struct { - *tidbTestSuiteBase -} - -type tidbTestSuiteBase struct { *testServerClient tidbdrv *TiDBDriver server *Server @@ -78,219 +64,188 @@ type tidbTestSuiteBase struct { store kv.Storage } -func newTiDBTestSuiteBase() *tidbTestSuiteBase { - return &tidbTestSuiteBase{ - testServerClient: newTestServerClient(), - } -} - -var _ = Suite(&tidbTestSuite{newTiDBTestSuiteBase()}) -var _ = SerialSuites(&tidbTestSerialSuite{newTiDBTestSuiteBase()}) -var _ = SerialSuites(&tidbTestTopSQLSuite{newTiDBTestSuiteBase()}) - -func (ts *tidbTestSuite) SetUpSuite(c *C) { - metrics.RegisterMetrics() - ts.tidbTestSuiteBase.SetUpSuite(c) -} - -func (ts *tidbTestSuite) TearDownSuite(c *C) { - ts.tidbTestSuiteBase.TearDownSuite(c) -} +func createTidbTestSuite(t *testing.T) (*tidbTestSuite, func()) { + ts := &tidbTestSuite{testServerClient: newTestServerClient()} -func (ts *tidbTestTopSQLSuite) SetUpSuite(c *C) { - ts.tidbTestSuiteBase.SetUpSuite(c) - - // Initialize global variable for top-sql test. - db, err := sql.Open("mysql", ts.getDSN()) - c.Assert(err, IsNil, Commentf("Error connecting")) - defer func() { - err := db.Close() - c.Assert(err, IsNil) - }() - - dbt := &DBTest{c, db} - dbt.mustExec("set @@global.tidb_top_sql_precision_seconds=1;") - dbt.mustExec("set @@global.tidb_top_sql_report_interval_seconds=2;") - dbt.mustExec("set @@global.tidb_top_sql_max_statement_count=5;") - - tracecpu.GlobalSQLCPUProfiler.Run() -} - -func (ts *tidbTestTopSQLSuite) TearDownSuite(c *C) { - ts.tidbTestSuiteBase.TearDownSuite(c) -} - -func (ts *tidbTestSuiteBase) SetUpSuite(c *C) { + // setup tidbTestSuite var err error ts.store, err = mockstore.NewMockStore() session.DisableStats4Test() - c.Assert(err, IsNil) + require.NoError(t, err) ts.domain, err = session.BootstrapSession(ts.store) - c.Assert(err, IsNil) + require.NoError(t, err) ts.tidbdrv = NewTiDBDriver(ts.store) cfg := newTestConfig() - cfg.Socket = "" cfg.Port = ts.port cfg.Status.ReportStatus = true cfg.Status.StatusPort = ts.statusPort cfg.Performance.TCPKeepAlive = true err = logutil.InitLogger(cfg.Log.ToLogConfig()) - c.Assert(err, IsNil) + require.NoError(t, err) server, err := NewServer(cfg, ts.tidbdrv) - c.Assert(err, IsNil) + require.NoError(t, err) ts.port = getPortFromTCPAddr(server.listener.Addr()) ts.statusPort = getPortFromTCPAddr(server.statusListener.Addr()) ts.server = server go func() { err := ts.server.Run() - c.Assert(err, IsNil) + require.NoError(t, err) }() ts.waitUntilServerOnline() -} -func (ts *tidbTestSuiteBase) TearDownSuite(c *C) { - if ts.store != nil { - ts.store.Close() - } - if ts.domain != nil { - ts.domain.Close() - } - if ts.server != nil { - ts.server.Close() + cleanup := func() { + if ts.domain != nil { + ts.domain.Close() + } + if ts.server != nil { + ts.server.Close() + } + if ts.store != nil { + require.NoError(t, ts.store.Close()) + } } -} -func (ts *tidbTestSuite) TestRegression(c *C) { - if regression { - c.Parallel() - ts.runTestRegression(c, nil, "Regression") - } + return ts, cleanup } -func (ts *tidbTestSuite) TestUint64(c *C) { - ts.runTestPrepareResultFieldType(c) +type tidbTestTopSQLSuite struct { + *tidbTestSuite } -func (ts *tidbTestSuite) TestSpecialType(c *C) { - c.Parallel() - ts.runTestSpecialType(c) -} +func createTidbTestTopSQLSuite(t *testing.T) (*tidbTestTopSQLSuite, func()) { + base, cleanup := createTidbTestSuite(t) -func (ts *tidbTestSuite) TestPreparedString(c *C) { - c.Parallel() - ts.runTestPreparedString(c) -} + ts := &tidbTestTopSQLSuite{base} -func (ts *tidbTestSuite) TestPreparedTimestamp(c *C) { - c.Parallel() - ts.runTestPreparedTimestamp(c) -} + // Initialize global variable for top-sql test. + db, err := sql.Open("mysql", ts.getDSN()) + require.NoError(t, err) + defer func() { + err := db.Close() + require.NoError(t, err) + }() -func (ts *tidbTestSerialSuite) TestConfigDefaultValue(c *C) { - ts.runTestsOnNewDB(c, nil, "config", func(dbt *DBTest) { - rows := dbt.mustQuery("select @@tidb_slow_log_threshold;") - ts.checkRows(c, rows, "300") - }) -} + dbt := testkit.NewDBTestKit(t, db) + dbt.MustExec("set @@global.tidb_top_sql_precision_seconds=1;") + dbt.MustExec("set @@global.tidb_top_sql_report_interval_seconds=2;") + dbt.MustExec("set @@global.tidb_top_sql_max_statement_count=5;") + + tracecpu.GlobalSQLCPUProfiler.Run() -// this test will change `kv.TxnTotalSizeLimit` which may affect other test suites, -// so we must make it running in serial. -func (ts *tidbTestSerialSuite) TestLoadData(c *C) { - ts.runTestLoadData(c, ts.server) - ts.runTestLoadDataWithSelectIntoOutfile(c, ts.server) - ts.runTestLoadDataForSlowLog(c, ts.server) + return ts, cleanup } -func (ts *tidbTestSerialSuite) TestLoadDataListPartition(c *C) { - ts.runTestLoadDataForListPartition(c) - ts.runTestLoadDataForListPartition2(c) - ts.runTestLoadDataForListColumnPartition(c) - ts.runTestLoadDataForListColumnPartition2(c) +func TestRegression(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + if regression { + ts.runTestRegression(t, nil, "Regression") + } } -// Fix issue#22540. Change tidb_dml_batch_size, -// then check if load data into table with auto random column works properly. -func (ts *tidbTestSerialSuite) TestLoadDataAutoRandom(c *C) { - ts.runTestLoadDataAutoRandom(c) +func TestUint64(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + + ts.runTestPrepareResultFieldType(t) } -func (ts *tidbTestSerialSuite) TestLoadDataAutoRandomWithSpecialTerm(c *C) { - ts.runTestLoadDataAutoRandomWithSpecialTerm(c) +func TestSpecialType(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + + ts.runTestSpecialType(t) } -func (ts *tidbTestSerialSuite) TestExplainFor(c *C) { - ts.runTestExplainForConn(c) +func TestPreparedString(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + + ts.runTestPreparedString(t) } -func (ts *tidbTestSerialSuite) TestStmtCount(c *C) { - ts.runTestStmtCount(c) +func TestPreparedTimestamp(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + + ts.runTestPreparedTimestamp(t) } -func (ts *tidbTestSuite) TestConcurrentUpdate(c *C) { - c.Parallel() - ts.runTestConcurrentUpdate(c) +func TestConcurrentUpdate(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + + ts.runTestConcurrentUpdate(t) } -func (ts *tidbTestSuite) TestErrorCode(c *C) { - c.Parallel() - ts.runTestErrorCode(c) +func TestErrorCode(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + + ts.runTestErrorCode(t) } -func (ts *tidbTestSuite) TestAuth(c *C) { - c.Parallel() - ts.runTestAuth(c) - ts.runTestIssue3682(c) +func TestAuth(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + + ts.runTestAuth(t) + ts.runTestIssue3682(t) } -func (ts *tidbTestSuite) TestIssues(c *C) { - c.Parallel() - ts.runTestIssue3662(c) - ts.runTestIssue3680(c) - ts.runTestIssue22646(c) +func TestIssues(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + + ts.runTestIssue3662(t) + ts.runTestIssue3680(t) + ts.runTestIssue22646(t) } -func (ts *tidbTestSuite) TestDBNameEscape(c *C) { - c.Parallel() - ts.runTestDBNameEscape(c) +func TestDBNameEscape(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + ts.runTestDBNameEscape(t) } -func (ts *tidbTestSuite) TestResultFieldTableIsNull(c *C) { - c.Parallel() - ts.runTestResultFieldTableIsNull(c) +func TestResultFieldTableIsNull(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + + ts.runTestResultFieldTableIsNull(t) } -func (ts *tidbTestSuite) TestStatusAPI(c *C) { - c.Parallel() - ts.runTestStatusAPI(c) +func TestStatusAPI(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + + ts.runTestStatusAPI(t) } -func (ts *tidbTestSuite) TestStatusPort(c *C) { - store, err := mockstore.NewMockStore() - c.Assert(err, IsNil) - defer store.Close() - session.DisableStats4Test() - dom, err := session.BootstrapSession(store) - c.Assert(err, IsNil) - defer dom.Close() - ts.tidbdrv = NewTiDBDriver(store) +func TestStatusPort(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + cfg := newTestConfig() - cfg.Socket = "" cfg.Port = 0 cfg.Status.ReportStatus = true cfg.Status.StatusPort = ts.statusPort cfg.Performance.TCPKeepAlive = true server, err := NewServer(cfg, ts.tidbdrv) - c.Assert(err, NotNil) - c.Assert(server, IsNil) + require.Error(t, err) + require.Nil(t, server) } -func (ts *tidbTestSuite) TestStatusAPIWithTLS(c *C) { +func TestStatusAPIWithTLS(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + caCert, caKey, err := generateCert(0, "TiDB CA 2", nil, nil, "/tmp/ca-key-2.pem", "/tmp/ca-cert-2.pem") - c.Assert(err, IsNil) + require.NoError(t, err) _, _, err = generateCert(1, "tidb-server-2", caCert, caKey, "/tmp/server-key-2.pem", "/tmp/server-cert-2.pem") - c.Assert(err, IsNil) + require.NoError(t, err) defer func() { os.Remove("/tmp/ca-key-2.pem") @@ -302,34 +257,36 @@ func (ts *tidbTestSuite) TestStatusAPIWithTLS(c *C) { cli := newTestServerClient() cli.statusScheme = "https" cfg := newTestConfig() - cfg.Socket = "" cfg.Port = cli.port cfg.Status.StatusPort = cli.statusPort cfg.Security.ClusterSSLCA = "/tmp/ca-cert-2.pem" cfg.Security.ClusterSSLCert = "/tmp/server-cert-2.pem" cfg.Security.ClusterSSLKey = "/tmp/server-key-2.pem" server, err := NewServer(cfg, ts.tidbdrv) - c.Assert(err, IsNil) + require.NoError(t, err) cli.port = getPortFromTCPAddr(server.listener.Addr()) cli.statusPort = getPortFromTCPAddr(server.statusListener.Addr()) go func() { err := server.Run() - c.Assert(err, IsNil) + require.NoError(t, err) }() time.Sleep(time.Millisecond * 100) // https connection should work. - ts.runTestStatusAPI(c) + ts.runTestStatusAPI(t) // but plain http connection should fail. cli.statusScheme = "http" _, err = cli.fetchStatus("/status") // nolint: bodyclose - c.Assert(err, NotNil) + require.Error(t, err) server.Close() } -func (ts *tidbTestSuite) TestStatusAPIWithTLSCNCheck(c *C) { +func TestStatusAPIWithTLSCNCheck(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + caPath := filepath.Join(os.TempDir(), "ca-cert-cn.pem") serverKeyPath := filepath.Join(os.TempDir(), "server-key-cn.pem") serverCertPath := filepath.Join(os.TempDir(), "server-cert-cn.pem") @@ -339,22 +296,21 @@ func (ts *tidbTestSuite) TestStatusAPIWithTLSCNCheck(c *C) { client2CertPath := filepath.Join(os.TempDir(), "client-cert-cn-check-b.pem") caCert, caKey, err := generateCert(0, "TiDB CA CN CHECK", nil, nil, filepath.Join(os.TempDir(), "ca-key-cn.pem"), caPath) - c.Assert(err, IsNil) + require.NoError(t, err) _, _, err = generateCert(1, "tidb-server-cn-check", caCert, caKey, serverKeyPath, serverCertPath) - c.Assert(err, IsNil) + require.NoError(t, err) _, _, err = generateCert(2, "tidb-client-cn-check-a", caCert, caKey, client1KeyPath, client1CertPath, func(c *x509.Certificate) { c.Subject.CommonName = "tidb-client-1" }) - c.Assert(err, IsNil) + require.NoError(t, err) _, _, err = generateCert(3, "tidb-client-cn-check-b", caCert, caKey, client2KeyPath, client2CertPath, func(c *x509.Certificate) { c.Subject.CommonName = "tidb-client-2" }) - c.Assert(err, IsNil) + require.NoError(t, err) cli := newTestServerClient() cli.statusScheme = "https" cfg := newTestConfig() - cfg.Socket = "" cfg.Port = cli.port cfg.Status.StatusPort = cli.statusPort cfg.Security.ClusterSSLCA = caPath @@ -362,37 +318,38 @@ func (ts *tidbTestSuite) TestStatusAPIWithTLSCNCheck(c *C) { cfg.Security.ClusterSSLKey = serverKeyPath cfg.Security.ClusterVerifyCN = []string{"tidb-client-2"} server, err := NewServer(cfg, ts.tidbdrv) - c.Assert(err, IsNil) + require.NoError(t, err) + cli.port = getPortFromTCPAddr(server.listener.Addr()) cli.statusPort = getPortFromTCPAddr(server.statusListener.Addr()) go func() { err := server.Run() - c.Assert(err, IsNil) + require.NoError(t, err) }() defer server.Close() time.Sleep(time.Millisecond * 100) - hc := newTLSHttpClient(c, caPath, + hc := newTLSHttpClient(t, caPath, client1CertPath, client1KeyPath, ) _, err = hc.Get(cli.statusURL("/status")) // nolint: bodyclose - c.Assert(err, NotNil) + require.Error(t, err) - hc = newTLSHttpClient(c, caPath, + hc = newTLSHttpClient(t, caPath, client2CertPath, client2KeyPath, ) resp, err := hc.Get(cli.statusURL("/status")) - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) + require.NoError(t, err) + require.Nil(t, resp.Body.Close()) } -func newTLSHttpClient(c *C, caFile, certFile, keyFile string) *http.Client { +func newTLSHttpClient(t *testing.T, caFile, certFile, keyFile string) *http.Client { cert, err := tls.LoadX509KeyPair(certFile, keyFile) - c.Assert(err, IsNil) + require.NoError(t, err) caCert, err := os.ReadFile(caFile) - c.Assert(err, IsNil) + require.NoError(t, err) caCertPool := x509.NewCertPool() caCertPool.AppendCertsFromPEM(caCert) tlsConfig := &tls.Config{ @@ -404,362 +361,412 @@ func newTLSHttpClient(c *C, caFile, certFile, keyFile string) *http.Client { return &http.Client{Transport: &http.Transport{TLSClientConfig: tlsConfig}} } -func (ts *tidbTestSuite) TestMultiStatements(c *C) { - c.Parallel() - ts.runFailedTestMultiStatements(c) - ts.runTestMultiStatements(c) +func TestMultiStatements(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + + ts.runFailedTestMultiStatements(t) + ts.runTestMultiStatements(t) } -func (ts *tidbTestSuite) TestSocketForwarding(c *C) { +func TestSocketForwarding(t *testing.T) { + osTempDir := os.TempDir() + tempDir, err := os.MkdirTemp(osTempDir, "tidb-test.*.socket") + require.NoError(t, err) + socketFile := tempDir + "/tidbtest.sock" // Unix Socket does not work on Windows, so '/' should be OK + defer os.RemoveAll(tempDir) + + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + cli := newTestServerClient() cfg := newTestConfig() - cfg.Socket = "/tmp/tidbtest.sock" + cfg.Socket = socketFile cfg.Port = cli.port os.Remove(cfg.Socket) cfg.Status.ReportStatus = false server, err := NewServer(cfg, ts.tidbdrv) - c.Assert(err, IsNil) + require.NoError(t, err) cli.port = getPortFromTCPAddr(server.listener.Addr()) go func() { err := server.Run() - c.Assert(err, IsNil) + require.NoError(t, err) }() time.Sleep(time.Millisecond * 100) defer server.Close() - cli.runTestRegression(c, func(config *mysql.Config) { + cli.runTestRegression(t, func(config *mysql.Config) { config.User = "root" config.Net = "unix" - config.Addr = "/tmp/tidbtest.sock" + config.Addr = socketFile config.DBName = "test" config.Params = map[string]string{"sql_mode": "'STRICT_ALL_TABLES'"} }, "SocketRegression") } -func (ts *tidbTestSuite) TestSocket(c *C) { +func TestSocket(t *testing.T) { + osTempDir := os.TempDir() + tempDir, err := os.MkdirTemp(osTempDir, "tidb-test.*.socket") + require.NoError(t, err) + socketFile := tempDir + "/tidbtest.sock" // Unix Socket does not work on Windows, so '/' should be OK + defer os.RemoveAll(tempDir) + cfg := newTestConfig() - cfg.Socket = "/tmp/tidbtest.sock" + cfg.Socket = socketFile cfg.Port = 0 os.Remove(cfg.Socket) cfg.Host = "" cfg.Status.ReportStatus = false + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + server, err := NewServer(cfg, ts.tidbdrv) - c.Assert(err, IsNil) + require.NoError(t, err) go func() { err := server.Run() - c.Assert(err, IsNil) + require.NoError(t, err) }() time.Sleep(time.Millisecond * 100) defer server.Close() - // a fake server client, config is override, just used to run tests - cli := newTestServerClient() - cli.runTestRegression(c, func(config *mysql.Config) { + confFunc := func(config *mysql.Config) { config.User = "root" config.Net = "unix" - config.Addr = "/tmp/tidbtest.sock" + config.Addr = socketFile config.DBName = "test" config.Params = map[string]string{"sql_mode": "STRICT_ALL_TABLES"} - }, "SocketRegression") - + } + // a fake server client, config is override, just used to run tests + cli := newTestServerClient() + cli.waitUntilCustomServerCanConnect(confFunc) + cli.runTestRegression(t, confFunc, "SocketRegression") } -func (ts *tidbTestSuite) TestSocketAndIp(c *C) { +func TestSocketAndIp(t *testing.T) { osTempDir := os.TempDir() tempDir, err := os.MkdirTemp(osTempDir, "tidb-test.*.socket") - c.Assert(err, IsNil) + require.NoError(t, err) socketFile := tempDir + "/tidbtest.sock" // Unix Socket does not work on Windows, so '/' should be OK defer os.RemoveAll(tempDir) + cli := newTestServerClient() cfg := newTestConfig() cfg.Socket = socketFile cfg.Port = cli.port cfg.Status.ReportStatus = false + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + server, err := NewServer(cfg, ts.tidbdrv) - c.Assert(err, IsNil) + require.NoError(t, err) cli.port = getPortFromTCPAddr(server.listener.Addr()) go func() { err := server.Run() - c.Assert(err, IsNil) + require.NoError(t, err) }() - time.Sleep(time.Millisecond * 100) + cli.waitUntilServerCanConnect() defer server.Close() // Test with Socket connection + Setup user1@% for all host access cli.port = getPortFromTCPAddr(server.listener.Addr()) defer func() { - cli.runTests(c, func(config *mysql.Config) { + cli.runTests(t, func(config *mysql.Config) { config.User = "root" }, - func(dbt *DBTest) { - dbt.mustQuery("DROP USER IF EXISTS 'user1'@'%'") - dbt.mustQuery("DROP USER IF EXISTS 'user1'@'localhost'") - dbt.mustQuery("DROP USER IF EXISTS 'user1'@'127.0.0.1'") + func(dbt *testkit.DBTestKit) { + dbt.MustExec("DROP USER IF EXISTS 'user1'@'%'") + dbt.MustExec("DROP USER IF EXISTS 'user1'@'localhost'") + dbt.MustExec("DROP USER IF EXISTS 'user1'@'127.0.0.1'") }) }() - cli.runTests(c, func(config *mysql.Config) { + cli.runTests(t, func(config *mysql.Config) { config.User = "root" config.Net = "unix" config.Addr = socketFile config.DBName = "test" }, - func(dbt *DBTest) { - rows := dbt.mustQuery("select user()") - cli.checkRows(c, rows, "root@localhost") - rows = dbt.mustQuery("show grants") - cli.checkRows(c, rows, "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION") - dbt.mustQuery("CREATE USER user1@'%'") - dbt.mustQuery("GRANT SELECT ON test.* TO user1@'%'") + func(dbt *testkit.DBTestKit) { + rows := dbt.MustQuery("select user()") + cli.checkRows(t, rows, "root@localhost") + rows = dbt.MustQuery("show grants") + cli.checkRows(t, rows, "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION") + dbt.MustQuery("CREATE USER user1@'%'") + dbt.MustQuery("GRANT SELECT ON test.* TO user1@'%'") }) // Test with Network interface connection with all hosts - cli.runTests(c, func(config *mysql.Config) { + cli.runTests(t, func(config *mysql.Config) { config.User = "user1" config.DBName = "test" }, - func(dbt *DBTest) { - rows := dbt.mustQuery("select user()") + func(dbt *testkit.DBTestKit) { + rows := dbt.MustQuery("select user()") // NOTICE: this is not compatible with MySQL! (MySQL would report user1@localhost also for 127.0.0.1) - cli.checkRows(c, rows, "user1@127.0.0.1") - rows = dbt.mustQuery("show grants") - cli.checkRows(c, rows, "GRANT USAGE ON *.* TO 'user1'@'%'\nGRANT SELECT ON test.* TO 'user1'@'%'") + cli.checkRows(t, rows, "user1@127.0.0.1") + rows = dbt.MustQuery("show grants") + cli.checkRows(t, rows, "GRANT USAGE ON *.* TO 'user1'@'%'\nGRANT SELECT ON test.* TO 'user1'@'%'") + rows = dbt.MustQuery("select host from information_schema.processlist where user = 'user1'") + records := cli.Rows(t, rows) + require.Contains(t, records[0], ":", "Missing :<port> in is.processlist") }) // Test with unix domain socket file connection with all hosts - cli.runTests(c, func(config *mysql.Config) { + cli.runTests(t, func(config *mysql.Config) { config.Net = "unix" config.Addr = socketFile config.User = "user1" config.DBName = "test" }, - func(dbt *DBTest) { - rows := dbt.mustQuery("select user()") - cli.checkRows(c, rows, "user1@localhost") - rows = dbt.mustQuery("show grants") - cli.checkRows(c, rows, "GRANT USAGE ON *.* TO 'user1'@'%'\nGRANT SELECT ON test.* TO 'user1'@'%'") + func(dbt *testkit.DBTestKit) { + rows := dbt.MustQuery("select user()") + cli.checkRows(t, rows, "user1@localhost") + rows = dbt.MustQuery("show grants") + cli.checkRows(t, rows, "GRANT USAGE ON *.* TO 'user1'@'%'\nGRANT SELECT ON test.* TO 'user1'@'%'") }) // Setup user1@127.0.0.1 for loop back network interface access - cli.runTests(c, func(config *mysql.Config) { + cli.runTests(t, func(config *mysql.Config) { config.User = "root" config.DBName = "test" }, - func(dbt *DBTest) { - rows := dbt.mustQuery("select user()") + func(dbt *testkit.DBTestKit) { + rows := dbt.MustQuery("select user()") // NOTICE: this is not compatible with MySQL! (MySQL would report user1@localhost also for 127.0.0.1) - cli.checkRows(c, rows, "root@127.0.0.1") - rows = dbt.mustQuery("show grants") - cli.checkRows(c, rows, "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION") - dbt.mustQuery("CREATE USER user1@127.0.0.1") - dbt.mustQuery("GRANT SELECT,INSERT ON test.* TO user1@'127.0.0.1'") + cli.checkRows(t, rows, "root@127.0.0.1") + rows = dbt.MustQuery("show grants") + cli.checkRows(t, rows, "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION") + dbt.MustQuery("CREATE USER user1@127.0.0.1") + dbt.MustQuery("GRANT SELECT,INSERT ON test.* TO user1@'127.0.0.1'") }) // Test with Network interface connection with all hosts - cli.runTests(c, func(config *mysql.Config) { + cli.runTests(t, func(config *mysql.Config) { config.User = "user1" config.DBName = "test" }, - func(dbt *DBTest) { - rows := dbt.mustQuery("select user()") + func(dbt *testkit.DBTestKit) { + rows := dbt.MustQuery("select user()") // NOTICE: this is not compatible with MySQL! (MySQL would report user1@localhost also for 127.0.0.1) - cli.checkRows(c, rows, "user1@127.0.0.1") - rows = dbt.mustQuery("show grants") - cli.checkRows(c, rows, "GRANT USAGE ON *.* TO 'user1'@'127.0.0.1'\nGRANT SELECT,INSERT ON test.* TO 'user1'@'127.0.0.1'") + cli.checkRows(t, rows, "user1@127.0.0.1") + rows = dbt.MustQuery("show grants") + cli.checkRows(t, rows, "GRANT USAGE ON *.* TO 'user1'@'127.0.0.1'\nGRANT SELECT,INSERT ON test.* TO 'user1'@'127.0.0.1'") }) // Test with unix domain socket file connection with all hosts - cli.runTests(c, func(config *mysql.Config) { + cli.runTests(t, func(config *mysql.Config) { config.Net = "unix" config.Addr = socketFile config.User = "user1" config.DBName = "test" }, - func(dbt *DBTest) { - rows := dbt.mustQuery("select user()") - cli.checkRows(c, rows, "user1@localhost") - rows = dbt.mustQuery("show grants") - cli.checkRows(c, rows, "GRANT USAGE ON *.* TO 'user1'@'%'\nGRANT SELECT ON test.* TO 'user1'@'%'") + func(dbt *testkit.DBTestKit) { + rows := dbt.MustQuery("select user()") + cli.checkRows(t, rows, "user1@localhost") + rows = dbt.MustQuery("show grants") + cli.checkRows(t, rows, "GRANT USAGE ON *.* TO 'user1'@'%'\nGRANT SELECT ON test.* TO 'user1'@'%'") }) // Setup user1@localhost for socket (and if MySQL compatible; loop back network interface access) - cli.runTests(c, func(config *mysql.Config) { + cli.runTests(t, func(config *mysql.Config) { config.Net = "unix" config.Addr = socketFile config.User = "root" config.DBName = "test" }, - func(dbt *DBTest) { - rows := dbt.mustQuery("select user()") - cli.checkRows(c, rows, "root@localhost") - rows = dbt.mustQuery("show grants") - cli.checkRows(c, rows, "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION") - dbt.mustQuery("CREATE USER user1@localhost") - dbt.mustQuery("GRANT SELECT,INSERT,UPDATE,DELETE ON test.* TO user1@localhost") + func(dbt *testkit.DBTestKit) { + rows := dbt.MustQuery("select user()") + cli.checkRows(t, rows, "root@localhost") + rows = dbt.MustQuery("show grants") + cli.checkRows(t, rows, "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION") + dbt.MustExec("CREATE USER user1@localhost") + dbt.MustExec("GRANT SELECT,INSERT,UPDATE,DELETE ON test.* TO user1@localhost") }) // Test with Network interface connection with all hosts - cli.runTests(c, func(config *mysql.Config) { + cli.runTests(t, func(config *mysql.Config) { config.User = "user1" config.DBName = "test" }, - func(dbt *DBTest) { - rows := dbt.mustQuery("select user()") + func(dbt *testkit.DBTestKit) { + rows := dbt.MustQuery("select user()") // NOTICE: this is not compatible with MySQL! (MySQL would report user1@localhost also for 127.0.0.1) - cli.checkRows(c, rows, "user1@127.0.0.1") - rows = dbt.mustQuery("show grants") - cli.checkRows(c, rows, "GRANT USAGE ON *.* TO 'user1'@'127.0.0.1'\nGRANT SELECT,INSERT ON test.* TO 'user1'@'127.0.0.1'") + cli.checkRows(t, rows, "user1@127.0.0.1") + require.NoError(t, rows.Close()) + rows = dbt.MustQuery("show grants") + cli.checkRows(t, rows, "GRANT USAGE ON *.* TO 'user1'@'127.0.0.1'\nGRANT SELECT,INSERT ON test.* TO 'user1'@'127.0.0.1'") + require.NoError(t, rows.Close()) }) // Test with unix domain socket file connection with all hosts - cli.runTests(c, func(config *mysql.Config) { + cli.runTests(t, func(config *mysql.Config) { config.Net = "unix" config.Addr = socketFile config.User = "user1" config.DBName = "test" }, - func(dbt *DBTest) { - rows := dbt.mustQuery("select user()") - cli.checkRows(c, rows, "user1@localhost") - rows = dbt.mustQuery("show grants") - cli.checkRows(c, rows, "GRANT USAGE ON *.* TO 'user1'@'localhost'\nGRANT SELECT,INSERT,UPDATE,DELETE ON test.* TO 'user1'@'localhost'") + func(dbt *testkit.DBTestKit) { + rows := dbt.MustQuery("select user()") + cli.checkRows(t, rows, "user1@localhost") + require.NoError(t, rows.Close()) + rows = dbt.MustQuery("show grants") + cli.checkRows(t, rows, "GRANT USAGE ON *.* TO 'user1'@'localhost'\nGRANT SELECT,INSERT,UPDATE,DELETE ON test.* TO 'user1'@'localhost'") + require.NoError(t, rows.Close()) }) } // TestOnlySocket for server configuration without network interface for mysql clients -func (ts *tidbTestSuite) TestOnlySocket(c *C) { +func TestOnlySocket(t *testing.T) { osTempDir := os.TempDir() tempDir, err := os.MkdirTemp(osTempDir, "tidb-test.*.socket") - c.Assert(err, IsNil) + require.NoError(t, err) socketFile := tempDir + "/tidbtest.sock" // Unix Socket does not work on Windows, so '/' should be OK defer os.RemoveAll(tempDir) + cli := newTestServerClient() cfg := newTestConfig() cfg.Socket = socketFile cfg.Host = "" // No network interface listening for mysql traffic cfg.Status.ReportStatus = false + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + server, err := NewServer(cfg, ts.tidbdrv) - c.Assert(err, IsNil) + require.NoError(t, err) go func() { err := server.Run() - c.Assert(err, IsNil) + require.NoError(t, err) }() time.Sleep(time.Millisecond * 100) defer server.Close() - c.Assert(server.listener, IsNil) - c.Assert(server.socket, NotNil) + require.Nil(t, server.listener) + require.NotNil(t, server.socket) // Test with Socket connection + Setup user1@% for all host access defer func() { - cli.runTests(c, func(config *mysql.Config) { + cli.runTests(t, func(config *mysql.Config) { config.User = "root" config.Net = "unix" config.Addr = socketFile }, - func(dbt *DBTest) { - dbt.mustQuery("DROP USER IF EXISTS 'user1'@'%'") - dbt.mustQuery("DROP USER IF EXISTS 'user1'@'localhost'") - dbt.mustQuery("DROP USER IF EXISTS 'user1'@'127.0.0.1'") + func(dbt *testkit.DBTestKit) { + dbt.MustExec("DROP USER IF EXISTS 'user1'@'%'") + dbt.MustExec("DROP USER IF EXISTS 'user1'@'localhost'") + dbt.MustExec("DROP USER IF EXISTS 'user1'@'127.0.0.1'") }) }() - cli.runTests(c, func(config *mysql.Config) { + cli.runTests(t, func(config *mysql.Config) { config.User = "root" config.Net = "unix" config.Addr = socketFile config.DBName = "test" }, - func(dbt *DBTest) { - rows := dbt.mustQuery("select user()") - cli.checkRows(c, rows, "root@localhost") - rows = dbt.mustQuery("show grants") - cli.checkRows(c, rows, "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION") - dbt.mustQuery("CREATE USER user1@'%'") - dbt.mustQuery("GRANT SELECT ON test.* TO user1@'%'") + func(dbt *testkit.DBTestKit) { + rows := dbt.MustQuery("select user()") + cli.checkRows(t, rows, "root@localhost") + require.NoError(t, rows.Close()) + rows = dbt.MustQuery("show grants") + cli.checkRows(t, rows, "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION") + require.NoError(t, rows.Close()) + dbt.MustExec("CREATE USER user1@'%'") + dbt.MustExec("GRANT SELECT ON test.* TO user1@'%'") }) // Test with Network interface connection with all hosts, should fail since server not configured db, err := sql.Open("mysql", cli.getDSN(func(config *mysql.Config) { config.User = "root" config.DBName = "test" - config.Addr = "127.0.0.1" })) - c.Assert(err, IsNil, Commentf("Connect succeeded when not configured!?!")) - defer db.Close() + require.NoErrorf(t, err, "Open failed") + err = db.Ping() + require.Errorf(t, err, "Connect succeeded when not configured!?!") + db.Close() db, err = sql.Open("mysql", cli.getDSN(func(config *mysql.Config) { config.User = "user1" config.DBName = "test" - config.Addr = "127.0.0.1" })) - c.Assert(err, IsNil, Commentf("Connect succeeded when not configured!?!")) - defer db.Close() + require.NoErrorf(t, err, "Open failed") + err = db.Ping() + require.Errorf(t, err, "Connect succeeded when not configured!?!") + db.Close() // Test with unix domain socket file connection with all hosts - cli.runTests(c, func(config *mysql.Config) { + cli.runTests(t, func(config *mysql.Config) { config.Net = "unix" config.Addr = socketFile config.User = "user1" config.DBName = "test" }, - func(dbt *DBTest) { - rows := dbt.mustQuery("select user()") - cli.checkRows(c, rows, "user1@localhost") - rows = dbt.mustQuery("show grants") - cli.checkRows(c, rows, "GRANT USAGE ON *.* TO 'user1'@'%'\nGRANT SELECT ON test.* TO 'user1'@'%'") + func(dbt *testkit.DBTestKit) { + rows := dbt.MustQuery("select user()") + cli.checkRows(t, rows, "user1@localhost") + require.NoError(t, rows.Close()) + rows = dbt.MustQuery("show grants") + cli.checkRows(t, rows, "GRANT USAGE ON *.* TO 'user1'@'%'\nGRANT SELECT ON test.* TO 'user1'@'%'") + require.NoError(t, rows.Close()) }) // Setup user1@127.0.0.1 for loop back network interface access - cli.runTests(c, func(config *mysql.Config) { + cli.runTests(t, func(config *mysql.Config) { config.Net = "unix" config.Addr = socketFile config.User = "root" config.DBName = "test" }, - func(dbt *DBTest) { - rows := dbt.mustQuery("select user()") + func(dbt *testkit.DBTestKit) { + rows := dbt.MustQuery("select user()") // NOTICE: this is not compatible with MySQL! (MySQL would report user1@localhost also for 127.0.0.1) - cli.checkRows(c, rows, "root@localhost") - rows = dbt.mustQuery("show grants") - cli.checkRows(c, rows, "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION") - dbt.mustQuery("CREATE USER user1@127.0.0.1") - dbt.mustQuery("GRANT SELECT,INSERT ON test.* TO user1@'127.0.0.1'") + cli.checkRows(t, rows, "root@localhost") + require.NoError(t, rows.Close()) + rows = dbt.MustQuery("show grants") + cli.checkRows(t, rows, "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION") + require.NoError(t, rows.Close()) + dbt.MustExec("CREATE USER user1@127.0.0.1") + dbt.MustExec("GRANT SELECT,INSERT ON test.* TO user1@'127.0.0.1'") }) // Test with unix domain socket file connection with all hosts - cli.runTests(c, func(config *mysql.Config) { + cli.runTests(t, func(config *mysql.Config) { config.Net = "unix" config.Addr = socketFile config.User = "user1" config.DBName = "test" }, - func(dbt *DBTest) { - rows := dbt.mustQuery("select user()") - cli.checkRows(c, rows, "user1@localhost") - rows = dbt.mustQuery("show grants") - cli.checkRows(c, rows, "GRANT USAGE ON *.* TO 'user1'@'%'\nGRANT SELECT ON test.* TO 'user1'@'%'") + func(dbt *testkit.DBTestKit) { + rows := dbt.MustQuery("select user()") + cli.checkRows(t, rows, "user1@localhost") + require.NoError(t, rows.Close()) + rows = dbt.MustQuery("show grants") + cli.checkRows(t, rows, "GRANT USAGE ON *.* TO 'user1'@'%'\nGRANT SELECT ON test.* TO 'user1'@'%'") + require.NoError(t, rows.Close()) }) // Setup user1@localhost for socket (and if MySQL compatible; loop back network interface access) - cli.runTests(c, func(config *mysql.Config) { + cli.runTests(t, func(config *mysql.Config) { config.Net = "unix" config.Addr = socketFile config.User = "root" config.DBName = "test" }, - func(dbt *DBTest) { - rows := dbt.mustQuery("select user()") - cli.checkRows(c, rows, "root@localhost") - rows = dbt.mustQuery("show grants") - cli.checkRows(c, rows, "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION") - dbt.mustQuery("CREATE USER user1@localhost") - dbt.mustQuery("GRANT SELECT,INSERT,UPDATE,DELETE ON test.* TO user1@localhost") + func(dbt *testkit.DBTestKit) { + rows := dbt.MustQuery("select user()") + cli.checkRows(t, rows, "root@localhost") + require.NoError(t, rows.Close()) + rows = dbt.MustQuery("show grants") + cli.checkRows(t, rows, "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION") + require.NoError(t, rows.Close()) + dbt.MustExec("CREATE USER user1@localhost") + dbt.MustExec("GRANT SELECT,INSERT,UPDATE,DELETE ON test.* TO user1@localhost") }) // Test with unix domain socket file connection with all hosts - cli.runTests(c, func(config *mysql.Config) { + cli.runTests(t, func(config *mysql.Config) { config.Net = "unix" config.Addr = socketFile config.User = "user1" config.DBName = "test" }, - func(dbt *DBTest) { - rows := dbt.mustQuery("select user()") - cli.checkRows(c, rows, "user1@localhost") - rows = dbt.mustQuery("show grants") - cli.checkRows(c, rows, "GRANT USAGE ON *.* TO 'user1'@'localhost'\nGRANT SELECT,INSERT,UPDATE,DELETE ON test.* TO 'user1'@'localhost'") + func(dbt *testkit.DBTestKit) { + rows := dbt.MustQuery("select user()") + cli.checkRows(t, rows, "user1@localhost") + require.NoError(t, rows.Close()) + rows = dbt.MustQuery("show grants") + cli.checkRows(t, rows, "GRANT USAGE ON *.* TO 'user1'@'localhost'\nGRANT SELECT,INSERT,UPDATE,DELETE ON test.* TO 'user1'@'localhost'") + require.NoError(t, rows.Close()) }) } @@ -867,369 +874,38 @@ func registerTLSConfig(configName string, caCertPath string, clientCertPath stri return mysql.RegisterTLSConfig(configName, tlsConfig) } -func (ts *tidbTestSuite) TestSystemTimeZone(c *C) { - tk := testkit.NewTestKit(c, ts.store) +func TestSystemTimeZone(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + + tk := testkit.NewTestKit(t, ts.store) cfg := newTestConfig() - cfg.Socket = "" cfg.Port, cfg.Status.StatusPort = 0, 0 cfg.Status.ReportStatus = false server, err := NewServer(cfg, ts.tidbdrv) - c.Assert(err, IsNil) + require.NoError(t, err) defer server.Close() tz1 := tk.MustQuery("select variable_value from mysql.tidb where variable_name = 'system_tz'").Rows() tk.MustQuery("select @@system_time_zone").Check(tz1) } -func (ts *tidbTestSerialSuite) TestTLSAuto(c *C) { - // Start the server without TLS configure, letting the server create these as AutoTLS is enabled - connOverrider := func(config *mysql.Config) { - config.TLSConfig = "skip-verify" - } - cli := newTestServerClient() - cfg := newTestConfig() - cfg.Socket = "" - cfg.Port = cli.port - cfg.Status.ReportStatus = false - cfg.Security.AutoTLS = true - cfg.Security.RSAKeySize = 528 // Reduces unittest runtime - err := os.MkdirAll(cfg.TempStoragePath, 0700) - c.Assert(err, IsNil) - server, err := NewServer(cfg, ts.tidbdrv) - c.Assert(err, IsNil) - cli.port = getPortFromTCPAddr(server.listener.Addr()) - go func() { - err := server.Run() - c.Assert(err, IsNil) - }() - time.Sleep(time.Millisecond * 100) - err = cli.runTestTLSConnection(c, connOverrider) // Relying on automatically created TLS certificates - c.Assert(err, IsNil) - - server.Close() -} - -func (ts *tidbTestSerialSuite) TestTLSBasic(c *C) { - // Generate valid TLS certificates. - caCert, caKey, err := generateCert(0, "TiDB CA", nil, nil, "/tmp/ca-key.pem", "/tmp/ca-cert.pem") - c.Assert(err, IsNil) - serverCert, _, err := generateCert(1, "tidb-server", caCert, caKey, "/tmp/server-key.pem", "/tmp/server-cert.pem") - c.Assert(err, IsNil) - _, _, err = generateCert(2, "SQL Client Certificate", caCert, caKey, "/tmp/client-key.pem", "/tmp/client-cert.pem") - c.Assert(err, IsNil) - err = registerTLSConfig("client-certificate", "/tmp/ca-cert.pem", "/tmp/client-cert.pem", "/tmp/client-key.pem", "tidb-server", true) - c.Assert(err, IsNil) - - defer func() { - err := os.Remove("/tmp/ca-key.pem") - c.Assert(err, IsNil) - err = os.Remove("/tmp/ca-cert.pem") - c.Assert(err, IsNil) - err = os.Remove("/tmp/server-key.pem") - c.Assert(err, IsNil) - err = os.Remove("/tmp/server-cert.pem") - c.Assert(err, IsNil) - err = os.Remove("/tmp/client-key.pem") - c.Assert(err, IsNil) - err = os.Remove("/tmp/client-cert.pem") - c.Assert(err, IsNil) - }() - - // Start the server with TLS but without CA, in this case the server will not verify client's certificate. - connOverrider := func(config *mysql.Config) { - config.TLSConfig = "skip-verify" - } - cli := newTestServerClient() - cfg := newTestConfig() - cfg.Socket = "" - cfg.Port = cli.port - cfg.Status.ReportStatus = false - cfg.Security = config.Security{ - SSLCert: "/tmp/server-cert.pem", - SSLKey: "/tmp/server-key.pem", - } - server, err := NewServer(cfg, ts.tidbdrv) - c.Assert(err, IsNil) - cli.port = getPortFromTCPAddr(server.listener.Addr()) - go func() { - err := server.Run() - c.Assert(err, IsNil) - }() - time.Sleep(time.Millisecond * 100) - err = cli.runTestTLSConnection(c, connOverrider) // We should establish connection successfully. - c.Assert(err, IsNil) - cli.runTestRegression(c, connOverrider, "TLSRegression") - // Perform server verification. - connOverrider = func(config *mysql.Config) { - config.TLSConfig = "client-certificate" - } - err = cli.runTestTLSConnection(c, connOverrider) // We should establish connection successfully. - c.Assert(err, IsNil, Commentf("%v", errors.ErrorStack(err))) - cli.runTestRegression(c, connOverrider, "TLSRegression") - - // Test SSL/TLS session vars - var v *variable.SessionVars - stats, err := server.Stats(v) - c.Assert(err, IsNil) - c.Assert(stats, HasKey, "Ssl_server_not_after") - c.Assert(stats, HasKey, "Ssl_server_not_before") - c.Assert(stats["Ssl_server_not_after"], Equals, serverCert.NotAfter.Format("Jan _2 15:04:05 2006 MST")) - c.Assert(stats["Ssl_server_not_before"], Equals, serverCert.NotBefore.Format("Jan _2 15:04:05 2006 MST")) +func TestClientWithCollation(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() - server.Close() + ts.runTestClientWithCollation(t) } -func (ts *tidbTestSerialSuite) TestTLSVerify(c *C) { - // Generate valid TLS certificates. - caCert, caKey, err := generateCert(0, "TiDB CA", nil, nil, "/tmp/ca-key.pem", "/tmp/ca-cert.pem") - c.Assert(err, IsNil) - _, _, err = generateCert(1, "tidb-server", caCert, caKey, "/tmp/server-key.pem", "/tmp/server-cert.pem") - c.Assert(err, IsNil) - _, _, err = generateCert(2, "SQL Client Certificate", caCert, caKey, "/tmp/client-key.pem", "/tmp/client-cert.pem") - c.Assert(err, IsNil) - err = registerTLSConfig("client-certificate", "/tmp/ca-cert.pem", "/tmp/client-cert.pem", "/tmp/client-key.pem", "tidb-server", true) - c.Assert(err, IsNil) - - defer func() { - err := os.Remove("/tmp/ca-key.pem") - c.Assert(err, IsNil) - err = os.Remove("/tmp/ca-cert.pem") - c.Assert(err, IsNil) - err = os.Remove("/tmp/server-key.pem") - c.Assert(err, IsNil) - err = os.Remove("/tmp/server-cert.pem") - c.Assert(err, IsNil) - err = os.Remove("/tmp/client-key.pem") - c.Assert(err, IsNil) - err = os.Remove("/tmp/client-cert.pem") - c.Assert(err, IsNil) - }() +func TestCreateTableFlen(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() - // Start the server with TLS & CA, if the client presents its certificate, the certificate will be verified. - cli := newTestServerClient() - cfg := newTestConfig() - cfg.Socket = "" - cfg.Port = cli.port - cfg.Status.ReportStatus = false - cfg.Security = config.Security{ - SSLCA: "/tmp/ca-cert.pem", - SSLCert: "/tmp/server-cert.pem", - SSLKey: "/tmp/server-key.pem", - } - server, err := NewServer(cfg, ts.tidbdrv) - c.Assert(err, IsNil) - cli.port = getPortFromTCPAddr(server.listener.Addr()) - go func() { - err := server.Run() - c.Assert(err, IsNil) - }() - time.Sleep(time.Millisecond * 100) - // The client does not provide a certificate, the connection should succeed. - err = cli.runTestTLSConnection(c, nil) - c.Assert(err, IsNil) - connOverrider := func(config *mysql.Config) { - config.TLSConfig = "client-certificate" - } - cli.runTestRegression(c, connOverrider, "TLSRegression") - // The client provides a valid certificate. - connOverrider = func(config *mysql.Config) { - config.TLSConfig = "client-certificate" - } - err = cli.runTestTLSConnection(c, connOverrider) - c.Assert(err, IsNil) - cli.runTestRegression(c, connOverrider, "TLSRegression") - server.Close() - - c.Assert(util.IsTLSExpiredError(errors.New("unknown test")), IsFalse) - c.Assert(util.IsTLSExpiredError(x509.CertificateInvalidError{Reason: x509.CANotAuthorizedForThisName}), IsFalse) - c.Assert(util.IsTLSExpiredError(x509.CertificateInvalidError{Reason: x509.Expired}), IsTrue) - - _, _, err = util.LoadTLSCertificates("", "wrong key", "wrong cert", true, 528) - c.Assert(err, NotNil) - _, _, err = util.LoadTLSCertificates("wrong ca", "/tmp/server-key.pem", "/tmp/server-cert.pem", true, 528) - c.Assert(err, NotNil) -} - -func (ts *tidbTestSerialSuite) TestReloadTLS(c *C) { - // Generate valid TLS certificates. - caCert, caKey, err := generateCert(0, "TiDB CA", nil, nil, "/tmp/ca-key-reload.pem", "/tmp/ca-cert-reload.pem") - c.Assert(err, IsNil) - _, _, err = generateCert(1, "tidb-server", caCert, caKey, "/tmp/server-key-reload.pem", "/tmp/server-cert-reload.pem") - c.Assert(err, IsNil) - _, _, err = generateCert(2, "SQL Client Certificate", caCert, caKey, "/tmp/client-key-reload.pem", "/tmp/client-cert-reload.pem") - c.Assert(err, IsNil) - err = registerTLSConfig("client-certificate-reload", "/tmp/ca-cert-reload.pem", "/tmp/client-cert-reload.pem", "/tmp/client-key-reload.pem", "tidb-server", true) - c.Assert(err, IsNil) - - defer func() { - os.Remove("/tmp/ca-key-reload.pem") - os.Remove("/tmp/ca-cert-reload.pem") - - os.Remove("/tmp/server-key-reload.pem") - os.Remove("/tmp/server-cert-reload.pem") - os.Remove("/tmp/client-key-reload.pem") - os.Remove("/tmp/client-cert-reload.pem") - }() - - // try old cert used in startup configuration. - cli := newTestServerClient() - cfg := newTestConfig() - cfg.Socket = "" - cfg.Port = cli.port - cfg.Status.ReportStatus = false - cfg.Security = config.Security{ - SSLCA: "/tmp/ca-cert-reload.pem", - SSLCert: "/tmp/server-cert-reload.pem", - SSLKey: "/tmp/server-key-reload.pem", - } - server, err := NewServer(cfg, ts.tidbdrv) - c.Assert(err, IsNil) - cli.port = getPortFromTCPAddr(server.listener.Addr()) - go func() { - err := server.Run() - c.Assert(err, IsNil) - }() - time.Sleep(time.Millisecond * 100) - // The client provides a valid certificate. - connOverrider := func(config *mysql.Config) { - config.TLSConfig = "client-certificate-reload" - } - err = cli.runTestTLSConnection(c, connOverrider) - c.Assert(err, IsNil) - - // try reload a valid cert. - tlsCfg := server.getTLSConfig() - cert, err := x509.ParseCertificate(tlsCfg.Certificates[0].Certificate[0]) - c.Assert(err, IsNil) - oldExpireTime := cert.NotAfter - _, _, err = generateCert(1, "tidb-server", caCert, caKey, "/tmp/server-key-reload2.pem", "/tmp/server-cert-reload2.pem", func(c *x509.Certificate) { - c.NotBefore = time.Now().Add(-24 * time.Hour).UTC() - c.NotAfter = time.Now().Add(1 * time.Hour).UTC() - }) - c.Assert(err, IsNil) - err = os.Rename("/tmp/server-key-reload2.pem", "/tmp/server-key-reload.pem") - c.Assert(err, IsNil) - err = os.Rename("/tmp/server-cert-reload2.pem", "/tmp/server-cert-reload.pem") - c.Assert(err, IsNil) - connOverrider = func(config *mysql.Config) { - config.TLSConfig = "skip-verify" - } - err = cli.runReloadTLS(c, connOverrider, false) - c.Assert(err, IsNil) - connOverrider = func(config *mysql.Config) { - config.TLSConfig = "client-certificate-reload" - } - err = cli.runTestTLSConnection(c, connOverrider) - c.Assert(err, IsNil) - - tlsCfg = server.getTLSConfig() - cert, err = x509.ParseCertificate(tlsCfg.Certificates[0].Certificate[0]) - c.Assert(err, IsNil) - newExpireTime := cert.NotAfter - c.Assert(newExpireTime.After(oldExpireTime), IsTrue) - - // try reload a expired cert. - _, _, err = generateCert(1, "tidb-server", caCert, caKey, "/tmp/server-key-reload3.pem", "/tmp/server-cert-reload3.pem", func(c *x509.Certificate) { - c.NotBefore = time.Now().Add(-24 * time.Hour).UTC() - c.NotAfter = c.NotBefore.Add(1 * time.Hour).UTC() - }) - c.Assert(err, IsNil) - err = os.Rename("/tmp/server-key-reload3.pem", "/tmp/server-key-reload.pem") - c.Assert(err, IsNil) - err = os.Rename("/tmp/server-cert-reload3.pem", "/tmp/server-cert-reload.pem") - c.Assert(err, IsNil) - connOverrider = func(config *mysql.Config) { - config.TLSConfig = "skip-verify" - } - err = cli.runReloadTLS(c, connOverrider, false) - c.Assert(err, IsNil) - connOverrider = func(config *mysql.Config) { - config.TLSConfig = "client-certificate-reload" - } - err = cli.runTestTLSConnection(c, connOverrider) - c.Assert(err, NotNil) - c.Assert(util.IsTLSExpiredError(err), IsTrue, Commentf("real error is %+v", err)) - server.Close() -} - -func (ts *tidbTestSerialSuite) TestErrorNoRollback(c *C) { - // Generate valid TLS certificates. - caCert, caKey, err := generateCert(0, "TiDB CA", nil, nil, "/tmp/ca-key-rollback.pem", "/tmp/ca-cert-rollback.pem") - c.Assert(err, IsNil) - _, _, err = generateCert(1, "tidb-server", caCert, caKey, "/tmp/server-key-rollback.pem", "/tmp/server-cert-rollback.pem") - c.Assert(err, IsNil) - _, _, err = generateCert(2, "SQL Client Certificate", caCert, caKey, "/tmp/client-key-rollback.pem", "/tmp/client-cert-rollback.pem") - c.Assert(err, IsNil) - err = registerTLSConfig("client-cert-rollback-test", "/tmp/ca-cert-rollback.pem", "/tmp/client-cert-rollback.pem", "/tmp/client-key-rollback.pem", "tidb-server", true) - c.Assert(err, IsNil) - - defer func() { - os.Remove("/tmp/ca-key-rollback.pem") - os.Remove("/tmp/ca-cert-rollback.pem") - - os.Remove("/tmp/server-key-rollback.pem") - os.Remove("/tmp/server-cert-rollback.pem") - os.Remove("/tmp/client-key-rollback.pem") - os.Remove("/tmp/client-cert-rollback.pem") - }() - - cli := newTestServerClient() - cfg := newTestConfig() - cfg.Socket = "" - cfg.Port = cli.port - cfg.Status.ReportStatus = false - - cfg.Security = config.Security{ - RequireSecureTransport: true, - SSLCA: "wrong path", - SSLCert: "wrong path", - SSLKey: "wrong path", - } - _, err = NewServer(cfg, ts.tidbdrv) - c.Assert(err, NotNil) - - // test reload tls fail with/without "error no rollback option" - cfg.Security = config.Security{ - SSLCA: "/tmp/ca-cert-rollback.pem", - SSLCert: "/tmp/server-cert-rollback.pem", - SSLKey: "/tmp/server-key-rollback.pem", - } - server, err := NewServer(cfg, ts.tidbdrv) - c.Assert(err, IsNil) - cli.port = getPortFromTCPAddr(server.listener.Addr()) - go func() { - err := server.Run() - c.Assert(err, IsNil) - }() - defer server.Close() - time.Sleep(time.Millisecond * 100) - connOverrider := func(config *mysql.Config) { - config.TLSConfig = "client-cert-rollback-test" - } - err = cli.runTestTLSConnection(c, connOverrider) - c.Assert(err, IsNil) - os.Remove("/tmp/server-key-rollback.pem") - err = cli.runReloadTLS(c, connOverrider, false) - c.Assert(err, NotNil) - tlsCfg := server.getTLSConfig() - c.Assert(tlsCfg, NotNil) - err = cli.runReloadTLS(c, connOverrider, true) - c.Assert(err, IsNil) - tlsCfg = server.getTLSConfig() - c.Assert(tlsCfg, IsNil) -} - -func (ts *tidbTestSuite) TestClientWithCollation(c *C) { - c.Parallel() - ts.runTestClientWithCollation(c) -} - -func (ts *tidbTestSuite) TestCreateTableFlen(c *C) { // issue #4540 qctx, err := ts.tidbdrv.OpenCtx(uint64(0), 0, uint8(tmysql.DefaultCollationID), "test", nil) - c.Assert(err, IsNil) + require.NoError(t, err) _, err = Execute(context.Background(), qctx, "use test;") - c.Assert(err, IsNil) + require.NoError(t, err) ctx := context.Background() testSQL := "CREATE TABLE `t1` (" + @@ -1262,25 +938,25 @@ func (ts *tidbTestSuite) TestCreateTableFlen(c *C) { "PRIMARY KEY (`a`)" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin" _, err = Execute(ctx, qctx, testSQL) - c.Assert(err, IsNil) + require.NoError(t, err) rs, err := Execute(ctx, qctx, "show create table t1") - c.Assert(err, IsNil) - req := rs.NewChunk() + require.NoError(t, err) + req := rs.NewChunk(nil) err = rs.Next(ctx, req) - c.Assert(err, IsNil) + require.NoError(t, err) cols := rs.Columns() - c.Assert(err, IsNil) - c.Assert(len(cols), Equals, 2) - c.Assert(int(cols[0].ColumnLength), Equals, 5*tmysql.MaxBytesOfCharacter) - c.Assert(int(cols[1].ColumnLength), Equals, len(req.GetRow(0).GetString(1))*tmysql.MaxBytesOfCharacter) + require.NoError(t, err) + require.Len(t, cols, 2) + require.Equal(t, 5*tmysql.MaxBytesOfCharacter, int(cols[0].ColumnLength)) + require.Equal(t, len(req.GetRow(0).GetString(1))*tmysql.MaxBytesOfCharacter, int(cols[1].ColumnLength)) // for issue#5246 rs, err = Execute(ctx, qctx, "select y, z from t1") - c.Assert(err, IsNil) + require.NoError(t, err) cols = rs.Columns() - c.Assert(len(cols), Equals, 2) - c.Assert(int(cols[0].ColumnLength), Equals, 21) - c.Assert(int(cols[1].ColumnLength), Equals, 22) + require.Len(t, cols, 2) + require.Equal(t, 21, int(cols[0].ColumnLength)) + require.Equal(t, 22, int(cols[1].ColumnLength)) } func Execute(ctx context.Context, qc *TiDBContext, sql string) (ResultSet, error) { @@ -1294,39 +970,45 @@ func Execute(ctx context.Context, qc *TiDBContext, sql string) (ResultSet, error return qc.ExecuteStmt(ctx, stmts[0]) } -func (ts *tidbTestSuite) TestShowTablesFlen(c *C) { +func TestShowTablesFlen(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + qctx, err := ts.tidbdrv.OpenCtx(uint64(0), 0, uint8(tmysql.DefaultCollationID), "test", nil) - c.Assert(err, IsNil) + require.NoError(t, err) ctx := context.Background() _, err = Execute(ctx, qctx, "use test;") - c.Assert(err, IsNil) + require.NoError(t, err) testSQL := "create table abcdefghijklmnopqrstuvwxyz (i int)" _, err = Execute(ctx, qctx, testSQL) - c.Assert(err, IsNil) + require.NoError(t, err) rs, err := Execute(ctx, qctx, "show tables") - c.Assert(err, IsNil) - req := rs.NewChunk() + require.NoError(t, err) + req := rs.NewChunk(nil) err = rs.Next(ctx, req) - c.Assert(err, IsNil) + require.NoError(t, err) cols := rs.Columns() - c.Assert(err, IsNil) - c.Assert(len(cols), Equals, 1) - c.Assert(int(cols[0].ColumnLength), Equals, 26*tmysql.MaxBytesOfCharacter) + require.NoError(t, err) + require.Len(t, cols, 1) + require.Equal(t, 26*tmysql.MaxBytesOfCharacter, int(cols[0].ColumnLength)) } -func checkColNames(c *C, columns []*ColumnInfo, names ...string) { +func checkColNames(t *testing.T, columns []*ColumnInfo, names ...string) { for i, name := range names { - c.Assert(columns[i].Name, Equals, name) - c.Assert(columns[i].OrgName, Equals, name) + require.Equal(t, name, columns[i].Name) + require.Equal(t, name, columns[i].OrgName) } } -func (ts *tidbTestSuite) TestFieldList(c *C) { +func TestFieldList(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + qctx, err := ts.tidbdrv.OpenCtx(uint64(0), 0, uint8(tmysql.DefaultCollationID), "test", nil) - c.Assert(err, IsNil) + require.NoError(t, err) _, err = Execute(context.Background(), qctx, "use test;") - c.Assert(err, IsNil) + require.NoError(t, err) ctx := context.Background() testSQL := `create table t ( @@ -1351,22 +1033,22 @@ func (ts *tidbTestSuite) TestFieldList(c *C) { c_year year )` _, err = Execute(ctx, qctx, testSQL) - c.Assert(err, IsNil) + require.NoError(t, err) colInfos, err := qctx.FieldList("t") - c.Assert(err, IsNil) - c.Assert(len(colInfos), Equals, 19) + require.NoError(t, err) + require.Len(t, colInfos, 19) - checkColNames(c, colInfos, "c_bit", "c_int_d", "c_bigint_d", "c_float_d", + checkColNames(t, colInfos, "c_bit", "c_int_d", "c_bigint_d", "c_float_d", "c_double_d", "c_decimal", "c_datetime", "c_time", "c_date", "c_timestamp", "c_char", "c_varchar", "c_text_d", "c_binary", "c_blob_d", "c_set", "c_enum", "c_json", "c_year") for _, cols := range colInfos { - c.Assert(cols.Schema, Equals, "test") + require.Equal(t, "test", cols.Schema) } for _, cols := range colInfos { - c.Assert(cols.Table, Equals, "t") + require.Equal(t, "t", cols.Table) } for i, col := range colInfos { @@ -1374,279 +1056,248 @@ func (ts *tidbTestSuite) TestFieldList(c *C) { case 10, 11, 12, 15, 16: // c_char char(20), c_varchar varchar(20), c_text_d text, // c_set set('a', 'b', 'c'), c_enum enum('a', 'b', 'c') - c.Assert(col.Charset, Equals, uint16(tmysql.CharsetNameToID(tmysql.DefaultCharset)), Commentf("index %d", i)) + require.Equalf(t, uint16(tmysql.CharsetNameToID(tmysql.DefaultCharset)), col.Charset, "index %d", i) continue } - c.Assert(col.Charset, Equals, uint16(tmysql.CharsetNameToID("binary")), Commentf("index %d", i)) + require.Equalf(t, uint16(tmysql.CharsetNameToID("binary")), col.Charset, "index %d", i) } // c_decimal decimal(6, 3) - c.Assert(colInfos[5].Decimal, Equals, uint8(3)) + require.Equal(t, uint8(3), colInfos[5].Decimal) // for issue#10513 tooLongColumnAsName := "COALESCE(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)" columnAsName := tooLongColumnAsName[:tmysql.MaxAliasIdentifierLen] rs, err := Execute(ctx, qctx, "select "+tooLongColumnAsName) - c.Assert(err, IsNil) + require.NoError(t, err) cols := rs.Columns() - c.Assert(cols[0].OrgName, Equals, tooLongColumnAsName) - c.Assert(cols[0].Name, Equals, columnAsName) + require.Equal(t, tooLongColumnAsName, cols[0].OrgName) + require.Equal(t, columnAsName, cols[0].Name) rs, err = Execute(ctx, qctx, "select c_bit as '"+tooLongColumnAsName+"' from t") - c.Assert(err, IsNil) + require.NoError(t, err) cols = rs.Columns() - c.Assert(cols[0].OrgName, Equals, "c_bit") - c.Assert(cols[0].Name, Equals, columnAsName) + require.Equal(t, "c_bit", cols[0].OrgName) + require.Equal(t, columnAsName, cols[0].Name) } -func (ts *tidbTestSuite) TestClientErrors(c *C) { - ts.runTestInfoschemaClientErrors(c) +func TestClientErrors(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + ts.runTestInfoschemaClientErrors(t) } -func (ts *tidbTestSuite) TestInitConnect(c *C) { - ts.runTestInitConnect(c) +func TestInitConnect(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + ts.runTestInitConnect(t) } -func (ts *tidbTestSuite) TestSumAvg(c *C) { - c.Parallel() - ts.runTestSumAvg(c) +func TestSumAvg(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + ts.runTestSumAvg(t) } -func (ts *tidbTestSuite) TestNullFlag(c *C) { +func TestNullFlag(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + qctx, err := ts.tidbdrv.OpenCtx(uint64(0), 0, uint8(tmysql.DefaultCollationID), "test", nil) - c.Assert(err, IsNil) + require.NoError(t, err) ctx := context.Background() { // issue #9689 rs, err := Execute(ctx, qctx, "select 1") - c.Assert(err, IsNil) + require.NoError(t, err) cols := rs.Columns() - c.Assert(len(cols), Equals, 1) + require.Len(t, cols, 1) expectFlag := uint16(tmysql.NotNullFlag | tmysql.BinaryFlag) - c.Assert(dumpFlag(cols[0].Type, cols[0].Flag), Equals, expectFlag) + require.Equal(t, expectFlag, dumpFlag(cols[0].Type, cols[0].Flag)) } { // issue #19025 rs, err := Execute(ctx, qctx, "select convert('{}', JSON)") - c.Assert(err, IsNil) + require.NoError(t, err) cols := rs.Columns() - c.Assert(len(cols), Equals, 1) + require.Len(t, cols, 1) expectFlag := uint16(tmysql.BinaryFlag) - c.Assert(dumpFlag(cols[0].Type, cols[0].Flag), Equals, expectFlag) + require.Equal(t, expectFlag, dumpFlag(cols[0].Type, cols[0].Flag)) } { // issue #18488 _, err := Execute(ctx, qctx, "use test") - c.Assert(err, IsNil) + require.NoError(t, err) _, err = Execute(ctx, qctx, "CREATE TABLE `test` (`iD` bigint(20) NOT NULL, `INT_TEST` int(11) DEFAULT NULL);") - c.Assert(err, IsNil) + require.NoError(t, err) rs, err := Execute(ctx, qctx, `SELECT id + int_test as res FROM test GROUP BY res ORDER BY res;`) - c.Assert(err, IsNil) + require.NoError(t, err) cols := rs.Columns() - c.Assert(len(cols), Equals, 1) + require.Len(t, cols, 1) expectFlag := uint16(tmysql.BinaryFlag) - c.Assert(dumpFlag(cols[0].Type, cols[0].Flag), Equals, expectFlag) + require.Equal(t, expectFlag, dumpFlag(cols[0].Type, cols[0].Flag)) } { rs, err := Execute(ctx, qctx, "select if(1, null, 1) ;") - c.Assert(err, IsNil) + require.NoError(t, err) cols := rs.Columns() - c.Assert(len(cols), Equals, 1) + require.Len(t, cols, 1) expectFlag := uint16(tmysql.BinaryFlag) - c.Assert(dumpFlag(cols[0].Type, cols[0].Flag), Equals, expectFlag) + require.Equal(t, expectFlag, dumpFlag(cols[0].Type, cols[0].Flag)) } { rs, err := Execute(ctx, qctx, "select CASE 1 WHEN 2 THEN 1 END ;") - c.Assert(err, IsNil) + require.NoError(t, err) cols := rs.Columns() - c.Assert(len(cols), Equals, 1) + require.Len(t, cols, 1) expectFlag := uint16(tmysql.BinaryFlag) - c.Assert(dumpFlag(cols[0].Type, cols[0].Flag), Equals, expectFlag) + require.Equal(t, expectFlag, dumpFlag(cols[0].Type, cols[0].Flag)) } { rs, err := Execute(ctx, qctx, "select NULL;") - c.Assert(err, IsNil) + require.NoError(t, err) cols := rs.Columns() - c.Assert(len(cols), Equals, 1) + require.Len(t, cols, 1) expectFlag := uint16(tmysql.BinaryFlag) - c.Assert(dumpFlag(cols[0].Type, cols[0].Flag), Equals, expectFlag) + require.Equal(t, expectFlag, dumpFlag(cols[0].Type, cols[0].Flag)) } } -func (ts *tidbTestSuite) TestNO_DEFAULT_VALUEFlag(c *C) { +func TestNO_DEFAULT_VALUEFlag(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + // issue #21465 qctx, err := ts.tidbdrv.OpenCtx(uint64(0), 0, uint8(tmysql.DefaultCollationID), "test", nil) - c.Assert(err, IsNil) + require.NoError(t, err) ctx := context.Background() _, err = Execute(ctx, qctx, "use test") - c.Assert(err, IsNil) + require.NoError(t, err) _, err = Execute(ctx, qctx, "drop table if exists t") - c.Assert(err, IsNil) + require.NoError(t, err) _, err = Execute(ctx, qctx, "create table t(c1 int key, c2 int);") - c.Assert(err, IsNil) + require.NoError(t, err) rs, err := Execute(ctx, qctx, "select c1 from t;") - c.Assert(err, IsNil) + require.NoError(t, err) cols := rs.Columns() - c.Assert(len(cols), Equals, 1) + require.Len(t, cols, 1) expectFlag := uint16(tmysql.NotNullFlag | tmysql.PriKeyFlag | tmysql.NoDefaultValueFlag) - c.Assert(dumpFlag(cols[0].Type, cols[0].Flag), Equals, expectFlag) + require.Equal(t, expectFlag, dumpFlag(cols[0].Type, cols[0].Flag)) } -func (ts *tidbTestSuite) TestGracefulShutdown(c *C) { - store, err := mockstore.NewMockStore() - c.Assert(err, IsNil) - defer store.Close() - session.DisableStats4Test() - dom, err := session.BootstrapSession(store) - c.Assert(err, IsNil) - defer dom.Close() - ts.tidbdrv = NewTiDBDriver(ts.store) +func TestGracefulShutdown(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + cli := newTestServerClient() cfg := newTestConfig() - cfg.Socket = "" cfg.GracefulWaitBeforeShutdown = 2 // wait before shutdown cfg.Port = 0 cfg.Status.StatusPort = 0 cfg.Status.ReportStatus = true cfg.Performance.TCPKeepAlive = true server, err := NewServer(cfg, ts.tidbdrv) - c.Assert(err, IsNil) - c.Assert(server, NotNil) + require.NoError(t, err) + require.NotNil(t, server) cli.port = getPortFromTCPAddr(server.listener.Addr()) cli.statusPort = getPortFromTCPAddr(server.statusListener.Addr()) go func() { err := server.Run() - c.Assert(err, IsNil) + require.NoError(t, err) }() time.Sleep(time.Millisecond * 100) resp, err := cli.fetchStatus("/status") // server is up - c.Assert(err, IsNil) - c.Assert(resp.Body.Close(), IsNil) + require.NoError(t, err) + require.Nil(t, resp.Body.Close()) go server.Close() time.Sleep(time.Millisecond * 500) resp, _ = cli.fetchStatus("/status") // should return 5xx code - c.Assert(resp.StatusCode, Equals, 500) - c.Assert(resp.Body.Close(), IsNil) + require.Equal(t, 500, resp.StatusCode) + require.Nil(t, resp.Body.Close()) time.Sleep(time.Second * 2) // nolint: bodyclose _, err = cli.fetchStatus("/status") // status is gone - c.Assert(err, ErrorMatches, ".*connect: connection refused") + require.Error(t, err) + require.Regexp(t, "connect: connection refused$", err.Error()) } -func (ts *tidbTestSerialSuite) TestDefaultCharacterAndCollation(c *C) { - // issue #21194 - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - // 255 is the collation id of mysql client 8 default collation_connection - qctx, err := ts.tidbdrv.OpenCtx(uint64(0), 0, uint8(255), "test", nil) - c.Assert(err, IsNil) - testCase := []struct { - variable string - except string - }{ - {"collation_connection", "utf8mb4_bin"}, - {"character_set_connection", "utf8mb4"}, - {"character_set_client", "utf8mb4"}, - } - - for _, t := range testCase { - sVars, b := qctx.GetSessionVars().GetSystemVar(t.variable) - c.Assert(b, IsTrue) - c.Assert(sVars, Equals, t.except) - } -} +func TestPessimisticInsertSelectForUpdate(t *testing.T) { + ts, cleanup := createTidbTestSuite(t) + defer cleanup() -func (ts *tidbTestSuite) TestPessimisticInsertSelectForUpdate(c *C) { qctx, err := ts.tidbdrv.OpenCtx(uint64(0), 0, uint8(tmysql.DefaultCollationID), "test", nil) - c.Assert(err, IsNil) + require.NoError(t, err) defer qctx.Close() ctx := context.Background() _, err = Execute(ctx, qctx, "use test;") - c.Assert(err, IsNil) + require.NoError(t, err) _, err = Execute(ctx, qctx, "drop table if exists t1, t2") - c.Assert(err, IsNil) + require.NoError(t, err) _, err = Execute(ctx, qctx, "create table t1 (id int)") - c.Assert(err, IsNil) + require.NoError(t, err) _, err = Execute(ctx, qctx, "create table t2 (id int)") - c.Assert(err, IsNil) + require.NoError(t, err) _, err = Execute(ctx, qctx, "insert into t1 select 1") - c.Assert(err, IsNil) + require.NoError(t, err) _, err = Execute(ctx, qctx, "begin pessimistic") - c.Assert(err, IsNil) + require.NoError(t, err) rs, err := Execute(ctx, qctx, "INSERT INTO t2 (id) select id from t1 where id = 1 for update") - c.Assert(err, IsNil) - c.Assert(rs, IsNil) // should be no delay -} - -func (ts *tidbTestSerialSuite) TestPrepareCount(c *C) { - qctx, err := ts.tidbdrv.OpenCtx(uint64(0), 0, uint8(tmysql.DefaultCollationID), "test", nil) - c.Assert(err, IsNil) - prepareCnt := atomic.LoadInt64(&variable.PreparedStmtCount) - ctx := context.Background() - _, err = Execute(ctx, qctx, "use test;") - c.Assert(err, IsNil) - _, err = Execute(ctx, qctx, "drop table if exists t1") - c.Assert(err, IsNil) - _, err = Execute(ctx, qctx, "create table t1 (id int)") - c.Assert(err, IsNil) - stmt, _, _, err := qctx.Prepare("insert into t1 values (?)") - c.Assert(err, IsNil) - c.Assert(atomic.LoadInt64(&variable.PreparedStmtCount), Equals, prepareCnt+1) - c.Assert(err, IsNil) - err = qctx.GetStatement(stmt.ID()).Close() - c.Assert(err, IsNil) - c.Assert(atomic.LoadInt64(&variable.PreparedStmtCount), Equals, prepareCnt) + require.NoError(t, err) + require.Nil(t, rs) // should be no delay } type collectorWrapper struct { reporter.TopSQLReporter } -func (ts *tidbTestTopSQLSuite) TestTopSQLCPUProfile(c *C) { +func TestTopSQLCPUProfile(t *testing.T) { + ts, cleanup := createTidbTestTopSQLSuite(t) + defer cleanup() + db, err := sql.Open("mysql", ts.getDSN()) - c.Assert(err, IsNil, Commentf("Error connecting")) + require.NoError(t, err) defer func() { err := db.Close() - c.Assert(err, IsNil) + require.NoError(t, err) }() - c.Assert(failpoint.Enable("github.com/pingcap/tidb/domain/skipLoadSysVarCacheLoop", `return(true)`), IsNil) - c.Assert(failpoint.Enable("github.com/pingcap/tidb/util/topsql/mockHighLoadForEachSQL", `return(true)`), IsNil) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/domain/skipLoadSysVarCacheLoop", `return(true)`)) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/util/topsql/mockHighLoadForEachSQL", `return(true)`)) defer func() { err = failpoint.Disable("github.com/pingcap/tidb/domain/skipLoadSysVarCacheLoop") - c.Assert(err, IsNil) + require.NoError(t, err) err = failpoint.Disable("github.com/pingcap/tidb/util/topsql/mockHighLoadForEachSQL") - c.Assert(err, IsNil) + require.NoError(t, err) }() collector := mockTopSQLTraceCPU.NewTopSQLCollector() tracecpu.GlobalSQLCPUProfiler.SetCollector(&collectorWrapper{collector}) - dbt := &DBTest{c, db} - dbt.mustExec("drop database if exists topsql") - dbt.mustExec("create database topsql") - dbt.mustExec("use topsql;") - dbt.mustExec("create table t (a int auto_increment, b int, unique index idx(a));") - dbt.mustExec("create table t1 (a int auto_increment, b int, unique index idx(a));") - dbt.mustExec("create table t2 (a int auto_increment, b int, unique index idx(a));") - dbt.mustExec("set @@global.tidb_enable_top_sql='On';") + dbt := testkit.NewDBTestKit(t, db) + dbt.MustExec("drop database if exists topsql") + dbt.MustExec("create database topsql") + dbt.MustExec("use topsql;") + dbt.MustExec("create table t (a int auto_increment, b int, unique index idx(a));") + dbt.MustExec("create table t1 (a int auto_increment, b int, unique index idx(a));") + dbt.MustExec("create table t2 (a int auto_increment, b int, unique index idx(a));") + dbt.MustExec("set @@global.tidb_enable_top_sql='On';") config.UpdateGlobal(func(conf *config.Config) { conf.TopSQL.ReceiverAddress = "127.0.0.1:4001" }) - dbt.mustExec("set @@global.tidb_top_sql_precision_seconds=1;") - dbt.mustExec("set @@global.tidb_txn_mode = 'pessimistic'") + dbt.MustExec("set @@global.tidb_top_sql_precision_seconds=1;") + dbt.MustExec("set @@global.tidb_txn_mode = 'pessimistic'") // Test case 1: DML query: insert/update/replace/delete/select cases1 := []struct { @@ -1670,12 +1321,11 @@ func (ts *tidbTestTopSQLSuite) TestTopSQLCPUProfile(c *C) { ctx, cancel := context.WithCancel(context.Background()) cases1[i].cancel = cancel sqlStr := ca.sql - go ts.loopExec(ctx, c, func(db *sql.DB) { - dbt := &DBTest{c, db} + go ts.loopExec(ctx, t, func(db *sql.DB) { + dbt := testkit.NewDBTestKit(t, db) if strings.HasPrefix(sqlStr, "select") { - rows := dbt.mustQuery(sqlStr) - for rows.Next() { - } + rows := dbt.MustQuery(sqlStr) + require.NoError(t, rows.Close()) } else { // Ignore error here since the error may be write conflict. db.Exec(sqlStr) @@ -1686,25 +1336,24 @@ func (ts *tidbTestTopSQLSuite) TestTopSQLCPUProfile(c *C) { timeoutCtx, cancel := context.WithTimeout(context.Background(), time.Second*20) defer cancel() checkFn := func(sql, planRegexp string) { - c.Assert(timeoutCtx.Err(), IsNil) - commentf := Commentf("sql: %v", sql) + require.NoError(t, timeoutCtx.Err()) stats := collector.GetSQLStatsBySQLWithRetry(sql, len(planRegexp) > 0) // since 1 sql may has many plan, check `len(stats) > 0` instead of `len(stats) == 1`. - c.Assert(len(stats) > 0, IsTrue, commentf) + require.Greaterf(t, len(stats), 0, "sql: %v", sql) for _, s := range stats { sqlStr := collector.GetSQL(s.SQLDigest) encodedPlan := collector.GetPlan(s.PlanDigest) // Normalize the user SQL before check. normalizedSQL := parser.Normalize(sql) - c.Assert(sqlStr, Equals, normalizedSQL, commentf) + require.Equalf(t, normalizedSQL, sqlStr, "sql: %v", sql) // decode plan before check. normalizedPlan, err := plancodec.DecodeNormalizedPlan(encodedPlan) - c.Assert(err, IsNil) + require.NoError(t, err) // remove '\n' '\t' before do regexp match. normalizedPlan = strings.Replace(normalizedPlan, "\n", " ", -1) normalizedPlan = strings.Replace(normalizedPlan, "\t", " ", -1) - c.Assert(normalizedPlan, Matches, planRegexp, commentf) + require.Regexpf(t, planRegexp, normalizedPlan, "sql: %v", sql) } } // Wait the top sql collector to collect profile data. @@ -1739,19 +1388,19 @@ func (ts *tidbTestTopSQLSuite) TestTopSQLCPUProfile(c *C) { cases2[i].cancel = cancel prepare, args := ca.prepare, ca.args var stmt *sql.Stmt - go ts.loopExec(ctx, c, func(db *sql.DB) { + go ts.loopExec(ctx, t, func(db *sql.DB) { if stmt == nil { stmt, err = db.Prepare(prepare) - c.Assert(err, IsNil) + require.NoError(t, err) } if strings.HasPrefix(prepare, "select") { rows, err := stmt.Query(args...) - c.Assert(err, IsNil) - for rows.Next() { - } + require.NoError(t, err) + require.NoError(t, rows.Close()) } else { // Ignore error here since the error may be write conflict. - stmt.Exec(args...) + _, err = stmt.Exec(args...) + require.NoError(t, err) } }) } @@ -1786,17 +1435,17 @@ func (ts *tidbTestTopSQLSuite) TestTopSQLCPUProfile(c *C) { cases3[i].cancel = cancel prepare, args := ca.prepare, ca.args doPrepare := true - go ts.loopExec(ctx, c, func(db *sql.DB) { + go ts.loopExec(ctx, t, func(db *sql.DB) { if doPrepare { doPrepare = false _, err := db.Exec(fmt.Sprintf("prepare stmt from '%v'", prepare)) - c.Assert(err, IsNil) + require.NoError(t, err) } sqlBuf := bytes.NewBuffer(nil) sqlBuf.WriteString("execute stmt ") for i := range args { _, err = db.Exec(fmt.Sprintf("set @%c=%v", 'a'+i, args[i])) - c.Assert(err, IsNil) + require.NoError(t, err) if i == 0 { sqlBuf.WriteString("using ") } else { @@ -1807,12 +1456,12 @@ func (ts *tidbTestTopSQLSuite) TestTopSQLCPUProfile(c *C) { } if strings.HasPrefix(prepare, "select") { rows, err := db.Query(sqlBuf.String()) - c.Assert(err, IsNil, Commentf("%v", sqlBuf.String())) - for rows.Next() { - } + require.NoErrorf(t, err, "%v", sqlBuf.String()) + require.NoError(t, rows.Close()) } else { // Ignore error here since the error may be write conflict. - db.Exec(sqlBuf.String()) + _, err = db.Exec(sqlBuf.String()) + require.NoError(t, err) } }) } @@ -1828,7 +1477,7 @@ func (ts *tidbTestTopSQLSuite) TestTopSQLCPUProfile(c *C) { // Test case 4: transaction commit ctx4, cancel4 := context.WithCancel(context.Background()) defer cancel4() - go ts.loopExec(ctx4, c, func(db *sql.DB) { + go ts.loopExec(ctx4, t, func(db *sql.DB) { db.Exec("begin") db.Exec("insert into t () values (),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),()") db.Exec("commit") @@ -1837,40 +1486,43 @@ func (ts *tidbTestTopSQLSuite) TestTopSQLCPUProfile(c *C) { checkFn("commit", "") } -func (ts *tidbTestTopSQLSuite) TestTopSQLAgent(c *C) { - c.Skip("unstable, skip it and fix it before 20210702") +func TestTopSQLAgent(t *testing.T) { + t.Skip("unstable, skip it and fix it before 20210702") + + ts, cleanup := createTidbTestTopSQLSuite(t) + defer cleanup() db, err := sql.Open("mysql", ts.getDSN()) - c.Assert(err, IsNil, Commentf("Error connecting")) + require.NoError(t, err, "Error connecting") defer func() { err := db.Close() - c.Assert(err, IsNil) + require.NoError(t, err) }() agentServer, err := mockTopSQLReporter.StartMockAgentServer() - c.Assert(err, IsNil) + require.NoError(t, err) defer func() { agentServer.Stop() }() - c.Assert(failpoint.Enable("github.com/pingcap/tidb/util/topsql/reporter/resetTimeoutForTest", `return(true)`), IsNil) - c.Assert(failpoint.Enable("github.com/pingcap/tidb/domain/skipLoadSysVarCacheLoop", `return(true)`), IsNil) - c.Assert(failpoint.Enable("github.com/pingcap/tidb/util/topsql/mockHighLoadForEachSQL", `return(true)`), IsNil) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/util/topsql/reporter/resetTimeoutForTest", `return(true)`)) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/domain/skipLoadSysVarCacheLoop", `return(true)`)) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/util/topsql/mockHighLoadForEachSQL", `return(true)`)) defer func() { err := failpoint.Disable("github.com/pingcap/tidb/util/topsql/reporter/resetTimeoutForTest") - c.Assert(err, IsNil) + require.NoError(t, err) err = failpoint.Disable("github.com/pingcap/tidb/domain/skipLoadSysVarCacheLoop") - c.Assert(err, IsNil) + require.NoError(t, err) err = failpoint.Disable("github.com/pingcap/tidb/util/topsql/mockHighLoadForEachSQL") - c.Assert(err, IsNil) + require.NoError(t, err) }() - dbt := &DBTest{c, db} - dbt.mustExec("drop database if exists topsql") - dbt.mustExec("create database topsql") - dbt.mustExec("use topsql;") + dbt := testkit.NewDBTestKit(t, db) + dbt.MustExec("drop database if exists topsql") + dbt.MustExec("create database topsql") + dbt.MustExec("use topsql;") for i := 0; i < 20; i++ { - dbt.mustExec(fmt.Sprintf("create table t%v (a int auto_increment, b int, unique index idx(a));", i)) + dbt.MustExec(fmt.Sprintf("create table t%v (a int auto_increment, b int, unique index idx(a));", i)) for j := 0; j < 100; j++ { - dbt.mustExec(fmt.Sprintf("insert into t%v (b) values (%v);", i, j)) + dbt.MustExec(fmt.Sprintf("insert into t%v (b) values (%v);", i, j)) } } setTopSQLReceiverAddress := func(addr string) { @@ -1878,42 +1530,41 @@ func (ts *tidbTestTopSQLSuite) TestTopSQLAgent(c *C) { conf.TopSQL.ReceiverAddress = addr }) } - dbt.mustExec("set @@global.tidb_enable_top_sql='On';") + dbt.MustExec("set @@global.tidb_enable_top_sql='On';") setTopSQLReceiverAddress("") - dbt.mustExec("set @@global.tidb_top_sql_precision_seconds=1;") - dbt.mustExec("set @@global.tidb_top_sql_report_interval_seconds=2;") - dbt.mustExec("set @@global.tidb_top_sql_max_statement_count=5;") + dbt.MustExec("set @@global.tidb_top_sql_precision_seconds=1;") + dbt.MustExec("set @@global.tidb_top_sql_report_interval_seconds=2;") + dbt.MustExec("set @@global.tidb_top_sql_max_statement_count=5;") - r := reporter.NewRemoteTopSQLReporter(reporter.NewGRPCReportClient(plancodec.DecodeNormalizedPlan)) + r := reporter.NewRemoteTopSQLReporter(reporter.NewSingleTargetDataSink(plancodec.DecodeNormalizedPlan)) tracecpu.GlobalSQLCPUProfiler.SetCollector(&collectorWrapper{r}) // TODO: change to ensure that the right sql statements are reported, not just counts checkFn := func(n int) { records := agentServer.GetLatestRecords() - c.Assert(len(records), Equals, n) + require.Len(t, records, n) for _, r := range records { sqlMeta, exist := agentServer.GetSQLMetaByDigestBlocking(r.SqlDigest, time.Second) - c.Assert(exist, IsTrue) - c.Check(sqlMeta.NormalizedSql, Matches, "select.*from.*join.*") + require.True(t, exist) + require.Regexp(t, "^select.*from.*join", sqlMeta.NormalizedSql) if len(r.PlanDigest) == 0 { continue } plan, exist := agentServer.GetPlanMetaByDigestBlocking(r.PlanDigest, time.Second) - c.Assert(exist, IsTrue) + require.True(t, exist) plan = strings.Replace(plan, "\n", " ", -1) plan = strings.Replace(plan, "\t", " ", -1) - c.Assert(plan, Matches, ".*Join.*Select.*") + require.Regexp(t, "Join.*Select", plan) } } runWorkload := func(start, end int) context.CancelFunc { ctx, cancel := context.WithCancel(context.Background()) for i := start; i < end; i++ { query := fmt.Sprintf("select /*+ HASH_JOIN(ta, tb) */ * from t%[1]v ta join t%[1]v tb on ta.a=tb.a where ta.b is not null;", i) - go ts.loopExec(ctx, c, func(db *sql.DB) { - dbt := &DBTest{c, db} - rows := dbt.mustQuery(query) - for rows.Next() { - } + go ts.loopExec(ctx, t, func(db *sql.DB) { + dbt := testkit.NewDBTestKit(t, db) + rows := dbt.MustQuery(query) + require.NoError(t, rows.Close()) }) } return cancel @@ -1926,12 +1577,12 @@ func (ts *tidbTestTopSQLSuite) TestTopSQLAgent(c *C) { agentServer.WaitCollectCnt(1, time.Second*4) checkFn(0) // Test after set agent address and the evict take effect. - dbt.mustExec("set @@global.tidb_top_sql_max_statement_count=5;") + dbt.MustExec("set @@global.tidb_top_sql_max_statement_count=5;") setTopSQLReceiverAddress(agentServer.Address()) agentServer.WaitCollectCnt(1, time.Second*4) checkFn(5) // Test with wrong agent address, the agent server can't receive any record. - dbt.mustExec("set @@global.tidb_top_sql_max_statement_count=8;") + dbt.MustExec("set @@global.tidb_top_sql_max_statement_count=8;") setTopSQLReceiverAddress("127.0.0.1:65530") agentServer.WaitCollectCnt(1, time.Second*4) @@ -1945,7 +1596,7 @@ func (ts *tidbTestTopSQLSuite) TestTopSQLAgent(c *C) { // case 2: agent hangs for a while cancel2 := runWorkload(0, 10) // empty agent address, should not collect records - dbt.mustExec("set @@global.tidb_top_sql_max_statement_count=5;") + dbt.MustExec("set @@global.tidb_top_sql_max_statement_count=5;") setTopSQLReceiverAddress("") agentServer.WaitCollectCnt(1, time.Second*4) checkFn(0) @@ -1981,7 +1632,7 @@ func (ts *tidbTestTopSQLSuite) TestTopSQLAgent(c *C) { agentServer.Stop() // agent server restart agentServer, err = mockTopSQLReporter.StartMockAgentServer() - c.Assert(err, IsNil) + require.NoError(t, err) setTopSQLReceiverAddress(agentServer.Address()) // check result agentServer.WaitCollectCnt(2, time.Second*8) @@ -1989,15 +1640,15 @@ func (ts *tidbTestTopSQLSuite) TestTopSQLAgent(c *C) { cancel5() } -func (ts *tidbTestTopSQLSuite) loopExec(ctx context.Context, c *C, fn func(db *sql.DB)) { +func (ts *tidbTestTopSQLSuite) loopExec(ctx context.Context, t *testing.T, fn func(db *sql.DB)) { db, err := sql.Open("mysql", ts.getDSN()) - c.Assert(err, IsNil, Commentf("Error connecting")) + require.NoError(t, err, "Error connecting") defer func() { err := db.Close() - c.Assert(err, IsNil) + require.NoError(t, err) }() - dbt := &DBTest{c, db} - dbt.mustExec("use topsql;") + dbt := testkit.NewDBTestKit(t, db) + dbt.MustExec("use topsql;") for { select { case <-ctx.Done(): @@ -2007,3 +1658,108 @@ func (ts *tidbTestTopSQLSuite) loopExec(ctx context.Context, c *C, fn func(db *s fn(db) } } + +func TestLocalhostClientMapping(t *testing.T) { + osTempDir := os.TempDir() + tempDir, err := os.MkdirTemp(osTempDir, "tidb-test.*.socket") + require.NoError(t, err) + socketFile := tempDir + "/tidbtest.sock" // Unix Socket does not work on Windows, so '/' should be OK + defer os.RemoveAll(tempDir) + + cli := newTestServerClient() + cfg := newTestConfig() + cfg.Socket = socketFile + cfg.Port = cli.port + cfg.Status.ReportStatus = false + + ts, cleanup := createTidbTestSuite(t) + defer cleanup() + + server, err := NewServer(cfg, ts.tidbdrv) + require.NoError(t, err) + cli.port = getPortFromTCPAddr(server.listener.Addr()) + go func() { + err := server.Run() + require.NoError(t, err) + }() + defer server.Close() + cli.waitUntilServerCanConnect() + + cli.port = getPortFromTCPAddr(server.listener.Addr()) + // Create a db connection for root + db, err := sql.Open("mysql", cli.getDSN(func(config *mysql.Config) { + config.User = "root" + config.Net = "unix" + config.DBName = "test" + config.Addr = socketFile + })) + require.NoErrorf(t, err, "Open failed") + err = db.Ping() + require.NoErrorf(t, err, "Ping failed") + defer db.Close() + dbt := testkit.NewDBTestKit(t, db) + rows := dbt.MustQuery("select user()") + cli.checkRows(t, rows, "root@localhost") + require.NoError(t, rows.Close()) + rows = dbt.MustQuery("show grants") + cli.checkRows(t, rows, "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION") + require.NoError(t, rows.Close()) + + dbt.MustExec("CREATE USER 'localhostuser'@'localhost'") + dbt.MustExec("CREATE USER 'localhostuser'@'%'") + defer func() { + dbt.MustExec("DROP USER IF EXISTS 'localhostuser'@'%'") + dbt.MustExec("DROP USER IF EXISTS 'localhostuser'@'localhost'") + dbt.MustExec("DROP USER IF EXISTS 'localhostuser'@'127.0.0.1'") + }() + + dbt.MustExec("GRANT SELECT ON test.* TO 'localhostuser'@'%'") + dbt.MustExec("GRANT SELECT,UPDATE ON test.* TO 'localhostuser'@'localhost'") + + // Test with loopback interface - Should get access to localhostuser@localhost! + cli.runTests(t, func(config *mysql.Config) { + config.User = "localhostuser" + config.DBName = "test" + }, + func(dbt *testkit.DBTestKit) { + rows := dbt.MustQuery("select user()") + // NOTICE: this is not compatible with MySQL! (MySQL would report localhostuser@localhost also for 127.0.0.1) + cli.checkRows(t, rows, "localhostuser@127.0.0.1") + require.NoError(t, rows.Close()) + rows = dbt.MustQuery("show grants") + cli.checkRows(t, rows, "GRANT USAGE ON *.* TO 'localhostuser'@'localhost'\nGRANT SELECT,UPDATE ON test.* TO 'localhostuser'@'localhost'") + require.NoError(t, rows.Close()) + }) + + dbt.MustExec("DROP USER IF EXISTS 'localhostuser'@'localhost'") + dbt.MustExec("CREATE USER 'localhostuser'@'127.0.0.1'") + dbt.MustExec("GRANT SELECT,UPDATE ON test.* TO 'localhostuser'@'127.0.0.1'") + // Test with unix domain socket file connection - Should get access to '%' + cli.runTests(t, func(config *mysql.Config) { + config.Net = "unix" + config.Addr = socketFile + config.User = "localhostuser" + config.DBName = "test" + }, + func(dbt *testkit.DBTestKit) { + rows := dbt.MustQuery("select user()") + cli.checkRows(t, rows, "localhostuser@localhost") + require.NoError(t, rows.Close()) + rows = dbt.MustQuery("show grants") + cli.checkRows(t, rows, "GRANT USAGE ON *.* TO 'localhostuser'@'%'\nGRANT SELECT ON test.* TO 'localhostuser'@'%'") + require.NoError(t, rows.Close()) + }) + + // Test if only localhost exists + dbt.MustExec("DROP USER 'localhostuser'@'%'") + dbSocket, err := sql.Open("mysql", cli.getDSN(func(config *mysql.Config) { + config.User = "localhostuser" + config.Net = "unix" + config.DBName = "test" + config.Addr = socketFile + })) + require.NoErrorf(t, err, "Open failed") + defer dbSocket.Close() + err = dbSocket.Ping() + require.Errorf(t, err, "Connection successful without matching host for unix domain socket!") +} diff --git a/server/util.go b/server/util.go index 6a8cbad8386c5..d84b4cd566519 100644 --- a/server/util.go +++ b/server/util.go @@ -179,16 +179,16 @@ func dumpBinaryTime(dur time.Duration) (data []byte) { dur = -dur } days := dur / (24 * time.Hour) - dur -= days * 24 * time.Hour + dur -= days * 24 * time.Hour //nolint:durationcheck data[2] = byte(days) hours := dur / time.Hour - dur -= hours * time.Hour + dur -= hours * time.Hour //nolint:durationcheck data[6] = byte(hours) minutes := dur / time.Minute - dur -= minutes * time.Minute + dur -= minutes * time.Minute //nolint:durationcheck data[7] = byte(minutes) seconds := dur / time.Second - dur -= seconds * time.Second + dur -= seconds * time.Second //nolint:durationcheck data[8] = byte(seconds) if dur == 0 { data[0] = 8 @@ -236,7 +236,7 @@ func dumpBinaryDateTime(data []byte, t types.Time) []byte { func dumpBinaryRow(buffer []byte, columns []*ColumnInfo, row chunk.Row, d *resultEncoder) ([]byte, error) { if d == nil { - d = &resultEncoder{} + d = newResultEncoder(charset.CharsetUTF8MB4) } buffer = append(buffer, mysql.OKHeader) nullBitmapOff := len(buffer) @@ -290,14 +290,40 @@ func dumpBinaryRow(buffer []byte, columns []*ColumnInfo, row chunk.Row, d *resul return buffer, nil } +type inputDecoder struct { + encoding *charset.Encoding + + buffer []byte +} + +func newInputDecoder(chs string) *inputDecoder { + return &inputDecoder{ + encoding: charset.NewEncoding(chs), + buffer: nil, + } +} + +// clean prevents the inputDecoder from holding too much memory. +func (i *inputDecoder) clean() { + i.buffer = nil +} + +func (i *inputDecoder) decodeInput(src []byte) []byte { + result, err := i.encoding.Decode(i.buffer, src) + if err != nil { + return src + } + return result +} + type resultEncoder struct { // chsName and encoding are unchanged after the initialization from // session variable @@character_set_results. chsName string - encoding charset.Encoding + encoding *charset.Encoding // dataEncoding can be updated to match the column data charset. - dataEncoding charset.Encoding + dataEncoding *charset.Encoding buffer []byte @@ -309,7 +335,7 @@ type resultEncoder struct { func newResultEncoder(chs string) *resultEncoder { return &resultEncoder{ chsName: chs, - encoding: *charset.NewEncoding(chs), + encoding: charset.NewEncoding(chs), buffer: nil, isBinary: chs == charset.CharsetBinary, isNull: len(chs) == 0, @@ -326,7 +352,7 @@ func (d *resultEncoder) updateDataEncoding(chsID uint16) { if err != nil { logutil.BgLogger().Warn("unknown charset ID", zap.Error(err)) } - d.dataEncoding.UpdateEncoding(charset.Formatted(chs)) + d.dataEncoding = charset.NewEncoding(chs) } func (d *resultEncoder) columnTypeInfoCharsetID(info *ColumnInfo) uint16 { @@ -342,15 +368,15 @@ func (d *resultEncoder) columnTypeInfoCharsetID(info *ColumnInfo) uint16 { } func (d *resultEncoder) encodeMeta(src []byte) []byte { - return d.encodeWith(src, &d.encoding) + return d.encodeWith(src, d.encoding) } func (d *resultEncoder) encodeData(src []byte) []byte { if d.isNull || d.isBinary { // Use the column charset to encode. - return d.encodeWith(src, &d.dataEncoding) + return d.encodeWith(src, d.dataEncoding) } - return d.encodeWith(src, &d.encoding) + return d.encodeWith(src, d.encoding) } func (d *resultEncoder) encodeWith(src []byte, enc *charset.Encoding) []byte { @@ -363,7 +389,7 @@ func (d *resultEncoder) encodeWith(src []byte, enc *charset.Encoding) []byte { func dumpTextRow(buffer []byte, columns []*ColumnInfo, row chunk.Row, d *resultEncoder) ([]byte, error) { if d == nil { - d = &resultEncoder{} + d = newResultEncoder(charset.CharsetUTF8MB4) } tmp := make([]byte, 0, 20) for i, col := range columns { diff --git a/server/util_test.go b/server/util_test.go index e0889a5e6958c..889c2512eacad 100644 --- a/server/util_test.go +++ b/server/util_test.go @@ -20,6 +20,7 @@ import ( "time" "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/parser/charset" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" @@ -30,8 +31,6 @@ import ( ) func TestDumpBinaryTime(t *testing.T) { - t.Parallel() - sc := &stmtctx.StatementContext{TimeZone: time.UTC} parsedTime, err := types.ParseTimestamp(sc, "0000-00-00 00:00:00.000000") require.NoError(t, err) @@ -87,7 +86,6 @@ func TestDumpBinaryTime(t *testing.T) { } func TestResultEncoder(t *testing.T) { - t.Parallel() // Encode bytes to utf-8. d := newResultEncoder("utf-8") src := []byte("test_string") @@ -106,14 +104,12 @@ func TestResultEncoder(t *testing.T) { } func TestDumpTextValue(t *testing.T) { - t.Parallel() - columns := []*ColumnInfo{{ Type: mysql.TypeLonglong, Decimal: mysql.NotFixedDec, }} - dp := &resultEncoder{} + dp := newResultEncoder(charset.CharsetUTF8MB4) null := types.NewIntDatum(0) null.SetNull() bs, err := dumpTextRow(nil, columns, chunk.MutRowFromDatums([]types.Datum{null}).ToRow(), dp) @@ -255,8 +251,6 @@ func mustDecodeStr(t *testing.T, b []byte) string { } func TestAppendFormatFloat(t *testing.T) { - t.Parallel() - infVal, _ := strconv.ParseFloat("+Inf", 64) tests := []struct { fVal float64 @@ -439,8 +433,6 @@ func TestAppendFormatFloat(t *testing.T) { } func TestDumpLengthEncodedInt(t *testing.T) { - t.Parallel() - testCases := []struct { num uint64 buffer []byte @@ -469,8 +461,6 @@ func TestDumpLengthEncodedInt(t *testing.T) { } func TestParseLengthEncodedInt(t *testing.T) { - t.Parallel() - testCases := []struct { buffer []byte num uint64 @@ -519,8 +509,6 @@ func TestParseLengthEncodedInt(t *testing.T) { } func TestDumpUint(t *testing.T) { - t.Parallel() - testCases := []uint64{ 0, 1, @@ -539,8 +527,6 @@ func TestDumpUint(t *testing.T) { } func TestParseLengthEncodedBytes(t *testing.T) { - t.Parallel() - buffer := []byte{'\xfb'} b, isNull, n, err := parseLengthEncodedBytes(buffer) require.Nil(t, b) @@ -564,8 +550,6 @@ func TestParseLengthEncodedBytes(t *testing.T) { } func TestParseNullTermString(t *testing.T) { - t.Parallel() - for _, tc := range []struct { input string str string @@ -603,5 +587,6 @@ func newTestConfig() *config.Config { cfg.Host = "127.0.0.1" cfg.Status.StatusHost = "127.0.0.1" cfg.Security.AutoTLS = false + cfg.Socket = "" return cfg } diff --git a/session/bench_test.go b/session/bench_test.go index 4beed33b9e145..d34bb94501071 100644 --- a/session/bench_test.go +++ b/session/bench_test.go @@ -32,6 +32,7 @@ import ( "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/benchdaily" + "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/sqlexec" "go.uber.org/zap" @@ -43,7 +44,7 @@ var bigCount = 10000 func prepareBenchSession() (Session, *domain.Domain, kv.Storage) { config.UpdateGlobal(func(cfg *config.Config) { - cfg.Log.EnableSlowLog = false + cfg.Log.EnableSlowLog.Store(false) }) store, err := mockstore.NewMockStore() @@ -99,7 +100,7 @@ func prepareJoinBenchData(se Session, colType string, valueFormat string, valueC } func readResult(ctx context.Context, rs sqlexec.RecordSet, count int) { - req := rs.NewChunk() + req := rs.NewChunk(nil) for count > 0 { err := rs.Next(ctx, req) if err != nil { @@ -263,15 +264,18 @@ func BenchmarkPointGet(b *testing.B) { mustExecute(se, "create table t (pk int primary key)") mustExecute(se, "insert t values (61),(62),(63),(64)") b.ResetTimer() + alloc := chunk.NewAllocator() for i := 0; i < b.N; i++ { rs, err := se.Execute(ctx, "select * from t where pk = 64") if err != nil { b.Fatal(err) } - _, err = drainRecordSet(ctx, se.(*session), rs[0]) + _, err = drainRecordSet(ctx, se.(*session), rs[0], alloc) if err != nil { b.Fatal(err) } + + alloc.Reset() } b.StopTimer() } @@ -286,16 +290,18 @@ func BenchmarkBatchPointGet(b *testing.B) { }() mustExecute(se, "create table t (pk int primary key)") mustExecute(se, "insert t values (61),(62),(63),(64)") + alloc := chunk.NewAllocator() b.ResetTimer() for i := 0; i < b.N; i++ { rs, err := se.Execute(ctx, "select * from t where pk in (61, 64, 67)") if err != nil { b.Fatal(err) } - _, err = drainRecordSet(ctx, se.(*session), rs[0]) + _, err = drainRecordSet(ctx, se.(*session), rs[0], alloc) if err != nil { b.Fatal(err) } + alloc.Reset() } b.StopTimer() } @@ -316,16 +322,18 @@ func BenchmarkPreparedPointGet(b *testing.B) { b.Fatal(err) } + alloc := chunk.NewAllocator() b.ResetTimer() for i := 0; i < b.N; i++ { rs, err := se.ExecutePreparedStmt(ctx, stmtID, []types.Datum{types.NewDatum(64)}) if err != nil { b.Fatal(err) } - _, err = drainRecordSet(ctx, se.(*session), rs) + _, err = drainRecordSet(ctx, se.(*session), rs, alloc) if err != nil { b.Fatal(err) } + alloc.Reset() } b.StopTimer() } @@ -1558,16 +1566,19 @@ partition p1021 values less than (738536), partition p1022 values less than (738537), partition p1023 values less than (738538) )`) + + alloc := chunk.NewAllocator() b.ResetTimer() for i := 0; i < b.N; i++ { rs, err := se.Execute(ctx, "select * from t where dt > to_days('2019-04-01 21:00:00') and dt < to_days('2019-04-07 23:59:59')") if err != nil { b.Fatal(err) } - _, err = drainRecordSet(ctx, se.(*session), rs[0]) + _, err = drainRecordSet(ctx, se.(*session), rs[0], alloc) if err != nil { b.Fatal(err) } + alloc.Reset() } b.StopTimer() } @@ -1590,16 +1601,18 @@ func BenchmarkRangeColumnPartitionPruning(b *testing.B) { } build.WriteString("partition p1023 values less than maxvalue)") mustExecute(se, build.String()) + alloc := chunk.NewAllocator() b.ResetTimer() for i := 0; i < b.N; i++ { rs, err := se.Execute(ctx, "select * from t where dt > '2020-05-01' and dt < '2020-06-07'") if err != nil { b.Fatal(err) } - _, err = drainRecordSet(ctx, se.(*session), rs[0]) + _, err = drainRecordSet(ctx, se.(*session), rs[0], alloc) if err != nil { b.Fatal(err) } + alloc.Reset() } b.StopTimer() } @@ -1613,6 +1626,7 @@ func BenchmarkHashPartitionPruningPointSelect(b *testing.B) { st.Close() }() + alloc := chunk.NewAllocator() mustExecute(se, `create table t (id int, dt datetime) partition by hash(id) partitions 1024;`) b.ResetTimer() for i := 0; i < b.N; i++ { @@ -1620,10 +1634,11 @@ func BenchmarkHashPartitionPruningPointSelect(b *testing.B) { if err != nil { b.Fatal(err) } - _, err = drainRecordSet(ctx, se.(*session), rs[0]) + _, err = drainRecordSet(ctx, se.(*session), rs[0], alloc) if err != nil { b.Fatal(err) } + alloc.Reset() } b.StopTimer() } @@ -1637,6 +1652,7 @@ func BenchmarkHashPartitionPruningMultiSelect(b *testing.B) { st.Close() }() + alloc := chunk.NewAllocator() mustExecute(se, `create table t (id int, dt datetime) partition by hash(id) partitions 1024;`) b.ResetTimer() for i := 0; i < b.N; i++ { @@ -1644,7 +1660,7 @@ func BenchmarkHashPartitionPruningMultiSelect(b *testing.B) { if err != nil { b.Fatal(err) } - _, err = drainRecordSet(ctx, se.(*session), rs[0]) + _, err = drainRecordSet(ctx, se.(*session), rs[0], alloc) if err != nil { b.Fatal(err) } @@ -1652,7 +1668,7 @@ func BenchmarkHashPartitionPruningMultiSelect(b *testing.B) { if err != nil { b.Fatal(err) } - _, err = drainRecordSet(ctx, se.(*session), rs[0]) + _, err = drainRecordSet(ctx, se.(*session), rs[0], alloc) if err != nil { b.Fatal(err) } @@ -1660,10 +1676,11 @@ func BenchmarkHashPartitionPruningMultiSelect(b *testing.B) { if err != nil { b.Fatal(err) } - _, err = drainRecordSet(ctx, se.(*session), rs[0]) + _, err = drainRecordSet(ctx, se.(*session), rs[0], alloc) if err != nil { b.Fatal(err) } + alloc.Reset() } b.StopTimer() } diff --git a/session/bootstrap.go b/session/bootstrap.go index 5d0f34b7f3644..2244e3eaa5484 100644 --- a/session/bootstrap.go +++ b/session/bootstrap.go @@ -23,6 +23,7 @@ import ( "encoding/hex" "flag" "fmt" + osuser "os/user" "runtime/debug" "strconv" "strings" @@ -197,7 +198,7 @@ const ( stats_ver BIGINT(64) NOT NULL DEFAULT 0, flag BIGINT(64) NOT NULL DEFAULT 0, correlation DOUBLE NOT NULL DEFAULT 0, - last_analyze_pos BLOB DEFAULT NULL, + last_analyze_pos LONGBLOB DEFAULT NULL, UNIQUE INDEX tbl(table_id, is_index, hist_id) );` @@ -209,8 +210,8 @@ const ( bucket_id BIGINT(64) NOT NULL, count BIGINT(64) NOT NULL, repeats BIGINT(64) NOT NULL, - upper_bound BLOB NOT NULL, - lower_bound BLOB , + upper_bound LONGBLOB NOT NULL, + lower_bound LONGBLOB , ndv BIGINT NOT NULL DEFAULT 0, UNIQUE INDEX tbl(table_id, is_index, hist_id, bucket_id) );` @@ -356,6 +357,14 @@ const ( last_analyzed_at TIMESTAMP, PRIMARY KEY (table_id, column_id) CLUSTERED );` + // CreateTableCacheMetaTable stores the cached table meta lock information. + CreateTableCacheMetaTable = `CREATE TABLE IF NOT EXISTS mysql.table_cache_meta ( + tid bigint(11) NOT NULL DEFAULT 0, + lock_type enum('NONE','READ', 'INTEND', 'WRITE') NOT NULL DEFAULT 'NONE', + lease bigint(20) NOT NULL DEFAULT 0, + oldReadLease bigint(20) NOT NULL DEFAULT 0, + PRIMARY KEY (tid) + );` ) // bootstrap initiates system DB for a store. @@ -525,11 +534,18 @@ const ( version76 = 76 // version77 adds mysql.column_stats_usage table version77 = 77 + // version78 updates mysql.stats_buckets.lower_bound, mysql.stats_buckets.upper_bound and mysql.stats_histograms.last_analyze_pos from BLOB to LONGBLOB. + version78 = 78 + // version79 adds the mysql.table_cache_meta table + version79 = 79 + // version80 fixes the issue https://github.com/pingcap/tidb/issues/25422. + // If the TiDB upgrading from the 4.x to a newer version, we keep the tidb_analyze_version to 1. + version80 = 80 ) // currentBootstrapVersion is defined as a variable, so we can modify its value for testing. // please make sure this is the largest version -var currentBootstrapVersion int64 = version77 +var currentBootstrapVersion int64 = version80 var ( bootstrapVersion = []func(Session, int64){ @@ -610,6 +626,9 @@ var ( upgradeToVer75, upgradeToVer76, upgradeToVer77, + upgradeToVer78, + upgradeToVer79, + upgradeToVer80, } ) @@ -654,7 +673,7 @@ func getTiDBVar(s Session, name string) (sVal string, isNull bool, e error) { return "", true, errors.New("Wrong number of Recordset") } defer terror.Call(rs.Close) - req := rs.NewChunk() + req := rs.NewChunk(nil) err = rs.Next(ctx, req) if err != nil || req.NumRows() == 0 { return "", true, errors.Trace(err) @@ -838,7 +857,7 @@ func upgradeToVer12(s Session, ver int64) { terror.MustNil(err) sqls := make([]string, 0, 1) defer terror.Call(rs.Close) - req := rs.NewChunk() + req := rs.NewChunk(nil) it := chunk.NewIterator4Chunk(req) err = rs.Next(ctx, req) for err == nil && req.NumRows() != 0 { @@ -1299,7 +1318,7 @@ func upgradeToVer55(s Session, ver int64) { rs, err := s.ExecuteInternal(ctx, selectSQL) terror.MustNil(err) defer terror.Call(rs.Close) - req := rs.NewChunk() + req := rs.NewChunk(nil) it := chunk.NewIterator4Chunk(req) err = rs.Next(ctx, req) for err == nil && req.NumRows() != 0 { @@ -1410,7 +1429,7 @@ func upgradeToVer67(s Session, ver int64) { if err != nil { logutil.BgLogger().Fatal("upgradeToVer67 error", zap.Error(err)) } - req := rs.NewChunk() + req := rs.NewChunk(nil) iter := chunk.NewIterator4Chunk(req) p := parser.New() now := types.NewTime(types.FromGoTime(time.Now()), mysql.TypeTimestamp, 3) @@ -1599,6 +1618,43 @@ func upgradeToVer77(s Session, ver int64) { doReentrantDDL(s, CreateColumnStatsUsageTable) } +func upgradeToVer78(s Session, ver int64) { + if ver >= version78 { + return + } + doReentrantDDL(s, "ALTER TABLE mysql.stats_buckets MODIFY upper_bound LONGBLOB NOT NULL") + doReentrantDDL(s, "ALTER TABLE mysql.stats_buckets MODIFY lower_bound LONGBLOB") + doReentrantDDL(s, "ALTER TABLE mysql.stats_histograms MODIFY last_analyze_pos LONGBLOB DEFAULT NULL") +} + +func upgradeToVer79(s Session, ver int64) { + if ver >= version79 { + return + } + doReentrantDDL(s, CreateTableCacheMetaTable) +} + +func upgradeToVer80(s Session, ver int64) { + if ver >= version80 { + return + } + // Check if tidb_analyze_version exists in mysql.GLOBAL_VARIABLES. + // If not, insert "tidb_analyze_version | 1" since this is the old behavior before we introduce this variable. + ctx := context.Background() + rs, err := s.ExecuteInternal(ctx, "SELECT VARIABLE_VALUE FROM %n.%n WHERE VARIABLE_NAME=%?;", + mysql.SystemDB, mysql.GlobalVariablesTable, variable.TiDBAnalyzeVersion) + terror.MustNil(err) + req := rs.NewChunk(nil) + err = rs.Next(ctx, req) + terror.MustNil(err) + if req.NumRows() != 0 { + return + } + + mustExecute(s, "INSERT HIGH_PRIORITY IGNORE INTO %n.%n VALUES (%?, %?);", + mysql.SystemDB, mysql.GlobalVariablesTable, variable.TiDBAnalyzeVersion, 1) +} + func writeOOMAction(s Session) { comment := "oom-action is `log` by default in v3.0.x, `cancel` by default in v4.0.11+" mustExecute(s, `INSERT HIGH_PRIORITY INTO %n.%n VALUES (%?, %?, %?) ON DUPLICATE KEY UPDATE VARIABLE_VALUE= %?`, @@ -1681,6 +1737,8 @@ func doDDLWorks(s Session) { mustExecute(s, CreateCapturePlanBaselinesBlacklist) // Create column_stats_usage table mustExecute(s, CreateColumnStatsUsageTable) + // Create table_cache_meta table. + mustExecute(s, CreateTableCacheMetaTable) } // doDMLWorks executes DML statements in bootstrap stage. @@ -1688,10 +1746,20 @@ func doDDLWorks(s Session) { // TODO: sanitize. func doDMLWorks(s Session) { mustExecute(s, "BEGIN") - - // Insert a default user with empty password. - mustExecute(s, `INSERT HIGH_PRIORITY INTO mysql.user VALUES + if config.GetGlobalConfig().Security.SecureBootstrap { + // If secure bootstrap is enabled, we create a root@localhost account which can login with auth_socket. + // i.e. mysql -S /tmp/tidb.sock -uroot + // The auth_socket plugin will validate that the user matches $USER. + u, err := osuser.Current() + if err != nil { + logutil.BgLogger().Fatal("failed to read current user. unable to secure bootstrap.", zap.Error(err)) + } + mustExecute(s, `INSERT HIGH_PRIORITY INTO mysql.user VALUES + ("localhost", "root", %?, "auth_socket", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "N", "Y", "Y", "Y", "Y", "Y", "Y", "Y")`, u.Username) + } else { + mustExecute(s, `INSERT HIGH_PRIORITY INTO mysql.user VALUES ("%", "root", "", "mysql_native_password", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "N", "Y", "Y", "Y", "Y", "Y", "Y", "Y")`) + } // Init global system variables table. values := make([]string, 0, len(variable.GetSysVars())) diff --git a/session/bootstrap_serial_test.go b/session/bootstrap_serial_test.go index d0e5094e6d4ee..1de04a5ca91f3 100644 --- a/session/bootstrap_serial_test.go +++ b/session/bootstrap_serial_test.go @@ -43,7 +43,7 @@ func TestBootstrap(t *testing.T) { require.NotNil(t, r) ctx := context.Background() - req := r.NewChunk() + req := r.NewChunk(nil) err := r.Next(ctx, req) require.NoError(t, err) require.NotEqual(t, 0, req.NumRows()) @@ -72,7 +72,7 @@ func TestBootstrap(t *testing.T) { r = mustExec(t, se, "SELECT COUNT(*) from mysql.global_variables") require.NotNil(t, r) - req = r.NewChunk() + req = r.NewChunk(nil) err = r.Next(ctx, req) require.NoError(t, err) require.Equal(t, globalVarsCount(), req.GetRow(0).GetInt64(0)) @@ -95,7 +95,7 @@ func TestBootstrap(t *testing.T) { r = mustExec(t, se, "select * from t") require.NotNil(t, r) - req = r.NewChunk() + req = r.NewChunk(nil) err = r.Next(ctx, req) require.NoError(t, err) rows = statistics.RowToDatums(req.GetRow(0), r.Fields()) @@ -163,7 +163,7 @@ func TestBootstrapWithError(t *testing.T) { se := createSessionAndSetID(t, store) mustExec(t, se, "USE mysql") r := mustExec(t, se, `select * from user`) - req := r.NewChunk() + req := r.NewChunk(nil) err = r.Next(ctx, req) require.NoError(t, err) require.NotEqual(t, 0, req.NumRows()) @@ -184,7 +184,7 @@ func TestBootstrapWithError(t *testing.T) { mustExec(t, se, "SELECT * from mysql.default_roles") // Check global variables. r = mustExec(t, se, "SELECT COUNT(*) from mysql.global_variables") - req = r.NewChunk() + req = r.NewChunk(nil) err = r.Next(ctx, req) require.NoError(t, err) v := req.GetRow(0) @@ -192,7 +192,7 @@ func TestBootstrapWithError(t *testing.T) { require.NoError(t, r.Close()) r = mustExec(t, se, `SELECT VARIABLE_VALUE from mysql.TiDB where VARIABLE_NAME="bootstrapped"`) - req = r.NewChunk() + req = r.NewChunk(nil) err = r.Next(ctx, req) require.NoError(t, err) require.NotEqual(t, 0, req.NumRows()) @@ -221,7 +221,7 @@ func TestUpgrade(t *testing.T) { // bootstrap with currentBootstrapVersion r := mustExec(t, se, `SELECT VARIABLE_VALUE from mysql.TiDB where VARIABLE_NAME="tidb_server_version"`) - req := r.NewChunk() + req := r.NewChunk(nil) err := r.Next(ctx, req) row := req.GetRow(0) require.NoError(t, err) @@ -250,7 +250,7 @@ func TestUpgrade(t *testing.T) { unsetStoreBootstrapped(store.UUID()) // Make sure the version is downgraded. r = mustExec(t, se1, `SELECT VARIABLE_VALUE from mysql.TiDB where VARIABLE_NAME="tidb_server_version"`) - req = r.NewChunk() + req = r.NewChunk(nil) err = r.Next(ctx, req) require.NoError(t, err) require.Equal(t, 0, req.NumRows()) @@ -267,7 +267,7 @@ func TestUpgrade(t *testing.T) { se2 := createSessionAndSetID(t, store) r = mustExec(t, se2, `SELECT VARIABLE_VALUE from mysql.TiDB where VARIABLE_NAME="tidb_server_version"`) - req = r.NewChunk() + req = r.NewChunk(nil) err = r.Next(ctx, req) require.NoError(t, err) require.NotEqual(t, 0, req.NumRows()) @@ -282,7 +282,7 @@ func TestUpgrade(t *testing.T) { // Verify that 'new_collation_enabled' is false. r = mustExec(t, se2, fmt.Sprintf(`SELECT VARIABLE_VALUE from mysql.TiDB where VARIABLE_NAME='%s'`, tidbNewCollationEnabled)) - req = r.NewChunk() + req = r.NewChunk(nil) err = r.Next(ctx, req) require.NoError(t, err) require.Equal(t, 1, req.NumRows()) @@ -327,7 +327,7 @@ func TestIssue17979_1(t *testing.T) { require.NoError(t, err) require.Equal(t, currentBootstrapVersion, ver) r := mustExec(t, seV4, "select variable_value from mysql.tidb where variable_name='default_oom_action'") - req := r.NewChunk() + req := r.NewChunk(nil) require.NoError(t, r.Next(ctx, req)) require.Equal(t, "log", req.GetRow(0).GetString(0)) require.Equal(t, config.OOMActionLog, config.GetGlobalConfig().OOMAction) @@ -370,7 +370,7 @@ func TestIssue17979_2(t *testing.T) { require.NoError(t, err) require.Equal(t, currentBootstrapVersion, ver) r := mustExec(t, seV4, "select variable_value from mysql.tidb where variable_name='default_oom_action'") - req := r.NewChunk() + req := r.NewChunk(nil) require.NoError(t, r.Next(ctx, req)) require.Equal(t, 0, req.NumRows()) require.Equal(t, config.OOMActionCancel, config.GetGlobalConfig().OOMAction) @@ -414,11 +414,11 @@ func TestIssue20900_1(t *testing.T) { require.NoError(t, err) require.Equal(t, currentBootstrapVersion, ver) r := mustExec(t, seV4, "select @@tidb_mem_quota_query") - req := r.NewChunk() + req := r.NewChunk(nil) require.NoError(t, r.Next(ctx, req)) require.Equal(t, "34359738368", req.GetRow(0).GetString(0)) r = mustExec(t, seV4, "select variable_value from mysql.tidb where variable_name='default_memory_quota_query'") - req = r.NewChunk() + req = r.NewChunk(nil) require.NoError(t, r.Next(ctx, req)) require.Equal(t, "34359738368", req.GetRow(0).GetString(0)) require.Equal(t, int64(34359738368), seV4.GetSessionVars().MemQuotaQuery) @@ -462,12 +462,12 @@ func TestIssue20900_2(t *testing.T) { require.NoError(t, err) require.Equal(t, currentBootstrapVersion, ver) r := mustExec(t, seV4, "select @@tidb_mem_quota_query") - req := r.NewChunk() + req := r.NewChunk(nil) require.NoError(t, r.Next(ctx, req)) require.Equal(t, "1073741824", req.GetRow(0).GetString(0)) require.Equal(t, int64(1073741824), seV4.GetSessionVars().MemQuotaQuery) r = mustExec(t, seV4, "select variable_value from mysql.tidb where variable_name='default_memory_quota_query'") - req = r.NewChunk() + req = r.NewChunk(nil) require.NoError(t, r.Next(ctx, req)) require.Equal(t, 0, req.NumRows()) } @@ -531,7 +531,7 @@ func TestStmtSummary(t *testing.T) { writeStmtSummaryVars(se) r := mustExec(t, se, "select variable_value from mysql.global_variables where variable_name='tidb_enable_stmt_summary'") - req := r.NewChunk() + req := r.NewChunk(nil) require.NoError(t, r.Next(ctx, req)) row := req.GetRow(0) require.Equal(t, []byte("ON"), row.GetBytes(0)) @@ -590,7 +590,7 @@ func TestUpdateBindInfo(t *testing.T) { upgradeToVer67(se, version66) r := mustExec(t, se, `select original_sql, bind_sql, default_db, status from mysql.bind_info where source != 'builtin'`) - req := r.NewChunk() + req := r.NewChunk(nil) require.NoError(t, r.Next(ctx, req)) row := req.GetRow(0) require.Equal(t, bindCase.originWithDB, row.GetString(0)) @@ -630,7 +630,7 @@ func TestUpdateDuplicateBindInfo(t *testing.T) { upgradeToVer67(se, version66) r := mustExec(t, se, `select original_sql, bind_sql, default_db, status, create_time from mysql.bind_info where source != 'builtin' order by create_time`) - req := r.NewChunk() + req := r.NewChunk(nil) require.NoError(t, r.Next(ctx, req)) require.Equal(t, 3, req.NumRows()) row := req.GetRow(0) @@ -686,7 +686,7 @@ func TestUpgradeClusteredIndexDefaultValue(t *testing.T) { require.Equal(t, currentBootstrapVersion, ver) r := mustExec(t, seV68, `select @@global.tidb_enable_clustered_index, @@session.tidb_enable_clustered_index`) - req := r.NewChunk() + req := r.NewChunk(nil) require.NoError(t, r.Next(context.Background(), req)) require.Equal(t, 1, req.NumRows()) row := req.GetRow(0) @@ -723,7 +723,7 @@ func TestUpgradeVersion66(t *testing.T) { require.NoError(t, err) require.Equal(t, currentBootstrapVersion, ver) r := mustExec(t, seV66, `select @@global.tidb_track_aggregate_memory_usage, @@session.tidb_track_aggregate_memory_usage`) - req := r.NewChunk() + req := r.NewChunk(nil) require.NoError(t, r.Next(ctx, req)) require.Equal(t, 1, req.NumRows()) row := req.GetRow(0) @@ -772,7 +772,7 @@ func TestUpgradeVersion74(t *testing.T) { require.NoError(t, err) require.Equal(t, currentBootstrapVersion, ver) r := mustExec(t, seV74, `select @@global.tidb_stmt_summary_max_stmt_count, @@session.tidb_stmt_summary_max_stmt_count`) - req := r.NewChunk() + req := r.NewChunk(nil) require.NoError(t, r.Next(ctx, req)) require.Equal(t, 1, req.NumRows()) row := req.GetRow(0) @@ -806,7 +806,7 @@ func TestUpgradeVersion75(t *testing.T) { require.NoError(t, err) require.Equal(t, int64(74), ver) r := mustExec(t, seV74, `desc mysql.user`) - req := r.NewChunk() + req := r.NewChunk(nil) row := req.GetRow(0) require.NoError(t, r.Next(ctx, req)) require.Equal(t, "host", strings.ToLower(row.GetString(0))) @@ -820,7 +820,7 @@ func TestUpgradeVersion75(t *testing.T) { require.NoError(t, err) require.Equal(t, currentBootstrapVersion, ver) r = mustExec(t, seV75, `desc mysql.user`) - req = r.NewChunk() + req = r.NewChunk(nil) row = req.GetRow(0) require.NoError(t, r.Next(ctx, req)) require.Equal(t, "host", strings.ToLower(row.GetString(0))) @@ -879,3 +879,52 @@ func TestReferencesPrivilegeOnColumn(t *testing.T) { mustExec(t, se, "create table t1 (a int)") mustExec(t, se, "GRANT select (a), update (a),insert(a), references(a) on t1 to issue28531") } + +func TestAnalyzeVersionUpgradeFrom300To500(t *testing.T) { + ctx := context.Background() + store, _ := createStoreAndBootstrap(t) + defer func() { require.NoError(t, store.Close()) }() + + // Upgrade from 3.0.0 to 5.1+ or above. + ver300 := 33 + seV3 := createSessionAndSetID(t, store) + txn, err := store.Begin() + require.NoError(t, err) + m := meta.NewMeta(txn) + err = m.FinishBootstrap(int64(ver300)) + require.NoError(t, err) + err = txn.Commit(context.Background()) + require.NoError(t, err) + mustExec(t, seV3, fmt.Sprintf("update mysql.tidb set variable_value=%d where variable_name='tidb_server_version'", ver300)) + mustExec(t, seV3, fmt.Sprintf("delete from mysql.GLOBAL_VARIABLES where variable_name='%s'", variable.TiDBAnalyzeVersion)) + mustExec(t, seV3, "commit") + unsetStoreBootstrapped(store.UUID()) + ver, err := getBootstrapVersion(seV3) + require.NoError(t, err) + require.Equal(t, int64(ver300), ver) + + // We are now in 3.0.0, check tidb_analyze_version should not exist. + res := mustExec(t, seV3, fmt.Sprintf("select * from mysql.GLOBAL_VARIABLES where variable_name='%s'", variable.TiDBAnalyzeVersion)) + chk := res.NewChunk(nil) + err = res.Next(ctx, chk) + require.NoError(t, err) + require.Equal(t, 0, chk.NumRows()) + + domCurVer, err := BootstrapSession(store) + require.NoError(t, err) + defer domCurVer.Close() + seCurVer := createSessionAndSetID(t, store) + ver, err = getBootstrapVersion(seCurVer) + require.NoError(t, err) + require.Equal(t, currentBootstrapVersion, ver) + + // We are now in version no lower than 5.x, tidb_enable_index_merge should be 1. + res = mustExec(t, seCurVer, "select @@tidb_analyze_version") + chk = res.NewChunk(nil) + err = res.Next(ctx, chk) + require.NoError(t, err) + require.Equal(t, 1, chk.NumRows()) + row := chk.GetRow(0) + require.Equal(t, 1, row.Len()) + require.Equal(t, "1", row.GetString(0)) +} diff --git a/session/clustered_index_test.go b/session/clustered_index_test.go index 5d69c02acf076..b993bd3405a6d 100644 --- a/session/clustered_index_test.go +++ b/session/clustered_index_test.go @@ -34,8 +34,6 @@ func createTestKit(t *testing.T, store kv.Storage) *testkit.TestKit { } func TestClusteredUnionScan(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -59,8 +57,6 @@ func TestClusteredUnionScan(t *testing.T) { } func TestClusteredPrefixColumn(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -134,8 +130,6 @@ func TestClusteredPrefixColumn(t *testing.T) { } func TestClusteredUnionScanIndexLookup(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -155,8 +149,6 @@ func TestClusteredUnionScanIndexLookup(t *testing.T) { } func TestClusteredIndexLookUp(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -169,8 +161,6 @@ func TestClusteredIndexLookUp(t *testing.T) { } func TestClusteredIndexLookUp2(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -197,8 +187,6 @@ SELECT c_balance, c_first, c_middle, c_id FROM c3 use index (idx) WHERE c_w_id = } func TestClusteredTopN(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -219,8 +207,6 @@ func TestClusteredTopN(t *testing.T) { } func TestClusteredHint(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -231,8 +217,6 @@ func TestClusteredHint(t *testing.T) { } func TestClusteredBatchPointGet(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -249,8 +233,6 @@ type SnapCacheSizeGetter interface { } func TestClusteredInsertIgnoreBatchGetKeyCount(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -270,8 +252,6 @@ func TestClusteredInsertIgnoreBatchGetKeyCount(t *testing.T) { } func TestClusteredPrefixingPrimaryKey(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -350,8 +330,6 @@ func TestClusteredPrefixingPrimaryKey(t *testing.T) { } func TestClusteredWithOldRowFormat(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -405,8 +383,6 @@ func TestClusteredWithOldRowFormat(t *testing.T) { } func TestIssue20002(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -423,8 +399,6 @@ func TestIssue20002(t *testing.T) { // https://github.com/pingcap/tidb/issues/20727 func TestClusteredIndexSplitAndAddIndex(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -439,8 +413,6 @@ func TestClusteredIndexSplitAndAddIndex(t *testing.T) { } func TestClusteredIndexSelectWhereInNull(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() diff --git a/session/isolation_test.go b/session/isolation_test.go index fcac60418aa4c..ec8aa6a7fa9ae 100644 --- a/session/isolation_test.go +++ b/session/isolation_test.go @@ -15,9 +15,8 @@ package session_test import ( - "sync" - . "github.com/pingcap/check" + "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/testkit" ) @@ -55,12 +54,10 @@ func (s *testIsolationSuite) TestP0DirtyWrite(c *C) { session1.MustExec("begin;") session1.MustExec("update x set c = c+1 where id = 1;") session2.MustExec("begin;") - var wg sync.WaitGroup - wg.Add(1) - go func() { + var wg util.WaitGroupWrapper + wg.Run(func() { session2.MustExec("update x set c = c+1 where id = 1;") - wg.Done() - }() + }) session1.MustExec("commit;") wg.Wait() session2.MustExec("commit;") @@ -75,11 +72,9 @@ func (s *testIsolationSuite) TestP0DirtyWrite(c *C) { session1.MustExec("begin;") session1.MustExec("update x set c = c+1 where id = 1;") session2.MustExec("begin;") - wg.Add(1) - go func() { + wg.Run(func() { session2.MustExec("update x set c = c+1 where id = 1;") - wg.Done() - }() + }) session1.MustExec("commit;") wg.Wait() session2.MustExec("commit;") diff --git a/session/session.go b/session/session.go index 8c0ee6a089908..16fecfa3b0121 100644 --- a/session/session.go +++ b/session/session.go @@ -24,7 +24,6 @@ import ( "crypto/tls" "encoding/json" "fmt" - "net" "runtime/pprof" "runtime/trace" "strconv" @@ -45,6 +44,7 @@ import ( "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" + "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/table/temptable" "github.com/pingcap/tidb/util/topsql" "github.com/pingcap/tipb/go-binlog" @@ -90,6 +90,7 @@ import ( "github.com/pingcap/tidb/util/tableutil" "github.com/pingcap/tidb/util/timeutil" tikvstore "github.com/tikv/client-go/v2/kv" + "github.com/tikv/client-go/v2/oracle" "github.com/tikv/client-go/v2/tikv" tikvutil "github.com/tikv/client-go/v2/util" ) @@ -146,6 +147,7 @@ type Session interface { Auth(user *auth.UserIdentity, auth []byte, salt []byte) bool AuthWithoutVerification(user *auth.UserIdentity) bool AuthPluginForUser(user *auth.UserIdentity) (string, error) + MatchIdentity(username, remoteHost string) (*auth.UserIdentity, error) ShowProcess() *util.ProcessInfo // Return the information of the txn current running TxnInfo() *txninfo.TxnInfo @@ -161,9 +163,7 @@ type Session interface { ClearDiskFullOpt() } -var ( - _ Session = (*session)(nil) -) +var _ Session = (*session)(nil) type stmtRecord struct { st sqlexec.Statement @@ -311,7 +311,8 @@ func (s *session) cleanRetryInfo() { preparedObj, ok := preparedPointer.(*plannercore.CachedPrepareStmt) if ok { preparedAst = preparedObj.PreparedAst - cacheKey = plannercore.NewPSTMTPlanCacheKey(s.sessionVars, firstStmtID, preparedAst.SchemaVersion) + bindSQL := planner.GetBindSQL4PlanCache(s, preparedAst.Stmt) + cacheKey = plannercore.NewPSTMTPlanCacheKey(s.sessionVars, firstStmtID, preparedAst.SchemaVersion, bindSQL) } } } @@ -546,7 +547,7 @@ func (s *session) doCommit(ctx context.Context) error { } s.txn.SetOption(kv.EnableAsyncCommit, sessVars.EnableAsyncCommit) s.txn.SetOption(kv.Enable1PC, sessVars.Enable1PC) - s.txn.SetOption(kv.ResourceGroupTag, sessVars.StmtCtx.GetResourceGroupTag()) + s.txn.SetOption(kv.ResourceGroupTagger, sessVars.StmtCtx.GetResourceGroupTagger()) // priority of the sysvar is lower than `start transaction with causal consistency only` if val := s.txn.GetOption(kv.GuaranteeLinearizability); val == nil || val.(bool) { // We needn't ask the TiKV client to guarantee linearizability for auto-commit transactions @@ -560,10 +561,104 @@ func (s *session) doCommit(ctx context.Context) error { if tables := sessVars.TxnCtx.TemporaryTables; len(tables) > 0 { s.txn.SetOption(kv.KVFilter, temporaryTableKVFilter(tables)) } + if tables := sessVars.TxnCtx.CachedTables; len(tables) > 0 { + c := cachedTableRenewLease{tables: tables} + now := time.Now() + err := c.start(ctx) + defer c.stop(ctx) + sessVars.StmtCtx.WaitLockLeaseTime += time.Since(now) + if err != nil { + return errors.Trace(err) + } + s.txn.SetOption(kv.CommitTSUpperBoundCheck, c.commitTSCheck) + } return s.commitTxnWithTemporaryData(tikvutil.SetSessionID(ctx, sessVars.ConnectionID), &s.txn) } +type cachedTableRenewLease struct { + tables map[int64]interface{} + lease []uint64 // Lease for each visited cached tables. + exit chan struct{} +} + +func (c *cachedTableRenewLease) start(ctx context.Context) error { + c.exit = make(chan struct{}) + c.lease = make([]uint64, len(c.tables)) + wg := make(chan error) + ith := 0 + for tid, raw := range c.tables { + go c.keepAlive(ctx, wg, raw.(tables.StateRemote), tid, &c.lease[ith]) + ith++ + } + + // Wait for all LockForWrite() return, this function can return. + var err error + for ; ith > 0; ith-- { + tmp := <-wg + if tmp != nil { + err = tmp + } + } + return err +} + +const cacheTableWriteLease = 5 * time.Second + +func (c *cachedTableRenewLease) keepAlive(ctx context.Context, wg chan error, handle tables.StateRemote, tid int64, leasePtr *uint64) { + writeLockLease, err := handle.LockForWrite(ctx, tid) + atomic.StoreUint64(leasePtr, writeLockLease) + wg <- err + if err != nil { + logutil.Logger(ctx).Warn("[cached table] lock for write lock fail", zap.Error(err)) + return + } + + t := time.NewTicker(cacheTableWriteLease) + defer t.Stop() + for { + select { + case <-t.C: + if err := c.renew(ctx, handle, tid, leasePtr); err != nil { + logutil.Logger(ctx).Warn("[cached table] renew write lock lease fail", zap.Error(err)) + return + } + case <-c.exit: + return + } + } +} + +func (c *cachedTableRenewLease) renew(ctx context.Context, handle tables.StateRemote, tid int64, leasePtr *uint64) error { + oldLease := atomic.LoadUint64(leasePtr) + physicalTime := oracle.GetTimeFromTS(oldLease) + newLease := oracle.GoTimeToTS(physicalTime.Add(cacheTableWriteLease)) + + succ, err := handle.RenewLease(ctx, tid, newLease, tables.RenewWriteLease) + if err != nil { + return errors.Trace(err) + } + if succ { + atomic.StoreUint64(leasePtr, newLease) + } + return nil +} + +func (c *cachedTableRenewLease) stop(ctx context.Context) { + close(c.exit) +} + +func (c *cachedTableRenewLease) commitTSCheck(commitTS uint64) bool { + for i := 0; i < len(c.lease); i++ { + lease := atomic.LoadUint64(&c.lease[i]) + if commitTS >= lease { + // Txn fails to commit because the write lease is expired. + return false + } + } + return true +} + func (s *session) commitTxnWithTemporaryData(ctx context.Context, txn kv.Transaction) error { sessVars := s.sessionVars txnTempTables := sessVars.TxnCtx.TemporaryTables @@ -1038,9 +1133,10 @@ func createSessionWithDomainFunc(store kv.Storage) func(*domain.Domain) (pools.R } } -func drainRecordSet(ctx context.Context, se *session, rs sqlexec.RecordSet) ([]chunk.Row, error) { +func drainRecordSet(ctx context.Context, se *session, rs sqlexec.RecordSet, alloc chunk.Allocator) ([]chunk.Row, error) { var rows []chunk.Row - req := rs.NewChunk() + var req *chunk.Chunk + req = rs.NewChunk(alloc) for { err := rs.Next(ctx, req) if err != nil || req.NumRows() == 0 { @@ -1116,7 +1212,9 @@ func (s *session) GetGlobalSysVar(name string) (string, error) { return sv.Value, nil } } - return sysVar, nil + // It might have been written from an earlier TiDB version, so we should do type validation + // See https://github.com/pingcap/tidb/issues/30255 for why we don't do full validation. + return sv.ValidateFromType(s.GetSessionVars(), sysVar, variable.ScopeGlobal) } // SetGlobalSysVar implements GlobalVarAccessor.SetGlobalSysVar interface. @@ -1131,6 +1229,9 @@ func (s *session) SetGlobalSysVar(name, value string) (err error) { if err = sv.SetGlobalFromHook(s.sessionVars, value, false); err != nil { return err } + if sv.GlobalConfigName != "" { + domain.GetDomain(s).NotifyGlobalConfigChange(sv.GlobalConfigName, variable.OnOffToTrueFalse(value)) + } return s.replaceGlobalVariablesTableValue(context.TODO(), sv.Name, value) } @@ -1502,7 +1603,7 @@ func (s *session) ExecRestrictedStmt(ctx context.Context, stmtNode ast.StmtNode, } }() var rows []chunk.Row - rows, err = drainRecordSet(ctx, se, rs) + rows, err = drainRecordSet(ctx, se, rs, nil) if err != nil { return nil, nil, err } @@ -1518,8 +1619,7 @@ func (s *session) ExecuteStmt(ctx context.Context, stmtNode ast.StmtNode) (sqlex } s.PrepareTxnCtx(ctx) - err := s.loadCommonGlobalVariablesIfNeeded() - if err != nil { + if err := s.loadCommonGlobalVariablesIfNeeded(); err != nil { return nil, err } @@ -1546,7 +1646,8 @@ func (s *session) ExecuteStmt(ctx context.Context, stmtNode ast.StmtNode) (sqlex failpoint.Inject("mockStmtSlow", func(val failpoint.Value) { if strings.Contains(stmtNode.Text(), "/* sleep */") { - time.Sleep(time.Duration(val.(int)) * time.Millisecond) + v, _ := val.(int) + time.Sleep(time.Duration(v) * time.Millisecond) } }) @@ -1604,10 +1705,20 @@ func (s *session) validateStatementReadOnlyInStaleness(stmtNode ast.StmtNode) er } errMsg := "only support read-only statement during read-only staleness transactions" node := stmtNode.(ast.Node) - switch node.(type) { + switch v := node.(type) { case *ast.SplitRegionStmt: return nil - case *ast.SelectStmt, *ast.ExplainStmt, *ast.DoStmt, *ast.ShowStmt, *ast.SetOprStmt, *ast.ExecuteStmt, *ast.SetOprSelectList: + case *ast.SelectStmt: + // select lock statement needs start a transaction which will be conflict to stale read, + // we forbid select lock statement in stale read for now. + if v.LockInfo != nil { + return errors.New("select lock hasn't been supported in stale read yet") + } + if !planner.IsReadOnly(stmtNode, vars) { + return errors.New(errMsg) + } + return nil + case *ast.ExplainStmt, *ast.DoStmt, *ast.ShowStmt, *ast.SetOprStmt, *ast.ExecuteStmt, *ast.SetOprSelectList: if !planner.IsReadOnly(stmtNode, vars) { return errors.New(errMsg) } @@ -1626,7 +1737,7 @@ var querySpecialKeys = []fmt.Stringer{ executor.LoadDataVarKey, executor.LoadStatsVarKey, executor.IndexAdviseVarKey, - executor.PlanReplayerVarKey, + executor.PlanReplayerLoadVarKey, } func (s *session) hasQuerySpecial() bool { @@ -2070,7 +2181,7 @@ func (s *session) NewTxn(ctx context.Context) error { if err := s.checkBeforeNewTxn(ctx); err != nil { return err } - txn, err := s.store.BeginWithOption(tikv.DefaultStartTSOption().SetTxnScope(s.sessionVars.CheckAndGetTxnScope())) + txn, err := s.store.Begin(tikv.WithTxnScope(s.sessionVars.CheckAndGetTxnScope())) if err != nil { return err } @@ -2115,7 +2226,7 @@ func (s *session) NewStaleTxnWithStartTS(ctx context.Context, startTS uint64) er return err } txnScope := config.GetTxnScopeFromConfig() - txn, err := s.store.BeginWithOption(tikv.DefaultStartTSOption().SetTxnScope(txnScope).SetStartTS(startTS)) + txn, err := s.store.Begin(tikv.WithTxnScope(txnScope), tikv.WithStartTS(startTS)) if err != nil { return err } @@ -2208,91 +2319,61 @@ func (s *session) AuthPluginForUser(user *auth.UserIdentity) (string, error) { return authplugin, nil } +// Auth validates a user using an authentication string and salt. +// If the password fails, it will keep trying other users until exhausted. +// This means it can not be refactored to use MatchIdentity yet. func (s *session) Auth(user *auth.UserIdentity, authentication []byte, salt []byte) bool { pm := privilege.GetPrivilegeManager(s) - - // Check IP or localhost. - var success bool - user.AuthUsername, user.AuthHostname, success = pm.ConnectionVerification(user.Username, user.Hostname, authentication, salt, s.sessionVars.TLSConnectionState) - if success { + authUser, err := s.MatchIdentity(user.Username, user.Hostname) + if err != nil { + return false + } + if pm.ConnectionVerification(authUser.Username, authUser.Hostname, authentication, salt, s.sessionVars.TLSConnectionState) { + user.AuthUsername = authUser.Username + user.AuthHostname = authUser.Hostname s.sessionVars.User = user s.sessionVars.ActiveRoles = pm.GetDefaultRoles(user.AuthUsername, user.AuthHostname) return true - } else if user.Hostname == variable.DefHostname { - return false } + return false +} - // Check Hostname. - for _, addr := range s.getHostByIP(user.Hostname) { - u, h, success := pm.ConnectionVerification(user.Username, addr, authentication, salt, s.sessionVars.TLSConnectionState) - if success { - s.sessionVars.User = &auth.UserIdentity{ - Username: user.Username, - Hostname: addr, - AuthUsername: u, - AuthHostname: h, - } - s.sessionVars.ActiveRoles = pm.GetDefaultRoles(u, h) - return true - } +// MatchIdentity finds the matching username + password in the MySQL privilege tables +// for a username + hostname, since MySQL can have wildcards. +func (s *session) MatchIdentity(username, remoteHost string) (*auth.UserIdentity, error) { + pm := privilege.GetPrivilegeManager(s) + var success bool + var skipNameResolve bool + var user = &auth.UserIdentity{} + varVal, err := s.GetSessionVars().GlobalVarsAccessor.GetGlobalSysVar(variable.SkipNameResolve) + if err == nil && variable.TiDBOptOn(varVal) { + skipNameResolve = true } - return false + user.Username, user.Hostname, success = pm.MatchIdentity(username, remoteHost, skipNameResolve) + if success { + return user, nil + } + // This error will not be returned to the user, access denied will be instead + return nil, fmt.Errorf("could not find matching user in MatchIdentity: %s, %s", username, remoteHost) } // AuthWithoutVerification is required by the ResetConnection RPC func (s *session) AuthWithoutVerification(user *auth.UserIdentity) bool { pm := privilege.GetPrivilegeManager(s) - - // Check IP or localhost. - var success bool - user.AuthUsername, user.AuthHostname, success = pm.GetAuthWithoutVerification(user.Username, user.Hostname) - if success { + authUser, err := s.MatchIdentity(user.Username, user.Hostname) + if err != nil { + return false + } + if pm.GetAuthWithoutVerification(authUser.Username, authUser.Hostname) { + user.AuthUsername = authUser.Username + user.AuthHostname = authUser.Hostname s.sessionVars.User = user s.sessionVars.ActiveRoles = pm.GetDefaultRoles(user.AuthUsername, user.AuthHostname) return true - } else if user.Hostname == variable.DefHostname { - return false - } - - // Check Hostname. - for _, addr := range s.getHostByIP(user.Hostname) { - u, h, success := pm.GetAuthWithoutVerification(user.Username, addr) - if success { - s.sessionVars.User = &auth.UserIdentity{ - Username: user.Username, - Hostname: addr, - AuthUsername: u, - AuthHostname: h, - } - s.sessionVars.ActiveRoles = pm.GetDefaultRoles(u, h) - return true - } } return false } -func (s *session) getHostByIP(ip string) []string { - if ip == "127.0.0.1" { - return []string{variable.DefHostname} - } - skipNameResolve, err := s.GetSessionVars().GlobalVarsAccessor.GetGlobalSysVar(variable.SkipNameResolve) - if err == nil && variable.TiDBOptOn(skipNameResolve) { - return []string{ip} // user wants to skip name resolution - } - addrs, err := net.LookupAddr(ip) - if err != nil { - // These messages can be noisy. - // See: https://github.com/pingcap/tidb/pull/13989 - logutil.BgLogger().Debug( - "net.LookupAddr returned an error during auth check", - zap.String("ip", ip), - zap.Error(err), - ) - return []string{ip} - } - return addrs -} - // RefreshVars implements the sessionctx.Context interface. func (s *session) RefreshVars(ctx context.Context) error { pruneMode, err := s.GetSessionVars().GlobalVarsAccessor.GetGlobalSysVar(variable.TiDBPartitionPruneMode) @@ -2411,9 +2492,7 @@ func loadDefOOMAction(se *session) (string, error) { return defOOMAction, nil } -var ( - errResultIsEmpty = dbterror.ClassExecutor.NewStd(errno.ErrResultIsEmpty) -) +var errResultIsEmpty = dbterror.ClassExecutor.NewStd(errno.ErrResultIsEmpty) // BootstrapSession runs the first time when the TiDB server start. func BootstrapSession(store kv.Storage) (*domain.Domain, error) { @@ -2439,6 +2518,7 @@ func BootstrapSession(store kv.Storage) (*domain.Domain, error) { if err != nil { return nil, err } + se.GetSessionVars().InRestrictedSQL = true // get system tz from mysql.tidb tz, err := se.getTableValue(context.TODO(), mysql.TiDBTable, "system_tz") @@ -2551,11 +2631,7 @@ func BootstrapSession(store kv.Storage) (*domain.Domain, error) { return nil, err } - se8, err := createSession(store) - if err != nil { - return nil, err - } - dom.PlanReplayerLoop(se8) + dom.PlanReplayerLoop() if raw, ok := store.(kv.EtcdBackend); ok { err = raw.StartGCWorker() @@ -2677,7 +2753,6 @@ func getStoreBootstrapVersion(store kv.Storage) int64 { ver, err = t.GetBootstrapVersion() return err }) - if err != nil { logutil.BgLogger().Fatal("check bootstrapped failed", zap.Error(err)) @@ -2777,6 +2852,14 @@ func (s *session) PrepareTSFuture(ctx context.Context) { return } if !s.txn.validOrPending() { + if s.GetSessionVars().StmtCtx.IsStaleness { + // Do nothing when StmtCtx.IsStaleness is true + // we don't need to request tso for stale read + return + } + failpoint.Inject("assertTSONotRequest", func() { + panic("tso shouldn't be requested") + }) // Prepare the transaction future if the transaction is invalid (at the beginning of the transaction). txnFuture := s.getTxnFuture(ctx) s.txn.changeInvalidToPending(txnFuture) @@ -2808,7 +2891,7 @@ func (s *session) InitTxnWithStartTS(startTS uint64) error { } // no need to get txn from txnFutureCh since txn should init with startTs - txn, err := s.store.BeginWithOption(tikv.DefaultStartTSOption().SetTxnScope(s.GetSessionVars().CheckAndGetTxnScope()).SetStartTS(startTS)) + txn, err := s.store.Begin(tikv.WithTxnScope(s.GetSessionVars().CheckAndGetTxnScope()), tikv.WithStartTS(startTS)) if err != nil { return err } @@ -2998,7 +3081,7 @@ func (s *session) GetTxnWriteThroughputSLI() *sli.TxnWriteThroughputSLI { return &s.txn.writeSLI } -var _ telemetry.TemporaryTableFeatureChecker = &session{} +var _ telemetry.TemporaryOrCacheTableFeatureChecker = &session{} // TemporaryTableExists is used by the telemetry package to avoid circle dependency. func (s *session) TemporaryTableExists() bool { @@ -3013,6 +3096,19 @@ func (s *session) TemporaryTableExists() bool { return false } +// CachedTableExists is used by the telemetry package to avoid circle dependency. +func (s *session) CachedTableExists() bool { + is := domain.GetDomain(s).InfoSchema() + for _, dbInfo := range is.AllSchemas() { + for _, tbInfo := range is.SchemaTables(dbInfo.Name) { + if tbInfo.Meta().TableCacheStatusType != model.TableCacheStatusDisable { + return true + } + } + } + return false +} + // GetInfoSchema returns snapshotInfoSchema if snapshot schema is set. // Transaction infoschema is returned if inside an explicit txn. // Otherwise the latest infoschema is returned. diff --git a/session/session_test.go b/session/session_test.go index bccc017083618..7b5febe0d18e0 100644 --- a/session/session_test.go +++ b/session/session_test.go @@ -18,6 +18,7 @@ import ( "context" "flag" "fmt" + "net" "os" "path" "runtime" @@ -61,6 +62,7 @@ import ( "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/sqlexec" "github.com/pingcap/tidb/util/testkit" @@ -689,6 +691,59 @@ func (s *testSessionSuite) TestGlobalVarAccessor(c *C) { _, err = tk.Exec("set global time_zone = 'timezone'") c.Assert(err, NotNil) c.Assert(terror.ErrorEqual(err, variable.ErrUnknownTimeZone), IsTrue) + + // Set the global var to a non canonical form of the value + // i.e. implying that it was set from an earlier version of TiDB. + + tk.MustExec(`REPLACE INTO mysql.global_variables (variable_name, variable_value) VALUES ('tidb_enable_noop_functions', '0')`) + domain.GetDomain(tk.Se).NotifyUpdateSysVarCache() // update cache + v, err = se.GetGlobalSysVar("tidb_enable_noop_functions") + c.Assert(err, IsNil) + c.Assert(v, Equals, "OFF") +} + +func (s *testSessionSuite) TestMatchIdentity(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("CREATE USER `useridentity`@`%`") + tk.MustExec("CREATE USER `useridentity`@`localhost`") + tk.MustExec("CREATE USER `useridentity`@`192.168.1.1`") + tk.MustExec("CREATE USER `useridentity`@`example.com`") + + // The MySQL matching rule is most specific to least specific. + // So if I log in from 192.168.1.1 I should match that entry always. + identity, err := tk.Se.MatchIdentity("useridentity", "192.168.1.1") + c.Assert(err, IsNil) + c.Assert(identity.Username, Equals, "useridentity") + c.Assert(identity.Hostname, Equals, "192.168.1.1") + + // If I log in from localhost, I should match localhost + identity, err = tk.Se.MatchIdentity("useridentity", "localhost") + c.Assert(err, IsNil) + c.Assert(identity.Username, Equals, "useridentity") + c.Assert(identity.Hostname, Equals, "localhost") + + // If I log in from 192.168.1.2 I should match wildcard. + identity, err = tk.Se.MatchIdentity("useridentity", "192.168.1.2") + c.Assert(err, IsNil) + c.Assert(identity.Username, Equals, "useridentity") + c.Assert(identity.Hostname, Equals, "%") + + identity, err = tk.Se.MatchIdentity("useridentity", "127.0.0.1") + c.Assert(err, IsNil) + c.Assert(identity.Username, Equals, "useridentity") + c.Assert(identity.Hostname, Equals, "localhost") + + // This uses the lookup of example.com to get an IP address. + // We then login with that IP address, but expect it to match the example.com + // entry in the privileges table (by reverse lookup). + ips, err := net.LookupHost("example.com") + c.Assert(err, IsNil) + identity, err = tk.Se.MatchIdentity("useridentity", ips[0]) + c.Assert(err, IsNil) + c.Assert(identity.Username, Equals, "useridentity") + // FIXME: we *should* match example.com instead + // as long as skip-name-resolve is not set (DEFAULT) + c.Assert(identity.Hostname, Equals, "%") } func (s *testSessionSuite) TestGetSysVariables(c *C) { @@ -705,9 +760,11 @@ func (s *testSessionSuite) TestGetSysVariables(c *C) { tk.MustExec("select @@max_connections") tk.MustExec("select @@global.max_connections") _, err = tk.Exec("select @@session.max_connections") - c.Assert(terror.ErrorEqual(err, variable.ErrIncorrectScope), IsTrue, Commentf("err %v", err)) + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[variable:1238]Variable 'max_connections' is a GLOBAL variable") _, err = tk.Exec("select @@local.max_connections") - c.Assert(terror.ErrorEqual(err, variable.ErrIncorrectScope), IsTrue, Commentf("err %v", err)) + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[variable:1238]Variable 'max_connections' is a GLOBAL variable") // Test ScopeNone tk.MustExec("select @@performance_schema_max_mutex_classes") @@ -715,6 +772,10 @@ func (s *testSessionSuite) TestGetSysVariables(c *C) { // For issue 19524, test tk.MustExec("select @@session.performance_schema_max_mutex_classes") tk.MustExec("select @@local.performance_schema_max_mutex_classes") + + _, err = tk.Exec("select @@global.last_insert_id") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[variable:1238]Variable 'last_insert_id' is a SESSION variable") } func (s *testSessionSuite) TestRetryResetStmtCtx(c *C) { @@ -1528,7 +1589,7 @@ func (s *testSessionSuite) TestResultType(c *C) { tk := testkit.NewTestKitWithInit(c, s.store) rs, err := tk.Exec(`select cast(null as char(30))`) c.Assert(err, IsNil) - req := rs.NewChunk() + req := rs.NewChunk(nil) err = rs.Next(context.Background(), req) c.Assert(err, IsNil) c.Assert(req.GetRow(0).IsNull(0), IsTrue) @@ -1702,31 +1763,24 @@ func (s *testSessionSuite2) TestRetry(c *C) { tk2.MustExec("set @@tidb_disable_txn_auto_retry = 0") tk3.MustExec("set @@tidb_disable_txn_auto_retry = 0") - var wg sync.WaitGroup - wg.Add(3) - f1 := func() { - defer wg.Done() + var wg util.WaitGroupWrapper + wg.Run(func() { for i := 0; i < 30; i++ { tk1.MustExec("update t set c = 1;") } - } - f2 := func() { - defer wg.Done() + }) + wg.Run(func() { for i := 0; i < 30; i++ { tk2.MustExec("update t set c = ?;", 1) } - } - f3 := func() { - defer wg.Done() + }) + wg.Run(func() { for i := 0; i < 30; i++ { tk3.MustExec("begin") tk3.MustExec("update t set c = 1;") tk3.MustExec("commit") } - } - go f1() - go f2() - go f3() + }) wg.Wait() } @@ -2158,6 +2212,22 @@ func (s *testSchemaSerialSuite) TestLoadSchemaFailed(c *C) { tk2.MustExec("commit") } +func (s *testSchemaSerialSuite) TestValidationRecursion(c *C) { + // We have to expect that validation functions will call GlobalVarsAccessor.GetGlobalSysVar(). + // This tests for a regression where GetGlobalSysVar() can not safely call the validation + // function because it might cause infinite recursion. + // See: https://github.com/pingcap/tidb/issues/30255 + sv := variable.SysVar{Scope: variable.ScopeGlobal, Name: "mynewsysvar", Value: "test", Validation: func(vars *variable.SessionVars, normalizedValue string, originalValue string, scope variable.ScopeFlag) (string, error) { + return vars.GlobalVarsAccessor.GetGlobalSysVar("mynewsysvar") + }} + variable.RegisterSysVar(&sv) + + tk := testkit.NewTestKitWithInit(c, s.store) + val, err := sv.Validate(tk.Se.GetSessionVars(), "test2", variable.ScopeGlobal) + c.Assert(err, IsNil) + c.Assert(val, Equals, "test") +} + func (s *testSchemaSerialSuite) TestSchemaCheckerSQL(c *C) { tk := testkit.NewTestKitWithInit(c, s.store) tk1 := testkit.NewTestKitWithInit(c, s.store) @@ -2433,7 +2503,7 @@ func (s *testSchemaSuite) TestTableReaderChunk(c *C) { }() rs, err := tk.Exec("select * from chk") c.Assert(err, IsNil) - req := rs.NewChunk() + req := rs.NewChunk(nil) var count int var numChunks int for { @@ -2470,7 +2540,7 @@ func (s *testSchemaSuite) TestInsertExecChunk(c *C) { c.Assert(err, IsNil) var idx int for { - req := rs.NewChunk() + req := rs.NewChunk(nil) err = rs.Next(context.TODO(), req) c.Assert(err, IsNil) if req.NumRows() == 0 { @@ -2504,7 +2574,7 @@ func (s *testSchemaSuite) TestUpdateExecChunk(c *C) { c.Assert(err, IsNil) var idx int for { - req := rs.NewChunk() + req := rs.NewChunk(nil) err = rs.Next(context.TODO(), req) c.Assert(err, IsNil) if req.NumRows() == 0 { @@ -2539,7 +2609,7 @@ func (s *testSchemaSuite) TestDeleteExecChunk(c *C) { rs, err := tk.Exec("select * from chk") c.Assert(err, IsNil) - req := rs.NewChunk() + req := rs.NewChunk(nil) err = rs.Next(context.TODO(), req) c.Assert(err, IsNil) c.Assert(req.NumRows(), Equals, 1) @@ -2571,7 +2641,7 @@ func (s *testSchemaSuite) TestDeleteMultiTableExecChunk(c *C) { var idx int for { - req := rs.NewChunk() + req := rs.NewChunk(nil) err = rs.Next(context.TODO(), req) c.Assert(err, IsNil) @@ -2591,7 +2661,7 @@ func (s *testSchemaSuite) TestDeleteMultiTableExecChunk(c *C) { rs, err = tk.Exec("select * from chk2") c.Assert(err, IsNil) - req := rs.NewChunk() + req := rs.NewChunk(nil) err = rs.Next(context.TODO(), req) c.Assert(err, IsNil) c.Assert(req.NumRows(), Equals, 0) @@ -2615,7 +2685,7 @@ func (s *testSchemaSuite) TestIndexLookUpReaderChunk(c *C) { tk.Se.GetSessionVars().IndexLookupSize = 10 rs, err := tk.Exec("select * from chk order by k") c.Assert(err, IsNil) - req := rs.NewChunk() + req := rs.NewChunk(nil) var count int for { err = rs.Next(context.TODO(), req) @@ -2635,7 +2705,7 @@ func (s *testSchemaSuite) TestIndexLookUpReaderChunk(c *C) { rs, err = tk.Exec("select k from chk where c < 90 order by k") c.Assert(err, IsNil) - req = rs.NewChunk() + req = rs.NewChunk(nil) count = 0 for { err = rs.Next(context.TODO(), req) @@ -3802,6 +3872,11 @@ func (s *testSessionSuite3) TestSetVarHint(c *C) { c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) tk.MustQuery("SELECT @@max_heap_table_size;").Check(testkit.Rows("16777216")) + tk.Se.GetSessionVars().SetSystemVar("tmp_table_size", "16777216") + tk.MustQuery("SELECT /*+ SET_VAR(tmp_table_size=16384) */ @@tmp_table_size;").Check(testkit.Rows("16384")) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) + tk.MustQuery("SELECT @@tmp_table_size;").Check(testkit.Rows("16777216")) + tk.Se.GetSessionVars().SetSystemVar("div_precision_increment", "4") tk.MustQuery("SELECT /*+ SET_VAR(div_precision_increment=0) */ @@div_precision_increment;").Check(testkit.Rows("0")) c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) @@ -4739,47 +4814,47 @@ func (s *testSessionSuite) TestInTxnPSProtoPointGet(c *C) { } func (s *testSessionSuite) TestTMPTableSize(c *C) { - // Test the @@tmp_table_size system variable. + // Test the @@tidb_tmp_table_max_size system variable. tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") - tk.MustExec("create global temporary table t (c1 int, c2 varchar(512)) on commit delete rows") - tk.MustExec("create temporary table tl (c1 int, c2 varchar(512))") + tk.MustExec("create global temporary table t (c1 int, c2 mediumtext) on commit delete rows") + tk.MustExec("create temporary table tl (c1 int, c2 mediumtext)") - tk.MustQuery("select @@global.tmp_table_size").Check(testkit.Rows(strconv.Itoa(variable.DefTMPTableSize))) - c.Assert(tk.Se.GetSessionVars().TMPTableSize, Equals, int64(variable.DefTMPTableSize)) + tk.MustQuery("select @@global.tidb_tmp_table_max_size").Check(testkit.Rows(strconv.Itoa(variable.DefTiDBTmpTableMaxSize))) + c.Assert(tk.Se.GetSessionVars().TMPTableSize, Equals, int64(variable.DefTiDBTmpTableMaxSize)) - // Min value 1024, so the result is change to 1024, with a warning. - tk.MustExec("set @@global.tmp_table_size = 123") - tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1292 Truncated incorrect tmp_table_size value: '123'")) + // Min value 1M, so the result is change to 1M, with a warning. + tk.MustExec("set @@global.tidb_tmp_table_max_size = 123") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1292 Truncated incorrect tidb_tmp_table_max_size value: '123'")) - // Change the session scope value. - tk.MustExec("set @@session.tmp_table_size = 2097152") + // Change the session scope value to 2M. + tk.MustExec("set @@session.tidb_tmp_table_max_size = 2097152") c.Assert(tk.Se.GetSessionVars().TMPTableSize, Equals, int64(2097152)) - // Check in another sessin, change session scope value does not affect the global scope. + // Check in another session, change session scope value does not affect the global scope. tk1 := testkit.NewTestKit(c, s.store) - tk1.MustQuery("select @@global.tmp_table_size").Check(testkit.Rows("1024")) + tk1.MustQuery("select @@global.tidb_tmp_table_max_size").Check(testkit.Rows(strconv.Itoa(1 << 20))) - // The value is now 1024, check the error when table size exceed it. - tk.MustExec("set @@session.tmp_table_size = 1024") + // The value is now 1M, check the error when table size exceed it. + tk.MustExec(fmt.Sprintf("set @@session.tidb_tmp_table_max_size = %d", 1<<20)) tk.MustExec("begin") - tk.MustExec("insert into t values (1, repeat('x', 512))") - tk.MustExec("insert into t values (1, repeat('x', 512))") - tk.MustGetErrCode("insert into t values (1, repeat('x', 512))", errno.ErrRecordFileFull) + tk.MustExec("insert into t values (1, repeat('x', 512*1024))") + tk.MustExec("insert into t values (1, repeat('x', 512*1024))") + tk.MustGetErrCode("insert into t values (1, repeat('x', 512*1024))", errno.ErrRecordFileFull) tk.MustExec("rollback") // Check local temporary table tk.MustExec("begin") - tk.MustExec("insert into tl values (1, repeat('x', 512))") - tk.MustExec("insert into tl values (1, repeat('x', 512))") - tk.MustGetErrCode("insert into tl values (1, repeat('x', 512))", errno.ErrRecordFileFull) + tk.MustExec("insert into tl values (1, repeat('x', 512*1024))") + tk.MustExec("insert into tl values (1, repeat('x', 512*1024))") + tk.MustGetErrCode("insert into tl values (1, repeat('x', 512*1024))", errno.ErrRecordFileFull) tk.MustExec("rollback") // Check local temporary table with some data in session - tk.MustExec("insert into tl values (1, repeat('x', 512))") + tk.MustExec("insert into tl values (1, repeat('x', 512*1024))") tk.MustExec("begin") - tk.MustExec("insert into tl values (1, repeat('x', 512))") - tk.MustGetErrCode("insert into tl values (1, repeat('x', 512))", errno.ErrRecordFileFull) + tk.MustExec("insert into tl values (1, repeat('x', 512*1024))") + tk.MustGetErrCode("insert into tl values (1, repeat('x', 512*1024))", errno.ErrRecordFileFull) tk.MustExec("rollback") } @@ -5708,3 +5783,135 @@ func (s *testSessionSuite) TestFixSetTiDBSnapshotTS(c *C) { tk.MustExec("SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER';") tk.MustExec("use t123") } + +func (s *testSessionSuite) TestSetPDClientDynmaicOption(c *C) { + var err error + tk := testkit.NewTestKit(c, s.store) + tk.MustQuery("select @@tidb_tso_client_batch_max_wait_time;").Check(testkit.Rows("0")) + tk.MustExec("set global tidb_tso_client_batch_max_wait_time = 0.5;") + tk.MustQuery("select @@tidb_tso_client_batch_max_wait_time;").Check(testkit.Rows("0.5")) + tk.MustExec("set global tidb_tso_client_batch_max_wait_time = 1;") + tk.MustQuery("select @@tidb_tso_client_batch_max_wait_time;").Check(testkit.Rows("1")) + tk.MustExec("set global tidb_tso_client_batch_max_wait_time = 1.5;") + tk.MustQuery("select @@tidb_tso_client_batch_max_wait_time;").Check(testkit.Rows("1.5")) + tk.MustExec("set global tidb_tso_client_batch_max_wait_time = 10;") + tk.MustQuery("select @@tidb_tso_client_batch_max_wait_time;").Check(testkit.Rows("10")) + err = tk.ExecToErr("set tidb_tso_client_batch_max_wait_time = 0;") + c.Assert(err, NotNil) + tk.MustExec("set global tidb_tso_client_batch_max_wait_time = -1;") + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1292|Truncated incorrect tidb_tso_client_batch_max_wait_time value: '-1'")) + tk.MustQuery("select @@tidb_tso_client_batch_max_wait_time;").Check(testkit.Rows("0")) + tk.MustExec("set global tidb_tso_client_batch_max_wait_time = -0.1;") + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1292|Truncated incorrect tidb_tso_client_batch_max_wait_time value: '-0.1'")) + tk.MustQuery("select @@tidb_tso_client_batch_max_wait_time;").Check(testkit.Rows("0")) + tk.MustExec("set global tidb_tso_client_batch_max_wait_time = 10.1;") + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1292|Truncated incorrect tidb_tso_client_batch_max_wait_time value: '10.1'")) + tk.MustQuery("select @@tidb_tso_client_batch_max_wait_time;").Check(testkit.Rows("10")) + tk.MustExec("set global tidb_tso_client_batch_max_wait_time = 11;") + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1292|Truncated incorrect tidb_tso_client_batch_max_wait_time value: '11'")) + tk.MustQuery("select @@tidb_tso_client_batch_max_wait_time;").Check(testkit.Rows("10")) + + tk.MustQuery("select @@tidb_enable_tso_follower_proxy;").Check(testkit.Rows("0")) + tk.MustExec("set global tidb_enable_tso_follower_proxy = on;") + tk.MustQuery("select @@tidb_enable_tso_follower_proxy;").Check(testkit.Rows("1")) + tk.MustExec("set global tidb_enable_tso_follower_proxy = off;") + tk.MustQuery("select @@tidb_enable_tso_follower_proxy;").Check(testkit.Rows("0")) + err = tk.ExecToErr("set tidb_tso_client_batch_max_wait_time = 0;") + c.Assert(err, NotNil) +} + +func (s *testSessionSuite) TestSameNameObjectWithLocalTemporaryTable(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1") + tk.MustExec("drop sequence if exists s1") + tk.MustExec("drop view if exists v1") + + // prepare + tk.MustExec("create table t1 (a int)") + defer tk.MustExec("drop table if exists t1") + tk.MustQuery("show create table t1").Check(testkit.Rows( + "t1 CREATE TABLE `t1` (\n" + + " `a` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) + + tk.MustExec("create view v1 as select 1") + defer tk.MustExec("drop view if exists v1") + tk.MustQuery("show create view v1").Check(testkit.Rows("v1 CREATE ALGORITHM=UNDEFINED DEFINER=``@`` SQL SECURITY DEFINER VIEW `v1` (`1`) AS SELECT 1 AS `1` utf8mb4 utf8mb4_bin")) + tk.MustQuery("show create table v1").Check(testkit.Rows("v1 CREATE ALGORITHM=UNDEFINED DEFINER=``@`` SQL SECURITY DEFINER VIEW `v1` (`1`) AS SELECT 1 AS `1` utf8mb4 utf8mb4_bin")) + + tk.MustExec("create sequence s1") + defer tk.MustExec("drop sequence if exists s1") + tk.MustQuery("show create sequence s1").Check(testkit.Rows("s1 CREATE SEQUENCE `s1` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=InnoDB")) + tk.MustQuery("show create table s1").Check(testkit.Rows("s1 CREATE SEQUENCE `s1` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=InnoDB")) + + // temp table + tk.MustExec("create temporary table t1 (ct1 int)") + tk.MustQuery("show create table t1").Check(testkit.Rows( + "t1 CREATE TEMPORARY TABLE `t1` (\n" + + " `ct1` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) + + tk.MustExec("create temporary table v1 (cv1 int)") + tk.MustQuery("show create view v1").Check(testkit.Rows("v1 CREATE ALGORITHM=UNDEFINED DEFINER=``@`` SQL SECURITY DEFINER VIEW `v1` (`1`) AS SELECT 1 AS `1` utf8mb4 utf8mb4_bin")) + tk.MustQuery("show create table v1").Check(testkit.Rows( + "v1 CREATE TEMPORARY TABLE `v1` (\n" + + " `cv1` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) + + tk.MustExec("create temporary table s1 (cs1 int)") + tk.MustQuery("show create sequence s1").Check(testkit.Rows("s1 CREATE SEQUENCE `s1` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=InnoDB")) + tk.MustQuery("show create table s1").Check(testkit.Rows( + "s1 CREATE TEMPORARY TABLE `s1` (\n" + + " `cs1` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) + + // drop + tk.MustExec("drop view v1") + err := tk.ExecToErr("show create view v1") + c.Assert(err.Error(), Equals, "[schema:1146]Table 'test.v1' doesn't exist") + tk.MustQuery("show create table v1").Check(testkit.Rows( + "v1 CREATE TEMPORARY TABLE `v1` (\n" + + " `cv1` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) + + tk.MustExec("drop sequence s1") + err = tk.ExecToErr("show create sequence s1") + c.Assert(err.Error(), Equals, "[schema:1146]Table 'test.s1' doesn't exist") + tk.MustQuery("show create table s1").Check(testkit.Rows( + "s1 CREATE TEMPORARY TABLE `s1` (\n" + + " `cs1` int(11) DEFAULT NULL\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) +} + +func (s *testSessionSuite) TestWriteOnMultipleCachedTable(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists ct1, ct2") + tk.MustExec("create table ct1 (id int, c int)") + tk.MustExec("create table ct2 (id int, c int)") + tk.MustExec("alter table ct1 cache") + tk.MustExec("alter table ct2 cache") + tk.MustQuery("select * from ct1").Check(testkit.Rows()) + tk.MustQuery("select * from ct2").Check(testkit.Rows()) + + cached := false + for i := 0; i < 50; i++ { + if tk.HasPlan("select * from ct1", "Union") { + if tk.HasPlan("select * from ct2", "Union") { + cached = true + break + } + } + time.Sleep(100 * time.Millisecond) + } + c.Assert(cached, IsTrue) + + tk.MustExec("begin") + tk.MustExec("insert into ct1 values (3, 4)") + tk.MustExec("insert into ct2 values (5, 6)") + tk.MustExec("commit") + + tk.MustQuery("select * from ct1").Check(testkit.Rows("3 4")) + tk.MustQuery("select * from ct2").Check(testkit.Rows("5 6")) +} diff --git a/session/tidb.go b/session/tidb.go index 5f08768b70326..911e64f3727f2 100644 --- a/session/tidb.go +++ b/session/tidb.go @@ -319,7 +319,7 @@ func GetRows4Test(ctx context.Context, sctx sessionctx.Context, rs sqlexec.Recor return nil, nil } var rows []chunk.Row - req := rs.NewChunk() + req := rs.NewChunk(nil) // Must reuse `req` for imitating server.(*clientConn).writeChunks for { err := rs.Next(ctx, req) diff --git a/session/tidb_test.go b/session/tidb_test.go index 4c854b4b66354..661a8f19d5f47 100644 --- a/session/tidb_test.go +++ b/session/tidb_test.go @@ -27,8 +27,6 @@ import ( ) func TestSysSessionPoolGoroutineLeak(t *testing.T) { - t.Parallel() - store, dom := createStoreAndBootstrap(t) defer func() { require.NoError(t, store.Close()) }() defer dom.Close() @@ -58,8 +56,6 @@ func TestSysSessionPoolGoroutineLeak(t *testing.T) { } func TestParseErrorWarn(t *testing.T) { - t.Parallel() - ctx := core.MockContext() nodes, err := Parse(ctx, "select /*+ adf */ 1") @@ -72,8 +68,6 @@ func TestParseErrorWarn(t *testing.T) { } func TestKeysNeedLock(t *testing.T) { - t.Parallel() - rowKey := tablecodec.EncodeRowKeyWithHandle(1, kv.IntHandle(1)) indexKey := tablecodec.EncodeIndexSeekKey(1, 1, []byte{1}) uniqueValue := make([]byte, 8) diff --git a/session/txn.go b/session/txn.go index 59472807a4c83..2ed83e89c2fde 100644 --- a/session/txn.go +++ b/session/txn.go @@ -489,14 +489,14 @@ type txnFuture struct { func (tf *txnFuture) wait() (kv.Transaction, error) { startTS, err := tf.future.Wait() if err == nil { - return tf.store.BeginWithOption(tikv.DefaultStartTSOption().SetTxnScope(tf.txnScope).SetStartTS(startTS)) + return tf.store.Begin(tikv.WithTxnScope(tf.txnScope), tikv.WithStartTS(startTS)) } else if config.GetGlobalConfig().Store == "unistore" { return nil, err } logutil.BgLogger().Warn("wait tso failed", zap.Error(err)) // It would retry get timestamp. - return tf.store.BeginWithOption(tikv.DefaultStartTSOption().SetTxnScope(tf.txnScope)) + return tf.store.Begin(tikv.WithTxnScope(tf.txnScope)) } func (s *session) getTxnFuture(ctx context.Context) *txnFuture { diff --git a/sessionctx/binloginfo/binloginfo_test.go b/sessionctx/binloginfo/binloginfo_test.go index 21ba469be645a..511db81cd81ad 100644 --- a/sessionctx/binloginfo/binloginfo_test.go +++ b/sessionctx/binloginfo/binloginfo_test.go @@ -158,8 +158,8 @@ func TestBinlog(t *testing.T) { require.Greater(t, prewriteVal.SchemaVersion, int64(0)) require.Greater(t, prewriteVal.Mutations[0].TableId, int64(0)) expected := [][]types.Datum{ - {types.NewIntDatum(1), types.NewCollationStringDatum("abc", mysql.DefaultCollationName, collate.DefaultLen)}, - {types.NewIntDatum(2), types.NewCollationStringDatum("cde", mysql.DefaultCollationName, collate.DefaultLen)}, + {types.NewIntDatum(1), types.NewCollationStringDatum("abc", mysql.DefaultCollationName)}, + {types.NewIntDatum(2), types.NewCollationStringDatum("cde", mysql.DefaultCollationName)}, } gotRows := mutationRowsToRows(t, prewriteVal.Mutations[0].InsertedRows, 2, 4) require.Equal(t, expected, gotRows) @@ -167,10 +167,10 @@ func TestBinlog(t *testing.T) { tk.MustExec("update local_binlog set name = 'xyz' where id = 2") prewriteVal = getLatestBinlogPrewriteValue(t, pump) oldRow := [][]types.Datum{ - {types.NewIntDatum(2), types.NewCollationStringDatum("cde", mysql.DefaultCollationName, collate.DefaultLen)}, + {types.NewIntDatum(2), types.NewCollationStringDatum("cde", mysql.DefaultCollationName)}, } newRow := [][]types.Datum{ - {types.NewIntDatum(2), types.NewCollationStringDatum("xyz", mysql.DefaultCollationName, collate.DefaultLen)}, + {types.NewIntDatum(2), types.NewCollationStringDatum("xyz", mysql.DefaultCollationName)}, } gotRows = mutationRowsToRows(t, prewriteVal.Mutations[0].UpdatedRows, 1, 3) require.Equal(t, oldRow, gotRows) @@ -182,7 +182,7 @@ func TestBinlog(t *testing.T) { prewriteVal = getLatestBinlogPrewriteValue(t, pump) gotRows = mutationRowsToRows(t, prewriteVal.Mutations[0].DeletedRows, 1, 3) expected = [][]types.Datum{ - {types.NewIntDatum(1), types.NewCollationStringDatum("abc", mysql.DefaultCollationName, collate.DefaultLen)}, + {types.NewIntDatum(1), types.NewCollationStringDatum("abc", mysql.DefaultCollationName)}, } require.Equal(t, expected, gotRows) diff --git a/sessionctx/stmtctx/stmtctx.go b/sessionctx/stmtctx/stmtctx.go index 03f7a418f6b76..e41eb4766b47b 100644 --- a/sessionctx/stmtctx/stmtctx.go +++ b/sessionctx/stmtctx/stmtctx.go @@ -29,6 +29,8 @@ import ( "github.com/pingcap/tidb/util/execdetails" "github.com/pingcap/tidb/util/memory" "github.com/pingcap/tidb/util/resourcegrouptag" + "github.com/pingcap/tidb/util/tracing" + "github.com/tikv/client-go/v2/tikvrpc" "github.com/tikv/client-go/v2/util" atomic2 "go.uber.org/atomic" "go.uber.org/zap" @@ -64,31 +66,33 @@ type StatementContext struct { // IsDDLJobInQueue is used to mark whether the DDL job is put into the queue. // If IsDDLJobInQueue is true, it means the DDL job is in the queue of storage, and it can be handled by the DDL worker. - IsDDLJobInQueue bool - InInsertStmt bool - InUpdateStmt bool - InDeleteStmt bool - InSelectStmt bool - InLoadDataStmt bool - InExplainStmt bool - InCreateOrAlterStmt bool - IgnoreTruncate bool - IgnoreZeroInDate bool - DupKeyAsWarning bool - BadNullAsWarning bool - DividedByZeroAsWarning bool - TruncateAsWarning bool - OverflowAsWarning bool - InShowWarning bool - UseCache bool - BatchCheck bool - InNullRejectCheck bool - AllowInvalidDate bool - IgnoreNoPartition bool - MaybeOverOptimized4PlanCache bool - IgnoreExplainIDSuffix bool - IsStaleness bool - + IsDDLJobInQueue bool + InInsertStmt bool + InUpdateStmt bool + InDeleteStmt bool + InSelectStmt bool + InLoadDataStmt bool + InExplainStmt bool + InCreateOrAlterStmt bool + IgnoreTruncate bool + IgnoreZeroInDate bool + DupKeyAsWarning bool + BadNullAsWarning bool + DividedByZeroAsWarning bool + TruncateAsWarning bool + OverflowAsWarning bool + InShowWarning bool + UseCache bool + BatchCheck bool + InNullRejectCheck bool + AllowInvalidDate bool + IgnoreNoPartition bool + SkipPlanCache bool + IgnoreExplainIDSuffix bool + // If the select statement was like 'select * from t as of timestamp ...' or in a stale read transaction + // or is affected by the tidb_read_staleness session variable, then the statement will be makred as isStaleness + // in stmtCtx + IsStaleness bool // mu struct holds variables that change during execution. mu struct { sync.Mutex @@ -149,6 +153,9 @@ type StatementContext struct { normalized string digest *parser.Digest } + // BindSQL used to construct the key for plan cache. It records the binding used by the stmt. + // If the binding is not used by the stmt, the value is empty + BindSQL string // planNormalized use for cache the normalized plan, avoid duplicate builds. planNormalized string planDigest *parser.Digest @@ -168,12 +175,14 @@ type StatementContext struct { // stmtCache is used to store some statement-related values. stmtCache map[StmtCacheKey]interface{} - // resourceGroupTag cache for the current statement resource group tag. - resourceGroupTag atomic.Value + // Map to store all CTE storages of current SQL. // Will clean up at the end of the execution. CTEStorageMap interface{} + // If the statement read from table cache, this flag is set. + ReadFromTableCache bool + // cache is used to reduce object allocation. cache struct { execdetails.RuntimeStatsColl @@ -186,6 +195,18 @@ type StatementContext struct { OptimInfo map[int]string // InVerboseExplain indicates the statement is "explain format='verbose' ...". InVerboseExplain bool + + // EnableOptimizeTrace indicates whether enable optimizer trace by 'trace plan statement' + EnableOptimizeTrace bool + // LogicalOptimizeTrace indicates the trace for optimize + LogicalOptimizeTrace *tracing.LogicalOptimizeTracer + // EnableOptimizerCETrace indicate if cardinality estimation internal process needs to be traced. + // CE Trace is currently a submodule of the optimizer trace and is controlled by a separated option. + EnableOptimizerCETrace bool + OptimizerCETrace []*tracing.CETraceRecord + + // WaitLockLeaseTime is the duration of cached table read lease expiration time. + WaitLockLeaseTime time.Duration } // StmtHints are SessionVars related sql hints. @@ -269,19 +290,20 @@ func (sc *StatementContext) GetPlanDigest() (normalized string, planDigest *pars return sc.planNormalized, sc.planDigest } -// GetResourceGroupTag gets the resource group of the statement. -func (sc *StatementContext) GetResourceGroupTag() []byte { - tag, _ := sc.resourceGroupTag.Load().([]byte) - if len(tag) > 0 { - return tag - } - normalized, sqlDigest := sc.SQLDigest() - if len(normalized) == 0 { - return nil +// GetResourceGroupTagger returns the implementation of tikvrpc.ResourceGroupTagger related to self. +func (sc *StatementContext) GetResourceGroupTagger() tikvrpc.ResourceGroupTagger { + normalized, digest := sc.SQLDigest() + planDigest := sc.planDigest + return func(req *tikvrpc.Request) { + if req == nil { + return + } + if len(normalized) == 0 { + return + } + req.ResourceGroupTag = resourcegrouptag.EncodeResourceGroupTag(digest, planDigest, + resourcegrouptag.GetResourceGroupLabelByKey(resourcegrouptag.GetFirstKeyFromRequest(req))) } - tag = resourcegrouptag.EncodeResourceGroupTag(sqlDigest, sc.planDigest) - sc.resourceGroupTag.Store(tag) - return tag } // SetPlanDigest sets the normalized plan and plan digest. @@ -333,114 +355,107 @@ type TableEntry struct { // AddAffectedRows adds affected rows. func (sc *StatementContext) AddAffectedRows(rows uint64) { sc.mu.Lock() + defer sc.mu.Unlock() sc.mu.affectedRows += rows - sc.mu.Unlock() } // AffectedRows gets affected rows. func (sc *StatementContext) AffectedRows() uint64 { sc.mu.Lock() - rows := sc.mu.affectedRows - sc.mu.Unlock() - return rows + defer sc.mu.Unlock() + return sc.mu.affectedRows } // FoundRows gets found rows. func (sc *StatementContext) FoundRows() uint64 { sc.mu.Lock() - rows := sc.mu.foundRows - sc.mu.Unlock() - return rows + defer sc.mu.Unlock() + return sc.mu.foundRows } // AddFoundRows adds found rows. func (sc *StatementContext) AddFoundRows(rows uint64) { sc.mu.Lock() + defer sc.mu.Unlock() sc.mu.foundRows += rows - sc.mu.Unlock() } // RecordRows is used to generate info message func (sc *StatementContext) RecordRows() uint64 { sc.mu.Lock() - rows := sc.mu.records - sc.mu.Unlock() - return rows + defer sc.mu.Unlock() + return sc.mu.records } // AddRecordRows adds record rows. func (sc *StatementContext) AddRecordRows(rows uint64) { sc.mu.Lock() + defer sc.mu.Unlock() sc.mu.records += rows - sc.mu.Unlock() } // UpdatedRows is used to generate info message func (sc *StatementContext) UpdatedRows() uint64 { sc.mu.Lock() - rows := sc.mu.updated - sc.mu.Unlock() - return rows + defer sc.mu.Unlock() + return sc.mu.updated } // AddUpdatedRows adds updated rows. func (sc *StatementContext) AddUpdatedRows(rows uint64) { sc.mu.Lock() + defer sc.mu.Unlock() sc.mu.updated += rows - sc.mu.Unlock() } // CopiedRows is used to generate info message func (sc *StatementContext) CopiedRows() uint64 { sc.mu.Lock() - rows := sc.mu.copied - sc.mu.Unlock() - return rows + defer sc.mu.Unlock() + return sc.mu.copied } // AddCopiedRows adds copied rows. func (sc *StatementContext) AddCopiedRows(rows uint64) { sc.mu.Lock() + defer sc.mu.Unlock() sc.mu.copied += rows - sc.mu.Unlock() } // TouchedRows is used to generate info message func (sc *StatementContext) TouchedRows() uint64 { sc.mu.Lock() - rows := sc.mu.touched - sc.mu.Unlock() - return rows + defer sc.mu.Unlock() + return sc.mu.touched } // AddTouchedRows adds touched rows. func (sc *StatementContext) AddTouchedRows(rows uint64) { sc.mu.Lock() + defer sc.mu.Unlock() sc.mu.touched += rows - sc.mu.Unlock() } // GetMessage returns the extra message of the last executed command, if there is no message, it returns empty string func (sc *StatementContext) GetMessage() string { sc.mu.Lock() - msg := sc.mu.message - sc.mu.Unlock() - return msg + defer sc.mu.Unlock() + return sc.mu.message } // SetMessage sets the info message generated by some commands func (sc *StatementContext) SetMessage(msg string) { sc.mu.Lock() + defer sc.mu.Unlock() sc.mu.message = msg - sc.mu.Unlock() } // GetWarnings gets warnings. func (sc *StatementContext) GetWarnings() []SQLWarn { sc.mu.Lock() + defer sc.mu.Unlock() warns := make([]SQLWarn, len(sc.mu.warnings)) copy(warns, sc.mu.warnings) - sc.mu.Unlock() return warns } @@ -464,67 +479,66 @@ func (sc *StatementContext) WarningCount() uint16 { return 0 } sc.mu.Lock() - wc := uint16(len(sc.mu.warnings)) - sc.mu.Unlock() - return wc + defer sc.mu.Unlock() + return uint16(len(sc.mu.warnings)) } // NumErrorWarnings gets warning and error count. func (sc *StatementContext) NumErrorWarnings() (ec uint16, wc int) { sc.mu.Lock() + defer sc.mu.Unlock() ec = sc.mu.errorCount wc = len(sc.mu.warnings) - sc.mu.Unlock() return } // SetWarnings sets warnings. func (sc *StatementContext) SetWarnings(warns []SQLWarn) { sc.mu.Lock() + defer sc.mu.Unlock() sc.mu.warnings = warns for _, w := range warns { if w.Level == WarnLevelError { sc.mu.errorCount++ } } - sc.mu.Unlock() } // AppendWarning appends a warning with level 'Warning'. func (sc *StatementContext) AppendWarning(warn error) { sc.mu.Lock() + defer sc.mu.Unlock() if len(sc.mu.warnings) < math.MaxUint16 { sc.mu.warnings = append(sc.mu.warnings, SQLWarn{WarnLevelWarning, warn}) } - sc.mu.Unlock() } // AppendWarnings appends some warnings. func (sc *StatementContext) AppendWarnings(warns []SQLWarn) { sc.mu.Lock() + defer sc.mu.Unlock() if len(sc.mu.warnings) < math.MaxUint16 { sc.mu.warnings = append(sc.mu.warnings, warns...) } - sc.mu.Unlock() } // AppendNote appends a warning with level 'Note'. func (sc *StatementContext) AppendNote(warn error) { sc.mu.Lock() + defer sc.mu.Unlock() if len(sc.mu.warnings) < math.MaxUint16 { sc.mu.warnings = append(sc.mu.warnings, SQLWarn{WarnLevelNote, warn}) } - sc.mu.Unlock() } // AppendError appends a warning with level 'Error'. func (sc *StatementContext) AppendError(warn error) { sc.mu.Lock() + defer sc.mu.Unlock() if len(sc.mu.warnings) < math.MaxUint16 { sc.mu.warnings = append(sc.mu.warnings, SQLWarn{WarnLevelError, warn}) sc.mu.errorCount++ } - sc.mu.Unlock() } // HandleTruncate ignores or returns the error based on the StatementContext state. @@ -557,9 +571,10 @@ func (sc *StatementContext) HandleOverflow(err error, warnErr error) error { return err } -// ResetForRetry resets the changed states during execution. -func (sc *StatementContext) ResetForRetry() { +// resetMuForRetry resets the changed states of sc.mu during execution. +func (sc *StatementContext) resetMuForRetry() { sc.mu.Lock() + defer sc.mu.Unlock() sc.mu.affectedRows = 0 sc.mu.foundRows = 0 sc.mu.records = 0 @@ -571,7 +586,11 @@ func (sc *StatementContext) ResetForRetry() { sc.mu.warnings = nil sc.mu.execDetails = execdetails.ExecDetails{} sc.mu.allExecDetails = make([]*execdetails.ExecDetails, 0, 4) - sc.mu.Unlock() +} + +// ResetForRetry resets the changed states during execution. +func (sc *StatementContext) ResetForRetry() { + sc.resetMuForRetry() sc.MaxRowID = 0 sc.BaseRowID = 0 sc.TableIDs = sc.TableIDs[:0] @@ -622,21 +641,21 @@ func (sc *StatementContext) MergeTimeDetail(timeDetail util.TimeDetail) { // MergeLockKeysExecDetails merges lock keys execution details into self. func (sc *StatementContext) MergeLockKeysExecDetails(lockKeys *util.LockKeysDetails) { sc.mu.Lock() + defer sc.mu.Unlock() if sc.mu.execDetails.LockKeysDetail == nil { sc.mu.execDetails.LockKeysDetail = lockKeys } else { sc.mu.execDetails.LockKeysDetail.Merge(lockKeys) } - sc.mu.Unlock() } // GetExecDetails gets the execution details for the statement. func (sc *StatementContext) GetExecDetails() execdetails.ExecDetails { var details execdetails.ExecDetails sc.mu.Lock() + defer sc.mu.Unlock() details = sc.mu.execDetails details.LockKeysDuration = time.Duration(atomic.LoadInt64(&sc.LockKeysDuration)) - sc.mu.Unlock() return details } diff --git a/sessionctx/variable/noop.go b/sessionctx/variable/noop.go index ceff418f39740..79c7a63fe3abb 100644 --- a/sessionctx/variable/noop.go +++ b/sessionctx/variable/noop.go @@ -59,7 +59,6 @@ var noopSysVars = []*SysVar{ {Scope: ScopeGlobal | ScopeSession, Name: BigTables, Value: Off, Type: TypeBool}, {Scope: ScopeNone, Name: "skip_external_locking", Value: "1"}, {Scope: ScopeNone, Name: "innodb_sync_array_size", Value: "1"}, - {Scope: ScopeSession, Name: "rand_seed2", Value: ""}, {Scope: ScopeGlobal, Name: ValidatePasswordCheckUserName, Value: Off, Type: TypeBool}, {Scope: ScopeGlobal, Name: ValidatePasswordNumberCount, Value: "1", Type: TypeUnsigned, MinValue: 0, MaxValue: math.MaxUint64}, {Scope: ScopeSession, Name: "gtid_next", Value: ""}, @@ -196,6 +195,7 @@ var noopSysVars = []*SysVar{ {Scope: ScopeGlobal, Name: "innodb_max_dirty_pages_pct_lwm", Value: "0"}, {Scope: ScopeGlobal, Name: LogQueriesNotUsingIndexes, Value: Off, Type: TypeBool}, {Scope: ScopeGlobal | ScopeSession, Name: "max_heap_table_size", Value: "16777216", IsHintUpdatable: true}, + {Scope: ScopeGlobal | ScopeSession, Name: "tmp_table_size", Value: "16777216", Type: TypeUnsigned, MinValue: 1024, MaxValue: math.MaxUint64, IsHintUpdatable: true}, {Scope: ScopeGlobal | ScopeSession, Name: "div_precision_increment", Value: "4", IsHintUpdatable: true}, {Scope: ScopeGlobal, Name: "innodb_lru_scan_depth", Value: "1024"}, {Scope: ScopeGlobal, Name: "innodb_purge_rseg_truncate_frequency", Value: ""}, @@ -274,7 +274,6 @@ var noopSysVars = []*SysVar{ {Scope: ScopeNone, Name: "binlog_gtid_simple_recovery", Value: "1"}, {Scope: ScopeNone, Name: "performance_schema_digests_size", Value: "10000"}, {Scope: ScopeGlobal | ScopeSession, Name: Profiling, Value: Off, Type: TypeBool}, - {Scope: ScopeSession, Name: "rand_seed1", Value: ""}, {Scope: ScopeGlobal, Name: "sha256_password_proxy_users", Value: ""}, {Scope: ScopeGlobal | ScopeSession, Name: SQLQuoteShowCreate, Value: On, Type: TypeBool}, {Scope: ScopeGlobal | ScopeSession, Name: "binlogging_impossible_mode", Value: "IGNORE_ERROR"}, @@ -483,7 +482,7 @@ var noopSysVars = []*SysVar{ {Scope: ScopeNone, Name: "tmpdir", Value: "/var/tmp/"}, {Scope: ScopeGlobal, Name: "innodb_thread_concurrency", Value: "0"}, {Scope: ScopeGlobal, Name: "innodb_buffer_pool_dump_pct", Value: ""}, - {Scope: ScopeGlobal | ScopeSession, Name: "lc_time_names", Value: "en_US"}, + {Scope: ScopeGlobal | ScopeSession, Name: "lc_time_names", Value: "en_US", ReadOnly: true}, {Scope: ScopeGlobal | ScopeSession, Name: "max_statement_time", Value: ""}, {Scope: ScopeGlobal | ScopeSession, Name: EndMarkersInJSON, Value: Off, Type: TypeBool, IsHintUpdatable: true}, {Scope: ScopeGlobal, Name: AvoidTemporalUpgrade, Value: Off, Type: TypeBool}, diff --git a/sessionctx/variable/session.go b/sessionctx/variable/session.go index 3611954cb0d79..8169eaa5c2d66 100644 --- a/sessionctx/variable/session.go +++ b/sessionctx/variable/session.go @@ -29,6 +29,8 @@ import ( "sync/atomic" "time" + utilMath "github.com/pingcap/tidb/util/math" + "github.com/pingcap/errors" pumpcli "github.com/pingcap/tidb-tools/tidb-binlog/pump_client" "github.com/pingcap/tidb/config" @@ -38,13 +40,13 @@ import ( "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/auth" + "github.com/pingcap/tidb/parser/charset" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" - "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/execdetails" "github.com/pingcap/tidb/util/rowcodec" "github.com/pingcap/tidb/util/stringutil" @@ -178,6 +180,9 @@ type TransactionContext struct { // TemporaryTables is used to store transaction-specific information for global temporary tables. // It can also be stored in sessionCtx with local temporary tables, but it's easier to clean this data after transaction ends. TemporaryTables map[int64]tableutil.TempTable + + // CachedTables is not nil if the transaction write on cached table. + CachedTables map[int64]interface{} } // GetShard returns the shard prefix for the next `count` rowids. @@ -713,6 +718,9 @@ type SessionVars struct { // EnableAlterPlacement indicates whether a user can alter table partition placement rules. EnableAlterPlacement bool + // EnablePlacementChecks indicates whether a user can check validation of placement. + EnablePlacementChecks bool + // WaitSplitRegionFinish defines the split region behaviour is sync or async. WaitSplitRegionFinish bool @@ -922,15 +930,18 @@ type SessionVars struct { // see https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_cte_max_recursion_depth CTEMaxRecursionDepth int - // The temporary table size threshold - // In MySQL, when a temporary table exceed this size, it spills to disk. - // In TiDB, as we do not support spill to disk for now, an error is reported. - // See https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_tmp_table_size + // The temporary table size threshold, which is different from MySQL. See https://github.com/pingcap/tidb/issues/28691. TMPTableSize int64 // EnableStableResultMode if stabilize query results. EnableStableResultMode bool + // EnablePseudoForOutdatedStats if using pseudo for outdated stats + EnablePseudoForOutdatedStats bool + + // RegardNULLAsPoint if regard NULL as Point + RegardNULLAsPoint bool + // LocalTemporaryTables is *infoschema.LocalTemporaryTables, use interface to avoid circle dependency. // It's nil if there is no local temporary table. LocalTemporaryTables interface{} @@ -953,10 +964,11 @@ type SessionVars struct { data [2]stmtctx.StatementContext } - // EnableMPPBalanceWithContinuousRegion indicates whether MPP balance logic will take account of region's continuity in TiFlash. - EnableMPPBalanceWithContinuousRegion bool - // EnableMPPBalanceWithContinuousRegionCount indicates the continuous region count that balance logic assigns to a TiFlash instance each time. - EnableMPPBalanceWithContinuousRegionCount int64 + // Rng stores the rand_seed1 and rand_seed2 for Rand() function + Rng *utilMath.MysqlRng + + // EnablePaging indicates whether enable paging in coprocessor requests. + EnablePaging bool } // InitStatementContext initializes a StatementContext, the object is reused to reduce allocation. @@ -1012,7 +1024,7 @@ func (s *SessionVars) CheckAndGetTxnScope() string { // UseDynamicPartitionPrune indicates whether use new dynamic partition prune. func (s *SessionVars) UseDynamicPartitionPrune() bool { - if s.InTxn() { + if s.InTxn() || !s.GetStatusFlag(mysql.ServerStatusAutocommit) { // UnionScan cannot get partition table IDs in dynamic-mode, this is a quick-fix for issues/26719, // please see it for more details. return false @@ -1186,9 +1198,11 @@ func NewSessionVars() *SessionVars { EnableIndexMergeJoin: DefTiDBEnableIndexMergeJoin, AllowFallbackToTiKV: make(map[kv.StoreType]struct{}), CTEMaxRecursionDepth: DefCTEMaxRecursionDepth, - TMPTableSize: DefTMPTableSize, + TMPTableSize: DefTiDBTmpTableMaxSize, MPPStoreLastFailTime: make(map[string]time.Time), MPPStoreFailTTL: DefTiDBMPPStoreFailTTL, + EnablePlacementChecks: DefEnablePlacementCheck, + Rng: utilMath.NewWithTime(), } vars.KVVars = tikvstore.NewVariables(&vars.Killed) vars.Concurrency = Concurrency{ @@ -1260,6 +1274,7 @@ func NewSessionVars() *SessionVars { if !EnableLocalTxn.Load() { vars.TxnScope = kv.NewGlobalTxnScopeVar() } + vars.systems[CharacterSetConnection], vars.systems[CollationConnection] = charset.GetDefaultCharsetAndCollate() return vars } @@ -1309,6 +1324,16 @@ func (s *SessionVars) SetEnableIndexMerge(val bool) { s.enableIndexMerge = val } +// GetEnablePseudoForOutdatedStats get EnablePseudoForOutdatedStats from SessionVars.EnablePseudoForOutdatedStats. +func (s *SessionVars) GetEnablePseudoForOutdatedStats() bool { + return s.EnablePseudoForOutdatedStats +} + +// SetEnablePseudoForOutdatedStats set SessionVars.EnablePseudoForOutdatedStats. +func (s *SessionVars) SetEnablePseudoForOutdatedStats(val bool) { + s.EnablePseudoForOutdatedStats = val +} + // GetReplicaRead get ReplicaRead from sql hints and SessionVars.replicaRead. func (s *SessionVars) GetReplicaRead() kv.ReplicaReadType { if s.StmtCtx.HasReplicaReadHint { @@ -1363,22 +1388,27 @@ func (s *SessionVars) GetCharsetInfo() (charset, collation string) { return } -// GetParseParams gets the parse parameters from session variables, for now, only charset and collation are retrieved. +// GetParseParams gets the parse parameters from session variables. func (s *SessionVars) GetParseParams() []parser.ParseParam { chs, coll := s.GetCharsetInfo() + cli, err := GetSessionOrGlobalSystemVar(s, CharacterSetClient) + if err != nil { + cli = "" + } return []parser.ParseParam{ parser.CharsetConnection(chs), parser.CollationConnection(coll), + parser.CharsetClient(cli), } } // SetUserVar set the value and collation for user defined variable. func (s *SessionVars) SetUserVar(varName string, svalue string, collation string) { if len(collation) > 0 { - s.Users[varName] = types.NewCollationStringDatum(stringutil.Copy(svalue), collation, collate.DefaultLen) + s.Users[varName] = types.NewCollationStringDatum(stringutil.Copy(svalue), collation) } else { _, collation = s.GetCharsetInfo() - s.Users[varName] = types.NewCollationStringDatum(stringutil.Copy(svalue), collation, collate.DefaultLen) + s.Users[varName] = types.NewCollationStringDatum(stringutil.Copy(svalue), collation) } } @@ -1988,6 +2018,10 @@ const ( SlowLogBackoffDetail = "Backoff_Detail" // SlowLogResultRows is the row count of the SQL result. SlowLogResultRows = "Result_rows" + // SlowLogIsExplicitTxn is used to indicate whether this sql execute in explicit transaction or not. + SlowLogIsExplicitTxn = "IsExplicitTxn" + // SlowLogIsWriteCacheTable is used to indicate whether writing to the cache table need to wait for the read lock to expire. + SlowLogIsWriteCacheTable = "IsWriteCacheTable" ) // SlowQueryLogItems is a collection of items that should be included in the @@ -2023,6 +2057,8 @@ type SlowQueryLogItems struct { ExecRetryCount uint ExecRetryTime time.Duration ResultRows int64 + IsExplicitTxn bool + IsWriteCacheTable bool } // SlowLogFormat uses for formatting slow log. @@ -2187,6 +2223,10 @@ func (s *SessionVars) SlowLogFormat(logItems *SlowQueryLogItems) string { writeSlowLogItem(&buf, SlowLogWriteSQLRespTotal, strconv.FormatFloat(logItems.WriteSQLRespTotal.Seconds(), 'f', -1, 64)) writeSlowLogItem(&buf, SlowLogResultRows, strconv.FormatInt(logItems.ResultRows, 10)) writeSlowLogItem(&buf, SlowLogSucc, strconv.FormatBool(logItems.Succ)) + writeSlowLogItem(&buf, SlowLogIsExplicitTxn, strconv.FormatBool(logItems.IsExplicitTxn)) + if s.StmtCtx.WaitLockLeaseTime > 0 { + writeSlowLogItem(&buf, SlowLogIsWriteCacheTable, strconv.FormatBool(logItems.IsWriteCacheTable)) + } if len(logItems.Plan) != 0 { writeSlowLogItem(&buf, SlowLogPlan, logItems.Plan) } diff --git a/sessionctx/variable/session_test.go b/sessionctx/variable/session_test.go index efbaa8906b214..abcf79ca49158 100644 --- a/sessionctx/variable/session_test.go +++ b/sessionctx/variable/session_test.go @@ -61,7 +61,6 @@ func TestSetSystemVariable(t *testing.T) { // copy iterator variable into a new variable, see issue #27779 tc := tc t.Run(tc.key, func(t *testing.T) { - t.Parallel() mtx.Lock() err := variable.SetSessionSystemVar(v, tc.key, tc.value) mtx.Unlock() @@ -155,6 +154,7 @@ func TestSlowLogFormat(t *testing.T) { seVar.ConnectionID = 1 seVar.CurrentDB = "test" seVar.InRestrictedSQL = true + seVar.StmtCtx.WaitLockLeaseTime = 1 txnTS := uint64(406649736972468225) costTime := time.Second execDetail := execdetails.ExecDetails{ @@ -234,7 +234,9 @@ func TestSlowLogFormat(t *testing.T) { # Backoff_total: 12 # Write_sql_response_total: 1 # Result_rows: 12345 -# Succ: true` +# Succ: true +# IsExplicitTxn: true +# IsWriteCacheTable: true` sql := "select * from t;" _, digest := parser.NormalizeDigest(sql) logItems := &variable.SlowQueryLogItems{ @@ -267,8 +269,10 @@ func TestSlowLogFormat(t *testing.T) { DurationPreprocessSubQuery: 2, PreprocessSubQueries: 2, }, - ExecRetryCount: 3, - ExecRetryTime: 5*time.Second + time.Millisecond*100, + ExecRetryCount: 3, + ExecRetryTime: 5*time.Second + time.Millisecond*100, + IsExplicitTxn: true, + IsWriteCacheTable: true, } logString := seVar.SlowLogFormat(logItems) require.Equal(t, resultFields+"\n"+sql, logString) diff --git a/sessionctx/variable/sysvar.go b/sessionctx/variable/sysvar.go index 2f45e6dfcc852..fc7ce09cae6a7 100644 --- a/sessionctx/variable/sysvar.go +++ b/sessionctx/variable/sysvar.go @@ -21,7 +21,6 @@ import ( "runtime" "strconv" "strings" - "sync" "sync/atomic" "time" @@ -31,6 +30,7 @@ import ( "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/charset" "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/logutil" @@ -40,541 +40,6 @@ import ( atomic2 "go.uber.org/atomic" ) -// ScopeFlag is for system variable whether can be changed in global/session dynamically or not. -type ScopeFlag uint8 - -// TypeFlag is the SysVar type, which doesn't exactly match MySQL types. -type TypeFlag byte - -const ( - // ScopeNone means the system variable can not be changed dynamically. - ScopeNone ScopeFlag = 0 - // ScopeGlobal means the system variable can be changed globally. - ScopeGlobal ScopeFlag = 1 << 0 - // ScopeSession means the system variable can only be changed in current session. - ScopeSession ScopeFlag = 1 << 1 - - // TypeStr is the default - TypeStr TypeFlag = 0 - // TypeBool for boolean - TypeBool TypeFlag = 1 - // TypeInt for integer - TypeInt TypeFlag = 2 - // TypeEnum for Enum - TypeEnum TypeFlag = 3 - // TypeFloat for Double - TypeFloat TypeFlag = 4 - // TypeUnsigned for Unsigned integer - TypeUnsigned TypeFlag = 5 - // TypeTime for time of day (a TiDB extension) - TypeTime TypeFlag = 6 - // TypeDuration for a golang duration (a TiDB extension) - TypeDuration TypeFlag = 7 - - // On is the canonical string for ON - On = "ON" - // Off is the canonical string for OFF - Off = "OFF" - // Warn means return warnings - Warn = "WARN" - // IntOnly means enable for int type - IntOnly = "INT_ONLY" -) - -// SysVar is for system variable. -// All the fields of SysVar should be READ ONLY after created. -type SysVar struct { - // Scope is for whether can be changed or not - Scope ScopeFlag - // Name is the variable name. - Name string - // Value is the variable value. - Value string - // Type is the MySQL type (optional) - Type TypeFlag - // MinValue will automatically be validated when specified (optional) - MinValue int64 - // MaxValue will automatically be validated when specified (optional) - MaxValue uint64 - // AutoConvertNegativeBool applies to boolean types (optional) - AutoConvertNegativeBool bool - // ReadOnly applies to all types - ReadOnly bool - // PossibleValues applies to ENUM type - PossibleValues []string - // AllowEmpty is a special TiDB behavior which means "read value from config" (do not use) - AllowEmpty bool - // AllowEmptyAll is a special behavior that only applies to TiDBCapturePlanBaseline, TiDBTxnMode (do not use) - AllowEmptyAll bool - // AllowAutoValue means that the special value "-1" is permitted, even when outside of range. - AllowAutoValue bool - // Validation is a callback after the type validation has been performed, but before the Set function - Validation func(*SessionVars, string, string, ScopeFlag) (string, error) - // SetSession is called after validation but before updating systems[]. It also doubles as an Init function - // and will be called on all variables in builtinGlobalVariable, regardless of their scope. - SetSession func(*SessionVars, string) error - // SetGlobal is called after validation - SetGlobal func(*SessionVars, string) error - // IsHintUpdatable indicate whether it's updatable via SET_VAR() hint (optional) - IsHintUpdatable bool - // Hidden means that it still responds to SET but doesn't show up in SHOW VARIABLES - Hidden bool - // Aliases is a list of sysvars that should also be updated when this sysvar is updated. - // Updating aliases calls the SET function of the aliases, but does not update their aliases (preventing SET recursion) - Aliases []string - // GetSession is a getter function for session scope. - // It can be used by instance-scoped variables to overwrite the previously expected value. - GetSession func(*SessionVars) (string, error) - // GetGlobal is a getter function for global scope. - GetGlobal func(*SessionVars) (string, error) - // skipInit defines if the sysvar should be loaded into the session on init. - // This is only important to set for sysvars that include session scope, - // since global scoped sysvars are not-applicable. - skipInit bool - // IsNoop defines if the sysvar is a noop included for MySQL compatibility - IsNoop bool -} - -// GetGlobalFromHook calls the GetSession func if it exists. -func (sv *SysVar) GetGlobalFromHook(s *SessionVars) (string, error) { - // Call the Getter if there is one defined. - if sv.GetGlobal != nil { - val, err := sv.GetGlobal(s) - if err != nil { - return val, err - } - // Ensure that the results from the getter are validated - // Since some are read directly from tables. - return sv.ValidateWithRelaxedValidation(s, val, ScopeGlobal), nil - } - if sv.HasNoneScope() { - return sv.Value, nil - } - return s.GlobalVarsAccessor.GetGlobalSysVar(sv.Name) -} - -// GetSessionFromHook calls the GetSession func if it exists. -func (sv *SysVar) GetSessionFromHook(s *SessionVars) (string, error) { - if sv.HasNoneScope() { - return sv.Value, nil - } - // Call the Getter if there is one defined. - if sv.GetSession != nil { - val, err := sv.GetSession(s) - if err != nil { - return val, err - } - // Ensure that the results from the getter are validated - // Since some are read directly from tables. - return sv.ValidateWithRelaxedValidation(s, val, ScopeSession), nil - } - var ( - ok bool - val string - ) - if val, ok = s.stmtVars[sv.Name]; ok { - return val, nil - } - if val, ok = s.systems[sv.Name]; !ok { - return val, errors.New("sysvar has not yet loaded") - } - return val, nil -} - -// SetSessionFromHook calls the SetSession func if it exists. -func (sv *SysVar) SetSessionFromHook(s *SessionVars, val string) error { - if sv.SetSession != nil { - if err := sv.SetSession(s, val); err != nil { - return err - } - } - s.systems[sv.Name] = val - - // Call the Set function on all the aliases for this sysVar - // Skipping the validation function, and not calling aliases of - // aliases. By skipping the validation function it means that things - // like duplicate warnings should not appear. - - if sv.Aliases != nil { - for _, aliasName := range sv.Aliases { - aliasSv := GetSysVar(aliasName) - if aliasSv.SetSession != nil { - if err := aliasSv.SetSession(s, val); err != nil { - return err - } - } - s.systems[aliasSv.Name] = val - } - } - return nil -} - -// SetGlobalFromHook calls the SetGlobal func if it exists. -func (sv *SysVar) SetGlobalFromHook(s *SessionVars, val string, skipAliases bool) error { - if sv.SetGlobal != nil { - return sv.SetGlobal(s, val) - } - - // Call the SetGlobalSysVarOnly function on all the aliases for this sysVar - // which skips the validation function and when SetGlobalFromHook is called again - // it will be with skipAliases=true. This helps break recursion because - // most aliases are reciprocal. - - if !skipAliases && sv.Aliases != nil { - for _, aliasName := range sv.Aliases { - if err := s.GlobalVarsAccessor.SetGlobalSysVarOnly(aliasName, val); err != nil { - return err - } - } - } - return nil -} - -// HasNoneScope returns true if the scope for the sysVar is None. -func (sv *SysVar) HasNoneScope() bool { - return sv.Scope == ScopeNone -} - -// HasSessionScope returns true if the scope for the sysVar includes session. -func (sv *SysVar) HasSessionScope() bool { - return sv.Scope&ScopeSession != 0 -} - -// HasGlobalScope returns true if the scope for the sysVar includes global. -func (sv *SysVar) HasGlobalScope() bool { - return sv.Scope&ScopeGlobal != 0 -} - -// Validate checks if system variable satisfies specific restriction. -func (sv *SysVar) Validate(vars *SessionVars, value string, scope ScopeFlag) (string, error) { - // Check that the scope is correct first. - if err := sv.validateScope(scope); err != nil { - return value, err - } - // Normalize the value and apply validation based on type. - // i.e. TypeBool converts 1/on/ON to ON. - normalizedValue, err := sv.validateFromType(vars, value, scope) - if err != nil { - return normalizedValue, err - } - // If type validation was successful, call the (optional) validation function - if sv.Validation != nil { - return sv.Validation(vars, normalizedValue, value, scope) - } - return normalizedValue, nil -} - -// validateFromType provides automatic validation based on the SysVar's type -func (sv *SysVar) validateFromType(vars *SessionVars, value string, scope ScopeFlag) (string, error) { - // The string "DEFAULT" is a special keyword in MySQL, which restores - // the compiled sysvar value. In which case we can skip further validation. - if strings.EqualFold(value, "DEFAULT") { - return sv.Value, nil - } - // Some sysvars in TiDB have a special behavior where the empty string means - // "use the config file value". This needs to be cleaned up once the behavior - // for instance variables is determined. - if value == "" && ((sv.AllowEmpty && scope == ScopeSession) || sv.AllowEmptyAll) { - return value, nil - } - // Provide validation using the SysVar struct - switch sv.Type { - case TypeUnsigned: - return sv.checkUInt64SystemVar(value, vars) - case TypeInt: - return sv.checkInt64SystemVar(value, vars) - case TypeBool: - return sv.checkBoolSystemVar(value, vars) - case TypeFloat: - return sv.checkFloatSystemVar(value, vars) - case TypeEnum: - return sv.checkEnumSystemVar(value, vars) - case TypeTime: - return sv.checkTimeSystemVar(value, vars) - case TypeDuration: - return sv.checkDurationSystemVar(value, vars) - } - return value, nil // typeString -} - -func (sv *SysVar) validateScope(scope ScopeFlag) error { - if sv.ReadOnly || sv.Scope == ScopeNone { - return ErrIncorrectScope.FastGenByArgs(sv.Name, "read only") - } - if scope == ScopeGlobal && !sv.HasGlobalScope() { - return errLocalVariable.FastGenByArgs(sv.Name) - } - if scope == ScopeSession && !sv.HasSessionScope() { - return errGlobalVariable.FastGenByArgs(sv.Name) - } - return nil -} - -// ValidateWithRelaxedValidation normalizes values but can not return errors. -// Normalization+validation needs to be applied when reading values because older versions of TiDB -// may be less sophisticated in normalizing values. But errors should be caught and handled, -// because otherwise there will be upgrade issues. -func (sv *SysVar) ValidateWithRelaxedValidation(vars *SessionVars, value string, scope ScopeFlag) string { - normalizedValue, err := sv.validateFromType(vars, value, scope) - if err != nil { - return normalizedValue - } - if sv.Validation != nil { - normalizedValue, err = sv.Validation(vars, normalizedValue, value, scope) - if err != nil { - return normalizedValue - } - } - return normalizedValue -} - -const ( - localDayTimeFormat = "15:04" - // FullDayTimeFormat is the full format of analyze start time and end time. - FullDayTimeFormat = "15:04 -0700" -) - -func (sv *SysVar) checkTimeSystemVar(value string, vars *SessionVars) (string, error) { - var t time.Time - var err error - if len(value) <= len(localDayTimeFormat) { - t, err = time.ParseInLocation(localDayTimeFormat, value, vars.Location()) - } else { - t, err = time.ParseInLocation(FullDayTimeFormat, value, vars.Location()) - } - if err != nil { - return "", err - } - return t.Format(FullDayTimeFormat), nil -} - -func (sv *SysVar) checkDurationSystemVar(value string, vars *SessionVars) (string, error) { - d, err := time.ParseDuration(value) - if err != nil { - return value, ErrWrongTypeForVar.GenWithStackByArgs(sv.Name) - } - // Check for min/max violations - if int64(d) < sv.MinValue { - vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(sv.Name, value)) - return time.Duration(sv.MinValue).String(), nil - } - if uint64(d) > sv.MaxValue { - vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(sv.Name, value)) - return time.Duration(sv.MaxValue).String(), nil - } - // return a string representation of the duration - return d.String(), nil -} - -func (sv *SysVar) checkUInt64SystemVar(value string, vars *SessionVars) (string, error) { - if sv.AllowAutoValue && value == "-1" { - return value, nil - } - if len(value) == 0 { - return value, ErrWrongTypeForVar.GenWithStackByArgs(sv.Name) - } - if value[0] == '-' { - _, err := strconv.ParseInt(value, 10, 64) - if err != nil { - return value, ErrWrongTypeForVar.GenWithStackByArgs(sv.Name) - } - vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(sv.Name, value)) - return fmt.Sprintf("%d", sv.MinValue), nil - } - val, err := strconv.ParseUint(value, 10, 64) - if err != nil { - return value, ErrWrongTypeForVar.GenWithStackByArgs(sv.Name) - } - if val < uint64(sv.MinValue) { - vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(sv.Name, value)) - return fmt.Sprintf("%d", sv.MinValue), nil - } - if val > sv.MaxValue { - vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(sv.Name, value)) - return fmt.Sprintf("%d", sv.MaxValue), nil - } - return value, nil -} - -func (sv *SysVar) checkInt64SystemVar(value string, vars *SessionVars) (string, error) { - if sv.AllowAutoValue && value == "-1" { - return value, nil - } - val, err := strconv.ParseInt(value, 10, 64) - if err != nil { - return value, ErrWrongTypeForVar.GenWithStackByArgs(sv.Name) - } - if val < sv.MinValue { - vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(sv.Name, value)) - return fmt.Sprintf("%d", sv.MinValue), nil - } - if val > int64(sv.MaxValue) { - vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(sv.Name, value)) - return fmt.Sprintf("%d", sv.MaxValue), nil - } - return value, nil -} - -func (sv *SysVar) checkEnumSystemVar(value string, vars *SessionVars) (string, error) { - // The value could be either a string or the ordinal position in the PossibleValues. - // This allows for the behavior 0 = OFF, 1 = ON, 2 = DEMAND etc. - var iStr string - for i, v := range sv.PossibleValues { - iStr = fmt.Sprintf("%d", i) - if strings.EqualFold(value, v) || strings.EqualFold(value, iStr) { - return v, nil - } - } - return value, ErrWrongValueForVar.GenWithStackByArgs(sv.Name, value) -} - -func (sv *SysVar) checkFloatSystemVar(value string, vars *SessionVars) (string, error) { - if len(value) == 0 { - return value, ErrWrongTypeForVar.GenWithStackByArgs(sv.Name) - } - val, err := strconv.ParseFloat(value, 64) - if err != nil { - return value, ErrWrongTypeForVar.GenWithStackByArgs(sv.Name) - } - if val < float64(sv.MinValue) { - vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(sv.Name, value)) - return fmt.Sprintf("%d", sv.MinValue), nil - } - if val > float64(sv.MaxValue) { - vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(sv.Name, value)) - return fmt.Sprintf("%d", sv.MaxValue), nil - } - return value, nil -} - -func (sv *SysVar) checkBoolSystemVar(value string, vars *SessionVars) (string, error) { - if strings.EqualFold(value, "ON") { - return On, nil - } else if strings.EqualFold(value, "OFF") { - return Off, nil - } - val, err := strconv.ParseInt(value, 10, 64) - if err == nil { - // There are two types of conversion rules for integer values. - // The default only allows 0 || 1, but a subset of values convert any - // negative integer to 1. - if !sv.AutoConvertNegativeBool { - if val == 0 { - return Off, nil - } else if val == 1 { - return On, nil - } - } else { - if val == 1 || val < 0 { - return On, nil - } else if val == 0 { - return Off, nil - } - } - } - return value, ErrWrongValueForVar.GenWithStackByArgs(sv.Name, value) -} - -// GetNativeValType attempts to convert the val to the approx MySQL non-string type -func (sv *SysVar) GetNativeValType(val string) (types.Datum, byte, uint) { - switch sv.Type { - case TypeUnsigned: - u, err := strconv.ParseUint(val, 10, 64) - if err != nil { - u = 0 - } - return types.NewUintDatum(u), mysql.TypeLonglong, mysql.UnsignedFlag - case TypeBool: - optVal := int64(0) // OFF - if TiDBOptOn(val) { - optVal = 1 - } - return types.NewIntDatum(optVal), mysql.TypeLong, 0 - } - return types.NewStringDatum(val), mysql.TypeVarString, 0 -} - -// SkipInit returns true if when a new session is created we should "skip" copying -// an initial value to it (and call the SetSession func if it exists) -func (sv *SysVar) SkipInit() bool { - if sv.skipInit || sv.IsNoop { - return true - } - // These a special "Global-only" sysvars that for backward compatibility - // are currently cached in the session. Please don't add to this list. - switch sv.Name { - case TiDBEnableChangeMultiSchema, TiDBDDLReorgBatchSize, TiDBEnableAlterPlacement, - TiDBMaxDeltaSchemaCount, InitConnect, MaxPreparedStmtCount, - TiDBDDLReorgWorkerCount, TiDBDDLErrorCountLimit, TiDBRowFormatVersion, - TiDBEnableTelemetry, TiDBEnablePointGetCache: - return false - } - return !sv.HasSessionScope() -} - -var sysVars map[string]*SysVar -var sysVarsLock sync.RWMutex - -// RegisterSysVar adds a sysvar to the SysVars list -func RegisterSysVar(sv *SysVar) { - name := strings.ToLower(sv.Name) - sysVarsLock.Lock() - sysVars[name] = sv - sysVarsLock.Unlock() -} - -// UnregisterSysVar removes a sysvar from the SysVars list -// currently only used in tests. -func UnregisterSysVar(name string) { - name = strings.ToLower(name) - sysVarsLock.Lock() - delete(sysVars, name) - sysVarsLock.Unlock() -} - -// GetSysVar returns sys var info for name as key. -func GetSysVar(name string) *SysVar { - name = strings.ToLower(name) - sysVarsLock.RLock() - defer sysVarsLock.RUnlock() - - return sysVars[name] -} - -// SetSysVar sets a sysvar. In fact, SysVar is immutable. -// SetSysVar is implemented by register a new SysVar with the same name again. -// This will not propagate to the cluster, so it should only be -// used for instance scoped AUTO variables such as system_time_zone. -func SetSysVar(name string, value string) { - old := GetSysVar(name) - tmp := *old - tmp.Value = value - RegisterSysVar(&tmp) -} - -// GetSysVars deep copies the sysVars list under a RWLock -func GetSysVars() map[string]*SysVar { - sysVarsLock.RLock() - defer sysVarsLock.RUnlock() - copy := make(map[string]*SysVar, len(sysVars)) - for name, sv := range sysVars { - tmp := *sv - copy[name] = &tmp - } - return copy -} - -func init() { - sysVars = make(map[string]*SysVar) - for _, v := range defaultSysVars { - RegisterSysVar(v) - } - for _, v := range noopSysVars { - v.IsNoop = true - RegisterSysVar(v) - } -} - var defaultSysVars = []*SysVar{ {Scope: ScopeGlobal | ScopeSession, Name: SQLSelectLimit, Value: "18446744073709551615", Type: TypeUnsigned, MinValue: 0, MaxValue: math.MaxUint64, SetSession: func(s *SessionVars, val string) error { result, err := strconv.ParseUint(val, 10, 64) @@ -644,8 +109,24 @@ var defaultSysVars = []*SysVar{ } return normalizedValue, ErrWrongValueForVar.GenWithStackByArgs(ForeignKeyChecks, originalValue) }}, + {Scope: ScopeGlobal | ScopeSession, Name: PlacementChecks, Value: On, Type: TypeBool, SetSession: func(s *SessionVars, val string) error { + s.EnablePlacementChecks = TiDBOptOn(val) + return nil + }}, {Scope: ScopeNone, Name: Hostname, Value: DefHostname}, - {Scope: ScopeSession, Name: Timestamp, Value: "", skipInit: true}, + {Scope: ScopeSession, Name: Timestamp, Value: DefTimestamp, skipInit: true, MinValue: 0, MaxValue: 2147483647, Type: TypeFloat, GetSession: func(s *SessionVars) (string, error) { + if timestamp, ok := s.systems[Timestamp]; ok && timestamp != DefTimestamp { + return timestamp, nil + } + timestamp := s.StmtCtx.GetOrStoreStmtCache(stmtctx.StmtNowTsCacheKey, time.Now()).(time.Time) + return types.ToString(float64(timestamp.UnixNano()) / float64(time.Second)) + }, GetGlobal: func(s *SessionVars) (string, error) { + // The Timestamp sysvar will have GetGlobal func even though it does not have global scope. + // It's GetGlobal func will only be called when "set timestamp = default". + // Setting timestamp to DEFAULT causes its value to be the current date and time as of the time it is accessed. + // See https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_timestamp + return DefTimestamp, nil + }}, {Scope: ScopeGlobal | ScopeSession, Name: CollationDatabase, Value: mysql.DefaultCollationName, skipInit: true, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { return checkCollation(vars, normalizedValue, originalValue, scope) }, SetSession: func(s *SessionVars, val string) error { @@ -779,6 +260,20 @@ var defaultSysVars = []*SysVar{ {Scope: ScopeGlobal, Name: InitConnect, Value: ""}, /* TiDB specific variables */ + {Scope: ScopeGlobal, Name: TiDBTSOClientBatchMaxWaitTime, Value: strconv.FormatFloat(DefTiDBTSOClientBatchMaxWaitTime, 'f', -1, 64), Type: TypeFloat, MinValue: 0, MaxValue: 10, + GetGlobal: func(sv *SessionVars) (string, error) { + return strconv.FormatFloat(MaxTSOBatchWaitInterval.Load(), 'f', -1, 64), nil + }, + SetGlobal: func(s *SessionVars, val string) error { + MaxTSOBatchWaitInterval.Store(tidbOptFloat64(val, DefTiDBTSOClientBatchMaxWaitTime)) + return nil + }}, + {Scope: ScopeGlobal, Name: TiDBEnableTSOFollowerProxy, Value: BoolToOnOff(DefTiDBEnableTSOFollowerProxy), Type: TypeBool, GetGlobal: func(sv *SessionVars) (string, error) { + return BoolToOnOff(EnableTSOFollowerProxy.Load()), nil + }, SetGlobal: func(s *SessionVars, val string) error { + EnableTSOFollowerProxy.Store(TiDBOptOn(val)) + return nil + }}, {Scope: ScopeGlobal, Name: TiDBEnableLocalTxn, Value: BoolToOnOff(DefTiDBEnableLocalTxn), Hidden: true, Type: TypeBool, GetGlobal: func(sv *SessionVars) (string, error) { return BoolToOnOff(EnableLocalTxn.Load()), nil }, SetGlobal: func(s *SessionVars, val string) error { @@ -1283,6 +778,26 @@ var defaultSysVars = []*SysVar{ }, GetSession: func(s *SessionVars) (string, error) { return BoolToOnOff(ProcessGeneralLog.Load()), nil }}, + {Scope: ScopeSession, Name: TiDBLogFileMaxDays, Value: strconv.Itoa(config.GetGlobalConfig().Log.File.MaxDays), Type: TypeInt, MinValue: 0, MaxValue: math.MaxInt32, skipInit: true, SetSession: func(s *SessionVars, val string) error { + maxAge, err := strconv.ParseInt(val, 10, 32) + if err != nil { + return err + } + + GlobalLogMaxDays.Store(int32(maxAge)) + + cfg := config.GetGlobalConfig().Log.ToLogConfig() + cfg.Config.File.MaxDays = int(maxAge) + + err = logutil.ReplaceLogger(cfg) + if err != nil { + return err + } + + return nil + }, GetSession: func(s *SessionVars) (string, error) { + return strconv.FormatInt(int64(GlobalLogMaxDays.Load()), 10), nil + }}, {Scope: ScopeSession, Name: TiDBPProfSQLCPU, Value: strconv.Itoa(DefTiDBPProfSQLCPU), Type: TypeInt, skipInit: true, MinValue: 0, MaxValue: 1, SetSession: func(s *SessionVars, val string) error { EnablePProfSQLCPU.Store(uint32(tidbOptPositiveInt32(val, DefTiDBPProfSQLCPU)) > 0) return nil @@ -1521,10 +1036,7 @@ var defaultSysVars = []*SysVar{ } return nil }}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBStoreLimit, Value: strconv.FormatInt(atomic.LoadInt64(&config.GetGlobalConfig().TiKVClient.StoreLimit), 10), Type: TypeInt, MinValue: 0, MaxValue: math.MaxInt64, SetSession: func(s *SessionVars, val string) error { - tikvstore.StoreLimit.Store(tidbOptInt64(val, DefTiDBStoreLimit)) - return nil - }, GetSession: func(s *SessionVars) (string, error) { + {Scope: ScopeGlobal, Name: TiDBStoreLimit, Value: strconv.FormatInt(atomic.LoadInt64(&config.GetGlobalConfig().TiKVClient.StoreLimit), 10), Type: TypeInt, MinValue: 0, MaxValue: math.MaxInt64, GetGlobal: func(s *SessionVars) (string, error) { return strconv.FormatInt(tikvstore.StoreLimit.Load(), 10), nil }, SetGlobal: func(s *SessionVars, val string) error { tikvstore.StoreLimit.Store(tidbOptInt64(val, DefTiDBStoreLimit)) @@ -1552,10 +1064,10 @@ var defaultSysVars = []*SysVar{ return BoolToOnOff(enabled), nil }}, {Scope: ScopeSession, Name: TiDBEnableSlowLog, Value: BoolToOnOff(logutil.DefaultTiDBEnableSlowLog), Type: TypeBool, skipInit: true, SetSession: func(s *SessionVars, val string) error { - config.GetGlobalConfig().Log.EnableSlowLog = TiDBOptOn(val) + config.GetGlobalConfig().Log.EnableSlowLog.Store(TiDBOptOn(val)) return nil }, GetSession: func(s *SessionVars) (string, error) { - return BoolToOnOff(config.GetGlobalConfig().Log.EnableSlowLog), nil + return BoolToOnOff(config.GetGlobalConfig().Log.EnableSlowLog.Load()), nil }}, {Scope: ScopeSession, Name: TiDBQueryLogMaxLen, Value: strconv.Itoa(logutil.DefaultQueryLogMaxLen), Type: TypeInt, MinValue: -1, MaxValue: math.MaxInt64, skipInit: true, SetSession: func(s *SessionVars, val string) error { atomic.StoreUint64(&config.GetGlobalConfig().Log.QueryLogMaxLen, uint64(tidbOptInt64(val, logutil.DefaultQueryLogMaxLen))) @@ -1685,12 +1197,16 @@ var defaultSysVars = []*SysVar{ }}, {Scope: ScopeNone, Name: TiDBEnableEnhancedSecurity, Value: Off, Type: TypeBool}, {Scope: ScopeSession, Name: PluginLoad, Value: "", GetSession: func(s *SessionVars) (string, error) { - return config.GetGlobalConfig().Plugin.Dir, nil + return config.GetGlobalConfig().Plugin.Load, nil }}, {Scope: ScopeSession, Name: PluginDir, Value: "/data/deploy/plugin", GetSession: func(s *SessionVars) (string, error) { - return config.GetGlobalConfig().Plugin.Load, nil + return config.GetGlobalConfig().Plugin.Dir, nil + }}, + {Scope: ScopeGlobal, Name: TiDBEnableHistoricalStats, Value: Off, Type: TypeBool, GetGlobal: func(s *SessionVars) (string, error) { + return getTiDBTableValue(s, "tidb_enable_historical_stats", Off) + }, SetGlobal: func(s *SessionVars, val string) error { + return setTiDBTableValue(s, "tidb_enable_historical_stats", val, "Current historical statistics enable status") }}, - /* tikv gc metrics */ {Scope: ScopeGlobal, Name: TiDBGCEnable, Value: On, Type: TypeBool, GetGlobal: func(s *SessionVars) (string, error) { return getTiDBTableValue(s, "tikv_gc_enable", On) @@ -1729,9 +1245,9 @@ var defaultSysVars = []*SysVar{ }, SetGlobal: func(s *SessionVars, val string) error { return setTiDBTableValue(s, "tikv_gc_scan_lock_mode", val, "Mode of scanning locks, \"physical\" or \"legacy\"") }}, - // See https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_tmp_table_size - {Scope: ScopeGlobal | ScopeSession, Name: TMPTableSize, Value: strconv.Itoa(DefTMPTableSize), Type: TypeUnsigned, MinValue: 1024, MaxValue: math.MaxInt64, IsHintUpdatable: true, AllowEmpty: true, SetSession: func(s *SessionVars, val string) error { - s.TMPTableSize = tidbOptInt64(val, DefTMPTableSize) + // It's different from tmp_table_size or max_heap_table_size. See https://github.com/pingcap/tidb/issues/28691. + {Scope: ScopeGlobal | ScopeSession, Name: TiDBTmpTableMaxSize, Value: strconv.Itoa(DefTiDBTmpTableMaxSize), Type: TypeUnsigned, MinValue: 1 << 20, MaxValue: 1 << 37, SetSession: func(s *SessionVars, val string) error { + s.TMPTableSize = tidbOptInt64(val, DefTiDBTmpTableMaxSize) return nil }}, // variable for top SQL feature. @@ -1740,7 +1256,7 @@ var defaultSysVars = []*SysVar{ }, SetGlobal: func(vars *SessionVars, s string) error { TopSQLVariable.Enable.Store(TiDBOptOn(s)) return nil - }}, + }, GlobalConfigName: GlobalConfigEnableTopSQL}, {Scope: ScopeGlobal, Name: TiDBTopSQLPrecisionSeconds, Value: strconv.Itoa(DefTiDBTopSQLPrecisionSeconds), Type: TypeInt, Hidden: true, MinValue: 1, MaxValue: math.MaxInt64, GetGlobal: func(s *SessionVars) (string, error) { return strconv.FormatInt(TopSQLVariable.PrecisionSeconds.Load(), 10), nil }, SetGlobal: func(vars *SessionVars, s string) error { @@ -1761,7 +1277,7 @@ var defaultSysVars = []*SysVar{ TopSQLVariable.MaxStatementCount.Store(val) return nil }}, - {Scope: ScopeGlobal, Name: TiDBTopSQLMaxCollect, Value: strconv.Itoa(DefTiDBTopSQLMaxCollect), Type: TypeInt, Hidden: true, MinValue: 1, MaxValue: 500000, GetGlobal: func(s *SessionVars) (string, error) { + {Scope: ScopeGlobal, Name: TiDBTopSQLMaxCollect, Value: strconv.Itoa(DefTiDBTopSQLMaxCollect), Type: TypeInt, Hidden: true, MinValue: 1, MaxValue: 10000, GetGlobal: func(s *SessionVars) (string, error) { return strconv.FormatInt(TopSQLVariable.MaxCollect.Load(), 10), nil }, SetGlobal: func(vars *SessionVars, s string) error { val, err := strconv.ParseInt(s, 10, 64) @@ -1787,18 +1303,34 @@ var defaultSysVars = []*SysVar{ s.EnableStableResultMode = TiDBOptOn(val) return nil }}, - - {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableMPPBalanceWithContinuousRegion, Type: TypeBool, Value: BoolToOnOff(DefEnableMPPBalanceWithContinuousRegion), SetSession: func(s *SessionVars, val string) error { - s.EnableMPPBalanceWithContinuousRegion = TiDBOptOn(val) + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnablePseudoForOutdatedStats, Value: BoolToOnOff(DefTiDBEnablePseudoForOutdatedStats), Type: TypeBool, SetSession: func(s *SessionVars, val string) error { + s.EnablePseudoForOutdatedStats = TiDBOptOn(val) return nil }}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableMPPBalanceWithContinuousRegionCount, Value: strconv.Itoa(DefEnableMPPBalanceWithContinuousRegionCount), Type: TypeInt, Hidden: true, MinValue: 1, MaxValue: 10000, AllowEmpty: true, SetSession: func(s *SessionVars, val string) error { - s.EnableMPPBalanceWithContinuousRegionCount = tidbOptInt64(val, DefEnableMPPBalanceWithContinuousRegionCount) + {Scope: ScopeGlobal | ScopeSession, Name: TiDBRegardNULLAsPoint, Value: BoolToOnOff(DefTiDBRegardNULLAsPoint), Type: TypeBool, SetSession: func(s *SessionVars, val string) error { + s.RegardNULLAsPoint = TiDBOptOn(val) return nil }}, {Scope: ScopeNone, Name: "version_compile_os", Value: runtime.GOOS}, {Scope: ScopeNone, Name: "version_compile_machine", Value: runtime.GOARCH}, + {Scope: ScopeNone, Name: TiDBAllowFunctionForExpressionIndex, ReadOnly: true, Value: collectAllowFuncName4ExpressionIndex()}, + {Scope: ScopeSession, Name: RandSeed1, Type: TypeInt, Value: "0", skipInit: true, MaxValue: math.MaxInt32, SetSession: func(s *SessionVars, val string) error { + s.Rng.SetSeed1(uint32(tidbOptPositiveInt32(val, 0))) + return nil + }, GetSession: func(s *SessionVars) (string, error) { + return "0", nil + }}, + {Scope: ScopeSession, Name: RandSeed2, Type: TypeInt, Value: "0", skipInit: true, MaxValue: math.MaxInt32, SetSession: func(s *SessionVars, val string) error { + s.Rng.SetSeed2(uint32(tidbOptPositiveInt32(val, 0))) + return nil + }, GetSession: func(s *SessionVars) (string, error) { + return "0", nil + }}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnablePaging, Value: Off, Type: TypeBool, Hidden: true, skipInit: true, SetSession: func(s *SessionVars, val string) error { + s.EnablePaging = TiDBOptOn(val) + return nil + }}, } // FeedbackProbability points to the FeedbackProbability in statistics package. @@ -1893,6 +1425,8 @@ const ( SkipNameResolve = "skip_name_resolve" // ForeignKeyChecks is the name for 'foreign_key_checks' system variable. ForeignKeyChecks = "foreign_key_checks" + // PlacementChecks is the name for 'placement_checks' system variable. + PlacementChecks = "placement_checks" // SQLSafeUpdates is the name for 'sql_safe_updates' system variable. SQLSafeUpdates = "sql_safe_updates" // WarningCount is the name for 'warning_count' system variable. @@ -1905,8 +1439,6 @@ const ( MaxConnectErrors = "max_connect_errors" // TableDefinitionCache is the name for 'table_definition_cache' system variable. TableDefinitionCache = "table_definition_cache" - // TMPTableSize is the name for 'tmp_table_size' system variable. - TMPTableSize = "tmp_table_size" // Timestamp is the name for 'timestamp' system variable. Timestamp = "timestamp" // ConnectTimeout is the name for 'connect_timeout' system variable. @@ -2101,18 +1633,10 @@ const ( LastInsertID = "last_insert_id" // Identity is the name of 'identity' system variable. Identity = "identity" + // TiDBAllowFunctionForExpressionIndex is the name of `TiDBAllowFunctionForExpressionIndex` system variable. + TiDBAllowFunctionForExpressionIndex = "tidb_allow_function_for_expression_index" + // RandSeed1 is the name of 'rand_seed1' system variable. + RandSeed1 = "rand_seed1" + // RandSeed2 is the name of 'rand_seed2' system variable. + RandSeed2 = "rand_seed2" ) - -// GlobalVarAccessor is the interface for accessing global scope system and status variables. -type GlobalVarAccessor interface { - // GetGlobalSysVar gets the global system variable value for name. - GetGlobalSysVar(name string) (string, error) - // SetGlobalSysVar sets the global system variable name to value. - SetGlobalSysVar(name string, value string) error - // SetGlobalSysVarOnly sets the global system variable without calling the validation function or updating aliases. - SetGlobalSysVarOnly(name string, value string) error - // GetTiDBTableValue gets a value from mysql.tidb for the key 'name' - GetTiDBTableValue(name string) (string, error) - // SetTiDBTableValue sets a value+comment for the mysql.tidb key 'name' - SetTiDBTableValue(name, value, comment string) error -} diff --git a/sessionctx/variable/sysvar_test.go b/sessionctx/variable/sysvar_test.go index b0c4e94e84490..e15c9f92b92b8 100644 --- a/sessionctx/variable/sysvar_test.go +++ b/sessionctx/variable/sysvar_test.go @@ -525,7 +525,7 @@ func TestSkipInit(t *testing.T) { require.True(t, sv.SkipInit()) } -// IsNoop is used by the documentation to auto-generate docs for real sysvars. +// TestIsNoop is used by the documentation to auto-generate docs for real sysvars. func TestIsNoop(t *testing.T) { sv := GetSysVar(TiDBMultiStatementMode) require.False(t, sv.IsNoop) @@ -608,7 +608,7 @@ func TestInstanceScopedVars(t *testing.T) { val, err = GetSessionOrGlobalSystemVar(vars, TiDBEnableSlowLog) require.NoError(t, err) - require.Equal(t, BoolToOnOff(config.GetGlobalConfig().Log.EnableSlowLog), val) + require.Equal(t, BoolToOnOff(config.GetGlobalConfig().Log.EnableSlowLog.Load()), val) val, err = GetSessionOrGlobalSystemVar(vars, TiDBQueryLogMaxLen) require.NoError(t, err) @@ -639,7 +639,7 @@ func TestInstanceScopedVars(t *testing.T) { require.Equal(t, vars.TxnScope.GetVarValue(), val) } -// Test that sysvars defaults are logically valid. i.e. +// TestDefaultValuesAreSettable that sysvars defaults are logically valid. i.e. // the default itself must validate without error provided the scope and read-only is correct. // The default values should also be normalized for consistency. func TestDefaultValuesAreSettable(t *testing.T) { @@ -660,7 +660,7 @@ func TestDefaultValuesAreSettable(t *testing.T) { } } -// This tests that sysvars are logically correct with getter and setter functions. +// TestSettersandGetters tests that sysvars are logically correct with getter and setter functions. // i.e. it doesn't make sense to have a SetSession function on a variable that is only globally scoped. func TestSettersandGetters(t *testing.T) { for _, sv := range GetSysVars() { @@ -679,6 +679,11 @@ func TestSettersandGetters(t *testing.T) { } if !sv.HasGlobalScope() { require.Nil(t, sv.SetGlobal) + if sv.Name == Timestamp { + // The Timestamp sysvar will have GetGlobal func even though it does not have global scope. + // It's GetGlobal func will only be called when "set timestamp = default". + continue + } require.Nil(t, sv.GetGlobal) } } @@ -747,6 +752,24 @@ func TestLastInsertID(t *testing.T) { require.Equal(t, val, "21") } +func TestTimestamp(t *testing.T) { + vars := NewSessionVars() + val, err := GetSessionOrGlobalSystemVar(vars, Timestamp) + require.NoError(t, err) + require.NotEqual(t, "", val) + + vars.systems[Timestamp] = "10" + val, err = GetSessionOrGlobalSystemVar(vars, Timestamp) + require.NoError(t, err) + require.Equal(t, "10", val) + + vars.systems[Timestamp] = "0" // set to default + val, err = GetSessionOrGlobalSystemVar(vars, Timestamp) + require.NoError(t, err) + require.NotEqual(t, "", val) + require.NotEqual(t, "10", val) +} + func TestIdentity(t *testing.T) { vars := NewSessionVars() val, err := GetSessionOrGlobalSystemVar(vars, Identity) @@ -759,6 +782,14 @@ func TestIdentity(t *testing.T) { require.Equal(t, val, "21") } +func TestLcTimeNamesReadOnly(t *testing.T) { + sv := GetSysVar("lc_time_names") + vars := NewSessionVars() + vars.GlobalVarsAccessor = NewMockGlobalAccessor4Tests() + _, err := sv.Validate(vars, "newvalue", ScopeGlobal) + require.Error(t, err) +} + func TestDDLWorkers(t *testing.T) { svWorkerCount, svBatchSize := GetSysVar(TiDBDDLReorgWorkerCount), GetSysVar(TiDBDDLReorgBatchSize) vars := NewSessionVars() @@ -784,3 +815,13 @@ func TestDDLWorkers(t *testing.T) { require.NoError(t, err) require.Equal(t, val, "100") // unchanged } + +func TestDefaultCharsetAndCollation(t *testing.T) { + vars := NewSessionVars() + val, err := GetSessionOrGlobalSystemVar(vars, CharacterSetConnection) + require.NoError(t, err) + require.Equal(t, val, mysql.DefaultCharset) + val, err = GetSessionOrGlobalSystemVar(vars, CollationConnection) + require.NoError(t, err) + require.Equal(t, val, mysql.DefaultCollationName) +} diff --git a/sessionctx/variable/tidb_vars.go b/sessionctx/variable/tidb_vars.go index d3ab0b104bc36..ee01348a76441 100644 --- a/sessionctx/variable/tidb_vars.go +++ b/sessionctx/variable/tidb_vars.go @@ -121,6 +121,9 @@ const ( // tidb_general_log is used to log every query in the server in info level. TiDBGeneralLog = "tidb_general_log" + // tidb_general_log is used to log every query in the server in info level. + TiDBLogFileMaxDays = "tidb_log_file_max_days" + // tidb_pprof_sql_cpu is used to add label sql label to pprof result. TiDBPProfSQLCPU = "tidb_pprof_sql_cpu" @@ -211,6 +214,9 @@ const ( // TiDBReadStaleness indicates the staleness duration for following statement TiDBReadStaleness = "tidb_read_staleness" + + // TiDBEnablePaging indicates whether paging is enabled in coprocessor requests. + TiDBEnablePaging = "tidb_enable_paging" ) // TiDB system variable names that both in session and global scope. @@ -581,14 +587,22 @@ const ( TiDBEnableGlobalTemporaryTable = "tidb_enable_global_temporary_table" // TiDBEnableLocalTxn indicates whether to enable Local Txn. TiDBEnableLocalTxn = "tidb_enable_local_txn" + // TiDBTSOClientBatchMaxWaitTime indicates the max value of the TSO Batch Wait interval time of PD client. + TiDBTSOClientBatchMaxWaitTime = "tidb_tso_client_batch_max_wait_time" + // TiDBEnableTSOFollowerProxy indicates whether to enable the TSO Follower Proxy feature of PD client. + TiDBEnableTSOFollowerProxy = "tidb_enable_tso_follower_proxy" // TiDBEnableOrderedResultMode indicates if stabilize query results. TiDBEnableOrderedResultMode = "tidb_enable_ordered_result_mode" - // TiDBEnableMPPBalanceWithContinuousRegion indicates whether MPP balance logic will take account of region's continuity in TiFlash. - TiDBEnableMPPBalanceWithContinuousRegion = "tidb_enable_mpp_balance_with_continuous_region" - // TiDBEnableMPPBalanceWithContinuousRegionCount indicates the continuous region count that balance logic assigns to a TiFlash instance each time. - TiDBEnableMPPBalanceWithContinuousRegionCount = "tidb_enable_mpp_balance_with_continuous_region_count" + // TiDBEnablePseudoForOutdatedStats indicates whether use pseudo for outdated stats + TiDBEnablePseudoForOutdatedStats = "tidb_enable_pseudo_for_outdated_stats" + + // TiDBRegardNULLAsPoint indicates whether regard NULL as point when optimizing + TiDBRegardNULLAsPoint = "tidb_regard_null_as_point" + + // TiDBTmpTableMaxSize indicates the max memory size of temporary tables. + TiDBTmpTableMaxSize = "tidb_tmp_table_max_size" ) // TiDB vars that have only global scope @@ -606,6 +620,8 @@ const ( TiDBGCScanLockMode = "tidb_gc_scan_lock_mode" // TiDBEnableEnhancedSecurity restricts SUPER users from certain operations. TiDBEnableEnhancedSecurity = "tidb_enable_enhanced_security" + // TiDBEnableHistoricalStats enables the historical statistics feature (default off) + TiDBEnableHistoricalStats = "tidb_enable_historical_stats" ) // TiDB intentional limits @@ -619,151 +635,156 @@ const ( // Default TiDB system variable values. const ( - DefHostname = "localhost" - DefIndexLookupConcurrency = ConcurrencyUnset - DefIndexLookupJoinConcurrency = ConcurrencyUnset - DefIndexSerialScanConcurrency = 1 - DefIndexJoinBatchSize = 25000 - DefIndexLookupSize = 20000 - DefDistSQLScanConcurrency = 15 - DefBuildStatsConcurrency = 4 - DefAutoAnalyzeRatio = 0.5 - DefAutoAnalyzeStartTime = "00:00 +0000" - DefAutoAnalyzeEndTime = "23:59 +0000" - DefAutoIncrementIncrement = 1 - DefAutoIncrementOffset = 1 - DefChecksumTableConcurrency = 4 - DefSkipUTF8Check = false - DefSkipASCIICheck = false - DefOptAggPushDown = false - DefOptBCJ = false - DefOptCartesianBCJ = 1 - DefOptMPPOuterJoinFixedBuildSide = false - DefOptWriteRowID = false - DefOptEnableCorrelationAdjustment = true - DefOptLimitPushDownThreshold = 100 - DefOptCorrelationThreshold = 0.9 - DefOptCorrelationExpFactor = 1 - DefOptCPUFactor = 3.0 - DefOptCopCPUFactor = 3.0 - DefOptTiFlashConcurrencyFactor = 24.0 - DefOptNetworkFactor = 1.0 - DefOptScanFactor = 1.5 - DefOptDescScanFactor = 3.0 - DefOptSeekFactor = 20.0 - DefOptMemoryFactor = 0.001 - DefOptDiskFactor = 1.5 - DefOptConcurrencyFactor = 3.0 - DefOptInSubqToJoinAndAgg = true - DefOptPreferRangeScan = false - DefBatchInsert = false - DefBatchDelete = false - DefBatchCommit = false - DefCurretTS = 0 - DefInitChunkSize = 32 - DefMaxChunkSize = 1024 - DefDMLBatchSize = 0 - DefMaxPreparedStmtCount = -1 - DefWaitTimeout = 0 - DefTiDBMemQuotaApplyCache = 32 << 20 // 32MB. - DefTiDBMemQuotaHashJoin = 32 << 30 // 32GB. - DefTiDBMemQuotaMergeJoin = 32 << 30 // 32GB. - DefTiDBMemQuotaSort = 32 << 30 // 32GB. - DefTiDBMemQuotaTopn = 32 << 30 // 32GB. - DefTiDBMemQuotaIndexLookupReader = 32 << 30 // 32GB. - DefTiDBMemQuotaIndexLookupJoin = 32 << 30 // 32GB. - DefTiDBMemQuotaDistSQL = 32 << 30 // 32GB. - DefTiDBGeneralLog = false - DefTiDBPProfSQLCPU = 0 - DefTiDBRetryLimit = 10 - DefTiDBDisableTxnAutoRetry = true - DefTiDBConstraintCheckInPlace = false - DefTiDBHashJoinConcurrency = ConcurrencyUnset - DefTiDBProjectionConcurrency = ConcurrencyUnset - DefBroadcastJoinThresholdSize = 100 * 1024 * 1024 - DefBroadcastJoinThresholdCount = 10 * 1024 - DefTiDBOptimizerSelectivityLevel = 0 - DefTiDBAllowBatchCop = 1 - DefTiDBAllowMPPExecution = true - DefTiDBHashExchangeWithNewCollation = true - DefTiDBEnforceMPPExecution = false - DefTiDBMPPStoreFailTTL = "60s" - DefTiDBTxnMode = "" - DefTiDBRowFormatV1 = 1 - DefTiDBRowFormatV2 = 2 - DefTiDBDDLReorgWorkerCount = 4 - DefTiDBDDLReorgBatchSize = 256 - DefTiDBDDLErrorCountLimit = 512 - DefTiDBMaxDeltaSchemaCount = 1024 - DefTiDBChangeMultiSchema = false - DefTiDBPointGetCache = false - DefTiDBEnableAlterPlacement = false - DefTiDBEnableAutoIncrementInGenerated = false - DefTiDBHashAggPartialConcurrency = ConcurrencyUnset - DefTiDBHashAggFinalConcurrency = ConcurrencyUnset - DefTiDBWindowConcurrency = ConcurrencyUnset - DefTiDBMergeJoinConcurrency = 1 // disable optimization by default - DefTiDBStreamAggConcurrency = 1 - DefTiDBForcePriority = mysql.NoPriority - DefEnableWindowFunction = true - DefEnablePipelinedWindowFunction = true - DefEnableStrictDoubleTypeCheck = true - DefEnableVectorizedExpression = true - DefTiDBOptJoinReorderThreshold = 0 - DefTiDBDDLSlowOprThreshold = 300 - DefTiDBUseFastAnalyze = false - DefTiDBSkipIsolationLevelCheck = false - DefTiDBExpensiveQueryTimeThreshold = 60 // 60s - DefTiDBScatterRegion = false - DefTiDBWaitSplitRegionFinish = true - DefWaitSplitRegionTimeout = 300 // 300s - DefTiDBEnableNoopFuncs = Off - DefTiDBAllowRemoveAutoInc = false - DefTiDBUsePlanBaselines = true - DefTiDBEvolvePlanBaselines = false - DefTiDBEvolvePlanTaskMaxTime = 600 // 600s - DefTiDBEvolvePlanTaskStartTime = "00:00 +0000" - DefTiDBEvolvePlanTaskEndTime = "23:59 +0000" - DefInnodbLockWaitTimeout = 50 // 50s - DefTiDBStoreLimit = 0 - DefTiDBMetricSchemaStep = 60 // 60s - DefTiDBMetricSchemaRangeDuration = 60 // 60s - DefTiDBFoundInPlanCache = false - DefTiDBFoundInBinding = false - DefTiDBEnableCollectExecutionInfo = true - DefTiDBAllowAutoRandExplicitInsert = false - DefTiDBEnableClusteredIndex = ClusteredIndexDefModeIntOnly - DefTiDBRedactLog = false - DefTiDBRestrictedReadOnly = false - DefTiDBShardAllocateStep = math.MaxInt64 - DefTiDBEnableTelemetry = true - DefTiDBEnableParallelApply = false - DefTiDBEnableAmendPessimisticTxn = false - DefTiDBPartitionPruneMode = "static" - DefTiDBEnableRateLimitAction = true - DefTiDBEnableAsyncCommit = false - DefTiDBEnable1PC = false - DefTiDBGuaranteeLinearizability = true - DefTiDBAnalyzeVersion = 2 - DefTiDBEnableIndexMergeJoin = false - DefTiDBTrackAggregateMemoryUsage = true - DefTiDBEnableExchangePartition = false - DefCTEMaxRecursionDepth = 1000 - DefTiDBTopSQLEnable = false - DefTiDBTopSQLPrecisionSeconds = 1 - DefTiDBTopSQLMaxStatementCount = 200 - DefTiDBTopSQLMaxCollect = 10000 - DefTiDBTopSQLReportIntervalSeconds = 60 - DefTMPTableSize = 16777216 - DefTiDBEnableLocalTxn = false - DefTiDBEnableOrderedResultMode = false - DefEnableMPPBalanceWithContinuousRegion = true - DefEnableMPPBalanceWithContinuousRegionCount = 20 + DefHostname = "localhost" + DefIndexLookupConcurrency = ConcurrencyUnset + DefIndexLookupJoinConcurrency = ConcurrencyUnset + DefIndexSerialScanConcurrency = 1 + DefIndexJoinBatchSize = 25000 + DefIndexLookupSize = 20000 + DefDistSQLScanConcurrency = 15 + DefBuildStatsConcurrency = 4 + DefAutoAnalyzeRatio = 0.5 + DefAutoAnalyzeStartTime = "00:00 +0000" + DefAutoAnalyzeEndTime = "23:59 +0000" + DefAutoIncrementIncrement = 1 + DefAutoIncrementOffset = 1 + DefChecksumTableConcurrency = 4 + DefSkipUTF8Check = false + DefSkipASCIICheck = false + DefOptAggPushDown = false + DefOptBCJ = false + DefOptCartesianBCJ = 1 + DefOptMPPOuterJoinFixedBuildSide = false + DefOptWriteRowID = false + DefOptEnableCorrelationAdjustment = true + DefOptLimitPushDownThreshold = 100 + DefOptCorrelationThreshold = 0.9 + DefOptCorrelationExpFactor = 1 + DefOptCPUFactor = 3.0 + DefOptCopCPUFactor = 3.0 + DefOptTiFlashConcurrencyFactor = 24.0 + DefOptNetworkFactor = 1.0 + DefOptScanFactor = 1.5 + DefOptDescScanFactor = 3.0 + DefOptSeekFactor = 20.0 + DefOptMemoryFactor = 0.001 + DefOptDiskFactor = 1.5 + DefOptConcurrencyFactor = 3.0 + DefOptInSubqToJoinAndAgg = true + DefOptPreferRangeScan = false + DefBatchInsert = false + DefBatchDelete = false + DefBatchCommit = false + DefCurretTS = 0 + DefInitChunkSize = 32 + DefMaxChunkSize = 1024 + DefDMLBatchSize = 0 + DefMaxPreparedStmtCount = -1 + DefWaitTimeout = 28800 + DefTiDBMemQuotaApplyCache = 32 << 20 // 32MB. + DefTiDBMemQuotaHashJoin = 32 << 30 // 32GB. + DefTiDBMemQuotaMergeJoin = 32 << 30 // 32GB. + DefTiDBMemQuotaSort = 32 << 30 // 32GB. + DefTiDBMemQuotaTopn = 32 << 30 // 32GB. + DefTiDBMemQuotaIndexLookupReader = 32 << 30 // 32GB. + DefTiDBMemQuotaIndexLookupJoin = 32 << 30 // 32GB. + DefTiDBMemQuotaDistSQL = 32 << 30 // 32GB. + DefTiDBGeneralLog = false + DefTiDBPProfSQLCPU = 0 + DefTiDBRetryLimit = 10 + DefTiDBDisableTxnAutoRetry = true + DefTiDBConstraintCheckInPlace = false + DefTiDBHashJoinConcurrency = ConcurrencyUnset + DefTiDBProjectionConcurrency = ConcurrencyUnset + DefBroadcastJoinThresholdSize = 100 * 1024 * 1024 + DefBroadcastJoinThresholdCount = 10 * 1024 + DefTiDBOptimizerSelectivityLevel = 0 + DefTiDBAllowBatchCop = 1 + DefTiDBAllowMPPExecution = true + DefTiDBHashExchangeWithNewCollation = true + DefTiDBEnforceMPPExecution = false + DefTiDBMPPStoreFailTTL = "60s" + DefTiDBTxnMode = "" + DefTiDBRowFormatV1 = 1 + DefTiDBRowFormatV2 = 2 + DefTiDBDDLReorgWorkerCount = 4 + DefTiDBDDLReorgBatchSize = 256 + DefTiDBDDLErrorCountLimit = 512 + DefTiDBMaxDeltaSchemaCount = 1024 + DefTiDBChangeMultiSchema = false + DefTiDBPointGetCache = false + DefTiDBEnableAlterPlacement = false + DefTiDBEnableAutoIncrementInGenerated = false + DefTiDBHashAggPartialConcurrency = ConcurrencyUnset + DefTiDBHashAggFinalConcurrency = ConcurrencyUnset + DefTiDBWindowConcurrency = ConcurrencyUnset + DefTiDBMergeJoinConcurrency = 1 // disable optimization by default + DefTiDBStreamAggConcurrency = 1 + DefTiDBForcePriority = mysql.NoPriority + DefEnableWindowFunction = true + DefEnablePipelinedWindowFunction = true + DefEnableStrictDoubleTypeCheck = true + DefEnableVectorizedExpression = true + DefTiDBOptJoinReorderThreshold = 0 + DefTiDBDDLSlowOprThreshold = 300 + DefTiDBUseFastAnalyze = false + DefTiDBSkipIsolationLevelCheck = false + DefTiDBExpensiveQueryTimeThreshold = 60 // 60s + DefTiDBScatterRegion = false + DefTiDBWaitSplitRegionFinish = true + DefWaitSplitRegionTimeout = 300 // 300s + DefTiDBEnableNoopFuncs = Off + DefTiDBAllowRemoveAutoInc = false + DefTiDBUsePlanBaselines = true + DefTiDBEvolvePlanBaselines = false + DefTiDBEvolvePlanTaskMaxTime = 600 // 600s + DefTiDBEvolvePlanTaskStartTime = "00:00 +0000" + DefTiDBEvolvePlanTaskEndTime = "23:59 +0000" + DefInnodbLockWaitTimeout = 50 // 50s + DefTiDBStoreLimit = 0 + DefTiDBMetricSchemaStep = 60 // 60s + DefTiDBMetricSchemaRangeDuration = 60 // 60s + DefTiDBFoundInPlanCache = false + DefTiDBFoundInBinding = false + DefTiDBEnableCollectExecutionInfo = true + DefTiDBAllowAutoRandExplicitInsert = false + DefTiDBEnableClusteredIndex = ClusteredIndexDefModeIntOnly + DefTiDBRedactLog = false + DefTiDBRestrictedReadOnly = false + DefTiDBShardAllocateStep = math.MaxInt64 + DefTiDBEnableTelemetry = true + DefTiDBEnableParallelApply = false + DefTiDBEnableAmendPessimisticTxn = false + DefTiDBPartitionPruneMode = "static" + DefTiDBEnableRateLimitAction = true + DefTiDBEnableAsyncCommit = false + DefTiDBEnable1PC = false + DefTiDBGuaranteeLinearizability = true + DefTiDBAnalyzeVersion = 2 + DefTiDBEnableIndexMergeJoin = false + DefTiDBTrackAggregateMemoryUsage = true + DefTiDBEnableExchangePartition = false + DefCTEMaxRecursionDepth = 1000 + DefTiDBTopSQLEnable = false + DefTiDBTopSQLPrecisionSeconds = 1 + DefTiDBTopSQLMaxStatementCount = 200 + DefTiDBTopSQLMaxCollect = 5000 + DefTiDBTopSQLReportIntervalSeconds = 60 + DefTiDBTmpTableMaxSize = 64 << 20 // 64MB. + DefTiDBEnableLocalTxn = false + DefTiDBTSOClientBatchMaxWaitTime = 0.0 // 0ms + DefTiDBEnableTSOFollowerProxy = false + DefTiDBEnableOrderedResultMode = false + DefTiDBEnablePseudoForOutdatedStats = true + DefTiDBRegardNULLAsPoint = true + DefEnablePlacementCheck = true + DefTimestamp = "0" ) // Process global variables. var ( ProcessGeneralLog = atomic.NewBool(false) + GlobalLogMaxDays = atomic.NewInt32(int32(config.GetGlobalConfig().Log.File.MaxDays)) EnablePProfSQLCPU = atomic.NewBool(false) ddlReorgWorkerCounter int32 = DefTiDBDDLReorgWorkerCount ddlReorgBatchSize int32 = DefTiDBDDLReorgBatchSize @@ -789,8 +810,10 @@ var ( MaxCollect: atomic.NewInt64(DefTiDBTopSQLMaxCollect), ReportIntervalSeconds: atomic.NewInt64(DefTiDBTopSQLReportIntervalSeconds), } - EnableLocalTxn = atomic.NewBool(DefTiDBEnableLocalTxn) - RestrictedReadOnly = atomic.NewBool(DefTiDBRestrictedReadOnly) + EnableLocalTxn = atomic.NewBool(DefTiDBEnableLocalTxn) + MaxTSOBatchWaitInterval = atomic.NewFloat64(DefTiDBTSOClientBatchMaxWaitTime) + EnableTSOFollowerProxy = atomic.NewBool(DefTiDBEnableTSOFollowerProxy) + RestrictedReadOnly = atomic.NewBool(DefTiDBRestrictedReadOnly) ) // TopSQL is the variable for control top sql feature. diff --git a/sessionctx/variable/variable.go b/sessionctx/variable/variable.go new file mode 100644 index 0000000000000..675ca3bdc0887 --- /dev/null +++ b/sessionctx/variable/variable.go @@ -0,0 +1,589 @@ +// Copyright 2021 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, +// 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. + +package variable + +import ( + "fmt" + "strconv" + "strings" + "sync" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/types" +) + +// ScopeFlag is for system variable whether can be changed in global/session dynamically or not. +type ScopeFlag uint8 + +// TypeFlag is the SysVar type, which doesn't exactly match MySQL types. +type TypeFlag byte + +const ( + // ScopeNone means the system variable can not be changed dynamically. + ScopeNone ScopeFlag = 0 + // ScopeGlobal means the system variable can be changed globally. + ScopeGlobal ScopeFlag = 1 << 0 + // ScopeSession means the system variable can only be changed in current session. + ScopeSession ScopeFlag = 1 << 1 + + // TypeStr is the default + TypeStr TypeFlag = 0 + // TypeBool for boolean + TypeBool TypeFlag = 1 + // TypeInt for integer + TypeInt TypeFlag = 2 + // TypeEnum for Enum + TypeEnum TypeFlag = 3 + // TypeFloat for Double + TypeFloat TypeFlag = 4 + // TypeUnsigned for Unsigned integer + TypeUnsigned TypeFlag = 5 + // TypeTime for time of day (a TiDB extension) + TypeTime TypeFlag = 6 + // TypeDuration for a golang duration (a TiDB extension) + TypeDuration TypeFlag = 7 + + // On is the canonical string for ON + On = "ON" + // Off is the canonical string for OFF + Off = "OFF" + // Warn means return warnings + Warn = "WARN" + // IntOnly means enable for int type + IntOnly = "INT_ONLY" +) + +// Global config name list. +const ( + GlobalConfigEnableTopSQL = "enable_resource_metering" +) + +// SysVar is for system variable. +// All the fields of SysVar should be READ ONLY after created. +type SysVar struct { + // Scope is for whether can be changed or not + Scope ScopeFlag + // Name is the variable name. + Name string + // Value is the variable value. + Value string + // Type is the MySQL type (optional) + Type TypeFlag + // MinValue will automatically be validated when specified (optional) + MinValue int64 + // MaxValue will automatically be validated when specified (optional) + MaxValue uint64 + // AutoConvertNegativeBool applies to boolean types (optional) + AutoConvertNegativeBool bool + // ReadOnly applies to all types + ReadOnly bool + // PossibleValues applies to ENUM type + PossibleValues []string + // AllowEmpty is a special TiDB behavior which means "read value from config" (do not use) + AllowEmpty bool + // AllowEmptyAll is a special behavior that only applies to TiDBCapturePlanBaseline, TiDBTxnMode (do not use) + AllowEmptyAll bool + // AllowAutoValue means that the special value "-1" is permitted, even when outside of range. + AllowAutoValue bool + // Validation is a callback after the type validation has been performed, but before the Set function + Validation func(*SessionVars, string, string, ScopeFlag) (string, error) + // SetSession is called after validation but before updating systems[]. It also doubles as an Init function + // and will be called on all variables in builtinGlobalVariable, regardless of their scope. + SetSession func(*SessionVars, string) error + // SetGlobal is called after validation + SetGlobal func(*SessionVars, string) error + // IsHintUpdatable indicate whether it's updatable via SET_VAR() hint (optional) + IsHintUpdatable bool + // Hidden means that it still responds to SET but doesn't show up in SHOW VARIABLES + Hidden bool + // Aliases is a list of sysvars that should also be updated when this sysvar is updated. + // Updating aliases calls the SET function of the aliases, but does not update their aliases (preventing SET recursion) + Aliases []string + // GetSession is a getter function for session scope. + // It can be used by instance-scoped variables to overwrite the previously expected value. + GetSession func(*SessionVars) (string, error) + // GetGlobal is a getter function for global scope. + GetGlobal func(*SessionVars) (string, error) + // skipInit defines if the sysvar should be loaded into the session on init. + // This is only important to set for sysvars that include session scope, + // since global scoped sysvars are not-applicable. + skipInit bool + // IsNoop defines if the sysvar is a noop included for MySQL compatibility + IsNoop bool + // GlobalConfigName is the global config name of this global variable. + // If the global variable has the global config name, + // it should store the global config into PD(etcd) too when set global variable. + GlobalConfigName string +} + +// GetGlobalFromHook calls the GetSession func if it exists. +func (sv *SysVar) GetGlobalFromHook(s *SessionVars) (string, error) { + // Call the Getter if there is one defined. + if sv.GetGlobal != nil { + val, err := sv.GetGlobal(s) + if err != nil { + return val, err + } + // Ensure that the results from the getter are validated + // Since some are read directly from tables. + return sv.ValidateWithRelaxedValidation(s, val, ScopeGlobal), nil + } + if sv.HasNoneScope() { + return sv.Value, nil + } + return s.GlobalVarsAccessor.GetGlobalSysVar(sv.Name) +} + +// GetSessionFromHook calls the GetSession func if it exists. +func (sv *SysVar) GetSessionFromHook(s *SessionVars) (string, error) { + if sv.HasNoneScope() { + return sv.Value, nil + } + // Call the Getter if there is one defined. + if sv.GetSession != nil { + val, err := sv.GetSession(s) + if err != nil { + return val, err + } + // Ensure that the results from the getter are validated + // Since some are read directly from tables. + return sv.ValidateWithRelaxedValidation(s, val, ScopeSession), nil + } + var ( + ok bool + val string + ) + if val, ok = s.stmtVars[sv.Name]; ok { + return val, nil + } + if val, ok = s.systems[sv.Name]; !ok { + return val, errors.New("sysvar has not yet loaded") + } + return val, nil +} + +// SetSessionFromHook calls the SetSession func if it exists. +func (sv *SysVar) SetSessionFromHook(s *SessionVars, val string) error { + if sv.SetSession != nil { + if err := sv.SetSession(s, val); err != nil { + return err + } + } + s.systems[sv.Name] = val + + // Call the Set function on all the aliases for this sysVar + // Skipping the validation function, and not calling aliases of + // aliases. By skipping the validation function it means that things + // like duplicate warnings should not appear. + + if sv.Aliases != nil { + for _, aliasName := range sv.Aliases { + aliasSv := GetSysVar(aliasName) + if aliasSv.SetSession != nil { + if err := aliasSv.SetSession(s, val); err != nil { + return err + } + } + s.systems[aliasSv.Name] = val + } + } + return nil +} + +// SetGlobalFromHook calls the SetGlobal func if it exists. +func (sv *SysVar) SetGlobalFromHook(s *SessionVars, val string, skipAliases bool) error { + if sv.SetGlobal != nil { + return sv.SetGlobal(s, val) + } + + // Call the SetGlobalSysVarOnly function on all the aliases for this sysVar + // which skips the validation function and when SetGlobalFromHook is called again + // it will be with skipAliases=true. This helps break recursion because + // most aliases are reciprocal. + + if !skipAliases && sv.Aliases != nil { + for _, aliasName := range sv.Aliases { + if err := s.GlobalVarsAccessor.SetGlobalSysVarOnly(aliasName, val); err != nil { + return err + } + } + } + return nil +} + +// HasNoneScope returns true if the scope for the sysVar is None. +func (sv *SysVar) HasNoneScope() bool { + return sv.Scope == ScopeNone +} + +// HasSessionScope returns true if the scope for the sysVar includes session. +func (sv *SysVar) HasSessionScope() bool { + return sv.Scope&ScopeSession != 0 +} + +// HasGlobalScope returns true if the scope for the sysVar includes global. +func (sv *SysVar) HasGlobalScope() bool { + return sv.Scope&ScopeGlobal != 0 +} + +// Validate checks if system variable satisfies specific restriction. +func (sv *SysVar) Validate(vars *SessionVars, value string, scope ScopeFlag) (string, error) { + // Check that the scope is correct first. + if err := sv.validateScope(scope); err != nil { + return value, err + } + // Normalize the value and apply validation based on type. + // i.e. TypeBool converts 1/on/ON to ON. + normalizedValue, err := sv.ValidateFromType(vars, value, scope) + if err != nil { + return normalizedValue, err + } + // If type validation was successful, call the (optional) validation function + if sv.Validation != nil { + return sv.Validation(vars, normalizedValue, value, scope) + } + return normalizedValue, nil +} + +// ValidateFromType provides automatic validation based on the SysVar's type +func (sv *SysVar) ValidateFromType(vars *SessionVars, value string, scope ScopeFlag) (string, error) { + // The string "DEFAULT" is a special keyword in MySQL, which restores + // the compiled sysvar value. In which case we can skip further validation. + if strings.EqualFold(value, "DEFAULT") { + return sv.Value, nil + } + // Some sysvars in TiDB have a special behavior where the empty string means + // "use the config file value". This needs to be cleaned up once the behavior + // for instance variables is determined. + if value == "" && ((sv.AllowEmpty && scope == ScopeSession) || sv.AllowEmptyAll) { + return value, nil + } + // Provide validation using the SysVar struct + switch sv.Type { + case TypeUnsigned: + return sv.checkUInt64SystemVar(value, vars) + case TypeInt: + return sv.checkInt64SystemVar(value, vars) + case TypeBool: + return sv.checkBoolSystemVar(value, vars) + case TypeFloat: + return sv.checkFloatSystemVar(value, vars) + case TypeEnum: + return sv.checkEnumSystemVar(value, vars) + case TypeTime: + return sv.checkTimeSystemVar(value, vars) + case TypeDuration: + return sv.checkDurationSystemVar(value, vars) + } + return value, nil // typeString +} + +func (sv *SysVar) validateScope(scope ScopeFlag) error { + if sv.ReadOnly || sv.Scope == ScopeNone { + return ErrIncorrectScope.FastGenByArgs(sv.Name, "read only") + } + if scope == ScopeGlobal && !sv.HasGlobalScope() { + return errLocalVariable.FastGenByArgs(sv.Name) + } + if scope == ScopeSession && !sv.HasSessionScope() { + return errGlobalVariable.FastGenByArgs(sv.Name) + } + return nil +} + +// ValidateWithRelaxedValidation normalizes values but can not return errors. +// Normalization+validation needs to be applied when reading values because older versions of TiDB +// may be less sophisticated in normalizing values. But errors should be caught and handled, +// because otherwise there will be upgrade issues. +func (sv *SysVar) ValidateWithRelaxedValidation(vars *SessionVars, value string, scope ScopeFlag) string { + warns := vars.StmtCtx.GetWarnings() + defer func() { + vars.StmtCtx.SetWarnings(warns) // RelaxedValidation = trim warnings too. + }() + normalizedValue, err := sv.ValidateFromType(vars, value, scope) + if err != nil { + return normalizedValue + } + if sv.Validation != nil { + normalizedValue, err = sv.Validation(vars, normalizedValue, value, scope) + if err != nil { + return normalizedValue + } + } + return normalizedValue +} + +const ( + localDayTimeFormat = "15:04" + // FullDayTimeFormat is the full format of analyze start time and end time. + FullDayTimeFormat = "15:04 -0700" +) + +func (sv *SysVar) checkTimeSystemVar(value string, vars *SessionVars) (string, error) { + var t time.Time + var err error + if len(value) <= len(localDayTimeFormat) { + t, err = time.ParseInLocation(localDayTimeFormat, value, vars.Location()) + } else { + t, err = time.ParseInLocation(FullDayTimeFormat, value, vars.Location()) + } + if err != nil { + return "", err + } + return t.Format(FullDayTimeFormat), nil +} + +func (sv *SysVar) checkDurationSystemVar(value string, vars *SessionVars) (string, error) { + d, err := time.ParseDuration(value) + if err != nil { + return value, ErrWrongTypeForVar.GenWithStackByArgs(sv.Name) + } + // Check for min/max violations + if int64(d) < sv.MinValue { + vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(sv.Name, value)) + return time.Duration(sv.MinValue).String(), nil + } + if uint64(d) > sv.MaxValue { + vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(sv.Name, value)) + return time.Duration(sv.MaxValue).String(), nil + } + // return a string representation of the duration + return d.String(), nil +} + +func (sv *SysVar) checkUInt64SystemVar(value string, vars *SessionVars) (string, error) { + if sv.AllowAutoValue && value == "-1" { + return value, nil + } + if len(value) == 0 { + return value, ErrWrongTypeForVar.GenWithStackByArgs(sv.Name) + } + if value[0] == '-' { + _, err := strconv.ParseInt(value, 10, 64) + if err != nil { + return value, ErrWrongTypeForVar.GenWithStackByArgs(sv.Name) + } + vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(sv.Name, value)) + return fmt.Sprintf("%d", sv.MinValue), nil + } + val, err := strconv.ParseUint(value, 10, 64) + if err != nil { + return value, ErrWrongTypeForVar.GenWithStackByArgs(sv.Name) + } + if val < uint64(sv.MinValue) { + vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(sv.Name, value)) + return fmt.Sprintf("%d", sv.MinValue), nil + } + if val > sv.MaxValue { + vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(sv.Name, value)) + return fmt.Sprintf("%d", sv.MaxValue), nil + } + return value, nil +} + +func (sv *SysVar) checkInt64SystemVar(value string, vars *SessionVars) (string, error) { + if sv.AllowAutoValue && value == "-1" { + return value, nil + } + val, err := strconv.ParseInt(value, 10, 64) + if err != nil { + return value, ErrWrongTypeForVar.GenWithStackByArgs(sv.Name) + } + if val < sv.MinValue { + vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(sv.Name, value)) + return fmt.Sprintf("%d", sv.MinValue), nil + } + if val > int64(sv.MaxValue) { + vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(sv.Name, value)) + return fmt.Sprintf("%d", sv.MaxValue), nil + } + return value, nil +} + +func (sv *SysVar) checkEnumSystemVar(value string, vars *SessionVars) (string, error) { + // The value could be either a string or the ordinal position in the PossibleValues. + // This allows for the behavior 0 = OFF, 1 = ON, 2 = DEMAND etc. + var iStr string + for i, v := range sv.PossibleValues { + iStr = fmt.Sprintf("%d", i) + if strings.EqualFold(value, v) || strings.EqualFold(value, iStr) { + return v, nil + } + } + return value, ErrWrongValueForVar.GenWithStackByArgs(sv.Name, value) +} + +func (sv *SysVar) checkFloatSystemVar(value string, vars *SessionVars) (string, error) { + if len(value) == 0 { + return value, ErrWrongTypeForVar.GenWithStackByArgs(sv.Name) + } + val, err := strconv.ParseFloat(value, 64) + if err != nil { + return value, ErrWrongTypeForVar.GenWithStackByArgs(sv.Name) + } + if val < float64(sv.MinValue) { + vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(sv.Name, value)) + return fmt.Sprintf("%d", sv.MinValue), nil + } + if val > float64(sv.MaxValue) { + vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(sv.Name, value)) + return fmt.Sprintf("%d", sv.MaxValue), nil + } + return value, nil +} + +func (sv *SysVar) checkBoolSystemVar(value string, vars *SessionVars) (string, error) { + if strings.EqualFold(value, "ON") { + return On, nil + } else if strings.EqualFold(value, "OFF") { + return Off, nil + } + val, err := strconv.ParseInt(value, 10, 64) + if err == nil { + // There are two types of conversion rules for integer values. + // The default only allows 0 || 1, but a subset of values convert any + // negative integer to 1. + if !sv.AutoConvertNegativeBool { + if val == 0 { + return Off, nil + } else if val == 1 { + return On, nil + } + } else { + if val == 1 || val < 0 { + return On, nil + } else if val == 0 { + return Off, nil + } + } + } + return value, ErrWrongValueForVar.GenWithStackByArgs(sv.Name, value) +} + +// GetNativeValType attempts to convert the val to the approx MySQL non-string type +func (sv *SysVar) GetNativeValType(val string) (types.Datum, byte, uint) { + switch sv.Type { + case TypeUnsigned: + u, err := strconv.ParseUint(val, 10, 64) + if err != nil { + u = 0 + } + return types.NewUintDatum(u), mysql.TypeLonglong, mysql.UnsignedFlag + case TypeBool: + optVal := int64(0) // OFF + if TiDBOptOn(val) { + optVal = 1 + } + return types.NewIntDatum(optVal), mysql.TypeLong, 0 + } + return types.NewStringDatum(val), mysql.TypeVarString, 0 +} + +// SkipInit returns true if when a new session is created we should "skip" copying +// an initial value to it (and call the SetSession func if it exists) +func (sv *SysVar) SkipInit() bool { + if sv.skipInit || sv.IsNoop { + return true + } + // These a special "Global-only" sysvars that for backward compatibility + // are currently cached in the session. Please don't add to this list. + switch sv.Name { + case TiDBEnableChangeMultiSchema, TiDBDDLReorgBatchSize, TiDBEnableAlterPlacement, + TiDBMaxDeltaSchemaCount, InitConnect, MaxPreparedStmtCount, + TiDBDDLReorgWorkerCount, TiDBDDLErrorCountLimit, TiDBRowFormatVersion, + TiDBEnableTelemetry, TiDBEnablePointGetCache: + return false + } + return !sv.HasSessionScope() +} + +var sysVars map[string]*SysVar +var sysVarsLock sync.RWMutex + +// RegisterSysVar adds a sysvar to the SysVars list +func RegisterSysVar(sv *SysVar) { + name := strings.ToLower(sv.Name) + sysVarsLock.Lock() + sysVars[name] = sv + sysVarsLock.Unlock() +} + +// UnregisterSysVar removes a sysvar from the SysVars list +// currently only used in tests. +func UnregisterSysVar(name string) { + name = strings.ToLower(name) + sysVarsLock.Lock() + delete(sysVars, name) + sysVarsLock.Unlock() +} + +// GetSysVar returns sys var info for name as key. +func GetSysVar(name string) *SysVar { + name = strings.ToLower(name) + sysVarsLock.RLock() + defer sysVarsLock.RUnlock() + + return sysVars[name] +} + +// SetSysVar sets a sysvar. In fact, SysVar is immutable. +// SetSysVar is implemented by register a new SysVar with the same name again. +// This will not propagate to the cluster, so it should only be +// used for instance scoped AUTO variables such as system_time_zone. +func SetSysVar(name string, value string) { + old := GetSysVar(name) + tmp := *old + tmp.Value = value + RegisterSysVar(&tmp) +} + +// GetSysVars deep copies the sysVars list under a RWLock +func GetSysVars() map[string]*SysVar { + sysVarsLock.RLock() + defer sysVarsLock.RUnlock() + copy := make(map[string]*SysVar, len(sysVars)) + for name, sv := range sysVars { + tmp := *sv + copy[name] = &tmp + } + return copy +} + +func init() { + sysVars = make(map[string]*SysVar) + for _, v := range defaultSysVars { + RegisterSysVar(v) + } + for _, v := range noopSysVars { + v.IsNoop = true + RegisterSysVar(v) + } +} + +// GlobalVarAccessor is the interface for accessing global scope system and status variables. +type GlobalVarAccessor interface { + // GetGlobalSysVar gets the global system variable value for name. + GetGlobalSysVar(name string) (string, error) + // SetGlobalSysVar sets the global system variable name to value. + SetGlobalSysVar(name string, value string) error + // SetGlobalSysVarOnly sets the global system variable without calling the validation function or updating aliases. + SetGlobalSysVarOnly(name string, value string) error + // GetTiDBTableValue gets a value from mysql.tidb for the key 'name' + GetTiDBTableValue(name string) (string, error) + // SetTiDBTableValue sets a value+comment for the mysql.tidb key 'name' + SetTiDBTableValue(name, value, comment string) error +} diff --git a/sessionctx/variable/varsutil.go b/sessionctx/variable/varsutil.go index c308a6a9320c5..15f13a53521f5 100644 --- a/sessionctx/variable/varsutil.go +++ b/sessionctx/variable/varsutil.go @@ -16,6 +16,7 @@ package variable import ( "fmt" + "sort" "strconv" "strings" "sync" @@ -23,6 +24,7 @@ import ( "time" "github.com/pingcap/errors" + "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/charset" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/types" @@ -237,7 +239,7 @@ func getTiDBTableValue(vars *SessionVars, name, defaultVal string) (string, erro } func setTiDBTableValue(vars *SessionVars, name, value, comment string) error { - value = onOffToTrueFalse(value) + value = OnOffToTrueFalse(value) return vars.GlobalVarsAccessor.SetTiDBTableValue(name, value, comment) } @@ -252,9 +254,10 @@ func trueFalseToOnOff(str string) string { return str } +// OnOffToTrueFalse convert "ON"/"OFF" to "true"/"false". // In mysql.tidb the convention has been to store the string value "true"/"false", // but sysvars use the convention ON/OFF. -func onOffToTrueFalse(str string) string { +func OnOffToTrueFalse(str string) string { if strings.EqualFold("ON", str) { return "true" } else if strings.EqualFold("OFF", str) { @@ -481,3 +484,21 @@ func (v *serverGlobalVariable) GetVal() string { } return v.globalVal } + +func collectAllowFuncName4ExpressionIndex() string { + var str []string + for funcName := range GAFunction4ExpressionIndex { + str = append(str, funcName) + } + sort.Strings(str) + return strings.Join(str, ", ") +} + +// GAFunction4ExpressionIndex stores functions GA for expression index. +var GAFunction4ExpressionIndex = map[string]struct{}{ + ast.Lower: {}, + ast.Upper: {}, + ast.MD5: {}, + ast.Reverse: {}, + ast.VitessHash: {}, +} diff --git a/sessionctx/variable/varsutil_test.go b/sessionctx/variable/varsutil_test.go index 35bf42cba4a76..b50399cf851a8 100644 --- a/sessionctx/variable/varsutil_test.go +++ b/sessionctx/variable/varsutil_test.go @@ -98,7 +98,7 @@ func TestNewSessionVars(t *testing.T) { require.Equal(t, int64(DefTiDBShardAllocateStep), vars.ShardAllocateStep) require.Equal(t, DefTiDBAnalyzeVersion, vars.AnalyzeVersion) require.Equal(t, DefCTEMaxRecursionDepth, vars.CTEMaxRecursionDepth) - require.Equal(t, int64(DefTMPTableSize), vars.TMPTableSize) + require.Equal(t, int64(DefTiDBTmpTableMaxSize), vars.TMPTableSize) assertFieldsGreaterThanZero(t, reflect.ValueOf(vars.MemQuota)) assertFieldsGreaterThanZero(t, reflect.ValueOf(vars.BatchSize)) @@ -467,7 +467,8 @@ func TestVarsutil(t *testing.T) { require.NoError(t, err) require.Equal(t, "10", val) err = SetSessionSystemVar(v, TiDBStmtSummaryMaxStmtCount, "a") - require.Regexp(t, ".*Incorrect argument type to variable 'tidb_stmt_summary_max_stmt_count'", err) + require.Error(t, err) + require.Regexp(t, "Incorrect argument type to variable 'tidb_stmt_summary_max_stmt_count'$", err) err = SetSessionSystemVar(v, TiDBStmtSummaryMaxSQLLength, "10") require.NoError(t, err) @@ -475,16 +476,20 @@ func TestVarsutil(t *testing.T) { require.NoError(t, err) require.Equal(t, "10", val) err = SetSessionSystemVar(v, TiDBStmtSummaryMaxSQLLength, "a") - require.Regexp(t, ".*Incorrect argument type to variable 'tidb_stmt_summary_max_sql_length'", err.Error()) + require.Error(t, err) + require.Regexp(t, "Incorrect argument type to variable 'tidb_stmt_summary_max_sql_length'$", err.Error()) err = SetSessionSystemVar(v, TiDBFoundInPlanCache, "1") - require.Regexp(t, ".*]Variable 'last_plan_from_cache' is a read only variable", err.Error()) + require.Error(t, err) + require.Regexp(t, "]Variable 'last_plan_from_cache' is a read only variable$", err.Error()) err = SetSessionSystemVar(v, TiDBFoundInBinding, "1") - require.Regexp(t, ".*]Variable 'last_plan_from_binding' is a read only variable", err.Error()) + require.Error(t, err) + require.Regexp(t, "]Variable 'last_plan_from_binding' is a read only variable$", err.Error()) err = SetSessionSystemVar(v, "UnknownVariable", "on") - require.Regexp(t, ".*]Unknown system variable 'UnknownVariable'", err.Error()) + require.Error(t, err) + require.Regexp(t, "]Unknown system variable 'UnknownVariable'$", err.Error()) // reset warnings v.StmtCtx.TruncateWarnings(0) @@ -493,7 +498,8 @@ func TestVarsutil(t *testing.T) { err = SetSessionSystemVar(v, TiDBAnalyzeVersion, "4") require.NoError(t, err) // converts to max value warn := v.StmtCtx.GetWarnings()[0] - require.Regexp(t, ".*Truncated incorrect tidb_analyze_version value", warn.Err.Error()) + require.Error(t, warn.Err) + require.Contains(t, warn.Err.Error(), "Truncated incorrect tidb_analyze_version value") } func TestValidate(t *testing.T) { @@ -587,7 +593,6 @@ func TestValidate(t *testing.T) { for _, tc := range testCases { t.Run(tc.key, func(t *testing.T) { - t.Parallel() _, err := GetSysVar(tc.key).Validate(v, tc.value, ScopeGlobal) if tc.error { require.Errorf(t, err, "%v got err=%v", tc, err) @@ -616,7 +621,6 @@ func TestValidate(t *testing.T) { // copy iterator variable into a new variable, see issue #27779 tc := tc t.Run(tc.key, func(t *testing.T) { - t.Parallel() _, err := GetSysVar(tc.key).Validate(v, tc.value, ScopeSession) if tc.error { require.Errorf(t, err, "%v got err=%v", tc, err) @@ -675,7 +679,6 @@ func TestValidateStmtSummary(t *testing.T) { // copy iterator variable into a new variable, see issue #27779 tc := tc t.Run(tc.key, func(t *testing.T) { - t.Parallel() _, err := GetSysVar(tc.key).Validate(v, tc.value, tc.scope) if tc.error { require.Errorf(t, err, "%v got err=%v", tc, err) diff --git a/statistics/builder.go b/statistics/builder.go index 13edd2457fd75..cff117547f619 100644 --- a/statistics/builder.go +++ b/statistics/builder.go @@ -23,6 +23,7 @@ import ( "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/util/collate" ) // SortedBuilder is used to build histograms for PK and index. @@ -67,7 +68,7 @@ func (b *SortedBuilder) Iterate(data types.Datum) error { b.hist.NDV = 1 return nil } - cmp, err := b.hist.GetUpper(int(b.bucketIdx)).CompareDatum(b.sc, &data) + cmp, err := b.hist.GetUpper(int(b.bucketIdx)).Compare(b.sc, &data, collate.GetBinaryCollator()) if err != nil { return errors.Trace(err) } @@ -158,7 +159,7 @@ func buildHist(sc *stmtctx.StatementContext, hg *Histogram, samples []*SampleIte hg.AppendBucket(&samples[0].Value, &samples[0].Value, int64(sampleFactor), int64(ndvFactor)) for i := int64(1); i < sampleNum; i++ { corrXYSum += float64(i) * float64(samples[i].Ordinal) - cmp, err := hg.GetUpper(bucketIdx).CompareDatum(sc, &samples[i].Value) + cmp, err := hg.GetUpper(bucketIdx).Compare(sc, &samples[i].Value, collate.GetBinaryCollator()) if err != nil { return 0, errors.Trace(err) } diff --git a/statistics/cmsketch_test.go b/statistics/cmsketch_test.go index 3929fc610aed0..19400d1199aa0 100644 --- a/statistics/cmsketch_test.go +++ b/statistics/cmsketch_test.go @@ -107,7 +107,6 @@ func averageAbsoluteError(cms *CMSketch, topN *TopN, mp map[int64]uint32) (uint6 } func TestCMSketch(t *testing.T) { - t.Parallel() tests := []struct { zipfFactor float64 avgError uint64 @@ -152,7 +151,6 @@ func TestCMSketch(t *testing.T) { } func TestCMSketchCoding(t *testing.T) { - t.Parallel() lSketch := NewCMSketch(5, 2048) lSketch.count = 2048 * math.MaxUint32 for i := range lSketch.table { @@ -169,7 +167,6 @@ func TestCMSketchCoding(t *testing.T) { } func TestCMSketchTopN(t *testing.T) { - t.Parallel() tests := []struct { zipfFactor float64 avgError uint64 @@ -208,7 +205,6 @@ func TestCMSketchTopN(t *testing.T) { } func TestMergeCMSketch4IncrementalAnalyze(t *testing.T) { - t.Parallel() tests := []struct { zipfFactor float64 avgError uint64 @@ -259,7 +255,6 @@ func TestMergeCMSketch4IncrementalAnalyze(t *testing.T) { } func TestCMSketchTopNUniqueData(t *testing.T) { - t.Parallel() d, w := int32(5), int32(2048) total := uint64(1000000) mp := make(map[int64]uint32) @@ -281,7 +276,6 @@ func TestCMSketchTopNUniqueData(t *testing.T) { } func TestCMSketchCodingTopN(t *testing.T) { - t.Parallel() lSketch := NewCMSketch(5, 2048) lSketch.count = 2048 * (math.MaxUint32) for i := range lSketch.table { diff --git a/statistics/feedback.go b/statistics/feedback.go index c6806a9c99189..12e986f95bff5 100644 --- a/statistics/feedback.go +++ b/statistics/feedback.go @@ -35,6 +35,7 @@ import ( "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/ranger" "go.uber.org/atomic" @@ -129,6 +130,25 @@ func (m *QueryFeedbackMap) append(k QueryFeedbackKey, qs []*QueryFeedback) bool return true } +// SiftFeedbacks eliminates feedbacks which are overlapped with others. It is a tradeoff between +// feedback accuracy and its overhead. +func (m *QueryFeedbackMap) SiftFeedbacks() { + sc := &stmtctx.StatementContext{TimeZone: time.UTC} + for k, qs := range m.Feedbacks { + fbs := make([]Feedback, 0, len(qs)*2) + for _, q := range qs { + fbs = append(fbs, q.Feedback...) + } + if len(fbs) == 0 { + delete(m.Feedbacks, k) + continue + } + m.Feedbacks[k] = m.Feedbacks[k][:1] + m.Feedbacks[k][0].Feedback, _ = NonOverlappedFeedbacks(sc, fbs) + } + m.Size = len(m.Feedbacks) +} + // Merge combines 2 collections of feedbacks. func (m *QueryFeedbackMap) Merge(r *QueryFeedbackMap) { for k, qs := range r.Feedbacks { @@ -330,14 +350,14 @@ func NonOverlappedFeedbacks(sc *stmtctx.StatementContext, fbs []Feedback) ([]Fee // with the previous chosen feedbacks. var existsErr bool sort.Slice(fbs, func(i, j int) bool { - res, err := fbs[i].Upper.CompareDatum(sc, fbs[j].Upper) + res, err := fbs[i].Upper.Compare(sc, fbs[j].Upper, collate.GetBinaryCollator()) if err != nil { existsErr = true } if existsErr || res != 0 { return res < 0 } - res, err = fbs[i].Lower.CompareDatum(sc, fbs[j].Lower) + res, err = fbs[i].Lower.Compare(sc, fbs[j].Lower, collate.GetBinaryCollator()) if err != nil { existsErr = true } @@ -349,7 +369,7 @@ func NonOverlappedFeedbacks(sc *stmtctx.StatementContext, fbs []Feedback) ([]Fee resFBs := make([]Feedback, 0, len(fbs)) previousEnd := &types.Datum{} for _, fb := range fbs { - res, err := previousEnd.CompareDatum(sc, fb.Lower) + res, err := previousEnd.Compare(sc, fb.Lower, collate.GetBinaryCollator()) if err != nil { return fbs, false } @@ -370,14 +390,14 @@ type BucketFeedback struct { // 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) + result, err := val.Compare(sc, min, collate.GetBinaryCollator()) if err != nil { return 0, err } if result < 0 { return result, nil } - result, err = val.CompareDatum(sc, max) + result, err = val.Compare(sc, max, collate.GetBinaryCollator()) if err != nil { return 0, err } @@ -457,7 +477,7 @@ func buildBucketFeedback(h *Histogram, feedback *QueryFeedback) (map[int]*Bucket } bkt.feedback = append(bkt.feedback, fb) // Update the bound if necessary. - res, err := bkt.lower.CompareDatum(nil, fb.Lower) + res, err := bkt.lower.Compare(nil, fb.Lower, collate.GetBinaryCollator()) if err != nil { logutil.BgLogger().Debug("compare datum failed", zap.Any("value1", bkt.lower), zap.Any("value2", fb.Lower), zap.Error(err)) continue @@ -465,7 +485,7 @@ func buildBucketFeedback(h *Histogram, feedback *QueryFeedback) (map[int]*Bucket if res > 0 { bkt.lower = fb.Lower } - res, err = bkt.upper.CompareDatum(nil, fb.Upper) + res, err = bkt.upper.Compare(nil, fb.Upper, collate.GetBinaryCollator()) if err != nil { logutil.BgLogger().Debug("compare datum failed", zap.Any("value1", bkt.upper), zap.Any("value2", fb.Upper), zap.Error(err)) continue @@ -501,7 +521,7 @@ func (b *BucketFeedback) getBoundaries(num int) []types.Datum { total = 1 // Erase the repeat values. for i := 1; i < len(vals); i++ { - cmp, err := vals[total-1].CompareDatum(nil, &vals[i]) + cmp, err := vals[total-1].Compare(nil, &vals[i], collate.GetBinaryCollator()) if err != nil { logutil.BgLogger().Debug("compare datum failed", zap.Any("value1", vals[total-1]), zap.Any("value2", vals[i]), zap.Error(err)) continue diff --git a/statistics/feedback_test.go b/statistics/feedback_test.go index f79a8b3126084..33366f2805e7e 100644 --- a/statistics/feedback_test.go +++ b/statistics/feedback_test.go @@ -55,7 +55,6 @@ func genHistogram() *Histogram { } func TestUpdateHistogram(t *testing.T) { - t.Parallel() feedbacks := []Feedback{ newFeedback(0, 1, 10000, 1), newFeedback(1, 2, 1, 1), @@ -80,7 +79,6 @@ func TestUpdateHistogram(t *testing.T) { } func TestSplitBuckets(t *testing.T) { - t.Parallel() // test bucket split feedbacks := []Feedback{newFeedback(0, 1, 1, 1)} for i := 0; i < 100; i++ { @@ -190,7 +188,6 @@ func TestSplitBuckets(t *testing.T) { } func TestMergeBuckets(t *testing.T) { - t.Parallel() tests := []struct { points []int64 counts []int64 @@ -252,7 +249,6 @@ func encodeInt(v int64) *types.Datum { } func TestFeedbackEncoding(t *testing.T) { - t.Parallel() hist := NewHistogram(0, 0, 0, 0, types.NewFieldType(mysql.TypeLong), 0, 0) q := &QueryFeedback{Hist: hist, Tp: PkType} q.Feedback = append(q.Feedback, Feedback{encodeInt(0), encodeInt(3), 1, 0, 1}) diff --git a/statistics/fmsketch_test.go b/statistics/fmsketch_test.go index 96c21b82a1767..768db16fb913d 100644 --- a/statistics/fmsketch_test.go +++ b/statistics/fmsketch_test.go @@ -33,9 +33,9 @@ func extractSampleItemsDatums(items []*SampleItem) []types.Datum { return datums } -func SubTestSketch(s *testStatisticsSamples) func(*testing.T) { +func SubTestSketch() func(*testing.T) { return func(t *testing.T) { - t.Parallel() + s := createTestStatisticsSamples(t) sc := &stmtctx.StatementContext{TimeZone: time.Local} maxSize := 1000 sampleSketch, ndv, err := buildFMSketch(sc, extractSampleItemsDatums(s.samples), maxSize) @@ -64,9 +64,9 @@ func SubTestSketch(s *testStatisticsSamples) func(*testing.T) { } } -func SubTestSketchProtoConversion(s *testStatisticsSamples) func(*testing.T) { +func SubTestSketchProtoConversion() func(*testing.T) { return func(t *testing.T) { - t.Parallel() + s := createTestStatisticsSamples(t) sc := &stmtctx.StatementContext{TimeZone: time.Local} maxSize := 1000 sampleSketch, ndv, err := buildFMSketch(sc, extractSampleItemsDatums(s.samples), maxSize) @@ -82,9 +82,9 @@ func SubTestSketchProtoConversion(s *testStatisticsSamples) func(*testing.T) { } } -func SubTestFMSketchCoding(s *testStatisticsSamples) func(*testing.T) { +func SubTestFMSketchCoding() func(*testing.T) { return func(t *testing.T) { - t.Parallel() + s := createTestStatisticsSamples(t) sc := &stmtctx.StatementContext{TimeZone: time.Local} maxSize := 1000 sampleSketch, ndv, err := buildFMSketch(sc, extractSampleItemsDatums(s.samples), maxSize) diff --git a/statistics/handle/bootstrap.go b/statistics/handle/bootstrap.go index 363059f92d726..bc5cff9a9084f 100644 --- a/statistics/handle/bootstrap.go +++ b/statistics/handle/bootstrap.go @@ -66,7 +66,7 @@ func (h *Handle) initStatsMeta(is infoschema.InfoSchema) (statsCache, error) { } defer terror.Call(rc.Close) tables := statsCache{tables: make(map[int64]*statistics.Table)} - req := rc.NewChunk() + req := rc.NewChunk(nil) iter := chunk.NewIterator4Chunk(req) for { err := rc.Next(context.TODO(), req) @@ -163,7 +163,7 @@ func (h *Handle) initStatsHistograms(is infoschema.InfoSchema, cache *statsCache return errors.Trace(err) } defer terror.Call(rc.Close) - req := rc.NewChunk() + req := rc.NewChunk(nil) iter := chunk.NewIterator4Chunk(req) for { err := rc.Next(context.TODO(), req) @@ -209,7 +209,7 @@ func (h *Handle) initStatsTopN(cache *statsCache) error { return errors.Trace(err) } defer terror.Call(rc.Close) - req := rc.NewChunk() + req := rc.NewChunk(nil) iter := chunk.NewIterator4Chunk(req) for { err := rc.Next(context.TODO(), req) @@ -257,7 +257,7 @@ func (h *Handle) initStatsFMSketch(cache *statsCache) error { return errors.Trace(err) } defer terror.Call(rc.Close) - req := rc.NewChunk() + req := rc.NewChunk(nil) iter := chunk.NewIterator4Chunk(req) for { err := rc.Next(context.TODO(), req) @@ -330,7 +330,7 @@ func (h *Handle) initTopNCountSum(tableID, colID int64) (int64, error) { if err != nil { return 0, err } - req := rs.NewChunk() + req := rs.NewChunk(nil) iter := chunk.NewIterator4Chunk(req) err = rs.Next(context.TODO(), req) if err != nil { @@ -349,7 +349,7 @@ func (h *Handle) initStatsBuckets(cache *statsCache) error { return errors.Trace(err) } defer terror.Call(rc.Close) - req := rc.NewChunk() + req := rc.NewChunk(nil) iter := chunk.NewIterator4Chunk(req) for { err := rc.Next(context.TODO(), req) diff --git a/statistics/handle/ddl.go b/statistics/handle/ddl.go index 03528a5cecd42..6fdf102548ee1 100644 --- a/statistics/handle/ddl.go +++ b/statistics/handle/ddl.go @@ -107,14 +107,14 @@ func (h *Handle) updateGlobalStats(tblInfo *model.TableInfo) error { opts[ast.AnalyzeOptNumBuckets] = uint64(globalColStatsBucketNum) } // Generate the new column global-stats - newColGlobalStats, err := h.mergePartitionStats2GlobalStats(h.mu.ctx, opts, is, tblInfo, 0, 0) + newColGlobalStats, err := h.mergePartitionStats2GlobalStats(h.mu.ctx, opts, is, tblInfo, 0, nil) if err != nil { return err } for i := 0; i < newColGlobalStats.Num; i++ { hg, cms, topN, fms := newColGlobalStats.Hg[i], newColGlobalStats.Cms[i], newColGlobalStats.TopN[i], newColGlobalStats.Fms[i] // fms for global stats doesn't need to dump to kv. - err = h.SaveStatsToStorage(tableID, newColGlobalStats.Count, 0, hg, cms, topN, fms, 2, 1, false) + err = h.SaveStatsToStorage(tableID, newColGlobalStats.Count, 0, hg, cms, topN, fms, 2, 1, false, false) if err != nil { return err } @@ -137,14 +137,14 @@ func (h *Handle) updateGlobalStats(tblInfo *model.TableInfo) error { if globalIdxStatsBucketNum != 0 { opts[ast.AnalyzeOptNumBuckets] = uint64(globalIdxStatsBucketNum) } - newIndexGlobalStats, err := h.mergePartitionStats2GlobalStats(h.mu.ctx, opts, is, tblInfo, 1, int64(idx)) + newIndexGlobalStats, err := h.mergePartitionStats2GlobalStats(h.mu.ctx, opts, is, tblInfo, 1, []int64{int64(idx)}) if err != nil { return err } for i := 0; i < newIndexGlobalStats.Num; i++ { hg, cms, topN, fms := newIndexGlobalStats.Hg[i], newIndexGlobalStats.Cms[i], newIndexGlobalStats.TopN[i], newIndexGlobalStats.Fms[i] // fms for global stats doesn't need to dump to kv. - err = h.SaveStatsToStorage(tableID, newIndexGlobalStats.Count, 1, hg, cms, topN, fms, 2, 1, false) + err = h.SaveStatsToStorage(tableID, newIndexGlobalStats.Count, 1, hg, cms, topN, fms, 2, 1, false, false) if err != nil { return err } @@ -242,7 +242,7 @@ func (h *Handle) insertColStats2KV(physicalID int64, colInfos []*model.ColumnInf return } defer terror.Call(rs.Close) - req := rs.NewChunk() + req := rs.NewChunk(nil) err = rs.Next(ctx, req) if err != nil { return diff --git a/statistics/handle/ddl_test.go b/statistics/handle/ddl_serial_test.go similarity index 67% rename from statistics/handle/ddl_test.go rename to statistics/handle/ddl_serial_test.go index 2469428dbd38e..91a3a244cb17d 100644 --- a/statistics/handle/ddl_test.go +++ b/statistics/handle/ddl_serial_test.go @@ -15,92 +15,91 @@ package handle_test import ( - . "github.com/pingcap/check" + "testing" + "github.com/pingcap/tidb/parser/model" - "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/testkit" + "github.com/pingcap/tidb/util/mock" + "github.com/stretchr/testify/require" ) -func (s *testStatsSuite) TestDDLAfterLoad(c *C) { - defer cleanEnv(c, s.store, s.do) - testKit := testkit.NewTestKit(c, s.store) +func TestDDLAfterLoad(t *testing.T) { + testKit, do, clean := createTestKitAndDom(t) + defer clean() testKit.MustExec("use test") testKit.MustExec("create table t (c1 int, c2 int)") testKit.MustExec("analyze table t") - do := s.do is := do.InfoSchema() tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) + require.NoError(t, err) tableInfo := tbl.Meta() statsTbl := do.StatsHandle().GetTableStats(tableInfo) - c.Assert(statsTbl.Pseudo, IsFalse) + require.False(t, statsTbl.Pseudo) recordCount := 1000 for i := 0; i < recordCount; i++ { testKit.MustExec("insert into t values (?, ?)", i, i+1) } testKit.MustExec("analyze table t") statsTbl = do.StatsHandle().GetTableStats(tableInfo) - c.Assert(statsTbl.Pseudo, IsFalse) + require.False(t, statsTbl.Pseudo) // add column testKit.MustExec("alter table t add column c10 int") is = do.InfoSchema() tbl, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) + require.NoError(t, err) tableInfo = tbl.Meta() - sc := new(stmtctx.StatementContext) - count := statsTbl.ColumnGreaterRowCount(sc, types.NewDatum(recordCount+1), tableInfo.Columns[0].ID) - c.Assert(count, Equals, 0.0) - count = statsTbl.ColumnGreaterRowCount(sc, types.NewDatum(recordCount+1), tableInfo.Columns[2].ID) - c.Assert(int(count), Equals, 333) + sctx := mock.NewContext() + count := statsTbl.ColumnGreaterRowCount(sctx, types.NewDatum(recordCount+1), tableInfo.Columns[0].ID) + require.Equal(t, 0.0, count) + count = statsTbl.ColumnGreaterRowCount(sctx, types.NewDatum(recordCount+1), tableInfo.Columns[2].ID) + require.Equal(t, 333, int(count)) } -func (s *testStatsSuite) TestDDLTable(c *C) { - defer cleanEnv(c, s.store, s.do) - testKit := testkit.NewTestKit(c, s.store) +func TestDDLTable(t *testing.T) { + testKit, do, clean := createTestKitAndDom(t) + defer clean() testKit.MustExec("use test") testKit.MustExec("create table t (c1 int, c2 int)") - do := s.do is := do.InfoSchema() tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) + require.NoError(t, err) tableInfo := tbl.Meta() h := do.StatsHandle() err = h.HandleDDLEvent(<-h.DDLEventCh()) - c.Assert(err, IsNil) - c.Assert(h.Update(is), IsNil) + require.NoError(t, err) + require.Nil(t, h.Update(is)) statsTbl := h.GetTableStats(tableInfo) - c.Assert(statsTbl.Pseudo, IsFalse) + require.False(t, statsTbl.Pseudo) testKit.MustExec("create table t1 (c1 int, c2 int, index idx(c1))") is = do.InfoSchema() tbl, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) - c.Assert(err, IsNil) + require.NoError(t, err) tableInfo = tbl.Meta() err = h.HandleDDLEvent(<-h.DDLEventCh()) - c.Assert(err, IsNil) - c.Assert(h.Update(is), IsNil) + require.NoError(t, err) + require.Nil(t, h.Update(is)) statsTbl = h.GetTableStats(tableInfo) - c.Assert(statsTbl.Pseudo, IsFalse) + require.False(t, statsTbl.Pseudo) testKit.MustExec("truncate table t1") is = do.InfoSchema() tbl, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) - c.Assert(err, IsNil) + require.NoError(t, err) tableInfo = tbl.Meta() err = h.HandleDDLEvent(<-h.DDLEventCh()) - c.Assert(err, IsNil) - c.Assert(h.Update(is), IsNil) + require.NoError(t, err) + require.Nil(t, h.Update(is)) statsTbl = h.GetTableStats(tableInfo) - c.Assert(statsTbl.Pseudo, IsFalse) + require.False(t, statsTbl.Pseudo) } -func (s *testStatsSuite) TestDDLHistogram(c *C) { - defer cleanEnv(c, s.store, s.do) - testKit := testkit.NewTestKit(c, s.store) - do := s.do +func TestDDLHistogram(t *testing.T) { + testKit, do, clean := createTestKitAndDom(t) + defer clean() h := do.StatsHandle() testKit.MustExec("use test") @@ -111,69 +110,69 @@ func (s *testStatsSuite) TestDDLHistogram(c *C) { testKit.MustExec("alter table t add column c_null int") err := h.HandleDDLEvent(<-h.DDLEventCh()) - c.Assert(err, IsNil) + require.NoError(t, err) is := do.InfoSchema() - c.Assert(h.Update(is), IsNil) + require.Nil(t, h.Update(is)) tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) + require.NoError(t, err) tableInfo := tbl.Meta() statsTbl := do.StatsHandle().GetTableStats(tableInfo) - c.Assert(statsTbl.Pseudo, IsFalse) - c.Check(statsTbl.Columns[tableInfo.Columns[2].ID].NullCount, Equals, int64(2)) - c.Check(statsTbl.Columns[tableInfo.Columns[2].ID].Histogram.NDV, Equals, int64(0)) + require.False(t, statsTbl.Pseudo) + require.Equal(t, int64(2), statsTbl.Columns[tableInfo.Columns[2].ID].NullCount) + require.Equal(t, int64(0), statsTbl.Columns[tableInfo.Columns[2].ID].Histogram.NDV) testKit.MustExec("alter table t add column c3 int NOT NULL") err = h.HandleDDLEvent(<-h.DDLEventCh()) - c.Assert(err, IsNil) + require.NoError(t, err) is = do.InfoSchema() - c.Assert(h.Update(is), IsNil) + require.Nil(t, h.Update(is)) tbl, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) + require.NoError(t, err) tableInfo = tbl.Meta() statsTbl = do.StatsHandle().GetTableStats(tableInfo) - c.Assert(statsTbl.Pseudo, IsFalse) - sc := new(stmtctx.StatementContext) - count, err := statsTbl.ColumnEqualRowCount(sc, types.NewIntDatum(0), tableInfo.Columns[3].ID) - c.Assert(err, IsNil) - 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(0)) + require.False(t, statsTbl.Pseudo) + sctx := mock.NewContext() + count, err := statsTbl.ColumnEqualRowCount(sctx, types.NewIntDatum(0), tableInfo.Columns[3].ID) + require.NoError(t, err) + require.Equal(t, float64(2), count) + count, err = statsTbl.ColumnEqualRowCount(sctx, types.NewIntDatum(1), tableInfo.Columns[3].ID) + require.NoError(t, err) + require.Equal(t, float64(0), count) testKit.MustExec("alter table t add column c4 datetime NOT NULL default CURRENT_TIMESTAMP") err = h.HandleDDLEvent(<-h.DDLEventCh()) - c.Assert(err, IsNil) + require.NoError(t, err) is = do.InfoSchema() - c.Assert(h.Update(is), IsNil) + require.Nil(t, h.Update(is)) tbl, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) + require.NoError(t, err) tableInfo = tbl.Meta() statsTbl = do.StatsHandle().GetTableStats(tableInfo) // If we don't use original default value, we will get a pseudo table. - c.Assert(statsTbl.Pseudo, IsFalse) + require.False(t, statsTbl.Pseudo) testKit.MustExec("alter table t add column c5 varchar(15) DEFAULT '123'") err = h.HandleDDLEvent(<-h.DDLEventCh()) - c.Assert(err, IsNil) + require.NoError(t, err) is = do.InfoSchema() - c.Assert(h.Update(is), IsNil) + require.Nil(t, h.Update(is)) tbl, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) + require.NoError(t, err) tableInfo = tbl.Meta() statsTbl = do.StatsHandle().GetTableStats(tableInfo) - c.Assert(statsTbl.Pseudo, IsFalse) - c.Check(statsTbl.Columns[tableInfo.Columns[5].ID].AvgColSize(statsTbl.Count, false), Equals, 3.0) + require.False(t, statsTbl.Pseudo) + require.Equal(t, 3.0, statsTbl.Columns[tableInfo.Columns[5].ID].AvgColSize(statsTbl.Count, false)) testKit.MustExec("alter table t add column c6 varchar(15) DEFAULT '123', add column c7 varchar(15) DEFAULT '123'") err = h.HandleDDLEvent(<-h.DDLEventCh()) - c.Assert(err, IsNil) + require.NoError(t, err) is = do.InfoSchema() - c.Assert(h.Update(is), IsNil) + require.Nil(t, h.Update(is)) tbl, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) + require.NoError(t, err) tableInfo = tbl.Meta() statsTbl = do.StatsHandle().GetTableStats(tableInfo) - c.Assert(statsTbl.Pseudo, IsFalse) + require.False(t, statsTbl.Pseudo) testKit.MustExec("create index i on t(c2, c1)") testKit.MustExec("analyze table t") @@ -185,9 +184,9 @@ func (s *testStatsSuite) TestDDLHistogram(c *C) { rs.Check(testkit.Rows("2")) } -func (s *testStatsSuite) TestDDLPartition(c *C) { - defer cleanEnv(c, s.store, s.do) - testKit := testkit.NewTestKit(c, s.store) +func TestDDLPartition(t *testing.T) { + testKit, do, clean := createTestKitAndDom(t) + defer clean() testkit.WithPruneMode(testKit, variable.Static, func() { testKit.MustExec("use test") testKit.MustExec("drop table if exists t") @@ -199,66 +198,65 @@ PARTITION BY RANGE ( a ) ( 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) + require.NoError(t, err) tableInfo := tbl.Meta() h := do.StatsHandle() err = h.HandleDDLEvent(<-h.DDLEventCh()) - c.Assert(err, IsNil) - c.Assert(h.Update(is), IsNil) + require.NoError(t, err) + require.Nil(t, h.Update(is)) pi := tableInfo.GetPartitionInfo() for _, def := range pi.Definitions { statsTbl := h.GetPartitionStats(tableInfo, def.ID) - c.Assert(statsTbl.Pseudo, IsFalse) + require.False(t, statsTbl.Pseudo) } 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) + require.NoError(t, err) is = do.InfoSchema() - c.Assert(h.Update(is), IsNil) + require.Nil(t, h.Update(is)) tbl, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) + require.NoError(t, err) 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, false), Equals, 3.0) + require.False(t, statsTbl.Pseudo) + require.Equal(t, 3.0, statsTbl.Columns[tableInfo.Columns[2].ID].AvgColSize(statsTbl.Count, false)) } addPartition := "alter table t add partition (partition p4 values less than (26))" testKit.MustExec(addPartition) - is = s.do.InfoSchema() + is = do.InfoSchema() tbl, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) + require.NoError(t, err) tableInfo = tbl.Meta() err = h.HandleDDLEvent(<-h.DDLEventCh()) - c.Assert(err, IsNil) - c.Assert(h.Update(is), IsNil) + require.NoError(t, err) + require.Nil(t, h.Update(is)) pi = tableInfo.GetPartitionInfo() for _, def := range pi.Definitions { statsTbl := h.GetPartitionStats(tableInfo, def.ID) - c.Assert(statsTbl.Pseudo, IsFalse) + require.False(t, statsTbl.Pseudo) } truncatePartition := "alter table t truncate partition p4" testKit.MustExec(truncatePartition) - is = s.do.InfoSchema() + is = do.InfoSchema() tbl, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) + require.NoError(t, err) tableInfo = tbl.Meta() err = h.HandleDDLEvent(<-h.DDLEventCh()) - c.Assert(err, IsNil) - c.Assert(h.Update(is), IsNil) + require.NoError(t, err) + require.Nil(t, h.Update(is)) pi = tableInfo.GetPartitionInfo() for _, def := range pi.Definitions { statsTbl := h.GetPartitionStats(tableInfo, def.ID) - c.Assert(statsTbl.Pseudo, IsFalse) + require.False(t, statsTbl.Pseudo) } }) } diff --git a/statistics/handle/dump.go b/statistics/handle/dump.go index b62018447f0ab..4628c18ac1c3a 100644 --- a/statistics/handle/dump.go +++ b/statistics/handle/dump.go @@ -232,14 +232,14 @@ func (h *Handle) loadStatsFromJSON(tableInfo *model.TableInfo, physicalID int64, for _, col := range tbl.Columns { // loadStatsFromJSON doesn't support partition table now. - err = h.SaveStatsToStorage(tbl.PhysicalID, tbl.Count, 0, &col.Histogram, col.CMSketch, col.TopN, col.FMSketch, int(col.StatsVer), 1, false) + err = h.SaveStatsToStorage(tbl.PhysicalID, tbl.Count, 0, &col.Histogram, col.CMSketch, col.TopN, col.FMSketch, int(col.StatsVer), 1, false, false) if err != nil { return errors.Trace(err) } } for _, idx := range tbl.Indices { // loadStatsFromJSON doesn't support partition table now. - err = h.SaveStatsToStorage(tbl.PhysicalID, tbl.Count, 1, &idx.Histogram, idx.CMSketch, idx.TopN, nil, int(idx.StatsVer), 1, false) + err = h.SaveStatsToStorage(tbl.PhysicalID, tbl.Count, 1, &idx.Histogram, idx.CMSketch, idx.TopN, nil, int(idx.StatsVer), 1, false, false) if err != nil { return errors.Trace(err) } diff --git a/statistics/handle/dump_test.go b/statistics/handle/dump_serial_test.go similarity index 56% rename from statistics/handle/dump_test.go rename to statistics/handle/dump_serial_test.go index 478706fba7288..01474870b2e4a 100644 --- a/statistics/handle/dump_test.go +++ b/statistics/handle/dump_serial_test.go @@ -18,17 +18,65 @@ import ( "encoding/json" "fmt" "sync" + "testing" - . "github.com/pingcap/check" + "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/statistics/handle" - "github.com/pingcap/tidb/util/testkit" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/util" + "github.com/stretchr/testify/require" ) -func (s *testStatsSuite) TestConversion(c *C) { - defer cleanEnv(c, s.store, s.do) - tk := testkit.NewTestKit(c, s.store) +func requireTableEqual(t *testing.T, a *statistics.Table, b *statistics.Table) { + require.Equal(t, b.Count, a.Count) + require.Equal(t, b.ModifyCount, a.ModifyCount) + require.Equal(t, len(b.Columns), len(a.Columns)) + for i := range a.Columns { + require.Equal(t, b.Columns[i].Count, a.Columns[i].Count) + require.True(t, statistics.HistogramEqual(&a.Columns[i].Histogram, &b.Columns[i].Histogram, false)) + if a.Columns[i].CMSketch == nil { + require.Nil(t, b.Columns[i].CMSketch) + } else { + require.True(t, a.Columns[i].CMSketch.Equal(b.Columns[i].CMSketch)) + } + // The nil case has been considered in (*TopN).Equal() so we don't need to consider it here. + require.Truef(t, a.Columns[i].TopN.Equal(b.Columns[i].TopN), "%v, %v", a.Columns[i].TopN, b.Columns[i].TopN) + } + require.Equal(t, len(b.Indices), len(a.Indices)) + for i := range a.Indices { + require.True(t, statistics.HistogramEqual(&a.Indices[i].Histogram, &b.Indices[i].Histogram, false)) + if a.Indices[i].CMSketch == nil { + require.Nil(t, b.Indices[i].CMSketch) + } else { + require.True(t, a.Indices[i].CMSketch.Equal(b.Indices[i].CMSketch)) + } + require.True(t, a.Indices[i].TopN.Equal(b.Indices[i].TopN)) + } + require.True(t, isSameExtendedStats(a.ExtendedStats, b.ExtendedStats)) +} + +func cleanStats(tk *testkit.TestKit, do *domain.Domain) { + 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)) + } + tk.MustExec("delete from mysql.stats_meta") + tk.MustExec("delete from mysql.stats_histograms") + tk.MustExec("delete from mysql.stats_buckets") + tk.MustExec("delete from mysql.stats_extended") + tk.MustExec("delete from mysql.stats_fm_sketch") + tk.MustExec("delete from mysql.schema_index_usage") + tk.MustExec("delete from mysql.column_stats_usage") + do.StatsHandle().Clear() +} + +func TestConversion(t *testing.T) { + tk, dom, clean := createTestKitAndDom(t) + defer clean() tk.MustExec("use test") tk.MustExec("create table t (a int, b int)") @@ -36,50 +84,50 @@ func (s *testStatsSuite) TestConversion(c *C) { tk.MustExec("insert into t(a,b) values (3, 1),(2, 1),(1, 10)") tk.MustExec("analyze table t") tk.MustExec("insert into t(a,b) values (1, 1),(3, 1),(5, 10)") - is := s.do.InfoSchema() - h := s.do.StatsHandle() - c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) - c.Assert(h.Update(is), IsNil) + is := dom.InfoSchema() + h := dom.StatsHandle() + require.Nil(t, h.DumpStatsDeltaToKV(handle.DumpAll)) + require.Nil(t, h.Update(is)) tableInfo, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) + require.NoError(t, err) jsonTbl, err := h.DumpStatsToJSON("test", tableInfo.Meta(), nil) - c.Assert(err, IsNil) + require.NoError(t, err) loadTbl, err := handle.TableStatsFromJSON(tableInfo.Meta(), tableInfo.Meta().ID, jsonTbl) - c.Assert(err, IsNil) + require.NoError(t, err) tbl := h.GetTableStats(tableInfo.Meta()) - assertTableEqual(c, loadTbl, tbl) + requireTableEqual(t, loadTbl, tbl) - cleanEnv(c, s.store, s.do) + cleanStats(tk, dom) wg := sync.WaitGroup{} wg.Add(1) go func() { - c.Assert(h.Update(is), IsNil) + require.Nil(t, h.Update(is)) wg.Done() }() err = h.LoadStatsFromJSON(is, jsonTbl) wg.Wait() - c.Assert(err, IsNil) + require.NoError(t, err) loadTblInStorage := h.GetTableStats(tableInfo.Meta()) - assertTableEqual(c, loadTblInStorage, tbl) + requireTableEqual(t, loadTblInStorage, tbl) } -func (s *testStatsSuite) getStatsJSON(c *C, db, tableName string) *handle.JSONTable { - is := s.do.InfoSchema() - h := s.do.StatsHandle() - c.Assert(h.Update(is), IsNil) +func getStatsJSON(t *testing.T, dom *domain.Domain, db, tableName string) *handle.JSONTable { + is := dom.InfoSchema() + h := dom.StatsHandle() + require.Nil(t, h.Update(is)) table, err := is.TableByName(model.NewCIStr(db), model.NewCIStr(tableName)) - c.Assert(err, IsNil) + require.NoError(t, err) tableInfo := table.Meta() jsonTbl, err := h.DumpStatsToJSON("test", tableInfo, nil) - c.Assert(err, IsNil) + require.NoError(t, err) return jsonTbl } -func (s *testStatsSuite) TestDumpGlobalStats(c *C) { - defer cleanEnv(c, s.store, s.do) - tk := testkit.NewTestKit(c, s.store) +func TestDumpGlobalStats(t *testing.T) { + tk, dom, clean := createTestKitAndDom(t) + defer clean() tk.MustExec("use test") tk.MustExec("set @@tidb_analyze_version = 2") tk.MustExec("set @@tidb_partition_prune_mode = 'static'") @@ -89,23 +137,23 @@ func (s *testStatsSuite) TestDumpGlobalStats(c *C) { tk.MustExec("analyze table t") // global-stats is not existed - stats := s.getStatsJSON(c, "test", "t") - c.Assert(stats.Partitions["p0"], NotNil) - c.Assert(stats.Partitions["p1"], NotNil) - c.Assert(stats.Partitions["global"], IsNil) + stats := getStatsJSON(t, dom, "test", "t") + require.NotNil(t, stats.Partitions["p0"]) + require.NotNil(t, stats.Partitions["p1"]) + require.Nil(t, stats.Partitions["global"]) // global-stats is existed tk.MustExec("set @@tidb_partition_prune_mode = 'dynamic'") tk.MustExec("analyze table t") - stats = s.getStatsJSON(c, "test", "t") - c.Assert(stats.Partitions["p0"], NotNil) - c.Assert(stats.Partitions["p1"], NotNil) - c.Assert(stats.Partitions["global"], NotNil) + stats = getStatsJSON(t, dom, "test", "t") + require.NotNil(t, stats.Partitions["p0"]) + require.NotNil(t, stats.Partitions["p1"]) + require.NotNil(t, stats.Partitions["global"]) } -func (s *testStatsSuite) TestLoadGlobalStats(c *C) { - defer cleanEnv(c, s.store, s.do) - tk := testkit.NewTestKit(c, s.store) +func TestLoadGlobalStats(t *testing.T) { + tk, dom, clean := createTestKitAndDom(t) + defer clean() tk.MustExec("use test") tk.MustExec("set @@tidb_analyze_version = 2") tk.MustExec("set @@tidb_partition_prune_mode = 'dynamic'") @@ -113,25 +161,25 @@ func (s *testStatsSuite) TestLoadGlobalStats(c *C) { tk.MustExec("create table t (a int, key(a)) partition by hash(a) partitions 2") tk.MustExec("insert into t values (1), (2)") tk.MustExec("analyze table t") - globalStats := s.getStatsJSON(c, "test", "t") + globalStats := getStatsJSON(t, dom, "test", "t") // remove all statistics tk.MustExec("delete from mysql.stats_meta") tk.MustExec("delete from mysql.stats_histograms") tk.MustExec("delete from mysql.stats_buckets") - s.do.StatsHandle().Clear() - clearedStats := s.getStatsJSON(c, "test", "t") - c.Assert(len(clearedStats.Partitions), Equals, 0) + dom.StatsHandle().Clear() + clearedStats := getStatsJSON(t, dom, "test", "t") + require.Equal(t, 0, len(clearedStats.Partitions)) // load global-stats back - c.Assert(s.do.StatsHandle().LoadStatsFromJSON(s.do.InfoSchema(), globalStats), IsNil) - loadedStats := s.getStatsJSON(c, "test", "t") - c.Assert(len(loadedStats.Partitions), Equals, 3) // p0, p1, global + require.Nil(t, dom.StatsHandle().LoadStatsFromJSON(dom.InfoSchema(), globalStats)) + loadedStats := getStatsJSON(t, dom, "test", "t") + require.Equal(t, 3, len(loadedStats.Partitions)) // p0, p1, global } -func (s *testStatsSuite) TestDumpPartitions(c *C) { - defer cleanEnv(c, s.store, s.do) - tk := testkit.NewTestKit(c, s.store) +func TestDumpPartitions(t *testing.T) { + tk, dom, clean := createTestKitAndDom(t) + defer clean() 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)) @@ -146,15 +194,15 @@ PARTITION BY RANGE ( a ) ( tk.MustExec(fmt.Sprintf(`insert into t values (%d, %d)`, i, i)) } tk.MustExec("analyze table t") - is := s.do.InfoSchema() - h := s.do.StatsHandle() - c.Assert(h.Update(is), IsNil) + is := dom.InfoSchema() + h := dom.StatsHandle() + require.Nil(t, h.Update(is)) table, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) + require.NoError(t, err) tableInfo := table.Meta() jsonTbl, err := h.DumpStatsToJSON("test", tableInfo, nil) - c.Assert(err, IsNil) + require.NoError(t, err) pi := tableInfo.GetPartitionInfo() originTables := make([]*statistics.Table, 0, len(pi.Definitions)) for _, def := range pi.Definitions { @@ -166,47 +214,47 @@ PARTITION BY RANGE ( a ) ( tk.MustExec("delete from mysql.stats_buckets") h.Clear() - err = h.LoadStatsFromJSON(s.do.InfoSchema(), jsonTbl) - c.Assert(err, IsNil) + err = h.LoadStatsFromJSON(dom.InfoSchema(), jsonTbl) + require.NoError(t, err) for i, def := range pi.Definitions { - t := h.GetPartitionStats(tableInfo, def.ID) - assertTableEqual(c, originTables[i], t) + tt := h.GetPartitionStats(tableInfo, def.ID) + requireTableEqual(t, originTables[i], tt) } } -func (s *testStatsSuite) TestDumpAlteredTable(c *C) { - defer cleanEnv(c, s.store, s.do) - tk := testkit.NewTestKit(c, s.store) +func TestDumpAlteredTable(t *testing.T) { + tk, dom, clean := createTestKitAndDom(t) + defer clean() tk.MustExec("use test") tk.MustExec("drop table if exists t") - h := s.do.StatsHandle() + h := dom.StatsHandle() oriLease := h.Lease() h.SetLease(1) defer func() { h.SetLease(oriLease) }() tk.MustExec("create table t(a int, b int)") tk.MustExec("analyze table t") tk.MustExec("alter table t drop column a") - table, err := s.do.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) + table, err := dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) _, err = h.DumpStatsToJSON("test", table.Meta(), nil) - c.Assert(err, IsNil) + require.NoError(t, err) } -func (s *testStatsSuite) TestDumpCMSketchWithTopN(c *C) { +func TestDumpCMSketchWithTopN(t *testing.T) { // Just test if we can store and recover the Top N elements stored in database. - defer cleanEnv(c, s.store, s.do) - testKit := testkit.NewTestKit(c, s.store) + testKit, dom, clean := createTestKitAndDom(t) + defer clean() testKit.MustExec("use test") testKit.MustExec("create table t(a int)") testKit.MustExec("insert into t values (1),(3),(4),(2),(5)") testKit.MustExec("analyze table t") - is := s.do.InfoSchema() + is := dom.InfoSchema() tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) + require.NoError(t, err) tableInfo := tbl.Meta() - h := s.do.StatsHandle() - c.Assert(h.Update(is), IsNil) + h := dom.StatsHandle() + require.Nil(t, h.Update(is)) // Insert 30 fake data fakeData := make([][]byte, 0, 30) @@ -216,81 +264,79 @@ func (s *testStatsSuite) TestDumpCMSketchWithTopN(c *C) { cms, _, _, _ := statistics.NewCMSketchAndTopN(5, 2048, fakeData, 20, 100) stat := h.GetTableStats(tableInfo) - err = h.SaveStatsToStorage(tableInfo.ID, 1, 0, &stat.Columns[tableInfo.Columns[0].ID].Histogram, cms, nil, nil, statistics.Version2, 1, false) - c.Assert(err, IsNil) - c.Assert(h.Update(is), IsNil) + err = h.SaveStatsToStorage(tableInfo.ID, 1, 0, &stat.Columns[tableInfo.Columns[0].ID].Histogram, cms, nil, nil, statistics.Version2, 1, false, false) + require.NoError(t, err) + require.Nil(t, h.Update(is)) stat = h.GetTableStats(tableInfo) cmsFromStore := stat.Columns[tableInfo.Columns[0].ID].CMSketch - c.Assert(cmsFromStore, NotNil) - c.Check(cms.Equal(cmsFromStore), IsTrue) + require.NotNil(t, cmsFromStore) + require.True(t, cms.Equal(cmsFromStore)) jsonTable, err := h.DumpStatsToJSON("test", tableInfo, nil) - c.Check(err, IsNil) + require.NoError(t, err) err = h.LoadStatsFromJSON(is, jsonTable) - c.Check(err, IsNil) + require.NoError(t, err) stat = h.GetTableStats(tableInfo) cmsFromJSON := stat.Columns[tableInfo.Columns[0].ID].CMSketch.Copy() - c.Check(cms.Equal(cmsFromJSON), IsTrue) + require.True(t, cms.Equal(cmsFromJSON)) } -func (s *testStatsSuite) TestDumpPseudoColumns(c *C) { - defer cleanEnv(c, s.store, s.do) - testKit := testkit.NewTestKit(c, s.store) +func TestDumpPseudoColumns(t *testing.T) { + testKit, dom, clean := createTestKitAndDom(t) + defer clean() testKit.MustExec("use test") testKit.MustExec("create table t(a int, b int, index idx(a))") // Force adding an pseudo tables in stats cache. testKit.MustQuery("select * from t") testKit.MustExec("analyze table t index idx") - is := s.do.InfoSchema() + is := dom.InfoSchema() tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) - h := s.do.StatsHandle() + require.NoError(t, err) + h := dom.StatsHandle() _, err = h.DumpStatsToJSON("test", tbl.Meta(), nil) - c.Assert(err, IsNil) + require.NoError(t, err) } -func (s *testStatsSuite) TestDumpExtendedStats(c *C) { - defer cleanEnv(c, s.store, s.do) - tk := testkit.NewTestKit(c, s.store) +func TestDumpExtendedStats(t *testing.T) { + tk, dom, clean := createTestKitAndDom(t) + defer clean() tk.MustExec("set session tidb_enable_extended_stats = on") tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int, b int)") tk.MustExec("insert into t values(1,5),(2,4),(3,3),(4,2),(5,1)") - h := s.do.StatsHandle() - c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) + h := dom.StatsHandle() + require.Nil(t, h.DumpStatsDeltaToKV(handle.DumpAll)) tk.MustExec("alter table t add stats_extended s1 correlation(a,b)") tk.MustExec("analyze table t") - is := s.do.InfoSchema() + is := dom.InfoSchema() tableInfo, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) + require.NoError(t, err) tbl := h.GetTableStats(tableInfo.Meta()) jsonTbl, err := h.DumpStatsToJSON("test", tableInfo.Meta(), nil) - c.Assert(err, IsNil) + require.NoError(t, err) loadTbl, err := handle.TableStatsFromJSON(tableInfo.Meta(), tableInfo.Meta().ID, jsonTbl) - c.Assert(err, IsNil) - assertTableEqual(c, loadTbl, tbl) - - cleanEnv(c, s.store, s.do) - wg := sync.WaitGroup{} - wg.Add(1) - go func() { - c.Assert(h.Update(is), IsNil) - wg.Done() - }() + require.NoError(t, err) + requireTableEqual(t, loadTbl, tbl) + + cleanStats(tk, dom) + wg := util.WaitGroupWrapper{} + wg.Run(func() { + require.Nil(t, h.Update(is)) + }) err = h.LoadStatsFromJSON(is, jsonTbl) wg.Wait() - c.Assert(err, IsNil) + require.NoError(t, err) loadTblInStorage := h.GetTableStats(tableInfo.Meta()) - assertTableEqual(c, loadTblInStorage, tbl) + requireTableEqual(t, loadTblInStorage, tbl) } -func (s *testStatsSuite) TestDumpVer2Stats(c *C) { - defer cleanEnv(c, s.store, s.do) - tk := testkit.NewTestKit(c, s.store) +func TestDumpVer2Stats(t *testing.T) { + tk, dom, clean := createTestKitAndDom(t) + defer clean() tk.MustExec("set @@tidb_analyze_version = 2") tk.MustExec("use test") tk.MustExec("drop table if exists t") @@ -302,39 +348,39 @@ func (s *testStatsSuite) TestDumpVer2Stats(c *C) { tk.MustExec("alter table t add index single(a)") tk.MustExec("alter table t add index multi(a, b)") tk.MustExec("analyze table t with 2 topn") - h := s.do.StatsHandle() - is := s.do.InfoSchema() + h := dom.StatsHandle() + is := dom.InfoSchema() tableInfo, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) + require.NoError(t, err) storageTbl, err := h.TableStatsFromStorage(tableInfo.Meta(), tableInfo.Meta().ID, false, 0) - c.Assert(err, IsNil) + require.NoError(t, err) dumpJSONTable, err := h.DumpStatsToJSON("test", tableInfo.Meta(), nil) - c.Assert(err, IsNil) + require.NoError(t, err) jsonBytes, err := json.MarshalIndent(dumpJSONTable, "", " ") - c.Assert(err, IsNil) + require.NoError(t, err) loadJSONTable := &handle.JSONTable{} err = json.Unmarshal(jsonBytes, loadJSONTable) - c.Assert(err, IsNil) + require.NoError(t, err) loadTbl, err := handle.TableStatsFromJSON(tableInfo.Meta(), tableInfo.Meta().ID, loadJSONTable) - c.Assert(err, IsNil) + require.NoError(t, err) // assert that a statistics.Table from storage dumped into JSON text and then unmarshalled into a statistics.Table keeps unchanged - assertTableEqual(c, loadTbl, storageTbl) + requireTableEqual(t, loadTbl, storageTbl) // assert that this statistics.Table is the same as the one in stats cache statsCacheTbl := h.GetTableStats(tableInfo.Meta()) - assertTableEqual(c, loadTbl, statsCacheTbl) + requireTableEqual(t, loadTbl, statsCacheTbl) err = h.LoadStatsFromJSON(is, loadJSONTable) - c.Assert(err, IsNil) - c.Assert(h.Update(is), IsNil) + require.NoError(t, err) + require.Nil(t, h.Update(is)) statsCacheTbl = h.GetTableStats(tableInfo.Meta()) // assert that after the JSONTable above loaded into storage then updated into the stats cache, // the statistics.Table in the stats cache is the same as the unmarshalled statistics.Table - assertTableEqual(c, statsCacheTbl, loadTbl) + requireTableEqual(t, statsCacheTbl, loadTbl) } diff --git a/statistics/handle/gc.go b/statistics/handle/gc.go index 02862290d2efd..ff95558a0cf4e 100644 --- a/statistics/handle/gc.go +++ b/statistics/handle/gc.go @@ -176,6 +176,12 @@ func (h *Handle) deleteHistStatsFromKV(physicalID int64, histID int64, isIndex i if _, err := exec.ExecuteInternal(ctx, "delete from mysql.stats_fm_sketch where table_id = %? and hist_id = %? and is_index = %?", physicalID, histID, isIndex); err != nil { return err } + if isIndex == 0 { + // delete the record in mysql.column_stats_usage + if _, err = exec.ExecuteInternal(ctx, "delete from mysql.column_stats_usage where table_id = %? and column_id = %?", physicalID, histID); err != nil { + return err + } + } return nil } @@ -221,6 +227,9 @@ func (h *Handle) DeleteTableStatsFromKV(statsIDs []int64) (err error) { if _, err = exec.ExecuteInternal(ctx, "delete from mysql.stats_fm_sketch where table_id = %?", statsID); err != nil { return err } + if _, err = exec.ExecuteInternal(ctx, "delete from mysql.column_stats_usage where table_id = %?", statsID); err != nil { + return err + } } return nil } diff --git a/statistics/handle/gc_test.go b/statistics/handle/gc_serial_test.go similarity index 66% rename from statistics/handle/gc_test.go rename to statistics/handle/gc_serial_test.go index ac54ea337080a..b426613952c4d 100644 --- a/statistics/handle/gc_test.go +++ b/statistics/handle/gc_serial_test.go @@ -15,16 +15,31 @@ package handle_test import ( + "testing" "time" - . "github.com/pingcap/check" + "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/util/testkit" + "github.com/pingcap/tidb/testkit" + "github.com/stretchr/testify/require" ) -func (s *testStatsSuite) TestGCStats(c *C) { - defer cleanEnv(c, s.store, s.do) - testKit := testkit.NewTestKit(c, s.store) +func createTestKitAndDom(t *testing.T) (*testkit.TestKit, *domain.Domain, func()) { + store, dom, err := newStoreWithBootstrap() + require.NoError(t, err) + clean := func() { + dom.Close() + err := store.Close() + require.NoError(t, err) + } + tk := testkit.NewTestKit(t, store) + return tk, dom, clean +} + +func TestGCStats(t *testing.T) { + testKit, dom, clean := createTestKitAndDom(t) + defer clean() + testKit.MustExec("set @@tidb_analyze_version = 1") testKit.MustExec("use test") testKit.MustExec("create table t(a int, b int, index idx(a, b), index idx_a(a))") testKit.MustExec("insert into t values (1,1),(2,2),(3,3)") @@ -33,30 +48,31 @@ func (s *testStatsSuite) TestGCStats(c *C) { testKit.MustExec("alter table t drop index idx") testKit.MustQuery("select count(*) from mysql.stats_histograms").Check(testkit.Rows("4")) testKit.MustQuery("select count(*) from mysql.stats_buckets").Check(testkit.Rows("12")) - h := s.do.StatsHandle() + h := dom.StatsHandle() ddlLease := time.Duration(0) - c.Assert(h.GCStats(s.do.InfoSchema(), ddlLease), IsNil) + require.Nil(t, h.GCStats(dom.InfoSchema(), ddlLease)) testKit.MustQuery("select count(*) from mysql.stats_histograms").Check(testkit.Rows("3")) testKit.MustQuery("select count(*) from mysql.stats_buckets").Check(testkit.Rows("9")) testKit.MustExec("alter table t drop index idx_a") testKit.MustExec("alter table t drop column a") - c.Assert(h.GCStats(s.do.InfoSchema(), ddlLease), IsNil) + require.Nil(t, h.GCStats(dom.InfoSchema(), ddlLease)) testKit.MustQuery("select count(*) from mysql.stats_histograms").Check(testkit.Rows("1")) testKit.MustQuery("select count(*) from mysql.stats_buckets").Check(testkit.Rows("3")) testKit.MustExec("drop table t") - c.Assert(h.GCStats(s.do.InfoSchema(), ddlLease), IsNil) + require.Nil(t, h.GCStats(dom.InfoSchema(), ddlLease)) testKit.MustQuery("select count(*) from mysql.stats_meta").Check(testkit.Rows("1")) 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) + require.Nil(t, h.GCStats(dom.InfoSchema(), ddlLease)) testKit.MustQuery("select count(*) from mysql.stats_meta").Check(testkit.Rows("0")) } -func (s *testStatsSuite) TestGCPartition(c *C) { - defer cleanEnv(c, s.store, s.do) - testKit := testkit.NewTestKit(c, s.store) +func TestGCPartition(t *testing.T) { + testKit, dom, clean := createTestKitAndDom(t) + defer clean() + testKit.MustExec("set @@tidb_analyze_version = 1") testkit.WithPruneMode(testKit, variable.Static, func() { testKit.MustExec("use test") testKit.MustExec("set @@session.tidb_enable_table_partition=1") @@ -69,31 +85,31 @@ func (s *testStatsSuite) TestGCPartition(c *C) { 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 := dom.StatsHandle() ddlLease := time.Duration(0) testKit.MustExec("alter table t drop index idx") - c.Assert(h.GCStats(s.do.InfoSchema(), ddlLease), IsNil) + require.Nil(t, h.GCStats(dom.InfoSchema(), ddlLease)) 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) + require.Nil(t, h.GCStats(dom.InfoSchema(), ddlLease)) 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) + require.Nil(t, h.GCStats(dom.InfoSchema(), ddlLease)) 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) + require.Nil(t, h.GCStats(dom.InfoSchema(), ddlLease)) testKit.MustQuery("select count(*) from mysql.stats_meta").Check(testkit.Rows("0")) }) } -func (s *testStatsSuite) TestGCExtendedStats(c *C) { - defer cleanEnv(c, s.store, s.do) - testKit := testkit.NewTestKit(c, s.store) +func TestGCExtendedStats(t *testing.T) { + testKit, dom, clean := createTestKitAndDom(t) + defer clean() testKit.MustExec("set session tidb_enable_extended_stats = on") testKit.MustExec("use test") testKit.MustExec("create table t(a int, b int, c int)") @@ -111,14 +127,14 @@ func (s *testStatsSuite) TestGCExtendedStats(c *C) { "s1 2 [1,2] 1.000000 1", "s2 2 [2,3] 1.000000 1", )) - h := s.do.StatsHandle() + h := dom.StatsHandle() ddlLease := time.Duration(0) - c.Assert(h.GCStats(s.do.InfoSchema(), ddlLease), IsNil) + require.Nil(t, h.GCStats(dom.InfoSchema(), ddlLease)) testKit.MustQuery("select name, type, column_ids, stats, status from mysql.stats_extended").Sort().Check(testkit.Rows( "s1 2 [1,2] 1.000000 2", "s2 2 [2,3] 1.000000 1", )) - c.Assert(h.GCStats(s.do.InfoSchema(), ddlLease), IsNil) + require.Nil(t, h.GCStats(dom.InfoSchema(), ddlLease)) testKit.MustQuery("select name, type, column_ids, stats, status from mysql.stats_extended").Sort().Check(testkit.Rows( "s2 2 [2,3] 1.000000 1", )) @@ -127,10 +143,30 @@ func (s *testStatsSuite) TestGCExtendedStats(c *C) { testKit.MustQuery("select name, type, column_ids, stats, status from mysql.stats_extended").Sort().Check(testkit.Rows( "s2 2 [2,3] 1.000000 1", )) - c.Assert(h.GCStats(s.do.InfoSchema(), ddlLease), IsNil) + require.Nil(t, h.GCStats(dom.InfoSchema(), ddlLease)) testKit.MustQuery("select name, type, column_ids, stats, status from mysql.stats_extended").Sort().Check(testkit.Rows( "s2 2 [2,3] 1.000000 2", )) - c.Assert(h.GCStats(s.do.InfoSchema(), ddlLease), IsNil) + require.Nil(t, h.GCStats(dom.InfoSchema(), ddlLease)) testKit.MustQuery("select name, type, column_ids, stats, status from mysql.stats_extended").Sort().Check(testkit.Rows()) } + +func TestGCColumnStatsUsage(t *testing.T) { + testKit, dom, clean := createTestKitAndDom(t) + defer clean() + testKit.MustExec("use test") + testKit.MustExec("create table t(a int, b int, c int)") + testKit.MustExec("insert into t values (1,1,1),(2,2,2),(3,3,3)") + testKit.MustExec("analyze table t") + testKit.MustQuery("select count(*) from mysql.column_stats_usage").Check(testkit.Rows("3")) + testKit.MustExec("alter table t drop column a") + testKit.MustQuery("select count(*) from mysql.column_stats_usage").Check(testkit.Rows("3")) + h := dom.StatsHandle() + ddlLease := time.Duration(0) + require.Nil(t, h.GCStats(dom.InfoSchema(), ddlLease)) + testKit.MustQuery("select count(*) from mysql.column_stats_usage").Check(testkit.Rows("2")) + testKit.MustExec("drop table t") + testKit.MustQuery("select count(*) from mysql.column_stats_usage").Check(testkit.Rows("2")) + require.Nil(t, h.GCStats(dom.InfoSchema(), ddlLease)) + testKit.MustQuery("select count(*) from mysql.column_stats_usage").Check(testkit.Rows("0")) +} diff --git a/statistics/handle/handle.go b/statistics/handle/handle.go index 2ae157a146143..0889d00e431e5 100644 --- a/statistics/handle/handle.go +++ b/statistics/handle/handle.go @@ -99,9 +99,15 @@ type Handle struct { // listHead contains all the stats collector required by session. listHead *SessionStatsCollector // globalMap contains all the delta map from collectors when we dump them to KV. - globalMap tableDeltaMap + globalMap struct { + sync.Mutex + data tableDeltaMap + } // feedback is used to store query feedback info. - feedback *statistics.QueryFeedbackMap + feedback struct { + sync.Mutex + data *statistics.QueryFeedbackMap + } lease atomic2.Duration @@ -159,6 +165,7 @@ func (h *Handle) execRestrictedSQLWithSnapshot(ctx context.Context, sql string, // Clear the statsCache, only for test. func (h *Handle) Clear() { + // TODO: Here h.mu seems to protect all the fields of Handle. Is is reasonable? h.mu.Lock() h.statsCache.Lock() h.statsCache.Store(statsCache{tables: make(map[int64]*statistics.Table)}) @@ -167,13 +174,17 @@ func (h *Handle) Clear() { for len(h.ddlEventCh) > 0 { <-h.ddlEventCh } - h.feedback = statistics.NewQueryFeedbackMap() + h.feedback.Lock() + h.feedback.data = statistics.NewQueryFeedbackMap() + h.feedback.Unlock() h.mu.ctx.GetSessionVars().InitChunkSize = 1 h.mu.ctx.GetSessionVars().MaxChunkSize = 1 h.mu.ctx.GetSessionVars().EnableChunkRPC = false h.mu.ctx.GetSessionVars().SetProjectionConcurrency(0) h.listHead = &SessionStatsCollector{mapper: make(tableDeltaMap), rateMap: make(errorRateDeltaMap)} - h.globalMap = make(tableDeltaMap) + h.globalMap.Lock() + h.globalMap.data = make(tableDeltaMap) + h.globalMap.Unlock() h.mu.rateMap = make(errorRateDeltaMap) h.mu.Unlock() } @@ -188,17 +199,16 @@ func NewHandle(ctx sessionctx.Context, lease time.Duration, pool sessionPool) (* handle := &Handle{ ddlEventCh: make(chan *util.Event, 100), listHead: &SessionStatsCollector{mapper: make(tableDeltaMap), rateMap: make(errorRateDeltaMap)}, - globalMap: make(tableDeltaMap), - feedback: statistics.NewQueryFeedbackMap(), idxUsageListHead: &SessionIndexUsageCollector{mapper: make(indexUsageMap)}, pool: pool, } handle.lease.Store(lease) - handle.pool = pool handle.statsCache.memTracker = memory.NewTracker(memory.LabelForStatsCache, -1) handle.mu.ctx = ctx handle.mu.rateMap = make(errorRateDeltaMap) handle.statsCache.Store(statsCache{tables: make(map[int64]*statistics.Table)}) + handle.globalMap.data = make(tableDeltaMap) + handle.feedback.data = statistics.NewQueryFeedbackMap() err := handle.RefreshVars() if err != nil { return nil, err @@ -218,10 +228,12 @@ func (h *Handle) SetLease(lease time.Duration) { // GetQueryFeedback gets the query feedback. It is only used in test. func (h *Handle) GetQueryFeedback() *statistics.QueryFeedbackMap { + h.feedback.Lock() defer func() { - h.feedback = statistics.NewQueryFeedbackMap() + h.feedback.data = statistics.NewQueryFeedbackMap() + h.feedback.Unlock() }() - return h.feedback + return h.feedback.data } // DurationToTS converts duration to timestamp. @@ -322,7 +334,7 @@ type GlobalStats struct { } // MergePartitionStats2GlobalStatsByTableID merge the partition-level stats to global-level stats based on the tableID. -func (h *Handle) MergePartitionStats2GlobalStatsByTableID(sc sessionctx.Context, opts map[ast.AnalyzeOptionType]uint64, is infoschema.InfoSchema, physicalID int64, isIndex int, idxID int64) (globalStats *GlobalStats, err error) { +func (h *Handle) MergePartitionStats2GlobalStatsByTableID(sc sessionctx.Context, opts map[ast.AnalyzeOptionType]uint64, is infoschema.InfoSchema, physicalID int64, isIndex int, histIDs []int64) (globalStats *GlobalStats, err error) { // get the partition table IDs h.mu.Lock() globalTable, ok := h.getTableByPhysicalID(is, physicalID) @@ -332,11 +344,11 @@ func (h *Handle) MergePartitionStats2GlobalStatsByTableID(sc sessionctx.Context, return } globalTableInfo := globalTable.Meta() - return h.mergePartitionStats2GlobalStats(sc, opts, is, globalTableInfo, isIndex, idxID) + return h.mergePartitionStats2GlobalStats(sc, opts, is, globalTableInfo, isIndex, histIDs) } // MergePartitionStats2GlobalStatsByTableID merge the partition-level stats to global-level stats based on the tableInfo. -func (h *Handle) mergePartitionStats2GlobalStats(sc sessionctx.Context, opts map[ast.AnalyzeOptionType]uint64, is infoschema.InfoSchema, globalTableInfo *model.TableInfo, isIndex int, idxID int64) (globalStats *GlobalStats, err error) { +func (h *Handle) mergePartitionStats2GlobalStats(sc sessionctx.Context, opts map[ast.AnalyzeOptionType]uint64, is infoschema.InfoSchema, globalTableInfo *model.TableInfo, isIndex int, histIDs []int64) (globalStats *GlobalStats, err error) { partitionNum := len(globalTableInfo.Partition.Definitions) partitionIDs := make([]int64, 0, partitionNum) for i := 0; i < partitionNum; i++ { @@ -345,20 +357,16 @@ func (h *Handle) mergePartitionStats2GlobalStats(sc sessionctx.Context, opts map // initialized the globalStats globalStats = new(GlobalStats) - var validColStatsIdx []int - if isIndex == 0 { - validColStatsIdx = make([]int, 0, len(globalTableInfo.Columns)) - for i, col := range globalTableInfo.Columns { + if len(histIDs) == 0 { + for _, col := range globalTableInfo.Columns { // The virtual generated column stats can not be merged to the global stats. if col.IsGenerated() && !col.GeneratedStored { continue } - validColStatsIdx = append(validColStatsIdx, i) + histIDs = append(histIDs, col.ID) } - globalStats.Num = len(validColStatsIdx) - } else { - globalStats.Num = 1 } + globalStats.Num = len(histIDs) globalStats.Count = 0 globalStats.Hg = make([]*statistics.Histogram, globalStats.Num) globalStats.Cms = make([]*statistics.CMSketch, globalStats.Num) @@ -402,7 +410,7 @@ func (h *Handle) mergePartitionStats2GlobalStats(sc sessionctx.Context, opts map } else { indexName := "" for _, idx := range tableInfo.Indices { - if idx.ID == idxID { + if idx.ID == histIDs[0] { indexName = idx.Name.L } } @@ -412,13 +420,7 @@ func (h *Handle) mergePartitionStats2GlobalStats(sc sessionctx.Context, opts map return } for i := 0; i < globalStats.Num; i++ { - // If the statistics is the index stats, we should use the index ID. - ID := idxID - if isIndex == 0 { - // If the statistics is the column stats, we should use the column ID to replace the index ID. - ID = tableInfo.Columns[validColStatsIdx[i]].ID - } - count, hg, cms, topN, fms := partitionStats.GetStatsInfo(ID, isIndex == 1) + count, hg, cms, topN, fms := partitionStats.GetStatsInfo(histIDs[i], isIndex == 1) if i == 0 { // In a partition, we will only update globalStats.Count once globalStats.Count += count @@ -645,10 +647,10 @@ func (h *Handle) LoadNeededHistograms() (err error) { CMSketch: cms, TopN: topN, FMSketch: fms, - Count: int64(hg.TotalRowCount()), IsHandle: c.IsHandle, StatsVer: rows[0].GetInt64(0), } + // Column.Count is calculated by Column.TotalRowCount(). Hence we don't set Column.Count when initializing colHist. colHist.Count = int64(colHist.TotalRowCount()) // Reload the latest stats cache, otherwise the `updateStatsCache` may fail with high probability, because functions // like `GetPartitionStats` called in `fmSketchFromStorage` would have modified the stats cache already. @@ -831,12 +833,12 @@ func (h *Handle) columnStatsFromStorage(reader *statsReader, row chunk.Row, tabl CMSketch: cms, TopN: topN, FMSketch: fmSketch, - Count: int64(hg.TotalRowCount()), ErrorRate: errorRate, IsHandle: tableInfo.PKIsHandle && mysql.HasPriKeyFlag(colInfo.Flag), Flag: flag, StatsVer: statsVer, } + // Column.Count is calculated by Column.TotalRowCount(). Hence we don't set Column.Count when initializing col. col.Count = int64(col.TotalRowCount()) lastAnalyzePos.Copy(&col.LastAnalyzePos) break @@ -1120,6 +1122,11 @@ func (h *Handle) SaveTableStatsToStorage(results *statistics.AnalyzeResults, nee return err } } + if result.IsIndex == 0 { + if _, err = exec.ExecuteInternal(ctx, "insert into mysql.column_stats_usage (table_id, column_id, last_analyzed_at) values(%?, %?, current_timestamp()) on duplicate key update last_analyzed_at = current_timestamp()", tableID, hg.ID); err != nil { + return err + } + } } } // 3. Save extended statistics. @@ -1149,7 +1156,8 @@ func (h *Handle) SaveTableStatsToStorage(results *statistics.AnalyzeResults, nee } // SaveStatsToStorage saves the stats to storage. -func (h *Handle) SaveStatsToStorage(tableID int64, count int64, isIndex int, hg *statistics.Histogram, cms *statistics.CMSketch, topN *statistics.TopN, fms *statistics.FMSketch, statsVersion int, isAnalyzed int64, needDumpFMS bool) (err error) { +// TODO: refactor to reduce the number of parameters +func (h *Handle) SaveStatsToStorage(tableID int64, count int64, isIndex int, hg *statistics.Histogram, cms *statistics.CMSketch, topN *statistics.TopN, fms *statistics.FMSketch, statsVersion int, isAnalyzed int64, needDumpFMS bool, updateAnalyzeTime bool) (err error) { h.mu.Lock() defer h.mu.Unlock() ctx := context.TODO() @@ -1243,6 +1251,11 @@ func (h *Handle) SaveStatsToStorage(tableID int64, count int64, isIndex int, hg return err } } + if updateAnalyzeTime && isIndex == 0 { + if _, err = exec.ExecuteInternal(ctx, "insert into mysql.column_stats_usage (table_id, column_id, last_analyzed_at) values(%?, %?, current_timestamp()) on duplicate key update last_analyzed_at = current_timestamp()", tableID, hg.ID); err != nil { + return err + } + } return } @@ -1468,6 +1481,15 @@ func (h *Handle) InsertExtendedStats(statsName string, colIDs []int64, tp int, t return errors.Errorf("extended statistics '%s' with same type on same columns already exists", statsName) } } + txn, err := h.mu.ctx.Txn(true) + if err != nil { + return errors.Trace(err) + } + version := txn.StartTS() + // Bump version in `mysql.stats_meta` to trigger stats cache refresh. + if _, err = exec.ExecuteInternal(ctx, "UPDATE mysql.stats_meta SET version = %? WHERE table_id = %?", version, tableID); err != nil { + return err + } // Remove the existing 'deleted' records. if _, err = exec.ExecuteInternal(ctx, "DELETE FROM mysql.stats_extended WHERE name = %? and table_id = %?", statsName, tableID); err != nil { return err @@ -1478,17 +1500,10 @@ func (h *Handle) InsertExtendedStats(statsName string, colIDs []int64, tp int, t // the record from the table, tidb-b should delete the cached item synchronously. While for tidb-c, it has to wait for // next `Update()` to remove the cached item then. h.removeExtendedStatsItem(tableID, statsName) - txn, err := h.mu.ctx.Txn(true) - if err != nil { - return errors.Trace(err) - } - version := txn.StartTS() const sql = "INSERT INTO mysql.stats_extended(name, type, table_id, column_ids, version, status) VALUES (%?, %?, %?, %?, %?, %?)" if _, err = exec.ExecuteInternal(ctx, sql, statsName, tp, tableID, strColIDs, version, StatsStatusInited); err != nil { return err } - // Bump version in `mysql.stats_meta` to trigger stats cache refresh. - _, err = exec.ExecuteInternal(ctx, "UPDATE mysql.stats_meta SET version = %? WHERE table_id = %?", version, tableID) return } @@ -1528,10 +1543,10 @@ func (h *Handle) MarkExtendedStatsDeleted(statsName string, tableID int64, ifExi return errors.Trace(err) } version := txn.StartTS() - if _, err = exec.ExecuteInternal(ctx, "UPDATE mysql.stats_extended SET version = %?, status = %? WHERE name = %? and table_id = %?", version, StatsStatusDeleted, statsName, tableID); err != nil { + if _, err = exec.ExecuteInternal(ctx, "UPDATE mysql.stats_meta SET version = %? WHERE table_id = %?", version, tableID); err != nil { return err } - if _, err = exec.ExecuteInternal(ctx, "UPDATE mysql.stats_meta SET version = %? WHERE table_id = %?", version, tableID); err != nil { + if _, err = exec.ExecuteInternal(ctx, "UPDATE mysql.stats_extended SET version = %?, status = %? WHERE name = %? and table_id = %?", version, StatsStatusDeleted, statsName, tableID); err != nil { return err } return nil @@ -1805,3 +1820,28 @@ func (h *Handle) LoadColumnStatsUsage() (map[model.TableColumnID]colStatsUsage, } return colStatsMap, nil } + +// CollectColumnsInExtendedStats returns IDs of the columns involved in extended stats. +func (h *Handle) CollectColumnsInExtendedStats(tableID int64) ([]int64, error) { + ctx := context.Background() + const sql = "SELECT name, type, column_ids FROM mysql.stats_extended WHERE table_id = %? and status in (%?, %?)" + rows, _, err := h.execRestrictedSQL(ctx, sql, tableID, StatsStatusAnalyzed, StatsStatusInited) + if err != nil { + return nil, errors.Trace(err) + } + if len(rows) == 0 { + return nil, nil + } + columnIDs := make([]int64, 0, len(rows)*2) + for _, row := range rows { + twoIDs := make([]int64, 0, 2) + data := row.GetString(2) + err := json.Unmarshal([]byte(data), &twoIDs) + if err != nil { + logutil.BgLogger().Error("invalid column_ids in mysql.stats_extended, skip collecting extended stats for this row", zap.String("column_ids", data), zap.Error(err)) + continue + } + columnIDs = append(columnIDs, twoIDs...) + } + return columnIDs, nil +} diff --git a/statistics/handle/handle_test.go b/statistics/handle/handle_test.go index 2e80177a84572..70ec989f7bca6 100644 --- a/statistics/handle/handle_test.go +++ b/statistics/handle/handle_test.go @@ -27,10 +27,11 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/session" - "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/statistics/handle" @@ -38,6 +39,7 @@ import ( "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/israce" + "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/ranger" "github.com/pingcap/tidb/util/testkit" "github.com/tikv/client-go/v2/oracle" @@ -47,6 +49,7 @@ func TestT(t *testing.T) { TestingT(t) } +// TODO replace cleanEnv with createTestKitAndDom in gc_series_test.go when migrate this file func cleanEnv(c *C, store kv.Storage, do *domain.Domain) { tk := testkit.NewTestKit(c, store) tk.MustExec("use test") @@ -264,8 +267,7 @@ func (s *testStatsSuite) TestEmptyTable(c *C) { c.Assert(err, IsNil) tableInfo := tbl.Meta() statsTbl := do.StatsHandle().GetTableStats(tableInfo) - sc := new(stmtctx.StatementContext) - count := statsTbl.ColumnGreaterRowCount(sc, types.NewDatum(1), tableInfo.Columns[0].ID) + count := statsTbl.ColumnGreaterRowCount(mock.NewContext(), types.NewDatum(1), tableInfo.Columns[0].ID) c.Assert(count, Equals, 0.0) } @@ -282,14 +284,14 @@ func (s *testStatsSuite) TestColumnIDs(c *C) { c.Assert(err, IsNil) tableInfo := tbl.Meta() statsTbl := do.StatsHandle().GetTableStats(tableInfo) - sc := new(stmtctx.StatementContext) + sctx := mock.NewContext() ran := &ranger.Range{ LowVal: []types.Datum{types.MinNotNullDatum()}, HighVal: []types.Datum{types.NewIntDatum(2)}, LowExclude: false, HighExclude: true, } - count, err := statsTbl.GetRowCountByColumnRanges(sc, tableInfo.Columns[0].ID, []*ranger.Range{ran}) + count, err := statsTbl.GetRowCountByColumnRanges(sctx, tableInfo.Columns[0].ID, []*ranger.Range{ran}) c.Assert(err, IsNil) c.Assert(count, Equals, float64(1)) @@ -304,7 +306,7 @@ func (s *testStatsSuite) TestColumnIDs(c *C) { tableInfo = tbl.Meta() statsTbl = do.StatsHandle().GetTableStats(tableInfo) // At that time, we should get c2's stats instead of c1's. - count, err = statsTbl.GetRowCountByColumnRanges(sc, tableInfo.Columns[0].ID, []*ranger.Range{ran}) + count, err = statsTbl.GetRowCountByColumnRanges(sctx, tableInfo.Columns[0].ID, []*ranger.Range{ran}) c.Assert(err, IsNil) c.Assert(count, Equals, 0.0) } @@ -611,7 +613,7 @@ func (s *testStatsSuite) TestLoadStats(c *C) { c.Assert(hg.Len(), Equals, 0) cms = stat.Columns[tableInfo.Columns[2].ID].CMSketch c.Assert(cms, IsNil) - _, err = stat.ColumnEqualRowCount(testKit.Se.GetSessionVars().StmtCtx, types.NewIntDatum(1), tableInfo.Columns[2].ID) + _, err = stat.ColumnEqualRowCount(testKit.Se, types.NewIntDatum(1), tableInfo.Columns[2].ID) c.Assert(err, IsNil) c.Assert(h.LoadNeededHistograms(), IsNil) stat = h.GetTableStats(tableInfo) @@ -903,13 +905,39 @@ func (s *testSerialStatsSuite) prepareForGlobalStatsWithOpts(c *C, tk *testkit.T } // nolint:unused -func (s *testSerialStatsSuite) checkForGlobalStatsWithOpts(c *C, tk *testkit.TestKit, t string, p string, topn, buckets int) { +func (s *testSerialStatsSuite) checkForGlobalStatsWithOpts(c *C, tk *testkit.TestKit, db, t, p string, topn, buckets int) { + tbl, err := s.do.InfoSchema().TableByName(model.NewCIStr(db), model.NewCIStr(t)) + c.Assert(err, IsNil) + + tblInfo := tbl.Meta() + physicalID := tblInfo.ID + if p != "global" { + for _, def := range tbl.Meta().GetPartitionInfo().Definitions { + if def.Name.L == p { + physicalID = def.ID + } + } + } + tblStats, err := s.do.StatsHandle().TableStatsFromStorage(tblInfo, physicalID, true, 0) + c.Assert(err, IsNil) + delta := buckets/2 + 10 - for _, isIdx := range []int{0, 1} { - c.Assert(len(tk.MustQuery(fmt.Sprintf("show stats_topn where table_name='%v' and partition_name='%v' and is_index=%v", t, p, isIdx)).Rows()), Equals, topn) - numBuckets := len(tk.MustQuery(fmt.Sprintf("show stats_buckets where table_name='%v' and partition_name='%v' and is_index=%v", t, p, isIdx)).Rows()) + for _, idxStats := range tblStats.Indices { + numTopN := idxStats.TopN.Num() + numBuckets := len(idxStats.Buckets) // since the hist-building algorithm doesn't stipulate the final bucket number to be equal to the expected number exactly, // we have to check the results by a range here. + c.Assert(numTopN, Equals, topn) + c.Assert(numBuckets, GreaterEqual, buckets-delta) + c.Assert(numBuckets, LessEqual, buckets+delta) + } + for _, colStats := range tblStats.Columns { + if len(colStats.Buckets) == 0 { + continue // it's not loaded + } + numTopN := colStats.TopN.Num() + numBuckets := len(colStats.Buckets) + c.Assert(numTopN, Equals, topn) c.Assert(numBuckets, GreaterEqual, buckets-delta) c.Assert(numBuckets, LessEqual, buckets+delta) } @@ -944,9 +972,9 @@ func (s *testSerialStatsSuite) TestAnalyzeGlobalStatsWithOpts(c *C) { sql := fmt.Sprintf("analyze table test_gstats_opt with %v topn, %v buckets", ca.topn, ca.buckets) if !ca.err { tk.MustExec(sql) - s.checkForGlobalStatsWithOpts(c, tk, "test_gstats_opt", "global", ca.topn, ca.buckets) - s.checkForGlobalStatsWithOpts(c, tk, "test_gstats_opt", "p0", ca.topn, ca.buckets) - s.checkForGlobalStatsWithOpts(c, tk, "test_gstats_opt", "p1", ca.topn, ca.buckets) + s.checkForGlobalStatsWithOpts(c, tk, "test_gstats_opt", "test_gstats_opt", "global", ca.topn, ca.buckets) + s.checkForGlobalStatsWithOpts(c, tk, "test_gstats_opt", "test_gstats_opt", "p0", ca.topn, ca.buckets) + s.checkForGlobalStatsWithOpts(c, tk, "test_gstats_opt", "test_gstats_opt", "p1", ca.topn, ca.buckets) } else { err := tk.ExecToErr(sql) c.Assert(err, NotNil) @@ -963,25 +991,25 @@ func (s *testSerialStatsSuite) TestAnalyzeGlobalStatsWithOpts2(c *C) { s.prepareForGlobalStatsWithOpts(c, tk, "test_gstats_opt2", "test_gstats_opt2") tk.MustExec("analyze table test_gstats_opt2 with 20 topn, 50 buckets, 1000 samples") - s.checkForGlobalStatsWithOpts(c, tk, "test_gstats_opt2", "global", 2, 50) - s.checkForGlobalStatsWithOpts(c, tk, "test_gstats_opt2", "p0", 1, 50) - s.checkForGlobalStatsWithOpts(c, tk, "test_gstats_opt2", "p1", 1, 50) + s.checkForGlobalStatsWithOpts(c, tk, "test_gstats_opt2", "test_gstats_opt2", "global", 2, 50) + s.checkForGlobalStatsWithOpts(c, tk, "test_gstats_opt2", "test_gstats_opt2", "p0", 1, 50) + s.checkForGlobalStatsWithOpts(c, tk, "test_gstats_opt2", "test_gstats_opt2", "p1", 1, 50) // analyze a partition to let its options be different with others' tk.MustExec("analyze table test_gstats_opt2 partition p0 with 10 topn, 20 buckets") - s.checkForGlobalStatsWithOpts(c, tk, "test_gstats_opt2", "global", 10, 20) // use new options - s.checkForGlobalStatsWithOpts(c, tk, "test_gstats_opt2", "p0", 10, 20) - s.checkForGlobalStatsWithOpts(c, tk, "test_gstats_opt2", "p1", 1, 50) + s.checkForGlobalStatsWithOpts(c, tk, "test_gstats_opt2", "test_gstats_opt2", "global", 10, 20) // use new options + s.checkForGlobalStatsWithOpts(c, tk, "test_gstats_opt2", "test_gstats_opt2", "p0", 10, 20) + s.checkForGlobalStatsWithOpts(c, tk, "test_gstats_opt2", "test_gstats_opt2", "p1", 1, 50) tk.MustExec("analyze table test_gstats_opt2 partition p1 with 100 topn, 200 buckets") - s.checkForGlobalStatsWithOpts(c, tk, "test_gstats_opt2", "global", 100, 200) - s.checkForGlobalStatsWithOpts(c, tk, "test_gstats_opt2", "p0", 10, 20) - s.checkForGlobalStatsWithOpts(c, tk, "test_gstats_opt2", "p1", 100, 200) + s.checkForGlobalStatsWithOpts(c, tk, "test_gstats_opt2", "test_gstats_opt2", "global", 100, 200) + s.checkForGlobalStatsWithOpts(c, tk, "test_gstats_opt2", "test_gstats_opt2", "p0", 10, 20) + s.checkForGlobalStatsWithOpts(c, tk, "test_gstats_opt2", "test_gstats_opt2", "p1", 100, 200) tk.MustExec("analyze table test_gstats_opt2 partition p0 with 20 topn") // change back to 20 topn - s.checkForGlobalStatsWithOpts(c, tk, "test_gstats_opt2", "global", 20, 256) - s.checkForGlobalStatsWithOpts(c, tk, "test_gstats_opt2", "p0", 20, 256) - s.checkForGlobalStatsWithOpts(c, tk, "test_gstats_opt2", "p1", 100, 200) + s.checkForGlobalStatsWithOpts(c, tk, "test_gstats_opt2", "test_gstats_opt2", "global", 20, 256) + s.checkForGlobalStatsWithOpts(c, tk, "test_gstats_opt2", "test_gstats_opt2", "p0", 20, 256) + s.checkForGlobalStatsWithOpts(c, tk, "test_gstats_opt2", "test_gstats_opt2", "p1", 100, 200) } func (s *testStatsSuite) TestGlobalStatsHealthy(c *C) { @@ -2175,6 +2203,7 @@ func (s *testStatsSuite) TestFMSWithAnalyzePartition(c *C) { tk.MustQuery("select count(*) from mysql.stats_fm_sketch").Check(testkit.Rows("0")) tk.MustExec("analyze table t partition p0 with 1 topn, 2 buckets") tk.MustQuery("show warnings").Sort().Check(testkit.Rows( + "Note 1105 Analyze use auto adjusted sample rate 1.000000 for table test.t's partition p0.", "Warning 8131 Build table: `t` global-level stats failed due to missing partition-level stats", "Warning 8131 Build table: `t` index: `a` global-level stats failed due to missing partition-level stats", )) @@ -3074,3 +3103,518 @@ func (s *testStatsSuite) TestIncrementalModifyCountUpdate(c *C) { c.Assert(failpoint.Disable("github.com/pingcap/tidb/executor/injectBaseCount"), IsNil) c.Assert(failpoint.Disable("github.com/pingcap/tidb/executor/injectBaseModifyCount"), IsNil) } + +func (s *testStatsSuite) TestAnalyzeColumnsWithPrimaryKey(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("set @@tidb_analyze_version = 2") + tk.MustExec("create table t (a int, b int, c int primary key)") + tk.MustExec("insert into t values (1,1,1), (1,1,2), (2,2,3), (2,2,4), (3,3,5), (4,3,6), (5,4,7), (6,4,8), (null,null,9)") + c.Assert(s.do.StatsHandle().DumpStatsDeltaToKV(handle.DumpAll), IsNil) + + is := s.do.InfoSchema() + tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + tblID := tbl.Meta().ID + + tk.MustExec("analyze table t columns a with 2 topn, 2 buckets") + tk.MustQuery("show warnings").Sort().Check(testkit.Rows( + "Note 1105 Analyze use auto adjusted sample rate 1.000000 for table test.t.", + "Warning 1105 Columns c are missing in ANALYZE but their stats are needed for calculating stats for indexes/primary key/extended stats.", + )) + rows := tk.MustQuery("show column_stats_usage where db_name = 'test' and table_name = 't' and last_analyzed_at is not null").Sort().Rows() + c.Assert(len(rows), Equals, 2) + c.Assert(rows[0][3], Equals, "a") + c.Assert(rows[1][3], Equals, "c") + + tk.MustQuery(fmt.Sprintf("select modify_count, count from mysql.stats_meta where table_id = %d", tblID)).Sort().Check( + testkit.Rows("0 9")) + tk.MustQuery("show stats_topn where db_name = 'test' and table_name = 't'").Sort().Check( + // db, tbl, part, col, is_idx, value, count + testkit.Rows("test t a 0 1 2", + "test t a 0 2 2", + "test t c 0 1 1", + "test t c 0 2 1")) + tk.MustQuery(fmt.Sprintf("select is_index, hist_id, distinct_count, null_count, tot_col_size, stats_ver, truncate(correlation,2) from mysql.stats_histograms where table_id = %d", tblID)).Sort().Check( + testkit.Rows("0 1 6 1 8 2 1", + "0 2 0 0 8 0 0", // column b is not analyzed + "0 3 9 0 9 2 1", + )) + tk.MustQuery("show stats_buckets where db_name = 'test' and table_name = 't'").Sort().Check( + // db, tbl, part, col, is_index, bucket_id, count, repeats, lower, upper, ndv + testkit.Rows("test t a 0 0 3 1 3 5 0", + "test t a 0 1 4 1 6 6 0", + "test t c 0 0 4 1 3 6 0", + "test t c 0 1 7 1 7 9 0")) +} + +func (s *testStatsSuite) TestAnalyzeColumnsWithIndex(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("set @@tidb_analyze_version = 2") + tk.MustExec("create table t (a int, b int, c int, d int, index idx_b_d(b, d))") + tk.MustExec("insert into t values (1,1,null,1), (2,1,9,1), (1,1,8,1), (2,2,7,2), (1,3,7,3), (2,4,6,4), (1,4,6,5), (2,4,6,5), (1,5,6,5)") + c.Assert(s.do.StatsHandle().DumpStatsDeltaToKV(handle.DumpAll), IsNil) + + is := s.do.InfoSchema() + tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + tblID := tbl.Meta().ID + + tk.MustExec("analyze table t columns c with 2 topn, 2 buckets") + tk.MustQuery("show warnings").Sort().Check(testkit.Rows( + "Note 1105 Analyze use auto adjusted sample rate 1.000000 for table test.t.", + "Warning 1105 Columns b,d are missing in ANALYZE but their stats are needed for calculating stats for indexes/primary key/extended stats.", + )) + rows := tk.MustQuery("show column_stats_usage where db_name = 'test' and table_name = 't' and last_analyzed_at is not null").Sort().Rows() + c.Assert(len(rows), Equals, 3) + c.Assert(rows[0][3], Equals, "b") + c.Assert(rows[1][3], Equals, "c") + c.Assert(rows[2][3], Equals, "d") + + tk.MustQuery(fmt.Sprintf("select modify_count, count from mysql.stats_meta where table_id = %d", tblID)).Sort().Check( + testkit.Rows("0 9")) + tk.MustQuery("show stats_topn where db_name = 'test' and table_name = 't'").Sort().Check( + // db, tbl, part, col, is_idx, value, count + testkit.Rows("test t b 0 1 3", + "test t b 0 4 3", + "test t c 0 6 4", + "test t c 0 7 2", + "test t d 0 1 3", + "test t d 0 5 3", + "test t idx_b_d 1 (1, 1) 3", + "test t idx_b_d 1 (4, 5) 2")) + tk.MustQuery(fmt.Sprintf("select is_index, hist_id, distinct_count, null_count, tot_col_size, stats_ver, truncate(correlation,2) from mysql.stats_histograms where table_id = %d", tblID)).Sort().Check( + testkit.Rows("0 1 0 0 9 0 0", // column a is not analyzed + "0 2 5 0 9 2 1", + "0 3 4 1 8 2 -0.07", + "0 4 5 0 9 2 1", + "1 1 6 0 18 2 0")) + tk.MustQuery("show stats_buckets where db_name = 'test' and table_name = 't'").Sort().Check( + // db, tbl, part, col, is_index, bucket_id, count, repeats, lower, upper, ndv + testkit.Rows("test t b 0 0 2 1 2 3 0", + "test t b 0 1 3 1 5 5 0", + "test t c 0 0 2 1 8 9 0", + "test t d 0 0 2 1 2 3 0", + "test t d 0 1 3 1 4 4 0", + "test t idx_b_d 1 0 3 1 (2, 2) (4, 4) 0", + "test t idx_b_d 1 1 4 1 (5, 5) (5, 5) 0")) +} + +func (s *testStatsSuite) TestAnalyzeColumnsWithClusteredIndex(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("set @@tidb_analyze_version = 2") + tk.MustExec("create table t (a int, b int, c int, d int, primary key(b, d) clustered)") + tk.MustExec("insert into t values (1,1,null,1), (2,2,9,2), (1,3,8,3), (2,4,7,4), (1,5,7,5), (2,6,6,6), (1,7,6,7), (2,8,6,8), (1,9,6,9)") + c.Assert(s.do.StatsHandle().DumpStatsDeltaToKV(handle.DumpAll), IsNil) + + is := s.do.InfoSchema() + tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + tblID := tbl.Meta().ID + + tk.MustExec("analyze table t columns c with 2 topn, 2 buckets") + tk.MustQuery("show warnings").Sort().Check(testkit.Rows( + "Note 1105 Analyze use auto adjusted sample rate 1.000000 for table test.t.", + "Warning 1105 Columns b,d are missing in ANALYZE but their stats are needed for calculating stats for indexes/primary key/extended stats.", + )) + rows := tk.MustQuery("show column_stats_usage where db_name = 'test' and table_name = 't' and last_analyzed_at is not null").Sort().Rows() + c.Assert(len(rows), Equals, 3) + c.Assert(rows[0][3], Equals, "b") + c.Assert(rows[1][3], Equals, "c") + c.Assert(rows[2][3], Equals, "d") + + tk.MustQuery(fmt.Sprintf("select modify_count, count from mysql.stats_meta where table_id = %d", tblID)).Sort().Check( + testkit.Rows("0 9")) + tk.MustQuery("show stats_topn where db_name = 'test' and table_name = 't'").Sort().Check( + // db, tbl, part, col, is_idx, value, count + testkit.Rows("test t PRIMARY 1 (1, 1) 1", + "test t PRIMARY 1 (2, 2) 1", + "test t b 0 1 1", + "test t b 0 2 1", + "test t c 0 6 4", + "test t c 0 7 2", + "test t d 0 1 1", + "test t d 0 2 1")) + tk.MustQuery(fmt.Sprintf("select is_index, hist_id, distinct_count, null_count, tot_col_size, stats_ver, truncate(correlation,2) from mysql.stats_histograms where table_id = %d", tblID)).Sort().Check( + testkit.Rows("0 1 0 0 9 0 0", // column a is not analyzed + "0 2 9 0 9 2 1", + "0 3 4 1 8 2 -0.07", + "0 4 9 0 9 2 1", + "1 1 9 0 18 2 0")) + tk.MustQuery("show stats_buckets where db_name = 'test' and table_name = 't'").Sort().Check( + // db, tbl, part, col, is_index, bucket_id, count, repeats, lower, upper, ndv + testkit.Rows("test t PRIMARY 1 0 4 1 (3, 3) (6, 6) 0", + "test t PRIMARY 1 1 7 1 (7, 7) (9, 9) 0", + "test t b 0 0 4 1 3 6 0", + "test t b 0 1 7 1 7 9 0", + "test t c 0 0 2 1 8 9 0", + "test t d 0 0 4 1 3 6 0", + "test t d 0 1 7 1 7 9 0")) +} + +func (s *testStatsSuite) TestAnalyzeColumnsError(c *C) { + defer cleanEnv(c, s.store, s.do) + 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)") + + // analyze version 1 doesn't support `ANALYZE COLUMNS c1, ..., cn` currently + tk.MustExec("set @@tidb_analyze_version = 1") + err := tk.ExecToErr("analyze table t columns a") + c.Assert(err.Error(), Equals, "Only the analyze version 2 supports analyzing the specified columns") + + // invalid column + tk.MustExec("set @@tidb_analyze_version = 2") + err = tk.ExecToErr("analyze table t columns c") + terr := errors.Cause(err).(*terror.Error) + c.Assert(terr.Code(), Equals, errors.ErrCode(errno.ErrAnalyzeMissColumn)) +} + +func (s *testStatsSuite) TestAnalyzeColumnsWithDynamicPartitionTable(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("set @@tidb_analyze_version = 2") + tk.MustExec("set @@tidb_partition_prune_mode = 'dynamic'") + tk.MustExec("create table t (a int, b int, c int, index idx(c)) partition by range (a) (partition p0 values less than (10), partition p1 values less than maxvalue)") + tk.MustExec("insert into t values (1,2,1), (2,4,1), (3,6,1), (4,8,2), (4,8,2), (5,10,3), (5,10,4), (5,10,5), (null,null,6), (11,22,7), (12,24,8), (13,26,9), (14,28,10), (15,30,11), (16,32,12), (16,32,13), (16,32,13), (16,32,14), (17,34,14), (17,34,14)") + c.Assert(s.do.StatsHandle().DumpStatsDeltaToKV(handle.DumpAll), IsNil) + + is := s.do.InfoSchema() + tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + tblID := tbl.Meta().ID + defs := tbl.Meta().Partition.Definitions + p0ID := defs[0].ID + p1ID := defs[1].ID + + tk.MustExec("analyze table t columns a with 2 topn, 2 buckets") + tk.MustQuery("show warnings").Sort().Check(testkit.Rows( + "Note 1105 Analyze use auto adjusted sample rate 1.000000 for table test.t's partition p0.", + "Note 1105 Analyze use auto adjusted sample rate 1.000000 for table test.t's partition p1.", + "Warning 1105 Columns c are missing in ANALYZE but their stats are needed for calculating stats for indexes/primary key/extended stats.", + )) + rows := tk.MustQuery("show column_stats_usage where db_name = 'test' and table_name = 't' and last_analyzed_at is not null").Sort().Rows() + c.Assert(len(rows), Equals, 6) + c.Assert(rows[0][:4], DeepEquals, []interface{}{"test", "t", "global", "a"}) + c.Assert(rows[1][:4], DeepEquals, []interface{}{"test", "t", "global", "c"}) + c.Assert(rows[2][:4], DeepEquals, []interface{}{"test", "t", "p0", "a"}) + c.Assert(rows[3][:4], DeepEquals, []interface{}{"test", "t", "p0", "c"}) + c.Assert(rows[4][:4], DeepEquals, []interface{}{"test", "t", "p1", "a"}) + c.Assert(rows[5][:4], DeepEquals, []interface{}{"test", "t", "p1", "c"}) + + rows = tk.MustQuery("show stats_meta where db_name = 'test' and table_name = 't'").Sort().Rows() + c.Assert(len(rows), Equals, 3) + c.Assert(append(rows[0][:3], rows[0][4:]...), DeepEquals, []interface{}{"test", "t", "global", "0", "20"}) + c.Assert(append(rows[1][:3], rows[1][4:]...), DeepEquals, []interface{}{"test", "t", "p0", "0", "9"}) + c.Assert(append(rows[2][:3], rows[2][4:]...), DeepEquals, []interface{}{"test", "t", "p1", "0", "11"}) + + tk.MustQuery("show stats_topn where db_name = 'test' and table_name = 't' and is_index = 0").Sort().Check( + // db, tbl, part, col, is_idx, value, count + testkit.Rows("test t global a 0 16 4", + "test t global a 0 5 3", + "test t global c 0 1 3", + "test t global c 0 14 3", + "test t p0 a 0 4 2", + "test t p0 a 0 5 3", + "test t p0 c 0 1 3", + "test t p0 c 0 2 2", + "test t p1 a 0 16 4", + "test t p1 a 0 17 2", + "test t p1 c 0 13 2", + "test t p1 c 0 14 3")) + + tk.MustQuery("show stats_topn where db_name = 'test' and table_name = 't' and is_index = 1").Sort().Check( + // db, tbl, part, col, is_idx, value, count + testkit.Rows("test t global idx 1 1 3", + "test t global idx 1 14 3", + "test t p0 idx 1 1 3", + "test t p0 idx 1 2 2", + "test t p1 idx 1 13 2", + "test t p1 idx 1 14 3")) + + tk.MustQuery("show stats_buckets where db_name = 'test' and table_name = 't' and is_index = 0").Sort().Check( + // db, tbl, part, col, is_index, bucket_id, count, repeats, lower, upper, ndv + testkit.Rows("test t global a 0 0 5 2 1 4 0", + "test t global a 0 1 12 2 17 17 0", + "test t global c 0 0 6 1 2 6 0", + "test t global c 0 1 14 2 13 13 0", + "test t p0 a 0 0 2 1 1 2 0", + "test t p0 a 0 1 3 1 3 3 0", + "test t p0 c 0 0 3 1 3 5 0", + "test t p0 c 0 1 4 1 6 6 0", + "test t p1 a 0 0 3 1 11 13 0", + "test t p1 a 0 1 5 1 14 15 0", + "test t p1 c 0 0 4 1 7 10 0", + "test t p1 c 0 1 6 1 11 12 0")) + + tk.MustQuery("show stats_buckets where db_name = 'test' and table_name = 't' and is_index = 1").Sort().Check( + // db, tbl, part, col, is_index, bucket_id, count, repeats, lower, upper, ndv + testkit.Rows("test t global idx 1 0 6 1 2 6 0", + "test t global idx 1 1 14 2 13 13 0", + "test t p0 idx 1 0 3 1 3 5 0", + "test t p0 idx 1 1 4 1 6 6 0", + "test t p1 idx 1 0 4 1 7 10 0", + "test t p1 idx 1 1 6 1 11 12 0")) + + tk.MustQuery("select table_id, is_index, hist_id, distinct_count, null_count, tot_col_size, stats_ver, truncate(correlation,2) from mysql.stats_histograms order by table_id, is_index, hist_id asc").Check( + testkit.Rows(fmt.Sprintf("%d 0 1 12 1 19 2 0", tblID), // global, a + fmt.Sprintf("%d 0 3 14 0 20 2 0", tblID), // global, c + fmt.Sprintf("%d 1 1 14 0 0 2 0", tblID), // global, idx + fmt.Sprintf("%d 0 1 5 1 8 2 1", p0ID), // p0, a + fmt.Sprintf("%d 0 2 0 0 8 0 0", p0ID), // p0, b, not analyzed + fmt.Sprintf("%d 0 3 6 0 9 2 1", p0ID), // p0, c + fmt.Sprintf("%d 1 1 6 0 9 2 0", p0ID), // p0, idx + fmt.Sprintf("%d 0 1 7 0 11 2 1", p1ID), // p1, a + fmt.Sprintf("%d 0 2 0 0 11 0 0", p1ID), // p1, b, not analyzed + fmt.Sprintf("%d 0 3 8 0 11 2 1", p1ID), // p1, c + fmt.Sprintf("%d 1 1 8 0 11 2 0", p1ID), // p1, idx + )) +} + +func (s *testStatsSuite) TestAnalyzeColumnsWithStaticPartitionTable(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("set @@tidb_analyze_version = 2") + tk.MustExec("set @@tidb_partition_prune_mode = 'static'") + tk.MustExec("create table t (a int, b int, c int, index idx(c)) partition by range (a) (partition p0 values less than (10), partition p1 values less than maxvalue)") + tk.MustExec("insert into t values (1,2,1), (2,4,1), (3,6,1), (4,8,2), (4,8,2), (5,10,3), (5,10,4), (5,10,5), (null,null,6), (11,22,7), (12,24,8), (13,26,9), (14,28,10), (15,30,11), (16,32,12), (16,32,13), (16,32,13), (16,32,14), (17,34,14), (17,34,14)") + c.Assert(s.do.StatsHandle().DumpStatsDeltaToKV(handle.DumpAll), IsNil) + + is := s.do.InfoSchema() + tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + defs := tbl.Meta().Partition.Definitions + p0ID := defs[0].ID + p1ID := defs[1].ID + + tk.MustExec("analyze table t columns a with 2 topn, 2 buckets") + tk.MustQuery("show warnings").Sort().Check(testkit.Rows( + "Note 1105 Analyze use auto adjusted sample rate 1.000000 for table test.t's partition p0.", + "Note 1105 Analyze use auto adjusted sample rate 1.000000 for table test.t's partition p1.", + "Warning 1105 Columns c are missing in ANALYZE but their stats are needed for calculating stats for indexes/primary key/extended stats.", + )) + rows := tk.MustQuery("show column_stats_usage where db_name = 'test' and table_name = 't' and last_analyzed_at is not null").Sort().Rows() + c.Assert(len(rows), Equals, 4) + c.Assert(rows[0][:4], DeepEquals, []interface{}{"test", "t", "p0", "a"}) + c.Assert(rows[1][:4], DeepEquals, []interface{}{"test", "t", "p0", "c"}) + c.Assert(rows[2][:4], DeepEquals, []interface{}{"test", "t", "p1", "a"}) + c.Assert(rows[3][:4], DeepEquals, []interface{}{"test", "t", "p1", "c"}) + + rows = tk.MustQuery("show stats_meta where db_name = 'test' and table_name = 't'").Sort().Rows() + c.Assert(len(rows), Equals, 2) + c.Assert(append(rows[0][:3], rows[0][4:]...), DeepEquals, []interface{}{"test", "t", "p0", "0", "9"}) + c.Assert(append(rows[1][:3], rows[1][4:]...), DeepEquals, []interface{}{"test", "t", "p1", "0", "11"}) + + tk.MustQuery("show stats_topn where db_name = 'test' and table_name = 't' and is_index = 0").Sort().Check( + // db, tbl, part, col, is_idx, value, count + testkit.Rows("test t p0 a 0 4 2", + "test t p0 a 0 5 3", + "test t p0 c 0 1 3", + "test t p0 c 0 2 2", + "test t p1 a 0 16 4", + "test t p1 a 0 17 2", + "test t p1 c 0 13 2", + "test t p1 c 0 14 3")) + + tk.MustQuery("show stats_topn where db_name = 'test' and table_name = 't' and is_index = 1").Sort().Check( + // db, tbl, part, col, is_idx, value, count + testkit.Rows("test t p0 idx 1 1 3", + "test t p0 idx 1 2 2", + "test t p1 idx 1 13 2", + "test t p1 idx 1 14 3")) + + tk.MustQuery("show stats_buckets where db_name = 'test' and table_name = 't' and is_index = 0").Sort().Check( + // db, tbl, part, col, is_index, bucket_id, count, repeats, lower, upper, ndv + testkit.Rows("test t p0 a 0 0 2 1 1 2 0", + "test t p0 a 0 1 3 1 3 3 0", + "test t p0 c 0 0 3 1 3 5 0", + "test t p0 c 0 1 4 1 6 6 0", + "test t p1 a 0 0 3 1 11 13 0", + "test t p1 a 0 1 5 1 14 15 0", + "test t p1 c 0 0 4 1 7 10 0", + "test t p1 c 0 1 6 1 11 12 0")) + + tk.MustQuery("show stats_buckets where db_name = 'test' and table_name = 't' and is_index = 1").Sort().Check( + // db, tbl, part, col, is_index, bucket_id, count, repeats, lower, upper, ndv + testkit.Rows("test t p0 idx 1 0 3 1 3 5 0", + "test t p0 idx 1 1 4 1 6 6 0", + "test t p1 idx 1 0 4 1 7 10 0", + "test t p1 idx 1 1 6 1 11 12 0")) + + tk.MustQuery("select table_id, is_index, hist_id, distinct_count, null_count, tot_col_size, stats_ver, truncate(correlation,2) from mysql.stats_histograms order by table_id, is_index, hist_id asc").Check( + testkit.Rows(fmt.Sprintf("%d 0 1 5 1 8 2 1", p0ID), // p0, a + fmt.Sprintf("%d 0 2 0 0 8 0 0", p0ID), // p0, b, not analyzed + fmt.Sprintf("%d 0 3 6 0 9 2 1", p0ID), // p0, c + fmt.Sprintf("%d 1 1 6 0 9 2 0", p0ID), // p0, idx + fmt.Sprintf("%d 0 1 7 0 11 2 1", p1ID), // p1, a + fmt.Sprintf("%d 0 2 0 0 11 0 0", p1ID), // p1, b, not analyzed + fmt.Sprintf("%d 0 3 8 0 11 2 1", p1ID), // p1, c + fmt.Sprintf("%d 1 1 8 0 11 2 0", p1ID), // p1, idx + )) +} + +func (s *testStatsSuite) TestAnalyzeColumnsWithExtendedStats(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("set @@tidb_analyze_version = 2") + tk.MustExec("set @@tidb_enable_extended_stats = on") + tk.MustExec("create table t (a int, b int, c int)") + tk.MustExec("alter table t add stats_extended s1 correlation(b,c)") + tk.MustExec("insert into t values (5,1,1), (4,2,2), (3,3,3), (2,4,4), (1,5,5)") + c.Assert(s.do.StatsHandle().DumpStatsDeltaToKV(handle.DumpAll), IsNil) + + is := s.do.InfoSchema() + tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + tblID := tbl.Meta().ID + + tk.MustExec("analyze table t columns b with 2 topn, 2 buckets") + tk.MustQuery("show warnings").Sort().Check(testkit.Rows( + "Note 1105 Analyze use auto adjusted sample rate 1.000000 for table test.t.", + "Warning 1105 Columns c are missing in ANALYZE but their stats are needed for calculating stats for indexes/primary key/extended stats.", + )) + rows := tk.MustQuery("show column_stats_usage where db_name = 'test' and table_name = 't' and last_analyzed_at is not null").Sort().Rows() + c.Assert(len(rows), Equals, 2) + c.Assert(rows[0][3], Equals, "b") + c.Assert(rows[1][3], Equals, "c") + + tk.MustQuery(fmt.Sprintf("select modify_count, count from mysql.stats_meta where table_id = %d", tblID)).Sort().Check( + testkit.Rows("0 5")) + tk.MustQuery("show stats_topn where db_name = 'test' and table_name = 't'").Sort().Check( + // db, tbl, part, col, is_idx, value, count + testkit.Rows("test t b 0 1 1", + "test t b 0 2 1", + "test t c 0 1 1", + "test t c 0 2 1")) + tk.MustQuery(fmt.Sprintf("select is_index, hist_id, distinct_count, null_count, tot_col_size, stats_ver, truncate(correlation,2) from mysql.stats_histograms where table_id = %d", tblID)).Sort().Check( + testkit.Rows("0 1 0 0 5 0 0", // column a is not analyzed + "0 2 5 0 5 2 1", + "0 3 5 0 5 2 1", + )) + tk.MustQuery("show stats_buckets where db_name = 'test' and table_name = 't'").Sort().Check( + // db, tbl, part, col, is_index, bucket_id, count, repeats, lower, upper, ndv + testkit.Rows("test t b 0 0 2 1 3 4 0", + "test t b 0 1 3 1 5 5 0", + "test t c 0 0 2 1 3 4 0", + "test t c 0 1 3 1 5 5 0")) + rows = tk.MustQuery("show stats_extended where db_name = 'test' and table_name = 't'").Rows() + c.Assert(len(rows), Equals, 1) + c.Assert(rows[0][:len(rows[0])-1], DeepEquals, []interface{}{"test", "t", "s1", "[b,c]", "correlation", "1.000000"}) +} + +func (s *testStatsSuite) TestAnalyzeColumnsWithVirtualColumnIndex(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("set @@tidb_analyze_version = 2") + tk.MustExec("create table t (a int, b int, c int as (b+1), index idx(c))") + tk.MustExec("insert into t (a,b) values (1,1), (2,2), (3,3), (4,4), (5,4), (6,5), (7,5), (8,5), (null,null)") + c.Assert(s.do.StatsHandle().DumpStatsDeltaToKV(handle.DumpAll), IsNil) + + is := s.do.InfoSchema() + tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + tblID := tbl.Meta().ID + + tk.MustExec("analyze table t columns b with 2 topn, 2 buckets") + tk.MustQuery("show warnings").Sort().Check(testkit.Rows( + "Note 1105 Analyze use auto adjusted sample rate 1.000000 for table test.t.", + "Warning 1105 Columns c are missing in ANALYZE but their stats are needed for calculating stats for indexes/primary key/extended stats.", + )) + // virtual column c is skipped when dumping stats into disk, so only the stats of column b are updated + rows := tk.MustQuery("show column_stats_usage where db_name = 'test' and table_name = 't' and last_analyzed_at is not null").Rows() + c.Assert(len(rows), Equals, 1) + c.Assert(rows[0][3], Equals, "b") + + tk.MustQuery(fmt.Sprintf("select modify_count, count from mysql.stats_meta where table_id = %d", tblID)).Sort().Check( + testkit.Rows("0 9")) + tk.MustQuery("show stats_topn where db_name = 'test' and table_name = 't'").Sort().Check( + // db, tbl, part, col, is_idx, value, count + testkit.Rows("test t b 0 4 2", + "test t b 0 5 3", + "test t idx 1 5 2", + "test t idx 1 6 3")) + tk.MustQuery(fmt.Sprintf("select is_index, hist_id, distinct_count, null_count, stats_ver, truncate(correlation,2) from mysql.stats_histograms where table_id = %d", tblID)).Sort().Check( + testkit.Rows("0 1 0 0 0 0", // column a is not analyzed + "0 2 5 1 2 1", + "0 3 0 0 0 0", // column c is not analyzed + "1 1 5 1 2 0")) + tk.MustQuery("show stats_buckets where db_name = 'test' and table_name = 't'").Sort().Check( + // db, tbl, part, col, is_index, bucket_id, count, repeats, lower, upper, ndv + testkit.Rows("test t b 0 0 2 1 1 2 0", + "test t b 0 1 3 1 3 3 0", + "test t idx 1 0 2 1 2 3 0", + "test t idx 1 1 3 1 4 4 0")) +} + +func (s *testStatsSuite) TestAnalyzeColumnsAfterAnalyzeAll(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("set @@tidb_analyze_version = 2") + tk.MustExec("create table t (a int, b int)") + tk.MustExec("insert into t (a,b) values (1,1), (1,1), (2,2), (2,2), (3,3), (4,4)") + c.Assert(s.do.StatsHandle().DumpStatsDeltaToKV(handle.DumpAll), IsNil) + + is := s.do.InfoSchema() + tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + tblID := tbl.Meta().ID + + tk.MustExec("analyze table t with 2 topn, 2 buckets") + tk.MustQuery(fmt.Sprintf("select modify_count, count from mysql.stats_meta where table_id = %d", tblID)).Sort().Check( + testkit.Rows("0 6")) + tk.MustQuery("show stats_topn where db_name = 'test' and table_name = 't'").Sort().Check( + // db, tbl, part, col, is_idx, value, count + testkit.Rows("test t a 0 1 2", + "test t a 0 2 2", + "test t b 0 1 2", + "test t b 0 2 2")) + tk.MustQuery(fmt.Sprintf("select is_index, hist_id, distinct_count, null_count, tot_col_size, stats_ver, truncate(correlation,2) from mysql.stats_histograms where table_id = %d", tblID)).Sort().Check( + testkit.Rows("0 1 4 0 6 2 1", + "0 2 4 0 6 2 1")) + tk.MustQuery("show stats_buckets where db_name = 'test' and table_name = 't'").Sort().Check( + // db, tbl, part, col, is_index, bucket_id, count, repeats, lower, upper, ndv + testkit.Rows("test t a 0 0 2 1 3 4 0", + "test t b 0 0 2 1 3 4 0")) + + tk.MustExec("insert into t (a,b) values (1,1), (6,6)") + c.Assert(s.do.StatsHandle().DumpStatsDeltaToKV(handle.DumpAll), IsNil) + + tk.MustExec("analyze table t columns b with 2 topn, 2 buckets") + // Column a is not analyzed in second ANALYZE. We keep the outdated stats of column a rather than delete them. + tk.MustQuery(fmt.Sprintf("select modify_count, count from mysql.stats_meta where table_id = %d", tblID)).Sort().Check( + testkit.Rows("0 8")) + tk.MustQuery("show stats_topn where db_name = 'test' and table_name = 't'").Sort().Check( + // db, tbl, part, col, is_idx, value, count + testkit.Rows("test t a 0 1 2", + "test t a 0 2 2", + "test t b 0 1 3", + "test t b 0 2 2")) + tk.MustQuery(fmt.Sprintf("select is_index, hist_id, distinct_count, null_count, tot_col_size, stats_ver, truncate(correlation,2) from mysql.stats_histograms where table_id = %d", tblID)).Sort().Check( + testkit.Rows("0 1 4 0 8 2 1", // tot_col_size of column a is updated to 8 by DumpStatsDeltaToKV + "0 2 5 0 8 2 0.76")) + tk.MustQuery("show stats_buckets where db_name = 'test' and table_name = 't'").Sort().Check( + // db, tbl, part, col, is_index, bucket_id, count, repeats, lower, upper, ndv + testkit.Rows("test t a 0 0 2 1 3 4 0", + "test t b 0 0 2 1 3 4 0", + "test t b 0 1 3 1 6 6 0")) + tk.MustQuery(fmt.Sprintf("select hist_id from mysql.stats_histograms where version = (select version from mysql.stats_meta where table_id = %d)", tblID)).Check(testkit.Rows("2")) +} diff --git a/statistics/handle/update.go b/statistics/handle/update.go index fe2b46bbd302a..a36f12bbdd7d2 100644 --- a/statistics/handle/update.go +++ b/statistics/handle/update.go @@ -32,6 +32,7 @@ import ( "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" + "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/statistics" @@ -64,6 +65,12 @@ func (m tableDeltaMap) update(id int64, delta int64, count int64, colSize *map[i m[id] = item } +func (m tableDeltaMap) merge(deltaMap tableDeltaMap) { + for id, item := range deltaMap { + m.update(id, item.Delta, item.Count, &item.ColSize) + } +} + type errorRateDelta struct { PkID int64 PkErrorRate *statistics.ErrorRate @@ -125,14 +132,12 @@ func (m errorRateDeltaMap) clear(tableID int64, histID int64, isIndex bool) { m[tableID] = item } -func (h *Handle) merge(s *SessionStatsCollector, rateMap errorRateDeltaMap) { - for id, item := range s.mapper { - h.globalMap.update(id, item.Delta, item.Count, &item.ColSize) - } +func merge(s *SessionStatsCollector, deltaMap tableDeltaMap, rateMap errorRateDeltaMap, feedback *statistics.QueryFeedbackMap) { + deltaMap.merge(s.mapper) s.mapper = make(tableDeltaMap) rateMap.merge(s.rateMap) s.rateMap = make(errorRateDeltaMap) - h.feedback.Merge(s.feedback) + feedback.Merge(s.feedback) s.feedback = statistics.NewQueryFeedbackMap() } @@ -252,7 +257,8 @@ func (m indexUsageMap) update(tableID int64, indexID int64, value *IndexUsageInf } func (m indexUsageMap) merge(destMap indexUsageMap) { - for id, item := range destMap { + for id := range destMap { + item := destMap[id] m.updateByKey(id, &item) } } @@ -374,13 +380,15 @@ const ( // sweepList will loop over the list, merge each session's local stats into handle // and remove closed session's collector. func (h *Handle) sweepList() { + deltaMap := make(tableDeltaMap) + errorRateMap := make(errorRateDeltaMap) + feedback := statistics.NewQueryFeedbackMap() prev := h.listHead prev.Lock() - errorRateMap := make(errorRateDeltaMap) for curr := prev.next; curr != nil; curr = curr.next { curr.Lock() - // Merge the session stats into handle and error rate map. - h.merge(curr, errorRateMap) + // Merge the session stats into deltaMap, errorRateMap and feedback respectively. + merge(curr, deltaMap, errorRateMap, feedback) if curr.deleted { prev.next = curr.next // Since the session is already closed, we can safely unlock it here. @@ -392,37 +400,34 @@ func (h *Handle) sweepList() { } } prev.Unlock() + h.globalMap.Lock() + h.globalMap.data.merge(deltaMap) + h.globalMap.Unlock() h.mu.Lock() h.mu.rateMap.merge(errorRateMap) h.mu.Unlock() - h.siftFeedbacks() -} - -// siftFeedbacks eliminates feedbacks which are overlapped with others. It is a tradeoff between -// feedback accuracy and its overhead. -func (h *Handle) siftFeedbacks() { - sc := &stmtctx.StatementContext{TimeZone: time.UTC} - for k, qs := range h.feedback.Feedbacks { - fbs := make([]statistics.Feedback, 0, len(qs)*2) - for _, q := range qs { - fbs = append(fbs, q.Feedback...) - } - if len(fbs) == 0 { - delete(h.feedback.Feedbacks, k) - continue - } - h.feedback.Feedbacks[k] = h.feedback.Feedbacks[k][:1] - h.feedback.Feedbacks[k][0].Feedback, _ = statistics.NonOverlappedFeedbacks(sc, fbs) - } - h.feedback.Size = len(h.feedback.Feedbacks) + h.feedback.Lock() + h.feedback.data.Merge(feedback) + h.feedback.data.SiftFeedbacks() + h.feedback.Unlock() } // DumpStatsDeltaToKV sweeps the whole list and updates the global map, then we dumps every table that held in map to KV. // If the mode is `DumpDelta`, it will only dump that delta info that `Modify Count / Table Count` greater than a ratio. func (h *Handle) DumpStatsDeltaToKV(mode dumpMode) error { h.sweepList() + h.globalMap.Lock() + deltaMap := h.globalMap.data + h.globalMap.data = make(tableDeltaMap) + h.globalMap.Unlock() + defer func() { + h.globalMap.Lock() + deltaMap.merge(h.globalMap.data) + h.globalMap.data = deltaMap + h.globalMap.Unlock() + }() currentTime := time.Now() - for id, item := range h.globalMap { + for id, item := range deltaMap { if mode == DumpDelta && !needDumpStatsDelta(h, id, item, currentTime) { continue } @@ -431,17 +436,17 @@ func (h *Handle) DumpStatsDeltaToKV(mode dumpMode) error { return errors.Trace(err) } if updated { - h.globalMap.update(id, -item.Delta, -item.Count, nil) + deltaMap.update(id, -item.Delta, -item.Count, nil) } if err = h.dumpTableStatColSizeToKV(id, item); err != nil { return errors.Trace(err) } if updated { - delete(h.globalMap, id) + delete(deltaMap, id) } else { - m := h.globalMap[id] + m := deltaMap[id] m.ColSize = nil - h.globalMap[id] = m + deltaMap[id] = m } } return nil @@ -521,8 +526,12 @@ func (h *Handle) dumpTableStatColSizeToKV(id int64, delta variable.TableDelta) e // DumpStatsFeedbackToKV dumps the stats feedback to KV. func (h *Handle) DumpStatsFeedbackToKV() error { + h.feedback.Lock() + feedback := h.feedback.data + h.feedback.data = statistics.NewQueryFeedbackMap() + h.feedback.Unlock() var err error - for _, fbs := range h.feedback.Feedbacks { + for _, fbs := range feedback.Feedbacks { for _, fb := range fbs { if fb.Tp == statistics.PkType { err = h.DumpFeedbackToKV(fb) @@ -547,7 +556,6 @@ func (h *Handle) DumpStatsFeedbackToKV() error { } } } - h.feedback = statistics.NewQueryFeedbackMap() return errors.Trace(err) } @@ -580,8 +588,12 @@ func (h *Handle) DumpFeedbackToKV(fb *statistics.QueryFeedback) error { // feedback locally on this tidb-server, so it could be used more timely. func (h *Handle) UpdateStatsByLocalFeedback(is infoschema.InfoSchema) { h.sweepList() + h.feedback.Lock() + feedback := h.feedback.data + h.feedback.data = statistics.NewQueryFeedbackMap() + h.feedback.Unlock() OUTER: - for _, fbs := range h.feedback.Feedbacks { + for _, fbs := range feedback.Feedbacks { for _, fb := range fbs { h.mu.Lock() table, ok := h.getTableByPhysicalID(is, fb.PhysicalID) @@ -700,7 +712,7 @@ func (h *Handle) HandleUpdateStats(is infoschema.InfoSchema) error { tableID, histID, isIndex := int64(-1), int64(-1), int64(-1) var rows []chunk.Row for { - req := rc.NewChunk() + req := rc.NewChunk(nil) iter := chunk.NewIterator4Chunk(req) err := rc.Next(context.TODO(), req) if err != nil { @@ -827,7 +839,7 @@ func (h *Handle) deleteOutdatedFeedback(tableID, histID, isIndex int64) error { func (h *Handle) dumpStatsUpdateToKV(tableID, isIndex int64, q *statistics.QueryFeedback, hist *statistics.Histogram, cms *statistics.CMSketch, topN *statistics.TopN, fms *statistics.FMSketch, statsVersion int64) error { hist = statistics.UpdateHistogram(hist, q, int(statsVersion)) // feedback for partition is not ready. - err := h.SaveStatsToStorage(tableID, -1, int(isIndex), hist, cms, topN, fms, int(statsVersion), 0, false) + err := h.SaveStatsToStorage(tableID, -1, int(isIndex), hist, cms, topN, fms, int(statsVersion), 0, false, false) metrics.UpdateStatsCounter.WithLabelValues(metrics.RetLabel(err)).Inc() return errors.Trace(err) } @@ -997,9 +1009,9 @@ func (h *Handle) autoAnalyzeTable(tblInfo *model.TableInfo, statsTbl *statistics } for _, idx := range tblInfo.Indices { if _, ok := statsTbl.Indices[idx.ID]; !ok && idx.State == model.StatePublic { - sqlWithIdx := sql + "index %n" + sqlWithIdx := sql + " index %n" paramsWithIdx := append(params, idx.Name.O) - escaped, err := sqlexec.EscapeSQL(sql, params...) + escaped, err := sqlexec.EscapeSQL(sqlWithIdx, paramsWithIdx...) if err != nil { return false } @@ -1084,7 +1096,11 @@ func (h *Handle) execAutoAnalyze(statsVer int, sql string, params ...interface{} dur := time.Since(startTime) metrics.AutoAnalyzeHistogram.Observe(dur.Seconds()) if err != nil { - logutil.BgLogger().Error("[stats] auto analyze failed", zap.String("sql", sql), zap.Duration("cost_time", dur), zap.Error(err)) + escaped, err1 := sqlexec.EscapeSQL(sql, params...) + if err1 != nil { + escaped = "" + } + logutil.BgLogger().Error("[stats] auto analyze failed", zap.String("sql", escaped), zap.Duration("cost_time", dur), zap.Error(err)) metrics.AutoAnalyzeCounter.WithLabelValues("failed").Inc() } else { metrics.AutoAnalyzeCounter.WithLabelValues("succ").Inc() @@ -1235,7 +1251,10 @@ func (h *Handle) RecalculateExpectCount(q *statistics.QueryFeedback) error { if !ok { return nil } - tablePseudo := t.Pseudo || t.IsOutdated() + tablePseudo := t.Pseudo + if h.mu.ctx.GetSessionVars().GetEnablePseudoForOutdatedStats() { + tablePseudo = t.Pseudo || t.IsOutdated() + } if !tablePseudo { return nil } @@ -1248,7 +1267,18 @@ func (h *Handle) RecalculateExpectCount(q *statistics.QueryFeedback) error { return nil } - sc := &stmtctx.StatementContext{TimeZone: time.UTC} + se, err := h.pool.Get() + if err != nil { + return err + } + sctx := se.(sessionctx.Context) + timeZone := sctx.GetSessionVars().StmtCtx.TimeZone + defer func() { + sctx.GetSessionVars().StmtCtx.TimeZone = timeZone + h.pool.Put(se) + }() + sctx.GetSessionVars().StmtCtx.TimeZone = time.UTC + ranges, err := q.DecodeToRanges(isIndex) if err != nil { return errors.Trace(err) @@ -1256,10 +1286,10 @@ func (h *Handle) RecalculateExpectCount(q *statistics.QueryFeedback) error { expected := 0.0 if isIndex { idx := t.Indices[id] - expected, err = idx.GetRowCount(sc, nil, ranges, t.Count) + expected, err = idx.GetRowCount(sctx, nil, ranges, t.Count) } else { c := t.Columns[id] - expected, err = c.GetColumnRowCount(sc, ranges, t.Count, true) + expected, err = c.GetColumnRowCount(sctx, ranges, t.Count, true) } q.Expected = int64(expected) return err @@ -1336,7 +1366,20 @@ func (h *Handle) DumpFeedbackForIndex(q *statistics.QueryFeedback, t *statistics if !ok { return nil } - sc := &stmtctx.StatementContext{TimeZone: time.UTC} + + se, err := h.pool.Get() + if err != nil { + return err + } + sctx := se.(sessionctx.Context) + sc := sctx.GetSessionVars().StmtCtx + timeZone := sc.TimeZone + defer func() { + sctx.GetSessionVars().StmtCtx.TimeZone = timeZone + h.pool.Put(se) + }() + sc.TimeZone = time.UTC + if idx.CMSketch == nil || idx.StatsVer < statistics.Version1 { return h.DumpFeedbackToKV(q) } @@ -1351,7 +1394,6 @@ func (h *Handle) DumpFeedbackForIndex(q *statistics.QueryFeedback, t *statistics if rangePosition == 0 || rangePosition == len(ran.LowVal) { continue } - bytes, err := codec.EncodeKey(sc, nil, ran.LowVal[:rangePosition]...) if err != nil { logutil.BgLogger().Debug("encode keys fail", zap.Error(err)) @@ -1367,12 +1409,12 @@ func (h *Handle) DumpFeedbackForIndex(q *statistics.QueryFeedback, t *statistics rangeFB := &statistics.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}) + rangeCount, err = t.GetRowCountByIndexRanges(sctx, idx.ID, []*ranger.Range{rang}) rangeFB.Tp, rangeFB.Hist = statistics.IndexType, &idx.Histogram } else if col := t.ColumnByName(colName); col != nil && col.Histogram.Len() != 0 { err = convertRangeType(rang, col.Tp, time.UTC) if err == nil { - rangeCount, err = t.GetRowCountByColumnRanges(sc, col.ID, []*ranger.Range{rang}) + rangeCount, err = t.GetRowCountByColumnRanges(sctx, col.ID, []*ranger.Range{rang}) rangeFB.Tp, rangeFB.Hist = statistics.ColType, &col.Histogram } } else { diff --git a/statistics/handle/update_list_test.go b/statistics/handle/update_list_test.go index 8c67c4fa0a8d4..cbedae29c9bc3 100644 --- a/statistics/handle/update_list_test.go +++ b/statistics/handle/update_list_test.go @@ -22,11 +22,10 @@ import ( ) func TestInsertAndDelete(t *testing.T) { - t.Parallel() h := Handle{ listHead: &SessionStatsCollector{mapper: make(tableDeltaMap)}, - feedback: statistics.NewQueryFeedbackMap(), } + h.feedback.data = statistics.NewQueryFeedbackMap() var items []*SessionStatsCollector for i := 0; i < 5; i++ { items = append(items, h.NewSessionStatsCollector()) diff --git a/statistics/handle/update_test.go b/statistics/handle/update_test.go index fe4904e254be5..3d41f92701593 100644 --- a/statistics/handle/update_test.go +++ b/statistics/handle/update_test.go @@ -149,7 +149,7 @@ func (s *testStatsSuite) TestSingleSessionInsert(c *C) { c.Assert(stats1.Count, Equals, int64(rowCount1*2)) // Test IncreaseFactor. - count, err := stats1.ColumnEqualRowCount(testKit.Se.GetSessionVars().StmtCtx, types.NewIntDatum(1), tableInfo1.Columns[0].ID) + count, err := stats1.ColumnEqualRowCount(testKit.Se, types.NewIntDatum(1), tableInfo1.Columns[0].ID) c.Assert(err, IsNil) c.Assert(count, Equals, float64(rowCount1*2)) diff --git a/statistics/histogram.go b/statistics/histogram.go index 0fdbfe7fd68f4..5e1788da7a1ac 100644 --- a/statistics/histogram.go +++ b/statistics/histogram.go @@ -30,6 +30,7 @@ import ( "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" + "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/tablecodec" @@ -506,7 +507,7 @@ func (hg *Histogram) BetweenRowCount(a, b types.Datum) float64 { } // BetweenRowCount estimates the row count for interval [l, r). -func (c *Column) BetweenRowCount(sc *stmtctx.StatementContext, l, r types.Datum, lowEncoded, highEncoded []byte) float64 { +func (c *Column) BetweenRowCount(sctx sessionctx.Context, l, r types.Datum, lowEncoded, highEncoded []byte) float64 { histBetweenCnt := c.Histogram.BetweenRowCount(l, r) if c.StatsVer <= Version1 { return histBetweenCnt @@ -768,7 +769,7 @@ func MergeHistograms(sc *stmtctx.StatementContext, lh *Histogram, rh *Histogram, } lh.NDV += rh.NDV lLen := lh.Len() - cmp, err := lh.GetUpper(lLen-1).CompareDatum(sc, rh.GetLower(0)) + cmp, err := lh.GetUpper(lLen-1).Compare(sc, rh.GetLower(0), collate.GetBinaryCollator()) if err != nil { return nil, errors.Trace(err) } @@ -1067,17 +1068,17 @@ var HistogramNeededColumns = neededColumnMap{cols: map[tableColumnID]struct{}{}} // IsInvalid checks if this column is invalid. If this column has histogram but not loaded yet, then we mark it // as need histogram. -func (c *Column) IsInvalid(sc *stmtctx.StatementContext, collPseudo bool) bool { +func (c *Column) IsInvalid(sctx sessionctx.Context, collPseudo bool) bool { if collPseudo && c.NotAccurate() { return true } - if c.Histogram.NDV > 0 && c.notNullCount() == 0 && sc != nil { + if c.Histogram.NDV > 0 && c.notNullCount() == 0 && sctx != nil && sctx.GetSessionVars().StmtCtx != nil { HistogramNeededColumns.insert(tableColumnID{TableID: c.PhysicalID, ColumnID: c.Info.ID}) } return c.TotalRowCount() == 0 || (c.Histogram.NDV > 0 && c.notNullCount() == 0) } -func (c *Column) equalRowCount(sc *stmtctx.StatementContext, val types.Datum, encodedVal []byte, realtimeRowCount int64) (float64, error) { +func (c *Column) equalRowCount(sctx sessionctx.Context, val types.Datum, encodedVal []byte, realtimeRowCount int64) (float64, error) { if val.IsNull() { return float64(c.NullCount), nil } @@ -1090,7 +1091,7 @@ func (c *Column) equalRowCount(sc *stmtctx.StatementContext, val types.Datum, en return outOfRangeEQSelectivity(c.Histogram.NDV, realtimeRowCount, int64(c.TotalRowCount())) * c.TotalRowCount(), nil } if c.CMSketch != nil { - count, err := queryValue(sc, c.CMSketch, c.TopN, val) + count, err := queryValue(sctx.GetSessionVars().StmtCtx, c.CMSketch, c.TopN, val) return float64(count), errors.Trace(err) } histRowCount, _ := c.Histogram.equalRowCount(val, false) @@ -1123,7 +1124,8 @@ func (c *Column) equalRowCount(sc *stmtctx.StatementContext, val types.Datum, en } // GetColumnRowCount estimates the row count by a slice of Range. -func (c *Column) GetColumnRowCount(sc *stmtctx.StatementContext, ranges []*ranger.Range, realtimeRowCount int64, pkIsHandle bool) (float64, error) { +func (c *Column) GetColumnRowCount(sctx sessionctx.Context, ranges []*ranger.Range, realtimeRowCount int64, pkIsHandle bool) (float64, error) { + sc := sctx.GetSessionVars().StmtCtx var rowCount float64 for _, rg := range ranges { highVal := *rg.HighVal[0].Clone() @@ -1134,7 +1136,7 @@ func (c *Column) GetColumnRowCount(sc *stmtctx.StatementContext, ranges []*range if lowVal.Kind() == types.KindString { lowVal.SetBytes(collate.GetCollator(lowVal.Collation()).Key(lowVal.GetString())) } - cmp, err := lowVal.CompareDatum(sc, &highVal) + cmp, err := lowVal.Compare(sc, &highVal, collate.GetBinaryCollator()) if err != nil { return 0, errors.Trace(err) } @@ -1155,7 +1157,7 @@ func (c *Column) GetColumnRowCount(sc *stmtctx.StatementContext, ranges []*range continue } var cnt float64 - cnt, err = c.equalRowCount(sc, lowVal, lowEncoded, realtimeRowCount) + cnt, err = c.equalRowCount(sctx, lowVal, lowEncoded, realtimeRowCount) if err != nil { return 0, errors.Trace(err) } @@ -1173,7 +1175,7 @@ func (c *Column) GetColumnRowCount(sc *stmtctx.StatementContext, ranges []*range // case 2: it's a small range && using ver1 stats if rangeVals != nil { for _, val := range rangeVals { - cnt, err := c.equalRowCount(sc, val, lowEncoded, realtimeRowCount) + cnt, err := c.equalRowCount(sctx, val, lowEncoded, realtimeRowCount) if err != nil { return 0, err } @@ -1187,12 +1189,12 @@ func (c *Column) GetColumnRowCount(sc *stmtctx.StatementContext, ranges []*range } // case 3: it's an interval - cnt := c.BetweenRowCount(sc, lowVal, highVal, lowEncoded, highEncoded) + cnt := c.BetweenRowCount(sctx, lowVal, highVal, lowEncoded, highEncoded) // `betweenRowCount` returns count for [l, h) range, we adjust cnt for boundaries here. // Note that, `cnt` does not include null values, we need specially handle cases // where null is the lower bound. if rg.LowExclude && !lowVal.IsNull() { - lowCnt, err := c.equalRowCount(sc, lowVal, lowEncoded, realtimeRowCount) + lowCnt, err := c.equalRowCount(sctx, lowVal, lowEncoded, realtimeRowCount) if err != nil { return 0, errors.Trace(err) } @@ -1202,7 +1204,7 @@ func (c *Column) GetColumnRowCount(sc *stmtctx.StatementContext, ranges []*range cnt += float64(c.NullCount) } if !rg.HighExclude { - highCnt, err := c.equalRowCount(sc, highVal, highEncoded, realtimeRowCount) + highCnt, err := c.equalRowCount(sctx, highVal, highEncoded, realtimeRowCount) if err != nil { return 0, errors.Trace(err) } @@ -1326,7 +1328,8 @@ func (idx *Index) QueryBytes(d []byte) uint64 { // GetRowCount returns the row count of the given ranges. // It uses the modifyCount to adjust the influence of modifications on the table. -func (idx *Index) GetRowCount(sc *stmtctx.StatementContext, coll *HistColl, indexRanges []*ranger.Range, realtimeRowCount int64) (float64, error) { +func (idx *Index) GetRowCount(sctx sessionctx.Context, coll *HistColl, indexRanges []*ranger.Range, realtimeRowCount int64) (float64, error) { + sc := sctx.GetSessionVars().StmtCtx totalCount := float64(0) isSingleCol := len(idx.Info.Columns) == 1 for _, indexRange := range indexRanges { @@ -1377,7 +1380,7 @@ func (idx *Index) GetRowCount(sc *stmtctx.StatementContext, coll *HistColl, inde // If the first column's range is point. if rangePosition := GetOrdinalOfRangeCond(sc, indexRange); rangePosition > 0 && idx.StatsVer >= Version2 && coll != nil { var expBackoffSel float64 - expBackoffSel, expBackoffSuccess, err = idx.expBackoffEstimation(sc, coll, indexRange) + expBackoffSel, expBackoffSuccess, err = idx.expBackoffEstimation(sctx, coll, indexRange) if err != nil { return 0, err } @@ -1408,7 +1411,7 @@ func (idx *Index) GetRowCount(sc *stmtctx.StatementContext, coll *HistColl, inde } // expBackoffEstimation estimate the multi-col cases following the Exponential Backoff. See comment below for details. -func (idx *Index) expBackoffEstimation(sc *stmtctx.StatementContext, coll *HistColl, indexRange *ranger.Range) (float64, bool, error) { +func (idx *Index) expBackoffEstimation(sctx sessionctx.Context, coll *HistColl, indexRange *ranger.Range) (float64, bool, error) { tmpRan := []*ranger.Range{ { LowVal: make([]types.Datum, 1), @@ -1435,9 +1438,9 @@ func (idx *Index) expBackoffEstimation(sc *stmtctx.StatementContext, coll *HistC err error ) if anotherIdxID, ok := coll.ColID2IdxID[colID]; ok && anotherIdxID != idx.ID { - count, err = coll.GetRowCountByIndexRanges(sc, anotherIdxID, tmpRan) - } else if col, ok := coll.Columns[colID]; ok && !col.IsInvalid(sc, coll.Pseudo) { - count, err = coll.GetRowCountByColumnRanges(sc, colID, tmpRan) + count, err = coll.GetRowCountByIndexRanges(sctx, anotherIdxID, tmpRan) + } else if col, ok := coll.Columns[colID]; ok && !col.IsInvalid(sctx, coll.Pseudo) { + count, err = coll.GetRowCountByColumnRanges(sctx, colID, tmpRan) } else { continue } @@ -1471,12 +1474,12 @@ func (idx *Index) expBackoffEstimation(sc *stmtctx.StatementContext, coll *HistC return singleColumnEstResults[0] * math.Sqrt(singleColumnEstResults[1]) * math.Sqrt(math.Sqrt(singleColumnEstResults[2])) * math.Sqrt(math.Sqrt(math.Sqrt(singleColumnEstResults[3]))), true, nil } -type countByRangeFunc = func(*stmtctx.StatementContext, int64, []*ranger.Range) (float64, error) +type countByRangeFunc = func(sessionctx.Context, int64, []*ranger.Range) (float64, error) // newHistogramBySelectivity fulfills the content of new histogram by the given selectivity result. // TODO: Datum is not efficient, try to avoid using it here. // Also, there're redundant calculation with Selectivity(). We need to reduce it too. -func newHistogramBySelectivity(sc *stmtctx.StatementContext, histID int64, oldHist, newHist *Histogram, ranges []*ranger.Range, cntByRangeFunc countByRangeFunc) error { +func newHistogramBySelectivity(sctx sessionctx.Context, histID int64, oldHist, newHist *Histogram, ranges []*ranger.Range, cntByRangeFunc countByRangeFunc) error { cntPerVal := int64(oldHist.AvgCountPerNotNullValue(int64(oldHist.TotalRowCount()))) var totCnt int64 for boundIdx, ranIdx, highRangeIdx := 0, 0, 0; boundIdx < oldHist.Bounds.NumRows() && ranIdx < len(ranges); boundIdx, ranIdx = boundIdx+2, highRangeIdx { @@ -1489,7 +1492,7 @@ func newHistogramBySelectivity(sc *stmtctx.StatementContext, histID int64, oldHi if ranIdx == highRangeIdx { continue } - cnt, err := cntByRangeFunc(sc, histID, ranges[ranIdx:highRangeIdx]) + cnt, err := cntByRangeFunc(sctx, histID, ranges[ranIdx:highRangeIdx]) // This should not happen. if err != nil { return err @@ -1565,7 +1568,7 @@ func (idx *Index) newIndexBySelectivity(sc *stmtctx.StatementContext, statsNode } // NewHistCollBySelectivity creates new HistColl by the given statsNodes. -func (coll *HistColl) NewHistCollBySelectivity(sc *stmtctx.StatementContext, statsNodes []*StatsNode) *HistColl { +func (coll *HistColl) NewHistCollBySelectivity(sctx sessionctx.Context, statsNodes []*StatsNode) *HistColl { newColl := &HistColl{ Columns: make(map[int64]*Column), Indices: make(map[int64]*Index), @@ -1579,7 +1582,7 @@ func (coll *HistColl) NewHistCollBySelectivity(sc *stmtctx.StatementContext, sta if !ok { continue } - newIdxHist, err := idxHist.newIndexBySelectivity(sc, node) + newIdxHist, err := idxHist.newIndexBySelectivity(sctx.GetSessionVars().StmtCtx, node) if err != nil { logutil.BgLogger().Warn("[Histogram-in-plan]: something wrong happened when calculating row count, "+ "failed to build histogram for index %v of table %v", @@ -1601,7 +1604,7 @@ func (coll *HistColl) NewHistCollBySelectivity(sc *stmtctx.StatementContext, sta } newCol.Histogram = *NewHistogram(oldCol.ID, int64(float64(oldCol.Histogram.NDV)*node.Selectivity), 0, 0, oldCol.Tp, chunk.InitialCapacity, 0) var err error - splitRanges, ok := oldCol.Histogram.SplitRange(sc, node.Ranges, false) + splitRanges, ok := oldCol.Histogram.SplitRange(sctx.GetSessionVars().StmtCtx, node.Ranges, false) if !ok { logutil.BgLogger().Warn("[Histogram-in-plan]: the type of histogram and ranges mismatch") continue @@ -1619,9 +1622,9 @@ func (coll *HistColl) NewHistCollBySelectivity(sc *stmtctx.StatementContext, sta } } if oldCol.IsHandle { - err = newHistogramBySelectivity(sc, node.ID, &oldCol.Histogram, &newCol.Histogram, splitRanges, coll.GetRowCountByIntColumnRanges) + err = newHistogramBySelectivity(sctx, node.ID, &oldCol.Histogram, &newCol.Histogram, splitRanges, coll.GetRowCountByIntColumnRanges) } else { - err = newHistogramBySelectivity(sc, node.ID, &oldCol.Histogram, &newCol.Histogram, splitRanges, coll.GetRowCountByColumnRanges) + err = newHistogramBySelectivity(sctx, node.ID, &oldCol.Histogram, &newCol.Histogram, splitRanges, coll.GetRowCountByColumnRanges) } if err != nil { logutil.BgLogger().Warn("[Histogram-in-plan]: something wrong happened when calculating row count", @@ -1797,7 +1800,7 @@ func mergeBucketNDV(sc *stmtctx.StatementContext, left *bucket4Merging, right *b res.NDV = left.NDV return &res, nil } - upperCompare, err := right.upper.CompareDatum(sc, left.upper) + upperCompare, err := right.upper.Compare(sc, left.upper, collate.GetBinaryCollator()) if err != nil { return nil, err } @@ -1811,7 +1814,7 @@ func mergeBucketNDV(sc *stmtctx.StatementContext, left *bucket4Merging, right *b // ___left__| // They have the same upper. if upperCompare == 0 { - lowerCompare, err := right.lower.CompareDatum(sc, left.lower) + lowerCompare, err := right.lower.Compare(sc, left.lower, collate.GetBinaryCollator()) if err != nil { return nil, err } @@ -1842,7 +1845,7 @@ func mergeBucketNDV(sc *stmtctx.StatementContext, left *bucket4Merging, right *b // ____right___| // ____left__| // right.upper > left.upper - lowerCompareUpper, err := right.lower.CompareDatum(sc, left.upper) + lowerCompareUpper, err := right.lower.Compare(sc, left.upper, collate.GetBinaryCollator()) if err != nil { return nil, err } @@ -1859,7 +1862,7 @@ func mergeBucketNDV(sc *stmtctx.StatementContext, left *bucket4Merging, right *b return &res, nil } upperRatio := calcFraction4Datums(right.lower, right.upper, left.upper) - lowerCompare, err := right.lower.CompareDatum(sc, left.lower) + lowerCompare, err := right.lower.Compare(sc, left.lower, collate.GetBinaryCollator()) if err != nil { return nil, err } @@ -1911,7 +1914,7 @@ func mergePartitionBuckets(sc *stmtctx.StatementContext, buckets []*bucket4Mergi for i := len(buckets) - 1; i >= 0; i-- { totNDV += buckets[i].NDV res.Count += buckets[i].Count - compare, err := buckets[i].upper.CompareDatum(sc, res.upper) + compare, err := buckets[i].upper.Compare(sc, res.upper, collate.GetBinaryCollator()) if err != nil { return nil, err } @@ -1966,7 +1969,7 @@ func MergePartitionHist2GlobalHist(sc *stmtctx.StatementContext, hists []*Histog minValue = hist.GetLower(0).Clone() continue } - res, err := hist.GetLower(0).CompareDatum(sc, minValue) + res, err := hist.GetLower(0).Compare(sc, minValue, collate.GetBinaryCollator()) if err != nil { return nil, err } @@ -2006,7 +2009,7 @@ func MergePartitionHist2GlobalHist(sc *stmtctx.StatementContext, hists []*Histog minValue = d.Clone() continue } - res, err := d.CompareDatum(sc, minValue) + res, err := d.Compare(sc, minValue, collate.GetBinaryCollator()) if err != nil { return nil, err } @@ -2028,14 +2031,14 @@ func MergePartitionHist2GlobalHist(sc *stmtctx.StatementContext, hists []*Histog var sortError error sort.Slice(buckets, func(i, j int) bool { - res, err := buckets[i].upper.CompareDatum(sc, buckets[j].upper) + res, err := buckets[i].upper.Compare(sc, buckets[j].upper, collate.GetBinaryCollator()) if err != nil { sortError = err } if res != 0 { return res < 0 } - res, err = buckets[i].lower.CompareDatum(sc, buckets[j].lower) + res, err = buckets[i].lower.Compare(sc, buckets[j].lower, collate.GetBinaryCollator()) if err != nil { sortError = err } @@ -2055,7 +2058,7 @@ func MergePartitionHist2GlobalHist(sc *stmtctx.StatementContext, hists []*Histog bucketNDV += buckets[i].NDV if sum >= totCount*bucketCount/expBucketNumber && sum-prevSum >= gBucketCountThreshold { for ; i > 0; i-- { // if the buckets have the same upper, we merge them into the same new buckets. - res, err := buckets[i-1].upper.CompareDatum(sc, buckets[i].upper) + res, err := buckets[i-1].upper.Compare(sc, buckets[i].upper, collate.GetBinaryCollator()) if err != nil { return nil, err } diff --git a/statistics/histogram_test.go b/statistics/histogram_test.go index 9a0698133711e..15e4d696de1ee 100644 --- a/statistics/histogram_test.go +++ b/statistics/histogram_test.go @@ -29,7 +29,6 @@ import ( ) func TestNewHistogramBySelectivity(t *testing.T) { - t.Parallel() coll := &HistColl{ Count: 330, Columns: make(map[int64]*Column), @@ -93,7 +92,7 @@ num: 54 lower_bound: kkkkk upper_bound: ooooo repeats: 0 ndv: 0 num: 60 lower_bound: oooooo upper_bound: sssss repeats: 0 ndv: 0 num: 60 lower_bound: ssssssu upper_bound: yyyyy repeats: 0 ndv: 0` - newColl := coll.NewHistCollBySelectivity(sc, []*StatsNode{node, node2}) + newColl := coll.NewHistCollBySelectivity(ctx, []*StatsNode{node, node2}) require.Equal(t, intColResult, newColl.Columns[1].String()) require.Equal(t, stringColResult, newColl.Columns[2].String()) @@ -120,12 +119,11 @@ num: 30 lower_bound: 3 upper_bound: 5 repeats: 10 ndv: 0 num: 30 lower_bound: 9 upper_bound: 11 repeats: 10 ndv: 0 num: 30 lower_bound: 12 upper_bound: 14 repeats: 10 ndv: 0` - newColl = coll.NewHistCollBySelectivity(sc, []*StatsNode{node3}) + newColl = coll.NewHistCollBySelectivity(ctx, []*StatsNode{node3}) require.Equal(t, idxResult, newColl.Indices[0].String()) } func TestTruncateHistogram(t *testing.T) { - t.Parallel() hist := NewHistogram(0, 0, 0, 0, types.NewFieldType(mysql.TypeLonglong), 1, 0) low, high := types.NewIntDatum(0), types.NewIntDatum(1) hist.AppendBucket(&low, &high, 0, 1) @@ -136,7 +134,6 @@ func TestTruncateHistogram(t *testing.T) { } func TestValueToString4InvalidKey(t *testing.T) { - t.Parallel() bytes, err := codec.EncodeKey(nil, nil, types.NewDatum(1), types.NewDatum(0.5)) require.NoError(t, err) // Append invalid flag. @@ -174,7 +171,6 @@ func genHist4Test(t *testing.T, buckets []*bucket4Test, totColSize int64) *Histo } func TestMergePartitionLevelHist(t *testing.T) { - t.Parallel() type testCase struct { partitionHists [][]*bucket4Test totColSize []int64 @@ -428,7 +424,6 @@ func genBucket4Merging4Test(lower, upper, ndv, disjointNDV int64) bucket4Merging } func TestMergeBucketNDV(t *testing.T) { - t.Parallel() type testData struct { left bucket4Merging right bucket4Merging diff --git a/statistics/integration_test.go b/statistics/integration_test.go index f28f2767f6fbc..47148c7daffe1 100644 --- a/statistics/integration_test.go +++ b/statistics/integration_test.go @@ -28,7 +28,6 @@ import ( ) func TestChangeVerTo2Behavior(t *testing.T) { - t.Parallel() store, dom, clean := testkit.CreateMockStoreAndDomain(t) defer clean() tk := testkit.NewTestKit(t, store) @@ -103,7 +102,6 @@ func TestChangeVerTo2Behavior(t *testing.T) { } func TestFastAnalyzeOnVer2(t *testing.T) { - t.Parallel() store, dom, clean := testkit.CreateMockStoreAndDomain(t) defer clean() tk := testkit.NewTestKit(t, store) @@ -152,7 +150,6 @@ func TestFastAnalyzeOnVer2(t *testing.T) { } func TestIncAnalyzeOnVer2(t *testing.T) { - t.Parallel() store, dom, clean := testkit.CreateMockStoreAndDomain(t) defer clean() tk := testkit.NewTestKit(t, store) @@ -180,7 +177,6 @@ func TestIncAnalyzeOnVer2(t *testing.T) { } func TestExpBackoffEstimation(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() tk := testkit.NewTestKit(t, store) @@ -217,7 +213,6 @@ func TestExpBackoffEstimation(t *testing.T) { } func TestGlobalStats(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() tk := testkit.NewTestKit(t, store) @@ -314,7 +309,6 @@ func TestGlobalStats(t *testing.T) { } func TestNULLOnFullSampling(t *testing.T) { - t.Parallel() store, dom, clean := testkit.CreateMockStoreAndDomain(t) defer clean() tk := testkit.NewTestKit(t, store) @@ -350,7 +344,6 @@ func TestNULLOnFullSampling(t *testing.T) { } func TestAnalyzeSnapshot(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() tk := testkit.NewTestKit(t, store) @@ -380,7 +373,6 @@ func TestAnalyzeSnapshot(t *testing.T) { } func TestHistogramsWithSameTxnTS(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() tk := testkit.NewTestKit(t, store) @@ -400,3 +392,16 @@ func TestHistogramsWithSameTxnTS(t *testing.T) { v3 := rows[1][0].(string) require.Equal(t, v2, v3) } + +func TestAnalyzeLongString(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("set @@session.tidb_analyze_version = 2;") + tk.MustExec("create table t(a longtext);") + tk.MustExec("insert into t value(repeat(\"a\",65536));") + tk.MustExec("insert into t value(repeat(\"b\",65536));") + tk.MustExec("analyze table t with 0 topn") +} diff --git a/statistics/main_test.go b/statistics/main_test.go index b825b1d0b7aaf..7e40d650fe393 100644 --- a/statistics/main_test.go +++ b/statistics/main_test.go @@ -29,7 +29,7 @@ import ( "go.uber.org/goleak" ) -var testDataMap = make(testdata.BookKeeper, 1) +var testDataMap = make(testdata.BookKeeper, 3) func TestMain(m *testing.M) { testbridge.WorkaroundGoCheckFlags() @@ -44,6 +44,8 @@ func TestMain(m *testing.M) { }) testDataMap.LoadTestSuiteData("testdata", "integration_suite") + testDataMap.LoadTestSuiteData("testdata", "stats_suite") + testDataMap.LoadTestSuiteData("testdata", "trace_suite") opts := []goleak.Option{ goleak.IgnoreTopFunction("go.etcd.io/etcd/pkg/logutil.(*MergeLogger).outputLoop"), @@ -61,25 +63,30 @@ func GetIntegrationSuiteData() testdata.TestData { return testDataMap["integration_suite"] } +func GetStatsSuiteData() testdata.TestData { + return testDataMap["stats_suite"] +} + +func GetTraceSuiteData() testdata.TestData { + return testDataMap["trace_suite"] +} + // TestStatistics batches tests sharing a test suite to reduce the setups // overheads. func TestStatistics(t *testing.T) { - s := createTestStatisticsSamples(t) - // fmsketch_test.go - t.Run("SubTestSketch", SubTestSketch(s)) - t.Run("SubTestSketchProtoConversion", SubTestSketchProtoConversion(s)) - t.Run("SubTestFMSketchCoding", SubTestFMSketchCoding(s)) + t.Run("SubTestSketch", SubTestSketch()) + t.Run("SubTestSketchProtoConversion", SubTestSketchProtoConversion()) + t.Run("SubTestFMSketchCoding", SubTestFMSketchCoding()) // statistics_test.go - t.Run("SubTestColumnRange", SubTestColumnRange(s)) - t.Run("SubTestIntColumnRanges", SubTestIntColumnRanges(s)) - t.Run("SubTestIndexRanges", SubTestIndexRanges(s)) + t.Run("SubTestColumnRange", SubTestColumnRange()) + t.Run("SubTestIntColumnRanges", SubTestIntColumnRanges()) + t.Run("SubTestIndexRanges", SubTestIndexRanges()) // statistics_serial_test.go - t.Run("SubTestBuild", SubTestBuild(s)) - t.Run("SubTestHistogramProtoConversion", SubTestHistogramProtoConversion(s)) - + t.Run("SubTestBuild", SubTestBuild()) + t.Run("SubTestHistogramProtoConversion", SubTestHistogramProtoConversion()) } func createTestStatisticsSamples(t *testing.T) *testStatisticsSamples { diff --git a/statistics/row_sampler.go b/statistics/row_sampler.go index da1c303d23e66..75f60bfb15d13 100644 --- a/statistics/row_sampler.go +++ b/statistics/row_sampler.go @@ -30,6 +30,13 @@ import ( "github.com/pingcap/tipb/go-tipb" ) +// RowSampleCollector implements the needed interface for a row-based sample collector. +type RowSampleCollector interface { + MergeCollector(collector RowSampleCollector) + sampleRow(row []types.Datum, rng *rand.Rand) + Base() *baseCollector +} + type baseCollector struct { Samples WeightedRowSampleHeap NullCount []int64 @@ -90,18 +97,30 @@ func (h *WeightedRowSampleHeap) Pop() interface{} { return item } -// ReservoirRowSampleBuilder is used to construct the ReservoirRowSampleCollector to get the samples. -type ReservoirRowSampleBuilder struct { +// RowSampleBuilder is used to construct the ReservoirRowSampleCollector to get the samples. +type RowSampleBuilder struct { Sc *stmtctx.StatementContext RecordSet sqlexec.RecordSet ColsFieldType []*types.FieldType Collators []collate.Collator ColGroups [][]int64 MaxSampleSize int + SampleRate float64 MaxFMSketchSize int Rng *rand.Rand } +// NewRowSampleCollector creates a collector from the given inputs. +func NewRowSampleCollector(maxSampleSize int, sampleRate float64, totalLen int) RowSampleCollector { + if maxSampleSize > 0 { + return NewReservoirRowSampleCollector(maxSampleSize, totalLen) + } + if sampleRate > 0 { + return NewBernoulliRowSampleCollector(sampleRate, totalLen) + } + return nil +} + // NewReservoirRowSampleCollector creates the new collector by the given inputs. func NewReservoirRowSampleCollector(maxSampleSize int, totalLen int) *ReservoirRowSampleCollector { base := &baseCollector{ @@ -119,22 +138,13 @@ func NewReservoirRowSampleCollector(maxSampleSize int, totalLen int) *ReservoirR // Collect first builds the collector. Then maintain the null count, FM sketch and the data size for each column and // column group. // Then use the weighted reservoir sampling to collect the samples. -func (s *ReservoirRowSampleBuilder) Collect() (*ReservoirRowSampleCollector, error) { - base := &baseCollector{ - Samples: make(WeightedRowSampleHeap, 0, s.MaxSampleSize), - NullCount: make([]int64, len(s.ColsFieldType)+len(s.ColGroups)), - FMSketches: make([]*FMSketch, 0, len(s.ColsFieldType)+len(s.ColGroups)), - TotalSizes: make([]int64, len(s.ColsFieldType)+len(s.ColGroups)), - } - collector := &ReservoirRowSampleCollector{ - baseCollector: base, - MaxSampleSize: s.MaxSampleSize, - } +func (s *RowSampleBuilder) Collect() (RowSampleCollector, error) { + collector := NewRowSampleCollector(s.MaxSampleSize, s.SampleRate, len(s.ColsFieldType)+len(s.ColGroups)) for i := 0; i < len(s.ColsFieldType)+len(s.ColGroups); i++ { - collector.FMSketches = append(collector.FMSketches, NewFMSketch(s.MaxFMSketchSize)) + collector.Base().FMSketches = append(collector.Base().FMSketches, NewFMSketch(s.MaxFMSketchSize)) } ctx := context.TODO() - chk := s.RecordSet.NewChunk() + chk := s.RecordSet.NewChunk(nil) it := chunk.NewIterator4Chunk(chk) for { err := s.RecordSet.Next(ctx, chk) @@ -144,7 +154,7 @@ func (s *ReservoirRowSampleBuilder) Collect() (*ReservoirRowSampleCollector, err if chk.NumRows() == 0 { return collector, nil } - collector.Count += int64(chk.NumRows()) + collector.Base().Count += int64(chk.NumRows()) for row := it.Begin(); row != it.End(); row = it.Next() { datums := RowToDatums(row, s.RecordSet.Fields()) newCols := make([]types.Datum, len(datums)) @@ -171,25 +181,20 @@ func (s *ReservoirRowSampleBuilder) Collect() (*ReservoirRowSampleCollector, err datums[i].SetBytes(encodedKey) } } - err := collector.collectColumns(s.Sc, datums, sizes) + err := collector.Base().collectColumns(s.Sc, datums, sizes) if err != nil { return nil, err } - err = collector.collectColumnGroups(s.Sc, datums, s.ColGroups, sizes) + err = collector.Base().collectColumnGroups(s.Sc, datums, s.ColGroups, sizes) if err != nil { return nil, err } - weight := s.Rng.Int63() - item := &ReservoirRowSampleItem{ - Columns: newCols, - Weight: weight, - } - collector.sampleZippedRow(item) + collector.sampleRow(newCols, s.Rng) } } } -func (s *ReservoirRowSampleCollector) collectColumns(sc *stmtctx.StatementContext, cols []types.Datum, sizes []int64) error { +func (s *baseCollector) collectColumns(sc *stmtctx.StatementContext, cols []types.Datum, sizes []int64) error { for i, col := range cols { if col.IsNull() { s.NullCount[i]++ @@ -205,7 +210,7 @@ func (s *ReservoirRowSampleCollector) collectColumns(sc *stmtctx.StatementContex return nil } -func (s *ReservoirRowSampleCollector) collectColumnGroups(sc *stmtctx.StatementContext, cols []types.Datum, colGroups [][]int64, sizes []int64) error { +func (s *baseCollector) collectColumnGroups(sc *stmtctx.StatementContext, cols []types.Datum, colGroups [][]int64, sizes []int64) error { colLen := len(cols) datumBuffer := make([]types.Datum, 0, len(cols)) for i, group := range colGroups { @@ -229,22 +234,8 @@ func (s *ReservoirRowSampleCollector) collectColumnGroups(sc *stmtctx.StatementC return nil } -func (s *ReservoirRowSampleCollector) sampleZippedRow(sample *ReservoirRowSampleItem) { - if len(s.Samples) < s.MaxSampleSize { - s.Samples = append(s.Samples, sample) - if len(s.Samples) == s.MaxSampleSize { - heap.Init(&s.Samples) - } - return - } - if s.Samples[0].Weight < sample.Weight { - s.Samples[0] = sample - heap.Fix(&s.Samples, 0) - } -} - -// ToProto converts the collector to proto struct. -func (s *ReservoirRowSampleCollector) ToProto() *tipb.RowSampleCollector { +// ToProto converts the collector to pb struct. +func (s *baseCollector) ToProto() *tipb.RowSampleCollector { pbFMSketches := make([]*tipb.FMSketch, 0, len(s.FMSketches)) for _, sketch := range s.FMSketches { pbFMSketches = append(pbFMSketches, FMSketchToProto(sketch)) @@ -259,9 +250,7 @@ func (s *ReservoirRowSampleCollector) ToProto() *tipb.RowSampleCollector { return collector } -// FromProto constructs the collector from the proto struct. -func (s *ReservoirRowSampleCollector) FromProto(pbCollector *tipb.RowSampleCollector) { - s.baseCollector = &baseCollector{} +func (s *baseCollector) FromProto(pbCollector *tipb.RowSampleCollector) { s.Count = pbCollector.Count s.NullCount = pbCollector.NullCounts s.FMSketches = make([]*FMSketch, 0, len(pbCollector.FmSketch)) @@ -277,8 +266,7 @@ func (s *ReservoirRowSampleCollector) FromProto(pbCollector *tipb.RowSampleColle copy(b, col) data = append(data, types.NewBytesDatum(b)) } - // The samples collected from regions are also organized by binary heap. So we can just copy the slice. - // No need to maintain the heap again. + // Directly copy the weight. s.Samples = append(s.Samples, &ReservoirRowSampleItem{ Columns: data, Weight: pbSample.Weight, @@ -286,19 +274,59 @@ func (s *ReservoirRowSampleCollector) FromProto(pbCollector *tipb.RowSampleColle } } +// Base implements the RowSampleCollector interface. +func (s *ReservoirRowSampleCollector) Base() *baseCollector { + return s.baseCollector +} + +func (s *ReservoirRowSampleCollector) sampleZippedRow(sample *ReservoirRowSampleItem) { + if len(s.Samples) < s.MaxSampleSize { + s.Samples = append(s.Samples, sample) + if len(s.Samples) == s.MaxSampleSize { + heap.Init(&s.Samples) + } + return + } + if s.Samples[0].Weight < sample.Weight { + s.Samples[0] = sample + heap.Fix(&s.Samples, 0) + } +} + +func (s *ReservoirRowSampleCollector) sampleRow(row []types.Datum, rng *rand.Rand) { + weight := rng.Int63() + if len(s.Samples) < s.MaxSampleSize { + s.Samples = append(s.Samples, &ReservoirRowSampleItem{ + Columns: row, + Weight: weight, + }) + if len(s.Samples) == s.MaxSampleSize { + heap.Init(&s.Samples) + } + return + } + if s.Samples[0].Weight < weight { + s.Samples[0] = &ReservoirRowSampleItem{ + Columns: row, + Weight: weight, + } + heap.Fix(&s.Samples, 0) + } +} + // MergeCollector merges the collectors to a final one. -func (s *ReservoirRowSampleCollector) MergeCollector(subCollector *ReservoirRowSampleCollector) { - s.Count += subCollector.Count - for i := range subCollector.FMSketches { - s.FMSketches[i].MergeFMSketch(subCollector.FMSketches[i]) +func (s *ReservoirRowSampleCollector) MergeCollector(subCollector RowSampleCollector) { + s.Count += subCollector.Base().Count + for i, fms := range subCollector.Base().FMSketches { + s.FMSketches[i].MergeFMSketch(fms) } - for i := range subCollector.NullCount { - s.NullCount[i] += subCollector.NullCount[i] + for i, nullCount := range subCollector.Base().NullCount { + s.NullCount[i] += nullCount } - for i := range subCollector.TotalSizes { - s.TotalSizes[i] += subCollector.TotalSizes[i] + for i, totSize := range subCollector.Base().TotalSizes { + s.TotalSizes[i] += totSize } - for _, sample := range subCollector.Samples { + for _, sample := range subCollector.Base().Samples { s.sampleZippedRow(sample) } } @@ -326,3 +354,60 @@ func RowSamplesToProto(samples WeightedRowSampleHeap) []*tipb.RowSample { } return rows } + +// BernoulliRowSampleCollector collects the samples from the source and organize the sample by row. +// It will maintain the following things: +// Row samples. +// FM sketches(To calculate the NDV). +// Null counts. +// The data sizes. +// The number of rows. +// It uses the bernoulli sampling to collect the data. +type BernoulliRowSampleCollector struct { + *baseCollector + SampleRate float64 +} + +// NewBernoulliRowSampleCollector creates the new collector by the given inputs. +func NewBernoulliRowSampleCollector(sampleRate float64, totalLen int) *BernoulliRowSampleCollector { + base := &baseCollector{ + Samples: make(WeightedRowSampleHeap, 0, 8), + NullCount: make([]int64, totalLen), + FMSketches: make([]*FMSketch, 0, totalLen), + TotalSizes: make([]int64, totalLen), + } + return &BernoulliRowSampleCollector{ + baseCollector: base, + SampleRate: sampleRate, + } +} + +func (s *BernoulliRowSampleCollector) sampleRow(row []types.Datum, rng *rand.Rand) { + if rng.Float64() > s.SampleRate { + return + } + s.baseCollector.Samples = append(s.baseCollector.Samples, &ReservoirRowSampleItem{ + Columns: row, + Weight: 0, + }) +} + +// MergeCollector merges the collectors to a final one. +func (s *BernoulliRowSampleCollector) MergeCollector(subCollector RowSampleCollector) { + s.Count += subCollector.Base().Count + for i := range subCollector.Base().FMSketches { + s.FMSketches[i].MergeFMSketch(subCollector.Base().FMSketches[i]) + } + for i := range subCollector.Base().NullCount { + s.NullCount[i] += subCollector.Base().NullCount[i] + } + for i := range subCollector.Base().TotalSizes { + s.TotalSizes[i] += subCollector.Base().TotalSizes[i] + } + s.baseCollector.Samples = append(s.baseCollector.Samples, subCollector.Base().Samples...) +} + +// Base implements the interface RowSampleCollector. +func (s *BernoulliRowSampleCollector) Base() *baseCollector { + return s.baseCollector +} diff --git a/statistics/sample.go b/statistics/sample.go index c7dcbcec59382..6b55ad8367b60 100644 --- a/statistics/sample.go +++ b/statistics/sample.go @@ -78,7 +78,7 @@ func (s *sampleItemSorter) Len() int { func (s *sampleItemSorter) Less(i, j int) bool { var cmp int - cmp, s.err = s.items[i].Value.CompareDatum(s.sc, &s.items[j].Value) + cmp, s.err = s.items[i].Value.Compare(s.sc, &s.items[j].Value, collate.GetBinaryCollator()) if s.err != nil { return true } @@ -240,7 +240,7 @@ func (s SampleBuilder) CollectColumnStats() ([]*SampleCollector, *SortedBuilder, } } ctx := context.TODO() - req := s.RecordSet.NewChunk() + req := s.RecordSet.NewChunk(nil) it := chunk.NewIterator4Chunk(req) for { err := s.RecordSet.Next(ctx, req) diff --git a/statistics/sample_test.go b/statistics/sample_test.go index 191ef9267e1ae..97a00e55dfa8e 100644 --- a/statistics/sample_test.go +++ b/statistics/sample_test.go @@ -56,7 +56,6 @@ func recordSetForDistributedSamplingTest(size, batch int) []*recordSet { } func TestWeightedSampling(t *testing.T) { - t.Parallel() sampleNum := int64(20) rowNum := 100 loopCnt := 1000 @@ -67,7 +66,7 @@ func TestWeightedSampling(t *testing.T) { // for x := 0; x < 800; x++ { itemCnt := make([]int, rowNum) for loopI := 0; loopI < loopCnt; loopI++ { - builder := &ReservoirRowSampleBuilder{ + builder := &RowSampleBuilder{ Sc: sc, RecordSet: rs, ColsFieldType: []*types.FieldType{types.NewFieldType(mysql.TypeLonglong)}, @@ -79,8 +78,8 @@ func TestWeightedSampling(t *testing.T) { } collector, err := builder.Collect() require.NoError(t, err) - for i := 0; i < collector.MaxSampleSize; i++ { - a := collector.Samples[i].Columns[0].GetInt64() + for i := 0; i < int(sampleNum); i++ { + a := collector.Base().Samples[i].Columns[0].GetInt64() itemCnt[a]++ } require.Nil(t, rs.Close()) @@ -95,7 +94,6 @@ func TestWeightedSampling(t *testing.T) { } func TestDistributedWeightedSampling(t *testing.T) { - t.Parallel() sampleNum := int64(10) rowNum := 100 loopCnt := 1500 @@ -110,7 +108,7 @@ func TestDistributedWeightedSampling(t *testing.T) { rootRowCollector := NewReservoirRowSampleCollector(int(sampleNum), 1) rootRowCollector.FMSketches = append(rootRowCollector.FMSketches, NewFMSketch(1000)) for i := 0; i < batch; i++ { - builder := &ReservoirRowSampleBuilder{ + builder := &RowSampleBuilder{ Sc: sc, RecordSet: sets[i], ColsFieldType: []*types.FieldType{types.NewFieldType(mysql.TypeLonglong)}, @@ -139,7 +137,6 @@ func TestDistributedWeightedSampling(t *testing.T) { } func TestBuildStatsOnRowSample(t *testing.T) { - t.Parallel() ctx := mock.NewContext() sketch := NewFMSketch(1000) data := make([]*SampleItem, 0, 8) diff --git a/statistics/scalar_test.go b/statistics/scalar_test.go index 9eeeec0184ac2..260716d121365 100644 --- a/statistics/scalar_test.go +++ b/statistics/scalar_test.go @@ -61,8 +61,6 @@ func getUnsignedFieldType() *types.FieldType { } func TestCalcFraction(t *testing.T) { - t.Parallel() - tests := []struct { lower types.Datum upper types.Datum @@ -179,8 +177,6 @@ func TestCalcFraction(t *testing.T) { } func TestEnumRangeValues(t *testing.T) { - t.Parallel() - tests := []struct { low types.Datum high types.Datum diff --git a/statistics/selectivity.go b/statistics/selectivity.go index 0432e58f47409..45db1cebf9b1c 100644 --- a/statistics/selectivity.go +++ b/statistics/selectivity.go @@ -15,6 +15,7 @@ package statistics import ( + "bytes" "math" "math/bits" "sort" @@ -22,12 +23,16 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/parser/ast" + "github.com/pingcap/tidb/parser/format" "github.com/pingcap/tidb/parser/mysql" planutil "github.com/pingcap/tidb/planner/util" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" + driver "github.com/pingcap/tidb/types/parser_driver" + "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/ranger" + "github.com/pingcap/tidb/util/tracing" "go.uber.org/zap" ) @@ -179,14 +184,20 @@ func (coll *HistColl) Selectivity(ctx sessionctx.Context, exprs []expression.Exp if coll.Count == 0 || len(exprs) == 0 { return 1, nil, nil } + ret := 1.0 + sc := ctx.GetSessionVars().StmtCtx + tableID := coll.PhysicalID // TODO: If len(exprs) is bigger than 63, we could use bitset structure to replace the int64. // This will simplify some code and speed up if we use this rather than a boolean slice. if len(exprs) > 63 || (len(coll.Columns) == 0 && len(coll.Indices) == 0) { - return pseudoSelectivity(coll, exprs), nil, nil + ret = pseudoSelectivity(coll, exprs) + if sc.EnableOptimizerCETrace { + CETraceExpr(ctx, tableID, "Table Stats-Pseudo-Expression", expression.ComposeCNFCondition(ctx, exprs...), ret*float64(coll.Count)) + } + return ret, nil, nil } - ret := 1.0 + var nodes []*StatsNode - sc := ctx.GetSessionVars().StmtCtx remainedExprs := make([]expression.Expression, 0, len(exprs)) @@ -198,7 +209,7 @@ func (coll *HistColl) Selectivity(ctx sessionctx.Context, exprs []expression.Exp continue } - if colHist := coll.Columns[c.UniqueID]; colHist == nil || colHist.IsInvalid(sc, coll.Pseudo) { + if colHist := coll.Columns[c.UniqueID]; colHist == nil || colHist.IsInvalid(ctx, coll.Pseudo) { ret *= 1.0 / pseudoEqualRate continue } @@ -224,14 +235,14 @@ func (coll *HistColl) Selectivity(ctx sessionctx.Context, exprs []expression.Exp if colInfo.IsHandle { nodes[len(nodes)-1].Tp = PkType var cnt float64 - cnt, err = coll.GetRowCountByIntColumnRanges(sc, id, ranges) + cnt, err = coll.GetRowCountByIntColumnRanges(ctx, id, ranges) if err != nil { return 0, nil, errors.Trace(err) } nodes[len(nodes)-1].Selectivity = cnt / float64(coll.Count) continue } - cnt, err := coll.GetRowCountByColumnRanges(sc, id, ranges) + cnt, err := coll.GetRowCountByColumnRanges(ctx, id, ranges) if err != nil { return 0, nil, errors.Trace(err) } @@ -262,7 +273,7 @@ func (coll *HistColl) Selectivity(ctx sessionctx.Context, exprs []expression.Exp if err != nil { return 0, nil, errors.Trace(err) } - cnt, err := coll.GetRowCountByIndexRanges(sc, id, ranges) + cnt, err := coll.GetRowCountByIndexRanges(ctx, id, ranges) if err != nil { return 0, nil, errors.Trace(err) } @@ -281,6 +292,9 @@ func (coll *HistColl) Selectivity(ctx sessionctx.Context, exprs []expression.Exp usedSets := GetUsableSetsByGreedy(nodes) // Initialize the mask with the full set. mask := (int64(1) << uint(len(remainedExprs))) - 1 + // curExpr records covered expressions by now. It's for cardinality estimation tracing. + var curExpr []expression.Expression + for _, set := range usedSets { mask &^= set.mask ret *= set.Selectivity @@ -291,6 +305,16 @@ func (coll *HistColl) Selectivity(ctx sessionctx.Context, exprs []expression.Exp if set.partCover { ret *= selectionFactor } + if sc.EnableOptimizerCETrace { + // Tracing for the expression estimation results after applying this StatsNode. + for i := range remainedExprs { + if set.mask&(1<<uint64(i)) > 0 { + curExpr = append(curExpr, remainedExprs[i]) + } + } + expr := expression.ComposeCNFCondition(ctx, curExpr...) + CETraceExpr(ctx, tableID, "Table Stats-Expression-CNF", expr, ret*float64(coll.Count)) + } } // Now we try to cover those still not covered DNF conditions using independence assumption, @@ -345,12 +369,22 @@ func (coll *HistColl) Selectivity(ctx sessionctx.Context, exprs []expression.Exp } selectivity = selectivity + curSelectivity - selectivity*curSelectivity + if sc.EnableOptimizerCETrace { + // Tracing for the expression estimation results of this DNF. + CETraceExpr(ctx, tableID, "Table Stats-Expression-DNF", scalarCond, selectivity*float64(coll.Count)) + } } if selectivity != 0 { ret *= selectivity mask &^= 1 << uint64(i) } + if sc.EnableOptimizerCETrace { + // Tracing for the expression estimation results after applying the DNF estimation result. + curExpr = append(curExpr, remainedExprs[i]) + expr := expression.ComposeCNFCondition(ctx, curExpr...) + CETraceExpr(ctx, tableID, "Table Stats-Expression-CNF", expr, ret*float64(coll.Count)) + } } } @@ -358,17 +392,21 @@ func (coll *HistColl) Selectivity(ctx sessionctx.Context, exprs []expression.Exp if mask > 0 { ret *= selectionFactor } + if sc.EnableOptimizerCETrace { + // Tracing for the expression estimation results after applying the default selectivity. + totalExpr := expression.ComposeCNFCondition(ctx, remainedExprs...) + CETraceExpr(ctx, tableID, "Table Stats-Expression-CNF", totalExpr, ret*float64(coll.Count)) + } return ret, nodes, nil } func getMaskAndRanges(ctx sessionctx.Context, exprs []expression.Expression, rangeType ranger.RangeType, lengths []int, cachedPath *planutil.AccessPath, cols ...*expression.Column) (mask int64, ranges []*ranger.Range, partCover bool, err error) { - sc := ctx.GetSessionVars().StmtCtx isDNF := false var accessConds, remainedConds []expression.Expression switch rangeType { case ranger.ColumnRangeType: accessConds = ranger.ExtractAccessConditionsForColumn(exprs, cols[0]) - ranges, err = ranger.BuildColumnRange(accessConds, sc, cols[0].RetType, types.UnspecifiedLength) + ranges, err = ranger.BuildColumnRange(accessConds, ctx, cols[0].RetType, types.UnspecifiedLength) case ranger.IndexRangeType: if cachedPath != nil { ranges, accessConds, remainedConds, isDNF = cachedPath.Ranges, cachedPath.AccessConds, cachedPath.TableFilters, cachedPath.IsDNFCond @@ -479,3 +517,81 @@ func FindPrefixOfIndexByCol(cols []*expression.Column, idxColIDs []int64, cached } return expression.FindPrefixOfIndex(cols, idxColIDs) } + +// CETraceExpr appends an expression and related information into CE trace +func CETraceExpr(sctx sessionctx.Context, tableID int64, tp string, expr expression.Expression, rowCount float64) { + exprStr, err := ExprToString(expr) + if err != nil { + logutil.BgLogger().Debug("[OptimizerTrace] Failed to trace CE of an expression", + zap.Any("expression", expr)) + return + } + rec := tracing.CETraceRecord{ + TableID: tableID, + Type: tp, + Expr: exprStr, + RowCount: uint64(rowCount), + } + sc := sctx.GetSessionVars().StmtCtx + sc.OptimizerCETrace = append(sc.OptimizerCETrace, &rec) +} + +// ExprToString prints an Expression into a string which can appear in a SQL. +// +// It might be too tricky because it makes use of TiDB allowing using internal function name in SQL. +// For example, you can write `eq`(a, 1), which is the same as a = 1. +// We should have implemented this by first implementing a method to turn an expression to an AST +// then call astNode.Restore(), like the Constant case here. But for convenience, we use this trick for now. +// +// It may be more appropriate to put this in expression package. But currently we only use it for CE trace, +// and it may not be general enough to handle all possible expressions. So we put it here for now. +func ExprToString(e expression.Expression) (string, error) { + switch expr := e.(type) { + case *expression.ScalarFunction: + var buffer bytes.Buffer + buffer.WriteString("`" + expr.FuncName.L + "`(") + switch expr.FuncName.L { + case ast.Cast: + for _, arg := range expr.GetArgs() { + argStr, err := ExprToString(arg) + if err != nil { + return "", err + } + buffer.WriteString(argStr) + buffer.WriteString(", ") + buffer.WriteString(expr.RetType.String()) + } + default: + for i, arg := range expr.GetArgs() { + argStr, err := ExprToString(arg) + if err != nil { + return "", err + } + buffer.WriteString(argStr) + if i+1 != len(expr.GetArgs()) { + buffer.WriteString(", ") + } + } + } + buffer.WriteString(")") + return buffer.String(), nil + case *expression.Column: + return expr.String(), nil + case *expression.CorrelatedColumn: + return "", errors.New("tracing for correlated columns not supported now") + case *expression.Constant: + value, err := expr.Eval(chunk.Row{}) + if err != nil { + return "", err + } + valueExpr := driver.ValueExpr{Datum: value} + var buffer bytes.Buffer + restoreCtx := format.NewRestoreCtx(format.DefaultRestoreFlags, &buffer) + err = valueExpr.Restore(restoreCtx) + if err != nil { + return "", err + } + return buffer.String(), nil + } + return "", errors.New("unexpected type of Expression") +} diff --git a/statistics/selectivity_serial_test.go b/statistics/selectivity_serial_test.go new file mode 100644 index 0000000000000..a128be3850049 --- /dev/null +++ b/statistics/selectivity_serial_test.go @@ -0,0 +1,787 @@ +// Copyright 2021 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, +// 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. + +package statistics_test + +import ( + "context" + "fmt" + "math" + "os" + "runtime/pprof" + "testing" + + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/parser/model" + 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/statistics" + "github.com/pingcap/tidb/statistics/handle" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/testkit/testdata" + "github.com/pingcap/tidb/util/collate" + "github.com/pingcap/tidb/util/mock" + "github.com/stretchr/testify/require" +) + +func TestCollationColumnEstimate(t *testing.T) { + domain.RunAutoAnalyze = false + store, dom, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + tk := testkit.NewTestKit(t, store) + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a varchar(20) collate utf8mb4_general_ci)") + tk.MustExec("insert into t values('aaa'), ('bbb'), ('AAA'), ('BBB')") + tk.MustExec("set @@session.tidb_analyze_version=2") + h := dom.StatsHandle() + require.Nil(t, h.DumpStatsDeltaToKV(handle.DumpAll)) + tk.MustExec("analyze table t") + tk.MustExec("explain select * from t where a = 'aaa'") + require.Nil(t, h.LoadNeededHistograms()) + var ( + input []string + output [][]string + ) + statsSuiteData := statistics.GetStatsSuiteData() + statsSuiteData.GetTestCases(t, &input, &output) + for i := 0; i < len(input); i++ { + testdata.OnRecord(func() { + output[i] = testdata.ConvertRowsToStrings(tk.MustQuery(input[i]).Rows()) + }) + tk.MustQuery(input[i]).Check(testkit.Rows(output[i]...)) + } +} + +func BenchmarkSelectivity(b *testing.B) { + domain.RunAutoAnalyze = false + store, dom, clean := testkit.CreateMockStoreAndDomain(b) + defer clean() + testKit := testkit.NewTestKit(b, store) + statsTbl, err := prepareSelectivity(testKit, dom) + require.NoError(b, err) + exprs := "a > 1 and b < 2 and c > 3 and d < 4 and e > 5" + sql := "select * from t where " + exprs + sctx := testKit.Session().(sessionctx.Context) + stmts, err := session.Parse(sctx, sql) + require.NoErrorf(b, err, "error %v, for expr %s", err, exprs) + require.Len(b, stmts, 1) + ret := &plannercore.PreprocessorReturn{} + err = plannercore.Preprocess(sctx, stmts[0], plannercore.WithPreprocessorReturn(ret)) + require.NoErrorf(b, err, "for %s", exprs) + p, _, err := plannercore.BuildLogicalPlanForTest(context.Background(), sctx, stmts[0], ret.InfoSchema) + require.NoErrorf(b, err, "error %v, for building plan, expr %s", err, exprs) + + file, err := os.Create("cpu.profile") + require.NoError(b, err) + defer func() { + err := file.Close() + require.NoError(b, err) + }() + err = pprof.StartCPUProfile(file) + require.NoError(b, err) + + b.Run("Selectivity", func(b *testing.B) { + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, _, err := statsTbl.Selectivity(sctx, p.(plannercore.LogicalPlan).Children()[0].(*plannercore.LogicalSelection).Conditions, nil) + require.NoError(b, err) + } + b.ReportAllocs() + }) + pprof.StopCPUProfile() +} + +func TestOutOfRangeEstimation(t *testing.T) { + domain.RunAutoAnalyze = false + store, dom, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + testKit := testkit.NewTestKit(t, store) + testKit.MustExec("use test") + testKit.MustExec("drop table if exists t") + testKit.MustExec("create table t(a int unsigned)") + for i := 0; i < 3000; i++ { + testKit.MustExec(fmt.Sprintf("insert into t values (%v)", i/5+300)) // [300, 900) + } + testKit.MustExec("analyze table t with 2000 samples") + + h := dom.StatsHandle() + table, err := dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + statsTbl := h.GetTableStats(table.Meta()) + sctx := mock.NewContext() + col := statsTbl.Columns[table.Meta().Columns[0].ID] + count, err := col.GetColumnRowCount(sctx, getRange(900, 900), statsTbl.Count, false) + require.NoError(t, err) + // Because the ANALYZE collect data by random sampling, so the result is not an accurate value. + // so we use a range here. + require.Truef(t, count < 5.5, "expected: around 5.0, got: %v", count) + require.Truef(t, count > 4.5, "expected: around 5.0, got: %v", count) + + var input []struct { + Start int64 + End int64 + } + var output []struct { + Start int64 + End int64 + Count float64 + } + statsSuiteData := statistics.GetStatsSuiteData() + statsSuiteData.GetTestCases(t, &input, &output) + increasedTblRowCount := int64(float64(statsTbl.Count) * 1.5) + for i, ran := range input { + count, err = col.GetColumnRowCount(sctx, getRange(ran.Start, ran.End), increasedTblRowCount, false) + require.NoError(t, err) + testdata.OnRecord(func() { + output[i].Start = ran.Start + output[i].End = ran.End + output[i].Count = count + }) + require.Truef(t, count < output[i].Count*1.2, "for [%v, %v], needed: around %v, got: %v", ran.Start, ran.End, output[i].Count, count) + require.Truef(t, count > output[i].Count*0.8, "for [%v, %v], needed: around %v, got: %v", ran.Start, ran.End, output[i].Count, count) + } +} + +func TestEstimationForUnknownValues(t *testing.T) { + domain.RunAutoAnalyze = false + store, dom, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + testKit := testkit.NewTestKit(t, store) + testKit.MustExec("use test") + testKit.MustExec("drop table if exists t") + testKit.MustExec("create table t(a int, b int, key idx(a, b))") + testKit.MustExec("set @@tidb_analyze_version=1") + testKit.MustExec("analyze table t") + for i := 0; i < 10; i++ { + testKit.MustExec(fmt.Sprintf("insert into t values (%d, %d)", i, i)) + } + h := dom.StatsHandle() + require.Nil(t, h.DumpStatsDeltaToKV(handle.DumpAll)) + testKit.MustExec("analyze table t") + for i := 0; i < 10; i++ { + testKit.MustExec(fmt.Sprintf("insert into t values (%d, %d)", i+10, i+10)) + } + require.Nil(t, h.DumpStatsDeltaToKV(handle.DumpAll)) + require.Nil(t, h.Update(dom.InfoSchema())) + table, err := dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + statsTbl := h.GetTableStats(table.Meta()) + + sctx := mock.NewContext() + colID := table.Meta().Columns[0].ID + count, err := statsTbl.GetRowCountByColumnRanges(sctx, colID, getRange(30, 30)) + require.NoError(t, err) + require.Equal(t, 0.2, count) + + count, err = statsTbl.GetRowCountByColumnRanges(sctx, colID, getRange(9, 30)) + require.NoError(t, err) + require.Equal(t, 7.2, count) + + count, err = statsTbl.GetRowCountByColumnRanges(sctx, colID, getRange(9, math.MaxInt64)) + require.NoError(t, err) + require.Equal(t, 7.2, count) + + idxID := table.Meta().Indices[0].ID + count, err = statsTbl.GetRowCountByIndexRanges(sctx, idxID, getRange(30, 30)) + require.NoError(t, err) + require.Equal(t, 0.1, count) + + count, err = statsTbl.GetRowCountByIndexRanges(sctx, idxID, getRange(9, 30)) + require.NoError(t, err) + require.Equal(t, 7.0, count) + + testKit.MustExec("truncate table t") + testKit.MustExec("insert into t values (null, null)") + testKit.MustExec("analyze table t") + table, err = dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + statsTbl = h.GetTableStats(table.Meta()) + + colID = table.Meta().Columns[0].ID + count, err = statsTbl.GetRowCountByColumnRanges(sctx, colID, getRange(1, 30)) + require.NoError(t, err) + require.Equal(t, 0.0, count) + + 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 = dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + statsTbl = h.GetTableStats(table.Meta()) + + colID = table.Meta().Columns[0].ID + count, err = statsTbl.GetRowCountByColumnRanges(sctx, colID, getRange(2, 2)) + require.NoError(t, err) + require.Equal(t, 0.0, count) + + idxID = table.Meta().Indices[0].ID + count, err = statsTbl.GetRowCountByIndexRanges(sctx, idxID, getRange(2, 2)) + require.NoError(t, err) + require.Equal(t, 0.0, count) +} + +func TestEstimationUniqueKeyEqualConds(t *testing.T) { + domain.RunAutoAnalyze = false + store, dom, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + testKit := testkit.NewTestKit(t, store) + testKit.MustExec("use test") + testKit.MustExec("drop table if exists t") + testKit.MustExec("create table t(a int, b int, c int, unique key(b))") + testKit.MustExec("insert into t values (1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5),(6,6,6),(7,7,7)") + testKit.MustExec("analyze table t with 4 cmsketch width, 1 cmsketch depth;") + table, err := dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + statsTbl := dom.StatsHandle().GetTableStats(table.Meta()) + + sctx := mock.NewContext() + idxID := table.Meta().Indices[0].ID + count, err := statsTbl.GetRowCountByIndexRanges(sctx, idxID, getRange(7, 7)) + require.NoError(t, err) + require.Equal(t, 1.0, count) + + count, err = statsTbl.GetRowCountByIndexRanges(sctx, idxID, getRange(6, 6)) + require.NoError(t, err) + require.Equal(t, 1.0, count) + + colID := table.Meta().Columns[0].ID + count, err = statsTbl.GetRowCountByIntColumnRanges(sctx, colID, getRange(7, 7)) + require.NoError(t, err) + require.Equal(t, 1.0, count) + + count, err = statsTbl.GetRowCountByIntColumnRanges(sctx, colID, getRange(6, 6)) + require.NoError(t, err) + require.Equal(t, 1.0, count) +} + +func TestPrimaryKeySelectivity(t *testing.T) { + domain.RunAutoAnalyze = false + store, clean := testkit.CreateMockStore(t) + defer clean() + testKit := testkit.NewTestKit(t, store) + testKit.MustExec("use test") + testKit.MustExec("drop table if exists t") + testKit.Session().GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeIntOnly + testKit.MustExec("create table t(a char(10) primary key, b int)") + var input, output [][]string + statsSuiteData := statistics.GetStatsSuiteData() + statsSuiteData.GetTestCases(t, &input, &output) + for i, ts := range input { + for j, tt := range ts { + if j != len(ts)-1 { + testKit.MustExec(tt) + } + testdata.OnRecord(func() { + if j == len(ts)-1 { + output[i] = testdata.ConvertRowsToStrings(testKit.MustQuery(tt).Rows()) + } + }) + if j == len(ts)-1 { + testKit.MustQuery(tt).Check(testkit.Rows(output[i]...)) + } + } + } +} + +func TestStatsVer2(t *testing.T) { + domain.RunAutoAnalyze = false + store, clean := testkit.CreateMockStore(t) + defer clean() + testKit := testkit.NewTestKit(t, store) + testKit.MustExec("use test") + testKit.MustExec("set tidb_analyze_version=2") + + testKit.MustExec("drop table if exists tint") + testKit.MustExec("create table tint(a int, b int, c int, index singular(a), index multi(b, c))") + testKit.MustExec("insert into tint values (1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4), (5, 5, 5), (6, 6, 6), (7, 7, 7), (8, 8, 8)") + testKit.MustExec("analyze table tint with 2 topn, 3 buckets") + + testKit.MustExec("drop table if exists tdouble") + testKit.MustExec("create table tdouble(a double, b double, c double, index singular(a), index multi(b, c))") + testKit.MustExec("insert into tdouble values (1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4), (5, 5, 5), (6, 6, 6), (7, 7, 7), (8, 8, 8)") + testKit.MustExec("analyze table tdouble with 2 topn, 3 buckets") + + testKit.MustExec("drop table if exists tdecimal") + testKit.MustExec("create table tdecimal(a decimal(40, 20), b decimal(40, 20), c decimal(40, 20), index singular(a), index multi(b, c))") + testKit.MustExec("insert into tdecimal values (1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4), (5, 5, 5), (6, 6, 6), (7, 7, 7), (8, 8, 8)") + testKit.MustExec("analyze table tdecimal with 2 topn, 3 buckets") + + testKit.MustExec("drop table if exists tstring") + testKit.MustExec("create table tstring(a varchar(64), b varchar(64), c varchar(64), index singular(a), index multi(b, c))") + testKit.MustExec("insert into tstring values ('1', '1', '1'), ('2', '2', '2'), ('3', '3', '3'), ('4', '4', '4'), ('5', '5', '5'), ('6', '6', '6'), ('7', '7', '7'), ('8', '8', '8')") + testKit.MustExec("analyze table tstring with 2 topn, 3 buckets") + + testKit.MustExec("drop table if exists tdatetime") + testKit.MustExec("create table tdatetime(a datetime, b datetime, c datetime, index singular(a), index multi(b, c))") + testKit.MustExec("insert into tdatetime values ('2001-01-01', '2001-01-01', '2001-01-01'), ('2001-01-02', '2001-01-02', '2001-01-02'), ('2001-01-03', '2001-01-03', '2001-01-03'), ('2001-01-04', '2001-01-04', '2001-01-04')") + testKit.MustExec("analyze table tdatetime with 2 topn, 3 buckets") + + testKit.MustExec("drop table if exists tprefix") + testKit.MustExec("create table tprefix(a varchar(64), b varchar(64), index prefixa(a(2)))") + testKit.MustExec("insert into tprefix values ('111', '111'), ('222', '222'), ('333', '333'), ('444', '444'), ('555', '555'), ('666', '666')") + testKit.MustExec("analyze table tprefix with 2 topn, 3 buckets") + + // test with clustered index + testKit.MustExec("drop table if exists ct1") + testKit.MustExec("create table ct1 (a int, pk varchar(10), primary key(pk) clustered)") + testKit.MustExec("insert into ct1 values (1, '1'), (2, '2'), (3, '3'), (4, '4'), (5, '5'), (6, '6'), (7, '7'), (8, '8')") + testKit.MustExec("analyze table ct1 with 2 topn, 3 buckets") + + testKit.MustExec("drop table if exists ct2") + testKit.MustExec("create table ct2 (a int, b int, c int, primary key(a, b) clustered)") + testKit.MustExec("insert into ct2 values (1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4), (5, 5, 5), (6, 6, 6), (7, 7, 7), (8, 8, 8)") + testKit.MustExec("analyze table ct2 with 2 topn, 3 buckets") + + rows := testKit.MustQuery("select stats_ver from mysql.stats_histograms").Rows() + for _, r := range rows { + // ensure statsVer = 2 + require.Equal(t, "2", fmt.Sprintf("%v", r[0])) + } + + var ( + input []string + output [][]string + ) + statsSuiteData := statistics.GetStatsSuiteData() + statsSuiteData.GetTestCases(t, &input, &output) + for i := range input { + testdata.OnRecord(func() { + output[i] = testdata.ConvertRowsToStrings(testKit.MustQuery(input[i]).Rows()) + }) + testKit.MustQuery(input[i]).Check(testkit.Rows(output[i]...)) + } +} + +func TestTopNOutOfHist(t *testing.T) { + domain.RunAutoAnalyze = false + store, clean := testkit.CreateMockStore(t) + defer clean() + testKit := testkit.NewTestKit(t, store) + testKit.MustExec("use test") + testKit.MustExec("set tidb_analyze_version=2") + + testKit.MustExec("drop table if exists topn_before_hist") + testKit.MustExec("create table topn_before_hist(a int, index idx(a))") + testKit.MustExec("insert into topn_before_hist values(1), (1), (1), (1), (3), (3), (4), (5), (6)") + testKit.MustExec("analyze table topn_before_hist with 2 topn, 3 buckets") + + testKit.MustExec("create table topn_after_hist(a int, index idx(a))") + testKit.MustExec("insert into topn_after_hist values(2), (2), (3), (4), (5), (7), (7), (7), (7)") + testKit.MustExec("analyze table topn_after_hist with 2 topn, 3 buckets") + + testKit.MustExec("create table topn_before_hist_no_index(a int)") + testKit.MustExec("insert into topn_before_hist_no_index values(1), (1), (1), (1), (3), (3), (4), (5), (6)") + testKit.MustExec("analyze table topn_before_hist_no_index with 2 topn, 3 buckets") + + testKit.MustExec("create table topn_after_hist_no_index(a int)") + testKit.MustExec("insert into topn_after_hist_no_index values(2), (2), (3), (4), (5), (7), (7), (7), (7)") + testKit.MustExec("analyze table topn_after_hist_no_index with 2 topn, 3 buckets") + + var ( + input []string + output [][]string + ) + statsSuiteData := statistics.GetStatsSuiteData() + statsSuiteData.GetTestCases(t, &input, &output) + for i := range input { + testdata.OnRecord(func() { + output[i] = testdata.ConvertRowsToStrings(testKit.MustQuery(input[i]).Rows()) + }) + testKit.MustQuery(input[i]).Check(testkit.Rows(output[i]...)) + } +} + +func TestColumnIndexNullEstimation(t *testing.T) { + domain.RunAutoAnalyze = false + store, dom, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + testKit := testkit.NewTestKit(t, store) + testKit.MustExec("use test") + testKit.MustExec("drop table if exists t") + testKit.MustExec("create table t(a int, b int, c int, index idx_b(b), index idx_c_a(c, a))") + testKit.MustExec("insert into t values(1,null,1),(2,null,2),(3,3,3),(4,null,4),(null,null,null);") + h := dom.StatsHandle() + require.Nil(t, h.DumpStatsDeltaToKV(handle.DumpAll)) + testKit.MustExec("analyze table t") + var ( + input []string + output [][]string + ) + statsSuiteData := statistics.GetStatsSuiteData() + statsSuiteData.GetTestCases(t, &input, &output) + for i := 0; i < 5; i++ { + testdata.OnRecord(func() { + output[i] = testdata.ConvertRowsToStrings(testKit.MustQuery(input[i]).Rows()) + }) + testKit.MustQuery(input[i]).Check(testkit.Rows(output[i]...)) + } + // Make sure column stats has been loaded. + testKit.MustExec(`explain select * from t where a is null`) + require.Nil(t, h.LoadNeededHistograms()) + for i := 5; i < len(input); i++ { + testdata.OnRecord(func() { + output[i] = testdata.ConvertRowsToStrings(testKit.MustQuery(input[i]).Rows()) + }) + testKit.MustQuery(input[i]).Check(testkit.Rows(output[i]...)) + } +} + +func TestUniqCompEqualEst(t *testing.T) { + domain.RunAutoAnalyze = false + store, dom, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + testKit := testkit.NewTestKit(t, store) + testKit.MustExec("use test") + testKit.Session().GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeOn + testKit.MustExec("drop table if exists t") + testKit.MustExec("create table t(a int, b int, primary key(a, b))") + testKit.MustExec("insert into t values(1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(1,7),(1,8),(1,9),(1,10)") + h := dom.StatsHandle() + require.Nil(t, h.DumpStatsDeltaToKV(handle.DumpAll)) + testKit.MustExec("analyze table t") + var ( + input []string + output [][]string + ) + statsSuiteData := statistics.GetStatsSuiteData() + statsSuiteData.GetTestCases(t, &input, &output) + for i := 0; i < 1; i++ { + testdata.OnRecord(func() { + output[i] = testdata.ConvertRowsToStrings(testKit.MustQuery(input[i]).Rows()) + }) + testKit.MustQuery(input[i]).Check(testkit.Rows(output[i]...)) + } +} + +func TestSelectivity(t *testing.T) { + domain.RunAutoAnalyze = false + store, dom, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + testKit := testkit.NewTestKit(t, store) + statsTbl, err := prepareSelectivity(testKit, dom) + require.NoError(t, err) + longExpr := "0 < a and a = 1 " + for i := 1; i < 64; i++ { + longExpr += fmt.Sprintf(" and a > %d ", i) + } + tests := []struct { + exprs string + selectivity float64 + selectivityAfterIncrease float64 + }{ + { + exprs: "a > 0 and a < 2", + selectivity: 0.01851851851, + selectivityAfterIncrease: 0.01851851851, + }, + { + exprs: "a >= 1 and a < 2", + selectivity: 0.01851851851, + selectivityAfterIncrease: 0.01851851851, + }, + { + exprs: "a >= 1 and b > 1 and a < 2", + selectivity: 0.01783264746, + selectivityAfterIncrease: 0.01851851852, + }, + { + exprs: "a >= 1 and c > 1 and a < 2", + selectivity: 0.00617283950, + selectivityAfterIncrease: 0.00617283950, + }, + { + exprs: "a >= 1 and c >= 1 and a < 2", + selectivity: 0.01234567901, + selectivityAfterIncrease: 0.01234567901, + }, + { + exprs: "d = 0 and e = 1", + selectivity: 0.11111111111, + selectivityAfterIncrease: 0.11111111111, + }, + { + exprs: "b > 1", + selectivity: 0.96296296296, + selectivityAfterIncrease: 1, + }, + { + exprs: "a > 1 and b < 2 and c > 3 and d < 4 and e > 5", + selectivity: 0, + selectivityAfterIncrease: 0, + }, + { + exprs: longExpr, + selectivity: 0.001, + selectivityAfterIncrease: 0.001, + }, + } + + ctx := context.Background() + for _, tt := range tests { + sql := "select * from t where " + tt.exprs + sctx := testKit.Session().(sessionctx.Context) + stmts, err := session.Parse(sctx, sql) + require.NoErrorf(t, err, "for %s", tt.exprs) + require.Len(t, stmts, 1) + + ret := &plannercore.PreprocessorReturn{} + err = plannercore.Preprocess(sctx, stmts[0], plannercore.WithPreprocessorReturn(ret)) + require.NoErrorf(t, err, "for expr %s", tt.exprs) + p, _, err := plannercore.BuildLogicalPlanForTest(ctx, sctx, stmts[0], ret.InfoSchema) + require.NoErrorf(t, err, "for building plan, expr %s", err, tt.exprs) + + sel := p.(plannercore.LogicalPlan).Children()[0].(*plannercore.LogicalSelection) + ds := sel.Children()[0].(*plannercore.DataSource) + + histColl := statsTbl.GenerateHistCollFromColumnInfo(ds.Columns, ds.Schema().Columns) + + ratio, _, err := histColl.Selectivity(sctx, sel.Conditions, nil) + require.NoErrorf(t, err, "for %s", tt.exprs) + require.Truef(t, math.Abs(ratio-tt.selectivity) < eps, "for %s, needed: %v, got: %v", tt.exprs, tt.selectivity, ratio) + + histColl.Count *= 10 + ratio, _, err = histColl.Selectivity(sctx, sel.Conditions, nil) + require.NoErrorf(t, err, "for %s", tt.exprs) + require.Truef(t, math.Abs(ratio-tt.selectivityAfterIncrease) < eps, "for %s, needed: %v, got: %v", tt.exprs, tt.selectivityAfterIncrease, ratio) + } +} + +// TestDiscreteDistribution tests the estimation for discrete data distribution. This is more common when the index +// consists several columns, and the first column has small NDV. +func TestDiscreteDistribution(t *testing.T) { + domain.RunAutoAnalyze = false + store, clean := testkit.CreateMockStore(t) + defer clean() + testKit := testkit.NewTestKit(t, store) + testKit.MustExec("use test") + testKit.MustExec("drop table if exists t") + testKit.MustExec("create table t(a char(10), b int, key idx(a, b))") + for i := 0; i < 499; i++ { + testKit.MustExec(fmt.Sprintf("insert into t values ('cn', %d)", i)) + } + for i := 0; i < 10; i++ { + testKit.MustExec("insert into t values ('tw', 0)") + } + testKit.MustExec("analyze table t") + var ( + input []string + output [][]string + ) + + statsSuiteData := statistics.GetStatsSuiteData() + statsSuiteData.GetTestCases(t, &input, &output) + + for i, tt := range input { + testdata.OnRecord(func() { + output[i] = testdata.ConvertRowsToStrings(testKit.MustQuery(tt).Rows()) + }) + testKit.MustQuery(tt).Check(testkit.Rows(output[i]...)) + } +} + +func TestSelectCombinedLowBound(t *testing.T) { + domain.RunAutoAnalyze = false + store, clean := testkit.CreateMockStore(t) + defer clean() + testKit := testkit.NewTestKit(t, store) + testKit.MustExec("use test") + testKit.MustExec("drop table if exists t") + testKit.MustExec("create table t(id int auto_increment, kid int, pid int, primary key(id), key(kid, pid))") + testKit.MustExec("insert into t (kid, pid) values (1,2), (1,3), (1,4),(1, 11), (1, 12), (1, 13), (1, 14), (2, 2), (2, 3), (2, 4)") + testKit.MustExec("analyze table t") + var ( + input []string + output [][]string + ) + + statsSuiteData := statistics.GetStatsSuiteData() + statsSuiteData.GetTestCases(t, &input, &output) + + for i, tt := range input { + testdata.OnRecord(func() { + output[i] = testdata.ConvertRowsToStrings(testKit.MustQuery(tt).Rows()) + }) + testKit.MustQuery(tt).Check(testkit.Rows(output[i]...)) + } +} + +// TestDNFCondSelectivity tests selectivity calculation with DNF conditions covered by using independence assumption. +func TestDNFCondSelectivity(t *testing.T) { + domain.RunAutoAnalyze = false + store, dom, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + testKit := testkit.NewTestKit(t, store) + + testKit.MustExec("use test") + testKit.MustExec("drop table if exists t") + testKit.MustExec("create table t(a int, b int, c int, d int)") + testKit.MustExec("insert into t value(1,5,4,4),(3,4,1,8),(4,2,6,10),(6,7,2,5),(7,1,4,9),(8,9,8,3),(9,1,9,1),(10,6,6,2)") + testKit.MustExec("alter table t add index (b)") + testKit.MustExec("alter table t add index (d)") + testKit.MustExec(`analyze table t`) + + ctx := context.Background() + h := dom.StatsHandle() + tb, err := dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + tblInfo := tb.Meta() + statsTbl := h.GetTableStats(tblInfo) + + var ( + input []string + output []struct { + SQL string + Selectivity float64 + } + ) + statsSuiteData := statistics.GetStatsSuiteData() + statsSuiteData.GetTestCases(t, &input, &output) + for i, tt := range input { + sctx := testKit.Session().(sessionctx.Context) + stmts, err := session.Parse(sctx, tt) + require.NoErrorf(t, err, "error %v, for sql %s", err, tt) + require.Len(t, stmts, 1) + + ret := &plannercore.PreprocessorReturn{} + err = plannercore.Preprocess(sctx, stmts[0], plannercore.WithPreprocessorReturn(ret)) + require.NoErrorf(t, err, "error %v, for sql %s", err, tt) + p, _, err := plannercore.BuildLogicalPlanForTest(ctx, sctx, stmts[0], ret.InfoSchema) + require.NoErrorf(t, err, "error %v, for building plan, sql %s", err, tt) + + sel := p.(plannercore.LogicalPlan).Children()[0].(*plannercore.LogicalSelection) + ds := sel.Children()[0].(*plannercore.DataSource) + + histColl := statsTbl.GenerateHistCollFromColumnInfo(ds.Columns, ds.Schema().Columns) + + ratio, _, err := histColl.Selectivity(sctx, sel.Conditions, nil) + require.NoErrorf(t, err, "error %v, for expr %s", err, tt) + testdata.OnRecord(func() { + output[i].SQL = tt + output[i].Selectivity = ratio + }) + require.Truef(t, math.Abs(ratio-output[i].Selectivity) < eps, "for %s, needed: %v, got: %v", tt, output[i].Selectivity, ratio) + } + + // Test issue 19981 + testKit.MustExec("select * from t where _tidb_rowid is null or _tidb_rowid > 7") + + // Test issue 22134 + // Information about column n will not be in stats immediately after this SQL executed. + // If we don't have a check against this, DNF condition could lead to infinite recursion in Selectivity(). + testKit.MustExec("alter table t add column n timestamp;") + testKit.MustExec("select * from t where n = '2000-01-01' or n = '2000-01-02';") + + // Test issue 27294 + testKit.MustExec("create table tt (COL1 blob DEFAULT NULL,COL2 decimal(37,4) DEFAULT NULL,COL3 timestamp NULL DEFAULT NULL,COL4 int(11) DEFAULT NULL,UNIQUE KEY U_M_COL4(COL1(10),COL2), UNIQUE KEY U_M_COL5(COL3,COL2));") + testKit.MustExec("explain select * from tt where col1 is not null or col2 not between 454623814170074.2771 and -975540642273402.9269 and col3 not between '2039-1-19 10:14:57' and '2002-3-27 14:40:23';") +} + +func TestIndexEstimationCrossValidate(t *testing.T) { + domain.RunAutoAnalyze = false + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int, key(a,b))") + tk.MustExec("insert into t values(1, 1), (1, 2), (1, 3), (2, 2)") + tk.MustExec("analyze table t") + require.Nil(t, failpoint.Enable("github.com/pingcap/tidb/statistics/table/mockQueryBytesMaxUint64", `return(100000)`)) + tk.MustQuery("explain select * from t where a = 1 and b = 2").Check(testkit.Rows( + "IndexReader_6 1.00 root index:IndexRangeScan_5", + "└─IndexRangeScan_5 1.00 cop[tikv] table:t, index:a(a, b) range:[1 2,1 2], keep order:false")) + require.Nil(t, failpoint.Disable("github.com/pingcap/tidb/statistics/table/mockQueryBytesMaxUint64")) + + // Test issue 22466 + tk.MustExec("drop table if exists t2") + tk.MustExec("create table t2(a int, b int, key b(b))") + tk.MustExec("insert into t2 values(1, 1), (2, 2), (3, 3), (4, 4), (5,5)") + // This line of select will mark column b stats as needed, and an invalid(empty) stats for column b + // will be loaded at the next analyze line, this will trigger the bug. + tk.MustQuery("select * from t2 where b=2") + tk.MustExec("analyze table t2 index b") + tk.MustQuery("explain select * from t2 where b=2").Check(testkit.Rows( + "TableReader_7 1.00 root data:Selection_6", + "└─Selection_6 1.00 cop[tikv] eq(test.t2.b, 2)", + " └─TableFullScan_5 5.00 cop[tikv] table:t2 keep order:false")) +} + +func TestRangeStepOverflow(t *testing.T) { + domain.RunAutoAnalyze = false + store, dom, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (col datetime)") + tk.MustExec("insert into t values('3580-05-26 07:16:48'),('4055-03-06 22:27:16'),('4862-01-26 07:16:54')") + h := dom.StatsHandle() + require.Nil(t, h.DumpStatsDeltaToKV(handle.DumpAll)) + tk.MustExec("analyze table t") + // Trigger the loading of column stats. + tk.MustQuery("select * from t where col between '8499-1-23 2:14:38' and '9961-7-23 18:35:26'").Check(testkit.Rows()) + require.Nil(t, h.LoadNeededHistograms()) + // Must execute successfully after loading the column stats. + tk.MustQuery("select * from t where col between '8499-1-23 2:14:38' and '9961-7-23 18:35:26'").Check(testkit.Rows()) +} + +func TestSmallRangeEstimation(t *testing.T) { + domain.RunAutoAnalyze = false + store, dom, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + testKit := testkit.NewTestKit(t, store) + testKit.MustExec("use test") + testKit.MustExec("drop table if exists t") + testKit.MustExec("create table t(a int)") + for i := 0; i < 400; i++ { + testKit.MustExec(fmt.Sprintf("insert into t values (%v), (%v), (%v)", i, i, i)) // [0, 400) + } + testKit.MustExec("analyze table t with 0 topn") + + h := dom.StatsHandle() + table, err := dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + require.NoError(t, err) + statsTbl := h.GetTableStats(table.Meta()) + sctx := mock.NewContext() + col := statsTbl.Columns[table.Meta().Columns[0].ID] + + var input []struct { + Start int64 + End int64 + } + var output []struct { + Start int64 + End int64 + Count float64 + } + statsSuiteData := statistics.GetStatsSuiteData() + statsSuiteData.GetTestCases(t, &input, &output) + for i, ran := range input { + count, err := col.GetColumnRowCount(sctx, getRange(ran.Start, ran.End), statsTbl.Count, false) + require.NoError(t, err) + testdata.OnRecord(func() { + output[i].Start = ran.Start + output[i].End = ran.End + output[i].Count = count + }) + require.Truef(t, math.Abs(count-output[i].Count) < eps, "for [%v, %v], needed: around %v, got: %v", ran.Start, ran.End, output[i].Count, count) + } +} diff --git a/statistics/selectivity_test.go b/statistics/selectivity_test.go index 9c05628498df7..3a2e73777f54d 100644 --- a/statistics/selectivity_test.go +++ b/statistics/selectivity_test.go @@ -15,146 +15,27 @@ package statistics_test import ( - "context" - "fmt" "math" - "os" - "runtime/pprof" - "strings" "testing" "time" - . "github.com/pingcap/check" - "github.com/pingcap/errors" - "github.com/pingcap/failpoint" - "github.com/pingcap/log" "github.com/pingcap/tidb/domain" - "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" - plannercore "github.com/pingcap/tidb/planner/core" - "github.com/pingcap/tidb/session" - "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" - "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/statistics" - "github.com/pingcap/tidb/statistics/handle" - "github.com/pingcap/tidb/store/mockstore" + "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/codec" - "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/ranger" - "github.com/pingcap/tidb/util/testkit" - "github.com/pingcap/tidb/util/testleak" - "github.com/pingcap/tidb/util/testutil" - "go.uber.org/zap" - "go.uber.org/zap/zapcore" + "github.com/stretchr/testify/require" ) const eps = 1e-9 -var _ = SerialSuites(&testStatsSuite{}) - -type testStatsSuite struct { - store kv.Storage - do *domain.Domain - hook *logHook - testData testutil.TestData -} - -func (s *testStatsSuite) SetUpSuite(c *C) { - testleak.BeforeTest() - // Add the hook here to avoid data race. - s.registerHook() - var err error - s.store, s.do, err = newStoreWithBootstrap() - c.Assert(err, IsNil) - s.testData, err = testutil.LoadTestSuiteData("testdata", "stats_suite") - c.Assert(err, IsNil) -} - -func (s *testStatsSuite) TearDownSuite(c *C) { - s.do.Close() - c.Assert(s.store.Close(), IsNil) - testleak.AfterTest(c)() - c.Assert(s.testData.GenerateOutputIfNeeded(), IsNil) -} - -func (s *testStatsSuite) registerHook() { - conf := &log.Config{Level: os.Getenv("log_level"), File: log.FileLogConfig{}} - _, r, _ := log.InitLogger(conf) - s.hook = &logHook{r.Core, ""} - lg := zap.New(s.hook) - log.ReplaceGlobals(lg, r) -} - -type logHook struct { - zapcore.Core - results string -} - -func (h *logHook) Write(entry zapcore.Entry, fields []zapcore.Field) error { - message := entry.Message - if idx := strings.Index(message, "[stats"); idx != -1 { - h.results = h.results + message - for _, f := range fields { - h.results = h.results + ", " + f.Key + "=" + h.field2String(f) - } - } - return nil -} - -func (h *logHook) field2String(field zapcore.Field) string { - switch field.Type { - case zapcore.StringType: - return field.String - case zapcore.Int64Type, zapcore.Int32Type, zapcore.Uint32Type: - return fmt.Sprintf("%v", field.Integer) - case zapcore.Float64Type: - return fmt.Sprintf("%v", math.Float64frombits(uint64(field.Integer))) - case zapcore.StringerType: - return field.Interface.(fmt.Stringer).String() - } - return "not support" -} - -func (h *logHook) Check(e zapcore.Entry, ce *zapcore.CheckedEntry) *zapcore.CheckedEntry { - if h.Enabled(e.Level) { - return ce.AddCore(e, h) - } - return ce -} - -func newStoreWithBootstrap() (kv.Storage, *domain.Domain, error) { - store, err := mockstore.NewMockStore() - if err != nil { - return nil, nil, errors.Trace(err) - } - session.SetSchemaLease(0) - session.DisableStats4Test() - domain.RunAutoAnalyze = false - do, err := session.BootstrapSession(store) - do.SetStatsUpdating(true) - return store, do, errors.Trace(err) -} - -func cleanEnv(c *C, store kv.Storage, do *domain.Domain) { - tk := testkit.NewTestKit(c, 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)) - } - tk.MustExec("delete from mysql.stats_meta") - tk.MustExec("delete from mysql.stats_histograms") - tk.MustExec("delete from mysql.stats_buckets") - do.StatsHandle().Clear() -} - // generateIntDatum will generate a datum slice, every dimension is begin from 0, end with num - 1. // If dimension is x, num is y, the total number of datum is y^x. And This slice is sorted. -func (s *testStatsSuite) generateIntDatum(dimension, num int) ([]types.Datum, error) { +func generateIntDatum(dimension, num int) ([]types.Datum, error) { length := int(math.Pow(float64(num), float64(dimension))) ret := make([]types.Datum, length) if dimension == 1 { @@ -205,174 +86,39 @@ func mockStatsTable(tbl *model.TableInfo, rowCount int64) *statistics.Table { return statsTbl } -func (s *testStatsSuite) prepareSelectivity(testKit *testkit.TestKit, c *C) *statistics.Table { +func prepareSelectivity(testKit *testkit.TestKit, dom *domain.Domain) (*statistics.Table, error) { testKit.MustExec("use test") testKit.MustExec("drop table if exists t") testKit.MustExec("create table t(a int primary key, b int, c int, d int, e int, index idx_cd(c, d), index idx_de(d, e))") - is := s.do.InfoSchema() + is := dom.InfoSchema() tb, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) + if err != nil { + return nil, err + } tbl := tb.Meta() // mock the statistic table statsTbl := mockStatsTable(tbl, 540) // Set the value of columns' histogram. - colValues, err := s.generateIntDatum(1, 54) - c.Assert(err, IsNil) + colValues, err := generateIntDatum(1, 54) + if err != nil { + return nil, err + } for i := 1; i <= 5; i++ { statsTbl.Columns[int64(i)] = &statistics.Column{Histogram: *mockStatsHistogram(int64(i), colValues, 10, types.NewFieldType(mysql.TypeLonglong)), Info: tbl.Columns[i-1]} } // Set the value of two indices' histograms. - idxValues, err := s.generateIntDatum(2, 3) - c.Assert(err, IsNil) + idxValues, err := generateIntDatum(2, 3) + if err != nil { + return nil, err + } tp := types.NewFieldType(mysql.TypeBlob) statsTbl.Indices[1] = &statistics.Index{Histogram: *mockStatsHistogram(1, idxValues, 60, tp), Info: tbl.Indices[0]} statsTbl.Indices[2] = &statistics.Index{Histogram: *mockStatsHistogram(2, idxValues, 60, tp), Info: tbl.Indices[1]} - return statsTbl -} - -func (s *testStatsSuite) TestSelectivity(c *C) { - defer cleanEnv(c, s.store, s.do) - testKit := testkit.NewTestKit(c, s.store) - statsTbl := s.prepareSelectivity(testKit, c) - - longExpr := "0 < a and a = 1 " - for i := 1; i < 64; i++ { - longExpr += fmt.Sprintf(" and a > %d ", i) - } - tests := []struct { - exprs string - selectivity float64 - selectivityAfterIncrease float64 - }{ - { - exprs: "a > 0 and a < 2", - selectivity: 0.01851851851, - selectivityAfterIncrease: 0.01851851851, - }, - { - exprs: "a >= 1 and a < 2", - selectivity: 0.01851851851, - selectivityAfterIncrease: 0.01851851851, - }, - { - exprs: "a >= 1 and b > 1 and a < 2", - selectivity: 0.01783264746, - selectivityAfterIncrease: 0.01851851852, - }, - { - exprs: "a >= 1 and c > 1 and a < 2", - selectivity: 0.00617283950, - selectivityAfterIncrease: 0.00617283950, - }, - { - exprs: "a >= 1 and c >= 1 and a < 2", - selectivity: 0.01234567901, - selectivityAfterIncrease: 0.01234567901, - }, - { - exprs: "d = 0 and e = 1", - selectivity: 0.11111111111, - selectivityAfterIncrease: 0.11111111111, - }, - { - exprs: "b > 1", - selectivity: 0.96296296296, - selectivityAfterIncrease: 1, - }, - { - exprs: "a > 1 and b < 2 and c > 3 and d < 4 and e > 5", - selectivity: 0, - selectivityAfterIncrease: 0, - }, - { - exprs: longExpr, - selectivity: 0.001, - selectivityAfterIncrease: 0.001, - }, - } - - ctx := context.Background() - for _, tt := range tests { - sql := "select * from t where " + tt.exprs - comment := Commentf("for %s", tt.exprs) - sctx := testKit.Se.(sessionctx.Context) - stmts, err := session.Parse(sctx, sql) - c.Assert(err, IsNil, Commentf("error %v, for expr %s", err, tt.exprs)) - c.Assert(stmts, HasLen, 1) - - ret := &plannercore.PreprocessorReturn{} - err = plannercore.Preprocess(sctx, stmts[0], plannercore.WithPreprocessorReturn(ret)) - c.Assert(err, IsNil, comment) - p, _, err := plannercore.BuildLogicalPlanForTest(ctx, sctx, stmts[0], ret.InfoSchema) - c.Assert(err, IsNil, Commentf("error %v, for building plan, expr %s", err, tt.exprs)) - - sel := p.(plannercore.LogicalPlan).Children()[0].(*plannercore.LogicalSelection) - ds := sel.Children()[0].(*plannercore.DataSource) - - histColl := statsTbl.GenerateHistCollFromColumnInfo(ds.Columns, ds.Schema().Columns) - - ratio, _, err := histColl.Selectivity(sctx, sel.Conditions, nil) - c.Assert(err, IsNil, comment) - c.Assert(math.Abs(ratio-tt.selectivity) < eps, IsTrue, Commentf("for %s, needed: %v, got: %v", tt.exprs, tt.selectivity, ratio)) - - histColl.Count *= 10 - ratio, _, err = histColl.Selectivity(sctx, sel.Conditions, nil) - c.Assert(err, IsNil, comment) - c.Assert(math.Abs(ratio-tt.selectivityAfterIncrease) < eps, IsTrue, Commentf("for %s, needed: %v, got: %v", tt.exprs, tt.selectivityAfterIncrease, ratio)) - } -} - -// TestDiscreteDistribution tests the estimation for discrete data distribution. This is more common when the index -// consists several columns, and the first column has small NDV. -func (s *testStatsSuite) TestDiscreteDistribution(c *C) { - defer cleanEnv(c, s.store, s.do) - testKit := testkit.NewTestKit(c, s.store) - testKit.MustExec("use test") - testKit.MustExec("drop table if exists t") - testKit.MustExec("create table t(a char(10), b int, key idx(a, b))") - for i := 0; i < 499; i++ { - testKit.MustExec(fmt.Sprintf("insert into t values ('cn', %d)", i)) - } - for i := 0; i < 10; i++ { - testKit.MustExec("insert into t values ('tw', 0)") - } - testKit.MustExec("analyze table t") - var ( - input []string - output [][]string - ) - s.testData.GetTestCases(c, &input, &output) - for i, tt := range input { - s.testData.OnRecord(func() { - output[i] = s.testData.ConvertRowsToStrings(testKit.MustQuery(tt).Rows()) - }) - testKit.MustQuery(tt).Check(testkit.Rows(output[i]...)) - } -} - -func (s *testStatsSuite) TestSelectCombinedLowBound(c *C) { - defer cleanEnv(c, s.store, s.do) - testKit := testkit.NewTestKit(c, s.store) - testKit.MustExec("use test") - testKit.MustExec("drop table if exists t") - testKit.MustExec("create table t(id int auto_increment, kid int, pid int, primary key(id), key(kid, pid))") - testKit.MustExec("insert into t (kid, pid) values (1,2), (1,3), (1,4),(1, 11), (1, 12), (1, 13), (1, 14), (2, 2), (2, 3), (2, 4)") - testKit.MustExec("analyze table t") - var ( - input []string - output [][]string - ) - s.testData.GetTestCases(c, &input, &output) - for i, tt := range input { - s.testData.OnRecord(func() { - output[i] = s.testData.ConvertRowsToStrings(testKit.MustQuery(tt).Rows()) - }) - testKit.MustQuery(tt).Check(testkit.Rows(output[i]...)) - } + return statsTbl, nil } func getRange(start, end int64) []*ranger.Range { @@ -383,389 +129,7 @@ func getRange(start, end int64) []*ranger.Range { return []*ranger.Range{ran} } -func (s *testStatsSuite) TestOutOfRangeEstimation(c *C) { - defer cleanEnv(c, s.store, s.do) - testKit := testkit.NewTestKit(c, s.store) - testKit.MustExec("use test") - testKit.MustExec("drop table if exists t") - testKit.MustExec("create table t(a int unsigned)") - for i := 0; i < 3000; i++ { - testKit.MustExec(fmt.Sprintf("insert into t values (%v)", i/5+300)) // [300, 900) - } - testKit.MustExec("analyze table t with 2000 samples") - - h := s.do.StatsHandle() - table, err := s.do.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) - statsTbl := h.GetTableStats(table.Meta()) - sc := &stmtctx.StatementContext{} - col := statsTbl.Columns[table.Meta().Columns[0].ID] - count, err := col.GetColumnRowCount(sc, getRange(900, 900), statsTbl.Count, false) - c.Assert(err, IsNil) - // Because the ANALYZE collect data by random sampling, so the result is not an accurate value. - // so we use a range here. - c.Assert(count < 5.5, IsTrue, Commentf("expected: around 5.0, got: %v", count)) - c.Assert(count > 4.5, IsTrue, Commentf("expected: around 5.0, got: %v", count)) - - var input []struct { - Start int64 - End int64 - } - var output []struct { - Start int64 - End int64 - Count float64 - } - s.testData.GetTestCases(c, &input, &output) - increasedTblRowCount := int64(float64(statsTbl.Count) * 1.5) - for i, ran := range input { - count, err = col.GetColumnRowCount(sc, getRange(ran.Start, ran.End), increasedTblRowCount, false) - c.Assert(err, IsNil) - s.testData.OnRecord(func() { - output[i].Start = ran.Start - output[i].End = ran.End - output[i].Count = count - }) - c.Assert(count < output[i].Count*1.2, IsTrue, Commentf("for [%v, %v], needed: around %v, got: %v", ran.Start, ran.End, output[i].Count, count)) - c.Assert(count > output[i].Count*0.8, IsTrue, Commentf("for [%v, %v], needed: around %v, got: %v", ran.Start, ran.End, output[i].Count, count)) - } -} - -func (s *testStatsSuite) TestEstimationForUnknownValues(c *C) { - defer cleanEnv(c, s.store, s.do) - testKit := testkit.NewTestKit(c, s.store) - testKit.MustExec("use test") - testKit.MustExec("drop table if exists t") - testKit.MustExec("create table t(a int, b int, key idx(a, b))") - testKit.MustExec("set @@tidb_analyze_version=1") - testKit.MustExec("analyze table t") - for i := 0; i < 10; i++ { - testKit.MustExec(fmt.Sprintf("insert into t values (%d, %d)", i, i)) - } - h := s.do.StatsHandle() - c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) - testKit.MustExec("analyze table t") - for i := 0; i < 10; i++ { - testKit.MustExec(fmt.Sprintf("insert into t values (%d, %d)", i+10, i+10)) - } - c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) - c.Assert(h.Update(s.do.InfoSchema()), IsNil) - table, err := s.do.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) - statsTbl := h.GetTableStats(table.Meta()) - - sc := &stmtctx.StatementContext{} - colID := table.Meta().Columns[0].ID - count, err := statsTbl.GetRowCountByColumnRanges(sc, colID, getRange(30, 30)) - c.Assert(err, IsNil) - c.Assert(count, Equals, 0.2) - - count, err = statsTbl.GetRowCountByColumnRanges(sc, colID, getRange(9, 30)) - c.Assert(err, IsNil) - c.Assert(count, Equals, 7.2) - - count, err = statsTbl.GetRowCountByColumnRanges(sc, colID, getRange(9, math.MaxInt64)) - c.Assert(err, IsNil) - c.Assert(count, Equals, 7.2) - - idxID := table.Meta().Indices[0].ID - count, err = statsTbl.GetRowCountByIndexRanges(sc, idxID, getRange(30, 30)) - c.Assert(err, IsNil) - c.Assert(count, Equals, 0.1) - - count, err = statsTbl.GetRowCountByIndexRanges(sc, idxID, getRange(9, 30)) - c.Assert(err, IsNil) - c.Assert(count, Equals, 7.0) - - testKit.MustExec("truncate table t") - testKit.MustExec("insert into t values (null, null)") - testKit.MustExec("analyze table t") - table, err = s.do.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.do.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 (s *testStatsSuite) TestEstimationUniqueKeyEqualConds(c *C) { - defer cleanEnv(c, s.store, s.do) - testKit := testkit.NewTestKit(c, s.store) - testKit.MustExec("use test") - testKit.MustExec("drop table if exists t") - testKit.MustExec("create table t(a int, b int, c int, unique key(b))") - testKit.MustExec("insert into t values (1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5),(6,6,6),(7,7,7)") - testKit.MustExec("analyze table t with 4 cmsketch width, 1 cmsketch depth;") - table, err := s.do.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) - statsTbl := s.do.StatsHandle().GetTableStats(table.Meta()) - - sc := &stmtctx.StatementContext{} - idxID := table.Meta().Indices[0].ID - count, err := statsTbl.GetRowCountByIndexRanges(sc, idxID, getRange(7, 7)) - c.Assert(err, IsNil) - c.Assert(count, Equals, 1.0) - - count, err = statsTbl.GetRowCountByIndexRanges(sc, idxID, getRange(6, 6)) - c.Assert(err, IsNil) - c.Assert(count, Equals, 1.0) - - colID := table.Meta().Columns[0].ID - count, err = statsTbl.GetRowCountByIntColumnRanges(sc, colID, getRange(7, 7)) - c.Assert(err, IsNil) - c.Assert(count, Equals, 1.0) - - count, err = statsTbl.GetRowCountByIntColumnRanges(sc, colID, getRange(6, 6)) - c.Assert(err, IsNil) - c.Assert(count, Equals, 1.0) -} - -func (s *testStatsSuite) TestPrimaryKeySelectivity(c *C) { - defer cleanEnv(c, s.store, s.do) - testKit := testkit.NewTestKit(c, s.store) - testKit.MustExec("use test") - testKit.MustExec("drop table if exists t") - testKit.Se.GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeIntOnly - testKit.MustExec("create table t(a char(10) primary key, b int)") - var input, output [][]string - s.testData.GetTestCases(c, &input, &output) - for i, ts := range input { - for j, tt := range ts { - if j != len(ts)-1 { - testKit.MustExec(tt) - } - s.testData.OnRecord(func() { - if j == len(ts)-1 { - output[i] = s.testData.ConvertRowsToStrings(testKit.MustQuery(tt).Rows()) - } - }) - if j == len(ts)-1 { - testKit.MustQuery(tt).Check(testkit.Rows(output[i]...)) - } - } - } -} - -func BenchmarkSelectivity(b *testing.B) { - c := &C{} - s := &testStatsSuite{} - s.SetUpSuite(c) - defer s.TearDownSuite(c) - - testKit := testkit.NewTestKit(c, s.store) - statsTbl := s.prepareSelectivity(testKit, c) - exprs := "a > 1 and b < 2 and c > 3 and d < 4 and e > 5" - sql := "select * from t where " + exprs - comment := Commentf("for %s", exprs) - sctx := testKit.Se.(sessionctx.Context) - stmts, err := session.Parse(sctx, sql) - c.Assert(err, IsNil, Commentf("error %v, for expr %s", err, exprs)) - c.Assert(stmts, HasLen, 1) - ret := &plannercore.PreprocessorReturn{} - err = plannercore.Preprocess(sctx, stmts[0], plannercore.WithPreprocessorReturn(ret)) - c.Assert(err, IsNil, comment) - p, _, err := plannercore.BuildLogicalPlanForTest(context.Background(), sctx, stmts[0], ret.InfoSchema) - c.Assert(err, IsNil, Commentf("error %v, for building plan, expr %s", err, exprs)) - - file, err := os.Create("cpu.profile") - c.Assert(err, IsNil) - defer func() { - err := file.Close() - c.Assert(err, IsNil) - }() - err = pprof.StartCPUProfile(file) - c.Assert(err, IsNil) - - b.Run("Selectivity", func(b *testing.B) { - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, _, err := statsTbl.Selectivity(sctx, p.(plannercore.LogicalPlan).Children()[0].(*plannercore.LogicalSelection).Conditions, nil) - c.Assert(err, IsNil) - } - b.ReportAllocs() - }) - pprof.StopCPUProfile() -} - -func (s *testStatsSuite) TestStatsVer2(c *C) { - defer cleanEnv(c, s.store, s.do) - testKit := testkit.NewTestKit(c, s.store) - testKit.MustExec("use test") - testKit.MustExec("set tidb_analyze_version=2") - - testKit.MustExec("drop table if exists tint") - testKit.MustExec("create table tint(a int, b int, c int, index singular(a), index multi(b, c))") - testKit.MustExec("insert into tint values (1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4), (5, 5, 5), (6, 6, 6), (7, 7, 7), (8, 8, 8)") - testKit.MustExec("analyze table tint with 2 topn, 3 buckets") - - testKit.MustExec("drop table if exists tdouble") - testKit.MustExec("create table tdouble(a double, b double, c double, index singular(a), index multi(b, c))") - testKit.MustExec("insert into tdouble values (1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4), (5, 5, 5), (6, 6, 6), (7, 7, 7), (8, 8, 8)") - testKit.MustExec("analyze table tdouble with 2 topn, 3 buckets") - - testKit.MustExec("drop table if exists tdecimal") - testKit.MustExec("create table tdecimal(a decimal(40, 20), b decimal(40, 20), c decimal(40, 20), index singular(a), index multi(b, c))") - testKit.MustExec("insert into tdecimal values (1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4), (5, 5, 5), (6, 6, 6), (7, 7, 7), (8, 8, 8)") - testKit.MustExec("analyze table tdecimal with 2 topn, 3 buckets") - - testKit.MustExec("drop table if exists tstring") - testKit.MustExec("create table tstring(a varchar(64), b varchar(64), c varchar(64), index singular(a), index multi(b, c))") - testKit.MustExec("insert into tstring values ('1', '1', '1'), ('2', '2', '2'), ('3', '3', '3'), ('4', '4', '4'), ('5', '5', '5'), ('6', '6', '6'), ('7', '7', '7'), ('8', '8', '8')") - testKit.MustExec("analyze table tstring with 2 topn, 3 buckets") - - testKit.MustExec("drop table if exists tdatetime") - testKit.MustExec("create table tdatetime(a datetime, b datetime, c datetime, index singular(a), index multi(b, c))") - testKit.MustExec("insert into tdatetime values ('2001-01-01', '2001-01-01', '2001-01-01'), ('2001-01-02', '2001-01-02', '2001-01-02'), ('2001-01-03', '2001-01-03', '2001-01-03'), ('2001-01-04', '2001-01-04', '2001-01-04')") - testKit.MustExec("analyze table tdatetime with 2 topn, 3 buckets") - - testKit.MustExec("drop table if exists tprefix") - testKit.MustExec("create table tprefix(a varchar(64), b varchar(64), index prefixa(a(2)))") - testKit.MustExec("insert into tprefix values ('111', '111'), ('222', '222'), ('333', '333'), ('444', '444'), ('555', '555'), ('666', '666')") - testKit.MustExec("analyze table tprefix with 2 topn, 3 buckets") - - // test with clustered index - testKit.MustExec("drop table if exists ct1") - testKit.MustExec("create table ct1 (a int, pk varchar(10), primary key(pk) clustered)") - testKit.MustExec("insert into ct1 values (1, '1'), (2, '2'), (3, '3'), (4, '4'), (5, '5'), (6, '6'), (7, '7'), (8, '8')") - testKit.MustExec("analyze table ct1 with 2 topn, 3 buckets") - - testKit.MustExec("drop table if exists ct2") - testKit.MustExec("create table ct2 (a int, b int, c int, primary key(a, b) clustered)") - testKit.MustExec("insert into ct2 values (1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4), (5, 5, 5), (6, 6, 6), (7, 7, 7), (8, 8, 8)") - testKit.MustExec("analyze table ct2 with 2 topn, 3 buckets") - - rows := testKit.MustQuery("select stats_ver from mysql.stats_histograms").Rows() - for _, r := range rows { - // ensure statsVer = 2 - c.Assert(fmt.Sprintf("%v", r[0]), Equals, "2") - } - - var ( - input []string - output [][]string - ) - s.testData.GetTestCases(c, &input, &output) - for i := range input { - s.testData.OnRecord(func() { - output[i] = s.testData.ConvertRowsToStrings(testKit.MustQuery(input[i]).Rows()) - }) - testKit.MustQuery(input[i]).Check(testkit.Rows(output[i]...)) - } -} - -func (s *testStatsSuite) TestTopNOutOfHist(c *C) { - defer cleanEnv(c, s.store, s.do) - testKit := testkit.NewTestKit(c, s.store) - testKit.MustExec("use test") - testKit.MustExec("set tidb_analyze_version=2") - - testKit.MustExec("drop table if exists topn_before_hist") - testKit.MustExec("create table topn_before_hist(a int, index idx(a))") - testKit.MustExec("insert into topn_before_hist values(1), (1), (1), (1), (3), (3), (4), (5), (6)") - testKit.MustExec("analyze table topn_before_hist with 2 topn, 3 buckets") - - testKit.MustExec("create table topn_after_hist(a int, index idx(a))") - testKit.MustExec("insert into topn_after_hist values(2), (2), (3), (4), (5), (7), (7), (7), (7)") - testKit.MustExec("analyze table topn_after_hist with 2 topn, 3 buckets") - - testKit.MustExec("create table topn_before_hist_no_index(a int)") - testKit.MustExec("insert into topn_before_hist_no_index values(1), (1), (1), (1), (3), (3), (4), (5), (6)") - testKit.MustExec("analyze table topn_before_hist_no_index with 2 topn, 3 buckets") - - testKit.MustExec("create table topn_after_hist_no_index(a int)") - testKit.MustExec("insert into topn_after_hist_no_index values(2), (2), (3), (4), (5), (7), (7), (7), (7)") - testKit.MustExec("analyze table topn_after_hist_no_index with 2 topn, 3 buckets") - - var ( - input []string - output [][]string - ) - s.testData.GetTestCases(c, &input, &output) - for i := range input { - s.testData.OnRecord(func() { - output[i] = s.testData.ConvertRowsToStrings(testKit.MustQuery(input[i]).Rows()) - }) - testKit.MustQuery(input[i]).Check(testkit.Rows(output[i]...)) - } -} - -func (s *testStatsSuite) TestColumnIndexNullEstimation(c *C) { - defer cleanEnv(c, s.store, s.do) - testKit := testkit.NewTestKit(c, s.store) - testKit.MustExec("use test") - testKit.MustExec("drop table if exists t") - testKit.MustExec("create table t(a int, b int, c int, index idx_b(b), index idx_c_a(c, a))") - testKit.MustExec("insert into t values(1,null,1),(2,null,2),(3,3,3),(4,null,4),(null,null,null);") - h := s.do.StatsHandle() - c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) - testKit.MustExec("analyze table t") - var ( - input []string - output [][]string - ) - s.testData.GetTestCases(c, &input, &output) - for i := 0; i < 5; i++ { - s.testData.OnRecord(func() { - output[i] = s.testData.ConvertRowsToStrings(testKit.MustQuery(input[i]).Rows()) - }) - testKit.MustQuery(input[i]).Check(testkit.Rows(output[i]...)) - } - // Make sure column stats has been loaded. - testKit.MustExec(`explain select * from t where a is null`) - c.Assert(h.LoadNeededHistograms(), IsNil) - for i := 5; i < len(input); i++ { - s.testData.OnRecord(func() { - output[i] = s.testData.ConvertRowsToStrings(testKit.MustQuery(input[i]).Rows()) - }) - testKit.MustQuery(input[i]).Check(testkit.Rows(output[i]...)) - } -} - -func (s *testStatsSuite) TestUniqCompEqualEst(c *C) { - defer cleanEnv(c, s.store, s.do) - testKit := testkit.NewTestKit(c, s.store) - testKit.MustExec("use test") - testKit.Se.GetSessionVars().EnableClusteredIndex = variable.ClusteredIndexDefModeOn - testKit.MustExec("drop table if exists t") - testKit.MustExec("create table t(a int, b int, primary key(a, b))") - testKit.MustExec("insert into t values(1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(1,7),(1,8),(1,9),(1,10)") - h := s.do.StatsHandle() - c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) - testKit.MustExec("analyze table t") - var ( - input []string - output [][]string - ) - s.testData.GetTestCases(c, &input, &output) - for i := 0; i < 1; i++ { - s.testData.OnRecord(func() { - output[i] = s.testData.ConvertRowsToStrings(testKit.MustQuery(input[i]).Rows()) - }) - testKit.MustQuery(input[i]).Check(testkit.Rows(output[i]...)) - } -} - -func (s *testStatsSuite) TestSelectivityGreedyAlgo(c *C) { +func TestSelectivityGreedyAlgo(t *testing.T) { nodes := make([]*statistics.StatsNode, 3) nodes[0] = statistics.MockStatsNode(1, 3, 2) nodes[1] = statistics.MockStatsNode(2, 5, 2) @@ -773,194 +137,12 @@ func (s *testStatsSuite) TestSelectivityGreedyAlgo(c *C) { // Sets should not overlap on mask, so only nodes[0] is chosen. usedSets := statistics.GetUsableSetsByGreedy(nodes) - c.Assert(len(usedSets), Equals, 1) - c.Assert(usedSets[0].ID, Equals, int64(1)) + require.Equal(t, 1, len(usedSets)) + require.Equal(t, int64(1), usedSets[0].ID) nodes[0], nodes[1] = nodes[1], nodes[0] // Sets chosen should be stable, so the returned node is still the one with ID 1. usedSets = statistics.GetUsableSetsByGreedy(nodes) - c.Assert(len(usedSets), Equals, 1) - c.Assert(usedSets[0].ID, Equals, int64(1)) -} - -func (s *testStatsSuite) TestCollationColumnEstimate(c *C) { - defer cleanEnv(c, s.store, s.do) - tk := testkit.NewTestKit(c, s.store) - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a varchar(20) collate utf8mb4_general_ci)") - tk.MustExec("insert into t values('aaa'), ('bbb'), ('AAA'), ('BBB')") - tk.MustExec("set @@session.tidb_analyze_version=2") - h := s.do.StatsHandle() - c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) - tk.MustExec("analyze table t") - tk.MustExec("explain select * from t where a = 'aaa'") - c.Assert(h.LoadNeededHistograms(), IsNil) - var ( - input []string - output [][]string - ) - s.testData.GetTestCases(c, &input, &output) - for i := 0; i < len(input); i++ { - s.testData.OnRecord(func() { - output[i] = s.testData.ConvertRowsToStrings(tk.MustQuery(input[i]).Rows()) - }) - tk.MustQuery(input[i]).Check(testkit.Rows(output[i]...)) - } -} - -// TestDNFCondSelectivity tests selectivity calculation with DNF conditions covered by using independence assumption. -func (s *testStatsSuite) TestDNFCondSelectivity(c *C) { - defer cleanEnv(c, s.store, s.do) - testKit := testkit.NewTestKit(c, s.store) - - testKit.MustExec("use test") - testKit.MustExec("drop table if exists t") - testKit.MustExec("create table t(a int, b int, c int, d int)") - testKit.MustExec("insert into t value(1,5,4,4),(3,4,1,8),(4,2,6,10),(6,7,2,5),(7,1,4,9),(8,9,8,3),(9,1,9,1),(10,6,6,2)") - testKit.MustExec("alter table t add index (b)") - testKit.MustExec("alter table t add index (d)") - testKit.MustExec(`analyze table t`) - - ctx := context.Background() - h := s.do.StatsHandle() - tb, err := s.do.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) - tblInfo := tb.Meta() - statsTbl := h.GetTableStats(tblInfo) - - var ( - input []string - output []struct { - SQL string - Selectivity float64 - } - ) - s.testData.GetTestCases(c, &input, &output) - for i, tt := range input { - sctx := testKit.Se.(sessionctx.Context) - stmts, err := session.Parse(sctx, tt) - c.Assert(err, IsNil, Commentf("error %v, for sql %s", err, tt)) - c.Assert(stmts, HasLen, 1) - - ret := &plannercore.PreprocessorReturn{} - err = plannercore.Preprocess(sctx, stmts[0], plannercore.WithPreprocessorReturn(ret)) - c.Assert(err, IsNil, Commentf("error %v, for sql %s", err, tt)) - p, _, err := plannercore.BuildLogicalPlanForTest(ctx, sctx, stmts[0], ret.InfoSchema) - c.Assert(err, IsNil, Commentf("error %v, for building plan, sql %s", err, tt)) - - sel := p.(plannercore.LogicalPlan).Children()[0].(*plannercore.LogicalSelection) - ds := sel.Children()[0].(*plannercore.DataSource) - - histColl := statsTbl.GenerateHistCollFromColumnInfo(ds.Columns, ds.Schema().Columns) - - ratio, _, err := histColl.Selectivity(sctx, sel.Conditions, nil) - c.Assert(err, IsNil, Commentf("error %v, for expr %s", err, tt)) - s.testData.OnRecord(func() { - output[i].SQL = tt - output[i].Selectivity = ratio - }) - c.Assert(math.Abs(ratio-output[i].Selectivity) < eps, IsTrue, - Commentf("for %s, needed: %v, got: %v", tt, output[i].Selectivity, ratio)) - } - - // Test issue 19981 - testKit.MustExec("select * from t where _tidb_rowid is null or _tidb_rowid > 7") - - // Test issue 22134 - // Information about column n will not be in stats immediately after this SQL executed. - // If we don't have a check against this, DNF condition could lead to infinite recursion in Selectivity(). - testKit.MustExec("alter table t add column n timestamp;") - testKit.MustExec("select * from t where n = '2000-01-01' or n = '2000-01-02';") - - // Test issue 27294 - testKit.MustExec("create table tt (COL1 blob DEFAULT NULL,COL2 decimal(37,4) DEFAULT NULL,COL3 timestamp NULL DEFAULT NULL,COL4 int(11) DEFAULT NULL,UNIQUE KEY U_M_COL4(COL1(10),COL2), UNIQUE KEY U_M_COL5(COL3,COL2));") - testKit.MustExec("explain select * from tt where col1 is not null or col2 not between 454623814170074.2771 and -975540642273402.9269 and col3 not between '2039-1-19 10:14:57' and '2002-3-27 14:40:23';") -} - -func (s *testStatsSuite) TestIndexEstimationCrossValidate(c *C) { - defer cleanEnv(c, s.store, s.do) - 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, key(a,b))") - tk.MustExec("insert into t values(1, 1), (1, 2), (1, 3), (2, 2)") - tk.MustExec("analyze table t") - c.Assert(failpoint.Enable("github.com/pingcap/tidb/statistics/table/mockQueryBytesMaxUint64", `return(100000)`), IsNil) - tk.MustQuery("explain select * from t where a = 1 and b = 2").Check(testkit.Rows( - "IndexReader_6 1.00 root index:IndexRangeScan_5", - "└─IndexRangeScan_5 1.00 cop[tikv] table:t, index:a(a, b) range:[1 2,1 2], keep order:false")) - c.Assert(failpoint.Disable("github.com/pingcap/tidb/statistics/table/mockQueryBytesMaxUint64"), IsNil) - - // Test issue 22466 - tk.MustExec("drop table if exists t2") - tk.MustExec("create table t2(a int, b int, key b(b))") - tk.MustExec("insert into t2 values(1, 1), (2, 2), (3, 3), (4, 4), (5,5)") - // This line of select will mark column b stats as needed, and an invalid(empty) stats for column b - // will be loaded at the next analyze line, this will trigger the bug. - tk.MustQuery("select * from t2 where b=2") - tk.MustExec("analyze table t2 index b") - tk.MustQuery("explain select * from t2 where b=2").Check(testkit.Rows( - "TableReader_7 1.00 root data:Selection_6", - "└─Selection_6 1.00 cop[tikv] eq(test.t2.b, 2)", - " └─TableFullScan_5 5.00 cop[tikv] table:t2 keep order:false")) -} - -func (s *testStatsSuite) TestRangeStepOverflow(c *C) { - defer cleanEnv(c, s.store, s.do) - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t (col datetime)") - tk.MustExec("insert into t values('3580-05-26 07:16:48'),('4055-03-06 22:27:16'),('4862-01-26 07:16:54')") - h := s.do.StatsHandle() - c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) - tk.MustExec("analyze table t") - // Trigger the loading of column stats. - tk.MustQuery("select * from t where col between '8499-1-23 2:14:38' and '9961-7-23 18:35:26'").Check(testkit.Rows()) - c.Assert(h.LoadNeededHistograms(), IsNil) - // Must execute successfully after loading the column stats. - tk.MustQuery("select * from t where col between '8499-1-23 2:14:38' and '9961-7-23 18:35:26'").Check(testkit.Rows()) -} - -func (s *testStatsSuite) TestSmallRangeEstimation(c *C) { - defer cleanEnv(c, s.store, s.do) - testKit := testkit.NewTestKit(c, s.store) - testKit.MustExec("use test") - testKit.MustExec("drop table if exists t") - testKit.MustExec("create table t(a int)") - for i := 0; i < 400; i++ { - testKit.MustExec(fmt.Sprintf("insert into t values (%v), (%v), (%v)", i, i, i)) // [0, 400) - } - testKit.MustExec("analyze table t with 0 topn") - - h := s.do.StatsHandle() - table, err := s.do.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) - statsTbl := h.GetTableStats(table.Meta()) - sc := &stmtctx.StatementContext{} - col := statsTbl.Columns[table.Meta().Columns[0].ID] - - var input []struct { - Start int64 - End int64 - } - var output []struct { - Start int64 - End int64 - Count float64 - } - s.testData.GetTestCases(c, &input, &output) - for i, ran := range input { - count, err := col.GetColumnRowCount(sc, getRange(ran.Start, ran.End), statsTbl.Count, false) - c.Assert(err, IsNil) - s.testData.OnRecord(func() { - output[i].Start = ran.Start - output[i].End = ran.End - output[i].Count = count - }) - c.Assert(math.Abs(count-output[i].Count) < eps, IsTrue, Commentf("for [%v, %v], needed: around %v, got: %v", ran.Start, ran.End, output[i].Count, count)) - } + require.Equal(t, 1, len(usedSets)) + require.Equal(t, int64(1), usedSets[0].ID) } diff --git a/statistics/statistics_serial_test.go b/statistics/statistics_serial_test.go index 2c15ce5a60c13..8a8949bf98e16 100644 --- a/statistics/statistics_serial_test.go +++ b/statistics/statistics_serial_test.go @@ -49,7 +49,7 @@ func buildIndex(sctx sessionctx.Context, numBuckets, id int64, records sqlexec.R b := NewSortedBuilder(sctx.GetSessionVars().StmtCtx, numBuckets, id, types.NewFieldType(mysql.TypeBlob), Version1) cms := NewCMSketch(8, 2048) ctx := context.Background() - req := records.NewChunk() + req := records.NewChunk(nil) it := chunk.NewIterator4Chunk(req) for { err := records.Next(ctx, req) @@ -76,8 +76,9 @@ func buildIndex(sctx sessionctx.Context, numBuckets, id int64, records sqlexec.R return b.Count, b.Hist(), cms, nil } -func SubTestBuild(s *testStatisticsSamples) func(*testing.T) { +func SubTestBuild() func(*testing.T) { return func(t *testing.T) { + s := createTestStatisticsSamples(t) bucketCount := int64(256) topNCount := 20 ctx := mock.NewContext() @@ -208,8 +209,9 @@ func SubTestBuild(s *testStatisticsSamples) func(*testing.T) { } } -func SubTestHistogramProtoConversion(s *testStatisticsSamples) func(*testing.T) { +func SubTestHistogramProtoConversion() func(*testing.T) { return func(t *testing.T) { + s := createTestStatisticsSamples(t) ctx := mock.NewContext() require.NoError(t, s.rc.Close()) tblCount, col, _, err := buildIndex(ctx, 256, 1, s.rc) diff --git a/statistics/statistics_test.go b/statistics/statistics_test.go index c9624fb3c1744..c99802bd0314e 100644 --- a/statistics/statistics_test.go +++ b/statistics/statistics_test.go @@ -24,9 +24,9 @@ import ( "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/ranger" "github.com/pingcap/tidb/util/sqlexec" @@ -86,7 +86,7 @@ func (r *recordSet) Next(_ context.Context, req *chunk.Chunk) error { return nil } -func (r *recordSet) NewChunk() *chunk.Chunk { +func (r *recordSet) NewChunk(chunk.Allocator) *chunk.Chunk { fields := make([]*types.FieldType, 0, len(r.fields)) for _, field := range r.fields { fields = append(fields, &field.Column.FieldType) @@ -103,7 +103,7 @@ func buildPK(sctx sessionctx.Context, numBuckets, id int64, records sqlexec.Reco b := NewSortedBuilder(sctx.GetSessionVars().StmtCtx, numBuckets, id, types.NewFieldType(mysql.TypeLonglong), Version1) ctx := context.Background() for { - req := records.NewChunk() + req := records.NewChunk(nil) err := records.Next(ctx, req) if err != nil { return 0, nil, errors.Trace(err) @@ -133,7 +133,6 @@ func mockHistogram(lower, num int64) *Histogram { } func TestMergeHistogram(t *testing.T) { - t.Parallel() tests := []struct { leftLower int64 leftNum int64 @@ -178,34 +177,44 @@ func TestMergeHistogram(t *testing.T) { require.Equal(t, tt.bucketNum, h.Len()) require.Equal(t, tt.leftNum+tt.rightNum, int64(h.TotalRowCount())) expectLower := types.NewIntDatum(tt.leftLower) - cmp, err := h.GetLower(0).CompareDatum(sc, &expectLower) + cmp, err := h.GetLower(0).Compare(sc, &expectLower, collate.GetBinaryCollator()) require.NoError(t, err) require.Equal(t, 0, cmp) expectUpper := types.NewIntDatum(tt.rightLower + tt.rightNum - 1) - cmp, err = h.GetUpper(h.Len()-1).CompareDatum(sc, &expectUpper) + cmp, err = h.GetUpper(h.Len()-1).Compare(sc, &expectUpper, collate.GetBinaryCollator()) require.NoError(t, err) require.Equal(t, 0, cmp) } } func TestPseudoTable(t *testing.T) { - t.Parallel() ti := &model.TableInfo{} colInfo := &model.ColumnInfo{ ID: 1, FieldType: *types.NewFieldType(mysql.TypeLonglong), + State: model.StatePublic, } ti.Columns = append(ti.Columns, colInfo) tbl := PseudoTable(ti) + require.Equal(t, len(tbl.Columns), 1) require.Greater(t, tbl.Count, int64(0)) - sc := new(stmtctx.StatementContext) - count := tbl.ColumnLessRowCount(sc, types.NewIntDatum(100), colInfo.ID) + sctx := mock.NewContext() + count := tbl.ColumnLessRowCount(sctx, types.NewIntDatum(100), colInfo.ID) require.Equal(t, 3333, int(count)) - count, err := tbl.ColumnEqualRowCount(sc, types.NewIntDatum(1000), colInfo.ID) + count, err := tbl.ColumnEqualRowCount(sctx, types.NewIntDatum(1000), colInfo.ID) require.NoError(t, err) require.Equal(t, 10, int(count)) - count, _ = tbl.ColumnBetweenRowCount(sc, types.NewIntDatum(1000), types.NewIntDatum(5000), colInfo.ID) + count, _ = tbl.ColumnBetweenRowCount(sctx, types.NewIntDatum(1000), types.NewIntDatum(5000), colInfo.ID) require.Equal(t, 250, int(count)) + ti.Columns = append(ti.Columns, &model.ColumnInfo{ + ID: 2, + FieldType: *types.NewFieldType(mysql.TypeLonglong), + Hidden: true, + State: model.StatePublic, + }) + tbl = PseudoTable(ti) + // We added a hidden column. The pseudo table still only have one column. + require.Equal(t, len(tbl.Columns), 1) } func buildCMSketch(values []types.Datum) *CMSketch { @@ -219,9 +228,9 @@ func buildCMSketch(values []types.Datum) *CMSketch { return cms } -func SubTestColumnRange(s *testStatisticsSamples) func(*testing.T) { +func SubTestColumnRange() func(*testing.T) { return func(t *testing.T) { - t.Parallel() + s := createTestStatisticsSamples(t) bucketCount := int64(256) ctx := mock.NewContext() sc := ctx.GetSessionVars().StmtCtx @@ -248,61 +257,60 @@ func SubTestColumnRange(s *testStatisticsSamples) func(*testing.T) { LowVal: []types.Datum{{}}, HighVal: []types.Datum{types.MaxValueDatum()}, }} - count, err := tbl.GetRowCountByColumnRanges(sc, 0, ran) + count, err := tbl.GetRowCountByColumnRanges(ctx, 0, ran) require.NoError(t, err) require.Equal(t, 100000, int(count)) ran[0].LowVal[0] = types.MinNotNullDatum() - count, err = tbl.GetRowCountByColumnRanges(sc, 0, ran) + count, err = tbl.GetRowCountByColumnRanges(ctx, 0, ran) require.NoError(t, err) require.Equal(t, 99900, int(count)) ran[0].LowVal[0] = types.NewIntDatum(1000) ran[0].LowExclude = true ran[0].HighVal[0] = types.NewIntDatum(2000) ran[0].HighExclude = true - count, err = tbl.GetRowCountByColumnRanges(sc, 0, ran) + count, err = tbl.GetRowCountByColumnRanges(ctx, 0, ran) require.NoError(t, err) require.Equal(t, 2500, int(count)) ran[0].LowExclude = false ran[0].HighExclude = false - count, err = tbl.GetRowCountByColumnRanges(sc, 0, ran) + count, err = tbl.GetRowCountByColumnRanges(ctx, 0, ran) require.NoError(t, err) require.Equal(t, 2500, int(count)) ran[0].LowVal[0] = ran[0].HighVal[0] - count, err = tbl.GetRowCountByColumnRanges(sc, 0, ran) + count, err = tbl.GetRowCountByColumnRanges(ctx, 0, ran) require.NoError(t, err) require.Equal(t, 100, int(count)) tbl.Columns[0] = col ran[0].LowVal[0] = types.Datum{} ran[0].HighVal[0] = types.MaxValueDatum() - count, err = tbl.GetRowCountByColumnRanges(sc, 0, ran) + count, err = tbl.GetRowCountByColumnRanges(ctx, 0, ran) require.NoError(t, err) require.Equal(t, 100000, int(count)) ran[0].LowVal[0] = types.NewIntDatum(1000) ran[0].LowExclude = true ran[0].HighVal[0] = types.NewIntDatum(2000) ran[0].HighExclude = true - count, err = tbl.GetRowCountByColumnRanges(sc, 0, ran) + count, err = tbl.GetRowCountByColumnRanges(ctx, 0, ran) require.NoError(t, err) require.Equal(t, 9998, int(count)) ran[0].LowExclude = false ran[0].HighExclude = false - count, err = tbl.GetRowCountByColumnRanges(sc, 0, ran) + count, err = tbl.GetRowCountByColumnRanges(ctx, 0, ran) require.NoError(t, err) require.Equal(t, 10000, int(count)) ran[0].LowVal[0] = ran[0].HighVal[0] - count, err = tbl.GetRowCountByColumnRanges(sc, 0, ran) + count, err = tbl.GetRowCountByColumnRanges(ctx, 0, ran) require.NoError(t, err) require.Equal(t, 1, int(count)) } } -func SubTestIntColumnRanges(s *testStatisticsSamples) func(*testing.T) { +func SubTestIntColumnRanges() func(*testing.T) { return func(t *testing.T) { - t.Parallel() + s := createTestStatisticsSamples(t) bucketCount := int64(256) ctx := mock.NewContext() - sc := ctx.GetSessionVars().StmtCtx s.pk.(*recordSet).cursor = 0 rowCount, hg, err := buildPK(ctx, bucketCount, 0, s.pk) @@ -320,22 +328,22 @@ func SubTestIntColumnRanges(s *testStatisticsSamples) func(*testing.T) { LowVal: []types.Datum{types.NewIntDatum(math.MinInt64)}, HighVal: []types.Datum{types.NewIntDatum(math.MaxInt64)}, }} - count, err := tbl.GetRowCountByIntColumnRanges(sc, 0, ran) + count, err := tbl.GetRowCountByIntColumnRanges(ctx, 0, ran) require.NoError(t, err) require.Equal(t, 100000, int(count)) ran[0].LowVal[0].SetInt64(1000) ran[0].HighVal[0].SetInt64(2000) - count, err = tbl.GetRowCountByIntColumnRanges(sc, 0, ran) + count, err = tbl.GetRowCountByIntColumnRanges(ctx, 0, ran) require.NoError(t, err) require.Equal(t, 1000, int(count)) ran[0].LowVal[0].SetInt64(1001) ran[0].HighVal[0].SetInt64(1999) - count, err = tbl.GetRowCountByIntColumnRanges(sc, 0, ran) + count, err = tbl.GetRowCountByIntColumnRanges(ctx, 0, ran) require.NoError(t, err) require.Equal(t, 998, int(count)) ran[0].LowVal[0].SetInt64(1000) ran[0].HighVal[0].SetInt64(1000) - count, err = tbl.GetRowCountByIntColumnRanges(sc, 0, ran) + count, err = tbl.GetRowCountByIntColumnRanges(ctx, 0, ran) require.NoError(t, err) require.Equal(t, 1, int(count)) @@ -343,60 +351,59 @@ func SubTestIntColumnRanges(s *testStatisticsSamples) func(*testing.T) { LowVal: []types.Datum{types.NewUintDatum(0)}, HighVal: []types.Datum{types.NewUintDatum(math.MaxUint64)}, }} - count, err = tbl.GetRowCountByIntColumnRanges(sc, 0, ran) + count, err = tbl.GetRowCountByIntColumnRanges(ctx, 0, ran) require.NoError(t, err) require.Equal(t, 100000, int(count)) ran[0].LowVal[0].SetUint64(1000) ran[0].HighVal[0].SetUint64(2000) - count, err = tbl.GetRowCountByIntColumnRanges(sc, 0, ran) + count, err = tbl.GetRowCountByIntColumnRanges(ctx, 0, ran) require.NoError(t, err) require.Equal(t, 1000, int(count)) ran[0].LowVal[0].SetUint64(1001) ran[0].HighVal[0].SetUint64(1999) - count, err = tbl.GetRowCountByIntColumnRanges(sc, 0, ran) + count, err = tbl.GetRowCountByIntColumnRanges(ctx, 0, ran) require.NoError(t, err) require.Equal(t, 998, int(count)) ran[0].LowVal[0].SetUint64(1000) ran[0].HighVal[0].SetUint64(1000) - count, err = tbl.GetRowCountByIntColumnRanges(sc, 0, ran) + count, err = tbl.GetRowCountByIntColumnRanges(ctx, 0, ran) require.NoError(t, err) require.Equal(t, 1, int(count)) tbl.Columns[0] = col ran[0].LowVal[0].SetInt64(math.MinInt64) ran[0].HighVal[0].SetInt64(math.MaxInt64) - count, err = tbl.GetRowCountByIntColumnRanges(sc, 0, ran) + count, err = tbl.GetRowCountByIntColumnRanges(ctx, 0, ran) require.NoError(t, err) require.Equal(t, 100000, int(count)) ran[0].LowVal[0].SetInt64(1000) ran[0].HighVal[0].SetInt64(2000) - count, err = tbl.GetRowCountByIntColumnRanges(sc, 0, ran) + count, err = tbl.GetRowCountByIntColumnRanges(ctx, 0, ran) require.NoError(t, err) require.Equal(t, 1001, int(count)) ran[0].LowVal[0].SetInt64(1001) ran[0].HighVal[0].SetInt64(1999) - count, err = tbl.GetRowCountByIntColumnRanges(sc, 0, ran) + count, err = tbl.GetRowCountByIntColumnRanges(ctx, 0, ran) require.NoError(t, err) require.Equal(t, 999, int(count)) ran[0].LowVal[0].SetInt64(1000) ran[0].HighVal[0].SetInt64(1000) - count, err = tbl.GetRowCountByIntColumnRanges(sc, 0, ran) + count, err = tbl.GetRowCountByIntColumnRanges(ctx, 0, ran) require.NoError(t, err) require.Equal(t, 1, int(count)) tbl.Count *= 10 - count, err = tbl.GetRowCountByIntColumnRanges(sc, 0, ran) + count, err = tbl.GetRowCountByIntColumnRanges(ctx, 0, ran) require.NoError(t, err) require.Equal(t, 1, int(count)) } } -func SubTestIndexRanges(s *testStatisticsSamples) func(*testing.T) { +func SubTestIndexRanges() func(*testing.T) { return func(t *testing.T) { - t.Parallel() + s := createTestStatisticsSamples(t) bucketCount := int64(256) ctx := mock.NewContext() - sc := ctx.GetSessionVars().StmtCtx s.rc.(*recordSet).cursor = 0 rowCount, hg, cms, err := buildIndex(ctx, bucketCount, 0, s.rc) @@ -415,51 +422,51 @@ func SubTestIndexRanges(s *testStatisticsSamples) func(*testing.T) { LowVal: []types.Datum{types.MinNotNullDatum()}, HighVal: []types.Datum{types.MaxValueDatum()}, }} - count, err := tbl.GetRowCountByIndexRanges(sc, 0, ran) + count, err := tbl.GetRowCountByIndexRanges(ctx, 0, ran) require.NoError(t, err) require.Equal(t, 99900, int(count)) ran[0].LowVal[0] = types.NewIntDatum(1000) ran[0].HighVal[0] = types.NewIntDatum(2000) - count, err = tbl.GetRowCountByIndexRanges(sc, 0, ran) + count, err = tbl.GetRowCountByIndexRanges(ctx, 0, ran) require.NoError(t, err) require.Equal(t, 2500, int(count)) ran[0].LowVal[0] = types.NewIntDatum(1001) ran[0].HighVal[0] = types.NewIntDatum(1999) - count, err = tbl.GetRowCountByIndexRanges(sc, 0, ran) + count, err = tbl.GetRowCountByIndexRanges(ctx, 0, ran) require.NoError(t, err) require.Equal(t, 2500, int(count)) ran[0].LowVal[0] = types.NewIntDatum(1000) ran[0].HighVal[0] = types.NewIntDatum(1000) - count, err = tbl.GetRowCountByIndexRanges(sc, 0, ran) + count, err = tbl.GetRowCountByIndexRanges(ctx, 0, ran) require.NoError(t, err) require.Equal(t, 100, int(count)) tbl.Indices[0] = &Index{Info: &model.IndexInfo{Columns: []*model.IndexColumn{{Offset: 0}}, Unique: true}} ran[0].LowVal[0] = types.NewIntDatum(1000) ran[0].HighVal[0] = types.NewIntDatum(1000) - count, err = tbl.GetRowCountByIndexRanges(sc, 0, ran) + count, err = tbl.GetRowCountByIndexRanges(ctx, 0, ran) require.NoError(t, err) require.Equal(t, 1, int(count)) tbl.Indices[0] = idx ran[0].LowVal[0] = types.MinNotNullDatum() ran[0].HighVal[0] = types.MaxValueDatum() - count, err = tbl.GetRowCountByIndexRanges(sc, 0, ran) + count, err = tbl.GetRowCountByIndexRanges(ctx, 0, ran) require.NoError(t, err) require.Equal(t, 100000, int(count)) ran[0].LowVal[0] = types.NewIntDatum(1000) ran[0].HighVal[0] = types.NewIntDatum(2000) - count, err = tbl.GetRowCountByIndexRanges(sc, 0, ran) + count, err = tbl.GetRowCountByIndexRanges(ctx, 0, ran) require.NoError(t, err) require.Equal(t, 1000, int(count)) ran[0].LowVal[0] = types.NewIntDatum(1001) ran[0].HighVal[0] = types.NewIntDatum(1990) - count, err = tbl.GetRowCountByIndexRanges(sc, 0, ran) + count, err = tbl.GetRowCountByIndexRanges(ctx, 0, ran) require.NoError(t, err) require.Equal(t, 989, int(count)) ran[0].LowVal[0] = types.NewIntDatum(1000) ran[0].HighVal[0] = types.NewIntDatum(1000) - count, err = tbl.GetRowCountByIndexRanges(sc, 0, ran) + count, err = tbl.GetRowCountByIndexRanges(ctx, 0, ran) require.NoError(t, err) require.Equal(t, 0, int(count)) } diff --git a/statistics/table.go b/statistics/table.go index 89ba4940b642b..10e08001c7528 100644 --- a/statistics/table.go +++ b/statistics/table.go @@ -33,8 +33,11 @@ import ( "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/ranger" + "github.com/pingcap/tidb/util/tracing" "go.uber.org/atomic" + "go.uber.org/zap" ) const ( @@ -233,17 +236,17 @@ type tableColumnID struct { } type neededColumnMap struct { - m sync.Mutex + m sync.RWMutex cols map[tableColumnID]struct{} } func (n *neededColumnMap) AllCols() []tableColumnID { - n.m.Lock() + n.m.RLock() keys := make([]tableColumnID, 0, len(n.cols)) for key := range n.cols { keys = append(keys, key) } - n.m.Unlock() + n.m.RUnlock() return keys } @@ -259,6 +262,12 @@ func (n *neededColumnMap) Delete(col tableColumnID) { n.m.Unlock() } +func (n *neededColumnMap) Length() int { + n.m.RLock() + defer n.m.RUnlock() + return len(n.cols) +} + // RatioOfPseudoEstimate means if modifyCount / statsTblCount is greater than this ratio, we think the stats is invalid // and use pseudo estimation. var RatioOfPseudoEstimate = atomic.NewFloat64(0.7) @@ -276,27 +285,28 @@ func (t *Table) IsOutdated() bool { } // ColumnGreaterRowCount estimates the row count where the column greater than value. -func (t *Table) ColumnGreaterRowCount(sc *stmtctx.StatementContext, value types.Datum, colID int64) float64 { +func (t *Table) ColumnGreaterRowCount(sctx sessionctx.Context, value types.Datum, colID int64) float64 { c, ok := t.Columns[colID] - if !ok || c.IsInvalid(sc, t.Pseudo) { + if !ok || c.IsInvalid(sctx, t.Pseudo) { return float64(t.Count) / pseudoLessRate } return c.greaterRowCount(value) * c.GetIncreaseFactor(t.Count) } // ColumnLessRowCount estimates the row count where the column less than value. Note that null values are not counted. -func (t *Table) ColumnLessRowCount(sc *stmtctx.StatementContext, value types.Datum, colID int64) float64 { +func (t *Table) ColumnLessRowCount(sctx sessionctx.Context, value types.Datum, colID int64) float64 { c, ok := t.Columns[colID] - if !ok || c.IsInvalid(sc, t.Pseudo) { + if !ok || c.IsInvalid(sctx, t.Pseudo) { return float64(t.Count) / pseudoLessRate } return c.lessRowCount(value) * c.GetIncreaseFactor(t.Count) } // ColumnBetweenRowCount estimates the row count where column greater or equal to a and less than b. -func (t *Table) ColumnBetweenRowCount(sc *stmtctx.StatementContext, a, b types.Datum, colID int64) (float64, error) { +func (t *Table) ColumnBetweenRowCount(sctx sessionctx.Context, a, b types.Datum, colID int64) (float64, error) { + sc := sctx.GetSessionVars().StmtCtx c, ok := t.Columns[colID] - if !ok || c.IsInvalid(sc, t.Pseudo) { + if !ok || c.IsInvalid(sctx, t.Pseudo) { return float64(t.Count) / pseudoBetweenRate, nil } aEncoded, err := codec.EncodeKey(sc, nil, a) @@ -307,7 +317,7 @@ func (t *Table) ColumnBetweenRowCount(sc *stmtctx.StatementContext, a, b types.D if err != nil { return 0, err } - count := c.BetweenRowCount(sc, a, b, aEncoded, bEncoded) + count := c.BetweenRowCount(sctx, a, b, aEncoded, bEncoded) if a.IsNull() { count += float64(c.NullCount) } @@ -315,66 +325,130 @@ func (t *Table) ColumnBetweenRowCount(sc *stmtctx.StatementContext, a, b types.D } // ColumnEqualRowCount estimates the row count where the column equals to value. -func (t *Table) ColumnEqualRowCount(sc *stmtctx.StatementContext, value types.Datum, colID int64) (float64, error) { +func (t *Table) ColumnEqualRowCount(sctx sessionctx.Context, value types.Datum, colID int64) (float64, error) { c, ok := t.Columns[colID] - if !ok || c.IsInvalid(sc, t.Pseudo) { + if !ok || c.IsInvalid(sctx, t.Pseudo) { return float64(t.Count) / pseudoEqualRate, nil } - encodedVal, err := codec.EncodeKey(sc, nil, value) + encodedVal, err := codec.EncodeKey(sctx.GetSessionVars().StmtCtx, nil, value) if err != nil { return 0, err } - result, err := c.equalRowCount(sc, value, encodedVal, t.ModifyCount) + result, err := c.equalRowCount(sctx, value, encodedVal, t.ModifyCount) result *= c.GetIncreaseFactor(t.Count) return result, errors.Trace(err) } // GetRowCountByIntColumnRanges estimates the row count by a slice of IntColumnRange. -func (coll *HistColl) GetRowCountByIntColumnRanges(sc *stmtctx.StatementContext, colID int64, intRanges []*ranger.Range) (float64, error) { +func (coll *HistColl) GetRowCountByIntColumnRanges(sctx sessionctx.Context, colID int64, intRanges []*ranger.Range) (float64, error) { + sc := sctx.GetSessionVars().StmtCtx + var result float64 c, ok := coll.Columns[colID] - if !ok || c.IsInvalid(sc, coll.Pseudo) { + if !ok || c.IsInvalid(sctx, coll.Pseudo) { if len(intRanges) == 0 { return 0, nil } if intRanges[0].LowVal[0].Kind() == types.KindInt64 { - return getPseudoRowCountBySignedIntRanges(intRanges, float64(coll.Count)), nil + result = getPseudoRowCountBySignedIntRanges(intRanges, float64(coll.Count)) + } else { + result = getPseudoRowCountByUnsignedIntRanges(intRanges, float64(coll.Count)) + } + if sc.EnableOptimizerCETrace && ok { + CETraceRange(sctx, coll.PhysicalID, []string{c.Info.Name.O}, intRanges, "Column Stats-Pseudo", uint64(result)) } - return getPseudoRowCountByUnsignedIntRanges(intRanges, float64(coll.Count)), nil + return result, nil + } + result, err := c.GetColumnRowCount(sctx, intRanges, coll.Count, true) + if sc.EnableOptimizerCETrace { + CETraceRange(sctx, coll.PhysicalID, []string{c.Info.Name.O}, intRanges, "Column Stats", uint64(result)) } - result, err := c.GetColumnRowCount(sc, intRanges, coll.Count, true) return result, errors.Trace(err) } // GetRowCountByColumnRanges estimates the row count by a slice of Range. -func (coll *HistColl) GetRowCountByColumnRanges(sc *stmtctx.StatementContext, colID int64, colRanges []*ranger.Range) (float64, error) { +func (coll *HistColl) GetRowCountByColumnRanges(sctx sessionctx.Context, colID int64, colRanges []*ranger.Range) (float64, error) { + sc := sctx.GetSessionVars().StmtCtx c, ok := coll.Columns[colID] - if !ok || c.IsInvalid(sc, coll.Pseudo) { - return GetPseudoRowCountByColumnRanges(sc, float64(coll.Count), colRanges, 0) + if !ok || c.IsInvalid(sctx, coll.Pseudo) { + result, err := GetPseudoRowCountByColumnRanges(sc, float64(coll.Count), colRanges, 0) + if err == nil && sc.EnableOptimizerCETrace && ok { + CETraceRange(sctx, coll.PhysicalID, []string{c.Info.Name.O}, colRanges, "Column Stats-Pseudo", uint64(result)) + } + return result, err + } + result, err := c.GetColumnRowCount(sctx, colRanges, coll.Count, false) + if sc.EnableOptimizerCETrace { + CETraceRange(sctx, coll.PhysicalID, []string{c.Info.Name.O}, colRanges, "Column Stats", uint64(result)) } - result, err := c.GetColumnRowCount(sc, colRanges, coll.Count, false) return result, errors.Trace(err) } // GetRowCountByIndexRanges estimates the row count by a slice of Range. -func (coll *HistColl) GetRowCountByIndexRanges(sc *stmtctx.StatementContext, idxID int64, indexRanges []*ranger.Range) (float64, error) { - idx := coll.Indices[idxID] - if idx == nil || idx.IsInvalid(coll.Pseudo) { +func (coll *HistColl) GetRowCountByIndexRanges(sctx sessionctx.Context, idxID int64, indexRanges []*ranger.Range) (float64, error) { + sc := sctx.GetSessionVars().StmtCtx + idx, ok := coll.Indices[idxID] + colNames := make([]string, 0, 8) + if ok { + for _, col := range idx.Info.Columns { + colNames = append(colNames, col.Name.O) + } + } + if !ok || idx.IsInvalid(coll.Pseudo) { colsLen := -1 if idx != nil && idx.Info.Unique { colsLen = len(idx.Info.Columns) } - return getPseudoRowCountByIndexRanges(sc, indexRanges, float64(coll.Count), colsLen) + result, err := getPseudoRowCountByIndexRanges(sc, indexRanges, float64(coll.Count), colsLen) + if err == nil && sc.EnableOptimizerCETrace && ok { + CETraceRange(sctx, coll.PhysicalID, colNames, indexRanges, "Index Stats-Pseudo", uint64(result)) + } + return result, err } var result float64 var err error if idx.CMSketch != nil && idx.StatsVer == Version1 { - result, err = coll.getIndexRowCount(sc, idxID, indexRanges) + result, err = coll.getIndexRowCount(sctx, idxID, indexRanges) } else { - result, err = idx.GetRowCount(sc, coll, indexRanges, coll.Count) + result, err = idx.GetRowCount(sctx, coll, indexRanges, coll.Count) + } + if sc.EnableOptimizerCETrace { + CETraceRange(sctx, coll.PhysicalID, colNames, indexRanges, "Index Stats", uint64(result)) } return result, errors.Trace(err) } +// CETraceRange appends a list of ranges and related information into CE trace +func CETraceRange(sctx sessionctx.Context, tableID int64, colNames []string, ranges []*ranger.Range, tp string, rowCount uint64) { + sc := sctx.GetSessionVars().StmtCtx + allPoint := true + for _, ran := range ranges { + if !ran.IsPointNullable(sctx) { + allPoint = false + break + } + } + if allPoint { + tp = tp + "-Point" + } else { + tp = tp + "-Range" + } + expr, err := ranger.RangesToString(sc, ranges, colNames) + if err != nil { + logutil.BgLogger().Debug("[OptimizerTrace] Failed to trace CE of ranges", zap.Error(err)) + } + // We don't need to record meaningless expressions. + if expr == "" || expr == "true" || expr == "false" { + return + } + CERecord := tracing.CETraceRecord{ + TableID: tableID, + Type: tp, + Expr: expr, + RowCount: rowCount, + } + sc.OptimizerCETrace = append(sc.OptimizerCETrace, &CERecord) +} + // PseudoAvgCountPerValue gets a pseudo average count if histogram not exists. func (t *Table) PseudoAvgCountPerValue() float64 { return float64(t.Count) / pseudoEqualRate @@ -503,7 +577,7 @@ func outOfRangeEQSelectivity(ndv, realtimeRowCount, columnRowCount int64) float6 } // crossValidationSelectivity gets the selectivity of multi-column equal conditions by cross validation. -func (coll *HistColl) crossValidationSelectivity(sc *stmtctx.StatementContext, idx *Index, usedColsLen int, idxPointRange *ranger.Range) (float64, float64, error) { +func (coll *HistColl) crossValidationSelectivity(sctx sessionctx.Context, idx *Index, usedColsLen int, idxPointRange *ranger.Range) (float64, float64, error) { minRowCount := math.MaxFloat64 cols := coll.Idx2ColumnIDs[idx.ID] crossValidationSelectivity := 1.0 @@ -513,7 +587,7 @@ func (coll *HistColl) crossValidationSelectivity(sc *stmtctx.StatementContext, i break } if col, ok := coll.Columns[colID]; ok { - if col.IsInvalid(sc, coll.Pseudo) { + if col.IsInvalid(sctx, coll.Pseudo) { continue } lowExclude := idxPointRange.LowExclude @@ -535,7 +609,7 @@ func (coll *HistColl) crossValidationSelectivity(sc *stmtctx.StatementContext, i HighExclude: highExclude, } - rowCount, err := col.GetColumnRowCount(sc, []*ranger.Range{&rang}, coll.Count, col.IsHandle) + rowCount, err := col.GetColumnRowCount(sctx, []*ranger.Range{&rang}, coll.Count, col.IsHandle) if err != nil { return 0, 0, err } @@ -550,11 +624,11 @@ func (coll *HistColl) crossValidationSelectivity(sc *stmtctx.StatementContext, i } // getEqualCondSelectivity gets the selectivity of the equal conditions. -func (coll *HistColl) getEqualCondSelectivity(sc *stmtctx.StatementContext, idx *Index, bytes []byte, usedColsLen int, idxPointRange *ranger.Range) (float64, error) { +func (coll *HistColl) getEqualCondSelectivity(sctx sessionctx.Context, idx *Index, bytes []byte, usedColsLen int, idxPointRange *ranger.Range) (float64, error) { coverAll := len(idx.Info.Columns) == usedColsLen // In this case, the row count is at most 1. if idx.Info.Unique && coverAll { - return 1.0 / float64(idx.TotalRowCount()), nil + return 1.0 / idx.TotalRowCount(), nil } val := types.NewBytesDatum(bytes) if idx.outOfRange(val) { @@ -577,7 +651,7 @@ func (coll *HistColl) getEqualCondSelectivity(sc *stmtctx.StatementContext, idx return outOfRangeEQSelectivity(ndv, coll.Count, int64(idx.TotalRowCount())), nil } - minRowCount, crossValidationSelectivity, err := coll.crossValidationSelectivity(sc, idx, usedColsLen, idxPointRange) + minRowCount, crossValidationSelectivity, err := coll.crossValidationSelectivity(sctx, idx, usedColsLen, idxPointRange) if err != nil { return 0, nil } @@ -589,7 +663,8 @@ func (coll *HistColl) getEqualCondSelectivity(sc *stmtctx.StatementContext, idx return idxCount / idx.TotalRowCount(), nil } -func (coll *HistColl) getIndexRowCount(sc *stmtctx.StatementContext, idxID int64, indexRanges []*ranger.Range) (float64, error) { +func (coll *HistColl) getIndexRowCount(sctx sessionctx.Context, idxID int64, indexRanges []*ranger.Range) (float64, error) { + sc := sctx.GetSessionVars().StmtCtx idx := coll.Indices[idxID] totalCount := float64(0) for _, ran := range indexRanges { @@ -606,7 +681,7 @@ func (coll *HistColl) getIndexRowCount(sc *stmtctx.StatementContext, idxID int64 // on single-column index, use previous way as well, because CMSketch does not contain null // values in this case. if rangePosition == 0 || isSingleColIdxNullRange(idx, ran) { - count, err := idx.GetRowCount(sc, nil, []*ranger.Range{ran}, coll.Count) + count, err := idx.GetRowCount(sctx, nil, []*ranger.Range{ran}, coll.Count) if err != nil { return 0, errors.Trace(err) } @@ -620,7 +695,7 @@ func (coll *HistColl) getIndexRowCount(sc *stmtctx.StatementContext, idxID int64 if err != nil { return 0, errors.Trace(err) } - selectivity, err = coll.getEqualCondSelectivity(sc, idx, bytes, rangePosition, ran) + selectivity, err = coll.getEqualCondSelectivity(sctx, idx, bytes, rangePosition, ran) if err != nil { return 0, errors.Trace(err) } @@ -636,7 +711,7 @@ func (coll *HistColl) getIndexRowCount(sc *stmtctx.StatementContext, idxID int64 if err != nil { return 0, err } - res, err := coll.getEqualCondSelectivity(sc, idx, bytes, rangePosition, ran) + res, err := coll.getEqualCondSelectivity(sctx, idx, bytes, rangePosition, ran) if err != nil { return 0, errors.Trace(err) } @@ -662,16 +737,16 @@ func (coll *HistColl) getIndexRowCount(sc *stmtctx.StatementContext, idxID int64 } // prefer index stats over column stats if idx, ok := coll.ColID2IdxID[colID]; ok { - count, err = coll.GetRowCountByIndexRanges(sc, idx, []*ranger.Range{&rang}) + count, err = coll.GetRowCountByIndexRanges(sctx, idx, []*ranger.Range{&rang}) } else { - count, err = coll.GetRowCountByColumnRanges(sc, colID, []*ranger.Range{&rang}) + count, err = coll.GetRowCountByColumnRanges(sctx, colID, []*ranger.Range{&rang}) } if err != nil { return 0, errors.Trace(err) } - selectivity = selectivity * count / float64(idx.TotalRowCount()) + selectivity = selectivity * count / idx.TotalRowCount() } - totalCount += selectivity * float64(idx.TotalRowCount()) + totalCount += selectivity * idx.TotalRowCount() } if totalCount > idx.TotalRowCount() { totalCount = idx.TotalRowCount() @@ -695,7 +770,10 @@ func PseudoTable(tblInfo *model.TableInfo) *Table { HistColl: pseudoHistColl, } for _, col := range tblInfo.Columns { - if col.State == model.StatePublic { + // The column is public to use. Also we should check the column is not hidden since hidden means that it's used by expression index. + // We would not collect stats for the hidden column and we won't use the hidden column to estimate. + // Thus we don't create pseudo stats for it. + if col.State == model.StatePublic && !col.Hidden { t.Columns[col.ID] = &Column{ PhysicalID: fakePhysicalID, Info: col, diff --git a/statistics/testdata/stats_suite_out.json b/statistics/testdata/stats_suite_out.json index 2897c02fb3df2..df4c8498d845c 100644 --- a/statistics/testdata/stats_suite_out.json +++ b/statistics/testdata/stats_suite_out.json @@ -656,7 +656,7 @@ { "Start": 800, "End": 900, - "Count": 761.004166655054 + "Count": 752.004166655054 }, { "Start": 900, @@ -711,7 +711,7 @@ { "Start": 800, "End": 1000, - "Count": 1219.196869573942 + "Count": 1210.196869573942 }, { "Start": 900, @@ -736,7 +736,7 @@ { "Start": 200, "End": 400, - "Count": 1186.5288209899081 + "Count": 1230.0288209899081 }, { "Start": 200, diff --git a/statistics/testdata/trace_suite_in.json b/statistics/testdata/trace_suite_in.json new file mode 100644 index 0000000000000..62ecf9e378432 --- /dev/null +++ b/statistics/testdata/trace_suite_in.json @@ -0,0 +1,11 @@ +[ + { + "name": "TestTraceCE", + "cases": [ + "a > 0 and a < 2", + "a >= 1 and a < 10", + "a < 3 or b < 4", + "a = 1 and b = 2" + ] + } +] diff --git a/statistics/testdata/trace_suite_out.json b/statistics/testdata/trace_suite_out.json new file mode 100644 index 0000000000000..2fe71ac70eec0 --- /dev/null +++ b/statistics/testdata/trace_suite_out.json @@ -0,0 +1,135 @@ +[ + { + "Name": "TestTraceCE", + "Cases": [ + { + "Expr": "a > 0 and a < 2", + "Trace": [ + { + "table_name": "t", + "type": "Column Stats-Point", + "expr": "((a = 1))", + "row_count": 4 + }, + { + "table_name": "t", + "type": "Index Stats-Point", + "expr": "((a = 1))", + "row_count": 4 + }, + { + "table_name": "t", + "type": "Column Stats-Range", + "expr": "((a > 0 and a < 2))", + "row_count": 4 + }, + { + "table_name": "t", + "type": "Table Stats-Expression-CNF", + "expr": "`and`(`gt`(test.t.a, 0), `lt`(test.t.a, 2))", + "row_count": 4 + } + ] + }, + { + "Expr": "a >= 1 and a < 10", + "Trace": [ + { + "table_name": "t", + "type": "Index Stats-Range", + "expr": "((a >= 1 and a < 10))", + "row_count": 6 + }, + { + "table_name": "t", + "type": "Column Stats-Range", + "expr": "((a >= 1 and a < 10))", + "row_count": 6 + }, + { + "table_name": "t", + "type": "Table Stats-Expression-CNF", + "expr": "`and`(`ge`(test.t.a, 1), `lt`(test.t.a, 10))", + "row_count": 6 + } + ] + }, + { + "Expr": "a < 3 or b < 4", + "Trace": [ + { + "table_name": "t", + "type": "Column Stats-Range", + "expr": "((b < 4))", + "row_count": 6 + }, + { + "table_name": "t", + "type": "Table Stats-Expression-CNF", + "expr": "`lt`(test.t.b, 4)", + "row_count": 6 + }, + { + "table_name": "t", + "type": "Table Stats-Expression-DNF", + "expr": "`or`(`lt`(test.t.a, 3), `lt`(test.t.b, 4))", + "row_count": 6 + }, + { + "table_name": "t", + "type": "Column Stats-Range", + "expr": "((a < 3))", + "row_count": 6 + }, + { + "table_name": "t", + "type": "Index Stats-Range", + "expr": "((a < 3))", + "row_count": 6 + }, + { + "table_name": "t", + "type": "Table Stats-Expression-CNF", + "expr": "`lt`(test.t.a, 3)", + "row_count": 6 + }, + { + "table_name": "t", + "type": "Table Stats-Expression-CNF", + "expr": "`or`(`lt`(test.t.a, 3), `lt`(test.t.b, 4))", + "row_count": 6 + } + ] + }, + { + "Expr": "a = 1 and b = 2", + "Trace": [ + { + "table_name": "t", + "type": "Index Stats-Point", + "expr": "((a = 1) and (b = 2))", + "row_count": 2 + }, + { + "table_name": "t", + "type": "Column Stats-Point", + "expr": "((a = 1))", + "row_count": 4 + }, + { + "table_name": "t", + "type": "Column Stats-Point", + "expr": "((b = 2))", + "row_count": 3 + }, + { + "table_name": "t", + "type": "Table Stats-Expression-CNF", + "expr": "`and`(`eq`(test.t.a, 1), `eq`(test.t.b, 2))", + "row_count": 2 + } + ] + } + ] + } +] diff --git a/statistics/trace_test.go b/statistics/trace_test.go new file mode 100644 index 0000000000000..515d73cb7105e --- /dev/null +++ b/statistics/trace_test.go @@ -0,0 +1,104 @@ +// Copyright 2021 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, +// 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. + +package statistics_test + +import ( + "context" + "encoding/json" + "testing" + + "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/infoschema" + "github.com/pingcap/tidb/parser" + plannercore "github.com/pingcap/tidb/planner/core" + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/statistics" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/testkit/testdata" + "github.com/pingcap/tidb/util/tracing" + "github.com/stretchr/testify/require" +) + +func TestTraceCE(t *testing.T) { + domain.RunAutoAnalyze = false + store, dom, clean := testkit.CreateMockStoreAndDomain(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int, d varchar(10), index idx(a, b))") + tk.MustExec(`insert into t values(1, 1, "aaa"), + (1, 1, "bbb"), + (1, 2, "ccc"), + (1, 2, "ddd"), + (2, 2, "aaa"), + (2, 3, "bbb")`) + tk.MustExec("analyze table t") + var ( + in []string + out []struct { + Expr string + Trace []*tracing.CETraceRecord + } + ) + traceSuiteData := statistics.GetTraceSuiteData() + traceSuiteData.GetTestCases(t, &in, &out) + + // Load needed statistics. + for _, tt := range in { + sql := "explain select * from t where " + tt + tk.MustExec(sql) + } + statsHandle := dom.StatsHandle() + err := statsHandle.LoadNeededHistograms() + require.NoError(t, err) + + sctx := tk.Session().(sessionctx.Context) + is := sctx.GetInfoSchema().(infoschema.InfoSchema) + p := parser.New() + for i, expr := range in { + stmtCtx := sctx.GetSessionVars().StmtCtx + sql := "explain select * from t where " + expr + stmtCtx.EnableOptimizerCETrace = true + stmtCtx.OptimizerCETrace = nil + stmt, err := p.ParseOneStmt(sql, "", "") + require.NoError(t, err) + _, _, err = plannercore.OptimizeAstNode(context.Background(), sctx, stmt, is) + require.NoError(t, err) + + traceResult := sctx.GetSessionVars().StmtCtx.OptimizerCETrace + // Ignore the TableID field because this field is unexported when marshalling to JSON. + for _, rec := range traceResult { + rec.TableID = 0 + } + + testdata.OnRecord(func() { + out[i].Expr = expr + out[i].Trace = traceResult + }) + // Assert using the result in the stmtCtx + require.ElementsMatch(t, traceResult, out[i].Trace) + + sql = "trace plan target='estimation' select * from t where " + expr + result := tk.MustQuery(sql) + require.Len(t, result.Rows(), 1) + resultStr := result.Rows()[0][0].(string) + var resultJSON []*tracing.CETraceRecord + err = json.Unmarshal([]byte(resultStr), &resultJSON) + require.NoError(t, err) + // Assert using the result of trace plan SQL + require.ElementsMatch(t, resultJSON, out[i].Trace) + } +} diff --git a/store/copr/batch_coprocessor.go b/store/copr/batch_coprocessor.go index 77ed84366c0a4..e2ab8de16c30b 100644 --- a/store/copr/batch_coprocessor.go +++ b/store/copr/batch_coprocessor.go @@ -793,14 +793,16 @@ func (b *batchCopIterator) handleTaskOnce(ctx context.Context, bo *backoff.Backo } req := tikvrpc.NewRequest(task.cmdType, &copReq, kvrpcpb.Context{ - IsolationLevel: isolationLevelToPB(b.req.IsolationLevel), - Priority: priorityToPB(b.req.Priority), - NotFillCache: b.req.NotFillCache, - RecordTimeStat: true, - RecordScanStat: true, - TaskId: b.req.TaskID, - ResourceGroupTag: b.req.ResourceGroupTag, + IsolationLevel: isolationLevelToPB(b.req.IsolationLevel), + Priority: priorityToPB(b.req.Priority), + NotFillCache: b.req.NotFillCache, + RecordTimeStat: true, + RecordScanStat: true, + TaskId: b.req.TaskID, }) + if b.req.ResourceGroupTagger != nil { + b.req.ResourceGroupTagger(req) + } req.StoreTp = tikvrpc.TiFlash logutil.BgLogger().Debug("send batch request to ", zap.String("req info", req.String()), zap.Int("cop task len", len(task.regionInfos))) diff --git a/store/copr/batch_coprocessor_test.go b/store/copr/batch_coprocessor_test.go index 360cb54238685..97428319ab2b1 100644 --- a/store/copr/batch_coprocessor_test.go +++ b/store/copr/batch_coprocessor_test.go @@ -94,8 +94,6 @@ func calcReginCount(tasks []*batchCopTask) int { } func TestBalanceBatchCopTaskWithContinuity(t *testing.T) { - t.Parallel() - for replicaNum := 1; replicaNum < 6; replicaNum++ { storeCount := 10 regionCount := 100000 diff --git a/store/copr/coprocessor.go b/store/copr/coprocessor.go index a2a8ce5e5b9a8..25ed965ea15e3 100644 --- a/store/copr/coprocessor.go +++ b/store/copr/coprocessor.go @@ -61,6 +61,18 @@ const ( copNextMaxBackoff = 20000 ) +// A paging request may be separated into multi requests if there are more data than a page. +// The paging size grows from min to max, it's not well tuned yet. +// e.g. a paging request scans over range (r1, r200), it requires 64 rows in the first batch, +// if it's not drained, then the paging size grows, the new range is calculated like (r100, r200), then send a request again. +// Compare with the common unary request, paging request allows early access of data, it offers a streaming-like way processing data. +// TODO: may make the paging parameters configurable. +const ( + minPagingSize uint64 = 64 + maxPagingSize = minPagingSize * 128 + pagingSizeGrow uint64 = 2 +) + // CopClient is coprocessor client. type CopClient struct { kv.RequestTypeSupportedChecker @@ -78,6 +90,9 @@ func (c *CopClient) Send(ctx context.Context, req *kv.Request, variables interfa logutil.BgLogger().Debug("send batch requests") return c.sendBatch(ctx, req, vars) } + if req.Streaming && req.Paging { + return copErrorResponse{errors.New("streaming and paging are both on")} + } ctx = context.WithValue(ctx, tikv.TxnStartKey(), req.StartTs) bo := backoff.NewBackofferWithVars(ctx, copBuildTaskMaxBackoff, vars) ranges := NewKeyRanges(req.KeyRanges) @@ -115,6 +130,13 @@ func (c *CopClient) Send(ctx context.Context, req *kv.Request, variables interfa // 2*it.concurrency to avoid deadlock in the unit test caused by the `MustExec` or `Exec` capacity = it.concurrency * 2 } + // in streaming or paging request, a request will be returned in multi batches, + // enlarge the channel size to avoid the request blocked by buffer full. + if req.Streaming || req.Paging { + if capacity < 2048 { + capacity = 2048 + } + } it.respChan = make(chan *copResponse, capacity) it.sendRate = util.NewRateLimit(it.concurrency) } @@ -140,7 +162,9 @@ type copTask struct { cmdType tikvrpc.CmdType storeType kv.StoreType - eventCb trxevents.EventCallback + eventCb trxevents.EventCallback + paging bool + pagingSize uint64 } func (r *copTask) String() string { @@ -168,6 +192,14 @@ func buildCopTasks(bo *Backoffer, cache *RegionCache, ranges *KeyRanges, req *kv if err != nil { return nil, errors.Trace(err) } + // Channel buffer is 2 for handling region split. + // In a common case, two region split tasks will not be blocked. + chanSize := 2 + // in streaming or paging request, a request will be returned in multi batches, + // enlarge the channel size to avoid the request blocked by buffer full. + if req.Streaming || req.Paging { + chanSize = 128 + } var tasks []*copTask for _, loc := range locs { @@ -176,15 +208,21 @@ func buildCopTasks(bo *Backoffer, cache *RegionCache, ranges *KeyRanges, req *kv rLen := loc.Ranges.Len() for i := 0; i < rLen; { nextI := mathutil.Min(i+rangesPerTask, rLen) + // If this is a paging request, we set the paging size to minPagingSize, + // the size will grow every round. + pagingSize := uint64(0) + if req.Paging { + pagingSize = minPagingSize + } tasks = append(tasks, &copTask{ - region: loc.Location.Region, - ranges: loc.Ranges.Slice(i, nextI), - // Channel buffer is 2 for handling region split. - // In a common case, two region split tasks will not be blocked. - respChan: make(chan *copResponse, 2), - cmdType: cmdType, - storeType: req.StoreType, - eventCb: eventCb, + region: loc.Location.Region, + ranges: loc.Ranges.Slice(i, nextI), + respChan: make(chan *copResponse, chanSize), + cmdType: cmdType, + storeType: req.StoreType, + eventCb: eventCb, + paging: req.Paging, + pagingSize: pagingSize, }) i = nextI } @@ -268,7 +306,8 @@ type copIterator struct { // when the Close is called. we use atomic.CompareAndSwap `closed` to to make sure the channel is not closed twice. closed uint32 - resolvedLocks util.TSSet + resolvedLocks util.TSSet + committedLocks util.TSSet actionOnExceed *rateLimitAction } @@ -386,13 +425,8 @@ func (worker *copIteratorWorker) run(ctx context.Context) { worker.sendToRespCh(finCopResp, worker.respChan, false) } close(task.respChan) - if worker.vars != nil && worker.vars.Killed != nil && atomic.LoadUint32(worker.vars.Killed) == 1 { - return - } - select { - case <-worker.finishCh: + if worker.finished() { return - default: } } } @@ -411,7 +445,7 @@ func (it *copIterator) open(ctx context.Context, enabledRateLimitAction bool) { respChan: it.respChan, finishCh: it.finishCh, vars: it.vars, - kvclient: txnsnapshot.NewClientHelper(it.store.store, &it.resolvedLocks, false), + kvclient: txnsnapshot.NewClientHelper(it.store.store, &it.resolvedLocks, &it.committedLocks, false), memTracker: it.memTracker, replicaReadSeed: it.replicaReadSeed, actionOnExceed: it.actionOnExceed, @@ -648,11 +682,9 @@ func (worker *copIteratorWorker) handleTask(ctx context.Context, task *copTask, worker.sendToRespCh(resp, respCh, true) return } - // test whether the ctx is cancelled - if vars := bo.GetVars(); vars != nil && vars.Killed != nil && atomic.LoadUint32(vars.Killed) == 1 { - return + if worker.finished() { + break } - if len(tasks) > 0 { remainTasks = append(tasks, remainTasks[1:]...) } else { @@ -674,19 +706,21 @@ func (worker *copIteratorWorker) handleTaskOnce(bo *Backoffer, task *copTask, ch }) copReq := coprocessor.Request{ - Tp: worker.req.Tp, - StartTs: worker.req.StartTs, - Data: worker.req.Data, - Ranges: task.ranges.ToPBRanges(), - SchemaVer: worker.req.SchemaVar, + Tp: worker.req.Tp, + StartTs: worker.req.StartTs, + Data: worker.req.Data, + Ranges: task.ranges.ToPBRanges(), + SchemaVer: worker.req.SchemaVar, + PagingSize: task.pagingSize, } - var cacheKey []byte = nil - var cacheValue *coprCacheValue = nil + var cacheKey []byte + var cacheValue *coprCacheValue + // TODO: cache paging copr // If there are many ranges, it is very likely to be a TableLookupRequest. They are not worth to cache since // computing is not the main cost. Ignore such requests directly to avoid slowly building the cache key. - if task.cmdType == tikvrpc.CmdCop && worker.store.coprCache != nil && worker.req.Cacheable && worker.store.coprCache.CheckRequestAdmission(len(copReq.Ranges)) { + if task.cmdType == tikvrpc.CmdCop && !task.paging && worker.store.coprCache != nil && worker.req.Cacheable && worker.store.coprCache.CheckRequestAdmission(len(copReq.Ranges)) { cKey, err := coprCacheBuildKey(&copReq) if err == nil { cacheKey = cKey @@ -706,14 +740,16 @@ func (worker *copIteratorWorker) handleTaskOnce(bo *Backoffer, task *copTask, ch } req := tikvrpc.NewReplicaReadRequest(task.cmdType, &copReq, options.GetTiKVReplicaReadType(worker.req.ReplicaRead), &worker.replicaReadSeed, kvrpcpb.Context{ - IsolationLevel: isolationLevelToPB(worker.req.IsolationLevel), - Priority: priorityToPB(worker.req.Priority), - NotFillCache: worker.req.NotFillCache, - RecordTimeStat: true, - RecordScanStat: true, - TaskId: worker.req.TaskID, - ResourceGroupTag: worker.req.ResourceGroupTag, + IsolationLevel: isolationLevelToPB(worker.req.IsolationLevel), + Priority: priorityToPB(worker.req.Priority), + NotFillCache: worker.req.NotFillCache, + RecordTimeStat: true, + RecordScanStat: true, + TaskId: worker.req.TaskID, }) + if worker.req.ResourceGroupTagger != nil { + worker.req.ResourceGroupTagger(req) + } req.StoreTp = getEndPointType(task.storeType) startTime := time.Now() if worker.kvclient.Stats == nil { @@ -723,6 +759,7 @@ func (worker *copIteratorWorker) handleTaskOnce(bo *Backoffer, task *copTask, ch if worker.req.IsStaleness { req.EnableStaleRead() } + staleRead := req.GetStaleRead() ops := make([]tikv.StoreSelectorOption, 0, 2) if len(worker.req.MatchStoreLabels) > 0 { ops = append(ops, tikv.WithMatchLabels(worker.req.MatchStoreLabels)) @@ -744,13 +781,16 @@ func (worker *copIteratorWorker) handleTaskOnce(bo *Backoffer, task *copTask, ch worker.logTimeCopTask(costTime, task, bo, resp) } storeID := strconv.FormatUint(req.Context.GetPeer().GetStoreId(), 10) - staleRead := strconv.FormatBool(req.StaleRead) - metrics.TiKVCoprocessorHistogram.WithLabelValues(storeID, staleRead).Observe(costTime.Seconds()) + metrics.TiKVCoprocessorHistogram.WithLabelValues(storeID, strconv.FormatBool(staleRead)).Observe(costTime.Seconds()) if task.cmdType == tikvrpc.CmdCopStream { return worker.handleCopStreamResult(bo, rpcCtx, resp.Resp.(*tikvrpc.CopStreamResponse), task, ch, costTime) } + if worker.req.Paging { + return worker.handleCopPagingResult(bo, rpcCtx, &copResponse{pbResp: resp.Resp.(*coprocessor.Response)}, task, ch, costTime) + } + // Handles the response for non-streaming copTask. return worker.handleCopResponse(bo, rpcCtx, &copResponse{pbResp: resp.Resp.(*coprocessor.Response)}, cacheKey, cacheValue, task, ch, nil, costTime) } @@ -860,7 +900,8 @@ func (worker *copIteratorWorker) handleCopStreamResult(bo *Backoffer, rpcCtx *ti } else { logutil.BgLogger().Info("stream unknown error", zap.Error(err)) } - return worker.buildCopTasksFromRemain(bo, lastRange, task) + task.ranges = worker.calculateRemain(task.ranges, lastRange, worker.req.Desc) + return []*copTask{task}, nil } if resp.Range != nil { lastRange = resp.Range @@ -868,6 +909,29 @@ func (worker *copIteratorWorker) handleCopStreamResult(bo *Backoffer, rpcCtx *ti } } +func (worker *copIteratorWorker) handleCopPagingResult(bo *Backoffer, rpcCtx *tikv.RPCContext, resp *copResponse, task *copTask, ch chan<- *copResponse, costTime time.Duration) ([]*copTask, error) { + remainedTasks, err := worker.handleCopResponse(bo, rpcCtx, resp, nil, nil, task, ch, nil, costTime) + if err != nil || len(remainedTasks) != 0 { + // If there is region error or lock error, keep the paging size and retry. + for _, remainedTask := range remainedTasks { + remainedTask.pagingSize = task.pagingSize + } + return remainedTasks, errors.Trace(err) + } + pagingRange := resp.pbResp.Range + // only paging requests need to calculate the next ranges + if pagingRange == nil { + return nil, errors.New("lastRange in paging should not be nil") + } + // calculate next ranges and grow the paging size + task.ranges = worker.calculateRemain(task.ranges, pagingRange, worker.req.Desc) + if task.ranges.Len() == 0 { + return nil, nil + } + task.pagingSize = growPagingSize(task.pagingSize) + return []*copTask{task}, nil +} + // handleCopResponse checks coprocessor Response for region split and lock, // returns more tasks when that happens, or handles the response if no error. // if we're handling streaming coprocessor response, lastRange is the range of last @@ -907,7 +971,10 @@ func (worker *copIteratorWorker) handleCopResponse(bo *Backoffer, rpcCtx *tikv.R return nil, errors.Trace(err) } } - return worker.buildCopTasksFromRemain(bo, lastRange, task) + if worker.req.Streaming { + task.ranges = worker.calculateRetry(task.ranges, lastRange, worker.req.Desc) + } + return []*copTask{task}, nil } if otherErr := resp.pbResp.GetOtherError(); otherErr != "" { err := errors.Errorf("other error: %s", otherErr) @@ -1035,30 +1102,56 @@ func (worker *copIteratorWorker) handleTiDBSendReqErr(err error, task *copTask, return nil } -func (worker *copIteratorWorker) buildCopTasksFromRemain(bo *Backoffer, lastRange *coprocessor.KeyRange, task *copTask) ([]*copTask, error) { - remainedRanges := task.ranges - if worker.req.Streaming && lastRange != nil { - remainedRanges = worker.calculateRemain(task.ranges, lastRange, worker.req.Desc) +// calculateRetry splits the input ranges into two, and take one of them according to desc flag. +// It's used in streaming API, to calculate which range is consumed and what needs to be retry. +// For example: +// ranges: [r1 --> r2) [r3 --> r4) +// split: [s1 --> s2) +// In normal scan order, all data before s1 is consumed, so the retry ranges should be [s1 --> r2) [r3 --> r4) +// In reverse scan order, all data after s2 is consumed, so the retry ranges should be [r1 --> r2) [r3 --> s2) +func (worker *copIteratorWorker) calculateRetry(ranges *KeyRanges, split *coprocessor.KeyRange, desc bool) *KeyRanges { + if split == nil { + return ranges } - return buildCopTasks(bo, worker.store.GetRegionCache(), remainedRanges, worker.req, task.eventCb) + if desc { + left, _ := ranges.Split(split.End) + return left + } + _, right := ranges.Split(split.Start) + return right } -// calculateRemain splits the input ranges into two, and take one of them according to desc flag. -// It's used in streaming API, to calculate which range is consumed and what needs to be retry. +// calculateRemain calculates the remain ranges to be processed, it's used in streaming and paging API. // For example: // ranges: [r1 --> r2) [r3 --> r4) // split: [s1 --> s2) -// In normal scan order, all data before s1 is consumed, so the remain ranges should be [s1 --> r2) [r3 --> r4) -// In reverse scan order, all data after s2 is consumed, so the remain ranges should be [r1 --> r2) [r3 --> s2) +// In normal scan order, all data before s2 is consumed, so the remained ranges should be [s2 --> r4) +// In reverse scan order, all data after s1 is consumed, so the remained ranges should be [r1 --> s1) func (worker *copIteratorWorker) calculateRemain(ranges *KeyRanges, split *coprocessor.KeyRange, desc bool) *KeyRanges { + if split == nil { + return ranges + } if desc { - left, _ := ranges.Split(split.End) + left, _ := ranges.Split(split.Start) return left } - _, right := ranges.Split(split.Start) + _, right := ranges.Split(split.End) return right } +// finished checks the flags and finished channel, it tells whether the worker is finished. +func (worker *copIteratorWorker) finished() bool { + if worker.vars != nil && worker.vars.Killed != nil && atomic.LoadUint32(worker.vars.Killed) == 1 { + return true + } + select { + case <-worker.finishCh: + return true + default: + return false + } +} + func (it *copIterator) Close() error { if atomic.CompareAndSwapUint32(&it.closed, 0, 1) { close(it.finishCh) @@ -1239,3 +1332,11 @@ func isolationLevelToPB(level kv.IsoLevel) kvrpcpb.IsolationLevel { return kvrpcpb.IsolationLevel_SI } } + +func growPagingSize(size uint64) uint64 { + size *= pagingSizeGrow + if size > maxPagingSize { + return maxPagingSize + } + return size +} diff --git a/store/copr/coprocessor_cache_test.go b/store/copr/coprocessor_cache_test.go index 712d7b2e25ecf..8c68888ee61a8 100644 --- a/store/copr/coprocessor_cache_test.go +++ b/store/copr/coprocessor_cache_test.go @@ -25,7 +25,6 @@ import ( ) func TestBuildCacheKey(t *testing.T) { - t.Parallel() req := coprocessor.Request{ Tp: 0xAB, StartTs: 0xAABBCC, @@ -70,7 +69,6 @@ func TestBuildCacheKey(t *testing.T) { } func TestDisable(t *testing.T) { - t.Parallel() cache, err := newCoprCache(&config.CoprocessorCache{CapacityMB: 0}) require.NoError(t, err) require.Nil(t, cache) @@ -95,7 +93,6 @@ func TestDisable(t *testing.T) { } func TestAdmission(t *testing.T) { - t.Parallel() cache, err := newCoprCache(&config.CoprocessorCache{AdmissionMinProcessMs: 5, AdmissionMaxResultMB: 1, CapacityMB: 1}) require.NoError(t, err) require.NotNil(t, cache) @@ -153,7 +150,6 @@ func TestAdmission(t *testing.T) { } func TestCacheValueLen(t *testing.T) { - t.Parallel() v := coprCacheValue{ TimeStamp: 0x123, RegionID: 0x1, @@ -173,7 +169,6 @@ func TestCacheValueLen(t *testing.T) { } func TestGetSet(t *testing.T) { - t.Parallel() cache, err := newCoprCache(&config.CoprocessorCache{AdmissionMinProcessMs: 5, AdmissionMaxResultMB: 1, CapacityMB: 1}) require.NoError(t, err) require.NotNil(t, cache) @@ -200,7 +195,6 @@ func TestGetSet(t *testing.T) { } func TestIssue24118(t *testing.T) { - t.Parallel() _, err := newCoprCache(&config.CoprocessorCache{AdmissionMinProcessMs: 5, AdmissionMaxResultMB: 1, CapacityMB: -1}) require.EqualError(t, err, "Capacity must be > 0 to enable the cache") } diff --git a/store/copr/coprocessor_test.go b/store/copr/coprocessor_test.go index 213a1bb948056..88ad5568f68eb 100644 --- a/store/copr/coprocessor_test.go +++ b/store/copr/coprocessor_test.go @@ -18,6 +18,7 @@ import ( "context" "testing" + "github.com/pingcap/kvproto/pkg/coprocessor" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/store/driver/backoff" "github.com/stretchr/testify/require" @@ -26,7 +27,6 @@ import ( ) func TestBuildTasks(t *testing.T) { - t.Parallel() // nil --- 'g' --- 'n' --- 't' --- nil // <- 0 -> <- 1 -> <- 2 -> <- 3 -> mockClient, cluster, pdClient, err := testutils.NewMockTiKV("", nil) @@ -154,7 +154,6 @@ func TestBuildTasks(t *testing.T) { } func TestSplitRegionRanges(t *testing.T) { - t.Parallel() // nil --- 'g' --- 'n' --- 't' --- nil // <- 0 -> <- 1 -> <- 2 -> <- 3 -> mockClient, cluster, pdClient, err := testutils.NewMockTiKV("", nil) @@ -217,7 +216,6 @@ func TestSplitRegionRanges(t *testing.T) { } func TestRebuild(t *testing.T) { - t.Parallel() // nil --- 'm' --- nil // <- 0 -> <- 1 -> mockClient, cluster, pdClient, err := testutils.NewMockTiKV("", nil) @@ -289,3 +287,171 @@ func rangeEqual(t *testing.T, ranges []kv.KeyRange, keys ...string) { require.Equal(t, string(r.EndKey), keys[2*i+1]) } } + +func TestBuildPagingTasks(t *testing.T) { + // nil --- 'g' --- 'n' --- 't' --- nil + // <- 0 -> <- 1 -> <- 2 -> <- 3 -> + mockClient, cluster, pdClient, err := testutils.NewMockTiKV("", nil) + require.NoError(t, err) + defer func() { + pdClient.Close() + err = mockClient.Close() + require.NoError(t, err) + }() + + _, regionIDs, _ := testutils.BootstrapWithMultiRegions(cluster, []byte("g"), []byte("n"), []byte("t")) + pdCli := &tikv.CodecPDClient{Client: pdClient} + defer pdCli.Close() + + cache := NewRegionCache(tikv.NewRegionCache(pdCli)) + defer cache.Close() + + bo := backoff.NewBackofferWithVars(context.Background(), 3000, nil) + + req := &kv.Request{} + req.Paging = true + flashReq := &kv.Request{} + flashReq.StoreType = kv.TiFlash + tasks, err := buildCopTasks(bo, cache, buildCopRanges("a", "c"), req, nil) + require.NoError(t, err) + require.Len(t, tasks, 1) + require.Len(t, tasks, 1) + taskEqual(t, tasks[0], regionIDs[0], "a", "c") + require.True(t, tasks[0].paging) + require.Equal(t, tasks[0].pagingSize, minPagingSize) +} + +func toCopRange(r kv.KeyRange) *coprocessor.KeyRange { + coprRange := coprocessor.KeyRange{} + coprRange.Start = r.StartKey + coprRange.End = r.EndKey + return &coprRange +} + +func toRange(r *KeyRanges) []kv.KeyRange { + ranges := make([]kv.KeyRange, 0, r.Len()) + if r.first != nil { + ranges = append(ranges, *r.first) + } + ranges = append(ranges, r.mid...) + if r.last != nil { + ranges = append(ranges, *r.last) + } + return ranges +} + +func TestCalculateRetry(t *testing.T) { + worker := copIteratorWorker{} + + // split in one range + { + ranges := buildKeyRanges("a", "c", "e", "g") + split := buildKeyRanges("b", "c")[0] + retry := worker.calculateRetry(NewKeyRanges(ranges), toCopRange(split), false) + rangeEqual(t, toRange(retry), "b", "c", "e", "g") + } + { + ranges := buildKeyRanges("a", "c", "e", "g") + split := buildKeyRanges("e", "f")[0] + retry := worker.calculateRetry(NewKeyRanges(ranges), toCopRange(split), true) + rangeEqual(t, toRange(retry), "a", "c", "e", "f") + } + + // across ranges + { + ranges := buildKeyRanges("a", "c", "e", "g") + split := buildKeyRanges("b", "f")[0] + retry := worker.calculateRetry(NewKeyRanges(ranges), toCopRange(split), false) + rangeEqual(t, toRange(retry), "b", "c", "e", "g") + } + { + ranges := buildKeyRanges("a", "c", "e", "g") + split := buildKeyRanges("b", "f")[0] + retry := worker.calculateRetry(NewKeyRanges(ranges), toCopRange(split), true) + rangeEqual(t, toRange(retry), "a", "c", "e", "f") + } + + // exhaust the ranges + { + ranges := buildKeyRanges("a", "c", "e", "g") + split := buildKeyRanges("a", "g")[0] + retry := worker.calculateRetry(NewKeyRanges(ranges), toCopRange(split), false) + rangeEqual(t, toRange(retry), "a", "c", "e", "g") + } + { + ranges := buildKeyRanges("a", "c", "e", "g") + split := buildKeyRanges("a", "g")[0] + retry := worker.calculateRetry(NewKeyRanges(ranges), toCopRange(split), true) + rangeEqual(t, toRange(retry), "a", "c", "e", "g") + } + + // nil range + { + ranges := buildKeyRanges("a", "c", "e", "g") + retry := worker.calculateRetry(NewKeyRanges(ranges), nil, false) + rangeEqual(t, toRange(retry), "a", "c", "e", "g") + } + { + ranges := buildKeyRanges("a", "c", "e", "g") + retry := worker.calculateRetry(NewKeyRanges(ranges), nil, true) + rangeEqual(t, toRange(retry), "a", "c", "e", "g") + } +} + +func TestCalculateRemain(t *testing.T) { + worker := copIteratorWorker{} + + // split in one range + { + ranges := buildKeyRanges("a", "c", "e", "g") + split := buildKeyRanges("a", "b")[0] + remain := worker.calculateRemain(NewKeyRanges(ranges), toCopRange(split), false) + rangeEqual(t, toRange(remain), "b", "c", "e", "g") + } + { + ranges := buildKeyRanges("a", "c", "e", "g") + split := buildKeyRanges("f", "g")[0] + remain := worker.calculateRemain(NewKeyRanges(ranges), toCopRange(split), true) + rangeEqual(t, toRange(remain), "a", "c", "e", "f") + } + + // across ranges + { + ranges := buildKeyRanges("a", "c", "e", "g") + split := buildKeyRanges("a", "f")[0] + remain := worker.calculateRemain(NewKeyRanges(ranges), toCopRange(split), false) + rangeEqual(t, toRange(remain), "f", "g") + } + { + ranges := buildKeyRanges("a", "c", "e", "g") + split := buildKeyRanges("b", "g")[0] + remain := worker.calculateRemain(NewKeyRanges(ranges), toCopRange(split), true) + rangeEqual(t, toRange(remain), "a", "b") + } + + // exhaust the ranges + { + ranges := buildKeyRanges("a", "c", "e", "g") + split := buildKeyRanges("a", "g")[0] + remain := worker.calculateRemain(NewKeyRanges(ranges), toCopRange(split), false) + require.Equal(t, remain.Len(), 0) + } + { + ranges := buildKeyRanges("a", "c", "e", "g") + split := buildKeyRanges("a", "g")[0] + remain := worker.calculateRemain(NewKeyRanges(ranges), toCopRange(split), true) + require.Equal(t, remain.Len(), 0) + } + + // nil range + { + ranges := buildKeyRanges("a", "c", "e", "g") + remain := worker.calculateRemain(NewKeyRanges(ranges), nil, false) + rangeEqual(t, toRange(remain), "a", "c", "e", "g") + } + { + ranges := buildKeyRanges("a", "c", "e", "g") + remain := worker.calculateRemain(NewKeyRanges(ranges), nil, true) + rangeEqual(t, toRange(remain), "a", "c", "e", "g") + } +} diff --git a/store/copr/key_ranges.go b/store/copr/key_ranges.go index 048353df8970b..81e5b22f916aa 100644 --- a/store/copr/key_ranges.go +++ b/store/copr/key_ranges.go @@ -103,7 +103,8 @@ func (r *KeyRanges) Do(f func(ran *kv.KeyRange)) { if r.first != nil { f(r.first) } - for _, ran := range r.mid { + for i := range r.mid { + ran := r.mid[i] f(&ran) } if r.last != nil { diff --git a/store/copr/key_ranges_test.go b/store/copr/key_ranges_test.go index f26652c87175f..d2be4676dd589 100644 --- a/store/copr/key_ranges_test.go +++ b/store/copr/key_ranges_test.go @@ -22,7 +22,6 @@ import ( ) func TestCopRanges(t *testing.T) { - t.Parallel() ranges := []kv.KeyRange{ {StartKey: []byte("a"), EndKey: []byte("b")}, {StartKey: []byte("c"), EndKey: []byte("d")}, @@ -36,7 +35,6 @@ func TestCopRanges(t *testing.T) { } func TestCopRangeSplit(t *testing.T) { - t.Parallel() first := &kv.KeyRange{StartKey: []byte("a"), EndKey: []byte("b")} mid := []kv.KeyRange{ {StartKey: []byte("c"), EndKey: []byte("d")}, diff --git a/store/copr/mpp.go b/store/copr/mpp.go index 599b2e155fc4f..f8970f57cccc4 100644 --- a/store/copr/mpp.go +++ b/store/copr/mpp.go @@ -68,7 +68,7 @@ func (c *MPPClient) ConstructMPPTasks(ctx context.Context, req *kv.MPPBuildTasks return c.selectAllTiFlashStore(), nil } ranges := NewKeyRanges(req.KeyRanges) - tasks, err := buildBatchCopTasks(bo, c.store, ranges, kv.TiFlash, mppStoreLastFailTime, ttl, req.BalanceWithContinuity, req.BalanceContinuousRegionCount) + tasks, err := buildBatchCopTasks(bo, c.store, ranges, kv.TiFlash, mppStoreLastFailTime, ttl, true, 20) if err != nil { return nil, errors.Trace(err) } @@ -141,6 +141,8 @@ type mppIterator struct { vars *tikv.Variables + needTriggerFallback bool + mu sync.Mutex } @@ -236,8 +238,12 @@ func (m *mppIterator) handleDispatchReq(ctx context.Context, bo *Backoffer, req // That's a hard job but we can try it in the future. if sender.GetRPCError() != nil { logutil.BgLogger().Warn("mpp dispatch meet io error", zap.String("error", sender.GetRPCError().Error()), zap.Uint64("timestamp", taskMeta.StartTs), zap.Int64("task", taskMeta.TaskId)) - // we return timeout to trigger tikv's fallback - err = derr.ErrTiFlashServerTimeout + // if needTriggerFallback is true, we return timeout to trigger tikv's fallback + if m.needTriggerFallback { + err = derr.ErrTiFlashServerTimeout + } else { + err = sender.GetRPCError() + } } } else { rpcResp, err = m.store.GetTiKVClient().SendRequest(ctx, req.Meta.GetAddress(), wrappedReq, tikv.ReadTimeoutMedium) @@ -258,8 +264,11 @@ func (m *mppIterator) handleDispatchReq(ctx context.Context, bo *Backoffer, req if err != nil { logutil.BgLogger().Error("mpp dispatch meet error", zap.String("error", err.Error()), zap.Uint64("timestamp", taskMeta.StartTs), zap.Int64("task", taskMeta.TaskId)) - // we return timeout to trigger tikv's fallback - m.sendError(derr.ErrTiFlashServerTimeout) + // if needTriggerFallback is true, we return timeout to trigger tikv's fallback + if m.needTriggerFallback { + err = derr.ErrTiFlashServerTimeout + } + m.sendError(err) return } @@ -339,14 +348,18 @@ func (m *mppIterator) establishMPPConns(bo *Backoffer, req *kv.MPPDispatchReques wrappedReq := tikvrpc.NewRequest(tikvrpc.CmdMPPConn, connReq, kvrpcpb.Context{}) wrappedReq.StoreTp = tikvrpc.TiFlash - // Drain result from root task. + // Drain results from root task. // We don't need to process any special error. When we meet errors, just let it fail. rpcResp, err := m.store.GetTiKVClient().SendRequest(bo.GetCtx(), req.Meta.GetAddress(), wrappedReq, readTimeoutUltraLong) if err != nil { logutil.BgLogger().Warn("establish mpp connection meet error and cannot retry", zap.String("error", err.Error()), zap.Uint64("timestamp", taskMeta.StartTs), zap.Int64("task", taskMeta.TaskId)) - // we return timeout to trigger tikv's fallback - m.sendError(derr.ErrTiFlashServerTimeout) + // if needTriggerFallback is true, we return timeout to trigger tikv's fallback + if m.needTriggerFallback { + m.sendError(derr.ErrTiFlashServerTimeout) + } else { + m.sendError(err) + } return } @@ -378,7 +391,12 @@ func (m *mppIterator) establishMPPConns(bo *Backoffer, req *kv.MPPDispatchReques logutil.BgLogger().Info("stream unknown error", zap.Error(err), zap.Uint64("timestamp", taskMeta.StartTs), zap.Int64("task", taskMeta.TaskId)) } } - m.sendError(derr.ErrTiFlashServerTimeout) + // if needTriggerFallback is true, we return timeout to trigger tikv's fallback + if m.needTriggerFallback { + m.sendError(derr.ErrTiFlashServerTimeout) + } else { + m.sendError(err) + } return } } @@ -470,17 +488,18 @@ func (m *mppIterator) Next(ctx context.Context) (kv.ResultSubset, error) { } // DispatchMPPTasks dispatches all the mpp task and waits for the responses. -func (c *MPPClient) DispatchMPPTasks(ctx context.Context, variables interface{}, dispatchReqs []*kv.MPPDispatchRequest) kv.Response { +func (c *MPPClient) DispatchMPPTasks(ctx context.Context, variables interface{}, dispatchReqs []*kv.MPPDispatchRequest, needTriggerFallback bool) kv.Response { vars := variables.(*tikv.Variables) ctxChild, cancelFunc := context.WithCancel(ctx) iter := &mppIterator{ - store: c.store, - tasks: dispatchReqs, - finishCh: make(chan struct{}), - cancelFunc: cancelFunc, - respChan: make(chan *mppResponse, 4096), - startTs: dispatchReqs[0].StartTs, - vars: vars, + store: c.store, + tasks: dispatchReqs, + finishCh: make(chan struct{}), + cancelFunc: cancelFunc, + respChan: make(chan *mppResponse, 4096), + startTs: dispatchReqs[0].StartTs, + vars: vars, + needTriggerFallback: needTriggerFallback, } go iter.run(ctxChild) return iter diff --git a/store/driver/error/error.go b/store/driver/error/error.go index 3a9841e7cef7d..8260acd2640bb 100644 --- a/store/driver/error/error.go +++ b/store/driver/error/error.go @@ -15,6 +15,8 @@ package error import ( + stderrs "errors" + "github.com/pingcap/errors" "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/kv" @@ -64,95 +66,99 @@ var ( // ToTiDBErr checks and converts a tikv error to a tidb error. func ToTiDBErr(err error) error { - originErr := err if err == nil { return nil } - err = errors.Cause(err) if tikverr.IsErrNotFound(err) { return kv.ErrNotExist } - if e, ok := err.(*tikverr.ErrWriteConflictInLatch); ok { - return kv.ErrWriteConflictInTiDB.FastGenByArgs(e.StartTS) + var writeConflictInLatch *tikverr.ErrWriteConflictInLatch + if stderrs.As(err, &writeConflictInLatch) { + return kv.ErrWriteConflictInTiDB.FastGenByArgs(writeConflictInLatch.StartTS) } - if e, ok := err.(*tikverr.ErrTxnTooLarge); ok { - return kv.ErrTxnTooLarge.GenWithStackByArgs(e.Size) + var txnTooLarge *tikverr.ErrTxnTooLarge + if stderrs.As(err, &txnTooLarge) { + return kv.ErrTxnTooLarge.GenWithStackByArgs(txnTooLarge.Size) } - if errors.ErrorEqual(err, tikverr.ErrCannotSetNilValue) { + if stderrs.Is(err, tikverr.ErrCannotSetNilValue) { return kv.ErrCannotSetNilValue } - if e, ok := err.(*tikverr.ErrEntryTooLarge); ok { - return kv.ErrEntryTooLarge.GenWithStackByArgs(e.Limit, e.Size) + var entryTooLarge *tikverr.ErrEntryTooLarge + if stderrs.As(err, &entryTooLarge) { + return kv.ErrEntryTooLarge.GenWithStackByArgs(entryTooLarge.Limit, entryTooLarge.Size) } - if errors.ErrorEqual(err, tikverr.ErrInvalidTxn) { + if stderrs.Is(err, tikverr.ErrInvalidTxn) { return kv.ErrInvalidTxn } - if errors.ErrorEqual(err, tikverr.ErrTiKVServerTimeout) { + if stderrs.Is(err, tikverr.ErrTiKVServerTimeout) { return ErrTiKVServerTimeout } - if e, ok := err.(*tikverr.ErrPDServerTimeout); ok { - if len(e.Error()) == 0 { + var pdServerTimeout *tikverr.ErrPDServerTimeout + if stderrs.As(err, &pdServerTimeout) { + if len(pdServerTimeout.Error()) == 0 { return ErrPDServerTimeout } - return ErrPDServerTimeout.GenWithStackByArgs(e.Error()) + return ErrPDServerTimeout.GenWithStackByArgs(pdServerTimeout.Error()) } - if errors.ErrorEqual(err, tikverr.ErrTiFlashServerTimeout) { + if stderrs.Is(err, tikverr.ErrTiFlashServerTimeout) { return ErrTiFlashServerTimeout } - if errors.ErrorEqual(err, tikverr.ErrQueryInterrupted) { + if stderrs.Is(err, tikverr.ErrQueryInterrupted) { return ErrQueryInterrupted } - if errors.ErrorEqual(err, tikverr.ErrTiKVServerBusy) { + if stderrs.Is(err, tikverr.ErrTiKVServerBusy) { return ErrTiKVServerBusy } - if errors.ErrorEqual(err, tikverr.ErrTiFlashServerBusy) { + if stderrs.Is(err, tikverr.ErrTiFlashServerBusy) { return ErrTiFlashServerBusy } - if e, ok := err.(*tikverr.ErrGCTooEarly); ok { - return ErrGCTooEarly.GenWithStackByArgs(e.TxnStartTS, e.GCSafePoint) + var gcTooEarly *tikverr.ErrGCTooEarly + if stderrs.As(err, &gcTooEarly) { + return ErrGCTooEarly.GenWithStackByArgs(gcTooEarly.TxnStartTS, gcTooEarly.GCSafePoint) } - if errors.ErrorEqual(err, tikverr.ErrTiKVStaleCommand) { + if stderrs.Is(err, tikverr.ErrTiKVStaleCommand) { return ErrTiKVStaleCommand } - if errors.ErrorEqual(err, tikverr.ErrTiKVMaxTimestampNotSynced) { + if stderrs.Is(err, tikverr.ErrTiKVMaxTimestampNotSynced) { return ErrTiKVMaxTimestampNotSynced } - if errors.ErrorEqual(err, tikverr.ErrLockAcquireFailAndNoWaitSet) { + if stderrs.Is(err, tikverr.ErrLockAcquireFailAndNoWaitSet) { return ErrLockAcquireFailAndNoWaitSet } - if errors.ErrorEqual(err, tikverr.ErrResolveLockTimeout) { + if stderrs.Is(err, tikverr.ErrResolveLockTimeout) { return ErrResolveLockTimeout } - if errors.ErrorEqual(err, tikverr.ErrLockWaitTimeout) { + if stderrs.Is(err, tikverr.ErrLockWaitTimeout) { return ErrLockWaitTimeout } - if errors.ErrorEqual(err, tikverr.ErrRegionUnavailable) { + if stderrs.Is(err, tikverr.ErrRegionUnavailable) { return ErrRegionUnavailable } - if e, ok := err.(*tikverr.ErrTokenLimit); ok { - return ErrTokenLimit.GenWithStackByArgs(e.StoreID) + var tokenLimit *tikverr.ErrTokenLimit + if stderrs.As(err, &tokenLimit) { + return ErrTokenLimit.GenWithStackByArgs(tokenLimit.StoreID) } - if errors.ErrorEqual(err, tikverr.ErrUnknown) { + if stderrs.Is(err, tikverr.ErrUnknown) { return ErrUnknown } @@ -160,5 +166,5 @@ func ToTiDBErr(err error) error { return terror.ErrResultUndetermined } - return errors.Trace(originErr) + return errors.Trace(err) } diff --git a/store/driver/sql_fail_serial_test.go b/store/driver/sql_fail_serial_test.go index afe2b4bd3b69a..5678ab42e2756 100644 --- a/store/driver/sql_fail_serial_test.go +++ b/store/driver/sql_fail_serial_test.go @@ -55,7 +55,7 @@ func TestFailBusyServerCop(t *testing.T) { }() } require.NoError(t, err) - req := rs[0].NewChunk() + req := rs[0].NewChunk(nil) err = rs[0].Next(context.Background(), req) require.NoError(t, err) require.NotEqual(t, 0, req.NumRows()) @@ -108,7 +108,7 @@ func TestCoprocessorStreamRecvTimeout(t *testing.T) { res, err := tk.Session().Execute(ctx, "select * from cop_stream_timeout") require.NoError(t, err) - req := res[0].NewChunk() + req := res[0].NewChunk(nil) for i := 0; ; i++ { err := res[0].Next(ctx, req) require.NoError(t, err) diff --git a/store/driver/tikv_driver.go b/store/driver/tikv_driver.go index 2f2a83ccc2afe..a3c385f39df6e 100644 --- a/store/driver/tikv_driver.go +++ b/store/driver/tikv_driver.go @@ -176,7 +176,6 @@ func (d TiKVDriver) OpenWithOptions(path string, options ...Option) (kv.Storage, etcdAddrs: etcdAddrs, tlsConfig: tlsConfig, memCache: kv.NewCacheDB(), - pdClient: &pdClient, enableGC: !disableGC, coprStore: coprStore, } @@ -190,7 +189,6 @@ type tikvStore struct { etcdAddrs []string tlsConfig *tls.Config memCache kv.MemManager // this is used to query from memory - pdClient pd.Client enableGC bool gcWorker *gcworker.GCWorker coprStore *copr.Store @@ -206,9 +204,7 @@ func (s *tikvStore) Describe() string { return "TiKV is a distributed transactional key-value database" } -var ( - ldflagGetEtcdAddrsFromConfig = "0" // 1:Yes, otherwise:No -) +var ldflagGetEtcdAddrsFromConfig = "0" // 1:Yes, otherwise:No const getAllMembersBackoff = 5000 @@ -266,7 +262,7 @@ func (s *tikvStore) StartGCWorker() error { return nil } - gcWorker, err := gcworker.NewGCWorker(s, s.pdClient) + gcWorker, err := gcworker.NewGCWorker(s, s.GetPDClient()) if err != nil { return derr.ToTiDBErr(err) } @@ -302,17 +298,8 @@ func (s *tikvStore) GetMemCache() kv.MemManager { } // Begin a global transaction. -func (s *tikvStore) Begin() (kv.Transaction, error) { - txn, err := s.KVStore.Begin() - if err != nil { - return nil, derr.ToTiDBErr(err) - } - return txn_driver.NewTiKVTxn(txn), err -} - -// BeginWithOption begins a transaction with given option -func (s *tikvStore) BeginWithOption(option tikv.StartTSOption) (kv.Transaction, error) { - txn, err := s.KVStore.BeginWithOption(option) +func (s *tikvStore) Begin(opts ...tikv.TxnOption) (kv.Transaction, error) { + txn, err := s.KVStore.Begin(opts...) if err != nil { return nil, derr.ToTiDBErr(err) } diff --git a/store/driver/txn/batch_getter.go b/store/driver/txn/batch_getter.go index 272ae0fd9843e..19f588373d1cc 100644 --- a/store/driver/txn/batch_getter.go +++ b/store/driver/txn/batch_getter.go @@ -16,11 +16,60 @@ package txn import ( "context" + "unsafe" - "github.com/pingcap/errors" "github.com/pingcap/tidb/kv" + tikverr "github.com/tikv/client-go/v2/error" + "github.com/tikv/client-go/v2/txnkv/transaction" ) +// tikvBatchGetter is the BatchGetter struct for tikv +// In order to directly call NewBufferBatchGetter in client-go +// We need to implement the interface (transaction.BatchGetter) in client-go for tikvBatchGetter +type tikvBatchGetter struct { + tidbBatchGetter BatchGetter +} + +func (b tikvBatchGetter) BatchGet(ctx context.Context, keys [][]byte) (map[string][]byte, error) { + // toTiDBKeys + kvKeys := *(*[]kv.Key)(unsafe.Pointer(&keys)) + vals, err := b.tidbBatchGetter.BatchGet(ctx, kvKeys) + return vals, err +} + +// tikvBatchBufferGetter is the BatchBufferGetter struct for tikv +// In order to directly call NewBufferBatchGetter in client-go +// We need to implement the interface (transaction.BatchBufferGetter) in client-go for tikvBatchBufferGetter +type tikvBatchBufferGetter struct { + tidbMiddleCache Getter + tidbBuffer BatchBufferGetter +} + +func (b tikvBatchBufferGetter) Get(k []byte) ([]byte, error) { + // Get from buffer + val, err := b.tidbBuffer.Get(context.TODO(), k) + if err == nil || !kv.IsErrNotFound(err) || b.tidbMiddleCache == nil { + if kv.IsErrNotFound(err) { + err = tikverr.ErrNotExist + } + return val, err + } + // Get from middle cache + val, err = b.tidbMiddleCache.Get(context.TODO(), k) + if err == nil { + return val, err + } + // TiDB err NotExist to TiKV err NotExist + // The BatchGet method in client-go will call this method + // Therefore, the error needs to convert to TiKV's type, otherwise the error will not be handled properly in client-go + err = tikverr.ErrNotExist + return val, err +} + +func (b tikvBatchBufferGetter) Len() int { + return b.tidbBuffer.Len() +} + // BatchBufferGetter is the interface for BatchGet. type BatchBufferGetter interface { Len() int @@ -42,50 +91,20 @@ type Getter interface { // BufferBatchGetter is the type for BatchGet with MemBuffer. type BufferBatchGetter struct { - buffer BatchBufferGetter - middle Getter - snapshot BatchGetter + tikvBufferBatchGetter transaction.BufferBatchGetter } // NewBufferBatchGetter creates a new BufferBatchGetter. func NewBufferBatchGetter(buffer BatchBufferGetter, middleCache Getter, snapshot BatchGetter) *BufferBatchGetter { - return &BufferBatchGetter{buffer: buffer, middle: middleCache, snapshot: snapshot} + tikvBuffer := tikvBatchBufferGetter{tidbMiddleCache: middleCache, tidbBuffer: buffer} + tikvSnapshot := tikvBatchGetter{snapshot} + return &BufferBatchGetter{tikvBufferBatchGetter: *transaction.NewBufferBatchGetter(tikvBuffer, tikvSnapshot)} } // BatchGet implements the BatchGetter interface. func (b *BufferBatchGetter) BatchGet(ctx context.Context, keys []kv.Key) (map[string][]byte, error) { - if b.buffer.Len() == 0 { - return b.snapshot.BatchGet(ctx, keys) - } - bufferValues := make([][]byte, len(keys)) - shrinkKeys := make([]kv.Key, 0, len(keys)) - for i, key := range keys { - val, err := b.buffer.Get(ctx, key) - if err == nil { - bufferValues[i] = val - continue - } - if !kv.IsErrNotFound(err) { - return nil, errors.Trace(err) - } - if b.middle != nil { - val, err = b.middle.Get(ctx, key) - if err == nil { - bufferValues[i] = val - continue - } - } - shrinkKeys = append(shrinkKeys, key) - } - storageValues, err := b.snapshot.BatchGet(ctx, shrinkKeys) - if err != nil { - return nil, errors.Trace(err) - } - for i, key := range keys { - if len(bufferValues[i]) == 0 { - continue - } - storageValues[string(key)] = bufferValues[i] - } - return storageValues, nil + tikvKeys := toTiKVKeys(keys) + storageValues, err := b.tikvBufferBatchGetter.BatchGet(ctx, tikvKeys) + + return storageValues, err } diff --git a/store/driver/txn/batch_getter_test.go b/store/driver/txn/batch_getter_test.go index d9e7b66d3c65a..2da439a49ed5c 100644 --- a/store/driver/txn/batch_getter_test.go +++ b/store/driver/txn/batch_getter_test.go @@ -22,8 +22,6 @@ import ( ) func TestBufferBatchGetter(t *testing.T) { - t.Parallel() - snap := newMockStore() ka := []byte("a") kb := []byte("b") diff --git a/store/driver/txn/driver_test.go b/store/driver/txn/driver_test.go index c60558ce11778..2a820e07bc03a 100644 --- a/store/driver/txn/driver_test.go +++ b/store/driver/txn/driver_test.go @@ -22,7 +22,6 @@ import ( ) func TestLockNotFoundPrint(t *testing.T) { - t.Parallel() msg := "Txn(Mvcc(TxnLockNotFound { start_ts: 408090278408224772, commit_ts: 408090279311835140, " + "key: [116, 128, 0, 0, 0, 0, 0, 50, 137, 95, 105, 128, 0, 0, 0, 0,0 ,0, 1, 1, 67, 49, 57, 48, 57, 50, 57, 48, 255, 48, 48, 48, 48, 48, 52, 56, 54, 255, 50, 53, 53, 50, 51, 0, 0, 0, 252] }))" key := prettyLockNotFoundKey(msg) @@ -31,7 +30,6 @@ func TestLockNotFoundPrint(t *testing.T) { } func TestWriteConflictPrettyFormat(t *testing.T) { - t.Parallel() conflict := &kvrpcpb.WriteConflict{ StartTs: 399402937522847774, ConflictTs: 399402937719455772, diff --git a/store/driver/txn/snapshot.go b/store/driver/txn/snapshot.go index 98179d4d62d02..3c372bae83725 100644 --- a/store/driver/txn/snapshot.go +++ b/store/driver/txn/snapshot.go @@ -22,6 +22,7 @@ import ( "github.com/pingcap/tidb/kv" derr "github.com/pingcap/tidb/store/driver/error" "github.com/pingcap/tidb/store/driver/options" + "github.com/tikv/client-go/v2/tikvrpc" "github.com/tikv/client-go/v2/txnkv/txnsnapshot" "github.com/tikv/client-go/v2/txnkv/txnutil" ) @@ -113,6 +114,8 @@ func (s *tikvSnapshot) SetOption(opt int, val interface{}) { s.KVSnapshot.SetMatchStoreLabels(val.([]*metapb.StoreLabel)) case kv.ResourceGroupTag: s.KVSnapshot.SetResourceGroupTag(val.([]byte)) + case kv.ResourceGroupTagger: + s.KVSnapshot.SetResourceGroupTagger(val.(tikvrpc.ResourceGroupTagger)) case kv.ReadReplicaScope: s.KVSnapshot.SetReadReplicaScope(val.(string)) case kv.SnapInterceptor: diff --git a/store/driver/txn/txn_driver.go b/store/driver/txn/txn_driver.go index 0c08e9b3f65db..717bf3b154761 100644 --- a/store/driver/txn/txn_driver.go +++ b/store/driver/txn/txn_driver.go @@ -31,6 +31,7 @@ import ( tikverr "github.com/tikv/client-go/v2/error" tikvstore "github.com/tikv/client-go/v2/kv" "github.com/tikv/client-go/v2/tikv" + "github.com/tikv/client-go/v2/tikvrpc" "github.com/tikv/client-go/v2/txnkv/txnsnapshot" ) @@ -223,10 +224,14 @@ func (txn *tikvTxn) SetOption(opt int, val interface{}) { txn.KVTxn.GetSnapshot().SetMatchStoreLabels(val.([]*metapb.StoreLabel)) case kv.ResourceGroupTag: txn.KVTxn.SetResourceGroupTag(val.([]byte)) + case kv.ResourceGroupTagger: + txn.KVTxn.SetResourceGroupTagger(val.(tikvrpc.ResourceGroupTagger)) case kv.KVFilter: txn.KVTxn.SetKVFilter(val.(tikv.KVFilter)) case kv.SnapInterceptor: txn.snapshotInterceptor = val.(kv.SnapshotInterceptor) + case kv.CommitTSUpperBoundCheck: + txn.KVTxn.SetCommitTSUpperBoundCheck(val.(func(commitTS uint64) bool)) } } diff --git a/store/driver/txn/union_iter_test.go b/store/driver/txn/union_iter_test.go index ee0df5f596edd..abbe6031e6bdb 100644 --- a/store/driver/txn/union_iter_test.go +++ b/store/driver/txn/union_iter_test.go @@ -34,7 +34,6 @@ func r(key, value string) *kv.Entry { } func TestUnionIter(t *testing.T) { - t.Parallel() // test iter normal cases, snap iter become invalid before dirty iter snapRecords := []*kv.Entry{ r("k00", "v0"), @@ -115,7 +114,6 @@ func TestUnionIter(t *testing.T) { } func TestUnionIterErrors(t *testing.T) { - t.Parallel() cases := []struct { dirty []*kv.Entry snap []*kv.Entry diff --git a/store/gcworker/gc_worker.go b/store/gcworker/gc_worker.go index e8f1310523af1..854408f082528 100644 --- a/store/gcworker/gc_worker.go +++ b/store/gcworker/gc_worker.go @@ -18,6 +18,7 @@ import ( "bytes" "container/heap" "context" + "encoding/hex" "encoding/json" "fmt" "math" @@ -45,7 +46,9 @@ import ( "github.com/pingcap/tidb/privilege" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/util/admin" + "github.com/pingcap/tidb/util/codec" "github.com/pingcap/tidb/util/logutil" tikverr "github.com/tikv/client-go/v2/error" tikvstore "github.com/tikv/client-go/v2/kv" @@ -703,6 +706,9 @@ func (w *GCWorker) deleteRanges(ctx context.Context, safePoint uint64, concurren startKey, endKey := r.Range() err = w.doUnsafeDestroyRangeRequest(ctx, startKey, endKey, concurrency) + failpoint.Inject("ignoreDeleteRangeFailed", func() { + err = nil + }) if err != nil { logutil.Logger(ctx).Error("[gc worker] delete range failed on range", zap.String("uuid", w.uuid), @@ -1115,9 +1121,9 @@ retryScanAndResolve: return stat, errors.Errorf("unexpected scanlock error: %s", locksResp) } locksInfo := locksResp.GetLocks() - locks := make([]*txnlock.Lock, len(locksInfo)) - for i := range locksInfo { - locks[i] = txnlock.NewLock(locksInfo[i]) + locks := make([]*txnlock.Lock, 0, len(locksInfo)) + for _, li := range locksInfo { + locks = append(locks, txnlock.NewLock(li)) } if w.testingKnobs.scanLocks != nil { locks = append(locks, w.testingKnobs.scanLocks(key, loc.Region.GetID())...) @@ -1820,7 +1826,7 @@ func (w *GCWorker) loadValueFromSysTable(key string) (string, error) { if err != nil { return "", errors.Trace(err) } - req := rs.NewChunk() + req := rs.NewChunk(nil) err = rs.Next(ctx, req) if err != nil { return "", errors.Trace(err) @@ -1885,23 +1891,30 @@ func (w *GCWorker) doGCPlacementRules(dr util.DelRangeTask) (err error) { } } - // Get the partition ID from the job and DelRangeTask. + // Notify PD to drop the placement rules of partition-ids and table-id, even if there may be no placement rules. + var physicalTableIDs []int64 switch historyJob.Type { case model.ActionDropTable, model.ActionTruncateTable: - var physicalTableIDs []int64 var startKey kv.Key if err = historyJob.DecodeArgs(&startKey, &physicalTableIDs); err != nil { return } - // Notify PD to drop the placement rules of partition-ids and table-id, even if there may be no placement rules. physicalTableIDs = append(physicalTableIDs, historyJob.TableID) - bundles := make([]*placement.Bundle, 0, len(physicalTableIDs)) - for _, id := range physicalTableIDs { - bundles = append(bundles, placement.NewBundle(id)) + case model.ActionDropSchema, model.ActionDropTablePartition, model.ActionTruncateTablePartition: + if err = historyJob.DecodeArgs(&physicalTableIDs); err != nil { + return } - err = infosync.PutRuleBundles(context.TODO(), bundles) } - return + + if len(physicalTableIDs) == 0 { + return + } + + bundles := make([]*placement.Bundle, 0, len(physicalTableIDs)) + for _, id := range physicalTableIDs { + bundles = append(bundles, placement.NewBundle(id)) + } + return infosync.PutRuleBundlesWithDefaultRetry(context.TODO(), bundles) } func (w *GCWorker) doGCLabelRules(dr util.DelRangeTask) (err error) { @@ -1938,17 +1951,51 @@ func (w *GCWorker) doGCLabelRules(dr util.DelRangeTask) (err error) { startKey kv.Key physicalTableIDs []int64 ruleIDs []string + rules map[string]*label.Rule ) if err = historyJob.DecodeArgs(&startKey, &physicalTableIDs, &ruleIDs); err != nil { return } + // TODO: Here we need to get rules from PD and filter the rules which is not elegant. We should find a better way. + rules, err = infosync.GetLabelRules(context.TODO(), ruleIDs) + if err != nil { + return + } + + ruleIDs = getGCRules(append(physicalTableIDs, historyJob.TableID), rules) patch := label.NewRulePatch([]*label.Rule{}, ruleIDs) err = infosync.UpdateLabelRules(context.TODO(), patch) } return } +func getGCRules(ids []int64, rules map[string]*label.Rule) []string { + oldRange := make(map[string]struct{}) + for _, id := range ids { + startKey := hex.EncodeToString(codec.EncodeBytes(nil, tablecodec.GenTableRecordPrefix(id))) + endKey := hex.EncodeToString(codec.EncodeBytes(nil, tablecodec.GenTableRecordPrefix(id+1))) + oldRange[startKey+endKey] = struct{}{} + } + + var gcRules []string + for _, rule := range rules { + find := false + for _, d := range rule.Data { + if r, ok := d.(map[string]interface{}); ok { + nowRange := fmt.Sprintf("%s%s", r["start_key"], r["end_key"]) + if _, ok := oldRange[nowRange]; ok { + find = true + } + } + } + if find { + gcRules = append(gcRules, rule.ID) + } + } + return gcRules +} + // RunGCJob sends GC command to KV. It is exported for kv api, do not use it with GCWorker at the same time. func RunGCJob(ctx context.Context, s tikv.Storage, pd pd.Client, safePoint uint64, identifier string, concurrency int) error { gcWorker := &GCWorker{ @@ -2053,6 +2100,7 @@ func NewMockGCWorker(store kv.Storage) (*MockGCWorker, error) { gcIsRunning: false, lastFinish: time.Now(), done: make(chan error), + pdClient: store.(tikv.Storage).GetRegionCache().PDClient(), } return &MockGCWorker{worker: worker}, nil } diff --git a/store/gcworker/gc_worker_serial_test.go b/store/gcworker/gc_worker_serial_test.go index 65db98dbc88d4..4a50768ff0301 100644 --- a/store/gcworker/gc_worker_serial_test.go +++ b/store/gcworker/gc_worker_serial_test.go @@ -36,6 +36,7 @@ import ( "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/domain/infosync" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/testkit" "github.com/stretchr/testify/require" @@ -1649,14 +1650,36 @@ func TestGCPlacementRules(t *testing.T) { s, clean := createGCWorkerSuite(t) defer clean() - require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/store/gcworker/mockHistoryJobForGC", "return(1)")) + require.NoError(t, failpoint.Enable("github.com/pingcap/tidb/store/gcworker/mockHistoryJobForGC", "return(10)")) defer func() { require.NoError(t, failpoint.Disable("github.com/pingcap/tidb/store/gcworker/mockHistoryJobForGC")) }() - dr := util.DelRangeTask{JobID: 1, ElementID: 1} - err := s.gcWorker.doGCPlacementRules(dr) + bundleID := "TiDB_DDL_10" + bundle, err := placement.NewBundleFromOptions(&model.PlacementSettings{ + PrimaryRegion: "r1", + Regions: "r1, r2", + }) + require.NoError(t, err) + bundle.ID = bundleID + + // prepare bundle before gc + require.NoError(t, infosync.PutRuleBundles(context.Background(), []*placement.Bundle{bundle})) + got, err := infosync.GetRuleBundle(context.Background(), bundleID) + require.NoError(t, err) + require.NotNil(t, got) + require.False(t, got.IsEmpty()) + + // do gc + dr := util.DelRangeTask{JobID: 1, ElementID: 10} + err = s.gcWorker.doGCPlacementRules(dr) + require.NoError(t, err) + + // check bundle deleted after gc + got, err = infosync.GetRuleBundle(context.Background(), bundleID) require.NoError(t, err) + require.NotNil(t, got) + require.True(t, got.IsEmpty()) } func TestGCLabelRules(t *testing.T) { diff --git a/store/helper/helper.go b/store/helper/helper.go index 80f0ed21c7a60..125052d10cd75 100644 --- a/store/helper/helper.go +++ b/store/helper/helper.go @@ -34,6 +34,7 @@ import ( "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/log" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/metrics" "github.com/pingcap/tidb/parser/model" derr "github.com/pingcap/tidb/store/driver/error" "github.com/pingcap/tidb/tablecodec" @@ -51,8 +52,7 @@ import ( // Storage represents a storage that connects TiKV. // Methods copied from kv.Storage and tikv.Storage due to limitation of go1.13. type Storage interface { - Begin() (kv.Transaction, error) - BeginWithOption(option tikv.StartTSOption) (kv.Transaction, error) + Begin(opts ...tikv.TxnOption) (kv.Transaction, error) GetSnapshot(ver kv.Version) kv.Snapshot GetClient() kv.Client GetMPPClient() kv.MPPClient @@ -768,10 +768,12 @@ func (h *Helper) requestPD(method, uri string, body io.Reader, res interface{}) if err != nil { return err } + start := time.Now() resp, err := util.InternalHTTPClient().Do(req) if err != nil { return errors.Trace(err) } + metrics.PDApiExecutionHistogram.WithLabelValues("common").Observe(time.Since(start).Seconds()) defer func() { err = resp.Body.Close() diff --git a/store/helper/helper_test.go b/store/helper/helper_test.go index 7237b0b815db5..3640b4f479cef 100644 --- a/store/helper/helper_test.go +++ b/store/helper/helper_test.go @@ -34,8 +34,6 @@ import ( ) func TestHotRegion(t *testing.T) { - t.Parallel() - store, clean := createMockStore(t) defer clean() @@ -71,8 +69,6 @@ func TestHotRegion(t *testing.T) { } func TestGetRegionsTableInfo(t *testing.T) { - t.Parallel() - store, clean := createMockStore(t) defer clean() @@ -84,8 +80,6 @@ func TestGetRegionsTableInfo(t *testing.T) { } func TestTiKVRegionsInfo(t *testing.T) { - t.Parallel() - store, clean := createMockStore(t) defer clean() @@ -99,8 +93,6 @@ func TestTiKVRegionsInfo(t *testing.T) { } func TestTiKVStoresStat(t *testing.T) { - t.Parallel() - store, clean := createMockStore(t) defer clean() diff --git a/store/mockstore/mockcopr/aggregate.go b/store/mockstore/mockcopr/aggregate.go index 0a0dd6d6cfb56..1e7bcc1a9207a 100644 --- a/store/mockstore/mockcopr/aggregate.go +++ b/store/mockstore/mockcopr/aggregate.go @@ -24,6 +24,7 @@ import ( "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/util/collate" ) type aggCtxsMapper map[string][]*aggregation.AggEvaluateContext @@ -208,6 +209,7 @@ type streamAggExec struct { aggExprs []aggregation.Aggregation aggCtxs []*aggregation.AggEvaluateContext groupByExprs []expression.Expression + groupByCollators []collate.Collator relatedColOffsets []int row []types.Datum tmpGroupByRow []types.Datum @@ -288,7 +290,7 @@ func (e *streamAggExec) meetNewGroup(row [][]byte) (bool, error) { return false, errors.Trace(err) } if matched { - c, err := d.CompareDatum(e.evalCtx.sc, &e.nextGroupByRow[i]) + c, err := d.Compare(e.evalCtx.sc, &e.nextGroupByRow[i], e.groupByCollators[i]) if err != nil { return false, errors.Trace(err) } diff --git a/store/mockstore/mockcopr/analyze.go b/store/mockstore/mockcopr/analyze.go index 7660904242340..38e142d5bad75 100644 --- a/store/mockstore/mockcopr/analyze.go +++ b/store/mockstore/mockcopr/analyze.go @@ -273,7 +273,7 @@ func (e *analyzeColumnsExec) Next(ctx context.Context, req *chunk.Chunk) error { return nil } -func (e *analyzeColumnsExec) NewChunk() *chunk.Chunk { +func (e *analyzeColumnsExec) NewChunk(_ chunk.Allocator) *chunk.Chunk { fields := make([]*types.FieldType, 0, len(e.fields)) for _, field := range e.fields { fields = append(fields, &field.Column.FieldType) diff --git a/store/mockstore/mockcopr/cop_handler_dag.go b/store/mockstore/mockcopr/cop_handler_dag.go index b63a020b78ed8..2fd9d8f73d4b3 100644 --- a/store/mockstore/mockcopr/cop_handler_dag.go +++ b/store/mockstore/mockcopr/cop_handler_dag.go @@ -29,6 +29,7 @@ import ( "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/expression/aggregation" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/parser/charset" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" @@ -395,12 +396,17 @@ func (h coprHandler) buildStreamAgg(ctx *dagContext, executor *tipb.Executor) (* for _, agg := range aggs { aggCtxs = append(aggCtxs, agg.CreateContext(ctx.evalCtx.sc)) } + groupByCollators := make([]collate.Collator, 0, len(groupBys)) + for _, expr := range groupBys { + groupByCollators = append(groupByCollators, collate.GetCollator(expr.GetType().Collate)) + } return &streamAggExec{ evalCtx: ctx.evalCtx, aggExprs: aggs, aggCtxs: aggCtxs, groupByExprs: groupBys, + groupByCollators: groupByCollators, currGroupByValues: make([][]byte, 0), relatedColOffsets: relatedColOffsets, row: make([]types.Datum, len(ctx.evalCtx.columnInfos)), @@ -921,12 +927,14 @@ func extractOffsetsInExpr(expr *tipb.Expr, columns []*tipb.ColumnInfo, collector // fieldTypeFromPBColumn creates a types.FieldType from tipb.ColumnInfo. func fieldTypeFromPBColumn(col *tipb.ColumnInfo) *types.FieldType { + charsetStr, collationStr, _ := charset.GetCharsetInfoByID(int(collate.RestoreCollationIDIfNeeded(col.GetCollation()))) return &types.FieldType{ Tp: byte(col.GetTp()), Flag: uint(col.Flag), Flen: int(col.GetColumnLen()), Decimal: int(col.GetDecimal()), Elems: col.Elems, - Collate: collate.CollationID2Name(collate.RestoreCollationIDIfNeeded(col.GetCollation())), + Charset: charsetStr, + Collate: collationStr, } } diff --git a/store/mockstore/mockcopr/cop_handler_dag_test.go b/store/mockstore/mockcopr/cop_handler_dag_test.go index 1ce9922091966..5b11a668b854c 100644 --- a/store/mockstore/mockcopr/cop_handler_dag_test.go +++ b/store/mockstore/mockcopr/cop_handler_dag_test.go @@ -22,8 +22,6 @@ import ( ) func TestConstructTimezone(t *testing.T) { - t.Parallel() - secondsEastOfUTC := int((8 * time.Hour).Seconds()) loc, err := constructTimeZone("", secondsEastOfUTC) require.NoError(t, err) diff --git a/store/mockstore/mockcopr/executor_test.go b/store/mockstore/mockcopr/executor_test.go index 2fe82a996357b..af75c322e6fd6 100644 --- a/store/mockstore/mockcopr/executor_test.go +++ b/store/mockstore/mockcopr/executor_test.go @@ -37,8 +37,6 @@ import ( // This test checks the resolve lock functionality. When a txn meets the lock of a large transaction, // it should not block by the lock. func TestResolvedLargeTxnLocks(t *testing.T) { - t.Parallel() - rpcClient, cluster, pdClient, err := testutils.NewMockTiKV("", mockcopr.NewCoprRPCHandler()) require.NoError(t, err) @@ -105,8 +103,6 @@ func TestResolvedLargeTxnLocks(t *testing.T) { } func TestIssue15662(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() tk := testkit.NewTestKit(t, store) diff --git a/store/mockstore/mockcopr/topn.go b/store/mockstore/mockcopr/topn.go index 68b0c498170e8..bf6833df4f48f 100644 --- a/store/mockstore/mockcopr/topn.go +++ b/store/mockstore/mockcopr/topn.go @@ -20,6 +20,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tipb/go-tipb" ) @@ -49,7 +50,7 @@ func (t *topNSorter) Less(i, j int) bool { v1 := t.rows[i].key[index] v2 := t.rows[j].key[index] - ret, err := v1.CompareDatum(t.sc, &v2) + ret, err := v1.Compare(t.sc, &v2, collate.GetCollator(collate.ProtoToCollation(by.Expr.FieldType.Collate))) if err != nil { t.err = errors.Trace(err) return true @@ -98,7 +99,7 @@ func (t *topNHeap) Less(i, j int) bool { v1 := t.rows[i].key[index] v2 := t.rows[j].key[index] - ret, err := v1.CompareDatum(t.sc, &v2) + ret, err := v1.Compare(t.sc, &v2, collate.GetCollator(collate.ProtoToCollation(by.Expr.FieldType.Collate))) if err != nil { t.err = errors.Trace(err) return true diff --git a/store/mockstore/mockstorage/storage.go b/store/mockstore/mockstorage/storage.go index 83a40661e24d3..a85b46166631f 100644 --- a/store/mockstore/mockstorage/storage.go +++ b/store/mockstore/mockstorage/storage.go @@ -74,8 +74,8 @@ func (s *mockStorage) Describe() string { } // Begin a global transaction. -func (s *mockStorage) Begin() (kv.Transaction, error) { - txn, err := s.KVStore.Begin() +func (s *mockStorage) Begin(opts ...tikv.TxnOption) (kv.Transaction, error) { + txn, err := s.KVStore.Begin(opts...) return newTiKVTxn(txn, err) } @@ -84,11 +84,6 @@ func (s *mockStorage) ShowStatus(ctx context.Context, key string) (interface{}, return nil, kv.ErrNotImplemented } -// BeginWithOption begins a transaction with given option -func (s *mockStorage) BeginWithOption(option tikv.StartTSOption) (kv.Transaction, error) { - return newTiKVTxn(s.KVStore.BeginWithOption(option)) -} - // GetSnapshot gets a snapshot that is able to read any data which data is <= ver. // if ver is MaxVersion or > current max committed version, we will use current version for this snapshot. func (s *mockStorage) GetSnapshot(ver kv.Version) kv.Snapshot { diff --git a/store/mockstore/unistore/cophandler/analyze.go b/store/mockstore/unistore/cophandler/analyze.go index 176d7da7c9b53..6549ca605018f 100644 --- a/store/mockstore/unistore/cophandler/analyze.go +++ b/store/mockstore/unistore/cophandler/analyze.go @@ -423,7 +423,7 @@ func handleAnalyzeFullSamplingReq( } colReq := analyzeReq.ColReq /* #nosec G404 */ - builder := &statistics.ReservoirRowSampleBuilder{ + builder := &statistics.RowSampleBuilder{ Sc: sc, RecordSet: e, ColsFieldType: fts, @@ -431,6 +431,7 @@ func handleAnalyzeFullSamplingReq( ColGroups: colGroups, MaxSampleSize: int(colReq.SampleSize), MaxFMSketchSize: int(colReq.SketchSize), + SampleRate: colReq.GetSampleRate(), Rng: rand.New(rand.NewSource(time.Now().UnixNano())), } collector, err := builder.Collect() @@ -438,7 +439,7 @@ func handleAnalyzeFullSamplingReq( return nil, err } colResp := &tipb.AnalyzeColumnsResp{} - colResp.RowCollector = collector.ToProto() + colResp.RowCollector = collector.Base().ToProto() data, err := colResp.Marshal() if err != nil { return nil, err @@ -501,7 +502,7 @@ func (e *analyzeColumnsExec) Process(key, value []byte) error { return nil } -func (e *analyzeColumnsExec) NewChunk() *chunk.Chunk { +func (e *analyzeColumnsExec) NewChunk(_ chunk.Allocator) *chunk.Chunk { fields := make([]*types.FieldType, 0, len(e.fields)) for _, field := range e.fields { fields = append(fields, &field.Column.FieldType) diff --git a/store/mockstore/unistore/cophandler/cop_handler.go b/store/mockstore/unistore/cophandler/cop_handler.go index 504741ece2125..fa7b784126e3e 100644 --- a/store/mockstore/unistore/cophandler/cop_handler.go +++ b/store/mockstore/unistore/cophandler/cop_handler.go @@ -28,6 +28,7 @@ import ( "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/expression/aggregation" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/parser/charset" "github.com/pingcap/tidb/parser/model" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" @@ -445,13 +446,15 @@ func appendRow(chunks []tipb.Chunk, data []byte, rowCnt int) []tipb.Chunk { // fieldTypeFromPBColumn creates a types.FieldType from tipb.ColumnInfo. func fieldTypeFromPBColumn(col *tipb.ColumnInfo) *types.FieldType { + charsetStr, collationStr, _ := charset.GetCharsetInfoByID(int(collate.RestoreCollationIDIfNeeded(col.GetCollation()))) return &types.FieldType{ Tp: byte(col.GetTp()), Flag: uint(col.Flag), Flen: int(col.GetColumnLen()), Decimal: int(col.GetDecimal()), Elems: col.Elems, - Collate: collate.CollationID2Name(collate.RestoreCollationIDIfNeeded(col.GetCollation())), + Charset: charsetStr, + Collate: collationStr, } } diff --git a/store/mockstore/unistore/cophandler/cop_handler_test.go b/store/mockstore/unistore/cophandler/cop_handler_test.go index 3bd39184865cc..fd4e244344f6f 100644 --- a/store/mockstore/unistore/cophandler/cop_handler_test.go +++ b/store/mockstore/unistore/cophandler/cop_handler_test.go @@ -36,6 +36,7 @@ import ( "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/rowcodec" "github.com/pingcap/tipb/go-tipb" "github.com/stretchr/testify/require" @@ -278,8 +279,6 @@ func (dagBuilder *dagBuilder) build() *tipb.DAGRequest { // see tikv/src/coprocessor/util.rs for more detail func TestIsPrefixNext(t *testing.T) { - t.Parallel() - require.True(t, isPrefixNext([]byte{}, []byte{0})) require.True(t, isPrefixNext([]byte{0}, []byte{1})) require.True(t, isPrefixNext([]byte{1}, []byte{2})) @@ -294,8 +293,6 @@ func TestIsPrefixNext(t *testing.T) { } func TestPointGet(t *testing.T) { - t.Parallel() - // here would build mvccStore and server, and prepare // three rows data, just like the test data of table_scan.rs. // then init the store with the generated data. @@ -339,17 +336,15 @@ func TestPointGet(t *testing.T) { // verify the returned rows value as input expectedRow := data.rows[handle] - eq, err := returnedRow[0].CompareDatum(nil, &expectedRow[0]) + eq, err := returnedRow[0].Compare(nil, &expectedRow[0], collate.GetBinaryCollator()) require.NoError(t, err) require.Equal(t, 0, eq) - eq, err = returnedRow[1].CompareDatum(nil, &expectedRow[1]) + eq, err = returnedRow[1].Compare(nil, &expectedRow[1], collate.GetBinaryCollator()) require.NoError(t, err) require.Equal(t, 0, eq) } func TestClosureExecutor(t *testing.T) { - t.Parallel() - data := prepareTestTableData(t, keyNumber, tableID) store, clean := newTestStore(t, "cop_handler_test_db", "cop_handler_test_log") defer clean() diff --git a/store/mockstore/unistore/cophandler/mpp_exec.go b/store/mockstore/unistore/cophandler/mpp_exec.go index 141e986b068d8..9e2e071513e04 100644 --- a/store/mockstore/unistore/cophandler/mpp_exec.go +++ b/store/mockstore/unistore/cophandler/mpp_exec.go @@ -180,8 +180,8 @@ func (e *exchSenderExec) next() (*chunk.Chunk, error) { } return nil, nil } - for _, tipbChunk := range tipbChunks { - tunnel.DataCh <- &tipbChunk + for j := range tipbChunks { + tunnel.DataCh <- &tipbChunks[j] } } } @@ -194,8 +194,8 @@ func (e *exchSenderExec) next() (*chunk.Chunk, error) { } return nil, nil } - for _, tipbChunk := range tipbChunks { - tunnel.DataCh <- &tipbChunk + for i := range tipbChunks { + tunnel.DataCh <- &tipbChunks[i] } } } diff --git a/store/mockstore/unistore/cophandler/topn.go b/store/mockstore/unistore/cophandler/topn.go index f459ce16f2513..185317cbec1ee 100644 --- a/store/mockstore/unistore/cophandler/topn.go +++ b/store/mockstore/unistore/cophandler/topn.go @@ -22,6 +22,7 @@ import ( "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/collate" tipb "github.com/pingcap/tipb/go-tipb" ) @@ -51,7 +52,7 @@ func (t *topNSorter) Less(i, j int) bool { v1 := t.rows[i].key[index] v2 := t.rows[j].key[index] - ret, err := v1.CompareDatum(t.sc, &v2) + ret, err := v1.Compare(t.sc, &v2, collate.GetCollator(collate.ProtoToCollation(by.Expr.FieldType.Collate))) if err != nil { t.err = errors.Trace(err) return true @@ -105,7 +106,7 @@ func (t *topNHeap) Less(i, j int) bool { if expression.FieldTypeFromPB(by.GetExpr().GetFieldType()).Tp == mysql.TypeEnum { ret = types.CompareUint64(v1.GetUint64(), v2.GetUint64()) } else { - ret, err = v1.CompareDatum(t.sc, &v2) + ret, err = v1.Compare(t.sc, &v2, collate.GetCollator(collate.ProtoToCollation(by.Expr.FieldType.Collate))) if err != nil { t.err = errors.Trace(err) return true diff --git a/store/mockstore/unistore/lockstore/lockstore_test.go b/store/mockstore/unistore/lockstore/lockstore_test.go index 8161f7eef1c1f..44a271f070653 100644 --- a/store/mockstore/unistore/lockstore/lockstore_test.go +++ b/store/mockstore/unistore/lockstore/lockstore_test.go @@ -26,8 +26,6 @@ import ( ) func TestMemStore(t *testing.T) { - t.Parallel() - prefix := "ls" n := 30000 ls := NewMemStore(1 << 10) @@ -80,8 +78,6 @@ func deleteMemStore(t *testing.T, ls *MemStore, prefix string, n int) { } func TestIterator(t *testing.T) { - t.Parallel() - _ = checkKey t.Skip("Skip this unstable test(#26235) and bring it back before 2021-07-29.") ls := NewMemStore(1 << 10) @@ -133,8 +129,6 @@ func numToKey(n int) []byte { } func TestReplace(t *testing.T) { - t.Parallel() - prefix := "ls" n := 30000 ls := NewMemStore(1 << 10) diff --git a/store/mockstore/unistore/pd.go b/store/mockstore/unistore/pd.go index cb56bcbfc778f..3ed8f53d3d9d2 100644 --- a/store/mockstore/unistore/pd.go +++ b/store/mockstore/unistore/pd.go @@ -117,3 +117,7 @@ func (c *pdClient) SplitRegions(ctx context.Context, splitKeys [][]byte, opts .. func (c *pdClient) GetRegionFromMember(ctx context.Context, key []byte, memberURLs []string) (*pd.Region, error) { return nil, nil } + +func (c *pdClient) UpdateOption(option pd.DynamicOption, value interface{}) error { + return nil +} diff --git a/store/mockstore/unistore/raw_handler_test.go b/store/mockstore/unistore/raw_handler_test.go index 0f56a8d499bff..a235331500240 100644 --- a/store/mockstore/unistore/raw_handler_test.go +++ b/store/mockstore/unistore/raw_handler_test.go @@ -25,8 +25,6 @@ import ( ) func TestRawHandler(t *testing.T) { - t.Parallel() - h := newRawHandler() ctx := context.Background() keys := make([][]byte, 10) diff --git a/store/mockstore/unistore/tikv/detector_test.go b/store/mockstore/unistore/tikv/detector_test.go index 0ccbf3ec450bf..e44b5ca1fc0f1 100644 --- a/store/mockstore/unistore/tikv/detector_test.go +++ b/store/mockstore/unistore/tikv/detector_test.go @@ -36,8 +36,6 @@ import ( ) func TestDeadlock(t *testing.T) { - t.Parallel() - makeDiagCtx := func(key string, resourceGroupTag string) diagnosticContext { return diagnosticContext{ key: []byte(key), diff --git a/store/mockstore/unistore/tikv/mvcc.go b/store/mockstore/unistore/tikv/mvcc.go index 47a59a3cb1f75..bba8d53409352 100644 --- a/store/mockstore/unistore/tikv/mvcc.go +++ b/store/mockstore/unistore/tikv/mvcc.go @@ -240,7 +240,7 @@ func (store *MVCCStore) PessimisticLock(reqCtx *requestCtx, req *kvrpcpb.Pessimi for _, m := range mutations { lock, err := store.checkConflictInLockStore(reqCtx, m, startTS) if err != nil { - var resourceGroupTag []byte = nil + var resourceGroupTag []byte if req.Context != nil { resourceGroupTag = req.Context.ResourceGroupTag } @@ -1098,34 +1098,56 @@ func (store *MVCCStore) checkCommitted(reader *dbreader.DBReader, key []byte, st return 0, nil } -func checkLock(lock mvcc.Lock, key []byte, startTS uint64, resolved []uint64) error { - if isResolved(lock.StartTS, resolved) { - return nil +// LockPair contains a pair of key and lock. It's used for reading through locks. +type LockPair struct { + key []byte + lock *mvcc.Lock +} + +func getValueFromLock(lock *mvcc.Lock) []byte { + if lock.Op == byte(kvrpcpb.Op_Put) { + // lock owns the value so needn't to safeCopy it. + return lock.Value + } + return nil +} + +// *LockPair is not nil if the lock in the committed timestamp set. Read operations can get value from it without deep copy. +func checkLock(lock mvcc.Lock, key []byte, startTS uint64, resolved []uint64, committed []uint64) (*LockPair, error) { + if inTSSet(lock.StartTS, resolved) { + return nil, nil } lockVisible := lock.StartTS <= startTS isWriteLock := lock.Op == uint8(kvrpcpb.Op_Put) || lock.Op == uint8(kvrpcpb.Op_Del) isPrimaryGet := startTS == maxSystemTS && bytes.Equal(lock.Primary, key) && !lock.UseAsyncCommit if lockVisible && isWriteLock && !isPrimaryGet { - return BuildLockErr(safeCopy(key), &lock) + if inTSSet(lock.StartTS, committed) { + return &LockPair{safeCopy(key), &lock}, nil + } + return nil, BuildLockErr(safeCopy(key), &lock) } - return nil + return nil, nil } // CheckKeysLock implements the MVCCStore interface. -func (store *MVCCStore) CheckKeysLock(startTS uint64, resolved []uint64, keys ...[]byte) error { +func (store *MVCCStore) CheckKeysLock(startTS uint64, resolved, committed []uint64, keys ...[]byte) ([]*LockPair, error) { var buf []byte + var lockPairs []*LockPair for _, key := range keys { buf = store.lockStore.Get(key, buf) if len(buf) == 0 { continue } lock := mvcc.DecodeLock(buf) - err := checkLock(lock, key, startTS, resolved) + lockPair, err := checkLock(lock, key, startTS, resolved, committed) + if lockPair != nil { + lockPairs = append(lockPairs, lockPair) + } if err != nil { - return err + return nil, err } } - return nil + return lockPairs, nil } // CheckRangeLock implements the MVCCStore interface. @@ -1136,7 +1158,7 @@ func (store *MVCCStore) CheckRangeLock(startTS uint64, startKey, endKey []byte, break } lock := mvcc.DecodeLock(it.Value()) - err := checkLock(lock, it.Key(), startTS, resolved) + _, err := checkLock(lock, it.Key(), startTS, resolved, nil) if err != nil { return err } @@ -1386,14 +1408,32 @@ func (store *MVCCStore) DeleteFileInRange(start, end []byte) { store.db.DeleteFilesInRange(start, end) } +// Get implements the MVCCStore interface. +func (store *MVCCStore) Get(reqCtx *requestCtx, key []byte, version uint64) ([]byte, error) { + lockPairs, err := store.CheckKeysLock(version, reqCtx.rpcCtx.ResolvedLocks, reqCtx.rpcCtx.CommittedLocks, key) + if err != nil { + return nil, err + } + if len(lockPairs) != 0 { + return getValueFromLock(lockPairs[0].lock), nil + } + val, err := reqCtx.getDBReader().Get(key, version) + return safeCopy(val), err +} + // BatchGet implements the MVCCStore interface. func (store *MVCCStore) BatchGet(reqCtx *requestCtx, keys [][]byte, version uint64) []*kvrpcpb.KvPair { pairs := make([]*kvrpcpb.KvPair, 0, len(keys)) remain := make([][]byte, 0, len(keys)) for _, key := range keys { - err := store.CheckKeysLock(version, reqCtx.rpcCtx.ResolvedLocks, key) + lockPairs, err := store.CheckKeysLock(version, reqCtx.rpcCtx.ResolvedLocks, reqCtx.rpcCtx.CommittedLocks, key) if err != nil { pairs = append(pairs, &kvrpcpb.KvPair{Key: key, Error: convertToKeyError(err)}) + } else if len(lockPairs) != 0 { + value := getValueFromLock(lockPairs[0].lock) + if value != nil { + pairs = append(pairs, &kvrpcpb.KvPair{Key: key, Value: value}) + } } else { remain = append(remain, key) } @@ -1411,7 +1451,7 @@ func (store *MVCCStore) BatchGet(reqCtx *requestCtx, keys [][]byte, version uint return pairs } -func (store *MVCCStore) collectRangeLock(startTS uint64, startKey, endKey []byte, resolved []uint64) []*kvrpcpb.KvPair { +func (store *MVCCStore) collectRangeLock(startTS uint64, startKey, endKey []byte, resolved, committed []uint64) []*kvrpcpb.KvPair { var pairs []*kvrpcpb.KvPair it := store.lockStore.NewIterator() for it.Seek(startKey); it.Valid(); it.Next() { @@ -1419,8 +1459,14 @@ func (store *MVCCStore) collectRangeLock(startTS uint64, startKey, endKey []byte break } lock := mvcc.DecodeLock(it.Value()) - err := checkLock(lock, it.Key(), startTS, resolved) - if err != nil { + lockPair, err := checkLock(lock, it.Key(), startTS, resolved, committed) + if lockPair != nil { + pairs = append(pairs, &kvrpcpb.KvPair{ + Key: lockPair.key, + // deleted key's value is nil + Value: getValueFromLock(lockPair.lock), + }) + } else if err != nil { pairs = append(pairs, &kvrpcpb.KvPair{ Error: convertToKeyError(err), Key: safeCopy(it.Key()), @@ -1430,8 +1476,8 @@ func (store *MVCCStore) collectRangeLock(startTS uint64, startKey, endKey []byte return pairs } -func isResolved(startTS uint64, resolved []uint64) bool { - for _, v := range resolved { +func inTSSet(startTS uint64, tsSet []uint64) bool { + for _, v := range tsSet { if startTS == v { return true } @@ -1486,7 +1532,7 @@ func (store *MVCCStore) Scan(reqCtx *requestCtx, req *kvrpcpb.ScanRequest) []*kv var lockPairs []*kvrpcpb.KvPair limit := req.GetLimit() if req.SampleStep == 0 { - lockPairs = store.collectRangeLock(req.GetVersion(), startKey, endKey, req.Context.ResolvedLocks) + lockPairs = store.collectRangeLock(req.GetVersion(), startKey, endKey, reqCtx.rpcCtx.ResolvedLocks, reqCtx.rpcCtx.CommittedLocks) } else { limit = req.SampleStep * limit } @@ -1506,31 +1552,26 @@ func (store *MVCCStore) Scan(reqCtx *requestCtx, req *kvrpcpb.ScanRequest) []*kv }) return scanProc.pairs } - pairs := append(scanProc.pairs, lockPairs...) - sort.Slice(pairs, func(i, j int) bool { + pairs := append(lockPairs, scanProc.pairs...) + sort.SliceStable(pairs, func(i, j int) bool { cmp := bytes.Compare(pairs[i].Key, pairs[j].Key) if req.Reverse { cmp = -cmp } - if cmp < 0 { - return true - } else if cmp > 0 { - return false - } - return pairs[i].Error != nil + return cmp < 0 }) validPairs := pairs[:0] - var prevErr *kvrpcpb.KvPair + var prev *kvrpcpb.KvPair for _, pair := range pairs { - if prevErr != nil && bytes.Equal(prevErr.Key, pair.Key) { + if prev != nil && bytes.Equal(prev.Key, pair.Key) { continue } - if pair.Error != nil { - prevErr = pair - } - validPairs = append(validPairs, pair) - if len(validPairs) >= int(limit) { - break + prev = pair + if pair.Error != nil || len(pair.Value) != 0 { + validPairs = append(validPairs, pair) + if len(validPairs) >= int(limit) { + break + } } } return validPairs diff --git a/store/mockstore/unistore/tikv/mvcc/tikv.go b/store/mockstore/unistore/tikv/mvcc/tikv.go index ef12e2f9eadb1..7b8a52dfd9159 100644 --- a/store/mockstore/unistore/tikv/mvcc/tikv.go +++ b/store/mockstore/unistore/tikv/mvcc/tikv.go @@ -70,8 +70,8 @@ const ( // EncodeWriteCFValue accepts a write cf parameters and return the encoded bytes data. // Just like the tikv encoding form. See tikv/src/storage/mvcc/write.rs for more detail. func EncodeWriteCFValue(t WriteType, startTs uint64, shortVal []byte) []byte { - data := make([]byte, 1) - data[0] = t + data := make([]byte, 0) + data = append(data, t) data = codec.EncodeUvarint(data, startTs) if len(shortVal) != 0 { data = append(data, byte(shortValuePrefix), byte(len(shortVal))) @@ -82,16 +82,16 @@ func EncodeWriteCFValue(t WriteType, startTs uint64, shortVal []byte) []byte { // EncodeLockCFValue encodes the mvcc lock and returns putLock value and putDefault value if exists. func EncodeLockCFValue(lock *Lock) ([]byte, []byte) { - data := make([]byte, 1) + data := make([]byte, 0) switch lock.Op { case byte(kvrpcpb.Op_Put): - data[0] = LockTypePut + data = append(data, LockTypePut) case byte(kvrpcpb.Op_Del): - data[0] = LockTypeDelete + data = append(data, LockTypeDelete) case byte(kvrpcpb.Op_Lock): - data[0] = LockTypeLock + data = append(data, LockTypeLock) case byte(kvrpcpb.Op_PessimisticLock): - data[0] = LockTypePessimistic + data = append(data, LockTypePessimistic) default: panic("invalid lock op") } diff --git a/store/mockstore/unistore/tikv/mvcc_test.go b/store/mockstore/unistore/tikv/mvcc_test.go index 1f2f4fe15d8de..b08162437ab6c 100644 --- a/store/mockstore/unistore/tikv/mvcc_test.go +++ b/store/mockstore/unistore/tikv/mvcc_test.go @@ -153,8 +153,12 @@ func PessimisticLock(pk []byte, key []byte, startTs uint64, lockTTL uint64, forU // PrewriteOptimistic raises optimistic prewrite requests on store func PrewriteOptimistic(pk []byte, key []byte, value []byte, startTs uint64, lockTTL uint64, minCommitTs uint64, useAsyncCommit bool, secondaries [][]byte, store *TestStore) error { + op := kvrpcpb.Op_Put + if value == nil { + op = kvrpcpb.Op_Del + } prewriteReq := &kvrpcpb.PrewriteRequest{ - Mutations: []*kvrpcpb.Mutation{newMutation(kvrpcpb.Op_Put, key, value)}, + Mutations: []*kvrpcpb.Mutation{newMutation(op, key, value)}, PrimaryLock: pk, StartVersion: startTs, LockTtl: lockTTL, @@ -416,21 +420,19 @@ func MustGetVal(key, val []byte, startTs uint64, store *TestStore) { } func MustGetErr(key []byte, startTs uint64, store *TestStore) { - _, err := kvGet(key, startTs, store) + _, err := kvGet(key, startTs, nil, nil, store) require.Error(store.t, err) } -func kvGet(key []byte, readTs uint64, store *TestStore) ([]byte, error) { - err := store.MvccStore.CheckKeysLock(readTs, nil, key) - if err != nil { - return nil, err - } - getVal, err := store.newReqCtx().getDBReader().Get(key, readTs) - return getVal, err +func kvGet(key []byte, readTs uint64, resolved, committed []uint64, store *TestStore) ([]byte, error) { + reqCtx := store.newReqCtx() + reqCtx.rpcCtx.ResolvedLocks = resolved + reqCtx.rpcCtx.CommittedLocks = committed + return store.MvccStore.Get(reqCtx, key, readTs) } func MustGet(key []byte, readTs uint64, store *TestStore) (val []byte) { - val, err := kvGet(key, readTs, store) + val, err := kvGet(key, readTs, nil, nil, store) require.NoError(store.t, err) return val } @@ -481,7 +483,6 @@ func MustGetRollback(key []byte, ts uint64, store *TestStore) { } func TestBasicOptimistic(t *testing.T) { - t.Parallel() store, close := NewTestStore("basic_optimistic_db", "basic_optimistic_log", t) defer close() @@ -496,7 +497,6 @@ func TestBasicOptimistic(t *testing.T) { } func TestPessimiticTxnTTL(t *testing.T) { - t.Parallel() var err error store, close := NewTestStore("basic_optimistic_db", "basic_optimistic_log", t) defer close() @@ -526,7 +526,6 @@ func TestPessimiticTxnTTL(t *testing.T) { } func TestRollback(t *testing.T) { - t.Parallel() store, close := NewTestStore("basic_optimistic_db", "basic_optimistic_log", t) defer close() @@ -561,7 +560,6 @@ func TestRollback(t *testing.T) { } func TestOverwritePessimisitcLock(t *testing.T) { - t.Parallel() var err error store, close := NewTestStore("basic_optimistic_db", "basic_optimistic_log", t) defer close() @@ -590,7 +588,6 @@ func TestOverwritePessimisitcLock(t *testing.T) { } func TestCheckTxnStatus(t *testing.T) { - t.Parallel() var err error store, close := NewTestStore("basic_optimistic_db", "basic_optimistic_log", t) defer close() @@ -693,7 +690,6 @@ func TestCheckTxnStatus(t *testing.T) { } func TestCheckSecondaryLocksStatus(t *testing.T) { - t.Parallel() store, close := NewTestStore("basic_optimistic_db", "basic_optimistic_log", t) defer close() @@ -760,7 +756,6 @@ func TestCheckSecondaryLocksStatus(t *testing.T) { } func TestMvccGet(t *testing.T) { - t.Parallel() var err error store, close := NewTestStore("basic_optimistic_db", "basic_optimistic_log", t) defer close() @@ -875,7 +870,6 @@ func TestMvccGet(t *testing.T) { } func TestPrimaryKeyOpLock(t *testing.T) { - t.Parallel() store, close := NewTestStore("basic_optimistic_db", "basic_optimistic_log", t) defer close() @@ -927,7 +921,6 @@ func TestPrimaryKeyOpLock(t *testing.T) { } func TestMvccTxnRead(t *testing.T) { - t.Parallel() store, close := NewTestStore("basic_optimistic_db", "basic_optimistic_log", t) defer close() @@ -999,7 +992,6 @@ func TestMvccTxnRead(t *testing.T) { } func TestTxnPrewrite(t *testing.T) { - t.Parallel() store, close := NewTestStore("basic_optimistic_db", "basic_optimistic_log", t) defer close() @@ -1035,7 +1027,6 @@ func TestTxnPrewrite(t *testing.T) { } func TestPrewriteInsert(t *testing.T) { - t.Parallel() store, close := NewTestStore("basic_optimistic_db", "basic_optimistic_log", t) defer close() @@ -1072,7 +1063,6 @@ func TestPrewriteInsert(t *testing.T) { } func TestRollbackKey(t *testing.T) { - t.Parallel() store, close := NewTestStore("basic_optimistic_db", "basic_optimistic_log", t) defer close() @@ -1098,7 +1088,6 @@ func TestRollbackKey(t *testing.T) { } func TestCleanup(t *testing.T) { - t.Parallel() store, close := NewTestStore("basic_optimistic_db", "basic_optimistic_log", t) defer close() @@ -1121,7 +1110,6 @@ func TestCleanup(t *testing.T) { } func TestCommit(t *testing.T) { - t.Parallel() store, close := NewTestStore("basic_optimistic_db", "basic_optimistic_log", t) defer close() @@ -1173,7 +1161,6 @@ func TestCommit(t *testing.T) { } func TestMinCommitTs(t *testing.T) { - t.Parallel() store, close := NewTestStore("basic_optimistic_db", "basic_optimistic_log", t) defer close() @@ -1195,7 +1182,6 @@ func TestMinCommitTs(t *testing.T) { } func TestPessimisticLock(t *testing.T) { - t.Parallel() store, close := NewTestStore("basic_optimistic_db", "basic_optimistic_log", t) defer close() @@ -1361,7 +1347,6 @@ func TestPessimisticLock(t *testing.T) { } func TestResolveCommit(t *testing.T) { - t.Parallel() store, close := NewTestStore("basic_optimistic_db", "basic_optimistic_log", t) defer close() @@ -1427,7 +1412,6 @@ func MustLoad(startTS, commitTS uint64, store *TestStore, pairs ...string) { } func TestBatchGet(t *testing.T) { - t.Parallel() store, close := NewTestStore("basic_optimistic_db", "basic_optimistic_log", t) defer close() MustLoad(100, 101, store, "ta:1", "tb:2", "tc:3") @@ -1441,7 +1425,6 @@ func TestBatchGet(t *testing.T) { } func TestCommitPessimisticLock(t *testing.T) { - t.Parallel() store, close := NewTestStore("basic_optimistic_db", "basic_optimistic_log", t) defer close() k := []byte("ta") @@ -1452,7 +1435,6 @@ func TestCommitPessimisticLock(t *testing.T) { } func TestOpCheckNotExist(t *testing.T) { - t.Parallel() store, close := NewTestStore("basic_optimistic_db", "basic_optimistic_log", t) defer close() @@ -1470,7 +1452,6 @@ func TestOpCheckNotExist(t *testing.T) { } func TestPessimisticLockForce(t *testing.T) { - t.Parallel() store, close := NewTestStore("basic_optimistic_db", "basic_optimistic_log", t) defer close() @@ -1488,7 +1469,6 @@ func TestPessimisticLockForce(t *testing.T) { } func TestScanSampleStep(t *testing.T) { - t.Parallel() store, close := NewTestStore("basic_optimistic_db", "basic_optimistic_log", t) defer close() for i := 0; i < 1000; i++ { @@ -1522,7 +1502,6 @@ func genScanSampleStepKey(i int) []byte { } func TestAsyncCommitPrewrite(t *testing.T) { - t.Parallel() store, close := NewTestStore("basic_optimistic_db", "basic_optimistic_log", t) defer close() @@ -1550,3 +1529,99 @@ func TestAsyncCommitPrewrite(t *testing.T) { require.Greater(t, secLock.MinCommitTS, uint64(0)) require.Equal(t, 0, bytes.Compare(secLock.Value, secVal2)) } + +func TestAccessCommittedLocks(t *testing.T) { + store, close := NewTestStore("basic_optimistic_db", "basic_optimistic_log", t) + defer close() + + k0 := []byte("t0") + v0 := []byte("v0") + MustLoad(10, 20, store, "t0:v0") + // delete + MustPrewriteDelete(k0, k0, 30, store) + MustGetErr(k0, 40, store) + // meet lock + val, err := kvGet(k0, 40, []uint64{20}, nil, store) + require.Error(store.t, err) + require.Nil(store.t, val) + val, err = kvGet(k0, 40, []uint64{20}, []uint64{20}, store) + require.Error(store.t, err) + require.Nil(store.t, val) + // ignore lock + val, err = kvGet(k0, 40, []uint64{30}, nil, store) + require.NoError(store.t, err) + require.Equal(store.t, v0, val) + // access lock + val, err = kvGet(k0, 40, nil, []uint64{30}, store) + require.NoError(store.t, err) + require.Nil(store.t, val) + + k1 := []byte("t1") + v1 := []byte("v1") + // put + MustPrewritePut(k1, k1, v1, 50, store) + // ignore lock + val, err = kvGet(k1, 60, []uint64{50}, nil, store) + require.NoError(store.t, err) + require.Len(store.t, val, 0) + // access lock + val, err = kvGet(k1, 60, nil, []uint64{50}, store) + require.NoError(store.t, err) + require.Equal(store.t, v1, val) + + // locked + k2 := []byte("t2") + v2 := []byte("v2") + MustPrewritePut(k2, k2, v2, 70, store) + + // lock for ingore + k3 := []byte("t3") + v3 := []byte("v3") + MustPrewritePut(k3, k3, v3, 80, store) + + // No lock + k4 := []byte("t4") + v4 := []byte("v4") + MustLoad(80, 90, store, "t4:v4") + + keys := [][]byte{k0, k1, k2, k3, k4} + expected := []struct { + key []byte + val []byte + err bool + }{{k1, v1, false}, {k2, nil, true}, {k4, v4, false}} + reqCtx := store.newReqCtx() + reqCtx.rpcCtx.ResolvedLocks = []uint64{80} + reqCtx.rpcCtx.CommittedLocks = []uint64{30, 50} + pairs := store.MvccStore.BatchGet(reqCtx, keys, 100) + require.Equal(store.t, len(expected), len(pairs)) + for i, pair := range pairs { + e := expected[i] + require.Equal(store.t, pair.Key, e.key) + require.Equal(store.t, pair.Value, e.val) + if e.err { + require.NotNil(store.t, pair.Error) + } else { + require.Nil(store.t, pair.Error) + } + } + + scanReq := &kvrpcpb.ScanRequest{ + StartKey: []byte("t0"), + EndKey: []byte("t5"), + Limit: 100, + Version: 100, + } + pairs = store.MvccStore.Scan(reqCtx, scanReq) + require.Equal(store.t, len(expected), len(pairs)) + for i, pair := range pairs { + e := expected[i] + require.Equal(store.t, pair.Key, e.key) + require.Equal(store.t, pair.Value, e.val) + if e.err { + require.NotNil(store.t, pair.Error) + } else { + require.Nil(store.t, pair.Error) + } + } +} diff --git a/store/mockstore/unistore/tikv/region.go b/store/mockstore/unistore/tikv/region.go index 932841c968927..d854c910047a9 100644 --- a/store/mockstore/unistore/tikv/region.go +++ b/store/mockstore/unistore/tikv/region.go @@ -248,7 +248,13 @@ func (ri *regionCtx) AcquireLatches(hashVals []uint64) { dur := time.Since(start) metrics.LatchWait.Observe(dur.Seconds()) if dur > time.Millisecond*50 { - log.S().Warnf("region %d acquire %d locks takes %v, waitCnt %d", ri.meta.Id, len(hashVals), dur, waitCnt) + var id string + if ri.meta == nil { + id = "unknown" + } else { + id = strconv.FormatUint(ri.meta.Id, 10) + } + log.S().Warnf("region %s acquire %d locks takes %v, waitCnt %d", id, len(hashVals), dur, waitCnt) } } diff --git a/store/mockstore/unistore/tikv/server.go b/store/mockstore/unistore/tikv/server.go index 8038acac31922..940f2770ecf0a 100644 --- a/store/mockstore/unistore/tikv/server.go +++ b/store/mockstore/unistore/tikv/server.go @@ -155,20 +155,10 @@ func (svr *Server) KvGet(ctx context.Context, req *kvrpcpb.GetRequest) (*kvrpcpb if reqCtx.regErr != nil { return &kvrpcpb.GetResponse{RegionError: reqCtx.regErr}, nil } - err = svr.mvccStore.CheckKeysLock(req.GetVersion(), req.Context.ResolvedLocks, req.Key) - if err != nil { - return &kvrpcpb.GetResponse{Error: convertToKeyError(err)}, nil - } - reader := reqCtx.getDBReader() - val, err := reader.Get(req.Key, req.GetVersion()) - if err != nil { - return &kvrpcpb.GetResponse{ - Error: convertToKeyError(err), - }, nil - } - val = safeCopy(val) + val, err := svr.mvccStore.Get(reqCtx, req.Key, req.Version) return &kvrpcpb.GetResponse{ Value: val, + Error: convertToKeyError(err), }, nil } diff --git a/store/mockstore/unistore/util/lockwaiter/lockwaiter_test.go b/store/mockstore/unistore/util/lockwaiter/lockwaiter_test.go index be89f8184bc64..96fb02d8cf6c1 100644 --- a/store/mockstore/unistore/util/lockwaiter/lockwaiter_test.go +++ b/store/mockstore/unistore/util/lockwaiter/lockwaiter_test.go @@ -26,8 +26,6 @@ import ( ) func TestLockwaiterBasic(t *testing.T) { - t.Parallel() - mgr := NewManager(&config.DefaultConf) keyHash := uint64(100) diff --git a/store/store_test.go b/store/store_test.go index c02f87f312d93..2bad71202729b 100644 --- a/store/store_test.go +++ b/store/store_test.go @@ -141,8 +141,6 @@ func TestNew(t *testing.T) { } func TestGetSet(t *testing.T) { - t.Parallel() - store, err := mockstore.NewMockStore() require.NoError(t, err) defer func() { @@ -198,8 +196,6 @@ func TestSeek(t *testing.T) { } func TestInc(t *testing.T) { - t.Parallel() - store, err := mockstore.NewMockStore() require.NoError(t, err) defer func() { @@ -240,8 +236,6 @@ func TestInc(t *testing.T) { } func TestDelete(t *testing.T) { - t.Parallel() - store, err := mockstore.NewMockStore() require.NoError(t, err) defer func() { @@ -287,8 +281,6 @@ func TestDelete(t *testing.T) { } func TestDelete2(t *testing.T) { - t.Parallel() - store, err := mockstore.NewMockStore() require.NoError(t, err) defer func() { @@ -329,8 +321,6 @@ func TestDelete2(t *testing.T) { } func TestSetNil(t *testing.T) { - t.Parallel() - store, err := mockstore.NewMockStore() require.NoError(t, err) defer func() { @@ -347,8 +337,6 @@ func TestSetNil(t *testing.T) { } func TestBasicSeek(t *testing.T) { - t.Parallel() - store, err := mockstore.NewMockStore() require.NoError(t, err) defer func() { @@ -373,8 +361,6 @@ func TestBasicSeek(t *testing.T) { } func TestBasicTable(t *testing.T) { - t.Parallel() - store, err := mockstore.NewMockStore() require.NoError(t, err) defer func() { @@ -431,8 +417,6 @@ func TestBasicTable(t *testing.T) { } func TestRollback(t *testing.T) { - t.Parallel() - store, err := mockstore.NewMockStore() require.NoError(t, err) defer func() { @@ -468,8 +452,6 @@ func TestRollback(t *testing.T) { } func TestSeekMin(t *testing.T) { - t.Parallel() - store, err := mockstore.NewMockStore() require.NoError(t, err) defer func() { @@ -510,8 +492,6 @@ func TestSeekMin(t *testing.T) { } func TestConditionIfNotExist(t *testing.T) { - t.Parallel() - store, err := mockstore.NewMockStore() require.NoError(t, err) defer func() { @@ -552,8 +532,6 @@ func TestConditionIfNotExist(t *testing.T) { } func TestConditionIfEqual(t *testing.T) { - t.Parallel() - store, err := mockstore.NewMockStore() require.NoError(t, err) defer func() { @@ -599,8 +577,6 @@ func TestConditionIfEqual(t *testing.T) { } func TestConditionUpdate(t *testing.T) { - t.Parallel() - store, err := mockstore.NewMockStore() require.NoError(t, err) defer func() { @@ -659,8 +635,6 @@ func TestDBClose(t *testing.T) { } func TestIsolationInc(t *testing.T) { - t.Parallel() - store, err := mockstore.NewMockStore() require.NoError(t, err) defer func() { @@ -707,8 +681,6 @@ func TestIsolationInc(t *testing.T) { } func TestIsolationMultiInc(t *testing.T) { - t.Parallel() - store, err := mockstore.NewMockStore() require.NoError(t, err) defer func() { @@ -763,7 +735,6 @@ func TestIsolationMultiInc(t *testing.T) { } func TestRetryOpenStore(t *testing.T) { - t.Parallel() begin := time.Now() require.NoError(t, Register("dummy", &brokenStore{})) store, err := newStoreWithRetry("dummy://dummy-store", 3) @@ -778,7 +749,6 @@ func TestRetryOpenStore(t *testing.T) { } func TestOpenStore(t *testing.T) { - t.Parallel() require.NoError(t, Register("open", &brokenStore{})) store, err := newStoreWithRetry(":", 3) if store != nil { @@ -790,7 +760,6 @@ func TestOpenStore(t *testing.T) { } func TestRegister(t *testing.T) { - t.Parallel() err := Register("retry", &brokenStore{}) require.NoError(t, err) err = Register("retry", &brokenStore{}) diff --git a/table/column.go b/table/column.go index 827087ad1acf2..0225a88556c0b 100644 --- a/table/column.go +++ b/table/column.go @@ -24,7 +24,6 @@ import ( "strings" "time" "unicode" - "unicode/utf8" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/expression" @@ -171,9 +170,8 @@ func truncateTrailingSpaces(v *types.Datum) { v.SetString(str, v.Collation()) } -func handleWrongCharsetValue(ctx sessionctx.Context, col *model.ColumnInfo, casted *types.Datum, str string, i int) (types.Datum, error) { +func handleWrongCharsetValue(ctx sessionctx.Context, col *model.ColumnInfo, str string, i int) error { sc := ctx.GetSessionVars().StmtCtx - var strval strings.Builder for j := 0; j < 6; j++ { if len(str) > (i + j) { @@ -187,16 +185,19 @@ func handleWrongCharsetValue(ctx sessionctx.Context, col *model.ColumnInfo, cast if len(str) > i+6 { strval.WriteString(`...`) } - // TODO: Add 'at row %d' err := ErrTruncatedWrongValueForField.FastGen("Incorrect string value '%s' for column '%s'", strval.String(), col.Name) logutil.BgLogger().Error("incorrect string value", zap.Uint64("conn", ctx.GetSessionVars().ConnectionID), zap.Error(err)) - // Truncate to valid utf8 string. - truncateVal := types.NewStringDatum(str[:i]) err = sc.HandleTruncate(err) - return truncateVal, err + return err } +// handleZeroDatetime handles Timestamp/Datetime/Date zero date and invalid dates. +// Currently only called from CastValue. +// returns: +// value (possibly adjusted) +// boolean; true if break error/warning handling in CastValue and return what was returned from this +// error func handleZeroDatetime(ctx sessionctx.Context, col *model.ColumnInfo, casted types.Datum, str string, tmIsInvalid bool) (types.Datum, bool, error) { sc := ctx.GetSessionVars().StmtCtx tm := casted.GetMysqlTime() @@ -247,6 +248,14 @@ func handleZeroDatetime(ctx sessionctx.Context, col *model.ColumnInfo, casted ty sc.AppendWarning(innerErr) } return types.NewDatum(zeroV), true, nil + } else if tmIsInvalid && col.Tp == mysql.TypeTimestamp { + // Prevent from being stored! Invalid timestamp! + if mode.HasStrictMode() { + return types.NewDatum(zeroV), true, types.ErrWrongValue.GenWithStackByArgs(zeroT, str) + } + // no strict mode, truncate to 0000-00-00 00:00:00 + sc.AppendWarning(types.ErrWrongValue.GenWithStackByArgs(zeroT, str)) + return types.NewDatum(zeroV), true, nil } else if tm.IsZero() || tm.InvalidZero() { if tm.IsZero() { // Don't care NoZeroDate mode if time val is invalid. @@ -319,61 +328,48 @@ func CastValue(ctx sessionctx.Context, val types.Datum, col *model.ColumnInfo, r truncateTrailingSpaces(&casted) } - if col.Charset == charset.CharsetASCII { - if ctx.GetSessionVars().SkipASCIICheck { - return casted, nil - } - + if v := makeStringValidator(ctx, col); v != nil { str := casted.GetString() - for i := 0; i < len(str); i++ { - if str[i] > unicode.MaxASCII { - casted, err = handleWrongCharsetValue(ctx, col, &casted, str, i) - break - } - } - if forceIgnoreTruncate { - err = nil + strategy := charset.TruncateStrategyReplace + if val.Collation() == charset.CollationBin { + strategy = charset.TruncateStrategyTrim } - return casted, err - } - - if ctx.GetSessionVars().SkipUTF8Check { - return casted, nil - } - - if !mysql.IsUTF8Charset(col.Charset) { - return casted, nil - } - str := casted.GetString() - utf8Charset := col.Charset == mysql.UTF8Charset - doMB4CharCheck := utf8Charset && config.GetGlobalConfig().CheckMb4ValueInUTF8 - fastCheck := (col.Charset == mysql.UTF8MB4Charset) && utf8.ValidString(str) - if !fastCheck { - // The following check is slow, if we fast check success, we can avoid this. - for i, w := 0, 0; i < len(str); i += w { - runeValue, width := utf8.DecodeRuneInString(str[i:]) - if runeValue == utf8.RuneError { - if strings.HasPrefix(str[i:], string(utf8.RuneError)) { - w = width - continue - } - casted, err = handleWrongCharsetValue(ctx, col, &casted, str, i) - break - } else if width > 3 && doMB4CharCheck { - // Handle non-BMP characters. - casted, err = handleWrongCharsetValue(ctx, col, &casted, str, i) - break - } - w = width + if newStr, invalidPos := v.Truncate(str, strategy); invalidPos >= 0 { + casted = types.NewStringDatum(newStr) + err = handleWrongCharsetValue(ctx, col, str, invalidPos) } } - if forceIgnoreTruncate { err = nil } return casted, err } +func makeStringValidator(ctx sessionctx.Context, col *model.ColumnInfo) charset.StringValidator { + switch col.Charset { + case charset.CharsetASCII: + if ctx.GetSessionVars().SkipASCIICheck { + return nil + } + return charset.StringValidatorASCII{} + case charset.CharsetUTF8: + if ctx.GetSessionVars().SkipUTF8Check { + return nil + } + needCheckMB4 := config.GetGlobalConfig().CheckMb4ValueInUTF8 + return charset.StringValidatorUTF8{IsUTF8MB4: false, CheckMB4ValueInUTF8: needCheckMB4} + case charset.CharsetUTF8MB4: + if ctx.GetSessionVars().SkipUTF8Check { + return nil + } + return charset.StringValidatorUTF8{IsUTF8MB4: true} + case charset.CharsetLatin1, charset.CharsetBinary: + return nil + default: + return charset.StringValidatorOther{Charset: col.Charset} + } +} + // ColDesc describes column information like MySQL desc and show columns do. type ColDesc struct { Field string diff --git a/table/column_test.go b/table/column_test.go index 434e6341a515c..02cbb12237afc 100644 --- a/table/column_test.go +++ b/table/column_test.go @@ -27,12 +27,12 @@ import ( "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" + "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/mock" "github.com/stretchr/testify/require" ) func TestString(t *testing.T) { - t.Parallel() col := ToColumn(&model.ColumnInfo{ FieldType: *types.NewFieldType(mysql.TypeTiny), State: model.StatePublic, @@ -83,7 +83,6 @@ func TestString(t *testing.T) { } func TestFind(t *testing.T) { - t.Parallel() cols := []*Column{ newCol("a"), newCol("b"), @@ -103,7 +102,6 @@ func TestFind(t *testing.T) { } func TestCheck(t *testing.T) { - t.Parallel() col := newCol("a") col.Flag = mysql.AutoIncrementFlag cols := []*Column{col, col} @@ -120,13 +118,12 @@ func TestCheck(t *testing.T) { } func TestHandleBadNull(t *testing.T) { - t.Parallel() col := newCol("a") sc := new(stmtctx.StatementContext) d := types.Datum{} err := col.HandleBadNull(&d, sc) require.NoError(t, err) - cmp, err := d.CompareDatum(sc, &types.Datum{}) + cmp, err := d.Compare(sc, &types.Datum{}, collate.GetBinaryCollator()) require.NoError(t, err) require.Equal(t, 0, cmp) @@ -140,7 +137,6 @@ func TestHandleBadNull(t *testing.T) { } func TestDesc(t *testing.T) { - t.Parallel() col := newCol("a") col.Flag = mysql.AutoIncrementFlag | mysql.NotNullFlag | mysql.PriKeyFlag NewColDesc(col) @@ -251,11 +247,10 @@ func TestGetZeroValue(t *testing.T) { sc := new(stmtctx.StatementContext) for _, tt := range tests { t.Run(fmt.Sprintf("%+v", tt.ft), func(t *testing.T) { - t.Parallel() colInfo := &model.ColumnInfo{FieldType: *tt.ft} zv := GetZeroValue(colInfo) require.Equal(t, tt.value.Kind(), zv.Kind()) - cmp, err := zv.CompareDatum(sc, &tt.value) + cmp, err := zv.Compare(sc, &tt.value, collate.GetCollator(tt.ft.Collate)) require.NoError(t, err) require.Equal(t, 0, cmp) }) @@ -263,7 +258,6 @@ func TestGetZeroValue(t *testing.T) { } func TestCastValue(t *testing.T) { - t.Parallel() ctx := mock.NewContext() colInfo := model.ColumnInfo{ FieldType: *types.NewFieldType(mysql.TypeLong), @@ -312,7 +306,6 @@ func TestCastValue(t *testing.T) { } func TestGetDefaultValue(t *testing.T) { - t.Parallel() var nilDt types.Datum nilDt.SetNull() ctx := mock.NewContext() diff --git a/table/table.go b/table/table.go index 7ee4debb3cba5..1c38ed4335ca6 100644 --- a/table/table.go +++ b/table/table.go @@ -29,6 +29,7 @@ import ( "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/dbterror" + "github.com/pingcap/tidb/util/sqlexec" ) // Type is used to distinguish between different tables that store data in different ways. @@ -245,3 +246,19 @@ var TableFromMeta func(allocators autoid.Allocators, tblInfo *model.TableInfo) ( // MockTableFromMeta only serves for test. var MockTableFromMeta func(tableInfo *model.TableInfo) Table + +// CachedTable is a Table, and it has a UpdateLockForRead() method +// UpdateLockForRead() according to the reasons for not meeting the read conditions, update the lock information, +// And at the same time reload data from the original table. +type CachedTable interface { + Table + + Init(renewCh chan func(), exec sqlexec.SQLExecutor) error + + // TryReadFromCache checks if the cache table is readable. + TryReadFromCache(ts uint64) kv.MemBuffer + + // UpdateLockForRead If you cannot meet the conditions of the read buffer, + // you need to update the lock information and read the data from the original table + UpdateLockForRead(ctx context.Context, store kv.Storage, ts uint64) error +} diff --git a/table/table_test.go b/table/table_test.go index ca5b845e97de9..3cc6f16c4fcdd 100644 --- a/table/table_test.go +++ b/table/table_test.go @@ -23,7 +23,6 @@ import ( ) func TestErrorCode(t *testing.T) { - t.Parallel() require.Equal(t, mysql.ErrBadNull, int(terror.ToSQLError(ErrColumnCantNull).Code)) require.Equal(t, mysql.ErrBadField, int(terror.ToSQLError(ErrUnknownColumn).Code)) require.Equal(t, mysql.ErrFieldSpecifiedTwice, int(terror.ToSQLError(errDuplicateColumn).Code)) diff --git a/table/tables/cache.go b/table/tables/cache.go new file mode 100644 index 0000000000000..7e3eb7c40b9a9 --- /dev/null +++ b/table/tables/cache.go @@ -0,0 +1,229 @@ +// Copyright 2021 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, +// 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. + +package tables + +import ( + "context" + "sync/atomic" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/log" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/table" + "github.com/pingcap/tidb/tablecodec" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/sqlexec" + "github.com/tikv/client-go/v2/oracle" + "github.com/tikv/client-go/v2/tikv" + "go.uber.org/zap" +) + +// RenewLeaseType define the type for renew lease. +type RenewLeaseType int + +const ( + // RenewReadLease means renew read lease. + RenewReadLease RenewLeaseType = iota + 1 + // RenewWriteLease means renew write lease. + RenewWriteLease +) + +var ( + _ table.CachedTable = &cachedTable{} +) + +type cachedTable struct { + TableCommon + cacheData atomic.Value + handle StateRemote + renewCh chan func() +} + +// cacheData pack the cache data and lease. +type cacheData struct { + Start uint64 + Lease uint64 + kv.MemBuffer +} + +func leaseFromTS(ts uint64) uint64 { + // TODO make this configurable in the following PRs + const defaultLeaseDuration time.Duration = 3 * time.Second + physicalTime := oracle.GetTimeFromTS(ts) + lease := oracle.GoTimeToTS(physicalTime.Add(defaultLeaseDuration)) + return lease +} + +func newMemBuffer(store kv.Storage) (kv.MemBuffer, error) { + // Here is a trick to get a MemBuffer data, because the internal API is not exposed. + // Create a transaction with start ts 0, and take the MemBuffer out. + buffTxn, err := store.Begin(tikv.WithStartTS(0)) + if err != nil { + return nil, err + } + return buffTxn.GetMemBuffer(), nil +} + +func (c *cachedTable) TryReadFromCache(ts uint64) kv.MemBuffer { + tmp := c.cacheData.Load() + if tmp == nil { + return nil + } + data := tmp.(*cacheData) + if ts >= data.Start && ts < data.Lease { + leaseTime := oracle.GetTimeFromTS(data.Lease) + nowTime := oracle.GetTimeFromTS(ts) + distance := leaseTime.Sub(nowTime) + // TODO make this configurable in the following PRs + if distance >= 0 && distance <= (1500*time.Millisecond) { + c.renewCh <- c.renewLease(ts, RenewReadLease, data) + } + return data.MemBuffer + } + return nil +} + +// newCachedTable creates a new CachedTable Instance +func newCachedTable(tbl *TableCommon) (table.Table, error) { + ret := &cachedTable{ + TableCommon: *tbl, + } + return ret, nil +} + +// Init is an extra operation for cachedTable after TableFromMeta, +// Because cachedTable need some additional parameter that can't be passed in TableFromMeta. +func (c *cachedTable) Init(renewCh chan func(), exec sqlexec.SQLExecutor) error { + c.renewCh = renewCh + raw, ok := exec.(sqlExec) + if !ok { + return errors.New("Need sqlExec rather than sqlexec.SQLExecutor") + } + c.handle = NewStateRemote(raw) + return nil +} + +func (c *cachedTable) loadDataFromOriginalTable(store kv.Storage, lease uint64) (kv.MemBuffer, uint64, error) { + buffer, err := newMemBuffer(store) + if err != nil { + return nil, 0, err + } + var startTS uint64 + err = kv.RunInNewTxn(context.Background(), store, true, func(ctx context.Context, txn kv.Transaction) error { + prefix := tablecodec.GenTablePrefix(c.tableID) + if err != nil { + return errors.Trace(err) + } + startTS = txn.StartTS() + if startTS >= lease { + return errors.New("the loaded data is outdated for caching") + } + it, err := txn.Iter(prefix, prefix.PrefixNext()) + if err != nil { + return errors.Trace(err) + } + defer it.Close() + + for it.Valid() && it.Key().HasPrefix(prefix) { + value := it.Value() + err = buffer.Set(it.Key(), value) + if err != nil { + return errors.Trace(err) + } + err = it.Next() + if err != nil { + return errors.Trace(err) + } + } + return nil + }) + if err != nil { + return nil, 0, err + } + + return buffer, startTS, nil +} + +func (c *cachedTable) UpdateLockForRead(ctx context.Context, store kv.Storage, ts uint64) error { + // Load data from original table and the update lock information. + tid := c.Meta().ID + lease := leaseFromTS(ts) + succ, err := c.handle.LockForRead(ctx, tid, lease) + if err != nil { + return errors.Trace(err) + } + if succ { + mb, startTS, err := c.loadDataFromOriginalTable(store, lease) + if err != nil { + return errors.Trace(err) + } + + c.cacheData.Store(&cacheData{ + Start: startTS, + Lease: lease, + MemBuffer: mb, + }) + } + // Current status is not suitable to cache. + return nil +} + +// AddRecord implements the AddRecord method for the table.Table interface. +func (c *cachedTable) AddRecord(sctx sessionctx.Context, r []types.Datum, opts ...table.AddRecordOption) (recordID kv.Handle, err error) { + txnCtxAddCachedTable(sctx, c.Meta().ID, c.handle) + return c.TableCommon.AddRecord(sctx, r, opts...) +} + +func txnCtxAddCachedTable(sctx sessionctx.Context, tid int64, handle StateRemote) { + txnCtx := sctx.GetSessionVars().TxnCtx + if txnCtx.CachedTables == nil { + txnCtx.CachedTables = make(map[int64]interface{}) + } + if _, ok := txnCtx.CachedTables[tid]; !ok { + txnCtx.CachedTables[tid] = handle + } +} + +// UpdateRecord implements table.Table +func (c *cachedTable) UpdateRecord(ctx context.Context, sctx sessionctx.Context, h kv.Handle, oldData, newData []types.Datum, touched []bool) error { + txnCtxAddCachedTable(sctx, c.Meta().ID, c.handle) + return c.TableCommon.UpdateRecord(ctx, sctx, h, oldData, newData, touched) +} + +// RemoveRecord implements table.Table RemoveRecord interface. +func (c *cachedTable) RemoveRecord(sctx sessionctx.Context, h kv.Handle, r []types.Datum) error { + txnCtxAddCachedTable(sctx, c.Meta().ID, c.handle) + return c.TableCommon.RemoveRecord(sctx, h, r) +} + +func (c *cachedTable) renewLease(ts uint64, op RenewLeaseType, data *cacheData) func() { + return func() { + tid := c.Meta().ID + lease := leaseFromTS(ts) + succ, err := c.handle.RenewLease(context.Background(), tid, lease, op) + if err != nil { + log.Warn("Renew read lease error", zap.Error(err)) + } + if succ { + c.cacheData.Store(&cacheData{ + Start: data.Start, + Lease: lease, + MemBuffer: data.MemBuffer, + }) + } + } +} diff --git a/table/tables/cache_test.go b/table/tables/cache_test.go new file mode 100644 index 0000000000000..62e48ccd24c94 --- /dev/null +++ b/table/tables/cache_test.go @@ -0,0 +1,472 @@ +// Copyright 2021 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, +// 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. + +package tables_test + +import ( + "context" + "testing" + "time" + + "github.com/pingcap/tidb/infoschema" + "github.com/pingcap/tidb/parser/model" + "github.com/pingcap/tidb/table/tables" + "github.com/pingcap/tidb/testkit" + "github.com/stretchr/testify/require" +) + +func TestCacheTableBasicScan(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists tmp1") + tk.MustExec("create table tmp1 (id int primary key auto_increment, u int unique, v int)") + tk.MustExec("insert into tmp1 values" + + "(1, 101, 1001), (3, 113, 1003), (5, 105, 1005), (7, 117, 1007), (9, 109, 1009)," + + "(10, 110, 1010), (12, 112, 1012), (14, 114, 1014), (16, 116, 1016), (18, 118, 1018)", + ) + tk.MustExec("alter table tmp1 cache") + assertSelect := func() { + // For TableReader + // First read will read from original table + tk.MustQuery("select * from tmp1 where id>3 order by id").Check(testkit.Rows( + "5 105 1005", "7 117 1007", "9 109 1009", + "10 110 1010", "12 112 1012", "14 114 1014", "16 116 1016", "18 118 1018", + )) + // Test for join two cache table + tk.MustExec("drop table if exists join_t1, join_t2, join_t3") + tk.MustExec("create table join_t1 (id int)") + tk.MustExec("insert into join_t1 values(1)") + tk.MustExec("alter table join_t1 cache") + tk.MustQuery("select *from join_t1").Check(testkit.Rows("1")) + tk.MustExec("create table join_t2 (id int)") + tk.MustExec("insert into join_t2 values(2)") + tk.MustExec("alter table join_t2 cache") + tk.MustQuery("select *from join_t2").Check(testkit.Rows("2")) + tk.MustExec("create table join_t3 (id int)") + tk.MustExec("insert into join_t3 values(3)") + planUsed := false + for i := 0; i < 10; i++ { + tk.MustQuery("select *from join_t1 join join_t2").Check(testkit.Rows("1 2")) + if tk.HasPlan("select *from join_t1 join join_t2", "UnionScan") { + planUsed = true + break + } + } + require.True(t, planUsed) + result := tk.MustQuery("explain format = 'brief' select *from join_t1 join join_t2") + result.Check(testkit.Rows( + "HashJoin 100000000.00 root CARTESIAN inner join", + "├─UnionScan(Build) 10000.00 root ", + "│ └─TableReader 10000.00 root data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:join_t2 keep order:false, stats:pseudo", + "└─UnionScan(Probe) 10000.00 root ", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:join_t1 keep order:false, stats:pseudo")) + // Test for join a cache table and a normal table + for i := 0; i < 10; i++ { + tk.MustQuery("select *from join_t1 join join_t3").Check(testkit.Rows("1 3")) + if tk.HasPlan("select *from join_t1 join join_t3", "UnionScan") { + planUsed = true + break + } + } + require.True(t, planUsed) + result = tk.MustQuery("explain format = 'brief' select *from join_t1 join join_t3") + result.Check(testkit.Rows( + "Projection 100000000.00 root test.join_t1.id, test.join_t3.id", + "└─HashJoin 100000000.00 root CARTESIAN inner join", + " ├─UnionScan(Build) 10000.00 root ", + " │ └─TableReader 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:join_t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:join_t3 keep order:false, stats:pseudo")) + + // Second read will from cache table + for i := 0; i < 100; i++ { + tk.MustQuery("select * from tmp1 where id>4 order by id").Check(testkit.Rows( + "5 105 1005", "7 117 1007", "9 109 1009", + "10 110 1010", "12 112 1012", "14 114 1014", "16 116 1016", "18 118 1018", + )) + if tk.HasPlan("select * from tmp1 where id>4 order by id", "UnionScan") { + planUsed = true + break + } + } + require.True(t, planUsed) + result = tk.MustQuery("explain format = 'brief' select * from tmp1 where id>4 order by id") + result.Check(testkit.Rows("UnionScan 3333.33 root gt(test.tmp1.id, 4)", + "└─TableReader 3333.33 root data:TableRangeScan", + " └─TableRangeScan 3333.33 cop[tikv] table:tmp1 range:(4,+inf], keep order:true, stats:pseudo")) + // For IndexLookUpReader + for i := 0; i < 10; i++ { + tk.MustQuery("select /*+ use_index(tmp1, u) */ * from tmp1 where u>101 order by u").Check(testkit.Rows( + "5 105 1005", "9 109 1009", "10 110 1010", + "12 112 1012", "3 113 1003", "14 114 1014", "16 116 1016", "7 117 1007", "18 118 1018", + )) + if tk.HasPlan("select /*+ use_index(tmp1, u) */ * from tmp1 where u>101 order by u", "UnionScan") { + planUsed = true + break + } + } + require.True(t, planUsed) + result = tk.MustQuery("explain format = 'brief' select /*+ use_index(tmp1, u) */ * from tmp1 where u>101 order by u") + result.Check(testkit.Rows("UnionScan 3333.33 root gt(test.tmp1.u, 101)", + "└─IndexLookUp 3333.33 root ", + " ├─IndexRangeScan(Build) 3333.33 cop[tikv] table:tmp1, index:u(u) range:(101,+inf], keep order:true, stats:pseudo", + " └─TableRowIDScan(Probe) 3333.33 cop[tikv] table:tmp1 keep order:false, stats:pseudo")) + tk.MustQuery("show warnings").Check(testkit.Rows()) + + // For IndexReader + tk.MustQuery("select /*+ use_index(tmp1, u) */ id,u from tmp1 where u>101 order by id").Check(testkit.Rows( + "3 113", "5 105", "7 117", "9 109", "10 110", + "12 112", "14 114", "16 116", "18 118", + )) + tk.MustQuery("show warnings").Check(testkit.Rows()) + + // For IndexMerge, cache table should not use index merge + tk.MustQuery("select /*+ use_index_merge(tmp1, primary, u) */ * from tmp1 where id>5 or u>110 order by u").Check(testkit.Rows( + "9 109 1009", "10 110 1010", + "12 112 1012", "3 113 1003", "14 114 1014", "16 116 1016", "7 117 1007", "18 118 1018", + )) + + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1105 IndexMerge is inapplicable or disabled")) + } + assertSelect() + +} + +func TestCacheCondition(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t2") + tk.MustExec("create table t2 (id int primary key, v int)") + tk.MustExec("alter table t2 cache") + + // Explain should not trigger cache. + tk.MustQuery("explain select * from t2") + for i := 0; i < 10; i++ { + time.Sleep(100 * time.Millisecond) + require.False(t, tk.HasPlan("select * from t2 where id>0", "UnionScan")) + } + + // Insert should not trigger cache. + tk.MustExec("insert into t2 values (1,1)") + for i := 0; i < 10; i++ { + time.Sleep(100 * time.Millisecond) + require.False(t, tk.HasPlan("select * from t2 where id>0", "UnionScan")) + } + + // Update should not trigger cache. + tk.MustExec("update t2 set v = v + 1 where id > 0") + for i := 0; i < 10; i++ { + time.Sleep(100 * time.Millisecond) + require.False(t, tk.HasPlan("select * from t2 where id>0", "UnionScan")) + } + // Contains PointGet Update should not trigger cache. + tk.MustExec("update t2 set v = v + 1 where id = 2") + for i := 0; i < 10; i++ { + time.Sleep(100 * time.Millisecond) + require.False(t, tk.HasPlan("select * from t2 where id>0", "UnionScan")) + } + + // Contains PointGet Delete should not trigger cache. + tk.MustExec("delete from t2 where id = 2") + for i := 0; i < 10; i++ { + time.Sleep(100 * time.Millisecond) + require.False(t, tk.HasPlan("select * from t2 where id>0", "UnionScan")) + } + + // Normal query should trigger cache. + tk.MustQuery("select * from t2") + for !tk.HasPlan("select * from t2 where id>0", "UnionScan") { + tk.MustExec("select * from t2") + } +} + +func TestCacheTableBasicReadAndWrite(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk1 := testkit.NewTestKit(t, store) + tk1.MustExec("use test") + tk.MustExec("drop table if exists write_tmp1") + tk.MustExec("create table write_tmp1 (id int primary key auto_increment, u int unique, v int)") + tk.MustExec("insert into write_tmp1 values" + + "(1, 101, 1001), (3, 113, 1003)", + ) + + tk.MustExec("alter table write_tmp1 cache") + // Read and add read lock + tk.MustQuery("select * from write_tmp1").Check(testkit.Rows("1 101 1001", + "3 113 1003")) + // read lock should valid + var i int + for i = 0; i < 10; i++ { + if tk.HasPlan("select * from write_tmp1", "UnionScan") { + break + } + } + require.True(t, i < 10) + + tk.MustExec("use test") + tk1.MustExec("insert into write_tmp1 values (2, 222, 222)") + // write lock exists + require.False(t, tk.HasPlan("select * from write_tmp1", "UnionScan")) + // wait write lock expire and check cache can be used again + for !tk.HasPlan("select * from write_tmp1", "UnionScan") { + tk.MustExec("select * from write_tmp1") + } + tk.MustQuery("select * from write_tmp1").Check(testkit.Rows("1 101 1001", "2 222 222", "3 113 1003")) + tk1.MustExec("update write_tmp1 set v = 3333 where id = 2") + for !tk.HasPlan("select * from write_tmp1", "UnionScan") { + tk.MustExec("select * from write_tmp1") + } + tk.MustQuery("select * from write_tmp1").Check(testkit.Rows("1 101 1001", "2 222 3333", "3 113 1003")) +} + +func TestCacheTableComplexRead(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk1 := testkit.NewTestKit(t, store) + tk2 := testkit.NewTestKit(t, store) + tk1.MustExec("use test") + tk2.MustExec("use test") + tk1.MustExec("create table complex_cache (id int primary key auto_increment, u int unique, v int)") + tk1.MustExec("insert into complex_cache values" + "(5, 105, 1005), (7, 117, 1007), (9, 109, 1009)") + tk1.MustExec("alter table complex_cache cache") + tk1.MustQuery("select * from complex_cache where id > 7").Check(testkit.Rows("9 109 1009")) + var i int + for i = 0; i < 100; i++ { + time.Sleep(100 * time.Millisecond) + if tk1.HasPlan("select * from complex_cache where id > 7", "UnionScan") { + break + } + } + require.True(t, i < 10) + + tk1.MustExec("begin") + tk2.MustExec("begin") + tk2.MustQuery("select * from complex_cache where id > 7").Check(testkit.Rows("9 109 1009")) + for i = 0; i < 10; i++ { + time.Sleep(100 * time.Millisecond) + if tk2.HasPlan("select * from complex_cache where id > 7", "UnionScan") { + break + } + } + require.True(t, i < 10) + tk2.MustExec("commit") + + tk1.HasPlan("select * from complex_cache where id > 7", "UnionScan") + tk1.MustExec("commit") +} + +func TestBeginSleepABA(t *testing.T) { + // During the change "cache1 -> no cache -> cache2", + // cache1 and cache2 may be not the same anymore + // A transaction should not only check the cache exists, but also check the cache unchanged. + + store, clean := testkit.CreateMockStore(t) + defer clean() + tk1 := testkit.NewTestKit(t, store) + tk2 := testkit.NewTestKit(t, store) + tk1.MustExec("use test") + tk2.MustExec("use test") + tk1.MustExec("drop table if exists aba") + tk1.MustExec("create table aba (id int, v int)") + tk1.MustExec("insert into aba values (1, 1)") + tk1.MustExec("alter table aba cache") + tk1.MustQuery("select * from aba").Check(testkit.Rows("1 1")) + cacheUsed := false + for i := 0; i < 100; i++ { + if tk1.HasPlan("select * from aba", "UnionScan") { + cacheUsed = true + break + } + } + require.True(t, cacheUsed) + + // Begin, read from cache. + tk1.MustExec("begin") + cacheUsed = false + for i := 0; i < 100; i++ { + if tk1.HasPlan("select * from aba", "UnionScan") { + cacheUsed = true + break + } + } + require.True(t, cacheUsed) + + // Another session change the data and make the cache unavailable. + tk2.MustExec("update aba set v = 2") + + // And then make the cache available again. + for i := 0; i < 50; i++ { + tk2.MustQuery("select * from aba").Check(testkit.Rows("1 2")) + if tk2.HasPlan("select * from aba", "UnionScan") { + cacheUsed = true + break + } + time.Sleep(100 * time.Millisecond) + } + require.True(t, cacheUsed) + + // tk1 should not use the staled cache, because the data is changed. + require.False(t, tk1.HasPlan("select * from aba", "UnionScan")) +} + +func TestCacheTablePointGet(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table cache_point (id int primary key auto_increment, u int unique, v int)") + tk.MustExec("insert into cache_point values(1, 11, 101)") + tk.MustExec("insert into cache_point values(2, 12, 102)") + tk.MustExec("alter table cache_point cache") + // check point get out transaction + tk.MustQuery("select * from cache_point where id=1").Check(testkit.Rows("1 11 101")) + tk.MustQuery("select * from cache_point where u=11").Check(testkit.Rows("1 11 101")) + tk.MustQuery("select * from cache_point where id=2").Check(testkit.Rows("2 12 102")) + tk.MustQuery("select * from cache_point where u=12").Check(testkit.Rows("2 12 102")) + tk.MustQuery("select * from cache_point where u > 10 and u < 12").Check(testkit.Rows("1 11 101")) + + // check point get in transaction + tk.MustExec("begin") + tk.MustQuery("select * from cache_point where id=1").Check(testkit.Rows("1 11 101")) + tk.MustQuery("select * from cache_point where u=11").Check(testkit.Rows("1 11 101")) + tk.MustQuery("select * from cache_point where id=2").Check(testkit.Rows("2 12 102")) + tk.MustQuery("select * from cache_point where u=12").Check(testkit.Rows("2 12 102")) + tk.MustExec("insert into cache_point values(3, 13, 103)") + tk.MustQuery("select * from cache_point where id=3").Check(testkit.Rows("3 13 103")) + tk.MustQuery("select * from cache_point where u=13").Check(testkit.Rows("3 13 103")) + tk.MustQuery("select * from cache_point where u > 12 and u < 14").Check(testkit.Rows("3 13 103")) + tk.MustExec("update cache_point set v=999 where id=2") + tk.MustQuery("select * from cache_point where id=2").Check(testkit.Rows("2 12 999")) + tk.MustExec("commit") + + // check point get after transaction + tk.MustQuery("select * from cache_point where id=3").Check(testkit.Rows("3 13 103")) + tk.MustQuery("select * from cache_point where u=13").Check(testkit.Rows("3 13 103")) + tk.MustQuery("select * from cache_point where id=2").Check(testkit.Rows("2 12 999")) +} + +func TestCacheTableBatchPointGet(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table bp_cache_tmp1 (id int primary key auto_increment, u int unique, v int)") + tk.MustExec("insert into bp_cache_tmp1 values(1, 11, 101)") + tk.MustExec("insert into bp_cache_tmp1 values(2, 12, 102)") + tk.MustExec("insert into bp_cache_tmp1 values(3, 13, 103)") + tk.MustExec("insert into bp_cache_tmp1 values(4, 14, 104)") + tk.MustExec("alter table bp_cache_tmp1 cache") + // check point get out transaction + tk.MustQuery("select * from bp_cache_tmp1 where id in (1, 3)").Check(testkit.Rows("1 11 101", "3 13 103")) + tk.MustQuery("select * from bp_cache_tmp1 where u in (11, 13)").Check(testkit.Rows("1 11 101", "3 13 103")) + tk.MustQuery("select * from bp_cache_tmp1 where id in (1, 3, 5)").Check(testkit.Rows("1 11 101", "3 13 103")) + tk.MustQuery("select * from bp_cache_tmp1 where u in (11, 13, 15)").Check(testkit.Rows("1 11 101", "3 13 103")) + tk.MustQuery("select * from bp_cache_tmp1 where u in (11, 13) and u in (12, 13)").Check(testkit.Rows("3 13 103")) + // check point get in transaction + tk.MustExec("begin") + tk.MustQuery("select * from bp_cache_tmp1 where id in (1, 3)").Check(testkit.Rows("1 11 101", "3 13 103")) + tk.MustQuery("select * from bp_cache_tmp1 where u in (11, 13)").Check(testkit.Rows("1 11 101", "3 13 103")) + tk.MustQuery("select * from bp_cache_tmp1 where id in (1, 3, 5)").Check(testkit.Rows("1 11 101", "3 13 103")) + tk.MustQuery("select * from bp_cache_tmp1 where u in (11, 13, 15)").Check(testkit.Rows("1 11 101", "3 13 103")) + tk.MustExec("insert into bp_cache_tmp1 values(6, 16, 106)") + tk.MustQuery("select * from bp_cache_tmp1 where id in (1, 6)").Check(testkit.Rows("1 11 101", "6 16 106")) + tk.MustQuery("select * from bp_cache_tmp1 where u in (11, 16)").Check(testkit.Rows("1 11 101", "6 16 106")) + tk.MustExec("update bp_cache_tmp1 set v=999 where id=3") + tk.MustQuery("select * from bp_cache_tmp1 where id in (1, 3)").Check(testkit.Rows("1 11 101", "3 13 999")) + tk.MustQuery("select * from bp_cache_tmp1 where u in (11, 13)").Check(testkit.Rows("1 11 101", "3 13 999")) + tk.MustQuery("select * from bp_cache_tmp1 where u in (11, 13) and u in (12, 13)").Check(testkit.Rows("3 13 999")) + tk.MustExec("delete from bp_cache_tmp1 where id=4") + tk.MustQuery("select * from bp_cache_tmp1 where id in (1, 4)").Check(testkit.Rows("1 11 101")) + tk.MustQuery("select * from bp_cache_tmp1 where u in (11, 14)").Check(testkit.Rows("1 11 101")) + tk.MustExec("commit") + + // check point get after transaction + tk.MustQuery("select * from bp_cache_tmp1 where id in (1, 3, 6)").Check(testkit.Rows("1 11 101", "3 13 999", "6 16 106")) + tk.MustQuery("select * from bp_cache_tmp1 where u in (11, 13, 16)").Check(testkit.Rows("1 11 101", "3 13 999", "6 16 106")) + tk.MustQuery("select * from bp_cache_tmp1 where id in (1, 4)").Check(testkit.Rows("1 11 101")) + tk.MustQuery("select * from bp_cache_tmp1 where u in (11, 14)").Check(testkit.Rows("1 11 101")) +} + +func TestRenewLease(t *testing.T) { + // Test RenewLeaseForRead + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + se := tk.Session() + tk.MustExec("create table cache_renew_t (id int)") + tk.MustExec("alter table cache_renew_t cache") + tbl, err := se.GetInfoSchema().(infoschema.InfoSchema).TableByName(model.NewCIStr("test"), model.NewCIStr("cache_renew_t")) + require.NoError(t, err) + var i int + tk.MustExec("select * from cache_renew_t") + + tk1 := testkit.NewTestKit(t, store) + remote := tables.NewStateRemote(tk1.Session()) + var leaseBefore uint64 + for i = 0; i < 20; i++ { + time.Sleep(200 * time.Millisecond) + lockType, lease, err := remote.Load(context.Background(), tbl.Meta().ID) + require.NoError(t, err) + if lockType == tables.CachedTableLockRead { + leaseBefore = lease + break + } + } + require.True(t, i < 20) + + for i = 0; i < 20; i++ { + time.Sleep(200 * time.Millisecond) + tk.MustExec("select * from cache_renew_t") + lockType, lease, err := remote.Load(context.Background(), tbl.Meta().ID) + require.NoError(t, err) + require.Equal(t, lockType, tables.CachedTableLockRead) + if leaseBefore != lease { + break + } + } + require.True(t, i < 20) +} + +func TestCacheTableWriteOperatorWaitLockLease(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + se := tk.Session() + tk.MustExec("drop table if exists wait_tb1") + tk.MustExec("create table wait_tb1(id int)") + tk.MustExec("alter table wait_tb1 cache") + tk.MustExec("select *from wait_tb1") + var i int + for i = 0; i < 10; i++ { + time.Sleep(100 * time.Millisecond) + if tk.HasPlan("select *from wait_tb1", "UnionScan") { + break + } + } + require.True(t, i < 10) + tk.MustExec("insert into wait_tb1 values(1)") + require.True(t, se.GetSessionVars().StmtCtx.WaitLockLeaseTime > 0) +} diff --git a/table/tables/index_serial_test.go b/table/tables/index_serial_test.go index 4ee31173cf054..16784c16d0c7e 100644 --- a/table/tables/index_serial_test.go +++ b/table/tables/index_serial_test.go @@ -25,10 +25,15 @@ import ( "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" "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/testkit" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/mock" + "github.com/pingcap/tidb/util/rowcodec" "github.com/stretchr/testify/require" ) @@ -242,3 +247,78 @@ func TestCombineIndexSeek(t *testing.T) { require.NoError(t, err) require.Equal(t, int64(1), h.IntValue()) } + +func TestMultiColumnCommonHandle(t *testing.T) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + tblInfo := buildTableInfo(t, "create table t (a int, b int, u varchar(64) unique, nu varchar(64), primary key (a, b), index nu (nu))") + var idxUnique, idxNonUnique table.Index + for _, idxInfo := range tblInfo.Indices { + idx := tables.NewIndex(tblInfo.ID, tblInfo, idxInfo) + if idxInfo.Name.L == "u" { + idxUnique = idx + } else if idxInfo.Name.L == "nu" { + idxNonUnique = idx + } + } + var a, b *model.ColumnInfo + for _, col := range tblInfo.Columns { + if col.Name.String() == "a" { + a = col + } else if col.Name.String() == "b" { + b = col + } + } + require.NotNil(t, a) + require.NotNil(t, b) + + store, clean := testkit.CreateMockStore(t) + defer clean() + txn, err := store.Begin() + require.NoError(t, err) + mockCtx := mock.NewContext() + sc := mockCtx.GetSessionVars().StmtCtx + // create index for "insert t values (3, 2, "abc", "abc") + idxColVals := types.MakeDatums("abc") + handleColVals := types.MakeDatums(3, 2) + encodedHandle, err := codec.EncodeKey(sc, nil, handleColVals...) + require.NoError(t, err) + commonHandle, err := kv.NewCommonHandle(encodedHandle) + require.NoError(t, err) + _ = idxNonUnique + for _, idx := range []table.Index{idxUnique, idxNonUnique} { + key, _, err := idx.GenIndexKey(sc, idxColVals, commonHandle, nil) + require.NoError(t, err) + _, err = idx.Create(mockCtx, txn, idxColVals, commonHandle, nil) + require.NoError(t, err) + val, err := txn.Get(context.Background(), key) + require.NoError(t, err) + colInfo := tables.BuildRowcodecColInfoForIndexColumns(idx.Meta(), tblInfo) + colInfo = append(colInfo, rowcodec.ColInfo{ + ID: a.ID, + IsPKHandle: false, + Ft: rowcodec.FieldTypeFromModelColumn(a), + }) + colInfo = append(colInfo, rowcodec.ColInfo{ + ID: b.ID, + IsPKHandle: false, + Ft: rowcodec.FieldTypeFromModelColumn(b), + }) + colVals, err := tablecodec.DecodeIndexKV(key, val, 1, tablecodec.HandleDefault, colInfo) + require.NoError(t, err) + require.Len(t, colVals, 3) + _, d, err := codec.DecodeOne(colVals[0]) + require.NoError(t, err) + require.Equal(t, "abc", d.GetString()) + _, d, err = codec.DecodeOne(colVals[1]) + require.NoError(t, err) + require.Equal(t, int64(3), d.GetInt64()) + _, d, err = codec.DecodeOne(colVals[2]) + require.NoError(t, err) + require.Equal(t, int64(2), d.GetInt64()) + handle, err := tablecodec.DecodeIndexHandle(key, val, 1) + require.NoError(t, err) + require.False(t, handle.IsInt()) + require.Equal(t, commonHandle.Encoded(), handle.Encoded()) + } +} diff --git a/table/tables/index_test.go b/table/tables/index_test.go index 218b3025f33f1..5678ce8b39b18 100644 --- a/table/tables/index_test.go +++ b/table/tables/index_test.go @@ -29,14 +29,11 @@ import ( "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/codec" - "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/mock" - "github.com/pingcap/tidb/util/rowcodec" "github.com/stretchr/testify/require" ) func TestSingleColumnCommonHandle(t *testing.T) { - t.Parallel() tblInfo := buildTableInfo(t, "create table t (a varchar(255) primary key, u int unique, nu int, index nu (nu))") var idxUnique, idxNonUnique table.Index for _, idxInfo := range tblInfo.Indices { @@ -92,82 +89,6 @@ func TestSingleColumnCommonHandle(t *testing.T) { } } -func TestMultiColumnCommonHandle(t *testing.T) { - t.Parallel() - collate.SetNewCollationEnabledForTest(true) - defer collate.SetNewCollationEnabledForTest(false) - tblInfo := buildTableInfo(t, "create table t (a int, b int, u varchar(64) unique, nu varchar(64), primary key (a, b), index nu (nu))") - var idxUnique, idxNonUnique table.Index - for _, idxInfo := range tblInfo.Indices { - idx := tables.NewIndex(tblInfo.ID, tblInfo, idxInfo) - if idxInfo.Name.L == "u" { - idxUnique = idx - } else if idxInfo.Name.L == "nu" { - idxNonUnique = idx - } - } - var a, b *model.ColumnInfo - for _, col := range tblInfo.Columns { - if col.Name.String() == "a" { - a = col - } else if col.Name.String() == "b" { - b = col - } - } - require.NotNil(t, a) - require.NotNil(t, b) - - store, clean := testkit.CreateMockStore(t) - defer clean() - txn, err := store.Begin() - require.NoError(t, err) - mockCtx := mock.NewContext() - sc := mockCtx.GetSessionVars().StmtCtx - // create index for "insert t values (3, 2, "abc", "abc") - idxColVals := types.MakeDatums("abc") - handleColVals := types.MakeDatums(3, 2) - encodedHandle, err := codec.EncodeKey(sc, nil, handleColVals...) - require.NoError(t, err) - commonHandle, err := kv.NewCommonHandle(encodedHandle) - require.NoError(t, err) - _ = idxNonUnique - for _, idx := range []table.Index{idxUnique, idxNonUnique} { - key, _, err := idx.GenIndexKey(sc, idxColVals, commonHandle, nil) - require.NoError(t, err) - _, err = idx.Create(mockCtx, txn, idxColVals, commonHandle, nil) - require.NoError(t, err) - val, err := txn.Get(context.Background(), key) - require.NoError(t, err) - colInfo := tables.BuildRowcodecColInfoForIndexColumns(idx.Meta(), tblInfo) - colInfo = append(colInfo, rowcodec.ColInfo{ - ID: a.ID, - IsPKHandle: false, - Ft: rowcodec.FieldTypeFromModelColumn(a), - }) - colInfo = append(colInfo, rowcodec.ColInfo{ - ID: b.ID, - IsPKHandle: false, - Ft: rowcodec.FieldTypeFromModelColumn(b), - }) - colVals, err := tablecodec.DecodeIndexKV(key, val, 1, tablecodec.HandleDefault, colInfo) - require.NoError(t, err) - require.Len(t, colVals, 3) - _, d, err := codec.DecodeOne(colVals[0]) - require.NoError(t, err) - require.Equal(t, "abc", d.GetString()) - _, d, err = codec.DecodeOne(colVals[1]) - require.NoError(t, err) - require.Equal(t, int64(3), d.GetInt64()) - _, d, err = codec.DecodeOne(colVals[2]) - require.NoError(t, err) - require.Equal(t, int64(2), d.GetInt64()) - handle, err := tablecodec.DecodeIndexHandle(key, val, 1) - require.NoError(t, err) - require.False(t, handle.IsInt()) - require.Equal(t, commonHandle.Encoded(), handle.Encoded()) - } -} - func buildTableInfo(t *testing.T, sql string) *model.TableInfo { stmt, err := parser.New().ParseOneStmt(sql, "", "") require.NoError(t, err) diff --git a/table/tables/main_test.go b/table/tables/main_test.go index be83c73b29f93..ebfceb2bd3bca 100644 --- a/table/tables/main_test.go +++ b/table/tables/main_test.go @@ -23,7 +23,6 @@ import ( func TestMain(m *testing.M) { testbridge.WorkaroundGoCheckFlags() - opts := []goleak.Option{ goleak.IgnoreTopFunction("go.etcd.io/etcd/pkg/logutil.(*MergeLogger).outputLoop"), goleak.IgnoreTopFunction("go.opencensus.io/stats/view.(*worker).start"), diff --git a/table/tables/partition_test.go b/table/tables/partition_test.go index 8c3061c333aca..4d99301684fd3 100644 --- a/table/tables/partition_test.go +++ b/table/tables/partition_test.go @@ -31,7 +31,6 @@ import ( ) func TestPartitionBasic(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() tk := testkit.NewTestKit(t, store) @@ -63,7 +62,6 @@ PARTITION BY RANGE COLUMNS ( id ) ( } func TestPartitionAddRecord(t *testing.T) { - t.Parallel() createTable1 := `CREATE TABLE test.t1 (id int(11), index(id)) PARTITION BY RANGE ( id ) ( PARTITION p0 VALUES LESS THAN (6), @@ -166,7 +164,6 @@ PARTITION BY RANGE ( id ) ( } func TestHashPartitionAddRecord(t *testing.T) { - t.Parallel() store, dom, clean := testkit.CreateMockStoreAndDomain(t) defer clean() tk := testkit.NewTestKit(t, store) @@ -236,7 +233,6 @@ func TestHashPartitionAddRecord(t *testing.T) { // TestPartitionGetPhysicalID tests partition.GetPhysicalID(). func TestPartitionGetPhysicalID(t *testing.T) { - t.Parallel() createTable1 := `CREATE TABLE test.t1 (id int(11), index(id)) PARTITION BY RANGE ( id ) ( PARTITION p0 VALUES LESS THAN (6), @@ -264,7 +260,6 @@ PARTITION BY RANGE ( id ) ( } func TestGeneratePartitionExpr(t *testing.T) { - t.Parallel() store, dom, clean := testkit.CreateMockStoreAndDomain(t) defer clean() tk := testkit.NewTestKit(t, store) @@ -298,7 +293,6 @@ func TestGeneratePartitionExpr(t *testing.T) { } func TestLocateRangeColumnPartitionErr(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() tk := testkit.NewTestKit(t, store) @@ -317,7 +311,6 @@ func TestLocateRangeColumnPartitionErr(t *testing.T) { } func TestLocateRangePartitionErr(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() tk := testkit.NewTestKit(t, store) @@ -336,7 +329,6 @@ func TestLocateRangePartitionErr(t *testing.T) { } func TestLocatePartitionWithExtraHandle(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() tk := testkit.NewTestKit(t, store) @@ -356,7 +348,6 @@ func TestLocatePartitionWithExtraHandle(t *testing.T) { } func TestMultiTableUpdate(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() tk := testkit.NewTestKit(t, store) @@ -380,7 +371,6 @@ func TestMultiTableUpdate(t *testing.T) { } func TestLocatePartitionSingleColumn(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() tk := testkit.NewTestKit(t, store) @@ -411,7 +401,6 @@ func TestLocatePartitionSingleColumn(t *testing.T) { } func TestTimeZoneChange(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() tk := testkit.NewTestKit(t, store) @@ -430,12 +419,12 @@ func TestTimeZoneChange(t *testing.T) { " `id` int(11) NOT NULL,\n" + " `creation_dt` timestamp DEFAULT CURRENT_TIMESTAMP\n" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n" + - "PARTITION BY RANGE ( UNIX_TIMESTAMP(`creation_dt`) ) (\n" + - " PARTITION `p5` VALUES LESS THAN (1578035400),\n" + - " PARTITION `p6` VALUES LESS THAN (1578035700),\n" + - " PARTITION `p7` VALUES LESS THAN (1578036000),\n" + - " PARTITION `p8` VALUES LESS THAN (1578036300),\n" + - " PARTITION `p9` VALUES LESS THAN (MAXVALUE)\n)")) + "PARTITION BY RANGE (UNIX_TIMESTAMP(`creation_dt`))\n" + + "(PARTITION `p5` VALUES LESS THAN (1578035400),\n" + + " PARTITION `p6` VALUES LESS THAN (1578035700),\n" + + " PARTITION `p7` VALUES LESS THAN (1578036000),\n" + + " PARTITION `p8` VALUES LESS THAN (1578036300),\n" + + " PARTITION `p9` VALUES LESS THAN (MAXVALUE))")) tk.MustExec("DROP TABLE timezone_test") // Note that the result of "show create table" varies with time_zone. @@ -445,12 +434,12 @@ func TestTimeZoneChange(t *testing.T) { " `id` int(11) NOT NULL,\n" + " `creation_dt` timestamp DEFAULT CURRENT_TIMESTAMP\n" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n" + - "PARTITION BY RANGE ( UNIX_TIMESTAMP(`creation_dt`) ) (\n" + - " PARTITION `p5` VALUES LESS THAN (1578064200),\n" + - " PARTITION `p6` VALUES LESS THAN (1578064500),\n" + - " PARTITION `p7` VALUES LESS THAN (1578064800),\n" + - " PARTITION `p8` VALUES LESS THAN (1578065100),\n" + - " PARTITION `p9` VALUES LESS THAN (MAXVALUE)\n)")) + "PARTITION BY RANGE (UNIX_TIMESTAMP(`creation_dt`))\n" + + "(PARTITION `p5` VALUES LESS THAN (1578064200),\n" + + " PARTITION `p6` VALUES LESS THAN (1578064500),\n" + + " PARTITION `p7` VALUES LESS THAN (1578064800),\n" + + " PARTITION `p8` VALUES LESS THAN (1578065100),\n" + + " PARTITION `p9` VALUES LESS THAN (MAXVALUE))")) // Change time zone and insert data, check the data locates in the correct partition. tk.MustExec("SET @@time_zone = 'Asia/Shanghai'") @@ -471,7 +460,6 @@ func TestTimeZoneChange(t *testing.T) { } func TestCreatePartitionTableNotSupport(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() tk := testkit.NewTestKit(t, store) @@ -487,7 +475,6 @@ func TestCreatePartitionTableNotSupport(t *testing.T) { } func TestRangePartitionUnderNoUnsigned(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() tk := testkit.NewTestKit(t, store) @@ -513,7 +500,6 @@ func TestRangePartitionUnderNoUnsigned(t *testing.T) { } func TestIntUint(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() tk := testkit.NewTestKit(t, store) @@ -550,7 +536,6 @@ partition p4 values less than (9223372036854775806))`) } func TestHashPartitionAndConditionConflict(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() tk := testkit.NewTestKit(t, store) @@ -576,7 +561,6 @@ func TestHashPartitionAndConditionConflict(t *testing.T) { } func TestHashPartitionInsertValue(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() tk := testkit.NewTestKit(t, store) @@ -595,7 +579,6 @@ func TestHashPartitionInsertValue(t *testing.T) { } func TestIssue21574(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() tk := testkit.NewTestKit(t, store) @@ -609,7 +592,6 @@ func TestIssue21574(t *testing.T) { } func TestIssue24746(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() tk := testkit.NewTestKit(t, store) diff --git a/table/tables/state_remote.go b/table/tables/state_remote.go new file mode 100644 index 0000000000000..aeddd5b972ab2 --- /dev/null +++ b/table/tables/state_remote.go @@ -0,0 +1,359 @@ +// Copyright 2021 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, +// 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. + +package tables + +import ( + "context" + "strconv" + "sync" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/parser/terror" + "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/sqlexec" + "github.com/tikv/client-go/v2/oracle" +) + +// CachedTableLockType define the lock type for cached table +type CachedTableLockType int + +const ( + // CachedTableLockNone means there is no lock. + CachedTableLockNone CachedTableLockType = iota + // CachedTableLockRead is the READ lock type. + CachedTableLockRead + // CachedTableLockIntend is the write INTEND, it exists when the changing READ to WRITE, and the READ lock lease is not expired.. + CachedTableLockIntend + // CachedTableLockWrite is the WRITE lock type. + CachedTableLockWrite +) + +func (l CachedTableLockType) String() string { + switch l { + case CachedTableLockNone: + return "NONE" + case CachedTableLockRead: + return "READ" + case CachedTableLockIntend: + return "INTEND" + case CachedTableLockWrite: + return "WRITE" + } + panic("invalid CachedTableLockType value") +} + +// StateRemote is the interface to control the remote state of the cached table's lock meta information. +type StateRemote interface { + // Load obtain the corresponding lock type and lease value according to the tableID + Load(ctx context.Context, tid int64) (CachedTableLockType, uint64, error) + + // LockForRead try to add a read lock to the table with the specified tableID. + // If this operation succeed, according to the protocol, the TiKV data will not be + // modified until the lease expire. It's safe for the caller to load the table data, + // cache and use the data. + LockForRead(ctx context.Context, tid int64, lease uint64) (bool, error) + + // LockForWrite try to add a write lock to the table with the specified tableID + LockForWrite(ctx context.Context, tid int64) (uint64, error) + + // RenewLease attempt to renew the read / write lock on the table with the specified tableID + RenewLease(ctx context.Context, tid int64, newTs uint64, op RenewLeaseType) (bool, error) +} + +type sqlExec interface { + ExecuteInternal(context.Context, string, ...interface{}) (sqlexec.RecordSet, error) +} + +type stateRemoteHandle struct { + exec sqlExec + sync.Mutex +} + +// NewStateRemote creates a StateRemote object. +func NewStateRemote(exec sqlExec) *stateRemoteHandle { + return &stateRemoteHandle{ + exec: exec, + } +} + +var _ StateRemote = &stateRemoteHandle{} + +func (h *stateRemoteHandle) Load(ctx context.Context, tid int64) (CachedTableLockType, uint64, error) { + lockType, lease, _, err := h.loadRow(ctx, tid) + return lockType, lease, err +} + +func (h *stateRemoteHandle) LockForRead(ctx context.Context, tid int64, ts uint64) ( /*succ*/ bool, error) { + h.Lock() + defer h.Unlock() + succ := false + err := h.runInTxn(ctx, func(ctx context.Context, now uint64) error { + lockType, lease, _, err := h.loadRow(ctx, tid) + if err != nil { + return errors.Trace(err) + } + // The old lock is outdated, clear orphan lock. + if now > lease { + succ = true + if err := h.updateRow(ctx, tid, "READ", ts); err != nil { + return errors.Trace(err) + } + return nil + } + + switch lockType { + case CachedTableLockNone: + case CachedTableLockRead: + case CachedTableLockWrite, CachedTableLockIntend: + return nil + } + succ = true + if ts > lease { // Note the check, don't decrease lease value! + if err := h.updateRow(ctx, tid, "READ", ts); err != nil { + return errors.Trace(err) + } + } + + return nil + }) + return succ, err +} + +// LockForWrite try to add a write lock to the table with the specified tableID, return the write lock lease. +func (h *stateRemoteHandle) LockForWrite(ctx context.Context, tid int64) (uint64, error) { + h.Lock() + defer h.Unlock() + var ret uint64 + for { + waitAndRetry, lease, err := h.lockForWriteOnce(ctx, tid) + if err != nil { + return 0, err + } + if waitAndRetry == 0 { + ret = lease + break + } + time.Sleep(waitAndRetry) + } + return ret, nil +} + +func (h *stateRemoteHandle) lockForWriteOnce(ctx context.Context, tid int64) (waitAndRetry time.Duration, ts uint64, err error) { + err = h.runInTxn(ctx, func(ctx context.Context, now uint64) error { + lockType, lease, oldReadLease, err := h.loadRow(ctx, tid) + if err != nil { + return errors.Trace(err) + } + ts = leaseFromTS(now) + // The lease is outdated, so lock is invalid, clear orphan lock of any kind. + if now > lease { + if err := h.updateRow(ctx, tid, "WRITE", ts); err != nil { + return errors.Trace(err) + } + return nil + } + + // The lease is valid. + switch lockType { + case CachedTableLockNone: + if err = h.updateRow(ctx, tid, "WRITE", ts); err != nil { + return errors.Trace(err) + } + case CachedTableLockRead: + // Change from READ to INTEND + if _, err = h.execSQL(ctx, + "update mysql.table_cache_meta set lock_type='INTEND', oldReadLease=%?, lease=%? where tid=%?", + lease, + ts, + tid); err != nil { + return errors.Trace(err) + } + + // Wait for lease to expire, and then retry. + waitAndRetry = waitForLeaseExpire(lease, now) + case CachedTableLockIntend: + // `now` exceed `oldReadLease` means wait for READ lock lease is done, it's safe to read here. + if now > oldReadLease { + if lockType == CachedTableLockIntend { + if err = h.updateRow(ctx, tid, "WRITE", ts); err != nil { + return errors.Trace(err) + } + } + return nil + } + // Otherwise, the WRITE should wait for the READ lease expire. + // And then retry changing the lock to WRITE + waitAndRetry = waitForLeaseExpire(oldReadLease, now) + } + return nil + }) + + return +} + +func waitForLeaseExpire(oldReadLease, now uint64) time.Duration { + if oldReadLease >= now { + t1 := oracle.GetTimeFromTS(oldReadLease) + t2 := oracle.GetTimeFromTS(now) + waitDuration := t1.Sub(t2) + return waitDuration + } + return 0 +} + +func (h *stateRemoteHandle) RenewLease(ctx context.Context, tid int64, newLease uint64, op RenewLeaseType) (bool, error) { + h.Lock() + defer h.Unlock() + + switch op { + case RenewReadLease: + return h.renewReadLease(ctx, tid, newLease) + case RenewWriteLease: + return h.renewWriteLease(ctx, tid, newLease) + } + return false, errors.New("wrong renew lease type") +} + +func (h *stateRemoteHandle) renewReadLease(ctx context.Context, tid int64, newLease uint64) (bool, error) { + var succ bool + err := h.runInTxn(ctx, func(ctx context.Context, now uint64) error { + lockType, oldLease, _, err := h.loadRow(ctx, tid) + if err != nil { + return errors.Trace(err) + } + if now >= oldLease { + // read lock had already expired, fail to renew + return nil + } + if lockType != CachedTableLockRead { + // Not read lock, fail to renew + return nil + } + + if newLease > oldLease { // lease should never decrease! + err = h.updateRow(ctx, tid, "READ", newLease) + if err != nil { + return errors.Trace(err) + } + } + succ = true + return nil + }) + return succ, err +} + +func (h *stateRemoteHandle) renewWriteLease(ctx context.Context, tid int64, newLease uint64) (bool, error) { + var succ bool + err := h.runInTxn(ctx, func(ctx context.Context, now uint64) error { + lockType, oldLease, _, err := h.loadRow(ctx, tid) + if err != nil { + return errors.Trace(err) + } + if now >= oldLease { + // write lock had already expired, fail to renew + return nil + } + if lockType != CachedTableLockWrite { + // Not write lock, fail to renew + return nil + } + + if newLease > oldLease { // lease should never decrease! + err = h.updateRow(ctx, tid, "WRITE", newLease) + if err != nil { + return errors.Trace(err) + } + } + succ = true + return nil + }) + return succ, err +} + +func (h *stateRemoteHandle) beginTxn(ctx context.Context) error { + _, err := h.execSQL(ctx, "begin") + return err +} + +func (h *stateRemoteHandle) commitTxn(ctx context.Context) error { + _, err := h.execSQL(ctx, "commit") + return err +} + +func (h *stateRemoteHandle) rollbackTxn(ctx context.Context) error { + _, err := h.execSQL(ctx, "rollback") + return err +} + +func (h *stateRemoteHandle) runInTxn(ctx context.Context, fn func(ctx context.Context, txnTS uint64) error) error { + err := h.beginTxn(ctx) + if err != nil { + return errors.Trace(err) + } + + rows, err := h.execSQL(ctx, "select @@tidb_current_ts") + if err != nil { + return errors.Trace(err) + } + resultStr := rows[0].GetString(0) + txnTS, err := strconv.ParseUint(resultStr, 10, 64) + if err != nil { + return errors.Trace(err) + } + + err = fn(ctx, txnTS) + if err != nil { + terror.Log(h.rollbackTxn(ctx)) + return errors.Trace(err) + } + + return h.commitTxn(ctx) +} + +func (h *stateRemoteHandle) loadRow(ctx context.Context, tid int64) (CachedTableLockType, uint64, uint64, error) { + chunkRows, err := h.execSQL(ctx, "select lock_type, lease, oldReadLease from mysql.table_cache_meta where tid = %? for update", tid) + if err != nil { + return 0, 0, 0, errors.Trace(err) + } + if len(chunkRows) != 1 { + return 0, 0, 0, errors.Errorf("table_cache_meta tid not exist %d", tid) + } + col1 := chunkRows[0].GetEnum(0) + // Note, the MySQL enum value start from 1 rather than 0 + lockType := CachedTableLockType(col1.Value - 1) + lease := chunkRows[0].GetUint64(1) + oldReadLease := chunkRows[0].GetUint64(2) + return lockType, lease, oldReadLease, nil +} + +func (h *stateRemoteHandle) updateRow(ctx context.Context, tid int64, lockType string, lease uint64) error { + _, err := h.execSQL(ctx, "update mysql.table_cache_meta set lock_type = %?, lease = %? where tid = %?", lockType, lease, tid) + return err +} + +func (h *stateRemoteHandle) execSQL(ctx context.Context, sql string, args ...interface{}) ([]chunk.Row, error) { + rs, err := h.exec.ExecuteInternal(ctx, sql, args...) + if rs != nil { + defer rs.Close() + } + if err != nil { + return nil, errors.Trace(err) + } + if rs != nil { + return sqlexec.DrainRecordSet(ctx, rs, 1) + } + return nil, nil +} diff --git a/table/tables/state_remote_test.go b/table/tables/state_remote_test.go new file mode 100644 index 0000000000000..dc4e9272b1830 --- /dev/null +++ b/table/tables/state_remote_test.go @@ -0,0 +1,129 @@ +// Copyright 2021 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, +// 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. + +package tables_test + +import ( + "context" + "testing" + "time" + + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/session" + "github.com/pingcap/tidb/table/tables" + "github.com/pingcap/tidb/testkit" + "github.com/stretchr/testify/require" + "github.com/tikv/client-go/v2/oracle" +) + +// initRow add a new record into the cached table meta lock table. +func initRow(ctx context.Context, exec session.Session, tid int) error { + _, err := exec.ExecuteInternal(ctx, "insert ignore into mysql.table_cache_meta values (%?, 'NONE', 0, 0)", tid) + return err +} + +func TestStateRemote(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + se := tk.Session() + + ctx := context.Background() + h := tables.NewStateRemote(se) + + // Check the initial value. + require.NoError(t, initRow(ctx, se, 5)) + lockType, lease, err := h.Load(ctx, 5) + require.NoError(t, err) + require.Equal(t, lockType, tables.CachedTableLockNone) + require.Equal(t, lockType.String(), "NONE") + require.Equal(t, lease, uint64(0)) + + ts, err := se.GetStore().GetOracle().GetTimestamp(ctx, &oracle.Option{TxnScope: kv.GlobalTxnScope}) + require.NoError(t, err) + physicalTime := oracle.GetTimeFromTS(ts) + leaseVal := oracle.GoTimeToTS(physicalTime.Add(200 * time.Millisecond)) + + // Check read lock. + succ, err := h.LockForRead(ctx, 5, leaseVal) + require.NoError(t, err) + require.True(t, succ) + lockType, lease, err = h.Load(ctx, 5) + require.NoError(t, err) + require.Equal(t, lockType, tables.CachedTableLockRead) + require.Equal(t, lockType.String(), "READ") + require.Equal(t, lease, leaseVal) + + // LockForRead when read lock is hold. + // This operation equals to renew lease. + succ, err = h.LockForRead(ctx, 5, leaseVal+1) + require.NoError(t, err) + require.True(t, succ) + lockType, lease, err = h.Load(ctx, 5) + require.NoError(t, err) + require.Equal(t, lockType, tables.CachedTableLockRead) + require.Equal(t, lockType.String(), "READ") + require.Equal(t, lease, leaseVal+1) + + // Renew read lock lease operation. + leaseVal = oracle.GoTimeToTS(physicalTime.Add(400 * time.Millisecond)) + succ, err = h.RenewLease(ctx, 5, leaseVal, tables.RenewReadLease) + require.NoError(t, err) + require.True(t, succ) + lockType, lease, err = h.Load(ctx, 5) + require.NoError(t, err) + require.Equal(t, lockType, tables.CachedTableLockRead) + require.Equal(t, lockType.String(), "READ") + require.Equal(t, lease, leaseVal) + + // Check write lock. + writeLease, err := h.LockForWrite(ctx, 5) + require.NoError(t, err) + lockType, lease, err = h.Load(ctx, 5) + require.NoError(t, err) + require.Equal(t, lockType, tables.CachedTableLockWrite) + require.Equal(t, lockType.String(), "WRITE") + require.Equal(t, writeLease, lease) + require.Greater(t, writeLease, leaseVal) + + // Lock for write again + writeLease, err = h.LockForWrite(ctx, 5) + require.NoError(t, err) + lockType, _, err = h.Load(ctx, 5) + require.NoError(t, err) + require.Equal(t, lockType, tables.CachedTableLockWrite) + require.Equal(t, lockType.String(), "WRITE") + + // Renew read lock lease should fail when the write lock is hold. + succ, err = h.RenewLease(ctx, 5, leaseVal, tables.RenewReadLease) + require.NoError(t, err) + require.False(t, succ) + + // Acquire read lock should also fail when the write lock is hold. + succ, err = h.LockForRead(ctx, 5, leaseVal) + require.NoError(t, err) + require.False(t, succ) + + // Renew write lease. + succ, err = h.RenewLease(ctx, 5, writeLease+1, tables.RenewWriteLease) + require.NoError(t, err) + require.True(t, succ) + + lockType, lease, err = h.Load(ctx, 5) + require.NoError(t, err) + require.Equal(t, lockType, tables.CachedTableLockWrite) + require.Equal(t, lockType.String(), "WRITE") + require.Equal(t, lease, writeLease+1) +} diff --git a/table/tables/tables.go b/table/tables/tables.go index 967b7a0eb12b0..716b2e879cbcc 100644 --- a/table/tables/tables.go +++ b/table/tables/tables.go @@ -84,6 +84,13 @@ func MockTableFromMeta(tblInfo *model.TableInfo) table.Table { var t TableCommon initTableCommon(&t, tblInfo, tblInfo.ID, columns, nil) + if tblInfo.TableCacheStatusType != model.TableCacheStatusDisable { + ret, err := newCachedTable(&t) + if err != nil { + return nil + } + return ret + } if tblInfo.GetPartitionInfo() == nil { if err := initTableIndices(&t); err != nil { return nil @@ -145,9 +152,11 @@ func TableFromMeta(allocs autoid.Allocators, tblInfo *model.TableInfo) (table.Ta if err := initTableIndices(&t); err != nil { return nil, err } + if tblInfo.TableCacheStatusType != model.TableCacheStatusDisable { + return newCachedTable(&t) + } return &t, nil } - return newPartitionedTable(&t, tblInfo) } diff --git a/table/tables/tables_test.go b/table/tables/tables_test.go index 0496482624112..b093e96c6be38 100644 --- a/table/tables/tables_test.go +++ b/table/tables/tables_test.go @@ -82,7 +82,6 @@ func (m mockPumpClient) PullBinlogs(ctx context.Context, in *binlog.PullBinlogRe } func TestBasic(t *testing.T) { - t.Parallel() store, dom, clean := testkit.CreateMockStoreAndDomain(t) defer clean() tk := testkit.NewTestKit(t, store) @@ -183,7 +182,6 @@ func countEntriesWithPrefix(ctx sessionctx.Context, prefix []byte) (int, error) } func TestTypes(t *testing.T) { - t.Parallel() ctx := context.Background() store, dom, clean := testkit.CreateMockStoreAndDomain(t) defer clean() @@ -196,7 +194,7 @@ func TestTypes(t *testing.T) { require.NoError(t, err) rs, err := tk.Session().Execute(ctx, "select * from test.t where c1 = 1") require.NoError(t, err) - req := rs[0].NewChunk() + req := rs[0].NewChunk(nil) err = rs[0].Next(ctx, req) require.NoError(t, err) require.False(t, req.NumRows() == 0) @@ -210,7 +208,7 @@ func TestTypes(t *testing.T) { require.NoError(t, err) rs, err = tk.Session().Execute(ctx, "select * from test.t where c1 = 1") require.NoError(t, err) - req = rs[0].NewChunk() + req = rs[0].NewChunk(nil) err = rs[0].Next(ctx, req) require.NoError(t, err) require.False(t, req.NumRows() == 0) @@ -226,7 +224,7 @@ func TestTypes(t *testing.T) { require.NoError(t, err) rs, err = tk.Session().Execute(ctx, "select c1 + 1 from test.t where c1 = 1") require.NoError(t, err) - req = rs[0].NewChunk() + req = rs[0].NewChunk(nil) err = rs[0].Next(ctx, req) require.NoError(t, err) require.False(t, req.NumRows() == 0) @@ -237,7 +235,6 @@ func TestTypes(t *testing.T) { } func TestUniqueIndexMultipleNullEntries(t *testing.T) { - t.Parallel() ctx := context.Background() store, dom, clean := testkit.CreateMockStoreAndDomain(t) defer clean() @@ -279,7 +276,6 @@ func TestUniqueIndexMultipleNullEntries(t *testing.T) { } func TestRowKeyCodec(t *testing.T) { - t.Parallel() tableVal := []struct { tableID int64 h int64 @@ -321,7 +317,6 @@ func TestRowKeyCodec(t *testing.T) { } func TestUnsignedPK(t *testing.T) { - t.Parallel() store, dom, clean := testkit.CreateMockStoreAndDomain(t) defer clean() tk := testkit.NewTestKit(t, store) @@ -346,7 +341,6 @@ func TestUnsignedPK(t *testing.T) { } func TestIterRecords(t *testing.T) { - t.Parallel() store, dom, clean := testkit.CreateMockStoreAndDomain(t) defer clean() tk := testkit.NewTestKit(t, store) @@ -373,7 +367,6 @@ func TestIterRecords(t *testing.T) { } func TestTableFromMeta(t *testing.T) { - t.Parallel() store, dom, clean := testkit.CreateMockStoreAndDomain(t) defer clean() tk := testkit.NewTestKit(t, store) @@ -427,7 +420,6 @@ func TestTableFromMeta(t *testing.T) { } func TestShardRowIDBitsStep(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() tk := testkit.NewTestKit(t, store) @@ -447,7 +439,6 @@ func TestShardRowIDBitsStep(t *testing.T) { } func TestHiddenColumn(t *testing.T) { - t.Parallel() store, dom, clean := testkit.CreateMockStoreAndDomain(t) defer clean() tk := testkit.NewTestKit(t, store) @@ -615,7 +606,6 @@ func TestHiddenColumn(t *testing.T) { } func TestAddRecordWithCtx(t *testing.T) { - t.Parallel() store, dom, clean := testkit.CreateMockStoreAndDomain(t) defer clean() tk := testkit.NewTestKit(t, store) @@ -662,7 +652,6 @@ func TestAddRecordWithCtx(t *testing.T) { } func TestConstraintCheckForUniqueIndex(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store) @@ -718,7 +707,6 @@ func TestConstraintCheckForUniqueIndex(t *testing.T) { } func TestViewColumns(t *testing.T) { - t.Parallel() store, clean := testkit.CreateMockStore(t) defer clean() tk := testkit.NewTestKit(t, store) diff --git a/table/temptable/ddl.go b/table/temptable/ddl.go index 1ecf5f8124dd0..fddd0bbbeabf5 100644 --- a/table/temptable/ddl.go +++ b/table/temptable/ddl.go @@ -35,7 +35,7 @@ import ( // TemporaryTableDDL is an interface providing ddl operations for temporary table type TemporaryTableDDL interface { - CreateLocalTemporaryTable(schema model.CIStr, info *model.TableInfo) error + CreateLocalTemporaryTable(db *model.DBInfo, info *model.TableInfo) error DropLocalTemporaryTable(schema model.CIStr, tblName model.CIStr) error TruncateLocalTemporaryTable(schema model.CIStr, tblName model.CIStr) error } @@ -45,7 +45,7 @@ type temporaryTableDDL struct { sctx sessionctx.Context } -func (d *temporaryTableDDL) CreateLocalTemporaryTable(schema model.CIStr, info *model.TableInfo) error { +func (d *temporaryTableDDL) CreateLocalTemporaryTable(db *model.DBInfo, info *model.TableInfo) error { if _, err := ensureSessionData(d.sctx); err != nil { return err } @@ -55,7 +55,7 @@ func (d *temporaryTableDDL) CreateLocalTemporaryTable(schema model.CIStr, info * return err } - return ensureLocalTemporaryTables(d.sctx).AddTable(schema, tbl) + return ensureLocalTemporaryTables(d.sctx).AddTable(db, tbl) } func (d *temporaryTableDDL) DropLocalTemporaryTable(schema model.CIStr, tblName model.CIStr) error { @@ -81,8 +81,9 @@ func (d *temporaryTableDDL) TruncateLocalTemporaryTable(schema model.CIStr, tblN } localTempTables := getLocalTemporaryTables(d.sctx) + db, _ := localTempTables.SchemaByTable(oldTblInfo) localTempTables.RemoveTable(schema, tblName) - if err = localTempTables.AddTable(schema, newTbl); err != nil { + if err = localTempTables.AddTable(db, newTbl); err != nil { return err } @@ -145,7 +146,7 @@ func ensureSessionData(sctx sessionctx.Context) (variable.TemporaryTableData, er sessVars := sctx.GetSessionVars() if sessVars.TemporaryTableData == nil { // Create this txn just for getting a MemBuffer. It's a little tricky - bufferTxn, err := sctx.GetStore().BeginWithOption(tikv.DefaultStartTSOption().SetStartTS(0)) + bufferTxn, err := sctx.GetStore().Begin(tikv.WithStartTS(0)) if err != nil { return nil, err } diff --git a/table/temptable/ddl_test.go b/table/temptable/ddl_test.go index 6fdd5afa9e071..1418a35ad83d1 100644 --- a/table/temptable/ddl_test.go +++ b/table/temptable/ddl_test.go @@ -45,13 +45,13 @@ func createTestSuite(t *testing.T) (sessionctx.Context, *temporaryTableDDL, func } func TestAddLocalTemporaryTable(t *testing.T) { - t.Parallel() - sctx, ddl, clean := createTestSuite(t) defer clean() sessVars := sctx.GetSessionVars() + db1 := newMockSchema("db1") + db2 := newMockSchema("db2") tbl1 := newMockTable("t1") tbl2 := newMockTable("t2") @@ -59,7 +59,7 @@ func TestAddLocalTemporaryTable(t *testing.T) { require.Nil(t, sessVars.TemporaryTableData) // insert t1 - err := ddl.CreateLocalTemporaryTable(model.NewCIStr("db1"), tbl1) + err := ddl.CreateLocalTemporaryTable(db1, tbl1) require.NoError(t, err) require.NotNil(t, sessVars.LocalTemporaryTables) require.NotNil(t, sessVars.TemporaryTableData) @@ -69,7 +69,7 @@ func TestAddLocalTemporaryTable(t *testing.T) { require.Equal(t, got.Meta(), tbl1) // insert t2 with data - err = ddl.CreateLocalTemporaryTable(model.NewCIStr("db1"), tbl2) + err = ddl.CreateLocalTemporaryTable(db1, tbl2) require.NoError(t, err) require.Equal(t, int64(2), tbl2.ID) got, exists = sessVars.LocalTemporaryTables.(*infoschema.LocalTemporaryTables).TableByName(model.NewCIStr("db1"), model.NewCIStr("t2")) @@ -87,14 +87,14 @@ func TestAddLocalTemporaryTable(t *testing.T) { // insert dup table tbl1x := newMockTable("t1") - err = ddl.CreateLocalTemporaryTable(model.NewCIStr("db1"), tbl1x) + err = ddl.CreateLocalTemporaryTable(db1, tbl1x) require.True(t, infoschema.ErrTableExists.Equal(err)) got, exists = sessVars.LocalTemporaryTables.(*infoschema.LocalTemporaryTables).TableByName(model.NewCIStr("db1"), model.NewCIStr("t1")) require.True(t, exists) require.Equal(t, got.Meta(), tbl1) // insert should be success for same table name in different db - err = ddl.CreateLocalTemporaryTable(model.NewCIStr("db2"), tbl1x) + err = ddl.CreateLocalTemporaryTable(db2, tbl1x) require.NoError(t, err) got, exists = sessVars.LocalTemporaryTables.(*infoschema.LocalTemporaryTables).TableByName(model.NewCIStr("db2"), model.NewCIStr("t1")) require.Equal(t, int64(4), got.Meta().ID) @@ -108,12 +108,11 @@ func TestAddLocalTemporaryTable(t *testing.T) { } func TestRemoveLocalTemporaryTable(t *testing.T) { - t.Parallel() - sctx, ddl, clean := createTestSuite(t) defer clean() sessVars := sctx.GetSessionVars() + db1 := newMockSchema("db1") // remove when empty err := ddl.DropLocalTemporaryTable(model.NewCIStr("db1"), model.NewCIStr("t1")) @@ -121,7 +120,7 @@ func TestRemoveLocalTemporaryTable(t *testing.T) { // add one table tbl1 := newMockTable("t1") - err = ddl.CreateLocalTemporaryTable(model.NewCIStr("db1"), tbl1) + err = ddl.CreateLocalTemporaryTable(db1, tbl1) require.NoError(t, err) require.Equal(t, int64(1), tbl1.ID) k := tablecodec.EncodeRowKeyWithHandle(1, kv.IntHandle(1)) @@ -156,12 +155,11 @@ func TestRemoveLocalTemporaryTable(t *testing.T) { } func TestTruncateLocalTemporaryTable(t *testing.T) { - t.Parallel() - sctx, ddl, clean := createTestSuite(t) defer clean() sessVars := sctx.GetSessionVars() + db1 := newMockSchema("db1") // truncate when empty err := ddl.TruncateLocalTemporaryTable(model.NewCIStr("db1"), model.NewCIStr("t1")) @@ -171,7 +169,7 @@ func TestTruncateLocalTemporaryTable(t *testing.T) { // add one table tbl1 := newMockTable("t1") - err = ddl.CreateLocalTemporaryTable(model.NewCIStr("db1"), tbl1) + err = ddl.CreateLocalTemporaryTable(db1, tbl1) require.Equal(t, int64(1), tbl1.ID) require.NoError(t, err) k := tablecodec.EncodeRowKeyWithHandle(1, kv.IntHandle(1)) @@ -194,7 +192,7 @@ func TestTruncateLocalTemporaryTable(t *testing.T) { // insert a new tbl tbl2 := newMockTable("t2") - err = ddl.CreateLocalTemporaryTable(model.NewCIStr("db1"), tbl2) + err = ddl.CreateLocalTemporaryTable(db1, tbl2) require.Equal(t, int64(2), tbl2.ID) require.NoError(t, err) k2 := tablecodec.EncodeRowKeyWithHandle(2, kv.IntHandle(1)) @@ -225,3 +223,7 @@ func newMockTable(tblName string) *model.TableInfo { tblInfo := &model.TableInfo{Name: model.NewCIStr(tblName), Columns: []*model.ColumnInfo{c1, c2}, PKIsHandle: true} return tblInfo } + +func newMockSchema(schemaName string) *model.DBInfo { + return &model.DBInfo{ID: 10, Name: model.NewCIStr(schemaName), State: model.StatePublic} +} diff --git a/table/temptable/interceptor_test.go b/table/temptable/interceptor_test.go index bb5b8868a753e..f75ea1bf0bd6d 100644 --- a/table/temptable/interceptor_test.go +++ b/table/temptable/interceptor_test.go @@ -49,7 +49,6 @@ func encodeTableKey(tblID int64, suffix ...byte) kv.Key { } func TestGetKeyAccessedTableID(t *testing.T) { - t.Parallel() tbPrefix := tablecodec.TablePrefix() prefix0 := encodeTableKey(0) prefixMax := encodeTableKey(math.MaxInt64) @@ -114,7 +113,6 @@ func TestGetKeyAccessedTableID(t *testing.T) { } func TestGetRangeAccessedTableID(t *testing.T) { - t.Parallel() cases := []struct { start kv.Key end kv.Key @@ -219,7 +217,6 @@ func TestGetRangeAccessedTableID(t *testing.T) { } func TestNotTableRange(t *testing.T) { - t.Parallel() falseCases := [][]kv.Key{ {nil, nil}, {nil, encodeTableKey(1, 0)}, @@ -254,7 +251,6 @@ func TestNotTableRange(t *testing.T) { } func TestGetSessionTemporaryTableKey(t *testing.T) { - t.Parallel() localTempTableData := []*kv.Entry{ {Key: encodeTableKey(5), Value: []byte("v5")}, {Key: encodeTableKey(5, 0), Value: []byte("v50")}, @@ -331,7 +327,6 @@ func TestGetSessionTemporaryTableKey(t *testing.T) { } func TestInterceptorTemporaryTableInfoByID(t *testing.T) { - t.Parallel() is := newMockedInfoSchema(t). AddTable(model.TempTableNone, 1, 5). AddTable(model.TempTableGlobal, 2, 6). @@ -381,7 +376,6 @@ func TestInterceptorTemporaryTableInfoByID(t *testing.T) { } func TestInterceptorOnGet(t *testing.T) { - t.Parallel() is := newMockedInfoSchema(t). AddTable(model.TempTableNone, 1). AddTable(model.TempTableGlobal, 3). @@ -528,7 +522,6 @@ func TestInterceptorOnGet(t *testing.T) { } func TestInterceptorBatchGetTemporaryTableKeys(t *testing.T) { - t.Parallel() localTempTableData := []*kv.Entry{ {Key: encodeTableKey(5), Value: []byte("v5")}, {Key: encodeTableKey(5, 0), Value: []byte("v50")}, @@ -712,7 +705,6 @@ func TestInterceptorBatchGetTemporaryTableKeys(t *testing.T) { } func TestInterceptorOnBatchGet(t *testing.T) { - t.Parallel() is := newMockedInfoSchema(t). AddTable(model.TempTableNone, 1). AddTable(model.TempTableGlobal, 3). @@ -914,7 +906,6 @@ func TestInterceptorOnBatchGet(t *testing.T) { } func TestCreateUnionIter(t *testing.T) { - t.Parallel() retriever := newMockedRetriever(t).SetData([]*kv.Entry{ {Key: kv.Key("k1"), Value: []byte("v1")}, {Key: kv.Key("k10"), Value: []byte("")}, @@ -1055,7 +1046,6 @@ func TestCreateUnionIter(t *testing.T) { } func TestErrorCreateUnionIter(t *testing.T) { - t.Parallel() retriever := newMockedRetriever(t).SetAllowedMethod("Iter", "IterReverse").SetData([]*kv.Entry{ {Key: kv.Key("k1"), Value: []byte("")}, }) @@ -1193,7 +1183,6 @@ func checkCreatedIterClosed(t *testing.T, retriever *mockedRetriever, snap *mock } func TestIterTable(t *testing.T) { - t.Parallel() is := newMockedInfoSchema(t). AddTable(model.TempTableNone, 1). AddTable(model.TempTableGlobal, 3). @@ -1346,7 +1335,6 @@ func TestIterTable(t *testing.T) { } func TestOnIter(t *testing.T) { - t.Parallel() is := newMockedInfoSchema(t). AddTable(model.TempTableNone, 1). AddTable(model.TempTableGlobal, 3). @@ -1556,7 +1544,6 @@ func TestOnIter(t *testing.T) { } func TestOnIterReverse(t *testing.T) { - t.Parallel() is := newMockedInfoSchema(t). AddTable(model.TempTableNone, 1). AddTable(model.TempTableGlobal, 3). diff --git a/tablecodec/rowindexcodec/main_test.go b/tablecodec/rowindexcodec/main_test.go new file mode 100644 index 0000000000000..55b15ba96e15d --- /dev/null +++ b/tablecodec/rowindexcodec/main_test.go @@ -0,0 +1,27 @@ +// Copyright 2021 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, +// 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. + +package rowindexcodec + +import ( + "testing" + + "github.com/pingcap/tidb/util/testbridge" + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + testbridge.WorkaroundGoCheckFlags() + goleak.VerifyTestMain(m) +} diff --git a/tablecodec/rowindexcodec/rowindexcodec.go b/tablecodec/rowindexcodec/rowindexcodec.go new file mode 100644 index 0000000000000..924d3fff2e5cf --- /dev/null +++ b/tablecodec/rowindexcodec/rowindexcodec.go @@ -0,0 +1,57 @@ +// Copyright 2021 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, +// 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. + +package rowindexcodec + +import ( + "bytes" +) + +// KeyKind is a specific type of key, mainly used to distinguish row/index. +type KeyKind int + +const ( + // KeyKindUnknown indicates that this key is unknown type. + KeyKindUnknown KeyKind = iota + // KeyKindRow means that this key belongs to row. + KeyKindRow + // KeyKindIndex means that this key belongs to index. + KeyKindIndex +) + +var ( + tablePrefix = []byte{'t'} + rowPrefix = []byte("_r") + indexPrefix = []byte("_i") +) + +// GetKeyKind returns the KeyKind that matches the key in the minimalist way. +func GetKeyKind(key []byte) KeyKind { + // [ TABLE_PREFIX | TABLE_ID | ROW_PREFIX (INDEX_PREFIX) | ROW_ID (INDEX_ID) | ... ] (name) + // [ 1 | 8 | 2 | 8 | ... ] (byte) + if len(key) < 11 { + return KeyKindUnknown + } + if !bytes.HasPrefix(key, tablePrefix) { + return KeyKindUnknown + } + key = key[9:] + if bytes.HasPrefix(key, rowPrefix) { + return KeyKindRow + } + if bytes.HasPrefix(key, indexPrefix) { + return KeyKindIndex + } + return KeyKindUnknown +} diff --git a/tablecodec/rowindexcodec/rowindexcodec_test.go b/tablecodec/rowindexcodec/rowindexcodec_test.go new file mode 100644 index 0000000000000..146fc80d9bee0 --- /dev/null +++ b/tablecodec/rowindexcodec/rowindexcodec_test.go @@ -0,0 +1,28 @@ +// Copyright 2021 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, +// 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. + +package rowindexcodec + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestGetKeyKind(t *testing.T) { + require.Equal(t, KeyKindRow, GetKeyKind([]byte{116, 128, 0, 0, 0, 0, 0, 0, 0, 95, 114})) + require.Equal(t, KeyKindIndex, GetKeyKind([]byte{116, 128, 0, 0, 0, 0, 0, 0, 0, 95, 105, 128, 0, 0, 0, 0, 0, 0, 0})) + require.Equal(t, KeyKindUnknown, GetKeyKind([]byte(""))) + require.Equal(t, KeyKindUnknown, GetKeyKind(nil)) +} diff --git a/tablecodec/tablecodec.go b/tablecodec/tablecodec.go index 79c73713583e1..f610e09104572 100644 --- a/tablecodec/tablecodec.go +++ b/tablecodec/tablecodec.go @@ -980,6 +980,11 @@ func IsIndexKey(k []byte) bool { return len(k) > 11 && k[0] == 't' && k[10] == 'i' } +// IsTableKey is used to check whether the key is a table key. +func IsTableKey(k []byte) bool { + return len(k) == 9 && k[0] == 't' +} + // IsUntouchedIndexKValue uses to check whether the key is index key, and the value is untouched, // since the untouched index key/value is no need to commit. func IsUntouchedIndexKValue(k, v []byte) bool { @@ -1154,7 +1159,8 @@ func TryGetCommonPkColumnRestoredIds(tbl *model.TableInfo) []int64 { // GenIndexValueForClusteredIndexVersion1 generates the index value for the clustered index with version 1(New in v5.0.0). func GenIndexValueForClusteredIndexVersion1(sc *stmtctx.StatementContext, tblInfo *model.TableInfo, idxInfo *model.IndexInfo, IdxValNeedRestoredData bool, distinct bool, untouched bool, indexedValues []types.Datum, h kv.Handle, partitionID int64, handleRestoredData []types.Datum) ([]byte, error) { - idxVal := make([]byte, 1) + idxVal := make([]byte, 0) + idxVal = append(idxVal, 0) tailLen := 0 // Version info. idxVal = append(idxVal, IndexVersionFlag) @@ -1211,7 +1217,8 @@ func GenIndexValueForClusteredIndexVersion1(sc *stmtctx.StatementContext, tblInf // genIndexValueVersion0 create index value for both local and global index. func genIndexValueVersion0(sc *stmtctx.StatementContext, tblInfo *model.TableInfo, idxInfo *model.IndexInfo, IdxValNeedRestoredData bool, distinct bool, untouched bool, indexedValues []types.Datum, h kv.Handle, partitionID int64) ([]byte, error) { - idxVal := make([]byte, 1) + idxVal := make([]byte, 0) + idxVal = append(idxVal, 0) newEncode := false tailLen := 0 if !h.IsInt() && distinct { diff --git a/tablecodec/tablecodec_test.go b/tablecodec/tablecodec_test.go index 54d4eeb816632..68bc669ce710b 100644 --- a/tablecodec/tablecodec_test.go +++ b/tablecodec/tablecodec_test.go @@ -27,6 +27,7 @@ import ( "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/rowcodec" "github.com/stretchr/testify/require" ) @@ -34,7 +35,6 @@ import ( // TestTableCodec tests some functions in package tablecodec // TODO: add more tests. func TestTableCodec(t *testing.T) { - t.Parallel() key := EncodeRowKey(1, codec.EncodeInt(nil, 2)) h, err := DecodeRowKey(key) require.NoError(t, err) @@ -46,6 +46,20 @@ func TestTableCodec(t *testing.T) { require.Equal(t, int64(2), h.IntValue()) } +// https://github.com/pingcap/tidb/issues/27687. +func TestTableCodecInvalid(t *testing.T) { + tableID := int64(100) + buf := make([]byte, 0, 11) + buf = append(buf, 't') + buf = codec.EncodeInt(buf, tableID) + buf = append(buf, '_', 'r') + buf = codec.EncodeInt(buf, -9078412423848787968) + buf = append(buf, '0') + _, err := DecodeRowKey(buf) + require.NotNil(t, err) + require.Equal(t, "invalid encoded key", err.Error()) +} + // column is a structure used for test type column struct { id int64 @@ -53,7 +67,6 @@ type column struct { } func TestRowCodec(t *testing.T) { - t.Parallel() c1 := &column{id: 1, tp: types.NewFieldType(mysql.TypeLonglong)} c2 := &column{id: 2, tp: types.NewFieldType(mysql.TypeVarchar)} c3 := &column{id: 3, tp: types.NewFieldType(mysql.TypeNewDecimal)} @@ -93,7 +106,7 @@ func TestRowCodec(t *testing.T) { for i, col := range cols { v, ok := r[col.id] require.True(t, ok) - equal, err1 := v.CompareDatum(sc, &row[i]) + equal, err1 := v.Compare(sc, &row[i], collate.GetBinaryCollator()) require.NoError(t, err1) require.Equalf(t, 0, equal, "expect: %v, got %v", row[i], v) } @@ -107,7 +120,7 @@ func TestRowCodec(t *testing.T) { for i, col := range cols { v, ok := r[col.id] require.True(t, ok) - equal, err1 := v.CompareDatum(sc, &row[i]) + equal, err1 := v.Compare(sc, &row[i], collate.GetBinaryCollator()) require.NoError(t, err1) require.Equal(t, 0, equal) } @@ -125,7 +138,7 @@ func TestRowCodec(t *testing.T) { } v, ok := r[col.id] require.True(t, ok) - equal, err1 := v.CompareDatum(sc, &row[i]) + equal, err1 := v.Compare(sc, &row[i], collate.GetBinaryCollator()) require.NoError(t, err1) require.Equal(t, 0, equal) } @@ -141,7 +154,6 @@ func TestRowCodec(t *testing.T) { } func TestDecodeColumnValue(t *testing.T) { - t.Parallel() sc := &stmtctx.StatementContext{TimeZone: time.Local} // test timestamp @@ -154,7 +166,7 @@ func TestDecodeColumnValue(t *testing.T) { tp := types.NewFieldType(mysql.TypeTimestamp) d1, err := DecodeColumnValue(bs, tp, sc.TimeZone) require.NoError(t, err) - cmp, err := d1.CompareDatum(sc, &d) + cmp, err := d1.Compare(sc, &d, collate.GetBinaryCollator()) require.NoError(t, err) require.Equal(t, 0, cmp) @@ -171,7 +183,7 @@ func TestDecodeColumnValue(t *testing.T) { tp.Elems = elems d1, err = DecodeColumnValue(bs, tp, sc.TimeZone) require.NoError(t, err) - cmp, err = d1.CompareDatum(sc, &d) + cmp, err = d1.Compare(sc, &d, collate.GetCollator(tp.Collate)) require.NoError(t, err) require.Equal(t, 0, cmp) @@ -186,7 +198,7 @@ func TestDecodeColumnValue(t *testing.T) { tp.Flen = 24 d1, err = DecodeColumnValue(bs, tp, sc.TimeZone) require.NoError(t, err) - cmp, err = d1.CompareDatum(sc, &d) + cmp, err = d1.Compare(sc, &d, collate.GetBinaryCollator()) require.NoError(t, err) require.Equal(t, 0, cmp) @@ -200,35 +212,33 @@ func TestDecodeColumnValue(t *testing.T) { tp = types.NewFieldType(mysql.TypeEnum) d1, err = DecodeColumnValue(bs, tp, sc.TimeZone) require.NoError(t, err) - cmp, err = d1.CompareDatum(sc, &d) + cmp, err = d1.Compare(sc, &d, collate.GetCollator(tp.Collate)) require.NoError(t, err) require.Equal(t, 0, cmp) } func TestUnflattenDatums(t *testing.T) { - t.Parallel() sc := &stmtctx.StatementContext{TimeZone: time.UTC} input := types.MakeDatums(int64(1)) tps := []*types.FieldType{types.NewFieldType(mysql.TypeLonglong)} output, err := UnflattenDatums(input, tps, sc.TimeZone) require.NoError(t, err) - cmp, err := input[0].CompareDatum(sc, &output[0]) + cmp, err := input[0].Compare(sc, &output[0], collate.GetBinaryCollator()) require.NoError(t, err) require.Equal(t, 0, cmp) - input = []types.Datum{types.NewCollationStringDatum("aaa", "utf8mb4_unicode_ci", 0)} + input = []types.Datum{types.NewCollationStringDatum("aaa", "utf8mb4_unicode_ci")} tps = []*types.FieldType{types.NewFieldType(mysql.TypeBlob)} tps[0].Collate = "utf8mb4_unicode_ci" output, err = UnflattenDatums(input, tps, sc.TimeZone) require.NoError(t, err) - cmp, err = input[0].CompareDatum(sc, &output[0]) + cmp, err = input[0].Compare(sc, &output[0], collate.GetBinaryCollator()) require.NoError(t, err) require.Equal(t, 0, cmp) require.Equal(t, "utf8mb4_unicode_ci", output[0].Collation()) } func TestTimeCodec(t *testing.T) { - t.Parallel() c1 := &column{id: 1, tp: types.NewFieldType(mysql.TypeLonglong)} c2 := &column{id: 2, tp: types.NewFieldType(mysql.TypeVarchar)} c3 := &column{id: 3, tp: types.NewFieldType(mysql.TypeTimestamp)} @@ -271,14 +281,13 @@ func TestTimeCodec(t *testing.T) { for i, col := range cols { v, ok := r[col.id] require.True(t, ok) - equal, err1 := v.CompareDatum(sc, &row[i]) + equal, err1 := v.Compare(sc, &row[i], collate.GetBinaryCollator()) require.Nil(t, err1) require.Equal(t, 0, equal) } } func TestCutRow(t *testing.T) { - t.Parallel() var err error c1 := &column{id: 1, tp: types.NewFieldType(mysql.TypeLonglong)} c2 := &column{id: 2, tp: types.NewFieldType(mysql.TypeVarchar)} @@ -331,7 +340,6 @@ func TestCutRow(t *testing.T) { } func TestCutKeyNew(t *testing.T) { - t.Parallel() values := []types.Datum{types.NewIntDatum(1), types.NewBytesDatum([]byte("abc")), types.NewFloat64Datum(5.5)} handle := types.NewIntDatum(100) values = append(values, handle) @@ -354,7 +362,6 @@ func TestCutKeyNew(t *testing.T) { } func TestCutKey(t *testing.T) { - t.Parallel() colIDs := []int64{1, 2, 3} values := []types.Datum{types.NewIntDatum(1), types.NewBytesDatum([]byte("abc")), types.NewFloat64Datum(5.5)} handle := types.NewIntDatum(100) @@ -391,7 +398,6 @@ func TestDecodeBadDecical(t *testing.T) { } func TestIndexKey(t *testing.T) { - t.Parallel() tableID := int64(4) indexID := int64(5) indexKey := EncodeIndexSeekKey(tableID, indexID, []byte{}) @@ -403,7 +409,6 @@ func TestIndexKey(t *testing.T) { } func TestRecordKey(t *testing.T) { - t.Parallel() tableID := int64(55) tableKey := EncodeRowKeyWithHandle(tableID, kv.IntHandle(math.MaxUint32)) tTableID, _, isRecordKey, err := DecodeKeyHead(tableKey) @@ -431,7 +436,6 @@ func TestRecordKey(t *testing.T) { } func TestPrefix(t *testing.T) { - t.Parallel() const tableID int64 = 66 key := EncodeTablePrefix(tableID) tTableID := DecodeTableID(key) @@ -457,7 +461,6 @@ func TestPrefix(t *testing.T) { } func TestDecodeIndexKey(t *testing.T) { - t.Parallel() tableID := int64(4) indexID := int64(5) values := []types.Datum{ @@ -492,7 +495,6 @@ func TestDecodeIndexKey(t *testing.T) { } func TestCutPrefix(t *testing.T) { - t.Parallel() key := EncodeTableIndexPrefix(42, 666) res := CutRowKeyPrefix(key) require.Equal(t, []byte{0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x9a}, res) @@ -501,7 +503,6 @@ func TestCutPrefix(t *testing.T) { } func TestRange(t *testing.T) { - t.Parallel() s1, e1 := GetTableHandleKeyRange(22) s2, e2 := GetTableHandleKeyRange(23) require.Less(t, string(s1), string(e1)) @@ -516,7 +517,6 @@ func TestRange(t *testing.T) { } func TestDecodeAutoIDMeta(t *testing.T) { - t.Parallel() keyBytes := []byte{0x6d, 0x44, 0x42, 0x3a, 0x35, 0x36, 0x0, 0x0, 0x0, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, 0x54, 0x49, 0x44, 0x3a, 0x31, 0x30, 0x38, 0x0, 0xfe} key, field, err := DecodeMetaKey(keyBytes) require.NoError(t, err) @@ -563,7 +563,6 @@ func BenchmarkEncodeValue(b *testing.B) { } func TestError(t *testing.T) { - t.Parallel() kvErrs := []*terror.Error{ errInvalidKey, errInvalidRecordKey, @@ -577,7 +576,6 @@ func TestError(t *testing.T) { } func TestUntouchedIndexKValue(t *testing.T) { - t.Parallel() untouchedIndexKey := []byte("t00000001_i000000001") untouchedIndexValue := []byte{0, 0, 0, 0, 0, 0, 0, 1, 49} require.True(t, IsUntouchedIndexKValue(untouchedIndexKey, untouchedIndexValue)) diff --git a/telemetry/cte_test/cte_test.go b/telemetry/cte_test/cte_test.go index 6eaff23ee88e2..356b65eaad059 100644 --- a/telemetry/cte_test/cte_test.go +++ b/telemetry/cte_test/cte_test.go @@ -49,8 +49,6 @@ func TestCTEPreviewAndReport(t *testing.T) { t.Skip("integration.NewClusterV3 will create file contains a colon which is not allowed on Windows") } - t.Parallel() - s := newSuite(t) defer s.close() diff --git a/telemetry/data_cluster_hardware_test.go b/telemetry/data_cluster_hardware_test.go index 9980f08dc6b54..90f1c450a8601 100644 --- a/telemetry/data_cluster_hardware_test.go +++ b/telemetry/data_cluster_hardware_test.go @@ -21,8 +21,6 @@ import ( ) func TestNormalizeDiskName(t *testing.T) { - t.Parallel() - tests := []struct { diskName string expected string @@ -39,8 +37,6 @@ func TestNormalizeDiskName(t *testing.T) { } func TestIsNormalizedDiskNameAllowed(t *testing.T) { - t.Parallel() - tests := []struct { diskName string }{ @@ -66,8 +62,6 @@ func TestIsNormalizedDiskNameAllowed(t *testing.T) { } func TestIsNormalizedDiskNameNotAllowed(t *testing.T) { - t.Parallel() - tests := []struct { diskName string }{ @@ -84,8 +78,6 @@ func TestIsNormalizedDiskNameNotAllowed(t *testing.T) { } func TestNormalizeFieldName(t *testing.T) { - t.Parallel() - tests := []struct { fileName string expected string diff --git a/telemetry/data_feature_usage.go b/telemetry/data_feature_usage.go index 0459fb9104849..cf32510097423 100644 --- a/telemetry/data_feature_usage.go +++ b/telemetry/data_feature_usage.go @@ -36,6 +36,7 @@ type featureUsage struct { ClusterIndex *ClusterIndexUsage `json:"clusterIndex"` TemporaryTable bool `json:"temporaryTable"` CTE *m.CTEUsageCounter `json:"cte"` + CachedTable bool `json:"cachedTable"` } func getFeatureUsage(ctx sessionctx.Context) (*featureUsage, error) { @@ -49,11 +50,13 @@ func getFeatureUsage(ctx sessionctx.Context) (*featureUsage, error) { txnUsage := getTxnUsageInfo(ctx) // Avoid the circle dependency. - temporaryTable := ctx.(TemporaryTableFeatureChecker).TemporaryTableExists() + temporaryTable := ctx.(TemporaryOrCacheTableFeatureChecker).TemporaryTableExists() cteUsage := getCTEUsageInfo() - return &featureUsage{txnUsage, clusterIdxUsage, temporaryTable, cteUsage}, nil + cachedTable := ctx.(TemporaryOrCacheTableFeatureChecker).CachedTableExists() + + return &featureUsage{txnUsage, clusterIdxUsage, temporaryTable, cteUsage, cachedTable}, nil } // ClusterIndexUsage records the usage info of all the tables, no more than 10k tables @@ -138,10 +141,11 @@ func getClusterIndexUsageInfo(ctx sessionctx.Context) (cu *ClusterIndexUsage, er return &usage, nil } -// TemporaryTableFeatureChecker is defined to avoid package circle dependency. +// TemporaryOrCacheTableFeatureChecker is defined to avoid package circle dependency. // The session struct implements this interface. -type TemporaryTableFeatureChecker interface { +type TemporaryOrCacheTableFeatureChecker interface { TemporaryTableExists() bool + CachedTableExists() bool } // TxnUsage records the usage info of transaction related features, including diff --git a/telemetry/data_feature_usage_test.go b/telemetry/data_feature_usage_test.go index 932a85127f4bd..efe852153a13a 100644 --- a/telemetry/data_feature_usage_test.go +++ b/telemetry/data_feature_usage_test.go @@ -25,8 +25,6 @@ import ( ) func TestTxnUsageInfo(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -70,8 +68,6 @@ func TestTxnUsageInfo(t *testing.T) { } func TestTemporaryTable(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -87,3 +83,25 @@ func TestTemporaryTable(t *testing.T) { require.NoError(t, err) require.True(t, usage.TemporaryTable) } + +func TestCachedTable(t *testing.T) { + store, clean := testkit.CreateMockStore(t) + defer clean() + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + + usage, err := telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.False(t, usage.CachedTable) + tk.MustExec("drop table if exists tele_cache_t") + tk.MustExec("create table tele_cache_t (id int)") + tk.MustExec("alter table tele_cache_t cache") + usage, err = telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.True(t, usage.CachedTable) + tk.MustExec("alter table tele_cache_t nocache") + usage, err = telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.False(t, usage.CachedTable) +} diff --git a/telemetry/data_window.go b/telemetry/data_window.go index 0da4d9bd4d82a..0945326075083 100644 --- a/telemetry/data_window.go +++ b/telemetry/data_window.go @@ -164,10 +164,9 @@ func readSQLMetric(timepoint time.Time, SQLResult *sqlUsageData) error { promQL := "avg(tidb_executor_statement_total{}) by (type)" result, err := querySQLMetric(ctx, timepoint, promQL) if err != nil { - analysisSQLUsage(result, SQLResult) - } else { - analysisSQLUsage(result, SQLResult) + return err } + analysisSQLUsage(result, SQLResult) return nil } diff --git a/telemetry/telemetry_test.go b/telemetry/telemetry_test.go index 505ca4a5b0d79..c7f3cef8d92a8 100644 --- a/telemetry/telemetry_test.go +++ b/telemetry/telemetry_test.go @@ -33,8 +33,6 @@ func TestTrackingID(t *testing.T) { t.Skip("integration.NewClusterV3 will create file contains a colon which is not allowed on Windows") } - t.Parallel() - etcdCluster := integration.NewClusterV3(t, &integration.ClusterConfig{Size: 1}) defer etcdCluster.Terminate(t) diff --git a/telemetry/util_test.go b/telemetry/util_test.go index 92643ec6d174e..704302d5014d7 100644 --- a/telemetry/util_test.go +++ b/telemetry/util_test.go @@ -21,8 +21,6 @@ import ( ) func TestHashString(t *testing.T) { - t.Parallel() - actual, err := hashString("127.0.0.1") require.NoError(t, err) require.Equal(t, "4b84b15bff6ee5796152495a230e45e3d7e947d9", actual) @@ -50,8 +48,6 @@ func TestParseAddress(t *testing.T) { // copy iterator variable into a new variable, see issue #27779 test := test t.Run(test.src, func(t *testing.T) { - t.Parallel() - host, port, err := parseAddressAndHash(test.src) require.NoError(t, err) diff --git a/testkit/asynctestkit.go b/testkit/asynctestkit.go index 907b940c4b378..f73d77a6dc03e 100644 --- a/testkit/asynctestkit.go +++ b/testkit/asynctestkit.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build !codes // +build !codes package testkit diff --git a/testkit/dbtestkit.go b/testkit/dbtestkit.go index b0039098a48ae..5682597618683 100644 --- a/testkit/dbtestkit.go +++ b/testkit/dbtestkit.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build !codes // +build !codes package testkit @@ -41,6 +42,29 @@ func NewDBTestKit(t *testing.T, db *sql.DB) *DBTestKit { } } +// MustPrepare creates a prepared statement for later queries or executions. +func (tk *DBTestKit) MustPrepare(query string) *sql.Stmt { + stmt, err := tk.db.Prepare(query) + tk.require.NoErrorf(err, "Prepare %s", query) + return stmt +} + +// MustExecPrepared executes a prepared statement with the given arguments and +// returns a Result summarizing the effect of the statement. +func (tk *DBTestKit) MustExecPrepared(stmt *sql.Stmt, args ...interface{}) sql.Result { + res, err := stmt.Exec(args...) + tk.require.NoErrorf(err, "Execute prepared with args: %s", args) + return res +} + +// MustQueryPrepared executes a prepared query statement with the given arguments +// and returns the query results as a *Rows. +func (tk *DBTestKit) MustQueryPrepared(stmt *sql.Stmt, args ...interface{}) *sql.Rows { + rows, err := stmt.Query(args...) + tk.require.NoErrorf(err, "Query prepared with args: %s", args) + return rows +} + // MustExec query the statements and returns the result. func (tk *DBTestKit) MustExec(sql string, args ...interface{}) sql.Result { comment := fmt.Sprintf("sql:%s, args:%v", sql, args) @@ -58,3 +82,16 @@ func (tk *DBTestKit) MustQuery(sql string, args ...interface{}) *sql.Rows { tk.require.NotNil(rows, comment) return rows } + +// MustQueryRows query the statements +func (tk *DBTestKit) MustQueryRows(query string, args ...interface{}) { + rows := tk.MustQuery(query, args...) + tk.require.True(rows.Next()) + tk.require.NoError(rows.Err()) + rows.Close() +} + +// GetDB returns the underlay sql.DB instance. +func (tk *DBTestKit) GetDB() *sql.DB { + return tk.db +} diff --git a/testkit/handle.go b/testkit/handle.go index f4a6befcd2d75..e911f164d8052 100644 --- a/testkit/handle.go +++ b/testkit/handle.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build !codes // +build !codes package testkit diff --git a/testkit/mockstore.go b/testkit/mockstore.go index cc672926c4e26..181d1c609e364 100644 --- a/testkit/mockstore.go +++ b/testkit/mockstore.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build !codes // +build !codes package testkit @@ -29,20 +30,20 @@ import ( ) // CreateMockStore return a new mock kv.Storage. -func CreateMockStore(t *testing.T, opts ...mockstore.MockTiKVStoreOption) (store kv.Storage, clean func()) { +func CreateMockStore(t testing.TB, opts ...mockstore.MockTiKVStoreOption) (store kv.Storage, clean func()) { store, _, clean = CreateMockStoreAndDomain(t, opts...) return } // CreateMockStoreAndDomain return a new mock kv.Storage and *domain.Domain. -func CreateMockStoreAndDomain(t *testing.T, opts ...mockstore.MockTiKVStoreOption) (kv.Storage, *domain.Domain, func()) { +func CreateMockStoreAndDomain(t testing.TB, opts ...mockstore.MockTiKVStoreOption) (kv.Storage, *domain.Domain, func()) { store, err := mockstore.NewMockStore(opts...) require.NoError(t, err) dom, clean := bootstrap(t, store) return store, dom, clean } -func bootstrap(t *testing.T, store kv.Storage) (*domain.Domain, func()) { +func bootstrap(t testing.TB, store kv.Storage) (*domain.Domain, func()) { session.SetSchemaLease(0) session.DisableStats4Test() dom, err := session.BootstrapSession(store) @@ -59,7 +60,7 @@ func bootstrap(t *testing.T, store kv.Storage) (*domain.Domain, func()) { } // CreateMockStoreWithOracle returns a new mock kv.Storage and *domain.Domain, providing the oracle for the store. -func CreateMockStoreWithOracle(t *testing.T, oracle oracle.Oracle, opts ...mockstore.MockTiKVStoreOption) (kv.Storage, *domain.Domain, func()) { +func CreateMockStoreWithOracle(t testing.TB, oracle oracle.Oracle, opts ...mockstore.MockTiKVStoreOption) (kv.Storage, *domain.Domain, func()) { store, err := mockstore.NewMockStore(opts...) require.NoError(t, err) store.GetOracle().Close() diff --git a/testkit/result.go b/testkit/result.go index 72ad99baf56de..6950120d6a2a0 100644 --- a/testkit/result.go +++ b/testkit/result.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build !codes // +build !codes package testkit diff --git a/testkit/testdata/testdata.go b/testkit/testdata/testdata.go index 3fffc3252cbb2..f9c9eae1e8c68 100644 --- a/testkit/testdata/testdata.go +++ b/testkit/testdata/testdata.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build !codes // +build !codes package testdata diff --git a/testkit/testkit.go b/testkit/testkit.go index e87abe1f474e2..c99791efe369a 100644 --- a/testkit/testkit.go +++ b/testkit/testkit.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build !codes // +build !codes package testkit @@ -26,6 +27,7 @@ import ( "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/session" + "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/sqlexec" "github.com/stretchr/testify/assert" @@ -39,13 +41,13 @@ var testKitIDGenerator atomic.Uint64 type TestKit struct { require *require.Assertions assert *assert.Assertions - t *testing.T + t testing.TB store kv.Storage session session.Session } // NewTestKit returns a new *TestKit. -func NewTestKit(t *testing.T, store kv.Storage) *TestKit { +func NewTestKit(t testing.TB, store kv.Storage) *TestKit { return &TestKit{ require: require.New(t), assert: assert.New(t), @@ -126,6 +128,16 @@ func (tk *TestKit) HasPlan(sql string, plan string, args ...interface{}) bool { return false } +// HasPlan4ExplainFor checks if the result execution plan contains specific plan. +func (tk *TestKit) HasPlan4ExplainFor(result *Result, plan string) bool { + for i := range result.rows { + if strings.Contains(result.rows[i][0], plan) { + return true + } + } + return false +} + // Exec executes a sql statement using the prepared stmt API func (tk *TestKit) Exec(sql string, args ...interface{}) (sqlexec.RecordSet, error) { ctx := context.Background() @@ -183,7 +195,7 @@ func (tk *TestKit) ExecToErr(sql string, args ...interface{}) error { return err } -func newSession(t *testing.T, store kv.Storage) session.Session { +func newSession(t testing.TB, store kv.Storage) session.Session { se, err := session.CreateSession4Test(store) require.NoError(t, err) se.SetConnectionID(testKitIDGenerator.Inc()) @@ -225,3 +237,30 @@ func (tk *TestKit) MustUseIndex(sql string, index string, args ...interface{}) b } return false } + +// MustUseIndex4ExplainFor checks if the result execution plan contains specific index(es). +func (tk *TestKit) MustUseIndex4ExplainFor(result *Result, index string) bool { + for i := range result.rows { + // It depends on whether we enable to collect the execution info. + if strings.Contains(result.rows[i][3], "index:"+index) { + return true + } + if strings.Contains(result.rows[i][4], "index:"+index) { + return true + } + } + return false +} + +// CheckExecResult checks the affected rows and the insert id after executing MustExec. +func (tk *TestKit) CheckExecResult(affectedRows, insertID int64) { + tk.require.Equal(int64(tk.Session().AffectedRows()), affectedRows) + tk.require.Equal(int64(tk.Session().LastInsertID()), insertID) +} + +// WithPruneMode run test case under prune mode. +func WithPruneMode(tk *TestKit, mode variable.PartitionPruneMode, f func()) { + tk.MustExec("set @@tidb_partition_prune_mode=`" + string(mode) + "`") + tk.MustExec("set global tidb_partition_prune_mode=`" + string(mode) + "`") + f() +} diff --git a/testkit/testmain/bench.go b/testkit/testmain/bench.go index 016d8da375a68..a6670bc37509c 100644 --- a/testkit/testmain/bench.go +++ b/testkit/testmain/bench.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build !codes // +build !codes package testmain diff --git a/testkit/testmain/wrapper.go b/testkit/testmain/wrapper.go index 1ea915053eeb6..22aeb325cb9c1 100644 --- a/testkit/testmain/wrapper.go +++ b/testkit/testmain/wrapper.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build !codes // +build !codes package testmain diff --git a/testkit/trequire/trequire.go b/testkit/trequire/trequire.go index f3be05a7a185a..6ffb245413fec 100644 --- a/testkit/trequire/trequire.go +++ b/testkit/trequire/trequire.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build !codes // +build !codes package trequire @@ -21,13 +22,14 @@ import ( "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/collate" "github.com/stretchr/testify/require" ) -// DatumEqual verifies that the actual value is equal to the expected value. -func DatumEqual(t *testing.T, expected types.Datum, actual types.Datum, msgAndArgs ...interface{}) { +// DatumEqual verifies that the actual value is equal to the expected value. For string datum, they are compared by the binary collation. +func DatumEqual(t *testing.T, expected, actual types.Datum, msgAndArgs ...interface{}) { sc := new(stmtctx.StatementContext) - res, err := expected.CompareDatum(sc, &actual) + res, err := actual.Compare(sc, &expected, collate.GetBinaryCollator()) require.NoError(t, err, msgAndArgs) require.Zero(t, res, msgAndArgs) } diff --git a/tidb-server/main.go b/tidb-server/main.go index ae89bed914bef..f53b1f26f0e88 100644 --- a/tidb-server/main.go +++ b/tidb-server/main.go @@ -60,7 +60,6 @@ import ( "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/memory" "github.com/pingcap/tidb/util/printer" - "github.com/pingcap/tidb/util/profile" "github.com/pingcap/tidb/util/sem" "github.com/pingcap/tidb/util/signal" "github.com/pingcap/tidb/util/sys/linux" @@ -110,6 +109,9 @@ const ( nmProxyProtocolNetworks = "proxy-protocol-networks" nmProxyProtocolHeaderTimeout = "proxy-protocol-header-timeout" nmAffinityCPU = "affinity-cpus" + + nmInitializeSecure = "initialize-secure" + nmInitializeInsecure = "initialize-insecure" ) var ( @@ -125,7 +127,7 @@ var ( 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.") + socket = flag.String(nmSocket, "/tmp/tidb-{Port}.sock", "The socket file to use for connection.") enableBinlog = flagBoolean(nmEnableBinlog, false, "enable generate binlog") runDDL = flagBoolean(nmRunDDL, true, "run ddl worker on this tidb-server") ddlLease = flag.String(nmDdlLease, "45s", "schema lease duration, very dangerous to change only if you know what you do") @@ -152,6 +154,10 @@ var ( // PROXY Protocol proxyProtocolNetworks = flag.String(nmProxyProtocolNetworks, "", "proxy protocol networks allowed IP or *, empty mean disable proxy protocol support") proxyProtocolHeaderTimeout = flag.Uint(nmProxyProtocolHeaderTimeout, 5, "proxy protocol header read timeout, unit is second.") + + // Security + initializeSecure = flagBoolean(nmInitializeSecure, false, "bootstrap tidb-server in secure mode") + initializeInsecure = flagBoolean(nmInitializeInsecure, true, "bootstrap tidb-server in insecure mode") ) func main() { @@ -177,12 +183,13 @@ func main() { // Enable failpoints in tikv/client-go if the test API is enabled. // It appears in the main function to be set before any use of client-go to prevent data race. if _, err := failpoint.Status("github.com/pingcap/tidb/server/enableTestAPI"); err == nil { + warnMsg := "tikv/client-go failpoint is enabled, this should NOT happen in the production environment" + logutil.BgLogger().Warn(warnMsg) tikv.EnableFailpoints() } setGlobalVars() setCPUAffinity() setupLog() - setHeapProfileTracker() setupTracing() // Should before createServer and after setup config. printInfo() setupBinlogClient() @@ -208,11 +215,6 @@ func main() { syncLog() } -func exit() { - syncLog() - os.Exit(0) -} - func syncLog() { if err := log.Sync(); err != nil { // Don't complain about /dev/stdout as Fsync will return EINVAL. @@ -252,7 +254,7 @@ func setCPUAffinity() { c, err := strconv.Atoi(af) if err != nil { fmt.Fprintf(os.Stderr, "wrong affinity cpu config: %s", *affinityCPU) - exit() + os.Exit(1) } cpu = append(cpu, c) } @@ -260,18 +262,12 @@ func setCPUAffinity() { err := linux.SetAffinity(cpu) if err != nil { fmt.Fprintf(os.Stderr, "set cpu affinity failure: %v", err) - exit() + os.Exit(1) } runtime.GOMAXPROCS(len(cpu)) metrics.MaxProcs.Set(float64(runtime.GOMAXPROCS(0))) } -func setHeapProfileTracker() { - c := config.GetGlobalConfig() - d := parseDuration(c.Performance.MemProfileInterval) - go profile.HeapProfileForGlobalMemTracker(d) -} - func registerStores() { err := kvstore.Register("tikv", driver.TiKVDriver{}) terror.MustNil(err) @@ -505,6 +501,28 @@ func overrideConfig(cfg *config.Config) { if actualFlags[nmProxyProtocolHeaderTimeout] { cfg.ProxyProtocol.HeaderTimeout = *proxyProtocolHeaderTimeout } + + // Sanity check: can't specify both options + if actualFlags[nmInitializeSecure] && actualFlags[nmInitializeInsecure] { + err = fmt.Errorf("the options --initialize-insecure and --initialize-secure are mutually exclusive") + terror.MustNil(err) + } + // The option --initialize-secure=true ensures that a secure bootstrap is used. + if actualFlags[nmInitializeSecure] { + cfg.Security.SecureBootstrap = *initializeSecure + } + // The option --initialize-insecure=true/false was used. + // Store the inverted value of this to the secure bootstrap cfg item + if actualFlags[nmInitializeInsecure] { + cfg.Security.SecureBootstrap = !*initializeInsecure + } + // Secure bootstrap initializes with Socket authentication + // which is not supported on windows. Only the insecure bootstrap + // method is supported. + if runtime.GOOS == "windows" && cfg.Security.SecureBootstrap { + err = fmt.Errorf("the option --initialize-secure is not supported on Windows") + terror.MustNil(err) + } } func setGlobalVars() { @@ -560,6 +578,7 @@ func setGlobalVars() { variable.SetSysVar(variable.LowerCaseTableNames, strconv.Itoa(cfg.LowerCaseTableNames)) variable.SetSysVar(variable.LogBin, variable.BoolToOnOff(cfg.Binlog.Enable)) variable.SetSysVar(variable.Port, fmt.Sprintf("%d", cfg.Port)) + cfg.Socket = strings.Replace(cfg.Socket, "{Port}", fmt.Sprintf("%d", cfg.Port), 1) variable.SetSysVar(variable.Socket, cfg.Socket) variable.SetSysVar(variable.DataDir, cfg.Path) variable.SetSysVar(variable.TiDBSlowQueryFile, cfg.Log.SlowQueryFile) @@ -569,6 +588,7 @@ func setGlobalVars() { if hostname, err := os.Hostname(); err != nil { variable.SetSysVar(variable.Hostname, hostname) } + variable.GlobalLogMaxDays.Store(int32(config.GetGlobalConfig().Log.File.MaxDays)) if cfg.Security.EnableSEM { sem.Enable() diff --git a/tidb-server/main_test.go b/tidb-server/main_test.go index 6242f04a5399b..84f16eb033561 100644 --- a/tidb-server/main_test.go +++ b/tidb-server/main_test.go @@ -69,4 +69,7 @@ func TestSetGlobalVars(t *testing.T) { // variable.Version won't change when len(conf.ServerVersion) == 0 require.Equal(t, "test", variable.GetSysVar(variable.Version).Value) require.Equal(t, variable.GetSysVar(variable.Version).Value, mysql.ServerVersion) + + cfg := config.GetGlobalConfig() + require.Equal(t, cfg.Socket, variable.GetSysVar(variable.Socket).Value) } diff --git a/tools/check/go.mod b/tools/check/go.mod index 0b4f5f590e3a6..9c9c2b8d3da55 100644 --- a/tools/check/go.mod +++ b/tools/check/go.mod @@ -1,11 +1,12 @@ module github.com/pingcap/tidb/_tools require ( + github.com/AlekSi/gocov-xml v0.0.0-20190121064608-3a14fb1c4737 github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc // indirect github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf // indirect + github.com/axw/gocov v1.0.0 github.com/chzchzchz/goword v0.0.0-20170907005317-a9744cb52b03 github.com/dnephin/govet v0.0.0-20171012192244-4a96d43e39d3 - github.com/google/shlex v0.0.0-20181106134648-c34317bd91bf // indirect github.com/kisielk/errcheck v1.2.0 github.com/mdempsky/unconvert v0.0.0-20200228143138-95ecdbfc0b5f // indirect github.com/mgechev/revive v0.0.0-20181210140514-b4cc152955fb @@ -19,6 +20,7 @@ require ( gopkg.in/alecthomas/gometalinter.v3 v3.0.0 // indirect gopkg.in/alecthomas/kingpin.v2 v2.2.6 // indirect gopkg.in/alecthomas/kingpin.v3-unstable v3.0.0-20170321130658-9670b87a702e // indirect + gotest.tools/gotestsum v1.7.0 // indirect honnef.co/go/tools v0.0.0-20180920025451-e3ad64cb4ed3 ) diff --git a/tools/check/go.sum b/tools/check/go.sum index 604e8fe19c132..ca6214c124823 100644 --- a/tools/check/go.sum +++ b/tools/check/go.sum @@ -1,20 +1,36 @@ +github.com/AlekSi/gocov-xml v0.0.0-20190121064608-3a14fb1c4737 h1:JZHBkt0GhM+ARQykshqpI49yaWCHQbJonH3XpDTwMZQ= +github.com/AlekSi/gocov-xml v0.0.0-20190121064608-3a14fb1c4737/go.mod h1:w1KSuh2JgIL3nyRiZijboSUwbbxOrTzWwyWVFUHtXBQ= github.com/BurntSushi/toml v0.3.0 h1:e1/Ivsx3Z0FVTV0NSOv/aVgbUWyQuzj7DDnFblkRvsY= github.com/BurntSushi/toml v0.3.0/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf h1:qet1QNfXsQxTZqLG4oE62mJzwPIB8+Tee4RNCL9ulrY= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/axw/gocov v1.0.0 h1:YsqYR66hUmilVr23tu8USgnJIJvnwh3n7j5zRn7x4LU= +github.com/axw/gocov v1.0.0/go.mod h1:LvQpEYiwwIb2nYkXY2fDWhg9/AsYqkhmrCshjlUJECE= github.com/chzchzchz/goword v0.0.0-20170907005317-a9744cb52b03 h1:0wUHjDfbCAROEAZ96zAJGwcNMkPIheFaIjtQyv3QqfM= github.com/chzchzchz/goword v0.0.0-20170907005317-a9744cb52b03/go.mod h1:uFE9hX+zXEwvyUThZ4gDb9vkAwc5DoHUnRSEpH0VrOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dnephin/govet v0.0.0-20171012192244-4a96d43e39d3/go.mod h1:pPTX0MEEoAnfbrAGFj4nSVNhl6YbugRj6eardUZdtGo= +github.com/dnephin/pflag v1.0.7 h1:oxONGlWxhmUct0YzKTgrpQv9AUA1wtPBn7zuSjJqptk= +github.com/dnephin/pflag v1.0.7/go.mod h1:uxE91IoWURlOiTUIA8Mq5ZZkAv3dPUfZNaT80Zm7OQE= github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= +github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structtag v1.0.0 h1:pTHj65+u3RKWYPSGaU290FpI/dXxTaHdVwVwbcPKmEc= github.com/fatih/structtag v1.0.0/go.mod h1:IKitwq45uXL/yqi5mYghiD3w9H6eTOvI9vnk8tXMphA= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/shlex v0.0.0-20181106134648-c34317bd91bf h1:7+FW5aGwISbqUtkfmIpZJGRgNFg2ioYPvFaUxdqpDsg= github.com/google/shlex v0.0.0-20181106134648-c34317bd91bf/go.mod h1:RpwtwJQFrIEPstU94h88MWPXP2ektJZ8cZ0YntAmXiE= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= +github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/kisielk/errcheck v1.2.0 h1:reN85Pxc5larApoH1keMBiu2GWtPqXQ1nc9gx+jOU+E= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v0.0.0-20161130080628-0de1eaf82fa3 h1:s/sV9geKJwXXzcrFiQdiiIFgfesbREplXWR9ZFgnGSQ= @@ -24,8 +40,12 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.4 h1:bnP0vzxcAdeI1zdubAl5PjU6zsERjGZb7raWodagDYs= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.3 h1:a+kO+98RDGEfo6asOGMmpodZq4FNtnGP54yps8BzLR4= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mdempsky/unconvert v0.0.0-20200228143138-95ecdbfc0b5f h1:Kc3s6QFyh9DLgInXpWKuG+8I7R7lXbnP7mcoOVIt6KY= @@ -55,6 +75,9 @@ github.com/pingcap/errors v0.11.5-0.20211009033009-93128226aaa3/go.mod h1:X2r9ue github.com/pingcap/failpoint v0.0.0-20200702092429-9f69995143ce h1:Y1kCxlCtlPTMtVcOkjUcuQKh+YrluSo7+7YMCQSzy30= github.com/pingcap/failpoint v0.0.0-20200702092429-9f69995143ce/go.mod h1:w4PEZ5y16LeofeeGwdgZB4ddv9bLyDuIX+ljstgKZyk= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735 h1:7YvPJVmEeFHR1Tj9sZEYsmarJEQfMVYpd/Vyy/A8dqE= github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= @@ -64,44 +87,72 @@ github.com/sergi/go-diff v1.0.1-0.20180205163309-da645544ed44 h1:tB9NOR21++IjLyV github.com/sergi/go-diff v1.0.1-0.20180205163309-da645544ed44/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd h1:ug7PpSOB5RBPK1Kg6qskGBoP3Vnj/aNYFTznWvlkGo0= github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20170915142106-8351a756f30f/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9 h1:SQFwaSi55rU7vdNs9Yr0Z324VNlrF+0wMqRXT4St8ck= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20171026204733-164713f0dfce/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 h1:SrN+KX8Art/Sf4HNj6Zcz06G7VEz+7w9tdXTPOZ7+l4= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915090833-1cbadb444a80/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20170915040203-e531a2a1c15f/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180911133044-677d2ff680c1/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563 h1:NIou6eNFigscvKJmsbyez16S2cIS6idossORlFtSt2E= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190925020647-22afafe3322a h1:3GxqzBPBt1O2dIiPnzldQ5d25CAMWJFBZTpqxLPfjs8= golang.org/x/tools v0.0.0-20190925020647-22afafe3322a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200225230052-807dcd883420 h1:4RJNOV+2rLxMEfr6QIpC7GEv9MjD6ApGXTCLrNF9+eA= golang.org/x/tools v0.0.0-20200225230052-807dcd883420/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/alecthomas/gometalinter.v2 v2.0.12 h1:/xBWwtjmOmVxn8FXfIk9noV8m2E2Id9jFfUY/Mh9QAI= gopkg.in/alecthomas/gometalinter.v2 v2.0.12/go.mod h1:NDRytsqEZyolNuAgTzJkZMkSQM7FIKyzVzGhjB/qfYo= gopkg.in/alecthomas/gometalinter.v3 v3.0.0 h1:tKnpLD70cWDacxrv9JZ4atld7RPoPiHOBfad6mPmyBw= @@ -114,4 +165,7 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gotest.tools/gotestsum v1.7.0 h1:RwpqwwFKBAa2h+F6pMEGpE707Edld0etUD3GhqqhDNc= +gotest.tools/gotestsum v1.7.0/go.mod h1:V1m4Jw3eBerhI/A6qCxUE07RnCg7ACkKj9BYcAm09V8= +gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= honnef.co/go/tools v0.0.0-20180920025451-e3ad64cb4ed3/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/types/binary_literal_test.go b/types/binary_literal_test.go index 81b9fde6767a5..a76f4c5a8dcb1 100644 --- a/types/binary_literal_test.go +++ b/types/binary_literal_test.go @@ -24,7 +24,6 @@ import ( func TestBinaryLiteral(t *testing.T) { t.Run("TestTrimLeadingZeroBytes", func(t *testing.T) { - t.Parallel() tbl := []struct { Input []byte Expected []byte @@ -46,7 +45,6 @@ func TestBinaryLiteral(t *testing.T) { }) t.Run("TestParseBitStr", func(t *testing.T) { - t.Parallel() tbl := []struct { Input string Expected []byte @@ -108,14 +106,13 @@ func TestBinaryLiteral(t *testing.T) { }) t.Run("TestParseBitStr", func(t *testing.T) { - t.Parallel() b, err := ParseBitStr("") require.Nil(t, b) + require.Error(t, err) require.Contains(t, err.Error(), "invalid empty ") }) t.Run("TestParseHexStr", func(t *testing.T) { - t.Parallel() tbl := []struct { Input string Expected []byte @@ -148,14 +145,13 @@ func TestBinaryLiteral(t *testing.T) { }) t.Run("TestParseHexStr", func(t *testing.T) { - t.Parallel() b, err := ParseBitStr("") require.Nil(t, b) + require.Error(t, err) require.Contains(t, err.Error(), "invalid empty ") }) t.Run("TestString", func(t *testing.T) { - t.Parallel() tbl := []struct { Input BinaryLiteral Expected string @@ -172,7 +168,6 @@ func TestBinaryLiteral(t *testing.T) { }) t.Run("TestToBitLiteralString", func(t *testing.T) { - t.Parallel() tbl := []struct { Input BinaryLiteral TrimLeadingZero bool @@ -198,7 +193,6 @@ func TestBinaryLiteral(t *testing.T) { }) t.Run("TestToInt", func(t *testing.T) { - t.Parallel() tbl := []struct { Input string Expected uint64 @@ -228,7 +222,6 @@ func TestBinaryLiteral(t *testing.T) { }) t.Run("TestNewBinaryLiteralFromUint", func(t *testing.T) { - t.Parallel() tbl := []struct { Input uint64 ByteSize int @@ -265,7 +258,6 @@ func TestBinaryLiteral(t *testing.T) { }) t.Run("TestCompare", func(t *testing.T) { - t.Parallel() tbl := []struct { a BinaryLiteral b BinaryLiteral @@ -282,7 +274,6 @@ func TestBinaryLiteral(t *testing.T) { }) t.Run("TestToString", func(t *testing.T) { - t.Parallel() h, _ := NewHexLiteral("x'3A3B'") str := h.ToString() require.Equal(t, str, ":;") diff --git a/types/compare_test.go b/types/compare_test.go index ffd9a8895efb8..53df667ccca9f 100644 --- a/types/compare_test.go +++ b/types/compare_test.go @@ -21,12 +21,11 @@ import ( "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" + "github.com/pingcap/tidb/util/collate" "github.com/stretchr/testify/require" ) func TestCompare(t *testing.T) { - t.Parallel() - cmpTbl := []struct { lhs interface{} rhs interface{} @@ -151,12 +150,10 @@ func compareForTest(a, b interface{}) (int, error) { sc.IgnoreTruncate = true aDatum := NewDatum(a) bDatum := NewDatum(b) - return aDatum.CompareDatum(sc, &bDatum) + return aDatum.Compare(sc, &bDatum, collate.GetBinaryCollator()) } func TestCompareDatum(t *testing.T) { - t.Parallel() - cmpTbl := []struct { lhs Datum rhs Datum @@ -174,19 +171,17 @@ func TestCompareDatum(t *testing.T) { sc := new(stmtctx.StatementContext) sc.IgnoreTruncate = true for i, tt := range cmpTbl { - ret, err := tt.lhs.CompareDatum(sc, &tt.rhs) + ret, err := tt.lhs.Compare(sc, &tt.rhs, collate.GetBinaryCollator()) require.NoError(t, err) require.Equal(t, tt.ret, ret, "%d %v %v", i, tt.lhs, tt.rhs) - ret, err = tt.rhs.CompareDatum(sc, &tt.lhs) + ret, err = tt.rhs.Compare(sc, &tt.lhs, collate.GetBinaryCollator()) require.NoError(t, err) require.Equal(t, -tt.ret, ret, "%d %v %v", i, tt.lhs, tt.rhs) } } func TestVecCompareIntAndUint(t *testing.T) { - t.Parallel() - cmpTblUU := []struct { lhs []uint64 rhs []uint64 diff --git a/types/const_test.go b/types/const_test.go index 3bcb9a9bf2caf..62a4d2183eae1 100644 --- a/types/const_test.go +++ b/types/const_test.go @@ -25,8 +25,6 @@ import ( ) func TestGetSQLMode(t *testing.T) { - t.Parallel() - positiveCases := []struct { arg string }{ @@ -59,8 +57,6 @@ func TestGetSQLMode(t *testing.T) { } func TestSQLMode(t *testing.T) { - t.Parallel() - tests := []struct { arg string hasNoZeroDateMode bool @@ -87,8 +83,6 @@ func TestSQLMode(t *testing.T) { } func TestRealAsFloatMode(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -111,8 +105,6 @@ func TestRealAsFloatMode(t *testing.T) { } func TestPipesAsConcatMode(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -123,8 +115,6 @@ func TestPipesAsConcatMode(t *testing.T) { } func TestIssue22387(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -138,8 +128,6 @@ func TestIssue22387(t *testing.T) { } func TestIssue22389(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -157,8 +145,6 @@ func TestIssue22389(t *testing.T) { } func TestIssue22390(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -177,8 +163,6 @@ func TestIssue22390(t *testing.T) { } func TestIssue22442(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -191,8 +175,6 @@ func TestIssue22442(t *testing.T) { } func TestIssue22444(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -205,8 +187,6 @@ func TestIssue22444(t *testing.T) { } func TestIssue22445(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -220,8 +200,6 @@ func TestIssue22445(t *testing.T) { } func TestIssue22446(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -234,8 +212,6 @@ func TestIssue22446(t *testing.T) { } func TestIssue22447(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -250,8 +226,6 @@ func TestIssue22447(t *testing.T) { } func TestNoUnsignedSubtractionMode(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -338,8 +312,6 @@ func TestNoUnsignedSubtractionMode(t *testing.T) { } func TestHighNotPrecedenceMode(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -360,8 +332,6 @@ func TestHighNotPrecedenceMode(t *testing.T) { } func TestIgnoreSpaceMode(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -426,8 +396,6 @@ func TestIgnoreSpaceMode(t *testing.T) { } func TestNoBackslashEscapesMode(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -441,8 +409,6 @@ func TestNoBackslashEscapesMode(t *testing.T) { } func TestServerStatus(t *testing.T) { - t.Parallel() - tests := []struct { arg uint16 IsCursorExists bool diff --git a/types/convert.go b/types/convert.go index 8349832162732..95692e85b7675 100644 --- a/types/convert.go +++ b/types/convert.go @@ -286,7 +286,7 @@ func StrToInt(sc *stmtctx.StatementContext, str string, isFuncCast bool) (int64, return iVal, errors.Trace(err) } -// StrToUint converts a string to an unsigned integer at the best-effortt. +// StrToUint converts a string to an unsigned integer at the best-effort. func StrToUint(sc *stmtctx.StatementContext, str string, isFuncCast bool) (uint64, error) { str = strings.TrimSpace(str) validPrefix, err := getValidIntPrefix(sc, str, isFuncCast) @@ -556,8 +556,10 @@ func ConvertJSONToInt(sc *stmtctx.StatementContext, j json.BinaryJSON, unsigned return 0, sc.HandleTruncate(ErrTruncatedWrongVal.GenWithStackByArgs("INTEGER", j.String())) case json.TypeCodeLiteral: switch j.Value[0] { - case json.LiteralNil, json.LiteralFalse: + case json.LiteralFalse: return 0, nil + case json.LiteralNil: + return 0, sc.HandleTruncate(ErrTruncatedWrongVal.GenWithStackByArgs("INTEGER", j.String())) default: return 1, nil } @@ -614,8 +616,10 @@ func ConvertJSONToFloat(sc *stmtctx.StatementContext, j json.BinaryJSON) (float6 return 0, sc.HandleTruncate(ErrTruncatedWrongVal.GenWithStackByArgs("FLOAT", j.String())) case json.TypeCodeLiteral: switch j.Value[0] { - case json.LiteralNil, json.LiteralFalse: + case json.LiteralFalse: return 0, nil + case json.LiteralNil: + return 0, sc.HandleTruncate(ErrTruncatedWrongVal.GenWithStackByArgs("FLOAT", j.String())) default: return 1, nil } @@ -641,8 +645,10 @@ func ConvertJSONToDecimal(sc *stmtctx.StatementContext, j json.BinaryJSON) (*MyD err = ErrTruncatedWrongVal.GenWithStackByArgs("DECIMAL", j.String()) case json.TypeCodeLiteral: switch j.Value[0] { - case json.LiteralNil, json.LiteralFalse: + case json.LiteralFalse: res = res.FromInt(0) + case json.LiteralNil: + err = ErrTruncatedWrongVal.GenWithStackByArgs("DECIMAL", j.String()) default: res = res.FromInt(1) } diff --git a/types/convert_test.go b/types/convert_test.go index 125c3b061fabf..581eab51cae6e 100644 --- a/types/convert_test.go +++ b/types/convert_test.go @@ -46,7 +46,6 @@ func Convert(val interface{}, target *FieldType) (v interface{}, err error) { } func TestConvertType(t *testing.T) { - t.Parallel() ft := NewFieldType(mysql.TypeBlob) ft.Flen = 4 ft.Charset = "utf8" @@ -240,10 +239,10 @@ func TestConvertType(t *testing.T) { require.Truef(t, terror.ErrorEqual(err, ErrOverflow), "err %v", err) require.Equal(t, "-9999.9999", v.(*MyDecimal).String()) v, err = Convert("1,999.00", ft) - require.Truef(t, terror.ErrorEqual(err, ErrBadNumber), "err %v", err) + require.Truef(t, terror.ErrorEqual(err, ErrTruncated), "err %v", err) require.Equal(t, "1.0000", v.(*MyDecimal).String()) v, err = Convert("1,999,999.00", ft) - require.Truef(t, terror.ErrorEqual(err, ErrBadNumber), "err %v", err) + require.Truef(t, terror.ErrorEqual(err, ErrTruncated), "err %v", err) require.Equal(t, "1.0000", v.(*MyDecimal).String()) v, err = Convert("199.00 ", ft) require.NoError(t, err) @@ -334,7 +333,6 @@ func testToString(t *testing.T, val interface{}, expect string) { } func TestConvertToString(t *testing.T) { - t.Parallel() testToString(t, "0", "0") testToString(t, true, "1") testToString(t, "false", "false") @@ -436,7 +434,6 @@ func testStrToFloat(t *testing.T, str string, expect float64, truncateAsErr bool } func TestStrToNum(t *testing.T) { - t.Parallel() testStrToInt(t, "0", 0, true, nil) testStrToInt(t, "-1", -1, true, nil) testStrToInt(t, "100", 100, true, nil) @@ -515,7 +512,6 @@ func testSelectUpdateDeleteEmptyStringError(t *testing.T) { } func TestFieldTypeToStr(t *testing.T) { - t.Parallel() v := TypeToStr(mysql.TypeUnspecified, "not binary") require.Equal(t, TypeStr(mysql.TypeUnspecified), v) v = TypeToStr(mysql.TypeBlob, charset.CharsetBin) @@ -583,7 +579,6 @@ func strvalue(v interface{}) string { } func TestConvert(t *testing.T) { - t.Parallel() // integer ranges signedDeny(t, mysql.TypeTiny, -129, "-128") signedAccept(t, mysql.TypeTiny, -128, "-128") @@ -775,7 +770,6 @@ func TestConvert(t *testing.T) { } func TestRoundIntStr(t *testing.T) { - t.Parallel() cases := []struct { a string b byte @@ -791,7 +785,6 @@ func TestRoundIntStr(t *testing.T) { } func TestGetValidInt(t *testing.T) { - t.Parallel() tests := []struct { origin string valid string @@ -872,7 +865,6 @@ func TestGetValidInt(t *testing.T) { } func TestGetValidFloat(t *testing.T) { - t.Parallel() tests := []struct { origin string valid string @@ -933,7 +925,6 @@ func TestGetValidFloat(t *testing.T) { // time conversion is complicated including Date/Datetime/Time/Timestamp etc, // Timestamp may involving timezone. func TestConvertTime(t *testing.T) { - t.Parallel() timezones := []*time.Location{ time.UTC, time.FixedZone("", 3*3600), @@ -989,83 +980,100 @@ func testConvertTimeTimeZone(t *testing.T, sc *stmtctx.StatementContext) { } func TestConvertJSONToInt(t *testing.T) { - t.Parallel() var tests = []struct { - In string - Out int64 + in string + out int64 + err bool }{ - {`{}`, 0}, - {`[]`, 0}, - {`3`, 3}, - {`-3`, -3}, - {`4.5`, 4}, - {`true`, 1}, - {`false`, 0}, - {`null`, 0}, - {`"hello"`, 0}, - {`"123hello"`, 123}, - {`"1234"`, 1234}, + {in: `{}`, err: true}, + {in: `[]`, err: true}, + {in: `3`, out: 3}, + {in: `-3`, out: -3}, + {in: `4.5`, out: 4}, + {in: `true`, out: 1}, + {in: `false`, out: 0}, + {in: `null`, err: true}, + {in: `"hello"`, err: true}, + {in: `"123hello"`, out: 123, err: true}, + {in: `"1234"`, out: 1234}, } for _, tt := range tests { - j, err := json.ParseBinaryFromString(tt.In) + j, err := json.ParseBinaryFromString(tt.in) require.NoError(t, err) - casted, _ := ConvertJSONToInt64(new(stmtctx.StatementContext), j, false) - require.Equal(t, tt.Out, casted) + casted, err := ConvertJSONToInt64(new(stmtctx.StatementContext), j, false) + if tt.err { + require.Error(t, err, tt) + } else { + require.NoError(t, err, tt) + } + require.Equal(t, tt.out, casted) } } func TestConvertJSONToFloat(t *testing.T) { - t.Parallel() var tests = []struct { - In interface{} - Out float64 + in interface{} + out float64 ty json.TypeCode + err bool }{ - {make(map[string]interface{}), 0, json.TypeCodeObject}, - {make([]interface{}, 0), 0, json.TypeCodeArray}, - {int64(3), 3, json.TypeCodeInt64}, - {int64(-3), -3, json.TypeCodeInt64}, - {uint64(1 << 63), 1 << 63, json.TypeCodeUint64}, - {float64(4.5), 4.5, json.TypeCodeFloat64}, - {true, 1, json.TypeCodeLiteral}, - {false, 0, json.TypeCodeLiteral}, - {nil, 0, json.TypeCodeLiteral}, - {"hello", 0, json.TypeCodeString}, - {"123.456hello", 123.456, json.TypeCodeString}, - {"1234", 1234, json.TypeCodeString}, + {in: make(map[string]interface{}), ty: json.TypeCodeObject, err: true}, + {in: make([]interface{}, 0), ty: json.TypeCodeArray, err: true}, + {in: int64(3), out: 3, ty: json.TypeCodeInt64}, + {in: int64(-3), out: -3, ty: json.TypeCodeInt64}, + {in: uint64(1 << 63), out: 1 << 63, ty: json.TypeCodeUint64}, + {in: float64(4.5), out: 4.5, ty: json.TypeCodeFloat64}, + {in: true, out: 1, ty: json.TypeCodeLiteral}, + {in: false, out: 0, ty: json.TypeCodeLiteral}, + {in: nil, ty: json.TypeCodeLiteral, err: true}, + {in: "hello", ty: json.TypeCodeString, err: true}, + {in: "123.456hello", out: 123.456, ty: json.TypeCodeString, err: true}, + {in: "1234", out: 1234, ty: json.TypeCodeString}, } for _, tt := range tests { - j := json.CreateBinary(tt.In) + j := json.CreateBinary(tt.in) require.Equal(t, tt.ty, j.TypeCode) - casted, _ := ConvertJSONToFloat(new(stmtctx.StatementContext), j) - require.Equal(t, tt.Out, casted) + casted, err := ConvertJSONToFloat(new(stmtctx.StatementContext), j) + if tt.err { + require.Error(t, err, tt) + } else { + require.NoError(t, err, tt) + } + require.Equal(t, tt.out, casted) } } func TestConvertJSONToDecimal(t *testing.T) { - t.Parallel() var tests = []struct { - In string - Out *MyDecimal + in string + out *MyDecimal + err bool }{ - {`3`, NewDecFromStringForTest("3")}, - {`-3`, NewDecFromStringForTest("-3")}, - {`4.5`, NewDecFromStringForTest("4.5")}, - {`"1234"`, NewDecFromStringForTest("1234")}, - {`"1234567890123456789012345678901234567890123456789012345"`, NewDecFromStringForTest("1234567890123456789012345678901234567890123456789012345")}, + {in: `3`, out: NewDecFromStringForTest("3")}, + {in: `-3`, out: NewDecFromStringForTest("-3")}, + {in: `4.5`, out: NewDecFromStringForTest("4.5")}, + {in: `"1234"`, out: NewDecFromStringForTest("1234")}, + {in: `"1234567890123456789012345678901234567890123456789012345"`, out: NewDecFromStringForTest("1234567890123456789012345678901234567890123456789012345")}, + {in: `true`, out: NewDecFromStringForTest("1")}, + {in: `false`, out: NewDecFromStringForTest("0")}, + {in: `null`, out: NewDecFromStringForTest("0"), err: true}, } for _, tt := range tests { - j, err := json.ParseBinaryFromString(tt.In) + j, err := json.ParseBinaryFromString(tt.in) require.NoError(t, err) casted, err := ConvertJSONToDecimal(new(stmtctx.StatementContext), j) - require.NoErrorf(t, err, "input: %v, casted: %v, out: %v, json: %#v", tt.In, casted, tt.Out, j) - require.Equalf(t, 0, casted.Compare(tt.Out), "input: %v, casted: %v, out: %v, json: %#v", tt.In, casted, tt.Out, j) + errMsg := fmt.Sprintf("input: %v, casted: %v, out: %v, json: %#v", tt.in, casted, tt.out, j) + if tt.err { + require.Error(t, err, errMsg) + } else { + require.NoError(t, err, errMsg) + } + require.Equalf(t, 0, casted.Compare(tt.out), "input: %v, casted: %v, out: %v, json: %#v", tt.in, casted, tt.out, j) } } func TestNumberToDuration(t *testing.T) { - t.Parallel() var testCases = []struct { number int64 fsp int @@ -1117,7 +1125,6 @@ func TestNumberToDuration(t *testing.T) { } func TestStrToDuration(t *testing.T) { - t.Parallel() sc := new(stmtctx.StatementContext) var tests = []struct { str string @@ -1137,7 +1144,6 @@ func TestStrToDuration(t *testing.T) { } func TestConvertScientificNotation(t *testing.T) { - t.Parallel() cases := []struct { input string output string @@ -1173,7 +1179,6 @@ func TestConvertScientificNotation(t *testing.T) { } func TestConvertDecimalStrToUint(t *testing.T) { - t.Parallel() cases := []struct { input string result uint64 diff --git a/types/core_time.go b/types/core_time.go index 161180dd3b166..64820f98aaf79 100644 --- a/types/core_time.go +++ b/types/core_time.go @@ -184,6 +184,59 @@ func (t CoreTime) GoTime(loc *gotime.Location) (gotime.Time, error) { return tm, nil } +// FindZoneTransition check for one Time Zone transition within +/- 4h +// Currently the needed functions are not exported, if gotime.Location.lookup would be exported +// then it would be easy to use that directly +func FindZoneTransition(tIn gotime.Time) (gotime.Time, error) { + // Check most common case first, DST transition on full hour. + // round truncates away from zero! + t2 := tIn.Round(gotime.Hour).Add(-1 * gotime.Hour) + t1 := t2.Add(-1 * gotime.Second) + _, offset1 := t1.Zone() + _, offset2 := t2.Zone() + if offset1 != offset2 { + return t2, nil + } + + // Check if any offset change? + t1 = tIn.Add(-4 * gotime.Hour) + t2 = tIn.Add(4 * gotime.Hour) + _, offset1 = t1.Zone() + _, offset2 = t2.Zone() + if offset1 == offset2 { + return tIn, errors.Trace(ErrWrongValue.GenWithStackByArgs(TimeStr, tIn)) + } + + // Check generic case, like for 'Australia/Lord_Howe' + for t2.After(t1.Add(gotime.Second)) { + t := t1.Add(t2.Sub(t1) / 2).Round(gotime.Second) + _, offset := t.Zone() + if offset == offset1 { + t1 = t + } else { + t2 = t + } + } + return t2, nil +} + +// AdjustedGoTime converts Time to GoTime and adjust for invalid DST times +// like during the DST change with increased offset, +// normally moving to Daylight Saving Time. +// see https://github.com/pingcap/tidb/issues/28739 +func (t CoreTime) AdjustedGoTime(loc *gotime.Location) (gotime.Time, error) { + tm, err := t.GoTime(loc) + if err == nil { + return tm, nil + } + + tAdj, err2 := FindZoneTransition(tm) + if err2 == nil { + return tAdj, nil + } + return tm, err +} + // IsLeapYear returns if it's leap year. func (t CoreTime) IsLeapYear() bool { return isLeapYear(t.getYear()) diff --git a/types/core_time_test.go b/types/core_time_test.go index f34e38ab7f8a2..18d21ddaf8563 100644 --- a/types/core_time_test.go +++ b/types/core_time_test.go @@ -22,8 +22,6 @@ import ( ) func TestWeekBehaviour(t *testing.T) { - t.Parallel() - require.Equal(t, weekBehaviour(1), weekBehaviourMondayFirst) require.Equal(t, weekBehaviour(2), weekBehaviourYear) require.Equal(t, weekBehaviour(4), weekBehaviourFirstWeekday) @@ -34,8 +32,6 @@ func TestWeekBehaviour(t *testing.T) { } func TestWeek(t *testing.T) { - t.Parallel() - tests := []struct { Input CoreTime Mode int @@ -53,8 +49,6 @@ func TestWeek(t *testing.T) { } func TestCalcDaynr(t *testing.T) { - t.Parallel() - require.Equal(t, 0, calcDaynr(0, 0, 0)) require.Equal(t, 3652424, calcDaynr(9999, 12, 31)) require.Equal(t, 719528, calcDaynr(1970, 1, 1)) @@ -64,8 +58,6 @@ func TestCalcDaynr(t *testing.T) { } func TestCalcTimeTimeDiff(t *testing.T) { - t.Parallel() - tests := []struct { T1 CoreTime T2 CoreTime @@ -105,8 +97,6 @@ func TestCalcTimeTimeDiff(t *testing.T) { } func TestCompareTime(t *testing.T) { - t.Parallel() - tests := []struct { T1 CoreTime T2 CoreTime @@ -126,8 +116,6 @@ func TestCompareTime(t *testing.T) { } func TestGetDateFromDaynr(t *testing.T) { - t.Parallel() - tests := []struct { daynr uint year uint @@ -157,8 +145,6 @@ func TestGetDateFromDaynr(t *testing.T) { } func TestMixDateAndTime(t *testing.T) { - t.Parallel() - tests := []struct { date CoreTime dur Duration @@ -208,8 +194,6 @@ func TestMixDateAndTime(t *testing.T) { } func TestIsLeapYear(t *testing.T) { - t.Parallel() - tests := []struct { T CoreTime Expect bool @@ -234,8 +218,6 @@ func TestIsLeapYear(t *testing.T) { } } func TestGetLastDay(t *testing.T) { - t.Parallel() - tests := []struct { year int month int @@ -255,8 +237,6 @@ func TestGetLastDay(t *testing.T) { } func TestGetFixDays(t *testing.T) { - t.Parallel() - tests := []struct { year int month int @@ -278,8 +258,6 @@ func TestGetFixDays(t *testing.T) { } func TestAddDate(t *testing.T) { - t.Parallel() - tests := []struct { year int month int @@ -300,8 +278,6 @@ func TestAddDate(t *testing.T) { } func TestWeekday(t *testing.T) { - t.Parallel() - tests := []struct { Input CoreTime Expect string @@ -316,3 +292,79 @@ func TestWeekday(t *testing.T) { require.Equal(t, tt.Expect, weekday.String()) } } + +func TestFindZoneTransition(t *testing.T) { + tests := []struct { + TZ string + dt string + Expect string + Success bool + }{ + {"Australia/Lord_Howe", "2020-06-29 03:45:00", "", false}, + {"Australia/Lord_Howe", "2020-10-04 02:15:00", "2020-10-04 02:30:00 +11 +1100", true}, + {"Australia/Lord_Howe", "2020-10-04 02:29:59", "2020-10-04 02:30:00 +11 +1100", true}, + {"Australia/Lord_Howe", "2020-10-04 02:29:59.99", "2020-10-04 02:30:00 +11 +1100", true}, + {"Australia/Lord_Howe", "2020-10-04 02:30:00.0001", "2020-10-04 02:30:00 +11 +1100", true}, + {"Australia/Lord_Howe", "2020-10-04 02:30:00", "2020-10-04 02:30:00 +11 +1100", true}, + {"Australia/Lord_Howe", "2020-10-04 02:30:01", "2020-10-04 02:30:00 +11 +1100", true}, + {"Europe/Vilnius", "2020-03-29 03:45:00", "2020-03-29 04:00:00 EEST +0300", true}, + {"Europe/Vilnius", "2020-10-25 03:45:00", "2020-10-25 03:00:00 EET +0200", true}, + {"Europe/Vilnius", "2020-06-29 03:45:00", "", false}, + {"Europe/Amsterdam", "2020-03-29 02:45:00", "2020-03-29 03:00:00 CEST +0200", true}, + {"Europe/Amsterdam", "2020-10-25 02:35:00", "2020-10-25 02:00:00 CET +0100", true}, + {"Europe/Amsterdam", "2020-03-29 02:59:59", "2020-03-29 03:00:00 CEST +0200", true}, + {"Europe/Amsterdam", "2020-03-29 02:59:59.999999999", "2020-03-29 03:00:00 CEST +0200", true}, + {"Europe/Amsterdam", "2020-03-29 03:00:00.000000001", "2020-03-29 03:00:00 CEST +0200", true}, + } + + for _, tt := range tests { + loc, err := time.LoadLocation(tt.TZ) + require.NoError(t, err) + tm, err := time.ParseInLocation("2006-01-02 15:04:05", tt.dt, loc) + require.NoError(t, err) + tp, err := FindZoneTransition(tm) + if !tt.Success { + require.Error(t, err) + } else { + require.NoError(t, err) + require.Equal(t, tt.Expect, tp.Format("2006-01-02 15:04:05.999999999 MST -0700")) + } + } +} + +func TestAdjustedGoTime(t *testing.T) { + tests := []struct { + TZ string + dt CoreTime + Expect string + Success bool + }{ + {"Australia/Lord_Howe", FromDate(2020, 10, 04, 01, 59, 59, 997), "2020-10-04 01:59:59.000997 +1030 +1030", true}, + {"Australia/Lord_Howe", FromDate(2020, 10, 04, 02, 00, 00, 0), "2020-10-04 02:30:00 +11 +1100", true}, + {"Australia/Lord_Howe", FromDate(2020, 10, 04, 02, 15, 00, 0), "2020-10-04 02:30:00 +11 +1100", true}, + {"Australia/Lord_Howe", FromDate(2020, 10, 04, 02, 29, 59, 999999), "2020-10-04 02:30:00 +11 +1100", true}, + {"Australia/Lord_Howe", FromDate(2020, 10, 04, 02, 30, 00, 1), "2020-10-04 02:30:00.000001 +11 +1100", true}, + {"Australia/Lord_Howe", FromDate(2020, 06, 29, 03, 45, 00, 0), "2020-06-29 03:45:00 +1030 +1030", true}, + {"Australia/Lord_Howe", FromDate(2020, 04, 04, 01, 45, 00, 0), "2020-04-04 01:45:00 +11 +1100", true}, + {"Europe/Vilnius", FromDate(2020, 03, 29, 03, 45, 00, 0), "2020-03-29 04:00:00 EEST +0300", true}, + {"Europe/Vilnius", FromDate(2020, 03, 29, 03, 59, 59, 456789), "2020-03-29 04:00:00 EEST +0300", true}, + {"Europe/Vilnius", FromDate(2020, 03, 29, 04, 00, 01, 130000), "2020-03-29 04:00:01.13 EEST +0300", true}, + {"Europe/Vilnius", FromDate(2020, 10, 25, 03, 45, 00, 0), "2020-10-25 03:45:00 EET +0200", true}, + {"Europe/Vilnius", FromDate(2020, 06, 29, 03, 45, 00, 0), "2020-06-29 03:45:00 EEST +0300", true}, + {"Europe/Amsterdam", FromDate(2020, 03, 29, 02, 45, 00, 0), "2020-03-29 03:00:00 CEST +0200", true}, + {"Europe/Amsterdam", FromDate(2020, 10, 25, 02, 35, 00, 0), "2020-10-25 02:35:00 CET +0100", true}, + {"UTC", FromDate(2020, 2, 31, 02, 35, 00, 0), "", false}, + } + + for _, tt := range tests { + loc, err := time.LoadLocation(tt.TZ) + require.NoError(t, err) + tp, err := tt.dt.AdjustedGoTime(loc) + if !tt.Success { + require.Error(t, err) + } else { + require.NoError(t, err) + require.Equal(t, tt.Expect, tp.Format("2006-01-02 15:04:05.999999999 MST -0700")) + } + } +} diff --git a/types/datum.go b/types/datum.go index 9dfae69f68307..3e9990d1070dc 100644 --- a/types/datum.go +++ b/types/datum.go @@ -31,6 +31,7 @@ import ( "github.com/pingcap/tidb/parser/types" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types/json" + "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/hack" ) @@ -366,6 +367,7 @@ func (d *Datum) GetRaw() []byte { } // SetAutoID set the auto increment ID according to its int flag. +// Don't use it directly, useless wrapped with setDatumAutoIDAndCast. func (d *Datum) SetAutoID(id int64, flag uint) { if mysql.HasUnsignedFlag(flag) { d.SetUint64(uint64(id)) @@ -548,7 +550,63 @@ func (d *Datum) SetValue(val interface{}, tp *types.FieldType) { } } +// Compare compares datum to another datum. +// Notes: don't rely on datum.collation to get the collator, it's tend to buggy. +// TODO: use this function to replace CompareDatum. After we remove all of usage of CompareDatum, we can rename this function back to CompareDatum. +func (d *Datum) Compare(sc *stmtctx.StatementContext, ad *Datum, comparer collate.Collator) (int, error) { + if d.k == KindMysqlJSON && ad.k != KindMysqlJSON { + cmp, err := ad.Compare(sc, d, comparer) + return cmp * -1, errors.Trace(err) + } + switch ad.k { + case KindNull: + if d.k == KindNull { + return 0, nil + } + return 1, nil + case KindMinNotNull: + if d.k == KindNull { + return -1, nil + } else if d.k == KindMinNotNull { + return 0, nil + } + return 1, nil + case KindMaxValue: + if d.k == KindMaxValue { + return 0, nil + } + return -1, nil + case KindInt64: + return d.compareInt64(sc, ad.GetInt64()) + case KindUint64: + return d.compareUint64(sc, ad.GetUint64()) + case KindFloat32, KindFloat64: + return d.compareFloat64(sc, ad.GetFloat64()) + case KindString: + return d.compareStringNew(sc, ad.GetString(), comparer) + case KindBytes: + return d.compareStringNew(sc, ad.GetString(), comparer) + case KindMysqlDecimal: + return d.compareMysqlDecimal(sc, ad.GetMysqlDecimal()) + case KindMysqlDuration: + return d.compareMysqlDuration(sc, ad.GetMysqlDuration()) + case KindMysqlEnum: + return d.compareMysqlEnumNew(sc, ad.GetMysqlEnum(), comparer) + case KindBinaryLiteral, KindMysqlBit: + return d.compareBinaryLiteralNew(sc, ad.GetBinaryLiteral4Cmp(), comparer) + case KindMysqlSet: + return d.compareMysqlSetNew(sc, ad.GetMysqlSet(), comparer) + case KindMysqlJSON: + return d.compareMysqlJSON(sc, ad.GetMysqlJSON()) + case KindMysqlTime: + return d.compareMysqlTime(sc, ad.GetMysqlTime()) + default: + return 0, nil + } +} + // CompareDatum compares datum to another datum. +// Deprecated: will be replaced with Compare. // TODO: return error properly. func (d *Datum) CompareDatum(sc *stmtctx.StatementContext, ad *Datum) (int, error) { if d.k == KindMysqlJSON && ad.k != KindMysqlJSON { @@ -673,6 +731,39 @@ func (d *Datum) compareFloat64(sc *stmtctx.StatementContext, f float64) (int, er } } +func (d *Datum) compareStringNew(sc *stmtctx.StatementContext, s string, comparer collate.Collator) (int, error) { + switch d.k { + case KindNull, KindMinNotNull: + return -1, nil + case KindMaxValue: + return 1, nil + case KindString, KindBytes: + return comparer.Compare(d.GetString(), s), nil + case KindMysqlDecimal: + dec := new(MyDecimal) + err := sc.HandleTruncate(dec.FromString(hack.Slice(s))) + return d.GetMysqlDecimal().Compare(dec), errors.Trace(err) + case KindMysqlTime: + dt, err := ParseDatetime(sc, s) + return d.GetMysqlTime().Compare(dt), errors.Trace(err) + case KindMysqlDuration: + dur, err := ParseDuration(sc, s, MaxFsp) + return d.GetMysqlDuration().Compare(dur), errors.Trace(err) + case KindMysqlSet: + return comparer.Compare(d.GetMysqlSet().String(), s), nil + case KindMysqlEnum: + return comparer.Compare(d.GetMysqlEnum().String(), s), nil + case KindBinaryLiteral, KindMysqlBit: + return comparer.Compare(d.GetBinaryLiteral4Cmp().ToString(), s), nil + default: + fVal, err := StrToFloat(sc, s, false) + if err != nil { + return 0, errors.Trace(err) + } + return d.compareFloat64(sc, fVal) + } +} + func (d *Datum) compareString(sc *stmtctx.StatementContext, s string, retCollation string) (int, error) { switch d.k { case KindNull, KindMinNotNull: @@ -748,6 +839,52 @@ func (d *Datum) compareMysqlDuration(sc *stmtctx.StatementContext, dur Duration) } } +func (d *Datum) compareMysqlEnumNew(sc *stmtctx.StatementContext, enum Enum, comparer collate.Collator) (int, error) { + switch d.k { + case KindNull, KindMinNotNull: + return -1, nil + case KindMaxValue: + return 1, nil + case KindString, KindBytes, KindMysqlEnum, KindMysqlSet: + return comparer.Compare(d.GetString(), enum.String()), nil + default: + return d.compareFloat64(sc, enum.ToNumber()) + } +} + +func (d *Datum) compareBinaryLiteralNew(sc *stmtctx.StatementContext, b BinaryLiteral, comparer collate.Collator) (int, error) { + switch d.k { + case KindNull, KindMinNotNull: + return -1, nil + case KindMaxValue: + return 1, nil + case KindString, KindBytes: + fallthrough // in this case, d is converted to Binary and then compared with b + case KindBinaryLiteral, KindMysqlBit: + return comparer.Compare(d.GetBinaryLiteral4Cmp().ToString(), b.ToString()), nil + default: + val, err := b.ToInt(sc) + if err != nil { + return 0, errors.Trace(err) + } + result, err := d.compareFloat64(sc, float64(val)) + return result, errors.Trace(err) + } +} + +func (d *Datum) compareMysqlSetNew(sc *stmtctx.StatementContext, set Set, comparer collate.Collator) (int, error) { + switch d.k { + case KindNull, KindMinNotNull: + return -1, nil + case KindMaxValue: + return 1, nil + case KindString, KindBytes, KindMysqlEnum, KindMysqlSet: + return comparer.Compare(d.GetString(), set.String()), nil + default: + return d.compareFloat64(sc, set.ToNumber()) + } +} + func (d *Datum) compareMysqlEnum(sc *stmtctx.StatementContext, enum Enum) (int, error) { switch d.k { case KindNull, KindMinNotNull: @@ -900,8 +1037,7 @@ func (d *Datum) convertToFloat(sc *stmtctx.StatementContext, target *FieldType) default: return invalidConv(d, target.Tp) } - var err1 error - f, err1 = ProduceFloatWithSpecifiedTp(f, target, sc) + f, err1 := ProduceFloatWithSpecifiedTp(f, target, sc) if err == nil && err1 != nil { err = err1 } @@ -915,6 +1051,12 @@ func (d *Datum) convertToFloat(sc *stmtctx.StatementContext, target *FieldType) // ProduceFloatWithSpecifiedTp produces a new float64 according to `flen` and `decimal`. func ProduceFloatWithSpecifiedTp(f float64, target *FieldType, sc *stmtctx.StatementContext) (_ float64, err error) { + if math.IsNaN(f) { + return 0, overflow(f, target.Tp) + } + if math.IsInf(f, 0) { + return f, overflow(f, target.Tp) + } // For float and following double type, we will only truncate it for float(M, D) format. // If no D is set, we will handle it like origin float whether M is set or not. if target.Flen != UnspecifiedLength && target.Decimal != UnspecifiedLength { @@ -996,9 +1138,9 @@ func ProduceStrWithSpecifiedTp(s string, tp *FieldType, sc *stmtctx.StatementCon // overflowed part is all whitespaces var overflowed string var characterLen int - // Flen is the rune length, not binary length, for UTF8 charset, we need to calculate the + // Flen is the rune length, not binary length, for Non-binary charset, we need to calculate the // rune count and truncate to Flen runes if it is too long. - if chs == charset.CharsetUTF8 || chs == charset.CharsetUTF8MB4 { + if chs != charset.CharsetBinary { characterLen = utf8.RuneCountInString(s) if characterLen > flen { // 1. If len(s) is 0 and flen is 0, truncateLen will be 0, don't truncate s. @@ -1131,7 +1273,8 @@ func (d *Datum) convertToMysqlTimestamp(sc *stmtctx.StatementContext, target *Fi case KindMysqlTime: t, err = d.GetMysqlTime().Convert(sc, target.Tp) if err != nil { - ret.SetMysqlTime(ZeroTimestamp) + // t might be an invalid Timestamp, but should still be comparable, since same representation (KindMysqlTime) + ret.SetMysqlTime(t) return ret, errors.Trace(ErrWrongValue.GenWithStackByArgs(TimestampStr, t.String())) } t, err = t.RoundFrac(sc, fsp) @@ -1374,7 +1517,7 @@ func ProduceDecWithSpecifiedTp(dec *MyDecimal, tp *FieldType, sc *stmtctx.Statem if err != nil { return nil, err } - if !dec.IsZero() && frac > decimal && dec.Compare(&old) != 0 { + if !old.IsZero() && frac > decimal && dec.Compare(&old) != 0 { sc.AppendWarning(ErrTruncatedWrongVal.GenWithStackByArgs("DECIMAL", &old)) err = nil } @@ -1499,7 +1642,13 @@ func (d *Datum) convertToMysqlEnum(sc *stmtctx.StatementContext, target *FieldTy case KindString, KindBytes, KindBinaryLiteral: e, err = ParseEnum(target.Elems, d.GetString(), target.Collate) case KindMysqlEnum: - e, err = ParseEnum(target.Elems, d.GetMysqlEnum().Name, target.Collate) + if d.i == 0 { + // MySQL enum zero value has an empty string name(Enum{Name: '', Value: 0}). It is + // different from the normal enum string value(Enum{Name: '', Value: n}, n > 0). + e = Enum{} + } else { + e, err = ParseEnum(target.Elems, d.GetMysqlEnum().Name, target.Collate) + } case KindMysqlSet: e, err = ParseEnum(target.Elems, d.GetMysqlSet().Name, target.Collate) default: @@ -1507,11 +1656,10 @@ func (d *Datum) convertToMysqlEnum(sc *stmtctx.StatementContext, target *FieldTy uintDatum, err = d.convertToUint(sc, target) if err == nil { e, err = ParseEnumValue(target.Elems, uintDatum.GetUint64()) + } else { + err = errors.Wrap(ErrTruncated, "convert to MySQL enum failed: "+err.Error()) } } - if err != nil { - err = errors.Wrap(ErrTruncated, "convert to MySQL enum failed: "+err.Error()) - } ret.SetMysqlEnum(e, target.Collate) return ret, err } @@ -1924,8 +2072,8 @@ func NewStringDatum(s string) (d Datum) { return d } -// NewCollationStringDatum creates a new Datum from a string with collation and length info. -func NewCollationStringDatum(s string, collation string, length int) (d Datum) { +// NewCollationStringDatum creates a new Datum from a string with collation. +func NewCollationStringDatum(s string, collation string) (d Datum) { d.SetString(s, collation) return d } @@ -2033,7 +2181,8 @@ func (ds *datumsSorter) Len() int { } func (ds *datumsSorter) Less(i, j int) bool { - cmp, err := ds.datums[i].CompareDatum(ds.sc, &ds.datums[j]) + // TODO: set collation explicitly when rewrites feedback. + cmp, err := ds.datums[i].Compare(ds.sc, &ds.datums[j], collate.GetCollator(ds.datums[i].Collation())) if err != nil { ds.err = errors.Trace(err) return true @@ -2215,7 +2364,7 @@ func ChangeReverseResultByUpperLowerBound( resRetType.Decimal = int(res.GetMysqlDecimal().GetDigitsInt()) } bound := getDatumBound(&resRetType, rType) - cmp, err := d.CompareDatum(sc, &bound) + cmp, err := d.Compare(sc, &bound, collate.GetCollator(resRetType.Collate)) if err != nil { return d, err } diff --git a/types/datum_test.go b/types/datum_test.go index 091b92c752b23..038205e89b833 100644 --- a/types/datum_test.go +++ b/types/datum_test.go @@ -25,12 +25,12 @@ import ( "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types/json" + "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/hack" "github.com/stretchr/testify/require" ) func TestDatum(t *testing.T) { - t.Parallel() values := []interface{}{ int64(1), uint64(1), @@ -61,7 +61,6 @@ func testDatumToBool(t *testing.T, in interface{}, res int) { } func TestToBool(t *testing.T) { - t.Parallel() testDatumToBool(t, 0, 0) testDatumToBool(t, int64(0), 0) testDatumToBool(t, uint64(0), 0) @@ -122,7 +121,6 @@ func testDatumToInt64(t *testing.T, val interface{}, expect int64) { } func TestToInt64(t *testing.T) { - t.Parallel() testDatumToInt64(t, "0", int64(0)) testDatumToInt64(t, 0, int64(0)) testDatumToInt64(t, int64(0), int64(0)) @@ -151,59 +149,45 @@ func TestToInt64(t *testing.T) { testDatumToInt64(t, v, int64(3)) } -func TestToFloat32(t *testing.T) { - t.Parallel() - ft := NewFieldType(mysql.TypeFloat) - var datum = NewFloat64Datum(281.37) - sc := new(stmtctx.StatementContext) - sc.IgnoreTruncate = true - converted, err := datum.ConvertTo(sc, ft) - require.NoError(t, err) - require.Equal(t, KindFloat32, converted.Kind()) - require.Equal(t, float32(281.37), converted.GetFloat32()) - - datum.SetString("281.37", mysql.DefaultCollationName) - converted, err = datum.ConvertTo(sc, ft) - require.NoError(t, err) - require.Equal(t, KindFloat32, converted.Kind()) - require.Equal(t, float32(281.37), converted.GetFloat32()) - - ft = NewFieldType(mysql.TypeDouble) - datum = NewFloat32Datum(281.37) - converted, err = datum.ConvertTo(sc, ft) - require.NoError(t, err) - require.Equal(t, KindFloat64, converted.Kind()) - // Convert to float32 and convert back to float64, we will get a different value. - require.NotEqual(t, 281.37, converted.GetFloat64()) - require.Equal(t, datum.GetFloat64(), converted.GetFloat64()) -} - -func TestToFloat64(t *testing.T) { - t.Parallel() +func TestConvertToFloat(t *testing.T) { testCases := []struct { d Datum + tp byte errMsg string - result float64 + r64 float64 + r32 float32 }{ - {NewDatum(float32(3.00)), "", 3.00}, - {NewDatum(float64(12345.678)), "", 12345.678}, - {NewDatum("12345.678"), "", 12345.678}, - {NewDatum([]byte("12345.678")), "", 12345.678}, - {NewDatum(int64(12345)), "", 12345}, - {NewDatum(uint64(123456)), "", 123456}, - {NewDatum(byte(123)), "cannot convert .*", 0}, + {NewDatum(float32(3.00)), mysql.TypeDouble, "", 3.00, 3.00}, + {NewDatum(float64(12345.678)), mysql.TypeDouble, "", 12345.678, 12345.678}, + {NewDatum("12345.678"), mysql.TypeDouble, "", 12345.678, 12345.678}, + {NewDatum([]byte("12345.678")), mysql.TypeDouble, "", 12345.678, 12345.678}, + {NewDatum(int64(12345)), mysql.TypeDouble, "", 12345, 12345}, + {NewDatum(uint64(123456)), mysql.TypeDouble, "", 123456, 123456}, + {NewDatum(byte(123)), mysql.TypeDouble, "cannot convert ", 0, 0}, + {NewDatum(math.NaN()), mysql.TypeDouble, "constant .* overflows double", 0, 0}, + {NewDatum(math.Inf(-1)), mysql.TypeDouble, "constant .* overflows double", math.Inf(-1), float32(math.Inf(-1))}, + {NewDatum(math.Inf(1)), mysql.TypeDouble, "constant .* overflows double", math.Inf(1), float32(math.Inf(1))}, + {NewDatum(float32(281.37)), mysql.TypeFloat, "", 281.37, 281.37}, + {NewDatum("281.37"), mysql.TypeFloat, "", 281.37, 281.37}, } sc := new(stmtctx.StatementContext) sc.IgnoreTruncate = true for _, testCase := range testCases { - converted, err := testCase.d.ToFloat64(sc) + converted, err := testCase.d.ConvertTo(sc, NewFieldType(testCase.tp)) if testCase.errMsg == "" { require.NoError(t, err) } else { - require.Regexp(t, testCase.errMsg, err) + require.Error(t, err) + require.Regexp(t, testCase.errMsg, err.Error()) + } + require.Equal(t, testCase.r32, converted.GetFloat32()) + if testCase.tp == mysql.TypeDouble { + require.Equal(t, testCase.r64, converted.GetFloat64()) + } else { + // Convert to float32 and convert back to float64, we will get a different value. + require.NotEqual(t, testCase.r64, converted.GetFloat64()) } - require.Equal(t, testCase.result, converted) } } @@ -218,7 +202,6 @@ func mustParseTimeIntoDatum(s string, tp byte, fsp int8) (d Datum) { } func TestToJSON(t *testing.T) { - t.Parallel() ft := NewFieldType(mysql.TypeJSON) sc := new(stmtctx.StatementContext) tests := []struct { @@ -248,7 +231,7 @@ func TestToJSON(t *testing.T) { require.NoError(t, err) var cmp int - cmp, err = obtain.CompareDatum(sc, &expected) + cmp, err = obtain.Compare(sc, &expected, collate.GetBinaryCollator()) require.NoError(t, err) require.Equal(t, 0, cmp) } else { @@ -258,7 +241,6 @@ func TestToJSON(t *testing.T) { } func TestIsNull(t *testing.T) { - t.Parallel() tests := []struct { data interface{} isnull bool @@ -281,7 +263,6 @@ func testIsNull(t *testing.T, data interface{}, isnull bool) { } func TestToBytes(t *testing.T) { - t.Parallel() tests := []struct { a Datum out []byte @@ -302,7 +283,6 @@ func TestToBytes(t *testing.T) { } func TestComputePlusAndMinus(t *testing.T) { - t.Parallel() sc := &stmtctx.StatementContext{TimeZone: time.UTC} tests := []struct { a Datum @@ -324,14 +304,13 @@ func TestComputePlusAndMinus(t *testing.T) { for ith, tt := range tests { got, err := ComputePlus(tt.a, tt.b) require.Equal(t, tt.hasErr, err != nil) - v, err := got.CompareDatum(sc, &tt.plus) + v, err := got.Compare(sc, &tt.plus, collate.GetBinaryCollator()) require.NoError(t, err) require.Equalf(t, 0, v, "%dth got:%#v, %#v, expect:%#v, %#v", ith, got, got.x, tt.plus, tt.plus.x) } } func TestCloneDatum(t *testing.T) { - t.Parallel() var raw Datum raw.b = []byte("raw") raw.k = KindRaw @@ -347,7 +326,7 @@ func TestCloneDatum(t *testing.T) { sc.IgnoreTruncate = true for _, tt := range tests { tt1 := *tt.Clone() - res, err := tt.CompareDatum(sc, &tt1) + res, err := tt.Compare(sc, &tt1, collate.GetBinaryCollator()) require.NoError(t, err) require.Equal(t, 0, res) if tt.b != nil { @@ -378,7 +357,6 @@ func newRetTypeWithFlenDecimal(tp byte, flen int, decimal int) *FieldType { } func TestEstimatedMemUsage(t *testing.T) { - t.Parallel() b := []byte{'a', 'b', 'c', 'd'} enum := Enum{Name: "a", Value: 1} datumArray := []Datum{ @@ -398,7 +376,6 @@ func TestEstimatedMemUsage(t *testing.T) { } func TestChangeReverseResultByUpperLowerBound(t *testing.T) { - t.Parallel() sc := new(stmtctx.StatementContext) sc.IgnoreTruncate = true sc.OverflowAsWarning = true @@ -489,7 +466,7 @@ func TestChangeReverseResultByUpperLowerBound(t *testing.T) { reverseRes, err := ChangeReverseResultByUpperLowerBound(sc, test.retType, test.a, test.roundType) require.NoError(t, err) var cmp int - cmp, err = reverseRes.CompareDatum(sc, &test.res) + cmp, err = reverseRes.Compare(sc, &test.res, collate.GetBinaryCollator()) require.NoError(t, err) require.Equalf(t, 0, cmp, "%dth got:%#v, expect:%#v", ith, reverseRes, test.res) } @@ -513,7 +490,6 @@ func prepareCompareDatums() ([]Datum, []Datum) { } func TestStringToMysqlBit(t *testing.T) { - t.Parallel() tests := []struct { a Datum out []byte @@ -542,7 +518,7 @@ func BenchmarkCompareDatum(b *testing.B) { b.ResetTimer() for i := 0; i < b.N; i++ { for j, v := range vals { - _, err := v.CompareDatum(sc, &vals1[j]) + _, err := v.Compare(sc, &vals1[j], collate.GetBinaryCollator()) if err != nil { b.Fatal(err) } diff --git a/types/enum.go b/types/enum.go index d21c63ab18c7b..47e4684536412 100644 --- a/types/enum.go +++ b/types/enum.go @@ -15,6 +15,7 @@ package types import ( + "fmt" "strconv" "github.com/pingcap/errors" @@ -55,8 +56,8 @@ func ParseEnum(elems []string, name string, collation string) (Enum, error) { if num, err := strconv.ParseUint(name, 0, 64); err == nil { return ParseEnumValue(elems, num) } - - return Enum{}, errors.Errorf("item %s is not in enum %v", name, elems) + errMsg := fmt.Sprintf("convert to MySQL enum failed: item %s is not in enum %v", name, elems) + return Enum{}, errors.Wrap(ErrTruncated, errMsg) } // ParseEnumName creates a Enum with item name. @@ -67,14 +68,15 @@ func ParseEnumName(elems []string, name string, collation string) (Enum, error) return Enum{Name: n, Value: uint64(i) + 1}, nil } } - - return Enum{}, errors.Errorf("item %s is not in enum %v", name, elems) + errMsg := fmt.Sprintf("convert to MySQL enum failed: item %s is not in enum %v", name, elems) + return Enum{}, errors.Wrap(ErrTruncated, errMsg) } // ParseEnumValue creates a Enum with special number. func ParseEnumValue(elems []string, number uint64) (Enum, error) { if number == 0 || number > uint64(len(elems)) { - return Enum{}, errors.Errorf("number %d overflow enum boundary [1, %d]", number, len(elems)) + errMsg := fmt.Sprintf("convert to MySQL enum failed: number %d overflow enum boundary [1, %d]", number, len(elems)) + return Enum{}, errors.Wrap(ErrTruncated, errMsg) } return Enum{Name: elems[number-1], Value: number}, nil diff --git a/types/errors_test.go b/types/errors_test.go index c1aefaec27037..00e2dd4e211e4 100644 --- a/types/errors_test.go +++ b/types/errors_test.go @@ -22,8 +22,6 @@ import ( ) func TestError(t *testing.T) { - t.Parallel() - kvErrs := []*terror.Error{ ErrInvalidDefault, ErrDataTooLong, diff --git a/types/etc_test.go b/types/etc_test.go index 18bdebd30c48e..8a18ffd84e7d3 100644 --- a/types/etc_test.go +++ b/types/etc_test.go @@ -36,8 +36,6 @@ func testIsTypeChar(t *testing.T, tp byte, expect bool) { } func TestIsType(t *testing.T) { - t.Parallel() - testIsTypeBlob(t, mysql.TypeTinyBlob, true) testIsTypeBlob(t, mysql.TypeMediumBlob, true) testIsTypeBlob(t, mysql.TypeBlob, true) @@ -60,8 +58,6 @@ func testTypeToStr(t *testing.T, tp byte, charset string, expect string) { } func TestTypeToStr(t *testing.T) { - t.Parallel() - testTypeStr(t, mysql.TypeYear, "year") testTypeStr(t, 0xdd, "") @@ -98,8 +94,6 @@ func TestTypeToStr(t *testing.T) { } func TestEOFAsNil(t *testing.T) { - t.Parallel() - err := EOFAsNil(io.EOF) require.NoError(t, err) err = EOFAsNil(errors.New("test")) @@ -107,8 +101,6 @@ func TestEOFAsNil(t *testing.T) { } func TestMaxFloat(t *testing.T) { - t.Parallel() - tests := []struct { flen int decimal int @@ -126,8 +118,6 @@ func TestMaxFloat(t *testing.T) { } func TestRoundFloat(t *testing.T) { - t.Parallel() - tests := []struct { input float64 expect float64 @@ -149,8 +139,6 @@ func TestRoundFloat(t *testing.T) { } func TestRound(t *testing.T) { - t.Parallel() - tests := []struct { input float64 dec int @@ -170,8 +158,6 @@ func TestRound(t *testing.T) { } func TestTruncateFloat(t *testing.T) { - t.Parallel() - tests := []struct { input float64 flen int @@ -194,8 +180,6 @@ func TestTruncateFloat(t *testing.T) { } func TestIsTypeTemporal(t *testing.T) { - t.Parallel() - res := IsTypeTemporal(mysql.TypeDuration) require.True(t, res) res = IsTypeTemporal(mysql.TypeDatetime) @@ -211,8 +195,6 @@ func TestIsTypeTemporal(t *testing.T) { } func TestIsBinaryStr(t *testing.T) { - t.Parallel() - in := FieldType{ Tp: mysql.TypeBit, Flag: mysql.UnsignedFlag, @@ -235,8 +217,6 @@ func TestIsBinaryStr(t *testing.T) { } func TestIsNonBinaryStr(t *testing.T) { - t.Parallel() - in := FieldType{ Tp: mysql.TypeBit, Flag: mysql.UnsignedFlag, @@ -260,8 +240,6 @@ func TestIsNonBinaryStr(t *testing.T) { } func TestIsTemporalWithDate(t *testing.T) { - t.Parallel() - res := IsTemporalWithDate(mysql.TypeDatetime) require.True(t, res) @@ -276,8 +254,6 @@ func TestIsTemporalWithDate(t *testing.T) { } func TestIsTypePrefixable(t *testing.T) { - t.Parallel() - res := IsTypePrefixable('t') require.False(t, res) @@ -286,8 +262,6 @@ func TestIsTypePrefixable(t *testing.T) { } func TestIsTypeFractionable(t *testing.T) { - t.Parallel() - res := IsTypeFractionable(mysql.TypeDatetime) require.True(t, res) @@ -302,8 +276,6 @@ func TestIsTypeFractionable(t *testing.T) { } func TestIsTypeNumeric(t *testing.T) { - t.Parallel() - res := IsTypeNumeric(mysql.TypeBit) require.True(t, res) diff --git a/types/field_type_test.go b/types/field_type_test.go index 73b40fea3b920..cc4dd9db0765b 100644 --- a/types/field_type_test.go +++ b/types/field_type_test.go @@ -23,8 +23,6 @@ import ( ) func TestFieldType(t *testing.T) { - t.Parallel() - ft := NewFieldType(mysql.TypeDuration) require.Equal(t, UnspecifiedLength, ft.Flen) require.Equal(t, UnspecifiedLength, ft.Decimal) @@ -158,8 +156,6 @@ func TestFieldType(t *testing.T) { } func TestDefaultTypeForValue(t *testing.T) { - t.Parallel() - tests := []struct { value interface{} tp byte @@ -210,8 +206,6 @@ func TestDefaultTypeForValue(t *testing.T) { } func TestAggFieldType(t *testing.T) { - t.Parallel() - fts := []*FieldType{ NewFieldType(mysql.TypeUnspecified), NewFieldType(mysql.TypeTiny), @@ -306,8 +300,6 @@ func TestAggFieldType(t *testing.T) { } func TestAggFieldTypeForTypeFlag(t *testing.T) { - t.Parallel() - types := []*FieldType{ NewFieldType(mysql.TypeLonglong), NewFieldType(mysql.TypeLonglong), @@ -335,8 +327,6 @@ func TestAggFieldTypeForTypeFlag(t *testing.T) { } func TestAggFieldTypeForIntegralPromotion(t *testing.T) { - t.Parallel() - fts := []*FieldType{ NewFieldType(mysql.TypeTiny), NewFieldType(mysql.TypeShort), @@ -375,8 +365,6 @@ func TestAggFieldTypeForIntegralPromotion(t *testing.T) { } func TestAggregateEvalType(t *testing.T) { - t.Parallel() - fts := []*FieldType{ NewFieldType(mysql.TypeUnspecified), NewFieldType(mysql.TypeTiny), diff --git a/types/format_test.go b/types/format_test.go index c33b9985975d9..95f20cacb727e 100644 --- a/types/format_test.go +++ b/types/format_test.go @@ -24,8 +24,6 @@ import ( ) func TestTimeFormatMethod(t *testing.T) { - t.Parallel() - sc := mock.NewContext().GetSessionVars().StmtCtx sc.IgnoreZeroInDate = true tblDate := []struct { @@ -81,8 +79,6 @@ func TestTimeFormatMethod(t *testing.T) { } func TestStrToDate(t *testing.T) { - t.Parallel() - sc := mock.NewContext().GetSessionVars().StmtCtx sc.IgnoreZeroInDate = true tests := []struct { diff --git a/types/fsp_test.go b/types/fsp_test.go index f03b421c0f745..1daa31ee82c72 100644 --- a/types/fsp_test.go +++ b/types/fsp_test.go @@ -22,7 +22,6 @@ import ( ) func TestCheckFsp(t *testing.T) { - t.Parallel() obtained, err := CheckFsp(int(UnspecifiedFsp)) require.Equal(t, DefaultFsp, obtained) require.NoError(t, err) @@ -62,7 +61,6 @@ func TestCheckFsp(t *testing.T) { } func TestParseFrac(t *testing.T) { - t.Parallel() obtained, overflow, err := ParseFrac("", 5) require.Equal(t, 0, obtained) require.False(t, overflow) @@ -73,13 +71,13 @@ func TestParseFrac(t *testing.T) { require.Equal(t, 0, obtained) require.False(t, overflow) require.Error(t, err) - require.Regexp(t, "Invalid fsp .*", err.Error()) + require.Regexp(t, "^Invalid fsp ", err.Error()) obtained, overflow, err = ParseFrac("NotNum", MaxFsp) require.Equal(t, 0, obtained) require.False(t, overflow) require.Error(t, err) - require.Regexp(t, "strconv.ParseInt:.*", err.Error()) + require.Regexp(t, "^strconv.ParseInt:", err.Error()) obtained, overflow, err = ParseFrac("1235", 6) require.Equal(t, 123500, obtained) @@ -121,7 +119,6 @@ func TestParseFrac(t *testing.T) { } func TestAlignFrac(t *testing.T) { - t.Parallel() obtained := alignFrac("100", 6) require.Equal(t, "100000", obtained) obtained = alignFrac("10000000000", 6) diff --git a/types/helper_test.go b/types/helper_test.go index 13d866aeb0a34..dc3fc9093aad3 100644 --- a/types/helper_test.go +++ b/types/helper_test.go @@ -23,8 +23,6 @@ import ( ) func TestStrToInt(t *testing.T) { - t.Parallel() - tests := []struct { input string output string @@ -45,8 +43,6 @@ func TestStrToInt(t *testing.T) { } func TestTruncate(t *testing.T) { - t.Parallel() - tests := []struct { f float64 dec int @@ -64,8 +60,6 @@ func TestTruncate(t *testing.T) { } func TestTruncateFloatToString(t *testing.T) { - t.Parallel() - tests := []struct { f float64 dec int diff --git a/types/json/binary_functions_test.go b/types/json/binary_functions_test.go index 375a6100ed3a6..664564365e6ac 100644 --- a/types/json/binary_functions_test.go +++ b/types/json/binary_functions_test.go @@ -20,8 +20,6 @@ import ( ) func TestDecodeEscapedUnicode(t *testing.T) { - t.Parallel() - in := "597d" r, size, err := decodeEscapedUnicode([]byte(in)) require.NoError(t, err) diff --git a/types/json/binary_test.go b/types/json/binary_test.go index 2d7fe58ee4eb8..e276d81def524 100644 --- a/types/json/binary_test.go +++ b/types/json/binary_test.go @@ -24,8 +24,6 @@ import ( ) func TestBinaryJSONMarshalUnmarshal(t *testing.T) { - t.Parallel() - expectedList := []string{ `{"a": [1, "2", {"aa": "bb"}, 4, null], "b": true, "c": null}`, `{"aaaaaaaaaaa": [1, "2", {"aa": "bb"}, 4.1], "bbbbbbbbbb": true, "ccccccccc": "d"}`, @@ -40,10 +38,12 @@ func TestBinaryJSONMarshalUnmarshal(t *testing.T) { } func TestBinaryJSONExtract(t *testing.T) { - t.Parallel() - bj1 := mustParseBinaryFromString(t, `{"\"hello\"": "world", "a": [1, "2", {"aa": "bb"}, 4.0, {"aa": "cc"}], "b": true, "c": ["d"]}`) bj2 := mustParseBinaryFromString(t, `[{"a": 1, "b": true}, 3, 3.5, "hello, world", null, true]`) + bj3 := mustParseBinaryFromString(t, `{"properties": {"$type": "TiDB"}}`) + bj4 := mustParseBinaryFromString(t, `{"properties": {"$type$type": {"$a$a" : "TiDB"}}}`) + bj5 := mustParseBinaryFromString(t, `{"properties": {"$type": {"$a" : {"$b" : "TiDB"}}}}`) + bj6 := mustParseBinaryFromString(t, `{"properties": {"$type": {"$a$a" : "TiDB"}},"hello": {"$b$b": "world","$c": "amazing"}}`) var tests = []struct { bj BinaryJSON @@ -63,10 +63,17 @@ func TestBinaryJSONExtract(t *testing.T) { {bj1, []string{`$.a[*]."aa"`}, mustParseBinaryFromString(t, `["bb", "cc"]`), true, nil}, {bj1, []string{`$."\"hello\""`}, mustParseBinaryFromString(t, `"world"`), true, nil}, {bj1, []string{`$**[1]`}, mustParseBinaryFromString(t, `"2"`), true, nil}, + {bj3, []string{`$.properties.$type`}, mustParseBinaryFromString(t, `"TiDB"`), true, nil}, + {bj4, []string{`$.properties.$type$type`}, mustParseBinaryFromString(t, `{"$a$a" : "TiDB"}`), true, nil}, + {bj4, []string{`$.properties.$type$type.$a$a`}, mustParseBinaryFromString(t, `"TiDB"`), true, nil}, + {bj5, []string{`$.properties.$type.$a.$b`}, mustParseBinaryFromString(t, `"TiDB"`), true, nil}, + {bj5, []string{`$.properties.$type.$a.*[0]`}, mustParseBinaryFromString(t, `"TiDB"`), true, nil}, // test extract with multi path expressions. {bj1, []string{"$.a", "$[5]"}, mustParseBinaryFromString(t, `[[1, "2", {"aa": "bb"}, 4.0, {"aa": "cc"}]]`), true, nil}, {bj2, []string{"$.a", "$[0]"}, mustParseBinaryFromString(t, `[{"a": 1, "b": true}]`), true, nil}, + {bj6, []string{"$.properties", "$[1]"}, mustParseBinaryFromString(t, `[{"$type": {"$a$a" : "TiDB"}}]`), true, nil}, + {bj6, []string{"$.hello", "$[2]"}, mustParseBinaryFromString(t, `[{"$b$b": "world","$c": "amazing"}]`), true, nil}, } for _, test := range tests { @@ -86,8 +93,6 @@ func TestBinaryJSONExtract(t *testing.T) { } func TestBinaryJSONType(t *testing.T) { - t.Parallel() - var tests = []struct { in string out string @@ -111,8 +116,6 @@ func TestBinaryJSONType(t *testing.T) { } func TestBinaryJSONUnquote(t *testing.T) { - t.Parallel() - var tests = []struct { json string unquoted string @@ -139,8 +142,6 @@ func TestBinaryJSONUnquote(t *testing.T) { } func TestQuoteString(t *testing.T) { - t.Parallel() - var tests = []struct { raw string quoted string @@ -163,8 +164,6 @@ func TestQuoteString(t *testing.T) { } func TestBinaryJSONModify(t *testing.T) { - t.Parallel() - var tests = []struct { base string setField string @@ -219,8 +218,6 @@ func TestBinaryJSONModify(t *testing.T) { } func TestBinaryJSONRemove(t *testing.T) { - t.Parallel() - var tests = []struct { base string path string @@ -257,8 +254,6 @@ func TestBinaryJSONRemove(t *testing.T) { } func TestCompareBinary(t *testing.T) { - t.Parallel() - jNull := mustParseBinaryFromString(t, `null`) jBoolTrue := mustParseBinaryFromString(t, `true`) jBoolFalse := mustParseBinaryFromString(t, `false`) @@ -323,8 +318,6 @@ func TestCompareBinary(t *testing.T) { } func TestBinaryJSONMerge(t *testing.T) { - t.Parallel() - var tests = []struct { suffixes []string expected string @@ -368,8 +361,6 @@ func BenchmarkBinaryMarshal(b *testing.B) { } func TestBinaryJSONContains(t *testing.T) { - t.Parallel() - var tests = []struct { input string target string @@ -401,8 +392,6 @@ func TestBinaryJSONContains(t *testing.T) { } func TestBinaryJSONCopy(t *testing.T) { - t.Parallel() - expectedList := []string{ `{"a": [1, "2", {"aa": "bb"}, 4, null], "b": true, "c": null}`, `{"aaaaaaaaaaa": [1, "2", {"aa": "bb"}, 4.1], "bbbbbbbbbb": true, "ccccccccc": "d"}`, @@ -415,8 +404,6 @@ func TestBinaryJSONCopy(t *testing.T) { } func TestGetKeys(t *testing.T) { - t.Parallel() - parsedBJ := mustParseBinaryFromString(t, "[]") require.Equal(t, "[]", parsedBJ.GetKeys().String()) parsedBJ = mustParseBinaryFromString(t, "{}") @@ -434,8 +421,6 @@ func TestGetKeys(t *testing.T) { } func TestBinaryJSONDepth(t *testing.T) { - t.Parallel() - var tests = []struct { input string expected int @@ -456,22 +441,18 @@ func TestBinaryJSONDepth(t *testing.T) { } func TestParseBinaryFromString(t *testing.T) { - t.Parallel() - obj, err := ParseBinaryFromString("") require.Error(t, err) require.Equal(t, "", obj.String()) - require.Regexp(t, ".*The document is empty.*", err.Error()) + require.Contains(t, err.Error(), "The document is empty") obj, err = ParseBinaryFromString(`"a""`) require.Error(t, err) require.Equal(t, "", obj.String()) - require.Regexp(t, ".*The document root must not be followed by other values\\..*", err.Error()) + require.Contains(t, err.Error(), "The document root must not be followed by other values.") } func TestCreateBinary(t *testing.T) { - t.Parallel() - bj := CreateBinary(int64(1 << 62)) require.Equal(t, TypeCodeInt64, bj.TypeCode) require.NotNil(t, bj.Value) @@ -493,7 +474,7 @@ func TestCreateBinary(t *testing.T) { func() { defer func() { r := recover() - require.Regexp(t, "unknown type:.*", r) + require.Regexp(t, "^unknown type:", r) }() bj = CreateBinary(int8(123)) require.Equal(t, bj.TypeCode, bj.TypeCode) @@ -502,8 +483,6 @@ func TestCreateBinary(t *testing.T) { } func TestFunctions(t *testing.T) { - t.Parallel() - testByte := []byte{'\\', 'b', 'f', 'n', 'r', 't', 'u', 'z', '0'} testOutput, err := unquoteString(string(testByte)) require.Equal(t, "\bfnrtuz0", testOutput) @@ -519,8 +498,6 @@ func TestFunctions(t *testing.T) { } func TestBinaryJSONExtractCallback(t *testing.T) { - t.Parallel() - bj1 := mustParseBinaryFromString(t, `{"\"hello\"": "world", "a": [1, "2", {"aa": "bb"}, 4.0, {"aa": "cc"}], "b": true, "c": ["d"]}`) bj2 := mustParseBinaryFromString(t, `[{"a": 1, "b": true}, 3, 3.5, "hello, world", null, true]`) @@ -590,8 +567,6 @@ func TestBinaryJSONExtractCallback(t *testing.T) { } func TestBinaryJSONWalk(t *testing.T) { - t.Parallel() - bj1 := mustParseBinaryFromString(t, `["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}]`) bj2 := mustParseBinaryFromString(t, `{}`) diff --git a/types/json/path_expr.go b/types/json/path_expr.go index 9500d759daa9b..5d23c1a16ed3a 100644 --- a/types/json/path_expr.go +++ b/types/json/path_expr.go @@ -46,9 +46,9 @@ import ( select json_extract('{"a": "b", "c": [1, "2"]}', '$.*') -> ["b", [1, "2"]] */ -// [a-zA-Z_][a-zA-Z0-9_]* matches any identifier; +// ([\$]*[a-zA-Z_][a-zA-Z0-9_]*)+ matches any identifier, may start with $ and appear multiple times; // "[^"\\]*(\\.[^"\\]*)*" matches any string literal which can carry escaped quotes; -var jsonPathExprLegRe = regexp.MustCompile(`(\.\s*([a-zA-Z_][a-zA-Z0-9_]*|\*|"[^"\\]*(\\.[^"\\]*)*")|(\[\s*([0-9]+|\*)\s*\])|\*\*)`) +var jsonPathExprLegRe = regexp.MustCompile(`(\.\s*(([\$]*[a-zA-Z_][a-zA-Z0-9_]*)+|\*|"[^"\\]*(\\.[^"\\]*)*")|(\[\s*([0-9]+|\*)\s*\])|\*\*)`) type pathLegType byte diff --git a/types/json/path_expr_test.go b/types/json/path_expr_test.go index 703a34596e482..0d229848da01f 100644 --- a/types/json/path_expr_test.go +++ b/types/json/path_expr_test.go @@ -35,7 +35,6 @@ func TestContainsAnyAsterisk(t *testing.T) { // copy iterator variable into a new variable, see issue #27779 test := test t.Run(test.expression, func(t *testing.T) { - t.Parallel() pe, err := ParseJSONPathExpr(test.expression) require.NoError(t, err) require.Equal(t, test.containsAsterisks, pe.flags.containsAnyAsterisk()) @@ -65,7 +64,6 @@ func TestValidatePathExpr(t *testing.T) { // copy iterator variable into a new variable, see issue #27779 test := test t.Run(test.expression, func(t *testing.T) { - t.Parallel() pe, err := ParseJSONPathExpr(test.expression) if test.success { require.NoError(t, err) @@ -91,7 +89,6 @@ func TestPathExprToString(t *testing.T) { // copy iterator variable into a new variable, see issue #27779 test := test t.Run(test.expression, func(t *testing.T) { - t.Parallel() pe, err := ParseJSONPathExpr(test.expression) require.NoError(t, err) require.Equal(t, test.expression, pe.String()) @@ -118,7 +115,6 @@ func TestPushBackOneIndexLeg(t *testing.T) { // copy iterator variable into a new variable, see issue #27779 test := test t.Run(test.expression, func(t *testing.T) { - t.Parallel() pe, err := ParseJSONPathExpr(test.expression) require.NoError(t, err) diff --git a/types/mydecimal.go b/types/mydecimal.go index d98d64ad09ea6..e0cbe3a928aed 100644 --- a/types/mydecimal.go +++ b/types/mydecimal.go @@ -17,6 +17,7 @@ package types import ( "math" "strconv" + "strings" "github.com/pingcap/errors" "github.com/pingcap/log" @@ -393,8 +394,6 @@ func (d *MyDecimal) ToString() (str []byte) { // FromString parses decimal from string. func (d *MyDecimal) FromString(str []byte) error { - // strErr is used to check str is bad number or not - var strErr error for i := 0; i < len(str); i++ { if !isSpace(str[i]) { str = str[i:] @@ -425,8 +424,6 @@ func (d *MyDecimal) FromString(str []byte) error { endIdx++ } digitsFrac = endIdx - strIdx - 1 - } else if strIdx < len(str) && (str[strIdx] != 'e' && str[strIdx] != 'E' && str[strIdx] != ' ') { - strErr = ErrBadNumber } else { digitsFrac = 0 endIdx = strIdx @@ -486,33 +483,40 @@ func (d *MyDecimal) FromString(str []byte) error { if innerIdx != 0 { d.wordBuf[wordIdx] = word * powers10[digitsPerWord-innerIdx] } - if endIdx+1 <= len(str) && (str[endIdx] == 'e' || str[endIdx] == 'E') { - exponent, err1 := strToInt(string(str[endIdx+1:])) - if err1 != nil { - err = errors.Cause(err1) - if err != ErrTruncated { + if endIdx+1 <= len(str) { + if str[endIdx] == 'e' || str[endIdx] == 'E' { + exponent, err1 := strToInt(string(str[endIdx+1:])) + if err1 != nil { + err = errors.Cause(err1) + if err != ErrTruncated { + *d = zeroMyDecimal + } + } + if exponent > math.MaxInt32/2 { + negative := d.negative + maxDecimal(wordBufLen*digitsPerWord, 0, d) + d.negative = negative + err = ErrOverflow + } + if exponent < math.MinInt32/2 && err != ErrOverflow { *d = zeroMyDecimal + err = ErrTruncated } - } - if exponent > math.MaxInt32/2 { - negative := d.negative - maxDecimal(wordBufLen*digitsPerWord, 0, d) - d.negative = negative - err = ErrOverflow - } - if exponent < math.MinInt32/2 && err != ErrOverflow { - *d = zeroMyDecimal - err = ErrTruncated - } - if err != ErrOverflow { - shiftErr := d.Shift(int(exponent)) - if shiftErr != nil { - if shiftErr == ErrOverflow { - negative := d.negative - maxDecimal(wordBufLen*digitsPerWord, 0, d) - d.negative = negative + if err != ErrOverflow { + shiftErr := d.Shift(int(exponent)) + if shiftErr != nil { + if shiftErr == ErrOverflow { + negative := d.negative + maxDecimal(wordBufLen*digitsPerWord, 0, d) + d.negative = negative + } + err = shiftErr } - err = shiftErr + } + } else { + trimstr := strings.TrimSpace(string(str[endIdx:])) + if len(trimstr) != 0 { + err = ErrTruncated } } } @@ -527,9 +531,6 @@ func (d *MyDecimal) FromString(str []byte) error { d.negative = false } d.resultFrac = d.digitsFrac - if strErr != nil { - return strErr - } return err } diff --git a/types/mydecimal_serial_test.go b/types/mydecimal_serial_test.go index cae30ed8a04c6..cd72ef7ce131a 100644 --- a/types/mydecimal_serial_test.go +++ b/types/mydecimal_serial_test.go @@ -161,8 +161,8 @@ func TestFromStringMyDecimal(t *testing.T) { tests := []tcase{ {"12345", "12345", nil}, {"12345.", "12345", nil}, - {"123.45.", "123.45", nil}, - {"-123.45.", "-123.45", nil}, + {"123.45.", "123.45", ErrTruncated}, + {"-123.45.", "-123.45", ErrTruncated}, {".00012345000098765", "0.00012345000098765", nil}, {".12345000098765", "0.12345000098765", nil}, {"-.000000012345000098765", "-0.000000012345000098765", nil}, @@ -180,6 +180,10 @@ func TestFromStringMyDecimal(t *testing.T) { {"1e - 1", "1", ErrTruncated}, {"1e -1", "0.1", nil}, {"0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "0.000000000000000000000000000000000000000000000000000000000000000000000000", ErrTruncated}, + {"1asf", "1", ErrTruncated}, + {"1.1.1.1.1", "1.1", ErrTruncated}, + {"1 1", "1", ErrTruncated}, + {"1 ", "1", nil}, } dotest(tests) diff --git a/types/mydecimal_test.go b/types/mydecimal_test.go index 786586493a502..61e86ffb1dc7a 100644 --- a/types/mydecimal_test.go +++ b/types/mydecimal_test.go @@ -23,7 +23,6 @@ import ( ) func TestFromInt(t *testing.T) { - t.Parallel() tests := []struct { input int64 output string @@ -42,7 +41,6 @@ func TestFromInt(t *testing.T) { } func TestFromUint(t *testing.T) { - t.Parallel() tests := []struct { input uint64 output string @@ -60,7 +58,6 @@ func TestFromUint(t *testing.T) { } func TestToInt(t *testing.T) { - t.Parallel() tests := []struct { input string output int64 @@ -86,7 +83,6 @@ func TestToInt(t *testing.T) { } func TestToUint(t *testing.T) { - t.Parallel() tests := []struct { input string output uint64 @@ -112,7 +108,6 @@ func TestToUint(t *testing.T) { } func TestFromFloat(t *testing.T) { - t.Parallel() tests := []struct { s string f float64 @@ -131,7 +126,6 @@ func TestFromFloat(t *testing.T) { } func TestToFloat(t *testing.T) { - t.Parallel() tests := []struct { in string out string @@ -189,7 +183,6 @@ func TestToFloat(t *testing.T) { } func TestToHashKey(t *testing.T) { - t.Parallel() tests := []struct { numbers []string }{ @@ -267,7 +260,6 @@ func TestToHashKey(t *testing.T) { } func TestRemoveTrailingZeros(t *testing.T) { - t.Parallel() tests := []string{ "0", "0.0", ".0", ".00000000", "0.0000", "0000", "0000.0", "0000.000", "-0", "-0.0", "-.0", "-.00000000", "-0.0000", "-0000", "-0000.0", "-0000.000", @@ -301,7 +293,6 @@ func TestRemoveTrailingZeros(t *testing.T) { } func TestRoundWithHalfEven(t *testing.T) { - t.Parallel() tests := []struct { input string scale int @@ -338,7 +329,6 @@ func TestRoundWithHalfEven(t *testing.T) { } func TestRoundWithTruncate(t *testing.T) { - t.Parallel() tests := []struct { input string scale int @@ -374,7 +364,6 @@ func TestRoundWithTruncate(t *testing.T) { } func TestRoundWithCeil(t *testing.T) { - t.Parallel() tests := []struct { input string scale int @@ -411,7 +400,6 @@ func TestRoundWithCeil(t *testing.T) { } func TestToString(t *testing.T) { - t.Parallel() type tcase struct { input string output string @@ -431,7 +419,6 @@ func TestToString(t *testing.T) { } func TestToBinFromBin(t *testing.T) { - t.Parallel() type tcase struct { input string precision int @@ -502,7 +489,6 @@ func TestToBinFromBin(t *testing.T) { } func TestCompareMyDecimal(t *testing.T) { - t.Parallel() type tcase struct { a string b string @@ -532,7 +518,6 @@ func TestCompareMyDecimal(t *testing.T) { } func TestMaxDecimal(t *testing.T) { - t.Parallel() type tcase struct { prec int frac int @@ -564,7 +549,6 @@ func TestMaxDecimal(t *testing.T) { } func TestNegMyDecimal(t *testing.T) { - t.Parallel() type testCase struct { a string result string @@ -583,7 +567,6 @@ func TestNegMyDecimal(t *testing.T) { } func TestAddMyDecimal(t *testing.T) { - t.Parallel() type testCase struct { a string b string @@ -620,7 +603,6 @@ func TestAddMyDecimal(t *testing.T) { } func TestSubMyDecimal(t *testing.T) { - t.Parallel() type tcase struct { a string b string @@ -658,7 +640,6 @@ func TestSubMyDecimal(t *testing.T) { } func TestMulMyDecimal(t *testing.T) { - t.Parallel() type tcase struct { a string b string @@ -693,7 +674,6 @@ func TestMulMyDecimal(t *testing.T) { } func TestDivModMyDecimal(t *testing.T) { - t.Parallel() type tcase struct { a string b string @@ -801,7 +781,6 @@ func TestDivModMyDecimal(t *testing.T) { } func TestMaxOrMinMyDecimal(t *testing.T) { - t.Parallel() type tcase struct { neg bool prec int @@ -822,7 +801,6 @@ func TestMaxOrMinMyDecimal(t *testing.T) { } func TestReset(t *testing.T) { - t.Parallel() var x1, y1, z1 MyDecimal require.NoError(t, x1.FromString([]byte("38520.130741106671"))) require.NoError(t, y1.FromString([]byte("9863.944799797851"))) diff --git a/types/overflow_test.go b/types/overflow_test.go index f203d145d46fa..d492b24c75748 100644 --- a/types/overflow_test.go +++ b/types/overflow_test.go @@ -23,8 +23,6 @@ import ( ) func TestAdd(t *testing.T) { - t.Parallel() - tblUint64 := []struct { lsh uint64 rsh uint64 @@ -100,8 +98,6 @@ func TestAdd(t *testing.T) { } func TestSub(t *testing.T) { - t.Parallel() - tblUint64 := []struct { lsh uint64 rsh uint64 @@ -200,8 +196,6 @@ func TestSub(t *testing.T) { } func TestMul(t *testing.T) { - t.Parallel() - tblUint64 := []struct { lsh uint64 rsh uint64 @@ -275,8 +269,6 @@ func TestMul(t *testing.T) { } func TestDiv(t *testing.T) { - t.Parallel() - tblInt64 := []struct { lsh int64 rsh int64 diff --git a/types/parser_driver/value_expr_test.go b/types/parser_driver/value_expr_test.go index c0200b27b4467..57225e44755e3 100644 --- a/types/parser_driver/value_expr_test.go +++ b/types/parser_driver/value_expr_test.go @@ -47,7 +47,6 @@ func TestValueExprRestore(t *testing.T) { // copy iterator variable into a new variable, see issue #27779 test := test t.Run(test.expect, func(t *testing.T) { - t.Parallel() var sb strings.Builder expr := &ValueExpr{Datum: test.datum} err := expr.Restore(format.NewRestoreCtx(format.DefaultRestoreFlags, &sb)) diff --git a/types/time.go b/types/time.go index 161ea708e66d8..0ea01c8a85f96 100644 --- a/types/time.go +++ b/types/time.go @@ -49,9 +49,9 @@ const ( // MaxDuration is the maximum for duration. MaxDuration int64 = 838*10000 + 59*100 + 59 // MinTime is the minimum for mysql time type. - MinTime = -gotime.Duration(838*3600+59*60+59) * gotime.Second + MinTime = -(838*gotime.Hour + 59*gotime.Minute + 59*gotime.Second) // MaxTime is the maximum for mysql time type. - MaxTime = gotime.Duration(838*3600+59*60+59) * gotime.Second + MaxTime = 838*gotime.Hour + 59*gotime.Minute + 59*gotime.Second // ZeroDatetimeStr is the string representation of a zero datetime. ZeroDatetimeStr = "0000-00-00 00:00:00" // ZeroDateStr is the string representation of a zero date. @@ -466,7 +466,7 @@ func (t Time) ConvertToDuration() (Duration, error) { hour, minute, second := t.Clock() frac := t.Microsecond() * 1000 - d := gotime.Duration(hour*3600+minute*60+second)*gotime.Second + gotime.Duration(frac) + d := gotime.Duration(hour*3600+minute*60+second)*gotime.Second + gotime.Duration(frac) //nolint:durationcheck // TODO: check convert validation return Duration{Duration: d, Fsp: t.Fsp()}, nil } @@ -579,7 +579,7 @@ func RoundFrac(t gotime.Time, fsp int8) (gotime.Time, error) { if err != nil { return t, errors.Trace(err) } - return t.Round(gotime.Duration(math.Pow10(9-int(fsp))) * gotime.Nanosecond), nil + return t.Round(gotime.Duration(math.Pow10(9-int(fsp))) * gotime.Nanosecond), nil //nolint:durationcheck } // TruncateFrac truncates fractional seconds precision with new fsp and returns a new one. @@ -589,7 +589,7 @@ func TruncateFrac(t gotime.Time, fsp int8) (gotime.Time, error) { if _, err := CheckFsp(int(fsp)); err != nil { return t, err } - return t.Truncate(gotime.Duration(math.Pow10(9-int(fsp))) * gotime.Nanosecond), nil + return t.Truncate(gotime.Duration(math.Pow10(9-int(fsp))) * gotime.Nanosecond), nil //nolint:durationcheck } // ToPackedUint encodes Time to a packed uint64 value. @@ -1270,7 +1270,7 @@ func AdjustYear(y int64, adjustZero bool) (int64, error) { // NewDuration construct duration with time. func NewDuration(hour, minute, second, microsecond int, fsp int8) Duration { return Duration{ - Duration: gotime.Duration(hour)*gotime.Hour + gotime.Duration(minute)*gotime.Minute + gotime.Duration(second)*gotime.Second + gotime.Duration(microsecond)*gotime.Microsecond, + Duration: gotime.Duration(hour)*gotime.Hour + gotime.Duration(minute)*gotime.Minute + gotime.Duration(second)*gotime.Second + gotime.Duration(microsecond)*gotime.Microsecond, //nolint:durationcheck Fsp: fsp, } } @@ -1490,7 +1490,7 @@ func (d Duration) RoundFrac(fsp int8, loc *gotime.Location) (Duration, error) { } n := gotime.Date(0, 0, 0, 0, 0, 0, 0, tz) - nd := n.Add(d.Duration).Round(gotime.Duration(math.Pow10(9-int(fsp))) * gotime.Nanosecond).Sub(n) + nd := n.Add(d.Duration).Round(gotime.Duration(math.Pow10(9-int(fsp))) * gotime.Nanosecond).Sub(n) //nolint:durationcheck return Duration{Duration: nd, Fsp: fsp}, nil } @@ -1711,7 +1711,7 @@ func matchDuration(str string, fsp int8) (Duration, error) { return Duration{t, fsp}, ErrTruncatedWrongVal.GenWithStackByArgs("time", str) } - d := gotime.Duration(hhmmss[0]*3600+hhmmss[1]*60+hhmmss[2])*gotime.Second + gotime.Duration(frac)*gotime.Microsecond + d := gotime.Duration(hhmmss[0]*3600+hhmmss[1]*60+hhmmss[2])*gotime.Second + gotime.Duration(frac)*gotime.Microsecond //nolint:durationcheck if negative { d = -d } @@ -1800,11 +1800,11 @@ func splitDuration(t gotime.Duration) (int, int, int, int, int) { } hours := t / gotime.Hour - t -= hours * gotime.Hour + t -= hours * gotime.Hour //nolint:durationcheck minutes := t / gotime.Minute - t -= minutes * gotime.Minute + t -= minutes * gotime.Minute //nolint:durationcheck seconds := t / gotime.Second - t -= seconds * gotime.Second + t -= seconds * gotime.Second //nolint:durationcheck fraction := t / gotime.Microsecond return sign, int(hours), int(minutes), int(seconds), int(fraction) @@ -1987,7 +1987,18 @@ func ParseTimeFromYear(sc *stmtctx.StatementContext, year int64) (Time, error) { func ParseTimeFromNum(sc *stmtctx.StatementContext, num int64, tp byte, fsp int8) (Time, error) { // MySQL compatibility: 0 should not be converted to null, see #11203 if num == 0 { - return NewTime(ZeroCoreTime, tp, DefaultFsp), nil + zt := NewTime(ZeroCoreTime, tp, DefaultFsp) + if sc != nil && sc.InCreateOrAlterStmt && !sc.TruncateAsWarning { + switch tp { + case mysql.TypeTimestamp: + return zt, ErrTruncatedWrongVal.GenWithStackByArgs(TimestampStr, "0") + case mysql.TypeDate: + return zt, ErrTruncatedWrongVal.GenWithStackByArgs(DateStr, "0") + case mysql.TypeDatetime: + return zt, ErrTruncatedWrongVal.GenWithStackByArgs(DateTimeStr, "0") + } + } + return zt, nil } fsp, err := CheckFsp(int(fsp)) if err != nil { @@ -3192,7 +3203,7 @@ func microSeconds(t *CoreTime, input string, ctx map[string]int) (string, bool) t.setMicrosecond(0) return input, true } - for v > 0 && v*10 < 1000000 { + for i := step; i < 6; i++ { v *= 10 } t.setMicrosecond(uint32(v)) diff --git a/types/time_test.go b/types/time_test.go index d061518d56eec..ca725119d9dd2 100644 --- a/types/time_test.go +++ b/types/time_test.go @@ -31,7 +31,6 @@ import ( ) func TestTimeEncoding(t *testing.T) { - t.Parallel() tests := []struct { Year, Month, Day, Hour, Minute, Second, Microsecond int Type uint8 @@ -61,7 +60,6 @@ func TestTimeEncoding(t *testing.T) { } func TestDateTime(t *testing.T) { - t.Parallel() sc := mock.NewContext().GetSessionVars().StmtCtx sc.IgnoreZeroInDate = true table := []struct { @@ -182,7 +180,6 @@ func TestDateTime(t *testing.T) { } func TestTimestamp(t *testing.T) { - t.Parallel() table := []struct { Input string Expect string @@ -208,7 +205,6 @@ func TestTimestamp(t *testing.T) { } func TestDate(t *testing.T) { - t.Parallel() sc := mock.NewContext().GetSessionVars().StmtCtx sc.IgnoreZeroInDate = true table := []struct { @@ -304,7 +300,6 @@ func TestDate(t *testing.T) { } func TestTime(t *testing.T) { - t.Parallel() sc := mock.NewContext().GetSessionVars().StmtCtx sc.IgnoreZeroInDate = true table := []struct { @@ -399,7 +394,6 @@ func TestTime(t *testing.T) { } func TestDurationAdd(t *testing.T) { - t.Parallel() table := []struct { Input string Fsp int8 @@ -436,7 +430,6 @@ func TestDurationAdd(t *testing.T) { } func TestDurationSub(t *testing.T) { - t.Parallel() sc := mock.NewContext().GetSessionVars().StmtCtx sc.IgnoreZeroInDate = true table := []struct { @@ -461,7 +454,6 @@ func TestDurationSub(t *testing.T) { } func TestTimeFsp(t *testing.T) { - t.Parallel() sc := mock.NewContext().GetSessionVars().StmtCtx sc.IgnoreZeroInDate = true table := []struct { @@ -501,7 +493,6 @@ func TestTimeFsp(t *testing.T) { } func TestYear(t *testing.T) { - t.Parallel() table := []struct { Input string Expect int16 @@ -563,7 +554,6 @@ func TestYear(t *testing.T) { } func TestCodec(t *testing.T) { - t.Parallel() sc := &stmtctx.StatementContext{TimeZone: time.UTC} // MySQL timestamp value doesn't allow month=0 or day=0. @@ -621,7 +611,6 @@ func TestCodec(t *testing.T) { } func TestParseTimeFromNum(t *testing.T) { - t.Parallel() table := []struct { Input int64 ExpectDateTimeError bool @@ -695,7 +684,6 @@ func TestParseTimeFromNum(t *testing.T) { } func TestToNumber(t *testing.T) { - t.Parallel() sc := mock.NewContext().GetSessionVars().StmtCtx sc.IgnoreZeroInDate = true losAngelesTz, err := time.LoadLocation("America/Los_Angeles") @@ -772,7 +760,6 @@ func TestToNumber(t *testing.T) { } func TestParseTimeFromFloatString(t *testing.T) { - t.Parallel() sc := mock.NewContext().GetSessionVars().StmtCtx sc.IgnoreZeroInDate = true table := []struct { @@ -805,7 +792,6 @@ func TestParseTimeFromFloatString(t *testing.T) { } func TestParseFrac(t *testing.T) { - t.Parallel() tbl := []struct { S string Fsp int8 @@ -842,7 +828,6 @@ func TestParseFrac(t *testing.T) { } func TestRoundFrac(t *testing.T) { - t.Parallel() sc := mock.NewContext().GetSessionVars().StmtCtx sc.IgnoreZeroInDate = true sc.TimeZone = time.UTC @@ -935,7 +920,6 @@ func TestRoundFrac(t *testing.T) { } func TestConvert(t *testing.T) { - t.Parallel() sc := mock.NewContext().GetSessionVars().StmtCtx sc.IgnoreZeroInDate = true losAngelesTz, _ := time.LoadLocation("America/Los_Angeles") @@ -986,7 +970,6 @@ func TestConvert(t *testing.T) { } func TestCompare(t *testing.T) { - t.Parallel() sc := &stmtctx.StatementContext{TimeZone: time.UTC} tbl := []struct { Arg1 string @@ -1036,7 +1019,6 @@ func TestCompare(t *testing.T) { } func TestDurationClock(t *testing.T) { - t.Parallel() // test hour, minute, second and micro second tbl := []struct { Input string @@ -1061,7 +1043,6 @@ func TestDurationClock(t *testing.T) { } func TestParseDateFormat(t *testing.T) { - t.Parallel() tbl := []struct { Input string Result []string @@ -1085,7 +1066,6 @@ func TestParseDateFormat(t *testing.T) { } func TestTimestampDiff(t *testing.T) { - t.Parallel() tests := []struct { unit string t1 types.CoreTime @@ -1109,7 +1089,6 @@ func TestTimestampDiff(t *testing.T) { } func TestDateFSP(t *testing.T) { - t.Parallel() tests := []struct { date string expect int @@ -1126,7 +1105,6 @@ func TestDateFSP(t *testing.T) { } func TestConvertTimeZone(t *testing.T) { - t.Parallel() loc, _ := time.LoadLocation("Asia/Shanghai") tests := []struct { input types.CoreTime @@ -1148,7 +1126,6 @@ func TestConvertTimeZone(t *testing.T) { } func TestTimeAdd(t *testing.T) { - t.Parallel() tbl := []struct { Arg1 string Arg2 string @@ -1179,7 +1156,6 @@ func TestTimeAdd(t *testing.T) { } func TestTruncateOverflowMySQLTime(t *testing.T) { - t.Parallel() v := types.MaxTime + 1 res, err := types.TruncateOverflowMySQLTime(v) require.True(t, types.ErrTruncatedWrongVal.Equal(err)) @@ -1212,8 +1188,6 @@ func TestTruncateOverflowMySQLTime(t *testing.T) { } func TestCheckTimestamp(t *testing.T) { - t.Parallel() - shanghaiTz, _ := time.LoadLocation("Asia/Shanghai") tests := []struct { @@ -1323,7 +1297,6 @@ func TestCheckTimestamp(t *testing.T) { } func TestExtractDurationValue(t *testing.T) { - t.Parallel() tests := []struct { unit string format string @@ -1464,14 +1437,12 @@ func TestExtractDurationValue(t *testing.T) { } func TestCurrentTime(t *testing.T) { - t.Parallel() res := types.CurrentTime(mysql.TypeTimestamp) require.Equal(t, mysql.TypeTimestamp, res.Type()) require.Equal(t, int8(0), res.Fsp()) } func TestInvalidZero(t *testing.T) { - t.Parallel() in := types.NewTime(types.ZeroCoreTime, mysql.TypeTimestamp, types.DefaultFsp) require.True(t, in.InvalidZero()) in.SetCoreTime(types.FromDate(2019, 00, 00, 00, 00, 00, 00)) @@ -1481,7 +1452,6 @@ func TestInvalidZero(t *testing.T) { } func TestGetFsp(t *testing.T) { - t.Parallel() res := types.GetFsp("2019:04:12 14:00:00.123456") require.Equal(t, int8(6), res) @@ -1496,7 +1466,6 @@ func TestGetFsp(t *testing.T) { } func TestExtractDatetimeNum(t *testing.T) { - t.Parallel() in := types.NewTime(types.FromDate(2019, 04, 12, 14, 00, 00, 0000), mysql.TypeTimestamp, types.DefaultFsp) res, err := types.ExtractDatetimeNum(&in, "day") @@ -1541,7 +1510,8 @@ func TestExtractDatetimeNum(t *testing.T) { res, err = types.ExtractDatetimeNum(&in, "TEST_ERROR") require.Equal(t, int64(0), res) - require.Regexp(t, "invalid unit.*", err) + require.Error(t, err) + require.Regexp(t, "^invalid unit", err) in = types.NewTime(types.FromDate(0000, 00, 00, 00, 00, 00, 0000), mysql.TypeTimestamp, types.DefaultFsp) @@ -1567,7 +1537,6 @@ func TestExtractDatetimeNum(t *testing.T) { } func TestExtractDurationNum(t *testing.T) { - t.Parallel() type resultTbl struct { unit string expect int64 @@ -1627,12 +1596,12 @@ func TestExtractDurationNum(t *testing.T) { } res, err := types.ExtractDurationNum(&in, "TEST_ERROR") require.Equal(t, int64(0), res) - require.Regexp(t, "invalid unit.*", err) + require.Error(t, err) + require.Regexp(t, "^invalid unit", err) } } func TestParseDurationValue(t *testing.T) { - t.Parallel() tbl := []struct { format string unit string @@ -1689,7 +1658,6 @@ func TestParseDurationValue(t *testing.T) { } func TestIsClockUnit(t *testing.T) { - t.Parallel() tbl := []struct { input string expected bool @@ -1717,7 +1685,6 @@ func TestIsClockUnit(t *testing.T) { } func TestIsDateFormat(t *testing.T) { - t.Parallel() input := "1234:321" output := types.IsDateFormat(input) require.False(t, output) @@ -1732,7 +1699,6 @@ func TestIsDateFormat(t *testing.T) { } func TestParseTimeFromInt64(t *testing.T) { - t.Parallel() sc := mock.NewContext().GetSessionVars().StmtCtx sc.IgnoreZeroInDate = true @@ -1751,7 +1717,6 @@ func TestParseTimeFromInt64(t *testing.T) { } func TestGetFormatType(t *testing.T) { - t.Parallel() input := "TEST" isDuration, isDate := types.GetFormatType(input) require.False(t, isDuration) @@ -1769,7 +1734,6 @@ func TestGetFormatType(t *testing.T) { } func TestGetFracIndex(t *testing.T) { - t.Parallel() testCases := []struct { str string expectIndex int @@ -1785,7 +1749,6 @@ func TestGetFracIndex(t *testing.T) { } func TestTimeOverflow(t *testing.T) { - t.Parallel() sc := mock.NewContext().GetSessionVars().StmtCtx sc.IgnoreZeroInDate = true table := []struct { @@ -1819,7 +1782,6 @@ func TestTimeOverflow(t *testing.T) { } func TestTruncateFrac(t *testing.T) { - t.Parallel() cols := []struct { input time.Time fsp int8 @@ -1837,7 +1799,6 @@ func TestTruncateFrac(t *testing.T) { } func TestTimeSub(t *testing.T) { - t.Parallel() tbl := []struct { Arg1 string Arg2 string @@ -1864,7 +1825,6 @@ func TestTimeSub(t *testing.T) { } func TestCheckMonthDay(t *testing.T) { - t.Parallel() dates := []struct { date types.CoreTime isValidDate bool @@ -1901,7 +1861,6 @@ func TestCheckMonthDay(t *testing.T) { } func TestFormatIntWidthN(t *testing.T) { - t.Parallel() cases := []struct { num int width int @@ -1924,7 +1883,6 @@ func TestFormatIntWidthN(t *testing.T) { } func TestFromGoTime(t *testing.T) { - t.Parallel() // Test rounding of nanosecond to millisecond. cases := []struct { input string @@ -1954,7 +1912,6 @@ func TestFromGoTime(t *testing.T) { } func TestGetTimezone(t *testing.T) { - t.Parallel() cases := []struct { input string idx int @@ -1983,7 +1940,6 @@ func TestGetTimezone(t *testing.T) { } func TestParseWithTimezone(t *testing.T) { - t.Parallel() getTZ := func(tzSign string, tzHour, tzMinue int) *time.Location { offset := tzHour*60*60 + tzMinue*60 if tzSign == "-" { diff --git a/util/admin/admin_integration_test.go b/util/admin/admin_integration_test.go index 056c6c826b5d8..a6000c73fecc7 100644 --- a/util/admin/admin_integration_test.go +++ b/util/admin/admin_integration_test.go @@ -23,8 +23,6 @@ import ( ) func TestAdminCheckTable(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() @@ -77,8 +75,6 @@ func TestAdminCheckTable(t *testing.T) { } func TestAdminCheckTableClusterIndex(t *testing.T) { - t.Parallel() - store, clean := testkit.CreateMockStore(t) defer clean() diff --git a/util/admin/admin_test.go b/util/admin/admin_test.go index 1341317649c22..72ff15413d935 100644 --- a/util/admin/admin_test.go +++ b/util/admin/admin_test.go @@ -28,8 +28,6 @@ import ( ) func TestGetDDLInfo(t *testing.T) { - t.Parallel() - store, clean := newMockStore(t) defer clean() @@ -79,8 +77,6 @@ func TestGetDDLInfo(t *testing.T) { } func TestGetDDLJobs(t *testing.T) { - t.Parallel() - store, clean := newMockStore(t) defer clean() @@ -134,8 +130,6 @@ func TestGetDDLJobs(t *testing.T) { } func TestGetDDLJobsIsSort(t *testing.T) { - t.Parallel() - store, clean := newMockStore(t) defer clean() @@ -165,8 +159,6 @@ func TestGetDDLJobsIsSort(t *testing.T) { } func TestCancelJobs(t *testing.T) { - t.Parallel() - store, clean := newMockStore(t) defer clean() @@ -210,7 +202,7 @@ func TestCancelJobs(t *testing.T) { errs, err = CancelJobs(txn, []int64{-1}) require.NoError(t, err) require.Error(t, errs[0]) - require.Regexp(t, ".*DDL Job:-1 not found", errs[0].Error()) + require.Regexp(t, "DDL Job:-1 not found$", errs[0].Error()) // test cancel finish job. job := &model.Job{ @@ -224,7 +216,7 @@ func TestCancelJobs(t *testing.T) { errs, err = CancelJobs(txn, []int64{100}) require.NoError(t, err) require.Error(t, errs[0]) - require.Regexp(t, ".*This job:100 is finished, so can't be cancelled", errs[0].Error()) + require.Regexp(t, "This job:100 is finished, so can't be cancelled$", errs[0].Error()) // test can't cancelable job. job.Type = model.ActionDropIndex @@ -236,7 +228,7 @@ func TestCancelJobs(t *testing.T) { errs, err = CancelJobs(txn, []int64{101}) require.NoError(t, err) require.Error(t, errs[0]) - require.Regexp(t, ".*This job:101 is almost finished, can't be cancelled now", errs[0].Error()) + require.Regexp(t, "This job:101 is almost finished, can't be cancelled now$", errs[0].Error()) // When both types of jobs exist in the DDL queue, // we first cancel the job with a larger ID. @@ -280,8 +272,6 @@ func TestCancelJobs(t *testing.T) { } func TestGetHistoryDDLJobs(t *testing.T) { - t.Parallel() - store, clean := newMockStore(t) defer clean() @@ -340,8 +330,6 @@ func TestGetHistoryDDLJobs(t *testing.T) { } func TestIsJobRollbackable(t *testing.T) { - t.Parallel() - cases := []struct { tp model.ActionType state model.SchemaState @@ -364,8 +352,6 @@ func TestIsJobRollbackable(t *testing.T) { } func TestError(t *testing.T) { - t.Parallel() - kvErrs := []*terror.Error{ ErrDataInConsistent, ErrDDLJobNotFound, diff --git a/util/arena/arena_test.go b/util/arena/arena_test.go index 696afc5e594af..e81dd55dc29aa 100644 --- a/util/arena/arena_test.go +++ b/util/arena/arena_test.go @@ -28,8 +28,6 @@ const ( ) func TestSimpleArenaAllocator(t *testing.T) { - t.Parallel() - arena := NewAllocator(arenaCap) slice := arena.Alloc(allocCapSmall) assert.Equal(t, allocCapSmall, arena.off) @@ -57,7 +55,6 @@ func TestSimpleArenaAllocator(t *testing.T) { } func TestStdAllocator(t *testing.T) { - t.Parallel() slice := StdAllocator.Alloc(allocCapMedium) assert.Len(t, slice, 0) assert.Equal(t, allocCapMedium, cap(slice)) diff --git a/util/bitmap/concurrent_test.go b/util/bitmap/concurrent_test.go index 41e0c4291f6bc..958fe57b20d23 100644 --- a/util/bitmap/concurrent_test.go +++ b/util/bitmap/concurrent_test.go @@ -23,8 +23,6 @@ import ( ) func TestConcurrentBitmapSet(t *testing.T) { - t.Parallel() - const loopCount = 1000 const interval = 2 @@ -51,8 +49,6 @@ func TestConcurrentBitmapSet(t *testing.T) { // TestConcurrentBitmapUniqueSetter checks if isSetter is unique everytime // when a bit is set. func TestConcurrentBitmapUniqueSetter(t *testing.T) { - t.Parallel() - const loopCount = 10000 const competitorsPerSet = 50 diff --git a/util/checksum/checksum_test.go b/util/checksum/checksum_test.go index e8fe26d816865..b3d205954c7ff 100644 --- a/util/checksum/checksum_test.go +++ b/util/checksum/checksum_test.go @@ -25,7 +25,6 @@ import ( ) func TestChecksumReadAt(t *testing.T) { - t.Parallel() f := newFakeFile() w := newTestBuff("0123456789", 510) @@ -56,11 +55,9 @@ func TestChecksumReadAt(t *testing.T) { // both the current block and the following block have errors. func TestAddOneByte(t *testing.T) { t.Run("unencrypted", func(t *testing.T) { - t.Parallel() testAddOneByte(t, false) }) t.Run("encrypted", func(t *testing.T) { - t.Parallel() testAddOneByte(t, true) }) } @@ -99,11 +96,9 @@ func testAddOneByte(t *testing.T, encrypt bool) { // both the current block and the following block have errors. func TestDeleteOneByte(t *testing.T) { t.Run("unencrypted", func(t *testing.T) { - t.Parallel() testDeleteOneByte(t, false) }) t.Run("encrypted", func(t *testing.T) { - t.Parallel() testDeleteOneByte(t, true) }) } @@ -142,11 +137,9 @@ func testDeleteOneByte(t *testing.T, encrypt bool) { // only the current block has error. func TestModifyOneByte(t *testing.T) { t.Run("unencrypted", func(t *testing.T) { - t.Parallel() testModifyOneByte(t, false) }) t.Run("encrypted", func(t *testing.T) { - t.Parallel() testModifyOneByte(t, true) }) } @@ -184,11 +177,9 @@ func testModifyOneByte(t *testing.T, encrypt bool) { // TestReadEmptyFile ensures that whether encrypted or not, no error will occur. func TestReadEmptyFile(t *testing.T) { t.Run("unencrypted", func(t *testing.T) { - t.Parallel() testReadEmptyFile(t, false) }) t.Run("encrypted", func(t *testing.T) { - t.Parallel() testReadEmptyFile(t, true) }) } @@ -221,11 +212,9 @@ func testReadEmptyFile(t *testing.T, encrypt bool) { // only the current block has error. func TestModifyThreeBytes(t *testing.T) { t.Run("unencrypted", func(t *testing.T) { - t.Parallel() testModifyThreeBytes(t, false) }) t.Run("encrypted", func(t *testing.T) { - t.Parallel() testModifyThreeBytes(t, true) }) } @@ -270,11 +259,9 @@ func testModifyThreeBytes(t *testing.T, encrypt bool) { // 2. Read all data at once. func TestReadDifferentBlockSize(t *testing.T) { t.Run("unencrypted", func(t *testing.T) { - t.Parallel() testReadDifferentBlockSize(t, false) }) t.Run("encrypted", func(t *testing.T) { - t.Parallel() testReadDifferentBlockSize(t, true) }) } @@ -328,11 +315,9 @@ func testReadDifferentBlockSize(t *testing.T, encrypt bool) { // 2. Write some block and append some block. func TestWriteDifferentBlockSize(t *testing.T) { t.Run("unencrypted", func(t *testing.T) { - t.Parallel() testWriteDifferentBlockSize(t, false) }) t.Run("encrypted", func(t *testing.T) { - t.Parallel() testWriteDifferentBlockSize(t, true) }) } @@ -393,7 +378,6 @@ func testWriteDifferentBlockSize(t *testing.T, encrypt bool) { } func TestChecksumWriter(t *testing.T) { - t.Parallel() f := newFakeFile() buf := newTestBuff("0123456789", 100) @@ -413,7 +397,6 @@ func TestChecksumWriter(t *testing.T) { } func TestChecksumWriterAutoFlush(t *testing.T) { - t.Parallel() f := newFakeFile() buf := newTestBuff("0123456789", 102) diff --git a/util/chunk/alloc.go b/util/chunk/alloc.go new file mode 100644 index 0000000000000..c2bfae8a4f600 --- /dev/null +++ b/util/chunk/alloc.go @@ -0,0 +1,155 @@ +// Copyright 2021 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, +// 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. + +package chunk + +import ( + "github.com/cznic/mathutil" + "github.com/pingcap/tidb/types" +) + +// Allocator is an interface defined to reduce object allocation. +// The typical usage is to call Reset() to recycle objects into a pool, +// and Alloc() allocates from the pool. +type Allocator interface { + Alloc(fields []*types.FieldType, cap, maxChunkSize int) *Chunk + Reset() +} + +// NewAllocator creates an Allocator. +func NewAllocator() *allocator { + ret := &allocator{} + ret.columnAlloc.init() + return ret +} + +var _ Allocator = &allocator{} + +// allocator try to reuse objects. +// It uses `poolColumnAllocator` to alloc chunk column objects. +// The allocated chunks are recorded in the `allocated` array. +// After Reset(), those chunks are decoupled into chunk column objects and get +// into `poolColumnAllocator` again for reuse. +type allocator struct { + allocated []*Chunk + free []*Chunk + columnAlloc poolColumnAllocator +} + +// Alloc implements the Allocator interface. +func (a *allocator) Alloc(fields []*types.FieldType, cap, maxChunkSize int) *Chunk { + var chk *Chunk + // Try to alloc from the free list. + if len(a.free) > 0 { + chk = a.free[len(a.free)-1] + a.free = a.free[:len(a.free)-1] + } else { + chk = &Chunk{columns: make([]*Column, 0, len(fields))} + } + + // Init the chunk fields. + chk.capacity = mathutil.Min(cap, maxChunkSize) + chk.requiredRows = maxChunkSize + // Allocate the chunk columns from the pool column allocator. + for _, f := range fields { + chk.columns = append(chk.columns, a.columnAlloc.NewColumn(f, chk.capacity)) + } + + a.allocated = append(a.allocated, chk) + return chk +} + +const ( + maxFreeChunks = 64 + maxFreeColumnsPerType = 256 +) + +// Reset implements the Allocator interface. +func (a *allocator) Reset() { + a.free = a.free[:0] + for i, chk := range a.allocated { + a.allocated[i] = nil + // Decouple chunk into chunk column objects and put them back to the column allocator for reuse. + for _, col := range chk.columns { + a.columnAlloc.put(col) + } + // Reset the chunk and put it to the free list for reuse. + chk.resetForReuse() + + if len(a.free) < maxFreeChunks { // Don't cache too much data. + a.free = append(a.free, chk) + } + } + a.allocated = a.allocated[:0] +} + +var _ ColumnAllocator = &poolColumnAllocator{} + +type poolColumnAllocator struct { + pool map[int]freeList +} + +// poolColumnAllocator implements the ColumnAllocator interface. +func (alloc *poolColumnAllocator) NewColumn(ft *types.FieldType, count int) *Column { + typeSize := getFixedLen(ft) + l := alloc.pool[typeSize] + if l != nil && !l.empty() { + col := l.pop() + return col + } + return newColumn(typeSize, count) +} + +func (alloc *poolColumnAllocator) init() { + alloc.pool = make(map[int]freeList) +} + +func (alloc *poolColumnAllocator) put(col *Column) { + typeSize := col.typeSize() + if typeSize <= 0 { + return + } + + l := alloc.pool[typeSize] + if l == nil { + l = make(map[*Column]struct{}, 8) + alloc.pool[typeSize] = l + } + l.push(col) +} + +// freeList is defined as a map, rather than a list, because when recycling chunk +// columns, there could be duplicated one: some of the chunk columns are just the +// reference to the others. +type freeList map[*Column]struct{} + +func (l freeList) empty() bool { + return len(l) == 0 +} + +func (l freeList) pop() *Column { + for k := range l { + delete(l, k) + return k + } + return nil +} + +func (l freeList) push(c *Column) { + if len(l) >= maxFreeColumnsPerType { + // Don't cache too much to save memory. + return + } + l[c] = struct{}{} +} diff --git a/util/chunk/alloc_test.go b/util/chunk/alloc_test.go new file mode 100644 index 0000000000000..59c097b09d1bd --- /dev/null +++ b/util/chunk/alloc_test.go @@ -0,0 +1,153 @@ +// Copyright 2021 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, +// 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. + +package chunk + +import ( + "testing" + + "github.com/pingcap/tidb/parser/mysql" + "github.com/pingcap/tidb/types" + "github.com/stretchr/testify/require" +) + +func TestAllocator(t *testing.T) { + alloc := NewAllocator() + + fieldTypes := []*types.FieldType{ + {Tp: mysql.TypeVarchar}, + {Tp: mysql.TypeJSON}, + {Tp: mysql.TypeFloat}, + {Tp: mysql.TypeNewDecimal}, + {Tp: mysql.TypeDouble}, + {Tp: mysql.TypeLonglong}, + {Tp: mysql.TypeTimestamp}, + {Tp: mysql.TypeDatetime}, + } + + initCap := 5 + maxChunkSize := 100 + + chk := alloc.Alloc(fieldTypes, initCap, maxChunkSize) + require.NotNil(t, chk) + check := func() { + require.Equal(t, len(fieldTypes), chk.NumCols()) + require.Nil(t, chk.columns[0].elemBuf) + require.Nil(t, chk.columns[1].elemBuf) + require.Equal(t, getFixedLen(fieldTypes[2]), len(chk.columns[2].elemBuf)) + require.Equal(t, getFixedLen(fieldTypes[3]), len(chk.columns[3].elemBuf)) + require.Equal(t, getFixedLen(fieldTypes[4]), len(chk.columns[4].elemBuf)) + require.Equal(t, getFixedLen(fieldTypes[5]), len(chk.columns[5].elemBuf)) + require.Equal(t, getFixedLen(fieldTypes[6]), len(chk.columns[6].elemBuf)) + require.Equal(t, getFixedLen(fieldTypes[7]), len(chk.columns[7].elemBuf)) + + require.Equal(t, initCap*getFixedLen(fieldTypes[2]), cap(chk.columns[2].data)) + require.Equal(t, initCap*getFixedLen(fieldTypes[3]), cap(chk.columns[3].data)) + require.Equal(t, initCap*getFixedLen(fieldTypes[4]), cap(chk.columns[4].data)) + require.Equal(t, initCap*getFixedLen(fieldTypes[5]), cap(chk.columns[5].data)) + require.Equal(t, initCap*getFixedLen(fieldTypes[6]), cap(chk.columns[6].data)) + require.Equal(t, initCap*getFixedLen(fieldTypes[7]), cap(chk.columns[7].data)) + } + check() + + // Call Reset and alloc again, check the result. + alloc.Reset() + chk = alloc.Alloc(fieldTypes, initCap, maxChunkSize) + check() + + // Check maxFreeListLen + for i := 0; i < maxFreeChunks+10; i++ { + alloc.Alloc(fieldTypes, initCap, maxChunkSize) + } + alloc.Reset() + require.Equal(t, len(alloc.free), maxFreeChunks) +} + +func TestColumnAllocator(t *testing.T) { + fieldTypes := []*types.FieldType{ + {Tp: mysql.TypeVarchar}, + {Tp: mysql.TypeJSON}, + {Tp: mysql.TypeFloat}, + {Tp: mysql.TypeNewDecimal}, + {Tp: mysql.TypeDouble}, + {Tp: mysql.TypeLonglong}, + {Tp: mysql.TypeTimestamp}, + {Tp: mysql.TypeDatetime}, + } + + var alloc1 poolColumnAllocator + alloc1.init() + var alloc2 DefaultColumnAllocator + + // Test the basic allocate operation. + initCap := 5 + for _, ft := range fieldTypes { + v0 := NewColumn(ft, initCap) + v1 := alloc1.NewColumn(ft, initCap) + v2 := alloc2.NewColumn(ft, initCap) + require.Equal(t, v0, v1) + require.Equal(t, v1, v2) + } + + ft := fieldTypes[2] + // Test reuse. + cols := make([]*Column, 0, maxFreeColumnsPerType+10) + for i := 0; i < maxFreeColumnsPerType+10; i++ { + col := alloc1.NewColumn(ft, 20) + cols = append(cols, col) + } + for _, col := range cols { + alloc1.put(col) + } + + // Check max column size. + freeList := alloc1.pool[getFixedLen(ft)] + require.NotNil(t, freeList) + require.Equal(t, len(freeList), maxFreeColumnsPerType) +} + +func TestNoDuplicateColumnReuse(t *testing.T) { + // For issue https://github.com/pingcap/tidb/issues/29554 + // Some chunk columns are just references to other chunk columns. + // So when reusing Chunk, some columns may point to the same memory address. + + fieldTypes := []*types.FieldType{ + {Tp: mysql.TypeVarchar}, + {Tp: mysql.TypeJSON}, + {Tp: mysql.TypeFloat}, + {Tp: mysql.TypeNewDecimal}, + {Tp: mysql.TypeDouble}, + {Tp: mysql.TypeLonglong}, + {Tp: mysql.TypeTimestamp}, + {Tp: mysql.TypeDatetime}, + } + alloc := NewAllocator() + for i := 0; i < maxFreeChunks+10; i++ { + chk := alloc.Alloc(fieldTypes, 5, 10) + chk.MakeRef(1, 3) + } + alloc.Reset() + + a := alloc.columnAlloc + // Make sure no duplicated column in the pool. + for _, p := range a.pool { + dup := make(map[*Column]struct{}) + for !p.empty() { + c := p.pop() + _, exist := dup[c] + require.False(t, exist) + dup[c] = struct{}{} + } + } +} diff --git a/util/chunk/chunk.go b/util/chunk/chunk.go index 8f2323a52e4e1..40a2b059510ac 100644 --- a/util/chunk/chunk.go +++ b/util/chunk/chunk.go @@ -78,7 +78,6 @@ func New(fields []*types.FieldType, cap, maxChunkSize int) *Chunk { for _, f := range fields { chk.columns = append(chk.columns, NewColumn(f, chk.capacity)) } - return chk } @@ -132,6 +131,15 @@ func renewEmpty(chk *Chunk) *Chunk { return newChk } +func (c *Chunk) resetForReuse() { + for i := 0; i < len(c.columns); i++ { + c.columns[i] = nil + } + columns := c.columns[:0] + // Keep only the empty columns array space, reset other fields. + *c = Chunk{columns: columns} +} + // MemoryUsage returns the total memory usage of a Chunk in bytes. // We ignore the size of Column.length and Column.nullCount // since they have little effect of the total memory usage. diff --git a/util/chunk/chunk_test.go b/util/chunk/chunk_test.go index 1814eca470a43..bb7cb9f9b47c0 100644 --- a/util/chunk/chunk_test.go +++ b/util/chunk/chunk_test.go @@ -32,8 +32,6 @@ import ( ) func TestAppendRow(t *testing.T) { - t.Parallel() - numCols := 6 numRows := 10 chk := newChunk(8, 8, 0, 0, 40, 0) @@ -142,8 +140,6 @@ func TestAppendRow(t *testing.T) { } func TestAppendChunk(t *testing.T) { - t.Parallel() - fieldTypes := make([]*types.FieldType, 0, 3) fieldTypes = append(fieldTypes, &types.FieldType{Tp: mysql.TypeFloat}) fieldTypes = append(fieldTypes, &types.FieldType{Tp: mysql.TypeVarchar}) @@ -202,8 +198,6 @@ func TestAppendChunk(t *testing.T) { } func TestTruncateTo(t *testing.T) { - t.Parallel() - fieldTypes := make([]*types.FieldType, 0, 3) fieldTypes = append(fieldTypes, &types.FieldType{Tp: mysql.TypeFloat}) fieldTypes = append(fieldTypes, &types.FieldType{Tp: mysql.TypeVarchar}) @@ -397,8 +391,6 @@ var allTypes = []*types.FieldType{ } func TestCompare(t *testing.T) { - t.Parallel() - chunk := NewChunkWithCapacity(allTypes, 32) for i := 0; i < len(allTypes); i++ { chunk.AppendNull(i) @@ -485,8 +477,6 @@ func TestCompare(t *testing.T) { } func TestCopyTo(t *testing.T) { - t.Parallel() - chunk := NewChunkWithCapacity(allTypes, 101) for i := 0; i < len(allTypes); i++ { chunk.AppendNull(i) @@ -541,8 +531,6 @@ func TestCopyTo(t *testing.T) { } func TestGetDecimalDatum(t *testing.T) { - t.Parallel() - datum := types.NewDatum(1.01) decType := types.NewFieldType(mysql.TypeNewDecimal) decType.Flen = 4 @@ -559,8 +547,6 @@ func TestGetDecimalDatum(t *testing.T) { } func TestChunkMemoryUsage(t *testing.T) { - t.Parallel() - fieldTypes := make([]*types.FieldType, 0, 5) fieldTypes = append(fieldTypes, &types.FieldType{Tp: mysql.TypeFloat}) fieldTypes = append(fieldTypes, &types.FieldType{Tp: mysql.TypeVarchar}) @@ -617,8 +603,6 @@ func TestChunkMemoryUsage(t *testing.T) { } func TestSwapColumn(t *testing.T) { - t.Parallel() - fieldTypes := make([]*types.FieldType, 0, 2) fieldTypes = append(fieldTypes, &types.FieldType{Tp: mysql.TypeFloat}) fieldTypes = append(fieldTypes, &types.FieldType{Tp: mysql.TypeFloat}) @@ -671,8 +655,6 @@ func TestSwapColumn(t *testing.T) { } func TestAppendSel(t *testing.T) { - t.Parallel() - tll := &types.FieldType{Tp: mysql.TypeLonglong} chk := NewChunkWithCapacity([]*types.FieldType{tll}, 1024) sel := make([]int, 0, 1024/2) @@ -691,8 +673,6 @@ func TestAppendSel(t *testing.T) { } func TestMakeRefTo(t *testing.T) { - t.Parallel() - fieldTypes := make([]*types.FieldType, 0, 2) fieldTypes = append(fieldTypes, &types.FieldType{Tp: mysql.TypeFloat}) fieldTypes = append(fieldTypes, &types.FieldType{Tp: mysql.TypeFloat}) @@ -713,8 +693,6 @@ func TestMakeRefTo(t *testing.T) { } func TestToString(t *testing.T) { - t.Parallel() - fieldTypes := make([]*types.FieldType, 0, 4) fieldTypes = append(fieldTypes, &types.FieldType{Tp: mysql.TypeFloat}) fieldTypes = append(fieldTypes, &types.FieldType{Tp: mysql.TypeDouble}) @@ -1013,8 +991,6 @@ func benchmarkChunkGrow(t benchChunkGrowCase) func(b *testing.B) { } func TestAppendRows(t *testing.T) { - t.Parallel() - numCols := 6 numRows := 10 chk := newChunk(8, 8, 0, 0, 40, 0) diff --git a/util/chunk/chunk_util_test.go b/util/chunk/chunk_util_test.go index 510b5a482fa94..368f27d08a107 100644 --- a/util/chunk/chunk_util_test.go +++ b/util/chunk/chunk_util_test.go @@ -53,8 +53,6 @@ func getChk(isLast3ColTheSame bool) (*Chunk, *Chunk, []bool) { } func TestCopySelectedJoinRows(t *testing.T) { - t.Parallel() - srcChk, dstChk, selected := getChk(true) numRows := srcChk.NumRows() for i := 0; i < numRows; i++ { @@ -80,8 +78,6 @@ func TestCopySelectedJoinRows(t *testing.T) { } func TestCopySelectedJoinRowsWithoutSameOuters(t *testing.T) { - t.Parallel() - srcChk, dstChk, selected := getChk(false) numRows := srcChk.NumRows() for i := 0; i < numRows; i++ { @@ -107,8 +103,6 @@ func TestCopySelectedJoinRowsWithoutSameOuters(t *testing.T) { } func TestCopySelectedJoinRowsDirect(t *testing.T) { - t.Parallel() - srcChk, dstChk, selected := getChk(false) numRows := srcChk.NumRows() for i := 0; i < numRows; i++ { @@ -138,8 +132,6 @@ func TestCopySelectedJoinRowsDirect(t *testing.T) { } func TestCopySelectedVirtualNum(t *testing.T) { - t.Parallel() - // srcChk does not contain columns srcChk := newChunk() srcChk.TruncateTo(3) diff --git a/util/chunk/codec_test.go b/util/chunk/codec_test.go index d89b5b80a2fb5..d3ccd87842b67 100644 --- a/util/chunk/codec_test.go +++ b/util/chunk/codec_test.go @@ -25,8 +25,6 @@ import ( ) func TestCodec(t *testing.T) { - t.Parallel() - numCols := 6 numRows := 10 @@ -77,8 +75,6 @@ func TestCodec(t *testing.T) { } func TestEstimateTypeWidth(t *testing.T) { - t.Parallel() - var colType *types.FieldType colType = &types.FieldType{Tp: mysql.TypeLonglong} diff --git a/util/chunk/column.go b/util/chunk/column.go index 7e3f304df3cbb..2f8795e1ed06c 100644 --- a/util/chunk/column.go +++ b/util/chunk/column.go @@ -68,6 +68,19 @@ type Column struct { elemBuf []byte } +// ColumnAllocator defines an allocator for Column. +type ColumnAllocator interface { + NewColumn(ft *types.FieldType, cap int) *Column +} + +// DefaultColumnAllocator is the default implementation of ColumnAllocator. +type DefaultColumnAllocator struct{} + +// NewColumn implements the ColumnAllocator interface. +func (DefaultColumnAllocator) NewColumn(ft *types.FieldType, cap int) *Column { + return newColumn(getFixedLen(ft), cap) +} + // NewColumn creates a new column with the specific type and capacity. func NewColumn(ft *types.FieldType, cap int) *Column { return newColumn(getFixedLen(ft), cap) diff --git a/util/chunk/column_test.go b/util/chunk/column_test.go index 69924abfb3d73..5f89f8a9659a6 100644 --- a/util/chunk/column_test.go +++ b/util/chunk/column_test.go @@ -28,8 +28,6 @@ import ( ) func TestColumnCopy(t *testing.T) { - t.Parallel() - col := newFixedLenColumn(8, 10) for i := 0; i < 10; i++ { col.AppendInt64(int64(i)) @@ -44,8 +42,6 @@ func TestColumnCopy(t *testing.T) { } func TestColumnCopyReconstructFixedLen(t *testing.T) { - t.Parallel() - col := NewColumn(types.NewFieldType(mysql.TypeLonglong), 1024) results := make([]int64, 0, 1024) nulls := make([]bool, 0, 1024) @@ -102,8 +98,6 @@ func TestColumnCopyReconstructFixedLen(t *testing.T) { } func TestColumnCopyReconstructVarLen(t *testing.T) { - t.Parallel() - col := NewColumn(types.NewFieldType(mysql.TypeVarString), 1024) results := make([]string, 0, 1024) nulls := make([]bool, 0, 1024) @@ -160,8 +154,6 @@ func TestColumnCopyReconstructVarLen(t *testing.T) { } func TestLargeStringColumnOffset(t *testing.T) { - t.Parallel() - numRows := 1 col := newVarLenColumn(numRows) // The max-length of a string field can be 6M, a typical batch size for Chunk is 1024, which is 1K. @@ -171,8 +163,6 @@ func TestLargeStringColumnOffset(t *testing.T) { } func TestI64Column(t *testing.T) { - t.Parallel() - chk := NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeLonglong)}, 1024) col := chk.Column(0) for i := 0; i < 1024; i++ { @@ -195,8 +185,6 @@ func TestI64Column(t *testing.T) { } func TestF64Column(t *testing.T) { - t.Parallel() - chk := NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeDouble)}, 1024) col := chk.Column(0) for i := 0; i < 1024; i++ { @@ -219,8 +207,6 @@ func TestF64Column(t *testing.T) { } func TestF32Column(t *testing.T) { - t.Parallel() - chk := NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeFloat)}, 1024) col := chk.Column(0) for i := 0; i < 1024; i++ { @@ -243,8 +229,6 @@ func TestF32Column(t *testing.T) { } func TestDurationSliceColumn(t *testing.T) { - t.Parallel() - chk := NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeDuration)}, 1024) col := chk.Column(0) for i := 0; i < 1024; i++ { @@ -269,8 +253,6 @@ func TestDurationSliceColumn(t *testing.T) { } func TestMyDecimal(t *testing.T) { - t.Parallel() - chk := NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeNewDecimal)}, 1024) col := chk.Column(0) for i := 0; i < 1024; i++ { @@ -312,8 +294,6 @@ func TestMyDecimal(t *testing.T) { } func TestStringColumn(t *testing.T) { - t.Parallel() - chk := NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeVarString)}, 1024) col := chk.Column(0) for i := 0; i < 1024; i++ { @@ -330,8 +310,6 @@ func TestStringColumn(t *testing.T) { } func TestSetColumn(t *testing.T) { - t.Parallel() - chk := NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeSet)}, 1024) col := chk.Column(0) for i := 0; i < 1024; i++ { @@ -352,8 +330,6 @@ func TestSetColumn(t *testing.T) { } func TestJSONColumn(t *testing.T) { - t.Parallel() - chk := NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeJSON)}, 1024) col := chk.Column(0) for i := 0; i < 1024; i++ { @@ -374,8 +350,6 @@ func TestJSONColumn(t *testing.T) { } func TestTimeColumn(t *testing.T) { - t.Parallel() - chk := NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeDatetime)}, 1024) col := chk.Column(0) for i := 0; i < 1024; i++ { @@ -397,8 +371,6 @@ func TestTimeColumn(t *testing.T) { } func TestDurationColumn(t *testing.T) { - t.Parallel() - chk := NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeDuration)}, 1024) col := chk.Column(0) for i := 0; i < 1024; i++ { @@ -416,8 +388,6 @@ func TestDurationColumn(t *testing.T) { } func TestEnumColumn(t *testing.T) { - t.Parallel() - chk := NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeEnum)}, 1024) col := chk.Column(0) for i := 0; i < 1024; i++ { @@ -438,8 +408,6 @@ func TestEnumColumn(t *testing.T) { } func TestNullsColumn(t *testing.T) { - t.Parallel() - chk := NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeLonglong)}, 1024) col := chk.Column(0) for i := 0; i < 1024; i++ { @@ -464,8 +432,6 @@ func TestNullsColumn(t *testing.T) { } func TestReconstructFixedLen(t *testing.T) { - t.Parallel() - col := NewColumn(types.NewFieldType(mysql.TypeLonglong), 1024) results := make([]int64, 0, 1024) nulls := make([]bool, 0, 1024) @@ -522,8 +488,6 @@ func TestReconstructFixedLen(t *testing.T) { } func TestReconstructVarLen(t *testing.T) { - t.Parallel() - col := NewColumn(types.NewFieldType(mysql.TypeVarString), 1024) results := make([]string, 0, 1024) nulls := make([]bool, 0, 1024) @@ -580,8 +544,6 @@ func TestReconstructVarLen(t *testing.T) { } func TestPreAllocInt64(t *testing.T) { - t.Parallel() - col := NewColumn(types.NewFieldType(mysql.TypeLonglong), 128) col.ResizeInt64(256, true) i64s := col.Int64s() @@ -596,8 +558,6 @@ func TestPreAllocInt64(t *testing.T) { } func TestPreAllocUint64(t *testing.T) { - t.Parallel() - tll := types.NewFieldType(mysql.TypeLonglong) tll.Flag |= mysql.UnsignedFlag col := NewColumn(tll, 128) @@ -614,8 +574,6 @@ func TestPreAllocUint64(t *testing.T) { } func TestPreAllocFloat32(t *testing.T) { - t.Parallel() - col := newFixedLenColumn(sizeFloat32, 128) col.ResizeFloat32(256, true) f32s := col.Float32s() @@ -630,8 +588,6 @@ func TestPreAllocFloat32(t *testing.T) { } func TestPreAllocFloat64(t *testing.T) { - t.Parallel() - col := newFixedLenColumn(sizeFloat64, 128) col.ResizeFloat64(256, true) f64s := col.Float64s() @@ -646,8 +602,6 @@ func TestPreAllocFloat64(t *testing.T) { } func TestPreAllocDecimal(t *testing.T) { - t.Parallel() - col := newFixedLenColumn(sizeMyDecimal, 128) col.ResizeDecimal(256, true) ds := col.Decimals() @@ -661,8 +615,6 @@ func TestPreAllocDecimal(t *testing.T) { } func TestPreAllocTime(t *testing.T) { - t.Parallel() - col := newFixedLenColumn(sizeTime, 128) col.ResizeTime(256, true) ds := col.Times() @@ -676,8 +628,6 @@ func TestPreAllocTime(t *testing.T) { } func TestNull(t *testing.T) { - t.Parallel() - col := newFixedLenColumn(sizeFloat64, 32) col.ResizeFloat64(1024, true) require.Equal(t, 1024, col.nullCount()) @@ -710,8 +660,6 @@ func TestNull(t *testing.T) { } func TestSetNulls(t *testing.T) { - t.Parallel() - col := newFixedLenColumn(sizeFloat64, 32) col.ResizeFloat64(1024, true) require.Equal(t, 1024, col.nullCount()) @@ -740,8 +688,6 @@ func TestSetNulls(t *testing.T) { } func TestResizeReserve(t *testing.T) { - t.Parallel() - cI64s := newFixedLenColumn(sizeInt64, 0) require.Zero(t, cI64s.length) for i := 0; i < 100; i++ { @@ -765,8 +711,6 @@ func TestResizeReserve(t *testing.T) { } func TestGetRaw(t *testing.T) { - t.Parallel() - chk := NewChunkWithCapacity([]*types.FieldType{types.NewFieldType(mysql.TypeFloat)}, 1024) col := chk.Column(0) for i := 0; i < 1024; i++ { @@ -797,8 +741,6 @@ func TestGetRaw(t *testing.T) { } func TestResize(t *testing.T) { - t.Parallel() - col := NewColumn(types.NewFieldType(mysql.TypeLonglong), 1024) for i := 0; i < 1024; i++ { col.AppendInt64(int64(i)) @@ -979,8 +921,6 @@ func genNullCols(n int) []*Column { } func TestVectorizedNulls(t *testing.T) { - t.Parallel() - for i := 0; i < 256; i++ { cols := genNullCols(4) lCol, rCol := cols[0], cols[1] @@ -999,8 +939,6 @@ func TestVectorizedNulls(t *testing.T) { } func TestResetColumn(t *testing.T) { - t.Parallel() - col0 := NewColumn(types.NewFieldType(mysql.TypeVarString), 0) col1 := NewColumn(types.NewFieldType(mysql.TypeLonglong), 0) diff --git a/util/chunk/disk_test.go b/util/chunk/disk_test.go index 20ea805ee5148..fc474f11494df 100644 --- a/util/chunk/disk_test.go +++ b/util/chunk/disk_test.go @@ -66,8 +66,6 @@ func initChunks(numChk, numRow int) ([]*Chunk, []*types.FieldType) { } func TestListInDisk(t *testing.T) { - t.Parallel() - numChk, numRow := 2, 2 chks, fields := initChunks(numChk, numRow) l := NewListInDisk(fields) @@ -185,8 +183,6 @@ func checkRow(t *testing.T, row1, row2 Row) { } func testListInDisk(t *testing.T) { - t.Parallel() - numChk, numRow := 10, 1000 chks, fields := initChunks(numChk, numRow) lChecksum := NewListInDisk(fields) @@ -256,8 +252,6 @@ func TestListInDiskWithChecksumAndEncrypt(t *testing.T) { // | | | | | // +------+------------------------------------------+ +-----------------------------+ func testReaderWithCache(t *testing.T) { - t.Parallel() - testData := "0123456789" buf := bytes.NewBuffer(nil) for i := 0; i < 102; i++ { @@ -337,8 +331,6 @@ func testReaderWithCache(t *testing.T) { // Here we test situations where size of data is small, so no data is flushed to disk. func testReaderWithCacheNoFlush(t *testing.T) { - t.Parallel() - testData := "0123456789" field := []*types.FieldType{types.NewFieldType(mysql.TypeString)} diff --git a/util/chunk/iterator_test.go b/util/chunk/iterator_test.go index 3d947ef2ff076..85e59d23ba153 100644 --- a/util/chunk/iterator_test.go +++ b/util/chunk/iterator_test.go @@ -23,8 +23,6 @@ import ( ) func TestIteratorOnSel(t *testing.T) { - t.Parallel() - fields := []*types.FieldType{types.NewFieldType(mysql.TypeLonglong)} chk := New(fields, 32, 1024) sel := make([]int, 0, 1024) @@ -52,8 +50,6 @@ func checkEqual(it Iterator, exp []int64, t *testing.T) { } func TestMultiIterator(t *testing.T) { - t.Parallel() - it := NewMultiIterator(NewIterator4Chunk(new(Chunk))) require.Equal(t, it.End(), it.Begin()) @@ -97,8 +93,6 @@ func TestMultiIterator(t *testing.T) { } func TestIterator(t *testing.T) { - t.Parallel() - fields := []*types.FieldType{types.NewFieldType(mysql.TypeLonglong)} chk := New(fields, 32, 1024) n := 10 diff --git a/util/chunk/list_test.go b/util/chunk/list_test.go index c3198d60978fd..63b3eb9ffed0c 100644 --- a/util/chunk/list_test.go +++ b/util/chunk/list_test.go @@ -28,8 +28,6 @@ import ( ) func TestList(t *testing.T) { - t.Parallel() - fields := []*types.FieldType{ types.NewFieldType(mysql.TypeLonglong), } @@ -85,8 +83,6 @@ func TestList(t *testing.T) { } func TestListMemoryUsage(t *testing.T) { - t.Parallel() - fieldTypes := make([]*types.FieldType, 0, 5) fieldTypes = append(fieldTypes, &types.FieldType{Tp: mysql.TypeFloat}) fieldTypes = append(fieldTypes, &types.FieldType{Tp: mysql.TypeVarchar}) diff --git a/util/chunk/mutrow.go b/util/chunk/mutrow.go index b1bb554f31dc9..c7544194558be 100644 --- a/util/chunk/mutrow.go +++ b/util/chunk/mutrow.go @@ -211,12 +211,19 @@ func makeMutRowBytesColumn(bin []byte) *Column { return col } +func cleanColOfMutRow(col *Column) { + for i := range col.offsets { + col.offsets[i] = 0 + } + col.nullBitmap[0] = 0 +} + // SetRow sets the MutRow with Row. func (mr MutRow) SetRow(row Row) { for colIdx, rCol := range row.c.columns { mrCol := mr.c.columns[colIdx] + cleanColOfMutRow(mrCol) if rCol.IsNull(row.idx) { - mrCol.nullBitmap[0] = 0 continue } elemLen := len(rCol.elemBuf) @@ -239,8 +246,8 @@ func (mr MutRow) SetValues(vals ...interface{}) { // SetValue sets the MutRow with colIdx and value. func (mr MutRow) SetValue(colIdx int, val interface{}) { col := mr.c.columns[colIdx] + cleanColOfMutRow(col) if val == nil { - col.nullBitmap[0] = 0 return } switch x := val.(type) { @@ -286,8 +293,8 @@ func (mr MutRow) SetDatums(datums ...types.Datum) { // SetDatum sets the MutRow with colIdx and datum. func (mr MutRow) SetDatum(colIdx int, d types.Datum) { col := mr.c.columns[colIdx] + cleanColOfMutRow(col) if d.IsNull() { - col.nullBitmap[0] = 0 return } switch d.Kind() { diff --git a/util/chunk/mutrow_test.go b/util/chunk/mutrow_test.go index 4abd9ad217357..32bef71484f7d 100644 --- a/util/chunk/mutrow_test.go +++ b/util/chunk/mutrow_test.go @@ -22,12 +22,11 @@ import ( "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" + "github.com/pingcap/tidb/util/collate" "github.com/stretchr/testify/require" ) func TestMutRow(t *testing.T) { - t.Parallel() - mutRow := MutRowFromTypes(allTypes) row := mutRow.ToRow() sc := new(stmtctx.StatementContext) @@ -35,7 +34,7 @@ func TestMutRow(t *testing.T) { val := zeroValForType(allTypes[i]) d := row.GetDatum(i, allTypes[i]) d2 := types.NewDatum(val) - cmp, err := d.CompareDatum(sc, &d2) + cmp, err := d.Compare(sc, &d2, collate.GetCollator(allTypes[i].Collate)) require.Nil(t, err) require.Equal(t, 0, cmp) } @@ -90,6 +89,27 @@ func TestMutRow(t *testing.T) { require.Equal(t, mutRow.c.columns[0].data, chk.columns[0].data) } +func TestIssue29947(t *testing.T) { + mutRow := MutRowFromTypes(allTypes) + nilDatum := types.NewDatum(nil) + + dataBefore := make([][]byte, 0, len(mutRow.c.columns)) + elemBufBefore := make([][]byte, 0, len(mutRow.c.columns)) + for _, col := range mutRow.c.columns { + dataBefore = append(dataBefore, col.data) + elemBufBefore = append(elemBufBefore, col.elemBuf) + } + for i, col := range mutRow.c.columns { + mutRow.SetDatum(i, nilDatum) + require.Equal(t, col.IsNull(0), true) + for _, off := range col.offsets { + require.Equal(t, off, int64(0)) + } + require.Equal(t, col.data, dataBefore[i]) + require.Equal(t, col.elemBuf, elemBufBefore[i]) + } +} + func BenchmarkMutRowSetRow(b *testing.B) { b.ReportAllocs() rowChk := newChunk(8, 0) @@ -147,8 +167,6 @@ func BenchmarkMutRowFromValues(b *testing.B) { } func TestMutRowShallowCopyPartialRow(t *testing.T) { - t.Parallel() - colTypes := make([]*types.FieldType, 0, 3) colTypes = append(colTypes, &types.FieldType{Tp: mysql.TypeVarString}) colTypes = append(colTypes, &types.FieldType{Tp: mysql.TypeLonglong}) diff --git a/util/chunk/pool_test.go b/util/chunk/pool_test.go index b39c317770272..02c9e319b1ab1 100644 --- a/util/chunk/pool_test.go +++ b/util/chunk/pool_test.go @@ -23,8 +23,6 @@ import ( ) func TestNewPool(t *testing.T) { - t.Parallel() - pool := NewPool(1024) require.Equal(t, 1024, pool.initCap) require.NotNil(t, pool.varLenColPool) @@ -35,8 +33,6 @@ func TestNewPool(t *testing.T) { } func TestPoolGetChunk(t *testing.T) { - t.Parallel() - initCap := 1024 pool := NewPool(initCap) @@ -72,8 +68,6 @@ func TestPoolGetChunk(t *testing.T) { } func TestPoolPutChunk(t *testing.T) { - t.Parallel() - initCap := 1024 pool := NewPool(initCap) diff --git a/util/chunk/row_container_test.go b/util/chunk/row_container_test.go index 49d618b0dd96e..553863ddf3141 100644 --- a/util/chunk/row_container_test.go +++ b/util/chunk/row_container_test.go @@ -24,8 +24,6 @@ import ( ) func TestNewRowContainer(t *testing.T) { - t.Parallel() - fields := []*types.FieldType{types.NewFieldType(mysql.TypeLonglong)} rc := NewRowContainer(fields, 1024) require.NotNil(t, rc) @@ -33,8 +31,6 @@ func TestNewRowContainer(t *testing.T) { } func TestSel(t *testing.T) { - t.Parallel() - fields := []*types.FieldType{types.NewFieldType(mysql.TypeLonglong)} sz := 4 rc := NewRowContainer(fields, sz) @@ -85,8 +81,6 @@ func TestSel(t *testing.T) { } func TestSpillAction(t *testing.T) { - t.Parallel() - sz := 4 fields := []*types.FieldType{types.NewFieldType(mysql.TypeLonglong)} rc := NewRowContainer(fields, sz) @@ -139,8 +133,6 @@ func TestSpillAction(t *testing.T) { } func TestNewSortedRowContainer(t *testing.T) { - t.Parallel() - fields := []*types.FieldType{types.NewFieldType(mysql.TypeLonglong)} rc := NewSortedRowContainer(fields, 1024, nil, nil, nil) require.NotNil(t, rc) @@ -148,8 +140,6 @@ func TestNewSortedRowContainer(t *testing.T) { } func TestSortedRowContainerSortSpillAction(t *testing.T) { - t.Parallel() - fields := []*types.FieldType{types.NewFieldType(mysql.TypeLonglong)} byItemsDesc := []bool{false} keyColumns := []int{0} @@ -193,8 +183,6 @@ func TestSortedRowContainerSortSpillAction(t *testing.T) { } func TestRowContainerResetAndAction(t *testing.T) { - t.Parallel() - fields := []*types.FieldType{types.NewFieldType(mysql.TypeLonglong)} sz := 20 rc := NewRowContainer(fields, sz) diff --git a/util/codec/bytes_test.go b/util/codec/bytes_test.go index 5f108367074b4..eb2dfee922aa0 100644 --- a/util/codec/bytes_test.go +++ b/util/codec/bytes_test.go @@ -21,8 +21,6 @@ import ( ) func TestFastSlowFastReverse(t *testing.T) { - t.Parallel() - if !supportsUnaligned { return } @@ -35,8 +33,6 @@ func TestFastSlowFastReverse(t *testing.T) { } func TestBytesCodec(t *testing.T) { - t.Parallel() - inputs := []struct { enc []byte dec []byte diff --git a/util/codec/codec.go b/util/codec/codec.go index f08c113a61c81..454e9dd28a9c9 100644 --- a/util/codec/codec.go +++ b/util/codec/codec.go @@ -32,6 +32,8 @@ import ( "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/hack" + "github.com/pingcap/tidb/util/logutil" + "go.uber.org/zap" ) // First byte in the encoded value which specifies the encoding type. @@ -449,7 +451,8 @@ func HashChunkSelected(sc *stmtctx.StatementContext, h []hash.Hash64, chk *chunk } case mysql.TypeDouble: f64s := column.Float64s() - for i, f := range f64s { + for i := range f64s { + f := f64s[i] if sel != nil && !sel[i] { continue } @@ -665,8 +668,8 @@ func HashChunkSelected(sc *stmtctx.StatementContext, h []hash.Hash64, chk *chunk // If two rows are logically equal, it will generate the same bytes. func HashChunkRow(sc *stmtctx.StatementContext, w io.Writer, row chunk.Row, allTypes []*types.FieldType, colIdx []int, buf []byte) (err error) { var b []byte - for _, idx := range colIdx { - buf[0], b, err = encodeHashChunkRowIdx(sc, row, allTypes[idx], idx) + for i, idx := range colIdx { + buf[0], b, err = encodeHashChunkRowIdx(sc, row, allTypes[i], idx) if err != nil { return errors.Trace(err) } @@ -688,13 +691,16 @@ func EqualChunkRow(sc *stmtctx.StatementContext, row1 chunk.Row, allTypes1 []*types.FieldType, colIdx1 []int, row2 chunk.Row, allTypes2 []*types.FieldType, colIdx2 []int, ) (bool, error) { + if len(colIdx1) != len(colIdx2) { + return false, errors.Errorf("Internal error: Hash columns count mismatch, col1: %d, col2: %d", len(colIdx1), len(colIdx2)) + } for i := range colIdx1 { idx1, idx2 := colIdx1[i], colIdx2[i] - flag1, b1, err := encodeHashChunkRowIdx(sc, row1, allTypes1[idx1], idx1) + flag1, b1, err := encodeHashChunkRowIdx(sc, row1, allTypes1[i], idx1) if err != nil { return false, errors.Trace(err) } - flag2, b2, err := encodeHashChunkRowIdx(sc, row2, allTypes2[idx2], idx2) + flag2, b2, err := encodeHashChunkRowIdx(sc, row2, allTypes2[i], idx2) if err != nil { return false, errors.Trace(err) } @@ -959,7 +965,7 @@ func peek(b []byte) (length int, err error) { return 0, errors.Trace(err) } length += l - if length < 0 { + if length <= 0 { return 0, errors.New("invalid encoded key") } else if length > originLength { return 0, errors.Errorf("invalid encoded key, "+ @@ -1290,3 +1296,57 @@ func ConvertByCollationStr(str string, tp *types.FieldType) string { collator := collate.GetCollator(tp.Collate) return string(hack.String(collator.Key(str))) } + +// HashCode encodes a Datum into a unique byte slice. +// It is mostly the same as EncodeValue, but it doesn't contain truncation or verification logic in order +// to make the encoding lossless. +func HashCode(b []byte, d types.Datum) []byte { + switch d.Kind() { + case types.KindInt64: + b = encodeSignedInt(b, d.GetInt64(), false) + case types.KindUint64: + b = encodeUnsignedInt(b, d.GetUint64(), false) + case types.KindFloat32, types.KindFloat64: + b = append(b, floatFlag) + b = EncodeFloat(b, d.GetFloat64()) + case types.KindString: + b = encodeString(b, d, false) + case types.KindBytes: + b = encodeBytes(b, d.GetBytes(), false) + case types.KindMysqlTime: + b = append(b, uintFlag) + t := d.GetMysqlTime().CoreTime() + b = encodeUnsignedInt(b, uint64(t), true) + case types.KindMysqlDuration: + // duration may have negative value, so we cannot use String to encode directly. + b = append(b, durationFlag) + b = EncodeInt(b, int64(d.GetMysqlDuration().Duration)) + case types.KindMysqlDecimal: + b = append(b, decimalFlag) + decStr := d.GetMysqlDecimal().ToString() + b = encodeBytes(b, decStr, false) + case types.KindMysqlEnum: + b = encodeUnsignedInt(b, uint64(d.GetMysqlEnum().ToNumber()), false) + case types.KindMysqlSet: + b = encodeUnsignedInt(b, uint64(d.GetMysqlSet().ToNumber()), false) + case types.KindMysqlBit, types.KindBinaryLiteral: + val := d.GetBinaryLiteral() + b = encodeBytes(b, val, false) + case types.KindMysqlJSON: + b = append(b, jsonFlag) + j := d.GetMysqlJSON() + b = append(b, j.TypeCode) + b = append(b, j.Value...) + case types.KindNull: + b = append(b, NilFlag) + case types.KindMinNotNull: + b = append(b, bytesFlag) + case types.KindMaxValue: + b = append(b, maxFlag) + default: + logutil.BgLogger().Warn("trying to calculate HashCode of an unexpected type of Datum", + zap.Uint8("Datum Kind", d.Kind()), + zap.Stack("stack")) + } + return b +} diff --git a/util/codec/codec_test.go b/util/codec/codec_test.go index e1719bb7345e8..97eb85695e17b 100644 --- a/util/codec/codec_test.go +++ b/util/codec/codec_test.go @@ -30,12 +30,11 @@ import ( "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/collate" "github.com/stretchr/testify/require" ) func TestCodecKey(t *testing.T) { - t.Parallel() - table := []struct { Input []types.Datum Expect []types.Datum @@ -115,8 +114,6 @@ func estimateValuesSize(sc *stmtctx.StatementContext, vals []types.Datum) (int, } func TestCodecKeyCompare(t *testing.T) { - t.Parallel() - table := []struct { Left []types.Datum Right []types.Datum @@ -232,8 +229,6 @@ func TestCodecKeyCompare(t *testing.T) { } func TestNumberCodec(t *testing.T) { - t.Parallel() - tblInt64 := []int64{ math.MinInt64, math.MinInt32, @@ -334,8 +329,6 @@ func TestNumberCodec(t *testing.T) { } func TestNumberOrder(t *testing.T) { - t.Parallel() - tblInt64 := []struct { Arg1 int64 Arg2 int64 @@ -404,8 +397,6 @@ func TestNumberOrder(t *testing.T) { } func TestFloatCodec(t *testing.T) { - t.Parallel() - tblFloat := []float64{ -1, 0, @@ -464,8 +455,6 @@ func TestFloatCodec(t *testing.T) { } func TestBytes(t *testing.T) { - t.Parallel() - tblBytes := [][]byte{ {}, {0x00, 0x01}, @@ -544,8 +533,6 @@ func parseDuration(t *testing.T, s string) types.Duration { } func TestTime(t *testing.T) { - t.Parallel() - tbl := []string{ "2011-01-01 00:00:00", "2011-01-01 00:00:00", @@ -593,8 +580,6 @@ func TestTime(t *testing.T) { } func TestDuration(t *testing.T) { - t.Parallel() - tbl := []string{ "11:11:11", "00:00:00", @@ -637,8 +622,6 @@ func TestDuration(t *testing.T) { } func TestDecimal(t *testing.T) { - t.Parallel() - tbl := []string{ "1234.00", "1234", @@ -811,8 +794,6 @@ func TestDecimal(t *testing.T) { } func TestJSON(t *testing.T) { - t.Parallel() - tbl := []string{ "1234.00", `{"a": "b"}`, @@ -842,8 +823,6 @@ func TestJSON(t *testing.T) { } func TestCut(t *testing.T) { - t.Parallel() - table := []struct { Input []types.Datum Expect []types.Datum @@ -939,22 +918,18 @@ func TestCut(t *testing.T) { } func TestCutOneError(t *testing.T) { - t.Parallel() - var b []byte _, _, err := CutOne(b) require.Error(t, err) - require.Regexp(t, "invalid encoded key", err.Error()) + require.EqualError(t, err, "invalid encoded key") b = []byte{4 /* codec.uintFlag */, 0, 0, 0} _, _, err = CutOne(b) require.Error(t, err) - require.Regexp(t, "invalid encoded key.*", err.Error()) + require.Regexp(t, "^invalid encoded key", err.Error()) } func TestSetRawValues(t *testing.T) { - t.Parallel() - sc := &stmtctx.StatementContext{TimeZone: time.Local} datums := types.MakeDatums(1, "abc", 1.1, []byte("def")) rowData, err := EncodeValue(sc, nil, datums...) @@ -973,8 +948,6 @@ func TestSetRawValues(t *testing.T) { } func TestDecodeOneToChunk(t *testing.T) { - t.Parallel() - sc := &stmtctx.StatementContext{TimeZone: time.Local} datums, tps := datumsForTest(sc) rowCount := 3 @@ -987,7 +960,7 @@ func TestDecodeOneToChunk(t *testing.T) { require.True(t, expect.IsNull()) } else { if got.Kind() != types.KindMysqlDecimal { - cmp, err := got.CompareDatum(sc, &expect) + cmp, err := got.Compare(sc, &expect, collate.GetCollator(tp.Collate)) require.NoError(t, err) require.Equalf(t, 0, cmp, "expect: %v, got %v", expect, got) } else { @@ -999,8 +972,6 @@ func TestDecodeOneToChunk(t *testing.T) { } func TestHashGroup(t *testing.T) { - t.Parallel() - sc := &stmtctx.StatementContext{TimeZone: time.Local} tp := types.NewFieldType(mysql.TypeNewDecimal) tps := []*types.FieldType{tp} @@ -1098,8 +1069,6 @@ func chunkForTest(t *testing.T, sc *stmtctx.StatementContext, datums []types.Dat } func TestDecodeRange(t *testing.T) { - t.Parallel() - _, _, err := DecodeRange(nil, 0, nil, nil) require.Error(t, err) @@ -1110,7 +1079,7 @@ func TestDecodeRange(t *testing.T) { datums1, _, err := DecodeRange(rowData, len(datums), nil, nil) require.NoError(t, err) for i, datum := range datums1 { - cmp, err := datum.CompareDatum(nil, &datums[i]) + cmp, err := datum.Compare(nil, &datums[i], collate.GetBinaryCollator()) require.NoError(t, err) require.Equal(t, 0, cmp) } @@ -1166,8 +1135,6 @@ func testHashChunkRowEqual(t *testing.T, a, b interface{}, equal bool) { } func TestHashChunkRow(t *testing.T) { - t.Parallel() - sc := &stmtctx.StatementContext{TimeZone: time.Local} buf := make([]byte, 1) datums, tps := datumsForTest(sc) @@ -1212,8 +1179,6 @@ func TestHashChunkRow(t *testing.T) { } func TestValueSizeOfSignedInt(t *testing.T) { - t.Parallel() - testCase := []int64{64, 8192, 1048576, 134217728, 17179869184, 2199023255552, 281474976710656, 36028797018963968, 4611686018427387904} var b []byte for _, v := range testCase { @@ -1239,8 +1204,6 @@ func TestValueSizeOfSignedInt(t *testing.T) { } func TestValueSizeOfUnsignedInt(t *testing.T) { - t.Parallel() - testCase := []uint64{128, 16384, 2097152, 268435456, 34359738368, 4398046511104, 562949953421312, 72057594037927936, 9223372036854775808} var b []byte for _, v := range testCase { @@ -1256,8 +1219,6 @@ func TestValueSizeOfUnsignedInt(t *testing.T) { } func TestHashChunkColumns(t *testing.T) { - t.Parallel() - sc := &stmtctx.StatementContext{TimeZone: time.Local} buf := make([]byte, 1) datums, tps := datumsForTest(sc) @@ -1280,9 +1241,9 @@ func TestHashChunkColumns(t *testing.T) { for i := 0; i < 12; i++ { require.True(t, chk.GetRow(0).IsNull(i)) err1 := HashChunkSelected(sc, vecHash, chk, tps[i], i, buf, hasNull, sel, false) - err2 := HashChunkRow(sc, rowHash[0], chk.GetRow(0), tps, colIdx[i:i+1], buf) - err3 := HashChunkRow(sc, rowHash[1], chk.GetRow(1), tps, colIdx[i:i+1], buf) - err4 := HashChunkRow(sc, rowHash[2], chk.GetRow(2), tps, colIdx[i:i+1], buf) + err2 := HashChunkRow(sc, rowHash[0], chk.GetRow(0), tps[i:i+1], colIdx[i:i+1], buf) + err3 := HashChunkRow(sc, rowHash[1], chk.GetRow(1), tps[i:i+1], colIdx[i:i+1], buf) + err4 := HashChunkRow(sc, rowHash[2], chk.GetRow(2), tps[i:i+1], colIdx[i:i+1], buf) require.NoError(t, err1) require.NoError(t, err2) require.NoError(t, err3) @@ -1305,9 +1266,9 @@ func TestHashChunkColumns(t *testing.T) { require.False(t, chk.GetRow(0).IsNull(i)) err1 := HashChunkSelected(sc, vecHash, chk, tps[i], i, buf, hasNull, sel, false) - err2 := HashChunkRow(sc, rowHash[0], chk.GetRow(0), tps, colIdx[i:i+1], buf) - err3 := HashChunkRow(sc, rowHash[1], chk.GetRow(1), tps, colIdx[i:i+1], buf) - err4 := HashChunkRow(sc, rowHash[2], chk.GetRow(2), tps, colIdx[i:i+1], buf) + err2 := HashChunkRow(sc, rowHash[0], chk.GetRow(0), tps[i:i+1], colIdx[i:i+1], buf) + err3 := HashChunkRow(sc, rowHash[1], chk.GetRow(1), tps[i:i+1], colIdx[i:i+1], buf) + err4 := HashChunkRow(sc, rowHash[2], chk.GetRow(2), tps[i:i+1], colIdx[i:i+1], buf) require.NoError(t, err1) require.NoError(t, err2) diff --git a/util/codec/decimal_test.go b/util/codec/decimal_test.go index 1c01914e90092..77ec77ef92343 100644 --- a/util/codec/decimal_test.go +++ b/util/codec/decimal_test.go @@ -22,8 +22,6 @@ import ( ) func TestDecimalCodec(t *testing.T) { - t.Parallel() - inputs := []struct { Input float64 }{ @@ -63,8 +61,6 @@ func TestDecimalCodec(t *testing.T) { } func TestFrac(t *testing.T) { - t.Parallel() - inputs := []struct { Input *types.MyDecimal }{ diff --git a/util/collate/charset.go b/util/collate/charset.go index bdcbf1d8628e9..166f29f6aeee9 100644 --- a/util/collate/charset.go +++ b/util/collate/charset.go @@ -84,8 +84,9 @@ var ( func init() { experimentalCollation = make(map[string]Collator) experimentalCharsetInfo = append(experimentalCharsetInfo, - &charset.Charset{Name: charset.CharsetGBK, DefaultCollation: charset.CollationGBKBin, Collations: make(map[string]*charset.Collation), Desc: "Chinese Internal Code Specification", Maxlen: 2}, + &charset.Charset{Name: charset.CharsetGBK, DefaultCollation: "gbk_chinese_ci", Collations: make(map[string]*charset.Collation), Desc: "Chinese Internal Code Specification", Maxlen: 2}, ) e, _ := charset.Lookup(charset.CharsetGBK) experimentalCollation[charset.CollationGBKBin] = &gbkBinCollator{e.NewEncoder()} + experimentalCollation["gbk_chinese_ci"] = &gbkChineseCICollator{} } diff --git a/util/collate/collate.go b/util/collate/collate.go index 4f73b89b6742d..73bdeeaaa20d5 100644 --- a/util/collate/collate.go +++ b/util/collate/collate.go @@ -143,17 +143,24 @@ func GetCollator(collate string) Collator { if atomic.LoadInt32(&newCollationEnabled) == 1 { ctor, ok := newCollatorMap[collate] if !ok { - logutil.BgLogger().Warn( - "Unable to get collator by name, use binCollator instead.", - zap.String("name", collate), - zap.Stack("stack")) - return newCollatorMap["utf8mb4_bin"] + if collate != "" { + logutil.BgLogger().Warn( + "Unable to get collator by name, use binCollator instead.", + zap.String("name", collate), + zap.Stack("stack")) + } + return newCollatorMap[charset.CollationUTF8MB4] } return ctor } return binCollatorInstance } +// GetBinaryCollator gets the binary collator, it is often used when we want to apply binary compare. +func GetBinaryCollator() Collator { + return binCollatorInstance +} + // GetCollatorByID get the collator according to id, it will return the binary collator if the corresponding collator doesn't exist. func GetCollatorByID(id int) Collator { if atomic.LoadInt32(&newCollationEnabled) == 1 { @@ -316,6 +323,36 @@ func IsBinCollation(collate string) bool { collate == charset.CollationUTF8 || collate == charset.CollationUTF8MB4 } +// CollationToProto converts collation from string to int32(used by protocol). +func CollationToProto(c string) int32 { + if coll, err := charset.GetCollationByName(c); err == nil { + return RewriteNewCollationIDIfNeeded(int32(coll.ID)) + } + v := RewriteNewCollationIDIfNeeded(int32(mysql.DefaultCollationID)) + logutil.BgLogger().Warn( + "Unable to get collation ID by name, use ID of the default collation instead", + zap.String("name", c), + zap.Int32("default collation ID", v), + zap.String("default collation", mysql.DefaultCollationName), + ) + return v +} + +// ProtoToCollation converts collation from int32(used by protocol) to string. +func ProtoToCollation(c int32) string { + coll, err := charset.GetCollationByID(int(RestoreCollationIDIfNeeded(c))) + if err == nil { + return coll.Name + } + logutil.BgLogger().Warn( + "Unable to get collation name from ID, use name of the default collation instead", + zap.Int32("id", c), + zap.Int("default collation ID", mysql.DefaultCollationID), + zap.String("default collation", mysql.DefaultCollationName), + ) + return mysql.DefaultCollationName +} + func init() { newCollatorMap = make(map[string]Collator) newCollatorIDMap = make(map[int]Collator) diff --git a/util/collate/collate_test.go b/util/collate/collate_test.go index 874d555d06967..1b1342b9cb9d7 100644 --- a/util/collate/collate_test.go +++ b/util/collate/collate_test.go @@ -55,20 +55,21 @@ func testKeyTable(t *testing.T, collations []string, tests []keyTable) { func TestUTF8CollatorCompare(t *testing.T) { SetCharsetFeatEnabledForTest(true) defer SetCharsetFeatEnabledForTest(false) - collations := []string{"binary", "utf8mb4_bin", "utf8mb4_general_ci", "utf8mb4_unicode_ci", "gbk_bin"} + collations := []string{"binary", "utf8mb4_bin", "utf8mb4_general_ci", "utf8mb4_unicode_ci", "gbk_bin", "gbk_chinese_ci"} tests := []compareTable{ - {"a", "b", []int{-1, -1, -1, -1, -1}}, - {"a", "A", []int{1, 1, 0, 0, 1}}, - {"À", "A", []int{1, 1, 0, 0, -1}}, - {"abc", "abc", []int{0, 0, 0, 0, 0}}, - {"abc", "ab", []int{1, 1, 1, 1, 1}}, - {"😜", "😃", []int{1, 1, 0, 0, 0}}, - {"a", "a ", []int{-1, 0, 0, 0, 0}}, - {"a ", "a ", []int{-1, 0, 0, 0, 0}}, - {"a\t", "a", []int{1, 1, 1, 1, 1}}, - {"ß", "s", []int{1, 1, 0, 1, -1}}, - {"ß", "ss", []int{1, 1, -1, 0, -1}}, - {"啊", "吧", []int{1, 1, 1, 1, -1}}, + {"a", "b", []int{-1, -1, -1, -1, -1, -1}}, + {"a", "A", []int{1, 1, 0, 0, 1, 0}}, + {"À", "A", []int{1, 1, 0, 0, -1, -1}}, + {"abc", "abc", []int{0, 0, 0, 0, 0, 0}}, + {"abc", "ab", []int{1, 1, 1, 1, 1, 1}}, + {"😜", "😃", []int{1, 1, 0, 0, 0, 0}}, + {"a", "a ", []int{-1, 0, 0, 0, 0, 0}}, + {"a ", "a ", []int{-1, 0, 0, 0, 0, 0}}, + {"a\t", "a", []int{1, 1, 1, 1, 1, 1}}, + {"ß", "s", []int{1, 1, 0, 1, -1, -1}}, + {"ß", "ss", []int{1, 1, -1, 0, -1, -1}}, + {"啊", "吧", []int{1, 1, 1, 1, -1, -1}}, + {"中文", "汉字", []int{-1, -1, -1, -1, 1, 1}}, } testCompareTable(t, collations, tests) } @@ -76,24 +77,26 @@ func TestUTF8CollatorCompare(t *testing.T) { func TestUTF8CollatorKey(t *testing.T) { SetCharsetFeatEnabledForTest(true) defer SetCharsetFeatEnabledForTest(false) - collations := []string{"binary", "utf8mb4_bin", "utf8mb4_general_ci", "utf8mb4_unicode_ci", "gbk_bin"} + collations := []string{"binary", "utf8mb4_bin", "utf8mb4_general_ci", "utf8mb4_unicode_ci", "gbk_bin", "gbk_chinese_ci"} tests := []keyTable{ - {"a", [][]byte{{0x61}, {0x61}, {0x0, 0x41}, {0x0E, 0x33}, {0x61}}}, - {"A", [][]byte{{0x41}, {0x41}, {0x0, 0x41}, {0x0E, 0x33}, {0x41}}}, + {"a", [][]byte{{0x61}, {0x61}, {0x0, 0x41}, {0x0E, 0x33}, {0x61}, {0x41}}}, + {"A", [][]byte{{0x41}, {0x41}, {0x0, 0x41}, {0x0E, 0x33}, {0x41}, {0x41}}}, {"Foo © bar 𝌆 baz ☃ qux", [][]byte{ {0x46, 0x6f, 0x6f, 0x20, 0xc2, 0xa9, 0x20, 0x62, 0x61, 0x72, 0x20, 0xf0, 0x9d, 0x8c, 0x86, 0x20, 0x62, 0x61, 0x7a, 0x20, 0xe2, 0x98, 0x83, 0x20, 0x71, 0x75, 0x78}, {0x46, 0x6f, 0x6f, 0x20, 0xc2, 0xa9, 0x20, 0x62, 0x61, 0x72, 0x20, 0xf0, 0x9d, 0x8c, 0x86, 0x20, 0x62, 0x61, 0x7a, 0x20, 0xe2, 0x98, 0x83, 0x20, 0x71, 0x75, 0x78}, {0x0, 0x46, 0x0, 0x4f, 0x0, 0x4f, 0x0, 0x20, 0x0, 0xa9, 0x0, 0x20, 0x0, 0x42, 0x0, 0x41, 0x0, 0x52, 0x0, 0x20, 0xff, 0xfd, 0x0, 0x20, 0x0, 0x42, 0x0, 0x41, 0x0, 0x5a, 0x0, 0x20, 0x26, 0x3, 0x0, 0x20, 0x0, 0x51, 0x0, 0x55, 0x0, 0x58}, {0x0E, 0xB9, 0x0F, 0x82, 0x0F, 0x82, 0x02, 0x09, 0x02, 0xC5, 0x02, 0x09, 0x0E, 0x4A, 0x0E, 0x33, 0x0F, 0xC0, 0x02, 0x09, 0xFF, 0xFD, 0x02, 0x09, 0x0E, 0x4A, 0x0E, 0x33, 0x10, 0x6A, 0x02, 0x09, 0x06, 0xFF, 0x02, 0x09, 0x0F, 0xB4, 0x10, 0x1F, 0x10, 0x5A}, {0x46, 0x6f, 0x6f, 0x20, 0x3f, 0x20, 0x62, 0x61, 0x72, 0x20, 0x3f, 0x20, 0x62, 0x61, 0x7a, 0x20, 0x3f, 0x20, 0x71, 0x75, 0x78}, + {0x46, 0x4f, 0x4f, 0x20, 0x3f, 0x20, 0x42, 0x41, 0x52, 0x20, 0x3f, 0x20, 0x42, 0x41, 0x5a, 0x20, 0x3f, 0x20, 0x51, 0x55, 0x58}, }}, - {"a ", [][]byte{{0x61, 0x20}, {0x61}, {0x0, 0x41}, {0x0E, 0x33}, {0x61}}}, + {"a ", [][]byte{{0x61, 0x20}, {0x61}, {0x0, 0x41}, {0x0E, 0x33}, {0x61}, {0x41}}}, {"ﷻ", [][]byte{ {0xEF, 0xB7, 0xBB}, {0xEF, 0xB7, 0xBB}, {0xFD, 0xFB}, {0x13, 0x5E, 0x13, 0xAB, 0x02, 0x09, 0x13, 0x5E, 0x13, 0xAB, 0x13, 0x50, 0x13, 0xAB, 0x13, 0xB7}, {0x3f}, + {0x3F}, }}, {"中文", [][]byte{ {0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87}, @@ -101,6 +104,7 @@ func TestUTF8CollatorKey(t *testing.T) { {0x4E, 0x2D, 0x65, 0x87}, {0xFB, 0x40, 0xCE, 0x2D, 0xFB, 0x40, 0xE5, 0x87}, {0xD6, 0xD0, 0xCE, 0xC4}, + {0xD3, 0x21, 0xC1, 0xAD}, }}, } testKeyTable(t, collations, tests) diff --git a/util/collate/gbk_chinese_ci.go b/util/collate/gbk_chinese_ci.go new file mode 100644 index 0000000000000..937ba3844df1a --- /dev/null +++ b/util/collate/gbk_chinese_ci.go @@ -0,0 +1,86 @@ +// Copyright 2021 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, +// 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. + +package collate + +import "github.com/pingcap/tidb/util/stringutil" + +type gbkChineseCICollator struct { +} + +// Compare implements Collator interface. +func (g *gbkChineseCICollator) Compare(a, b string) int { + a = truncateTailingSpace(a) + b = truncateTailingSpace(b) + + r1, r2 := rune(0), rune(0) + ai, bi := 0, 0 + for ai < len(a) && bi < len(b) { + r1, ai = decodeRune(a, ai) + r2, bi = decodeRune(b, bi) + + cmp := int(gbkChineseCISortKey(r1)) - int(gbkChineseCISortKey(r2)) + if cmp != 0 { + return sign(cmp) + } + } + return sign((len(a) - ai) - (len(b) - bi)) +} + +// Key implements Collator interface. +func (g *gbkChineseCICollator) Key(str string) []byte { + str = truncateTailingSpace(str) + buf := make([]byte, 0, len(str)*2) + i := 0 + r := rune(0) + for i < len(str) { + r, i = decodeRune(str, i) + u16 := gbkChineseCISortKey(r) + if u16 > 0xFF { + buf = append(buf, byte(u16>>8)) + } + buf = append(buf, byte(u16)) + } + return buf +} + +// Pattern implements Collator interface. +func (g *gbkChineseCICollator) Pattern() WildcardPattern { + return &gbkChineseCIPattern{} +} + +type gbkChineseCIPattern struct { + patChars []rune + patTypes []byte +} + +// Compile implements WildcardPattern interface. +func (p *gbkChineseCIPattern) Compile(patternStr string, escape byte) { + p.patChars, p.patTypes = stringutil.CompilePatternInner(patternStr, escape) +} + +// DoMatch implements WildcardPattern interface. +func (p *gbkChineseCIPattern) DoMatch(str string) bool { + return stringutil.DoMatchInner(str, p.patChars, p.patTypes, func(a, b rune) bool { + return gbkChineseCISortKey(a) == gbkChineseCISortKey(b) + }) +} + +func gbkChineseCISortKey(r rune) uint16 { + if r > 0xFFFF { + return 0x3F + } + + return gbkChineseCISortKeyTable[r] +} diff --git a/util/collate/gbk_chinese_ci_data.go b/util/collate/gbk_chinese_ci_data.go new file mode 100644 index 0000000000000..01636cc3354cd --- /dev/null +++ b/util/collate/gbk_chinese_ci_data.go @@ -0,0 +1,278 @@ +// Copyright 2021 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, +// 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. + +package collate + +var ( + gbkChineseCISortKeyTable = [0xFFFF + 1]uint16{ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5C, 0x5C, 0x5B, 0x5E, 0x5F, 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x7B, 0x7C, 0x7D, 0x59, 0x7F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8243, 0x3F, 0x3F, 0x8245, 0x8144, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8247, 0x8183, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8248, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8184, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x82B3, 0x82B2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x82C4, 0x82C3, 0x82C5, 0x3F, 0x82D3, 0x82D2, 0x3F, 0x3F, 0x3F, 0x3F, 0x82EF, 0x82EE, 0x3F, 0x3F, 0x3F, 0x8185, 0x3F, 0x8300, 0x82FF, 0x3F, 0x8301, 0x3F, + 0x3F, 0x3F, 0x3F, 0x82B5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x82C7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x82C6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x82D5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x82E9, 0x3F, 0x3F, 0x3F, 0x82EA, 0x3F, 0x3F, 0x3F, 0x3F, 0x82F1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8303, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x82B4, 0x3F, 0x82D4, 0x3F, 0x82F0, 0x3F, 0x8302, 0x3F, 0x8307, 0x3F, 0x8304, 0x3F, 0x8306, 0x3F, 0x8305, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x82B6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x82CD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8148, 0x3F, 0x8146, 0x8147, 0x813A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8149, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8312, 0x8314, 0x8316, 0x8318, 0x831A, 0x831C, 0x831E, 0x8320, 0x8322, 0x8324, 0x8326, 0x8328, 0x832A, 0x832C, 0x832E, 0x8330, 0x8332, 0x3F, 0x8334, 0x8336, 0x8338, 0x833A, 0x833C, 0x833E, 0x8340, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8313, 0x8315, 0x8317, 0x8319, 0x831B, 0x831D, 0x831F, 0x8321, 0x8323, 0x8325, 0x8327, 0x8329, 0x832B, 0x832D, 0x832F, 0x8331, 0x8333, 0x3F, 0x8335, 0x8337, 0x8339, 0x833B, 0x833D, 0x833F, 0x8341, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x834E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8342, 0x8344, 0x8346, 0x8348, 0x834A, 0x834C, 0x8350, 0x8352, 0x8354, 0x8356, 0x8358, 0x835A, 0x835C, 0x835E, 0x8360, 0x8362, 0x8364, 0x8366, 0x8368, 0x836A, 0x836C, 0x836E, 0x8370, 0x8372, 0x8374, 0x8376, 0x8378, 0x837A, 0x837C, 0x837E, 0x8380, 0x8382, 0x8343, 0x8345, 0x8347, 0x8349, 0x834B, 0x834D, 0x8351, 0x8353, 0x8355, 0x8357, 0x8359, 0x835B, 0x835D, 0x835F, 0x8361, 0x8363, 0x8365, 0x8367, 0x8369, 0x836B, 0x836D, 0x836F, 0x8371, 0x8373, 0x8375, 0x8377, 0x8379, 0x837B, 0x837D, 0x837F, 0x8381, 0x8383, 0x3F, 0x834F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8104, 0x3F, 0x3F, 0x8105, 0x8106, 0x8107, 0x814A, 0x3F, 0x814B, 0x814C, 0x3F, 0x3F, 0x814D, 0x814E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8249, 0x824A, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x824B, 0x3F, 0x814F, 0x8150, 0x3F, 0x8151, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x824C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x82BB, 0x3F, 0x82BE, 0x3F, 0x3F, 0x3F, 0x82CA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x82EB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x82FC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x825A, 0x8261, 0x8268, 0x826F, 0x8276, 0x827D, 0x8284, 0x828B, 0x8292, 0x8298, 0x829B, 0x829E, 0x3F, 0x3F, 0x3F, 0x3F, 0x8259, 0x8260, 0x8267, 0x826E, 0x8275, 0x827C, 0x8283, 0x828A, 0x8291, 0x8297, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x81BD, 0x81B7, 0x81B9, 0x81BB, 0x3F, 0x3F, 0x81BE, 0x81B8, 0x81BA, 0x81BC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8186, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8187, 0x3F, 0x8188, 0x3F, 0x3F, 0x3F, 0x817B, 0x3F, 0x3F, 0x3F, 0x3F, 0x8189, 0x3F, 0x3F, 0x818A, 0x82AF, 0x818B, 0x818C, 0x3F, 0x3F, 0x818D, 0x3F, 0x818E, 0x3F, 0x818F, 0x8190, 0x8191, 0x8192, 0x8193, 0x3F, 0x3F, 0x8194, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8195, 0x8196, 0x8197, 0x8198, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8199, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x819A, 0x3F, 0x3F, 0x3F, 0x819B, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x819C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x819D, 0x819E, 0x3F, 0x3F, 0x819F, 0x81A0, 0x81A1, 0x81A2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x81A3, 0x81A4, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x817A, 0x3F, 0x3F, 0x3F, 0x817C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x81A5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x81A6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x81A7, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8256, 0x825D, 0x8264, 0x826B, 0x8272, 0x8279, 0x8280, 0x8287, 0x828E, 0x8294, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8257, 0x825E, 0x8265, 0x826C, 0x8273, 0x827A, 0x8281, 0x8288, 0x828F, 0x8295, 0x8299, 0x829C, 0x829F, 0x82A1, 0x82A3, 0x82A5, 0x82A7, 0x82A9, 0x82AB, 0x82AD, 0x8258, 0x825F, 0x8266, 0x826D, 0x8274, 0x827B, 0x8282, 0x8289, 0x8290, 0x8296, 0x829A, 0x829D, 0x82A0, 0x82A2, 0x82A4, 0x82A6, 0x82A8, 0x82AA, 0x82AC, 0x82AE, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x81BF, 0x81C0, 0x81C6, 0x81C7, 0x81C1, 0x81C2, 0x81C8, 0x81C9, 0x81C3, 0x81C4, 0x81CA, 0x81CB, 0x81CD, 0x81CE, 0x81CF, 0x81D0, 0x81D5, 0x81D6, 0x81D7, 0x81D8, 0x81DD, 0x81DE, 0x81DF, 0x81E0, 0x81E5, 0x81E6, 0x81E7, 0x81E8, 0x81ED, 0x81EE, 0x81EF, 0x81F0, 0x81F1, 0x81F2, 0x81F3, 0x81F4, 0x81F8, 0x81F9, 0x81FA, 0x81FB, 0x81FC, 0x81FD, 0x81FE, 0x81FF, 0x8203, 0x8204, 0x8205, 0x8206, 0x8207, 0x8208, 0x8209, 0x820A, 0x820E, 0x820F, 0x8210, 0x8211, 0x8212, 0x8213, 0x8214, 0x8215, 0x8219, 0x821A, 0x821B, 0x821C, 0x821D, 0x821E, 0x821F, 0x8220, 0x8221, 0x8222, 0x8223, 0x8224, 0x8225, 0x8226, 0x8227, 0x8228, 0x3F, 0x3F, 0x3F, 0x3F, 0x81C5, 0x81CC, 0x81D1, 0x81D2, 0x81D3, 0x81D9, 0x81DA, 0x81DB, 0x81E1, 0x81E2, 0x81E3, 0x81E9, 0x81EA, 0x81EB, 0x81F5, 0x81F6, 0x81F7, 0x8200, 0x8201, 0x8202, 0x820B, 0x820C, 0x820D, 0x8216, 0x8217, 0x8218, 0x8229, 0x822A, 0x822B, 0x81D4, 0x81DC, 0x81EC, 0x81E4, 0x822C, 0x822D, 0x822E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x822F, 0x8233, 0x8235, 0x8237, 0x8239, 0x823B, 0x823D, 0x823F, 0x823E, 0x823C, 0x823A, 0x8238, 0x8236, 0x8234, 0x8230, 0x3F, 0x3F, 0x3F, 0x8240, 0x8231, 0x8232, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x81A8, 0x81A9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x81AA, 0x81AB, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x81AC, 0x81AD, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x81AE, 0x81AF, 0x3F, 0x3F, 0x3F, 0x81B0, 0x3F, 0x3F, 0x81B1, 0x81B2, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x81B3, 0x81B4, 0x81B5, 0x81B6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8250, 0x824F, 0x3F, 0x3F, 0x8251, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8252, 0x3F, 0x8253, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x810B, 0x8122, 0x8125, 0x8176, 0x3F, 0xDE7E, 0x8177, 0x8100, 0x8158, 0x815A, 0x815C, 0x815E, 0x8160, 0x8162, 0x8164, 0x8166, 0x8168, 0x816A, 0x824D, 0x824E, 0x816D, 0x8170, 0x8172, 0x8173, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8174, 0x8175, 0x3F, 0x3F, 0x825B, 0x8262, 0x8269, 0x8270, 0x8277, 0x827E, 0x8285, 0x828C, 0x8293, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8385, 0x8387, 0x8389, 0x838B, 0x838D, 0x838F, 0x8392, 0x8394, 0x8396, 0x8398, 0x839B, 0x839D, 0x839F, 0x83A1, 0x83A3, 0x83A5, 0x83A8, 0x83AA, 0x83AC, 0x83AE, 0x83B0, 0x83B2, 0x83B4, 0x83B6, 0x83B8, 0x83BA, 0x83BC, 0x83BE, 0x83C0, 0x83C2, 0x83C4, 0x83C6, 0x83C8, 0x83CA, 0x83CC, 0x83CE, 0x83D0, 0x83D2, 0x83D4, 0x83D6, 0x83D8, 0x83DA, 0x83DC, 0x83DE, 0x83E0, 0x83E2, 0x83E4, 0x83E6, 0x83E8, 0x83EA, 0x83EC, 0x83EE, 0x83F0, 0x83F2, 0x83F4, 0x83F6, 0x83F8, 0x83FA, 0x83FC, 0x83FE, 0x8400, 0x8402, 0x8404, 0x8406, 0x8408, 0x840A, 0x840C, 0x840E, 0x8410, 0x8412, 0x8414, 0x8416, 0x8418, 0x841A, 0x841C, 0x841E, 0x8420, 0x8422, 0x8424, 0x8426, 0x8428, 0x842A, 0x842C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8109, 0x810A, 0xDE82, 0xDE83, 0x3F, 0x3F, 0x8384, 0x8386, 0x8388, 0x838A, 0x838C, 0x838E, 0x8391, 0x8393, 0x8395, 0x8397, 0x839A, 0x839C, 0x839E, 0x83A0, 0x83A2, 0x83A4, 0x83A7, 0x83A9, 0x83AB, 0x83AD, 0x83AF, 0x83B1, 0x83B3, 0x83B5, 0x83B7, 0x83B9, 0x83BB, 0x83BD, 0x83BF, 0x83C1, 0x83C3, 0x83C5, 0x83C7, 0x83C9, 0x83CB, 0x83CD, 0x83CF, 0x83D1, 0x83D3, 0x83D5, 0x83D7, 0x83D9, 0x83DB, 0x83DD, 0x83DF, + 0x83E1, 0x83E3, 0x83E5, 0x83E7, 0x83E9, 0x83EB, 0x83ED, 0x83EF, 0x83F1, 0x83F3, 0x83F5, 0x83F7, 0x83F9, 0x83FB, 0x83FD, 0x83FF, 0x8401, 0x8403, 0x8405, 0x8407, 0x8409, 0x840B, 0x840D, 0x840F, 0x8411, 0x8413, 0x8415, 0x8417, 0x8419, 0x841B, 0x841D, 0x841F, 0x8421, 0x8423, 0x8425, 0x8427, 0x8429, 0x842B, 0x8390, 0x8399, 0x83A6, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xDE7F, 0xDE80, 0xDE81, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x842D, 0x842E, 0x842F, 0x8430, 0x8431, 0x8432, 0x8433, 0x8434, 0x8435, 0x8436, 0x8437, 0x8438, 0x8439, 0x843A, 0x843B, 0x843C, 0x843D, 0x843E, 0x843F, 0x8440, 0x8441, 0x8442, 0x8443, 0x8444, 0x8445, 0x8446, 0x8447, 0x8448, 0x8449, 0x844A, 0x844B, 0x844C, 0x844D, 0x844E, 0x844F, 0x8450, 0x8451, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCA27, 0x923C, 0xB7BF, 0xBB7C, 0xC25A, 0xA8CC, 0xB248, 0x8518, 0xA0BF, 0xB9D9, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD3AF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xD225, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x82E4, 0x82DA, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x82E6, 0x82BD, 0x82DB, 0x3F, 0x3F, 0x82E3, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x82BC, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x82DC, 0x3F, 0x3F, 0x82DF, 0x82E0, 0x3F, 0x3F, 0x82E5, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xCA26, 0x9021, 0xA2CD, 0xB247, 0xB8C5, 0xC3DC, 0xADDA, 0xC0A1, 0xD114, 0xB7BE, 0xB8C6, 0xC3DD, 0x9C0F, 0x8870, 0xCDC5, 0xAC98, 0x94D1, 0x8BBE, 0x8BBF, 0xD435, 0xB457, 0xB0D4, 0xBA14, 0xBA15, 0xB518, 0x87C7, 0xC9EA, 0x8D15, 0x904E, 0xBB49, 0x8ABC, 0x9049, 0xB519, 0xA763, 0x904A, 0xCD28, 0xA764, 0xC845, 0x87DF, 0xB7E2, 0x97A2, 0xA0A9, 0x95BC, 0xC7D9, 0xD469, 0xD321, 0x9CBF, 0x9F9C, 0x9371, 0x9706, 0x8C42, 0x89AF, 0xA7E1, 0xD4B9, 0xD3E5, 0x97F6, 0xC072, 0x8E24, 0xC0FA, 0xD3E6, 0xA046, 0xA66F, 0xA13D, 0xB184, 0x93F3, 0xCA4E, 0xCABF, 0xADFE, 0xC258, 0xA0C0, 0xA0C1, 0xBFEB, 0xAB8A, 0xCAC0, 0x9938, 0xD232, 0xC220, 0xD084, 0x99AE, 0x9250, 0xA599, 0xCBBD, 0xB1A2, 0xB027, 0xB41E, 0x99F5, 0x96DC, 0x8AC4, 0x8ACB, 0xCA9B, 0xCB8C, 0xC064, 0xACCC, 0xA0BE, 0xB2D4, 0xC9E1, 0xC334, 0xC4A6, 0x94D2, 0xA0C2, 0x980C, 0x9939, 0xBA82, 0x9091, 0xBA05, 0x9C15, 0xAE2E, 0xA28C, 0xA341, 0xBF0D, 0xAD93, 0xAFBD, 0xAADE, 0xAA3E, 0x88A9, 0xB744, 0xC75C, 0xC87F, 0xB0D2, 0xB826, 0xADE2, 0xB36F, 0xBBA7, 0x920F, 0x8D70, 0x892D, 0xB377, 0xD2C9, 0x974E, 0x94F4, 0xAA40, 0xA809, 0xCB26, 0xA1C9, 0xA7AE, 0xAAC9, 0xCD67, 0xD1F6, 0xBA1C, 0xBA1F, 0x923B, 0x8C01, 0xCD65, 0xA3F6, 0xCD66, 0xCF1F, 0x9A01, 0xB272, 0xC259, 0xA045, 0xBB7A, 0xBC59, 0x95CA, 0x95EF, 0xC809, 0xC562, 0xC80D, 0xB27A, 0xC810, 0x9C7A, 0xBF50, 0xC0B5, 0xA2BF, 0x8DEE, 0x9EB6, 0x9802, 0xCACB, 0x89AC, 0x9921, 0xADAA, 0xC9E3, 0xC4CD, 0xA021, 0xBEEA, 0xA76F, 0xC4CE, + 0xA025, 0xC9F1, 0xB474, 0x881B, 0xCD51, 0xC5AF, 0x8E4C, 0xA6FB, 0x917D, 0xC166, 0xB691, 0xB692, 0x9C6F, 0xB650, 0xC0B6, 0xCAC1, 0xB9DB, 0xB693, 0xA597, 0x9022, 0xD02C, 0x9FD7, 0xB20B, 0x8B9C, 0x8519, 0xD10B, 0x9FBE, 0x9F9D, 0x87BE, 0xB6CD, 0x8CF1, 0x93BF, 0xBDAE, 0xAA4D, 0x920E, 0x88D0, 0xD4E4, 0xBA16, 0xBCBC, 0xD115, 0x9474, 0xC3EC, 0xC3ED, 0x9160, 0x994B, 0xBF16, 0xB6AB, 0xB32B, 0x94FE, 0xCAC6, 0x880C, 0x8DF7, 0xA883, 0xCA9D, 0x8A38, 0x89E7, 0xB798, 0xB8C7, 0xCA4F, 0xADBB, 0xABEE, 0xB6AC, 0x929F, 0x8A39, 0xC93E, 0xB36A, 0xD34B, 0xB129, 0xC20A, 0xC25C, 0x9E23, 0x9D88, 0xC99E, 0x9373, 0x88D1, 0xB6AE, 0xC0B9, 0x9360, 0x8F0A, 0x92D0, 0xD322, 0xB2D6, 0xB072, 0xCD69, 0x8FD8, 0x9141, 0xC286, 0xCACC, 0xC5F9, 0xA2C0, 0xCA2B, 0x9C71, 0x847C, 0xC25D, 0x9CD6, 0x93F6, 0x9251, 0xC65B, 0x9FED, 0xB0D5, 0x8E42, 0x93CD, 0xAF7E, 0xD34C, 0xCCE8, 0x9BDB, 0x9B58, 0xCDC6, 0x8D75, 0xCF22, 0xB7C9, 0xC127, 0x8C30, 0x8A3D, 0xC7EB, 0xB3A4, 0xB8AD, 0x89D4, 0xAA4E, 0x88D2, 0xC7C3, 0xC5FC, 0xC128, 0xD3F8, 0xD003, 0xC41E, 0xAF83, 0x880D, 0x9655, 0xAE97, 0xAE98, 0xC59A, 0x8593, 0xC6C8, 0xA82C, 0xD38B, 0xB91E, 0xB56F, 0xBB80, 0x8651, 0xBB81, 0x94AF, 0xB0D6, 0xCAD1, 0xBB82, 0xCAA0, 0xD1F7, 0x8FA2, 0x980E, 0xAAE6, 0x8E53, 0xD3F9, 0x8872, 0xB570, 0x8680, 0xD127, 0x8CDE, 0xC16A, 0x8F0B, 0xD3FA, 0xD604, 0xCD40, 0xC93F, 0xBE36, 0xD0DE, 0x98BC, 0x8697, 0xC005, 0xB8FA, 0xCD6A, 0xCAD2, 0x93C0, 0xD606, 0x9625, 0xAF43, 0xBF18, 0xAE99, 0xC3F2, 0xB598, 0xCCA0, 0xC051, 0xB334, 0xB9DE, 0xA263, 0x85C5, 0xB074, 0x9B40, 0x98F9, 0xA57D, 0xC4C4, 0x9594, 0xC91B, 0x8559, 0x9260, 0xAD31, 0x9D40, 0x923F, 0x87E0, 0x9C7B, 0x991C, 0x9BD6, 0x9770, 0xB5E5, 0xBE95, 0x9EE1, 0x8CE4, 0xCADE, 0xBA07, 0xC625, 0xB920, 0xBFF2, 0xA297, 0xD25F, 0x94BB, 0xA4B6, 0xCA58, 0x8B3A, 0xA393, 0x9725, 0xA676, 0xCB91, 0xBA20, 0xAC50, 0xD3A9, 0xC6CB, 0xCD41, 0x849D, 0xA99B, 0xAD96, 0x9214, 0xAA52, 0x906E, 0x895A, 0x8AFA, 0xC7C6, 0x95FB, 0xD35F, 0xCA30, 0xB726, 0x9E25, 0xC3B2, 0xBB87, 0x8DFA, 0xA9F8, 0xBCC9, 0x9EE2, 0xD18C, 0x8903, 0xB41F, 0xA3A2, 0x8965, 0xAF44, 0xAF5B, 0x9FF4, 0xC267, + 0x998C, 0xA097, 0x8AEE, 0xD1DD, 0xD60C, 0x8BC2, 0xB475, 0xA9FA, 0xA11A, 0xBAD0, 0xBEFD, 0xB964, 0xBFF7, 0x8816, 0xAE17, 0xC4F6, 0x8736, 0xBFC5, 0xCDCB, 0xC37C, 0x8D3A, 0x919F, 0xB541, 0xC6B4, 0x973E, 0xA381, 0xC268, 0xA243, 0xCAED, 0x945D, 0xA754, 0xD5B4, 0xB43F, 0xA67E, 0xCCCA, 0x9BC4, 0xA064, 0xB3A6, 0xB7D6, 0xB071, 0xBBFD, 0x940C, 0xC2C1, 0xA64F, 0xAC9D, 0xB1A4, 0x85D8, 0xCD76, 0xBB8C, 0xC3B4, 0xC600, 0xC65C, 0xCDCC, 0x8F59, 0x8A3F, 0x8B9D, 0xD2B4, 0xC882, 0xA6EE, 0xA67F, 0xA4B7, 0xBB4F, 0x9DE7, 0xC65D, 0x945F, 0x9BE5, 0xA162, 0xC54E, 0xAFEF, 0x9E2D, 0x877D, 0x8C0B, 0x9313, 0x93B3, 0xC816, 0x84BB, 0x861B, 0xCDFF, 0xC5E5, 0x8688, 0x8B23, 0x89D6, 0xD247, 0x87E4, 0xA0D6, 0xC973, 0x8D78, 0xA6EF, 0xC086, 0xA4B8, 0x88D6, 0xD57D, 0x95BF, 0x96EA, 0x861C, 0xBE7F, 0xBA8C, 0xBA8D, 0xABEF, 0x8EBB, 0xBD2A, 0xA1DD, 0x8C64, 0xC63C, 0xB0A3, 0xBD9C, 0x99A6, 0xCAA9, 0xB24E, 0xBE40, 0x9515, 0xA067, 0x9FAE, 0xBC41, 0x8A0F, 0x9F64, 0x92D8, 0xD263, 0xA346, 0xA1AE, 0xD547, 0xA163, 0xB3A8, 0xAE80, 0xAA54, 0xD4A4, 0xC1F7, 0xAA8D, 0xBBAE, 0xA5FE, 0x9BC5, 0x9056, 0xD53B, 0x863E, 0xC269, 0xA0F5, 0xAE06, 0x889B, 0x9DEA, 0xD0A2, 0xC9D1, 0xD264, 0xB841, 0xB4C0, 0xB45D, 0xCC16, 0x8AA4, 0xB378, 0xC887, 0xB75C, 0xD355, 0x8C98, 0x9D8B, 0x9CEF, 0xC136, 0xCDD3, 0x87E8, 0xB789, 0xBE10, 0xC0DA, 0xB148, 0xC8C6, 0x9382, 0xBD9D, 0xC20F, 0x91D5, 0xC578, 0x8A46, 0xB99C, 0xA29A, 0x8F5F, 0xD613, 0x8937, 0xBEED, 0x8620, 0xC9F9, 0x9AD5, 0xC9AC, 0xD0E3, 0x8BC3, 0xC82A, 0xCD11, 0x9E2E, 0xC6BE, 0xD05C, 0x8CBB, 0x9486, 0x866F, 0xD2CA, 0xD56B, 0xACA1, 0x9C89, 0xCAAD, 0xC5A9, 0xC7AB, 0x8891, 0x90F5, 0x890B, 0xD199, 0xAFD3, 0xBF4B, 0xBF4C, 0x8621, 0xCFAA, 0xA922, 0x9F69, 0xC137, 0x9366, 0x89EE, 0xA420, 0xBBE9, 0xD2DB, 0xBC0D, 0xC3A9, 0x948C, 0xCED4, 0xB707, 0xA69E, 0xAF89, 0xCF5E, 0x9E90, 0xAACF, 0x85B4, 0x8F85, 0xBD78, 0x989F, 0x9F6E, 0xC2E3, 0xB88F, 0xB3AB, 0xA1ED, 0x88D8, 0x8C11, 0xB7CA, 0x8625, 0xC555, 0xCCD3, 0xC977, 0xBD5C, 0xBC99, 0xC948, 0x9259, 0x87E9, 0x9D51, 0x8DF6, 0xCFA0, 0xBD9F, 0x9685, 0x8798, 0x8BF5, 0xAFA2, 0x88B2, 0xA5CC, 0x8D63, 0xCCA5, + 0xCFDE, 0xD571, 0xB0AA, 0xBBC1, 0x8507, 0x8C37, 0xCDDC, 0xD0A4, 0xD5AA, 0xB8B2, 0x8C55, 0xA07A, 0x8B5F, 0xB83E, 0x9852, 0xD0F8, 0xB4C9, 0xC832, 0x8F6E, 0xC5B7, 0xA927, 0x8626, 0xB179, 0x9FDD, 0xA742, 0xA9B0, 0xAB11, 0xB34C, 0xC402, 0xBD5F, 0xCC62, 0x9082, 0xD44F, 0xC4E9, 0xB894, 0xB427, 0xA0A0, 0xBFC8, 0xD5F4, 0xB225, 0xC2F9, 0xA56E, 0x8A07, 0x9733, 0xA780, 0xB261, 0x8EFF, 0x8988, 0xC150, 0x9C39, 0x8803, 0x9B7A, 0x8C40, 0xBECB, 0x8E69, 0x9EFA, 0xA0DE, 0xB81F, 0x9369, 0xC491, 0xA127, 0x91ED, 0x9EC5, 0x9E48, 0xBF2F, 0xA80B, 0x8831, 0x96B6, 0xC403, 0xBC1B, 0xC492, 0x9E7C, 0xAD13, 0xCA06, 0xA00A, 0x9D8F, 0xB449, 0xB13E, 0x9391, 0xD39D, 0x8489, 0xB7BA, 0xCA85, 0xA254, 0xAF61, 0x898E, 0xCB3E, 0x8E80, 0xA052, 0xC714, 0xA3AA, 0x9E09, 0x8C19, 0x8E3A, 0x9F00, 0xB83F, 0xCFA2, 0x88C9, 0x87A3, 0x84D0, 0xB731, 0xBD01, 0x8BB0, 0x896A, 0xA4F2, 0xAEA5, 0xA00F, 0xB3B6, 0xAC00, 0xC27B, 0xAF35, 0xB50F, 0xAEA6, 0x89FB, 0xA7D4, 0xA5D2, 0xAA0B, 0xA3D5, 0x85FD, 0xCE4E, 0x8764, 0xCFAF, 0xD30A, 0xBBA3, 0xCCF3, 0x988A, 0xB4F3, 0x8A97, 0xA6C3, 0xBDFC, 0xC15D, 0xA915, 0x8BFB, 0x899A, 0xB66A, 0xBAA8, 0x9BA2, 0xA6DB, 0xAA80, 0xCFB1, 0xAFA4, 0xBDA4, 0xC8AD, 0xA5DD, 0xAE3A, 0x9211, 0xC280, 0xCF43, 0xCFA4, 0xCE8E, 0xC647, 0x8B73, 0xD13A, 0xC648, 0xC3EF, 0x9723, 0x9119, 0xA30B, 0x911A, 0xAC9A, 0xBF97, 0x89E8, 0x9213, 0x911B, 0x9215, 0x9FC1, 0xBF99, 0xBB83, 0xC880, 0xC883, 0xBA0A, 0xBA67, 0x8E89, 0xB3FE, 0x908A, 0x9622, 0x98B1, 0xB935, 0x908B, 0x8571, 0xA038, 0x9623, 0x9B10, 0xB747, 0xC0B7, 0xAE70, 0xB5E3, 0xA765, 0xCD77, 0x8517, 0x95F6, 0xA8CB, 0xC2B2, 0x980D, 0xA4E4, 0x961B, 0xBE5C, 0x96E5, 0xC60A, 0x87C1, 0xB27B, 0xA15A, 0x8F96, 0xD4E8, 0xB209, 0xC943, 0x9DA1, 0xBA74, 0x9CFD, 0xCB27, 0x9D13, 0x89C2, 0xA08A, 0xAB6C, 0xB660, 0xADE5, 0xC842, 0xAB60, 0x9521, 0xB661, 0x8901, 0xA08B, 0x8902, 0xCF9C, 0x96CB, 0xA093, 0xAB6F, 0xD390, 0xAB71, 0x9645, 0xC6BB, 0xACA2, 0xAC62, 0xB705, 0xCBBC, 0xC596, 0xA295, 0xA227, 0xAF5A, 0xCA53, 0xAC2E, 0xBA27, 0x96E8, 0xABF5, 0xD341, 0xA164, 0xCE72, 0xAD21, 0xA363, 0xACEE, 0x9487, 0xC597, 0xAC7E, 0x87BD, 0x904F, + 0xBD09, 0x9523, 0x93A0, 0x87C0, 0x9A06, 0x8B74, 0xA1CC, 0x9A07, 0xA3DA, 0xC9E4, 0xA5FD, 0xB016, 0x93F9, 0xAD01, 0x906D, 0xC44E, 0xA7BC, 0xB322, 0x9D9A, 0xA060, 0xBBD1, 0xABB9, 0xBF70, 0xB24F, 0x96A8, 0xD49A, 0xBBAF, 0xA068, 0xA755, 0xB4EB, 0x8FC3, 0xA83E, 0x9079, 0x9516, 0x9DEE, 0xCB9D, 0x8D2D, 0x8465, 0xA69F, 0x88D9, 0xAD33, 0xD49C, 0x8D64, 0xBB5D, 0x916C, 0xA00B, 0xA80C, 0xA80D, 0xAF36, 0xC30A, 0x90C3, 0x9CBD, 0x927B, 0x927C, 0x927D, 0x93B0, 0xA0EB, 0x8C02, 0xD1F5, 0x9374, 0xADBD, 0xD284, 0x93F7, 0x9375, 0xB1AC, 0x9379, 0xA26F, 0x9AD6, 0xA275, 0x94F5, 0x8F00, 0xB1CA, 0xB392, 0xC646, 0xA39E, 0xBF5E, 0x84DB, 0x8BCC, 0x9C11, 0x8E93, 0x981D, 0x9820, 0xCFE3, 0x8EAC, 0x8FBE, 0x8EAD, 0xB6A8, 0xB6A9, 0x8C48, 0x9326, 0xB452, 0xCAC3, 0x9C12, 0xA28D, 0xB3A3, 0x8D97, 0x8BD3, 0xC1C9, 0x9C16, 0x8E43, 0xC620, 0x9A4A, 0xC073, 0xA1CD, 0xA603, 0xCEE9, 0xA7BA, 0xA889, 0xD004, 0x9524, 0x8C59, 0x93FA, 0x8BCE, 0xB5CB, 0x8FC1, 0xB858, 0xAD02, 0xA82D, 0xD324, 0xB017, 0x8787, 0x9F55, 0x9F56, 0xB046, 0xA670, 0xB859, 0x8788, 0x89AD, 0xA048, 0x96BC, 0x95D0, 0x8ECE, 0x8C5B, 0xA3F7, 0xA370, 0x9181, 0x9240, 0xD2AB, 0xBAEF, 0xB61D, 0xB827, 0x8CE5, 0xA30C, 0x9F5A, 0x9785, 0x8CE6, 0x9786, 0xA270, 0x9182, 0x9CDF, 0xBE3E, 0xA04E, 0x9087, 0xAA8C, 0xD00C, 0xCE71, 0x8DB0, 0xC4F7, 0xA30D, 0xA49E, 0xB370, 0x895C, 0x8C5C, 0x96CE, 0x9E28, 0x8DB1, 0xA605, 0xBE07, 0x9314, 0xB1FC, 0x89B1, 0xB284, 0x8C5D, 0xD53C, 0x952F, 0xC066, 0x85C9, 0x9C21, 0x915A, 0xB4D2, 0xB88B, 0x90B1, 0x9E2F, 0x9CEA, 0x87F4, 0xC826, 0xA165, 0x9BEA, 0xB9A3, 0x9DEF, 0x9163, 0xBFA5, 0xC230, 0x96CF, 0x9488, 0xB9A1, 0x9E34, 0x9586, 0x8DD6, 0xA276, 0x8C5E, 0x8C2E, 0x89B8, 0xBFA6, 0xA9B1, 0xA614, 0xB0CA, 0xB86E, 0xB161, 0xA359, 0x9EF3, 0x96C5, 0xB408, 0xA1F4, 0x9A56, 0xD062, 0xD4CF, 0xA706, 0xA17D, 0xB0F0, 0xA89F, 0x9795, 0x9F01, 0x9796, 0x9E4C, 0x9E4D, 0xBD6A, 0x9BD1, 0x9D14, 0x9E57, 0xCB4B, 0x9E58, 0xD30B, 0x899B, 0xD5BD, 0xAD56, 0xA644, 0xD3DC, 0xA668, 0xC807, 0xB61C, 0x8591, 0x95F8, 0x9D3B, 0xC283, 0xAAE4, 0xA7BB, 0x9FEE, 0xA332, 0xC567, 0xD285, 0x906C, 0xD3FB, 0xAF84, 0x9F57, + 0xB599, 0xB8E7, 0xCAD3, 0xD3A8, 0xAD5C, 0xA671, 0x9FF0, 0xA562, 0xA563, 0xA1AC, 0xA35E, 0xC91C, 0xC03D, 0xC54B, 0xAD97, 0xA3C1, 0x9F5B, 0xA7BD, 0x98BD, 0xBA21, 0xA30E, 0x9FF6, 0x956C, 0x8817, 0xAD06, 0x8B54, 0xA535, 0xCCCB, 0xCCCC, 0xAC9E, 0xA30F, 0xC781, 0xA1AF, 0xB4D3, 0xA9A0, 0x887A, 0xAC19, 0x896D, 0xA5A3, 0xA288, 0xACA3, 0x907C, 0xC6D8, 0xC6D9, 0xA28F, 0xC291, 0xCB07, 0xC784, 0xC1E8, 0xB9A4, 0xA56B, 0xADC8, 0xA9B2, 0xB17A, 0xBA45, 0x9C33, 0xB494, 0x9E92, 0x9EF4, 0xB621, 0xC4EA, 0xCB33, 0xA1F5, 0x926C, 0xA19A, 0xBF30, 0xA17E, 0x8E3B, 0xC585, 0xAAEE, 0xC789, 0xC78A, 0xAA1D, 0xA6B6, 0x8A56, 0xB66B, 0xB623, 0x85C3, 0xB8DF, 0xCF20, 0xA0AA, 0x85EC, 0x9624, 0xC282, 0xCF21, 0xAB48, 0x8692, 0x94D3, 0x94D4, 0x85C4, 0x8CF2, 0xCAC7, 0xC649, 0xB08F, 0xA0EE, 0xBDC6, 0x9595, 0xB21E, 0x91D0, 0xB04F, 0x9423, 0x9604, 0x8DD7, 0xA0DC, 0x960A, 0x867C, 0x9A49, 0x860F, 0xAE55, 0x8B25, 0x92BA, 0xA0CE, 0xCA50, 0xCF78, 0x9E9C, 0xA2C1, 0x9E9D, 0xA3C0, 0x99AF, 0xC3B1, 0xB571, 0x927E, 0x9771, 0xB45B, 0x88E3, 0xA3C4, 0x9300, 0x99BB, 0xCDD4, 0x977C, 0xA427, 0x9B71, 0x8E35, 0xA431, 0xA702, 0xA707, 0xBC38, 0x90C4, 0xA0E7, 0xB5B1, 0xC371, 0xB127, 0xB56D, 0xCA2D, 0xA2DB, 0xC884, 0x8723, 0xAEB2, 0xB57F, 0xB9D8, 0xC7C0, 0xB32A, 0xAED7, 0xB7A0, 0xD5A3, 0xB976, 0xC25B, 0x9B55, 0x8592, 0xBA19, 0xC372, 0xC0A2, 0x9A36, 0xC568, 0xC0A3, 0x8604, 0xD5A5, 0xD4A1, 0xC56B, 0x8E26, 0xAAE9, 0xAE18, 0x8E28, 0x9C8A, 0x8825, 0xBAF9, 0x8866, 0x9704, 0x872C, 0x8867, 0xD0DD, 0xA262, 0xA951, 0xCD29, 0xA97D, 0xC2BA, 0x96D2, 0xC20D, 0xC5A5, 0x9F4F, 0x9F50, 0xC168, 0xC93D, 0xB4FA, 0xD234, 0xAB61, 0xCC03, 0xC0D7, 0xB8E8, 0x9C78, 0xB628, 0xAA3D, 0x8B3B, 0xA1A2, 0xC5A1, 0xC6CC, 0x9FD8, 0xB629, 0xA41F, 0x9C7E, 0x91D6, 0xB4C1, 0xC2F1, 0xB7C4, 0x8A01, 0xC126, 0x91BE, 0xBED6, 0xA669, 0xD155, 0x9835, 0xA66A, 0xC7FE, 0xC7DA, 0xC8B8, 0xB900, 0x8F3A, 0xD07A, 0xB030, 0x8458, 0xB458, 0xC7EE, 0xD2AC, 0x8904, 0xAB30, 0xBE0E, 0xA604, 0xB904, 0x99A1, 0xBEDD, 0xD5CB, 0x8DB2, 0x9315, 0xCE98, 0x890C, 0xCE9E, 0xC4AB, 0xC888, 0xA6A0, 0xA1EE, 0xC3E3, 0x8F86, 0x8BD6, 0xA0D8, 0x9FDE, + 0x84E2, 0x9782, 0xC8D7, 0xBB5E, 0xA6AF, 0x8A08, 0xA4EF, 0xA6B0, 0xC869, 0xC8A6, 0xCEC7, 0xBB47, 0x95F7, 0xA7DE, 0xB70A, 0xB5C9, 0xB5CA, 0xA343, 0xA5C6, 0x90D9, 0xC472, 0xD436, 0xB7C1, 0x88AA, 0x88AB, 0x88AC, 0x88AF, 0x8486, 0x8E15, 0xCD3D, 0x892E, 0x9C70, 0xCD26, 0xBB00, 0x929E, 0xBA69, 0x96E2, 0x852F, 0x9248, 0xB787, 0xBA1D, 0xBA86, 0xD4B4, 0xB5C0, 0xBA72, 0x8737, 0xC6CE, 0x9D78, 0xB01B, 0xBBE7, 0x9C7F, 0xC16F, 0xBBE8, 0x9008, 0xB77D, 0x8D27, 0xA35D, 0x9677, 0xA150, 0xA884, 0x96CC, 0x8EAE, 0xA35F, 0xD283, 0x9F15, 0xD139, 0x851B, 0x9023, 0xA304, 0xBCF3, 0x8B4D, 0xBA03, 0xCD3E, 0xB535, 0xB1E6, 0xC9EB, 0x9894, 0xBB4A, 0xBD58, 0x8B37, 0xA59A, 0x8FBF, 0x9C13, 0x910D, 0x993A, 0xACCD, 0xCDF0, 0xAB28, 0x8AF7, 0x95BD, 0xC6FE, 0xC960, 0xD522, 0x98BB, 0x9C72, 0x8FD9, 0x8D9A, 0xBF17, 0xAD1B, 0x999F, 0xA66D, 0xBF93, 0xC4E0, 0xD055, 0xC3DE, 0xC9E2, 0xA9F6, 0x8452, 0xAAD8, 0xAFD1, 0x9BCE, 0xCA2E, 0xA228, 0x8BC0, 0xA819, 0xBFD2, 0xCBBE, 0x930B, 0x8681, 0xB4B0, 0xB4B1, 0x9F9E, 0x8873, 0x93C6, 0x851F, 0x912D, 0x9327, 0x919C, 0x981B, 0xBEDA, 0xA333, 0xBB26, 0xB2DA, 0x994F, 0xD237, 0xCBEC, 0xC23F, 0xC240, 0x8A32, 0xADE7, 0xC775, 0xC2B7, 0x8C60, 0x9086, 0xC1CA, 0x999C, 0x999D, 0xC241, 0x956A, 0xC7DB, 0xA242, 0xA9F7, 0x91C4, 0x9593, 0xAB8C, 0x8DF1, 0xB2DB, 0x8ABF, 0xC242, 0x956B, 0x93CF, 0x9F16, 0xCF23, 0x8B38, 0xB979, 0xAE65, 0xBFD3, 0x9456, 0xCAD4, 0x8DF2, 0xAFD2, 0xA672, 0x8563, 0xCE91, 0x97BA, 0xC1CB, 0xB3BE, 0xC227, 0x91C8, 0xB9B1, 0xA1A3, 0xB08B, 0xC1CE, 0xAE69, 0xAAAE, 0xA885, 0xB653, 0xCCEB, 0x8F3E, 0xD360, 0xBA22, 0xD38C, 0xBED2, 0xC377, 0xCADF, 0xB2F8, 0xB1AD, 0xD529, 0x96CD, 0x8CB7, 0xC16B, 0xC6B8, 0x98B3, 0xAE3E, 0xC3A5, 0xB05F, 0xCAE0, 0xC4F4, 0xB921, 0x99B1, 0xAD36, 0x8DCD, 0xB5CC, 0xA13A, 0x981E, 0xCF7A, 0xBFF3, 0x9157, 0xB204, 0xB047, 0x8789, 0x9400, 0xC906, 0x98BE, 0xD057, 0x98BF, 0x97F8, 0xA0D1, 0xCCC7, 0x9478, 0x8DBF, 0xD38D, 0xC053, 0xA25F, 0x9656, 0xA260, 0xD618, 0x8875, 0xA8DF, 0x9050, 0xAF2C, 0xBCC0, 0xBB4D, 0xC41F, 0x9BE4, 0xB2FC, 0x9241, 0x91CB, 0x9729, 0xD087, 0xC37D, 0xCA60, 0xA7B6, 0xD4E9, 0xACCE, + 0xAC2C, 0xD293, 0xC9A6, 0x9C1F, 0xD391, 0xA8DC, 0xBAD1, 0xCFA9, 0xC54C, 0xA2FF, 0x9B19, 0xA394, 0x9A70, 0xBDC8, 0xC424, 0x91CC, 0xC701, 0xC65E, 0x97BB, 0xC824, 0xA57E, 0xCA32, 0x845A, 0xB19B, 0xB951, 0xBF1C, 0x993D, 0xC64E, 0x9158, 0xC03E, 0x97F7, 0xCF90, 0xCD45, 0x901D, 0xAFF9, 0xC4CF, 0x8459, 0x95C9, 0xA3C5, 0xC800, 0x8DC0, 0xC4F8, 0x86A2, 0x9B5B, 0xAEC3, 0x9A37, 0xC627, 0xA3A4, 0x9172, 0xB20A, 0x9CE1, 0xAF5C, 0xAD94, 0xCC9D, 0x9898, 0xCE99, 0xA91B, 0xB205, 0xAB34, 0x9582, 0xAFB9, 0x8AFB, 0xB8EB, 0xA651, 0xADE3, 0xD5A6, 0x98CB, 0xA374, 0xC54F, 0xC47D, 0xA567, 0xB1F3, 0xD15C, 0xD05B, 0xA770, 0x8524, 0xACCF, 0xAA12, 0xBC42, 0x941C, 0x8869, 0x9810, 0x9922, 0x95E3, 0xBB32, 0x95BA, 0xCD4E, 0xC8C0, 0x965D, 0x965E, 0x8568, 0x9822, 0xBC96, 0x8C86, 0xCAF9, 0x845B, 0x9D66, 0xBF63, 0xC425, 0xC087, 0xA602, 0xC2C7, 0xBD76, 0xD610, 0xB546, 0x8A41, 0xC245, 0xCFF2, 0xC801, 0x9088, 0xB2DF, 0x8F22, 0xB4B4, 0xAACE, 0xAB85, 0x9615, 0xBE05, 0xA342, 0xA568, 0xA766, 0xBCAA, 0xCFF3, 0x9AAF, 0xA55E, 0xB829, 0x9C22, 0xD545, 0xC1FA, 0x93AE, 0xCBCC, 0x99F9, 0xB303, 0xBA75, 0xC109, 0xBAF0, 0x8A11, 0x921D, 0xA695, 0xB3FB, 0x84BC, 0xD00D, 0xCC9E, 0x8FAB, 0xCD5F, 0xBE80, 0xA4D1, 0xB842, 0xC2D4, 0xC035, 0x99BC, 0x8462, 0xD130, 0xAF75, 0xA329, 0xD4BE, 0xD4BF, 0xB8AF, 0x8F60, 0x9935, 0xA7E2, 0x8454, 0xC504, 0xC4AC, 0xBFD6, 0xC26B, 0xC1DA, 0x8D7D, 0x8FFA, 0x9686, 0xB2E2, 0xB2E3, 0xBDCD, 0x8E5B, 0x8E5C, 0xC046, 0xD530, 0x868D, 0x8D7E, 0x8C27, 0x98D1, 0xC802, 0xB2E4, 0xD160, 0x92E4, 0xA767, 0xC430, 0xB10B, 0xB843, 0xA492, 0xD00E, 0xCC1A, 0x96D0, 0xAFE1, 0xD002, 0xB7FE, 0xD44B, 0xAEFB, 0x97BE, 0xAA71, 0xAE79, 0x8F0F, 0xB5EE, 0xBD1B, 0x87FB, 0x903D, 0xA534, 0xC554, 0x95F1, 0xBD79, 0x8B5C, 0xBE12, 0x84B8, 0xA0B5, 0x8E62, 0xA261, 0xCCC1, 0xC175, 0xAE1E, 0xB890, 0xCE13, 0xD165, 0xA49B, 0x9F3E, 0x998E, 0x9838, 0x8FFD, 0xD36F, 0x8969, 0xC05F, 0xAFA7, 0xCE07, 0xCBA3, 0xCFAB, 0xC965, 0xC1FF, 0xACA4, 0x99D4, 0xCF4C, 0x8C3F, 0x9B6A, 0x9AB8, 0x9AB9, 0xC357, 0x98B6, 0x9C2A, 0xA429, 0xD342, 0xC10D, 0xB846, 0xC6E0, 0x9ADA, 0x9167, 0xAEFF, 0xC707, 0xA773, + 0xCE14, 0xB7E3, 0x8B04, 0xB425, 0xC8CB, 0x8E31, 0xB08E, 0x88B0, 0xA610, 0xCC9F, 0xD05D, 0xC0DE, 0xACB3, 0xCC5E, 0xB083, 0xB0D3, 0xA409, 0x860E, 0xCE15, 0x95F2, 0xA924, 0xA387, 0xCFF6, 0x9BF2, 0xBE1D, 0xC97D, 0x9902, 0x8457, 0xC6E7, 0xB3CD, 0xB804, 0xCCA6, 0xBC11, 0x9980, 0xC57E, 0x8481, 0xBB3C, 0xAAD9, 0x8938, 0x9806, 0xA31A, 0x8DC4, 0xB7DB, 0x8A5D, 0xB74C, 0xBBD4, 0xC048, 0x9C34, 0xB03D, 0xC234, 0xB3AF, 0xBA46, 0x95A4, 0xD4F8, 0x9F3F, 0xA58E, 0xC1E3, 0xC058, 0xBB9B, 0x8B06, 0x9884, 0xBC9E, 0x9D92, 0x97F9, 0xBCB0, 0xB495, 0xAF01, 0x98B8, 0x8CF0, 0xB7B8, 0xAE76, 0x95F3, 0xADF6, 0x8F82, 0x8470, 0xB3C9, 0xBF12, 0x86C2, 0x84E4, 0x84E5, 0xA6FC, 0xD5CD, 0xD184, 0xAD77, 0xBB3F, 0xBBEA, 0xBD51, 0x8F15, 0xB262, 0x9F23, 0x8B7C, 0x9EC6, 0xA289, 0xBD60, 0xB870, 0x88EE, 0x9D59, 0x8468, 0xC559, 0xB17B, 0xA929, 0x94B4, 0x9696, 0xC514, 0x99C2, 0x9B7B, 0x97C7, 0xAFD5, 0xC404, 0xD015, 0x89F5, 0xC6A2, 0xB1E0, 0x8EE8, 0xAADA, 0xAAD1, 0x99DF, 0xA5F4, 0x90B3, 0x94B0, 0xBD69, 0xC9E7, 0x865A, 0xCC26, 0xB7B3, 0x9F24, 0xAC76, 0xC55A, 0x9A3E, 0xAAE1, 0xB65C, 0x8C28, 0xB09C, 0xA56F, 0xC55D, 0x9C3D, 0xD3F1, 0x8A2A, 0xA432, 0xD5D2, 0xC519, 0xBB65, 0x9888, 0xAAAD, 0xA787, 0xB42A, 0xC303, 0x8C1A, 0xBD21, 0x8E6C, 0x9916, 0xC7D5, 0x91BB, 0xD5F5, 0x926D, 0x8B0B, 0x9B33, 0x88C2, 0x8C54, 0x8D42, 0x8E6A, 0xCE3B, 0xA482, 0x8922, 0x9F28, 0xC9D4, 0xC304, 0xB310, 0x9886, 0xA708, 0xC6A6, 0x8EF3, 0x9B34, 0xCBDF, 0xB218, 0xA1C4, 0xB499, 0xC7B3, 0xAF05, 0xA94D, 0xBB66, 0xC8A1, 0xCC31, 0x8DC6, 0xD0B4, 0xAFB8, 0xD3A0, 0xA010, 0xAF63, 0x9B87, 0xC5BC, 0xB312, 0x91F6, 0xCFFA, 0xCA42, 0xBA57, 0x9F2B, 0xCEDD, 0x8474, 0xCCB0, 0xA205, 0xA3AD, 0xCDE7, 0xB084, 0x8ED8, 0x94B5, 0xC5EF, 0x9136, 0x8E81, 0xC5F0, 0xB7B4, 0xB0F4, 0xB132, 0xCBB7, 0xD5D3, 0xAF37, 0x8F33, 0xA52B, 0xBCE1, 0x9BF5, 0xB733, 0x987D, 0xC3E7, 0xCA16, 0x915F, 0xB140, 0xD378, 0x9D1B, 0xA014, 0x988C, 0xBE53, 0x89FC, 0xC78D, 0xAB87, 0x888A, 0xBE55, 0xA94F, 0x9B98, 0x8843, 0xCCF5, 0xAF12, 0xCBE2, 0x9A24, 0xABD9, 0x9948, 0xD172, 0xA632, 0xA8AD, 0x980A, 0xAE2F, 0xC52B, 0xAD3E, 0xC8EA, 0xA6CA, 0xA964, + 0xA8F5, 0xAD51, 0x8E77, 0x8A98, 0xB197, 0xB134, 0xC4D8, 0x9C01, 0xAB89, 0xC3A1, 0x9180, 0xA38D, 0xC86D, 0x899F, 0xCC3F, 0xB675, 0x9020, 0xA49D, 0xBCE3, 0xC530, 0xA214, 0x8CB3, 0x9A7B, 0x9C07, 0xD459, 0xAF1B, 0xC531, 0x8890, 0xA63D, 0x89C8, 0x8971, 0xA6E1, 0xCB80, 0xAA6F, 0xAE30, 0xCFC3, 0xBBFC, 0x9937, 0xD03F, 0x9DE0, 0xCF8B, 0xD3F6, 0xA509, 0xAF21, 0xAE2D, 0xB652, 0xA8DB, 0xC0F9, 0x9B3D, 0xCB8D, 0xB536, 0xBB7B, 0xAF28, 0x9DE4, 0x9B3E, 0xC5FD, 0xCB8E, 0xAE12, 0xBFA2, 0xBFA3, 0x9142, 0xA2C3, 0xCE6F, 0xA094, 0xB147, 0xCF24, 0x8CF3, 0x99CA, 0x9B3F, 0xCE92, 0x919D, 0x97CE, 0xA473, 0x8C49, 0xBF0E, 0xBF6E, 0xC0FD, 0xAA4F, 0x97CF, 0xB646, 0xB6D4, 0xA82F, 0x96A5, 0x97D0, 0xBCED, 0x97D1, 0xBF6F, 0xCD46, 0x97D2, 0xCBC4, 0x9BC6, 0xB231, 0xCDD0, 0x9823, 0xCE9A, 0xAA56, 0xB5DD, 0xCDD5, 0xB4C3, 0x97D3, 0x8C34, 0xC10E, 0xCEA0, 0xB5DE, 0xA378, 0xB236, 0xCEA7, 0xCEA8, 0xC820, 0xBFB3, 0xBF84, 0xBF85, 0xBFA7, 0xAA47, 0x9B7F, 0xCB4C, 0xCEB9, 0xAA2B, 0xAA36, 0xBF91, 0xC808, 0xBF92, 0xBEFC, 0xB99E, 0xB21D, 0xA998, 0xA39F, 0xA0EC, 0xCF9D, 0xC0FC, 0x9579, 0xCDF1, 0xC221, 0x9743, 0xB12A, 0xCA51, 0x8F4F, 0xB32D, 0xB32E, 0xD1DA, 0xD4B0, 0x8E94, 0xB321, 0xC3DF, 0xB857, 0xA3D8, 0x8A02, 0xB275, 0xAEF4, 0xAD5D, 0x9C17, 0x9D60, 0xD288, 0xD289, 0x8584, 0xC780, 0xCAD5, 0xB4A4, 0x933B, 0xA229, 0xA334, 0xBFEA, 0x92BD, 0x9361, 0x864A, 0xBD18, 0xA296, 0x9A6F, 0xD607, 0xA335, 0x8698, 0xA049, 0x8F51, 0xA01E, 0x9CD8, 0xA3A0, 0x8B1B, 0xA01F, 0x9D97, 0xBD28, 0xA673, 0x8546, 0xC25E, 0x933C, 0xD47D, 0xB1D4, 0xB015, 0xBD75, 0xA444, 0xB576, 0xBD4B, 0xD260, 0xC008, 0x94EC, 0xB1AE, 0x8FA5, 0x96D3, 0xAE7C, 0xBCF6, 0xB0DA, 0xA08C, 0xC940, 0x93C1, 0x84DC, 0xA99C, 0xB51B, 0xADC0, 0xA2DC, 0x963E, 0xC75D, 0x8532, 0x8F3F, 0x8A4B, 0xA830, 0xD3FF, 0x9479, 0x99B2, 0xD2AD, 0x8C63, 0xA48F, 0xA912, 0xA913, 0xA954, 0x84DD, 0x8DFB, 0xB048, 0xACE3, 0xC628, 0x906F, 0x9CE2, 0x98FA, 0xAA10, 0x8CC0, 0x8B3D, 0xA5C9, 0x94BF, 0xCB92, 0x99A2, 0x910E, 0xD13D, 0x940D, 0x972A, 0xC96F, 0x9173, 0x9187, 0x9774, 0x8944, 0xC921, 0xCBC2, 0x9253, 0x9642, 0xCE95, 0x8FF1, 0xC56D, 0xA327, + 0xB8BF, 0xBA6E, 0x91CD, 0x87E2, 0x8FA7, 0x9959, 0xC812, 0xA395, 0x8DD1, 0xA264, 0x8E97, 0xA271, 0x9870, 0xAE51, 0x84BA, 0xC60D, 0xC47E, 0xCED2, 0x85A2, 0x93C3, 0x8549, 0xCAFA, 0xCC07, 0x9842, 0xC6D2, 0x8C65, 0xB487, 0x95E4, 0x845C, 0x865E, 0x92CD, 0xB62A, 0xCCCE, 0xA246, 0x9D48, 0x8F5B, 0xAADB, 0xA55A, 0xA1A5, 0x8AC5, 0xB861, 0x9FCA, 0xD15D, 0xA7C4, 0xA7B9, 0xB232, 0x8ACC, 0x9A2E, 0x887B, 0xB9ED, 0xC782, 0x97BC, 0xA08E, 0xC9E5, 0xAEDB, 0x8F10, 0xCE08, 0x8880, 0xC818, 0xB5EF, 0xBC5F, 0xB10C, 0xB4C4, 0xC08C, 0xA16A, 0xAA6A, 0xD203, 0xA347, 0x8B90, 0x9058, 0x8E0A, 0xBD5A, 0x84BD, 0x889C, 0x8C0D, 0x865F, 0xA29B, 0xD268, 0x9176, 0xCB08, 0xD269, 0xCB09, 0xB069, 0x9C28, 0xD49B, 0xB28D, 0xB7F5, 0xA16B, 0xAE85, 0xA376, 0xA316, 0xBD77, 0xA447, 0xAEB5, 0x9DA3, 0x910F, 0x9FDB, 0x9531, 0xCE09, 0x91D7, 0xB0A5, 0x96AA, 0xBF9B, 0xA5FF, 0x92C4, 0xC7F3, 0xB3AA, 0xA448, 0x84CC, 0xB932, 0x918B, 0xAE57, 0xBF66, 0x8AD5, 0xCBA4, 0x9A8C, 0x86B6, 0xA73D, 0x97BF, 0x8FFE, 0xD44C, 0x99A8, 0x85DB, 0x85DC, 0xCD8B, 0x8F13, 0xAB56, 0x9F40, 0xB755, 0xC9FD, 0x95F0, 0xA291, 0xD54A, 0xCD8C, 0x9ADB, 0x91DE, 0xC978, 0xC8CC, 0x85F4, 0x8CC5, 0xAB9A, 0x8A05, 0x90DC, 0xC014, 0xB207, 0x93A5, 0xD357, 0x9FB2, 0x9FCF, 0x9936, 0x9536, 0x8C77, 0xA29D, 0xB1BF, 0xA5CA, 0xC641, 0x9AD2, 0xA5F6, 0x90FD, 0xC069, 0xC708, 0xC386, 0x9C96, 0xA3A7, 0xCC63, 0xBCC3, 0x8ADD, 0xCCD9, 0xA279, 0xBC12, 0xBC13, 0xB9F3, 0xAC73, 0xBCCA, 0xC1EA, 0x8ADE, 0xBF7D, 0xBD7C, 0xB632, 0xD344, 0xA6A7, 0xB0AB, 0x85B9, 0xB7B0, 0xCFD9, 0x9110, 0xBE70, 0xC26F, 0xD21F, 0xC785, 0x95A5, 0xD1E7, 0x8482, 0x9605, 0xC860, 0xA29F, 0xBE71, 0xCEA9, 0xC19C, 0xC5B8, 0xA8CE, 0x97FF, 0xA554, 0x89F6, 0xB0AC, 0x8668, 0x8A7A, 0xA9BB, 0xA986, 0xAFC4, 0xB3B2, 0xABA8, 0xAD78, 0xBFA8, 0xBB11, 0xBAB1, 0xA93D, 0x8B30, 0xAB14, 0x8756, 0xA07C, 0x8918, 0xBAE2, 0xD2EF, 0xD120, 0xA2A9, 0xCCA9, 0x8FB5, 0x8A87, 0xD271, 0x9D04, 0x97C5, 0xB3F5, 0xA007, 0x8F74, 0xB8B3, 0xADCB, 0x8D66, 0xC8D8, 0xBCCB, 0xD042, 0xB380, 0xB3E2, 0xA75D, 0xC17A, 0xD487, 0xB40C, 0xD044, 0xC6A7, 0xB896, 0xB897, 0x8540, 0xB227, 0xA3AB, 0x9066, + 0x926E, 0xB63A, 0xAD7F, 0x9131, 0x9132, 0x8D91, 0x8F75, 0xB9A9, 0x9192, 0x9195, 0xBD35, 0x8F03, 0xADA8, 0x934C, 0x9AE7, 0xBD36, 0x8DC7, 0xCA02, 0xD422, 0x9E4E, 0x850F, 0xB3E8, 0x9C48, 0xB410, 0xA32C, 0xCB4D, 0xB11C, 0x86E7, 0x8FB6, 0x9E7F, 0xC9E9, 0xCCB1, 0x883C, 0xBD3B, 0xA51B, 0xA182, 0x9A71, 0x8EA4, 0xB674, 0xB3BB, 0xC78E, 0xA52C, 0xC367, 0x990A, 0x848A, 0xC7E7, 0x8EC9, 0x988D, 0xB757, 0xA015, 0xA5D3, 0xA3EC, 0xA965, 0xC86E, 0xBD43, 0xC161, 0x9A72, 0xA917, 0xA918, 0xB77E, 0xA6CB, 0xA801, 0xB676, 0x89A0, 0xC796, 0xC873, 0xA5BE, 0x8552, 0xC070, 0xBA11, 0xB694, 0xB7C8, 0xD46A, 0xD46B, 0xB97A, 0xCA2F, 0xAAE7, 0xA2FE, 0xD406, 0xD46E, 0x99D0, 0x99D1, 0xA468, 0xCA38, 0x99D5, 0xC6E1, 0xA46E, 0xBA7B, 0xAB44, 0x9133, 0xBA7E, 0xCA43, 0xD281, 0x9678, 0x8C03, 0x9E9E, 0x93A1, 0x8615, 0xD095, 0x8738, 0xBC3E, 0xB645, 0xA831, 0x947D, 0x8DB3, 0xC3E1, 0xC659, 0xC5CD, 0xAE4C, 0xC3EA, 0xA41A, 0xC2B1, 0xC062, 0xCECC, 0xAB62, 0xBBFF, 0x9155, 0x9156, 0xC9EF, 0xB4D0, 0xAFBC, 0x9646, 0x9647, 0xB305, 0xABFB, 0xAC27, 0xCBD9, 0x9BE0, 0x8A88, 0x8DED, 0xD02D, 0xBE5B, 0xBD08, 0x93CC, 0x96E1, 0xC95F, 0xC905, 0x9869, 0x9559, 0xB9AF, 0xBDAF, 0xBD0A, 0xBF51, 0xC87C, 0x867E, 0xCA52, 0xA38E, 0x9D3C, 0x9161, 0x9C0E, 0xA3D4, 0xCF45, 0x9D3D, 0x8520, 0x9207, 0xA6F1, 0x9AAB, 0x8F0C, 0xC881, 0xB056, 0xA1AB, 0xB27C, 0xAE09, 0x93B1, 0xC56E, 0x9363, 0x8F97, 0xC941, 0xA403, 0xD59C, 0x9AAD, 0xB2FD, 0xA269, 0xD088, 0x863B, 0xCAEE, 0x9E8E, 0xBDE1, 0xCFD6, 0x8647, 0xC2C8, 0x9B06, 0x9302, 0x8FC4, 0xC7CF, 0x8653, 0x8FAF, 0x8508, 0xB8F1, 0xC1E9, 0xB1F8, 0x8509, 0xC2A0, 0x850D, 0x9E93, 0xA703, 0x916B, 0xCF19, 0x9E94, 0xBA55, 0x936B, 0x9BF6, 0x86F7, 0xAA2C, 0x8A48, 0xAF8B, 0xAF7D, 0x902E, 0xADFF, 0xB32F, 0x9D94, 0x9F94, 0xA0C3, 0xAF96, 0x8957, 0x9892, 0xC3F0, 0x92A5, 0x9CC0, 0xBB35, 0xB725, 0x92E1, 0xC0D0, 0x994D, 0xD45B, 0x9475, 0xAAAF, 0x8E25, 0xB6B2, 0x93D0, 0xA05F, 0xC846, 0x97F3, 0xC1D7, 0xD325, 0xAFDD, 0x90E5, 0x9CD9, 0x986B, 0xD34D, 0xC961, 0x9FF1, 0xCF25, 0xACC6, 0x93C7, 0x8AF8, 0xA1D0, 0xD45D, 0xAF4A, 0xC8B9, 0xADE8, 0xC5DD, 0x933D, 0x8682, 0xCD6B, + 0xC028, 0x9376, 0xC0A4, 0x92CA, 0xC25F, 0xCDF5, 0x9744, 0x90E8, 0x8533, 0xAE7A, 0xD37E, 0xD4B5, 0xD129, 0x8DCE, 0xAE03, 0xCECE, 0xBF56, 0xC421, 0xCAE1, 0x9197, 0xABC7, 0xAD5E, 0xB24B, 0x869C, 0xB922, 0xB459, 0x9198, 0x98C0, 0xC6B9, 0x9252, 0xD1F8, 0xACE4, 0x8595, 0xADAC, 0x93D1, 0xA832, 0xD523, 0xD524, 0xBA08, 0xB662, 0xB85D, 0xC907, 0xAAF5, 0x9F95, 0x9657, 0xBB84, 0xC638, 0xC12D, 0xD4EA, 0xA153, 0xB85E, 0xB188, 0xB6BA, 0xC970, 0x9070, 0x9E73, 0xBA8A, 0x9C80, 0x94C0, 0xC4E1, 0x9A38, 0xA193, 0x9EB8, 0x9643, 0xA57F, 0x9D9F, 0x9DA0, 0xCA61, 0xAEDA, 0xD262, 0xD1C1, 0x9C23, 0xC479, 0x9926, 0x972B, 0xA22B, 0xA38F, 0xC8BC, 0xAD32, 0xA7BE, 0xB076, 0x91CE, 0xCD47, 0xC84F, 0x895D, 0xB927, 0xCB93, 0xB9E6, 0x9775, 0xB5E7, 0xD4EB, 0xBBAC, 0xC0D8, 0x995A, 0xC03F, 0xA921, 0xC813, 0xB687, 0x9EB9, 0xA738, 0xB1A0, 0xC47F, 0xB8EC, 0xA652, 0x8AC6, 0xC5A6, 0xAB35, 0x93DB, 0xBC97, 0xADB3, 0xC131, 0xA313, 0x8CA3, 0x8CA4, 0xBEFE, 0xAEDD, 0xC62C, 0xAE1A, 0xCD7D, 0xADEB, 0xB1D7, 0xAE6A, 0xA194, 0xB92D, 0xD2BE, 0x9824, 0x8F5C, 0xD460, 0x91A0, 0xB1B8, 0xBFCC, 0xC480, 0xACA0, 0xC246, 0xC850, 0xC26C, 0xC2C9, 0xC854, 0xCD7E, 0xBB8D, 0xCD7F, 0xC043, 0xA689, 0xC429, 0xA0FE, 0xB5C2, 0xD47F, 0xB254, 0xC42A, 0xD4C0, 0x9059, 0x89D7, 0xA9A4, 0x846F, 0x9199, 0x91B9, 0xA923, 0xAC8A, 0x8D17, 0xB206, 0xA0FF, 0xB1DF, 0x889D, 0xA846, 0xC08D, 0x8777, 0xC505, 0xBAAE, 0xB2E5, 0x9B24, 0x9489, 0xC207, 0xC208, 0xBD2D, 0x92E5, 0x92E6, 0x9F6A, 0xBE5D, 0xAE86, 0xB5F0, 0xA06E, 0x9BAF, 0xA02B, 0xB344, 0x8FAC, 0xC63E, 0x9A15, 0xC067, 0xA4BE, 0x86AE, 0xCBA5, 0xD369, 0xAE5E, 0x948A, 0xA06F, 0xAA57, 0x84CD, 0xA4E8, 0xA449, 0xCBCD, 0xC819, 0xA100, 0xA696, 0x8F99, 0xC42B, 0x9A2F, 0x9A50, 0xCC1B, 0x897E, 0xB956, 0xBEEE, 0x8E9B, 0xC9AD, 0xC29A, 0xAE2C, 0xB78C, 0x9D7E, 0xBF4D, 0xC6E2, 0xCE16, 0xC0DF, 0x8F69, 0xB70E, 0xABBD, 0x8E32, 0xB75E, 0xB47A, 0x9B25, 0xC211, 0xB37C, 0x8C78, 0xACB5, 0x948D, 0x9F97, 0x90F6, 0xCA76, 0xD358, 0xAB9B, 0x9ADC, 0xAC8C, 0x84A4, 0xCC1C, 0xC709, 0x9F41, 0xC0E0, 0xABCE, 0xCED5, 0xD20B, 0xB521, 0xBE13, 0xC5B0, 0xC02B, 0xA73E, 0xAB77, 0xB666, + 0xBB54, 0xB149, 0xC176, 0xC047, 0x8D3C, 0x99D6, 0x8500, 0x9F6F, 0x85DD, 0xC699, 0xBF4E, 0x9753, 0xD59E, 0xC97E, 0xB139, 0xC33A, 0xCEAA, 0xCC98, 0xB6E4, 0xB74D, 0x8B07, 0xA894, 0xABC0, 0xB007, 0x8502, 0xAAB0, 0x9649, 0xA42A, 0xB496, 0x9D8C, 0xB7F4, 0xD1D1, 0xCEAB, 0x9F42, 0xB6E8, 0xAD26, 0xCC23, 0x9C97, 0xBC14, 0xAEE8, 0xC436, 0xBDB6, 0xB035, 0xA53C, 0xAE59, 0x85D3, 0x8483, 0xB13A, 0xB192, 0xCB34, 0xB17C, 0xCE2F, 0xA5AD, 0xC72E, 0xAB15, 0xCA3D, 0xD0FA, 0xA2B3, 0xCCAA, 0xAEB7, 0xA61C, 0x8F2C, 0x9757, 0xC835, 0x9FE1, 0xD43B, 0x89F7, 0xD016, 0x9814, 0xAE73, 0xA591, 0xAD41, 0xD153, 0x9A1A, 0x9A1B, 0x850A, 0xB762, 0xB3E3, 0xAAB5, 0xB187, 0x966F, 0xC276, 0xB42B, 0xC02E, 0xD0D6, 0xACB9, 0xC43A, 0xC43B, 0xAD80, 0xA788, 0xA6F0, 0x9A5A, 0x975B, 0x8EF4, 0xD274, 0xC6A8, 0xCA41, 0x9A52, 0xC305, 0xA433, 0xB689, 0xC306, 0xC8DC, 0x8985, 0x9EC9, 0xABC2, 0x92B6, 0x926F, 0xC409, 0xCB4E, 0x9918, 0x9F2C, 0x92B8, 0xBA58, 0x86E8, 0xB899, 0xBC69, 0xB3E9, 0xA72E, 0xC719, 0xC5F1, 0xAEEB, 0x9067, 0xCB4F, 0x88B3, 0x848B, 0xAEDE, 0xAF38, 0xAAB1, 0xBEB8, 0x8BB2, 0xA016, 0x8CD4, 0xCDB0, 0xB195, 0xB6FE, 0xB734, 0xAE08, 0xC83C, 0xBD03, 0xCC37, 0xB3BC, 0xAEED, 0xCF04, 0xCC6C, 0xAC92, 0x867B, 0xAAB2, 0xB95F, 0xC644, 0xAEBF, 0x90C5, 0xA8CA, 0xCE89, 0xA51F, 0xC8EB, 0xBB05, 0xA874, 0x9F10, 0xAEDF, 0xA521, 0xC414, 0xCC40, 0xBB07, 0x9BA6, 0xB60B, 0xAC60, 0xA642, 0xAA2D, 0xC874, 0xD3DD, 0xA523, 0xD521, 0x9F51, 0xA1CA, 0xA1CB, 0xA351, 0xCF56, 0xD4E5, 0xD537, 0x8D94, 0xBC7D, 0x93FB, 0x880E, 0xD4E6, 0xC549, 0xC5FE, 0xAC25, 0xBB88, 0xBCEE, 0x85C6, 0x9CE0, 0x9658, 0xAF7F, 0xC75E, 0xCD42, 0xD446, 0x97FA, 0xAA22, 0xBC80, 0xAE3C, 0xACD0, 0x8D18, 0xB345, 0xBAAF, 0x8980, 0xC7E1, 0xD4F9, 0xAEA2, 0x93E9, 0xD502, 0xA61D, 0xC766, 0x8855, 0xB735, 0xADFD, 0xAF16, 0xAF17, 0xCC41, 0xAA2E, 0xAC87, 0xAF2B, 0xB706, 0xBCBD, 0x976C, 0xD09E, 0xB4F7, 0xCDC7, 0xBA6D, 0x849C, 0x9D3E, 0xBBC8, 0xC077, 0xB722, 0xC99F, 0x9950, 0xCA54, 0xA04A, 0xD493, 0xAC66, 0xD3E7, 0x8E95, 0x9955, 0xD546, 0x96E7, 0xD38E, 0x903A, 0xC085, 0xCA59, 0x85D5, 0xB9E2, 0xB9E3, 0x8B8F, 0xB94F, 0xA310, + 0xC702, 0xBA28, 0xCD48, 0x9AAE, 0xCA6A, 0xBEB1, 0xBA0B, 0xC47A, 0x95FE, 0x8AC7, 0xB64A, 0x95FF, 0xC4FB, 0xCF98, 0xD08C, 0x8EBC, 0x9804, 0xC8C1, 0xC4FC, 0x9D49, 0xB953, 0x8A6B, 0xB6E0, 0x9B03, 0xAC6B, 0xA364, 0xA3B4, 0x8796, 0xBC08, 0x889E, 0xCFAD, 0x9CF0, 0xCE77, 0x9CF1, 0xCBCE, 0xAC6D, 0xA365, 0xB51F, 0x98FE, 0xD19D, 0x9E3A, 0x948E, 0xAF31, 0x87EA, 0x9A8D, 0xABCF, 0xB4AA, 0x982B, 0xCE17, 0xB9F0, 0xAF32, 0xA002, 0xAF47, 0xD2E3, 0xCDDD, 0x85DF, 0xA3B5, 0xAF33, 0xB4AC, 0xAD79, 0x894F, 0xA178, 0x96D1, 0xB4AD, 0x99C3, 0xC2A4, 0xA781, 0xB9F8, 0xAF34, 0xD0A5, 0xB959, 0xC155, 0xC598, 0xA3B6, 0x9B80, 0xA789, 0xA255, 0x9A95, 0xCB5F, 0xCA8E, 0x85E9, 0xB483, 0x8B91, 0x85EA, 0x939A, 0x8D99, 0x9118, 0xBB7E, 0xC79B, 0x8EB8, 0xAA0F, 0x911C, 0xBA71, 0xB1E7, 0x937B, 0xD437, 0x93DC, 0xB905, 0xA314, 0x9E74, 0x9EA4, 0xD439, 0xC171, 0xD5E9, 0xC7AC, 0xBADC, 0x9123, 0x8EC7, 0xC53F, 0x9F52, 0xB8E6, 0x9229, 0x922A, 0x922B, 0x94B7, 0x9D95, 0xBAAC, 0x8A63, 0xB8C8, 0xB8C9, 0xAD3F, 0x94B2, 0x89ED, 0xA7B3, 0xC45A, 0xC45B, 0xA456, 0xCCFB, 0xC0B0, 0xCCFC, 0xA7AF, 0xA7B0, 0xC96C, 0xAB2C, 0xC0B1, 0xC0B2, 0xC0B3, 0x94B9, 0xC96D, 0x9188, 0xA426, 0xD343, 0xA0DA, 0x94F6, 0x968B, 0x94F7, 0xBFBD, 0x94FB, 0x94FC, 0xB9AE, 0xCBEA, 0x8B36, 0xA2CB, 0xAE7B, 0x9FEF, 0xC129, 0xAEEE, 0xA118, 0xB135, 0x8923, 0xC374, 0x866E, 0xA0EF, 0x9FA4, 0xBE64, 0xB577, 0xBE3D, 0x9FA5, 0xC22A, 0x8FD6, 0xB9B7, 0xBA0C, 0xB1B2, 0x9C24, 0xC5A7, 0xD1BD, 0xC5A8, 0xAE81, 0xD0CA, 0xC2CA, 0xC2CB, 0xAB06, 0x919A, 0xA945, 0xB1BA, 0xBE44, 0x9317, 0xD3ED, 0xC5B1, 0xBF79, 0xAA01, 0xAA04, 0xC35C, 0x8924, 0xAA09, 0xA17F, 0xC5BD, 0xA189, 0xA1C7, 0xA79B, 0xA1C8, 0xD3F5, 0xC5D8, 0x8A49, 0xBFDB, 0xAEAC, 0xB854, 0xC03C, 0xC3EE, 0xA66B, 0x91C0, 0x8EAF, 0x9B56, 0xA8DE, 0xCACD, 0xB2D7, 0xB6AF, 0xC287, 0x983D, 0xB91C, 0xCDC8, 0x8BCD, 0xBC5A, 0xB2D8, 0xCA25, 0xCEEB, 0x8585, 0xC9A0, 0x84D5, 0xC7EC, 0xC289, 0x9F58, 0x91C2, 0x9C73, 0xB335, 0x933E, 0xC078, 0xB276, 0x891E, 0xB36B, 0xB277, 0x8959, 0x9F9F, 0xB572, 0x9526, 0xC473, 0x8504, 0xA4E5, 0x8EB9, 0x8521, 0xD609, 0xD60A, 0xC942, 0xA154, 0x9529, + 0xA305, 0x9633, 0xC75F, 0xB1D5, 0xA677, 0xBE9D, 0xB578, 0xC84A, 0x9401, 0xC679, 0x9D62, 0xA833, 0xC009, 0xB100, 0x8506, 0x8DFC, 0xA3DC, 0xCEEE, 0xB579, 0x9A0D, 0xB1ED, 0xACE5, 0x84C5, 0xBE9E, 0xA834, 0x8B1D, 0xB1AF, 0x9051, 0x892B, 0xA3F8, 0x85A1, 0xAB64, 0xBF1A, 0xC760, 0xCAE2, 0x8734, 0x98C3, 0xA311, 0xAA99, 0x91CF, 0x947E, 0xC7A1, 0x8FF2, 0xA99F, 0x920B, 0x9217, 0x94C1, 0xB5DA, 0x9071, 0xCA62, 0xADAE, 0xB9E7, 0x849E, 0xC102, 0x9A85, 0xD2B5, 0xAC69, 0xA650, 0x9CE3, 0x9072, 0xC103, 0xCD49, 0x967E, 0xC3B5, 0xA7BF, 0xC971, 0x9F17, 0xD1FC, 0xAA23, 0x9EBA, 0x91A1, 0x91A2, 0xCE00, 0xC56F, 0x885C, 0xB442, 0xB647, 0x9380, 0x9381, 0xAE41, 0xA653, 0xCD08, 0xC481, 0xB6E1, 0x8EBD, 0xB92E, 0x8AC8, 0xBF71, 0x95E5, 0xA247, 0x956F, 0xC3BA, 0xCBC5, 0xCDD1, 0xA55B, 0xA2A8, 0xA569, 0xA4B9, 0xC452, 0xB62B, 0xA348, 0x8B86, 0x8B87, 0xBCD4, 0xA7E3, 0x9A4E, 0xA101, 0xA4BF, 0xB28E, 0xACF0, 0xA44A, 0xA44B, 0xD5A7, 0x96AB, 0x8D62, 0xC7F4, 0xC7F5, 0x953B, 0xAA58, 0xAA59, 0xA847, 0xA1E1, 0x915B, 0xD204, 0x97C0, 0xCBCF, 0x907D, 0x9826, 0xD205, 0xC138, 0xC53B, 0xB10D, 0xC82B, 0xBBB1, 0x9F6B, 0x8654, 0xD5A8, 0xA377, 0x905A, 0xD0CC, 0x96AC, 0xCBD0, 0xD4F2, 0xD033, 0x9ADD, 0xCD8D, 0xC061, 0xC92A, 0x9386, 0xB553, 0xC92B, 0xBE14, 0xCAAE, 0xD2DC, 0xBA3E, 0xCF9A, 0xC9AE, 0x91DF, 0xD417, 0xA292, 0xAA16, 0xC88E, 0xABBE, 0x982C, 0x9C2B, 0x9C2C, 0x9ABA, 0xBEEF, 0xB9A7, 0xAB9C, 0xB3AC, 0xC29B, 0xCD8E, 0xD54B, 0xA4E9, 0xA308, 0xC85B, 0xC85C, 0xC13F, 0xD54C, 0x8949, 0xBC60, 0xB6E5, 0xA2E7, 0xB47B, 0xCD8F, 0xB29B, 0xA93B, 0xBF7E, 0x9111, 0xC2F2, 0xC1EB, 0x88DA, 0xBD7D, 0xB6E9, 0x9F73, 0x8466, 0xA895, 0xC2A1, 0xBBB5, 0xB404, 0xD4FA, 0xC10F, 0x8658, 0x8F87, 0x8DA5, 0xB396, 0xCCDA, 0xAF02, 0x8DA6, 0x9CCA, 0xB9F4, 0xB790, 0xBBC3, 0xD554, 0x9EAC, 0xA782, 0xA2B4, 0x89B9, 0x900D, 0x891C, 0x9032, 0xBF6A, 0xA93E, 0xD121, 0xD0D1, 0xD0D2, 0x84E6, 0x88EF, 0xB587, 0xB3D1, 0x8D67, 0xD5D1, 0x8EC4, 0x8EC5, 0xC33E, 0xCE30, 0xB080, 0xA8ED, 0xC4EB, 0x8925, 0x8804, 0xB47E, 0x9ECA, 0xC838, 0xA570, 0xD0EA, 0xA7F0, 0xA78A, 0xA78B, 0x9FD2, 0x8F04, 0x9193, 0xD5EA, 0x9F29, + 0xA1F9, 0xC98E, 0x9ECB, 0xC98F, 0xA1FA, 0xD0B5, 0xCB50, 0xC767, 0xAE49, 0xCA11, 0xCA12, 0xCA88, 0xAF0C, 0xC463, 0x9CA2, 0xC5C1, 0xA303, 0x975C, 0x8F7E, 0x8510, 0xD5E2, 0xC0F1, 0xCA8F, 0xB6FF, 0x8ECA, 0xA882, 0x9F8A, 0xCDE8, 0xCF07, 0xCBFC, 0xB723, 0x9F8F, 0xA6BC, 0x9764, 0xA8F6, 0xA8F7, 0x8F8D, 0xCC77, 0xC329, 0xA134, 0x89A1, 0xCC91, 0xA401, 0xC86F, 0xC0F6, 0xAE4F, 0xB60C, 0x8A37, 0x8D57, 0xAA2F, 0x8F91, 0x8F92, 0xAF1D, 0xC875, 0xC876, 0xC8B2, 0xA41D, 0xC877, 0x8C2A, 0xA39D, 0x8C2B, 0xD35C, 0x9ACD, 0xA020, 0xC79C, 0x8A24, 0x8A25, 0xA7D2, 0x95F4, 0xD603, 0xB43B, 0xA151, 0x9612, 0xA340, 0xC229, 0xB211, 0xB212, 0x895E, 0xB554, 0xB55E, 0x9CBE, 0xCA9C, 0xBB79, 0x851A, 0xD238, 0xD12A, 0xC4E2, 0xCA6B, 0x9FD9, 0xBC94, 0xB61E, 0xB0D0, 0xC7D0, 0x9FBD, 0x93F4, 0xCF77, 0x8693, 0xBA17, 0x8871, 0x9024, 0xBAF6, 0x9268, 0xAEF3, 0xB9B0, 0x9328, 0xAFEA, 0xD28A, 0xC2B8, 0x9A09, 0x8E54, 0xC0FE, 0xD117, 0xBD9B, 0x8DFD, 0xAD5F, 0xB075, 0xAFEB, 0xBED3, 0x9402, 0xA6F3, 0xD2AE, 0xD383, 0x8811, 0xD2AF, 0x8F5A, 0xAD67, 0xCAEF, 0xCAF0, 0xB1B3, 0xB323, 0xA1A4, 0xB727, 0xBAF7, 0x8E01, 0xD229, 0xBB1E, 0xB443, 0xD191, 0xB9BB, 0xB64B, 0xC336, 0x85A3, 0x8E08, 0x974B, 0x8B9E, 0xB1BB, 0xD11C, 0x9DF0, 0xC068, 0x8E0B, 0xC10A, 0x89EF, 0xB844, 0xB28F, 0xD00F, 0x97D4, 0xAB78, 0x90DD, 0x998F, 0xD22C, 0xC69A, 0xAC71, 0xC110, 0xC212, 0x9431, 0xCB19, 0x85A8, 0xB1C0, 0x8FFF, 0x9606, 0xB008, 0x9B08, 0xBDB7, 0xAC74, 0x9D8D, 0xBDF2, 0x9B30, 0xD334, 0xB871, 0xAB16, 0xADCC, 0x8757, 0x97D7, 0xD017, 0xADCD, 0x85A9, 0xD122, 0xA053, 0x89BC, 0x9446, 0xD2F9, 0x99C6, 0x9270, 0xD471, 0x86D4, 0x86E0, 0xD110, 0xAC80, 0xB411, 0x897B, 0x934D, 0xAC07, 0x85AB, 0x8BB3, 0xACD8, 0x8BE9, 0x9F88, 0xC46A, 0xA4FE, 0x94E3, 0xB1AA, 0xAEC1, 0x9D96, 0x87DE, 0x87E1, 0xC639, 0x951B, 0xC95E, 0x9AAA, 0xCD3F, 0xCCEE, 0x9CC8, 0x9738, 0xB128, 0xBED7, 0xD02E, 0x9739, 0xD45C, 0xAB86, 0xB4EA, 0x8699, 0xB484, 0x9143, 0x8C52, 0x976F, 0xC7FF, 0x8564, 0x9FA0, 0xC6C9, 0xA952, 0xC260, 0xD45E, 0xA380, 0xCC13, 0x8F40, 0xB049, 0x8FA6, 0xC7DC, 0xACC7, 0x95D1, 0x8CE7, 0x9459, 0xBF1B, 0xB031, 0x930C, + 0xC4C6, 0xCAA5, 0xD2B6, 0xBE96, 0xD2B7, 0xC65F, 0x90E9, 0xD611, 0xC4FD, 0xBF72, 0x977A, 0xA383, 0xABF6, 0xBEEB, 0xCD2D, 0x885D, 0x87E3, 0x8AF3, 0xA4C0, 0x86AF, 0x9C8B, 0x84A1, 0xBAD7, 0xA2B2, 0xCCA4, 0xC02A, 0xBBB2, 0xBAD8, 0xB4E4, 0xCE18, 0xCDD6, 0xACCA, 0xBBD5, 0x8910, 0xC4AF, 0x9319, 0xA0DB, 0x91E7, 0xC140, 0xA8CF, 0xC3E4, 0xA6FD, 0xA53D, 0xBBD6, 0xD2E4, 0x8883, 0xB4CA, 0xA0DF, 0xA0E0, 0x9FE2, 0x84E7, 0xA481, 0xA92A, 0xCC0A, 0xA783, 0x8E14, 0xA9BC, 0xCB35, 0x8BE4, 0x898F, 0xBF86, 0xBB67, 0xC5ED, 0xACCB, 0x8A09, 0xC277, 0x931D, 0x973B, 0xA355, 0xA3AE, 0x86E9, 0xB3EA, 0xC5C2, 0xA80F, 0xA810, 0xA79C, 0xA966, 0x9D28, 0xCC92, 0xC415, 0xBEE5, 0xCCBB, 0xA643, 0xBEE7, 0xCBE9, 0xC79A, 0xC843, 0xBEE9, 0x8F1C, 0xB1EC, 0x9E26, 0x9B41, 0xAE04, 0x9B42, 0x9611, 0xAED8, 0xA268, 0x872D, 0xCACE, 0xB2F4, 0xAF6E, 0x9362, 0xA13B, 0xC885, 0xCAF1, 0xCFD7, 0x86D5, 0xCAC2, 0xCA28, 0x923D, 0xB7C0, 0xBA1A, 0x923E, 0xBA3F, 0xBA47, 0x95F5, 0x8FD7, 0xCBEB, 0x9A02, 0x93F5, 0x994C, 0xC222, 0x8F50, 0x8B18, 0x9E9F, 0x8547, 0xB94C, 0x8F52, 0xD0F4, 0xD0F5, 0xBDB0, 0x945A, 0x8F41, 0xAC2F, 0xC422, 0x99CC, 0x8A19, 0xAF85, 0xA061, 0xD1C2, 0xCA63, 0xAC52, 0xA1AD, 0xC065, 0xB8CD, 0xB78A, 0xCE73, 0xA069, 0x8FC5, 0xD0F6, 0x9EA5, 0xB3E0, 0xB0A6, 0x8E5D, 0xB3E1, 0x86B7, 0x86B8, 0xB90B, 0xBD2F, 0x9DFE, 0x964A, 0x9588, 0x924C, 0x86C3, 0xA35A, 0x9E05, 0x8792, 0xC51F, 0x8E6D, 0x97C8, 0x9E80, 0x9978, 0xAC39, 0x97CC, 0xC06F, 0xA21C, 0x9CD1, 0x9CD2, 0x9742, 0x8E7B, 0xA99D, 0xA99E, 0xBFB5, 0x9B67, 0xD2DD, 0x9B72, 0x9B73, 0xCA89, 0xCA8A, 0xCA93, 0xCA94, 0xCEE5, 0xCEE6, 0xB855, 0xC623, 0xC1AE, 0xBF19, 0xC8BD, 0xC8BE, 0xCDFA, 0x8AFC, 0x889F, 0x874E, 0x8FC6, 0x8797, 0xB0A7, 0xCCDB, 0xB162, 0xD0FB, 0xCC8C, 0x8B16, 0x8B4C, 0xD4B1, 0xC027, 0x9C74, 0x92D2, 0xD326, 0xCAD6, 0xC0BA, 0x8A4A, 0x8685, 0x8F0D, 0xA835, 0x9403, 0xC0BF, 0xD1F9, 0x8D38, 0xC0C0, 0xA062, 0x8E02, 0xC2C2, 0xC7C7, 0x991D, 0xC922, 0x9A63, 0xAA11, 0x99A3, 0xC040, 0x8AEF, 0xD2BF, 0xC6B5, 0xA06A, 0xBF73, 0x8D16, 0xD23E, 0xA4BA, 0x8D19, 0x8EE3, 0xAFF0, 0xC355, 0xC358, 0x9CF2, 0x89F0, 0xD2CB, 0x8CF9, + 0xD36A, 0xA4C1, 0xCE19, 0xC5AA, 0x9FB1, 0x9E35, 0xBA40, 0x9D7F, 0x873B, 0x9ADE, 0x948F, 0xC7AD, 0xC141, 0x85BA, 0xC97F, 0xC0E8, 0xC2F3, 0xD20E, 0xB17D, 0xBE21, 0x8EE9, 0xD212, 0xD214, 0x878C, 0x8EEA, 0x8B7E, 0x8A53, 0xC990, 0x9B88, 0x9F04, 0x9B39, 0xABAF, 0xA91F, 0xC4BA, 0x8600, 0xB5B2, 0xC5DB, 0xC5DA, 0x8694, 0xCAC4, 0xA59B, 0xB695, 0x8EB0, 0x9037, 0x94CD, 0x9CDA, 0xB69E, 0xB697, 0x89CB, 0xBD4A, 0xBDE4, 0xBDE5, 0x94E5, 0xCACF, 0xBA1B, 0x8D98, 0xD2A7, 0xC0D1, 0xAB29, 0xC2B3, 0x9269, 0xCC14, 0xBE7D, 0xACE6, 0xC1CC, 0xD328, 0x8B75, 0xC28C, 0x9C75, 0xC261, 0xC378, 0x9FA1, 0xCCE9, 0xC079, 0x8CF5, 0xBBA8, 0xA3A1, 0xCDF6, 0x872E, 0xD2A8, 0xB278, 0x8D76, 0x8A65, 0xBD0B, 0xBFDC, 0xB36C, 0xAED9, 0x9BBA, 0xC64C, 0xAF4E, 0xC0BE, 0xC3F3, 0xC5DE, 0xA2AF, 0x99B3, 0xA283, 0x9364, 0x9A62, 0xBD0D, 0xBBBC, 0xC262, 0xAFD9, 0x8A0C, 0x8C5A, 0xA155, 0xCAE3, 0x85D6, 0x8A1A, 0xACE7, 0xB060, 0xD60B, 0xD03B, 0xC955, 0xA361, 0x8596, 0xAF88, 0xAE3F, 0xD1FA, 0xAFEC, 0x8876, 0xBEC2, 0x96A6, 0x9A0E, 0xA15B, 0x8DCF, 0xA6F4, 0xBB50, 0xCD01, 0x8F56, 0x8E03, 0xCA5A, 0xBF61, 0xCD04, 0x93D5, 0x9C81, 0xB090, 0xC63A, 0xCED0, 0xAE7D, 0x96E3, 0x9404, 0xC379, 0x869D, 0xCCEC, 0xB45A, 0xC73B, 0x8CF8, 0x87CA, 0x9B00, 0xC776, 0x8C05, 0xB0DB, 0xBAD2, 0xC2C3, 0xBD1A, 0xCCC8, 0xD56A, 0x911E, 0xAD60, 0xA344, 0xCAE4, 0xBA29, 0xB6BD, 0xC7A2, 0xBA2A, 0xC37E, 0xA580, 0x9927, 0xA3C6, 0xAD98, 0xD294, 0xC570, 0xA73A, 0xBE97, 0x9B01, 0x8FF3, 0x9899, 0xA352, 0x9776, 0x9928, 0xB24C, 0xC54D, 0xBAD6, 0xBB51, 0x99B8, 0xB51C, 0xC957, 0x9B61, 0x9B43, 0x8B55, 0x9D67, 0xCA64, 0xC64F, 0x96E4, 0xA81A, 0x9B1A, 0xD53D, 0xC6CF, 0x8B40, 0xB8CA, 0xAF90, 0x9920, 0x9208, 0xA312, 0x9073, 0xBE66, 0x9600, 0xB5DB, 0xC2CC, 0xB324, 0xCEF1, 0xB093, 0xA328, 0x8EE2, 0x9B62, 0x91D1, 0xC4FE, 0xBF47, 0xC825, 0xA272, 0x8905, 0xAE52, 0xCF5A, 0xAB31, 0xCCD2, 0xCCCF, 0xCE74, 0xB0E2, 0xA465, 0xB400, 0xCEF3, 0xCE0A, 0xBF74, 0x9FAF, 0xC2D5, 0xD161, 0xA81B, 0xBE41, 0x9843, 0x989A, 0xB45E, 0xBE45, 0x887C, 0xCAFB, 0xB3A9, 0x9B4F, 0xC2CD, 0x861D, 0xAAF6, 0xCB0A, 0x9923, 0xBBBD, 0xB5DC, 0x8AF0, 0xA3F9, + 0xC292, 0xC293, 0xCCEF, 0xA60C, 0xA54F, 0x9AB4, 0x8CFA, 0xCB0B, 0xCEF4, 0xA68A, 0xAF29, 0xAE53, 0x91D8, 0xB62C, 0xC72A, 0xB340, 0xC294, 0xAD09, 0x8D1A, 0x9303, 0x8608, 0x8EE5, 0x8D7F, 0x8A12, 0xABE9, 0xA697, 0x9CF3, 0x970E, 0x9709, 0xC63F, 0x8ECF, 0xB255, 0xA349, 0xBE81, 0xAA5A, 0xC2E4, 0xA29C, 0x97A4, 0xAEB6, 0xB4D4, 0x8BA0, 0x912E, 0x97E1, 0xD0AE, 0xA02C, 0xC08E, 0xCE7C, 0x9FCD, 0x9CF9, 0xA7E4, 0xCE0B, 0x9BEE, 0x98DA, 0xB5F1, 0xBD2E, 0xBE46, 0xBE49, 0xAEFC, 0xC0C3, 0x8CA5, 0x99BD, 0x9BB0, 0xC2D6, 0x8A04, 0xC5E7, 0xC10B, 0x9B6B, 0x91BA, 0xBCAE, 0xD56D, 0x9DA4, 0xCCD4, 0x8FAD, 0xA16C, 0x88BF, 0x8AD6, 0x8EE6, 0x8627, 0xB461, 0x88B8, 0x8E5E, 0x970A, 0x918D, 0xAE58, 0xCF5F, 0xC4D4, 0xD481, 0x9000, 0x9ADF, 0x8C9A, 0xB503, 0xB68E, 0xC60F, 0x8911, 0x8725, 0x9BB3, 0xD54D, 0xBE15, 0xB43D, 0x8BA6, 0x862C, 0xC70A, 0xC0E1, 0x959D, 0xB34D, 0xC142, 0xCE25, 0xCD90, 0x86B9, 0xC70B, 0x9ABB, 0xAD0F, 0x86BA, 0xCB28, 0xACA5, 0xCCD5, 0xB306, 0xB8B0, 0xCBA6, 0x91E0, 0x8A75, 0xAB7B, 0xB328, 0xA31B, 0xCD9A, 0x8484, 0xB464, 0xC88F, 0xB75F, 0x9508, 0xCF60, 0xD56E, 0xB7AE, 0xA600, 0x9367, 0xCC1D, 0xA42B, 0xA42C, 0xB638, 0x9607, 0xCF35, 0xBC15, 0xBC1C, 0xB2A3, 0xC980, 0xBBC2, 0x9B09, 0x9C98, 0x968C, 0xA179, 0x8C5F, 0xAEB8, 0xC57F, 0xA27A, 0xD221, 0xCCDC, 0x88FA, 0xC7D3, 0xB96E, 0x882A, 0xA28A, 0xCED9, 0xC38B, 0x9BCB, 0xCCDE, 0xC94B, 0xA6A8, 0xB7E5, 0xBDB8, 0xCBAE, 0x8CC9, 0xC6E8, 0xB397, 0xBD16, 0x9AD3, 0xCF63, 0xB96F, 0xAD34, 0x961F, 0xB90C, 0x8D1D, 0xB17E, 0xADCE, 0xADD2, 0x97D8, 0x8B69, 0x88C1, 0x88BC, 0x88BA, 0x8D68, 0xAD14, 0xBDEB, 0xD0FC, 0xBF49, 0x850B, 0xBB12, 0xAB17, 0x9710, 0xB63B, 0xCFF7, 0xA0E1, 0x9B81, 0xA277, 0xA6FE, 0xAFDB, 0xBBC4, 0xA008, 0xCC0C, 0xAA1B, 0xB8B4, 0xC17C, 0xBFA9, 0xAAF8, 0xB352, 0xB910, 0xCCAB, 0xB4F1, 0xA2B5, 0x8F7B, 0xD275, 0xA92B, 0xA1BF, 0xB268, 0xB263, 0xCE3C, 0xB1CB, 0xA784, 0x8D2B, 0xCCF2, 0x8B7F, 0xD2FA, 0xBF4A, 0x8AAA, 0xB311, 0xB589, 0xB0B6, 0x8637, 0x8781, 0xB510, 0x9ECC, 0xD045, 0x8B65, 0xA709, 0xB1CE, 0xA434, 0x9B82, 0xB42C, 0x8AE5, 0xCC0E, 0xCC0F, 0xC360, 0xC361, 0x8E6E, 0xBD37, 0x9194, + 0x9124, 0x9151, 0xBC23, 0xA206, 0x891A, 0xC51A, 0x9271, 0x936A, 0xA571, 0xA592, 0x8B80, 0x9816, 0xB313, 0xC43C, 0xAD15, 0xA054, 0xA78C, 0xC278, 0x88C3, 0xA1FB, 0x8D43, 0xC498, 0xBD52, 0xB995, 0xB0F8, 0xCB51, 0x8C1C, 0xC40A, 0xAF64, 0x8E6F, 0xBD53, 0xA056, 0xBBB8, 0x985D, 0x9C49, 0xC183, 0x9A78, 0x9068, 0xB4A2, 0xB49D, 0xA183, 0x88FB, 0xA32E, 0xC5C3, 0xCC38, 0x8512, 0xAB84, 0xCB52, 0xA811, 0xB809, 0xA256, 0x9A68, 0xABEC, 0xA51C, 0x848C, 0xA812, 0xC83E, 0xA48A, 0xC3E8, 0x8B6D, 0xCDB1, 0xCC11, 0x8DF4, 0xAC28, 0x848E, 0xAC08, 0x9128, 0xB2BB, 0xAD59, 0xA4F5, 0xABED, 0x8BB4, 0xD30C, 0xAFB2, 0xAFB3, 0x8BE8, 0xC950, 0x8844, 0xD312, 0xA3EE, 0xA3D6, 0xCCF6, 0x93F2, 0xA8AE, 0xACD9, 0x8AEC, 0x9B99, 0x89CE, 0xAC21, 0xA520, 0x9A6A, 0xC734, 0xB67B, 0x89D0, 0x9D29, 0xA190, 0x9A7C, 0xB916, 0xCB84, 0xA750, 0xAE2B, 0xAC44, 0xBDA5, 0xA21D, 0xD473, 0x9541, 0x9542, 0x9578, 0xCEE8, 0xC284, 0x9D93, 0xC68C, 0xBACC, 0xB6D8, 0xC373, 0x8ABD, 0xC206, 0x9FA2, 0x957C, 0x9D9B, 0xB3C0, 0x9BE2, 0xB3C1, 0xD0DF, 0x907A, 0xB256, 0x9D69, 0x8FFB, 0x8897, 0x9D6C, 0x9CC9, 0xD24E, 0xA293, 0x9C90, 0xA40D, 0x94DC, 0x8EFD, 0xD0E8, 0xB3D2, 0x958B, 0x9E06, 0x9F7D, 0xCE31, 0x9E07, 0xC89E, 0xA9C2, 0xC394, 0xD0ED, 0xC39A, 0xC39C, 0x8CA0, 0x8E1A, 0xB5B4, 0x9A03, 0x9A04, 0x9A05, 0x91C1, 0xBA1E, 0xBE3C, 0xAB63, 0x9A0F, 0xA678, 0x92CB, 0xBCA9, 0x8721, 0x8FA8, 0xA08D, 0xB8C0, 0xCA6C, 0xCAAA, 0xB88C, 0x9A16, 0x92EA, 0xC890, 0xBA6B, 0xBA6C, 0x8893, 0xD06C, 0xB537, 0xA59C, 0xB20E, 0x851C, 0x8DEC, 0xB6CC, 0x92A0, 0xB748, 0xCF9E, 0xBFED, 0xD116, 0x8FD5, 0xA2BD, 0xCD57, 0xA36F, 0x983E, 0xB91D, 0x892F, 0xBFEE, 0x9679, 0xA360, 0xC288, 0x8EEE, 0xB330, 0xD25E, 0xB6B0, 0xA476, 0xABDC, 0xB7F2, 0xC914, 0xAF4F, 0x8594, 0x8A45, 0xB686, 0x8930, 0xB36D, 0x8573, 0x9D61, 0xCD6C, 0x93FC, 0x8505, 0xC2B9, 0xB0D7, 0xD28B, 0xD2A9, 0x91C5, 0x8EEF, 0xD136, 0x8AC0, 0x9CDB, 0xC87D, 0xA3CC, 0x872F, 0x8A18, 0xA0ED, 0xC1CD, 0x99CB, 0xCEEC, 0xA1D1, 0x8542, 0xB4B2, 0xB94D, 0xD21B, 0xCF46, 0xC07A, 0xAE66, 0xCAD7, 0xBA84, 0xD42D, 0xB1FE, 0xBF52, 0x9093, 0xA2C4, 0xD156, 0xB1FF, 0x9457, 0xB043, + 0x8531, 0x84FC, 0xD005, 0xBFA4, 0xA356, 0xAA4B, 0xB3F1, 0xCF26, 0x9A0A, 0x85ED, 0x87CB, 0xD290, 0xB091, 0xAE14, 0xB20F, 0xB0DC, 0xBCF7, 0xC9A1, 0xD1BF, 0xD058, 0xC908, 0x85EE, 0x98B4, 0xAE9B, 0xC9F0, 0x8F42, 0x8B52, 0xB0DD, 0x9D3F, 0xAD58, 0xABC8, 0x8A59, 0xC7DD, 0x8B95, 0xB57A, 0xAD04, 0x8C06, 0x9D41, 0x9405, 0xD0C7, 0xD3E8, 0x8E27, 0x8961, 0xADAD, 0xAEC0, 0xA490, 0x945B, 0xB044, 0x8597, 0xAFEE, 0xA82B, 0xADDC, 0x96DD, 0xB36E, 0xA156, 0xC033, 0x8534, 0xBFF4, 0xBFF5, 0x84FE, 0xA0F0, 0xD4A2, 0x8735, 0xD12B, 0x8567, 0x8565, 0x8F43, 0xAE9A, 0xA15C, 0xA477, 0xA914, 0x9DE5, 0xB31D, 0xCCA1, 0xA4E6, 0xAF2D, 0x87F0, 0xD007, 0xB33D, 0x9919, 0xA478, 0xBA2B, 0x9F60, 0xD21D, 0xAF2A, 0x9614, 0x9616, 0xB5EB, 0xBAFB, 0x8D95, 0xCF7B, 0xA2D0, 0x8B3E, 0xC571, 0x8906, 0x9B1B, 0xB189, 0xD433, 0xB9E8, 0xADDD, 0x8555, 0x8B20, 0x96D5, 0xD2B8, 0xA479, 0x9174, 0x9175, 0xD295, 0xB45F, 0x84C6, 0xAF6F, 0xD1DE, 0x9596, 0x9F18, 0xA397, 0x9074, 0xADDE, 0xBE98, 0xA7C0, 0xD059, 0xA97F, 0x8FF4, 0xC041, 0xA1D7, 0xA7B8, 0xA140, 0xD2C0, 0xAA24, 0xC814, 0xC1F6, 0xBCD1, 0xC572, 0xAE40, 0x8E88, 0x9EE3, 0xD1FD, 0x9CC4, 0x9B1C, 0xC426, 0xCDCD, 0x845D, 0xBFF8, 0xAFA0, 0x8DB4, 0x881C, 0x95E6, 0xBE37, 0xD1E1, 0x8ACD, 0xB82A, 0xBC9A, 0xA336, 0xABBB, 0xAF70, 0xA0F6, 0xB0A1, 0x9DEB, 0xCAFC, 0xBEFF, 0xB862, 0xB785, 0xC088, 0xC573, 0x8935, 0x93A2, 0x9EE7, 0xC26A, 0xA248, 0xA0F7, 0xBF41, 0xA466, 0x9BE6, 0xBF75, 0xD4A5, 0xB200, 0xAA6D, 0x8525, 0x9844, 0xB8CE, 0xAEF0, 0xA195, 0xD032, 0xBBBE, 0xC9D9, 0xA1DE, 0x886A, 0xC07E, 0x887D, 0xD5F8, 0xC9F5, 0xD097, 0xA980, 0xBBD2, 0xBFF9, 0xA55F, 0xBC8A, 0x85A4, 0x9DEC, 0x9AB0, 0x8EBE, 0xC132, 0xC0A6, 0xB48E, 0xB0C7, 0xB8FF, 0xA7C8, 0xACF1, 0xABE1, 0x9462, 0x855C, 0xA16D, 0x8EB7, 0xC209, 0x8463, 0xA1A6, 0xCEFA, 0xD56C, 0xBE82, 0x8C68, 0x9F6C, 0xBF65, 0x864B, 0xADF0, 0xAECC, 0xB786, 0xD5FD, 0xC210, 0xB257, 0xC3FD, 0x8AD0, 0x8F84, 0xB7F3, 0xAA4C, 0xB4EC, 0x9532, 0x9164, 0xBA76, 0x8FDE, 0xB201, 0x8F47, 0xD10E, 0x9BC7, 0x9CC6, 0xBDB3, 0xB31B, 0xB290, 0xAFF1, 0xBA91, 0xB348, 0xA848, 0xC9FA, 0xC81A, 0xA1E2, 0xD206, 0xA768, + 0x96D6, 0xAE9F, 0x9BEB, 0xC8C7, 0xD21E, 0xAA41, 0x88A0, 0xBD5B, 0x8A50, 0x87C3, 0x9F38, 0xBE47, 0xA353, 0xBFB8, 0xC889, 0x8DB7, 0xD58B, 0xA102, 0xBE90, 0xB379, 0xA32F, 0x8556, 0xAFE6, 0x9F39, 0xA981, 0x97D5, 0xAD37, 0x95D5, 0xD2CC, 0x8E4B, 0xABF0, 0x8975, 0xB7E4, 0x970B, 0xB0CB, 0xCED6, 0xAFA8, 0x9DF5, 0xD20C, 0xA0B6, 0x9DF6, 0xCD91, 0xC861, 0xA40A, 0xAE26, 0x9941, 0xB70F, 0xB138, 0xC0E2, 0xB7AF, 0xD59D, 0xC70C, 0xACB6, 0xBE16, 0xAEF1, 0x8939, 0xBA41, 0xD56F, 0xD1E8, 0xCA39, 0xC7AE, 0x9AE0, 0x873C, 0xC92C, 0x9ABC, 0xC891, 0xD5C9, 0x84C0, 0xC69B, 0xC81C, 0xC213, 0xA301, 0x8C26, 0x9C86, 0xBE4A, 0xA499, 0xA4A1, 0x8A76, 0xA26A, 0xA0B7, 0xA0B8, 0xBF7B, 0x9F43, 0x9B26, 0x95CD, 0x8B93, 0xC512, 0x9001, 0xC5B2, 0xCEA1, 0xB37A, 0xC9DA, 0x893A, 0xD05E, 0x8609, 0xC979, 0xC0E3, 0x8EED, 0xA515, 0xC1DD, 0xB4B6, 0x8976, 0x9587, 0xA93C, 0xD570, 0x95CE, 0x9EEF, 0x964B, 0xB4B8, 0xB6EA, 0xB633, 0x8B97, 0x8C24, 0xD0CF, 0xBC8E, 0xBC82, 0x882B, 0x8C14, 0xB6EB, 0xB0AD, 0x8D9C, 0xB7E6, 0xA2ED, 0xC981, 0x8EC2, 0xD251, 0xAF8A, 0xA495, 0x9DB2, 0xBBD7, 0xB56B, 0x955D, 0xC45C, 0xBB3D, 0xB7DC, 0xA003, 0xACD3, 0x91E8, 0x8C6A, 0xAFAA, 0xB86F, 0xBCD6, 0xD07E, 0xBD7E, 0xB00A, 0x857A, 0x8DC3, 0xA6A9, 0xBDB9, 0x99D7, 0xD2E5, 0xC04A, 0xC3C7, 0xB353, 0xC1DE, 0xB3F3, 0xBE72, 0xD1A1, 0x91E9, 0xC580, 0xAFA3, 0xB5FB, 0x894A, 0xD090, 0x95A8, 0xC270, 0x920C, 0xB90D, 0xA2BE, 0xB90E, 0xBA9B, 0x8560, 0xC982, 0x87B1, 0xB6EC, 0xBD1F, 0xB7A6, 0x89BA, 0xBCA1, 0xA0BA, 0x8B7D, 0x8C4E, 0x97D9, 0x87EB, 0x93A7, 0xBAF4, 0x8F76, 0xB30C, 0xBBDE, 0xD09B, 0xA72A, 0x8AAB, 0x8B08, 0x9711, 0xA9BD, 0xAAA3, 0xA93F, 0xD573, 0x94D8, 0x9A1C, 0xD091, 0xB3F6, 0xBDAB, 0x9A57, 0x8D69, 0xADFC, 0xAD48, 0x9E7A, 0x9758, 0xCC8B, 0xD272, 0x84EC, 0xD2FB, 0xAF06, 0xAAF9, 0x89CD, 0xA35B, 0x8BCF, 0xB911, 0xBFAA, 0x9EFB, 0xAD3D, 0xAD43, 0xD16A, 0x8979, 0xB354, 0x877E, 0x9EAA, 0xC986, 0x9652, 0xB355, 0xA7B4, 0x9C3E, 0xCC27, 0xA1C5, 0xB181, 0xB180, 0xA561, 0x9137, 0xC495, 0xB756, 0x9797, 0xCFAE, 0xCB3F, 0xC43D, 0x8AAD, 0x8AAE, 0xB79A, 0xAE48, 0x9984, 0xBB68, 0x9856, 0x9741, 0x8DC8, 0xD5F6, + 0xAECF, 0xA80E, 0xD222, 0x9B35, 0xD472, 0x9F02, 0x9CCD, 0x88E9, 0xBD63, 0x8E4E, 0x8A54, 0x8805, 0x8A47, 0xA1C6, 0xC51B, 0xA78D, 0x864E, 0x946D, 0xB44A, 0x8806, 0x8DA0, 0xD4CB, 0xD451, 0xC02F, 0xB219, 0xB4B9, 0x9134, 0xAED0, 0x9A3F, 0xC586, 0xA94E, 0x9F03, 0x8D4F, 0xBCDD, 0x985E, 0xB44B, 0xC203, 0x9E0B, 0x950C, 0xCCB2, 0xA5EB, 0xAE36, 0xA98C, 0xB89A, 0xD4CC, 0xD01E, 0xB21B, 0x8CB0, 0x9C51, 0x8E8B, 0xB80A, 0x88EA, 0xB4DE, 0xB4DC, 0x9AC6, 0x9F4C, 0xB49A, 0xA39C, 0x8E3C, 0xC587, 0xCA0B, 0xB131, 0x8856, 0x8513, 0xA184, 0xCA0C, 0x91F7, 0xABF1, 0xBBEC, 0xAC3A, 0x9CCE, 0xBD04, 0xD4D5, 0x8ECB, 0xC636, 0xA51E, 0x888B, 0xA14B, 0xC9E0, 0xB754, 0xCA1B, 0xCA17, 0xAEA8, 0x9BF7, 0x9F8B, 0x87B5, 0xAF39, 0x958F, 0xD30D, 0x9F89, 0xA485, 0xAD4F, 0x9E64, 0xC58E, 0xA7D7, 0xBD24, 0x8561, 0xBBEE, 0xA950, 0xAA4A, 0xB68A, 0xD30E, 0xB002, 0xC951, 0xA5ED, 0x888C, 0xBAA9, 0x8D55, 0xAED4, 0xC46B, 0xA25E, 0x9BD4, 0xA6CC, 0xA4AA, 0x9AA9, 0xCC78, 0xA967, 0xA919, 0xB35D, 0xB35E, 0xCFB0, 0xB363, 0xA4FF, 0xC416, 0xCC42, 0xABB2, 0xB677, 0x897D, 0xCC79, 0x8D52, 0xC592, 0xB917, 0xAA95, 0xABB5, 0xAC45, 0x8B14, 0xCFB2, 0xAA30, 0xBD25, 0xD5CA, 0xA6E2, 0x8F93, 0xC04F, 0x8E8E, 0x9F12, 0xA21E, 0xA524, 0xA6E8, 0xAE38, 0xD233, 0x9787, 0x978B, 0x9C2D, 0xC7B5, 0xB20C, 0xB20D, 0xBA6A, 0xA2CE, 0xCCEA, 0x94CE, 0xCAA1, 0x95F9, 0x94E8, 0x8574, 0x92DF, 0xD22A, 0xB1EF, 0x8F83, 0xA362, 0xAD07, 0xC28F, 0x96A7, 0x98CC, 0x8909, 0xC550, 0xAC54, 0x8C0C, 0x959A, 0x8F23, 0xC6DA, 0x9F1E, 0xAD0A, 0x8A70, 0xA0D9, 0xD19A, 0x9165, 0xCDD7, 0x8B59, 0x84E1, 0x8569, 0xC6DB, 0x9F1F, 0x9166, 0xA726, 0xAF00, 0x86B0, 0x8A06, 0x8F9A, 0x915C, 0xCB1A, 0x9504, 0xB7CB, 0xA309, 0xC8CD, 0x912F, 0x9C2E, 0xBF58, 0xC556, 0x9168, 0x9EF5, 0xA076, 0xC92E, 0xC3AB, 0xAD10, 0xBADE, 0x8469, 0xB409, 0x846A, 0xD223, 0x8F31, 0xD1EB, 0x93EB, 0xBAE5, 0xA78E, 0xB58A, 0xC65A, 0xCAB6, 0x9F05, 0xB89B, 0x9F06, 0xD4D6, 0xCB60, 0xA72F, 0x86F1, 0xA638, 0xC560, 0xC561, 0xC1AD, 0xC75B, 0xB27D, 0xB285, 0xD098, 0x8799, 0xA1E3, 0xD099, 0xD09A, 0x9304, 0x8579, 0x857B, 0xA4F3, 0xCDEA, 0xA505, 0xC167, 0x9090, 0xB97B, + 0xA7B2, 0x9D7B, 0x99D2, 0xC579, 0x9D80, 0xCDDE, 0xD1A2, 0x9F25, 0xC219, 0xBF5A, 0x90AB, 0x9FBF, 0x8B4E, 0xCBC1, 0x945C, 0xB3C2, 0xD0C8, 0xB59A, 0xD4B7, 0xD0CD, 0x90FC, 0xD4C3, 0xBB55, 0xC5EB, 0xD4C7, 0xD4CD, 0xB49B, 0xA7F4, 0xD4D7, 0x8C1E, 0x910A, 0xD3DF, 0x92BB, 0x9FA6, 0x986E, 0xCD71, 0xB9B8, 0xB077, 0xCD05, 0xADD9, 0xB033, 0xB286, 0xD0A9, 0xAB52, 0xA9FB, 0xB078, 0xB0E7, 0xA88F, 0x93DE, 0x92D9, 0xC72B, 0xA02D, 0xA02E, 0xAEA0, 0xD5A9, 0xD142, 0xCAAF, 0xA896, 0xB8D5, 0x9E3B, 0x9210, 0xCAB4, 0xB2AB, 0xD304, 0x9272, 0xB167, 0x9273, 0xD0BE, 0xA3B1, 0xBC77, 0xCDBE, 0xC23D, 0x9CD3, 0x9CE4, 0x9CF4, 0x9BEF, 0xB6D2, 0x8E52, 0xA0CF, 0xD286, 0xCFE5, 0xC569, 0xBE94, 0xC79D, 0xC6C7, 0x94AE, 0xA497, 0x9510, 0x9841, 0xBCF4, 0x8F53, 0xC68D, 0x89AE, 0xB9DF, 0xA3DB, 0xC918, 0xB9E4, 0xC0D3, 0xACE8, 0xACE9, 0xBFD4, 0x8C73, 0xC264, 0xCF2A, 0x8616, 0x84D6, 0xD030, 0x8586, 0x9F59, 0xA445, 0xB97C, 0x9A10, 0x92D4, 0x9895, 0x9788, 0x89D5, 0xC700, 0xAD1C, 0x9BAC, 0x932B, 0xB4A5, 0x99B4, 0xCAE5, 0xC2BB, 0xC5E1, 0xC84B, 0xD031, 0x92D5, 0xBD29, 0xB965, 0xA15D, 0xC923, 0xCFAC, 0x87CE, 0xC60C, 0xCC95, 0xC73D, 0xB1F0, 0xD1C3, 0xA839, 0x8C75, 0x9896, 0xABCA, 0xD5FA, 0xAD68, 0x8739, 0xC6D0, 0x9BAD, 0xD12C, 0xD57B, 0xBA2C, 0xBA2D, 0xCDFB, 0x9311, 0x901E, 0xAB67, 0xAEAF, 0x8A03, 0xC19B, 0x9054, 0x846E, 0x87CF, 0x84D7, 0xD392, 0xA8E2, 0xC450, 0xA3DF, 0xBEB2, 0x8A23, 0xB9EE, 0x9B04, 0x9B05, 0xC703, 0xA404, 0xA390, 0x9EE8, 0x9FF9, 0xD2C1, 0x9FFA, 0xB8C1, 0xBF1F, 0x997F, 0xC8C2, 0x94C3, 0xC4D2, 0xB852, 0xC540, 0xC9F6, 0xCF5B, 0x9B20, 0x9827, 0x9845, 0xA249, 0xC089, 0xC482, 0xA446, 0xD396, 0xC2CE, 0xB99F, 0xB9A0, 0x8860, 0xD162, 0xD163, 0xC297, 0x9849, 0x9B68, 0x989D, 0x8A71, 0xC08F, 0xBE84, 0xD4C4, 0xD5DA, 0xD386, 0xB235, 0xA051, 0xC2E5, 0xB882, 0xAEA1, 0xC2E6, 0xB4D7, 0xB2E7, 0xA032, 0x977D, 0xD220, 0xCB1B, 0xD2DE, 0x84C1, 0xC095, 0xA7E6, 0xA774, 0x89DC, 0xC0C5, 0xC541, 0xCFB5, 0x92FA, 0xC70F, 0xC737, 0xCA7D, 0xC3C8, 0xCF64, 0x9B2A, 0xC6C1, 0xACF5, 0xA40E, 0xC9D3, 0xCC96, 0xBAB5, 0xC148, 0xBAB6, 0xB4DB, 0xAB7C, 0xAE20, 0x9DFF, 0xAF98, 0x84CE, + 0xC92F, 0x8C79, 0xC987, 0xBCB1, 0xB238, 0xAD2A, 0x9EFC, 0xA27D, 0x9574, 0xC1EE, 0x8A14, 0xB30D, 0x98A4, 0xC8D9, 0xA6B1, 0x8487, 0x9D05, 0x9D0F, 0xABEA, 0xCFB6, 0xC5BE, 0x98A5, 0xADD3, 0xAD81, 0x8D04, 0xAEBC, 0xD102, 0x9B83, 0x85F9, 0x9859, 0xC730, 0x8C3A, 0xA792, 0xC407, 0xBD54, 0xA057, 0xB182, 0xA7F5, 0xBFD9, 0xC362, 0xCB53, 0x9D15, 0x9B13, 0x8E16, 0xCA07, 0xCA08, 0xA6B7, 0xBD3C, 0xBF37, 0xC545, 0x931F, 0xB95D, 0xD14C, 0x988B, 0xCB61, 0xC4EC, 0xC61B, 0xB876, 0x9F08, 0x85FE, 0xA083, 0xC8E5, 0x848F, 0xCA18, 0xB739, 0xBABF, 0xAC0B, 0xC791, 0xC9C6, 0xB246, 0xA6C4, 0x8A82, 0xA3EF, 0x9017, 0x9018, 0xC9CB, 0x9C08, 0xA9F3, 0xC32A, 0xB703, 0xA8FC, 0xAE37, 0xAA96, 0xAA31, 0xB853, 0xBDA6, 0xC8B3, 0xD3E0, 0xCEDF, 0xCEE0, 0xB56E, 0xC9EC, 0x95CF, 0xCAD8, 0x99B5, 0x98C4, 0xBA8E, 0x88ED, 0x88EC, 0xB986, 0xAB10, 0xD040, 0xD041, 0xBE4B, 0xD5DB, 0x88C0, 0xC6E3, 0x9B74, 0xCBF7, 0xB466, 0x9338, 0xB124, 0xCEE7, 0xCD27, 0xB759, 0xB0A0, 0x8575, 0x9406, 0xA83A, 0x92FE, 0xB59B, 0xB59C, 0xAF91, 0xBEB3, 0xBB37, 0xD1E2, 0xA552, 0xA550, 0xD5CC, 0xAD22, 0x9AD1, 0xC0D5, 0xBFD7, 0x8A26, 0xB25B, 0xB25C, 0xCC20, 0xD552, 0xC0D6, 0xBF38, 0xA559, 0xA572, 0xAC0C, 0xA8FD, 0xADBA, 0xB19D, 0xC169, 0xAD5B, 0x8645, 0xD06D, 0xBACA, 0xBACB, 0xBE06, 0xD3A7, 0xB696, 0x851D, 0xB230, 0x9170, 0x9171, 0x8EB1, 0xA66E, 0xB53A, 0x9C18, 0xA0AC, 0x867F, 0xC674, 0x8ABE, 0x8CE2, 0xB823, 0xB74A, 0xCF84, 0xB5E4, 0xB336, 0xCD6D, 0x94E9, 0xC228, 0x8932, 0xB85A, 0xC79F, 0x927F, 0xC28A, 0xD525, 0xA64D, 0xC637, 0x8894, 0x8D8F, 0xB6B3, 0x874D, 0xBFF1, 0x8F54, 0xD118, 0xAB2D, 0x8AF9, 0xCAD9, 0x94D5, 0x95FA, 0x90E6, 0xCA55, 0xB2DC, 0xBACD, 0x953D, 0xBE9C, 0x9EA0, 0xB85B, 0xC0A5, 0xA4B5, 0xA0C5, 0xAB2E, 0xC919, 0xAACA, 0xACBC, 0xC351, 0xCE94, 0x986F, 0x930D, 0x8605, 0x9F5C, 0x9052, 0x955A, 0xC9A2, 0xC3F5, 0x8BF2, 0x8C74, 0xAFE3, 0xBA87, 0x9A4B, 0xC5E2, 0xAF53, 0xD400, 0x8BC1, 0xBBA9, 0x8587, 0xBBAA, 0x9C79, 0xCEEF, 0x9FF5, 0x963F, 0x9C1E, 0xAB4F, 0xB101, 0x869E, 0xC0C1, 0x84D8, 0x92BF, 0x9340, 0xCAE6, 0x93D2, 0xAE15, 0xC2BC, 0x9A11, 0xC7EF, 0x9094, 0xC5F6, 0xD1C0, 0xC962, + 0xA7E0, 0xB775, 0x91B7, 0xAB8F, 0xD13C, 0x97E0, 0xD23A, 0x8CF6, 0xCF58, 0xD5D6, 0xB97D, 0xBA88, 0xCFE6, 0x8F57, 0xA679, 0xA955, 0x9DE6, 0x8AC1, 0xBBAB, 0xB3C3, 0x937A, 0xAE16, 0xC4F5, 0xC3F9, 0xA373, 0xB1B4, 0xBB8E, 0xC352, 0xD296, 0x96DE, 0xC4F9, 0x9D8A, 0x9D44, 0x9636, 0x940E, 0xAD69, 0xCAF2, 0xC9F2, 0xC9F7, 0xBA2E, 0xAEF6, 0x8686, 0xC00E, 0xCA65, 0xA83B, 0x87D0, 0xAE9E, 0xA491, 0x98C5, 0xB004, 0x9280, 0xD32C, 0x8E04, 0x8CC1, 0xC956, 0x93D6, 0x855A, 0xADA4, 0x94EF, 0xB24D, 0xB664, 0xB70C, 0xBA8B, 0xB8E2, 0xBBAD, 0xD180, 0xC3B6, 0xCD06, 0xB928, 0x9789, 0xC034, 0xD60D, 0xAE19, 0xAF2F, 0xCCD0, 0x8F44, 0xD2B9, 0xD05A, 0x8945, 0x8E58, 0x965B, 0xB213, 0xA0D4, 0x84DE, 0x940F, 0x9DE8, 0x8818, 0x9189, 0xA2DE, 0xAE0A, 0xD407, 0x8678, 0xA8BD, 0x8966, 0xD089, 0xBB8F, 0xD408, 0xB062, 0xBA23, 0x96DF, 0x8946, 0xC9A7, 0x8AA0, 0xA0D5, 0xBA2F, 0xD23F, 0xA8BE, 0xAB92, 0xA680, 0xB6DA, 0xD08A, 0xCFE7, 0x874F, 0xD0E0, 0xD2BA, 0xA8E3, 0x9075, 0xA958, 0xB7AC, 0xA681, 0xA4E7, 0xCCCD, 0xBAD3, 0xC7A7, 0xBAFD, 0xB300, 0xD192, 0xB250, 0xA68B, 0xCA6D, 0xC4C7, 0xD1E3, 0xA68C, 0xB7FC, 0xA47A, 0xA28E, 0x87C2, 0xB6A0, 0xC551, 0x855B, 0xB6A1, 0x87E5, 0xD4ED, 0x8B9F, 0xCAFD, 0x8CE9, 0xC6BC, 0xD3AE, 0x9E30, 0xD5D7, 0x921B, 0x9230, 0xCE01, 0x9258, 0x9617, 0xA2D2, 0xA582, 0xD0AA, 0xA68D, 0xCB99, 0xC958, 0x98CD, 0x95C7, 0xCAFE, 0xBA33, 0x959B, 0xCF91, 0xAA25, 0x941D, 0x9F65, 0x9929, 0x978D, 0xBDCB, 0x972E, 0xC107, 0xA3E1, 0xB729, 0x84C9, 0x849F, 0xA1B0, 0xCA6E, 0xD4A6, 0xA375, 0xD2C2, 0xB4FF, 0xBF20, 0xB7D9, 0xB7D8, 0x9A89, 0xA11C, 0xA0D7, 0xC77A, 0x918A, 0x8C66, 0xAD9A, 0xCF7D, 0xAFB7, 0xCC17, 0x9F66, 0xA8BF, 0xD0E1, 0xC7DF, 0xB680, 0xD193, 0x8E99, 0xB251, 0xB422, 0x9A4F, 0x9B63, 0x9E8F, 0xD461, 0xC7A8, 0xBC9B, 0xB799, 0xD19B, 0x8607, 0xBEDF, 0xA47B, 0xA070, 0x8822, 0x864C, 0x9424, 0xB769, 0xBF42, 0xA1E4, 0xC2D7, 0xA53E, 0xA8C1, 0x9383, 0xB258, 0xC1D1, 0xA231, 0x9505, 0xBC09, 0xA757, 0xB54D, 0xBF01, 0xCD30, 0xAB96, 0x85A5, 0xA91C, 0xB096, 0xD46F, 0x8F61, 0xC705, 0xBF7A, 0xCFF5, 0xCD4F, 0x96AD, 0x86B1, 0x8F26, 0x9828, 0xD52E, 0xD24D, 0xB6C1, + 0x8622, 0x95EA, 0x9DF1, 0x9AB5, 0xC090, 0xAFA1, 0x9D4C, 0xBEA1, 0x9CF5, 0xC506, 0xA9FC, 0xA3BA, 0xB8CF, 0x891F, 0x9343, 0xBBB0, 0xAC26, 0xC247, 0xA606, 0xBB91, 0x90A1, 0xB4A7, 0xCC87, 0xBC9C, 0xA103, 0xBE08, 0xC5AB, 0xA469, 0xD4C1, 0xBA92, 0x8974, 0x92AE, 0xC139, 0xA071, 0xA60D, 0x87C4, 0xC3E2, 0x93C2, 0xBDCE, 0xD2CD, 0xA4C2, 0xA6F8, 0x9DF2, 0xD4A7, 0xA849, 0xA611, 0xB307, 0x87D6, 0xAA5D, 0x8CFB, 0xB3AD, 0xAC8D, 0xB29C, 0xB29D, 0x88A6, 0x97B4, 0x8981, 0xD166, 0x9305, 0xAFF3, 0x85B5, 0x85B6, 0x9BB4, 0xD54E, 0x8AD7, 0xCFE9, 0x9C91, 0xA6A1, 0xB0A8, 0xCE1A, 0xCE1B, 0x96AF, 0x97B5, 0x907F, 0xBD7A, 0x9534, 0xC0C6, 0x8F6A, 0x8DB9, 0x9289, 0x8AA2, 0xD0E6, 0xB2E8, 0xCE7F, 0xC892, 0xCE1C, 0xB5DF, 0xCB1C, 0xB81B, 0xB6A4, 0x8C6B, 0xA5F7, 0xB25D, 0xD4A9, 0x9432, 0xA2E8, 0xA4C7, 0xD58D, 0xD58E, 0xD143, 0x96EC, 0x9332, 0x9347, 0x8A5B, 0xB4D8, 0xAE8A, 0xC096, 0x97E6, 0xA9AC, 0x9883, 0x9F44, 0xCAB0, 0x8BA3, 0xA141, 0xA122, 0x8AD8, 0xD5FE, 0xA759, 0xB3CA, 0xD26B, 0xD477, 0xC7E3, 0xA105, 0xB110, 0x9EC0, 0xD4C5, 0xD4FB, 0x879A, 0xB0A9, 0x903F, 0x8BF4, 0x89DD, 0xABDA, 0x9A30, 0x9DF7, 0x9754, 0xC387, 0x90BB, 0xB3AE, 0x8ED3, 0x978E, 0x8F9B, 0xAA76, 0xD24F, 0xB620, 0xADDB, 0x9465, 0x95D7, 0xB0CC, 0xB891, 0xCA77, 0xC02C, 0xB936, 0x9178, 0xC9D2, 0x9496, 0xC149, 0xC0E9, 0x9100, 0x9D81, 0xD553, 0x9DB3, 0xCA7E, 0xB970, 0xC33B, 0xC8D4, 0xC898, 0x8C38, 0x9DB4, 0x8C7A, 0xCDDF, 0x98DE, 0xD061, 0xC217, 0xB151, 0x86C4, 0xC967, 0x97C1, 0xC69F, 0xB78F, 0xC930, 0xA4A2, 0xC862, 0x8649, 0x9B2B, 0xA40F, 0x9FB3, 0xA410, 0xBB59, 0x938C, 0xC563, 0xC02D, 0x9C8C, 0x9E3C, 0xADCF, 0xAB7D, 0x8BF8, 0xA37F, 0x99DC, 0xA743, 0xA5F8, 0xBEF4, 0xAE21, 0xCD9B, 0xCD19, 0xABA2, 0x8CFE, 0xC748, 0xC749, 0xC949, 0xD1A3, 0xB152, 0xCA03, 0x9C99, 0x9F74, 0xCA04, 0x8BF6, 0xBB27, 0xCD92, 0x8D2F, 0xC0EA, 0xABA3, 0xBE4C, 0x9C92, 0x9F75, 0xA27B, 0xB523, 0xCC64, 0xB71E, 0x9AE4, 0xA928, 0xA5A4, 0xB5FC, 0xC4B4, 0xB19C, 0xBA0E, 0x94DD, 0xBD31, 0xA517, 0xC19E, 0xCD9C, 0x8A93, 0xA9EC, 0xA143, 0xB948, 0x8BDB, 0xB115, 0xC5B9, 0x9D84, 0xCB36, 0xD0D3, 0x9441, 0xAFAC, 0xAC77, 0xA541, + 0xB6F0, 0x9697, 0x9E49, 0xA144, 0xBCC4, 0xC9B1, 0xD1AB, 0x85AF, 0xB835, 0xCEB1, 0xD535, 0xAD2B, 0xBC1D, 0x9D8E, 0xC988, 0x9F7E, 0x9B12, 0x951C, 0x9306, 0xD092, 0xB381, 0xAAD2, 0xBC8F, 0xCEB2, 0xC5BA, 0xB6F1, 0xB9F9, 0xD254, 0x8D6A, 0xC1A3, 0xBEF5, 0xA89C, 0xB6ED, 0xBD82, 0xB639, 0xD09C, 0xBB5F, 0xB9AA, 0xBCDA, 0xA2F2, 0xC2FA, 0x9692, 0xB264, 0x955F, 0x9560, 0xBC86, 0xB00B, 0xBDBB, 0x95A9, 0x8C7B, 0xD1AC, 0xAF76, 0x9C9E, 0xBB40, 0x964F, 0x8C6D, 0xB3D3, 0x894D, 0xB399, 0x9A65, 0xABA9, 0xC6ED, 0x9540, 0x954C, 0xD4AC, 0xC01A, 0xB428, 0xC95B, 0x8F89, 0x9D85, 0x9E4A, 0xD2F0, 0x8EC6, 0xA8EE, 0x879D, 0xD3BA, 0xB7DA, 0xC342, 0x9C3F, 0xA72B, 0x9B84, 0xCCAD, 0xB3B7, 0x97E8, 0x94DF, 0x94E0, 0xBFAB, 0x9A58, 0xB265, 0xB81C, 0x8D6B, 0xB0B3, 0xCD39, 0x99E2, 0x9E96, 0x9A1F, 0x9AC4, 0x9798, 0xAF07, 0xCB40, 0x954F, 0xA2B7, 0x975D, 0x975E, 0x88F2, 0xAAFB, 0x9FE8, 0xD16C, 0xD467, 0xA5A6, 0xA556, 0x8A7B, 0x8D05, 0xA61E, 0xC669, 0xB4DD, 0xBB13, 0x928C, 0xBF14, 0x9714, 0xD01A, 0xBC24, 0xA5B0, 0xA989, 0xA760, 0xAC7F, 0xA92E, 0x8A2B, 0xBC25, 0xA2F5, 0x8BD0, 0xBD88, 0x875C, 0xA9C3, 0xA0BB, 0xD186, 0xD065, 0xBAA3, 0xD103, 0xAAFC, 0xAD44, 0xADD4, 0xC95D, 0xBEA6, 0xB0B4, 0xD425, 0xB836, 0xC30B, 0xB604, 0x992E, 0x9DBE, 0x8D06, 0x9C40, 0xC839, 0xB3E5, 0xC76E, 0xCC2F, 0x9247, 0xC7B6, 0xD278, 0xB42F, 0xD5CE, 0x8D25, 0xB23B, 0xBAE8, 0x9A59, 0xA43A, 0xD1B3, 0xD5EC, 0xCF05, 0xB89C, 0xC30C, 0x8C7F, 0x8FB7, 0x924E, 0x950B, 0xAD4A, 0xC27C, 0xB412, 0xB682, 0xA820, 0xA8A6, 0xB430, 0xC499, 0xB784, 0x928E, 0xD0D8, 0xC01F, 0xA589, 0xCF3F, 0xBB2C, 0x9138, 0x8AB0, 0xBD8C, 0xAC01, 0xA12E, 0x8AE8, 0xBC2C, 0xA207, 0xA208, 0xBD3D, 0x9B89, 0x9C4A, 0xAFA5, 0xC4ED, 0xC030, 0xAF41, 0xB76F, 0xD3BE, 0xBF39, 0xD047, 0x9351, 0xB511, 0xB668, 0x992F, 0xB387, 0x9671, 0xA8C8, 0xA594, 0x9550, 0x8BE7, 0xC363, 0xB9AC, 0xD536, 0xB7CF, 0x9CAB, 0x908D, 0xA03B, 0xA98D, 0x9E59, 0x8C1D, 0xCEBA, 0x8DF0, 0xBAA6, 0x9E83, 0xBD3F, 0xA814, 0xAE3D, 0xCBF9, 0xC346, 0x9B91, 0xB877, 0xD5E3, 0xC732, 0x8AB4, 0x951D, 0xA12F, 0xD5E6, 0xCB62, 0xB49E, 0xB23E, 0xC86A, 0xA5B2, 0x9395, 0x9B52, + 0x8EA5, 0x9D1C, 0xBC6E, 0x8857, 0xB1D0, 0x8AE9, 0x8BFC, 0xD42E, 0x9B92, 0x9CAC, 0x9F9B, 0x9D87, 0xB4DF, 0xBA5E, 0x9E0C, 0xB3EC, 0x8EDB, 0xCAB8, 0x877C, 0xBBB9, 0xB8F8, 0xA815, 0xA6BD, 0x8952, 0xAC0D, 0xCBE3, 0xBDDC, 0xBD06, 0xAC93, 0xB2BE, 0xBFAE, 0x87C6, 0x9BFB, 0x9D22, 0xB35C, 0xAEAA, 0xAF3C, 0xCA47, 0x9567, 0x9E65, 0xCC12, 0xAF79, 0xB4E8, 0xC8A4, 0xB2BF, 0xAC84, 0xD14F, 0x979C, 0x8C81, 0x9C58, 0xA415, 0xB1E5, 0x8F08, 0x8BEA, 0x95B3, 0xAC94, 0xCCF8, 0xD314, 0x9B0E, 0xB35F, 0xA5D6, 0xA5B5, 0xB7AB, 0xA991, 0xA6C5, 0x8D56, 0xAA1F, 0xACDC, 0x9B9E, 0xAFCB, 0xA9F1, 0xD30F, 0x9554, 0x90C7, 0xCEC2, 0xA6CD, 0x9323, 0xD4D9, 0xBBF0, 0xA716, 0x9EB2, 0x8BEE, 0xB4F6, 0xD3C6, 0xA96C, 0xC871, 0xA6D3, 0xD3C7, 0x8A9A, 0x9F90, 0x9200, 0xBBFB, 0x9A6C, 0xAF18, 0xCE5A, 0xA8FE, 0xA4AE, 0x9EDE, 0xC46C, 0x976A, 0xA14C, 0xC532, 0xA877, 0xCC46, 0x9DD8, 0xCC00, 0xCD24, 0xCC7E, 0xC4BD, 0xAF6C, 0x884D, 0x89A3, 0xA506, 0xA14E, 0xBB09, 0xB91A, 0xD5E8, 0x8D29, 0xB60E, 0xB5B5, 0x88E6, 0xA0EA, 0xCE61, 0xAA86, 0xA6E5, 0x8D58, 0xAA32, 0x8E90, 0xA221, 0xC878, 0xA525, 0xA50C, 0xD3E1, 0xA5C3, 0xA667, 0x8554, 0xAE34, 0xCE68, 0xA87A, 0x9737, 0xB3A2, 0x8CE3, 0x9A74, 0xC5E3, 0xCD6E, 0x9A75, 0xB339, 0xAFC0, 0xC690, 0x8A1B, 0x8C09, 0xB304, 0xA286, 0xCAFF, 0xA1DF, 0xC381, 0xC6D3, 0x98B5, 0xCE0C, 0xA428, 0xA539, 0xA3BB, 0xBB39, 0xC2D8, 0x845E, 0xCA3A, 0xB25E, 0xC69C, 0x8B45, 0xB4B7, 0xA3BC, 0xA29E, 0xA3BD, 0xA2A0, 0x8C39, 0xB847, 0x96C0, 0xCBA9, 0xC5EC, 0xC564, 0xCD9D, 0xB3B3, 0xC515, 0xCA09, 0x9589, 0xC236, 0xBD64, 0xA00C, 0xAFC5, 0x99C7, 0xBE4F, 0x9A76, 0xC6A9, 0xB086, 0xC364, 0xC55E, 0xC6AD, 0xC30D, 0xC30E, 0xA730, 0x8C1F, 0xCB63, 0x91FE, 0xCDB5, 0x8CB2, 0x9A7E, 0xD282, 0xD224, 0x8CDD, 0x8874, 0xC265, 0xB27E, 0x8877, 0x8878, 0xC05E, 0xA15E, 0xB373, 0x8B24, 0xB802, 0x8B46, 0xB806, 0xD345, 0xBC63, 0xBC64, 0xA6B2, 0xD01B, 0xCDA8, 0xA6B8, 0x9765, 0x8DF5, 0x91BF, 0xBB78, 0x9D98, 0xD157, 0xAD61, 0xAD62, 0xC9A3, 0xAD63, 0x8D39, 0xC90A, 0xBE7E, 0xB980, 0x8E05, 0xB8AE, 0xC6D4, 0xC7CB, 0xBA8F, 0x88B6, 0xA1E5, 0xB172, 0xB326, 0xB54E, 0xBC0A, 0xB4D5, 0xCF4B, + 0xA73C, 0xCB1D, 0xBF59, 0xD26C, 0xC9FE, 0x88B9, 0x9BB5, 0x8E33, 0x9C93, 0x9009, 0xD1AD, 0xCF4F, 0xC19F, 0x8BCB, 0x87B2, 0xBE50, 0xA00D, 0xB8B8, 0xCBE0, 0x8FCC, 0xA0E2, 0xA43B, 0x8D5D, 0xCB54, 0x8E3D, 0x90F0, 0x9E84, 0xA74B, 0x87B7, 0x90C8, 0x9DD2, 0x9DD9, 0xBA83, 0xAFC1, 0x90FB, 0xD409, 0xCB9A, 0xB4ED, 0xCB0C, 0xB82B, 0xA300, 0xB445, 0xC97A, 0xC7D1, 0x8FB1, 0x9B75, 0x9B76, 0x966B, 0xB63C, 0x9C3A, 0xCB41, 0xAFC6, 0x9B51, 0x9107, 0xCA48, 0xC537, 0xC23E, 0x9705, 0xADA5, 0xABB7, 0xABB8, 0x846D, 0x9F96, 0x90B7, 0xCE32, 0x867D, 0x8695, 0x86A3, 0xB104, 0xB105, 0x86A9, 0x8995, 0xAB4B, 0xAB4D, 0xAB4E, 0xB102, 0xA7B7, 0x9D45, 0xD0A8, 0xB7AD, 0xADC4, 0xC029, 0xC7A9, 0x9231, 0xB6E2, 0xC453, 0xA11D, 0xADA6, 0x9882, 0xB54F, 0x90A2, 0xAFBB, 0xBD4F, 0xB06A, 0xA123, 0x915D, 0x8D82, 0x8670, 0xB7C2, 0xB7C3, 0xAB7E, 0xB7B1, 0xBA9C, 0xBA9D, 0xC038, 0x98DF, 0x9E3D, 0xBCDB, 0xB7C5, 0xA9EF, 0xADA9, 0xA623, 0xBF3A, 0xB6F8, 0x8A0A, 0xB23C, 0xA9E9, 0xD0BA, 0xB7F7, 0xD0BB, 0xAC0E, 0xA992, 0xB5B6, 0x901C, 0xBA12, 0x8F39, 0xACE2, 0xA1CE, 0xABF2, 0xB2EF, 0xB17F, 0xAE01, 0xB2F1, 0x8EB2, 0xC3F4, 0x8C2C, 0x932C, 0xC91D, 0xAE71, 0x87B0, 0x9410, 0xB929, 0x9055, 0xB4BE, 0xB301, 0xCB9B, 0xC2CF, 0x9805, 0xC945, 0x84A0, 0xC817, 0xA317, 0xB4C5, 0xC81D, 0x905E, 0x8E63, 0xAA17, 0xB4D9, 0xC94C, 0xCF36, 0xCF3A, 0xBB1B, 0xBB1A, 0xD21A, 0x87BF, 0xCCC5, 0x8E92, 0xBB1C, 0xA59D, 0xAEAD, 0xBFE8, 0x92A3, 0x976D, 0xBED8, 0xD235, 0xB53D, 0x8793, 0xD02F, 0xAC99, 0x8D4E, 0x9B57, 0x8FC0, 0x983C, 0x8958, 0xCEEA, 0x8C41, 0xC074, 0x92A6, 0x8DF8, 0xC2B4, 0xBFEF, 0xAB2A, 0xB53B, 0xB2F2, 0xB888, 0xB19F, 0x983F, 0xB331, 0xC223, 0xC224, 0xC7C4, 0xBB7F, 0xB742, 0x9613, 0x9E72, 0x8B19, 0xC225, 0xBF94, 0xA0C4, 0xBD66, 0xD239, 0xD28C, 0xB337, 0xAC64, 0x967A, 0xC0B4, 0xA04B, 0xA04C, 0xB773, 0xA22A, 0x9951, 0xBD0C, 0xB615, 0x9C76, 0x8730, 0x8731, 0x9511, 0xC1D8, 0xD323, 0xB028, 0xC64D, 0xA1D2, 0x99F6, 0xAF4D, 0xB2F5, 0x933F, 0xC6CA, 0xC6CD, 0xB4B3, 0xCA56, 0xC20B, 0xCF27, 0xCE93, 0x987A, 0xC87E, 0xB94E, 0x8A66, 0x8E55, 0xCCFE, 0x9144, 0x9A0B, 0x9BE1, 0xB24A, 0xADBE, 0xAF50, + 0xAB8D, 0x8DD0, 0xAC9B, 0xAC65, 0x8B76, 0xB029, 0x8683, 0xB824, 0xD28D, 0xB073, 0xB018, 0xD47C, 0xCF79, 0x9626, 0xA88A, 0xAB8E, 0xD006, 0x9377, 0xAFDA, 0xA674, 0xAA50, 0x88D3, 0x9378, 0xC0FF, 0x9A0C, 0xAD64, 0xABC9, 0xBACE, 0xA13C, 0xCF7C, 0xBFF6, 0xC00A, 0x9183, 0x98C1, 0xA67A, 0xAC51, 0xCA5B, 0x9249, 0x930E, 0xCD02, 0xBE65, 0xD2B0, 0xD137, 0x9659, 0xD0A7, 0xC84C, 0xBB4E, 0xA3DD, 0xA095, 0xA0F1, 0xC59C, 0xB53F, 0xCAE7, 0x9D42, 0xD329, 0xB5E8, 0x8812, 0x9B5A, 0xAC67, 0x863C, 0xD008, 0xD3CC, 0xA5A0, 0xCCED, 0x965A, 0x9956, 0x94ED, 0x9261, 0xAB65, 0xBB89, 0x99B6, 0xB092, 0x8CDF, 0x92A7, 0x8B1E, 0xBC01, 0xAF45, 0x8A9E, 0xA836, 0xB057, 0x87F1, 0xB2F9, 0xBB85, 0xAE7E, 0xA119, 0xC777, 0xD401, 0xB97E, 0xA5E1, 0xC73C, 0xA1D4, 0x9407, 0xB019, 0xAD05, 0xBD10, 0xC909, 0x9CC2, 0xCCC9, 0x9708, 0x8664, 0xC762, 0xA8E0, 0xA956, 0x8E56, 0xAA98, 0xC59D, 0xB1D6, 0xD009, 0xA022, 0xCBC3, 0xD361, 0x9F61, 0xC9F3, 0x9B1D, 0x9B44, 0xCF9F, 0x8AC9, 0xCB94, 0xC104, 0x99A4, 0x9E29, 0xC924, 0xA7C1, 0xBB92, 0x9CE5, 0x9218, 0xC629, 0x9411, 0xB79B, 0xB7FB, 0xD297, 0xCC05, 0xC248, 0xC353, 0xA2D1, 0xD3AC, 0x9EA2, 0xAA9A, 0xAA9E, 0x84C7, 0x9076, 0xBE3F, 0xAD99, 0xA5E2, 0xCA33, 0xAC53, 0xB5E9, 0x9FC4, 0xB1F1, 0xC130, 0xC539, 0xC5A2, 0x995B, 0xC6D1, 0xBC03, 0xA3C7, 0xBDC9, 0xB460, 0xA157, 0x922E, 0xD362, 0xB74B, 0xB1B5, 0xC7A3, 0xC650, 0xD2BB, 0x972C, 0x9A86, 0xAD1E, 0x9BD7, 0xC042, 0xB325, 0xAFFA, 0xC22B, 0xB57B, 0xA88D, 0xCAF3, 0x9D46, 0xA065, 0xB393, 0x9E76, 0x9EBB, 0xD18D, 0xB9B9, 0xD4B8, 0x8907, 0xB0CF, 0x9B5C, 0x9CE6, 0xA88C, 0x89B0, 0x9BBB, 0x99F8, 0xAF5D, 0xC7A4, 0x9FF7, 0xA7C5, 0xB547, 0xC133, 0xD181, 0xA24A, 0x9825, 0x85A6, 0xAB36, 0xD4BA, 0xCD09, 0xC2D0, 0x881D, 0x909C, 0x9AB1, 0x9960, 0xCB00, 0xB233, 0xCC86, 0xA514, 0x989B, 0xA55C, 0x9837, 0xA654, 0x95D3, 0x941E, 0xC249, 0xA73B, 0x8C87, 0x93A3, 0xCB01, 0xCE02, 0xBF21, 0xA56A, 0x97FC, 0x9FFB, 0x9D4A, 0x8B78, 0xA09A, 0xABBC, 0xBC43, 0x8AA3, 0xB079, 0xC483, 0xB968, 0xBF76, 0xA474, 0xB1A5, 0xAEF8, 0x9846, 0xA029, 0xC4FF, 0xB906, 0xAECB, 0xBF64, 0xCCD1, 0xC552, 0xC427, 0xBF00, 0x91A3, + 0xBC04, 0xBFD5, 0xA196, 0x8920, 0xBE42, 0xA68E, 0xBB1F, 0xBB93, 0xA5E4, 0xBB20, 0xBDB1, 0x90B8, 0xA58C, 0xA4BB, 0xA6F5, 0xC108, 0xC1F8, 0xCF2F, 0x9AB2, 0x8F24, 0x9924, 0xB780, 0x9E31, 0xD10C, 0xB7FD, 0x9425, 0x970C, 0xC640, 0xBA77, 0xBAFE, 0xC7F6, 0x8CA6, 0xD10D, 0xC9FB, 0xA34A, 0xC091, 0x9829, 0xBFFD, 0x905B, 0x98D2, 0xC1FB, 0xA104, 0xB907, 0xA758, 0x9BB1, 0xBCD5, 0xD4A8, 0x8FAE, 0xB462, 0x8EE4, 0xA1B4, 0xD4F3, 0xC2D9, 0xC53C, 0xB291, 0x9687, 0x97E2, 0x984A, 0xA7E5, 0xBD9E, 0xD36B, 0xB0C8, 0x989E, 0x89D8, 0xBA93, 0xB259, 0x92C2, 0x8B26, 0xA9A5, 0xAE5F, 0xA11E, 0xBDCF, 0x8D1B, 0xA5E5, 0xD183, 0xB1BC, 0x92F9, 0xBBB3, 0xBE83, 0xB136, 0x8E5F, 0xCE0D, 0xAE87, 0xCD60, 0xA9A6, 0x9517, 0xAC6E, 0xA072, 0xA84A, 0xAA5B, 0xCBD1, 0x8D80, 0xB5A1, 0x9A64, 0xCE0E, 0xAECD, 0xB933, 0x8753, 0x8C8A, 0x99BE, 0xCE7D, 0xA4C3, 0x9BC8, 0xB4C6, 0xC82C, 0xB395, 0xBE5E, 0xACBF, 0xD29A, 0xCBF0, 0x8823, 0x863F, 0xCE78, 0xC1DB, 0xB78D, 0x92E7, 0xB4C7, 0xCE79, 0xA307, 0x9CF6, 0xB908, 0xCE7A, 0xB7FF, 0xA9A7, 0xD53F, 0x90BA, 0xB292, 0x9E36, 0xB992, 0xB137, 0xC2DA, 0xCD84, 0xCE7B, 0xB957, 0xB96A, 0xB710, 0x9ABD, 0xD3EC, 0x9DF8, 0xAF97, 0xCD62, 0xB555, 0xBEF0, 0xB5A2, 0x90EC, 0x9387, 0xD05F, 0x8826, 0xC214, 0xC1FC, 0xBE17, 0xC0E4, 0xC19D, 0xB72C, 0xC5B3, 0x8912, 0xC177, 0x98D3, 0x953C, 0xC893, 0x9968, 0xC746, 0xAC59, 0xA30A, 0xAB53, 0xCC1E, 0xC894, 0xCD15, 0x9942, 0xACC0, 0xB99D, 0xABBF, 0xCF94, 0x9BBD, 0xAE0D, 0x977E, 0x8B5D, 0x91E1, 0xAFFB, 0xAB9D, 0xA73F, 0xB308, 0xB309, 0xAB9E, 0xBE6F, 0x8D2E, 0xC111, 0x88B1, 0xBF9E, 0xACA6, 0x9B6C, 0x8827, 0xC6C0, 0x9C94, 0xB089, 0x9DAA, 0x9DF3, 0x99D8, 0x93B4, 0xC4B0, 0xCB1E, 0xCC08, 0xD0E7, 0xB9F1, 0x9F45, 0xD19E, 0x9AE1, 0xBD5D, 0xCD93, 0x86BB, 0xAD0D, 0xB9BE, 0xBF67, 0xB98A, 0xCCD6, 0xA124, 0x9080, 0xBFB6, 0x9EF0, 0x9EF6, 0xB556, 0xC830, 0xBD68, 0xA8EC, 0x9BF0, 0xCEA2, 0xAE27, 0x859A, 0xCD34, 0xB5F5, 0xD463, 0xA775, 0x8982, 0xC431, 0x8C8C, 0x9900, 0xD4FC, 0xC06A, 0xB9BF, 0xAB07, 0xCC5F, 0xA49F, 0xA42D, 0x9388, 0x9E3E, 0xC6E4, 0xA925, 0xC112, 0x94D9, 0xC3C4, 0xCC60, 0xB1DA, 0xA004, 0x9791, 0xBD7F, + 0xCEAC, 0xBCB2, 0xCEAD, 0xA6FF, 0xC9AF, 0xABFC, 0xD49D, 0x8ADF, 0xA31C, 0xBD15, 0x8DDA, 0xC04B, 0xA887, 0x962B, 0xB7E7, 0xAD27, 0xD060, 0xB9F5, 0xCB29, 0xAA6B, 0xAAC0, 0xB237, 0xC0EB, 0xA6AA, 0xCF95, 0xC2A2, 0xC2F4, 0xC1A0, 0xB3CE, 0xD013, 0xB9C1, 0xBC16, 0x8467, 0xB497, 0xBBD8, 0xCF37, 0xC67F, 0xCBAA, 0xB6EE, 0x9BCA, 0xBC17, 0xBCBA, 0xAEB9, 0xBCC5, 0xB9C2, 0xB74E, 0x845F, 0xB021, 0x8C15, 0x8BD7, 0xB02D, 0xC1EC, 0x88DB, 0xACD4, 0x95A6, 0x8F88, 0x98A1, 0x9B11, 0xC38C, 0xD4FD, 0x8F2A, 0xD2E6, 0xCC28, 0x9469, 0x9F76, 0x9A3C, 0x958A, 0xD532, 0xBDBA, 0xBDF6, 0xBC48, 0x86C5, 0x9F21, 0x9B77, 0x97A8, 0xCBD6, 0x954A, 0xBB01, 0xD2DF, 0xC8D5, 0xB90F, 0xAB09, 0xCC65, 0x8C8E, 0xA9B3, 0xA529, 0xAA28, 0xC557, 0x879B, 0xBD20, 0xCE26, 0xC676, 0x9A1D, 0x86C6, 0x8758, 0xD2F1, 0x9EAB, 0xA369, 0xB973, 0xB8B5, 0x8F16, 0xAC78, 0x84E8, 0xA987, 0x99FD, 0x99C4, 0xCCF1, 0x89BB, 0x92B5, 0xCCAC, 0x97AB, 0xAB0A, 0xB4E6, 0xCDA3, 0xB163, 0x9D06, 0xC7FB, 0x8A29, 0xB266, 0xC35D, 0x9D07, 0xA9BE, 0xA940, 0xA8EF, 0x9FE3, 0x97DA, 0x8D1E, 0xA946, 0xD276, 0x94E1, 0xB3E6, 0xA615, 0xC89C, 0x88F0, 0x9F26, 0x8CFF, 0x8C91, 0xBFAC, 0xAFDC, 0xBDF5, 0xC9E8, 0xC33F, 0xAC79, 0xBD83, 0xAD7A, 0xB8B6, 0x9857, 0xA700, 0xA518, 0xC04C, 0x8B31, 0x94F9, 0xB0AE, 0xC72F, 0xCA3E, 0xAB18, 0xD544, 0xAB45, 0xA2B6, 0xAAA4, 0xB09B, 0xBAE3, 0xD10F, 0xD0FD, 0x8B89, 0xC6EE, 0x9AC2, 0x9BDF, 0x9E4B, 0xC836, 0x8C56, 0xA785, 0x8D71, 0xBE22, 0xC95C, 0x9E7D, 0x8D1F, 0xCC8D, 0x9972, 0xC5FA, 0xBAE4, 0x9712, 0xCC67, 0xC516, 0x8D20, 0xA457, 0xC6EF, 0xA746, 0xD2F2, 0xC116, 0xB13D, 0xA1FC, 0x9F2A, 0xB1DC, 0x8E9F, 0x9B85, 0x9F83, 0xC279, 0xAFE9, 0x9CA3, 0xB001, 0xC11A, 0xBC2A, 0xB39C, 0xB384, 0xC395, 0xA9CC, 0xC396, 0xBC95, 0x9152, 0x9AE8, 0xAD16, 0xB783, 0xBC26, 0xA588, 0xD1B1, 0x8D21, 0xCB37, 0xD2FC, 0xC06D, 0xBD22, 0xBD38, 0x8A2C, 0xC7B4, 0xA435, 0xC9D5, 0xB8F0, 0xBF87, 0xD3BB, 0xB79E, 0x9917, 0x86E1, 0xB874, 0x8990, 0x8991, 0xBABC, 0xBF35, 0xB23A, 0xA7F1, 0xC11B, 0xB80F, 0xB808, 0x8AE6, 0xA0A3, 0x8AE7, 0x9A5B, 0x9ECD, 0xA593, 0x8A55, 0x9509, 0x8D92, 0x9985, 0xBB69, 0xBAE6, 0xB0B7, + 0x9832, 0xCF3C, 0xA8D0, 0x9986, 0x9447, 0x98A6, 0x98EA, 0xC43E, 0x9E4F, 0xB875, 0xC397, 0x850E, 0xA98A, 0xA4F0, 0xAF48, 0xCDB2, 0xA813, 0xB996, 0xCFEB, 0x8E82, 0x9AC7, 0xD01F, 0xC5C4, 0xCE44, 0xA65F, 0xBA59, 0xC768, 0xA865, 0xAB1E, 0xD510, 0xCCB3, 0x9B8A, 0x88CA, 0xA749, 0x8FB8, 0xCA13, 0x8511, 0x9A96, 0xD1B4, 0xD0B6, 0xAB1F, 0x8E4F, 0x8E70, 0xCB55, 0xBC6A, 0xB13F, 0xA185, 0xBCDE, 0xB49F, 0x9C4B, 0xD4D3, 0xA70F, 0xAF65, 0x97C9, 0xA011, 0xB085, 0xB80B, 0x9CAD, 0xBC4B, 0xC184, 0x8BFA, 0xBCE4, 0xBBBA, 0xBF0C, 0xB80C, 0xD3F2, 0xA4D7, 0x87A4, 0xA710, 0xAC5E, 0xB9D0, 0xBAE9, 0xAC81, 0xAF49, 0xCC70, 0xCC71, 0xAC09, 0xA017, 0xB2BC, 0x86F2, 0x9D1D, 0x988E, 0xB736, 0xD5D4, 0xC21B, 0xBDC1, 0xCBFD, 0xCBB8, 0x9125, 0x8CD5, 0x9BF8, 0xB4F4, 0xA52D, 0xA259, 0x8475, 0xB229, 0xD4D8, 0xC11D, 0x87A5, 0x969D, 0xB38D, 0xCC72, 0x87A6, 0xA486, 0x9322, 0x88DE, 0xAB88, 0x9E66, 0xC15E, 0xAAAA, 0xCFBB, 0xA9D6, 0xA6BE, 0xCCF7, 0xC952, 0xA990, 0xBBA5, 0xD305, 0xCC9B, 0x90C6, 0xC0CE, 0x9B3B, 0xC5CE, 0xB010, 0xB960, 0x8766, 0x8998, 0xACDA, 0xA8AF, 0x9DCF, 0xB245, 0xB811, 0x8AEB, 0x96A0, 0x87AA, 0x9C02, 0xC49F, 0xA968, 0xB4BA, 0x9866, 0xCC7A, 0xB702, 0xA6CE, 0xA086, 0xC52C, 0xCC7B, 0xBC56, 0xC164, 0xC5D0, 0x9A6B, 0xC77F, 0xD3C4, 0xA8F8, 0xA4DD, 0x9129, 0x92B9, 0x99EF, 0xA4DE, 0xBAAA, 0xA871, 0xCC7C, 0xAC5F, 0x9D31, 0xA74E, 0x9E68, 0xCC43, 0x936F, 0xA802, 0xCB79, 0x9DD6, 0xCF0A, 0x89A2, 0x8E1F, 0xB66C, 0x9E1A, 0xA500, 0x9298, 0xBB16, 0xCE8B, 0xD4DE, 0x939B, 0xB918, 0xA5D9, 0xA501, 0x8D28, 0xB5B3, 0xCCBC, 0xB38F, 0x9264, 0x9719, 0xA219, 0xC8FD, 0x98AD, 0xCC7F, 0xB79F, 0xCFC4, 0xAA33, 0xC8F3, 0xA63E, 0xAC61, 0xB8AA, 0xBD26, 0x8E8F, 0x9F13, 0x89C9, 0xCC81, 0x98B0, 0x8553, 0xD3DE, 0xA532, 0xA50A, 0xAE39, 0xC071, 0xAA37, 0xC7BF, 0xC471, 0xC900, 0x9520, 0xC904, 0xCE6C, 0x9BDA, 0x874C, 0xACD1, 0x9724, 0x8EF0, 0x9B16, 0xC4F2, 0xC4F3, 0x9B17, 0x993B, 0xA82E, 0xCFEF, 0xD44A, 0xA0C6, 0xD085, 0xC59B, 0x8B4F, 0xD4B3, 0xCF8D, 0xCF8E, 0x88C7, 0xC91A, 0xB2FA, 0xD32A, 0x9341, 0xAF54, 0x978A, 0xC1B1, 0xB210, 0xCAE8, 0xA957, 0x8C61, 0xB0DE, 0xA284, 0xB01A, + 0xC84D, 0xA285, 0xB041, 0xADC1, 0x8A33, 0xA7B1, 0xB624, 0xA2C7, 0x9145, 0x9726, 0xC5FF, 0xD2B1, 0x9727, 0x9728, 0xC12E, 0xB3FA, 0x871F, 0x8DD2, 0xC3B7, 0xD1FE, 0xD3CE, 0xA306, 0xD12D, 0x9412, 0x8536, 0xC5A3, 0xC5A4, 0xA886, 0xD4A3, 0xC73E, 0xA15F, 0xBD59, 0xB04B, 0xA098, 0xB04C, 0xBCF9, 0xBCFA, 0x87D1, 0xC944, 0xBF0F, 0xB87F, 0xD40A, 0xD08B, 0x8F98, 0xC105, 0xB9E9, 0xA739, 0x8B56, 0x9B02, 0xD363, 0x99B9, 0xBB36, 0xA528, 0xBEDE, 0x9EE9, 0xC6D5, 0x992A, 0xB618, 0xA7C6, 0x9AB3, 0xC926, 0xC660, 0xC661, 0xC454, 0xCBC6, 0xC22E, 0xD365, 0xC974, 0xBA34, 0xC0D9, 0xBF22, 0xC77B, 0xCF92, 0xA287, 0x993F, 0xA58D, 0xC3BB, 0xD3D1, 0xC736, 0xD200, 0xB1F4, 0xC827, 0x9B47, 0x972F, 0x8A4D, 0x9B21, 0xA2D3, 0x8A6C, 0x9285, 0xB8D0, 0xC9F8, 0x9B64, 0x9B65, 0xBDAA, 0x9FFC, 0xB68F, 0xA7C7, 0xC2DB, 0x9426, 0xA09B, 0x8A4E, 0xB234, 0xBEE0, 0xD4BB, 0xBF02, 0xC080, 0x97FE, 0xB097, 0xA553, 0xB866, 0xC6DC, 0x9384, 0x8B5A, 0xB6E3, 0x99D3, 0xC2DC, 0xBA94, 0x98FF, 0xC783, 0xA385, 0xA1E6, 0xC507, 0xC2DD, 0xC82D, 0x984B, 0xD470, 0xA24D, 0x8F62, 0xC5AC, 0x9C8D, 0xC298, 0xC299, 0xA9FD, 0x982A, 0xC8C8, 0x9AB6, 0xABE8, 0xA11F, 0x8ED0, 0x8628, 0x9348, 0xA81D, 0xA44F, 0x9BC9, 0xBFD8, 0xC2E7, 0x8D83, 0xC24F, 0x9943, 0xA170, 0x9466, 0xC215, 0x9EC1, 0x8CFC, 0x93B5, 0xB1C1, 0xB504, 0xB78E, 0xC2E8, 0xB505, 0xC605, 0x8A1E, 0xC8CE, 0xC8CF, 0xCB1F, 0x9EC2, 0xCE1D, 0x953E, 0xB65A, 0xB111, 0x968D, 0xC0C7, 0xB98B, 0x96C1, 0xB8D2, 0xB8D3, 0xAE72, 0x95D8, 0xC0E5, 0x8A78, 0x9903, 0xA421, 0xD346, 0x9101, 0xC3AC, 0x9B2C, 0x93B6, 0xA744, 0xC710, 0xC611, 0x9AE5, 0x9EF7, 0x9DB5, 0x86C7, 0xCC21, 0xD3EE, 0xC14A, 0xBFA0, 0xB883, 0xC2F5, 0xAF99, 0xAF9A, 0x8986, 0xC833, 0xA09C, 0xA0A1, 0xCE27, 0xABD3, 0xB848, 0xC179, 0xD074, 0xA000, 0xB50A, 0xB71F, 0xABA4, 0x9ABF, 0xC6E9, 0xD146, 0xC0EC, 0x928A, 0xB55A, 0xBC65, 0xC931, 0xA7CE, 0xD3EF, 0x9F48, 0xCFF8, 0x96C2, 0x85CB, 0x99DD, 0xCF16, 0xAE22, 0xBA48, 0xA777, 0x8710, 0x9650, 0xBFCD, 0xBD84, 0x8A35, 0xB872, 0x920A, 0x8832, 0x9B0B, 0xC583, 0xC391, 0xC2A5, 0xC2FB, 0xCF18, 0x98E6, 0x9905, 0xC2FC, 0xCF3B, 0xC656, 0xADFB, 0xB885, + 0xB50B, 0xC9BF, 0xC786, 0xAC7A, 0xA704, 0xCC68, 0xC271, 0xB6F2, 0x9620, 0xC8DA, 0xB3FC, 0xA888, 0xC2FD, 0x86D6, 0x875D, 0x8D07, 0xA9C4, 0x9DBF, 0xBAB2, 0xCB42, 0xA92F, 0xB0B5, 0xBC4A, 0xCB43, 0xBF15, 0xA1FD, 0xD558, 0xCF68, 0x9A20, 0xCA86, 0xD2FD, 0x84ED, 0xC17D, 0xA8C5, 0x985A, 0xAFC7, 0xB690, 0xA0A2, 0xAB1D, 0xA45B, 0xB8B9, 0x8D5B, 0xD048, 0x9DC6, 0xC30F, 0xC310, 0xC311, 0xCB44, 0xC55F, 0x8B6C, 0x9AEB, 0x89C0, 0xCA0A, 0xC7B7, 0xB65E, 0xC8E0, 0xC7B8, 0xB413, 0xA258, 0x8EF5, 0x9153, 0xB93F, 0x9ED0, 0x9352, 0xBB6E, 0xA793, 0xCE45, 0xA7F6, 0xA0A4, 0xB8DB, 0x9353, 0x928F, 0xC8E1, 0xC7B9, 0xA52A, 0xABC3, 0xBDAD, 0xCB56, 0xA0A5, 0xABEB, 0xA058, 0xA059, 0xCC6D, 0xCE46, 0xCB64, 0xC769, 0xA4F6, 0xBD17, 0xCFFC, 0x88CC, 0xBC6F, 0xC317, 0xB63F, 0xD576, 0xA717, 0x9B53, 0xD3D8, 0xC5CA, 0xA86D, 0xC0F3, 0xCB65, 0xC58D, 0xD14D, 0x9B93, 0x8DE3, 0xAF9E, 0x87DD, 0xB73A, 0xC468, 0x990C, 0xC792, 0xA019, 0x8BB6, 0x8EDD, 0xC9C7, 0x990D, 0xA52E, 0x8769, 0xB700, 0xA6C6, 0xAD8E, 0x85FF, 0xB794, 0xAA20, 0xA4AB, 0x84E0, 0xC797, 0xA3F0, 0xBB45, 0xA7A3, 0xA6D4, 0xA96D, 0xA20F, 0xA7AC, 0xC8EF, 0xC32B, 0xC5D1, 0xA8FF, 0xCA1C, 0x88CF, 0xB678, 0xCF0D, 0xA52F, 0x8D2A, 0xA21A, 0x8B8E, 0x971A, 0xA192, 0x8A58, 0xAC43, 0xBDA7, 0xA530, 0xD3E2, 0xA526, 0xA87B, 0x8D61, 0xCE6E, 0xD432, 0xD135, 0xAFE4, 0xD1FB, 0xB04D, 0x8AA1, 0xCE96, 0x847D, 0xC113, 0x9830, 0xA1FE, 0xA20A, 0x9472, 0xC9D7, 0x8548, 0x8FEC, 0xC9DC, 0xC96B, 0xD5B5, 0xBB10, 0x9234, 0xB003, 0x8C53, 0xA2DF, 0xCFCB, 0x900A, 0xB3D4, 0xCCAE, 0xB3ED, 0xB146, 0x8588, 0xB01C, 0x8A22, 0x9DAB, 0xAFF4, 0x90BC, 0x8C4D, 0xCD9E, 0xD075, 0x8711, 0x900B, 0x85B0, 0x8833, 0x8C4F, 0xCD3A, 0xCD3B, 0x90C9, 0xC7EA, 0x8AA7, 0xAF4B, 0xAF4C, 0xB19E, 0xA0AD, 0xAD95, 0xBCBE, 0xADAB, 0xA564, 0xB6B4, 0xAB26, 0x92C0, 0xAB50, 0xADC2, 0x952A, 0xC28D, 0xC8BB, 0x957E, 0x8617, 0xBB90, 0x9E2A, 0x967F, 0xCD4A, 0x9580, 0xB981, 0xADAF, 0x8F45, 0xB33E, 0xB61F, 0xB5EC, 0xD53E, 0xBDE6, 0xC2D1, 0xAB38, 0xA338, 0xB346, 0xC26D, 0x96AE, 0xC2E9, 0xA60E, 0xA612, 0xB208, 0x9C2F, 0x9535, 0xBDE9, 0x8641, 0xB5F6, 0x8C8D, 0x90BD, 0xA171, + 0x9D56, 0x9DAC, 0x938D, 0xB14A, 0xA2EE, 0xA125, 0xA2D5, 0x8BE2, 0xC392, 0x8631, 0xAAA5, 0x9FB7, 0xAAB7, 0xB7C6, 0xC17E, 0xA624, 0x9139, 0xBF3B, 0xB431, 0x9EAD, 0xC318, 0xA6C7, 0x90CA, 0xA7D9, 0xAFF8, 0xB16B, 0x884A, 0xC32C, 0x8B9A, 0xC123, 0xB685, 0x8B9B, 0xB614, 0xB613, 0x8530, 0x92A4, 0xB538, 0x9CC1, 0x8964, 0xD4B2, 0x84C4, 0x957A, 0xD46C, 0x973A, 0xAABB, 0xCCFF, 0xA2C5, 0x880F, 0x999E, 0xC80E, 0xCBBF, 0x926A, 0xD46D, 0xCF47, 0xA3CD, 0xAF51, 0x8F1D, 0xA3CE, 0xD34E, 0xADBF, 0x8612, 0xB0DF, 0xA11B, 0xCA5C, 0xC60B, 0xB04A, 0xC3B3, 0xC00B, 0x99CD, 0xA837, 0x930F, 0xB0E0, 0xAE9C, 0xC9A4, 0xCD43, 0x9634, 0xC778, 0xA0F2, 0x8E44, 0x8813, 0xA37D, 0xC44F, 0xAF2E, 0x9A87, 0x991E, 0x9EE4, 0x98C6, 0xD13E, 0x9C82, 0xC7C8, 0xB863, 0xBCD2, 0xB6DB, 0xBA73, 0xBF1D, 0xA565, 0x90DA, 0xC3B8, 0xB9BA, 0xA3A5, 0xD1FF, 0xCDFC, 0xBC7E, 0xCD80, 0x86AA, 0xAB37, 0xC2D2, 0xA1B1, 0xA607, 0xC3BC, 0xCBC7, 0xBC35, 0xA53A, 0x861E, 0xD2C3, 0xC851, 0xB82C, 0xA68F, 0x9847, 0xC455, 0xA02F, 0xAFF2, 0x92EB, 0xC508, 0x856A, 0xB293, 0xAE88, 0x8754, 0xCC09, 0xA4C4, 0xA7C9, 0x9DA5, 0xB3C6, 0xA44C, 0xC8D0, 0x97E3, 0xD57E, 0xAC33, 0x89D9, 0xCA34, 0xD2CE, 0xD207, 0xC7F7, 0xAC1A, 0x8892, 0x8D3B, 0xB8F2, 0xA7CA, 0x892C, 0xAA72, 0x99D9, 0xD54F, 0x94AD, 0xC143, 0x9389, 0xC1FD, 0xCEA3, 0xC610, 0xD3B2, 0xAB49, 0xC178, 0x8C35, 0xC48D, 0xBF9F, 0xC81E, 0xAE44, 0xC57B, 0x9D52, 0x9990, 0x870D, 0xCD16, 0xCD1A, 0xAB9F, 0x894B, 0xC983, 0xBC83, 0x882C, 0xAD28, 0x9A3D, 0xCEAE, 0xBBD9, 0xAAC1, 0xCEAF, 0x8DF3, 0xCE33, 0xB9C3, 0x9885, 0xB3CB, 0xCB2A, 0xD1A4, 0x88DC, 0x9889, 0xAB19, 0xA07D, 0x9E97, 0xADA7, 0xD0FE, 0x8989, 0x84E9, 0x84EA, 0x9561, 0x8D6C, 0x864F, 0xA1FF, 0x86E2, 0x86D7, 0x9AE9, 0x886D, 0xA7F2, 0xC6F5, 0xBF36, 0xC9C2, 0xA78F, 0xBB42, 0xC51C, 0xBA7F, 0x9135, 0x9F2D, 0x95C4, 0xA1C2, 0x90C1, 0x9B8B, 0xA3AF, 0xC464, 0xC5C5, 0xBCCC, 0xC465, 0xC78F, 0xAF3A, 0x8716, 0x9BF9, 0xAF78, 0xAC0A, 0xA7D8, 0xAE4A, 0x973C, 0xBA80, 0xA969, 0xBCCF, 0xC4A1, 0xAC41, 0xB66D, 0x9A7D, 0xAE50, 0xAA83, 0xC46E, 0xB2D2, 0xA21F, 0xC727, 0xACC8, 0xD4EE, 0xAA14, 0xA95D, 0xCDEE, 0xBBFE, + 0xC0B8, 0xB539, 0x94B8, 0x9025, 0xA59F, 0x851E, 0x9C19, 0x9952, 0x8F55, 0x8C43, 0x94EA, 0xA0C7, 0xCD6F, 0xB2DD, 0xCD70, 0x8A0D, 0xAABC, 0x9957, 0xC266, 0x93D3, 0xACEA, 0x9FA7, 0xC811, 0x932D, 0xABDD, 0x85B2, 0xCEF0, 0xA1D5, 0xCF48, 0xA1D6, 0xC07B, 0x9D9C, 0xAB90, 0x8E45, 0xB18E, 0xC12F, 0x9A83, 0xC475, 0xB3C4, 0xA83C, 0x8E06, 0xCAF4, 0x84B7, 0xB1B6, 0x8FA9, 0x9413, 0xC728, 0xC354, 0x87F3, 0x8CB8, 0x9637, 0x9D79, 0xB8E3, 0xB1F2, 0x8CBF, 0xA2E0, 0xB665, 0xB982, 0xB92A, 0xBCF0, 0xD5B6, 0x9D47, 0xACEC, 0xB864, 0xA8C0, 0x86A4, 0xD18E, 0xD18F, 0xA1D8, 0x9265, 0xA8E4, 0x9FCB, 0x9F1A, 0x9E32, 0xA690, 0x9730, 0xC3FB, 0xD366, 0x9618, 0xC828, 0xC67A, 0xC927, 0xC6BD, 0xAA9F, 0xBC05, 0xD3B0, 0xB488, 0xCBC8, 0xC7AA, 0x85DA, 0x9232, 0xC4E4, 0xC975, 0xC3BD, 0x992B, 0x974C, 0x8B79, 0xC6D6, 0x8576, 0xB07A, 0xA583, 0x8E7C, 0xCC18, 0x9B22, 0xC1B7, 0x91A5, 0x8AD1, 0xBE11, 0xC26E, 0xC24C, 0x8ACE, 0xA24E, 0xAB97, 0x8623, 0xBF03, 0xC486, 0x8C0E, 0x984C, 0xC72C, 0xC856, 0xB550, 0xC743, 0xA53F, 0xA656, 0xC67D, 0x9427, 0xA890, 0xC7F0, 0xC2DE, 0xA84B, 0xA698, 0x9FCE, 0xA727, 0xBCAC, 0xBCAD, 0x9385, 0xC081, 0x8FB0, 0xB191, 0xD0CE, 0xB803, 0xACF2, 0xCE1E, 0xA106, 0x8A5C, 0xA4C8, 0xACF3, 0xB9A5, 0xC114, 0xBE85, 0x8C12, 0xD4C6, 0x8661, 0x8AA8, 0x99FB, 0xB29E, 0x91EA, 0xA450, 0x89DE, 0xB29F, 0x8662, 0xC097, 0xA9AD, 0x8D1C, 0x96FA, 0xC895, 0x8FC8, 0x8629, 0xA7E7, 0xB48F, 0xB112, 0xAFE7, 0xB3C7, 0xD4AA, 0xB490, 0x9266, 0x9FD0, 0xB506, 0x90DE, 0x9FB4, 0x9B2D, 0xCDE0, 0xAB7F, 0xABA5, 0x8C7C, 0xC711, 0xBE1E, 0xC612, 0x8E13, 0xB712, 0xACF6, 0x9DB6, 0xC14B, 0xB760, 0x9AC0, 0xC581, 0x8C2F, 0x9E00, 0xD44E, 0x8A13, 0xA745, 0xB5FD, 0xC3C9, 0x9102, 0xCED7, 0xC7F8, 0xAE5A, 0x99DE, 0xCC22, 0xCD9F, 0x9AE6, 0xB778, 0xB805, 0xA89D, 0xB9C8, 0xB6F3, 0xBCB3, 0xC989, 0xC1A1, 0xC274, 0xD1AE, 0xA009, 0xCC6A, 0xAAC3, 0xBDBC, 0xA8A0, 0xBD85, 0xA6B3, 0xA542, 0x9755, 0xBE91, 0xB3D5, 0x8D9D, 0xA1F6, 0xD138, 0xC98A, 0x8488, 0x879E, 0xBAA0, 0x89F8, 0xA45C, 0xD43C, 0x8D08, 0x9FE9, 0xCA44, 0x8D72, 0x8D09, 0xB2B4, 0xA61F, 0xA055, 0xCFEA, 0xB561, 0xC731, 0x84EE, 0xA72C, + 0xABE3, 0xD104, 0xCBE1, 0x9A40, 0xCC30, 0xC185, 0xA9D2, 0xC253, 0x8EF6, 0xC681, 0xD049, 0xC7BA, 0xB5A8, 0x8EA6, 0xA7F7, 0xA794, 0xB512, 0xBC2D, 0x9AEC, 0x975F, 0xB228, 0xA05A, 0x9290, 0x9FD3, 0xA8A7, 0x9C4C, 0x9B8C, 0xA05B, 0x8490, 0x86F8, 0x88CD, 0xB5AC, 0xCFEC, 0x8E83, 0x9F09, 0x97B8, 0xBD56, 0x9B94, 0x9A99, 0xB810, 0xBC70, 0xBE79, 0x8BFD, 0xCDB6, 0xA01A, 0xA96A, 0x87A9, 0xBAB3, 0xC1E1, 0xD5D5, 0xA4FB, 0xC36C, 0x9D23, 0xC733, 0xB767, 0xC21C, 0x94E2, 0xA5B6, 0x90CB, 0xA6CF, 0xD315, 0xB71A, 0xA6ED, 0xCFBE, 0xB514, 0xBE56, 0x9768, 0xBC54, 0xA4AF, 0xA900, 0xA96E, 0xA6D5, 0xCFC1, 0xA531, 0xCC47, 0xAC46, 0xC4BE, 0xB517, 0x971B, 0x8EE0, 0xCFC6, 0x9AA4, 0x96BB, 0x8814, 0x8FF7, 0x881E, 0x9A17, 0xD270, 0xB16F, 0x859F, 0xB670, 0xA6E9, 0xC050, 0xBA68, 0xC4C3, 0xB3FF, 0x8589, 0xB087, 0x92D6, 0x8E46, 0xC1F1, 0xAFC2, 0x93BD, 0xACE1, 0xC054, 0x99CE, 0xA83D, 0xCA66, 0xB1B9, 0x8CC6, 0x8572, 0xA1B5, 0x89F1, 0x8B00, 0xA8D9, 0x8E9C, 0xAC1B, 0x8881, 0xD482, 0xB1C2, 0x8712, 0xD39C, 0xD1A5, 0xA8DA, 0x8CCA, 0xCC29, 0xB30E, 0xC438, 0xA941, 0x8F7C, 0xAFC8, 0xABFF, 0xD43D, 0x8669, 0xA821, 0xD052, 0xC27D, 0xB141, 0x8E75, 0xC1F3, 0xCC3B, 0xC8A7, 0x94E4, 0x8DFE, 0xB966, 0xBE6C, 0xBE6D, 0x982E, 0x89F3, 0xB977, 0xB4D1, 0xB92F, 0x89B3, 0x89B4, 0xB76A, 0xB98C, 0xBBF3, 0xB93D, 0xCCE4, 0xBAF5, 0xA999, 0x9458, 0xCCC6, 0x865D, 0x93B2, 0xAF46, 0xBE63, 0xCCFD, 0x9D77, 0xB91B, 0xD06E, 0x8FA1, 0x93F8, 0xAE13, 0x8FA3, 0xB1A3, 0xBEDB, 0x9A4C, 0x9026, 0xB616, 0xCF8F, 0xABF3, 0x869F, 0x86A0, 0xA0D2, 0xBC89, 0xA88B, 0x8A0E, 0xADB0, 0xCF2B, 0x92AB, 0x9414, 0x95D2, 0xBE67, 0x9FA8, 0x9FA9, 0xB617, 0xC16D, 0x9415, 0xBE68, 0xADB1, 0xBDE3, 0xB01E, 0x9E77, 0xC044, 0x941F, 0xAE1B, 0xA88E, 0x8648, 0xD1C6, 0xC6D7, 0xADB4, 0xADB5, 0x890A, 0xBE6B, 0x94C5, 0x86AB, 0x8DC2, 0xD2CF, 0xAA42, 0xB294, 0xAA43, 0xB000, 0xCA35, 0x926B, 0x9A51, 0xCD94, 0xCD95, 0xADB7, 0xA24F, 0xCB0D, 0xA891, 0xB8F4, 0x9002, 0x8BA4, 0x9A53, 0x8E7F, 0xD484, 0x9C35, 0xC099, 0x9EA8, 0x8AE2, 0x8A15, 0xBFE9, 0xA5B1, 0x9C41, 0x893F, 0xA8A8, 0x9013, 0xBFB4, 0xA824, 0x9E87, 0x9E89, 0x8BB8, 0xB142, + 0x901A, 0x901B, 0xC7FD, 0x9F5D, 0x8E59, 0xBA98, 0xBA99, 0xD2F3, 0xCA84, 0xAE63, 0xAE02, 0x9027, 0x8684, 0x9F36, 0xA77E, 0x952B, 0x957F, 0xA0D3, 0xD384, 0xC3E0, 0xB889, 0xC68E, 0xAF93, 0xA67B, 0xC91E, 0x8A8E, 0xCD07, 0x8523, 0x9FAA, 0xC779, 0xB282, 0xC3A6, 0x8D77, 0x86A5, 0xCAF5, 0xA682, 0xD57C, 0x8C4A, 0x937C, 0xD40C, 0xB058, 0xB106, 0x94F1, 0xA2E4, 0x8CB9, 0xC754, 0xD248, 0x8E49, 0xD1C7, 0x9254, 0xD29B, 0xBDF0, 0xA0F8, 0x9C87, 0x9316, 0xA0F9, 0xB867, 0x9D4B, 0xC729, 0xD08D, 0x87E6, 0xAEB3, 0xD22B, 0xCCA2, 0xA06B, 0xB5F2, 0xBDF1, 0xBF11, 0xCA73, 0x9F3A, 0xC13A, 0x9B4A, 0xBD1C, 0xC946, 0x8B5B, 0xD2D0, 0x991A, 0xC803, 0xABD0, 0x90A5, 0xA077, 0xC50A, 0xBF48, 0xBF68, 0xAB3C, 0xB12D, 0xC50B, 0xBC36, 0xB215, 0xA6A2, 0xD2E0, 0x8DA7, 0x9169, 0xC29C, 0xB831, 0xA56C, 0xBA79, 0x9ABE, 0xC432, 0xCB2B, 0x8659, 0xD11E, 0x96FB, 0xBD32, 0x931B, 0xAAB4, 0xA7E9, 0x8B09, 0x9CFE, 0xBE88, 0x84A7, 0x8B60, 0x86C8, 0x86C9, 0xACF7, 0x96B2, 0x9112, 0xA2E9, 0xC14C, 0xCD63, 0x8D84, 0xC805, 0xD3D6, 0x8D3E, 0x8E34, 0xB971, 0xD348, 0xD2F4, 0xCE34, 0x9992, 0x938F, 0xA4A3, 0xC933, 0x8A7C, 0xBF7F, 0xCDE1, 0x97C6, 0xC1BB, 0x9AC3, 0xA38A, 0x9D86, 0xCBAF, 0xCB38, 0xA947, 0xB7F6, 0xA200, 0x8B6A, 0xC307, 0x96F0, 0xCB45, 0xC1A4, 0x9CA4, 0x8C50, 0x857D, 0x9B7C, 0xA8A1, 0x896F, 0xBA7C, 0xAF95, 0x8F8A, 0x8DDF, 0x8790, 0xBD23, 0xD124, 0x8760, 0xB975, 0x8D46, 0xAA92, 0xCB57, 0xD582, 0x8B98, 0xD125, 0xD0A6, 0xBBF1, 0xB80D, 0xB627, 0x8FE7, 0xA949, 0xA94A, 0xAD82, 0xB4A0, 0xCBFA, 0xCC8E, 0x9AF0, 0x944F, 0xA797, 0xA8F1, 0xB432, 0xA8AA, 0xA573, 0xC444, 0x9320, 0x8E3E, 0xCC0D, 0x990B, 0x846C, 0x8581, 0xC445, 0x96F1, 0xC0F5, 0xAF71, 0xCE53, 0xC121, 0xCB6B, 0xCCB7, 0xB133, 0xA5D4, 0xA6BF, 0xBAC0, 0x8E76, 0xA816, 0x8FBB, 0xA817, 0xA4DB, 0x8791, 0x9D2A, 0x8B11, 0xC953, 0xC739, 0x9F4D, 0xD219, 0xAB8B, 0xA6DC, 0x9C0A, 0xA4E1, 0x9C61, 0x8F90, 0xC73A, 0xCC94, 0xCC01, 0xB5B9, 0xCCC0, 0xBD27, 0x8F94, 0xAA97, 0xAA3A, 0xAA3B, 0x87EF, 0x87F2, 0x9777, 0x8537, 0x924A, 0x8EF1, 0x924B, 0x8557, 0x8558, 0xB454, 0x866D, 0xCFF0, 0xCFF1, 0xAB6D, 0x8EEC, 0xAFDE, 0x9F37, 0x9AD4, + 0x9748, 0x8CE0, 0xA83F, 0x9543, 0xAD6A, 0x9C83, 0x9EEB, 0xB0C9, 0x9547, 0x8464, 0x91A7, 0x98A0, 0x9850, 0x86BC, 0xC098, 0x8BA7, 0xB3B0, 0xC2F6, 0x846B, 0xC544, 0x98A7, 0x9B14, 0x98A8, 0xD020, 0x8D74, 0x98A9, 0xC548, 0xCA0D, 0xB1E3, 0x98AB, 0x9F0B, 0x8494, 0xC61E, 0x9B0F, 0xA6D6, 0xB176, 0x98F6, 0x9F33, 0xB0FD, 0x94FF, 0xB059, 0xD397, 0xA232, 0xB557, 0x8D90, 0xB634, 0xD063, 0x9698, 0xA237, 0xA238, 0xD39E, 0xD067, 0xD068, 0xD0DB, 0x90CC, 0xAD00, 0xB2DE, 0xCC53, 0xCD72, 0x8606, 0xD12E, 0xD32D, 0xB088, 0x98C7, 0xCC56, 0x98CE, 0xCB02, 0x87F5, 0xC08A, 0x98CF, 0x84D9, 0xD0CB, 0xC855, 0x9DA2, 0x98D4, 0xCD61, 0xA3FA, 0x92AF, 0x94D7, 0x8ED1, 0xB005, 0x9467, 0xB558, 0xB9A2, 0x8ED4, 0xA9B4, 0xD0D0, 0xABFD, 0xA620, 0x9FE4, 0xC6F0, 0x9DBC, 0xB00C, 0x9715, 0x84AE, 0xA963, 0xC6C6, 0xD379, 0x8EA7, 0x84B3, 0x96A1, 0xA6D7, 0xADBC, 0x9028, 0x9512, 0xC68F, 0xAB2F, 0xC0D4, 0xD261, 0xB2FB, 0xCEC9, 0xBE69, 0xC4A8, 0x913E, 0xC5E4, 0xC37F, 0xB01D, 0x937D, 0x9146, 0xACED, 0xAD1F, 0xB99A, 0xBA30, 0xCF2C, 0xAC9F, 0xAFFF, 0x92D7, 0xACBD, 0x8E29, 0xAB93, 0xAB72, 0xA2A6, 0xC47B, 0xA358, 0xBA35, 0xC90C, 0xD201, 0xC9A8, 0xB930, 0x9BE7, 0x8DEF, 0xD1C8, 0xA3E2, 0xA0FA, 0xB969, 0xCA6F, 0xB99B, 0xABCD, 0xAD6B, 0xD40D, 0xD194, 0xD195, 0xAC89, 0xBA36, 0xCE75, 0x8FF8, 0xAEB4, 0xD540, 0xD541, 0x8A34, 0xD07C, 0xC740, 0x87D3, 0xAC55, 0xA8E6, 0xBC46, 0xBF25, 0xAC58, 0x901F, 0x8F63, 0xAE67, 0xAD23, 0xC744, 0x8B01, 0xA3E4, 0xA1B6, 0xAD9B, 0xD1E5, 0xBEB9, 0xC928, 0xC88A, 0xAD71, 0xD356, 0xAD6C, 0xD4C2, 0xD208, 0xABA0, 0xBC9D, 0xB426, 0x9851, 0x9AA5, 0x8F6B, 0x8AF4, 0x8DA8, 0xA1B8, 0x91A8, 0xAB08, 0xC489, 0xC2EA, 0xA475, 0xA4D3, 0x9DF9, 0xB884, 0xBE89, 0x97B6, 0xC06B, 0xA601, 0xBA49, 0xB50C, 0xA7CF, 0xC7F9, 0xA035, 0xD20F, 0xA616, 0xA4D4, 0xBC66, 0xA1BC, 0xBB25, 0xBC49, 0x90B4, 0xB13B, 0xB13C, 0xADD0, 0x9BB7, 0xAEBA, 0xA9B5, 0x954B, 0x9F77, 0x88A1, 0xD387, 0xCDA4, 0x9BB8, 0xAAD0, 0xC3E5, 0xC634, 0x9B31, 0x97B7, 0xCF96, 0x8C9B, 0x9DB7, 0xABD4, 0x90E0, 0x9993, 0xC713, 0xBE92, 0xA412, 0x954D, 0xB77A, 0xAB80, 0xC6F1, 0x925B, 0xC21A, 0xACB7, 0x8BC4, 0x9794, + 0xAC2D, 0xC1EF, 0xA36C, 0x8EA1, 0x8A5F, 0xA2F6, 0xBBEB, 0xC3AE, 0xB50D, 0xAD83, 0xAD2E, 0xAAFD, 0x935E, 0xD021, 0xD126, 0xCB58, 0x8FCD, 0xA35C, 0xAD84, 0xBB2D, 0x8D0D, 0xA932, 0x8B0C, 0xAAFE, 0xB173, 0x8AB1, 0x9760, 0xAC02, 0x9AC8, 0xBB2E, 0xB183, 0xC319, 0xB433, 0xB22A, 0xD3F4, 0x8F05, 0xB95E, 0xBB2F, 0xA7B5, 0x8A57, 0x9E5E, 0xA2AB, 0xCA0E, 0xC6F9, 0xBF3D, 0xAD9F, 0xA7FA, 0x9799, 0x9E5F, 0xCA19, 0x8495, 0x9B9A, 0xD0BC, 0x9E12, 0x96A2, 0xD150, 0xA18B, 0xABB1, 0x8BC6, 0xB7F8, 0xAF42, 0xC794, 0xC9CA, 0x9BFE, 0xAC0F, 0xAC95, 0xB198, 0xAC96, 0xA5D7, 0xA3F1, 0xA215, 0xC71F, 0xAC97, 0x9C0B, 0xA970, 0xAC14, 0xA901, 0x971C, 0xAB0F, 0xC36E, 0x8C23, 0xBDA8, 0xA2AE, 0xD3F7, 0xAB4C, 0x9FC5, 0xB489, 0xCE1F, 0xBB3B, 0xD014, 0xA222, 0xBA04, 0xCAA2, 0xB950, 0xD23B, 0x998D, 0xB952, 0xCC84, 0xA13E, 0xD36C, 0x9EEC, 0x8DA9, 0x90FA, 0x8471, 0x9F0A, 0xD04A, 0xCEE4, 0x8550, 0xB9DC, 0x9039, 0xB2F6, 0x9C1C, 0xD526, 0x9513, 0xC28E, 0xD158, 0xA371, 0x952C, 0xC2BD, 0x9281, 0xA3DE, 0x8E96, 0xAABD, 0xB828, 0x8E2A, 0xA1D9, 0xA683, 0x93D7, 0xC1B2, 0x91B8, 0xC691, 0xA2B0, 0xD298, 0xB2FE, 0xA298, 0x9FAB, 0x8795, 0x91C9, 0xC815, 0xB0E1, 0xD159, 0xC852, 0xBC5B, 0xD438, 0x8A40, 0x9147, 0xC055, 0xC8BF, 0x9FC6, 0x937E, 0x9262, 0xAD6D, 0xD07D, 0xA0FB, 0xCE03, 0xAA8E, 0xC00F, 0xC010, 0x8F46, 0xD0A3, 0xD196, 0x91D2, 0x9420, 0xADB6, 0xD3E9, 0xA498, 0x870B, 0xAF86, 0xB1A6, 0xB095, 0xA840, 0xB05A, 0xA5A2, 0xB1F5, 0x87F6, 0xB1F6, 0xB931, 0xCF85, 0x847E, 0xA691, 0xA8E7, 0xBF23, 0xCCE6, 0xA692, 0xA3E3, 0x8BF3, 0xA337, 0xB5F3, 0xD3B3, 0x9732, 0x974F, 0x91D9, 0xAE42, 0xB327, 0xA9A8, 0xC13B, 0x847F, 0x95C0, 0xC487, 0xC62D, 0xC857, 0x907E, 0xB098, 0xC2DF, 0xA584, 0x9964, 0xBB3A, 0xC3BF, 0xB401, 0xB4D6, 0xC172, 0xB423, 0x8929, 0xA339, 0xC50C, 0xB62E, 0x89CC, 0xA543, 0x9944, 0xCD96, 0xC50D, 0xC3C5, 0x85B7, 0xA91D, 0xCCD7, 0x8A43, 0x8A51, 0xC216, 0xA892, 0xCC97, 0xAB39, 0xB62F, 0xC8D1, 0xB832, 0xA46B, 0x968E, 0x892A, 0x9A31, 0xA983, 0x8A85, 0x9DFA, 0xAF9C, 0xBBB6, 0xD4C8, 0xA33B, 0xB0AF, 0xC899, 0xD485, 0xA34B, 0x8AE0, 0xB2A4, 0xD57F, 0xB4EE, 0xA7EA, 0xA235, + 0x8801, 0x9041, 0xACF8, 0x8FCA, 0x9DB8, 0x9904, 0xA9B6, 0x8485, 0xBC67, 0xB635, 0xA5F9, 0x860A, 0xCBD7, 0x9121, 0xC272, 0xB2A5, 0xAA5F, 0xC09A, 0x8F9C, 0xAE47, 0x862D, 0xB30B, 0x8A86, 0xB763, 0xC864, 0x900E, 0x9043, 0xD381, 0xC018, 0x9F7F, 0xCC24, 0x8726, 0xA31E, 0x86D8, 0xC151, 0xBB41, 0xD1AF, 0x9104, 0xC3CB, 0x8EA0, 0xBE20, 0xAE5C, 0xB0CD, 0x9E08, 0x8F77, 0xBD61, 0x8950, 0xBE74, 0xB30F, 0x914F, 0x9390, 0xC74B, 0xB63D, 0xB40D, 0xAAC4, 0x960B, 0xAED1, 0xBC27, 0x91AD, 0x8CCD, 0xA8A2, 0xBB6A, 0xBD89, 0x85BE, 0x9A41, 0xB0F1, 0xA424, 0xB7DD, 0xA5CE, 0x8D9F, 0xBE76, 0xC3CE, 0xB269, 0xA70A, 0xB00D, 0xC17F, 0xCF52, 0x9113, 0xD16D, 0xA2F7, 0xA49A, 0xAFFE, 0xC991, 0x97AE, 0xD440, 0x8993, 0xB314, 0x84F0, 0xB09E, 0xA8D1, 0xA98E, 0xA2AC, 0x8C57, 0x8A89, 0xCBB1, 0xA5D0, 0xB166, 0xB315, 0xAD4B, 0xB316, 0x8D6D, 0xD55F, 0xB4F2, 0x8CB1, 0xAA64, 0x9C52, 0xB89E, 0xA574, 0xB5A9, 0xD04B, 0x8F06, 0x9E60, 0xC39D, 0xA7FB, 0x9047, 0x8FBA, 0x9AF1, 0x8808, 0xCF88, 0xB415, 0x8F18, 0xA6C0, 0x9E61, 0x9ED2, 0xC31A, 0xD111, 0xB434, 0x913A, 0x9E13, 0xCE4F, 0xD48F, 0x98F0, 0xA322, 0xD024, 0xA5EE, 0x9F8C, 0x8BFE, 0xCA1D, 0xB641, 0x8EA8, 0xCAB9, 0x9E88, 0xB0F9, 0xB0FA, 0xCDBA, 0xB18A, 0xB318, 0x8497, 0xA2FD, 0x9DD3, 0xCE54, 0xB768, 0xAC10, 0xB05D, 0x8CD8, 0x8845, 0xC954, 0xAAD6, 0x888D, 0xC448, 0xA3F2, 0xA5B8, 0xA5D8, 0xD319, 0xA6D0, 0xA6D8, 0x9299, 0xB644, 0xB05E, 0xCC48, 0xA6DD, 0xA902, 0xA903, 0xAD90, 0x884F, 0xBB0A, 0x971D, 0xA507, 0x888E, 0xC879, 0xBA18, 0xBA13, 0xA64B, 0xB6CF, 0xB902, 0xCEED, 0xBB86, 0xB273, 0xBCBF, 0xAACB, 0xC59E, 0xC963, 0xC3F6, 0xB27F, 0xB280, 0xD291, 0x8652, 0x911D, 0xD34F, 0xD350, 0xCA31, 0xB9EA, 0xCD4B, 0xD2BC, 0xBEA0, 0x9416, 0x947F, 0xAC6A, 0xD5B7, 0xD240, 0xBC39, 0xABCB, 0xD60E, 0xB57C, 0x9A12, 0xD40B, 0xB947, 0xBC5C, 0x8CC2, 0x8967, 0xAC30, 0xA9FE, 0xCDD2, 0xC4C8, 0xC24D, 0xBE99, 0xB178, 0xD40E, 0x977B, 0xC3BE, 0xD249, 0x9CF7, 0x9570, 0xD197, 0x9571, 0xBB21, 0x9FFE, 0xB96B, 0x94C6, 0xA46A, 0x8F64, 0x8EBF, 0x9BEC, 0xBDD2, 0xB2A0, 0x96B0, 0x970F, 0xD5DC, 0xA856, 0xA9AE, 0x87D7, 0xA005, 0x8EC0, 0xD26D, 0xA9AF, + 0x8983, 0x86BD, 0x8BF7, 0x9B2E, 0xCD36, 0xC38D, 0xCBAB, 0xD503, 0x9BF1, 0xD1A6, 0x9437, 0xCED8, 0xC250, 0xC45D, 0xC932, 0xD252, 0xCA3C, 0xABA6, 0xBB5A, 0x8F6F, 0x862E, 0xD4CE, 0xD1B0, 0xCCE0, 0x9D08, 0x9575, 0xBD86, 0xBB60, 0xAAD3, 0xBCDC, 0x949A, 0xC715, 0xB2B5, 0xCE50, 0xC365, 0x9C4D, 0xBBA0, 0x8994, 0x8E71, 0x979A, 0xBC71, 0xA660, 0xAF67, 0xAC3F, 0x8ECD, 0xA6C8, 0xB66F, 0xCF0E, 0xD25D, 0xCFC7, 0xA5F3, 0xB70B, 0xCDCE, 0xCD78, 0xA608, 0xC5AD, 0xB491, 0x98BA, 0xBF5F, 0xC678, 0xBB4C, 0xB698, 0xBF60, 0xD527, 0x8943, 0x9500, 0xCAE9, 0xC3F7, 0x87CC, 0xAEC2, 0xB51D, 0xB51E, 0xD340, 0x9365, 0x9897, 0xCF2D, 0xA2E1, 0xACBE, 0xD241, 0xA026, 0x8687, 0xD242, 0xCDFD, 0xAC6C, 0xA384, 0x8599, 0xB0E3, 0xAE82, 0xA693, 0xCD0A, 0xD59F, 0xB0E4, 0x881F, 0xA841, 0xAD6E, 0x8AF6, 0xAEC4, 0xB48A, 0xC90D, 0xD5FB, 0xD2C4, 0xD24A, 0xBAAD, 0xA160, 0xD52A, 0x9BD8, 0x9C25, 0x8A8F, 0xBF26, 0xD2D1, 0x9BD9, 0x98D5, 0xCB9E, 0xD4F4, 0xD2D2, 0x9F3B, 0xB6A3, 0x90EB, 0xCA74, 0xD411, 0x9B69, 0xAF5F, 0x9490, 0xC2EB, 0x955C, 0xA544, 0x93E3, 0xD034, 0xBB22, 0xA9FF, 0xA46C, 0x9507, 0xA033, 0xBE18, 0x8AD9, 0xBF7C, 0xB8D4, 0xBB23, 0xC821, 0xAA67, 0xA9B7, 0x96B3, 0xD600, 0xB6A5, 0xD4A0, 0x85BB, 0x856B, 0x9C36, 0xD2E7, 0xD2E8, 0xA46F, 0xA5FA, 0xB0B0, 0xA2EF, 0xA80A, 0x8BA8, 0xD5AB, 0xCE28, 0xBBF5, 0xAA45, 0xAA46, 0xCA3F, 0xC393, 0x8727, 0x9D09, 0x9442, 0x86D9, 0xAFAD, 0x9F49, 0xD349, 0xD555, 0xC6A3, 0x8A94, 0x8ED6, 0xC1D3, 0xA747, 0xD509, 0xCE3D, 0x9D10, 0xC6F6, 0xD1D3, 0xD2FE, 0x8ED9, 0x9D90, 0x9C42, 0x9562, 0x9563, 0x9699, 0xB6F4, 0xBC6B, 0xB709, 0x9D16, 0xA2B8, 0xADD7, 0x88C4, 0xABE4, 0xD310, 0x9D0A, 0xA9CD, 0xBBF7, 0x9C4E, 0xCC8F, 0xC1D4, 0xB529, 0xB80E, 0xA48E, 0xCB59, 0x9AF2, 0xB46D, 0x9CCF, 0xBC72, 0xC524, 0xB22B, 0x9ED3, 0xD4AD, 0xBF3E, 0xD5E7, 0xAA0C, 0xBC73, 0xAF69, 0xB812, 0x9B9B, 0xB669, 0xAFB5, 0xCE55, 0xB18B, 0x9D2B, 0xBFC2, 0xC1D5, 0x8AB6, 0x9BFF, 0xA3F3, 0xAA0E, 0x876D, 0xB814, 0xB671, 0xD4AE, 0xA646, 0x8D59, 0xC75A, 0xC80A, 0xA0AE, 0xB4FC, 0xC2BE, 0xB4FD, 0xA345, 0xCD5B, 0xB92B, 0xA04F, 0xC9B7, 0x8C2D, 0xD496, 0xBF62, 0xA566, 0xB45C, + 0xD0A0, 0xC9A9, 0x8722, 0x85D2, 0xC9AA, 0x87D4, 0xC045, 0xD3D2, 0x9F1B, 0xB444, 0x8FDB, 0xC231, 0x9750, 0xC976, 0xD2D3, 0x8C4B, 0xC9BB, 0xBEB5, 0x9F20, 0x8C4C, 0xA09D, 0xC50E, 0x8AD2, 0xA367, 0x8D5A, 0xC200, 0x8E67, 0xA37A, 0xA2F0, 0xD4C9, 0xC6A0, 0xBBF6, 0x96EE, 0xA3FB, 0x90A7, 0xD4AB, 0xC787, 0xC201, 0xC04D, 0xC822, 0xCDA5, 0xA17A, 0xB50E, 0xC992, 0xC993, 0xBEB7, 0x8A2D, 0xCDE4, 0xBE77, 0x8FE8, 0xA186, 0xA795, 0xC312, 0xC2A9, 0xA3FD, 0x8C51, 0xD133, 0xA3BE, 0xA3BF, 0xA8F2, 0x8AB5, 0x8D8A, 0xA798, 0xCFFD, 0x8D60, 0xB44E, 0xB515, 0x90AD, 0xD001, 0xA91A, 0xB472, 0xA66C, 0x8C04, 0xB9E0, 0x947A, 0xB33A, 0x8C0A, 0x995C, 0xB283, 0x9880, 0xB983, 0x932E, 0xBAD4, 0xACC9, 0xB5C1, 0xD0E2, 0xD40F, 0xA842, 0xA8E8, 0x87E7, 0xA06C, 0xA073, 0xD0F7, 0x855D, 0xBB99, 0xA250, 0x9969, 0xBF28, 0xBBC0, 0xA078, 0x8FE2, 0xCB2C, 0xBADF, 0xA074, 0xB5C5, 0x9F80, 0xB1A8, 0x90F7, 0xA621, 0xD448, 0x8926, 0x8EF7, 0x8D93, 0xC060, 0xA088, 0xA2A4, 0xA089, 0xD3CB, 0xD3CD, 0xA5A1, 0xB0A2, 0xCD79, 0x8B21, 0x94F0, 0xAB32, 0xD3CF, 0xC07C, 0x90DB, 0x9C26, 0x9EEA, 0x8526, 0xBC3A, 0x9C84, 0xB4A6, 0xD140, 0xBC8B, 0xC7F1, 0xD47E, 0xCE9B, 0x9A13, 0x9872, 0xC553, 0x8921, 0xB107, 0x8689, 0x9DED, 0xCAAB, 0x905C, 0xB86A, 0xB988, 0xC3C0, 0x8F27, 0xD3D4, 0xADF1, 0x8B02, 0x9661, 0xA699, 0xB463, 0xAD0B, 0x85CA, 0xBEA2, 0xBB96, 0x9428, 0x890D, 0x864D, 0xB07C, 0x8DD8, 0xD52D, 0x8F65, 0xA84C, 0xD010, 0xAF81, 0x9429, 0x963A, 0x9287, 0x9D4D, 0x9506, 0x92B0, 0xBA0D, 0xAB69, 0xB1E9, 0xBA3B, 0x9DA6, 0xB500, 0xA8E9, 0xAD0C, 0x870C, 0xAAA0, 0x978F, 0xB582, 0x8B2A, 0xCBA7, 0xC9BC, 0xC459, 0x868E, 0xB501, 0xA47C, 0x8EFC, 0x9EF1, 0x9FD1, 0xB5F7, 0xBC8D, 0xB72D, 0x925A, 0xA3C8, 0xD418, 0xBF43, 0x9C30, 0x8DDB, 0x9877, 0x8913, 0xD359, 0xA368, 0xA4C9, 0x86BE, 0xB84E, 0x8E7E, 0xD20D, 0x8915, 0x93E6, 0xA236, 0xBF80, 0xAFE8, 0xA617, 0xA546, 0xA142, 0x96FC, 0x9E01, 0x982F, 0xBF45, 0xC3CA, 0xD2E9, 0x8ADA, 0xBC3B, 0xBA4A, 0xD41E, 0xD601, 0xC542, 0xB8D6, 0xBEF1, 0x8916, 0xC85D, 0x9573, 0xA3A8, 0x94F8, 0x8BA9, 0xA3C9, 0x953F, 0xCF38, 0xAFBA, 0xB34E, 0xC543, 0x9E02, 0xB203, 0xA4CB, + 0xD590, 0xAFF5, 0x86DA, 0x86DB, 0x95C2, 0xBCFE, 0x96E0, 0xCD64, 0x9DBD, 0xD148, 0x966D, 0x99FE, 0xD213, 0xB4EF, 0xB84A, 0xD388, 0xA9BF, 0x8834, 0x9C3B, 0xA7EB, 0xBC3D, 0xA251, 0x9443, 0xD064, 0x966E, 0xA34C, 0xB382, 0xB356, 0xA252, 0x8C6F, 0x96FD, 0xCE83, 0x8919, 0xD5AC, 0x8853, 0xD018, 0xB467, 0xC039, 0xAA79, 0x8E36, 0xC517, 0xB792, 0x9E50, 0xC716, 0x8713, 0xBC90, 0xC4B6, 0xC460, 0xB1CC, 0xD1B2, 0xC616, 0x99E3, 0xB9CB, 0xD423, 0xCEE3, 0x8C7D, 0xAA1C, 0xC238, 0x9069, 0xBB43, 0x9CA5, 0x9F78, 0x9AED, 0xC617, 0xABD7, 0x92B7, 0x8C3B, 0xD452, 0xB14B, 0x9392, 0xD428, 0x9976, 0xB46B, 0x9995, 0xB526, 0xACC2, 0xB3B8, 0x9670, 0xA436, 0xB9FC, 0xA942, 0xCF40, 0x98EC, 0xBD8D, 0xCF06, 0x8B99, 0x9551, 0x930A, 0xB793, 0xD216, 0x962F, 0xAF0D, 0xB3BA, 0xC546, 0x8D5C, 0x960C, 0xB036, 0x90E3, 0xA6B9, 0x86EA, 0xD4D4, 0x8BE5, 0xB84F, 0x8B34, 0xD429, 0xB3D8, 0xA8F3, 0xA4F4, 0x9DC7, 0x8887, 0xA62B, 0x9B95, 0x86EB, 0x8F32, 0x8D0E, 0xC83D, 0xB0B9, 0xB81E, 0x8D5E, 0xB11E, 0xB174, 0x908E, 0xCE56, 0xACDB, 0xBFAD, 0xD022, 0xB850, 0x979B, 0xCA90, 0x9A22, 0x89C1, 0xA36D, 0x8D47, 0xB1D1, 0xCFFB, 0x9C53, 0x9783, 0xBC2E, 0xA943, 0x891B, 0xA9D3, 0xAED3, 0xBCA4, 0x8D5F, 0x8FD1, 0xBCA5, 0xA5A7, 0x9108, 0xA752, 0xC525, 0x8846, 0xAC85, 0xB851, 0x8EA9, 0xA79D, 0x8E40, 0x8FBC, 0x946F, 0x9E14, 0xAD17, 0xA43E, 0x8E1D, 0x9ED7, 0x8EF8, 0x9AF4, 0xBC91, 0xA575, 0xCFA6, 0xC52D, 0xA9DC, 0xBA61, 0xCFA7, 0xB2ED, 0xAFF7, 0xB2C0, 0xB121, 0x950D, 0xA18D, 0xA9DD, 0xA9D7, 0xC870, 0x8854, 0x8E85, 0xB7BC, 0xD430, 0x9630, 0xB360, 0xA71E, 0x8889, 0xD3A3, 0xA4DF, 0xBA62, 0xA502, 0xA440, 0xCDBF, 0xCF09, 0x988F, 0xD1BB, 0xBD07, 0xBE58, 0xAF19, 0x8BB9, 0x9CB4, 0xCA97, 0xB2CA, 0xBDFF, 0xD45A, 0xD3A5, 0x9278, 0xBAC5, 0xD3A4, 0xB390, 0xD4E1, 0xBE01, 0xA9E5, 0xA971, 0x9DDD, 0xC03B, 0xCC80, 0xCE64, 0xA4E3, 0xA906, 0xB473, 0xA724, 0xA50B, 0xB368, 0xCF10, 0xD33E, 0xB5B7, 0xA725, 0x871E, 0x910C, 0xD5C6, 0xA647, 0xB9D6, 0xAA88, 0xCC83, 0xCF12, 0xD4E3, 0xCE6D, 0xAC4D, 0x8F1F, 0x9282, 0xB923, 0xD15A, 0xB92C, 0xAF8D, 0x98C8, 0xA5E3, 0xC3FA, 0xD520, 0xAE7F, 0x8D9B, 0xD11B, 0xB33F, + 0xD096, 0x868A, 0x858B, 0xC295, 0xB82D, 0xA2B1, 0xB70D, 0x935D, 0x868B, 0xBC5D, 0xCBC9, 0xD15E, 0xAC56, 0xBD11, 0x9A14, 0x8527, 0xA69A, 0x94F3, 0xA166, 0xB1F7, 0xAD72, 0x8D33, 0xD0AB, 0xD399, 0x8B03, 0xBC0B, 0xBEBA, 0xA69B, 0xC2EC, 0xBC0E, 0x996A, 0xBF29, 0xD4FE, 0x890E, 0xCEFD, 0xD370, 0xA7E8, 0xD464, 0x855E, 0xA560, 0x9368, 0x9220, 0xB583, 0x98DB, 0xA75B, 0xC48E, 0x9438, 0xA75C, 0x88C8, 0xA036, 0xA659, 0xCF00, 0xA9C0, 0xA128, 0xB2AC, 0x8D85, 0x856C, 0xD0FF, 0xA7EC, 0xD580, 0xA039, 0x97E9, 0x9A32, 0xB7CC, 0xB7CD, 0xBD8A, 0x8729, 0xB714, 0xACAE, 0x9996, 0xC6C4, 0xD581, 0x99E4, 0x9E51, 0xCFA5, 0x8CD0, 0xA625, 0xC5C6, 0x93EF, 0xAFB0, 0x8638, 0x969B, 0xC677, 0x9552, 0xBD8E, 0xB56C, 0x9D5B, 0x88EB, 0xD468, 0xBD91, 0xAC3B, 0xB7D0, 0x936D, 0xCFE0, 0xA2B9, 0x9EAE, 0xAD4C, 0xB7D1, 0xB7D2, 0xAFB4, 0x8B6E, 0xA762, 0x9EB0, 0xA3B2, 0x8858, 0x9A9E, 0xBAC3, 0x9D2C, 0xC4A2, 0xAFB6, 0xBFB0, 0xAF1E, 0xA6D9, 0xD617, 0x8F36, 0xAF1F, 0xBEC1, 0xA533, 0xAC63, 0xBB4B, 0xA0AF, 0xC375, 0x95FC, 0xD21C, 0xA0B1, 0xCD44, 0x9CE7, 0x895F, 0xD393, 0xC7A5, 0xCEE2, 0x995D, 0xCD5D, 0x9581, 0xC07D, 0xB6BB, 0xC1D0, 0xC1B4, 0xB548, 0xADEE, 0xD4EF, 0xBF57, 0xAF56, 0x93C4, 0x9CEB, 0xBA90, 0x8C88, 0xB0E5, 0xD1E4, 0xB82E, 0x9961, 0xD29C, 0x9C85, 0x9330, 0xCF30, 0xB6BE, 0x8E4A, 0x9FCC, 0xBC06, 0x92DA, 0xBCAB, 0x8D79, 0xA0CA, 0xCF7E, 0x8528, 0x9FDA, 0x93DF, 0xD2D4, 0xB25F, 0xD531, 0x8B96, 0x9965, 0xCF7F, 0xA5E6, 0xC383, 0x942A, 0xC5AE, 0xB934, 0x87FC, 0xD412, 0xB5C3, 0xA84D, 0xD413, 0xB8EE, 0x9518, 0xC947, 0x942B, 0xC013, 0xD1CA, 0x8E0C, 0x8C0F, 0xB9BC, 0xD332, 0xC42C, 0xD5B8, 0xA08F, 0x859B, 0xB5A3, 0xAD73, 0xBAD9, 0xD5D8, 0xA3E5, 0xA030, 0xB6C3, 0x9878, 0xC5B4, 0x9F70, 0xD3B6, 0x8BA5, 0x96D8, 0x855F, 0xA1EF, 0xA3E6, 0x99DA, 0x8CEB, 0x9A8E, 0x95D9, 0xBDB4, 0xC57C, 0xA388, 0x9EF2, 0xB5F8, 0x94CF, 0xAAA1, 0xC747, 0x8656, 0xC48A, 0x9433, 0x95C6, 0xBF2A, 0xB6E6, 0xBEBC, 0xCBA8, 0xA5CB, 0xC5B5, 0xA1B9, 0xC6E5, 0x94C7, 0x9003, 0xBF44, 0xBB56, 0x9EA7, 0xC4C9, 0x9B6D, 0xA1F0, 0xD26E, 0x9E03, 0xA1BD, 0x8B0A, 0xC1DF, 0xD1E9, 0xAA02, 0x8ADB, 0xB55B, 0xBA9E, + 0x85AE, 0xBF46, 0xC513, 0x9A90, 0xB47C, 0x95EB, 0xC675, 0xBE1F, 0xC680, 0xC582, 0x996F, 0xC38E, 0x9439, 0xBEE1, 0xBC52, 0x9122, 0xA470, 0x93E7, 0xA037, 0x9A18, 0xD253, 0xC85E, 0xA09F, 0x93A8, 0x9CFF, 0xC6EA, 0xB6A6, 0xD556, 0x8A5E, 0x917C, 0xA6B4, 0xAA19, 0xA75E, 0x8BAE, 0xB61A, 0xB8EF, 0xB2AD, 0xB2AE, 0xD49E, 0xB2AF, 0xC09B, 0xB3B4, 0xC493, 0xBA7D, 0xC117, 0xB2EA, 0xBDD4, 0xC09C, 0x9537, 0xC0CA, 0x865B, 0xD488, 0x88A3, 0x97EA, 0x8D86, 0xAA60, 0xA8C4, 0xB2EB, 0xD0E9, 0x86DC, 0x8CAC, 0xA860, 0xAC8E, 0xB267, 0xB468, 0xBE75, 0xD557, 0x97AC, 0xD591, 0xC2FE, 0xD50A, 0xC642, 0xA76B, 0x9FE5, 0x92EE, 0xB76B, 0xACFA, 0xCE35, 0xD574, 0x928B, 0xAA1A, 0xC6F2, 0xCC2A, 0xB8CC, 0xB2B0, 0xC6F7, 0xC4B7, 0x9DC0, 0xA31F, 0xC496, 0xB764, 0xAC8F, 0x9C43, 0x9106, 0x8B8B, 0x8F7D, 0xACFB, 0xAB59, 0xCEB4, 0xC5BF, 0x85E5, 0xBB6B, 0xB527, 0x8714, 0x9AA8, 0x95DC, 0x8D0A, 0xACAA, 0xC180, 0x949D, 0xC156, 0xBF54, 0x962D, 0xACC3, 0xC588, 0xA748, 0xD559, 0x8741, 0x97AF, 0xCBB2, 0xBE23, 0x96C6, 0xD306, 0xCF69, 0x8AAF, 0x8992, 0x8E17, 0xC3CF, 0xCEB5, 0xD575, 0xC6AA, 0xB994, 0xC0EE, 0x95DD, 0xB822, 0xCC6E, 0xA012, 0xCB5A, 0xD48A, 0xAEBD, 0x85AA, 0x969A, 0xB00E, 0xD3A1, 0x9DC8, 0x8CBC, 0xB606, 0xBB14, 0xCF6C, 0xC3D1, 0x8D6E, 0x9D17, 0xB6F9, 0xBDBF, 0x94A3, 0xCF41, 0xD1D5, 0x9565, 0xB753, 0x99E8, 0xCFA3, 0xBDF8, 0xC49A, 0xBC2B, 0xD1D6, 0xD583, 0xBDC0, 0x9B0C, 0x88A8, 0x86EC, 0x93AB, 0x8D48, 0xA62C, 0xBCA6, 0xC8A3, 0xC368, 0xD585, 0xA5B3, 0xD454, 0xB3BD, 0xAB21, 0xD27A, 0xAA0D, 0xAD88, 0xB168, 0xA711, 0xAC3C, 0xC750, 0xD577, 0x9C54, 0xB878, 0xBC74, 0x9293, 0xAA1E, 0x865C, 0xCA46, 0xB7EA, 0xAD3B, 0xC995, 0xB3F7, 0x9BC0, 0xC40E, 0x9D1E, 0xB840, 0xC687, 0xB65F, 0xC751, 0xBC78, 0xB418, 0xD04D, 0xD605, 0xD25A, 0xB8A1, 0xB7D3, 0xA7FD, 0xCE57, 0x9295, 0xA79E, 0x8A21, 0xD5ED, 0x9E67, 0xB68D, 0x89C3, 0xB770, 0xC688, 0x9B9C, 0x9A5F, 0xD5C2, 0xC320, 0xB3F9, 0xCF42, 0x8DE4, 0xB997, 0x9B9F, 0x9D2D, 0xB813, 0x9E15, 0x9E8A, 0x9A9F, 0xB419, 0x8D11, 0x9FBC, 0x9F0E, 0x86FB, 0x899C, 0xCB71, 0xAF6D, 0xBC79, 0xCB72, 0xB83D, 0xB73C, 0x9D32, 0x87AC, 0xB39F, 0xA503, + 0xB22E, 0xC798, 0xD5C4, 0xB2CB, 0xB0C1, 0xC9CD, 0xAD91, 0xA5F1, 0xC593, 0xD5C5, 0xA3F4, 0xCCF9, 0xC6FB, 0xA5B9, 0xC418, 0x89A4, 0x9F11, 0xA972, 0x89A5, 0xCC4C, 0x8899, 0xB679, 0xC41C, 0xD5D0, 0xD5C7, 0xAAAB, 0xC36F, 0x8EE1, 0xA527, 0xA5C4, 0xA751, 0xBB48, 0xA0AB, 0xCD58, 0x994E, 0xD38A, 0xC3F1, 0x957B, 0xCEE1, 0x9C77, 0xC075, 0xA3D9, 0x9CD7, 0xB6B1, 0xC12A, 0xCF28, 0x9953, 0x8C84, 0xB0D8, 0xB825, 0x9527, 0xADE9, 0xB6B5, 0xD57A, 0xAA51, 0x9329, 0xD28E, 0xC1AF, 0x92D3, 0xD3FC, 0xD1DC, 0xAF52, 0xBA85, 0xC476, 0x9514, 0xC59F, 0x9408, 0xA737, 0xD5B3, 0xB924, 0xC37A, 0xD23C, 0xD32B, 0xD38F, 0x8598, 0x9409, 0x8C07, 0xB8EA, 0xCAEA, 0xA023, 0x8DFF, 0x85AD, 0xB6DC, 0x9F62, 0xA382, 0xB68B, 0x8FF5, 0x9871, 0x9B5D, 0x95C5, 0xC73F, 0x9EA3, 0xAA9B, 0xA1DA, 0x9EE5, 0xBF40, 0x95E7, 0xC500, 0xA1B2, 0xC67B, 0xC382, 0xBC4E, 0xBDB2, 0x9CEC, 0xBE0F, 0x9C29, 0xC6DD, 0xA84E, 0xCC1F, 0xC6DE, 0xB2E6, 0x92E8, 0x8CA7, 0xB8CB, 0x97A5, 0xB993, 0xC10C, 0xAC8B, 0xBA78, 0x8655, 0x8BA1, 0xBDD0, 0xA8C2, 0xB619, 0xD548, 0xD0E4, 0xC092, 0xAA15, 0xD480, 0xD4F5, 0xA319, 0xC4B1, 0x9DAD, 0xACA7, 0xA516, 0xBE19, 0xACC1, 0x9C31, 0xCF61, 0x9B6E, 0xBB57, 0x9177, 0x90FE, 0x873D, 0xC48B, 0x9629, 0xD483, 0x9AA6, 0x8F6C, 0xAA03, 0x870E, 0xACF4, 0xCEA4, 0xA001, 0x9497, 0xB74F, 0xD1D2, 0x93A9, 0x8D65, 0x955E, 0x8987, 0xA618, 0xCB2D, 0x9DB9, 0x879C, 0xB164, 0xAB1A, 0xA5AE, 0xCC2B, 0xBCA2, 0xAD3A, 0xB7E9, 0xC589, 0xA790, 0xB898, 0xD046, 0x9E81, 0xB39E, 0xB414, 0x9A97, 0x9F07, 0xD5C3, 0x93C5, 0xC5A0, 0x952D, 0x93C8, 0xB625, 0x93C9, 0xB252, 0x87FD, 0xB1C3, 0xC4E6, 0xD144, 0x9538, 0xCC2C, 0xCC32, 0xB4F5, 0xC3E9, 0x9716, 0xD5EE, 0xBD41, 0x88E1, 0xB319, 0xC1F4, 0xCC44, 0xA5BA, 0xBD48, 0xA973, 0x971F, 0xC0BD, 0xBB7D, 0x9522, 0xC0C2, 0x9836, 0xB651, 0xAA70, 0x9417, 0xB925, 0x9255, 0x965F, 0xD3EA, 0xA0FC, 0xABF7, 0x9681, 0xACEF, 0x9530, 0x854A, 0x96D7, 0xBE1A, 0xA1BA, 0x9434, 0xB93A, 0xC89A, 0xD147, 0xD5DD, 0x96D9, 0xD4CA, 0xCE29, 0xD2EA, 0x84C2, 0x925C, 0xA519, 0xBAB8, 0xBB61, 0xB117, 0xAAD4, 0xA8C6, 0x854D, 0x925E, 0xA62D, 0x8A2E, 0xC186, 0x86E3, 0x9D1F, 0xD04C, + 0x8B82, 0xA8C9, 0x9C55, 0xA1C3, 0xAC86, 0xD151, 0xAA7D, 0xB122, 0x9C66, 0x9C6C, 0xAA34, 0xC915, 0xAC4E, 0xB3BF, 0x8DD3, 0xABBA, 0xC925, 0xCD2E, 0xCD2C, 0x9344, 0x8529, 0x9544, 0xC959, 0x9682, 0xB3C5, 0xCFCC, 0x9545, 0xA84F, 0xCB0E, 0xD414, 0x8F11, 0xC662, 0xB3F2, 0xCA78, 0xC48C, 0xB6E7, 0xB64D, 0xB64E, 0xB3F4, 0x9A91, 0xBC9F, 0xC48F, 0xCB2E, 0xC94D, 0xB3D6, 0xB385, 0xCDA9, 0x95DE, 0x9F84, 0xBD6B, 0xCEBB, 0xC313, 0x9296, 0xB87B, 0x9356, 0xB87C, 0xA734, 0xA5B7, 0x95E0, 0xAF73, 0xB3FD, 0x89D1, 0xCDC9, 0x961D, 0xCAF6, 0x8B7A, 0xC1E2, 0x9331, 0x9962, 0x8B57, 0x8B58, 0x8D7A, 0x942C, 0xC3C1, 0xB08C, 0xCB0F, 0xA493, 0xCB10, 0xB0E8, 0xA850, 0xA8CD, 0xD2D5, 0xB5A4, 0xC337, 0xC57D, 0xC4CA, 0xC2ED, 0xC2EE, 0xA302, 0xB446, 0x9B6F, 0x9B27, 0xC50F, 0xB849, 0x9970, 0x9E7B, 0xD09F, 0x8D87, 0x9307, 0x8ED7, 0xB84B, 0x8B66, 0xD424, 0x9E0A, 0xC717, 0x8B6B, 0xB14C, 0xD55A, 0xC0A9, 0x9B36, 0x9997, 0x98ED, 0x9909, 0x985F, 0x84F1, 0xB169, 0xCB66, 0xA712, 0xB5AD, 0x84F4, 0xA7FE, 0xB08D, 0xB44F, 0x84F6, 0x9274, 0xCB67, 0x9BA0, 0xC720, 0x8EDE, 0xC9CC, 0xA57C, 0xA57B, 0xA2CF, 0xAB74, 0xD17A, 0xB287, 0x9638, 0x963B, 0x9639, 0x8FF9, 0x9004, 0x9212, 0xBAF1, 0xB75B, 0x9219, 0xAE0B, 0x90F4, 0xA5C7, 0xBEDC, 0xD52B, 0x95D4, 0x8A3A, 0x989C, 0xCF31, 0xAFE5, 0xB0E9, 0x8B27, 0xBB97, 0xB5CF, 0x9D4E, 0xA167, 0x9BCF, 0x8BDC, 0xA58F, 0xAA68, 0x9C9F, 0xBDA0, 0xAFD6, 0xA930, 0xAF77, 0x9E98, 0xB03E, 0xD023, 0xA933, 0x9C59, 0xA595, 0x9C03, 0xCCFA, 0xAD92, 0x9A6D, 0x922C, 0xCADA, 0x902A, 0xC9D8, 0x8DC1, 0xBBBF, 0xB48B, 0xCF32, 0x8B41, 0x8E2B, 0x8E2C, 0x9963, 0x95E8, 0xD265, 0xD266, 0xAEF9, 0x8E2E, 0xD1CB, 0x8A4F, 0xA851, 0xD209, 0xCD31, 0xC057, 0xA77F, 0xA8EA, 0xD26A, 0xAF30, 0xBE9A, 0x9221, 0xC81F, 0xBEC5, 0x97C2, 0xB81A, 0xA6F9, 0x98A2, 0xB9A8, 0xA7D0, 0xB1A1, 0xA03A, 0xA17B, 0x8690, 0x8F4C, 0x97DB, 0xC1BC, 0xC6F3, 0xB1C4, 0x8D00, 0x9044, 0x9045, 0xBEF8, 0xA148, 0x8D0B, 0xA3FC, 0xA70B, 0xA437, 0x8D0C, 0xA70C, 0xC1F0, 0xA438, 0xA713, 0xA718, 0x8D0F, 0x84F2, 0xB98E, 0xBBC5, 0xBEE3, 0xA43F, 0xAF13, 0xD27B, 0x8E41, 0xAF3D, 0xB456, 0x9E6B, 0xBEE4, 0xBEE6, + 0xA907, 0xCDF2, 0xAEF2, 0xD141, 0xBB94, 0xBC02, 0xCB2F, 0xBC18, 0xBB9C, 0xD149, 0xD14A, 0xB721, 0xCAC8, 0xA5E0, 0x9C1A, 0xB53C, 0xA324, 0x88FD, 0x957D, 0x8F1E, 0x9AAC, 0x9ACE, 0x8B39, 0xB6B6, 0xC54A, 0xB743, 0xD382, 0xCECD, 0x90E7, 0x9528, 0xB6D9, 0x94EB, 0x8933, 0xC20C, 0x89E9, 0x967D, 0xD23D, 0x981F, 0x93D4, 0x92F8, 0x9342, 0xB061, 0xB02A, 0x9D9D, 0x92CC, 0xD495, 0xCD03, 0xADEA, 0x84D3, 0xA325, 0xB654, 0x95FD, 0xCDF8, 0xC1CF, 0xC96E, 0xB281, 0xB103, 0xB394, 0xC2BF, 0xC2C0, 0x9310, 0xA326, 0xA04D, 0xBD0E, 0xB963, 0xD33F, 0xD119, 0xC56C, 0xB967, 0xC16E, 0xD394, 0x8FF6, 0x8E47, 0x86A6, 0x8538, 0x8819, 0xB59D, 0xBE6A, 0x8619, 0x96BE, 0xBCF1, 0xD528, 0x92FF, 0xD243, 0xAEB0, 0xB094, 0xD542, 0x93D8, 0xB042, 0xD1C4, 0xC428, 0xD60F, 0xB063, 0x9D7A, 0xB984, 0xD244, 0x85C8, 0xADB2, 0xB57D, 0x99CF, 0xA2E2, 0x8B3F, 0xCC06, 0xC692, 0xC90B, 0xA8E5, 0x9077, 0xA265, 0xA959, 0xA066, 0xAF87, 0xC829, 0xB02B, 0xA398, 0xCA70, 0x9731, 0x97FD, 0x9583, 0x907B, 0x8AFD, 0x9EBF, 0xC651, 0xC652, 0x921C, 0x84CA, 0x992C, 0xB14F, 0xAE74, 0xD543, 0x974D, 0x8ACF, 0xBEB4, 0xD24B, 0x8D7B, 0xAB94, 0xC574, 0x8D7C, 0xC575, 0xAAEB, 0xAAEA, 0x9CC5, 0xC576, 0xAF27, 0xA3A6, 0xB7A3, 0xCFD8, 0xB288, 0xAE54, 0xAC57, 0xAF5E, 0xAA27, 0xC1DC, 0x87FE, 0xC1D2, 0xC093, 0xC664, 0x9EED, 0xA075, 0xCD32, 0x9925, 0x8DAF, 0xA7CB, 0xB868, 0xBF04, 0xAB98, 0x8C8B, 0xB96C, 0x9D6A, 0xBDE8, 0xA197, 0x9C8E, 0xC663, 0xC602, 0xBFFE, 0xB045, 0x8AD3, 0xBFC6, 0x9463, 0x90A3, 0xBFFF, 0xAEEF, 0xAE56, 0xB12C, 0x9688, 0xAA73, 0xA5F5, 0xA728, 0xD11D, 0xBC61, 0x9F46, 0xA769, 0xBB18, 0xB113, 0x8755, 0xAA5E, 0xB150, 0x97F2, 0xB5F9, 0x8C6C, 0x8E64, 0xBE86, 0xAE6C, 0xA034, 0xADFA, 0xA4A0, 0xC9FF, 0xC831, 0xB6C4, 0xB96D, 0x8CA9, 0x946B, 0x9468, 0xA107, 0x92FB, 0xB3CC, 0xC0A7, 0x9081, 0xB114, 0x97D6, 0xD550, 0x9040, 0xC218, 0xABA7, 0xB761, 0x914D, 0x8B61, 0x8D30, 0xAA77, 0xAFD4, 0x8F70, 0x84A8, 0xC613, 0xAE5B, 0xBAE0, 0xBAFF, 0xAE29, 0xCF65, 0xD347, 0xB713, 0x91EB, 0xB7B2, 0xBF81, 0xC968, 0x9E3F, 0xC14D, 0x9EF8, 0xCD97, 0x9D57, 0x9103, 0x86CA, 0x89F4, 0x9498, 0xC490, 0xAEBB, 0xACA9, + 0xC059, 0xBDF3, 0xBFC7, 0x85B1, 0xB39A, 0xAA05, 0xC05A, 0xBA7A, 0xBD87, 0xBC1E, 0xD486, 0x95AA, 0xCB39, 0x8835, 0xA786, 0x9CA0, 0xB118, 0xC584, 0x954E, 0xAA06, 0x87B3, 0xAFC9, 0x89F9, 0xA9C5, 0x97DD, 0xB02E, 0x8C25, 0x875E, 0x9E99, 0x93EC, 0xBD8B, 0xAD45, 0xC308, 0xD43E, 0xA9C6, 0x9ECE, 0xCC99, 0xA9F0, 0xD2FF, 0xC76F, 0x891D, 0xA822, 0xBF3C, 0xB0BA, 0xAEBE, 0xD093, 0xA796, 0x8D89, 0x9761, 0xC520, 0xBDEE, 0x9291, 0xD279, 0x9ED1, 0xB89D, 0x99C8, 0x8D88, 0xCA24, 0xC4B8, 0xBC55, 0x936C, 0xCC39, 0xB879, 0xD42F, 0x8E51, 0xA3B0, 0xAF68, 0xBFE6, 0xA719, 0x86F3, 0xCCB6, 0xA20B, 0x8C20, 0xCB68, 0xA1A9, 0xA4A9, 0xA731, 0xB7EB, 0xBFE7, 0x969E, 0xB2C1, 0x8D8D, 0x87B8, 0xC793, 0xAE62, 0xC21D, 0xCFDC, 0xC4A0, 0x876A, 0xC645, 0xA460, 0xA4AC, 0xC83F, 0xA96F, 0x9C09, 0xCF82, 0xAA94, 0xB5B8, 0xCFDD, 0xAA35, 0xAE96, 0xCF83, 0x8A64, 0xB33B, 0xC20E, 0x9740, 0xCFCF, 0xA7FC, 0x973D, 0xD538, 0x9EDF, 0xAEFA, 0x8BC8, 0x9CFA, 0x9549, 0x8BC9, 0xAC90, 0xAF0E, 0xD2A5, 0xD2C5, 0x959E, 0x9E40, 0x9005, 0xD250, 0xC666, 0xBCFF, 0xD1B5, 0xA0D0, 0xC477, 0xCD73, 0x8934, 0xC9AB, 0xCD7A, 0x8B7B, 0xB630, 0xC388, 0xA0DD, 0xCDA6, 0xCDE2, 0xC618, 0xA149, 0xA0E3, 0xC607, 0xB8F9, 0xB8FE, 0xB903, 0xA0C8, 0xBA37, 0xBD1D, 0xBA9A, 0xBA51, 0xBE8A, 0xBD62, 0xB243, 0xB244, 0x96FF, 0x9A60, 0xBE93, 0x8C3D, 0xBB29, 0xC3CC, 0xC275, 0xD35D, 0x8EB3, 0x8C31, 0xB865, 0xCAA6, 0x9284, 0xAFE0, 0xBD12, 0x9286, 0x858C, 0x8C32, 0x9873, 0x92DB, 0x8577, 0x868C, 0xA95B, 0xD330, 0x9E33, 0x88D7, 0xA852, 0xD3D5, 0xD011, 0x918C, 0x8824, 0xC42D, 0x95BB, 0x8C33, 0xC3C2, 0xA95E, 0xB507, 0xB034, 0xC2EF, 0xA391, 0x943A, 0xCFF9, 0x93AA, 0xA619, 0xB8D7, 0xCDA0, 0xA547, 0xBF06, 0xBF08, 0xC14E, 0x8836, 0xAC1E, 0xAEDC, 0xA10D, 0x9AEE, 0xBA70, 0xD55B, 0x8742, 0xADD5, 0x9011, 0x908F, 0x85C0, 0x893E, 0xCB5B, 0xBBE0, 0x88DF, 0x88F4, 0xA934, 0x8E1B, 0xC770, 0xC9C8, 0x8B83, 0x8EF9, 0x8E86, 0xB3EF, 0xA993, 0xCABA, 0x9CB3, 0x9E6C, 0x9C04, 0xAC12, 0xB2CC, 0xA995, 0xA974, 0x89A8, 0xBB0D, 0x95CB, 0xA753, 0x9D9E, 0x9DCA, 0xB7FA, 0xC8C3, 0x942D, 0xB1A7, 0xC8EC, 0xC8FC, 0x88F8, 0x88F7, 0xCAC5, 0xA59E, + 0xBED9, 0x9EB4, 0x847B, 0xAE00, 0xBE9B, 0x9EB5, 0x9F53, 0xB09F, 0xC076, 0xCAD0, 0x8931, 0xAC88, 0xAC4F, 0x94E6, 0xB332, 0xCDF3, 0xCDF4, 0xB8E0, 0xC64A, 0x90E4, 0x9A08, 0xB2D9, 0xAB2B, 0xD539, 0x9B5E, 0xBC3F, 0xD2A6, 0xC4A7, 0xB0FF, 0x93FD, 0xBFDD, 0xC12B, 0xC243, 0xD236, 0xB2F7, 0xB85C, 0xC1B0, 0xB3A5, 0xB699, 0x93FE, 0xA357, 0x9FA3, 0xA953, 0xD3FD, 0x9C1B, 0xB485, 0xB279, 0xC847, 0x932A, 0x8522, 0xB774, 0xC5DF, 0x9CDC, 0x9A2C, 0x9A2D, 0x92BE, 0xC28B, 0xA1D3, 0x9CDD, 0xD28F, 0xCF29, 0xB486, 0x84FD, 0x8BD5, 0xAB6E, 0xC7ED, 0x93FF, 0xB6D0, 0x986C, 0x8CF4, 0xCBC0, 0xCD2A, 0x8732, 0xCADB, 0xB453, 0xC12C, 0xA675, 0xB12B, 0x91C6, 0xC474, 0x89EA, 0x88D4, 0xD3FE, 0xBBF2, 0x8F58, 0xCECF, 0xB663, 0xA838, 0xBCF8, 0xB8E1, 0x8F20, 0xACB4, 0xB4E1, 0xA67C, 0xCCE5, 0xA2DD, 0xADC3, 0x8618, 0x85C7, 0x9635, 0xACEB, 0xCAA3, 0xCAA4, 0xA158, 0xB185, 0xB788, 0xA37E, 0xD402, 0xAE9D, 0x8815, 0x87CD, 0xB88A, 0xC673, 0xC9A5, 0xC3F8, 0x8646, 0x9958, 0xCC15, 0xD07B, 0x9053, 0xA0F3, 0x8FEF, 0xAEF5, 0x94EE, 0x99B7, 0xB1B0, 0xAB91, 0x940A, 0xB97F, 0x96BD, 0x86A1, 0xC16C, 0x940B, 0xD4B6, 0xAB70, 0x92A9, 0xB455, 0xAB51, 0xAB66, 0x8535, 0x8CC3, 0xAD65, 0xD4E7, 0xD292, 0x8B1F, 0x9CE8, 0xA024, 0xA8E1, 0x8CF7, 0xAEE4, 0xAEE5, 0xC761, 0xCC55, 0xB4FE, 0x9597, 0xAD20, 0xA684, 0xB6DD, 0xCC04, 0x95CC, 0xB3A7, 0x896B, 0x8A6A, 0xCDFE, 0x987B, 0xD53A, 0xA7C2, 0xC24A, 0x9159, 0x9749, 0x8CE8, 0x9DE9, 0x8CC4, 0x9644, 0x972D, 0xAB33, 0x8947, 0x9EBC, 0x9EBD, 0x9418, 0xCD7B, 0xD3AD, 0xD4EC, 0x9E75, 0x9B45, 0xCB95, 0x8948, 0x9256, 0xB6DE, 0xB728, 0x8B77, 0xAB43, 0xBF1E, 0xD351, 0xB338, 0xD3D0, 0xC7A6, 0x9A88, 0x93D9, 0xB5EA, 0x94C2, 0x8DD4, 0xA027, 0xC63B, 0x8C3E, 0x88F9, 0xA028, 0x921A, 0x84C8, 0xB420, 0x8B22, 0xB69F, 0x9E2B, 0xCA67, 0x9ACF, 0xB1B7, 0xA685, 0x9FC7, 0xA581, 0xBAD5, 0xD45F, 0x8DD5, 0x9D64, 0xB67E, 0x86A7, 0x8908, 0xB421, 0x9B5F, 0xB2FF, 0x8E98, 0xCD7C, 0xB6DF, 0x9BAE, 0xCC57, 0xAA9C, 0xCC58, 0xB371, 0x9FF8, 0xBC7F, 0xCB96, 0xAADF, 0x995E, 0xD395, 0xC9B8, 0x90EA, 0xC134, 0xA609, 0x909D, 0x93DD, 0xB6A2, 0xCBCA, 0x98D0, 0x8679, 0x887E, 0xCF4A, + 0x8F25, 0xBF77, 0xBC44, 0xBC45, 0x8ACA, 0x8A6D, 0xC24B, 0x878A, 0xC2D3, 0x95E9, 0xA694, 0xB21F, 0xD410, 0xAD6F, 0xA60A, 0xD462, 0xD5FC, 0xBFFA, 0xB549, 0xB82F, 0xBC98, 0x8A6E, 0xB0A4, 0xA13F, 0xAB95, 0xABF8, 0xC63D, 0xA02A, 0x8A42, 0xC5E6, 0xA22F, 0xC853, 0xBEEC, 0xCD0B, 0x8DB5, 0xC08B, 0x9848, 0xCD2F, 0x8DB6, 0x9D68, 0xC0BB, 0xCD0C, 0xAF57, 0xB8D1, 0xC484, 0xA53B, 0x9421, 0x91A4, 0xAD70, 0xC1D9, 0x9F67, 0xAE1C, 0xADC5, 0xA299, 0xA4BC, 0xA6F6, 0xB9EF, 0xC1F9, 0xBF9A, 0xC3FC, 0x9BE8, 0xCD0D, 0xCC59, 0xCC19, 0xAE75, 0x8C89, 0xAB41, 0xAB42, 0x8CEA, 0xC094, 0xA031, 0x8F66, 0xB59E, 0x905D, 0x9DA7, 0xD58C, 0x9662, 0xA494, 0xA9A9, 0xA120, 0xC173, 0xA233, 0xAEFD, 0xA44D, 0x98D6, 0xB221, 0xCF93, 0x955B, 0x97E4, 0x942E, 0xAA5C, 0x89DA, 0x8BA2, 0xBBB4, 0x8C69, 0xD0E5, 0xABE2, 0x88A5, 0x853A, 0xA60F, 0xBF9C, 0x87FF, 0x984D, 0x85F2, 0xB4B5, 0xA1A7, 0xC2E0, 0xB48C, 0x8F48, 0x9F3C, 0xB220, 0x8E9A, 0x9FDC, 0xB424, 0xBCFB, 0x95D6, 0x9A3A, 0x9663, 0xA853, 0x92E9, 0xB479, 0x84A2, 0xC0C4, 0x8660, 0xD385, 0xC82E, 0xD5A0, 0x9DA8, 0xA808, 0xBD4E, 0xBA95, 0xBE6E, 0x8ED2, 0x99FA, 0xB295, 0x98D7, 0x8D81, 0xBDD1, 0x8C76, 0x86B2, 0x89F2, 0x9A8A, 0x9318, 0xA4C5, 0xB25A, 0xABF9, 0xB1BD, 0xC13C, 0x8E60, 0xB845, 0x9A8B, 0xC88B, 0xCA75, 0xB8E4, 0x9CF8, 0x96EB, 0x890F, 0xAE0C, 0xD1CC, 0xC036, 0xA0B4, 0xBEC4, 0xAA74, 0x86B3, 0xCB11, 0xABFA, 0x8602, 0xB05B, 0x903E, 0xCC5A, 0xCC5B, 0xCC5C, 0xC509, 0xB7A4, 0xB522, 0xA2EA, 0xC4E7, 0xC0A8, 0xCDD9, 0xCDDA, 0x9491, 0xA740, 0xC70D, 0xC70E, 0xAE28, 0x8914, 0xC1FE, 0x8C99, 0xC510, 0xCD85, 0x870F, 0xADC9, 0x84A5, 0x91E2, 0xAAA2, 0xCC61, 0xA47D, 0xA47E, 0x9E79, 0xACA8, 0xD5FF, 0xD614, 0xD5A1, 0x85DE, 0xB711, 0xC359, 0xCA00, 0x84A6, 0xB5A5, 0x9DAE, 0x9435, 0xAA18, 0x9DAF, 0xB08A, 0x938A, 0x996B, 0x996C, 0x9991, 0xC8D2, 0xBF69, 0xD415, 0xD4FF, 0xC4B2, 0xB6C5, 0x959F, 0xB31C, 0xB4DA, 0xAC5A, 0x9AE2, 0xB937, 0xB222, 0x94DA, 0x9065, 0xD39A, 0x9E41, 0xC144, 0x8828, 0xC0E6, 0xAFE2, 0x9CFB, 0x99DB, 0xCFDA, 0x9D53, 0x90FF, 0xC9BD, 0xBC47, 0x8CFD, 0xB5FA, 0xC0E7, 0xD19F, 0xA40B, 0xBEF2, 0x9BB6, 0xC35A, 0xB9C0, + 0xB30A, 0xA4EA, 0xD551, 0xC966, 0xCE7E, 0xABA1, 0xCF15, 0xBADA, 0x8F6D, 0xD44D, 0x96ED, 0xB667, 0xC755, 0x89B7, 0xA278, 0xA42E, 0xA42F, 0x9E91, 0xA926, 0xC145, 0xAFFC, 0xCD35, 0xBBDA, 0xCBAC, 0xB9C4, 0x8C8F, 0xB9F6, 0xCF17, 0xD1A7, 0xA55D, 0xB72E, 0xAC1C, 0xA6AB, 0xB626, 0xBC3C, 0xCEB0, 0xA6AC, 0xA145, 0xC2F7, 0x85BC, 0x8BD8, 0xC6B6, 0xBF82, 0xA897, 0x9BF3, 0x8F9D, 0xB3B1, 0xD5A2, 0xB1F9, 0x8DAA, 0xCE80, 0x8BDD, 0xCE2A, 0xA39B, 0xB009, 0xB223, 0xB224, 0xADF7, 0xBB3E, 0xC33C, 0x9349, 0xCF39, 0xD210, 0x9DBA, 0x9C9A, 0xB791, 0x88DD, 0x9209, 0xAC35, 0x987C, 0xBC84, 0xD1A8, 0xAD29, 0xBBDB, 0xC6EB, 0xA898, 0xC33D, 0x9665, 0xA540, 0xB6EF, 0xC1ED, 0x94DE, 0x8DBB, 0xB9C5, 0xBD80, 0xAA8F, 0xB750, 0xBCA0, 0xC712, 0x862F, 0xC9B0, 0x9792, 0x86CB, 0xD572, 0x97A9, 0xD615, 0xBEA3, 0x8917, 0xB07D, 0xA4EC, 0xA4ED, 0x9D00, 0xA61A, 0xB93B, 0xA555, 0xCE2B, 0xA85A, 0xCC66, 0xAD7B, 0x8FE3, 0xBEA4, 0xAB6A, 0xBF13, 0xD3D7, 0xB0B1, 0x84AA, 0xA701, 0x8D01, 0xC35E, 0xB1C5, 0xB524, 0x9FE6, 0x8C92, 0x9F81, 0xC118, 0xBFB9, 0x88F1, 0xCE3E, 0xCB3A, 0xA129, 0xA7AB, 0x86CC, 0xA988, 0xC6FD, 0x8884, 0xD100, 0xA5AF, 0xB3E7, 0xAB1B, 0xC865, 0xA861, 0x9CFC, 0x8759, 0x97AD, 0x9839, 0x8F2D, 0xBC1F, 0xA9C1, 0xB912, 0xB8B7, 0x8F2E, 0xACD5, 0xC788, 0xAB1C, 0x885B, 0x8F78, 0x8DAB, 0xD185, 0xB93E, 0xC74C, 0xC17B, 0x99E0, 0x84EF, 0xAC5C, 0xA92C, 0x8D3F, 0xD335, 0x88A7, 0xB1E1, 0x9E95, 0xAC7B, 0x8D02, 0xAEEA, 0x9B7D, 0xA1C0, 0xCBDA, 0xB873, 0xC837, 0xBAA4, 0xCBAD, 0x97DC, 0x8A79, 0x9A1E, 0xB833, 0xA36A, 0xB3B5, 0xAAB6, 0x88E4, 0xD019, 0xB3E4, 0x908C, 0xA72D, 0xA81F, 0xA36B, 0x8472, 0x86DD, 0xA626, 0xC157, 0x9CA6, 0xB386, 0xB9AB, 0x928D, 0xAC03, 0xAFD7, 0x89BD, 0x8F9E, 0xC7D6, 0x9ECF, 0xB76D, 0xB76E, 0xA5CF, 0xCDAA, 0xB42D, 0x8BE3, 0x9A42, 0x9DC1, 0xAAE2, 0xCF3D, 0x85CD, 0xCD1F, 0xB5A7, 0xA9CE, 0xB681, 0x9B86, 0x91F1, 0xBE24, 0x9308, 0xA201, 0xD5E0, 0x931E, 0xB730, 0x934E, 0xA439, 0xBB2B, 0xB76C, 0xC806, 0xC6AB, 0x949E, 0xA202, 0x8EA2, 0xC252, 0x906A, 0xBB6C, 0xC521, 0xC398, 0xA8F0, 0xCF6A, 0xB8DA, 0xB2B6, 0x9DC2, 0xCF6B, 0xBC87, 0xA866, 0xCE47, 0xC3D0, + 0xC1F2, 0x9CA7, 0x9979, 0xBBA2, 0xAF66, 0xA5D1, 0xC71A, 0xCF6D, 0xCE3F, 0xC344, 0x98AA, 0x883D, 0x987E, 0x848D, 0xC0F2, 0x9B8D, 0x9B8E, 0x9D18, 0x8CD6, 0xC4B5, 0xC0AB, 0xACD6, 0xCB5C, 0xA5FC, 0x9E82, 0x88CB, 0xB940, 0xB3EB, 0xA714, 0xA2F3, 0xCEBC, 0x8DE1, 0xBE52, 0xBD6D, 0xC757, 0x86ED, 0xD0B7, 0xBC88, 0xC40B, 0x9292, 0x9034, 0xC5C7, 0x969C, 0xC5C8, 0xBABD, 0x9E5A, 0x987F, 0x9946, 0xB7AA, 0xC5F2, 0xC78B, 0xC9C4, 0x856E, 0xBBED, 0xBABE, 0xC790, 0x9126, 0xB196, 0xC15C, 0xAF3B, 0x8BB5, 0xAADC, 0xB737, 0xB170, 0xBD05, 0xB317, 0xCFED, 0x8A80, 0xD1B6, 0x9238, 0xAEA9, 0xCC73, 0x9566, 0x8D26, 0xC526, 0xB2BD, 0x925F, 0x9E0D, 0xC6F8, 0xA416, 0x9FBB, 0x872B, 0x8FEA, 0xAC82, 0xA4F7, 0xA018, 0x88E5, 0xACC4, 0xB513, 0xB46E, 0xC466, 0xC461, 0xAFD8, 0xC446, 0xBC2F, 0xA9F2, 0xCB6C, 0xC6FA, 0xC599, 0xA633, 0xCB6D, 0xA49C, 0xA5D5, 0x9F2E, 0x8F34, 0xD2A2, 0x860C, 0xBDFD, 0xC9C9, 0xAD8B, 0x9AC9, 0x8767, 0x9275, 0xBBEF, 0xBD42, 0xBFBA, 0xB516, 0xB435, 0xC190, 0xA8B0, 0x9B96, 0xAFCC, 0x9568, 0xCF72, 0x85E8, 0xA6D1, 0xBAC1, 0xD3C5, 0x8477, 0xA825, 0xCFEE, 0xC721, 0xB4BB, 0xA4E0, 0x9C05, 0xC03A, 0xC2AE, 0xB771, 0xB772, 0xB2C5, 0x9933, 0xA96B, 0xBBF9, 0xBFC3, 0xAB40, 0xCF75, 0xB1D2, 0xCDEC, 0xC795, 0x9D2E, 0xA092, 0xC722, 0xAD52, 0xB52F, 0xBBFA, 0xA0A8, 0x93BC, 0xAF1A, 0x885A, 0xB66E, 0xCB7A, 0xC46D, 0xCE5C, 0xA135, 0xA735, 0xA736, 0xCBFF, 0xB3F0, 0xCC45, 0xA8F9, 0xBF5C, 0x9A35, 0xCF0B, 0xA875, 0xB5B0, 0xC99B, 0x929A, 0xABB3, 0x9867, 0xA402, 0xA504, 0x9D33, 0x8EAA, 0xAB25, 0xA5F2, 0xA5BB, 0x9A61, 0x939C, 0xD25B, 0xC195, 0xA41B, 0xD0F2, 0x9A6E, 0xA63F, 0x9D35, 0xAC47, 0xA5DB, 0x9A73, 0xAA84, 0x9C67, 0xA41C, 0xA9E7, 0x9DE1, 0xB7BD, 0xBE02, 0xA5C1, 0xB61B, 0xC538, 0xCB88, 0xAA38, 0xABE6, 0x8785, 0x99B0, 0x99F7, 0xA97E, 0xAF94, 0xAA13, 0xBB52, 0xC501, 0xB374, 0x8C10, 0x99BF, 0xC696, 0x8DA4, 0x942F, 0xC697, 0xC69D, 0xA985, 0x99FC, 0xCDA1, 0x98A3, 0x9EC7, 0xA175, 0x97DE, 0x85FB, 0xC867, 0xD0EE, 0xD0EF, 0xA3FE, 0x87A7, 0xC39E, 0xBAEE, 0x8B85, 0xB53E, 0x8FC2, 0x9CC3, 0xB540, 0x8A9F, 0xB9B2, 0xB9B3, 0xA1DB, 0xD15B, 0xB8FB, 0xCD5E, 0x9821, + 0xD52C, 0x995F, 0x9B1E, 0xABF4, 0x95BE, 0xBC40, 0xC3A7, 0x896C, 0xB9EB, 0xCAA7, 0xAABE, 0xC4D0, 0x92C3, 0x91D3, 0x852A, 0x8B42, 0xB341, 0xC1B5, 0xC1B6, 0xB776, 0x85B3, 0xB108, 0xCEF5, 0xCEF6, 0xA230, 0xB289, 0xBF24, 0xCBEE, 0xB28A, 0x88B7, 0xCE9C, 0xA1E0, 0x9B48, 0xB48D, 0xB28B, 0xD354, 0xC7F2, 0x9881, 0xADC6, 0xC0BC, 0x9345, 0x9346, 0x9874, 0x9601, 0xCFE8, 0x9483, 0xB657, 0x9FB0, 0x9422, 0x8AFE, 0x9097, 0xB050, 0xC456, 0xAE89, 0x8E0D, 0xB520, 0xCD12, 0xD08E, 0xB1BE, 0x8B28, 0xCD50, 0x98D8, 0x9811, 0xA168, 0xA69C, 0x948B, 0xB659, 0xD072, 0x963C, 0xB10E, 0x8851, 0xC42E, 0xD416, 0x8FC7, 0x878B, 0x87D5, 0x9664, 0xD0AC, 0xB580, 0xB8FC, 0xBEC9, 0xA854, 0x9689, 0x8E61, 0x968A, 0xCC5D, 0xA69D, 0x8AA5, 0xB584, 0xAB57, 0x95A0, 0x8CEC, 0x9B4B, 0x9B4C, 0xAB3D, 0x9492, 0xC92D, 0xC049, 0xA7CC, 0xD3B7, 0xCA3B, 0xC433, 0xA47F, 0x9EC3, 0xA6A3, 0xCB20, 0xB1C6, 0x9F71, 0x95A1, 0xB8FD, 0xCA79, 0xC0C8, 0xAD75, 0xB508, 0xB465, 0x977F, 0xB509, 0xD2E1, 0xAAF7, 0xA586, 0xD167, 0x9D6D, 0xAE45, 0xBB58, 0xB2A1, 0xC614, 0x9FB5, 0xB55C, 0xB8D8, 0xCCDD, 0x9D6F, 0xBFCE, 0x8A44, 0x8630, 0x91AC, 0x9853, 0xBABB, 0xC72D, 0x938E, 0xB972, 0xD1EA, 0x946A, 0xC45E, 0xD152, 0xC251, 0x943B, 0xA61B, 0xA548, 0x86CD, 0x8BDE, 0xCE81, 0xCD37, 0x9F79, 0x8E65, 0xC85F, 0xBEF3, 0x8FB2, 0xBFCF, 0x9B4D, 0xC202, 0xD255, 0xBBB7, 0x92EF, 0xA10E, 0xAC7C, 0xB2B1, 0xB2B2, 0xCE36, 0xA253, 0xA4A4, 0xAC1F, 0xB3CF, 0xBB62, 0xC2FF, 0xAA61, 0xA6B5, 0x900F, 0xBEA7, 0xBDD5, 0xA458, 0x9831, 0x9858, 0xCE37, 0x85BD, 0x92FC, 0xB119, 0xC152, 0x9130, 0xCB3B, 0xCE85, 0xBCBB, 0xB602, 0xB39B, 0xB779, 0xAE8D, 0xB4CB, 0xC153, 0xA76C, 0x97EB, 0xC06C, 0x905F, 0x91EE, 0x858E, 0x8F79, 0xC0CB, 0x88BB, 0xAC5B, 0xCC69, 0x97CA, 0x898A, 0x898B, 0xA4A5, 0xA2F8, 0x9C9B, 0xC565, 0xBEF9, 0xAB83, 0xC6AC, 0xAC91, 0xCDAB, 0x9F4B, 0xB9FA, 0xC718, 0x9AEF, 0xC89F, 0x8715, 0xB715, 0xC0EF, 0x949F, 0xCEB6, 0xABD8, 0xC181, 0x9448, 0xB765, 0xC58A, 0xCD20, 0xB562, 0xAB5B, 0xC3AF, 0xCC2D, 0xB9CC, 0x8B8C, 0xBD6C, 0xD3BC, 0xD55C, 0xBE25, 0x94A0, 0xCEB7, 0xA413, 0xAC04, 0xA4A8, 0x90C0, 0x99E5, 0xB528, 0x9012, + 0xC343, 0xC204, 0xCF1A, 0xB5C6, 0xAE2A, 0xA931, 0x8C7E, 0xB6F5, 0xCC6B, 0x9E7E, 0x857E, 0xA54A, 0xB037, 0xBB6F, 0xC314, 0x8CEE, 0xC315, 0xCEBD, 0xC1E5, 0xA715, 0xBBE1, 0x857F, 0xB6FA, 0xB6FB, 0x9CAE, 0xC239, 0xC686, 0x9860, 0xB4A1, 0xCA8B, 0x8673, 0x9A43, 0xBD8F, 0xCAB7, 0x90EF, 0xAE10, 0x98EE, 0x99E9, 0x9B50, 0xAAC5, 0xAD2F, 0xCB5D, 0xC1C1, 0xCC6F, 0xBDF9, 0xD337, 0x88E0, 0xBBA6, 0xB2B8, 0xAB0B, 0xBEAC, 0xB8BA, 0xBA5F, 0x88F5, 0x8B0E, 0x8F81, 0x84F3, 0xA9D4, 0xC18C, 0xD311, 0xBD92, 0x8A7E, 0xB16A, 0xB5AA, 0xB11F, 0xCDB7, 0x9E62, 0xAA7C, 0xA935, 0xB4AF, 0xD339, 0xCBFE, 0x9E85, 0xBAF8, 0xC1C4, 0xC527, 0xAB22, 0xD171, 0xD188, 0xAAB8, 0xAAB9, 0x97CD, 0xA8AB, 0xAB5E, 0xC31B, 0x8D10, 0xA62F, 0xAB0D, 0xC528, 0x89FD, 0xD106, 0xAB46, 0xC4EF, 0xAD8C, 0xD5CF, 0xBB71, 0xB52C, 0xBDED, 0xD27C, 0xB0BE, 0xB0BF, 0x9F0C, 0xB5AE, 0x878E, 0xA79F, 0xB011, 0x9784, 0xC36A, 0x9CD0, 0xD442, 0x9AF5, 0x92FD, 0xA576, 0xA20D, 0xA20E, 0x9B9D, 0xCBE4, 0x8999, 0x9ED8, 0xB8A2, 0xAE4B, 0xC52E, 0xADA3, 0x8B8D, 0xC7BC, 0xBB72, 0x8BEB, 0x8AB7, 0x8E87, 0xA662, 0xC5D2, 0xB8A3, 0xCABB, 0xA05D, 0x8DE5, 0x899D, 0xB31A, 0x8CD9, 0xC4D9, 0xB913, 0xAA93, 0xB4A3, 0xCC7D, 0x8970, 0xA6C9, 0xD038, 0xC723, 0xA71F, 0xD3D9, 0xD028, 0xC566, 0xAB47, 0xC5D3, 0xB2CD, 0xB704, 0x9E1B, 0xAC22, 0x9890, 0xB73D, 0x9C06, 0xD4DF, 0x9F92, 0x87AD, 0x98B9, 0xACDD, 0x929C, 0xA5DA, 0x9F91, 0xA4B2, 0xAD19, 0xA640, 0x8C9E, 0xA6DA, 0xB569, 0xAF20, 0xA975, 0x90F2, 0xC535, 0xD3CA, 0xA908, 0xA641, 0xA909, 0xB03C, 0xC9D6, 0xB126, 0xAE31, 0x96A4, 0xA1A1, 0xCC4D, 0xBAC6, 0xC330, 0x88BD, 0xB5BA, 0xB610, 0x90F3, 0x88BE, 0xAB05, 0xB5BD, 0x9F93, 0xD3E3, 0xD4AF, 0xC774, 0x9AD0, 0xAF8F, 0xB064, 0xAF92, 0xC603, 0xD35A, 0xAAED, 0x9244, 0xA26B, 0xACDE, 0xC3A4, 0xC621, 0xC886, 0xA2A7, 0xCED3, 0xB59F, 0xA855, 0xC745, 0xBADB, 0xC42F, 0xBF2B, 0xA91E, 0x9F47, 0xC437, 0xC7FA, 0x99E6, 0xC182, 0x8EDA, 0x8B81, 0xC187, 0x8EDC, 0xD499, 0x9930, 0xB5BB, 0xCA2C, 0xCA2A, 0x8868, 0x9501, 0xCD74, 0x8776, 0x8953, 0xCA5D, 0xB85F, 0x8A8D, 0x93DA, 0x97A3, 0x932F, 0xBAF3, 0x9F5E, 0xADEC, 0xD32E, 0x8E48, 0xCAF7, + 0xD352, 0xD331, 0x9FAC, 0xD245, 0xC577, 0xB655, 0xD246, 0xB6BC, 0xB477, 0x9FC8, 0xA22C, 0xCE9D, 0xABCC, 0x896E, 0x84FF, 0xAEE6, 0x9B1F, 0xB656, 0x9D4F, 0xC011, 0xA87F, 0x8E0E, 0x85F3, 0xB04E, 0xC9BA, 0xD612, 0x86AC, 0xB8ED, 0xBD4C, 0xA169, 0x98FC, 0xC763, 0xC67C, 0xD1C9, 0xCA71, 0xAFED, 0x87F7, 0x8F0E, 0xC056, 0x9484, 0x97A6, 0xD2C6, 0xD2D6, 0xB658, 0xB01F, 0xCB03, 0xAB75, 0xBFFB, 0xADEF, 0x9628, 0xC741, 0xD15F, 0xB57E, 0x861F, 0xCE0F, 0xC338, 0xAC32, 0x87F8, 0x8800, 0x9430, 0x8B47, 0x8B43, 0xA386, 0xB6C2, 0x9EA6, 0x9D50, 0x9E37, 0xAD74, 0x9F6D, 0x921E, 0x9584, 0xB72A, 0xD3B4, 0x9751, 0xCB9F, 0x8898, 0xA7CD, 0xA266, 0xC62E, 0xD465, 0x8E7D, 0xB819, 0xA44E, 0xA330, 0xAEE9, 0xBADD, 0x9D54, 0xA46D, 0x8ADC, 0xA65A, 0xA198, 0xB938, 0xB202, 0x95A2, 0xCB30, 0xCE20, 0xD1CD, 0xA893, 0xB55D, 0xB64C, 0x9D01, 0xCB31, 0x886B, 0xD466, 0xBB24, 0xB834, 0xB64F, 0xA657, 0xA6FA, 0xA729, 0xA389, 0x9DFB, 0xC682, 0x8978, 0x86CE, 0xA452, 0xBDD3, 0xCEDA, 0xA85B, 0x8B48, 0x89DF, 0x8BAA, 0x915E, 0x8778, 0xA76A, 0xB8BE, 0xB06D, 0xB06E, 0x92ED, 0x97AA, 0xAA90, 0x97EC, 0xC89B, 0x90BE, 0xBE4D, 0xD2F5, 0xA10B, 0xB2E9, 0xB2A6, 0x97E7, 0x96DA, 0xA331, 0xB260, 0xBE4E, 0xBA52, 0x9444, 0x8B8A, 0xC5BB, 0x8728, 0x9010, 0xA459, 0x90F8, 0xC683, 0xC684, 0x9906, 0xCEDB, 0x85CE, 0x85E2, 0x949B, 0xCDA7, 0xBFB7, 0xC89D, 0x9B32, 0x8632, 0x8BF9, 0xAA07, 0xB053, 0x8E37, 0xCF50, 0xBCC7, 0x962E, 0x8DC5, 0x9A66, 0xB6F6, 0xCEDC, 0xB752, 0xAE0F, 0xA0A6, 0x8951, 0x8580, 0xBFD0, 0x8B4A, 0xB7DE, 0xAEEC, 0xCC33, 0x9FB9, 0xB359, 0x9A69, 0xA38C, 0xA70D, 0xA4F1, 0xA627, 0xD17D, 0xB9CE, 0xAA0A, 0xCB5E, 0x8FEE, 0xC5CB, 0xC40F, 0xC18D, 0x877A, 0x88F3, 0x9D19, 0xB3F8, 0xB81D, 0x85D0, 0xC4B9, 0x86E4, 0x9450, 0x9E0E, 0xD455, 0x9E0F, 0x8D8B, 0x9CB0, 0x8E3F, 0xCF89, 0x9294, 0x8841, 0xC4EE, 0xC7BB, 0x878D, 0xB683, 0xAB0C, 0xA4F8, 0x8503, 0xD025, 0x979D, 0x88FF, 0xBC75, 0xAF6A, 0x897C, 0xA733, 0x86FC, 0x9FD6, 0x8E84, 0xBAC2, 0xBD57, 0x86FD, 0xA4FC, 0x9453, 0xB73B, 0xD2A3, 0xBCEC, 0xBAC4, 0xC05B, 0xBA63, 0x8562, 0xC590, 0x884E, 0x8A9B, 0xA4E2, 0xA904, 0xC34E, 0xC41A, 0xA508, + 0xD178, 0x8E21, 0xA14F, 0xCFC8, 0xB9D5, 0x9E20, 0xB025, 0xCB85, 0xA50F, 0xC80B, 0xC2B5, 0xC2B6, 0xC9B9, 0x93AD, 0xBD30, 0x9493, 0x93BE, 0x94AA, 0x854F, 0x98F4, 0x9C69, 0x9C6E, 0x9E24, 0x96E9, 0x873A, 0xC8C4, 0x9752, 0xA1E7, 0xB159, 0xAB76, 0xAC6F, 0xAC70, 0xACD2, 0xBA3C, 0xBB9A, 0x8977, 0xD1CE, 0xA1F1, 0xAC75, 0xBEBD, 0xA705, 0xC9C0, 0xD2F6, 0xA239, 0xC340, 0xB886, 0xC0F0, 0xC399, 0xBE8C, 0xCDB3, 0xA51D, 0x91F8, 0x90E1, 0xB47F, 0xB03F, 0x9D20, 0xAD30, 0xCC74, 0x9653, 0xB5D6, 0xD0F0, 0xA01B, 0x96F2, 0x8EFA, 0x9E69, 0xAA7E, 0xB5D7, 0x9DD4, 0xC122, 0xA216, 0xB5D9, 0xAA81, 0xA522, 0xB961, 0x8F37, 0x96F7, 0x9E22, 0x96E6, 0xC8BA, 0x9746, 0xAC68, 0xBA24, 0x8973, 0xA513, 0xA1DC, 0x9CED, 0xC339, 0x8F28, 0xBE87, 0xCDA2, 0x9651, 0xA00E, 0xB5D1, 0x9EE0, 0xB542, 0x9FC9, 0x8D34, 0xA1E8, 0xD2D7, 0x8A3B, 0x9C88, 0x9666, 0x8E66, 0xD504, 0x8F49, 0xB8B1, 0x9A54, 0xB5FE, 0x95A7, 0xBA4B, 0x9F98, 0x9780, 0x9608, 0x8C16, 0x9F99, 0x9BCC, 0xB55F, 0xC615, 0xBC20, 0xAE8E, 0x9C44, 0xA9C7, 0xD300, 0xD066, 0x86EE, 0xC61C, 0x99EC, 0xB8BB, 0x960E, 0xD316, 0xC76A, 0x8C22, 0xC324, 0xCA98, 0xA9E6, 0xA21B, 0xC32E, 0xC8F6, 0xC332, 0xC848, 0xC849, 0x903B, 0x9480, 0xB543, 0xB544, 0x9F19, 0x993E, 0x9CE9, 0x92AC, 0xC7CC, 0x8FDC, 0x9982, 0x8936, 0xBDE2, 0xC694, 0x9F68, 0x8E5A, 0xB6BF, 0xC7CD, 0xCBCB, 0xB88D, 0xB302, 0xBFFC, 0x9CEE, 0xC7CE, 0xCBDB, 0x91A6, 0x9333, 0xC81B, 0xC964, 0xBBCC, 0xB958, 0xCBD2, 0xC5E8, 0xA1E9, 0xC53D, 0xAE68, 0x8A72, 0xCD13, 0xD29D, 0xC653, 0x92DC, 0xC604, 0x8A1D, 0xB909, 0xC858, 0xB79C, 0xD49F, 0xC6BF, 0xCB12, 0xCB13, 0xBC0F, 0x8B05, 0x98B7, 0xB939, 0x98DC, 0xC6E6, 0xD1CF, 0xD419, 0xD22D, 0x9648, 0xD533, 0xD534, 0xD0AF, 0x968F, 0x9494, 0x9DFC, 0x9006, 0xA857, 0x8F4A, 0xC95A, 0xA6A4, 0xAE46, 0xB020, 0xD39B, 0x9519, 0xCB21, 0xA16E, 0xC9BE, 0xD08F, 0xC015, 0xCA7A, 0xB5C4, 0xD145, 0xB1C7, 0x86BF, 0xC658, 0xB585, 0x853B, 0x8DDC, 0xD5B9, 0xBDB5, 0xD3F0, 0x8CC7, 0xD168, 0xCCD8, 0xC6C2, 0xC7AF, 0xCB32, 0x9B0A, 0x98E0, 0xBA4C, 0x894E, 0xC558, 0xB9C6, 0x991F, 0x8960, 0x964C, 0x9781, 0xB5FF, 0x9B78, 0x9F7A, 0x9A55, 0x94C9, 0xC4CB, + 0xC0ED, 0xB93C, 0x8BAB, 0x9083, 0xAC36, 0xD0B1, 0xAD38, 0x91EC, 0x9B2F, 0xC863, 0xC654, 0x96DB, 0x9246, 0x87EC, 0xBEB6, 0xCA7F, 0xA5CD, 0xD3B8, 0xA3CA, 0xA392, 0xC235, 0xCE2C, 0xBDF4, 0x9D0B, 0xD2F7, 0xB6CA, 0x8D40, 0xA557, 0x91AE, 0xA3D2, 0xC300, 0xBA53, 0xBF09, 0x8E68, 0x8633, 0x898C, 0xCD55, 0xA33C, 0xB447, 0xB47D, 0xBAF2, 0x84AB, 0xCDE3, 0xC55B, 0x8AE1, 0x9FB8, 0xC494, 0xC237, 0xC2A6, 0x9576, 0xBBCE, 0x8862, 0x9B7E, 0xA07E, 0xBB33, 0xD1EC, 0xBB34, 0x90BF, 0x9A33, 0x8A16, 0xBB19, 0x9F85, 0xA320, 0xB58B, 0x8D22, 0xC53E, 0xBC6C, 0xC0CC, 0xC43F, 0x9309, 0x8B0D, 0xBCDF, 0xCB46, 0xADDF, 0xCBDC, 0x8FE6, 0xB12F, 0xD4D0, 0x89BE, 0x8A60, 0xD498, 0x9D11, 0xB26A, 0xBD39, 0xD48B, 0xC158, 0xA10F, 0xB4E7, 0x906B, 0xD22F, 0xD01C, 0xD592, 0xB357, 0xD4D1, 0xA779, 0x9E52, 0x8C1B, 0xC3E6, 0xAA6C, 0xB95A, 0x8779, 0x9A5C, 0xB154, 0xCDAC, 0x9014, 0xC6AE, 0xB15C, 0xBA5A, 0xC71B, 0xBA5B, 0x9BCD, 0x9A5D, 0x91F9, 0xD35B, 0x8F7F, 0xC58C, 0x944B, 0xB23D, 0xBEFA, 0x9E5B, 0xB2EC, 0xCE48, 0xD511, 0xD441, 0xC366, 0x9B8F, 0xCBB4, 0x84AF, 0xC441, 0xAE23, 0x8A7F, 0x93AF, 0xD3BF, 0xC934, 0xC8E2, 0x9AF3, 0xC71C, 0x95B0, 0xAFAE, 0xB26C, 0xAD9E, 0xCA14, 0xC188, 0xC619, 0xBDFB, 0xD37A, 0xB89F, 0x9E10, 0xB1E4, 0xA43C, 0x9B0D, 0x9BFC, 0x9590, 0xCC75, 0xAC37, 0xC547, 0xAC83, 0xC369, 0xB3EE, 0x8A62, 0xC77E, 0xBE2A, 0xBC30, 0x85C1, 0x8B35, 0xB35A, 0xBA60, 0x9E9A, 0xCEBE, 0xC5CC, 0xC529, 0xBDC2, 0xC996, 0xC997, 0xD258, 0xCDBB, 0x8768, 0x8D2C, 0xB4E9, 0xA630, 0xAD4D, 0xAD4E, 0xB8BC, 0xD173, 0xAD3C, 0x9E16, 0xD026, 0xD5BC, 0xA71B, 0xA936, 0x88CE, 0xAFCD, 0x97B9, 0xC347, 0xD4DA, 0x84F5, 0x8514, 0x9FEB, 0xD174, 0xCA95, 0x99C9, 0x9EB3, 0xAB23, 0x8A31, 0x9864, 0x9A45, 0x89C5, 0xC6AF, 0xD04E, 0xB817, 0xC325, 0xD069, 0x912A, 0xD231, 0xAE4D, 0xA4FD, 0x91B6, 0xCC9C, 0xA210, 0x9C5B, 0xD5F7, 0x9F0F, 0x8859, 0x9BA1, 0xD457, 0xAD53, 0xD03D, 0xD079, 0xBA00, 0xB436, 0xBD44, 0xD03E, 0xB240, 0xB998, 0xC724, 0xCFFE, 0xBD47, 0x8E8C, 0xBC7B, 0xC417, 0x9C5E, 0x9F32, 0xA05E, 0xA720, 0xAF74, 0xCA4B, 0x8478, 0xD0BF, 0xB143, 0x9B54, 0x9BA3, 0xCB7B, 0xCB7C, 0xB8A4, 0xB67C, + 0xAF7C, 0xB3A0, 0x912C, 0xBCEA, 0x9A26, 0xD37D, 0x9891, 0x8498, 0xCC49, 0x9DDA, 0xCE5D, 0x9E1F, 0x9BAA, 0x90CF, 0xD177, 0xC726, 0xCFC5, 0xA5DC, 0xB962, 0xC197, 0x89CA, 0xA6E6, 0xCA99, 0x874B, 0xD179, 0xC8F7, 0x9203, 0x8BBC, 0xC199, 0x8BBD, 0xC9CF, 0x89A9, 0xB67D, 0xCC02, 0xA50D, 0x8A9C, 0xC594, 0xAF22, 0x9A80, 0xCFC9, 0xCB8A, 0x8E91, 0xD0C6, 0xC901, 0x90D8, 0xC841, 0x9CD4, 0x9036, 0x9473, 0xB6AA, 0x9C10, 0x9F54, 0x9981, 0xBDE0, 0xB67A, 0xB887, 0xB2F0, 0xBFEC, 0xC7C1, 0xCAC9, 0xC7C2, 0x9CD5, 0xB6AD, 0x9E8D, 0x9B59, 0xAFBF, 0xA152, 0xC80C, 0xAE64, 0xC6B7, 0x919B, 0xAA69, 0xC64B, 0xBBC7, 0x93AC, 0xB901, 0x92D1, 0xA1CF, 0xD226, 0x967B, 0x98B2, 0xB1AB, 0xD5B1, 0xB9E1, 0xC657, 0xD086, 0xBC00, 0xD1BE, 0x8F3B, 0xD35E, 0x8CBE, 0xB573, 0xD13B, 0x869A, 0xCADC, 0xCA57, 0xA3C2, 0xA5C8, 0xBA25, 0x96D4, 0xB9B4, 0x9F5F, 0x9B18, 0x8AC2, 0xD3AA, 0xB926, 0x9A4D, 0x8E57, 0x9640, 0xB5E6, 0x9772, 0xC7A0, 0xCAEB, 0xD227, 0x94BC, 0xC4C5, 0x895B, 0x9BC3, 0xC6BA, 0xD364, 0x9FAD, 0xC22C, 0xCDCF, 0xB440, 0xC290, 0x956D, 0xCD4C, 0x9B60, 0xA3CF, 0xBB31, 0xBBC9, 0xC2C4, 0xB4E3, 0xD3B1, 0xD588, 0xAFA6, 0x90B9, 0xD4BC, 0x9301, 0xA315, 0xC135, 0xCD81, 0xBB17, 0xB954, 0x8FDD, 0x89B2, 0xA771, 0xD497, 0xBC5E, 0xBD2B, 0xB955, 0xCB04, 0xAD9C, 0x8A73, 0x8FFC, 0x9B07, 0x9E38, 0xC57A, 0xC77C, 0xC9FC, 0xC174, 0x91DA, 0xCE10, 0xC706, 0x897F, 0xD4F6, 0x84A3, 0xC8C9, 0x8F67, 0xAC34, 0xB15A, 0xC698, 0xAD40, 0x8E8A, 0xBC10, 0xC5B6, 0xC97B, 0x85B8, 0xBA42, 0xB349, 0xAC72, 0x9FDF, 0xAB12, 0xD169, 0x9E04, 0xAD39, 0xBD34, 0xD03C, 0xB429, 0xA4EE, 0xB239, 0xA1F7, 0xC8DD, 0xB39D, 0xD0B3, 0x8A99, 0x967C, 0xB342, 0x9966, 0xC3A8, 0x9C8F, 0x9971, 0x9815, 0x9945, 0xC31C, 0xC31D, 0x9BD3, 0xA7A0, 0x983A, 0x90D0, 0xA90B, 0x909A, 0x9E78, 0xB2E0, 0x8B44, 0xA65B, 0x8EF2, 0xC06E, 0x8672, 0xBAE7, 0xC49D, 0x9396, 0xD31A, 0xD320, 0xC902, 0xC903, 0xBA06, 0x8C08, 0x9B23, 0xBFDF, 0xCB14, 0xBFE0, 0xCB15, 0x9DA9, 0x852C, 0x99A9, 0x91E3, 0x8BD9, 0xC4E5, 0x9AC1, 0x9DBB, 0xA32A, 0x94CA, 0xA176, 0x93EA, 0xC301, 0x879F, 0x9887, 0xCE40, 0xD3C0, 0x9D5C, 0x9354, 0xC31E, 0x8842, 0xC1A5, + 0x9A9A, 0x87A8, 0x8F35, 0xD560, 0x9358, 0xCB73, 0xD2AA, 0x85EF, 0x8968, 0x84CB, 0xB10F, 0xADF2, 0xB0EA, 0x963D, 0xADF4, 0xCD52, 0x8FC9, 0xAD76, 0xBB9D, 0xC667, 0x9A92, 0xA32B, 0x98E1, 0x98E2, 0xAD7C, 0x84CF, 0xAB81, 0xA622, 0xAE8F, 0x8691, 0xCDE9, 0x9D5D, 0xBFA1, 0xAB4A, 0xB120, 0xC31F, 0xCB69, 0xA18C, 0xAD8A, 0x8BD1, 0xBD45, 0x9A7F, 0xA224, 0x8613, 0xD190, 0xCE97, 0x9481, 0x8896, 0x961E, 0xBDE7, 0xCB05, 0x9876, 0xC082, 0xB190, 0x9BED, 0x92B1, 0xBD1E, 0x970D, 0xD012, 0xD2D8, 0x9243, 0xD41A, 0xBA43, 0x86C0, 0xD505, 0x9245, 0x9790, 0xB15B, 0x8724, 0xAAE0, 0x8E11, 0xB9A6, 0xA3E7, 0x931A, 0xBEC6, 0xCA7B, 0x8B2B, 0xAB79, 0x9901, 0x8642, 0xA9B8, 0xA81E, 0x9B79, 0x94CB, 0xB153, 0xD506, 0x9D82, 0xC6EC, 0xD036, 0x9EF9, 0x94CC, 0xCFCE, 0x9E45, 0xCC2E, 0xC7D4, 0xD1ED, 0xB8F6, 0x87A0, 0x87A1, 0xB560, 0xB8F7, 0x8C46, 0xCFD0, 0xD374, 0xA4D6, 0xCFB7, 0x8CEF, 0x8A61, 0xB8C3, 0xBE8D, 0xB06F, 0x95DF, 0xC440, 0xAAEF, 0x9E53, 0xBC6D, 0x94A1, 0xBD65, 0x8D23, 0x8D24, 0xD301, 0x9C45, 0xD123, 0x90E2, 0xA013, 0xACFC, 0x8C9C, 0xCF6E, 0x85E7, 0xCF97, 0xA4D8, 0x93BB, 0x88E8, 0x9C56, 0xB9AD, 0x8491, 0xD456, 0x94A6, 0x9654, 0xB7BB, 0xD027, 0xA7A1, 0xCB6E, 0x856F, 0x8A8B, 0xC0AD, 0xD313, 0xD490, 0x876B, 0xCF1E, 0xD054, 0x8E78, 0xCFBF, 0xC8ED, 0xB22D, 0xB8A5, 0xC0AF, 0xCC82, 0xA01C, 0x9621, 0xC449, 0xCFD1, 0x8704, 0x90D1, 0xBAB4, 0xC8F4, 0xC8F5, 0xC753, 0xA920, 0x951F, 0xCFD3, 0x8611, 0xD18A, 0x9476, 0xCE8F, 0x961C, 0x8895, 0xD00A, 0xC423, 0x8566, 0xD11A, 0x9BE3, 0xD2B2, 0x92AA, 0xBD19, 0xB18F, 0x8720, 0x9641, 0xD403, 0x9707, 0x9242, 0x9E2C, 0x863D, 0xBA31, 0xBEC3, 0x978C, 0xA3E0, 0x8E07, 0xAB73, 0x9312, 0x98FB, 0xCA68, 0xD035, 0xD2C7, 0x9D7C, 0x9B66, 0xD4F0, 0xA81C, 0xA9A1, 0xCFCD, 0xD4F1, 0x94C4, 0x9FFD, 0xB551, 0xD1E6, 0xA4D2, 0xB8F3, 0x9495, 0x90DF, 0x9C32, 0xBAB0, 0xB8C2, 0x8CED, 0x86C1, 0xD371, 0x95DA, 0xB06B, 0xBD5E, 0xA4D5, 0x93B7, 0xD489, 0x949C, 0xD450, 0xB7B9, 0xD01D, 0xC8E3, 0xCFB8, 0xCF1B, 0xD053, 0xB8A0, 0xCC76, 0x951E, 0x8B50, 0xC2E1, 0xB90A, 0xAE25, 0xBF2C, 0xC38F, 0x8AA9, 0x9907, 0x8AB2, 0xD17C, 0xC3D2, 0xBD93, 0xD59A, + 0xD599, 0xA686, 0xA0B2, 0x9482, 0xD13F, 0x9503, 0xB2E1, 0xB88E, 0xB502, 0xB4A8, 0xC458, 0xD4F7, 0xA1EA, 0xB4A9, 0x8B29, 0x8CBA, 0x8A91, 0x8A92, 0x9007, 0xA108, 0x8A1F, 0x8F14, 0xC389, 0xD0B0, 0xA1F2, 0xCEFE, 0xB586, 0x9C9C, 0x8B2D, 0x8BDF, 0x96C4, 0xC77D, 0xD507, 0xBEBE, 0x9179, 0xA7D1, 0x950A, 0xBCA3, 0x8D41, 0xC341, 0xD14B, 0xBC21, 0xCBF8, 0xA12B, 0x9E54, 0xB63E, 0xBDAC, 0x8CAD, 0x8D73, 0xA9C8, 0xB5D2, 0x8EA3, 0xB52A, 0xD512, 0xBE27, 0xB590, 0x8B6F, 0x9AF9, 0xB437, 0xB41A, 0x9F2F, 0xCFFF, 0xBE5A, 0x923A, 0xCFB3, 0xCFB4, 0xD5A4, 0xAFDF, 0x85F0, 0xC22F, 0xA2E5, 0x913F, 0xA1EB, 0x93E0, 0x8A84, 0x9DF4, 0x92C5, 0xD29E, 0xBCC1, 0xCEFB, 0x854B, 0xB296, 0xCEFC, 0xB3C8, 0xC037, 0xBCFC, 0xCB22, 0x9E42, 0xA858, 0xABD1, 0x853C, 0x8FED, 0xA379, 0xC016, 0x9D55, 0x8CE1, 0xB055, 0xB31E, 0xD41B, 0xA109, 0xBEC7, 0xD26F, 0x93E4, 0xB006, 0xA172, 0xB86D, 0x8852, 0xAE8B, 0xA16F, 0xA6A5, 0x95C8, 0xCA80, 0x9D02, 0x918E, 0xC45F, 0x9EC4, 0x918F, 0xD3B9, 0xB600, 0xA399, 0xD434, 0x9793, 0xB4F8, 0xA422, 0xC4CC, 0x8B62, 0xA9B9, 0x8667, 0xD2EB, 0x9D70, 0xBEBF, 0x88A2, 0x9E43, 0x8DDE, 0xB405, 0x86CF, 0xC3FF, 0x9190, 0x9C37, 0xA12A, 0x9D0C, 0xBAA1, 0xBF88, 0x8C17, 0xA07F, 0xAF04, 0xC518, 0x8885, 0xC765, 0x8D96, 0xADB9, 0xBAA2, 0xA75F, 0xCCDF, 0x9EFD, 0x8BAF, 0xB40A, 0xAC2B, 0xBCE0, 0x9E55, 0xB2B7, 0xC205, 0xC159, 0x8C9F, 0x9F86, 0x9CA8, 0xAF08, 0xA110, 0xAF09, 0xAA62, 0xA9C9, 0xA5FB, 0x9A67, 0xA180, 0x8B32, 0xC09E, 0xB605, 0xBE0A, 0x8839, 0xD5AD, 0xB46C, 0xB26B, 0x8D44, 0xD55D, 0x88A4, 0xD55E, 0xB0CE, 0xD302, 0xD215, 0x8F9F, 0xD277, 0xCDB4, 0x916D, 0x9154, 0x8C9D, 0xCCE2, 0xD34A, 0x8F80, 0xD081, 0x8A8A, 0x8C29, 0x9E56, 0xC01C, 0xBD90, 0xA14A, 0x944C, 0xD5AE, 0x9015, 0xB156, 0xB716, 0xAFAF, 0xBE28, 0x8954, 0xBFC9, 0x9E11, 0x8ECC, 0x8DA1, 0xB26E, 0xBCE5, 0xB3DA, 0xD0D9, 0x8F8C, 0xBE2B, 0x9CB1, 0xAF11, 0xB00F, 0xA8D3, 0xCFBC, 0x86F4, 0x8B84, 0xA9D8, 0xA7A2, 0x8D49, 0xBD6F, 0x8E1E, 0xBC31, 0xC36B, 0xA425, 0x9D24, 0xD27D, 0xB3DC, 0xD27E, 0xB012, 0xD561, 0xA71A, 0x866B, 0xCFE1, 0xAED5, 0x878F, 0xBFC4, 0xA132, 0x8EFB, 0x8928, 0xC413, 0x9297, + 0x8BEF, 0xD33C, 0x913B, 0x8809, 0x8D4B, 0x8D4C, 0xA211, 0xA212, 0xA826, 0xBCC8, 0xB41B, 0xB41C, 0xB241, 0xA77C, 0x913C, 0x8D51, 0x9702, 0xD000, 0x8DE7, 0x8701, 0x8702, 0xD3DA, 0xA18E, 0x8BEC, 0xB451, 0x9140, 0x8BBA, 0x9C62, 0xC27F, 0xCF0F, 0xAED6, 0xA827, 0xA7DA, 0xD280, 0xA6E3, 0xD31D, 0x89A6, 0x8BF1, 0x910B, 0xC198, 0xA90C, 0xA828, 0xC41B, 0xC19A, 0xD5BE, 0xA50E, 0xC5D9, 0xB672, 0xC5D7, 0xAF23, 0xBCEB, 0xB5BC, 0x9CBA, 0x8D53, 0xD5C0, 0xC370, 0xA41E, 0xA225, 0xA829, 0xB91F, 0x9602, 0x8E2F, 0x9334, 0xB581, 0xBE38, 0x917A, 0x917B, 0x9609, 0xA54B, 0xB6A7, 0xAA91, 0x8473, 0x9C46, 0xA12C, 0xBDA1, 0xA34D, 0xA34E, 0xC8A2, 0xABC4, 0xA2BA, 0xB592, 0xA937, 0xA596, 0x917E, 0xD27F, 0xC8EE, 0xBE3A, 0x8EDF, 0xCC4F, 0xCE69, 0x8A3E, 0xD070, 0x9778, 0xA22D, 0xC170, 0xCEF7, 0xC601, 0x8E09, 0xC704, 0x92AD, 0xB6C0, 0xB869, 0xA3D0, 0xBA96, 0xBFE1, 0x8A74, 0x8E0F, 0x91DB, 0xADF3, 0xB297, 0xAB54, 0xB75D, 0xA3D1, 0xB37B, 0xD447, 0x9940, 0x99C0, 0xB5A6, 0xA3E8, 0x8F4B, 0xA859, 0x8E12, 0x84DF, 0xD1D0, 0x92B2, 0xA3CB, 0xC94A, 0xB099, 0x862A, 0x9667, 0x9668, 0xB051, 0xD41C, 0xB708, 0x91E4, 0x853D, 0xD380, 0xD29F, 0xC97C, 0xA2EB, 0xCB23, 0xB4C8, 0xBA4D, 0xB1C8, 0x9222, 0x9619, 0xA126, 0x9F22, 0x9734, 0xA9BA, 0xA27C, 0xB601, 0xD372, 0xCF9B, 0xD2EC, 0xB8F5, 0xA778, 0xCE38, 0xB8D9, 0xCD1D, 0x9AA7, 0xB649, 0xD16B, 0xC09D, 0x946C, 0xB4CC, 0xD375, 0xAE90, 0xA862, 0xD16E, 0xD0EB, 0xA77A, 0xD50E, 0x9B37, 0xC0CD, 0x8CAE, 0x97ED, 0xA2A1, 0xCAB5, 0xB0B8, 0xB3B9, 0x97B0, 0xAED2, 0xB1CD, 0x96FE, 0x8635, 0xAA63, 0xAFF6, 0xA761, 0xB766, 0xB717, 0x9CAF, 0xC935, 0xC442, 0x8C3C, 0x8D32, 0x8C80, 0x95B1, 0xCD22, 0x9947, 0xBAA5, 0x94A4, 0xD513, 0x944D, 0xC1A6, 0x8650, 0xD0DA, 0xCDB8, 0xC1A7, 0xA2A2, 0x9674, 0xD1B8, 0xC3D4, 0xCEBF, 0xA9D9, 0x9ED9, 0x8A2F, 0xD449, 0xC191, 0x9BC1, 0xC771, 0xD176, 0x9F30, 0xD0F1, 0x8864, 0xA58B, 0x9359, 0x9276, 0xA800, 0x95B6, 0xB815, 0xA2A5, 0x9AA0, 0xCABD, 0x9CB5, 0xD491, 0x9228, 0xCE5E, 0x9E6D, 0x994A, 0xA5BD, 0xB082, 0xA6E4, 0xA6E7, 0xA976, 0xA82A, 0x8A3C, 0xD06F, 0x976E, 0xC6FF, 0x8DF9, 0xB6B7, 0xD445, 0x91CA, 0xAA53, + 0xB75A, 0x993C, 0x965C, 0xA2E3, 0xA95A, 0xD37F, 0xD299, 0xCAF8, 0x99BA, 0xD1C5, 0xA687, 0xC972, 0xB4BF, 0xBA38, 0xCF99, 0xD2C8, 0x9F1C, 0xD367, 0xB5ED, 0xA9A2, 0x9F1D, 0xD164, 0x9464, 0xA772, 0xAECE, 0x862B, 0x9B28, 0x97A7, 0xC0C9, 0xA75A, 0x8CAA, 0xD500, 0x8D31, 0x943C, 0x9C9D, 0xC1A2, 0xBA9F, 0xB07E, 0xCEB3, 0xC3CD, 0xD0D4, 0xA9CA, 0xD170, 0xA7F8, 0xC5E0, 0x9669, 0x8CC8, 0x8CCB, 0x86D0, 0xD5DE, 0x8740, 0xA4A6, 0xA4A7, 0x8CD1, 0xC758, 0x859E, 0x8744, 0x8745, 0x8746, 0x8747, 0x8748, 0x8582, 0x8CDA, 0x8749, 0x874A, 0x8A67, 0xB745, 0xAF60, 0xAF62, 0xD1D7, 0x8CA2, 0x8CA1, 0xCA29, 0xB6CE, 0x870A, 0x92A1, 0xB9DD, 0xB749, 0xA77D, 0x8DCA, 0x8972, 0x94E7, 0xB333, 0xCD59, 0xCD5A, 0xB2F3, 0xC7C5, 0xCA9E, 0x97F0, 0xAAE5, 0xB249, 0xD056, 0xC0D2, 0xBF98, 0xD494, 0xCC54, 0x8DCB, 0xCF57, 0x9FF2, 0x986D, 0xC80F, 0x92A2, 0xC263, 0x8DCC, 0x919E, 0x9A82, 0xD17F, 0xD327, 0x9FF3, 0xCEC8, 0xC100, 0xA6F2, 0x8B1C, 0x8A4C, 0xAEAE, 0xBE9F, 0x8B53, 0xCA5E, 0xA096, 0x9D43, 0x8A69, 0x8E00, 0x922D, 0x8F21, 0xB1EE, 0xD404, 0x8FF0, 0xD00B, 0xBDC7, 0xBACF, 0xC00C, 0xB5CD, 0xA063, 0x9B46, 0x9078, 0xCD4D, 0xAC31, 0x8665, 0x9C20, 0xAE05, 0xCA69, 0x9F63, 0xD475, 0xA7C3, 0xC7C9, 0xBFCB, 0xBBCA, 0xBA32, 0xBDCA, 0xB032, 0x99A5, 0xAEB1, 0x9148, 0xA099, 0xC735, 0xC7CA, 0x885E, 0xCD0E, 0xC502, 0xB54A, 0xBF5D, 0xD3D3, 0xB54B, 0x8F5D, 0x8F5E, 0xBF78, 0xA06D, 0xBE43, 0x909E, 0xCAAC, 0xD182, 0xBF10, 0x973F, 0xC296, 0xBA39, 0x8AF1, 0xBC07, 0xCFF4, 0xB648, 0x93A4, 0xA6F7, 0xBCB9, 0x9B49, 0xA655, 0x9683, 0xA4C6, 0x8640, 0x8DB8, 0xA1EC, 0x8666, 0x9AB7, 0x8E10, 0xA9AA, 0xCD14, 0xD36D, 0x9FFF, 0xCE11, 0x8CA8, 0xA405, 0xC0DB, 0xBE48, 0xCB16, 0x8DD9, 0xCECA, 0xAA75, 0x8671, 0xAFA9, 0xCD98, 0x8E9D, 0xBC51, 0x914B, 0xBC62, 0xC896, 0x8C36, 0x8B2C, 0xBE1B, 0xCE21, 0xB9F2, 0xD1A0, 0xCD17, 0xCF62, 0x91E5, 0x873E, 0x97F1, 0x91E6, 0xC3C6, 0x9AE3, 0xB559, 0x8ED5, 0x8DDD, 0xC115, 0xAE1F, 0xCA7C, 0x964D, 0xC984, 0x8BCA, 0xA899, 0xC7D2, 0xBCD7, 0x8F71, 0x8B2E, 0xCECB, 0xBC19, 0xBCD8, 0xB398, 0xAAC2, 0xC985, 0x9713, 0xD101, 0x84EB, 0xBA54, 0x888F, 0x8B67, 0xBC22, 0xCFDF, + 0xD154, 0x9150, 0x8F7A, 0xA92D, 0x8B33, 0x8D9E, 0xA7F3, 0xD5EB, 0xB68C, 0xB358, 0xC738, 0xCE41, 0xCA87, 0x91F2, 0xA791, 0xA187, 0xBA5C, 0x86EF, 0xC96A, 0xAAF0, 0xC5C9, 0xBC76, 0x9A98, 0xD0B8, 0xBDF7, 0x9239, 0xACC5, 0x8717, 0x871A, 0xA496, 0xA634, 0xCEC3, 0xCD25, 0xAA85, 0xA665, 0xCADD, 0xBEE8, 0x8EFE, 0xB2D5, 0xCCA3, 0xB856, 0x981A, 0xCD68, 0xAB27, 0xB724, 0xB4FB, 0xC084, 0xA3D7, 0x93CE, 0xA2C2, 0x8794, 0x92BC, 0xC622, 0xADE6, 0xC5DC, 0xB94B, 0x85A0, 0xCE90, 0x8D8E, 0x9BDC, 0xC56A, 0x85A7, 0xC226, 0xA159, 0xCD00, 0x981C, 0xBCF5, 0xB51A, 0x869B, 0xB0D9, 0x87C8, 0xB8E9, 0x8614, 0xC052, 0x8F3C, 0xD586, 0xC9EE, 0xA7DF, 0xA3C3, 0x9747, 0xD3AB, 0xB9B5, 0xA372, 0xCDF9, 0x94BD, 0x98C2, 0xC37B, 0xD2B3, 0x9C7C, 0x9A84, 0x99A0, 0xC626, 0x9EB7, 0xC335, 0x9756, 0xAF9F, 0xA536, 0x9D63, 0xA3A3, 0xD228, 0xA549, 0xCF59, 0xC84E, 0x8AC3, 0x909B, 0xC2C5, 0xA9F9, 0x945E, 0xC244, 0x9419, 0x956E, 0x9893, 0xA538, 0x9D65, 0x95E2, 0xA244, 0xCC85, 0x881A, 0xC380, 0xB5CE, 0xA688, 0xCF2E, 0x887F, 0xC53A, 0xB253, 0xB109, 0xB4C2, 0x97BD, 0xD368, 0xBD2C, 0xD589, 0xB1B1, 0xA4BD, 0xAE83, 0x8A5A, 0xCD0F, 0x8886, 0xC4AA, 0x8E2D, 0xA121, 0xCCB4, 0xB402, 0xCA36, 0x9089, 0xC88C, 0xAB99, 0xB78B, 0x8624, 0x91DC, 0xBA97, 0xA1B7, 0xCDD8, 0xCF5C, 0x99A7, 0xA406, 0xC4AD, 0xC4AE, 0xBBD3, 0xBD7B, 0xAD25, 0xC2F0, 0xB746, 0x8C13, 0xD501, 0xD58F, 0xCA01, 0xC233, 0xC4B3, 0xCF33, 0xB403, 0xCCA7, 0x868F, 0xAB7A, 0x8A27, 0x93E8, 0xA7AA, 0xCBD8, 0xD43A, 0x9A19, 0xB406, 0xC834, 0xD0F9, 0xAB13, 0xB407, 0xC6C3, 0x8F01, 0x86F9, 0xC7B1, 0x86DE, 0xD043, 0xC119, 0xD22E, 0xAB82, 0xB895, 0xA7ED, 0xB1E2, 0x8E38, 0xAC05, 0xCA0F, 0x88FE, 0xA3AC, 0x9393, 0xAC06, 0xD593, 0xA3EB, 0xA732, 0xCFBA, 0x8996, 0xCCF4, 0x9C57, 0xC8E7, 0x899E, 0xCFBD, 0xA872, 0x9A7A, 0xC32D, 0x9399, 0xCFC2, 0xA6DE, 0xCD2B, 0x902B, 0xB545, 0xD4BD, 0xB07B, 0xD398, 0xCA72, 0x94F2, 0xCD82, 0xA0CB, 0xC88D, 0xD5D9, 0xAB55, 0x8E30, 0xC6DF, 0x90A4, 0xD19C, 0x9335, 0xCE9F, 0x93E1, 0xCF5D, 0xBD13, 0xBE5F, 0xB31F, 0xC017, 0x8D3D, 0x9812, 0x966A, 0xBBF4, 0xB1DB, 0x8BAC, 0xCFA1, 0xAD35, 0xA590, 0x8CAB, 0x8BAD, + 0xCD54, 0xBF2D, 0xD2A1, 0xC400, 0x9EA9, 0x8AE3, 0xCC0B, 0xBF89, 0x9F27, 0xABAA, 0xA38B, 0xBC37, 0xA5E7, 0xB226, 0xD5DF, 0x9800, 0xC8DB, 0xB9C9, 0xAEE0, 0xC11C, 0xA9CB, 0xA51A, 0xC83A, 0xBDD7, 0xB065, 0xD0D7, 0x8C93, 0xBD3A, 0xD5E1, 0xD48C, 0x8D45, 0xA45D, 0xBE29, 0xC443, 0x90B5, 0x99EA, 0xC6C5, 0xC635, 0xBD55, 0xB564, 0x8C94, 0xCF6F, 0x924F, 0xA2FA, 0xBBE2, 0xAC38, 0xB607, 0x8BC5, 0x8DA2, 0xCF70, 0xCCE7, 0x84DA, 0xD094, 0x9801, 0xBD94, 0x9EAF, 0xB175, 0x89C4, 0xCE58, 0xA631, 0xCFE2, 0xA577, 0xCA49, 0x9EB1, 0x8865, 0x9F31, 0xC326, 0xBD46, 0xB1DD, 0xAF6B, 0xCB7D, 0xA663, 0xA18F, 0xC8F0, 0xCB7E, 0xAEE1, 0xB73F, 0xC799, 0x8BBB, 0xC8F8, 0xA878, 0xAC49, 0xAC4A, 0xAEE2, 0xC609, 0x9F34, 0xB9D7, 0xAC4C, 0xC8FE, 0x8733, 0x889A, 0xBA3D, 0xCD53, 0xBA44, 0xBA64, 0xA64E, 0xD353, 0xC9E6, 0xA776, 0xA635, 0x9FC2, 0x9FC3, 0x94B3, 0xCAA8, 0xA7A9, 0x8EB4, 0xD12F, 0x902C, 0xB1D8, 0xB54C, 0x8539, 0x9460, 0xD198, 0xD267, 0x852B, 0xAA3F, 0x9461, 0xAE07, 0x8FDF, 0xB86B, 0xB43C, 0xA366, 0x8C45, 0xD52F, 0x9288, 0xCD86, 0xC232, 0x984E, 0x9533, 0xB298, 0xAB3A, 0xB6D5, 0x8F68, 0xBB98, 0xC384, 0xCB17, 0x8963, 0xB9BD, 0xBF96, 0xC2E2, 0xAF8E, 0xB347, 0xB552, 0x9E39, 0xB0EB, 0xC9DD, 0xCBF1, 0x8544, 0x92C6, 0x8A77, 0xC630, 0x9099, 0xCEFF, 0xB34A, 0x93E5, 0x8882, 0xADF5, 0xC5E9, 0x91A9, 0xA1F3, 0x914C, 0x962A, 0xCBF2, 0xB37D, 0x858D, 0xB7A5, 0xB69A, 0x8A20, 0xAF58, 0x9336, 0xCF4D, 0xCAB1, 0xB492, 0xB0EC, 0x97C3, 0x996D, 0xCBD4, 0xA234, 0x8FE1, 0xCB24, 0xD333, 0xC35B, 0x94DB, 0xB6D6, 0x9BDE, 0xBD14, 0xA2C9, 0xCEA5, 0xA960, 0xAE77, 0xC1B9, 0x916A, 0xD50B, 0xAE8C, 0xBF83, 0xBA4E, 0xACF9, 0x966C, 0xA2F1, 0xA85C, 0x87D8, 0x8CCC, 0x9693, 0x882D, 0xB0ED, 0xCE2D, 0xBB9E, 0xD602, 0x8861, 0xCD1B, 0x8FB3, 0x9D83, 0xD1A9, 0xBA0F, 0xBA4F, 0xBECA, 0xA173, 0xB37E, 0xB9C7, 0xBCC6, 0xC74A, 0xD131, 0x85F5, 0x98E3, 0x86D1, 0xB98D, 0x8BE0, 0xB9F7, 0x882E, 0xD41F, 0x8B63, 0xCF80, 0xB1EA, 0xBF2E, 0xB37F, 0x943D, 0xD0A1, 0xAB6B, 0xB34F, 0x943E, 0xA6AD, 0xCF01, 0xB0EE, 0xC90F, 0x859C, 0x8802, 0x9F7B, 0x962C, 0xBAE1, 0xD211, 0xADB8, 0xAEA3, 0xAF03, 0x8F72, 0x9D58, + 0xADD1, 0xBD50, 0xB949, 0xCAB2, 0xBB5B, 0xA3E9, 0xA267, 0x8610, 0x9E46, 0xBF31, 0xC631, 0x9973, 0x9EFE, 0x8B49, 0x9235, 0x95C3, 0x87D9, 0xB9FB, 0xAD9D, 0x97F5, 0xCBDD, 0xA23A, 0xD373, 0x8B94, 0xC4D5, 0xBF32, 0xAD7D, 0xA5E8, 0x9C3C, 0xCE39, 0xC6F4, 0xB69C, 0xD5F9, 0xD2F8, 0xB4F9, 0xB892, 0x8B68, 0xC35F, 0xC632, 0xB603, 0xB0EF, 0xBECC, 0xD3BD, 0x9994, 0xAD2C, 0xA396, 0xC98B, 0xC405, 0xC439, 0xC66A, 0xA23B, 0x893C, 0xA587, 0x9CA1, 0xB12E, 0xB72F, 0xAC5D, 0xCA40, 0xCBB0, 0x9735, 0x84C3, 0x904D, 0xCD38, 0xB807, 0xA2D6, 0xB383, 0xAA29, 0xBB63, 0xAE78, 0x8FE4, 0x985B, 0xB77B, 0xBA56, 0xA33D, 0xB563, 0xC51D, 0xD16F, 0xC685, 0xCFDB, 0xBE0B, 0x8DBD, 0x96C7, 0x9987, 0xCCAF, 0x90A9, 0xAA08, 0xABAD, 0xA54C, 0xC0AA, 0xC5EE, 0xCF3E, 0x8636, 0xC2A8, 0xBC28, 0xCE42, 0x898D, 0xBF0A, 0x883A, 0x985C, 0x9D72, 0x9977, 0xA19B, 0x9394, 0x897A, 0xC09F, 0xD303, 0xBB6D, 0xA19C, 0x9A44, 0xCDE5, 0xBEA8, 0xA3EA, 0xD4D2, 0xAA48, 0xC633, 0xB4AE, 0xB974, 0x9833, 0xAA49, 0xC9DE, 0x8BE6, 0xD051, 0xA111, 0xC497, 0x91AF, 0xAB3E, 0xB21A, 0xA628, 0xB023, 0xB77C, 0x8AE4, 0x9577, 0xA65D, 0xBDEC, 0x87C5, 0xD426, 0xD1EE, 0xBF6B, 0xA8C7, 0xD5E4, 0xA188, 0x8A0B, 0xCE87, 0x9DC9, 0x9539, 0x8FE9, 0xBDD9, 0x89FA, 0xAA65, 0xA321, 0xA867, 0xB0F5, 0xA9CF, 0xA62E, 0xB3D9, 0xB070, 0xA1AA, 0xACFD, 0xD5E5, 0xB0BB, 0x84D1, 0xB0F6, 0xC49B, 0xC7E5, 0xD479, 0xA5EC, 0x8456, 0xA34F, 0xBCE2, 0xA45E, 0x90C2, 0xC189, 0x8C70, 0xD514, 0xD217, 0x8644, 0xAF0F, 0xD584, 0x8C95, 0xBD3E, 0x9046, 0xB2B9, 0xB388, 0xD48D, 0x9C4F, 0xCE49, 0x9FEA, 0x9700, 0xAB5D, 0x89E1, 0xBE8E, 0xC316, 0xA74A, 0xBDDA, 0x96B7, 0x8DBE, 0xBAEA, 0xD1B7, 0xA9D0, 0xAC20, 0xA9D1, 0x9A34, 0x877B, 0x94B6, 0xA4CC, 0xA32D, 0x92C7, 0xC27A, 0xAE11, 0xC0AC, 0xCFB9, 0x99FF, 0x8EEB, 0xC40C, 0xC40D, 0x9BD2, 0xA77B, 0x9263, 0xABE5, 0xA27F, 0xC912, 0x8F19, 0xA74C, 0x97CB, 0xC467, 0x90F1, 0xBF8B, 0xC11E, 0xC0A0, 0x94A7, 0xB718, 0x9CB2, 0x91FC, 0xA23E, 0xD1B9, 0xBE2C, 0xD078, 0x9A23, 0xC936, 0x9109, 0xC3D5, 0xCDB9, 0xA33E, 0xB98F, 0x9AF6, 0xC15F, 0x94A8, 0xD134, 0x8940, 0xB46F, 0xB9D1, 0x9949, 0xA417, 0xAFB1, 0xADA0, + 0xB416, 0xB417, 0x9999, 0xBF4F, 0xD578, 0x9A9B, 0xCA1A, 0xACFF, 0x9E63, 0x90F9, 0x9E5C, 0xBB70, 0xA418, 0x99ED, 0xC71D, 0xD17E, 0x9F8D, 0xD1BA, 0x8718, 0xD33A, 0xD517, 0xC66D, 0xC9DF, 0xABC5, 0xAFFD, 0x8461, 0x94D0, 0xB38A, 0xABB0, 0x8941, 0x8DE6, 0x85C2, 0xC3D7, 0xA71C, 0xBCB4, 0xA28B, 0xA8B1, 0xC998, 0xCA1E, 0xAF7A, 0xC1E6, 0xB701, 0xBD96, 0xBCB5, 0xB3DD, 0x95B4, 0xBB44, 0x8C71, 0x8847, 0xB013, 0x8DC9, 0x8675, 0xB7E0, 0x953A, 0xD518, 0xC23B, 0xCC3C, 0x9B15, 0xBEAE, 0xA8B2, 0xA280, 0xBC92, 0xB83A, 0xBBE3, 0xC0AE, 0x9569, 0xD1F2, 0xD1F3, 0xA54D, 0xCB6F, 0xCEC1, 0xBDA3, 0xAF14, 0xC348, 0x9D5E, 0x9592, 0xAAC6, 0xA19E, 0xBBD0, 0xD5BB, 0xBCB6, 0xBCB7, 0x9397, 0xC1A9, 0xADE1, 0xA994, 0xBCB8, 0xAFCE, 0xD5B0, 0xBFAF, 0xC671, 0x9718, 0xC752, 0xA74D, 0xBA81, 0x8515, 0xAB0E, 0xAD8D, 0xAA7F, 0x86FE, 0xC192, 0xA8B5, 0x8F1B, 0xB7D4, 0xD579, 0xCA96, 0xA9DE, 0x84F8, 0xA33F, 0xB3DE, 0x8D6F, 0xB270, 0x89FF, 0xBD70, 0xAB24, 0xCCB9, 0x89C6, 0x9398, 0xA087, 0x876C, 0xBAEB, 0xA94B, 0xC689, 0x8D12, 0xA8FA, 0xCFC0, 0x9E6A, 0x88F6, 0xA639, 0xC3EB, 0xC327, 0xA2BB, 0xBB15, 0x866C, 0xD107, 0xB361, 0x8AB8, 0xA9E3, 0x9A46, 0x9CB6, 0xB22F, 0x9BA4, 0xB3DF, 0xB1DE, 0xA803, 0xB816, 0xC68A, 0xC4A3, 0x8AB9, 0xA441, 0xBB75, 0xA8B7, 0xAE4E, 0x9AFB, 0xB186, 0xBC7A, 0x929B, 0xB438, 0xB5E2, 0xC939, 0xBD71, 0xC4F0, 0xA217, 0x9EDA, 0xD5F0, 0xA7A4, 0xB471, 0xA578, 0x912B, 0xC5F8, 0xCFA8, 0x9C5F, 0x9E1C, 0xD33D, 0x8F09, 0xC7E9, 0xCC93, 0x9116, 0xA218, 0xAF7B, 0xBE59, 0xB242, 0xBECE, 0xBECF, 0xD113, 0x9035, 0xB8A6, 0xA26E, 0x9E1D, 0x9324, 0xBC7C, 0xA996, 0xA1A0, 0x9BA7, 0xCE5F, 0xA722, 0xD4DC, 0xB41D, 0xB365, 0xD4E0, 0xA5BC, 0x8705, 0xBED0, 0x9AA2, 0xC591, 0x916F, 0x97EF, 0x8ABB, 0xA191, 0x935A, 0x8DE8, 0x863A, 0xCB81, 0x8499, 0xD569, 0xC7D8, 0x8FEB, 0xD42C, 0x9934, 0xD492, 0x9C68, 0xAEAB, 0x98F7, 0x9C0C, 0xB4CF, 0x87AE, 0xCC4B, 0xA443, 0xAF3E, 0xC6B2, 0x9E6E, 0x9E6F, 0xB3A1, 0x8956, 0xD31F, 0xACDF, 0xA645, 0xA5BF, 0x9C6A, 0xD5BF, 0xA3F5, 0xB8C4, 0xB0C6, 0xA4B3, 0x90D4, 0xBB46, 0x8CB5, 0xAA21, 0x8774, 0x8601, 0xA997, 0xC44A, 0xA3B8, 0xA90D, 0x9204, + 0xA977, 0xC5F4, 0x9E70, 0xA510, 0x8850, 0x9DE2, 0xC9D0, 0x89AA, 0xC4C1, 0x9E71, 0xC333, 0x9720, 0x88E7, 0xAF24, 0xA5DE, 0x8D54, 0xB5BE, 0xB026, 0xAA89, 0xD5C1, 0xAA39, 0xCFE4, 0xAF26, 0xA226, 0xBDA9, 0xD3E4, 0xA511, 0x9FC0, 0x94B1, 0xCA9F, 0xD18B, 0x9029, 0xD128, 0xB1D3, 0xA7A8, 0xBF95, 0xB33C, 0x8C44, 0xB860, 0xB7A1, 0x9283, 0x8FDA, 0xABDE, 0xAF8C, 0xC91F, 0x8962, 0xC62A, 0x94D6, 0x8879, 0xBD0F, 0xA161, 0x9149, 0x8A1C, 0xD32F, 0xADED, 0x861A, 0x952E, 0x858A, 0xB372, 0xCEF2, 0xB476, 0xA22E, 0xC22D, 0x9627, 0xA2C8, 0x92C1, 0x9BDD, 0x9095, 0xAF55, 0x8543, 0xCE04, 0xB375, 0xD202, 0xB376, 0x9684, 0x87F9, 0xA2E6, 0xB1E8, 0x885F, 0x8820, 0xCEF8, 0xD5C8, 0xADC7, 0xBD4D, 0x9D7D, 0x8FAA, 0xCD10, 0xBEC8, 0x8821, 0xA843, 0xBB38, 0xB343, 0xAB68, 0x85F1, 0xBA3A, 0xC742, 0xBCC2, 0x86AD, 0xAE84, 0xB0E6, 0x9162, 0xC62F, 0xA2D4, 0xA585, 0x9233, 0xAB3B, 0xC7E2, 0xCD33, 0x8AD4, 0x9D6B, 0xC9DB, 0xAE43, 0xD2D9, 0x8AA6, 0xBF27, 0xAA00, 0x8FE0, 0xCBA0, 0xA274, 0xD073, 0xD3B5, 0xC356, 0xBF05, 0x904B, 0xC3FE, 0x9A3B, 0xB5F4, 0xB830, 0x97F4, 0xBEBB, 0x95C1, 0xAD24, 0xD20A, 0xB800, 0x9EEE, 0xCA37, 0x89B5, 0x8B92, 0xBD67, 0x84BE, 0xCBD3, 0xB72B, 0xD41D, 0xA56D, 0xB216, 0xCDDB, 0xA4CA, 0xBDEA, 0xA741, 0xA33A, 0xC511, 0xBCAF, 0xA658, 0xD050, 0x8BDA, 0x97C4, 0x9572, 0x91AA, 0xC67E, 0x8DBA, 0xAA44, 0x938B, 0xC5EA, 0xA8C3, 0xA26C, 0x9DFD, 0xB777, 0xBE09, 0xA545, 0xB4AB, 0xA10A, 0x8455, 0xB3D0, 0xD17B, 0xAFAB, 0x8DBC, 0xAB58, 0x8643, 0xB2A7, 0x8EE7, 0xA31D, 0xA453, 0x89E0, 0xC2F8, 0x96B4, 0xAA78, 0x8C6E, 0xD478, 0x9FE0, 0xD2ED, 0xC401, 0xA1A8, 0x9BD0, 0xB06C, 0xBD33, 0x9042, 0x9E47, 0xA177, 0xAC1D, 0xD508, 0xB469, 0xCC25, 0xA27E, 0xB3D7, 0xBB64, 0x91EF, 0x893D, 0xB40B, 0xD336, 0x9105, 0xBBDF, 0x9AEA, 0x9A93, 0x8460, 0x90EE, 0xABC1, 0xA948, 0xD50C, 0x931C, 0xABAB, 0xAD85, 0xD1EF, 0x883B, 0x95AC, 0xAF0A, 0xBDA2, 0xA19D, 0xAF0B, 0xADE0, 0xA8A3, 0x9564, 0x85BF, 0xCB47, 0x9D5A, 0x87A2, 0xB6F7, 0x8761, 0xBD6E, 0xAB20, 0xAA7B, 0x866A, 0xCCB5, 0xA084, 0x8F17, 0xD5AF, 0xC74D, 0xA8A9, 0x8997, 0xA20C, 0xA799, 0xB22C, 0xA98F, 0x9127, 0xA4F9, 0xB23F, + 0x8D50, 0xB3DB, 0x8F07, 0x9C00, 0xA5B4, 0x9A9C, 0xD4DB, 0xA71D, 0xCB70, 0x8955, 0x876E, 0xA4B0, 0x89A7, 0xC4BF, 0x89EB, 0x89EC, 0xA0CC, 0x8501, 0x900C, 0xA209, 0xA7AD, 0xAC48, 0x89E6, 0xABDF, 0xAACC, 0xBAFC, 0xB881, 0x9BE9, 0xABE0, 0xC859, 0x86B4, 0x984F, 0x86B5, 0xB86C, 0xA26D, 0xA2CA, 0x8657, 0x996E, 0xB781, 0xB7D7, 0xC434, 0x9E44, 0x9DB0, 0xAD0E, 0xC3AA, 0xBB1D, 0x90A6, 0xD076, 0xAE60, 0xD0B2, 0xB09A, 0xC3DB, 0xA85D, 0x873F, 0x86D2, 0xB782, 0x98E7, 0x96EF, 0x95AB, 0x958C, 0x925D, 0x8C18, 0x9983, 0x9759, 0xAD12, 0xB821, 0xA471, 0xA558, 0xA9ED, 0xBEF6, 0xB84C, 0xA12D, 0xCF02, 0xCF03, 0x89BF, 0xB5D3, 0xA823, 0x89E2, 0xB839, 0xA472, 0xC83B, 0xC1C2, 0xC868, 0x91FA, 0x9BB9, 0xCE4A, 0xC1C3, 0x9988, 0x85CF, 0x9989, 0xB5D5, 0xC9B3, 0xC1C5, 0x8590, 0x84B0, 0xC11F, 0xCBB9, 0xA487, 0xB640, 0xA4FA, 0x90B6, 0xB608, 0xB0D1, 0xBE7A, 0xAF15, 0xBCE7, 0xA281, 0x98F1, 0xB642, 0x8C58, 0x96F3, 0x90AC, 0xB2EE, 0xA3FF, 0xBD98, 0x96F5, 0xB171, 0xA2AD, 0xC3A2, 0x9BA5, 0x89C7, 0xB0FB, 0x8EAB, 0x9AA1, 0xBCE9, 0xC1C7, 0xC1C8, 0xABDB, 0xBAFA, 0xB87D, 0xC844, 0x9840, 0x8696, 0xC1D6, 0x8A8C, 0xB77F, 0xC101, 0xC420, 0x9954, 0x9D99, 0xAD03, 0xA2C6, 0xABE7, 0xD071, 0xAE5D, 0x974A, 0xC1B3, 0xBCD3, 0xAD08, 0xA9EB, 0xA273, 0x9257, 0x9598, 0x98C9, 0xA467, 0xA0B3, 0xCEF9, 0xA551, 0x90B2, 0xCE12, 0xC82F, 0x89DB, 0xC385, 0xC1B8, 0x9BB2, 0xC85A, 0x91DD, 0x89B6, 0xA4EB, 0xB5D0, 0x9B70, 0xA480, 0xB631, 0x98E4, 0xBE73, 0xBCD9, 0xB636, 0xA2AA, 0x9A94, 0x947B, 0x9471, 0xA598, 0x9117, 0xC5FB, 0xB32C, 0xC285, 0xCACA, 0xD2A4, 0xCB8F, 0xC916, 0x9092, 0x91C3, 0xB978, 0x8583, 0xB066, 0x9525, 0xCF44, 0xB758, 0xD287, 0xB0FE, 0xA047, 0x92C9, 0xC917, 0xCB90, 0xD1DB, 0x9F35, 0x8A9D, 0x91C7, 0xB574, 0x8F3D, 0xD5B2, 0xD608, 0x8FA4, 0xA87E, 0x8453, 0xC006, 0xC007, 0x8603, 0x87C9, 0x9477, 0x9CDE, 0xA99A, 0xA911, 0x8A68, 0xC624, 0x9184, 0xA944, 0xAD66, 0x9EA1, 0xBA89, 0x9185, 0xC478, 0x9216, 0x9773, 0xCD5C, 0x94BE, 0xB87E, 0xA245, 0xB441, 0xC62B, 0x8C85, 0x9485, 0x86A8, 0xC3B9, 0xB880, 0xB985, 0xD2BD, 0xB214, 0x9096, 0xCED1, 0xD1DF, 0x8BD4, 0xC47C, 0x8EBA, 0xAEF7, + 0xCF49, 0xC451, 0xB067, 0xB068, 0xD58A, 0xCB06, 0x911F, 0xAA55, 0xCB9C, 0xA0FD, 0x8C67, 0x8A6F, 0xB10A, 0xA844, 0xBDCC, 0xC485, 0xA9A3, 0xB987, 0xC457, 0xCBA1, 0xD3EB, 0xC929, 0xB6D1, 0xC3C3, 0x8B88, 0xC8CA, 0xCBA2, 0xCD87, 0x8F12, 0xCD88, 0xA8EB, 0xC0DC, 0xC0DD, 0xAEFE, 0x9120, 0xBC4F, 0x84BF, 0x9AD7, 0x9F3D, 0xBC50, 0xCBEF, 0x94C8, 0xC897, 0x9B29, 0x95A3, 0xCF4E, 0xC29D, 0xC13D, 0x8480, 0xC38A, 0xBD81, 0x9D03, 0xD11F, 0x8EC3, 0x84E3, 0xC390, 0xCBF4, 0xB7A7, 0xB688, 0xA7EE, 0xBFBC, 0x8F02, 0xB11A, 0xBC68, 0xBC53, 0xCE3A, 0xC462, 0x934B, 0xAEA7, 0x9224, 0x9C50, 0x8EC8, 0xC345, 0xCBFB, 0xD307, 0x9B3A, 0xA916, 0xC328, 0xA67D, 0xA6BA, 0xA6C1, 0xD474, 0x98FD, 0xD24C, 0xBC8C, 0xA1B3, 0xAE1D, 0xCB18, 0xB62D, 0xC8D3, 0xB493, 0xB34B, 0xC655, 0xC804, 0x9C95, 0x96B1, 0x9A8F, 0xD2EE, 0x964E, 0xA1BB, 0x8CCE, 0xCCA8, 0xA10C, 0x8BE1, 0x99C5, 0xCF87, 0xAAA6, 0xCDAD, 0x8BB1, 0x8FCE, 0xBC4D, 0x9865, 0x9BFD, 0xBB04, 0x9717, 0x8BED, 0xCF8A, 0xCCB8, 0x9C5A, 0xC321, 0x8BB7, 0xA8D5, 0xA636, 0xAE24, 0xC76B, 0xCF8C, 0x9CBB, 0x9CBC, 0xCDCA, 0xCD89, 0xC76D, 0xADE4, 0x93CA, 0xB801, 0xADCA, 0xC1BA, 0x9337, 0xB02C, 0xCF34, 0xA6A6, 0x8B64, 0xC910, 0xA85E, 0xA5AC, 0x84B9, 0x85D4, 0xABFE, 0x8FB4, 0x8E9E, 0x99C1, 0xC2A3, 0x8FE5, 0xC6A4, 0x9D0D, 0xADD6, 0x8A7D, 0xC51E, 0xD077, 0xBEF7, 0xD1F0, 0xB081, 0xABAE, 0xA863, 0xB26D, 0xD376, 0x9BFA, 0xB84D, 0x92F0, 0x997A, 0xD0B9, 0xCBB5, 0xAE91, 0xD42A, 0xBFE5, 0xA7F9, 0xA868, 0x9085, 0xCC34, 0xC2AA, 0xA86E, 0xBB03, 0xA86F, 0xC3D6, 0x997C, 0xCBBA, 0xAAF1, 0xAAF2, 0xCF53, 0xA8D4, 0xAC29, 0x87AB, 0xC2AC, 0xC193, 0xA48B, 0xCBE5, 0xC349, 0xCB74, 0x8479, 0x8E79, 0xBE04, 0xC4A4, 0xCE60, 0xA94C, 0xA8FB, 0x8E20, 0x9CB7, 0xB02F, 0xC93B, 0x8551, 0xB0FC, 0xC124, 0xC125, 0xC3A3, 0x9D36, 0xAADD, 0xAC2A, 0xAC15, 0xA5C0, 0xA6EA, 0x9C0D, 0x847A, 0x9325, 0x8E23, 0xA90E, 0xA879, 0x849B, 0x939D, 0xA6EC, 0x85EB, 0x9910, 0x9911, 0x9913, 0x87EE, 0xB4BC, 0xB4BD, 0xA079, 0xBE60, 0xD1AA, 0xA07B, 0x8AAC, 0xB4F0, 0xA080, 0xA082, 0x8FB9, 0xA085, 0xBE62, 0x92E2, 0x92EC, 0xA2D8, 0xAC40, 0xACAD, 0xACAC, 0x85F7, 0xCA10, 0xBE8F, + 0x9BA8, 0xCA21, 0x9599, 0x902D, 0x894C, 0x9DB1, 0xB6C6, 0x8F29, 0x90ED, 0xC29E, 0xB6C7, 0xB498, 0xA006, 0xC756, 0xAF59, 0x8545, 0xCBF5, 0xB79D, 0xADF8, 0xAD7E, 0xD5BA, 0x8DE0, 0x859D, 0xCB3C, 0xC9C1, 0xBDD6, 0x856D, 0x9F4A, 0x9974, 0xB052, 0xC911, 0x87DA, 0xCBB3, 0x95AD, 0xBDD8, 0x9CA9, 0xC58B, 0x84AC, 0x84AD, 0x991B, 0x961A, 0xB320, 0x8DE2, 0xB42E, 0xBEE2, 0xAAFF, 0xCC9A, 0xBC4C, 0xBEA9, 0xB44C, 0xC74E, 0xA354, 0x8663, 0xBCE6, 0xD112, 0x86F5, 0xA488, 0xA115, 0xA4B4, 0xC5CF, 0xB719, 0x85AC, 0x920D, 0xB52D, 0xB52E, 0x98F2, 0xB450, 0xADD8, 0xA116, 0x9DCB, 0x871B, 0x8F1A, 0x9DD0, 0xAFBE, 0xBDC3, 0x9631, 0xBCE8, 0x8639, 0xC58F, 0xB014, 0x95B7, 0x86FF, 0xA48C, 0xBD72, 0xA939, 0x979F, 0xB439, 0xC759, 0x9C63, 0x9DDE, 0x9E8B, 0x89D2, 0x8DE9, 0x9A28, 0xC46F, 0xB369, 0x90D5, 0xC05C, 0x9DE3, 0xA512, 0xC106, 0xB6C8, 0x9445, 0xABD5, 0xB622, 0x95AE, 0xC15A, 0xB44D, 0x9834, 0x8A17, 0xA489, 0xB720, 0xCF73, 0xB914, 0xC162, 0x95B5, 0x8570, 0xBDC4, 0x9632, 0xCF74, 0x9555, 0x8700, 0xC165, 0x9BA9, 0x90D2, 0xC05D, 0x90D6, 0xC0FB, 0xB6B8, 0x941A, 0x982D, 0xC14F, 0xCF66, 0xBDBD, 0xA0C9, 0xA0CD, 0xC408, 0xC5C0, 0xC410, 0x9C5C, 0xCB97, 0xCF86, 0xCF67, 0xB8E5, 0xA5A5, 0xB0BC, 0x9AFA, 0xCC3A, 0xCF76, 0xB0C2, 0x84B5, 0xCBBB, 0xC4DC, 0x9A29, 0xC9F4, 0x9030, 0xB4E5, 0xA407, 0xC4E8, 0xBB2A, 0x9813, 0xC69E, 0xCA81, 0xC6A1, 0x96B5, 0xBBCD, 0xA423, 0xB2A8, 0x9879, 0xCE2E, 0xC083, 0x857C, 0x914E, 0x8F2F, 0x8E39, 0xB022, 0xB1FA, 0xA881, 0x8A52, 0xA081, 0xA5E9, 0x98EB, 0xB40E, 0x91F3, 0x91B0, 0xC15B, 0x9F87, 0xA483, 0xB95B, 0xCA8C, 0xCA8D, 0xA2F9, 0x9114, 0x8743, 0xB1A9, 0xA5EA, 0xBEC0, 0x9D73, 0xBF55, 0x9B90, 0xA414, 0x9D74, 0xAA6E, 0xBF0B, 0x8AB3, 0xCC90, 0xCF1C, 0x99EB, 0x9861, 0xA05C, 0xBFBE, 0xBFBF, 0xB194, 0xA4D9, 0xBFC0, 0xD519, 0xD51A, 0x8C72, 0x9048, 0xA4DA, 0xBD40, 0x9862, 0xB35B, 0xA2FB, 0x8D8C, 0xA0A7, 0xB480, 0xCA91, 0xB7B6, 0xBE2F, 0x91B3, 0x91FF, 0xC86B, 0xC1E0, 0xA2A3, 0xCCC3, 0xD443, 0xC86C, 0xC469, 0xC608, 0xCABC, 0xCEDE, 0xB7E1, 0x8F8E, 0x8F8F, 0x9E9B, 0xA400, 0xA5F0, 0xA579, 0xB177, 0xC063, 0xAAF4, 0x8D4D, 0xC99C, 0x98AE, + 0xB43A, 0x96BA, 0xC7D7, 0xC8B0, 0x9BAB, 0x89D3, 0xB740, 0xAC17, 0x87AF, 0xC470, 0xB19A, 0xA978, 0xA818, 0xAF25, 0xB612, 0xC9ED, 0x902F, 0xB4E2, 0x980F, 0xC4E3, 0xBB28, 0xC693, 0xC695, 0xC07F, 0x96A9, 0x914A, 0xB28C, 0x8578, 0xBBCB, 0x9875, 0xCE05, 0xA95F, 0xA880, 0xB1D9, 0xA050, 0x9F72, 0x9D6E, 0xBF07, 0x98DD, 0xCC88, 0xA09E, 0xA2EC, 0xCA82, 0xB193, 0xB1FD, 0xBFBB, 0x9854, 0xCC89, 0xCC8A, 0xA2F4, 0xBE26, 0xCCC2, 0x91F4, 0xD43F, 0xC866, 0x91B1, 0xAF10, 0xAAF3, 0x8F8B, 0xB7DF, 0x98AC, 0xA5EF, 0x89CF, 0xB73E, 0xB199, 0xB611, 0x937F, 0x904C, 0x96C3, 0x943F, 0xC3AD, 0xD0D5, 0x875A, 0xB7A9, 0x853E, 0xBD00, 0xA7D3, 0x96C8, 0xC74F, 0xB8DC, 0xA18A, 0x8765, 0xBB73, 0xC163, 0xC938, 0xC99A, 0xBBE5, 0xA282, 0xB7ED, 0x9277, 0xA8B6, 0xC34B, 0xA8D6, 0xB16C, 0xB16D, 0xA8B9, 0x876F, 0x8770, 0x8771, 0xA7A6, 0x8772, 0xB818, 0x939E, 0xC672, 0x9372, 0xC920, 0xD0C9, 0x8750, 0xB7A2, 0xA174, 0xBB5C, 0xBBDD, 0xC98C, 0xA89E, 0xB165, 0x8762, 0x8763, 0x92E3, 0x9279, 0x92F7, 0x92E0, 0xB9EC, 0xB9E5, 0x88AD, 0x9C27, 0x903C, 0xBB95, 0xC000, 0xD0AD, 0xBC81, 0xC4D3, 0xBFE2, 0xB6C9, 0xCE22, 0xA1BE, 0x8B5E, 0xCBF6, 0x92B3, 0x92B4, 0xBC85, 0xCBF3, 0xD420, 0xCA83, 0xD616, 0x86D3, 0x9F9A, 0xBDBE, 0x85E0, 0x8CD2, 0xBED4, 0xBB9F, 0x85E1, 0xBA50, 0x9191, 0x9807, 0xB6CB, 0xBE8B, 0x9EFF, 0x9D71, 0x87DB, 0xC98D, 0xBF33, 0x8CD3, 0xC4D6, 0xC94E, 0xA1C1, 0x9236, 0xC8DE, 0xA5AB, 0xC302, 0x88B4, 0x8807, 0xAE6D, 0x91F5, 0x8863, 0xA257, 0x90AA, 0xBC29, 0xCDAE, 0xC309, 0xC994, 0x9BBF, 0x97EE, 0xBA5D, 0x9E5D, 0xD48E, 0x87DC, 0xC49C, 0x8888, 0xCA15, 0x8E72, 0x92F2, 0xD105, 0xC18A, 0x9701, 0x91FB, 0xAF9B, 0xCF71, 0x99EE, 0x9AF7, 0xBED5, 0x9B97, 0x9DCC, 0x999A, 0x8492, 0xBD95, 0x9339, 0xC18E, 0x969F, 0x8942, 0xBBCF, 0xBD97, 0x8848, 0x9553, 0xC39F, 0xA43D, 0xA8B3, 0xBBE4, 0xBDDD, 0xCA1F, 0xC1AA, 0xAD50, 0xBD99, 0xAB00, 0x86FA, 0xCE5B, 0xC670, 0x9FEC, 0xB7D5, 0xA442, 0xD458, 0xB8A7, 0x8B70, 0x8E7A, 0xCB7F, 0x9C60, 0xB684, 0x8ABA, 0xCCBD, 0xBDC5, 0xC196, 0xC4DD, 0xD0C0, 0x933A, 0x980B, 0xAC16, 0xC8F9, 0xAD57, 0x89AB, 0xC4DE, 0xAA8A, 0xCFCA, 0xAE35, 0xB9DA, 0x9038, + 0x9C14, 0xBFF0, 0xBD74, 0xBFDE, 0xC376, 0xB6B9, 0xCDF7, 0x8B51, 0x92A8, 0xCBED, 0x9E27, 0xBA26, 0x85D7, 0xBB8A, 0x9186, 0xCA5F, 0x922F, 0xB67F, 0xC4D1, 0x98CA, 0xA5AA, 0x9EE6, 0xC2C6, 0x87D2, 0x87FA, 0x909F, 0x91D4, 0xCD83, 0xAE6B, 0xA24B, 0x97E5, 0x9BBC, 0xC488, 0x96F9, 0x893B, 0xA430, 0x9690, 0xBBDC, 0x8984, 0xCA05, 0xAD42, 0x882F, 0xA89A, 0xC668, 0x9FE7, 0xAAFA, 0xB7CE, 0xD453, 0xAE33, 0xBA6F, 0xA408, 0x97DF, 0xC4A9, 0x934A, 0x8837, 0xAEA4, 0x86DF, 0x883E, 0xBF8A, 0x9817, 0x92F3, 0x9DCD, 0x84B1, 0x8496, 0x94AB, 0xC412, 0xCF1D, 0xC5F3, 0x935B, 0xB18C, 0xC5F5, 0xAABF, 0xCE23, 0x93A6, 0x9855, 0x8F73, 0xC019, 0xC001, 0x8B2F, 0xC7B0, 0xD421, 0xD256, 0xB07F, 0xC606, 0xB6D7, 0xB7A8, 0xCF51, 0xC1BD, 0xD273, 0x8E4D, 0xA9EE, 0xCD1E, 0x8838, 0x85E3, 0xA1F8, 0xC01B, 0xCB3D, 0xB588, 0xB217, 0xB58C, 0xA090, 0xB1EB, 0xD132, 0xCE86, 0xB09D, 0xD39F, 0xA17C, 0xD427, 0xAF82, 0xA112, 0xB0F2, 0xCFD5, 0x9D91, 0xA864, 0xD1D4, 0xBCF2, 0x94A2, 0xC94F, 0xBA10, 0x86E5, 0xC01D, 0xC01E, 0xBBA1, 0xA8A4, 0xAAD5, 0xB157, 0xBDDB, 0xD308, 0xB6FC, 0xBDFA, 0x9084, 0xC78C, 0xB5E0, 0xB941, 0xA091, 0x9237, 0x9808, 0x883F, 0xD3C1, 0xCBB6, 0xAAA7, 0xD377, 0x8E73, 0x9809, 0xA8AC, 0xA130, 0xBBC6, 0xB481, 0xAB3F, 0xA54E, 0x9863, 0xBF8C, 0xC71E, 0xBFD1, 0xA25A, 0x91BC, 0x8AF5, 0xC61D, 0xBBA4, 0xA9DA, 0xD47A, 0xD37C, 0xB915, 0xB158, 0xA461, 0xBDDE, 0xA4CD, 0xD562, 0xA323, 0xB2C2, 0xB2C3, 0xC8E8, 0x92F4, 0xB7EE, 0xC8E9, 0x95B8, 0xC9B4, 0xC2AF, 0xB15F, 0x8D13, 0xB160, 0xB38E, 0x92F5, 0x9AFC, 0xB38C, 0x9BD5, 0xCDC0, 0xBE32, 0xB5E1, 0xC3D9, 0xD564, 0xA419, 0xB71B, 0xBB74, 0x96CA, 0xC023, 0x9767, 0xBBE6, 0xB364, 0x8AED, 0xD317, 0xA8B8, 0xB0C4, 0xBDFE, 0xC34C, 0x88FC, 0x90CD, 0xC8F1, 0xCEC4, 0xD597, 0xB7EF, 0xB8A8, 0xB2CF, 0xD31B, 0xBB08, 0xA9E4, 0xC34D, 0xAA82, 0xD108, 0xAD8F, 0x8516, 0x88B5, 0x8773, 0x8D14, 0xB595, 0x8706, 0xD31C, 0xCE62, 0xC6B1, 0x9A47, 0x880A, 0xBC32, 0xC536, 0xA805, 0xD0F3, 0x913D, 0xA8BC, 0xC025, 0x8927, 0x8FBD, 0x9EDB, 0xBED1, 0xC8FA, 0xAA8B, 0xD0C2, 0xA043, 0xCB86, 0xCA22, 0xC003, 0xB18D, 0xD3A6, 0xC8FF, 0xA90F, 0xA9F5, 0xBE03, + 0xC4C2, 0x9D3A, 0xBB0E, 0xA139, 0xC350, 0x9A81, 0xA648, 0x8775, 0xAABA, 0xCDEF, 0xC004, 0xC79E, 0x8B1A, 0xB575, 0xB6D3, 0x8810, 0xA9EA, 0xCFD4, 0xBA09, 0xBB8B, 0x947C, 0xA0F4, 0xD587, 0xD405, 0xC00D, 0xAF80, 0x9D89, 0xCAEC, 0xBCEF, 0xC4FA, 0xAACD, 0xCB98, 0x9EBE, 0x9A39, 0xAA9D, 0x9803, 0xB14E, 0x8751, 0xA60B, 0x8AF2, 0xC8C5, 0xC60E, 0xB478, 0xA24C, 0xB299, 0xB29A, 0xA318, 0xD476, 0xD549, 0xBC0C, 0x88AE, 0xB15D, 0xD2E2, 0xA40C, 0xB7E8, 0xC29F, 0x850C, 0xA89B, 0xB350, 0xB893, 0x875B, 0xAA7A, 0x8D03, 0xD0EC, 0xD3A2, 0x9D2F, 0xBB06, 0xC4BB, 0x9680, 0xC13E, 0xC146, 0xC147, 0xCD99, 0x951A, 0xCB25, 0x84D4, 0xBF53, 0x9FB6, 0x85F8, 0x8634, 0x8CBD, 0xBE39, 0x8F4D, 0xA37B, 0x97FB, 0xB40F, 0x9998, 0xA39A, 0x95AF, 0xBFCA, 0x95ED, 0xB155, 0x86F6, 0xA2FC, 0xB329, 0xCDBC, 0xBC57, 0xA938, 0x884B, 0xC52F, 0xB040, 0x884C, 0x8DA3, 0xA3B7, 0x87B9, 0xAD54, 0xA7A5, 0xA93A, 0xC533, 0x90D3, 0xCFD2, 0xBC58, 0xBE3B, 0x87BB, 0xA3B9, 0xA979, 0x9546, 0x9548, 0xB448, 0xA2CC, 0xB43E, 0xA57A, 0xB7F9, 0x8752, 0xA451, 0xA454, 0x8F2B, 0x92DD, 0xC66B, 0xB65B, 0xAB5A, 0x8E6B, 0xA45A, 0x87B4, 0x924D, 0xBEAA, 0xB0F3, 0xD515, 0x9267, 0xB65D, 0xBE51, 0x85FA, 0x86E6, 0xAB5C, 0x9449, 0x9225, 0xB6FD, 0xB58E, 0x960D, 0xC66C, 0xA484, 0x9D1A, 0xB0BD, 0xD431, 0xB8DD, 0xBCA7, 0xBE54, 0xA6C2, 0x87B6, 0xD563, 0xBE57, 0xB0C0, 0xBBBB, 0xD218, 0xB60A, 0xD565, 0xBB30, 0x9E17, 0x917F, 0x99F0, 0xA4AD, 0xA0BC, 0xB2CE, 0xA721, 0xD1D8, 0x87BA, 0xB0C5, 0xAAD7, 0xB7C7, 0xAB02, 0xAB03, 0xB820, 0xC6B3, 0xA7DB, 0xB366, 0xB367, 0xAE32, 0x9AA3, 0xA48D, 0xAF3F, 0x87BC, 0xA7DC, 0xB673, 0x90A0, 0x90A8, 0xAE61, 0x998A, 0xC3A0, 0x90AE, 0x983B, 0x90AF, 0x90B0, 0xA0BD, 0x8A10, 0xCE6A, 0xCE6B, 0x959C, 0xC8E4, 0x946E, 0xC5F7, 0x9766, 0xD566, 0xA8D7, 0x9769, 0xB8BD, 0xCE63, 0x9779, 0xABD2, 0xB2A9, 0xB2AA, 0x94BA, 0xA411, 0x9BBE, 0x853F, 0xB1FB, 0xABD6, 0xC6A5, 0xC8A0, 0xC522, 0xA76D, 0xCE51, 0xBFC1, 0xB26F, 0xC0CF, 0xA76E, 0xC18F, 0x94FD, 0x8B12, 0xB16E, 0x8703, 0xAD55, 0xB2D0, 0xC6B0, 0x8BC7, 0xC8B4, 0xD0C3, 0xCD8A, 0x8EB6, 0xB69B, 0x9F7C, 0x852E, 0x9975, 0xC002, 0x8F30, 0x9CCC, + 0xCDAF, 0x91B2, 0xB46A, 0xB837, 0x986A, 0xBFE4, 0xAD86, 0x9FBA, 0xB95C, 0x858F, 0xCEB8, 0xB11B, 0xA98B, 0xC1BE, 0x99E7, 0xA962, 0xCF81, 0x92CF, 0x934F, 0xADF9, 0xCD21, 0xB15E, 0xAD49, 0x98EF, 0xC3D3, 0xB58F, 0x9818, 0xB0F7, 0xA869, 0xC020, 0x854E, 0xB565, 0xB1CF, 0x944E, 0x86F0, 0x9D21, 0xC18B, 0xA113, 0x8FCF, 0x8840, 0xCD23, 0x97B2, 0xB11D, 0xAEC6, 0xC61A, 0xBD02, 0x85FC, 0x94A5, 0xD082, 0xA181, 0x9672, 0xB9FE, 0x9060, 0x8E18, 0xBCCD, 0x9F8E, 0xBAA7, 0x99AC, 0xC4DA, 0x9226, 0x84B2, 0xC120, 0xD14E, 0xD3C2, 0xCC10, 0xA7D5, 0xAAA8, 0xBF3F, 0xCA92, 0xCB6A, 0x87ED, 0xC160, 0x9ED4, 0xA37C, 0x9762, 0xC411, 0x95B2, 0x9B4E, 0xA58A, 0x9451, 0xA2D9, 0xC66E, 0x916E, 0xA23F, 0xBE30, 0xACAB, 0xB8DE, 0xD083, 0xBCA8, 0xB482, 0xCDBD, 0xAE6E, 0xD175, 0x97B3, 0x95EE, 0xBBF8, 0xC255, 0xB567, 0xB87A, 0xB21C, 0x9ACA, 0xBEAD, 0xA661, 0xB83B, 0xB83C, 0xA2DA, 0xAC11, 0x8AEA, 0xA637, 0xD59B, 0xC322, 0xCCE3, 0xB943, 0xD51B, 0xB2C6, 0xB4CE, 0xC4DB, 0xAE6F, 0x8C96, 0x9D30, 0x8FD3, 0xB470, 0x96B9, 0xD389, 0x9062, 0xA4CE, 0x92F6, 0xAE93, 0xCB75, 0xA462, 0xA9DF, 0xA0E5, 0x89E4, 0xA03E, 0xAA66, 0xA873, 0xD595, 0xA63A, 0xAC23, 0xD567, 0xD318, 0xAECA, 0x9A00, 0xCDC1, 0x8F4E, 0xB9D2, 0xB945, 0x9ACB, 0xBE33, 0x999B, 0xC61F, 0xD3C9, 0xA4B1, 0xD568, 0x9D25, 0x871C, 0x871D, 0x9ACC, 0xB60D, 0xD039, 0xC0F7, 0xC0F8, 0xCDC2, 0x8C82, 0xB71C, 0x9019, 0x9AFD, 0xA74F, 0xC8A8, 0xB530, 0xB531, 0x9E18, 0x8677, 0x9201, 0xC93A, 0x94AC, 0xB7B7, 0x9DD7, 0xC3B0, 0xC032, 0x99F1, 0xBA65, 0xB795, 0xC725, 0xC1AB, 0x9DDB, 0x98AF, 0xC23C, 0xB03B, 0xB7F0, 0xA8BA, 0xAAC8, 0xBA02, 0xB9D3, 0x96F6, 0xD51E, 0xBE00, 0xBCD0, 0xC99D, 0x95B9, 0xCCC4, 0xB391, 0xB2D1, 0xC1AC, 0xB796, 0xB94A, 0xA723, 0x84F9, 0xA5A9, 0x9B3C, 0xAD1A, 0x9D37, 0xBEB0, 0xB596, 0x9DDF, 0xB946, 0xAB04, 0xC34F, 0xB56A, 0x8780, 0x9D38, 0x9D34, 0xD3DB, 0x9E8C, 0xB533, 0xD444, 0xCCBE, 0xD109, 0xA2BC, 0xC773, 0x8783, 0xCE65, 0xB597, 0xC4F1, 0x880B, 0x9F14, 0xC7BD, 0xBC33, 0x9AFE, 0xD5F2, 0xB8AB, 0xB8AC, 0x927A, 0x97A0, 0xA807, 0xC7BE, 0xACBB, 0xC36D, 0xD04F, 0xC4C0, 0x9370, 0x96F8, 0x99AD, 0xA3B3, 0xD03A, + 0xB7F1, 0xD0C4, 0x950F, 0x97A1, 0xB999, 0xA666, 0x8A00, 0xA5C2, 0xBAC7, 0x849A, 0xB741, 0x9D39, 0xC6FC, 0x9A2A, 0xBAC9, 0xA6EB, 0xA7DD, 0xAAAC, 0xACE0, 0xD1BC, 0xC4DF, 0x9206, 0xA97A, 0x9722, 0xA649, 0xC41D, 0xCD75, 0x8EB5, 0x9CC7, 0xCD18, 0xBFE3, 0xA984, 0x92CE, 0x852D, 0x98E5, 0x854C, 0xB1C9, 0xAEC5, 0xA961, 0xCD1C, 0xD07F, 0x9499, 0x8830, 0x85F6, 0x99AA, 0xB116, 0xBCFD, 0x975A, 0x9F82, 0xA2D7, 0xC154, 0x9223, 0xBF34, 0xD037, 0x99AB, 0xA3A9, 0x9D0E, 0x9EC8, 0xC406, 0xD080, 0xC4D7, 0xC7B2, 0x95EC, 0xA629, 0xA70E, 0x9DC3, 0xA65E, 0xB9FD, 0xBEAB, 0x97B1, 0xB838, 0x9AC5, 0xA23C, 0x9D12, 0xCCE1, 0xB4CD, 0xA86A, 0xB2BA, 0xD594, 0x92F1, 0xA45F, 0x89E3, 0x96B8, 0xAE92, 0xAEC7, 0x8FD0, 0xA03C, 0xB942, 0xB9CF, 0xD516, 0x936E, 0x9016, 0x8674, 0x89FE, 0xBE2D, 0xC1A8, 0xC0F4, 0xB7B5, 0x91FD, 0xB52B, 0x94A9, 0x9AF8, 0xB609, 0x9E86, 0x8719, 0xB7EC, 0x84F7, 0xB2C4, 0xBCCE, 0x96F4, 0xC999, 0xB038, 0x9DD1, 0xA5A8, 0x877F, 0xC772, 0x8782, 0xAB01, 0xAD18, 0xCCBA, 0xC194, 0xC34A, 0x979E, 0xB8A9, 0xA804, 0xD5F1, 0x9A27, 0x950E, 0xA664, 0xD0C1, 0x9703, 0xAEE7, 0xCAB3, 0x9440, 0xA6AE, 0xA0B9, 0x886C, 0xC8D6, 0x941B, 0x8FCB, 0x9C38, 0x93B8, 0xB751, 0x94FA, 0xB9CA, 0x93B9, 0xAD2D, 0x85E4, 0xCE84, 0xD257, 0x9A21, 0xB49C, 0x93ED, 0x9350, 0xC1BF, 0x9DC4, 0xB9CD, 0xCE43, 0x93CB, 0xC969, 0xA203, 0xA204, 0xB130, 0x9A77, 0xD1F1, 0x85E6, 0xC8DF, 0xC7E4, 0xD230, 0x92C8, 0x93BA, 0xC1C0, 0xAFCA, 0x8E19, 0x958D, 0xB732, 0xA86B, 0xACD7, 0x944A, 0xC021, 0xACFE, 0xA6BB, 0x872A, 0xD309, 0x958E, 0xCE88, 0x8CD7, 0xB5AB, 0xC523, 0x8B0F, 0x8E74, 0xA114, 0xC9B2, 0x9673, 0xD338, 0xCE4B, 0xC913, 0xCE4C, 0xC7E6, 0xBECD, 0xCE4D, 0xBE78, 0xCC35, 0x9115, 0xC23A, 0x9227, 0x96C9, 0x8493, 0xD259, 0xC8E6, 0x9931, 0xC52A, 0x9D75, 0xA7D6, 0xD3C3, 0xC937, 0xBE2E, 0x997D, 0xA9D5, 0xB738, 0xADA1, 0x9591, 0xB69D, 0x9ED5, 0xC66F, 0xD37B, 0x8B10, 0xAAA9, 0x9932, 0xAEC8, 0x91BD, 0xAA2A, 0x9D76, 0x9D26, 0xBF8D, 0x9A79, 0xC031, 0x886E, 0xC254, 0xA19F, 0xCE59, 0x8849, 0xA25B, 0xA25C, 0x8676, 0xC323, 0xA25D, 0xA131, 0xBF6C, 0xA03D, 0xBE31, 0x91B4, 0x91B5, 0xA3D3, 0x96A3, + 0xC27E, 0xB944, 0xA4DC, 0x9F0D, 0xB024, 0xA9E0, 0xB123, 0xBAAB, 0x9454, 0x84B4, 0xD4DD, 0xB0C3, 0xB568, 0xB362, 0x860D, 0x8FD4, 0xA9E1, 0xB643, 0x9DD5, 0xA133, 0xBF9D, 0xC7E8, 0xCE8A, 0xB2C7, 0xA63B, 0xCA20, 0xD47B, 0xA350, 0x9196, 0xA463, 0xB991, 0xB2C8, 0xA03F, 0xCB76, 0xCB77, 0xA040, 0xD51C, 0xA4CF, 0x9063, 0xB271, 0x8C97, 0x95E1, 0xA117, 0xA213, 0xCB78, 0xD5EF, 0x9C5D, 0xBAEC, 0xBAED, 0x8B71, 0xACBA, 0xB71D, 0x84B6, 0xB532, 0xBE34, 0x99F2, 0xBE35, 0x9202, 0x9F4E, 0xAB5F, 0x9455, 0x8C83, 0xBF8E, 0xC8A9, 0x98F5, 0xCEC5, 0xB14D, 0xA464, 0xABB4, 0x99F3, 0xCC3E, 0x8C47, 0xC2B0, 0xA136, 0x9064, 0x88E2, 0x92DE, 0x99F4, 0xCC4A, 0xCEC6, 0xC419, 0xC1E7, 0xB9D4, 0x990E, 0x8BF0, 0xBD9A, 0xC3DA, 0xB797, 0xA8BB, 0x9CB8, 0x9676, 0x9DDC, 0xBC93, 0x9868, 0x8CDB, 0x8CDC, 0xCB82, 0xC9CE, 0xC8F2, 0x9C64, 0xA6DF, 0xBE7B, 0xA36E, 0xBE0C, 0xBE0D, 0xCB83, 0xBF8F, 0xAAC7, 0xC534, 0x9556, 0xBE7C, 0x8A83, 0x9CB9, 0xBFB1, 0xD189, 0x84FA, 0xC9B6, 0xCA4C, 0xAFCF, 0x8B72, 0xD31E, 0xA8D8, 0xCCBF, 0xA9F4, 0x8707, 0xBB0B, 0xD4E2, 0xCDC3, 0xC257, 0xA220, 0xCBE8, 0xBD49, 0xBB76, 0x9EDC, 0xCB87, 0x9A48, 0x8708, 0xCC4E, 0xBC34, 0x9AFF, 0x929D, 0x9EDD, 0xA7A7, 0xC8FB, 0x9558, 0xA0E9, 0xC44B, 0xC44C, 0xBF90, 0xAAE3, 0xD5F3, 0xCE66, 0xCC50, 0xA9E8, 0xBFB2, 0xC44D, 0xC76C, 0xCB89, 0xB144, 0xBAC8, 0xAA87, 0xC331, 0xCA9A, 0x9C6D, 0xD02B, 0xCDC4, 0xD0C5, 0xCA23, 0xC93C, 0xB145, 0xAF40, 0x9A2B, 0xAC4B, 0xCC51, 0xAC18, 0x8F38, 0xCF11, 0xCE67, 0xA5DF, 0x886F, 0xA97B, 0x9912, 0xA910, 0xBB0F, 0xCF14, 0xCC52, 0x9721, 0xB5BF, 0xA64A, 0xAA3C, 0xAEE3, 0xA0B0, 0x9C1D, 0xCE70, 0xAD1D, 0xB9B6, 0xAFC3, 0xC7DE, 0x88D5, 0x85D9, 0xD1E0, 0x9660, 0x9057, 0xA95C, 0xC7E0, 0xC503, 0xC90E, 0xA845, 0x8AFF, 0xB5A0, 0xCE76, 0xC764, 0xC012, 0xBB53, 0xD2DA, 0x921F, 0x96BF, 0xC665, 0x992D, 0xD36E, 0x9585, 0xAA26, 0x9967, 0xC24E, 0x8829, 0xA613, 0xA199, 0x9691, 0x91AB, 0xCE24, 0xC435, 0xBE1C, 0xC273, 0xB637, 0xACB8, 0x84A9, 0xA455, 0x860B, 0xB0B2, 0xB351, 0x8C90, 0x95DB, 0xCE82, 0xBC1A, 0x99E1, 0x98E8, 0x91F0, 0x9675, 0xB525, 0x8CCF, 0xABAC, 0xC2A7, 0xCB48, 0xC9C3, 0xC1E4, + 0xA8A5, 0x9CAA, 0xCB49, 0x9DC5, 0x9908, 0xCA45, 0xCC36, 0xD187, 0xA8D2, 0xA79A, 0x9ED6, 0xA0E4, 0xCE52, 0xA9DB, 0x9A9D, 0xD0BD, 0xCC3D, 0x9A25, 0xAC13, 0x971E, 0xBB0C, 0xA982, 0x9FD4, 0xA86C, 0x9E19, 0xC447, 0x8DAD, 0x9E1E, 0x9E21, 0xC87A, 0x8DAC, 0xA9AB, 0xCCF0, 0x8D35, 0x9CCB, 0x875F, 0x8D36, 0xB054, 0xD42B, 0xA23D, 0xD3F3, 0x9DCE, 0xAC3D, 0xAC3E, 0xCDEB, 0xA8B4, 0x8A81, 0xA240, 0xA7FF, 0xAE94, 0xB2C9, 0xA9E2, 0xA0E6, 0xA241, 0xA041, 0xA6D2, 0xC4BC, 0xC872, 0x9D5F, 0xAC42, 0xA6E0, 0xB919, 0xD10A, 0xA806, 0xA044, 0xB2D3, 0xA87C, 0xC87B, 0x8D37, 0xAAEC, 0xAAE8, 0x98E9, 0x8A36, 0x93EE, 0xACAF, 0xACB0, 0x93F0, 0xB05C, 0xB5D4, 0xB591, 0xADA2, 0x93F1, 0xC49E, 0xA4D0, 0xB593, 0xACB2, 0x8B15, 0x939F, 0x93E2, 0xB58D, 0xACB1, 0xAAB3, 0xAD46, 0xAD47, 0x9B38, 0xAD5A, 0xD596, 0xAF9D, 0x935C, 0x9AD8, 0x9AD9, 0x9FD5, 0x9736, 0xBE61, 0xBF5B, 0x997B, 0x9A5E, 0xA3ED, 0x997E, 0xBAB7, 0xA62A, 0xAEC9, 0x8B17, 0x9915, 0x9914, 0xCB4A, 0xB389, 0x8E50, 0xC39B, 0xBFDA, 0xAD89, 0xAD87, 0xB38B, 0x8E1C, 0x8C21, 0xCD3C, 0x8FA0, 0xCA4A, 0xC3D8, 0xC8A5, 0xB594, 0xABC6, 0xC8AA, 0xB4E0, 0xCF0C, 0xA63C, 0x8E8D, 0x90CE, 0x88C5, 0xC840, 0xC8AE, 0xC8AF, 0xD1F4, 0x84D2, 0xD1D9, 0x8E22, 0x88C6, 0xCA4D, 0xABB6, 0xD0DC, 0xC8B7, 0x90D7, 0xA97C, 0xD2A0, 0x935F, 0x9452, 0x9470, 0xAD11, 0xAC9C, 0xCEC0, 0x8D4A, 0xB5D8, 0x8A30, 0xC04E, 0xD3C8, 0xD25C, 0xAC24, 0x84FB, 0x8784, 0xC026, 0x8709, 0xCEA6, 0x8A28, 0xC024, 0x9031, 0xAC7D, 0xAE0E, 0x9033, 0xD50F, 0x9694, 0x9695, 0x9061, 0x9357, 0xBDDF, 0xCE8C, 0xB125, 0x89E5, 0x9557, 0x8900, 0xCE8D, 0xBD73, 0xBDEF, 0xBAB9, 0xBABA, 0x9355, 0x9321, 0xC1C6, 0x8541, 0x8FD2, 0xC022, 0xD33B, 0xB5AF, 0xB990, 0xB9FF, 0xCD56, 0xBA01, 0xBEFB, 0xC256, 0xA137, 0xA042, 0x9BC2, 0xA138, 0xC8B1, 0xBF6D, 0xBB77, 0xC32F, 0xC4A5, 0xC8B5, 0xA5C5, 0x867A, 0xC9C5, 0xB566, 0x9819, 0xC2AB, 0xC2AD, 0x998B, 0xC5D6, 0x990F, 0xD06A, 0xC68B, 0xC1F5, 0xD06B, 0xAF72, 0xAE3B, 0xB2B3, 0xD09D, 0x9D27, 0xD51D, 0x9C65, 0x9C6B, 0xB274, 0x9C47, 0x8B4B, 0x8A95, 0x8A96, 0x98F3, 0xC7FC, 0xCBE6, 0xC5D4, 0x85D1, 0xD029, 0xBA66, 0xD51F, 0x8B13, 0xC8AB, + 0xA14D, 0xBEAF, 0xA876, 0xA870, 0x8BD2, 0xB60F, 0xC5D5, 0xCBE7, 0xAF1C, 0xA0E8, 0xC9B5, 0x8CB4, 0xCF54, 0xCDED, 0x8BFF, 0xCABE, 0xAE95, 0xD02A, 0x8CB6, 0xB5C8, 0xCF55, 0xC8B6, 0xAFD0, 0x9205, 0xC21F, 0xCB8B, 0x8DAE, 0xD598, 0x8F95, 0x8C00, 0xA01D, 0xC823, 0x8B3C, 0x8A90, 0x98D9, 0xCBD5, 0xA146, 0xA85F, 0x85CC, 0xBEA5, 0xD50D, 0xCBDE, 0xCDE6, 0x8CAF, 0xB5C7, 0xC21E, 0xA8F4, 0xB039, 0x960F, 0xB03A, 0xC8AC, 0xA905, 0xA90A, 0x9610, 0xA294, 0x8DEA, 0xA87D, 0x8DEB, 0xA8DD, 0x9603, 0xA290, 0x9763, 0xB534, 0x8786, 0x9745, 0xCF08, 0x8C62, 0x98F8, 0xA223, 0xC595, 0xCF13, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA537, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA756, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x9502, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA65C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xA7EF, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0xC281, 0x9BF4, 0xBB02, 0xCE06, 0x3F, 0xB2A2, 0x3F, 0x9436, 0xA147, 0x3F, 0x3F, 0x3F, 0xA64C, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8476, 0x976B, 0xB989, 0x3F, 0x9098, 0x9C7D, 0x3F, 0x3F, 0xC55C, 0xC643, 0x8EC1, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8129, 0x8108, 0x3F, 0x8152, 0x8157, 0x8119, 0x811C, 0x813D, 0x8141, 0x816E, 0x8171, 0x8169, 0x816B, 0x815D, 0x815F, 0x8159, 0x815B, 0x8161, 0x8163, 0x8165, 0x8167, 0x3F, 0x3F, 0x3F, 0x3F, 0x8153, 0x8154, 0x8155, 0x8156, 0x8136, 0x8137, 0x8138, 0x811F, 0x8121, 0x8123, 0x3F, 0x812A, 0x8127, 0x812C, 0x810C, 0x3F, 0x8117, 0x811A, 0x813B, 0x813F, 0x816C, 0x816F, 0x810F, 0x8115, 0x811D, 0x8178, 0x8102, 0x817D, 0x8181, 0x817F, 0x3F, 0x8131, 0x8111, 0x8113, 0x812E, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, 0x810D, 0x810E, 0x8110, 0x8112, 0x8114, 0x8116, 0x8101, 0x8118, 0x811B, 0x811E, 0x8179, 0x8120, 0x8103, 0x8124, 0x8126, 0x8254, 0x8255, 0x825C, 0x8263, 0x826A, 0x8271, 0x8278, 0x827F, 0x8286, 0x828D, 0x8128, 0x812B, 0x817E, 0x8180, 0x8182, 0x812D, 0x812F, 0x82B0, 0x82B7, 0x82B9, 0x82BF, 0x82C1, 0x82C8, 0x82CB, 0x82CE, 0x82D0, 0x82D6, 0x82D8, 0x82DD, 0x82E1, 0x82E7, 0x82EC, 0x82F2, 0x82F4, 0x82F6, 0x82F8, 0x82FA, 0x82FD, 0x8308, 0x830A, 0x830C, 0x830E, 0x8310, 0x8130, 0x8132, 0x8133, 0x8134, 0x8135, 0x8139, 0x82B1, 0x82B8, 0x82BA, 0x82C0, 0x82C2, 0x82C9, 0x82CC, 0x82CF, 0x82D1, 0x82D7, 0x82D9, 0x82DE, 0x82E2, 0x82E8, 0x82ED, 0x82F3, 0x82F5, 0x82F7, 0x82F9, 0x82FB, 0x82FE, 0x8309, 0x830B, 0x830D, 0x830F, 0x8311, 0x813C, 0x813E, 0x8140, 0x8142, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x8241, 0x8242, 0x8246, 0x8145, 0x8143, 0x8244, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, + 0x3F, 0x3F, + } +) diff --git a/util/cteutil/storage_test.go b/util/cteutil/storage_test.go index 2301f03c07807..c64d77d229ef3 100644 --- a/util/cteutil/storage_test.go +++ b/util/cteutil/storage_test.go @@ -25,8 +25,6 @@ import ( ) func TestStorageBasic(t *testing.T) { - t.Parallel() - fields := []*types.FieldType{types.NewFieldType(mysql.TypeLong)} chkSize := 1 storage := NewStorageRowContainer(fields, chkSize) @@ -59,8 +57,6 @@ func TestStorageBasic(t *testing.T) { } func TestOpenAndClose(t *testing.T) { - t.Parallel() - fields := []*types.FieldType{types.NewFieldType(mysql.TypeLong)} chkSize := 1 storage := NewStorageRowContainer(fields, chkSize) @@ -82,8 +78,6 @@ func TestOpenAndClose(t *testing.T) { } func TestAddAndGetChunk(t *testing.T) { - t.Parallel() - fields := []*types.FieldType{types.NewFieldType(mysql.TypeLong)} chkSize := 10 @@ -112,8 +106,6 @@ func TestAddAndGetChunk(t *testing.T) { } func TestSpillToDisk(t *testing.T) { - t.Parallel() - fields := []*types.FieldType{types.NewFieldType(mysql.TypeLong)} chkSize := 10 storage := NewStorageRowContainer(fields, chkSize) @@ -169,8 +161,6 @@ func TestSpillToDisk(t *testing.T) { } func TestReopen(t *testing.T) { - t.Parallel() - fields := []*types.FieldType{types.NewFieldType(mysql.TypeLong)} chkSize := 10 storage := NewStorageRowContainer(fields, chkSize) @@ -214,8 +204,6 @@ func TestReopen(t *testing.T) { } func TestSwapData(t *testing.T) { - t.Parallel() - tp1 := []*types.FieldType{types.NewFieldType(mysql.TypeLong)} chkSize := 10 storage1 := NewStorageRowContainer(tp1, chkSize) diff --git a/util/dbterror/terror_test.go b/util/dbterror/terror_test.go index aae2d9688549d..cdd66b21bd507 100644 --- a/util/dbterror/terror_test.go +++ b/util/dbterror/terror_test.go @@ -28,8 +28,6 @@ func genErrMsg(pattern string, a ...interface{}) string { } func TestErrorRedact(t *testing.T) { - t.Parallel() - original := errors.RedactLogEnabled.Load() errors.RedactLogEnabled.Store(true) defer func() { errors.RedactLogEnabled.Store(original) }() diff --git a/util/encrypt/aes.go b/util/encrypt/aes.go index 6a61f85a14d9a..67bf771468868 100644 --- a/util/encrypt/aes.go +++ b/util/encrypt/aes.go @@ -173,31 +173,49 @@ func AESDecryptWithCBC(cryptStr, key []byte, iv []byte) ([]byte, error) { return aesDecrypt(cryptStr, mode) } -// AESEncryptWithOFB encrypts data using AES with OFB mode. -func AESEncryptWithOFB(plainStr []byte, key []byte, iv []byte) ([]byte, error) { +func aesCryptWithOFB(str []byte, key []byte, iv []byte) ([]byte, error) { cb, err := aes.NewCipher(key) if err != nil { return nil, errors.Trace(err) } mode := cipher.NewOFB(cb, iv) - crypted := make([]byte, len(plainStr)) - mode.XORKeyStream(crypted, plainStr) - return crypted, nil + cryptStr := make([]byte, len(str)) + mode.XORKeyStream(cryptStr, str) + return cryptStr, nil +} + +// AESEncryptWithOFB encrypts data using AES with OFB mode. +func AESEncryptWithOFB(plainStr []byte, key []byte, iv []byte) ([]byte, error) { + return aesCryptWithOFB(plainStr, key, iv) } // AESDecryptWithOFB decrypts data using AES with OFB mode. func AESDecryptWithOFB(cipherStr []byte, key []byte, iv []byte) ([]byte, error) { + return aesCryptWithOFB(cipherStr, key, iv) +} + +func aesCryptWithCTR(str, key []byte, iv []byte) ([]byte, error) { cb, err := aes.NewCipher(key) if err != nil { - return nil, errors.Trace(err) + return nil, err } - mode := cipher.NewOFB(cb, iv) - plainStr := make([]byte, len(cipherStr)) - mode.XORKeyStream(plainStr, cipherStr) - return plainStr, nil + mode := cipher.NewCTR(cb, iv) + cryptStr := make([]byte, len(str)) + mode.XORKeyStream(cryptStr, str) + return cryptStr, nil +} + +// AESEncryptWithCTR encrypts data using AES with CTR mode. +func AESEncryptWithCTR(plainStr, key []byte, iv []byte) ([]byte, error) { + return aesCryptWithCTR(plainStr, key, iv) +} + +// AESDecryptWithCTR decrypts data using AES with CTR mode. +func AESDecryptWithCTR(cryptedStr, key []byte, iv []byte) ([]byte, error) { + return aesCryptWithCTR(cryptedStr, key, iv) } -// AESEncryptWithCFB decrypts data using AES with CFB mode. +// AESEncryptWithCFB encrypts data using AES with CFB mode. func AESEncryptWithCFB(cryptStr, key []byte, iv []byte) ([]byte, error) { cb, err := aes.NewCipher(key) if err != nil { diff --git a/util/encrypt/aes_layer_test.go b/util/encrypt/aes_layer_test.go index 985e7952ea18e..9846b8fcfbf79 100644 --- a/util/encrypt/aes_layer_test.go +++ b/util/encrypt/aes_layer_test.go @@ -73,7 +73,6 @@ func testReadAtWithCase(t *testing.T, testCase readAtTestCase) { } func TestReadAt(t *testing.T) { - t.Parallel() ctrCipher1, err := NewCtrCipher() require.NoError(t, err) ctrCipher2, err := NewCtrCipher() diff --git a/util/encrypt/aes_test.go b/util/encrypt/aes_test.go index 786afe7172cf2..9dbbb31cc9be5 100644 --- a/util/encrypt/aes_test.go +++ b/util/encrypt/aes_test.go @@ -28,7 +28,6 @@ func toHex(buf []byte) string { } func TestPad(t *testing.T) { - t.Parallel() p := []byte{0x0A, 0x0B, 0x0C, 0x0D} p, err := PKCS7Pad(p, 8) require.NoError(t, err) @@ -46,7 +45,6 @@ func TestPad(t *testing.T) { } func TestUnpad(t *testing.T) { - t.Parallel() // Valid paddings. p := []byte{0x0A, 0x0B, 0x0C, 0x0D, 0x04, 0x04, 0x04, 0x04} p, err := PKCS7Unpad(p, 8) @@ -112,7 +110,6 @@ func TestUnpad(t *testing.T) { } func TestAESECB(t *testing.T) { - t.Parallel() var commonInput = []byte{ 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, @@ -189,7 +186,6 @@ func TestAESECB(t *testing.T) { } func TestAESEncryptWithECB(t *testing.T) { - t.Parallel() tests := []struct { str string key string @@ -201,7 +197,7 @@ func TestAESEncryptWithECB(t *testing.T) { {"pingcap123", "1234567890123456", "CEC348F4EF5F84D3AA6C4FA184C65766", false}, // 192 bits key {"pingcap", "123456789012345678901234", "E435438AC6798B4718533096436EC342", false}, // 192 bit - // negtive cases: invalid key length + // negative cases: invalid key length {"pingcap", "12345678901234567", "", true}, {"pingcap", "123456789012345", "", true}, } @@ -222,7 +218,6 @@ func TestAESEncryptWithECB(t *testing.T) { } func TestAESDecryptWithECB(t *testing.T) { - t.Parallel() tests := []struct { expect string key string @@ -234,10 +229,10 @@ func TestAESDecryptWithECB(t *testing.T) { {"pingcap123", "1234567890123456", "CEC348F4EF5F84D3AA6C4FA184C65766", false}, // 192 bits key {"pingcap", "123456789012345678901234", "E435438AC6798B4718533096436EC342", false}, // 192 bit - // negtive cases: invalid key length + // negative cases: invalid key length {"pingcap", "12345678901234567", "", true}, {"pingcap", "123456789012345", "", true}, - // negtive cases: invalid padding / padding size + // negative cases: invalid padding / padding size {"", "1234567890123456", "11223344556677112233", true}, {"", "1234567890123456", "11223344556677112233112233445566", true}, {"", "1234567890123456", "1122334455667711223311223344556611", true}, @@ -258,7 +253,6 @@ func TestAESDecryptWithECB(t *testing.T) { } func TestAESEncryptWithCBC(t *testing.T) { - t.Parallel() tests := []struct { str string key string @@ -271,7 +265,7 @@ func TestAESEncryptWithCBC(t *testing.T) { {"pingcap123", "1234567890123456", "1234567890123456", "042962D340F2F95BCC07B56EAC378D3A", false}, // 192 bits key {"pingcap", "123456789012345678901234", "1234567890123456", "EDECE05D9FE662E381130F7F19BA67F7", false}, // 192 bit - // negtive cases: invalid key length + // negative cases: invalid key length {"pingcap", "12345678901234567", "1234567890123456", "", true}, {"pingcap", "123456789012345", "1234567890123456", "", true}, } @@ -293,7 +287,6 @@ func TestAESEncryptWithCBC(t *testing.T) { } func TestAESEncryptWithOFB(t *testing.T) { - t.Parallel() tests := []struct { str string key string @@ -306,7 +299,7 @@ func TestAESEncryptWithOFB(t *testing.T) { {"pingcap123", "1234567890123456", "1234567890123456", "0515A36BBF3DE0DBE9DD", false}, // 192 bits key {"pingcap", "123456789012345678901234", "1234567890123456", "45A57592449893", false}, // 192 bit - // negtive cases: invalid key length + // negative cases: invalid key length {"pingcap", "12345678901234567", "1234567890123456", "", true}, {"pingcap", "123456789012345", "1234567890123456", "", true}, } @@ -328,7 +321,6 @@ func TestAESEncryptWithOFB(t *testing.T) { } func TestAESDecryptWithOFB(t *testing.T) { - t.Parallel() tests := []struct { str string key string @@ -341,7 +333,7 @@ func TestAESDecryptWithOFB(t *testing.T) { {"0515A36BBF3DE0DBE9DD", "1234567890123456", "1234567890123456", "pingcap123", false}, // 192 bits key {"45A57592449893", "123456789012345678901234", "1234567890123456", "pingcap", false}, // 192 bit - // negtive cases: invalid key length + // negative cases: invalid key length {"pingcap", "12345678901234567", "1234567890123456", "", true}, {"pingcap", "123456789012345", "1234567890123456", "", true}, } @@ -361,8 +353,74 @@ func TestAESDecryptWithOFB(t *testing.T) { } } +func TestAESEncryptWithCTR(t *testing.T) { + tests := []struct { + str string + key string + iv string + expect string + isError bool + }{ + // 128 bits key + {"pingcap", "1234567890123456", "1234567890123456", "0515A36BBF3DE0", false}, + {"pingcap123", "1234567890123456", "1234567890123456", "0515A36BBF3DE0DBE9DD", false}, + // 192 bits key + {"pingcap", "123456789012345678901234", "1234567890123456", "45A57592449893", false}, // 192 bit + // negative cases: invalid key length + {"pingcap", "12345678901234567", "1234567890123456", "", true}, + {"pingcap", "123456789012345", "1234567890123456", "", true}, + } + + for _, tt := range tests { + str := []byte(tt.str) + key := []byte(tt.key) + iv := []byte(tt.iv) + + crypted, err := AESEncryptWithCTR(str, key, iv) + if tt.isError { + require.Errorf(t, err, "%v", tt) + continue + } + require.NoErrorf(t, err, "%v", tt) + result := toHex(crypted) + require.Equalf(t, tt.expect, result, "%v", tt) + } +} + +func TestAESDecryptWithCTR(t *testing.T) { + tests := []struct { + str string + key string + iv string + expect string + isError bool + }{ + // 128 bits key + {"0515A36BBF3DE0", "1234567890123456", "1234567890123456", "pingcap", false}, + {"0515A36BBF3DE0DBE9DD", "1234567890123456", "1234567890123456", "pingcap123", false}, + // 192 bits key + {"45A57592449893", "123456789012345678901234", "1234567890123456", "pingcap", false}, // 192 bit + // negative cases: invalid key length + {"pingcap", "12345678901234567", "1234567890123456", "", true}, + {"pingcap", "123456789012345", "1234567890123456", "", true}, + } + + for _, tt := range tests { + str, _ := hex.DecodeString(tt.str) + key := []byte(tt.key) + iv := []byte(tt.iv) + + plainText, err := AESDecryptWithCTR(str, key, iv) + if tt.isError { + require.Errorf(t, err, "%v", tt) + continue + } + require.NoErrorf(t, err, "%v", tt) + require.Equalf(t, tt.expect, string(plainText), "%v", tt) + } +} + func TestAESDecryptWithCBC(t *testing.T) { - t.Parallel() tests := []struct { expect string key string @@ -375,10 +433,10 @@ func TestAESDecryptWithCBC(t *testing.T) { {"pingcap123", "1234567890123456", "1234567890123456", "042962D340F2F95BCC07B56EAC378D3A", false}, // 192 bits key {"pingcap", "123456789012345678901234", "1234567890123456", "EDECE05D9FE662E381130F7F19BA67F7", false}, // 192 bit - // negtive cases: invalid key length + // negative cases: invalid key length {"pingcap", "12345678901234567", "1234567890123456", "", true}, {"pingcap", "123456789012345", "1234567890123456", "", true}, - // negtive cases: invalid padding / padding size + // negative cases: invalid padding / padding size {"", "1234567890123456", "1234567890123456", "11223344556677112233", true}, {"", "1234567890123456", "1234567890123456", "11223344556677112233112233445566", true}, {"", "1234567890123456", "1234567890123456", "1122334455667711223311223344556611", true}, @@ -400,7 +458,6 @@ func TestAESDecryptWithCBC(t *testing.T) { } func TestAESEncryptWithCFB(t *testing.T) { - t.Parallel() tests := []struct { str string key string @@ -413,7 +470,7 @@ func TestAESEncryptWithCFB(t *testing.T) { {"pingcap123", "1234567890123456", "1234567890123456", "0515A36BBF3DE0DBE9DD", false}, // 192 bits key {"pingcap", "123456789012345678901234", "1234567890123456", "45A57592449893", false}, // 192 bit - // negtive cases: invalid key length + // negative cases: invalid key length {"pingcap", "12345678901234567", "1234567890123456", "", true}, {"pingcap", "123456789012345", "1234567890123456", "", true}, } @@ -435,7 +492,6 @@ func TestAESEncryptWithCFB(t *testing.T) { } func TestAESDecryptWithCFB(t *testing.T) { - t.Parallel() tests := []struct { str string key string @@ -448,7 +504,7 @@ func TestAESDecryptWithCFB(t *testing.T) { {"0515A36BBF3DE0DBE9DD", "1234567890123456", "1234567890123456", "pingcap123", false}, // 192 bits key {"45A57592449893", "123456789012345678901234", "1234567890123456", "pingcap", false}, // 192 bit - // negtive cases: invalid key length + // negative cases: invalid key length {"pingcap", "12345678901234567", "1234567890123456", "", true}, {"pingcap", "123456789012345", "1234567890123456", "", true}, } @@ -469,7 +525,6 @@ func TestAESDecryptWithCFB(t *testing.T) { } func TestDeriveKeyMySQL(t *testing.T) { - t.Parallel() p := []byte("MySQL=insecure! MySQL=insecure! ") p = DeriveKeyMySQL(p, 16) require.Equal(t, "00000000000000000000000000000000", toHex(p)) diff --git a/util/encrypt/crypt_test.go b/util/encrypt/crypt_test.go index 8cd9e686cf02d..bfc09ec224ab9 100644 --- a/util/encrypt/crypt_test.go +++ b/util/encrypt/crypt_test.go @@ -21,7 +21,6 @@ import ( ) func TestSQLDecode(t *testing.T) { - t.Parallel() tests := []struct { str string passwd string @@ -53,7 +52,6 @@ func TestSQLDecode(t *testing.T) { } func TestSQLEncode(t *testing.T) { - t.Parallel() tests := []struct { str string passwd string diff --git a/util/execdetails/execdetails.go b/util/execdetails/execdetails.go index 4265145c2d66a..ea1e4cda1e746 100644 --- a/util/execdetails/execdetails.go +++ b/util/execdetails/execdetails.go @@ -968,7 +968,7 @@ func FormatDuration(d time.Duration) string { if unit == time.Nanosecond { return d.String() } - integer := (d / unit) * unit + integer := (d / unit) * unit //nolint:durationcheck decimal := float64(d%unit) / float64(unit) if d < 10*unit { decimal = math.Round(decimal*100) / 100 diff --git a/util/execdetails/execdetails_test.go b/util/execdetails/execdetails_test.go index 468f7dac1f54c..a3a763a271fc7 100644 --- a/util/execdetails/execdetails_test.go +++ b/util/execdetails/execdetails_test.go @@ -26,7 +26,6 @@ import ( ) func TestString(t *testing.T) { - t.Parallel() detail := &ExecDetails{ CopTime: time.Second + 3*time.Millisecond, BackoffTime: time.Second, @@ -87,7 +86,6 @@ func mockExecutorExecutionSummaryForTiFlash(TimeProcessedNs, NumProducedRows, Nu } func TestCopRuntimeStats(t *testing.T) { - t.Parallel() stats := NewRuntimeStatsColl(nil) tableScanID := 1 aggID := 2 @@ -140,7 +138,6 @@ func TestCopRuntimeStats(t *testing.T) { } func TestCopRuntimeStatsForTiFlash(t *testing.T) { - t.Parallel() stats := NewRuntimeStatsColl(nil) tableScanID := 1 aggID := 2 @@ -179,7 +176,6 @@ func TestCopRuntimeStatsForTiFlash(t *testing.T) { } func TestRuntimeStatsWithCommit(t *testing.T) { - t.Parallel() commitDetail := &util.CommitDetails{ GetCommitTsTime: time.Second, PrewriteTime: time.Second, @@ -230,7 +226,6 @@ func TestRuntimeStatsWithCommit(t *testing.T) { } func TestRootRuntimeStats(t *testing.T) { - t.Parallel() basic1 := &BasicRuntimeStats{} basic2 := &BasicRuntimeStats{} basic1.Record(time.Second, 20) @@ -260,7 +255,6 @@ func TestRootRuntimeStats(t *testing.T) { } func TestFormatDurationForExplain(t *testing.T) { - t.Parallel() cases := []struct { t string s string diff --git a/util/expensivequery/expensivequerey_test.go b/util/expensivequery/expensivequerey_test.go index dc7ab46282f54..8f5c60179694e 100644 --- a/util/expensivequery/expensivequerey_test.go +++ b/util/expensivequery/expensivequerey_test.go @@ -32,8 +32,6 @@ func TestMain(m *testing.M) { } func TestLogFormat(t *testing.T) { - t.Parallel() - mem := new(memory.Tracker) mem.Consume(1<<30 + 1<<29 + 1<<28 + 1<<27) info := &util.ProcessInfo{ diff --git a/util/fastrand/random_test.go b/util/fastrand/random_test.go index 57587a63c6f5b..a89984eb4464d 100644 --- a/util/fastrand/random_test.go +++ b/util/fastrand/random_test.go @@ -22,8 +22,6 @@ import ( ) func TestRand(t *testing.T) { - t.Parallel() - x := Uint32N(1024) require.Less(t, x, uint32(1024)) y := Uint64N(1 << 63) diff --git a/util/filesort/filesort.go b/util/filesort/filesort.go deleted file mode 100644 index db3ec718aa415..0000000000000 --- a/util/filesort/filesort.go +++ /dev/null @@ -1,625 +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, -// 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. - -package filesort - -import ( - "container/heap" - "encoding/binary" - "io" - "os" - "path/filepath" - "sort" - "strconv" - "sync" - "sync/atomic" - "time" - - "github.com/pingcap/errors" - "github.com/pingcap/tidb/parser/terror" - "github.com/pingcap/tidb/sessionctx/stmtctx" - "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/codec" -) - -type comparableRow struct { - key []types.Datum - val []types.Datum - handle int64 -} - -type item struct { - index int // source file index - value *comparableRow -} - -// rowHeap maintains a min-heap property of comparableRows. -type rowHeap struct { - sc *stmtctx.StatementContext - ims []*item - byDesc []bool - err error -} - -var headSize = 8 - -func lessThan(sc *stmtctx.StatementContext, i []types.Datum, j []types.Datum, byDesc []bool) (bool, error) { - for k := range byDesc { - v1 := i[k] - v2 := j[k] - - ret, err := v1.CompareDatum(sc, &v2) - if err != nil { - return false, errors.Trace(err) - } - - if byDesc[k] { - ret = -ret - } - - if ret < 0 { - return true, nil - } else if ret > 0 { - return false, nil - } - } - return false, nil -} - -// Len implements heap.Interface Len interface. -func (rh *rowHeap) Len() int { return len(rh.ims) } - -// Swap implements heap.Interface Swap interface. -func (rh *rowHeap) Swap(i, j int) { rh.ims[i], rh.ims[j] = rh.ims[j], rh.ims[i] } - -// Less implements heap.Interface Less interface. -func (rh *rowHeap) Less(i, j int) bool { - l := rh.ims[i].value.key - r := rh.ims[j].value.key - ret, err := lessThan(rh.sc, l, r, rh.byDesc) - if rh.err == nil { - rh.err = err - } - return ret -} - -// Push pushes an element into rowHeap. -func (rh *rowHeap) Push(x interface{}) { - rh.ims = append(rh.ims, x.(*item)) -} - -// Pop pops the last element from rowHeap. -func (rh *rowHeap) Pop() interface{} { - old := rh.ims - n := len(old) - x := old[n-1] - rh.ims = old[0 : n-1] - return x -} - -// FileSorter sorts the given rows according to the byDesc order. -// FileSorter can sort rows that exceed predefined memory capacity. -type FileSorter struct { - sc *stmtctx.StatementContext - byDesc []bool - - workers []*Worker - nWorkers int // number of workers used in async sorting - cWorker int // the next worker to which the sorting job is sent - - mu sync.Mutex - tmpDir string - files []string - nFiles int - cursor int // required when performing full in-memory sort - - rowHeap *rowHeap - fds []*os.File - rowBytes []byte - head []byte - dcod []types.Datum - keySize int - valSize int - maxRowSize int - - wg sync.WaitGroup - closed bool - fetched bool - external bool // mark the necessity of performing external file sort -} - -// Worker sorts file asynchronously. -type Worker struct { - ctx *FileSorter - busy int32 - keySize int - valSize int - rowSize int - bufSize int - buf []*comparableRow - head []byte - err error -} - -// Builder builds a new FileSorter. -type Builder struct { - sc *stmtctx.StatementContext - keySize int - valSize int - bufSize int - nWorkers int - byDesc []bool - tmpDir string -} - -// SetSC sets StatementContext instance which is required in row comparison. -func (b *Builder) SetSC(sc *stmtctx.StatementContext) *Builder { - b.sc = sc - return b -} - -// SetSchema sets the schema of row, including key size and value size. -func (b *Builder) SetSchema(keySize, valSize int) *Builder { - b.keySize = keySize - b.valSize = valSize - return b -} - -// SetBuf sets the number of rows FileSorter can hold in memory at a time. -func (b *Builder) SetBuf(bufSize int) *Builder { - b.bufSize = bufSize - return b -} - -// SetWorkers sets the number of workers used in async sorting. -func (b *Builder) SetWorkers(nWorkers int) *Builder { - b.nWorkers = nWorkers - return b -} - -// SetDesc sets the ordering rule of row comparison. -func (b *Builder) SetDesc(byDesc []bool) *Builder { - b.byDesc = byDesc - return b -} - -// SetDir sets the working directory for FileSorter. -func (b *Builder) SetDir(tmpDir string) *Builder { - b.tmpDir = tmpDir - return b -} - -// Build creates a FileSorter instance using given data. -func (b *Builder) Build() (*FileSorter, error) { - // Sanity checks - if b.sc == nil { - return nil, errors.New("StatementContext is nil") - } - if b.keySize != len(b.byDesc) { - return nil, errors.New("mismatch in key size and byDesc slice") - } - if b.keySize <= 0 { - return nil, errors.New("key size is not positive") - } - if b.valSize <= 0 { - return nil, errors.New("value size is not positive") - } - if b.bufSize <= 0 { - return nil, errors.New("buffer size is not positive") - } - _, err := os.Stat(b.tmpDir) - if err != nil { - if os.IsNotExist(err) { - return nil, errors.New("tmpDir does not exist") - } - return nil, errors.Trace(err) - } - - ws := make([]*Worker, b.nWorkers) - for i := range ws { - ws[i] = &Worker{ - keySize: b.keySize, - valSize: b.valSize, - rowSize: b.keySize + b.valSize + 1, - bufSize: b.bufSize / b.nWorkers, - buf: make([]*comparableRow, 0, b.bufSize/b.nWorkers), - head: make([]byte, headSize), - } - } - - rh := &rowHeap{sc: b.sc, - ims: make([]*item, 0), - byDesc: b.byDesc, - } - - fs := &FileSorter{sc: b.sc, - workers: ws, - nWorkers: b.nWorkers, - cWorker: 0, - - head: make([]byte, headSize), - dcod: make([]types.Datum, 0, b.keySize+b.valSize+1), - keySize: b.keySize, - valSize: b.valSize, - - tmpDir: b.tmpDir, - files: make([]string, 0), - byDesc: b.byDesc, - rowHeap: rh, - } - - for i := 0; i < b.nWorkers; i++ { - fs.workers[i].ctx = fs - } - - return fs, nil -} - -func (fs *FileSorter) getUniqueFileName() string { - fs.mu.Lock() - defer fs.mu.Unlock() - ret := filepath.Join(fs.tmpDir, strconv.Itoa(fs.nFiles)) - fs.nFiles++ - return ret -} - -func (fs *FileSorter) appendFileName(fn string) { - fs.mu.Lock() - defer fs.mu.Unlock() - fs.files = append(fs.files, fn) -} - -func (fs *FileSorter) closeAllFiles() error { - var reportErr error - for _, fd := range fs.fds { - err := fd.Close() - if reportErr == nil { - reportErr = err - } - } - err := os.RemoveAll(fs.tmpDir) - if reportErr == nil { - reportErr = err - } - if reportErr != nil { - return errors.Trace(reportErr) - } - return nil -} - -// internalSort performs full in-memory sort. -func (fs *FileSorter) internalSort() (*comparableRow, error) { - w := fs.workers[fs.cWorker] - - if !fs.fetched { - sort.Sort(w) - if w.err != nil { - return nil, errors.Trace(w.err) - } - fs.fetched = true - } - if fs.cursor < len(w.buf) { - r := w.buf[fs.cursor] - fs.cursor++ - return r, nil - } - return nil, nil -} - -// externalSort performs external file sort. -func (fs *FileSorter) externalSort() (*comparableRow, error) { - if !fs.fetched { - // flush all remaining content to file (if any) - for _, w := range fs.workers { - if atomic.LoadInt32(&(w.busy)) == 0 && len(w.buf) > 0 { - fs.wg.Add(1) - go w.flushToFile() - } - } - - // wait for all workers to finish - fs.wg.Wait() - - // check errors from workers - for _, w := range fs.workers { - if w.err != nil { - return nil, errors.Trace(w.err) - } - if w.rowSize > fs.maxRowSize { - fs.maxRowSize = w.rowSize - } - } - - heap.Init(fs.rowHeap) - if fs.rowHeap.err != nil { - return nil, errors.Trace(fs.rowHeap.err) - } - - fs.rowBytes = make([]byte, fs.maxRowSize) - - err := fs.openAllFiles() - if err != nil { - return nil, errors.Trace(err) - } - - for id := range fs.fds { - row, err := fs.fetchNextRow(id) - if err != nil { - return nil, errors.Trace(err) - } - if row == nil { - return nil, errors.New("file is empty") - } - - im := &item{ - index: id, - value: row, - } - - heap.Push(fs.rowHeap, im) - if fs.rowHeap.err != nil { - return nil, errors.Trace(fs.rowHeap.err) - } - } - - fs.fetched = true - } - - if fs.rowHeap.Len() > 0 { - im := heap.Pop(fs.rowHeap).(*item) - if fs.rowHeap.err != nil { - return nil, errors.Trace(fs.rowHeap.err) - } - - row, err := fs.fetchNextRow(im.index) - if err != nil { - return nil, errors.Trace(err) - } - if row != nil { - nextIm := &item{ - index: im.index, - value: row, - } - - heap.Push(fs.rowHeap, nextIm) - if fs.rowHeap.err != nil { - return nil, errors.Trace(fs.rowHeap.err) - } - } - - return im.value, nil - } - - return nil, nil -} - -func (fs *FileSorter) openAllFiles() error { - for _, fname := range fs.files { - fd, err := os.Open(fname) - if err != nil { - return errors.Trace(err) - } - fs.fds = append(fs.fds, fd) - } - return nil -} - -// fetchNextRow fetches the next row given the source file index. -func (fs *FileSorter) fetchNextRow(index int) (*comparableRow, error) { - n, err := fs.fds[index].Read(fs.head) - if err == io.EOF { - return nil, nil - } - if err != nil { - return nil, errors.Trace(err) - } - if n != headSize { - return nil, errors.New("incorrect header") - } - rowSize := int(binary.BigEndian.Uint64(fs.head)) - - n, err = fs.fds[index].Read(fs.rowBytes) - if err != nil { - return nil, errors.Trace(err) - } - if n != rowSize { - return nil, errors.New("incorrect row") - } - - fs.dcod, err = codec.Decode(fs.rowBytes, fs.keySize+fs.valSize+1) - if err != nil { - return nil, errors.Trace(err) - } - - return &comparableRow{ - key: fs.dcod[:fs.keySize], - val: fs.dcod[fs.keySize : fs.keySize+fs.valSize], - handle: fs.dcod[fs.keySize+fs.valSize:][0].GetInt64(), - }, nil -} - -// Input adds one row into FileSorter. -// Caller should not call Input after calling Output. -func (fs *FileSorter) Input(key []types.Datum, val []types.Datum, handle int64) error { - if fs.closed { - return errors.New("FileSorter has been closed") - } - if fs.fetched { - return errors.New("call input after output") - } - - assigned := false - abortTime := time.Duration(1) * time.Minute // 1 minute - cooldownTime := time.Duration(100) * time.Millisecond // 100 milliseconds - row := &comparableRow{ - key: key, - val: val, - handle: handle, - } - - origin := time.Now() - // assign input row to some worker in a round-robin way - for { - for i := 0; i < fs.nWorkers; i++ { - wid := (fs.cWorker + i) % fs.nWorkers - if atomic.LoadInt32(&(fs.workers[wid].busy)) == 0 { - fs.workers[wid].input(row) - assigned = true - fs.cWorker = wid - break - } - } - if assigned { - break - } - - // all workers are busy now, cooldown and retry - time.Sleep(cooldownTime) - - if time.Since(origin) >= abortTime { - // weird: all workers are busy for at least 1 min - // choose to abort for safety - return errors.New("can not make progress since all workers are busy") - } - } - return nil -} - -// Output gets the next sorted row. -func (fs *FileSorter) Output() ([]types.Datum, []types.Datum, int64, error) { - var ( - r *comparableRow - err error - ) - if fs.closed { - return nil, nil, 0, errors.New("FileSorter has been closed") - } - - if fs.external { - r, err = fs.externalSort() - } else { - r, err = fs.internalSort() - } - - if err != nil { - return nil, nil, 0, errors.Trace(err) - } else if r != nil { - return r.key, r.val, r.handle, nil - } else { - return nil, nil, 0, nil - } -} - -// Close terminates the input or output process and discards all remaining data. -func (fs *FileSorter) Close() error { - if fs.closed { - return nil - } - fs.wg.Wait() - for _, w := range fs.workers { - w.buf = w.buf[:0] - } - fs.closed = true - err := fs.closeAllFiles() - if err != nil { - return errors.Trace(err) - } - return nil -} - -func (w *Worker) Len() int { return len(w.buf) } - -func (w *Worker) Swap(i, j int) { w.buf[i], w.buf[j] = w.buf[j], w.buf[i] } - -func (w *Worker) Less(i, j int) bool { - l := w.buf[i].key - r := w.buf[j].key - ret, err := lessThan(w.ctx.sc, l, r, w.ctx.byDesc) - if w.err == nil { - w.err = errors.Trace(err) - } - return ret -} - -func (w *Worker) input(row *comparableRow) { - w.buf = append(w.buf, row) - - if len(w.buf) > w.bufSize { - atomic.StoreInt32(&(w.busy), int32(1)) - w.ctx.wg.Add(1) - w.ctx.external = true - go w.flushToFile() - } -} - -// flushToFile flushes the buffer to file if it is full. -func (w *Worker) flushToFile() { - defer w.ctx.wg.Done() - var ( - outputByte []byte - prevLen int - ) - - sort.Sort(w) - if w.err != nil { - return - } - - fileName := w.ctx.getUniqueFileName() - - outputFile, err := os.OpenFile(fileName, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) - if err != nil { - w.err = errors.Trace(err) - return - } - defer terror.Call(outputFile.Close) - sc := &stmtctx.StatementContext{TimeZone: time.Local} - for _, row := range w.buf { - prevLen = len(outputByte) - outputByte = append(outputByte, w.head...) - outputByte, err = codec.EncodeKey(sc, outputByte, row.key...) - if err != nil { - w.err = errors.Trace(err) - return - } - outputByte, err = codec.EncodeKey(sc, outputByte, row.val...) - if err != nil { - w.err = errors.Trace(err) - return - } - outputByte, err = codec.EncodeKey(sc, outputByte, types.NewIntDatum(row.handle)) - if err != nil { - w.err = errors.Trace(err) - return - } - - if len(outputByte)-prevLen-headSize > w.rowSize { - w.rowSize = len(outputByte) - prevLen - headSize - } - binary.BigEndian.PutUint64(w.head, uint64(len(outputByte)-prevLen-headSize)) - for i := 0; i < headSize; i++ { - outputByte[prevLen+i] = w.head[i] - } - } - - _, err = outputFile.Write(outputByte) - if err != nil { - w.err = errors.Trace(err) - return - } - - w.ctx.appendFileName(fileName) - w.buf = w.buf[:0] - atomic.StoreInt32(&(w.busy), int32(0)) -} diff --git a/util/filesort/filesort_test.go b/util/filesort/filesort_test.go deleted file mode 100644 index 43c7146b018d3..0000000000000 --- a/util/filesort/filesort_test.go +++ /dev/null @@ -1,392 +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, -// 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. - -package filesort - -import ( - "math/rand" - "os" - "testing" - "time" - - "github.com/pingcap/tidb/sessionctx/stmtctx" - "github.com/pingcap/tidb/types" - "github.com/stretchr/testify/require" -) - -func TestLessThan(t *testing.T) { - t.Parallel() - - sc := new(stmtctx.StatementContext) - - d0 := types.NewDatum(0) - d1 := types.NewDatum(1) - - tests := []struct { - i []types.Datum - j []types.Datum - byDesc []bool - ret bool - }{ - {[]types.Datum{d0}, []types.Datum{d0}, []bool{false}, false}, - {[]types.Datum{d0}, []types.Datum{d1}, []bool{false}, true}, - {[]types.Datum{d1}, []types.Datum{d0}, []bool{false}, false}, - {[]types.Datum{d0}, []types.Datum{d0}, []bool{true}, false}, - {[]types.Datum{d0}, []types.Datum{d1}, []bool{true}, false}, - {[]types.Datum{d1}, []types.Datum{d0}, []bool{true}, true}, - {[]types.Datum{d0, d0}, []types.Datum{d1, d1}, []bool{false, false}, true}, - {[]types.Datum{d0, d1}, []types.Datum{d1, d1}, []bool{false, false}, true}, - {[]types.Datum{d0, d0}, []types.Datum{d1, d1}, []bool{false, false}, true}, - {[]types.Datum{d0, d0}, []types.Datum{d0, d1}, []bool{false, false}, true}, - {[]types.Datum{d0, d1}, []types.Datum{d0, d1}, []bool{false, false}, false}, - {[]types.Datum{d0, d1}, []types.Datum{d0, d0}, []bool{false, false}, false}, - {[]types.Datum{d1, d0}, []types.Datum{d0, d1}, []bool{false, false}, false}, - {[]types.Datum{d1, d1}, []types.Datum{d0, d1}, []bool{false, false}, false}, - {[]types.Datum{d1, d1}, []types.Datum{d0, d0}, []bool{false, false}, false}, - } - - for _, test := range tests { - ret, err := lessThan(sc, test.i, test.j, test.byDesc) - require.NoError(t, err) - require.Equal(t, test.ret, ret) - } -} - -func TestInMemory(t *testing.T) { - t.Parallel() - - seed := rand.NewSource(time.Now().UnixNano()) - r := rand.New(seed) - - sc := new(stmtctx.StatementContext) - keySize := r.Intn(10) + 1 // random int in range [1, 10] - valSize := r.Intn(20) + 1 // random int in range [1, 20] - bufSize := 40 // hold up to 40 items per file - byDesc := make([]bool, keySize) - for i := range byDesc { - byDesc[i] = r.Intn(2) == 0 - } - - var ( - err error - fs *FileSorter - pkey []types.Datum - key []types.Datum - tmpDir string - ret bool - ) - - tmpDir, err = os.MkdirTemp("", "util_filesort_test") - require.NoError(t, err) - - fsBuilder := new(Builder) - fs, err = fsBuilder.SetSC(sc).SetSchema(keySize, valSize).SetBuf(bufSize).SetWorkers(1).SetDesc(byDesc).SetDir(tmpDir).Build() - require.NoError(t, err) - defer func() { - err := fs.Close() - require.NoError(t, err) - }() - - nRows := r.Intn(bufSize-1) + 1 // random int in range [1, bufSize - 1] - for i := 1; i <= nRows; i++ { - err = fs.Input(nextRow(r, keySize, valSize)) - require.NoError(t, err) - } - - pkey, _, _, err = fs.Output() - require.NoError(t, err) - - for i := 1; i < nRows; i++ { - key, _, _, err = fs.Output() - require.NoError(t, err) - ret, err = lessThan(sc, key, pkey, byDesc) - require.NoError(t, err) - require.False(t, ret) - pkey = key - } -} - -func TestMultipleFiles(t *testing.T) { - t.Parallel() - - seed := rand.NewSource(time.Now().UnixNano()) - r := rand.New(seed) - - sc := new(stmtctx.StatementContext) - keySize := r.Intn(10) + 1 // random int in range [1, 10] - valSize := r.Intn(20) + 1 // random int in range [1, 20] - bufSize := 40 // hold up to 40 items per file - byDesc := make([]bool, keySize) - for i := range byDesc { - byDesc[i] = r.Intn(2) == 0 - } - - var ( - err error - fs *FileSorter - pkey []types.Datum - key []types.Datum - tmpDir string - ret bool - ) - - tmpDir, err = os.MkdirTemp("", "util_filesort_test") - require.NoError(t, err) - - fsBuilder := new(Builder) - - // Test for basic function. - _, err = fsBuilder.Build() - require.EqualError(t, err, "StatementContext is nil") - fsBuilder.SetSC(sc) - _, err = fsBuilder.Build() - require.EqualError(t, err, "key size is not positive") - fsBuilder.SetDesc(byDesc) - _, err = fsBuilder.Build() - require.EqualError(t, err, "mismatch in key size and byDesc slice") - fsBuilder.SetSchema(keySize, valSize) - _, err = fsBuilder.Build() - require.EqualError(t, err, "buffer size is not positive") - fsBuilder.SetBuf(bufSize) - _, err = fsBuilder.Build() - require.EqualError(t, err, "tmpDir does not exist") - fsBuilder.SetDir(tmpDir) - - fs, err = fsBuilder.SetWorkers(1).Build() - require.NoError(t, err) - defer func() { - err := fs.Close() - require.NoError(t, err) - }() - - nRows := (r.Intn(bufSize) + 1) * (r.Intn(10) + 2) - for i := 1; i <= nRows; i++ { - err = fs.Input(nextRow(r, keySize, valSize)) - require.NoError(t, err) - } - - pkey, _, _, err = fs.Output() - require.NoError(t, err) - for i := 1; i < nRows; i++ { - key, _, _, err = fs.Output() - require.NoError(t, err) - ret, err = lessThan(sc, key, pkey, byDesc) - require.NoError(t, err) - require.False(t, ret) - pkey = key - } -} - -func TestMultipleWorkers(t *testing.T) { - t.Parallel() - - seed := rand.NewSource(time.Now().UnixNano()) - r := rand.New(seed) - - sc := new(stmtctx.StatementContext) - keySize := r.Intn(10) + 1 // random int in range [1, 10] - valSize := r.Intn(20) + 1 // random int in range [1, 20] - bufSize := 40 // hold up to 40 items per file - byDesc := make([]bool, keySize) - for i := range byDesc { - byDesc[i] = r.Intn(2) == 0 - } - - var ( - err error - fs *FileSorter - pkey []types.Datum - key []types.Datum - tmpDir string - ret bool - ) - - tmpDir, err = os.MkdirTemp("", "util_filesort_test") - require.NoError(t, err) - - fsBuilder := new(Builder) - fs, err = fsBuilder.SetSC(sc).SetSchema(keySize, valSize).SetBuf(bufSize).SetWorkers(4).SetDesc(byDesc).SetDir(tmpDir).Build() - require.NoError(t, err) - defer func() { - err := fs.Close() - require.NoError(t, err) - }() - - nRows := (r.Intn(bufSize) + 1) * (r.Intn(10) + 2) - for i := 1; i <= nRows; i++ { - err = fs.Input(nextRow(r, keySize, valSize)) - require.NoError(t, err) - } - - pkey, _, _, err = fs.Output() - require.NoError(t, err) - for i := 1; i < nRows; i++ { - key, _, _, err = fs.Output() - require.NoError(t, err) - ret, err = lessThan(sc, key, pkey, byDesc) - require.NoError(t, err) - require.False(t, ret) - pkey = key - } -} - -func TestClose(t *testing.T) { - t.Parallel() - - seed := rand.NewSource(time.Now().UnixNano()) - r := rand.New(seed) - - sc := new(stmtctx.StatementContext) - keySize := 2 - valSize := 2 - bufSize := 40 - byDesc := []bool{false, false} - - var ( - err error - fs0 *FileSorter - fs1 *FileSorter - tmpDir0 string - tmpDir1 string - errmsg = "FileSorter has been closed" - ) - - // Prepare two FileSorter instances for tests - fsBuilder := new(Builder) - tmpDir0, err = os.MkdirTemp("", "util_filesort_test") - require.NoError(t, err) - fs0, err = fsBuilder.SetSC(sc).SetSchema(keySize, valSize).SetBuf(bufSize).SetWorkers(1).SetDesc(byDesc).SetDir(tmpDir0).Build() - require.NoError(t, err) - defer func() { - err := fs0.Close() - require.NoError(t, err) - }() - - tmpDir1, err = os.MkdirTemp("", "util_filesort_test") - require.NoError(t, err) - fs1, err = fsBuilder.SetSC(sc).SetSchema(keySize, valSize).SetBuf(bufSize).SetWorkers(1).SetDesc(byDesc).SetDir(tmpDir1).Build() - require.NoError(t, err) - defer func() { - err := fs1.Close() - require.NoError(t, err) - }() - - // 1. Close after some Input - err = fs0.Input(nextRow(r, keySize, valSize)) - require.NoError(t, err) - - err = fs0.Close() - require.NoError(t, err) - - _, err = os.Stat(tmpDir0) - require.True(t, os.IsNotExist(err)) - - _, _, _, err = fs0.Output() - require.EqualError(t, err, errmsg) - - err = fs0.Input(nextRow(r, keySize, valSize)) - require.EqualError(t, err, errmsg) - - err = fs0.Close() - require.NoError(t, err) - - // 2. Close after some Output - err = fs1.Input(nextRow(r, keySize, valSize)) - require.NoError(t, err) - err = fs1.Input(nextRow(r, keySize, valSize)) - require.NoError(t, err) - - _, _, _, err = fs1.Output() - require.NoError(t, err) - - err = fs1.Close() - require.NoError(t, err) - - _, err = os.Stat(tmpDir1) - require.True(t, os.IsNotExist(err)) - - _, _, _, err = fs1.Output() - require.EqualError(t, err, errmsg) - - err = fs1.Input(nextRow(r, keySize, valSize)) - require.EqualError(t, err, errmsg) - - err = fs1.Close() - require.NoError(t, err) -} - -func TestMismatchedUsage(t *testing.T) { - t.Parallel() - - seed := rand.NewSource(time.Now().UnixNano()) - r := rand.New(seed) - - sc := new(stmtctx.StatementContext) - keySize := 2 - valSize := 2 - bufSize := 40 - byDesc := []bool{false, false} - - var ( - err error - fs0 *FileSorter - fs1 *FileSorter - key []types.Datum - tmpDir string - errmsg = "call input after output" - ) - - // Prepare two FileSorter instances for tests - fsBuilder := new(Builder) - tmpDir, err = os.MkdirTemp("", "util_filesort_test") - require.NoError(t, err) - fs0, err = fsBuilder.SetSC(sc).SetSchema(keySize, valSize).SetBuf(bufSize).SetWorkers(1).SetDesc(byDesc).SetDir(tmpDir).Build() - require.NoError(t, err) - defer func() { - err := fs0.Close() - require.NoError(t, err) - }() - - tmpDir, err = os.MkdirTemp("", "util_filesort_test") - require.NoError(t, err) - fs1, err = fsBuilder.SetSC(sc).SetSchema(keySize, valSize).SetBuf(bufSize).SetWorkers(1).SetDesc(byDesc).SetDir(tmpDir).Build() - require.NoError(t, err) - defer func() { - err := fs1.Close() - require.NoError(t, err) - }() - - // 1. call Output after fetched all rows - err = fs0.Input(nextRow(r, keySize, valSize)) - require.NoError(t, err) - - key, _, _, err = fs0.Output() - require.NoError(t, err) - require.NotNil(t, key) - - key, _, _, err = fs0.Output() - require.NoError(t, err) - require.Nil(t, key) - - // 2. call Input after Output - err = fs1.Input(nextRow(r, keySize, valSize)) - require.NoError(t, err) - - key, _, _, err = fs1.Output() - require.NoError(t, err) - require.NotNil(t, key) - - err = fs1.Input(nextRow(r, keySize, valSize)) - require.EqualError(t, err, errmsg) -} diff --git a/util/format/format_test.go b/util/format/format_test.go index efe33b75f11c8..d96492973afae 100644 --- a/util/format/format_test.go +++ b/util/format/format_test.go @@ -31,8 +31,6 @@ func checkFormat(t *testing.T, f Formatter, buf *bytes.Buffer, str, expect strin } func TestFormat(t *testing.T) { - t.Parallel() - str := "abc%d%%e%i\nx\ny\n%uz\n" buf := &bytes.Buffer{} f := IndentFormatter(buf, "\t") diff --git a/util/generatedexpr/gen_expr_test.go b/util/generatedexpr/gen_expr_test.go index ca00e6349749c..484453466e7eb 100644 --- a/util/generatedexpr/gen_expr_test.go +++ b/util/generatedexpr/gen_expr_test.go @@ -24,8 +24,6 @@ import ( ) func TestParseExpression(t *testing.T) { - t.Parallel() - node, err := ParseExpression("json_extract(a, '$.a')") require.NoError(t, err) require.Equal(t, "json_extract", node.(*ast.FuncCallExpr).FnName.L) diff --git a/util/hint/hint_processor.go b/util/hint/hint_processor.go index 9cbf41e93c0a2..1bc49d92da301 100644 --- a/util/hint/hint_processor.go +++ b/util/hint/hint_processor.go @@ -32,6 +32,7 @@ import ( ) var supportedHintNameForInsertStmt = map[string]struct{}{} +var errWarnConflictingHint = dbterror.ClassUtil.NewStd(errno.ErrWarnConflictingHint) func init() { supportedHintNameForInsertStmt["memory_quota"] = struct{}{} @@ -118,8 +119,7 @@ func checkInsertStmtHintDuplicated(node ast.Node, sctx sessionctx.Context) { } if duplicatedHint != nil { hint := fmt.Sprintf("%s(`%v`)", duplicatedHint.HintName.O, duplicatedHint.HintData) - err := dbterror.ClassUtil.NewStd(errno.ErrWarnConflictingHint).FastGenByArgs(hint) - sctx.GetSessionVars().StmtCtx.AppendWarning(err) + sctx.GetSessionVars().StmtCtx.AppendWarning(errWarnConflictingHint.FastGenByArgs(hint)) } } } @@ -299,7 +299,8 @@ func ParseHintsSet(p *parser.Parser, sql, charset, collation, db string) (*Hints func extractHintWarns(warns []error) []error { for _, w := range warns { - if parser.ErrWarnOptimizerHintUnsupportedHint.Equal(w) || + if parser.ErrParse.Equal(w) || + parser.ErrWarnOptimizerHintUnsupportedHint.Equal(w) || parser.ErrWarnOptimizerHintInvalidToken.Equal(w) || parser.ErrWarnMemoryQuotaOverflow.Equal(w) || parser.ErrWarnOptimizerHintParseError.Equal(w) || diff --git a/util/israce/israce.go b/util/israce/israce.go index 0e2bd2580159f..6e511d6ccfa47 100644 --- a/util/israce/israce.go +++ b/util/israce/israce.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build race // +build race package israce diff --git a/util/israce/norace.go b/util/israce/norace.go index 8043db3cd3ac2..ca735bbdebf02 100644 --- a/util/israce/norace.go +++ b/util/israce/norace.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build !race // +build !race package israce diff --git a/util/kvcache/simple_lru_test.go b/util/kvcache/simple_lru_test.go index 3498be84174b3..009971a640e93 100644 --- a/util/kvcache/simple_lru_test.go +++ b/util/kvcache/simple_lru_test.go @@ -46,8 +46,6 @@ func newMockHashKey(key int64) *mockCacheKey { } func TestPut(t *testing.T) { - t.Parallel() - maxMem, err := memory.MemTotal() require.NoError(t, err) @@ -121,7 +119,6 @@ func TestPut(t *testing.T) { } func TestZeroQuota(t *testing.T) { - t.Parallel() lru := NewSimpleLRUCache(100, 0, 0) require.Equal(t, uint(100), lru.capacity) @@ -138,7 +135,6 @@ func TestZeroQuota(t *testing.T) { } func TestOOMGuard(t *testing.T) { - t.Parallel() maxMem, err := memory.MemTotal() require.NoError(t, err) @@ -164,7 +160,6 @@ func TestOOMGuard(t *testing.T) { } func TestGet(t *testing.T) { - t.Parallel() maxMem, err := memory.MemTotal() require.NoError(t, err) @@ -208,7 +203,6 @@ func TestGet(t *testing.T) { } func TestDelete(t *testing.T) { - t.Parallel() maxMem, err := memory.MemTotal() require.NoError(t, err) @@ -238,7 +232,6 @@ func TestDelete(t *testing.T) { } func TestDeleteAll(t *testing.T) { - t.Parallel() maxMem, err := memory.MemTotal() require.NoError(t, err) @@ -265,7 +258,6 @@ func TestDeleteAll(t *testing.T) { } func TestValues(t *testing.T) { - t.Parallel() maxMem, err := memory.MemTotal() require.NoError(t, err) @@ -288,7 +280,6 @@ func TestValues(t *testing.T) { } func TestPutProfileName(t *testing.T) { - t.Parallel() lru := NewSimpleLRUCache(3, 0, 10) require.Equal(t, uint(3), lru.capacity) tem := reflect.TypeOf(*lru) diff --git a/util/localpool/localpool_norace.go b/util/localpool/localpool_norace.go index ffb875c800d4f..c483d6f35b087 100644 --- a/util/localpool/localpool_norace.go +++ b/util/localpool/localpool_norace.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build !race // +build !race package localpool diff --git a/util/localpool/localpool_race.go b/util/localpool/localpool_race.go index da45876634b40..75dfdd6c043fb 100644 --- a/util/localpool/localpool_race.go +++ b/util/localpool/localpool_race.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build race // +build race package localpool diff --git a/util/localpool/localpool_test.go b/util/localpool/localpool_test.go index 7a0530b89db1a..52209fabf78f7 100644 --- a/util/localpool/localpool_test.go +++ b/util/localpool/localpool_test.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build !race // +build !race package localpool @@ -19,9 +20,9 @@ package localpool import ( "math/rand" "runtime" - "sync" "testing" + "github.com/pingcap/tidb/util" "github.com/stretchr/testify/require" ) @@ -32,19 +33,19 @@ type Obj struct { func TestPool(t *testing.T) { numWorkers := runtime.GOMAXPROCS(0) - wg := new(sync.WaitGroup) - wg.Add(numWorkers) + wg := new(util.WaitGroupWrapper) pool := NewLocalPool(16, func() interface{} { return new(Obj) }, nil) n := 1000 for i := 0; i < numWorkers; i++ { - go func() { + wg.Run(func() { for j := 0; j < n; j++ { - GetAndPut(pool) + obj := pool.Get().(*Obj) + obj.val = rand.Int63() + pool.Put(obj) } - wg.Done() - }() + }) } wg.Wait() var getHit, getMiss, putHit, putMiss int diff --git a/util/logutil/log.go b/util/logutil/log.go index 5f522ee098e6b..a9e7efa6a0b78 100644 --- a/util/logutil/log.go +++ b/util/logutil/log.go @@ -16,6 +16,7 @@ package logutil import ( "context" + "encoding/json" "fmt" "os" "runtime/trace" @@ -143,6 +144,29 @@ func initGRPCLogger(cfg *LogConfig) (*zap.Logger, *log.ZapProperties, error) { return l, prop, nil } +// ReplaceLogger replace global logger instance with given log config. +func ReplaceLogger(cfg *LogConfig) error { + gl, props, err := log.InitLogger(&cfg.Config, zap.AddStacktrace(zapcore.FatalLevel)) + if err != nil { + return errors.Trace(err) + } + log.ReplaceGlobals(gl, props) + + cfgJSON, err := json.Marshal(&cfg.Config) + if err != nil { + return errors.Trace(err) + } + + SlowQueryLogger, _, err = newSlowQueryLogger(cfg) + if err != nil { + return errors.Trace(err) + } + + log.S().Infof("replaced global logger with config: %s", string(cfgJSON)) + + return nil +} + // SetLevel sets the zap logger's level. func SetLevel(level string) error { l := zap.NewAtomicLevel() diff --git a/util/logutil/log_test.go b/util/logutil/log_test.go index c8c4c89c3f4f2..69eb731dee8c6 100644 --- a/util/logutil/log_test.go +++ b/util/logutil/log_test.go @@ -25,6 +25,7 @@ import ( "github.com/pingcap/log" "github.com/stretchr/testify/require" "go.uber.org/zap" + "go.uber.org/zap/zapcore" ) func TestZapLoggerWithKeys(t *testing.T) { @@ -115,11 +116,43 @@ func TestGrpcLoggerCreation(t *testing.T) { } func TestSlowQueryLoggerCreation(t *testing.T) { - level := "warn" + level := "Error" conf := NewLogConfig(level, DefaultLogFormat, "", EmptyFileLogConfig, false) _, prop, err := newSlowQueryLogger(conf) // assert after init slow query logger, the original conf is not changed require.Equal(t, conf.Level, level) require.Nil(t, err) - require.Equal(t, prop.Level.String(), conf.Level) + // slow query logger doesn't use the level of the global log config, and the + // level should be less than WarnLevel which is used by it to log slow query. + require.NotEqual(t, conf.Level, prop.Level.String()) + require.True(t, prop.Level.Level() <= zapcore.WarnLevel) + + level = "warn" + slowQueryFn := "slow-query.log" + fileConf := FileLogConfig{ + log.FileLogConfig{ + Filename: slowQueryFn, + MaxSize: 10, + MaxDays: 10, + MaxBackups: 10, + }, + } + conf = NewLogConfig(level, DefaultLogFormat, slowQueryFn, fileConf, false) + slowQueryConf := newSlowQueryLogConfig(conf) + // slowQueryConf.MaxDays/MaxSize/MaxBackups should be same with global config. + require.Equal(t, fileConf.FileLogConfig, slowQueryConf.File) +} + +func TestGlobalLoggerReplace(t *testing.T) { + fileCfg := FileLogConfig{log.FileLogConfig{Filename: "zap_log", MaxDays: 0, MaxSize: 4096}} + conf := NewLogConfig("info", DefaultLogFormat, "", fileCfg, false) + err := InitLogger(conf) + require.NoError(t, err) + + conf.Config.File.MaxDays = 14 + + err = ReplaceLogger(conf) + require.NoError(t, err) + err = os.Remove(fileCfg.Filename) + require.NoError(t, err) } diff --git a/util/logutil/slow_query_logger.go b/util/logutil/slow_query_logger.go index 5f81f3d73b2f4..d5d59f98aface 100644 --- a/util/logutil/slow_query_logger.go +++ b/util/logutil/slow_query_logger.go @@ -28,19 +28,8 @@ import ( var _pool = buffer.NewPool() func newSlowQueryLogger(cfg *LogConfig) (*zap.Logger, *log.ZapProperties, error) { - - // copy global config and override slow query log file - // if slow query log filename is empty, slow query log will behave the same as global log - sqConfig := cfg.Config - if len(cfg.SlowQueryFile) != 0 { - sqConfig.File = log.FileLogConfig{ - MaxSize: cfg.File.MaxSize, - Filename: cfg.SlowQueryFile, - } - } - // create the slow query logger - sqLogger, prop, err := log.InitLogger(&sqConfig) + sqLogger, prop, err := log.InitLogger(newSlowQueryLogConfig(cfg)) if err != nil { return nil, nil, errors.Trace(err) } @@ -55,6 +44,20 @@ func newSlowQueryLogger(cfg *LogConfig) (*zap.Logger, *log.ZapProperties, error) return sqLogger, prop, nil } +func newSlowQueryLogConfig(cfg *LogConfig) *log.Config { + // copy the global log config to slow log config + // if the filename of slow log config is empty, slow log will behave the same as global log. + sqConfig := cfg.Config + // level of the global log config doesn't affect the slow query logger which determines whether to + // log by execution duration. + sqConfig.Level = LogConfig{}.Level + if len(cfg.SlowQueryFile) != 0 { + sqConfig.File = cfg.File + sqConfig.File.Filename = cfg.SlowQueryFile + } + return &sqConfig +} + type slowLogEncoder struct{} func (e *slowLogEncoder) EncodeEntry(entry zapcore.Entry, _ []zapcore.Field) (*buffer.Buffer, error) { diff --git a/util/math/math_test.go b/util/math/math_test.go index 39d3e4241d7e1..6c180e45bc481 100644 --- a/util/math/math_test.go +++ b/util/math/math_test.go @@ -24,7 +24,6 @@ import ( func TestStrLenOfUint64Fast(t *testing.T) { t.Run("RandomInput", func(t *testing.T) { - t.Parallel() for i := 0; i < 1000000; i++ { num := rand.Uint64() expected := len(strconv.FormatUint(num, 10)) @@ -34,7 +33,6 @@ func TestStrLenOfUint64Fast(t *testing.T) { }) t.Run("ManualInput", func(t *testing.T) { - t.Parallel() nums := [22]uint64{0, 1, 12, 123, 1234, 12345, 123456, 1234567, 12345678, 123456789, 1234567890, diff --git a/expression/rand.go b/util/math/rand.go similarity index 74% rename from expression/rand.go rename to util/math/rand.go index f33331374f197..25b111e72788b 100644 --- a/expression/rand.go +++ b/util/math/rand.go @@ -12,9 +12,12 @@ // See the License for the specific language governing permissions and // limitations under the License. -package expression +package math -import "time" +import ( + "sync" + "time" +) const maxRandValue = 0x3FFFFFFF @@ -23,13 +26,18 @@ const maxRandValue = 0x3FFFFFFF type MysqlRng struct { seed1 uint32 seed2 uint32 + mu *sync.Mutex } // NewWithSeed create a rng with random seed. func NewWithSeed(seed int64) *MysqlRng { seed1 := uint32(seed*0x10001+55555555) % maxRandValue seed2 := uint32(seed*0x10000001) % maxRandValue - return &MysqlRng{seed1: seed1, seed2: seed2} + return &MysqlRng{ + seed1: seed1, + seed2: seed2, + mu: &sync.Mutex{}, + } } // NewWithTime create a rng with time stamp. @@ -39,7 +47,23 @@ func NewWithTime() *MysqlRng { // Gen will generate random number. func (rng *MysqlRng) Gen() float64 { + rng.mu.Lock() + defer rng.mu.Unlock() rng.seed1 = (rng.seed1*3 + rng.seed2) % maxRandValue rng.seed2 = (rng.seed1 + rng.seed2 + 33) % maxRandValue return float64(rng.seed1) / float64(maxRandValue) } + +// SetSeed1 is a interface to set seed1 +func (rng *MysqlRng) SetSeed1(seed uint32) { + rng.mu.Lock() + defer rng.mu.Unlock() + rng.seed1 = seed +} + +// SetSeed2 is a interface to set seed2 +func (rng *MysqlRng) SetSeed2(seed uint32) { + rng.mu.Lock() + defer rng.mu.Unlock() + rng.seed2 = seed +} diff --git a/expression/rand_test.go b/util/math/rand_test.go similarity index 64% rename from expression/rand_test.go rename to util/math/rand_test.go index 2d5d7bd16a681..d262d676478d6 100644 --- a/expression/rand_test.go +++ b/util/math/rand_test.go @@ -12,15 +12,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -package expression +package math import ( + "testing" "time" - "github.com/pingcap/check" + "github.com/stretchr/testify/require" ) -func (s *testExpressionSuite) TestRandWithTime(c *check.C) { +func TestRandWithTime(t *testing.T) { rng1 := NewWithTime() // NOTE: On windows platform, this Sleep is necessary. Because time.Now() is // imprecise, calling UnixNano() twice returns the same value. We have to make @@ -29,16 +30,16 @@ func (s *testExpressionSuite) TestRandWithTime(c *check.C) { rng2 := NewWithTime() got1 := rng1.Gen() got2 := rng2.Gen() - c.Assert(got1 < 1.0, check.IsTrue) - c.Assert(got1 >= 0.0, check.IsTrue) - c.Assert(got1 != rng1.Gen(), check.IsTrue) - c.Assert(got2 < 1.0, check.IsTrue) - c.Assert(got2 >= 0.0, check.IsTrue) - c.Assert(got2 != rng2.Gen(), check.IsTrue) - c.Assert(got1 != got2, check.IsTrue) + require.True(t, got1 < 1.0) + require.True(t, got1 >= 0.0) + require.True(t, got1 != rng1.Gen()) + require.True(t, got2 < 1.0) + require.True(t, got2 >= 0.0) + require.True(t, got2 != rng2.Gen()) + require.True(t, got1 != got2) } -func (s *testExpressionSuite) TestRandWithSeed(c *check.C) { +func TestRandWithSeed(t *testing.T) { tests := [4]struct { seed int64 once float64 @@ -50,8 +51,21 @@ func (s *testExpressionSuite) TestRandWithSeed(c *check.C) { for _, test := range tests { rng := NewWithSeed(test.seed) got1 := rng.Gen() - c.Assert(got1 == test.once, check.IsTrue) + require.Equal(t, got1, test.once) got2 := rng.Gen() - c.Assert(got2 == test.twice, check.IsTrue) + require.Equal(t, got2, test.twice) } } + +func TestRandWithSeed1AndSeed2(t *testing.T) { + seed1 := uint32(10000000) + seed2 := uint32(1000000) + + rng := NewWithTime() + rng.SetSeed1(seed1) + rng.SetSeed2(seed2) + + require.Equal(t, rng.Gen(), 0.028870999839968048) + require.Equal(t, rng.Gen(), 0.11641535266900002) + require.Equal(t, rng.Gen(), 0.49546379455874096) +} diff --git a/util/memory/tracker.go b/util/memory/tracker.go index cda7a67ad278b..470029e309402 100644 --- a/util/memory/tracker.go +++ b/util/memory/tracker.go @@ -552,4 +552,8 @@ const ( LabelForSimpleTask int = -18 // LabelForCTEStorage represents the label of CTE storage LabelForCTEStorage int = -19 + // LabelForIndexJoinInnerWorker represents the label of IndexJoin InnerWorker + LabelForIndexJoinInnerWorker int = -20 + // LabelForIndexJoinOuterWorker represents the label of IndexJoin OuterWorker + LabelForIndexJoinOuterWorker int = -21 ) diff --git a/util/memory/tracker_test.go b/util/memory/tracker_test.go index 1fe8b3aeb63df..f0ce70b55f56c 100644 --- a/util/memory/tracker_test.go +++ b/util/memory/tracker_test.go @@ -29,8 +29,6 @@ import ( ) func TestSetLabel(t *testing.T) { - t.Parallel() - tracker := NewTracker(1, -1) require.Equal(t, 1, tracker.label) require.Equal(t, int64(0), tracker.BytesConsumed()) @@ -73,8 +71,6 @@ func TestConsume(t *testing.T) { } func TestOOMAction(t *testing.T) { - t.Parallel() - tracker := NewTracker(1, 100) // make sure no panic here. tracker.Consume(10000) @@ -144,8 +140,6 @@ func (a *mockAction) GetPriority() int64 { } func TestAttachTo(t *testing.T) { - t.Parallel() - oldParent := NewTracker(1, -1) newParent := NewTracker(2, -1) child := NewTracker(3, -1) @@ -168,8 +162,6 @@ func TestAttachTo(t *testing.T) { } func TestDetach(t *testing.T) { - t.Parallel() - parent := NewTracker(1, -1) child := NewTracker(2, -1) child.Consume(100) @@ -187,8 +179,6 @@ func TestDetach(t *testing.T) { } func TestReplaceChild(t *testing.T) { - t.Parallel() - oldChild := NewTracker(1, -1) oldChild.Consume(100) newChild := NewTracker(2, -1) @@ -231,8 +221,6 @@ func TestReplaceChild(t *testing.T) { } func TestToString(t *testing.T) { - t.Parallel() - parent := NewTracker(1, -1) child1 := NewTracker(2, 1000) child2 := NewTracker(3, -1) @@ -270,8 +258,6 @@ func TestToString(t *testing.T) { } func TestMaxConsumed(t *testing.T) { - t.Parallel() - r := NewTracker(1, -1) c1 := NewTracker(2, -1) c2 := NewTracker(3, -1) @@ -299,8 +285,6 @@ func TestMaxConsumed(t *testing.T) { } func TestGlobalTracker(t *testing.T) { - t.Parallel() - r := NewGlobalTracker(1, -1) c1 := NewTracker(2, -1) c2 := NewTracker(3, -1) @@ -388,8 +372,6 @@ func parseByte(str string) (int64, error) { } func TestFormatBytesWithPrune(t *testing.T) { - t.Parallel() - cases := []struct { b string s string @@ -435,14 +417,10 @@ func TestFormatBytesWithPrune(t *testing.T) { } func TestErrorCode(t *testing.T) { - t.Parallel() - require.Equal(t, errno.ErrMemExceedThreshold, int(terror.ToSQLError(errMemExceedThreshold).Code)) } func TestOOMActionPriority(t *testing.T) { - t.Parallel() - tracker := NewTracker(1, 100) // make sure no panic here. tracker.Consume(10000) diff --git a/util/misc.go b/util/misc.go index f9256e180b716..21296da4086c9 100644 --- a/util/misc.go +++ b/util/misc.go @@ -166,6 +166,16 @@ func SyntaxWarn(err error) error { if err == nil { return nil } + logutil.BgLogger().Debug("syntax error", zap.Error(err)) + + // If the warn is already a terror with stack, pass it through. + if errors.HasStack(err) { + cause := errors.Cause(err) + if _, ok := cause.(*terror.Error); ok { + return err + } + } + return parser.ErrParse.GenWithStackByArgs(syntaxErrorPrefix, err.Error()) } diff --git a/util/misc_test.go b/util/misc_test.go index 73e56c82d9dbb..11b169669816a 100644 --- a/util/misc_test.go +++ b/util/misc_test.go @@ -34,7 +34,6 @@ import ( func TestRunWithRetry(t *testing.T) { t.Run("success", func(t *testing.T) { - t.Parallel() cnt := 0 err := RunWithRetry(3, 1, func() (bool, error) { cnt++ @@ -48,7 +47,6 @@ func TestRunWithRetry(t *testing.T) { }) t.Run("retry exceeds", func(t *testing.T) { - t.Parallel() cnt := 0 err := RunWithRetry(3, 1, func() (bool, error) { cnt++ @@ -62,7 +60,6 @@ func TestRunWithRetry(t *testing.T) { }) t.Run("failed result", func(t *testing.T) { - t.Parallel() cnt := 0 err := RunWithRetry(3, 1, func() (bool, error) { cnt++ @@ -77,8 +74,6 @@ func TestRunWithRetry(t *testing.T) { } func TestX509NameParseMatch(t *testing.T) { - t.Parallel() - assert.Equal(t, "", X509NameOnline(pkix.Name{})) check := pkix.Name{ @@ -97,13 +92,11 @@ func TestX509NameParseMatch(t *testing.T) { } func TestBasicFuncGetStack(t *testing.T) { - t.Parallel() b := GetStack() assert.Less(t, len(b), 4096) } func TestBasicFuncWithRecovery(t *testing.T) { - t.Parallel() var recovery interface{} WithRecovery(func() { panic("test") @@ -114,20 +107,17 @@ func TestBasicFuncWithRecovery(t *testing.T) { } func TestBasicFuncSyntaxError(t *testing.T) { - t.Parallel() assert.Nil(t, SyntaxError(nil)) assert.True(t, terror.ErrorEqual(SyntaxError(errors.New("test")), parser.ErrParse)) assert.True(t, terror.ErrorEqual(SyntaxError(parser.ErrSyntax.GenWithStackByArgs()), parser.ErrSyntax)) } func TestBasicFuncSyntaxWarn(t *testing.T) { - t.Parallel() assert.Nil(t, SyntaxWarn(nil)) assert.True(t, terror.ErrorEqual(SyntaxWarn(errors.New("test")), parser.ErrParse)) } func TestBasicFuncProcessInfo(t *testing.T) { - t.Parallel() pi := ProcessInfo{ ID: 1, User: "test", @@ -161,7 +151,6 @@ func TestBasicFuncProcessInfo(t *testing.T) { } func TestBasicFuncRandomBuf(t *testing.T) { - t.Parallel() buf := fastrand.Buf(5) assert.Len(t, buf, 5) assert.False(t, bytes.Contains(buf, []byte("$"))) @@ -169,7 +158,6 @@ func TestBasicFuncRandomBuf(t *testing.T) { } func TestToPB(t *testing.T) { - t.Parallel() column := &model.ColumnInfo{ ID: 1, Name: model.NewCIStr("c"), @@ -195,7 +183,6 @@ func TestToPB(t *testing.T) { } func TestComposeURL(t *testing.T) { - t.Parallel() // TODO Setup config for TLS and verify https protocol output assert.Equal(t, ComposeURL("server.example.com", ""), "http://server.example.com") assert.Equal(t, ComposeURL("httpserver.example.com", ""), "http://httpserver.example.com") diff --git a/util/mock/context.go b/util/mock/context.go index ea75700b56802..7bece0df638d9 100644 --- a/util/mock/context.go +++ b/util/mock/context.go @@ -38,8 +38,10 @@ import ( "github.com/tikv/client-go/v2/tikv" ) -var _ sessionctx.Context = (*Context)(nil) -var _ sqlexec.SQLExecutor = (*Context)(nil) +var ( + _ sessionctx.Context = (*Context)(nil) + _ sqlexec.SQLExecutor = (*Context)(nil) +) // Context represents mocked sessionctx.Context. type Context struct { @@ -245,7 +247,7 @@ func (c *Context) InitTxnWithStartTS(startTS uint64) error { return nil } if c.Store != nil { - txn, err := c.Store.BeginWithOption(tikv.DefaultStartTSOption().SetTxnScope(kv.GlobalTxnScope).SetStartTS(startTS)) + txn, err := c.Store.Begin(tikv.WithTxnScope(kv.GlobalTxnScope), tikv.WithStartTS(startTS)) if err != nil { return errors.Trace(err) } diff --git a/util/mock/mock_test.go b/util/mock/mock_test.go index 764fc9c2f32f1..8d2af9fe6575a 100644 --- a/util/mock/mock_test.go +++ b/util/mock/mock_test.go @@ -29,8 +29,6 @@ func (k contextKeyType) String() string { const contextKey contextKeyType = 0 func TestContext(t *testing.T) { - t.Parallel() - ctx := NewContext() ctx.SetValue(contextKey, 1) diff --git a/util/mock/store.go b/util/mock/store.go index 1037a763591fb..9d0ba2815cda5 100644 --- a/util/mock/store.go +++ b/util/mock/store.go @@ -38,12 +38,7 @@ func (s *Store) GetMPPClient() kv.MPPClient { return nil } func (s *Store) GetOracle() oracle.Oracle { return nil } // Begin implements kv.Storage interface. -func (s *Store) Begin() (kv.Transaction, error) { return nil, nil } - -// BeginWithOption implements kv.Storage interface. -func (s *Store) BeginWithOption(option tikv.StartTSOption) (kv.Transaction, error) { - return s.Begin() -} +func (s *Store) Begin(opts ...tikv.TxnOption) (kv.Transaction, error) { return nil, nil } // GetSnapshot implements kv.Storage interface. func (s *Store) GetSnapshot(ver kv.Version) kv.Snapshot { return nil } diff --git a/util/mvmap/mvmap_test.go b/util/mvmap/mvmap_test.go index f1d8b5ebc9cdf..dbc5214925ec2 100644 --- a/util/mvmap/mvmap_test.go +++ b/util/mvmap/mvmap_test.go @@ -23,8 +23,6 @@ import ( ) func TestMVMap(t *testing.T) { - t.Parallel() - m := NewMVMap() m.Put([]byte("abc"), []byte("abc1")) m.Put([]byte("abc"), []byte("abc2")) @@ -52,8 +50,6 @@ func TestMVMap(t *testing.T) { } func TestFNVHash(t *testing.T) { - t.Parallel() - b := []byte{0xcb, 0xf2, 0x9c, 0xe4, 0x84, 0x22, 0x23, 0x25} sum1 := fnvHash64(b) hash := fnv.New64() diff --git a/util/parser/ast_test.go b/util/parser/ast_test.go index 3154474689e60..6c10efc3020b0 100644 --- a/util/parser/ast_test.go +++ b/util/parser/ast_test.go @@ -24,8 +24,6 @@ import ( ) func TestSimpleCases(t *testing.T) { - t.Parallel() - tests := []struct { sql string db string diff --git a/util/parser/parser_test.go b/util/parser/parser_test.go index 6fe69d9ce4b6b..4a05fd0146179 100644 --- a/util/parser/parser_test.go +++ b/util/parser/parser_test.go @@ -22,8 +22,6 @@ import ( ) func TestSpace(t *testing.T) { - t.Parallel() - okTable := []struct { Times int Input string @@ -57,8 +55,6 @@ func TestSpace(t *testing.T) { } func TestDigit(t *testing.T) { - t.Parallel() - okTable := []struct { Times int Input string @@ -98,8 +94,6 @@ func TestDigit(t *testing.T) { } func TestNumber(t *testing.T) { - t.Parallel() - okTable := []struct { Input string ExpectedNum int @@ -136,8 +130,6 @@ func TestNumber(t *testing.T) { } func TestCharAndAnyChar(t *testing.T) { - t.Parallel() - okTable := []struct { Char byte Input string diff --git a/util/pdapi/const.go b/util/pdapi/const.go index 29428b477c878..0ce75f5d5a6a0 100644 --- a/util/pdapi/const.go +++ b/util/pdapi/const.go @@ -16,12 +16,12 @@ package pdapi // The following constants are the APIs of PD server. const ( - HotRead = "/pd/api/v1/hotspot/regions/read" - HotWrite = "/pd/api/v1/hotspot/regions/write" - Regions = "/pd/api/v1/regions" - RegionByID = "/pd/api/v1/region/id/" - Stores = "/pd/api/v1/stores" - ClusterVersion = "/pd/api/v1/config/cluster-version" - Status = "/pd/api/v1/status" - Config = "/pd/api/v1/config" + HotRead = "/pd/api/v1/hotspot/regions/read" + HotWrite = "/pd/api/v1/hotspot/regions/write" + HotHistory = "/pd/api/v1/hotspot/regions/history" + Regions = "/pd/api/v1/regions" + RegionByID = "/pd/api/v1/region/id/" + Stores = "/pd/api/v1/stores" + Status = "/pd/api/v1/status" + Config = "/pd/api/v1/config" ) diff --git a/util/plancodec/codec_test.go b/util/plancodec/codec_test.go index 1b8af9f0b14dc..ed1a8fe2f4833 100644 --- a/util/plancodec/codec_test.go +++ b/util/plancodec/codec_test.go @@ -29,7 +29,6 @@ type encodeTaskTypeCase struct { } func TestEncodeTaskType(t *testing.T) { - t.Parallel() cases := []encodeTaskTypeCase{ {true, kv.UnSpecified, "0", "root"}, {false, kv.TiKV, "1_0", "cop[tikv]"}, @@ -52,8 +51,6 @@ func TestEncodeTaskType(t *testing.T) { } func TestDecodeDiscardPlan(t *testing.T) { - t.Parallel() - plan, err := DecodePlan(PlanDiscardedEncoded) require.NoError(t, err) require.Equal(t, planDiscardedDecoded, plan) diff --git a/util/plancodec/id_test.go b/util/plancodec/id_test.go index 8c2590f5e28b9..f97939e4cc14f 100644 --- a/util/plancodec/id_test.go +++ b/util/plancodec/id_test.go @@ -22,7 +22,6 @@ import ( func TestPlanIDChanged(t *testing.T) { // Attention: for compatibility, shouldn't modify the below test, you can only add test when add new plan ID. - t.Parallel() testCases := []struct { Value int Expected int diff --git a/util/prefix_helper_test.go b/util/prefix_helper_test.go index 279ac86f64e97..94e04add5669d 100644 --- a/util/prefix_helper_test.go +++ b/util/prefix_helper_test.go @@ -34,7 +34,6 @@ const ( ) func TestPrefix(t *testing.T) { - t.Parallel() s, err := mockstore.NewMockStore() require.Nil(t, err) defer func() { @@ -75,7 +74,6 @@ func TestPrefix(t *testing.T) { } func TestPrefixFilter(t *testing.T) { - t.Parallel() rowKey := []byte(`test@#$%l(le[0]..prefix) 2uio`) rowKey[8] = 0x00 rowKey[9] = 0x00 diff --git a/util/printer/printer_test.go b/util/printer/printer_test.go index 38c73fabbd7eb..0a5c3afc5fedc 100644 --- a/util/printer/printer_test.go +++ b/util/printer/printer_test.go @@ -21,7 +21,6 @@ import ( ) func TestPrintResult(t *testing.T) { - t.Parallel() cols := []string{"col1", "col2", "col3"} datas := [][]string{{"11"}, {"21", "22", "23"}} result, ok := GetPrintResult(cols, datas) diff --git a/util/processinfo_test.go b/util/processinfo_test.go index 8edaeb7f4e6a2..ee5d01c5e5d92 100644 --- a/util/processinfo_test.go +++ b/util/processinfo_test.go @@ -23,7 +23,6 @@ import ( ) func TestGlobalConnID(t *testing.T) { - t.Parallel() originCfg := config.GetGlobalConfig() newCfg := *originCfg newCfg.Experimental.EnableGlobalKill = true diff --git a/util/profile/flamegraph.go b/util/profile/flamegraph.go index 2e356279725e7..b814923479d8b 100644 --- a/util/profile/flamegraph.go +++ b/util/profile/flamegraph.go @@ -78,21 +78,6 @@ func (n *flamegraphNode) add(sample *profile.Sample) { } } -// collectFuncUsage collect the value by given function name -func (n *flamegraphNode) collectFuncUsage(name string) int64 { - if n.name == name { - return n.cumValue - } - if len(n.children) == 0 { - return 0 - } - var usage int64 = 0 - for _, child := range n.children { - usage = child.collectFuncUsage(name) + usage - } - return usage -} - type flamegraphNodeWithLocation struct { *flamegraphNode locID uint64 diff --git a/util/profile/flamegraph_test.go b/util/profile/flamegraph_test.go index 634e1286ef8cf..f26c45589be46 100644 --- a/util/profile/flamegraph_test.go +++ b/util/profile/flamegraph_test.go @@ -20,13 +20,12 @@ import ( "testing" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/collate" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestProfileToDatum(t *testing.T) { - t.Parallel() - file, err := os.Open("testdata/test.pprof") require.Nil(t, err) defer func() { @@ -91,7 +90,7 @@ func TestProfileToDatum(t *testing.T) { comment = fmt.Sprintf("row %2d, actual (%s), expected (%s)", i, rowStr, expectStr) equal := true for j, r := range row { - v, err := r.CompareDatum(nil, &datums[i][j]) + v, err := r.Compare(nil, &datums[i][j], collate.GetBinaryCollator()) if v != 0 || err != nil { equal = false break diff --git a/util/profile/profile.go b/util/profile/profile.go index 3746aa4947d63..55457989fa00d 100644 --- a/util/profile/profile.go +++ b/util/profile/profile.go @@ -146,25 +146,3 @@ func (c *Collector) ParseGoroutines(reader io.Reader) ([][]types.Datum, error) { } return rows, nil } - -// getFuncMemUsage get function memory usage from heap profile -func (c *Collector) getFuncMemUsage(name string) (int64, error) { - prof := pprof.Lookup("heap") - if prof == nil { - return 0, errors.Errorf("cannot retrieve %s profile", name) - } - debug := 0 - buffer := &bytes.Buffer{} - if err := prof.WriteTo(buffer, debug); err != nil { - return 0, err - } - p, err := profile.Parse(buffer) - if err != nil { - return 0, err - } - root, err := c.profileToFlamegraphNode(p) - if err != nil { - return 0, err - } - return root.collectFuncUsage(name), nil -} diff --git a/util/profile/profile_test.go b/util/profile/profile_test.go index e8cff9c8daaaa..e9fbfa0c776a4 100644 --- a/util/profile/profile_test.go +++ b/util/profile/profile_test.go @@ -28,7 +28,6 @@ import ( ) func TestProfiles(t *testing.T) { - t.Parallel() var err error var store kv.Storage var dom *domain.Domain diff --git a/util/profile/trackerRecorder.go b/util/profile/trackerRecorder.go deleted file mode 100644 index c8caeb161acf7..0000000000000 --- a/util/profile/trackerRecorder.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2020 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, -// 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. - -package profile - -import ( - "time" - - "github.com/pingcap/log" - "github.com/pingcap/tidb/util/kvcache" - "go.uber.org/zap" -) - -var col = &Collector{} - -// HeapProfileForGlobalMemTracker record heap profile data into each global function memory tracker -func HeapProfileForGlobalMemTracker(d time.Duration) { - log.Info("Mem Profile Tracker started") - t := time.NewTicker(d) - defer t.Stop() - for { - <-t.C - err := heapProfileForGlobalMemTracker() - if err != nil { - log.Warn("profile memory into tracker failed", zap.Error(err)) - } - } -} - -func heapProfileForGlobalMemTracker() error { - bytes, err := col.getFuncMemUsage(kvcache.ProfileName) - if err != nil { - return err - } - defer func() { - if p := recover(); p != nil { - log.Error("GlobalLRUMemUsageTracker meet panic", zap.Any("panic", p), zap.Stack("stack")) - } - }() - kvcache.GlobalLRUMemUsageTracker.ReplaceBytesUsed(bytes) - return nil -} diff --git a/util/profile/trackerrecorder_test.go b/util/profile/trackerrecorder_test.go deleted file mode 100644 index d1936673cfef8..0000000000000 --- a/util/profile/trackerrecorder_test.go +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2020 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, -// 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. - -package profile - -import ( - "math/rand" - "testing" - "time" - "unsafe" - - "github.com/pingcap/tidb/util/kvcache" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestHeapProfileRecorder(t *testing.T) { - t.Parallel() - - // As runtime.MemProfileRate default values is 512 KB , so the num should be greater than 60000 - // that the memory usage of the values would be greater than 512 KB. - num := 60000 - lru := kvcache.NewSimpleLRUCache(uint(num), 0, 0) - - keys := make([]*mockCacheKey, num) - for i := 0; i < num; i++ { - keys[i] = newMockHashKey(int64(i)) - v := getRandomString(10) - lru.Put(keys[i], v) - } - bytes, err := col.getFuncMemUsage(kvcache.ProfileName) - require.Nil(t, err) - - valueSize := int(unsafe.Sizeof(getRandomString(10))) - // ensure that the consumed bytes is at least larger than num * size of value - assert.LessOrEqual(t, int64(valueSize*num), bytes) - // we should assert lru size last and value size to reference lru in order to avoid gc - for _, k := range lru.Keys() { - assert.Len(t, k.Hash(), 8) - } - for _, v := range lru.Values() { - assert.Len(t, v.(string), 10) - } -} - -type mockCacheKey struct { - hash []byte - key int64 -} - -func (mk *mockCacheKey) Hash() []byte { - if mk.hash != nil { - return mk.hash - } - mk.hash = make([]byte, 8) - for i := uint(0); i < 8; i++ { - mk.hash[i] = byte((mk.key >> ((i - 1) * 8)) & 0xff) - } - return mk.hash -} - -func newMockHashKey(key int64) *mockCacheKey { - return &mockCacheKey{ - key: key, - } -} - -func getRandomString(l int) string { - str := "0123456789abcdefghijklmnopqrstuvwxyz" - bytes := []byte(str) - result := []byte{} - r := rand.New(rand.NewSource(time.Now().UnixNano())) - for i := 0; i < l; i++ { - result = append(result, bytes[r.Intn(len(bytes))]) - } - return string(result) -} diff --git a/util/ranger/checker.go b/util/ranger/checker.go index a61e31a13b24c..8431bc05abef6 100644 --- a/util/ranger/checker.go +++ b/util/ranger/checker.go @@ -46,7 +46,7 @@ func (c *conditionChecker) check(condition expression.Expression) bool { } func (c *conditionChecker) checkScalarFunction(scalar *expression.ScalarFunction) bool { - _, collation := scalar.CharsetAndCollation(scalar.GetCtx()) + _, collation := scalar.CharsetAndCollation() switch scalar.FuncName.L { case ast.LogicOr, ast.LogicAnd: return c.check(scalar.GetArgs()[0]) && c.check(scalar.GetArgs()[1]) @@ -111,7 +111,7 @@ func (c *conditionChecker) checkScalarFunction(scalar *expression.ScalarFunction } func (c *conditionChecker) checkLikeFunc(scalar *expression.ScalarFunction) bool { - _, collation := scalar.CharsetAndCollation(scalar.GetCtx()) + _, collation := scalar.CharsetAndCollation() if !collate.CompatibleCollate(scalar.GetArgs()[0].GetType().Collate, collation) { return false } diff --git a/util/ranger/detacher.go b/util/ranger/detacher.go index e19a777006876..6d9b036f7200c 100644 --- a/util/ranger/detacher.go +++ b/util/ranger/detacher.go @@ -98,18 +98,18 @@ func detachColumnDNFConditions(sctx sessionctx.Context, conditions []expression. // in function which is `column in (constant list)`. // If so, it will return the offset of this column in the slice, otherwise return -1 for not found. // Since combining `x >= 2` and `x <= 2` can lead to an eq condition `x = 2`, we take le/ge/lt/gt into consideration. -func getPotentialEqOrInColOffset(expr expression.Expression, cols []*expression.Column) int { +func getPotentialEqOrInColOffset(sctx sessionctx.Context, expr expression.Expression, cols []*expression.Column) int { f, ok := expr.(*expression.ScalarFunction) if !ok { return -1 } - _, collation := expr.CharsetAndCollation(f.GetCtx()) + _, collation := expr.CharsetAndCollation() switch f.FuncName.L { case ast.LogicOr: dnfItems := expression.FlattenDNFConditions(f) offset := int(-1) for _, dnfItem := range dnfItems { - curOffset := getPotentialEqOrInColOffset(dnfItem, cols) + curOffset := getPotentialEqOrInColOffset(sctx, dnfItem, cols) if curOffset == -1 { return -1 } @@ -129,7 +129,7 @@ func getPotentialEqOrInColOffset(expr expression.Expression, cols []*expression. } if constVal, ok := f.GetArgs()[1].(*expression.Constant); ok { val, err := constVal.Eval(chunk.Row{}) - if err != nil || val.IsNull() { + if err != nil || (!sctx.GetSessionVars().RegardNULLAsPoint && val.IsNull()) { // treat col<=>null as range scan instead of point get to avoid incorrect results // when nullable unique index has multiple matches for filter x is null return -1 @@ -151,7 +151,7 @@ func getPotentialEqOrInColOffset(expr expression.Expression, cols []*expression. } if constVal, ok := f.GetArgs()[0].(*expression.Constant); ok { val, err := constVal.Eval(chunk.Row{}) - if err != nil || val.IsNull() { + if err != nil || (!sctx.GetSessionVars().RegardNULLAsPoint && val.IsNull()) { return -1 } for i, col := range cols { @@ -216,7 +216,7 @@ func extractIndexPointRangesForCNF(sctx sessionctx.Context, conds []expression.E sameLens, allPoints := true, true numCols := int(0) for j, ran := range res.Ranges { - if !ran.IsPoint(sctx.GetSessionVars().StmtCtx) { + if !ran.IsPoint(sctx) { allPoints = false break } @@ -448,7 +448,8 @@ func allSinglePoints(sc *stmtctx.StatementContext, points []*point) []*point { if !left.start || right.start || left.excl || right.excl { return nil } - cmp, err := left.value.CompareDatum(sc, &right.value) + // Since the point's collations are equal to the column's collation, we can use any of them. + cmp, err := left.value.Compare(sc, &right.value, collate.GetCollator(left.value.Collation())) if err != nil || cmp != 0 { return nil } @@ -517,7 +518,7 @@ func ExtractEqAndInCondition(sctx sessionctx.Context, conditions []expression.Ex columnValues := make([]*valueInfo, len(cols)) offsets := make([]int, len(conditions)) for i, cond := range conditions { - offset := getPotentialEqOrInColOffset(cond, cols) + offset := getPotentialEqOrInColOffset(sctx, cond, cols) offsets[i] = offset if offset == -1 { continue @@ -532,7 +533,7 @@ func ExtractEqAndInCondition(sctx sessionctx.Context, conditions []expression.Ex mergedAccesses[offset] = accesses[offset] points[offset] = rb.build(accesses[offset]) } - points[offset] = rb.intersection(points[offset], rb.build(cond)) + points[offset] = rb.intersection(points[offset], rb.build(cond), collate.GetCollator(cols[offset].GetType().Collate)) if len(points[offset]) == 0 { // Early termination if false expression found if expression.MaybeOverOptimized4PlanCache(sctx, conditions) { // cannot return an empty-range for plan-cache since the range may become non-empty as parameters change @@ -610,13 +611,12 @@ func ExtractEqAndInCondition(sctx sessionctx.Context, conditions []expression.Ex // detachDNFCondAndBuildRangeForIndex will detach the index filters from table filters when it's a DNF. // We will detach the conditions of every DNF items, then compose them to a DNF. func (d *rangeDetacher) detachDNFCondAndBuildRangeForIndex(condition *expression.ScalarFunction, newTpSlice []*types.FieldType) ([]*Range, []expression.Expression, []*valueInfo, bool, error) { - sc := d.sctx.GetSessionVars().StmtCtx firstColumnChecker := &conditionChecker{ checkerCol: d.cols[0], shouldReserve: d.lengths[0] != types.UnspecifiedLength, length: d.lengths[0], } - rb := builder{sc: sc} + rb := builder{sc: d.sctx.GetSessionVars().StmtCtx} dnfItems := expression.FlattenDNFConditions(condition) newAccessItems := make([]expression.Expression, 0, len(dnfItems)) var totalRanges []*Range @@ -666,7 +666,7 @@ func (d *rangeDetacher) detachDNFCondAndBuildRangeForIndex(condition *expression firstColumnChecker.shouldReserve = d.lengths[0] != types.UnspecifiedLength } points := rb.build(item) - ranges, err := points2Ranges(sc, points, newTpSlice[0]) + ranges, err := points2Ranges(d.sctx, points, newTpSlice[0]) if err != nil { return nil, nil, nil, false, errors.Trace(err) } @@ -693,7 +693,7 @@ func (d *rangeDetacher) detachDNFCondAndBuildRangeForIndex(condition *expression if hasPrefix(d.lengths) { fixPrefixColRange(totalRanges, d.lengths, newTpSlice) } - totalRanges, err := UnionRanges(sc, totalRanges, d.mergeConsecutive) + totalRanges, err := UnionRanges(d.sctx, totalRanges, d.mergeConsecutive) if err != nil { return nil, nil, nil, false, errors.Trace(err) } @@ -716,7 +716,8 @@ func isSameValue(sc *stmtctx.StatementContext, lhs, rhs *valueInfo) (bool, error if lhs == nil || rhs == nil || lhs.mutable || rhs.mutable || lhs.value.Kind() != rhs.value.Kind() { return false, nil } - cmp, err := lhs.value.CompareDatum(sc, rhs.value) + // binary collator may not the best choice, but it can make sure the result is correct. + cmp, err := lhs.value.Compare(sc, rhs.value, collate.GetBinaryCollator()) if err != nil { return false, err } diff --git a/util/ranger/points.go b/util/ranger/points.go index a765c0602af25..007d9a3469bc5 100644 --- a/util/ranger/points.go +++ b/util/ranger/points.go @@ -83,9 +83,10 @@ func (rp *point) Clone(value types.Datum) *point { } type pointSorter struct { - points []*point - err error - sc *stmtctx.StatementContext + points []*point + err error + sc *stmtctx.StatementContext + collator collate.Collator } func (r *pointSorter) Len() int { @@ -95,18 +96,18 @@ func (r *pointSorter) Len() int { func (r *pointSorter) Less(i, j int) bool { a := r.points[i] b := r.points[j] - less, err := rangePointLess(r.sc, a, b) + less, err := rangePointLess(r.sc, a, b, r.collator) if err != nil { r.err = err } return less } -func rangePointLess(sc *stmtctx.StatementContext, a, b *point) (bool, error) { +func rangePointLess(sc *stmtctx.StatementContext, a, b *point, collator collate.Collator) (bool, error) { if a.value.Kind() == types.KindMysqlEnum && b.value.Kind() == types.KindMysqlEnum { return rangePointEnumLess(sc, a, b) } - cmp, err := a.value.CompareDatum(sc, &b.value) + cmp, err := a.value.Compare(sc, &b.value, collator) if cmp != 0 { return cmp < 0, nil } @@ -467,7 +468,7 @@ func handleEnumFromBinOp(sc *stmtctx.StatementContext, ft *types.FieldType, val } d := types.NewCollateMysqlEnumDatum(tmpEnum, ft.Collate) - if v, err := d.CompareDatum(sc, &val); err == nil { + if v, err := d.Compare(sc, &val, collate.GetCollator(ft.Collate)); err == nil { switch op { case ast.LT: if v < 0 { @@ -604,7 +605,7 @@ func (r *builder) buildFromIn(expr *expression.ScalarFunction) ([]*point, bool) endPoint := &point{value: endValue} rangePoints = append(rangePoints, startPoint, endPoint) } - sorter := pointSorter{points: rangePoints, sc: r.sc} + sorter := pointSorter{points: rangePoints, sc: r.sc, collator: collate.GetCollator(colCollate)} sort.Sort(&sorter) if sorter.err != nil { r.err = sorter.err @@ -627,7 +628,7 @@ func (r *builder) buildFromIn(expr *expression.ScalarFunction) ([]*point, bool) } func (r *builder) newBuildFromPatternLike(expr *expression.ScalarFunction) []*point { - _, collation := expr.CharsetAndCollation(expr.GetCtx()) + _, collation := expr.CharsetAndCollation() if !collate.CompatibleCollate(expr.GetArgs()[0].GetType().Collate, collation) { return getFullRange() } @@ -684,7 +685,7 @@ func (r *builder) newBuildFromPatternLike(expr *expression.ScalarFunction) []*po return []*point{{value: types.MinNotNullDatum(), start: true}, {value: types.MaxValueDatum()}} } if isExactMatch { - val := types.NewCollationStringDatum(string(lowValue), tpOfPattern.Collate, tpOfPattern.Flen) + val := types.NewCollationStringDatum(string(lowValue), tpOfPattern.Collate) return []*point{{value: val, start: true}, {value: val}} } startPoint := &point{start: true, excl: exclude} @@ -765,13 +766,15 @@ func (r *builder) buildFromNot(expr *expression.ScalarFunction) []*point { } func (r *builder) buildFromScalarFunc(expr *expression.ScalarFunction) []*point { + _, coll := expr.CharsetAndCollation() + collator := collate.GetCollator(coll) switch op := expr.FuncName.L; op { case ast.GE, ast.GT, ast.LT, ast.LE, ast.EQ, ast.NE, ast.NullEQ: return r.buildFromBinOp(expr) case ast.LogicAnd: - return r.intersection(r.build(expr.GetArgs()[0]), r.build(expr.GetArgs()[1])) + return r.intersection(r.build(expr.GetArgs()[0]), r.build(expr.GetArgs()[1]), collator) case ast.LogicOr: - return r.union(r.build(expr.GetArgs()[0]), r.build(expr.GetArgs()[1])) + return r.union(r.build(expr.GetArgs()[0]), r.build(expr.GetArgs()[1]), collator) case ast.IsTruthWithoutNull: return r.buildFromIsTrue(expr, 0, false) case ast.IsTruthWithNull: @@ -794,19 +797,19 @@ func (r *builder) buildFromScalarFunc(expr *expression.ScalarFunction) []*point return nil } -func (r *builder) intersection(a, b []*point) []*point { - return r.merge(a, b, false) +func (r *builder) intersection(a, b []*point, collator collate.Collator) []*point { + return r.merge(a, b, false, collator) } -func (r *builder) union(a, b []*point) []*point { - return r.merge(a, b, true) +func (r *builder) union(a, b []*point, collator collate.Collator) []*point { + return r.merge(a, b, true, collator) } -func (r *builder) mergeSorted(a, b []*point) []*point { +func (r *builder) mergeSorted(a, b []*point, collator collate.Collator) []*point { ret := make([]*point, 0, len(a)+len(b)) i, j := 0, 0 for i < len(a) && j < len(b) { - less, err := rangePointLess(r.sc, a[i], b[j]) + less, err := rangePointLess(r.sc, a[i], b[j], collator) if err != nil { r.err = err return nil @@ -827,8 +830,8 @@ func (r *builder) mergeSorted(a, b []*point) []*point { return ret } -func (r *builder) merge(a, b []*point, union bool) []*point { - mergedPoints := r.mergeSorted(a, b) +func (r *builder) merge(a, b []*point, union bool, collator collate.Collator) []*point { + mergedPoints := r.mergeSorted(a, b, collator) if r.err != nil { return nil } diff --git a/util/ranger/ranger.go b/util/ranger/ranger.go index 7947696597e71..ac671d3ae32f8 100644 --- a/util/ranger/ranger.go +++ b/util/ranger/ranger.go @@ -17,6 +17,7 @@ package ranger import ( "bytes" "math" + "regexp" "sort" "unicode/utf8" @@ -25,15 +26,19 @@ import ( "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/parser/ast" "github.com/pingcap/tidb/parser/charset" + "github.com/pingcap/tidb/parser/format" "github.com/pingcap/tidb/parser/mysql" "github.com/pingcap/tidb/parser/terror" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" + driver "github.com/pingcap/tidb/types/parser_driver" "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/util/collate" ) -func validInterval(sc *stmtctx.StatementContext, low, high *point) (bool, error) { +func validInterval(sctx sessionctx.Context, low, high *point) (bool, error) { + sc := sctx.GetSessionVars().StmtCtx l, err := codec.EncodeKey(sc, nil, low.value) if err != nil { return false, errors.Trace(err) @@ -53,18 +58,18 @@ func validInterval(sc *stmtctx.StatementContext, low, high *point) (bool, error) // points2Ranges build index ranges from range points. // Only one column is built there. If there're multiple columns, use appendPoints2Ranges. -func points2Ranges(sc *stmtctx.StatementContext, rangePoints []*point, tp *types.FieldType) ([]*Range, error) { +func points2Ranges(sctx sessionctx.Context, rangePoints []*point, tp *types.FieldType) ([]*Range, error) { ranges := make([]*Range, 0, len(rangePoints)/2) for i := 0; i < len(rangePoints); i += 2 { - startPoint, err := convertPoint(sc, rangePoints[i], tp) + startPoint, err := convertPoint(sctx, rangePoints[i], tp) if err != nil { return nil, errors.Trace(err) } - endPoint, err := convertPoint(sc, rangePoints[i+1], tp) + endPoint, err := convertPoint(sctx, rangePoints[i+1], tp) if err != nil { return nil, errors.Trace(err) } - less, err := validInterval(sc, startPoint, endPoint) + less, err := validInterval(sctx, startPoint, endPoint) if err != nil { return nil, errors.Trace(err) } @@ -87,7 +92,8 @@ func points2Ranges(sc *stmtctx.StatementContext, rangePoints []*point, tp *types return ranges, nil } -func convertPoint(sc *stmtctx.StatementContext, point *point, tp *types.FieldType) (*point, error) { +func convertPoint(sctx sessionctx.Context, point *point, tp *types.FieldType) (*point, error) { + sc := sctx.GetSessionVars().StmtCtx switch point.value.Kind() { case types.KindMaxValue, types.KindMinNotNull: return point, nil @@ -102,6 +108,9 @@ func convertPoint(sc *stmtctx.StatementContext, point *point, tp *types.FieldTyp // Ignore the types.ErrOverflow when we convert TypeNewDecimal values. // A trimmed valid boundary point value would be returned then. Accordingly, the `excl` of the point // would be adjusted. Impossible ranges would be skipped by the `validInterval` call later. + } else if point.value.Kind() == types.KindMysqlTime && tp.Tp == mysql.TypeTimestamp && terror.ErrorEqual(err, types.ErrWrongValue) { + // See issue #28424: query failed after add index + // Ignore conversion from Date[Time] to Timestamp since it must be either out of range or impossible date, which will not match a point select } else if tp.Tp == mysql.TypeEnum && terror.ErrorEqual(err, types.ErrTruncated) { // Ignore the types.ErrorTruncated when we convert TypeEnum values. // We should cover Enum upper overflow, and convert to the biggest value. @@ -116,7 +125,7 @@ func convertPoint(sc *stmtctx.StatementContext, point *point, tp *types.FieldTyp return point, errors.Trace(err) } } - valCmpCasted, err := point.value.CompareDatum(sc, &casted) + valCmpCasted, err := point.value.Compare(sc, &casted, collate.GetCollator(tp.Collate)) if err != nil { return point, errors.Trace(err) } @@ -156,15 +165,15 @@ func convertPoint(sc *stmtctx.StatementContext, point *point, tp *types.FieldTyp // The additional column ranges can only be appended to point ranges. // for example we have an index (a, b), if the condition is (a > 1 and b = 2) // then we can not build a conjunctive ranges for this index. -func appendPoints2Ranges(sc *stmtctx.StatementContext, origin []*Range, rangePoints []*point, +func appendPoints2Ranges(sctx sessionctx.Context, origin []*Range, rangePoints []*point, ft *types.FieldType) ([]*Range, error) { var newIndexRanges []*Range for i := 0; i < len(origin); i++ { oRange := origin[i] - if !oRange.IsPoint(sc) { + if !oRange.IsPoint(sctx) { newIndexRanges = append(newIndexRanges, oRange) } else { - newRanges, err := appendPoints2IndexRange(sc, oRange, rangePoints, ft) + newRanges, err := appendPoints2IndexRange(sctx, oRange, rangePoints, ft) if err != nil { return nil, errors.Trace(err) } @@ -174,19 +183,19 @@ func appendPoints2Ranges(sc *stmtctx.StatementContext, origin []*Range, rangePoi return newIndexRanges, nil } -func appendPoints2IndexRange(sc *stmtctx.StatementContext, origin *Range, rangePoints []*point, +func appendPoints2IndexRange(sctx sessionctx.Context, origin *Range, rangePoints []*point, ft *types.FieldType) ([]*Range, error) { newRanges := make([]*Range, 0, len(rangePoints)/2) for i := 0; i < len(rangePoints); i += 2 { - startPoint, err := convertPoint(sc, rangePoints[i], ft) + startPoint, err := convertPoint(sctx, rangePoints[i], ft) if err != nil { return nil, errors.Trace(err) } - endPoint, err := convertPoint(sc, rangePoints[i+1], ft) + endPoint, err := convertPoint(sctx, rangePoints[i+1], ft) if err != nil { return nil, errors.Trace(err) } - less, err := validInterval(sc, startPoint, endPoint) + less, err := validInterval(sctx, startPoint, endPoint) if err != nil { return nil, errors.Trace(err) } @@ -236,7 +245,7 @@ func appendRanges2PointRanges(pointRanges []*Range, ranges []*Range) []*Range { // points2TableRanges build ranges for table scan from range points. // It will remove the nil and convert MinNotNull and MaxValue to MinInt64 or MinUint64 and MaxInt64 or MaxUint64. -func points2TableRanges(sc *stmtctx.StatementContext, rangePoints []*point, tp *types.FieldType) ([]*Range, error) { +func points2TableRanges(sctx sessionctx.Context, rangePoints []*point, tp *types.FieldType) ([]*Range, error) { ranges := make([]*Range, 0, len(rangePoints)/2) var minValueDatum, maxValueDatum types.Datum // Currently, table's kv range cannot accept encoded value of MaxValueDatum. we need to convert it. @@ -248,7 +257,7 @@ func points2TableRanges(sc *stmtctx.StatementContext, rangePoints []*point, tp * maxValueDatum.SetInt64(math.MaxInt64) } for i := 0; i < len(rangePoints); i += 2 { - startPoint, err := convertPoint(sc, rangePoints[i], tp) + startPoint, err := convertPoint(sctx, rangePoints[i], tp) if err != nil { return nil, errors.Trace(err) } @@ -258,7 +267,7 @@ func points2TableRanges(sc *stmtctx.StatementContext, rangePoints []*point, tp * } else if startPoint.value.Kind() == types.KindMinNotNull { startPoint.value = minValueDatum } - endPoint, err := convertPoint(sc, rangePoints[i+1], tp) + endPoint, err := convertPoint(sctx, rangePoints[i+1], tp) if err != nil { return nil, errors.Trace(err) } @@ -267,7 +276,7 @@ func points2TableRanges(sc *stmtctx.StatementContext, rangePoints []*point, tp * } else if endPoint.value.Kind() == types.KindNull { continue } - less, err := validInterval(sc, startPoint, endPoint) + less, err := validInterval(sctx, startPoint, endPoint) if err != nil { return nil, errors.Trace(err) } @@ -286,20 +295,20 @@ func points2TableRanges(sc *stmtctx.StatementContext, rangePoints []*point, tp * } // buildColumnRange builds range from CNF conditions. -func buildColumnRange(accessConditions []expression.Expression, sc *stmtctx.StatementContext, tp *types.FieldType, tableRange bool, colLen int) (ranges []*Range, err error) { - rb := builder{sc: sc} +func buildColumnRange(accessConditions []expression.Expression, sctx sessionctx.Context, tp *types.FieldType, tableRange bool, colLen int) (ranges []*Range, err error) { + rb := builder{sc: sctx.GetSessionVars().StmtCtx} rangePoints := getFullRange() for _, cond := range accessConditions { - rangePoints = rb.intersection(rangePoints, rb.build(cond)) + rangePoints = rb.intersection(rangePoints, rb.build(cond), collate.GetCollator(tp.Collate)) if rb.err != nil { return nil, errors.Trace(rb.err) } } newTp := newFieldType(tp) if tableRange { - ranges, err = points2TableRanges(sc, rangePoints, newTp) + ranges, err = points2TableRanges(sctx, rangePoints, newTp) } else { - ranges, err = points2Ranges(sc, rangePoints, newTp) + ranges, err = points2Ranges(sctx, rangePoints, newTp) } if err != nil { return nil, errors.Trace(err) @@ -316,7 +325,7 @@ func buildColumnRange(accessConditions []expression.Expression, sc *stmtctx.Stat ran.HighExclude = false } } - ranges, err = UnionRanges(sc, ranges, true) + ranges, err = UnionRanges(sctx, ranges, true) if err != nil { return nil, err } @@ -325,23 +334,22 @@ func buildColumnRange(accessConditions []expression.Expression, sc *stmtctx.Stat } // BuildTableRange builds range of PK column for PhysicalTableScan. -func BuildTableRange(accessConditions []expression.Expression, sc *stmtctx.StatementContext, tp *types.FieldType) ([]*Range, error) { - return buildColumnRange(accessConditions, sc, tp, true, types.UnspecifiedLength) +func BuildTableRange(accessConditions []expression.Expression, sctx sessionctx.Context, tp *types.FieldType) ([]*Range, error) { + return buildColumnRange(accessConditions, sctx, tp, true, types.UnspecifiedLength) } // BuildColumnRange builds range from access conditions for general columns. -func BuildColumnRange(conds []expression.Expression, sc *stmtctx.StatementContext, tp *types.FieldType, colLen int) ([]*Range, error) { +func BuildColumnRange(conds []expression.Expression, sctx sessionctx.Context, tp *types.FieldType, colLen int) ([]*Range, error) { if len(conds) == 0 { return []*Range{{LowVal: []types.Datum{{}}, HighVal: []types.Datum{types.MaxValueDatum()}}}, nil } - return buildColumnRange(conds, sc, tp, false, colLen) + return buildColumnRange(conds, sctx, tp, false, colLen) } // buildCNFIndexRange builds the range for index where the top layer is CNF. func (d *rangeDetacher) buildCNFIndexRange(newTp []*types.FieldType, eqAndInCount int, accessCondition []expression.Expression) ([]*Range, error) { - sc := d.sctx.GetSessionVars().StmtCtx - rb := builder{sc: sc} + rb := builder{sc: d.sctx.GetSessionVars().StmtCtx} var ( ranges []*Range err error @@ -356,9 +364,9 @@ func (d *rangeDetacher) buildCNFIndexRange(newTp []*types.FieldType, return nil, errors.Trace(rb.err) } if i == 0 { - ranges, err = points2Ranges(sc, point, newTp[i]) + ranges, err = points2Ranges(d.sctx, point, newTp[i]) } else { - ranges, err = appendPoints2Ranges(sc, ranges, point, newTp[i]) + ranges, err = appendPoints2Ranges(d.sctx, ranges, point, newTp[i]) } if err != nil { return nil, errors.Trace(err) @@ -367,15 +375,15 @@ func (d *rangeDetacher) buildCNFIndexRange(newTp []*types.FieldType, rangePoints := getFullRange() // Build rangePoints for non-equal access conditions. for i := eqAndInCount; i < len(accessCondition); i++ { - rangePoints = rb.intersection(rangePoints, rb.build(accessCondition[i])) + rangePoints = rb.intersection(rangePoints, rb.build(accessCondition[i]), collate.GetCollator(newTp[eqAndInCount].Collate)) if rb.err != nil { return nil, errors.Trace(rb.err) } } if eqAndInCount == 0 { - ranges, err = points2Ranges(sc, rangePoints, newTp[0]) + ranges, err = points2Ranges(d.sctx, rangePoints, newTp[0]) } else if eqAndInCount < len(accessCondition) { - ranges, err = appendPoints2Ranges(sc, ranges, rangePoints, newTp[eqAndInCount]) + ranges, err = appendPoints2Ranges(d.sctx, ranges, rangePoints, newTp[eqAndInCount]) } if err != nil { return nil, errors.Trace(err) @@ -384,7 +392,7 @@ func (d *rangeDetacher) buildCNFIndexRange(newTp []*types.FieldType, // Take prefix index into consideration. if hasPrefix(d.lengths) { if fixPrefixColRange(ranges, d.lengths, newTp) { - ranges, err = UnionRanges(sc, ranges, d.mergeConsecutive) + ranges, err = UnionRanges(d.sctx, ranges, d.mergeConsecutive) if err != nil { return nil, errors.Trace(err) } @@ -404,7 +412,8 @@ type sortRange struct { // For two intervals [a, b], [c, d], we have guaranteed that a <= c. If b >= c. Then two intervals are overlapped. // And this two can be merged as [a, max(b, d)]. // Otherwise they aren't overlapped. -func UnionRanges(sc *stmtctx.StatementContext, ranges []*Range, mergeConsecutive bool) ([]*Range, error) { +func UnionRanges(sctx sessionctx.Context, ranges []*Range, mergeConsecutive bool) ([]*Range, error) { + sc := sctx.GetSessionVars().StmtCtx if len(ranges) == 0 { return nil, nil } @@ -595,3 +604,154 @@ func DetachCondAndBuildRangeForPartition(sctx sessionctx.Context, conditions []e } return d.detachCondAndBuildRangeForCols() } + +// RangesToString print a list of Ranges into a string which can appear in an SQL as a condition. +func RangesToString(sc *stmtctx.StatementContext, rans []*Range, colNames []string) (string, error) { + for _, ran := range rans { + if len(ran.LowVal) != len(ran.HighVal) { + return "", errors.New("range length mismatch") + } + } + var buffer bytes.Buffer + for i, ran := range rans { + buffer.WriteString("(") + for j := range ran.LowVal { + buffer.WriteString("(") + + // The `Exclude` information is only useful for the last columns. + // If it's not the last column, it should always be false, which means it's inclusive. + lowExclude := false + if ran.LowExclude && j == len(ran.LowVal)-1 { + lowExclude = true + } + highExclude := false + if ran.HighExclude && j == len(ran.LowVal)-1 { + highExclude = true + } + + // sanity check: only last column of the `Range` can be an interval + if j < len(ran.LowVal)-1 { + cmp, err := ran.LowVal[j].CompareDatum(sc, &ran.HighVal[j]) + if err != nil { + return "", errors.New("comparing values error: " + err.Error()) + } + if cmp != 0 { + return "", errors.New("unexpected form of range") + } + } + + str, err := RangeSingleColToString(sc, ran.LowVal[j], ran.HighVal[j], lowExclude, highExclude, colNames[j]) + if err != nil { + return "false", err + } + buffer.WriteString(str) + buffer.WriteString(")") + if j < len(ran.LowVal)-1 { + // Conditions on different columns of a range are implicitly connected with AND. + buffer.WriteString(" and ") + } + } + buffer.WriteString(")") + if i < len(rans)-1 { + // Conditions of different ranges are implicitly connected with OR. + buffer.WriteString(" or ") + } + } + result := buffer.String() + + // Simplify some useless conditions. + if matched, err := regexp.MatchString(`^\(*true\)*$`, result); matched || (err != nil) { + return "true", nil + } + return result, nil +} + +// RangeSingleColToString prints a single column of a Range into a string which can appear in an SQL as a condition. +func RangeSingleColToString(sc *stmtctx.StatementContext, lowVal, highVal types.Datum, lowExclude, highExclude bool, colName string) (string, error) { + // case 1: low and high are both special values(null, min not null, max value) + lowKind := lowVal.Kind() + highKind := highVal.Kind() + if (lowKind == types.KindNull || lowKind == types.KindMinNotNull || lowKind == types.KindMaxValue) && + (highKind == types.KindNull || highKind == types.KindMinNotNull || highKind == types.KindMaxValue) { + if lowKind == types.KindNull && highKind == types.KindNull && !lowExclude && !highExclude { + return colName + " is null", nil + } + if lowKind == types.KindNull && highKind == types.KindMaxValue && !lowExclude { + return "true", nil + } + if lowKind == types.KindMinNotNull && highKind == types.KindMaxValue { + return colName + " is not null", nil + } + return "false", nil + } + + var buf bytes.Buffer + restoreCtx := format.NewRestoreCtx(format.DefaultRestoreFlags, &buf) + + // case 2: low value and high value are the same, and low value and high value are both inclusive. + cmp, err := lowVal.CompareDatum(sc, &highVal) + if err != nil { + return "false", errors.Trace(err) + } + if cmp == 0 && !lowExclude && !highExclude && !lowVal.IsNull() { + buf.WriteString(colName) + buf.WriteString(" = ") + lowValExpr := driver.ValueExpr{Datum: lowVal} + err := lowValExpr.Restore(restoreCtx) + if err != nil { + return "false", errors.Trace(err) + } + return buf.String(), nil + } + + // case 3: it's an interval. + useOR := false + noLowerPart := false + + // Handle the low value part. + if lowKind == types.KindNull { + buf.WriteString(colName + " is null") + useOR = true + } else if lowKind == types.KindMinNotNull { + noLowerPart = true + } else { + buf.WriteString(colName) + if lowExclude { + buf.WriteString(" > ") + } else { + buf.WriteString(" >= ") + } + lowValExpr := driver.ValueExpr{Datum: lowVal} + err := lowValExpr.Restore(restoreCtx) + if err != nil { + return "false", errors.Trace(err) + } + } + + if !noLowerPart { + if useOR { + buf.WriteString(" or ") + } else { + buf.WriteString(" and ") + } + } + + // Handle the high value part + if highKind == types.KindMaxValue { + buf.WriteString("true") + } else { + buf.WriteString(colName) + if highExclude { + buf.WriteString(" < ") + } else { + buf.WriteString(" <= ") + } + highValExpr := driver.ValueExpr{Datum: highVal} + err := highValExpr.Restore(restoreCtx) + if err != nil { + return "false", errors.Trace(err) + } + } + + return buf.String(), nil +} diff --git a/util/ranger/ranger_serial_test.go b/util/ranger/ranger_serial_test.go new file mode 100644 index 0000000000000..49cfc3638d060 --- /dev/null +++ b/util/ranger/ranger_serial_test.go @@ -0,0 +1,374 @@ +// Copyright 2021 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, +// 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. + +package ranger_test + +import ( + "context" + "fmt" + "testing" + + "github.com/pingcap/tidb/expression" + plannercore "github.com/pingcap/tidb/planner/core" + "github.com/pingcap/tidb/session" + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/testkit" + "github.com/pingcap/tidb/util/collate" + "github.com/pingcap/tidb/util/ranger" + "github.com/stretchr/testify/require" +) + +func TestIndexRange(t *testing.T) { + dom, store, err := newDomainStoreWithBootstrap(t) + defer func() { + dom.Close() + require.NoError(t, store.Close()) + }() + require.NoError(t, err) + testKit := testkit.NewTestKit(t, store) + testKit.MustExec("use test") + testKit.MustExec("drop table if exists t") + testKit.MustExec(` +create table t( + a varchar(50), + b int, + c double, + d varchar(10), + e binary(10), + f varchar(10) collate utf8mb4_general_ci, + g enum('A','B','C') collate utf8mb4_general_ci, + index idx_ab(a(50), b), + index idx_cb(c, a), + index idx_d(d(2)), + index idx_e(e(2)), + index idx_f(f), + index idx_de(d(2), e), + index idx_g(g) +)`) + + tests := []struct { + indexPos int + exprStr string + accessConds string + filterConds string + resultStr string + }{ + { + indexPos: 0, + exprStr: `a LIKE 'abc%'`, + accessConds: `[like(test.t.a, abc%, 92)]`, + filterConds: "[]", + resultStr: "[[\"abc\",\"abd\")]", + }, + { + indexPos: 0, + exprStr: "a LIKE 'abc_'", + accessConds: "[like(test.t.a, abc_, 92)]", + filterConds: "[like(test.t.a, abc_, 92)]", + resultStr: "[(\"abc\",\"abd\")]", + }, + { + indexPos: 0, + exprStr: "a LIKE 'abc'", + accessConds: "[like(test.t.a, abc, 92)]", + filterConds: "[]", + resultStr: "[[\"abc\",\"abc\"]]", + }, + { + indexPos: 0, + exprStr: `a LIKE "ab\_c"`, + accessConds: "[like(test.t.a, ab\\_c, 92)]", + filterConds: "[]", + resultStr: "[[\"ab_c\",\"ab_c\"]]", + }, + { + indexPos: 0, + exprStr: `a LIKE '%'`, + accessConds: "[]", + filterConds: `[like(test.t.a, %, 92)]`, + resultStr: "[[NULL,+inf]]", + }, + { + indexPos: 0, + exprStr: `a LIKE '\%a'`, + accessConds: "[like(test.t.a, \\%a, 92)]", + filterConds: "[]", + resultStr: `[["%a","%a"]]`, + }, + { + indexPos: 0, + exprStr: `a LIKE "\\"`, + accessConds: "[like(test.t.a, \\, 92)]", + filterConds: "[]", + resultStr: "[[\"\\\",\"\\\"]]", + }, + { + indexPos: 0, + exprStr: `a LIKE "\\\\a%"`, + accessConds: `[like(test.t.a, \\a%, 92)]`, + filterConds: "[]", + resultStr: "[[\"\\a\",\"\\b\")]", + }, + { + indexPos: 0, + exprStr: `a > NULL`, + accessConds: "[gt(test.t.a, <nil>)]", + filterConds: "[]", + resultStr: `[]`, + }, + { + indexPos: 0, + exprStr: `a = 'a' and b in (1, 2, 3)`, + accessConds: "[eq(test.t.a, a) in(test.t.b, 1, 2, 3)]", + filterConds: "[]", + resultStr: "[[\"a\" 1,\"a\" 1] [\"a\" 2,\"a\" 2] [\"a\" 3,\"a\" 3]]", + }, + { + indexPos: 0, + exprStr: `a = 'a' and b not in (1, 2, 3)`, + accessConds: "[eq(test.t.a, a) not(in(test.t.b, 1, 2, 3))]", + filterConds: "[]", + resultStr: "[(\"a\" NULL,\"a\" 1) (\"a\" 3,\"a\" +inf]]", + }, + { + indexPos: 0, + exprStr: `a in ('a') and b in ('1', 2.0, NULL)`, + accessConds: "[eq(test.t.a, a) in(test.t.b, 1, 2, <nil>)]", + filterConds: "[]", + resultStr: `[["a" 1,"a" 1] ["a" 2,"a" 2]]`, + }, + { + indexPos: 1, + exprStr: `c in ('1.1', 1, 1.1) and a in ('1', 'a', NULL)`, + accessConds: "[in(test.t.c, 1.1, 1, 1.1) in(test.t.a, 1, a, <nil>)]", + filterConds: "[]", + resultStr: "[[1 \"1\",1 \"1\"] [1 \"a\",1 \"a\"] [1.1 \"1\",1.1 \"1\"] [1.1 \"a\",1.1 \"a\"]]", + }, + { + indexPos: 1, + exprStr: "c in (1, 1, 1, 1, 1, 1, 2, 1, 2, 3, 2, 3, 4, 4, 1, 2)", + accessConds: "[in(test.t.c, 1, 1, 1, 1, 1, 1, 2, 1, 2, 3, 2, 3, 4, 4, 1, 2)]", + filterConds: "[]", + resultStr: "[[1,1] [2,2] [3,3] [4,4]]", + }, + { + indexPos: 1, + exprStr: "c not in (1, 2, 3)", + accessConds: "[not(in(test.t.c, 1, 2, 3))]", + filterConds: "[]", + resultStr: "[(NULL,1) (1,2) (2,3) (3,+inf]]", + }, + { + indexPos: 1, + exprStr: "c in (1, 2) and c in (1, 3)", + accessConds: "[eq(test.t.c, 1)]", + filterConds: "[]", + resultStr: "[[1,1]]", + }, + { + indexPos: 1, + exprStr: "c = 1 and c = 2", + accessConds: "[]", + filterConds: "[]", + resultStr: "[]", + }, + { + indexPos: 0, + exprStr: "a in (NULL)", + accessConds: "[eq(test.t.a, <nil>)]", + filterConds: "[]", + resultStr: "[]", + }, + { + indexPos: 0, + exprStr: "a not in (NULL, '1', '2', '3')", + accessConds: "[not(in(test.t.a, <nil>, 1, 2, 3))]", + filterConds: "[]", + resultStr: "[]", + }, + { + indexPos: 0, + exprStr: "not (a not in (NULL, '1', '2', '3') and a > '2')", + accessConds: "[or(in(test.t.a, <nil>, 1, 2, 3), le(test.t.a, 2))]", + filterConds: "[]", + resultStr: "[[-inf,\"2\"] [\"3\",\"3\"]]", + }, + { + indexPos: 0, + exprStr: "not (a not in (NULL) and a > '2')", + accessConds: "[or(eq(test.t.a, <nil>), le(test.t.a, 2))]", + filterConds: "[]", + resultStr: "[[-inf,\"2\"]]", + }, + { + indexPos: 0, + exprStr: "not (a not in (NULL) or a > '2')", + accessConds: "[and(eq(test.t.a, <nil>), le(test.t.a, 2))]", + filterConds: "[]", + resultStr: "[]", + }, + { + indexPos: 0, + exprStr: "(a > 'b' and a < 'bbb') or (a < 'cb' and a > 'a')", + accessConds: "[or(and(gt(test.t.a, b), lt(test.t.a, bbb)), and(lt(test.t.a, cb), gt(test.t.a, a)))]", + filterConds: "[]", + resultStr: "[(\"a\",\"cb\")]", + }, + { + indexPos: 0, + exprStr: "(a > 'a' and a < 'b') or (a >= 'b' and a < 'c')", + accessConds: "[or(and(gt(test.t.a, a), lt(test.t.a, b)), and(ge(test.t.a, b), lt(test.t.a, c)))]", + filterConds: "[]", + resultStr: "[(\"a\",\"c\")]", + }, + { + indexPos: 0, + exprStr: "(a > 'a' and a < 'b' and b < 1) or (a >= 'b' and a < 'c')", + accessConds: "[or(and(gt(test.t.a, a), lt(test.t.a, b)), and(ge(test.t.a, b), lt(test.t.a, c)))]", + filterConds: "[or(and(and(gt(test.t.a, a), lt(test.t.a, b)), lt(test.t.b, 1)), and(ge(test.t.a, b), lt(test.t.a, c)))]", + resultStr: "[(\"a\",\"c\")]", + }, + { + indexPos: 0, + exprStr: "(a in ('a', 'b') and b < 1) or (a >= 'b' and a < 'c')", + accessConds: "[or(and(in(test.t.a, a, b), lt(test.t.b, 1)), and(ge(test.t.a, b), lt(test.t.a, c)))]", + filterConds: "[]", + resultStr: `[["a" -inf,"a" 1) ["b","c")]`, + }, + { + indexPos: 0, + exprStr: "(a > 'a') or (c > 1)", + accessConds: "[]", + filterConds: "[or(gt(test.t.a, a), gt(test.t.c, 1))]", + resultStr: "[[NULL,+inf]]", + }, + { + indexPos: 2, + exprStr: `d = "你好啊"`, + accessConds: "[eq(test.t.d, 你好啊)]", + filterConds: "[eq(test.t.d, 你好啊)]", + resultStr: "[[\"你好\",\"你好\"]]", + }, + { + indexPos: 3, + exprStr: `e = "你好啊"`, + accessConds: "[eq(test.t.e, 你好啊)]", + filterConds: "[eq(test.t.e, 你好啊)]", + resultStr: "[[0xE4BD,0xE4BD]]", + }, + { + indexPos: 2, + exprStr: `d in ("你好啊", "再见")`, + accessConds: "[in(test.t.d, 你好啊, 再见)]", + filterConds: "[in(test.t.d, 你好啊, 再见)]", + resultStr: "[[\"你好\",\"你好\"] [\"再见\",\"再见\"]]", + }, + { + indexPos: 2, + exprStr: `d not in ("你好啊")`, + accessConds: "[]", + filterConds: "[ne(test.t.d, 你好啊)]", + resultStr: "[[NULL,+inf]]", + }, + { + indexPos: 2, + exprStr: `d < "你好" || d > "你好"`, + accessConds: "[or(lt(test.t.d, 你好), gt(test.t.d, 你好))]", + filterConds: "[or(lt(test.t.d, 你好), gt(test.t.d, 你好))]", + resultStr: "[[-inf,+inf]]", + }, + { + indexPos: 2, + exprStr: `not(d < "你好" || d > "你好")`, + accessConds: "[and(ge(test.t.d, 你好), le(test.t.d, 你好))]", + filterConds: "[and(ge(test.t.d, 你好), le(test.t.d, 你好))]", + resultStr: "[[\"你好\",\"你好\"]]", + }, + { + indexPos: 4, + exprStr: "f >= 'a' and f <= 'B'", + accessConds: "[ge(test.t.f, a) le(test.t.f, B)]", + filterConds: "[]", + resultStr: "[[\"a\",\"B\"]]", + }, + { + indexPos: 4, + exprStr: "f in ('a', 'B')", + accessConds: "[in(test.t.f, a, B)]", + filterConds: "[]", + resultStr: "[[\"a\",\"a\"] [\"B\",\"B\"]]", + }, + { + indexPos: 4, + exprStr: "f = 'a' and f = 'B' collate utf8mb4_bin", + accessConds: "[eq(test.t.f, a)]", + filterConds: "[eq(test.t.f, B)]", + resultStr: "[[\"a\",\"a\"]]", + }, + { + indexPos: 4, + exprStr: "f like '@%' collate utf8mb4_bin", + accessConds: "[]", + filterConds: "[like(test.t.f, @%, 92)]", + resultStr: "[[NULL,+inf]]", + }, + { + indexPos: 5, + exprStr: "d in ('aab', 'aac') and e = 'a'", + accessConds: "[in(test.t.d, aab, aac) eq(test.t.e, a)]", + filterConds: "[in(test.t.d, aab, aac)]", + resultStr: "[[\"aa\" 0x61,\"aa\" 0x61]]", + }, + { + indexPos: 6, + exprStr: "g = 'a'", + accessConds: "[eq(test.t.g, a)]", + filterConds: "[]", + resultStr: "[[\"A\",\"A\"]]", + }, + } + + collate.SetNewCollationEnabledForTest(true) + defer func() { collate.SetNewCollationEnabledForTest(false) }() + ctx := context.Background() + for _, tt := range tests { + t.Run(tt.exprStr, func(t *testing.T) { + sql := "select * from t where " + tt.exprStr + sctx := testKit.Session().(sessionctx.Context) + stmts, err := session.Parse(sctx, sql) + require.NoError(t, err) + require.Len(t, stmts, 1) + ret := &plannercore.PreprocessorReturn{} + err = plannercore.Preprocess(sctx, stmts[0], plannercore.WithPreprocessorReturn(ret)) + require.NoError(t, err) + p, _, err := plannercore.BuildLogicalPlanForTest(ctx, sctx, stmts[0], ret.InfoSchema) + require.NoError(t, err) + selection := p.(plannercore.LogicalPlan).Children()[0].(*plannercore.LogicalSelection) + tbl := selection.Children()[0].(*plannercore.DataSource).TableInfo() + require.NotNil(t, selection) + conds := make([]expression.Expression, len(selection.Conditions)) + for i, cond := range selection.Conditions { + conds[i] = expression.PushDownNot(sctx, cond) + } + cols, lengths := expression.IndexInfo2PrefixCols(tbl.Columns, selection.Schema().Columns, tbl.Indices[tt.indexPos]) + require.NotNil(t, cols) + res, err := ranger.DetachCondAndBuildRangeForIndex(sctx, conds, cols, lengths) + require.NoError(t, err) + require.Equal(t, tt.accessConds, fmt.Sprintf("%s", res.AccessConds)) + require.Equal(t, tt.filterConds, fmt.Sprintf("%s", res.RemainedConds)) + got := fmt.Sprintf("%v", res.Ranges) + require.Equal(t, tt.resultStr, got) + }) + } +} diff --git a/util/ranger/ranger_test.go b/util/ranger/ranger_test.go index cd2d42572e5f5..03de4f42c2eea 100644 --- a/util/ranger/ranger_test.go +++ b/util/ranger/ranger_test.go @@ -17,7 +17,6 @@ package ranger_test import ( "context" "fmt" - "testing" "github.com/pingcap/errors" @@ -27,13 +26,11 @@ import ( plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/testkit/testdata" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/ranger" "github.com/stretchr/testify/require" ) @@ -51,7 +48,6 @@ func newDomainStoreWithBootstrap(t *testing.T) (*domain.Domain, kv.Storage, erro } func TestTableRange(t *testing.T) { - t.Parallel() dom, store, err := newDomainStoreWithBootstrap(t) defer func() { dom.Close() @@ -300,7 +296,7 @@ func TestTableRange(t *testing.T) { conds, filter = ranger.DetachCondsForColumn(sctx, conds, col) require.Equal(t, tt.accessConds, fmt.Sprintf("%s", conds)) require.Equal(t, tt.filterConds, fmt.Sprintf("%s", filter)) - result, err := ranger.BuildTableRange(conds, new(stmtctx.StatementContext), col.RetType) + result, err := ranger.BuildTableRange(conds, sctx, col.RetType) require.NoError(t, err) got := fmt.Sprintf("%v", result) require.Equal(t, tt.resultStr, got) @@ -308,354 +304,8 @@ func TestTableRange(t *testing.T) { } } -func TestIndexRange(t *testing.T) { - t.Parallel() - dom, store, err := newDomainStoreWithBootstrap(t) - defer func() { - dom.Close() - require.NoError(t, store.Close()) - }() - require.NoError(t, err) - testKit := testkit.NewTestKit(t, store) - testKit.MustExec("use test") - testKit.MustExec("drop table if exists t") - testKit.MustExec(` -create table t( - a varchar(50), - b int, - c double, - d varchar(10), - e binary(10), - f varchar(10) collate utf8mb4_general_ci, - g enum('A','B','C') collate utf8mb4_general_ci, - index idx_ab(a(50), b), - index idx_cb(c, a), - index idx_d(d(2)), - index idx_e(e(2)), - index idx_f(f), - index idx_de(d(2), e), - index idx_g(g) -)`) - - tests := []struct { - indexPos int - exprStr string - accessConds string - filterConds string - resultStr string - }{ - { - indexPos: 0, - exprStr: `a LIKE 'abc%'`, - accessConds: `[like(test.t.a, abc%, 92)]`, - filterConds: "[]", - resultStr: "[[\"abc\",\"abd\")]", - }, - { - indexPos: 0, - exprStr: "a LIKE 'abc_'", - accessConds: "[like(test.t.a, abc_, 92)]", - filterConds: "[like(test.t.a, abc_, 92)]", - resultStr: "[(\"abc\",\"abd\")]", - }, - { - indexPos: 0, - exprStr: "a LIKE 'abc'", - accessConds: "[like(test.t.a, abc, 92)]", - filterConds: "[]", - resultStr: "[[\"abc\",\"abc\"]]", - }, - { - indexPos: 0, - exprStr: `a LIKE "ab\_c"`, - accessConds: "[like(test.t.a, ab\\_c, 92)]", - filterConds: "[]", - resultStr: "[[\"ab_c\",\"ab_c\"]]", - }, - { - indexPos: 0, - exprStr: `a LIKE '%'`, - accessConds: "[]", - filterConds: `[like(test.t.a, %, 92)]`, - resultStr: "[[NULL,+inf]]", - }, - { - indexPos: 0, - exprStr: `a LIKE '\%a'`, - accessConds: "[like(test.t.a, \\%a, 92)]", - filterConds: "[]", - resultStr: `[["%a","%a"]]`, - }, - { - indexPos: 0, - exprStr: `a LIKE "\\"`, - accessConds: "[like(test.t.a, \\, 92)]", - filterConds: "[]", - resultStr: "[[\"\\\",\"\\\"]]", - }, - { - indexPos: 0, - exprStr: `a LIKE "\\\\a%"`, - accessConds: `[like(test.t.a, \\a%, 92)]`, - filterConds: "[]", - resultStr: "[[\"\\a\",\"\\b\")]", - }, - { - indexPos: 0, - exprStr: `a > NULL`, - accessConds: "[gt(test.t.a, <nil>)]", - filterConds: "[]", - resultStr: `[]`, - }, - { - indexPos: 0, - exprStr: `a = 'a' and b in (1, 2, 3)`, - accessConds: "[eq(test.t.a, a) in(test.t.b, 1, 2, 3)]", - filterConds: "[]", - resultStr: "[[\"a\" 1,\"a\" 1] [\"a\" 2,\"a\" 2] [\"a\" 3,\"a\" 3]]", - }, - { - indexPos: 0, - exprStr: `a = 'a' and b not in (1, 2, 3)`, - accessConds: "[eq(test.t.a, a) not(in(test.t.b, 1, 2, 3))]", - filterConds: "[]", - resultStr: "[(\"a\" NULL,\"a\" 1) (\"a\" 3,\"a\" +inf]]", - }, - { - indexPos: 0, - exprStr: `a in ('a') and b in ('1', 2.0, NULL)`, - accessConds: "[eq(test.t.a, a) in(test.t.b, 1, 2, <nil>)]", - filterConds: "[]", - resultStr: `[["a" 1,"a" 1] ["a" 2,"a" 2]]`, - }, - { - indexPos: 1, - exprStr: `c in ('1.1', 1, 1.1) and a in ('1', 'a', NULL)`, - accessConds: "[in(test.t.c, 1.1, 1, 1.1) in(test.t.a, 1, a, <nil>)]", - filterConds: "[]", - resultStr: "[[1 \"1\",1 \"1\"] [1 \"a\",1 \"a\"] [1.1 \"1\",1.1 \"1\"] [1.1 \"a\",1.1 \"a\"]]", - }, - { - indexPos: 1, - exprStr: "c in (1, 1, 1, 1, 1, 1, 2, 1, 2, 3, 2, 3, 4, 4, 1, 2)", - accessConds: "[in(test.t.c, 1, 1, 1, 1, 1, 1, 2, 1, 2, 3, 2, 3, 4, 4, 1, 2)]", - filterConds: "[]", - resultStr: "[[1,1] [2,2] [3,3] [4,4]]", - }, - { - indexPos: 1, - exprStr: "c not in (1, 2, 3)", - accessConds: "[not(in(test.t.c, 1, 2, 3))]", - filterConds: "[]", - resultStr: "[(NULL,1) (1,2) (2,3) (3,+inf]]", - }, - { - indexPos: 1, - exprStr: "c in (1, 2) and c in (1, 3)", - accessConds: "[eq(test.t.c, 1)]", - filterConds: "[]", - resultStr: "[[1,1]]", - }, - { - indexPos: 1, - exprStr: "c = 1 and c = 2", - accessConds: "[]", - filterConds: "[]", - resultStr: "[]", - }, - { - indexPos: 0, - exprStr: "a in (NULL)", - accessConds: "[eq(test.t.a, <nil>)]", - filterConds: "[]", - resultStr: "[]", - }, - { - indexPos: 0, - exprStr: "a not in (NULL, '1', '2', '3')", - accessConds: "[not(in(test.t.a, <nil>, 1, 2, 3))]", - filterConds: "[]", - resultStr: "[]", - }, - { - indexPos: 0, - exprStr: "not (a not in (NULL, '1', '2', '3') and a > '2')", - accessConds: "[or(in(test.t.a, <nil>, 1, 2, 3), le(test.t.a, 2))]", - filterConds: "[]", - resultStr: "[[-inf,\"2\"] [\"3\",\"3\"]]", - }, - { - indexPos: 0, - exprStr: "not (a not in (NULL) and a > '2')", - accessConds: "[or(eq(test.t.a, <nil>), le(test.t.a, 2))]", - filterConds: "[]", - resultStr: "[[-inf,\"2\"]]", - }, - { - indexPos: 0, - exprStr: "not (a not in (NULL) or a > '2')", - accessConds: "[and(eq(test.t.a, <nil>), le(test.t.a, 2))]", - filterConds: "[]", - resultStr: "[]", - }, - { - indexPos: 0, - exprStr: "(a > 'b' and a < 'bbb') or (a < 'cb' and a > 'a')", - accessConds: "[or(and(gt(test.t.a, b), lt(test.t.a, bbb)), and(lt(test.t.a, cb), gt(test.t.a, a)))]", - filterConds: "[]", - resultStr: "[(\"a\",\"cb\")]", - }, - { - indexPos: 0, - exprStr: "(a > 'a' and a < 'b') or (a >= 'b' and a < 'c')", - accessConds: "[or(and(gt(test.t.a, a), lt(test.t.a, b)), and(ge(test.t.a, b), lt(test.t.a, c)))]", - filterConds: "[]", - resultStr: "[(\"a\",\"c\")]", - }, - { - indexPos: 0, - exprStr: "(a > 'a' and a < 'b' and b < 1) or (a >= 'b' and a < 'c')", - accessConds: "[or(and(gt(test.t.a, a), lt(test.t.a, b)), and(ge(test.t.a, b), lt(test.t.a, c)))]", - filterConds: "[or(and(and(gt(test.t.a, a), lt(test.t.a, b)), lt(test.t.b, 1)), and(ge(test.t.a, b), lt(test.t.a, c)))]", - resultStr: "[(\"a\",\"c\")]", - }, - { - indexPos: 0, - exprStr: "(a in ('a', 'b') and b < 1) or (a >= 'b' and a < 'c')", - accessConds: "[or(and(in(test.t.a, a, b), lt(test.t.b, 1)), and(ge(test.t.a, b), lt(test.t.a, c)))]", - filterConds: "[]", - resultStr: `[["a" -inf,"a" 1) ["b","c")]`, - }, - { - indexPos: 0, - exprStr: "(a > 'a') or (c > 1)", - accessConds: "[]", - filterConds: "[or(gt(test.t.a, a), gt(test.t.c, 1))]", - resultStr: "[[NULL,+inf]]", - }, - { - indexPos: 2, - exprStr: `d = "你好啊"`, - accessConds: "[eq(test.t.d, 你好啊)]", - filterConds: "[eq(test.t.d, 你好啊)]", - resultStr: "[[\"你好\",\"你好\"]]", - }, - { - indexPos: 3, - exprStr: `e = "你好啊"`, - accessConds: "[eq(test.t.e, 你好啊)]", - filterConds: "[eq(test.t.e, 你好啊)]", - resultStr: "[[0xE4BD,0xE4BD]]", - }, - { - indexPos: 2, - exprStr: `d in ("你好啊", "再见")`, - accessConds: "[in(test.t.d, 你好啊, 再见)]", - filterConds: "[in(test.t.d, 你好啊, 再见)]", - resultStr: "[[\"你好\",\"你好\"] [\"再见\",\"再见\"]]", - }, - { - indexPos: 2, - exprStr: `d not in ("你好啊")`, - accessConds: "[]", - filterConds: "[ne(test.t.d, 你好啊)]", - resultStr: "[[NULL,+inf]]", - }, - { - indexPos: 2, - exprStr: `d < "你好" || d > "你好"`, - accessConds: "[or(lt(test.t.d, 你好), gt(test.t.d, 你好))]", - filterConds: "[or(lt(test.t.d, 你好), gt(test.t.d, 你好))]", - resultStr: "[[-inf,+inf]]", - }, - { - indexPos: 2, - exprStr: `not(d < "你好" || d > "你好")`, - accessConds: "[and(ge(test.t.d, 你好), le(test.t.d, 你好))]", - filterConds: "[and(ge(test.t.d, 你好), le(test.t.d, 你好))]", - resultStr: "[[\"你好\",\"你好\"]]", - }, - { - indexPos: 4, - exprStr: "f >= 'a' and f <= 'B'", - accessConds: "[ge(test.t.f, a) le(test.t.f, B)]", - filterConds: "[]", - resultStr: "[[\"a\",\"B\"]]", - }, - { - indexPos: 4, - exprStr: "f in ('a', 'B')", - accessConds: "[in(test.t.f, a, B)]", - filterConds: "[]", - resultStr: "[[\"a\",\"a\"] [\"B\",\"B\"]]", - }, - { - indexPos: 4, - exprStr: "f = 'a' and f = 'B' collate utf8mb4_bin", - accessConds: "[eq(test.t.f, a)]", - filterConds: "[eq(test.t.f, B)]", - resultStr: "[[\"a\",\"a\"]]", - }, - { - indexPos: 4, - exprStr: "f like '@%' collate utf8mb4_bin", - accessConds: "[]", - filterConds: "[like(test.t.f, @%, 92)]", - resultStr: "[[NULL,+inf]]", - }, - { - indexPos: 5, - exprStr: "d in ('aab', 'aac') and e = 'a'", - accessConds: "[in(test.t.d, aab, aac) eq(test.t.e, a)]", - filterConds: "[in(test.t.d, aab, aac)]", - resultStr: "[[\"aa\" 0x61,\"aa\" 0x61]]", - }, - { - indexPos: 6, - exprStr: "g = 'a'", - accessConds: "[eq(test.t.g, a)]", - filterConds: "[]", - resultStr: "[[\"A\",\"A\"]]", - }, - } - - collate.SetNewCollationEnabledForTest(true) - defer func() { collate.SetNewCollationEnabledForTest(false) }() - ctx := context.Background() - for _, tt := range tests { - t.Run(tt.exprStr, func(t *testing.T) { - sql := "select * from t where " + tt.exprStr - sctx := testKit.Session().(sessionctx.Context) - stmts, err := session.Parse(sctx, sql) - require.NoError(t, err) - require.Len(t, stmts, 1) - ret := &plannercore.PreprocessorReturn{} - err = plannercore.Preprocess(sctx, stmts[0], plannercore.WithPreprocessorReturn(ret)) - require.NoError(t, err) - p, _, err := plannercore.BuildLogicalPlanForTest(ctx, sctx, stmts[0], ret.InfoSchema) - require.NoError(t, err) - selection := p.(plannercore.LogicalPlan).Children()[0].(*plannercore.LogicalSelection) - tbl := selection.Children()[0].(*plannercore.DataSource).TableInfo() - require.NotNil(t, selection) - conds := make([]expression.Expression, len(selection.Conditions)) - for i, cond := range selection.Conditions { - conds[i] = expression.PushDownNot(sctx, cond) - } - cols, lengths := expression.IndexInfo2PrefixCols(tbl.Columns, selection.Schema().Columns, tbl.Indices[tt.indexPos]) - require.NotNil(t, cols) - res, err := ranger.DetachCondAndBuildRangeForIndex(sctx, conds, cols, lengths) - require.NoError(t, err) - require.Equal(t, tt.accessConds, fmt.Sprintf("%s", res.AccessConds)) - require.Equal(t, tt.filterConds, fmt.Sprintf("%s", res.RemainedConds)) - got := fmt.Sprintf("%v", res.Ranges) - require.Equal(t, tt.resultStr, got) - }) - } -} - // for issue #6661 func TestIndexRangeForUnsignedAndOverflow(t *testing.T) { - t.Parallel() dom, store, err := newDomainStoreWithBootstrap(t) defer func() { dom.Close() @@ -1203,7 +853,7 @@ func TestColumnRange(t *testing.T) { require.NotNil(t, col) conds = ranger.ExtractAccessConditionsForColumn(conds, col) require.Equal(t, tt.accessConds, fmt.Sprintf("%s", conds)) - result, err := ranger.BuildColumnRange(conds, new(stmtctx.StatementContext), col.RetType, tt.length) + result, err := ranger.BuildColumnRange(conds, sctx, col.RetType, tt.length) require.NoError(t, err) got := fmt.Sprintf("%v", result) require.Equal(t, tt.resultStr, got) @@ -1212,7 +862,6 @@ func TestColumnRange(t *testing.T) { } func TestIndexRangeEliminatedProjection(t *testing.T) { - t.Parallel() dom, store, err := newDomainStoreWithBootstrap(t) defer func() { dom.Close() @@ -1269,7 +918,6 @@ func TestCompIndexInExprCorrCol(t *testing.T) { } func TestIndexStringIsTrueRange(t *testing.T) { - t.Parallel() dom, store, err := newDomainStoreWithBootstrap(t) defer func() { dom.Close() @@ -1300,7 +948,6 @@ func TestIndexStringIsTrueRange(t *testing.T) { } func TestCompIndexDNFMatch(t *testing.T) { - t.Parallel() dom, store, err := newDomainStoreWithBootstrap(t) defer func() { dom.Close() @@ -1309,6 +956,7 @@ func TestCompIndexDNFMatch(t *testing.T) { require.NoError(t, err) testKit := testkit.NewTestKit(t, store) testKit.MustExec("use test") + testKit.MustExec(`set @@session.tidb_regard_null_as_point=false`) testKit.MustExec("drop table if exists t") testKit.MustExec("create table t(a int, b int, c int, key(a,b,c));") testKit.MustExec("insert into t values(1,2,2)") @@ -1332,7 +980,6 @@ func TestCompIndexDNFMatch(t *testing.T) { } func TestCompIndexMultiColDNF1(t *testing.T) { - t.Parallel() dom, store, err := newDomainStoreWithBootstrap(t) defer func() { dom.Close() @@ -1366,7 +1013,6 @@ func TestCompIndexMultiColDNF1(t *testing.T) { } func TestCompIndexMultiColDNF2(t *testing.T) { - t.Parallel() dom, store, err := newDomainStoreWithBootstrap(t) defer func() { dom.Close() @@ -1400,7 +1046,6 @@ func TestCompIndexMultiColDNF2(t *testing.T) { } func TestPrefixIndexMultiColDNF(t *testing.T) { - t.Parallel() dom, store, err := newDomainStoreWithBootstrap(t) defer func() { dom.Close() @@ -1436,7 +1081,6 @@ func TestPrefixIndexMultiColDNF(t *testing.T) { } func TestIndexRangeForBit(t *testing.T) { - t.Parallel() dom, store, err := newDomainStoreWithBootstrap(t) defer func() { dom.Close() @@ -1475,7 +1119,6 @@ func TestIndexRangeForBit(t *testing.T) { } func TestIndexRangeForYear(t *testing.T) { - t.Parallel() dom, store, err := newDomainStoreWithBootstrap(t) defer func() { dom.Close() @@ -1638,7 +1281,6 @@ func TestIndexRangeForYear(t *testing.T) { // For https://github.com/pingcap/tidb/issues/22032 func TestPrefixIndexRangeScan(t *testing.T) { - t.Parallel() dom, store, err := newDomainStoreWithBootstrap(t) defer func() { dom.Close() @@ -1710,7 +1352,6 @@ func TestPrefixIndexRangeScan(t *testing.T) { } func TestIndexRangeForDecimal(t *testing.T) { - t.Parallel() dom, store, err := newDomainStoreWithBootstrap(t) defer func() { dom.Close() @@ -1744,7 +1385,6 @@ func TestIndexRangeForDecimal(t *testing.T) { } func TestPrefixIndexAppendPointRanges(t *testing.T) { - t.Parallel() dom, store, err := newDomainStoreWithBootstrap(t) defer func() { dom.Close() diff --git a/util/ranger/types.go b/util/ranger/types.go index 646a7f204f4ca..f2bf561f6a3cf 100644 --- a/util/ranger/types.go +++ b/util/ranger/types.go @@ -21,11 +21,34 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/codec" ) +// MutableRanges represents a range may change after it is created. +// It's mainly designed for plan-cache, since some ranges in a cached plan have to be rebuild when reusing. +type MutableRanges interface { + // Range returns the underlying range values. + Range() []*Range + // Rebuild rebuilds the underlying ranges again. + Rebuild() error +} + +// Ranges implements the MutableRanges interface for range array. +type Ranges []*Range + +// Range returns the range array. +func (rs Ranges) Range() []*Range { + return rs +} + +// Rebuild rebuilds this range. +func (rs Ranges) Rebuild() error { + return nil +} + // Range represents a range generated in physical plan building phase. type Range struct { LowVal []types.Datum @@ -35,6 +58,11 @@ type Range struct { HighExclude bool // High value is exclusive. } +// Width returns the width of this range. +func (ran *Range) Width() int { + return len(ran.LowVal) +} + // Clone clones a Range. func (ran *Range) Clone() *Range { newRange := &Range{ @@ -53,33 +81,11 @@ func (ran *Range) Clone() *Range { } // IsPoint returns if the range is a point. -func (ran *Range) IsPoint(sc *stmtctx.StatementContext) bool { - if len(ran.LowVal) != len(ran.HighVal) { - return false - } - for i := range ran.LowVal { - a := ran.LowVal[i] - b := ran.HighVal[i] - if a.Kind() == types.KindMinNotNull || b.Kind() == types.KindMaxValue { - return false - } - cmp, err := a.CompareDatum(sc, &b) - if err != nil { - return false - } - if cmp != 0 { - return false - } - - if a.IsNull() { - return false - } - } - return !ran.LowExclude && !ran.HighExclude +func (ran *Range) IsPoint(sctx sessionctx.Context) bool { + return ran.isPoint(sctx.GetSessionVars().StmtCtx, sctx.GetSessionVars().RegardNULLAsPoint) } -// IsPointNullable returns if the range is a point. -func (ran *Range) IsPointNullable(sc *stmtctx.StatementContext) bool { +func (ran *Range) isPoint(stmtCtx *stmtctx.StatementContext, regardNullAsPoint bool) bool { if len(ran.LowVal) != len(ran.HighVal) { return false } @@ -89,7 +95,7 @@ func (ran *Range) IsPointNullable(sc *stmtctx.StatementContext) bool { if a.Kind() == types.KindMinNotNull || b.Kind() == types.KindMaxValue { return false } - cmp, err := a.CompareDatum(sc, &b) + cmp, err := a.CompareDatum(stmtCtx, &b) if err != nil { return false } @@ -97,8 +103,8 @@ func (ran *Range) IsPointNullable(sc *stmtctx.StatementContext) bool { return false } - if a.IsNull() { - if !b.IsNull() { + if a.IsNull() && b.IsNull() { // [NULL, NULL] + if !regardNullAsPoint { return false } } @@ -106,6 +112,17 @@ func (ran *Range) IsPointNullable(sc *stmtctx.StatementContext) bool { return !ran.LowExclude && !ran.HighExclude } +// IsPointNonNullable returns if the range is a point without NULL. +func (ran *Range) IsPointNonNullable(sctx sessionctx.Context) bool { + return ran.isPoint(sctx.GetSessionVars().StmtCtx, false) +} + +// IsPointNullable returns if the range is a point. +// TODO: unify the parameter type with IsPointNullable and IsPoint +func (ran *Range) IsPointNullable(sctx sessionctx.Context) bool { + return ran.isPoint(sctx.GetSessionVars().StmtCtx, true) +} + // IsFullRange check if the range is full scan range func (ran *Range) IsFullRange(unsignedIntHandle bool) bool { if unsignedIntHandle { diff --git a/util/ranger/types_test.go b/util/ranger/types_test.go index 19877cae9b5cd..d7e664dd323d8 100644 --- a/util/ranger/types_test.go +++ b/util/ranger/types_test.go @@ -18,14 +18,13 @@ import ( "math" "testing" - "github.com/pingcap/tidb/sessionctx/stmtctx" + "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/ranger" "github.com/stretchr/testify/require" ) func TestRange(t *testing.T) { - t.Parallel() simpleTests := []struct { ran ranger.Range str string @@ -124,14 +123,12 @@ func TestRange(t *testing.T) { isPoint: false, }, } - sc := new(stmtctx.StatementContext) for _, v := range isPointTests { - require.Equal(t, v.isPoint, v.ran.IsPoint(sc)) + require.Equal(t, v.isPoint, v.ran.IsPoint(core.MockContext())) } } func TestIsFullRange(t *testing.T) { - t.Parallel() nullDatum := types.MinNotNullDatum() nullDatum.SetNull() isFullRangeTests := []struct { diff --git a/util/resourcegrouptag/resource_group_tag.go b/util/resourcegrouptag/resource_group_tag.go index bf63a08cd6d07..1b70c6e207ea4 100644 --- a/util/resourcegrouptag/resource_group_tag.go +++ b/util/resourcegrouptag/resource_group_tag.go @@ -16,17 +16,21 @@ package resourcegrouptag import ( "github.com/pingcap/errors" + "github.com/pingcap/kvproto/pkg/coprocessor" + "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/tidb/parser" + "github.com/pingcap/tidb/tablecodec/rowindexcodec" "github.com/pingcap/tipb/go-tipb" + "github.com/tikv/client-go/v2/tikvrpc" ) // EncodeResourceGroupTag encodes sql digest and plan digest into resource group tag. -func EncodeResourceGroupTag(sqlDigest, planDigest *parser.Digest) []byte { +func EncodeResourceGroupTag(sqlDigest, planDigest *parser.Digest, label tipb.ResourceGroupTagLabel) []byte { if sqlDigest == nil && planDigest == nil { return nil } - tag := &tipb.ResourceGroupTag{} + tag := &tipb.ResourceGroupTag{Label: &label} if sqlDigest != nil { tag.SqlDigest = sqlDigest.Bytes() } @@ -52,3 +56,75 @@ func DecodeResourceGroupTag(data []byte) (sqlDigest []byte, err error) { } return tag.SqlDigest, nil } + +// GetResourceGroupLabelByKey determines the tipb.ResourceGroupTagLabel of key. +func GetResourceGroupLabelByKey(key []byte) tipb.ResourceGroupTagLabel { + switch rowindexcodec.GetKeyKind(key) { + case rowindexcodec.KeyKindRow: + return tipb.ResourceGroupTagLabel_ResourceGroupTagLabelRow + case rowindexcodec.KeyKindIndex: + return tipb.ResourceGroupTagLabel_ResourceGroupTagLabelIndex + default: + return tipb.ResourceGroupTagLabel_ResourceGroupTagLabelUnknown + } +} + +// GetFirstKeyFromRequest gets the first Key of the request from tikvrpc.Request. +func GetFirstKeyFromRequest(req *tikvrpc.Request) (firstKey []byte) { + if req == nil { + return + } + switch req.Req.(type) { + case *kvrpcpb.GetRequest: + r := req.Req.(*kvrpcpb.GetRequest) + if r != nil { + firstKey = r.Key + } + case *kvrpcpb.BatchGetRequest: + r := req.Req.(*kvrpcpb.BatchGetRequest) + if r != nil && len(r.Keys) > 0 { + firstKey = r.Keys[0] + } + case *kvrpcpb.ScanRequest: + r := req.Req.(*kvrpcpb.ScanRequest) + if r != nil { + firstKey = r.StartKey + } + case *kvrpcpb.PrewriteRequest: + r := req.Req.(*kvrpcpb.PrewriteRequest) + if r != nil && len(r.Mutations) > 0 { + if mutation := r.Mutations[0]; mutation != nil { + firstKey = mutation.Key + } + } + case *kvrpcpb.CommitRequest: + r := req.Req.(*kvrpcpb.CommitRequest) + if r != nil && len(r.Keys) > 0 { + firstKey = r.Keys[0] + } + case *kvrpcpb.BatchRollbackRequest: + r := req.Req.(*kvrpcpb.BatchRollbackRequest) + if r != nil && len(r.Keys) > 0 { + firstKey = r.Keys[0] + } + case *coprocessor.Request: + r := req.Req.(*coprocessor.Request) + if r != nil && len(r.Ranges) > 0 { + if keyRange := r.Ranges[0]; keyRange != nil { + firstKey = keyRange.Start + } + } + case *coprocessor.BatchRequest: + r := req.Req.(*coprocessor.BatchRequest) + if r != nil && len(r.Regions) > 0 { + if region := r.Regions[0]; region != nil { + if len(region.Ranges) > 0 { + if keyRange := region.Ranges[0]; keyRange != nil { + firstKey = keyRange.Start + } + } + } + } + } + return +} diff --git a/util/resourcegrouptag/resource_group_tag_test.go b/util/resourcegrouptag/resource_group_tag_test.go index 355134251a020..98d864829b189 100644 --- a/util/resourcegrouptag/resource_group_tag_test.go +++ b/util/resourcegrouptag/resource_group_tag_test.go @@ -19,48 +19,47 @@ import ( "math/rand" "testing" + "github.com/pingcap/kvproto/pkg/coprocessor" + "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/tidb/parser" "github.com/pingcap/tidb/util/hack" "github.com/pingcap/tipb/go-tipb" "github.com/stretchr/testify/require" + "github.com/tikv/client-go/v2/tikvrpc" ) func TestResourceGroupTagEncoding(t *testing.T) { - t.Parallel() - sqlDigest := parser.NewDigest(nil) - tag := EncodeResourceGroupTag(sqlDigest, nil) - require.Len(t, tag, 0) + tag := EncodeResourceGroupTag(sqlDigest, nil, tipb.ResourceGroupTagLabel_ResourceGroupTagLabelUnknown) + require.Len(t, tag, 2) decodedSQLDigest, err := DecodeResourceGroupTag(tag) require.NoError(t, err) require.Len(t, decodedSQLDigest, 0) sqlDigest = parser.NewDigest([]byte{'a', 'a'}) - tag = EncodeResourceGroupTag(sqlDigest, nil) - // version(1) + prefix(1) + length(1) + content(2hex -> 1byte) - require.Len(t, tag, 4) + tag = EncodeResourceGroupTag(sqlDigest, nil, tipb.ResourceGroupTagLabel_ResourceGroupTagLabelUnknown) + // version(1) + prefix(1) + length(1) + content(2hex -> 1byte) + label(2) + require.Len(t, tag, 6) decodedSQLDigest, err = DecodeResourceGroupTag(tag) require.NoError(t, err) require.Equal(t, sqlDigest.Bytes(), decodedSQLDigest) sqlDigest = parser.NewDigest(genRandHex(64)) - tag = EncodeResourceGroupTag(sqlDigest, nil) + tag = EncodeResourceGroupTag(sqlDigest, nil, tipb.ResourceGroupTagLabel_ResourceGroupTagLabelUnknown) decodedSQLDigest, err = DecodeResourceGroupTag(tag) require.NoError(t, err) require.Equal(t, sqlDigest.Bytes(), decodedSQLDigest) sqlDigest = parser.NewDigest(genRandHex(510)) - tag = EncodeResourceGroupTag(sqlDigest, nil) + tag = EncodeResourceGroupTag(sqlDigest, nil, tipb.ResourceGroupTagLabel_ResourceGroupTagLabelUnknown) decodedSQLDigest, err = DecodeResourceGroupTag(tag) require.NoError(t, err) require.Equal(t, sqlDigest.Bytes(), decodedSQLDigest) } func TestResourceGroupTagEncodingPB(t *testing.T) { - t.Parallel() - digest1 := genDigest("abc") digest2 := genDigest("abcdefg") // Test for protobuf @@ -93,6 +92,98 @@ func TestResourceGroupTagEncodingPB(t *testing.T) { require.Nil(t, tag.PlanDigest) } +func TestGetResourceGroupLabelByKey(t *testing.T) { + var label tipb.ResourceGroupTagLabel + // tablecodec.EncodeRowKey(0, []byte{}) + label = GetResourceGroupLabelByKey([]byte{116, 128, 0, 0, 0, 0, 0, 0, 0, 95, 114}) + require.Equal(t, tipb.ResourceGroupTagLabel_ResourceGroupTagLabelRow, label) + // tablecodec.EncodeIndexSeekKey(0, 0, []byte{})) + label = GetResourceGroupLabelByKey([]byte{116, 128, 0, 0, 0, 0, 0, 0, 0, 95, 105, 128, 0, 0, 0, 0, 0, 0, 0}) + require.Equal(t, tipb.ResourceGroupTagLabel_ResourceGroupTagLabelIndex, label) + label = GetResourceGroupLabelByKey([]byte("")) + require.Equal(t, tipb.ResourceGroupTagLabel_ResourceGroupTagLabelUnknown, label) +} + +func TestGetFirstKeyFromRequest(t *testing.T) { + var testK1 = []byte("TEST-1") + var testK2 = []byte("TEST-2") + var req *tikvrpc.Request + + require.Nil(t, GetFirstKeyFromRequest(nil)) + + req = &tikvrpc.Request{Req: (*kvrpcpb.GetRequest)(nil)} + require.Nil(t, GetFirstKeyFromRequest(req)) + req = &tikvrpc.Request{Req: &kvrpcpb.GetRequest{Key: nil}} + require.Nil(t, GetFirstKeyFromRequest(req)) + req = &tikvrpc.Request{Req: &kvrpcpb.GetRequest{Key: testK1}} + require.Equal(t, testK1, GetFirstKeyFromRequest(req)) + + req = &tikvrpc.Request{Req: (*kvrpcpb.BatchGetRequest)(nil)} + require.Nil(t, GetFirstKeyFromRequest(req)) + req = &tikvrpc.Request{Req: &kvrpcpb.BatchGetRequest{Keys: nil}} + require.Nil(t, GetFirstKeyFromRequest(req)) + req = &tikvrpc.Request{Req: &kvrpcpb.BatchGetRequest{Keys: [][]byte{}}} + require.Nil(t, GetFirstKeyFromRequest(req)) + req = &tikvrpc.Request{Req: &kvrpcpb.BatchGetRequest{Keys: [][]byte{testK2, testK1}}} + require.Equal(t, testK2, GetFirstKeyFromRequest(req)) + + req = &tikvrpc.Request{Req: (*kvrpcpb.ScanRequest)(nil)} + require.Nil(t, GetFirstKeyFromRequest(req)) + req = &tikvrpc.Request{Req: &kvrpcpb.ScanRequest{StartKey: nil}} + require.Nil(t, GetFirstKeyFromRequest(req)) + req = &tikvrpc.Request{Req: &kvrpcpb.ScanRequest{StartKey: testK1}} + require.Equal(t, testK1, GetFirstKeyFromRequest(req)) + + req = &tikvrpc.Request{Req: (*kvrpcpb.PrewriteRequest)(nil)} + require.Nil(t, GetFirstKeyFromRequest(req)) + req = &tikvrpc.Request{Req: &kvrpcpb.PrewriteRequest{Mutations: nil}} + require.Nil(t, GetFirstKeyFromRequest(req)) + req = &tikvrpc.Request{Req: &kvrpcpb.PrewriteRequest{Mutations: []*kvrpcpb.Mutation{}}} + require.Nil(t, GetFirstKeyFromRequest(req)) + req = &tikvrpc.Request{Req: &kvrpcpb.PrewriteRequest{Mutations: []*kvrpcpb.Mutation{{Key: testK2}, {Key: testK1}}}} + require.Equal(t, testK2, GetFirstKeyFromRequest(req)) + + req = &tikvrpc.Request{Req: (*kvrpcpb.CommitRequest)(nil)} + require.Nil(t, GetFirstKeyFromRequest(req)) + req = &tikvrpc.Request{Req: &kvrpcpb.CommitRequest{Keys: nil}} + require.Nil(t, GetFirstKeyFromRequest(req)) + req = &tikvrpc.Request{Req: &kvrpcpb.CommitRequest{Keys: [][]byte{}}} + require.Nil(t, GetFirstKeyFromRequest(req)) + req = &tikvrpc.Request{Req: &kvrpcpb.CommitRequest{Keys: [][]byte{testK1, testK1}}} + require.Equal(t, testK1, GetFirstKeyFromRequest(req)) + + req = &tikvrpc.Request{Req: (*kvrpcpb.BatchRollbackRequest)(nil)} + require.Nil(t, GetFirstKeyFromRequest(req)) + req = &tikvrpc.Request{Req: &kvrpcpb.BatchRollbackRequest{Keys: nil}} + require.Nil(t, GetFirstKeyFromRequest(req)) + req = &tikvrpc.Request{Req: &kvrpcpb.BatchRollbackRequest{Keys: [][]byte{}}} + require.Nil(t, GetFirstKeyFromRequest(req)) + req = &tikvrpc.Request{Req: &kvrpcpb.BatchRollbackRequest{Keys: [][]byte{testK2, testK1}}} + require.Equal(t, testK2, GetFirstKeyFromRequest(req)) + + req = &tikvrpc.Request{Req: (*coprocessor.Request)(nil)} + require.Nil(t, GetFirstKeyFromRequest(req)) + req = &tikvrpc.Request{Req: &coprocessor.Request{Ranges: nil}} + require.Nil(t, GetFirstKeyFromRequest(req)) + req = &tikvrpc.Request{Req: &coprocessor.Request{Ranges: []*coprocessor.KeyRange{}}} + require.Nil(t, GetFirstKeyFromRequest(req)) + req = &tikvrpc.Request{Req: &coprocessor.Request{Ranges: []*coprocessor.KeyRange{{Start: testK1}}}} + require.Equal(t, testK1, GetFirstKeyFromRequest(req)) + + req = &tikvrpc.Request{Req: (*coprocessor.BatchRequest)(nil)} + require.Nil(t, GetFirstKeyFromRequest(req)) + req = &tikvrpc.Request{Req: &coprocessor.BatchRequest{Regions: nil}} + require.Nil(t, GetFirstKeyFromRequest(req)) + req = &tikvrpc.Request{Req: &coprocessor.BatchRequest{Regions: []*coprocessor.RegionInfo{}}} + require.Nil(t, GetFirstKeyFromRequest(req)) + req = &tikvrpc.Request{Req: &coprocessor.BatchRequest{Regions: []*coprocessor.RegionInfo{{Ranges: nil}}}} + require.Nil(t, GetFirstKeyFromRequest(req)) + req = &tikvrpc.Request{Req: &coprocessor.BatchRequest{Regions: []*coprocessor.RegionInfo{{Ranges: []*coprocessor.KeyRange{}}}}} + require.Nil(t, GetFirstKeyFromRequest(req)) + req = &tikvrpc.Request{Req: &coprocessor.BatchRequest{Regions: []*coprocessor.RegionInfo{{Ranges: []*coprocessor.KeyRange{{Start: testK2}}}}}} + require.Equal(t, testK2, GetFirstKeyFromRequest(req)) +} + func genRandHex(length int) []byte { const chars = "0123456789abcdef" res := make([]byte, length) diff --git a/util/rowDecoder/decoder_test.go b/util/rowDecoder/decoder_test.go index 4aab176723536..8d1081f528559 100644 --- a/util/rowDecoder/decoder_test.go +++ b/util/rowDecoder/decoder_test.go @@ -28,6 +28,7 @@ import ( "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/testkit" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/mock" decoder "github.com/pingcap/tidb/util/rowDecoder" "github.com/pingcap/tidb/util/rowcodec" @@ -35,7 +36,6 @@ import ( ) func TestRowDecoder(t *testing.T) { - t.Parallel() c1 := &model.ColumnInfo{ID: 1, Name: model.NewCIStr("c1"), State: model.StatePublic, Offset: 0, FieldType: *types.NewFieldType(mysql.TypeLonglong)} c2 := &model.ColumnInfo{ID: 2, Name: model.NewCIStr("c2"), State: model.StatePublic, Offset: 1, FieldType: *types.NewFieldType(mysql.TypeVarchar)} c3 := &model.ColumnInfo{ID: 3, Name: model.NewCIStr("c3"), State: model.StatePublic, Offset: 2, FieldType: *types.NewFieldType(mysql.TypeNewDecimal)} @@ -129,7 +129,7 @@ func TestRowDecoder(t *testing.T) { for i, col := range cols[:len(cols)-1] { v, ok := r[col.ID] if ok { - equal, err1 := v.CompareDatum(sc, &row.output[i]) + equal, err1 := v.Compare(sc, &row.output[i], collate.GetBinaryCollator()) require.Nil(t, err1) require.Equal(t, 0, equal) } else { @@ -143,7 +143,7 @@ func TestRowDecoder(t *testing.T) { for k, v := range r2 { v1, ok := r[k] require.True(t, ok) - equal, err1 := v.CompareDatum(sc, &v1) + equal, err1 := v.Compare(sc, &v1, collate.GetBinaryCollator()) require.Nil(t, err1) require.Equal(t, 0, equal) } @@ -151,7 +151,6 @@ func TestRowDecoder(t *testing.T) { } func TestClusterIndexRowDecoder(t *testing.T) { - t.Parallel() c1 := &model.ColumnInfo{ID: 1, Name: model.NewCIStr("c1"), State: model.StatePublic, Offset: 0, FieldType: *types.NewFieldType(mysql.TypeLonglong)} c2 := &model.ColumnInfo{ID: 2, Name: model.NewCIStr("c2"), State: model.StatePublic, Offset: 1, FieldType: *types.NewFieldType(mysql.TypeVarchar)} c3 := &model.ColumnInfo{ID: 3, Name: model.NewCIStr("c3"), State: model.StatePublic, Offset: 2, FieldType: *types.NewFieldType(mysql.TypeNewDecimal)} @@ -204,7 +203,7 @@ func TestClusterIndexRowDecoder(t *testing.T) { for i, col := range cols { v, ok := r[col.ID] require.True(t, ok) - equal, err1 := v.CompareDatum(sc, &row.output[i]) + equal, err1 := v.Compare(sc, &row.output[i], collate.GetBinaryCollator()) require.Nil(t, err1) require.Equal(t, 0, equal) } diff --git a/util/rowcodec/rowcodec_test.go b/util/rowcodec/rowcodec_test.go index 58bc81b5b86f6..1ea59e0eea564 100644 --- a/util/rowcodec/rowcodec_test.go +++ b/util/rowcodec/rowcodec_test.go @@ -43,8 +43,6 @@ type testData struct { } func TestEncodeLargeSmallReuseBug(t *testing.T) { - t.Parallel() - // reuse one rowcodec.Encoder. var encoder rowcodec.Encoder colFt := types.NewFieldType(mysql.TypeString) @@ -83,8 +81,6 @@ func TestEncodeLargeSmallReuseBug(t *testing.T) { } func TestDecodeRowWithHandle(t *testing.T) { - t.Parallel() - handleID := int64(-1) handleValue := int64(10000) @@ -223,8 +219,6 @@ func TestDecodeRowWithHandle(t *testing.T) { } func TestEncodeKindNullDatum(t *testing.T) { - t.Parallel() - var encoder rowcodec.Encoder sc := new(stmtctx.StatementContext) sc.TimeZone = time.UTC @@ -251,8 +245,6 @@ func TestEncodeKindNullDatum(t *testing.T) { } func TestDecodeDecimalFspNotMatch(t *testing.T) { - t.Parallel() - var encoder rowcodec.Encoder sc := new(stmtctx.StatementContext) sc.TimeZone = time.UTC @@ -287,8 +279,6 @@ func TestDecodeDecimalFspNotMatch(t *testing.T) { } func TestTypesNewRowCodec(t *testing.T) { - t.Parallel() - getJSONDatum := func(value string) types.Datum { j, err := json.ParseBinaryFromString(value) require.NoError(t, err) @@ -563,8 +553,6 @@ func TestTypesNewRowCodec(t *testing.T) { } func TestNilAndDefault(t *testing.T) { - t.Parallel() - td := []testData{ { 1, @@ -696,8 +684,6 @@ func TestNilAndDefault(t *testing.T) { } func TestVarintCompatibility(t *testing.T) { - t.Parallel() - td := []testData{ { 1, @@ -755,8 +741,6 @@ func TestVarintCompatibility(t *testing.T) { } func TestCodecUtil(t *testing.T) { - t.Parallel() - colIDs := []int64{1, 2, 3, 4} tps := make([]*types.FieldType, 4) for i := 0; i < 3; i++ { @@ -807,8 +791,6 @@ func TestCodecUtil(t *testing.T) { } func TestOldRowCodec(t *testing.T) { - t.Parallel() - colIDs := []int64{1, 2, 3, 4} tps := make([]*types.FieldType, 4) for i := 0; i < 3; i++ { @@ -844,8 +826,6 @@ func TestOldRowCodec(t *testing.T) { } func Test65535Bug(t *testing.T) { - t.Parallel() - colIds := []int64{1} tps := make([]*types.FieldType, 1) tps[0] = types.NewFieldType(mysql.TypeString) diff --git a/util/selection/selection_test.go b/util/selection/selection_test.go index e8eb5ffed0336..310502f8886e9 100644 --- a/util/selection/selection_test.go +++ b/util/selection/selection_test.go @@ -50,14 +50,12 @@ func init() { } func TestSelection(t *testing.T) { - t.Parallel() data := testSlice{1, 2, 3, 4, 5} index := Select(data, 3) require.Equal(t, 3, data[index]) } func TestSelectionWithDuplicate(t *testing.T) { - t.Parallel() data := testSlice{1, 2, 3, 3, 5} index := Select(data, 3) require.Equal(t, 3, data[index]) @@ -66,7 +64,6 @@ func TestSelectionWithDuplicate(t *testing.T) { } func TestSelectionWithRandomCase(t *testing.T) { - t.Parallel() data := randomTestCase(1000000) index := Select(data, 500000) actual := data[index] @@ -76,7 +73,6 @@ func TestSelectionWithRandomCase(t *testing.T) { } func TestSelectionWithSerialCase(t *testing.T) { - t.Parallel() data := serialTestCase(1000000) sort.Sort(sort.Reverse(data)) index := Select(data, 500000) diff --git a/util/sem/sem_test.go b/util/sem/sem_test.go index da3022830e4e3..ff11c3fd47eb9 100644 --- a/util/sem/sem_test.go +++ b/util/sem/sem_test.go @@ -24,7 +24,6 @@ import ( ) func TestInvisibleSchema(t *testing.T) { - t.Parallel() assert := assert.New(t) assert.True(IsInvisibleSchema(metricsSchema)) @@ -35,7 +34,6 @@ func TestInvisibleSchema(t *testing.T) { } func TestIsInvisibleTable(t *testing.T) { - t.Parallel() assert := assert.New(t) mysqlTbls := []string{exprPushdownBlacklist, gcDeleteRange, gcDeleteRangeDone, optRuleBlacklist, tidb, globalVariables} @@ -61,7 +59,6 @@ func TestIsInvisibleTable(t *testing.T) { } func TestIsRestrictedPrivilege(t *testing.T) { - t.Parallel() assert := assert.New(t) assert.True(IsRestrictedPrivilege("RESTRICTED_TABLES_ADMIN")) @@ -72,7 +69,6 @@ func TestIsRestrictedPrivilege(t *testing.T) { } func TestIsInvisibleStatusVar(t *testing.T) { - t.Parallel() assert := assert.New(t) assert.True(IsInvisibleStatusVar(tidbGCLeaderDesc)) @@ -82,7 +78,6 @@ func TestIsInvisibleStatusVar(t *testing.T) { } func TestIsInvisibleSysVar(t *testing.T) { - t.Parallel() assert := assert.New(t) assert.False(IsInvisibleSysVar(variable.Hostname)) // changes the value to default, but is not invisible diff --git a/util/set/float64_set_test.go b/util/set/float64_set_test.go index 062f3ad918568..7fe1cd4389681 100644 --- a/util/set/float64_set_test.go +++ b/util/set/float64_set_test.go @@ -21,7 +21,6 @@ import ( ) func TestFloat64Set(t *testing.T) { - t.Parallel() assert := assert.New(t) set := NewFloat64Set() diff --git a/util/set/int_set_test.go b/util/set/int_set_test.go index d4cbcd8a6006e..cb7779a782f50 100644 --- a/util/set/int_set_test.go +++ b/util/set/int_set_test.go @@ -21,7 +21,6 @@ import ( ) func TestIntSet(t *testing.T) { - t.Parallel() assert := assert.New(t) set := NewIntSet() @@ -44,7 +43,6 @@ func TestIntSet(t *testing.T) { } func TestInt64Set(t *testing.T) { - t.Parallel() assert := assert.New(t) set := NewInt64Set() diff --git a/util/set/string_set_test.go b/util/set/string_set_test.go index 4f16f834020c8..5d076be353207 100644 --- a/util/set/string_set_test.go +++ b/util/set/string_set_test.go @@ -22,7 +22,6 @@ import ( ) func TestStringSet(t *testing.T) { - t.Parallel() assert := assert.New(t) set := NewStringSet() diff --git a/util/signal/signal_posix.go b/util/signal/signal_posix.go index c36f8605bb600..954bc2cf25db7 100644 --- a/util/signal/signal_posix.go +++ b/util/signal/signal_posix.go @@ -11,6 +11,7 @@ // 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. +//go:build linux || darwin || freebsd || unix // +build linux darwin freebsd unix package signal diff --git a/util/signal/signal_windows.go b/util/signal/signal_windows.go index a6bf2da1fe547..e4cb053d3b7ed 100644 --- a/util/signal/signal_windows.go +++ b/util/signal/signal_windows.go @@ -11,6 +11,7 @@ // 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. +//go:build windows // +build windows package signal diff --git a/util/slice/slice_test.go b/util/slice/slice_test.go index 318309f46d3d1..5a9b9ec17100f 100644 --- a/util/slice/slice_test.go +++ b/util/slice/slice_test.go @@ -36,7 +36,6 @@ func TestSlice(t *testing.T) { for _, test := range tests { t.Run(fmt.Sprint(test.a), func(t *testing.T) { - t.Parallel() even := func(i int) bool { return test.a[i]%2 == 0 } require.Equal(t, test.anyOf, AnyOf(test.a, even)) require.Equal(t, test.noneOf, NoneOf(test.a, even)) diff --git a/util/sqlexec/restricted_sql_executor.go b/util/sqlexec/restricted_sql_executor.go index b87002c6db4f7..4be2cae5ce12a 100644 --- a/util/sqlexec/restricted_sql_executor.go +++ b/util/sqlexec/restricted_sql_executor.go @@ -139,8 +139,8 @@ type RecordSet interface { // Next reads records into chunk. Next(ctx context.Context, req *chunk.Chunk) error - // NewChunk create a chunk. - NewChunk() *chunk.Chunk + // NewChunk create a chunk, if allocator is nil, the default one is used. + NewChunk(chunk.Allocator) *chunk.Chunk // Close closes the underlying iterator, call Next after Close will // restart the iteration. @@ -164,7 +164,7 @@ type MultiQueryNoDelayResult interface { // DrainRecordSet fetches the rows in the RecordSet. func DrainRecordSet(ctx context.Context, rs RecordSet, maxChunkSize int) ([]chunk.Row, error) { var rows []chunk.Row - req := rs.NewChunk() + req := rs.NewChunk(nil) for { err := rs.Next(ctx, req) if err != nil || req.NumRows() == 0 { diff --git a/util/sqlexec/utils_test.go b/util/sqlexec/utils_test.go index 16826e57149bc..0dc9abe826606 100644 --- a/util/sqlexec/utils_test.go +++ b/util/sqlexec/utils_test.go @@ -24,7 +24,6 @@ import ( ) func TestReserveBuffer(t *testing.T) { - t.Parallel() res0 := reserveBuffer(nil, 0) require.Len(t, res0, 0) @@ -100,7 +99,6 @@ func TestEscapeBackslash(t *testing.T) { // copy iterator variable into a new variable, see issue #27779 v := v t.Run(v.name, func(t *testing.T) { - t.Parallel() require.Equal(t, v.output, escapeBytesBackslash(nil, v.input)) require.Equal(t, v.output, escapeStringBackslash(nil, string(v.input))) }) @@ -143,7 +141,7 @@ func TestEscapeSQL(t *testing.T) { name: "%? missing arguments", input: "select %? from %?", params: []interface{}{4}, - err: "missing arguments.*", + err: "^missing arguments", }, { name: "nil", @@ -339,7 +337,7 @@ func TestEscapeSQL(t *testing.T) { name: "identifier, wrong arg", input: "use %n", params: []interface{}{3}, - err: "expect a string identifier.*", + err: "^expect a string identifier", }, { name: "identifier", @@ -392,7 +390,6 @@ func TestEscapeSQL(t *testing.T) { // copy iterator variable into a new variable, see issue #27779 v := v t.Run(v.name, func(t *testing.T) { - t.Parallel() r3 := new(strings.Builder) r1, e1 := escapeSQL(v.input, v.params...) r2, e2 := EscapeSQL(v.input, v.params...) @@ -418,7 +415,6 @@ func TestEscapeSQL(t *testing.T) { } func TestMustUtils(t *testing.T) { - t.Parallel() require.PanicsWithError(t, "missing arguments, need 1-th arg, but only got 0 args", func() { MustEscapeSQL("%?") }) diff --git a/util/stmtsummary/evicted_test.go b/util/stmtsummary/evicted_test.go index 6e71cee668bca..9f7deeebaef67 100644 --- a/util/stmtsummary/evicted_test.go +++ b/util/stmtsummary/evicted_test.go @@ -58,7 +58,6 @@ func generateStmtSummaryByDigestKeyValue(schema string, beginTime int64, endTime // Test stmtSummaryByDigestMap.ToEvictedCountDatum func TestMapToEvictedCountDatum(t *testing.T) { - t.Parallel() ssMap := newStmtSummaryByDigestMap() ssMap.Clear() now := time.Now().Unix() @@ -143,7 +142,6 @@ func TestMapToEvictedCountDatum(t *testing.T) { // Test stmtSummaryByDigestEvicted func TestSimpleStmtSummaryByDigestEvicted(t *testing.T) { - t.Parallel() ssbde := newStmtSummaryByDigestEvicted() evictedKey, evictedValue := generateStmtSummaryByDigestKeyValue("a", 1, 2) @@ -221,7 +219,6 @@ func TestSimpleStmtSummaryByDigestEvicted(t *testing.T) { // Test stmtSummaryByDigestEvictedElement.ToEvictedCountDatum func TestStmtSummaryByDigestEvictedElement(t *testing.T) { - t.Parallel() record := newStmtSummaryByDigestEvictedElement(0, 1) evictedKey, evictedValue := generateStmtSummaryByDigestKeyValue("alpha", 0, 1) digestValue := evictedValue.history.Back().Value.(*stmtSummaryByDigestElement) @@ -250,7 +247,6 @@ func TestStmtSummaryByDigestEvictedElement(t *testing.T) { // test stmtSummaryByDigestEvicted.addEvicted // test stmtSummaryByDigestEvicted.toEvictedCountDatum (single and multiple intervals) func TestEvictedCountDetailed(t *testing.T) { - t.Parallel() ssMap := newStmtSummaryByDigestMap() ssMap.Clear() err := ssMap.SetRefreshInterval("60", false) @@ -314,7 +310,6 @@ func TestEvictedCountDetailed(t *testing.T) { } func TestNewStmtSummaryByDigestEvictedElement(t *testing.T) { - t.Parallel() now := time.Now().Unix() end := now + 60 stmtEvictedElement := newStmtSummaryByDigestEvictedElement(now, end) @@ -324,14 +319,12 @@ func TestNewStmtSummaryByDigestEvictedElement(t *testing.T) { } func TestStmtSummaryByDigestEvicted(t *testing.T) { - t.Parallel() stmtEvicted := newStmtSummaryByDigestEvicted() require.Equal(t, 0, stmtEvicted.history.Len()) } // test addInfo function func TestAddInfo(t *testing.T) { - t.Parallel() now := time.Now().Unix() addTo := stmtSummaryByDigestElement{ // user diff --git a/util/stmtsummary/statement_summary.go b/util/stmtsummary/statement_summary.go index 1fb5cc3b62dc1..532c26dbc57c8 100644 --- a/util/stmtsummary/statement_summary.go +++ b/util/stmtsummary/statement_summary.go @@ -360,7 +360,7 @@ type BindableStmt struct { Collation string } -// GetMoreThanOnceBindableStmt gets users' select/update/delete SQLs that occurred more than the specified count. +// GetMoreThanCntBindableStmt gets users' select/update/delete SQLs that occurred more than the specified count. func (ssMap *stmtSummaryByDigestMap) GetMoreThanCntBindableStmt(cnt int64) []*BindableStmt { ssMap.Lock() values := ssMap.summaryMap.Values() diff --git a/util/stmtsummary/statement_summary_test.go b/util/stmtsummary/statement_summary_test.go index 000a7e0a9c087..2bcf4a82725a8 100644 --- a/util/stmtsummary/statement_summary_test.go +++ b/util/stmtsummary/statement_summary_test.go @@ -44,7 +44,6 @@ func fakePlanDigestGenerator() string { } func TestSetUp(t *testing.T) { - t.Parallel() ssMap := newStmtSummaryByDigestMap() err := ssMap.SetEnabled("1", false) require.NoError(t, err) @@ -60,7 +59,6 @@ const ( // Test stmtSummaryByDigest.AddStatement. func TestAddStatement(t *testing.T) { - t.Parallel() ssMap := newStmtSummaryByDigestMap() now := time.Now().Unix() ssMap.beginTimeForCurInterval = now + 60 @@ -751,7 +749,6 @@ func newStmtSummaryReaderForTest(ssMap *stmtSummaryByDigestMap) *stmtSummaryRead // Test stmtSummaryByDigest.ToDatum. func TestToDatum(t *testing.T) { - t.Parallel() ssMap := newStmtSummaryByDigestMap() now := time.Now().Unix() // to disable expiration @@ -849,7 +846,6 @@ func TestToDatum(t *testing.T) { // Test AddStatement and ToDatum parallel. func TestAddStatementParallel(t *testing.T) { - t.Parallel() ssMap := newStmtSummaryByDigestMap() now := time.Now().Unix() // to disable expiration @@ -887,7 +883,6 @@ func TestAddStatementParallel(t *testing.T) { // Test max number of statement count. func TestMaxStmtCount(t *testing.T) { - t.Parallel() ssMap := newStmtSummaryByDigestMap() now := time.Now().Unix() // to disable expiration @@ -947,7 +942,6 @@ func TestMaxStmtCount(t *testing.T) { // Test max length of normalized and sample SQL. func TestMaxSQLLength(t *testing.T) { - t.Parallel() ssMap := newStmtSummaryByDigestMap() now := time.Now().Unix() // to disable expiration @@ -991,7 +985,6 @@ func TestMaxSQLLength(t *testing.T) { // Test AddStatement and SetMaxStmtCount parallel. func TestSetMaxStmtCountParallel(t *testing.T) { - t.Parallel() ssMap := newStmtSummaryByDigestMap() now := time.Now().Unix() // to disable expiration @@ -1039,7 +1032,6 @@ func TestSetMaxStmtCountParallel(t *testing.T) { // Test setting EnableStmtSummary to 0. func TestDisableStmtSummary(t *testing.T) { - t.Parallel() ssMap := newStmtSummaryByDigestMap() now := time.Now().Unix() @@ -1098,7 +1090,6 @@ func TestDisableStmtSummary(t *testing.T) { // Test disable and enable statement summary concurrently with adding statements. func TestEnableSummaryParallel(t *testing.T) { - t.Parallel() ssMap := newStmtSummaryByDigestMap() threads := 8 @@ -1136,7 +1127,6 @@ func TestEnableSummaryParallel(t *testing.T) { // Test GetMoreThanCntBindableStmt. func TestGetMoreThanCntBindableStmt(t *testing.T) { - t.Parallel() ssMap := newStmtSummaryByDigestMap() stmtExecInfo1 := generateAnyExecInfo() @@ -1161,7 +1151,6 @@ func TestGetMoreThanCntBindableStmt(t *testing.T) { // Test `formatBackoffTypes`. func TestFormatBackoffTypes(t *testing.T) { - t.Parallel() backoffMap := make(map[string]int) require.Nil(t, formatBackoffTypes(backoffMap)) bo1 := "pdrpc" @@ -1175,7 +1164,6 @@ func TestFormatBackoffTypes(t *testing.T) { // Test refreshing current statement summary periodically. func TestRefreshCurrentSummary(t *testing.T) { - t.Parallel() ssMap := newStmtSummaryByDigestMap() now := time.Now().Unix() @@ -1215,7 +1203,6 @@ func TestRefreshCurrentSummary(t *testing.T) { // Test expiring statement summary to history. func TestSummaryHistory(t *testing.T) { - t.Parallel() ssMap := newStmtSummaryByDigestMap() now := time.Now().Unix() err := ssMap.SetRefreshInterval("10", false) @@ -1295,7 +1282,6 @@ func TestSummaryHistory(t *testing.T) { // Test summary when PrevSQL is not empty. func TestPrevSQL(t *testing.T) { - t.Parallel() ssMap := newStmtSummaryByDigestMap() now := time.Now().Unix() // to disable expiration @@ -1331,7 +1317,6 @@ func TestPrevSQL(t *testing.T) { } func TestEndTime(t *testing.T) { - t.Parallel() ssMap := newStmtSummaryByDigestMap() now := time.Now().Unix() ssMap.beginTimeForCurInterval = now - 100 @@ -1379,7 +1364,6 @@ func TestEndTime(t *testing.T) { } func TestPointGet(t *testing.T) { - t.Parallel() ssMap := newStmtSummaryByDigestMap() now := time.Now().Unix() ssMap.beginTimeForCurInterval = now - 100 @@ -1405,7 +1389,6 @@ func TestPointGet(t *testing.T) { } func TestAccessPrivilege(t *testing.T) { - t.Parallel() ssMap := newStmtSummaryByDigestMap() loops := 32 diff --git a/util/stmtsummary/variables_test.go b/util/stmtsummary/variables_test.go index 2927f4bd96fc6..72ed04682b6eb 100644 --- a/util/stmtsummary/variables_test.go +++ b/util/stmtsummary/variables_test.go @@ -22,7 +22,6 @@ import ( ) func TestSetInVariable(t *testing.T) { - t.Parallel() sv := newSysVars() st := sv.getVariable(typeMaxStmtCount) require.Equal(t, int64(config.GetGlobalConfig().StmtSummary.MaxStmtCount), st) @@ -58,7 +57,6 @@ func TestSetInVariable(t *testing.T) { } func TestSetBoolVariable(t *testing.T) { - t.Parallel() sv := newSysVars() en := sv.getVariable(typeEnable) require.Equal(t, config.GetGlobalConfig().StmtSummary.Enable, en > 0) @@ -98,7 +96,6 @@ func TestSetBoolVariable(t *testing.T) { } func TestMinValue(t *testing.T) { - t.Parallel() sv := newSysVars() err := sv.setVariable(typeMaxStmtCount, "0", false) require.NoError(t, err) diff --git a/util/stringutil/string_util_test.go b/util/stringutil/string_util_test.go index f9451a4a9918a..a5a666a8f848e 100644 --- a/util/stringutil/string_util_test.go +++ b/util/stringutil/string_util_test.go @@ -21,7 +21,6 @@ import ( ) func TestUnquote(t *testing.T) { - t.Parallel() table := []struct { str string expect string @@ -67,7 +66,6 @@ func TestUnquote(t *testing.T) { } func TestPatternMatch(t *testing.T) { - t.Parallel() tbl := []struct { pattern string input string @@ -111,7 +109,6 @@ func TestPatternMatch(t *testing.T) { } func TestCompileLike2Regexp(t *testing.T) { - t.Parallel() tbl := []struct { pattern string regexp string @@ -139,7 +136,6 @@ func TestCompileLike2Regexp(t *testing.T) { } func TestIsExactMatch(t *testing.T) { - t.Parallel() tbl := []struct { pattern string escape byte @@ -167,7 +163,6 @@ func TestIsExactMatch(t *testing.T) { } func TestBuildStringFromLabels(t *testing.T) { - t.Parallel() tbl := []struct { name string labels map[string]string diff --git a/util/sys/linux/sys_linux.go b/util/sys/linux/sys_linux.go index 1770ee856e45d..1095600f32c0e 100644 --- a/util/sys/linux/sys_linux.go +++ b/util/sys/linux/sys_linux.go @@ -11,6 +11,7 @@ // 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. +//go:build linux // +build linux package linux diff --git a/util/sys/linux/sys_other.go b/util/sys/linux/sys_other.go index fe528c52b5c80..28800f81261ea 100644 --- a/util/sys/linux/sys_other.go +++ b/util/sys/linux/sys_other.go @@ -11,6 +11,7 @@ // 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. +//go:build !linux && !windows // +build !linux,!windows package linux diff --git a/util/sys/linux/sys_test.go b/util/sys/linux/sys_test.go index 6522df0d2e08d..7ce52ca8f123d 100644 --- a/util/sys/linux/sys_test.go +++ b/util/sys/linux/sys_test.go @@ -21,8 +21,6 @@ import ( ) func TestGetOSVersion(t *testing.T) { - t.Parallel() - osRelease, err := OSVersion() require.NoError(t, err) require.NotEmpty(t, osRelease) diff --git a/util/sys/linux/sys_windows.go b/util/sys/linux/sys_windows.go index c0eede6d10f76..bec4bb559eccc 100644 --- a/util/sys/linux/sys_windows.go +++ b/util/sys/linux/sys_windows.go @@ -11,6 +11,7 @@ // 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. +//go:build windows // +build windows package linux diff --git a/util/sys/storage/sys_other.go b/util/sys/storage/sys_other.go index b90a942b39169..1a17ba43942cf 100644 --- a/util/sys/storage/sys_other.go +++ b/util/sys/storage/sys_other.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build !linux && !windows && !darwin // +build !linux,!windows,!darwin package storage diff --git a/util/sys/storage/sys_posix.go b/util/sys/storage/sys_posix.go index 3e6f3c4c6cc06..0d8d02a392299 100644 --- a/util/sys/storage/sys_posix.go +++ b/util/sys/storage/sys_posix.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build linux || darwin // +build linux darwin package storage diff --git a/util/sys/storage/sys_test.go b/util/sys/storage/sys_test.go index fd73c81c07dcf..0f8c39ce3c50c 100644 --- a/util/sys/storage/sys_test.go +++ b/util/sys/storage/sys_test.go @@ -22,7 +22,6 @@ import ( ) func TestGetTargetDirectoryCapacity(t *testing.T) { - t.Parallel() r, err := storage.GetTargetDirectoryCapacity(".") require.NoError(t, err) require.GreaterOrEqual(t, r, uint64(1), "couldn't get capacity") diff --git a/util/sys/storage/sys_windows.go b/util/sys/storage/sys_windows.go index 21b2f0f744d59..a932ea98a76b4 100644 --- a/util/sys/storage/sys_windows.go +++ b/util/sys/storage/sys_windows.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build windows // +build windows package storage diff --git a/util/systimemon/systime_mon_test.go b/util/systimemon/systime_mon_test.go index 3950db9a9c52e..f05098b63db7e 100644 --- a/util/systimemon/systime_mon_test.go +++ b/util/systimemon/systime_mon_test.go @@ -23,8 +23,6 @@ import ( ) func TestSystimeMonitor(t *testing.T) { - t.Parallel() - errTriggered := atomic.NewBool(false) nowTriggered := atomic.NewBool(false) go StartMonitor( diff --git a/util/testbridge/bridge.go b/util/testbridge/bridge.go index 383de45fe495a..1aee33f9c0a15 100644 --- a/util/testbridge/bridge.go +++ b/util/testbridge/bridge.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build !codes // +build !codes package testbridge diff --git a/util/testkit/fake.go b/util/testkit/fake.go index cdc6ce7626b44..60352489e6ba8 100644 --- a/util/testkit/fake.go +++ b/util/testkit/fake.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build codes // +build codes package testkit diff --git a/util/testkit/testkit.go b/util/testkit/testkit.go index 80e66968a05e0..e1f0542797c14 100644 --- a/util/testkit/testkit.go +++ b/util/testkit/testkit.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build !codes // +build !codes package testkit @@ -259,7 +260,7 @@ func (tk *TestKit) HasPlan(sql string, plan string, args ...interface{}) bool { return false } -func containGloabl(rs *Result) bool { +func containGlobal(rs *Result) bool { partitionNameCol := 2 for i := range rs.rows { if strings.Contains(rs.rows[i][partitionNameCol], "global") { @@ -271,13 +272,13 @@ func containGloabl(rs *Result) bool { // MustNoGlobalStats checks if there is no global stats. func (tk *TestKit) MustNoGlobalStats(table string) bool { - if containGloabl(tk.MustQuery("show stats_meta where table_name like '" + table + "'")) { + if containGlobal(tk.MustQuery("show stats_meta where table_name like '" + table + "'")) { return false } - if containGloabl(tk.MustQuery("show stats_buckets where table_name like '" + table + "'")) { + if containGlobal(tk.MustQuery("show stats_buckets where table_name like '" + table + "'")) { return false } - if containGloabl(tk.MustQuery("show stats_histograms where table_name like '" + table + "'")) { + if containGlobal(tk.MustQuery("show stats_histograms where table_name like '" + table + "'")) { return false } return true diff --git a/util/testleak/fake.go b/util/testleak/fake.go index 1ee90fb62b9ff..ad983d59dadd4 100644 --- a/util/testleak/fake.go +++ b/util/testleak/fake.go @@ -11,6 +11,7 @@ // 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. +//go:build !leak // +build !leak package testleak diff --git a/util/testleak/leaktest.go b/util/testleak/leaktest.go index a26c64273ce86..a34ed5b01f5b1 100644 --- a/util/testleak/leaktest.go +++ b/util/testleak/leaktest.go @@ -16,6 +16,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build leak // +build leak package testleak diff --git a/util/testutil/testutil.go b/util/testutil/testutil.go index 800d8f7513946..4a49636743e11 100644 --- a/util/testutil/testutil.go +++ b/util/testutil/testutil.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build !codes // +build !codes package testutil @@ -37,6 +38,7 @@ import ( "github.com/pingcap/tidb/testkit/testdata" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/logutil" "go.uber.org/zap" ) @@ -110,7 +112,7 @@ func (checker *datumEqualsChecker) Check(params []interface{}, names []string) ( panic("the second param should be datum") } sc := new(stmtctx.StatementContext) - res, err := paramFirst.CompareDatum(sc, ¶mSecond) + res, err := paramFirst.Compare(sc, ¶mSecond, collate.GetBinaryCollator()) if err != nil { panic(err) } diff --git a/util/texttree/texttree_test.go b/util/texttree/texttree_test.go index 6a3646c6596eb..5143cac90e2ed 100644 --- a/util/texttree/texttree_test.go +++ b/util/texttree/texttree_test.go @@ -22,7 +22,6 @@ import ( ) func TestPrettyIdentifier(t *testing.T) { - t.Parallel() require.Equal(t, "test", texttree.PrettyIdentifier("test", "", false)) require.Equal(t, " ├ ─test", texttree.PrettyIdentifier("test", " │ ", false)) require.Equal(t, "\t\t├\t─test", texttree.PrettyIdentifier("test", "\t\t│\t\t", false)) @@ -31,7 +30,6 @@ func TestPrettyIdentifier(t *testing.T) { } func TestIndent4Child(t *testing.T) { - t.Parallel() require.Equal(t, " │ ", texttree.Indent4Child(" ", false)) require.Equal(t, " │ ", texttree.Indent4Child(" ", true)) require.Equal(t, " │ ", texttree.Indent4Child(" │ ", true)) diff --git a/util/timeutil/time_test.go b/util/timeutil/time_test.go index 036dd3cfd5333..7795092c8013e 100644 --- a/util/timeutil/time_test.go +++ b/util/timeutil/time_test.go @@ -28,8 +28,6 @@ import ( ) func TestGetTZNameFromFileName(t *testing.T) { - t.Parallel() - tz, err := inferTZNameFromFileName("/usr/share/zoneinfo/Asia/Shanghai") require.NoError(t, err) @@ -42,8 +40,6 @@ func TestGetTZNameFromFileName(t *testing.T) { } func TestLocal(t *testing.T) { - t.Parallel() - os.Setenv("TZ", "Asia/Shanghai") systemTZ.Store(InferSystemTZ()) loc := SystemLocation() @@ -65,8 +61,6 @@ func TestLocal(t *testing.T) { } func TestInferOneStepLinkForPath(t *testing.T) { - t.Parallel() - os.Remove(filepath.Join(os.TempDir(), "testlink1")) os.Remove(filepath.Join(os.TempDir(), "testlink2")) os.Remove(filepath.Join(os.TempDir(), "testlink3")) diff --git a/util/topsql/reporter/datasink.go b/util/topsql/reporter/datasink.go new file mode 100644 index 0000000000000..c4206c71dc440 --- /dev/null +++ b/util/topsql/reporter/datasink.go @@ -0,0 +1,36 @@ +// Copyright 2021 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, +// 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. + +package reporter + +import "time" + +// DataSink collects and sends data to a target. +type DataSink interface { + // TrySend pushes a report data into the sink, which will later be sent to a target by the sink. A deadline can be + // specified to control how late it should be sent. If the sink is kept full and cannot schedule a send within + // the specified deadline, or the sink is closed, an error will be returned. + TrySend(data ReportData, deadline time.Time) error + + // IsPaused indicates that the DataSink is not expecting to receive records for now + // and may resume in the future. + IsPaused() bool + + // IsDown indicates that the DataSink has been down and can be cleared. + // Note that: once a DataSink is down, it cannot go back to be up. + IsDown() bool + + // Close cleans up resources owned by this DataSink + Close() +} diff --git a/util/topsql/reporter/mock/server.go b/util/topsql/reporter/mock/server.go index 5dca814fb30e5..21737e1e6ca9b 100644 --- a/util/topsql/reporter/mock/server.go +++ b/util/topsql/reporter/mock/server.go @@ -192,6 +192,16 @@ func (svr *mockAgentServer) GetLatestRecords() []*tipb.CPUTimeRecord { return records[len(records)-1] } +func (svr *mockAgentServer) GetTotalSQLMetas() []tipb.SQLMeta { + svr.Lock() + defer svr.Unlock() + metas := make([]tipb.SQLMeta, 0, len(svr.sqlMetas)) + for _, meta := range svr.sqlMetas { + metas = append(metas, meta) + } + return metas +} + func (svr *mockAgentServer) Address() string { return svr.addr } diff --git a/util/topsql/reporter/reporter.go b/util/topsql/reporter/reporter.go index 08503610734da..39e3be5eae8e4 100644 --- a/util/topsql/reporter/reporter.go +++ b/util/topsql/reporter/reporter.go @@ -23,7 +23,6 @@ import ( "time" "github.com/pingcap/failpoint" - "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/metrics" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/util" @@ -118,9 +117,9 @@ type planBinaryDecodeFunc func(string) (string, error) // RemoteTopSQLReporter implements a TopSQL reporter that sends data to a remote agent // This should be called periodically to collect TopSQL resource usage metrics type RemoteTopSQLReporter struct { - ctx context.Context - cancel context.CancelFunc - client ReportClient + ctx context.Context + cancel context.CancelFunc + dataSink DataSink // normalizedSQLMap is an map, whose keys are SQL digest strings and values are SQLMeta. normalizedSQLMap atomic.Value // sync.Map @@ -145,12 +144,12 @@ type SQLMeta struct { // // planBinaryDecoder is a decoding function which will be called asynchronously to decode the plan binary to string // MaxStatementsNum is the maximum SQL and plan number, which will restrict the memory usage of the internal LFU cache -func NewRemoteTopSQLReporter(client ReportClient) *RemoteTopSQLReporter { +func NewRemoteTopSQLReporter(dataSink DataSink) *RemoteTopSQLReporter { ctx, cancel := context.WithCancel(context.Background()) tsr := &RemoteTopSQLReporter{ ctx: ctx, cancel: cancel, - client: client, + dataSink: dataSink, collectCPUDataChan: make(chan cpuData, 1), reportCollectedDataChan: make(chan collectedData, 1), } @@ -238,7 +237,7 @@ func (tsr *RemoteTopSQLReporter) Collect(timestamp uint64, records []tracecpu.SQ // Close uses to close and release the reporter resource. func (tsr *RemoteTopSQLReporter) Close() { tsr.cancel() - tsr.client.Close() + tsr.dataSink.Close() } func addEvictedCPUTime(collectTarget map[string]*dataPoints, timestamp uint64, totalCPUTimeMs uint32) { @@ -411,25 +410,11 @@ func (tsr *RemoteTopSQLReporter) doCollect( if len(evicted) == 0 { return } - // Clean up non Top N data and merge them as "others" (keyed by in the `keyOthers`) in `collectTarget`. - normalizedSQLMap := tsr.normalizedSQLMap.Load().(*sync.Map) - normalizedPlanMap := tsr.normalizedPlanMap.Load().(*sync.Map) + // Merge non Top N data as "others" (keyed by in the `keyOthers`) in `collectTarget`. + // SQL meta will not be evicted, since the evicted SQL can be appear on Other components (TiKV) TopN records. totalEvictedCPUTime := uint32(0) for _, evict := range evicted { totalEvictedCPUTime += evict.CPUTimeMs - key := encodeKey(keyBuf, evict.SQLDigest, evict.PlanDigest) - _, ok := collectTarget[key] - if ok { - continue - } - _, loaded := normalizedSQLMap.LoadAndDelete(string(evict.SQLDigest)) - if loaded { - tsr.sqlMapLength.Add(-1) - } - _, loaded = normalizedPlanMap.LoadAndDelete(string(evict.PlanDigest)) - if loaded { - tsr.planMapLength.Add(-1) - } } addEvictedCPUTime(collectTarget, timestamp, totalEvictedCPUTime) } @@ -464,15 +449,15 @@ type collectedData struct { normalizedPlanMap *sync.Map } -// reportData contains data that reporter sends to the agent -type reportData struct { +// ReportData contains data that reporter sends to the agent +type ReportData struct { // collectedData contains the topN collected records and the `others` record which aggregation all records that is out of Top N. collectedData []*dataPoints normalizedSQLMap *sync.Map normalizedPlanMap *sync.Map } -func (d *reportData) hasData() bool { +func (d *ReportData) hasData() bool { if len(d.collectedData) > 0 { return true } @@ -510,9 +495,9 @@ func (tsr *RemoteTopSQLReporter) reportWorker() { } } -// getReportData gets reportData from the collectedData. +// getReportData gets ReportData from the collectedData. // This function will calculate the topN collected records and the `others` record which aggregation all records that is out of Top N. -func (tsr *RemoteTopSQLReporter) getReportData(collected collectedData) reportData { +func (tsr *RemoteTopSQLReporter) getReportData(collected collectedData) ReportData { // Fetch TopN dataPoints. others := collected.records[keyOthers] delete(collected.records, keyOthers) @@ -529,8 +514,7 @@ func (tsr *RemoteTopSQLReporter) getReportData(collected collectedData) reportDa sort.Sort(others) } for _, evict := range evicted { - collected.normalizedSQLMap.LoadAndDelete(string(evict.SQLDigest)) - collected.normalizedPlanMap.LoadAndDelete(string(evict.PlanDigest)) + // SQL meta will not be evicted, since the evicted SQL can be appear on Other components (TiKV) TopN records. others = addEvictedIntoSortedDataPoints(others, evict) } @@ -539,21 +523,20 @@ func (tsr *RemoteTopSQLReporter) getReportData(collected collectedData) reportDa records = append(records, others) } - return reportData{ + return ReportData{ collectedData: records, normalizedSQLMap: collected.normalizedSQLMap, normalizedPlanMap: collected.normalizedPlanMap, } } -func (tsr *RemoteTopSQLReporter) doReport(data reportData) { +func (tsr *RemoteTopSQLReporter) doReport(data ReportData) { defer util.Recover("top-sql", "doReport", nil, false) if !data.hasData() { return } - agentAddr := config.GetGlobalConfig().TopSQL.ReceiverAddress timeout := reportTimeout failpoint.Inject("resetTimeoutForTest", func(val failpoint.Value) { if val.(bool) { @@ -563,14 +546,8 @@ func (tsr *RemoteTopSQLReporter) doReport(data reportData) { } } }) - ctx, cancel := context.WithTimeout(tsr.ctx, timeout) - start := time.Now() - err := tsr.client.Send(ctx, agentAddr, data) - if err != nil { - logutil.BgLogger().Warn("[top-sql] client failed to send data", zap.Error(err)) - reportAllDurationFailedHistogram.Observe(time.Since(start).Seconds()) - } else { - reportAllDurationSuccHistogram.Observe(time.Since(start).Seconds()) + deadline := time.Now().Add(timeout) + if err := tsr.dataSink.TrySend(data, deadline); err != nil { + logutil.BgLogger().Warn("[top-sql] failed to send data to datasink", zap.Error(err)) } - cancel() } diff --git a/util/topsql/reporter/reporter_test.go b/util/topsql/reporter/reporter_test.go index d4be70450e596..33d048fcf1d86 100644 --- a/util/topsql/reporter/reporter_test.go +++ b/util/topsql/reporter/reporter_test.go @@ -66,12 +66,13 @@ func mockPlanBinaryDecoderFunc(plan string) (string, error) { func setupRemoteTopSQLReporter(maxStatementsNum, interval int, addr string) *RemoteTopSQLReporter { variable.TopSQLVariable.MaxStatementCount.Store(int64(maxStatementsNum)) + variable.TopSQLVariable.MaxCollect.Store(10000) variable.TopSQLVariable.ReportIntervalSeconds.Store(int64(interval)) config.UpdateGlobal(func(conf *config.Config) { conf.TopSQL.ReceiverAddress = addr }) - rc := NewGRPCReportClient(mockPlanBinaryDecoderFunc) + rc := NewSingleTargetDataSink(mockPlanBinaryDecoderFunc) ts := NewRemoteTopSQLReporter(rc) return ts } @@ -249,6 +250,10 @@ func TestCollectAndTopN(t *testing.T) { require.Equal(t, 5, getTotalCPUTime(results[1])) require.Equal(t, []byte("sqlDigest3"), results[2].SqlDigest) require.Equal(t, 3, getTotalCPUTime(results[2])) + // sleep to wait for all SQL meta received. + time.Sleep(50 * time.Millisecond) + totalMetas := agentServer.GetTotalSQLMetas() + require.Equal(t, 6, len(totalMetas)) } func TestCollectCapacity(t *testing.T) { @@ -302,8 +307,8 @@ func TestCollectCapacity(t *testing.T) { collectedData := make(map[string]*dataPoints) tsr.doCollect(collectedData, 1, genRecord(20000)) require.Equal(t, 5001, len(collectedData)) - require.Equal(t, int64(5000), tsr.sqlMapLength.Load()) - require.Equal(t, int64(5000), tsr.planMapLength.Load()) + require.Equal(t, int64(20000), tsr.sqlMapLength.Load()) + require.Equal(t, int64(20000), tsr.planMapLength.Load()) } func TestCollectOthers(t *testing.T) { diff --git a/util/topsql/reporter/client.go b/util/topsql/reporter/single_target.go similarity index 55% rename from util/topsql/reporter/client.go rename to util/topsql/reporter/single_target.go index 994189250e52b..5ed12c11853d8 100644 --- a/util/topsql/reporter/client.go +++ b/util/topsql/reporter/single_target.go @@ -16,10 +16,12 @@ package reporter import ( "context" + "errors" "math" "sync" "time" + "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tipb/go-tipb" "go.uber.org/zap" @@ -27,36 +29,126 @@ import ( "google.golang.org/grpc/backoff" ) -// ReportClient send data to the target server. -type ReportClient interface { - Send(ctx context.Context, addr string, data reportData) error - Close() -} +// SingleTargetDataSink reports data to grpc servers. +type SingleTargetDataSink struct { + ctx context.Context + cancel context.CancelFunc -// GRPCReportClient reports data to grpc servers. -type GRPCReportClient struct { curRPCAddr string conn *grpc.ClientConn + sendTaskCh chan sendTask + // calling decodePlan this can take a while, so should not block critical paths decodePlan planBinaryDecodeFunc } -// NewGRPCReportClient returns a new GRPCReportClient -func NewGRPCReportClient(decodePlan planBinaryDecodeFunc) *GRPCReportClient { - return &GRPCReportClient{ +// NewSingleTargetDataSink returns a new SingleTargetDataSink +func NewSingleTargetDataSink(decodePlan planBinaryDecodeFunc) *SingleTargetDataSink { + ctx, cancel := context.WithCancel(context.Background()) + dataSink := &SingleTargetDataSink{ + ctx: ctx, + cancel: cancel, + + curRPCAddr: "", + conn: nil, + sendTaskCh: make(chan sendTask, 1), + decodePlan: decodePlan, } + go dataSink.recoverRun() + return dataSink +} + +// recoverRun will run until SingleTargetDataSink is closed. +func (ds *SingleTargetDataSink) recoverRun() { + for ds.run() { + } +} + +func (ds *SingleTargetDataSink) run() (rerun bool) { + defer func() { + r := recover() + if r != nil { + logutil.BgLogger().Error("panic in SingleTargetDataSink, rerun", + zap.Reflect("r", r), + zap.Stack("stack trace")) + rerun = true + } + }() + + for { + var task sendTask + select { + case <-ds.ctx.Done(): + return false + case task = <-ds.sendTaskCh: + } + + targetRPCAddr := config.GetGlobalConfig().TopSQL.ReceiverAddress + if targetRPCAddr == "" { + continue + } + + ctx, cancel := context.WithDeadline(context.Background(), task.deadline) + start := time.Now() + err := ds.doSend(ctx, targetRPCAddr, task.data) + cancel() + if err != nil { + logutil.BgLogger().Warn("[top-sql] single target data sink failed to send data to receiver", zap.Error(err)) + reportAllDurationFailedHistogram.Observe(time.Since(start).Seconds()) + } else { + reportAllDurationSuccHistogram.Observe(time.Since(start).Seconds()) + } + } } -var _ ReportClient = &GRPCReportClient{} +var _ DataSink = &SingleTargetDataSink{} -// Send implements the ReportClient interface. -// Currently the implementation will establish a new connection every time, which is suitable for a per-minute sending period -func (r *GRPCReportClient) Send(ctx context.Context, targetRPCAddr string, data reportData) error { - if targetRPCAddr == "" { +// TrySend implements the DataSink interface. +// Currently the implementation will establish a new connection every time, +// which is suitable for a per-minute sending period +func (ds *SingleTargetDataSink) TrySend(data ReportData, deadline time.Time) error { + select { + case ds.sendTaskCh <- sendTask{data: data, deadline: deadline}: return nil + case <-ds.ctx.Done(): + return ds.ctx.Err() + default: + ignoreReportChannelFullCounter.Inc() + return errors.New("the channel of single target dataSink is full") + } +} + +// IsPaused implements the DataSink interface. +func (ds *SingleTargetDataSink) IsPaused() bool { + return len(config.GetGlobalConfig().TopSQL.ReceiverAddress) == 0 +} + +// IsDown implements the DataSink interface. +func (ds *SingleTargetDataSink) IsDown() bool { + select { + case <-ds.ctx.Done(): + return true + default: + return false + } +} + +// Close uses to close grpc connection. +func (ds *SingleTargetDataSink) Close() { + ds.cancel() + if ds.conn == nil { + return + } + err := ds.conn.Close() + if err != nil { + logutil.BgLogger().Warn("[top-sql] single target dataSink close connection failed", zap.Error(err)) } - err := r.tryEstablishConnection(ctx, targetRPCAddr) + ds.conn = nil +} + +func (ds *SingleTargetDataSink) doSend(ctx context.Context, addr string, data ReportData) error { + err := ds.tryEstablishConnection(ctx, addr) if err != nil { return err } @@ -67,15 +159,15 @@ func (r *GRPCReportClient) Send(ctx context.Context, targetRPCAddr string, data go func() { defer wg.Done() - errCh <- r.sendBatchSQLMeta(ctx, data.normalizedSQLMap) + errCh <- ds.sendBatchSQLMeta(ctx, data.normalizedSQLMap) }() go func() { defer wg.Done() - errCh <- r.sendBatchPlanMeta(ctx, data.normalizedPlanMap) + errCh <- ds.sendBatchPlanMeta(ctx, data.normalizedPlanMap) }() go func() { defer wg.Done() - errCh <- r.sendBatchCPUTimeRecord(ctx, data.collectedData) + errCh <- ds.sendBatchCPUTimeRecord(ctx, data.collectedData) }() wg.Wait() close(errCh) @@ -87,25 +179,13 @@ func (r *GRPCReportClient) Send(ctx context.Context, targetRPCAddr string, data return nil } -// Close uses to close grpc connection. -func (r *GRPCReportClient) Close() { - if r.conn == nil { - return - } - err := r.conn.Close() - if err != nil { - logutil.BgLogger().Warn("[top-sql] grpc client close connection failed", zap.Error(err)) - } - r.conn = nil -} - // sendBatchCPUTimeRecord sends a batch of TopSQL records by stream. -func (r *GRPCReportClient) sendBatchCPUTimeRecord(ctx context.Context, records []*dataPoints) error { +func (ds *SingleTargetDataSink) sendBatchCPUTimeRecord(ctx context.Context, records []*dataPoints) error { if len(records) == 0 { return nil } start := time.Now() - client := tipb.NewTopSQLAgentClient(r.conn) + client := tipb.NewTopSQLAgentClient(ds.conn) stream, err := client.ReportCPUTimeRecords(ctx) if err != nil { return err @@ -133,9 +213,9 @@ func (r *GRPCReportClient) sendBatchCPUTimeRecord(ctx context.Context, records [ } // sendBatchSQLMeta sends a batch of SQL metas by stream. -func (r *GRPCReportClient) sendBatchSQLMeta(ctx context.Context, sqlMap *sync.Map) error { +func (ds *SingleTargetDataSink) sendBatchSQLMeta(ctx context.Context, sqlMap *sync.Map) error { start := time.Now() - client := tipb.NewTopSQLAgentClient(r.conn) + client := tipb.NewTopSQLAgentClient(ds.conn) stream, err := client.ReportSQLMeta(ctx) if err != nil { return err @@ -169,16 +249,16 @@ func (r *GRPCReportClient) sendBatchSQLMeta(ctx context.Context, sqlMap *sync.Ma } // sendBatchPlanMeta sends a batch of SQL metas by stream. -func (r *GRPCReportClient) sendBatchPlanMeta(ctx context.Context, planMap *sync.Map) error { +func (ds *SingleTargetDataSink) sendBatchPlanMeta(ctx context.Context, planMap *sync.Map) error { start := time.Now() - client := tipb.NewTopSQLAgentClient(r.conn) + client := tipb.NewTopSQLAgentClient(ds.conn) stream, err := client.ReportPlanMeta(ctx) if err != nil { return err } cnt := 0 planMap.Range(func(key, value interface{}) bool { - planDecoded, errDecode := r.decodePlan(value.(string)) + planDecoded, errDecode := ds.decodePlan(value.(string)) if errDecode != nil { logutil.BgLogger().Warn("[top-sql] decode plan failed", zap.Error(errDecode)) return true @@ -208,26 +288,26 @@ func (r *GRPCReportClient) sendBatchPlanMeta(ctx context.Context, planMap *sync. } // tryEstablishConnection establishes the gRPC connection if connection is not established. -func (r *GRPCReportClient) tryEstablishConnection(ctx context.Context, targetRPCAddr string) (err error) { - if r.curRPCAddr == targetRPCAddr && r.conn != nil { +func (ds *SingleTargetDataSink) tryEstablishConnection(ctx context.Context, targetRPCAddr string) (err error) { + if ds.curRPCAddr == targetRPCAddr && ds.conn != nil { // Address is not changed, skip. return nil } - if r.conn != nil { - err := r.conn.Close() - logutil.BgLogger().Warn("[top-sql] grpc client close connection failed", zap.Error(err)) + if ds.conn != nil { + err := ds.conn.Close() + logutil.BgLogger().Warn("[top-sql] grpc dataSink close connection failed", zap.Error(err)) } - r.conn, err = r.dial(ctx, targetRPCAddr) + ds.conn, err = ds.dial(ctx, targetRPCAddr) if err != nil { return err } - r.curRPCAddr = targetRPCAddr + ds.curRPCAddr = targetRPCAddr return nil } -func (r *GRPCReportClient) dial(ctx context.Context, targetRPCAddr string) (*grpc.ClientConn, error) { +func (ds *SingleTargetDataSink) dial(ctx context.Context, targetRPCAddr string) (*grpc.ClientConn, error) { dialCtx, cancel := context.WithTimeout(ctx, dialTimeout) defer cancel() return grpc.DialContext( @@ -250,3 +330,8 @@ func (r *GRPCReportClient) dial(ctx context.Context, targetRPCAddr string) (*grp }), ) } + +type sendTask struct { + data ReportData + deadline time.Time +} diff --git a/util/topsql/topsql.go b/util/topsql/topsql.go index 2c227b4fd76d3..67ceb242039b5 100644 --- a/util/topsql/topsql.go +++ b/util/topsql/topsql.go @@ -32,16 +32,16 @@ import ( const ( // MaxSQLTextSize exports for testing. MaxSQLTextSize = 4 * 1024 - // MaxPlanTextSize exports for testing. - MaxPlanTextSize = 32 * 1024 + // MaxBinaryPlanSize exports for testing. + MaxBinaryPlanSize = 2 * 1024 ) var globalTopSQLReport reporter.TopSQLReporter // SetupTopSQL sets up the top-sql worker. func SetupTopSQL() { - rc := reporter.NewGRPCReportClient(plancodec.DecodeNormalizedPlan) - globalTopSQLReport = reporter.NewRemoteTopSQLReporter(rc) + ds := reporter.NewSingleTargetDataSink(plancodec.DecodeNormalizedPlan) + globalTopSQLReport = reporter.NewRemoteTopSQLReporter(ds) tracecpu.GlobalSQLCPUProfiler.SetCollector(globalTopSQLReport) tracecpu.GlobalSQLCPUProfiler.Run() } @@ -122,7 +122,7 @@ func linkSQLTextWithDigest(sqlDigest []byte, normalizedSQL string, isInternal bo } func linkPlanTextWithDigest(planDigest []byte, normalizedBinaryPlan string) { - if len(normalizedBinaryPlan) > MaxPlanTextSize { + if len(normalizedBinaryPlan) > MaxBinaryPlanSize { // ignore the huge size plan return } diff --git a/util/topsql/topsql_test.go b/util/topsql/topsql_test.go index 9bb9968aea52b..d9ec6799194d7 100644 --- a/util/topsql/topsql_test.go +++ b/util/topsql/topsql_test.go @@ -115,7 +115,7 @@ func TestTopSQLReporter(t *testing.T) { conf.TopSQL.ReceiverAddress = server.Address() }) - client := reporter.NewGRPCReportClient(mockPlanBinaryDecoderFunc) + client := reporter.NewSingleTargetDataSink(mockPlanBinaryDecoderFunc) report := reporter.NewRemoteTopSQLReporter(client) defer report.Close() @@ -199,7 +199,7 @@ func TestMaxSQLAndPlanTest(t *testing.T) { sql = genStr(topsql.MaxSQLTextSize + 10) sqlDigest = mock.GenSQLDigest(sql) topsql.AttachSQLInfo(ctx, sql, sqlDigest, "", nil, false) - plan = genStr(topsql.MaxPlanTextSize + 10) + plan = genStr(topsql.MaxBinaryPlanSize + 10) planDigest = genDigest(plan) topsql.AttachSQLInfo(ctx, sql, sqlDigest, plan, planDigest, false) diff --git a/util/topsql/tracecpu/main_test.go b/util/topsql/tracecpu/main_test.go new file mode 100644 index 0000000000000..74352d78d7419 --- /dev/null +++ b/util/topsql/tracecpu/main_test.go @@ -0,0 +1,60 @@ +// Copyright 2021 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, +// 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. + +package tracecpu_test + +import ( + "bytes" + "testing" + + "github.com/google/pprof/profile" + "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/util/testbridge" + "github.com/pingcap/tidb/util/topsql/tracecpu" + "github.com/stretchr/testify/require" + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + testbridge.WorkaroundGoCheckFlags() + + variable.TopSQLVariable.Enable.Store(false) + config.UpdateGlobal(func(conf *config.Config) { + conf.TopSQL.ReceiverAddress = "mock" + }) + variable.TopSQLVariable.PrecisionSeconds.Store(1) + tracecpu.GlobalSQLCPUProfiler.Run() + + opts := []goleak.Option{ + goleak.IgnoreTopFunction("time.Sleep"), + goleak.IgnoreTopFunction("runtime/pprof.readProfile"), + goleak.IgnoreTopFunction("internal/poll.runtime_pollWait"), + goleak.IgnoreTopFunction("github.com/pingcap/tidb/util/topsql/tracecpu.(*sqlCPUProfiler).startAnalyzeProfileWorker"), + } + + goleak.VerifyTestMain(m, opts...) +} + +func TestPProfCPUProfile(t *testing.T) { + buf := bytes.NewBuffer(nil) + err := tracecpu.StartCPUProfile(buf) + require.NoError(t, err) + // enable top sql. + variable.TopSQLVariable.Enable.Store(true) + err = tracecpu.StopCPUProfile() + require.NoError(t, err) + _, err = profile.Parse(buf) + require.NoError(t, err) +} diff --git a/util/topsql/tracecpu/profile.go b/util/topsql/tracecpu/profile.go index 2fe6697dd4ff9..b08569d147eec 100644 --- a/util/topsql/tracecpu/profile.go +++ b/util/topsql/tracecpu/profile.go @@ -294,7 +294,7 @@ func StartCPUProfile(w io.Writer) error { // StopCPUProfile same like pprof.StopCPUProfile. // other place should call tracecpu.StopCPUProfile instead of pprof.StopCPUProfile. func StopCPUProfile() error { - if GlobalSQLCPUProfiler.IsEnabled() { + if GlobalSQLCPUProfiler.hasExportProfileTask() { return GlobalSQLCPUProfiler.stopExportCPUProfile() } pprof.StopCPUProfile() diff --git a/util/tracing/opt_trace.go b/util/tracing/opt_trace.go new file mode 100644 index 0000000000000..e3d243b16ed33 --- /dev/null +++ b/util/tracing/opt_trace.go @@ -0,0 +1,108 @@ +// Copyright 2021 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, +// 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. + +package tracing + +// LogicalPlanTrace indicates for the LogicalPlan trace information +type LogicalPlanTrace struct { + ID int `json:"id"` + TP string `json:"type"` + Children []*LogicalPlanTrace `json:"children"` + + // ExplainInfo should be implemented by each implemented LogicalPlan + ExplainInfo string `json:"info"` +} + +// LogicalOptimizeTracer indicates the trace for the whole logicalOptimize processing +type LogicalOptimizeTracer struct { + FinalLogicalPlan *LogicalPlanTrace `json:"final"` + Steps []*LogicalRuleOptimizeTracer `json:"steps"` + // curRuleTracer indicates the current rule Tracer during optimize by rule + curRuleTracer *LogicalRuleOptimizeTracer +} + +// AppendRuleTracerBeforeRuleOptimize add plan tracer before optimize +func (tracer *LogicalOptimizeTracer) AppendRuleTracerBeforeRuleOptimize(index int, name string, before *LogicalPlanTrace) { + ruleTracer := buildLogicalRuleOptimizeTracerBeforeOptimize(index, name, before) + tracer.Steps = append(tracer.Steps, ruleTracer) + tracer.curRuleTracer = ruleTracer +} + +// AppendRuleTracerStepToCurrent add rule optimize step to current +func (tracer *LogicalOptimizeTracer) AppendRuleTracerStepToCurrent(id int, tp, reason, action string) { + index := len(tracer.curRuleTracer.Steps) + tracer.curRuleTracer.Steps = append(tracer.curRuleTracer.Steps, LogicalRuleOptimizeTraceStep{ + ID: id, + TP: tp, + Reason: reason, + Action: action, + Index: index, + }) +} + +// RecordFinalLogicalPlan add plan trace after logical optimize +func (tracer *LogicalOptimizeTracer) RecordFinalLogicalPlan(final *LogicalPlanTrace) { + tracer.FinalLogicalPlan = final +} + +// LogicalRuleOptimizeTracer indicates the trace for the LogicalPlan tree before and after +// logical rule optimize +type LogicalRuleOptimizeTracer struct { + Index int `json:"index"` + Before *LogicalPlanTrace `json:"before"` + RuleName string `json:"name"` + Steps []LogicalRuleOptimizeTraceStep `json:"steps"` +} + +// buildLogicalRuleOptimizeTracerBeforeOptimize build rule tracer before rule optimize +func buildLogicalRuleOptimizeTracerBeforeOptimize(index int, name string, before *LogicalPlanTrace) *LogicalRuleOptimizeTracer { + return &LogicalRuleOptimizeTracer{ + Index: index, + Before: before, + RuleName: name, + Steps: make([]LogicalRuleOptimizeTraceStep, 0), + } +} + +// LogicalRuleOptimizeTraceStep indicates the trace for the detailed optimize changing in +// logical rule optimize +type LogicalRuleOptimizeTraceStep struct { + Action string `json:"action"` + Reason string `json:"reason"` + ID int `json:"id"` + TP string `json:"type"` + Index int `json:"index"` +} + +// CETraceRecord records an expression and related cardinality estimation result. +type CETraceRecord struct { + TableID int64 `json:"-"` + TableName string `json:"table_name"` + Type string `json:"type"` + Expr string `json:"expr"` + RowCount uint64 `json:"row_count"` +} + +// DedupCETrace deduplicate a slice of *CETraceRecord and return the deduplicated slice +func DedupCETrace(records []*CETraceRecord) []*CETraceRecord { + ret := make([]*CETraceRecord, 0, len(records)) + exists := make(map[CETraceRecord]struct{}, len(records)) + for _, rec := range records { + if _, ok := exists[*rec]; !ok { + ret = append(ret, rec) + exists[*rec] = struct{}{} + } + } + return ret +} diff --git a/util/vitess/vitess_hash_test.go b/util/vitess/vitess_hash_test.go index 769c0d5c0cc4f..7e6587b2007a9 100644 --- a/util/vitess/vitess_hash_test.go +++ b/util/vitess/vitess_hash_test.go @@ -25,8 +25,6 @@ import ( ) func TestVitessHash(t *testing.T) { - t.Parallel() - hashed, err := HashUint64(30375298039) require.NoError(t, err) require.Equal(t, "031265661E5F1133", toHex(hashed)) diff --git a/util/wait_group_wrapper.go b/util/wait_group_wrapper.go new file mode 100644 index 0000000000000..16c8704920a28 --- /dev/null +++ b/util/wait_group_wrapper.go @@ -0,0 +1,53 @@ +// Copyright 2021 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, +// 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. + +package util + +import ( + "sync" +) + +// WaitGroupWrapper is a wrapper for sync.WaitGroup +type WaitGroupWrapper struct { + sync.WaitGroup +} + +// Run runs a function in a goroutine, adds 1 to WaitGroup +// and calls done when function returns. Please DO NOT use panic +// in the cb function. +func (w *WaitGroupWrapper) Run(exec func()) { + w.Add(1) + go func() { + defer w.Done() + exec() + }() +} + +// RunWithRecover wraps goroutine startup call with force recovery, add 1 to WaitGroup +// and call done when function return. it will dump current goroutine stack into log if catch any recover result. +// exec is that execute logic function. recoverFn is that handler will be called after recover and before dump stack, +// passing `nil` means noop. +func (w *WaitGroupWrapper) RunWithRecover(exec func(), recoverFn func(r interface{})) { + w.Add(1) + go func() { + defer func() { + r := recover() + if r != nil && recoverFn != nil { + recoverFn(r) + } + w.Done() + }() + exec() + }() +} diff --git a/util/wait_group_wrapper_test.go b/util/wait_group_wrapper_test.go new file mode 100644 index 0000000000000..40e66fdaf5759 --- /dev/null +++ b/util/wait_group_wrapper_test.go @@ -0,0 +1,50 @@ +// Copyright 2021 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, +// 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. + +package util + +import ( + "testing" + + "github.com/stretchr/testify/require" + "go.uber.org/atomic" +) + +func TestWaitGroupWrapperRun(t *testing.T) { + var expect int32 = 4 + var val atomic.Int32 + var wg WaitGroupWrapper + for i := int32(0); i < expect; i++ { + wg.Run(func() { + val.Inc() + }) + } + wg.Wait() + require.Equal(t, expect, val.Load()) +} + +func TestWaitGroupWrapperRunWithRecover(t *testing.T) { + var expect int32 = 2 + var val atomic.Int32 + var wg WaitGroupWrapper + for i := int32(0); i < expect; i++ { + wg.RunWithRecover(func() { + panic("test1") + }, func(r interface{}) { + val.Inc() + }) + } + wg.Wait() + require.Equal(t, expect, val.Load()) +}